From 55c0f299141570988c6774d171d822b63cecc6f4 Mon Sep 17 00:00:00 2001
From: Li
Date: Sat, 7 May 2022 12:58:22 +1200
Subject: [PATCH] Make commands more accurate
---
HorseIsleServer/LibHISP/Game/Chat/Chat.cs | 171 ++--------
HorseIsleServer/LibHISP/Game/Chat/Command.cs | 107 ++++--
.../LibHISP/Game/Chat/CommandRegister.cs | 31 ++
HorseIsleServer/LibHISP/Game/Quest.cs | 4 +-
HorseIsleServer/LibHISP/Modding/IMod.cs | 20 ++
HorseIsleServer/LibHISP/Modding/ModLoader.cs | 77 +++++
.../LibHISP/Resources/server.properties | 6 +
.../LibHISP/Server/ConfigReader.cs | 4 +
HorseIsleServer/LibHISP/Server/Entry.cs | 3 +-
HorseIsleServer/LibHISP/Server/GameServer.cs | 18 +-
HorseIsleServer/LibHISP/Server/Util.cs | 2 -
HorseIsleServer/N00BS/LoadingForm.Designer.cs | 4 +-
HorseIsleServer/N00BS/LoadingForm.resx | 306 +++++++++---------
HorseIsleServer/N00BS/Program.cs | 4 +
14 files changed, 415 insertions(+), 342 deletions(-)
create mode 100644 HorseIsleServer/LibHISP/Game/Chat/CommandRegister.cs
create mode 100644 HorseIsleServer/LibHISP/Modding/IMod.cs
create mode 100644 HorseIsleServer/LibHISP/Modding/ModLoader.cs
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