forked from MagicBane/Server
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1232 lines
43 KiB
1232 lines
43 KiB
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ . |
|
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌· |
|
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀ |
|
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌ |
|
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀ |
|
// 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<AbstractWorldObject> 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<PlayerCharacter> 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<AbstractWorldObject> 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<AbstractWorldObject> 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<AbstractWorldObject> 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<AbstractWorldObject> 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<AbstractWorldObject> senderList = new HashSet<>(); |
|
senderList.add(sender); |
|
if (!textToThief.isEmpty()) |
|
ChatManager.chatSystemSend(senderList, textToThief, 1, 2); |
|
|
|
if (target != null && !textToVictim.isEmpty()) { |
|
HashSet<AbstractWorldObject> 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<AbstractWorldObject> distroList = null; |
|
|
|
Group group = GroupManager.getGroup(pc); |
|
if (group != null) { |
|
distroList = ChatManager.getGroupList(group, pc); |
|
if (distroList != null) { |
|
Iterator<AbstractWorldObject> 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<AbstractWorldObject> 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<AbstractWorldObject> 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<AbstractWorldObject> 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<AbstractWorldObject> 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<AbstractWorldObject> 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<AbstractWorldObject> 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<AbstractWorldObject> getGuildList(Guild guild, PlayerCharacter source) { |
|
HashSet<AbstractWorldObject> 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<AbstractWorldObject> getGuildICList(Guild guild, PlayerCharacter source) { |
|
|
|
HashSet<AbstractWorldObject> 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<AbstractWorldObject> getGroupList(Group group, PlayerCharacter source) { |
|
HashSet<AbstractWorldObject> distroList = new HashSet<>(); |
|
Set<PlayerCharacter> 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<AbstractWorldObject> getNationList(Guild nation, PlayerCharacter source) { |
|
HashSet<AbstractWorldObject> 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<PlayerCharacter> getNationListChat(Guild nation, PlayerCharacter source) { |
|
ArrayList<PlayerCharacter> 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<AbstractWorldObject> getAllPlayers(PlayerCharacter source) { |
|
|
|
HashSet<AbstractWorldObject> 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<AbstractWorldObject> getOwnPlayer(PlayerCharacter pc) { |
|
if (pc == null) |
|
return null; |
|
HashSet<AbstractWorldObject> 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); |
|
} |
|
|
|
|
|
}
|
|
|