diff --git a/DataCollection/gamedata.json b/DataCollection/gamedata.json index 33ad0a1..6d0c431 100755 --- a/DataCollection/gamedata.json +++ b/DataCollection/gamedata.json @@ -62,18 +62,21 @@ "buddy_request":"Attempting to Add Buddy. The other player must click ADD BUDDY as well. (Many players reserve this for just a couple players so don't feel insulted if they do not).", "click_nothing_message":"Nothing interesting here...", "playtime_timeout":"You have run out of playtime for now. In one minute you will be disconnected. You gain one minute of playtime every 8 minutes. Please come back later!", - "random_movement":"You are sooo %STAT%. You wander dizzily in a different direction.", - "movement_key":[ - {"stat":"THIRSTY", "msg":"dizzily"}, - {"stat":"HUNGERY", "msg":"stumble"}, - {"stat":"TIREDNESS", "msg":"???"} - ], + "random_movement":"You are sooo %STAT%. You wander %MSG% in a different direction.", + "movement_key":{ + "thirsty":"dizzily"}, + "hungery":"stumble"}, + }, "incorrect_password":"Incorrect. You will have to find the correct answer somewhere...", "player_here":"%USERNAME% here", "no_telescope":"You do not have a telescope to use! You try making circles with your hands and placing them in front of one eye, but it is of minimal aid...", "starved_horse":"You have been sent to Prison Isle for starving one of your horses! They have been fed for you.", "message_queue":"OFFLINE MESSAGE:", "random_event_prefix":"A RANDOM EVENT HAS OCCURRED: ", + "auto_reply":{ + "too_long":"Auto-reply too long.", + "contains_violations":"There were chat violations in the AutoReply. NOT SETUP." + }, "timed_messages":{ "rng_message":["Don't forget to pet your kitty/dog/fish/stuffed animal.", "Don't forget to stretch once in a while.", "Are you running late for school/work?!?!", @@ -1219,6 +1222,8 @@ "seperator":"
", }, "chat":{ + "dm_moderator":"[mod]", + "dm_autoreply":"[autoreply]", "for_others":{ "global_format":"%USERNAME%: %MESSAGE%", "global_format_moderator":"%USERNAME%: %MESSAGE%", @@ -1229,8 +1234,7 @@ "here_format":"%USERNAME%: %MESSAGE%", "near_format":"%USERNAME%: %MESSAGE%", "isle_format":"%USERNAME%: %MESSAGE%", - "dm_format":"%USERNAME%: %MESSAGE%", - "dm_format_moderator":"%USERNAME%[mod]: %MESSAGE%" + "dm_format":"%USERNAME%%FORMATPART%: %MESSAGE%", }, "for_sender":{ @@ -1241,7 +1245,7 @@ "mod_format":"%USERNAME%: %MESSAGE% [%AMOUNT% mods]", "admin_format":"%USERNAME%: %MESSAGE% [%AMOUNT% admins]", "friend_format":"%USERNAME%: %MESSAGE% [%AMOUNT% buds]", - "dm_format":"%FROMUSER%>%TOUSER%: %MESSAGE%" + "dm_format":"%FROMUSER%%FORMATPART%>%TOUSER%: %MESSAGE%" }, "filter":[ {"word":"anal","reason_type":"profanity","match_all":false}, diff --git a/Horse Isle Server/HorseIsleServer/Game/Chat/Chat.cs b/Horse Isle Server/HorseIsleServer/Game/Chat/Chat.cs index 4791854..61dc915 100755 --- a/Horse Isle Server/HorseIsleServer/Game/Chat/Chat.cs +++ b/Horse Isle Server/HorseIsleServer/Game/Chat/Chat.cs @@ -166,6 +166,9 @@ namespace HISP.Game.Chat else if (message.ToUpper().StartsWith("!HEAR")) return Command.UnMute(message, args, user); + else if (message.ToUpper().StartsWith("!AUTOREPLY")) + return Command.AutoReply(message, args, user); + else if (message.ToUpper().StartsWith("!QUIZ")) return Command.Quiz(message, args, user); @@ -433,7 +436,7 @@ namespace HISP.Game.Chat return message.Replace("<", "<"); } - public static string FormatChatForOthers(User user, ChatChannel channel, string message) + public static string FormatChatForOthers(User user, ChatChannel channel, string message, bool autoReply=false) { switch (channel) @@ -448,10 +451,12 @@ namespace HISP.Game.Chat case ChatChannel.Buddies: return Messages.FormatBuddyChatMessage(user.Username, message); case ChatChannel.Dm: + string badge = ""; if (user.Moderator || user.Administrator) - return Messages.FormatDirectMessageForMod(user.Username, message); - else - return Messages.FormatDirectMessage(user.Username, message); + badge += Messages.DmModBadge; + if (autoReply) + badge += Messages.DmAutoResponse; + return Messages.FormatDirectMessage(user.Username, message, badge); case ChatChannel.Near: return Messages.FormatNearbyChatMessage(user.Username, message); case ChatChannel.Isle: @@ -464,7 +469,7 @@ namespace HISP.Game.Chat else { Logger.HackerPrint(user.Username + " Tried to send in mod chat without being a moderator. (Hack/Code Attempt)"); - return user.Username + " is a hacker! (Sent in mod channel without being a mod) Maybe ban?"; + return ""; } case ChatChannel.Admin: if (user.Administrator) @@ -472,14 +477,14 @@ namespace HISP.Game.Chat else { Logger.HackerPrint(user.Username + " Tried to send in mod chat without being a moderator. (Hack/Code Attempt)"); - return user.Username + " is a hacker! (Sent in admin channel without being a admin) Maybe ban?"; + return ""; } default: Logger.ErrorPrint(user.Username + " is trying to end a message in unknown channel " + channel.ToString("X")); return "not implemented yet :("; } } - public static string FormatChatForSender(User user, ChatChannel channel, string message, string dmRecipiant=null) + public static string FormatChatForSender(User user, ChatChannel channel, string message, string dmRecipiant=null, bool autoReply=false) { switch (channel) { @@ -511,7 +516,12 @@ namespace HISP.Game.Chat int adminsOnline = GameServer.GetNumberOfAdminsOnline() - 1; return Messages.FormatAdminChatForSender(adminsOnline, user.Username, message); case ChatChannel.Dm: - return Messages.FormatDirectChatMessageForSender(user.Username, dmRecipiant, message); + string badge = ""; + if (user.Moderator || user.Administrator) + badge += Messages.DmModBadge; + if (autoReply) + badge += Messages.DmAutoResponse; + return Messages.FormatDirectChatMessageForSender(user.Username, dmRecipiant, message, badge); default: Logger.ErrorPrint(user.Username + " is trying to end a message in unknown channel " + channel.ToString("X")); return "not implemented yet :("; diff --git a/Horse Isle Server/HorseIsleServer/Game/Chat/Command.cs b/Horse Isle Server/HorseIsleServer/Game/Chat/Command.cs index 1541f61..13012f1 100755 --- a/Horse Isle Server/HorseIsleServer/Game/Chat/Command.cs +++ b/Horse Isle Server/HorseIsleServer/Game/Chat/Command.cs @@ -499,6 +499,35 @@ namespace HISP.Game.Chat } + public static bool AutoReply(string message, string[] args, User user) + { + string replyMessage = string.Join(" ", args); + string formattedmessage = Messages.FormatPlayerCommandCompleteMessage(message.Substring(1)); + replyMessage = replyMessage.Trim(); + + if (replyMessage.Length > 1024) + { + byte[] tooLong = PacketBuilder.CreateChat(Messages.AutoReplyTooLong, PacketBuilder.CHAT_BOTTOM_RIGHT); + user.LoggedinClient.SendPacket(tooLong); + + return false; + } + + Object violationReason = Chat.FilterMessage(replyMessage); + if (violationReason != null) + { + byte[] hasVios = PacketBuilder.CreateChat(Messages.AutoReplyHasViolations, PacketBuilder.CHAT_BOTTOM_RIGHT); + user.LoggedinClient.SendPacket(hasVios); + + return false; + } + + user.AutoReplyText = replyMessage; + + byte[] chatPacket = PacketBuilder.CreateChat(formattedmessage, PacketBuilder.CHAT_BOTTOM_LEFT); + user.LoggedinClient.SendPacket(chatPacket); + return true; + } public static bool Dance(string message, string[] args, User user) { string moves = string.Join(" ", args).ToLower(); diff --git a/Horse Isle Server/HorseIsleServer/Game/Messages.cs b/Horse Isle Server/HorseIsleServer/Game/Messages.cs index 733f766..ce51e6d 100755 --- a/Horse Isle Server/HorseIsleServer/Game/Messages.cs +++ b/Horse Isle Server/HorseIsleServer/Game/Messages.cs @@ -551,6 +551,10 @@ namespace HISP.Game public static string[] StatPlayerFormats; + public static string StatThirstDizzy; + public static string StatHungerStumble; + + // Misc Stats public static string StatMiscHeader; @@ -644,11 +648,18 @@ namespace HISP.Game public static string AdminChatFormatForSender; public static string ModChatFormatForSender; + public static string DmModBadge; + public static string DmAutoResponse; + public static string ChatViolationMessageFormat; public static string PasswordNotice; public static string CapsNotice; public static string RandomMovement; + // AutoReply + public static string AutoReplyTooLong; + public static string AutoReplyHasViolations; + // Transport public static string CantAffordTransport; @@ -2545,9 +2556,9 @@ namespace HISP.Game { return PrivateNotesMetaFormat.Replace("%PRIVATENOTES%", privateNotes); } - public static string FormatRandomMovementMessage(string statName) + public static string FormatRandomMovementMessage(string statName, string message) { - return RandomMovement.Replace("%STAT%", statName); + return RandomMovement.Replace("%STAT%", statName).Replace("%MSG%", message); } public static string FormatJewerlyEquipMessage(string itemName) @@ -2889,15 +2900,11 @@ namespace HISP.Game return HereChatFormat.Replace("%USERNAME%", username).Replace("%MESSAGE%", message); } - public static string FormatDirectMessage(string username, string message) + public static string FormatDirectMessage(string username, string message, string formatPart) { - return DirectChatFormat.Replace("%USERNAME%", username).Replace("%MESSAGE%", message); + return DirectChatFormat.Replace("%USERNAME%", username).Replace("%MESSAGE%", message).Replace("%FORMATPART%", formatPart); } - public static string FormatDirectMessageForMod(string username, string message) - { - return DirectChatFormatForModerators.Replace("%USERNAME%", username).Replace("%MESSAGE%", message); - } - + public static string FormatGlobalChatMessageForMod(string username, string message) { return GlobalChatFormatForModerators.Replace("%USERNAME%", username).Replace("%MESSAGE%", message); @@ -2951,9 +2958,9 @@ namespace HISP.Game { return ModChatFormatForSender.Replace("%USERNAME%", username).Replace("%MESSAGE%", message).Replace("%AMOUNT%", numbMods.ToString("N0", CultureInfo.InvariantCulture)); } - public static string FormatDirectChatMessageForSender(string username,string toUsername, string message) + public static string FormatDirectChatMessageForSender(string username,string toUsername, string message, string formatPart) { - return DirectChatFormatForSender.Replace("%FROMUSER%", username).Replace("%TOUSER%", toUsername).Replace("%MESSAGE%", message); + return DirectChatFormatForSender.Replace("%FROMUSER%", username).Replace("%TOUSER%", toUsername).Replace("%MESSAGE%", message).Replace("%FORMATPART%", formatPart); } public static string FormatIdleWarningMessage() { diff --git a/Horse Isle Server/HorseIsleServer/Player/User.cs b/Horse Isle Server/HorseIsleServer/Player/User.cs index 21ce9c4..25b1437 100755 --- a/Horse Isle Server/HorseIsleServer/Player/User.cs +++ b/Horse Isle Server/HorseIsleServer/Player/User.cs @@ -107,6 +107,7 @@ namespace HISP.Player public int CapturingHorseId; public DateTime LoginTime; public string LastSeenWeather; + public string AutoReplyText = ""; public int LastClickedRanchBuilding = 0; public bool ListingAuction = false; public int TotalGlobalChatMessages = 1; diff --git a/Horse Isle Server/HorseIsleServer/Server/GameDataJson.cs b/Horse Isle Server/HorseIsleServer/Server/GameDataJson.cs index 8e841c7..b66e52d 100755 --- a/Horse Isle Server/HorseIsleServer/Server/GameDataJson.cs +++ b/Horse Isle Server/HorseIsleServer/Server/GameDataJson.cs @@ -1461,9 +1461,11 @@ namespace HISP.Server Messages.StatTired = gameData.messages.meta.stats_page.tired_stat_name; Messages.StatsOtherHorses = gameData.messages.meta.stats_page.msg.other_horses; - Messages.StatPlayerFormats = gameData.messages.meta.stats_page.player_stats.ToObject(); + Messages.StatThirstDizzy = gameData.messages.movement_key.thirsty; + Messages.StatHungerStumble = gameData.messages.movement_key.hungery; + // Misc Stats Messages.StatMiscHeader = gameData.messages.meta.misc_stats.header; Messages.StatMiscNoneRecorded = gameData.messages.meta.misc_stats.no_stats_recorded; @@ -1828,7 +1830,7 @@ namespace HISP.Server Messages.RequiredChatViolations = gameData.messages.chat.violation_points_required; Messages.GlobalChatFormatForModerators = gameData.messages.chat.for_others.global_format_moderator; - Messages.DirectChatFormatForModerators = gameData.messages.chat.for_others.dm_format_moderator; + // Messages.DirectChatFormatForModerators = gameData.messages.chat.for_others.dm_format_moderator; Messages.YouWereSentToPrisionIsle = gameData.messages.starved_horse; @@ -1851,15 +1853,21 @@ namespace HISP.Server Messages.AdsChatFormatForSender = gameData.messages.chat.for_sender.ads_format; Messages.AdminChatFormatForSender = gameData.messages.chat.for_sender.admin_format; + Messages.DmModBadge = gameData.messages.chat.dm_moderator; + Messages.DmAutoResponse = gameData.messages.chat.dm_autoreply; + Messages.AdminCommandFormat = gameData.messages.commands.admin_command_completed; Messages.PlayerCommandFormat = gameData.messages.commands.player_command_completed; Messages.MuteHelp = gameData.messages.commands.mute_help; Messages.UnMuteHelp = gameData.messages.commands.unmute_help; - Messages.PasswordNotice = gameData.messages.chat.password_included; Messages.CapsNotice = gameData.messages.chat.caps_notice; + // AutoReply + Messages.AutoReplyTooLong = gameData.messages.auto_reply.too_long; + Messages.AutoReplyHasViolations = gameData.messages.auto_reply.contains_violations; + // Drawing Rooms Messages.DrawingLastToDrawFormat = gameData.messages.meta.drawing_rooms.last_draw; Messages.DrawingContentsSavedInSlotFormat = gameData.messages.meta.drawing_rooms.saved; diff --git a/Horse Isle Server/HorseIsleServer/Server/GameServer.cs b/Horse Isle Server/HorseIsleServer/Server/GameServer.cs index 10e2cec..08daadc 100755 --- a/Horse Isle Server/HorseIsleServer/Server/GameServer.cs +++ b/Horse Isle Server/HorseIsleServer/Server/GameServer.cs @@ -4820,12 +4820,12 @@ namespace HISP.Server movementDirection = newDirection; if (loggedInUser.Thirst <= 0) { - byte[] chatMessage = PacketBuilder.CreateChat(Messages.FormatRandomMovementMessage(Messages.StatThirst.ToUpper()), PacketBuilder.CHAT_BOTTOM_RIGHT); + byte[] chatMessage = PacketBuilder.CreateChat(Messages.FormatRandomMovementMessage(Messages.StatThirst.ToUpper(), Messages.StatThirstDizzy), PacketBuilder.CHAT_BOTTOM_RIGHT); sender.SendPacket(chatMessage); } else if (loggedInUser.Hunger <= 0) { - byte[] chatMessage = PacketBuilder.CreateChat(Messages.FormatRandomMovementMessage(Messages.StatHunger.ToUpper()), PacketBuilder.CHAT_BOTTOM_RIGHT); + byte[] chatMessage = PacketBuilder.CreateChat(Messages.FormatRandomMovementMessage(Messages.StatHunger.ToUpper(), Messages.StatHungerStumble), PacketBuilder.CHAT_BOTTOM_RIGHT); sender.SendPacket(chatMessage); } /* @@ -5853,19 +5853,38 @@ namespace HISP.Server // Finally send chat message. string formattedMessage = Chat.FormatChatForOthers(sender.LoggedinUser, channel, message); string formattedMessageSender = Chat.FormatChatForSender(sender.LoggedinUser, channel, message, nameTo); + + string formattedMessageAutoReply = ""; + string formattedMessageSenderAutoReply = ""; + + if (sender.LoggedinUser.AutoReplyText != "") + { + formattedMessageAutoReply = Chat.FormatChatForOthers(sender.LoggedinUser, channel, sender.LoggedinUser.AutoReplyText, true); + formattedMessageSenderAutoReply = Chat.FormatChatForSender(sender.LoggedinUser, channel, sender.LoggedinUser.AutoReplyText, nameTo, true); + } + byte[] chatPacketOthers = PacketBuilder.CreateChat(formattedMessage, chatSide); byte[] chatPacketSender = PacketBuilder.CreateChat(formattedMessageSender, chatSide); byte[] playDmSound = PacketBuilder.CreatePlaysoundPacket(Chat.PrivateMessageSound); + // Send to clients ... foreach (GameClient recipiant in recipiants) { recipiant.SendPacket(chatPacketOthers); + + if(formattedMessageAutoReply != "") + recipiant.SendPacket(PacketBuilder.CreateChat(formattedMessageAutoReply, chatSide)); + if (channel == Chat.ChatChannel.Dm) recipiant.SendPacket(playDmSound); } // Send to sender sender.SendPacket(chatPacketSender); + + if (formattedMessageSenderAutoReply != "") + sender.SendPacket(PacketBuilder.CreateChat(formattedMessageSenderAutoReply, chatSide)); + } public static void OnClickPacket(GameClient sender, byte[] packet) { @@ -5926,9 +5945,19 @@ namespace HISP.Server returnedMsg = Messages.FormatRanchClickMessage(Database.GetUsername(ranch.OwnerId), title); } } - if(GetUsersAt(x,y, false, true).Length > 0) // Player here? + User[] users = GetUsersAt(x, y, false, true); + if (users.Length > 0) // Player here? { - returnedMsg = Messages.FormatPlayerHereMessage(GetUsersAt(x, y, false, true)[0].Username); + string usernameStr = ""; + + for(int i = 0; i < users.Length; i++) + { + usernameStr += users[i].Username; + if (i + 1 < users.Length) + usernameStr += ", "; + } + + returnedMsg = Messages.FormatPlayerHereMessage(usernameStr); } byte[] tileInfoPacket = PacketBuilder.CreateClickTileInfoPacket(returnedMsg);