@Override
 public void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) {
   int load = 0;
   for (ChannelServer cservs : ChannelServer.getAllInstances()) {
     load += LoginServer.getInstance().getLoad().get(cservs.getChannel());
   }
   if (LoginServer.getInstance().getUserLimit() <= load) {
     c.getSession().write(MaplePacketCreator.getServerStatus(2));
   } else if (LoginServer.getInstance().getUserLimit() * 0.9 <= load) {
     c.getSession().write(MaplePacketCreator.getServerStatus(1));
   } else {
     c.getSession().write(MaplePacketCreator.getServerStatus(0));
   }
 }
 public void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) {
   slea.readInt(); // i don't know :)
   int meso = slea.readInt();
   if (meso < 10 || meso > 50000) {
     AutobanManager.getInstance().addPoints(c, 1000, 0, "Dropping " + meso + " mesos");
     return;
   }
   if (meso <= c.getPlayer().getMeso()) {
     c.getPlayer().gainMeso(-meso, true, true);
     c.getPlayer()
         .getMap()
         .spawnMesoDrop(
             meso, meso, c.getPlayer().getPosition(), c.getPlayer(), c.getPlayer(), false);
   }
 }
 public static void editBBSThread(
     MapleClient client, String title, String text, int icon, int localthreadid) {
   MapleCharacter c = client.getPlayer();
   if (c.getGuildId() <= 0) {
     return; // expelled while viewing?
   }
   try {
     Connection con = DatabaseConnection.getConnection();
     PreparedStatement ps =
         con.prepareStatement(
             "UPDATE bbs_threads SET "
                 + "`name` = ?, "
                 + "`timestamp` = ?, "
                 + "`icon` = ?, "
                 + "`startpost` = ? "
                 + "WHERE guildid = ? AND localthreadid = ? AND (postercid = ? OR ?)");
     ps.setString(1, title);
     ps.setLong(2, System.currentTimeMillis());
     ps.setInt(3, icon);
     ps.setString(4, text);
     ps.setInt(5, c.getGuildId());
     ps.setInt(6, localthreadid);
     ps.setInt(7, c.getId());
     ps.setBoolean(8, c.getGuildRank() <= 2);
     ps.execute();
     ps.close();
     displayThread(client, localthreadid);
   } catch (SQLException se) {
     log.error("SQLException: " + se.getLocalizedMessage(), se);
   }
 }
 public static void listBBSThreads(MapleClient c, int start) {
   int gid = c.getPlayer().getGuildId();
   try {
     Connection con = DatabaseConnection.getConnection();
     PreparedStatement ps =
         con.prepareStatement(
             "SELECT * FROM bbs_threads WHERE guildid = ? ORDER BY localthreadid DESC");
     ps.setInt(1, gid);
     ResultSet rs = ps.executeQuery();
     c.getSession().write(MaplePacketCreator.BBSThreadList(rs, start));
     rs.close();
     ps.close();
   } catch (SQLException se) {
     log.error("SQLException: " + se.getLocalizedMessage(), se);
   }
 }
  @Override
  public void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) {
    int oid = slea.readInt();
    Point startPos = StreamUtil.readShortPoint(slea);
    List<LifeMovementFragment> res = parseMovement(slea);

    MapleCharacter player = c.getPlayer();
    Collection<MapleSummon> summons = player.getSummons().values();
    MapleSummon summon = null;
    for (MapleSummon sum : summons) {
      if (sum.getObjectId() == oid) {
        summon = sum;
      }
    }
    if (summon != null) {
      updatePosition(res, summon, 0);
      // player = ((MapleCharacter) c.getPlayer().getMap().getMapObject(30000));
      player
          .getMap()
          .broadcastMessage(
              player,
              MaplePacketCreator.moveSummon(player.getId(), oid, startPos, res),
              summon.getPosition());
    }
  }
  public static void deleteBBSReply(MapleClient client, int replyid) {
    MapleCharacter mc = client.getPlayer();
    if (mc.getGuildId() <= 0) {
      return;
    }

    int threadid;
    Connection con = DatabaseConnection.getConnection();
    try {
      PreparedStatement ps =
          con.prepareStatement("SELECT postercid, threadid FROM bbs_replies WHERE replyid = ?");
      ps.setInt(1, replyid);
      ResultSet rs = ps.executeQuery();
      if (!rs.next()) {
        rs.close();
        ps.close();
        return; // reply no longer exists, deleted already?
      }
      if (mc.getId() != rs.getInt("postercid") && mc.getGuildRank() > 2) {
        rs.close();
        ps.close();
        return; // [hax] deleting a reply that he didn't make
      }
      threadid = rs.getInt("threadid");
      rs.close();
      ps.close();

      ps = con.prepareStatement("DELETE FROM bbs_replies WHERE replyid = ?");
      ps.setInt(1, replyid);
      ps.execute();
      ps.close();

      ps =
          con.prepareStatement(
              "UPDATE bbs_threads SET replycount = replycount - 1 WHERE threadid = ?");
      ps.setInt(1, threadid);
      ps.execute();
      ps.close();
      displayThread(client, threadid, false);
    } catch (SQLException se) {
      log.error("SQLException: " + se.getLocalizedMessage(), se);
    }
  }
  public static void newBBSThread(
      MapleClient client, String title, String text, int icon, boolean bNotice) {
    MapleCharacter c = client.getPlayer();
    if (c.getGuildId() <= 0) {
      return; // expelled while viewing?
    }
    int nextId = 0;
    try {
      Connection con = DatabaseConnection.getConnection();
      PreparedStatement ps;

      if (!bNotice) {
        ps =
            con.prepareStatement(
                "SELECT MAX(localthreadid) AS lastLocalId FROM bbs_threads WHERE guildid = ?");
        ps.setInt(1, c.getGuildId());
        ResultSet rs = ps.executeQuery();
        rs.next();
        nextId = rs.getInt("lastLocalId") + 1;
        rs.close();
        ps.close();
      }

      ps =
          con.prepareStatement(
              "INSERT INTO bbs_threads "
                  + "(`postercid`, `name`, `timestamp`, `icon`, `startpost`, "
                  + "`guildid`, `localthreadid`) "
                  + "VALUES(?, ?, ?, ?, ?, ?, ?)");
      ps.setInt(1, c.getId());
      ps.setString(2, title);
      ps.setLong(3, System.currentTimeMillis());
      ps.setInt(4, icon);
      ps.setString(5, text);
      ps.setInt(6, c.getGuildId());
      ps.setInt(7, nextId);
      ps.execute();
      ps.close();
      displayThread(client, nextId);
    } catch (SQLException se) {
      log.error("SQLException: " + se.getLocalizedMessage(), se);
    }
  }
  public static void newBBSReply(MapleClient client, int localthreadid, String text) {
    MapleCharacter mc = client.getPlayer();
    if (mc.getGuildId() <= 0) {
      return;
    }

    Connection con = DatabaseConnection.getConnection();
    try {
      PreparedStatement ps =
          con.prepareStatement(
              "SELECT threadid FROM bbs_threads WHERE guildid = ? AND localthreadid = ?");
      ps.setInt(1, mc.getGuildId());
      ps.setInt(2, localthreadid);
      ResultSet threadRS = ps.executeQuery();
      if (!threadRS.next()) {
        return; // thread no longer exists, deleted?
      }
      int threadid = threadRS.getInt("threadid");
      threadRS.close();
      ps.close();

      ps =
          con.prepareStatement(
              "INSERT INTO bbs_replies (`threadid`, `postercid`, `timestamp`, `content`) VALUES "
                  + "(?, ?, ?, ?)");
      ps.setInt(1, threadid);
      ps.setInt(2, mc.getId());
      ps.setLong(3, System.currentTimeMillis());
      ps.setString(4, text);
      ps.execute();
      ps.close();

      ps =
          con.prepareStatement(
              "UPDATE bbs_threads SET replycount = replycount + 1 WHERE threadid = ?");
      ps.setInt(1, threadid);
      ps.execute();
      ps.close();
      displayThread(client, localthreadid);
    } catch (SQLException se) {
      log.error("SQLException: " + se.getLocalizedMessage(), se);
    }
  }
  public static void deleteBBSThread(MapleClient client, int localthreadid) {
    MapleCharacter mc = client.getPlayer();
    if (mc.getGuildId() <= 0) {
      return;
    }

    Connection con = DatabaseConnection.getConnection();
    try {
      PreparedStatement ps =
          con.prepareStatement(
              "SELECT threadid, postercid FROM bbs_threads WHERE guildid = ? AND localthreadid = ?");
      ps.setInt(1, mc.getGuildId());
      ps.setInt(2, localthreadid);
      ResultSet threadRS = ps.executeQuery();
      if (!threadRS.next()) {
        threadRS.close();
        ps.close();
        return; // thread no longer exists, deleted?
      }
      if (mc.getId() != threadRS.getInt("postercid") && mc.getGuildRank() > 2) {
        threadRS.close();
        ps.close();
        return; // [hax] deleting a thread that he didn't make
      }
      int threadid = threadRS.getInt("threadid");
      threadRS.close();
      ps.close();

      ps = con.prepareStatement("DELETE FROM bbs_replies WHERE threadid = ?");
      ps.setInt(1, threadid);
      ps.execute();
      ps.close();

      ps = con.prepareStatement("DELETE FROM bbs_threads WHERE threadid = ?");
      ps.setInt(1, threadid);
      ps.execute();
      ps.close();
    } catch (SQLException se) {
      log.error("SQLException: " + se.getLocalizedMessage(), se);
    }
  }
  public void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) {
    byte mode = slea.readByte();
    if (mode == 6) { // whisper
      String recipient = slea.readMapleAsciiString();
      String text = slea.readMapleAsciiString();

      if (!CommandProcessor.getInstance().processCommand(c, text)) {
        MapleCharacter player =
            c.getChannelServer().getPlayerStorage().getCharacterByName(recipient);
        if (player != null) {
          player
              .getClient()
              .getSession()
              .write(MaplePacketCreator.getWhisper(c.getPlayer().getName(), c.getChannel(), text));
          c.getSession().write(MaplePacketCreator.getWhisperReply(recipient, (byte) 1));
        } else { // not found
          try {
            if (ChannelServer.getInstance(c.getChannel())
                .getWorldInterface()
                .isConnected(recipient)) {
              ChannelServer.getInstance(c.getChannel())
                  .getWorldInterface()
                  .whisper(c.getPlayer().getName(), recipient, c.getChannel(), text);
              c.getSession().write(MaplePacketCreator.getWhisperReply(recipient, (byte) 1));
            } else {
              c.getSession().write(MaplePacketCreator.getWhisperReply(recipient, (byte) 0));
            }
          } catch (RemoteException e) {
            c.getSession().write(MaplePacketCreator.getWhisperReply(recipient, (byte) 0));
            c.getChannelServer().reconnectWorld();
          }
        }
      }
    } else if (mode == 5) { // - /find
      String recipient = slea.readMapleAsciiString();
      MapleCharacter player = c.getChannelServer().getPlayerStorage().getCharacterByName(recipient);
      if (player != null && (c.getPlayer().isGM() || !player.isHidden())) {
        if (player.inCS()) {
          c.getSession().write(MaplePacketCreator.getFindReplyWithCS(player.getName()));
        } else {
          c.getSession()
              .write(
                  MaplePacketCreator.getFindReplyWithMap(
                      player.getName(), player.getMap().getId()));
        }
      } else { // not found
        try {
          int channel =
              ChannelServer.getInstance(c.getChannel()).getWorldInterface().find(recipient);
          if (channel > -1) {
            c.getSession().write(MaplePacketCreator.getFindReply(recipient, channel));
          } else {
            c.getSession().write(MaplePacketCreator.getWhisperReply(recipient, (byte) 0));
          }
        } catch (RemoteException e) {
          c.getChannelServer().reconnectWorld();
        }
      }
    }
  }
  @Override
  public void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) {
    if (!MapleGuild.ENABLE_BBS) {
      c.getSession()
          .write(
              MaplePacketCreator.serverNotice(
                  1, "Your server administrator has currently disabled Guild BBS."));
      return;
    }

    if (c.getPlayer().getGuildId() <= 0) {
      return; // expelled while viewing bbs or hax
    }
    byte mode = slea.readByte();
    int localthreadid = 0;

    switch (mode) {
      case 0:
        // start a new post
        boolean bEdit = slea.readByte() == 1 ? true : false;
        if (bEdit) {
          localthreadid = slea.readInt();
        }
        boolean bNotice = slea.readByte() == 1 ? true : false;
        String title = correctLength(slea.readMapleAsciiString(), 25);
        String text = correctLength(slea.readMapleAsciiString(), 600);
        int icon = slea.readInt();
        if (icon >= 0x64 && icon <= 0x6a) {
          if (!c.getPlayer().haveItem(5290000 + icon - 0x64, 1, false, true)) {
            return; // hax, using an nx icon that s/he doesn't have
          }
        } else if (!(icon >= 0 && icon <= 2)) {
          return; // hax, using an invalid icon
        }
        if (!bEdit) {
          newBBSThread(c, title, text, icon, bNotice);
        } else {
          editBBSThread(c, title, text, icon, localthreadid);
        }
        break;
      case 1:
        // delete a thread
        localthreadid = slea.readInt();
        deleteBBSThread(c, localthreadid);
        break;
      case 2:
        int start = slea.readInt();
        // list threads
        listBBSThreads(c, start * 10);
        break;
      case 3: // list thread + reply, followed by id (int)
        localthreadid = slea.readInt();
        displayThread(c, localthreadid);
        break;
      case 4: // reply
        localthreadid = slea.readInt();
        text = correctLength(slea.readMapleAsciiString(), 25);
        newBBSReply(c, localthreadid, text);
        break;
      case 5: // delete reply
        localthreadid = slea.readInt(); // we don't use this
        int replyid = slea.readInt();
        deleteBBSReply(c, replyid);
        break;
      default:
        log.warn("Unhandled BBS mode: " + mode);
    }
  }
  public static void displayThread(MapleClient client, int threadid, boolean bIsThreadIdLocal) {
    MapleCharacter mc = client.getPlayer();
    if (mc.getGuildId() <= 0) {
      return;
    }

    Connection con = DatabaseConnection.getConnection();
    try {
      PreparedStatement ps =
          con.prepareStatement(
              "SELECT * FROM bbs_threads WHERE guildid = ? AND "
                  + (bIsThreadIdLocal ? "local" : "")
                  + "threadid = ?");
      ps.setInt(1, mc.getGuildId());
      ps.setInt(2, threadid);
      ResultSet threadRS = ps.executeQuery();
      if (!threadRS.next()) {
        threadRS.close();
        ps.close();
        return; // thread no longer exists, deleted?
      }
      ResultSet repliesRS = null;
      PreparedStatement ps2 = null;
      if (threadRS.getInt("replycount") > 0) {
        ps2 = con.prepareStatement("SELECT * FROM bbs_replies WHERE threadid = ?");
        ps2.setInt(1, !bIsThreadIdLocal ? threadid : threadRS.getInt("threadid"));
        repliesRS = ps2.executeQuery();
        // the lack of repliesRS.next() is intentional
      }

      client
          .getSession()
          .write(
              MaplePacketCreator.showThread(
                  bIsThreadIdLocal ? threadid : threadRS.getInt("localthreadid"),
                  threadRS,
                  repliesRS));
      if (ps2 != null) {
        ps2.close();
      }
      if (repliesRS != null) {
        repliesRS.close();
      }
      threadRS.close();
      ps.close();
    } catch (SQLException se) {
      log.error("SQLException: " + se.getLocalizedMessage(), se);
    } catch (RuntimeException re) {
      log.error(
          "The number of reply rows does not match the replycount in thread.  ThreadId = "
              + re.getMessage(),
          re);

      try {
        PreparedStatement ps = con.prepareStatement("DELETE FROM bbs_threads WHERE threadid = ?");
        ps.setInt(1, Integer.parseInt(re.getMessage()));
        ps.execute();
        ps.close();

        ps = con.prepareStatement("DELETE FROM bbs_replies WHERE threadid = ?");
        ps.setInt(1, Integer.parseInt(re.getMessage()));
        ps.execute();
        ps.close();
      } catch (Exception e) {
      }
    }
  }