// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ . // ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌· // ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀ // ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌ // ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀ // Magicbane Emulator Project © 2013 - 2022 // www.magicbane.com package engine.gameManager; import engine.Enum; import engine.Enum.GameObjectType; import engine.Enum.ModType; import engine.Enum.SourceType; import engine.InterestManagement.WorldGrid; import engine.db.archive.BaneRecord; import engine.db.archive.PvpRecord; import engine.net.Dispatch; import engine.net.DispatchMessage; import engine.net.MessageDispatcher; import engine.net.client.ClientConnection; import engine.net.client.Protocol; import engine.net.client.msg.chat.*; import engine.net.client.msg.commands.ClientAdminCommandMsg; import engine.objects.*; import engine.server.MBServerStatics; import engine.server.world.WorldServer; import engine.session.Session; import org.pmw.tinylog.Logger; import java.util.ArrayList; import java.util.HashSet; import java.util.Iterator; import java.util.Set; public enum ChatManager { CHATMANAGER; // Sending a quantity of (FLOOD_QTY_THRESHOLD) messages within // (FLOOD_TIME_THRESHOLD) ms will flag as a flood message // Example, set to 3 & 2000 to flag the 3rd message within 2000 ms. private static final int FLOOD_QTY_THRESHOLD = 3; private static final int FLOOD_TIME_THRESHOLD = 2000; private static final String FLOOD_USER_ERROR = "You talk too much!"; private static final String SILENCED = "You find yourself mute!"; private static final String UNKNOWN_COMMAND = "No such command."; /** * This method used when handling a ChatMsg received from the network. */ public static void handleChatMsg(Session sender, AbstractChatMsg msg) { if (msg == null) { Logger.warn( "null message: "); return; } if (sender == null) { Logger.warn( "null sender: "); return; } PlayerCharacter pc = sender.getPlayerCharacter(); if (pc == null) { Logger.warn( "invalid sender: "); return; } Protocol protocolMsg = msg.getProtocolMsg(); // Flood control, implemented per channel boolean isFlood = false; long curMsgTime = System.currentTimeMillis(); long checkTime = pc.chatFloodTime(protocolMsg.opcode, curMsgTime, FLOOD_QTY_THRESHOLD - 1); if ((checkTime > 0L) && (curMsgTime - checkTime < FLOOD_TIME_THRESHOLD)) isFlood = true; switch (protocolMsg) { case CHATSAY: ChatManager.chatSay(pc, msg.getMessage(), isFlood); return; case CHATCSR: ChatManager.chatCSR(msg); return; case CHATTELL: ChatTellMsg ctm = (ChatTellMsg) msg; ChatManager.chatTell(pc, ctm.getTargetName(), ctm.getMessage(), isFlood); return; case CHATSHOUT: ChatManager.chatShout(pc, msg.getMessage(), isFlood); return; case CHATGUILD: ChatManager.chatGuild(pc, (ChatGuildMsg) msg); return; case CHATGROUP: ChatManager.chatGroup(pc, (ChatGroupMsg) msg); return; case CHATIC: ChatManager.chatIC(pc, (ChatICMsg) msg); return; case LEADERCHANNELMESSAGE: ChatManager.chatGlobal(pc, msg.getMessage(), isFlood); return; case GLOBALCHANNELMESSAGE: case CHATPVP: case CHATCITY: case CHATINFO: case SYSTEMBROADCASTCHANNEL: default: } } /* * Channels */ /* * CSR */ public static void chatCSR(AbstractChatMsg msg) { PlayerCharacter sender = (PlayerCharacter) msg.getSource(); if (sender == null) return; // if (promotionClass == null) // return false; // int promotionClassID = promotionClass.getUUID(); // switch (promotionClassID) { // case 2901: // case 2902: // case 2903: // case 2904: // case 2910: // return true; // } // return false; if (!sender.isCSR) { ChatManager.chatSystemError(sender, UNKNOWN_COMMAND); return; } ArrayList distroList = new ArrayList<>(); for (PlayerCharacter pc : SessionManager .getAllActivePlayerCharacters()) { if (pc.getAccount().status.equals(Enum.AccountStatus.BANNED) == false) distroList.add(pc); } // Send dispatch to each player for (AbstractWorldObject abstractWorldObject : distroList) { PlayerCharacter playerCharacter = (PlayerCharacter) abstractWorldObject; Dispatch dispatch = Dispatch.borrow(playerCharacter, msg); DispatchMessage.dispatchMsgDispatch(dispatch, Enum.DispatchChannel.SECONDARY); } } public static boolean testSilenced(PlayerCharacter pc) { PlayerBonuses bonus = pc.getBonuses(); if (bonus != null && bonus.getBool(ModType.Silenced, SourceType.None)) { ChatManager.chatSayError(pc, SILENCED); return true; } return false; } /* * Say */ public static void chatSay(AbstractWorldObject player, String text, boolean isFlood) { PlayerCharacter pcSender = null; if (player.getObjectType() == GameObjectType.PlayerCharacter) pcSender = (PlayerCharacter) player; // Parser eats all dev commands if (isFlood) { ChatManager.chatSayError(pcSender, FLOOD_USER_ERROR); return; } if (ChatManager.isDevCommand(text) == true) { ChatManager.processDevCommand(player, text); return; } if (ChatManager.isUpTimeRequest(text) == true) { sendSystemMessage(pcSender, WorldServer.getUptimeString()); return; } if (ChatManager.isVersionRequest(text) == true) { sendSystemMessage(pcSender, ConfigManager.MB_WORLD_GREETING.getValue()); return; } if (ChatManager.isNetStatRequest(text) == true) { sendSystemMessage(pcSender, MessageDispatcher.getNetstatString()); return; } // Needs to be refactored if (ChatManager.isPopulationRequest(text) == true) { sendSystemMessage(pcSender, SimulationManager.getPopulationString()); return; } if (ChatManager.isPvpRequest(text) == true) { sendSystemMessage(pcSender, PvpRecord.getPvpHistoryString(pcSender.getObjectUUID())); return; } if (ChatManager.isBaneRequest(text) == true) { sendSystemMessage(pcSender, BaneRecord.getBaneHistoryString()); return; } if (pcSender != null && testSilenced(pcSender)) return; // Make the Message ChatSayMsg chatSayMsg = new ChatSayMsg(player, text); DispatchMessage.dispatchMsgToInterestArea(pcSender, chatSayMsg, Enum.DispatchChannel.SECONDARY, MBServerStatics.SAY_RANGE, true, true); } public static void sendSystemMessage(PlayerCharacter targetPlayer, String messageString) { ChatSystemMsg msg = new ChatSystemMsg(null, messageString); msg.setMessageType(4); msg.setChannel(engine.Enum.ChatChannelType.SYSTEM.getChannelID()); Dispatch dispatch = Dispatch.borrow(targetPlayer, msg); DispatchMessage.dispatchMsgDispatch(dispatch, Enum.DispatchChannel.SECONDARY); } /* * Shout */ public static void chatShout(AbstractWorldObject sender, String text, boolean isFlood) { PlayerCharacter pcSender = null; if (sender.getObjectType().equals(GameObjectType.PlayerCharacter)) pcSender = (PlayerCharacter) sender; if (isFlood) { ChatManager.chatSayError(pcSender, FLOOD_USER_ERROR); return; } if (pcSender != null && testSilenced(pcSender)) return; // Make the Message ChatShoutMsg msg = new ChatShoutMsg(sender, text); DispatchMessage.dispatchMsgToInterestArea(pcSender, msg, engine.Enum.DispatchChannel.SECONDARY, MBServerStatics.SHOUT_RANGE, true, true); } public static void chatGlobal(PlayerCharacter sender, String text, boolean isFlood) { PlayerCharacter pcSender = null; if (sender.getObjectType().equals(GameObjectType.PlayerCharacter)) pcSender = (PlayerCharacter) sender; if (isFlood) { ChatManager.chatSayError(pcSender, FLOOD_USER_ERROR); return; } if (pcSender != null && testSilenced(pcSender)) return; // Make the Message ChatGlobalMsg msg = new ChatGlobalMsg(sender, text); DispatchMessage.dispatchMsgToAll(sender, msg, true); } /* * Tell */ public static void chatTell(AbstractWorldObject sender, String recipient, String text, boolean isFlood) { if (text.isEmpty()) return; PlayerCharacter pcSender = null; if (sender.getObjectType().equals(GameObjectType.PlayerCharacter)) pcSender = (PlayerCharacter) sender; if (pcSender != null && testSilenced(pcSender)) return; PlayerCharacter pcRecip = SessionManager .getPlayerCharacterByLowerCaseName(recipient); if (pcRecip != null) { if (isFlood) { ChatManager.chatTellError(pcSender, FLOOD_USER_ERROR); return; } ChatManager.chatTell(sender, pcRecip, text); } else ChatManager.chatTellError((PlayerCharacter) sender, "There is no such player."); } public static void chatTell(AbstractWorldObject sender, AbstractWorldObject recipient, String text) { PlayerCharacter pcSender = null; if (sender.getObjectType().equals(GameObjectType.PlayerCharacter)) pcSender = (PlayerCharacter) sender; if (pcSender != null && testSilenced(pcSender)) return; // Verify we are sending to a PlayerCharacter PlayerCharacter pcRecip; if (recipient.getObjectType().equals(GameObjectType.PlayerCharacter)) pcRecip = (PlayerCharacter) recipient; else return; ClientConnection cc = SessionManager.getClientConnection( pcRecip); // make sure we have a good ClientConnection if (cc != null) { ChatTellMsg chatTellMsg = new ChatTellMsg(sender, pcRecip, text); // Don't send to recipient if they're ignoring sender if (!pcRecip.isIgnoringPlayer(pcSender)) { // Send dispatch to each player Dispatch dispatch = Dispatch.borrow(pcRecip, chatTellMsg); DispatchMessage.dispatchMsgDispatch(dispatch, Enum.DispatchChannel.SECONDARY); } // Also send /tell to sender if (pcSender != null) { Dispatch dispatch = Dispatch.borrow(pcSender, chatTellMsg); DispatchMessage.dispatchMsgDispatch(dispatch, Enum.DispatchChannel.SECONDARY); } } else ChatManager.chatTellError(pcSender, "There is no such player."); } public static void chatGuild(PlayerCharacter sender, ChatGuildMsg msg) { // Verify sender has PlayerCharacter if (sender == null) return; if (testSilenced(sender)) return; // Verify player is in guild and get guild Guild guild = sender.getGuild(); if (guild == null || guild.getObjectUUID() == 0) return; // Get Distro List for guild ArrayList distroList = SessionManager.getActivePCsInGuildID(guild.getObjectUUID()); if (msg.getUnknown02() == 5) { Guild nation = guild.getNation(); if (nation == null) return; distroList = ChatManager.getNationListChat(nation, sender); } // Check the DistroList size if (distroList.size() < 1) { ChatManager.chatGuildError(sender, "You find yourself mute!"); Logger.error("Guild Chat returned a list of Players <1 in length."); return; } // Make the Message // make the ed message ChatGuildMsg chatGuildMsg = new ChatGuildMsg(msg); chatGuildMsg.setSourceType(sender.getObjectType().ordinal()); chatGuildMsg.setSourceID(sender.getObjectUUID()); chatGuildMsg.setSourceName(sender.getFirstName()); chatGuildMsg.setUnknown03(WorldServer.worldMapID); // Server ID chatGuildMsg.setUnknown04(sender.getGuild() != null ? sender.getGuild() .getCharter() : 0); // Charter? chatGuildMsg.setUnknown05(GuildStatusController.getTitle(sender.getGuildStatus())); // Title? chatGuildMsg.setUnknown06(sender.getRace().getRaceType().getCharacterSex().equals(Enum.CharacterSex.MALE) ? 1 : 2); // isMale?, seen 1 and 2 // Send dispatch to each player for (AbstractWorldObject abstractWorldObject : distroList) { PlayerCharacter playerCharacter = (PlayerCharacter) abstractWorldObject; Dispatch dispatch = Dispatch.borrow(playerCharacter, chatGuildMsg); DispatchMessage.dispatchMsgDispatch(dispatch, Enum.DispatchChannel.SECONDARY); } } public static void chatIC(PlayerCharacter sender, ChatICMsg msg) { // Verify sender has PlayerCharacter if (sender == null) return; if (testSilenced(sender)) return; // Verify player is in guild and get guild Guild guild = sender.getGuild(); if (guild == null || guild.getObjectUUID() == 0) return; //Verify player is an IC if (GuildStatusController.isInnerCouncil(sender.getGuildStatus()) == false) return; // Get Distro List for guild HashSet distroList = ChatManager.getGuildICList(guild, sender); // Check the DistroList size if (distroList.size() < 1) { ChatManager.chatICError(sender, "You find yourself mute!"); Logger.error("Guild Chat returned a list of Players <1 in length."); return; } // TODO Hrm, are we modifying the incoming message or making a response? // Not anymore we aren't! // Create new outgoing message ChatICMsg chatICMsg = new ChatICMsg(msg); chatICMsg.setSourceType(sender.getObjectType().ordinal()); chatICMsg.setSourceID(sender.getObjectUUID()); chatICMsg.setSourceName(sender.getFirstName()); chatICMsg.setUnknown02(WorldServer.worldMapID); // Server ID chatICMsg.setUnknown03(GuildStatusController.getRank(sender.getGuildStatus())); // correct? chatICMsg.setUnknown04(GuildStatusController.getTitle(sender.getGuildStatus())); // correct? chatICMsg.setUnknown05(2); // unknown, seen 1 and 2 // Send dispatch to each player for (AbstractWorldObject abstractWorldObject : distroList) { PlayerCharacter playerCharacter = (PlayerCharacter) abstractWorldObject; Dispatch dispatch = Dispatch.borrow(playerCharacter, chatICMsg); DispatchMessage.dispatchMsgDispatch(dispatch, Enum.DispatchChannel.SECONDARY); } } private static boolean isVersionRequest(String text) { return text.equalsIgnoreCase("lua_version()"); } private static boolean isPvpRequest(String text) { return text.equalsIgnoreCase("lua_pvp()"); } private static boolean isBaneRequest(String text) { return text.equalsIgnoreCase("lua_banes()"); } public static void chatGroup(PlayerCharacter sender, ChatGroupMsg msg) { // Verify sender has PlayerCharacter if (sender == null) return; if (testSilenced(sender)) return; // Verify player is in guild and get guild Group group = GroupManager.getGroup(sender); if (group == null) return; // Get Distro List for guild HashSet distroList = ChatManager.getGroupList(group, sender); // Check the DistroList size if (distroList.size() < 1) { ChatManager.chatGroupError(sender, "You find yourself mute!"); Logger.error("Group Chat returned a list of Players <1 in length."); return; } // Make the Message ChatGroupMsg chatGroupMsg = new ChatGroupMsg(msg); chatGroupMsg.setSourceType(sender.getObjectType().ordinal()); chatGroupMsg.setSourceID(sender.getObjectUUID()); chatGroupMsg.setSourceName(sender.getFirstName()); chatGroupMsg.setUnknown02(WorldServer.worldMapID); // Server ID // Send dispatch to each player for (AbstractWorldObject abstractWorldObject : distroList) { PlayerCharacter playerCharacter = (PlayerCharacter) abstractWorldObject; Dispatch dispatch = Dispatch.borrow(playerCharacter, chatGroupMsg); DispatchMessage.dispatchMsgDispatch(dispatch, Enum.DispatchChannel.SECONDARY); } } public static void GuildEnterWorldMsg(PlayerCharacter sender, ClientConnection origin) { // Verify sender has PlayerCharacter if (sender == null) return; // Verify player is in guild and get guild Guild guild = sender.getGuild(); if (guild == null || guild.getObjectUUID() == 0) return; // Get Distro List for guild HashSet distroList = ChatManager.getGuildList(guild, null); // Check the DistroList size if (distroList.size() < 1) { Logger.error("Guild EnterWorldMsg returned a list of Players <1 in length."); return; } // Make and send enter world message GuildEnterWorldMsg msg = new GuildEnterWorldMsg(sender); msg.setName(sender.getFirstName()); msg.setGuildTitle(GuildStatusController.getTitle(sender.getGuildStatus())); msg.setGuildUUID(guild.getObjectUUID()); msg.setCharter(guild.getCharter()); // Send dispatch to each player for (AbstractWorldObject abstractWorldObject : distroList) { PlayerCharacter playerCharacter = (PlayerCharacter) abstractWorldObject; Dispatch dispatch = Dispatch.borrow(playerCharacter, msg); DispatchMessage.dispatchMsgDispatch(dispatch, Enum.DispatchChannel.SECONDARY); } } public static void chatPeekSteal(PlayerCharacter sender, AbstractCharacter tar, Item item, boolean success, boolean detect, int amount) { if (sender == null || tar == null) return; PlayerCharacter target = null; if (tar.getObjectType().equals(GameObjectType.PlayerCharacter)) target = (PlayerCharacter) tar; // Get Distro List HashSet distroList = WorldGrid .getObjectsInRangePartial(sender.getLoc(), MBServerStatics.SAY_RANGE, MBServerStatics.MASK_PLAYER); // Check the DistroList size if (distroList.size() < 1) return; //remove Thief and Victim from other's list int size = distroList.size(); for (int i = size - 1; i > -1; i--) { AbstractWorldObject awo = (AbstractWorldObject) distroList.toArray()[i]; if (awo.getObjectUUID() == sender.getObjectUUID()) distroList.remove(awo); else if (awo.getObjectUUID() == tar.getObjectUUID()) distroList.remove(awo); } String textToThief = ""; String textToVictim = ""; String textToOthers = ""; if (item != null) //Steal if (success) { String name = ""; if (item.getItemBase() != null) if (item.getItemBase().getUUID() == 7) name = amount + " gold "; else { String vowels = "aeiou"; String iName = item.getItemBase().getName(); if (iName.length() > 0) if (vowels.indexOf(iName.substring(0, 1).toLowerCase()) >= 0) name = "an " + iName + ' '; else name = "a " + iName + ' '; } textToThief = "You have stolen " + name + "from " + tar.getFirstName() + '!'; textToVictim = sender.getFirstName() + "is caught with thier hands in your pocket!"; //textToOthers = sender.getFirstName() + " steals " + name + "from " + target.getFirstName() + "."; } else textToThief = "Your attempt at stealing failed..."; //textToVictim = sender.getFirstName() + " fails to steal from you."; //textToOthers = sender.getFirstName() + " fails to steal from " + target.getFirstName() + "."; else //Peek if (success) { if (detect) { textToThief = tar.getFirstName() + " catches you peeking through their belongings!"; textToVictim = "You catch " + sender.getFirstName() + " peeking through your belongings!"; } } else { textToThief = "Your attempt at peeking failed..."; textToVictim = sender.getFirstName() + " is seen eyeing up your backpack..."; textToOthers = sender.getFirstName() + " is seen eyeing up the backpack of " + tar.getFirstName() + "..."; } //Send msg to thief HashSet senderList = new HashSet<>(); senderList.add(sender); if (!textToThief.isEmpty()) ChatManager.chatSystemSend(senderList, textToThief, 1, 2); if (target != null && !textToVictim.isEmpty()) { HashSet victimList = new HashSet<>(); victimList.add(target); ChatManager.chatSystemSend(victimList, textToVictim, 1, 2); } //Send msg to Others in range\ if (!textToOthers.isEmpty()) ChatManager.chatSystemSend(distroList, textToOthers, 1, 2); } // Send System Announcement as a flash at top of screen public static void chatSystemFlash(String text) { chatSystem(null, text, 2, 1); } public static void chatSystemChannel(String text) { chatSystem(null, text, 1, 4); // Type 4 simply displays text as is } // Send Error Message to player public static void chatSystemError(PlayerCharacter pc, String text) { sendErrorMsgToPlayer(pc, text, 1); } public static void chatSystemInfo(PlayerCharacter pc, String text) { sendInfoMsgToPlayer(pc, text, 1); } public static void chatCommanderError(PlayerCharacter pc, String text) { sendErrorMsgToPlayer(pc, text, 3); } public static void chatNationError(PlayerCharacter pc, String text) { sendErrorMsgToPlayer(pc, text, 5); } public static void chatLeaderError(PlayerCharacter pc, String text) { sendErrorMsgToPlayer(pc, text, 6); } public static void chatShoutError(PlayerCharacter pc, String text) { sendErrorMsgToPlayer(pc, text, 7); } public static void chatInfoError(PlayerCharacter pc, String text) { sendErrorMsgToPlayer(pc, text, 10); } public static void chatGuildError(PlayerCharacter pc, String text) { sendErrorMsgToPlayer(pc, text, 12); } public static void chatICError(PlayerCharacter pc, String text) { sendErrorMsgToPlayer(pc, text, 13); } public static void chatGroupError(PlayerCharacter pc, String text) { sendErrorMsgToPlayer(pc, text, 14); } public static void chatCityError(PlayerCharacter pc, String text) { sendErrorMsgToPlayer(pc, text, 15); } public static void chatSayError(PlayerCharacter pc, String text) { sendErrorMsgToPlayer(pc, text, 16); } public static void chatEmoteError(PlayerCharacter pc, String text) { sendErrorMsgToPlayer(pc, text, 17); } public static void chatTellError(PlayerCharacter pc, String text) { sendErrorMsgToPlayer(pc, text, 19); } // Send Info Message to channels public static void chatCommanderInfo(PlayerCharacter pc, String text) { chatSystem(pc, text, 3, 2); } public static void chatNationInfo(PlayerCharacter pc, String text) { chatSystem(pc, text, 5, 2); } public static void chatNationInfo(Guild nation, String text) { chatSystemGuild(nation, text, 5, 2); } public static void chatLeaderInfo(PlayerCharacter pc, String text) { chatSystem(pc, text, 6, 2); } public static void chatShoutInfo(PlayerCharacter pc, String text) { chatSystem(pc, text, 7, 2); } public static void chatInfoInfo(PlayerCharacter pc, String text) { chatSystem(pc, text, 10, 2); } public static void chatGuildInfo(PlayerCharacter pc, String text) { chatSystem(pc, text, 12, 2); } public static void chatICInfo(PlayerCharacter pc, String text) { chatSystem(pc, text, 13, 2); } public static void chatGroupInfo(PlayerCharacter pc, String text) { chatSystem(pc, text, 14, 2); } public static void chatCityInfo(PlayerCharacter pc, String text) { chatSystem(pc, text, 15, 2); } public static void chatSayInfo(PlayerCharacter pc, String text) { chatSystem(pc, text, 16, 2); } public static void chatEmoteInfo(PlayerCharacter pc, String text) { chatSystem(pc, text, 17, 2); } public static void chatTellInfo(PlayerCharacter pc, String text) { chatSystem(pc, text, 19, 2); } public static void chatGroupInfoCanSee(PlayerCharacter pc, String text) { HashSet distroList = null; Group group = GroupManager.getGroup(pc); if (group != null) { distroList = ChatManager.getGroupList(group, pc); if (distroList != null) { Iterator it = distroList.iterator(); while (it.hasNext()) { AbstractWorldObject awo = it.next(); if (!(awo.getObjectType().equals(GameObjectType.PlayerCharacter))) it.remove(); else { PlayerCharacter pcc = (PlayerCharacter) awo; if (pcc.getSeeInvis() < pc.hidden) it.remove(); } } } } ChatManager.chatSystemSend(distroList, text, 14, 2); } // Send MOTD Message to channels public static void chatNationMOTD(PlayerCharacter pc, String text) { chatNationMOTD(pc, text, false); } public static void chatNationMOTD(PlayerCharacter pc, String text, boolean all) { if (all) // Send to all Nation chatSystem(pc, text, 5, 3); else // Send to just pc chatSystemMOTD(pc, text, 5, 3); } public static void chatGuildMOTD(PlayerCharacter pc, String text) { chatGuildMOTD(pc, text, false); } public static void chatGuildMOTD(PlayerCharacter pc, String text, boolean all) { if (all) // Send to all Guild chatSystem(pc, text, 12, 3); else // Send to just pc chatSystemMOTD(pc, text, 12, 3); } public static void chatICMOTD(PlayerCharacter pc, String text) { chatICMOTD(pc, text, false); } public static void chatICMOTD(PlayerCharacter pc, String text, boolean all) { if (all) // Send to all IC's chatSystem(pc, text, 13, 3); else // Send to just pc chatSystemMOTD(pc, text, 13, 3); } // Send Info Message to guild channel based on guild public static void chatGuildInfo(Guild guild, String text) { HashSet distroList = null; if (guild != null) distroList = ChatManager.getGuildList(guild, null); ChatManager.chatSystemSend(distroList, text, 12, 2); } public static void chatSystemMOTD(PlayerCharacter sender, String text, int channel, int messageType) { HashSet distroList = ChatManager.getOwnPlayer(sender); ChatManager.chatSystemSend(distroList, text, channel, messageType); } public static void chatPVP(String text) { // Create message ChatPvPMsg msg = new ChatPvPMsg(null, text); DispatchMessage.dispatchMsgToAll(msg); } public static void chatInfo(String text) { HashSet distroList = ChatManager.getAllPlayers(null); chatSystemSend(distroList, text, 1, 2); } public static ChatSystemMsg CombatInfo(AbstractWorldObject source, AbstractWorldObject target) { String text = "The " + target.getName() + " attacks " + source.getName(); ChatSystemMsg msg = new ChatSystemMsg(null, text); msg.setChannel(20); msg.setMessageType(2); return msg; } public static void chatSystem(PlayerCharacter sender, String text, int channel, int messageType) { HashSet distroList = null; if (channel == 1) // System Channel Message distroList = ChatManager.getAllPlayers(sender); else if (channel == 2) // System Flash, send to everyone distroList = ChatManager.getAllPlayers(sender); else if (channel == 3) { // Commander Channel } else if (channel == 5) { // Nation Channel, get Nation list Guild guild = sender.getGuild(); if (guild != null) { Guild nation = guild.getNation(); if (nation != null) if (nation.getObjectUUID() != 0) // Don't /nation to errant // nation distroList = ChatManager.getNationList(nation, sender); } } else if (channel == 6) { // Leader Channel } else if (channel == 7) // Shout Channel distroList = ChatManager.getOwnPlayer(sender); else if (channel == 10) // Info Channel distroList = getOwnPlayer(sender); else if (channel == 12) { // guild Channel, get Guild list Guild guild = sender.getGuild(); if (guild != null) if (guild.getObjectUUID() != 0) // Don't /guild to errant guild distroList = ChatManager.getGuildList(guild, sender); } else if (channel == 13) { // IC Channel, get Guild IC list Guild guild = sender.getGuild(); if (guild != null) if (guild.getObjectUUID() != 0) // Don't /IC to errant guild distroList = ChatManager.getGuildICList(guild, sender); } else if (channel == 14) { // Group Channel, get group list Group group = GroupManager.getGroup(sender); if (group != null) distroList = ChatManager.getGroupList(group, sender); } else if (channel == 15) { // City Channel, get people bound to city // list } else if (channel == 16) // Say Channel distroList = ChatManager.getOwnPlayer(sender); else if (channel == 17) { // Emote Channel, get say List } else if (channel == 19) // Tell Channel distroList = ChatManager.getOwnPlayer(sender); else return; ChatManager.chatSystemSend(distroList, text, channel, messageType); } public static void chatSystemGuild(Guild sender, String text, int channel, int messageType) { HashSet distroList = null; if (channel == 5) { // Nation Channel, get Nation list if (sender != null) { Guild nation = sender.getNation(); if (nation != null) if (nation.getObjectUUID() != 0) // Don't /nation to errant // nation distroList = ChatManager.getNationList(nation, null); } } else if (channel == 12) { // guild Channel, get Guild list if (sender != null) if (sender.getObjectUUID() != 0) // Don't /guild to errant guild distroList = ChatManager.getGuildList(sender, null); } else if (channel == 13) { // IC Channel, get Guild IC list if (sender != null) if (sender.getObjectUUID() != 0) // Don't /IC to errant guild distroList = ChatManager.getGuildICList(sender, null); } else return; ChatManager.chatSystemSend(distroList, text, channel, messageType); } public static void chatSystemSend(HashSet distroList, String text, int channel, int messageType) { // verify someone in distroList to send message to if (distroList == null) return; if (distroList.size() < 1) return; // Create message ChatSystemMsg chatSystemMsg = new ChatSystemMsg(null, text); chatSystemMsg.setChannel(channel); chatSystemMsg.setMessageType(messageType); // Send dispatch to each player for (AbstractWorldObject abstractWorldObject : distroList) { PlayerCharacter playerCharacter = (PlayerCharacter) abstractWorldObject; Dispatch dispatch = Dispatch.borrow(playerCharacter, chatSystemMsg); DispatchMessage.dispatchMsgDispatch(dispatch, Enum.DispatchChannel.SECONDARY); } } // Get distroList for guild public static HashSet getGuildList(Guild guild, PlayerCharacter source) { HashSet distroList = new HashSet<>(); for (PlayerCharacter playerCharacter : SessionManager.getAllActivePlayerCharacters()) { if (Guild.sameGuild(playerCharacter.getGuild(), guild)) { if (source != null && playerCharacter.isIgnoringPlayer(source)) continue; // dont add if recip has ignored source distroList.add(playerCharacter); } } return distroList; } // Get distroList for guild IC's public static HashSet getGuildICList(Guild guild, PlayerCharacter source) { HashSet distroList = new HashSet<>(); for (PlayerCharacter pc : SessionManager.getAllActivePlayerCharacters()) { if (Guild.sameGuild(pc.getGuild(), guild)) if (GuildStatusController.isInnerCouncil(pc.getGuildStatus())) { if (source != null && pc.isIgnoringPlayer(source)) continue; // dont add if recip has ignored source distroList.add(pc); } } return distroList; } // Get distroList for group public static HashSet getGroupList(Group group, PlayerCharacter source) { HashSet distroList = new HashSet<>(); Set players = group.getMembers(); for (PlayerCharacter pc : players) { if (source != null && pc.isIgnoringPlayer(source)) continue; // dont add if recip has ignored source distroList.add(pc); } return distroList; } // Get distroList for nation public static HashSet getNationList(Guild nation, PlayerCharacter source) { HashSet distroList = new HashSet<>(); for (PlayerCharacter pc : SessionManager.getAllActivePlayerCharacters()) { Guild guild = pc.getGuild(); if (guild != null) if (guild.getNation().getObjectUUID() == nation.getObjectUUID()) { if (source != null && pc.isIgnoringPlayer(source)) continue; // dont add if recip has ignored source distroList.add(pc); } } return distroList; } public static ArrayList getNationListChat(Guild nation, PlayerCharacter source) { ArrayList distroList = new ArrayList<>(); for (PlayerCharacter pc : SessionManager.getAllActivePlayerCharacters()) { Guild guild = pc.getGuild(); if (guild != null) if (guild.getNation().getObjectUUID() == nation.getObjectUUID()) { if (source != null && pc.isIgnoringPlayer(source)) continue; // dont add if recip has ignored source distroList.add(pc); } } return distroList; } // Get distroList for all players public static HashSet getAllPlayers(PlayerCharacter source) { HashSet distroList = new HashSet<>(); for (PlayerCharacter pc : SessionManager.getAllActivePlayerCharacters()) { if (source != null && pc.isIgnoringPlayer(source)) continue; // dont add if recip has ignored source distroList.add(pc); } return distroList; } // Get just self for distrList public static HashSet getOwnPlayer(PlayerCharacter pc) { if (pc == null) return null; HashSet distroList = new HashSet<>(); distroList.add(pc); return distroList; } /* * Utils */ // Error Message for type channel private static void sendErrorMsgToPlayer(AbstractCharacter player, String message, int channel) { if (player == null) return; ChatManager.sendSystemMsgToPlayer(player, message, channel, 1); } // Info Message for type channel private static void sendInfoMsgToPlayer(AbstractCharacter player, String message, int channel) { ChatManager.sendSystemMsgToPlayer(player, message, channel, 2); } // Message of the Day Message for type channel // private void sendMOTDMsgToPlayer(AbstractCharacter player, String message, int channel) { // this.sendSystemMsgToPlayer(player, message, channel, 3); // } private static void sendSystemMsgToPlayer(AbstractCharacter player, String message, int channel, int messageType) { PlayerCharacter playerCharacter; if (player == null) return; if (player.getObjectType().equals(GameObjectType.PlayerCharacter) == false) { Logger.error("Chat message sent to non player"); return; } // Wtf recasting this? If we're sending chat messages to players // or mobiles, then something is really wrong. playerCharacter = (PlayerCharacter) player; ChatSystemMsg chatSystemMsg = new ChatSystemMsg(null, message); chatSystemMsg.setMessageType(messageType); // Error message chatSystemMsg.setChannel(channel); Dispatch dispatch = Dispatch.borrow(playerCharacter, chatSystemMsg); DispatchMessage.dispatchMsgDispatch(dispatch, Enum.DispatchChannel.SECONDARY); } private static boolean isDevCommand(String text) { return text.startsWith(MBServerStatics.DEV_CMD_PREFIX); } private static boolean isUpTimeRequest(String text) { return text.equalsIgnoreCase("lua_uptime()"); } private static boolean isNetStatRequest(String text) { return text.equalsIgnoreCase("lua_netstat()"); } private static boolean isPopulationRequest(String text) { return text.equalsIgnoreCase("lua_population()"); } private static boolean processDevCommand(AbstractWorldObject sender, String text) { if (sender.getObjectType().equals(GameObjectType.PlayerCharacter)) { PlayerCharacter pcSender = (PlayerCharacter) sender; // first remove the DEV_CMD_PREFIX String[] words = text.split(MBServerStatics.DEV_CMD_PREFIX, 2); if (words[1].length() == 0) return false; // next get the command String[] commands = words[1].split(" ", 2); String cmd = commands[0].toLowerCase(); String cmdArgument = ""; if (commands.length > 1) cmdArgument = commands[1].trim(); AbstractGameObject target = pcSender.getLastTarget(); // return DevCmd.processDevCommand(pcSender, cmd, cmdArgument, // target); return DevCmdManager.handleDevCmd(pcSender, cmd, cmdArgument, target); } return false; } /** * Process an Admin Command, which is a preset command sent from the client */ public static void HandleClientAdminCmd(ClientAdminCommandMsg data, ClientConnection cc) { PlayerCharacter pcSender = SessionManager.getPlayerCharacter(cc); if (pcSender == null) return; Account acct = SessionManager.getAccount(pcSender); if (acct == null) return; // require minimal access to continue // specific accessLevel checks performed by the DevCmdManager if (acct.status.equals(Enum.AccountStatus.ADMIN) == false) { Logger.warn(pcSender.getFirstName() + " Attempted to use a client admin command"); //wtf? ChatManager.chatSystemInfo(pcSender, "CHEATER!!!!!!!!!!!!!"); return; } // First remove the initial slash String d = data.getMsgCommand(); String[] words = d.split("/", 2); if (words[1].length() == 0) return; // Next get the command String[] commands = words[1].split(" ", 2); String cmd = commands[0].toLowerCase(); String cmdArgument = ""; if (commands.length > 1) cmdArgument = commands[1].trim(); AbstractGameObject target = data.getTarget(); // Map to a DevCmd String devCmd = ""; if (cmd.compareTo("goto") == 0) devCmd = "goto"; else if (cmd.compareTo("suspend") == 0) devCmd = "suspend"; else if (cmd.compareTo("getinfo") == 0) devCmd = "info"; else if (devCmd.isEmpty()) { Logger.info("Unhandled admin command was used: /" + cmd); return; } DevCmdManager.handleDevCmd(pcSender, devCmd, cmdArgument, target); } }