示例#1
0
  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);
    }
  }