private void sendAttack(Attack attack, String zone) {
    GameMessage msg = new GameMessage();

    Grid grid = GridService.getInstance().getGrid(zone, "default");
    for (TrackData trackData : grid.getAll()) {
      if (!playerId.equals(trackData.id)) {
        msg.attack = attack;
        PlayerMessage.tell(msg, trackData.id);
      }
    }
  }
  @Override
  public void onGameMessage(GameMessage gameMessage) {

    if (gameMessage.guildAction != null) {
      GuildAction guildAction = gameMessage.guildAction;
      Guild guild = null;
      if (guildAction.action.equals("guilds")) {
        Guilds guilds = new Guilds();
        guilds.guild = Guild.db().findAll();
        gameMessage.guilds = guilds;
        PlayerMessage.tell(gameMessage, playerId);

      } else if (guildAction.action.equals("members")) {
        guild = playerGuild(playerId);
        if (guild != null) {
          Guilds guilds = new Guilds();
          guilds.addGuild(guild);
          gameMessage.guilds = guilds;
          gameMessage.guildMemberList = members(guild.id);
          PlayerMessage.tell(gameMessage, playerId);
        } else {
          logger.warning(playerId + " is not in a guild ");
          return;
        }

      } else if (guildAction.action.equals("create")) {
        if (exists(guildAction.guildId)) {
          return;
        }

        guild = new Guild();
        guild.id = guildAction.guildId;
        guild.name = guildAction.guildName;
        guild.ownerId = playerId;

        save(guild);
        addMember(guild.id, playerId);
        gameMessage.guildAction.response = "success";
        PlayerMessage.tell(gameMessage, playerId);
      } else {

        if (!Strings.isNullOrEmpty(guildAction.guildId)) {
          guild = find(guildAction.guildId);
        }

        if (guildAction.action.equals("accept_invite")) {
          if (invites.containsKey(playerId)) {
            String invite = invites.get(playerId);
            String[] parts = invite.split(Pattern.quote("|"));
            String guildId = parts[0];
            String inviteId = parts[1];
            guild = find(guildId);

            if (invite.equals(guildAction.inviteId)) {
              if (guild == null) {
                logger.warning("Guild not found " + guildId);
                return;
              }

              if (memberOf(guild.id, playerId)) {
                logger.warning(playerId + " is already in guild " + guild.id);
                return;
              }

              addMember(guild.id, playerId);
              gameMessage.guildAction.response = "success";
              PlayerMessage.tell(gameMessage, playerId);
              logger.warning(playerId + " joined guild " + guild.id);
            } else {
              logger.warning(inviteId + " does not match  " + guildAction.inviteId);
            }
          } else {
            logger.warning("Invite not found for " + playerId);
          }

        } else if (guildAction.action.equals("invite")) {
          if (playerId.equals(guild.ownerId)) {
            Random rand = new Random();
            String inviteId = guild.id + "|" + String.valueOf(rand.nextInt(10000) + 10);
            gameMessage.guildAction.inviteId = inviteId;

            // fixme, player id will be null here most likely
            String to = CharacterService.instance().find(guildAction.to).playerId;
            invites.put(to, inviteId);
            if (!Strings.isNullOrEmpty(to)) {
              PlayerMessage.tell(gameMessage, to);
              logger.warning("Invite sent from " + playerId + " to " + guildAction.to);
            } else {
              logger.warning("Player id not found for " + guildAction.to);
            }

          } else {
            gameMessage.guildAction.response = "Not owner";
            PlayerMessage.tell(gameMessage, playerId);
          }

        } else if (guildAction.action.equals("leave")) {
          removeMember(guild.id, playerId);
          if (playerId.equals(guild.ownerId)) {
            destroy(guild);
          }

          gameMessage.guildAction.response = "success";
          PlayerMessage.tell(gameMessage, playerId);

        } else if (guildAction.action.equals("destroy")) {
          if (playerId.equals(guild.ownerId)) {
            destroy(guild);
            gameMessage.guildAction.response = "success";
          } else {
            gameMessage.guildAction.response = "Not owner";
          }
          PlayerMessage.tell(gameMessage, playerId);
        }
      }
    }
  }