From ec7bed8e11b54822eeee432c3c23c496d757c48d Mon Sep 17 00:00:00 2001 From: RaidMax Date: Thu, 20 Aug 2015 14:23:13 -0500 Subject: [PATCH] Event based plugin support now added --- Admin/IW4M ADMIN.csproj | 4 +- Admin/Plugins.cs | 16 ++- Admin/Server.cs | 22 +-- Admin/lib/SharedLibary.dll | Bin 39424 -> 39424 bytes Admin/plugins/SamplePlugin.dll | Bin 5632 -> 5632 bytes IW4M Admin.sln | 1 + SamplePlugin/Main.cs | 11 ++ SamplePlugin/SamplePlugin.csproj | 3 + SharedLibary/Event.cs | 26 ++-- SharedLibary/Server.cs | 227 +++++++++++++++++++++++-------- 10 files changed, 236 insertions(+), 74 deletions(-) diff --git a/Admin/IW4M ADMIN.csproj b/Admin/IW4M ADMIN.csproj index d5c080270..635d8c628 100644 --- a/Admin/IW4M ADMIN.csproj +++ b/Admin/IW4M ADMIN.csproj @@ -143,7 +143,9 @@ PreserveNewest - + + PreserveNewest + Always diff --git a/Admin/Plugins.cs b/Admin/Plugins.cs index 3aaa07679..550ddfad8 100644 --- a/Admin/Plugins.cs +++ b/Admin/Plugins.cs @@ -9,6 +9,7 @@ namespace IW4MAdmin public class PluginImporter { public static List potentialPlugins = new List(); + public static List potentialNotifies = new List(); public static bool Load() { @@ -46,15 +47,24 @@ namespace IW4MAdmin Type[] types = Plugin.GetTypes(); foreach(Type assemblyType in types) { - if(assemblyType.IsClass && assemblyType.BaseType.Name == "Command") + if(assemblyType.IsClass && assemblyType.BaseType.Name == "EventNotify") + { + Object notifyObject = Activator.CreateInstance(assemblyType); + EventNotify newNotify = (EventNotify)notifyObject; + potentialNotifies.Add(newNotify); + Program.getManager().mainLog.Write("Loaded event plugin \"" + assemblyType.Name + "\"", Log.Level.All); + } + + else if (assemblyType.IsClass && assemblyType.BaseType.Name == "Command") { Object commandObject = Activator.CreateInstance(assemblyType); Command newCommand = (Command)commandObject; potentialPlugins.Add(newCommand); Program.getManager().mainLog.Write("Loaded command plugin \"" + newCommand.Name + "\"", Log.Level.All); - } + } + else - Program.getManager().mainLog.Write("Ignoring invalid command plugin \"" + assemblyType.Name + "\"", Log.Level.All); + Program.getManager().mainLog.Write("Ignoring invalid plugin \"" + assemblyType.Name + "\"", Log.Level.All); } } } diff --git a/Admin/Server.cs b/Admin/Server.cs index 9720b181e..8128dafa3 100644 --- a/Admin/Server.cs +++ b/Admin/Server.cs @@ -15,13 +15,9 @@ namespace IW4MAdmin public IW4MServer(string address, int port, string password, int H, int PID) : base(address, port, password, H, PID) { playerHistory = new Queue(); - commandQueue = new Queue(); + commandQueue = new Queue(); } - public override void initAbstractObj() - { - throw new NotImplementedException(); - } override public void getAliases(List returnPlayers, Player Origin) { if (Origin == null) @@ -126,6 +122,8 @@ namespace IW4MAdmin aliasDB.updatePlayer(NewPlayer.Alias); clientDB.updatePlayer(NewPlayer); + events.Enqueue(new Event(Event.GType.Connect, "", NewPlayer, null, this)); + if (NewPlayer.Level == Player.Permission.Banned) // their guid is already banned so no need to check aliases { @@ -240,6 +238,7 @@ namespace IW4MAdmin statDB.updatePlayer(Leaving); Log.Write("Client at " + cNum + " disconnecting...", Log.Level.Debug); + events.Enqueue(new Event(Event.GType.Disconnect, "", Leaving, null, this)); lock (players) { players[cNum] = null; @@ -410,10 +409,16 @@ namespace IW4MAdmin while(isRunning) { if (events.Count > 0) - processEvent(events.Dequeue()); + { + Event curEvent = events.Peek(); + processEvent(curEvent); + foreach (EventNotify E in PluginImporter.potentialNotifies) + E.onEvent(curEvent); + events.Dequeue(); + } if (commandQueue.Count > 0) lastCommandPointer = Utilities.executeCommand(PID, commandQueue.Dequeue(), lastCommandPointer); - Thread.Sleep(350); + Thread.Sleep(300); } } @@ -556,7 +561,7 @@ namespace IW4MAdmin } oldLines = lines; l_size = logFile.getSize(); - Thread.Sleep(350); + Thread.Sleep(300); } #if DEBUG == false catch (Exception E) @@ -701,6 +706,7 @@ namespace IW4MAdmin totalKills++; Log.Write(E.Origin.Name + " killed " + E.Target.Name + " with a " + E.Data, Log.Level.Debug); + events.Enqueue(new Event(Event.GType.Death, E.Data, E.Target, null, this)); } else // suicide/falling diff --git a/Admin/lib/SharedLibary.dll b/Admin/lib/SharedLibary.dll index cd6e22b451e807c328df17df93a6f5e2c4ff3041..cab58081a22779cd3e8ce9a8a3865896a3243f48 100644 GIT binary patch delta 13072 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 bTN)&*M9%K;Z~a!0_m*^+H+>?tm+1cs6E8u9 delta 13133 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 + + copy /Y "$(TargetDir)$(TargetName).dll" "$(SolutionDir)Admin\plugins\$(TargetName).dll" +