package handling.channel.handler; import client.MapleCharacter; import client.MapleCharacterUtil; import client.MapleClient; import client.messages.CommandProcessor; import client.messages.CommandType; import handling.channel.ChannelServer; import handling.world.World; import handling.world.WorldBroadcastService; import handling.world.WorldBuddyService; import handling.world.WorldFindService; import handling.world.WorldGuildService; import handling.world.WorldMessengerService; import handling.world.WrodlPartyService; import handling.world.messenger.MapleMessenger; import handling.world.messenger.MapleMessengerCharacter; import handling.world.messenger.MessengerType; import org.apache.log4j.Logger; import tools.FileoutputUtil; import tools.MaplePacketCreator; import tools.StringUtil; import tools.data.input.SeekableLittleEndianAccessor; import tools.packet.MessengerPacket; import tools.packet.WhisperPacket; public class ChatHandler { private static final Logger log = Logger.getLogger(ChatHandler.class); public static void GeneralChat(String text, byte unk, MapleClient c, MapleCharacter chr) { if ((text.length() > 0) && (chr != null) && (chr.getMap() != null)) { if (!CommandProcessor.processCommand(c, text, CommandType.NORMAL)) { if ((!chr.isIntern()) && (text.length() >= 80)) { return; } if ((chr.getCanTalk()) || (chr.isStaff())) { if (chr.isHidden()) { if ((chr.isIntern()) && (!chr.isSuperGM()) && (unk == 0)) { chr.getMap().broadcastGMMessage(chr, MaplePacketCreator.getChatText(chr.getId(), text, false, 1), true); // if (unk == 0) { // chr.getMap().broadcastGMMessage(chr, MaplePacketCreator.serverNotice(2, new StringBuilder().append(chr.getName()).append(" : ").append(text).toString()), true); // } } else { chr.getMap().broadcastGMMessage(chr, MaplePacketCreator.getChatText(chr.getId(), text, c.getPlayer().isSuperGM(), unk), true); } } else { if ((chr.isIntern()) && (!chr.isSuperGM()) && (unk == 0)) { chr.getMap().broadcastMessage(MaplePacketCreator.getChatText(chr.getId(), text, false, 1), c.getPlayer().getTruePosition()); // if (unk == 0) { // chr.getMap().broadcastMessage(MaplePacketCreator.serverNotice(2, new StringBuilder().append(chr.getName()).append(" : ").append(text).toString()), c.getPlayer().getTruePosition()); // } } else { chr.getMap().broadcastMessage(MaplePacketCreator.getChatText(chr.getId(), text, c.getPlayer().isSuperGM(), unk), c.getPlayer().getTruePosition()); } } } else { c.getSession().write(MaplePacketCreator.serverMessagePopUp("你被禁言了,所以暂时还不能聊天!")); } } } } public static void Others(SeekableLittleEndianAccessor slea, MapleClient c, MapleCharacter chr) { int type = slea.readByte(); byte numRecipients = slea.readByte(); if (numRecipients <= 0) { return; } int[] recipients = new int[numRecipients]; for (byte i = 0; i < numRecipients; i = (byte) (i + 1)) { recipients[i] = slea.readInt(); } String chattext = slea.readMapleAsciiString(); if ((chr == null) || (!chr.getCanTalk())) { c.getSession().write(MaplePacketCreator.serverMessagePopUp("你被禁言了,暂时不能聊天!")); return; } if (c.isMonitored()) { String chattype = "未知"; switch (type) { case 0: chattype = "好友"; break; case 1: chattype = "组队"; break; case 2: chattype = "家族"; break; case 3: chattype = "联盟"; break; case 4: chattype = "远征"; } WorldBroadcastService.getInstance().broadcastGMMessage(MaplePacketCreator.serverMessageNotice(new StringBuilder().append("[GM 信息] ").append(MapleCharacterUtil.makeMapleReadable(chr.getName())).append(" 在 (").append(chattype).append(") 中说: ").append(chattext).toString())); } if (chattext.length() <= 0 || CommandProcessor.processCommand(c, chattext,CommandType.NORMAL)) { return; } switch (type) { case 0: WorldBuddyService.getInstance().buddyChat(recipients, chr.getId(), chr.getName(), chattext); break; case 1: if (chr.getParty() != null) { WrodlPartyService.getInstance().partyChat(chr.getParty().getId(), chattext, chr.getName()); } break; case 2: if (chr.getGuildId() > 0) { WorldGuildService.getInstance().guildChat(chr.getGuildId(), chr.getName(), chr.getId(), chattext); } break; case 4: if ((chr.getParty() != null) && (chr.getParty().getExpeditionId() > 0)) { WrodlPartyService.getInstance().expedChat(chr.getParty().getExpeditionId(), chattext, chr.getName()); } break; } } public static void Messenger(SeekableLittleEndianAccessor slea, MapleClient c) { MapleMessenger messenger = c.getPlayer().getMessenger(); WorldMessengerService messengerService = WorldMessengerService.getInstance(); int action = slea.readByte(); switch (action) { case 0: if (messenger != null) { MapleMessengerCharacter messengerplayer = new MapleMessengerCharacter(c.getPlayer()); messengerService.leaveMessenger(messenger.getId(), messengerplayer); c.getPlayer().setMessenger(null); } int mode = slea.readByte(); int maxMembers = slea.readByte(); int messengerId = slea.readInt(); if (messengerId == 0) { MapleMessengerCharacter messengerPlayer = new MapleMessengerCharacter(c.getPlayer()); MessengerType type = MessengerType.getMessengerType(maxMembers, mode != 0); if (type == null) { return; } if (mode == 0) { c.getPlayer().setMessenger(messengerService.createMessenger(messengerPlayer, type, c.getPlayer().isIntern())); } else if (mode == 1) { messenger = c.getPlayer().isIntern() ? messengerService.getRandomHideMessenger(type) : messengerService.getRandomMessenger(type); if (messenger != null) { int position = messenger.getLowestPosition(); if (position != -1) { c.getPlayer().setMessenger(messenger); messengerService.joinMessenger(messenger.getId(), new MapleMessengerCharacter(c.getPlayer()), c.getPlayer().getName(), c.getChannel()); } } else { c.getPlayer().setMessenger(messengerService.createMessenger(messengerPlayer, type, c.getPlayer().isIntern())); c.getSession().write(MessengerPacket.joinMessenger(255)); } } } else { messenger = messengerService.getMessenger(messengerId); if (messenger == null) { break; } int position = messenger.getLowestPosition(); if (position != -1) { c.getPlayer().setMessenger(messenger); messengerService.joinMessenger(messenger.getId(), new MapleMessengerCharacter(c.getPlayer()), c.getPlayer().getName(), c.getChannel()); } } break; case 2: if (messenger == null) { break; } MapleMessengerCharacter messengerplayer = new MapleMessengerCharacter(c.getPlayer()); messengerService.leaveMessenger(messenger.getId(), messengerplayer); c.getPlayer().setMessenger(null); break; case 3: if (messenger == null) { break; } int position = messenger.getLowestPosition(); if (position == -1) { return; } String input = slea.readMapleAsciiString(); MapleCharacter target = c.getChannelServer().getPlayerStorage().getCharacterByName(input); if (target != null) { if ((!target.isIntern()) || (c.getPlayer().isIntern())) { c.getSession().write(MessengerPacket.messengerNote(input, 4, 1)); target.getClient().getSession().write(MessengerPacket.messengerInvite(c.getPlayer().getName(), messenger.getId(), c.getChannel() - 1)); } else { c.getSession().write(MessengerPacket.messengerNote(input, 4, 1)); } } else if (World.isConnected(input)) { messengerService.messengerInvite(c.getPlayer().getName(), messenger.getId(), input, c.getChannel(), c.getPlayer().isIntern()); } else { c.getSession().write(MessengerPacket.messengerNote(input, 4, 0)); } break; case 5: String targeted = slea.readMapleAsciiString(); target = c.getChannelServer().getPlayerStorage().getCharacterByName(targeted); if (target != null) { if (target.getMessenger() == null) { break; } target.getClient().getSession().write(MessengerPacket.messengerNote(c.getPlayer().getName(), 5, 0)); } else { if (c.getPlayer().isIntern()) { break; } messengerService.declineChat(targeted, c.getPlayer().getName()); } break; case 6: if (messenger == null) { break; } String chattext = slea.readMapleAsciiString(); position = 0;//这里看看 if (slea.available() > 0) { position = Integer.parseInt(slea.readMapleAsciiString()); } messengerService.messengerChat(messenger.getId(), chattext, c.getPlayer().getName(), String.valueOf(position)); if ((messenger.isMonitored()) && (chattext.length() > c.getPlayer().getName().length() + 3)) { WorldBroadcastService.getInstance().broadcastGMMessage(MaplePacketCreator.serverMessageNotice(new StringBuilder().append("[GM 信息] ").append(MapleCharacterUtil.makeMapleReadable(c.getPlayer().getName())).append("(Messenger: ").append(messenger.getMemberNamesDEBUG()).append(") said: ").append(chattext).toString())); } break; case 9: if (messenger == null) { break; } String name = slea.readMapleAsciiString(); if (!messenger.getType().random) { return; } MapleCharacter targetPlayer = WorldFindService.getInstance().findCharacterByName(name); if ((targetPlayer != null) && (targetPlayer.getId() != c.getPlayer().getId()) && (targetPlayer.getMessenger() != null) && (targetPlayer.getMessenger().getId() == messenger.getId())) { switch (c.getPlayer().canGiveLove(targetPlayer)) { case 0: if (Math.abs(targetPlayer.getLove() + 1) <= 99999) { targetPlayer.addLove(1); targetPlayer.getClient().getSession().write(MessengerPacket.updateLove(targetPlayer.getLove())); } c.getPlayer().hasGiveLove(targetPlayer); c.getSession().write(MessengerPacket.giveLoveResponse(0, c.getPlayer().getName(), targetPlayer.getName())); targetPlayer.getClient().getSession().write(MessengerPacket.giveLoveResponse(0, c.getPlayer().getName(), targetPlayer.getName())); break; case 1: c.getSession().write(MessengerPacket.giveLoveResponse(1, c.getPlayer().getName(), targetPlayer.getName())); break; case 2: c.getSession().write(MessengerPacket.giveLoveResponse(2, c.getPlayer().getName(), targetPlayer.getName())); } } break; case 11: if (messenger == null) { break; } name = slea.readMapleAsciiString(); MapleCharacter player = WorldFindService.getInstance().findCharacterByName(name); if (player != null) { if ((player.getMessenger() != null) && (player.getMessenger().getId() == messenger.getId())) { c.getSession().write(MessengerPacket.messengerPlayerInfo(player)); } } else { c.getSession().write(MessengerPacket.messengerNote(name, 4, 0)); } break; case 14: if (messenger == null) { break; } String namefrom = slea.readMapleAsciiString(); chattext = slea.readMapleAsciiString(); position = slea.readByte(); messengerService.messengerWhisper(messenger.getId(), chattext, namefrom, position); break; case 15: break; default: FileoutputUtil.log(new StringBuilder().append("聊天招待操作( 0x").append(StringUtil.getLeftPaddedStr(Integer.toHexString(action).toUpperCase(), '0', 2)).append(" ) 未知.").toString()); } } public static void Whisper_Find(SeekableLittleEndianAccessor slea, MapleClient c) { byte mode = slea.readByte(); slea.readInt(); switch (mode) { case 5: case 68: String recipient = slea.readMapleAsciiString(); MapleCharacter player = c.getChannelServer().getPlayerStorage().getCharacterByName(recipient); if (player != null) { if ((!player.isIntern()) || ((c.getPlayer().isIntern()) && (player.isIntern()))) { c.getSession().write(WhisperPacket.getFindReplyWithMap(player.getName(), player.getMap().getId(), mode == 68)); } else { c.getSession().write(WhisperPacket.getWhisperReply(recipient, (byte) 0)); } } else { int ch = WorldFindService.getInstance().findChannel(recipient); if (ch > 0) { player = ChannelServer.getInstance(ch).getPlayerStorage().getCharacterByName(recipient); if (player == null) { break; } if ((!player.isIntern()) || ((c.getPlayer().isIntern()) && (player.isIntern()))) { c.getSession().write(WhisperPacket.getFindReply(recipient, (byte) ch, mode == 68)); } else { c.getSession().write(WhisperPacket.getWhisperReply(recipient, (byte) 0)); } } else if (ch == -10) { c.getSession().write(WhisperPacket.getFindReplyWithCS(recipient, mode == 68)); } else if (ch == -20) { c.getPlayer().dropMessage(5, new StringBuilder().append("'").append(recipient).append("' is at the MTS.").toString()); } else { c.getSession().write(WhisperPacket.getWhisperReply(recipient, (byte) 0)); } } break; case 6: if ((c.getPlayer() == null) || (c.getPlayer().getMap() == null)) { return; } if (!c.getPlayer().getCanTalk()) { c.getSession().write(MaplePacketCreator.serverMessagePopUp("You have been muted and are therefore unable to talk.")); return; } recipient = slea.readMapleAsciiString(); String text = slea.readMapleAsciiString(); int ch = WorldFindService.getInstance().findChannel(recipient); if (ch > 0) { player = ChannelServer.getInstance(ch).getPlayerStorage().getCharacterByName(recipient); if (player == null) { break; } player.getClient().getSession().write(WhisperPacket.getWhisper(c.getPlayer().getName(), c.getChannel(), text)); if ((!c.getPlayer().isIntern()) && (player.isIntern())) { c.getSession().write(WhisperPacket.getWhisperReply(recipient, (byte) 0)); } else { c.getSession().write(WhisperPacket.getWhisperReply(recipient, (byte) 1)); } if (c.isMonitored()) { WorldBroadcastService.getInstance().broadcastGMMessage(MaplePacketCreator.serverMessageRedText(new StringBuilder().append(c.getPlayer().getName()).append(" whispered ").append(recipient).append(" : ").append(text).toString())); } else if (player.getClient().isMonitored()) { WorldBroadcastService.getInstance().broadcastGMMessage(MaplePacketCreator.serverMessageRedText(new StringBuilder().append(c.getPlayer().getName()).append(" whispered ").append(recipient).append(" : ").append(text).toString())); } } else { c.getSession().write(WhisperPacket.getWhisperReply(recipient, (byte) 0)); } } } public static void ShowLoveRank(SeekableLittleEndianAccessor slea, MapleClient c) { byte mode = slea.readByte(); switch (mode) { case 7: c.getSession().write(MessengerPacket.showLoveRank(7)); break; case 8: } } }