diff --git a/HorseIsleServer/LibHISP/Game/Chat/Chat.cs b/HorseIsleServer/LibHISP/Game/Chat/Chat.cs index f7d9473..59b81a1 100644 --- a/HorseIsleServer/LibHISP/Game/Chat/Chat.cs +++ b/HorseIsleServer/LibHISP/Game/Chat/Chat.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Globalization; using System.Linq; using HISP.Player; @@ -79,157 +80,31 @@ namespace HISP.Game.Chat return reasons.ToArray(); } } + public static bool ProcessCommand(User user, string message) { if (message.Length < 1) - return false; - - string[] args = message.Split(' ').Skip(1).ToArray(); - - if (user.Administrator || user.Moderator) - { - if (message[0] == '%') - { - if (message.ToUpper().StartsWith("%GIVE")) - return Command.Give(message, args, user); - if (message.ToUpper().StartsWith("%SWF")) - return Command.Swf(message, args, user); - if (message.ToUpper().StartsWith("%GOTO")) - return Command.Goto(message, args, user); - if (message.ToUpper().StartsWith("%JUMP")) - return Command.Jump(message, args, user); - if (message.ToUpper().StartsWith("%KICK")) - return Command.Kick(message, args, user); - if (message.ToUpper().StartsWith("%RULES")) - return Command.Rules(message, args, user); - if (message.ToUpper().StartsWith("%PRISON")) - return Command.Prison(message, args, user); - if (message.ToUpper().StartsWith("%NOCLIP")) - return Command.NoClip(message, args, user); - if (message.ToUpper().StartsWith("%STEALTH")) - return Command.Stealth(message, args, user); - if (message.ToUpper().StartsWith("%BAN")) - return Command.Ban(message, args, user); - if (message.ToUpper().StartsWith("%UNBAN")) - return Command.UnBan(message, args, user); - if (message.ToUpper().StartsWith("%ESCAPE")) - return Command.Escape(message, args, user); - if (message.ToUpper().StartsWith("%MODHORSE")) - return Command.ModHorse(message, args, user); - if (message.ToUpper().StartsWith("%DELITEM")) - return Command.DelItem(message, args, user); - if (message.ToUpper().StartsWith("%SHUTDOWN")) - return Command.Shutdown(message, args, user); - if (message.ToUpper().StartsWith("%CALL HORSE")) - return Command.CallHorse(message, args, user); - return false; - } - - } - if (message[0] == '!') - { - - // Alias for !MUTE - if (message.ToUpper().StartsWith("!MUTEALL")) - return Command.Mute(message, new string[] { "ALL" }, user); - else if (message.ToUpper().StartsWith("!MUTEADS")) - return Command.Mute(message, new string[] { "ADS" }, user); - else if (message.ToUpper().StartsWith("!MUTEGLOBAL")) - return Command.Mute(message, new string[] { "GLOBAL" }, user); - else if (message.ToUpper().StartsWith("!MUTEISLAND")) - return Command.Mute(message, new string[] { "ISLAND" }, user); - else if (message.ToUpper().StartsWith("!MUTENEAR")) - return Command.Mute(message, new string[] { "NEAR" }, user); - else if (message.ToUpper().StartsWith("!MUTEHERE")) - return Command.Mute(message, new string[] { "HERE" }, user); - else if (message.ToUpper().StartsWith("!MUTEBUDDY")) - return Command.Mute(message, new string[] { "BUDDY" }, user); - else if (message.ToUpper().StartsWith("!MUTEPM")) - return Command.Mute(message, new string[] { "PM" }, user); - else if (message.ToUpper().StartsWith("!MUTEBR")) - return Command.Mute(message, new string[] { "BR" }, user); - else if (message.ToUpper().StartsWith("!MUTESOCIALS")) - return Command.Mute(message, new string[] { "SOCIALS" }, user); - else if (message.ToUpper().StartsWith("!MUTELOGINS")) - return Command.Mute(message, new string[] { "LOGINS" }, user); - - - else if (message.ToUpper().StartsWith("!MUTE")) - return Command.Mute(message, args, user); - - // Alias for !UNMUTE - else if (message.ToUpper().StartsWith("!UNMUTEALL")) - return Command.UnMute(message, new string[] { "ALL" }, user); - else if (message.ToUpper().StartsWith("!UNMUTEADS")) - return Command.UnMute(message, new string[] { "ADS" }, user); - else if (message.ToUpper().StartsWith("!UNMUTEGLOBAL")) - return Command.UnMute(message, new string[] { "GLOBAL" }, user); - else if (message.ToUpper().StartsWith("!UNMUTEISLAND")) - return Command.UnMute(message, new string[] { "ISLAND" }, user); - else if (message.ToUpper().StartsWith("!UNMUTENEAR")) - return Command.UnMute(message, new string[] { "NEAR" }, user); - else if (message.ToUpper().StartsWith("!UNMUTEHERE")) - return Command.UnMute(message, new string[] { "HERE" }, user); - else if (message.ToUpper().StartsWith("!UNMUTEBUDDY")) - return Command.UnMute(message, new string[] { "BUDDY" }, user); - else if (message.ToUpper().StartsWith("!UNMUTEPM")) - return Command.UnMute(message, new string[] { "PM" }, user); - else if (message.ToUpper().StartsWith("!UNMUTEBR")) - return Command.UnMute(message, new string[] { "BR" }, user); - else if (message.ToUpper().StartsWith("!UNMUTESOCIALS")) - return Command.UnMute(message, new string[] { "SOCIALS" }, user); - else if (message.ToUpper().StartsWith("!UNMUTELOGINS")) - return Command.UnMute(message, new string[] { "LOGINS" }, user); - - else if (message.ToUpper().StartsWith("!UNMUTE")) - return Command.UnMute(message, args, user); - - // Alias for !HEAR - else if (message.ToUpper().StartsWith("!HEARALL")) - return Command.UnMute(message, new string[] { "ALL" }, user); - else if (message.ToUpper().StartsWith("!HEARADS")) - return Command.UnMute(message, new string[] { "ADS" }, user); - else if (message.ToUpper().StartsWith("!HEARGLOBAL")) - return Command.UnMute(message, new string[] { "GLOBAL" }, user); - else if (message.ToUpper().StartsWith("!HEARISLAND")) - return Command.UnMute(message, new string[] { "ISLAND" }, user); - else if (message.ToUpper().StartsWith("!HEARNEAR")) - return Command.UnMute(message, new string[] { "NEAR" }, user); - else if (message.ToUpper().StartsWith("!HEARHERE")) - return Command.UnMute(message, new string[] { "HERE" }, user); - else if (message.ToUpper().StartsWith("!HEARBUDDY")) - return Command.UnMute(message, new string[] { "BUDDY" }, user); - else if (message.ToUpper().StartsWith("!HEARPM")) - return Command.UnMute(message, new string[] { "PM" }, user); - else if (message.ToUpper().StartsWith("!HEARBR")) - return Command.UnMute(message, new string[] { "BR" }, user); - else if (message.ToUpper().StartsWith("!HEARSOCIALS")) - return Command.UnMute(message, new string[] { "SOCIALS" }, user); - else if (message.ToUpper().StartsWith("!HEARLOGINS")) - return Command.UnMute(message, new string[] { "LOGINS" }, user); - - 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); - - else if (message.ToUpper().StartsWith("!WARP")) // some stupid handling on this one. - { - string placeName = message.Substring("!WARP".Length); - placeName = placeName.Trim(); - - return Command.Warp(message, placeName.Split(' '), user); - } - - else if (message.ToUpper().StartsWith("!DANCE")) - return Command.Dance(message, args, user); - - else if (message.ToUpper().StartsWith("!VERSION")) - return Command.Version(message, args, user); + return false; + + string parsedMessage = message; + + parsedMessage = parsedMessage.Trim(); + char cLetter = parsedMessage[0]; + parsedMessage = parsedMessage.Substring(1).Trim(); + + string messageToGive = parsedMessage; + + + foreach (CommandRegister cmd in CommandRegister.RegisteredCommands) + { + if(cmd.CmdLetter == cLetter) + { + if (parsedMessage.ToUpper(CultureInfo.InvariantCulture).StartsWith(cmd.CmdName)) + { + string[] args = parsedMessage.Substring(cmd.CmdName.Length).Trim().Split(' '); + return cmd.CmdCallback(messageToGive, args, user); + } + } } return false; } diff --git a/HorseIsleServer/LibHISP/Game/Chat/Command.cs b/HorseIsleServer/LibHISP/Game/Chat/Command.cs index 2ab0e52..df20e55 100644 --- a/HorseIsleServer/LibHISP/Game/Chat/Command.cs +++ b/HorseIsleServer/LibHISP/Game/Chat/Command.cs @@ -1,19 +1,19 @@ using HISP.Player; using HISP.Server; using HISP.Game.Items; -using System; -using System.Collections.Generic; using HISP.Game.Events; using HISP.Game.Horse; -using System.Linq; using HISP.Game.Inventory; -using System.Threading; +using HISP.Modding; +using System.Linq; +using System; +using System.Collections.Generic; + namespace HISP.Game.Chat { public class Command { - private static User findNamePartial(string name) { foreach (GameClient client in GameClient.ConnectedClients) @@ -29,14 +29,59 @@ namespace HISP.Game.Chat } } throw new KeyNotFoundException("name not found"); + } + + public static void RegisterCommands() + { + // Admin Commands + new CommandRegister('%', "GIVE", Command.Give); + new CommandRegister('%', "SWF", Command.Swf); + new CommandRegister('%', "GOTO", Command.Goto); + new CommandRegister('%', "JUMP", Command.Jump); + new CommandRegister('%', "KICK", Command.Kick); + new CommandRegister('%', "NOCLIP", Command.NoClip); + new CommandRegister('%', "MODHORSE", Command.ModHorse); + new CommandRegister('%', "DELITEM", Command.DelItem); + new CommandRegister('%', "SHUTDOWN", Command.Shutdown); + new CommandRegister('%', "RELOAD", Command.Reload); + new CommandRegister('%', "CALL", Command.CallHorse); + + // Moderator commands + new CommandRegister('%', "RULES", Command.Rules); + new CommandRegister('%', "PRISON", Command.Prison); + new CommandRegister('%', "STEALTH", Command.Stealth); + new CommandRegister('%', "BAN", Command.Ban); + new CommandRegister('%', "UNBAN", Command.UnBan); + new CommandRegister('%', "ESCAPE", Command.Escape); + + // User commands + new CommandRegister('!', "MUTE", Command.Mute); + new CommandRegister('!', "UNMUTE", Command.UnMute); + new CommandRegister('!', "HEAR", Command.UnMute); + new CommandRegister('!', "AUTOREPLY", Command.AutoReply); + new CommandRegister('!', "QUIZ", Command.Quiz); + new CommandRegister('!', "WARP", Command.Warp); + new CommandRegister('!', "DANCE", Command.Dance); + new CommandRegister('!', "VERSION", Command.Version); + } + + public static bool Reload(string message, string[] args, User user) + { + if (!user.Administrator) + return false; + + ModLoader.ReloadModsFromFilesystem(); + + byte[] chatPacket = PacketBuilder.CreateChat(Messages.FormatAdminCommandCompleteMessage(message), PacketBuilder.CHAT_BOTTOM_LEFT); + user.LoggedinClient.SendPacket(chatPacket); + return true; } - public static bool Shutdown(string message, string[] args, User user) { if (!user.Administrator) return false; - byte[] chatPacket = PacketBuilder.CreateChat(Messages.FormatAdminCommandCompleteMessage(message.Substring(1)), PacketBuilder.CHAT_BOTTOM_LEFT); + byte[] chatPacket = PacketBuilder.CreateChat(Messages.FormatAdminCommandCompleteMessage(message), PacketBuilder.CHAT_BOTTOM_LEFT); user.LoggedinClient.SendPacket(chatPacket); GameServer.ShutdownServer(); @@ -190,7 +235,7 @@ namespace HISP.Game.Chat return false; } msg:; - byte[] chatPacket = PacketBuilder.CreateChat(Messages.FormatAdminCommandCompleteMessage(message.Substring(1)), PacketBuilder.CHAT_BOTTOM_LEFT); + byte[] chatPacket = PacketBuilder.CreateChat(Messages.FormatAdminCommandCompleteMessage(message), PacketBuilder.CHAT_BOTTOM_LEFT); user.LoggedinClient.SendPacket(chatPacket); return true; } @@ -227,7 +272,7 @@ namespace HISP.Game.Chat return false; } - byte[] chatPacket = PacketBuilder.CreateChat(Messages.FormatAdminCommandCompleteMessage(message.Substring(1)), PacketBuilder.CHAT_BOTTOM_LEFT); + byte[] chatPacket = PacketBuilder.CreateChat(Messages.FormatAdminCommandCompleteMessage(message), PacketBuilder.CHAT_BOTTOM_LEFT); user.LoggedinClient.SendPacket(chatPacket); return true; @@ -251,7 +296,7 @@ namespace HISP.Game.Chat return false; } - byte[] chatPacket = PacketBuilder.CreateChat(Messages.FormatAdminCommandCompleteMessage(message.Substring(1)), PacketBuilder.CHAT_BOTTOM_LEFT); + byte[] chatPacket = PacketBuilder.CreateChat(Messages.FormatAdminCommandCompleteMessage(message), PacketBuilder.CHAT_BOTTOM_LEFT); user.LoggedinClient.SendPacket(chatPacket); return true; @@ -264,7 +309,7 @@ namespace HISP.Game.Chat user.LoggedinClient.SendPacket(versionPacket); // Send Command complete message to client. - byte[] versionCommandCompletePacket = PacketBuilder.CreateChat(Messages.FormatPlayerCommandCompleteMessage(message.Substring(1)), PacketBuilder.CHAT_BOTTOM_LEFT); + byte[] versionCommandCompletePacket = PacketBuilder.CreateChat(Messages.FormatPlayerCommandCompleteMessage(message), PacketBuilder.CHAT_BOTTOM_LEFT); user.LoggedinClient.SendPacket(versionCommandCompletePacket); return true; } @@ -297,7 +342,7 @@ namespace HISP.Game.Chat } catch(KeyNotFoundException){}; - byte[] chatPacket = PacketBuilder.CreateChat(Messages.FormatAdminCommandCompleteMessage(message.Substring(1)), PacketBuilder.CHAT_BOTTOM_LEFT); + byte[] chatPacket = PacketBuilder.CreateChat(Messages.FormatAdminCommandCompleteMessage(message), PacketBuilder.CHAT_BOTTOM_LEFT); user.LoggedinClient.SendPacket(chatPacket); return true; @@ -309,7 +354,7 @@ namespace HISP.Game.Chat user.Teleport(Map.ModIsleX, Map.ModIsleY); - byte[] chatPacket = PacketBuilder.CreateChat(Messages.FormatAdminCommandCompleteMessage(message.Substring(1)) + Messages.ModIsleMessage, PacketBuilder.CHAT_BOTTOM_LEFT); + byte[] chatPacket = PacketBuilder.CreateChat(Messages.FormatAdminCommandCompleteMessage(message) + Messages.ModIsleMessage, PacketBuilder.CHAT_BOTTOM_LEFT); user.LoggedinClient.SendPacket(chatPacket); return true; } @@ -320,7 +365,7 @@ namespace HISP.Game.Chat return false; user.Stealth = !user.Stealth; - byte[] chatPacket = PacketBuilder.CreateChat(Messages.FormatAdminCommandCompleteMessage(message.Substring(1)), PacketBuilder.CHAT_BOTTOM_LEFT); + byte[] chatPacket = PacketBuilder.CreateChat(Messages.FormatAdminCommandCompleteMessage(message), PacketBuilder.CHAT_BOTTOM_LEFT); user.LoggedinClient.SendPacket(chatPacket); return true; } @@ -330,7 +375,7 @@ namespace HISP.Game.Chat return false; user.NoClip = !user.NoClip; - byte[] chatPacket = PacketBuilder.CreateChat(Messages.FormatAdminCommandCompleteMessage(message.Substring(1)), PacketBuilder.CHAT_BOTTOM_LEFT); + byte[] chatPacket = PacketBuilder.CreateChat(Messages.FormatAdminCommandCompleteMessage(message), PacketBuilder.CHAT_BOTTOM_LEFT); user.LoggedinClient.SendPacket(chatPacket); return true; } @@ -356,7 +401,7 @@ namespace HISP.Game.Chat return false; } - byte[] chatPacket = PacketBuilder.CreateChat(Messages.FormatAdminCommandCompleteMessage(message.Substring(1))+Messages.FormatRulesCommandMessage(args[0]), PacketBuilder.CHAT_BOTTOM_LEFT); + byte[] chatPacket = PacketBuilder.CreateChat(Messages.FormatAdminCommandCompleteMessage(message)+Messages.FormatRulesCommandMessage(args[0]), PacketBuilder.CHAT_BOTTOM_LEFT); user.LoggedinClient.SendPacket(chatPacket); return true; } @@ -382,7 +427,7 @@ namespace HISP.Game.Chat return false; } - byte[] chatPacket = PacketBuilder.CreateChat(Messages.FormatAdminCommandCompleteMessage(message.Substring(1)) + Messages.FormatPrisonCommandMessage(args[0]), PacketBuilder.CHAT_BOTTOM_LEFT); + byte[] chatPacket = PacketBuilder.CreateChat(Messages.FormatAdminCommandCompleteMessage(message) + Messages.FormatPrisonCommandMessage(args[0]), PacketBuilder.CHAT_BOTTOM_LEFT); user.LoggedinClient.SendPacket(chatPacket); return true; @@ -414,7 +459,7 @@ namespace HISP.Game.Chat return false; } - byte[] chatPacket = PacketBuilder.CreateChat(Messages.FormatAdminCommandCompleteMessage(message.Substring(1)), PacketBuilder.CHAT_BOTTOM_LEFT); + byte[] chatPacket = PacketBuilder.CreateChat(Messages.FormatAdminCommandCompleteMessage(message), PacketBuilder.CHAT_BOTTOM_LEFT); user.LoggedinClient.SendPacket(chatPacket); return true; } @@ -442,7 +487,7 @@ namespace HISP.Game.Chat return false; } - byte[] chatPacket = PacketBuilder.CreateChat(Messages.FormatAdminCommandCompleteMessage(message.Substring(1)), PacketBuilder.CHAT_BOTTOM_LEFT); + byte[] chatPacket = PacketBuilder.CreateChat(Messages.FormatAdminCommandCompleteMessage(message), PacketBuilder.CHAT_BOTTOM_LEFT); user.LoggedinClient.SendPacket(chatPacket); return true; } @@ -477,7 +522,7 @@ namespace HISP.Game.Chat return false; } - byte[] chatPacket = PacketBuilder.CreateChat(Messages.FormatAdminCommandCompleteMessage(message.Substring(1)), PacketBuilder.CHAT_BOTTOM_LEFT); + byte[] chatPacket = PacketBuilder.CreateChat(Messages.FormatAdminCommandCompleteMessage(message), PacketBuilder.CHAT_BOTTOM_LEFT); user.LoggedinClient.SendPacket(chatPacket); return true; @@ -575,7 +620,7 @@ namespace HISP.Game.Chat - byte[] chatPacket = PacketBuilder.CreateChat(Messages.FormatAdminCommandCompleteMessage(message.Substring(1)), PacketBuilder.CHAT_BOTTOM_LEFT); + byte[] chatPacket = PacketBuilder.CreateChat(Messages.FormatAdminCommandCompleteMessage(message), PacketBuilder.CHAT_BOTTOM_LEFT); user.LoggedinClient.SendPacket(chatPacket); return true; @@ -655,7 +700,7 @@ namespace HISP.Game.Chat } - byte[] chatPacket = PacketBuilder.CreateChat(Messages.FormatAdminCommandCompleteMessage(message.Substring(1)), PacketBuilder.CHAT_BOTTOM_LEFT); + byte[] chatPacket = PacketBuilder.CreateChat(Messages.FormatAdminCommandCompleteMessage(message), PacketBuilder.CHAT_BOTTOM_LEFT); user.LoggedinClient.SendPacket(chatPacket); return true; } @@ -663,7 +708,7 @@ namespace HISP.Game.Chat public static bool Warp(string message, string[] args, User user) { - string formattedmessage = Messages.FormatPlayerCommandCompleteMessage(message.Substring(1)); + string formattedmessage = Messages.FormatPlayerCommandCompleteMessage(message); if (user.CurrentlyRidingHorse == null) goto onlyRiddenUnicorn; @@ -730,7 +775,11 @@ namespace HISP.Game.Chat if (!user.Administrator) return false; - string formattedmessage = Messages.FormatPlayerCommandCompleteMessage(message.Substring(1)); + if (args.Length >= 1) + if (args[1].ToUpper() != "HORSE") + return false; + + string formattedmessage = Messages.FormatPlayerCommandCompleteMessage(message); WildHorse horse = WildHorse.WildHorses[GameServer.RandomNumberGenerator.Next(0, WildHorse.WildHorses.Length)]; horse.X = user.X; @@ -747,7 +796,7 @@ 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)); + string formattedmessage = Messages.FormatPlayerCommandCompleteMessage(message); replyMessage = replyMessage.Trim(); if (replyMessage.Length > 1024) @@ -776,7 +825,7 @@ namespace HISP.Game.Chat public static bool Dance(string message, string[] args, User user) { string moves = string.Join(" ", args).ToLower(); - string formattedmessage = Messages.FormatPlayerCommandCompleteMessage(message.Substring(1)); + string formattedmessage = Messages.FormatPlayerCommandCompleteMessage(message); if (user.ActiveDance != null) user.ActiveDance.Dispose(); @@ -800,7 +849,7 @@ namespace HISP.Game.Chat } if (quizActive) { - string formattedmessage = Messages.FormatPlayerCommandCompleteMessage(message.Substring(1)); + string formattedmessage = Messages.FormatPlayerCommandCompleteMessage(message); RealTimeQuiz.Participent participent = GameServer.QuizEvent.JoinEvent(user); @@ -832,7 +881,7 @@ namespace HISP.Game.Chat public static bool Mute(string message, string[] args, User user) { - string formattedmessage = Messages.FormatPlayerCommandCompleteMessage(message.Substring(1)); + string formattedmessage = Messages.FormatPlayerCommandCompleteMessage(message); if (args.Length <= 0) { @@ -906,7 +955,7 @@ namespace HISP.Game.Chat public static bool UnMute(string message, string[] args, User user) { - string formattedmessage = Messages.FormatPlayerCommandCompleteMessage(message.Substring(1)); + string formattedmessage = Messages.FormatPlayerCommandCompleteMessage(message); if (args.Length <= 0) { diff --git a/HorseIsleServer/LibHISP/Game/Chat/CommandRegister.cs b/HorseIsleServer/LibHISP/Game/Chat/CommandRegister.cs new file mode 100644 index 0000000..bc5dabe --- /dev/null +++ b/HorseIsleServer/LibHISP/Game/Chat/CommandRegister.cs @@ -0,0 +1,31 @@ +using HISP.Player; +using System; +using System.Collections.Generic; +using System.Globalization; + +namespace HISP.Game.Chat +{ + public class CommandRegister + { + private static List registeredComamnds = new List(); + public static CommandRegister[] RegisteredCommands + { + get + { + return registeredComamnds.ToArray(); + } + } + + public char CmdLetter; + public string CmdName; + public Func CmdCallback; + public CommandRegister(char cmdLetter, string cmdName, Func cmdCallback) + { + CmdLetter = cmdLetter; + CmdName = cmdName.ToUpper(CultureInfo.InvariantCulture); + CmdCallback = cmdCallback; + + registeredComamnds.Add(this); + } + } +} diff --git a/HorseIsleServer/LibHISP/Game/Quest.cs b/HorseIsleServer/LibHISP/Game/Quest.cs index d1e29c4..cbcee7d 100644 --- a/HorseIsleServer/LibHISP/Game/Quest.cs +++ b/HorseIsleServer/LibHISP/Game/Quest.cs @@ -15,7 +15,7 @@ namespace HISP.Game public const string Binoculars = "BINOCS"; public const string Rake = "RAKE"; public const string MagnifyingGlass = "MAGNIFY"; - + public const int CloudIslesQuest = 1373; public struct QuestItemInfo { public int ItemId; @@ -262,7 +262,7 @@ namespace HISP.Game user.Awards.AddAward(Award.GetAwardById(4)); // 100% Quest Completion Award. // Is cloud isles quest? - if (quest.Id == 1373) + if (quest.Id == CloudIslesQuest) { byte[] swfLoadPacket = PacketBuilder.CreateSwfModulePacket("ballooncutscene", PacketBuilder.PACKET_SWF_CUTSCENE); user.LoggedinClient.SendPacket(swfLoadPacket); diff --git a/HorseIsleServer/LibHISP/Modding/IMod.cs b/HorseIsleServer/LibHISP/Modding/IMod.cs new file mode 100644 index 0000000..cd926ec --- /dev/null +++ b/HorseIsleServer/LibHISP/Modding/IMod.cs @@ -0,0 +1,20 @@ +namespace HISP.Modding +{ + public interface IMod + { + public void OnModLoad(); + public void OnModUnload(); + public string ModName + { + get; + } + public string ModVersion + { + get; + } + public string ModId + { + get; + } + } +} diff --git a/HorseIsleServer/LibHISP/Modding/ModLoader.cs b/HorseIsleServer/LibHISP/Modding/ModLoader.cs new file mode 100644 index 0000000..8b53ba9 --- /dev/null +++ b/HorseIsleServer/LibHISP/Modding/ModLoader.cs @@ -0,0 +1,77 @@ +using HISP.Server; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Reflection; + +namespace HISP.Modding +{ + public class ModLoader + { + private static List modList = new List(); + public static IMod[] ModList + { + get + { + return modList.ToArray(); + } + } + public static void LoadMod(IMod mod) + { + mod.OnModLoad(); // Call OnModLoad(); + modList.Add(mod); // add to the list of mods + Logger.InfoPrint("Loaded mod: "+mod.ModName + " v" + mod.ModVersion + " SUCCESS."); + } + public static void UnloadMod(IMod mod) + { + mod.OnModUnload(); + modList.Remove(mod); + Logger.InfoPrint("Unloading mod: " + mod.ModName); + } + public static void UnloadAllMods() + { + foreach (IMod loadedMod in ModList) + { + UnloadMod(loadedMod); + } + } + public static void LoadModFromFilesystem(string dllfile) + { + try + { + Assembly assembly = Assembly.LoadFile(dllfile); + Type[] types = assembly.GetTypes(); + // Search for classes that implement IMod + foreach (Type type in types) + { + if (type.GetInterfaces().Contains(typeof(IMod))) + { + IMod mod = (IMod)Activator.CreateInstance(type); // Crate an instance of the class + LoadMod(mod); // Load it into memory + } + } + } + catch (Exception e) + { + Logger.ErrorPrint("Failed to load mod: " + dllfile + " - [EXCEPTION]" + e.Message + " " + e.InnerException + "\n" + e.StackTrace); + } + } + public static void OnShutdown() + { + UnloadAllMods(); + } + public static void ReloadModsFromFilesystem() + { + UnloadAllMods(); + if (Directory.Exists(ConfigReader.ModsFolder)) + { + string[] filelist = Directory.GetFiles(ConfigReader.ModsFolder, "*.dll", SearchOption.TopDirectoryOnly); + foreach (string file in filelist) + { + LoadModFromFilesystem(file); + } + } + } + } +} diff --git a/HorseIsleServer/LibHISP/Resources/server.properties b/HorseIsleServer/LibHISP/Resources/server.properties index 280ea5e..978e08f 100644 --- a/HorseIsleServer/LibHISP/Resources/server.properties +++ b/HorseIsleServer/LibHISP/Resources/server.properties @@ -7,6 +7,7 @@ # However it is NOT COPYRIGHTED! This software is in the Public Domain! # # Ip address the server will bind to (default: 0.0.0.0 ALL INTERFACES) + ip=0.0.0.0 # Port the server will bind to defaults: (on beta.horseisle.com: 12321, on pinto.horseisle.com: 443) @@ -35,6 +36,11 @@ map=HI1.MAP # NOTE: This can be a folder or a file. gamedata=gamedata +# Folder containing mod .dll's +# Mods can extend the server +# and add custom features. +mods_folder=mods + # ======================= # Security # ======================= diff --git a/HorseIsleServer/LibHISP/Server/ConfigReader.cs b/HorseIsleServer/LibHISP/Server/ConfigReader.cs index 0c22bcb..a93b3d1 100644 --- a/HorseIsleServer/LibHISP/Server/ConfigReader.cs +++ b/HorseIsleServer/LibHISP/Server/ConfigReader.cs @@ -21,6 +21,7 @@ namespace HISP.Server public static string GameData = "gamedata.json"; public static string CrossDomainPolicyFile = "CrossDomainPolicy.xml"; + public static string ModsFolder = "mods"; public static int LogLevel = 4; public static bool SqlLite = false; @@ -117,6 +118,9 @@ namespace HISP.Server break; case "enable_word_filter": BadWords = data == "true"; + break; + case "mods_folder": + ModsFolder = data; break; case "intrest_rate": IntrestRate = int.Parse(data); diff --git a/HorseIsleServer/LibHISP/Server/Entry.cs b/HorseIsleServer/LibHISP/Server/Entry.cs index 89bc993..97bc997 100644 --- a/HorseIsleServer/LibHISP/Server/Entry.cs +++ b/HorseIsleServer/LibHISP/Server/Entry.cs @@ -3,6 +3,7 @@ using HISP.Game.Horse; using HISP.Game.Items; using HISP.Game.Services; using HISP.Game.SwfModules; +using HISP.Game.Chat; using HISP.Security; using System; using System.Diagnostics; @@ -13,7 +14,6 @@ namespace HISP.Server { // "Entry Point" - private static void defaultOnShutdownCallback() { Process.GetCurrentProcess().Close(); @@ -52,6 +52,7 @@ namespace HISP.Server Auction.LoadAllAuctionRooms(); Item.DoSpecialCases(); + Command.RegisterCommands(); GameServer.StartServer(); } diff --git a/HorseIsleServer/LibHISP/Server/GameServer.cs b/HorseIsleServer/LibHISP/Server/GameServer.cs index a4a5e11..614a61d 100644 --- a/HorseIsleServer/LibHISP/Server/GameServer.cs +++ b/HorseIsleServer/LibHISP/Server/GameServer.cs @@ -18,7 +18,8 @@ using HISP.Game.SwfModules; using HISP.Game.Horse; using HISP.Game.Events; using HISP.Game.Items; - +using HISP.Modding; + namespace HISP.Server { public class GameServer @@ -8249,12 +8250,16 @@ namespace HISP.Server } public static void OnShutdown() { - ServerSocket.Dispose(); - gameTimer.Dispose(); - minuteTimer.Dispose(); + if(ServerSocket != null) + ServerSocket.Dispose(); + if (gameTimer != null) + gameTimer.Dispose(); + if (minuteTimer != null) + minuteTimer.Dispose(); } public static void ShutdownServer() - { + { + ModLoader.OnShutdown(); GameClient.OnShutdown(); GameServer.OnShutdown(); Database.OnShutdown(); @@ -8271,6 +8276,9 @@ namespace HISP.Server gameTimer = new Timer(new TimerCallback(onGameTick), null, gameTickSpeed, gameTickSpeed); minuteTimer = new Timer(new TimerCallback(onMinuteTick), null, oneMinute, oneMinute); Logger.InfoPrint("Binding to ip: " + ConfigReader.BindIP + " On port: " + ConfigReader.Port.ToString()); + + // Load all/any mods + ModLoader.ReloadModsFromFilesystem(); SocketAsyncEventArgs e = new SocketAsyncEventArgs(); e.Completed += GameClient.CreateClient; diff --git a/HorseIsleServer/LibHISP/Server/Util.cs b/HorseIsleServer/LibHISP/Server/Util.cs index db8bb22..d9407b2 100644 --- a/HorseIsleServer/LibHISP/Server/Util.cs +++ b/HorseIsleServer/LibHISP/Server/Util.cs @@ -27,8 +27,6 @@ namespace HISP.Server return arr; } - - public static double PointsToDistance(int x1, int y1, int x2, int y2) { return Math.Sqrt(Math.Pow((x2 - x1), 2) + Math.Pow((y2 - y1), 2)); diff --git a/HorseIsleServer/N00BS/LoadingForm.Designer.cs b/HorseIsleServer/N00BS/LoadingForm.Designer.cs index 8f60a0f..376416b 100644 --- a/HorseIsleServer/N00BS/LoadingForm.Designer.cs +++ b/HorseIsleServer/N00BS/LoadingForm.Designer.cs @@ -55,10 +55,10 @@ // // StartProgress // - this.StartProgress.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + this.StartProgress.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.StartProgress.Location = new System.Drawing.Point(79, 40); - this.StartProgress.Maximum = 18; + this.StartProgress.Maximum = 19; this.StartProgress.Name = "StartProgress"; this.StartProgress.Size = new System.Drawing.Size(618, 23); this.StartProgress.Step = 1; diff --git a/HorseIsleServer/N00BS/LoadingForm.resx b/HorseIsleServer/N00BS/LoadingForm.resx index b9a23d8..fdf5538 100644 --- a/HorseIsleServer/N00BS/LoadingForm.resx +++ b/HorseIsleServer/N00BS/LoadingForm.resx @@ -1,154 +1,154 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - - R0lGODlhOgBEAIYAAAAAAP///0kBPZyEmPsA7tEAxs8AxMoAv8gAv8EAuaEAmp8AmIoAhDIALzAALiUF - I7cAtKAAmp4AmJ4AmpcAlJUAkpEAjZAAjYUAgIQAgHkAd1gAVVcAVFUAUlMAUE8ATUkARz0APDUAMzEA - MC4ALf8n96gAposAioMAgWsAa0QAQzUANZkAnZUAmI4AkXMAdWEAZF8AYS8AMIgAjn4Ag3sAf1sAXlcA - WzcAOWhAeE0wWKaJsZF4m35Lk6mpqXZ2dkBAQP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEBAAAh+QQB - AABBACwAAAAAOgBEAAAI/wCDCBxIsKDBgwgLbkjIsKHDhwIXQpxIkWGJEhskVtxY8WJGjiAnFijwoCAQ - ICFTEtww8oHLlydVytygoKbNlzJTPsho86bLnCF30lQwcmTNj0ApAnHJk2jRoxqTPnzZtGiBpkilNqQ6 - 1CrWqFoRCu1Zs+UDowqyhiW4dCxZs2jVrhXItWwBuyMJEIgLNmxdp3gL6OU7d+BftD3z7r2btm/Otky7 - Mk4seDHUtYcrQ6U8+KpjmZn1brapeKRcoKEJQM1YtejpnKlXsw78GnRTu6Ibrxx6WWrb205zqwVeO2hk - zqp1K2SN+Thpzcp3F+eYo3oO51aFfw5r/brb7MmnQ//sbrD7jh3VgYPvnZJ8QfPoc6gvqr19jvPnu1fH - v4MHj+o66ECZVexRdx9++h14nn8ACvgcgdFVtF9//vHAX4UVdhcgYk4RZuCCFV6I4X/WbThZh4yJx5AO - I7aYoX4mogWhigmx6GKLCcbI2IzbObRBgAkGWWKAOnRmlYcVCQWkkEESWeRiR6bYY0JuOWnllU8G2Blu - 4U1p0G9DYSlmlk/KCB2NbGFXwJIa6qCYXtVBqFiBD4FpF5tDvklAnE8F12VFdtqkV4A9FNrDD4gmahWf - NW0ZYZ3ONUoAoYYmqmhRjCrgKJqGRRZBBAssYIABSyLqpA8+LJrDp6GO+mlGAij/9ZJQrIpKqg7VmUok - qqrW6moEsMr6kgACcMDBBBMgoCwCAaLqrA811RpgBx0ccACyEkhgbKwTQfYAscYiuyyzOjyLarSgLjBt - tddOkO22xELkLbEeeFBBBRZYcMEF+X7wQQYZBMjAwAxggEGA/iaQAAUU1Evsw/KWJBC99uKrL78W+Auw - wAQbjPAHCjPs8MMQbyVxEMT6e8IJKLTsMgggELtuvf4SCzMEEKxcM8nxInQSThMLoDLLLrcMs8w6UEvz - BzaDgLPOHwxEckI//xQ0sSqo8MILLLCggQZZ92xQ1iaY8LUKBk3tM2RSP5z11l2frYLYBZFtNtgI0W0S - 21cLwxBCCC64MMMMKaQQgkMhtNBC4YcfpDdbSxWkduCDM4644oUn9PhAP0techAj0EBDDDHg4BAOMMCw - AkObC9Q5QWqDLjrpD6Guet7cUh1532LLUEMNI0C0gg02yIB7QzG1HbvvwAtPvOO5O5R87AKRcMMNwTtE - OgnHy4sSyp9Xf332DOGw/WPfUx+EA9c3cDrx3Ms0ffjrt/++DfEnpf4IAwwgwun9yx9Q1BeE/v3PIQEs - zEFEYLqHjMABCjQIAyHyQJUEBAA7 - - - - - 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 - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + R0lGODlhOgBEAIYAAAAAAP///0kBPZyEmPsA7tEAxs8AxMoAv8gAv8EAuaEAmp8AmIoAhDIALzAALiUF + I7cAtKAAmp4AmJ4AmpcAlJUAkpEAjZAAjYUAgIQAgHkAd1gAVVcAVFUAUlMAUE8ATUkARz0APDUAMzEA + MC4ALf8n96gAposAioMAgWsAa0QAQzUANZkAnZUAmI4AkXMAdWEAZF8AYS8AMIgAjn4Ag3sAf1sAXlcA + WzcAOWhAeE0wWKaJsZF4m35Lk6mpqXZ2dkBAQP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEBAAAh+QQB + AABBACwAAAAAOgBEAAAI/wCDCBxIsKDBgwgLbkjIsKHDhwIXQpxIkWGJEhskVtxY8WJGjiAnFijwoCAQ + ICFTEtww8oHLlydVytygoKbNlzJTPsho86bLnCF30lQwcmTNj0ApAnHJk2jRoxqTPnzZtGiBpkilNqQ6 + 1CrWqFoRCu1Zs+UDowqyhiW4dCxZs2jVrhXItWwBuyMJEIgLNmxdp3gL6OU7d+BftD3z7r2btm/Otky7 + Mk4seDHUtYcrQ6U8+KpjmZn1brapeKRcoKEJQM1YtejpnKlXsw78GnRTu6Ibrxx6WWrb205zqwVeO2hk + zqp1K2SN+Thpzcp3F+eYo3oO51aFfw5r/brb7MmnQ//sbrD7jh3VgYPvnZJ8QfPoc6gvqr19jvPnu1fH + v4MHj+o66ECZVexRdx9++h14nn8ACvgcgdFVtF9//vHAX4UVdhcgYk4RZuCCFV6I4X/WbThZh4yJx5AO + I7aYoX4mogWhigmx6GKLCcbI2IzbObRBgAkGWWKAOnRmlYcVCQWkkEESWeRiR6bYY0JuOWnllU8G2Blu + 4U1p0G9DYSlmlk/KCB2NbGFXwJIa6qCYXtVBqFiBD4FpF5tDvklAnE8F12VFdtqkV4A9FNrDD4gmahWf + NW0ZYZ3ONUoAoYYmqmhRjCrgKJqGRRZBBAssYIABSyLqpA8+LJrDp6GO+mlGAij/9ZJQrIpKqg7VmUok + qqrW6moEsMr6kgACcMDBBBMgoCwCAaLqrA811RpgBx0ccACyEkhgbKwTQfYAscYiuyyzOjyLarSgLjBt + tddOkO22xELkLbEeeFBBBRZYcMEF+X7wQQYZBMjAwAxggEGA/iaQAAUU1Evsw/KWJBC99uKrL78W+Auw + wAQbjPAHCjPs8MMQbyVxEMT6e8IJKLTsMgggELtuvf4SCzMEEKxcM8nxInQSThMLoDLLLrcMs8w6UEvz + BzaDgLPOHwxEckI//xQ0sSqo8MILLLCggQZZ92xQ1iaY8LUKBk3tM2RSP5z11l2frYLYBZFtNtgI0W0S + 21cLwxBCCC64MMMMKaQQgkMhtNBC4YcfpDdbSxWkduCDM4644oUn9PhAP0techAj0EBDDDHg4BAOMMCw + AkObC9Q5QWqDLjrpD6Guet7cUh1532LLUEMNI0C0gg02yIB7QzG1HbvvwAtPvOO5O5R87AKRcMMNwTtE + OgnHy4sSyp9Xf332DOGw/WPfUx+EA9c3cDrx3Ms0ffjrt/++DfEnpf4IAwwgwun9yx9Q1BeE/v3PIQEs + zEFEYLqHjMABCjQIAyHyQJUEBAA7 + + + + + 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 + + \ No newline at end of file diff --git a/HorseIsleServer/N00BS/Program.cs b/HorseIsleServer/N00BS/Program.cs index 5725e65..4bc6096 100644 --- a/HorseIsleServer/N00BS/Program.cs +++ b/HorseIsleServer/N00BS/Program.cs @@ -2,6 +2,7 @@ // Idea is to just be open and play. using HISP.Game; +using HISP.Game.Chat; using HISP.Game.Horse; using HISP.Game.Items; using HISP.Game.Services; @@ -161,6 +162,9 @@ namespace HISP.Noobs Auction.LoadAllAuctionRooms(); IncrementProgress(); + Command.RegisterCommands(); + IncrementProgress(); + Item.DoSpecialCases(); IncrementProgress(); try