From f4016f6691cdcafba66175147029af7001e7c8a5 Mon Sep 17 00:00:00 2001 From: RaidMax Date: Thu, 20 Aug 2015 16:54:38 -0500 Subject: [PATCH] moved stats to a plugin! --- Admin/Command.cs | 59 ----------- Admin/IW4M ADMIN.csproj | 6 +- Admin/Main.cs | 10 +- Admin/Manager.cs | 3 +- Admin/Plugins.cs | 11 +- Admin/Server.cs | 78 ++++++-------- Admin/Utilities.cs | 15 +-- Admin/WebFront.cs | 18 +--- Admin/lib/AdminInterface.dll | Bin 6656 -> 6656 bytes Admin/lib/SharedLibary.dll | Bin 39424 -> 35840 bytes Admin/plugins/SamplePlugin.dll | Bin 5632 -> 7680 bytes Release Build/lib/AdminInterface.dll | Bin 0 -> 6656 bytes Release Build/lib/SharedLibary.dll | Bin 0 -> 35840 bytes SamplePlugin/Main.cs | 145 ++++++++++++++++++++++++++- SharedLibary/Database.cs | 6 +- SharedLibary/Event.cs | 1 + SharedLibary/Player.cs | 32 ------ SharedLibary/Server.cs | 32 +----- 18 files changed, 212 insertions(+), 204 deletions(-) create mode 100644 Release Build/lib/AdminInterface.dll create mode 100644 Release Build/lib/SharedLibary.dll diff --git a/Admin/Command.cs b/Admin/Command.cs index 292f03bc0..dddf40baf 100644 --- a/Admin/Command.cs +++ b/Admin/Command.cs @@ -424,65 +424,6 @@ namespace IW4MAdmin } } - class _Stats : Command - { - public _Stats(String N, String D, String U, Player.Permission P, int args, bool nT) : base(N, D, U, P, args, nT) { } - - public override void Execute(Event E) - { - if (E.Target == null) - { - if (E.Target.stats == null) - E.Origin.Tell("You do not have any stats!"); - else - E.Origin.Tell(String.Format("^5{0} ^7KILLS | ^5{1} ^7DEATHS | ^5{2} ^7KDR | ^5{3} ^7SKILL", E.Origin.stats.Kills, E.Origin.stats.Deaths, E.Origin.stats.KDR, E.Origin.stats.Skill)); - } - - else - { - E.Target.stats = E.Owner.statDB.getStats(E.Target.databaseID); - if (E.Target.stats == null) - E.Origin.Tell("That person does not have any stats at this time!"); - else - E.Origin.Tell(String.Format("[^3{4}^7] ^5{0} ^7KILLS | ^5{1} ^7DEATHS | ^5{2} ^7KDR | ^5{3} ^7SKILL", E.Target.stats.Kills, E.Target.stats.Deaths, E.Target.stats.KDR, E.Target.stats.Skill, E.Target.Name)); - } - } - } - - class TopStats : Command - { - public TopStats(String N, String D, String U, Player.Permission P, int args, bool nT) : base(N, D, U, P, args, nT) { } - - public override void Execute(Event E) - { - List Top = E.Owner.statDB.topStats(); - List TopP = new List(); - - foreach (Stats S in Top) - { - Player P = E.Owner.clientDB.getPlayer(S.statIndex); - if (P != null && P.Level != Player.Permission.Banned) - { - P.stats = S; - TopP.Add(P); - } - } - - if (TopP.Count > 0) - { - E.Origin.Tell("^1TOP PLAYERS"); - foreach (Player P in TopP) - { - if (P != null) - E.Origin.Tell(String.Format("^3{0}^7 - ^5{1} ^7KDR | ^5{2} ^7SKILL", P.Name, P.stats.KDR, P.stats.Skill)); - } - } - - else - E.Origin.Tell("There are no top players yet!"); - } - } - class Reload : Command { public Reload(String N, String D, String U, Player.Permission P, int args, bool nT) : base(N, D, U, P, args, nT) { } diff --git a/Admin/IW4M ADMIN.csproj b/Admin/IW4M ADMIN.csproj index 635d8c628..49eed84f2 100644 --- a/Admin/IW4M ADMIN.csproj +++ b/Admin/IW4M ADMIN.csproj @@ -128,15 +128,15 @@ - - PreserveNewest - PreserveNewest Always + + PreserveNewest + PreserveNewest diff --git a/Admin/Main.cs b/Admin/Main.cs index bcd799679..80cf95f76 100644 --- a/Admin/Main.cs +++ b/Admin/Main.cs @@ -10,14 +10,14 @@ namespace IW4MAdmin { class Program { - static public double Version = 0.92; - static public double latestVersion; - static public bool usingMemory = true; + static public double Version { get; private set; } static private Manager serverManager; static private IW4MAdmin_Web.WebFront frontEnd; static void Main(string[] args) { + Version = 0.95; + double latestVersion = 0; handler = new ConsoleEventDelegate(OnProcessExit); SetConsoleCtrlHandler(handler, true); @@ -66,6 +66,7 @@ namespace IW4MAdmin if (S == null) continue; + S.Broadcast("^5IW4MAdmin ^7is going ^1offline^7"); S.isRunning = false; if (Utilities.shutdownInterface(S.pID())) @@ -77,14 +78,13 @@ namespace IW4MAdmin Program.getManager().shutDown(); frontEnd.webSchedule.Stop(); frontEnd.webSchedule.Dispose(); + return false; } catch { return true; } - - return false; } private delegate bool ConsoleEventDelegate(int eventType); diff --git a/Admin/Manager.cs b/Admin/Manager.cs index 932879389..289276849 100644 --- a/Admin/Manager.cs +++ b/Admin/Manager.cs @@ -216,7 +216,8 @@ namespace IW4MAdmin return null; } - SharedLibrary.Utilities.Wait(2); + if (timeWaiting > 5) + SharedLibrary.Utilities.Wait(2); dvar net_ip = Utilities.getDvarOld(0x64A1DF8, (int)Handle); dvar net_port = Utilities.getDvarOld(0x64A3004, (int)Handle); diff --git a/Admin/Plugins.cs b/Admin/Plugins.cs index 550ddfad8..cc68916d7 100644 --- a/Admin/Plugins.cs +++ b/Admin/Plugins.cs @@ -8,17 +8,17 @@ namespace IW4MAdmin { public class PluginImporter { - public static List potentialPlugins = new List(); - public static List potentialNotifies = new List(); + public static List potentialCommands; + public static List potentialNotifies; public static bool Load() { string[] dllFileNames = null; + potentialCommands = new List(); + potentialNotifies = new List(); if (Directory.Exists(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location) + "\\plugins")) - { dllFileNames = Directory.GetFiles(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location) + "\\plugins", "*.dll"); - } else { @@ -52,6 +52,7 @@ namespace IW4MAdmin Object notifyObject = Activator.CreateInstance(assemblyType); EventNotify newNotify = (EventNotify)notifyObject; potentialNotifies.Add(newNotify); + newNotify.onLoad(); Program.getManager().mainLog.Write("Loaded event plugin \"" + assemblyType.Name + "\"", Log.Level.All); } @@ -59,7 +60,7 @@ namespace IW4MAdmin { Object commandObject = Activator.CreateInstance(assemblyType); Command newCommand = (Command)commandObject; - potentialPlugins.Add(newCommand); + potentialCommands.Add(newCommand); Program.getManager().mainLog.Write("Loaded command plugin \"" + newCommand.Name + "\"", Log.Level.All); } diff --git a/Admin/Server.cs b/Admin/Server.cs index 8128dafa3..678c6a4ed 100644 --- a/Admin/Server.cs +++ b/Admin/Server.cs @@ -83,12 +83,9 @@ namespace IW4MAdmin clientDB.addPlayer(P); NewPlayer = clientDB.getPlayer(P.npID, P.clientID); aliasDB.addPlayer(new Aliases(NewPlayer.databaseID, NewPlayer.Name, NewPlayer.IP)); - statDB.addPlayer(NewPlayer); } NewPlayer.updateName(P.Name.Trim()); - - NewPlayer.stats = statDB.getStats(NewPlayer.databaseID); NewPlayer.Alias = aliasDB.getPlayer(NewPlayer.databaseID); if (NewPlayer.Alias == null) @@ -204,12 +201,6 @@ namespace IW4MAdmin if (NewPlayer.Level > Player.Permission.Moderator) NewPlayer.Tell("There are ^5" + Reports.Count + " ^7recent reports!"); - if (NewPlayer.stats == null) // there seems to be an issue with stats with multiple servers. I think this should fix it - { - statDB.addPlayer(NewPlayer); - NewPlayer.stats = statDB.getStats(NewPlayer.databaseID); - } - return true; } #if DEBUG == false @@ -235,7 +226,6 @@ namespace IW4MAdmin Player Leaving = players[cNum]; Leaving.Connections++; clientDB.updatePlayer(Leaving); - statDB.updatePlayer(Leaving); Log.Write("Client at " + cNum + " disconnecting...", Log.Level.Debug); events.Enqueue(new Event(Event.GType.Disconnect, "", Leaving, null, this)); @@ -674,27 +664,9 @@ namespace IW4MAdmin return false; } - if (E.Target == null) - { - Log.Write("Kill event triggered, but no target found!", Log.Level.Debug); - return false; - } - - if (E.Origin.stats == null) - { - Log.Write("Kill event triggered, but no stats found for origin!", Log.Level.Debug); - return false; - } - - if (E.Target.stats == null) - { - Log.Write("Kill event triggered, but no stats found for target!", Log.Level.Debug); - return false; - } - if (E.Origin != E.Target) { - E.Origin.stats.Kills += 1; + /*E.Origin.stats.Kills += 1; E.Origin.stats.updateKDR(); E.Target.stats.Deaths += 1; @@ -704,17 +676,15 @@ namespace IW4MAdmin statDB.updatePlayer(E.Origin); statDB.updatePlayer(E.Target); - totalKills++; + 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 { - E.Origin.stats.Deaths++; - E.Origin.stats.updateKDR(); - statDB.updatePlayer(E.Origin); Log.Write(E.Origin.Name + " suicided...", Log.Level.Debug); + events.Enqueue(new Event(Event.GType.Death, "suicide", E.Target, null, this)); } } @@ -820,13 +790,6 @@ namespace IW4MAdmin if (E.Type == Event.GType.MapEnd) { Log.Write("Game ending...", Log.Level.Debug); - foreach (Player P in players) - { - if (P == null || P.stats == null) - continue; - statDB.updatePlayer(P); - Log.Write("Updated stats for client " + P.databaseID, Log.Level.Debug); - } return true; } @@ -846,8 +809,8 @@ namespace IW4MAdmin clientDB.addBan(newBan); clientDB.updatePlayer(Target); - // foreach (SharedLibrary.Server S in Program.getServers()) // make sure bans show up on the webfront - // S.Bans = S.clientDB.getBans(); + foreach (SharedLibrary.Server S in Program.getServers()) // make sure bans show up on the webfront + S.Bans = S.clientDB.getBans(); lock (Reports) // threading seems to do something weird here { @@ -879,12 +842,37 @@ namespace IW4MAdmin P.setLevel(Player.Permission.User); clientDB.updatePlayer(P); + foreach (SharedLibrary.Server S in Program.getServers()) // make sure bans show up on the webfront + S.Bans = S.clientDB.getBans(); + return true; } } return false; } + override public bool Reload() + { + try + { + messages = null; + maps = null; + rules = null; + initMaps(); + initMessages(); + initRules(); + PluginImporter.Load(); + return true; + } + catch (Exception E) + { + Log.Write("Unable to reload configs! - " + E.Message, Log.Level.Debug); + messages = new List(); + maps = new List(); + rules = new List(); + return false; + } + } override public void initMacros() { @@ -923,8 +911,8 @@ namespace IW4MAdmin commands.Add(new Find("find", "find player in database. syntax: !find ", "f", Player.Permission.SeniorAdmin, 1, false)); commands.Add(new Rules("rules", "list server rules. syntax: !rules", "r", Player.Permission.User, 0, false)); commands.Add(new PrivateMessage("privatemessage", "send message to other player. syntax: !pm ", "pm", Player.Permission.User, 2, true)); - commands.Add(new _Stats("stats", "view your stats or another player's. syntax: !stats", "xlrstats", Player.Permission.User, 0, true)); - commands.Add(new TopStats("topstats", "view the top 4 players on this server. syntax: !topstats", "xlrtopstats", Player.Permission.User, 0, false)); + //commands.Add(new _Stats("stats", "view your stats or another player's. syntax: !stats", "xlrstats", Player.Permission.User, 0, true)); + //commands.Add(new TopStats("topstats", "view the top 4 players on this server. syntax: !topstats", "xlrtopstats", Player.Permission.User, 0, false)); commands.Add(new Reload("reload", "reload configurations. syntax: !reload", "reload", Player.Permission.Owner, 0, false)); commands.Add(new Balance("balance", "balance teams. syntax !balance", "bal", Player.Permission.Moderator, 0, false)); commands.Add(new GoTo("goto", "teleport to selected player. syntax !goto", "go", Player.Permission.SeniorAdmin, 1, true)); @@ -938,7 +926,7 @@ namespace IW4MAdmin commands.Add(new _RCON("rcon", "send rcon command to server. syntax: !rcon ", "rcon", Player.Permission.Owner, 1, false)); commands.Add(new FindAll("findall", "find a player by their aliase(s). syntax: !findall ", "fa", Player.Permission.Moderator, 1, false)); - foreach (Command C in PluginImporter.potentialPlugins) + foreach (Command C in PluginImporter.potentialCommands) commands.Add(C); } diff --git a/Admin/Utilities.cs b/Admin/Utilities.cs index e2bd70bd6..608f3d165 100644 --- a/Admin/Utilities.cs +++ b/Admin/Utilities.cs @@ -367,21 +367,16 @@ namespace IW4MAdmin return false; } - //ClientId clientid = new ClientId(); - //threadID = new IntPtr(); - uint ThreadID2; - threadID = IntPtr.Zero; - //RtlCreateUserThread(ProcessHandle, IntPtr.Zero, false, 0, (uint)0, IntPtr.Zero, lpLLAddress, baseAddress, out threadID, out clientid); - //SCreateRemoteThread(ProcessHandle, IntPtr.Zero, 0, lpLLAddress, baseAddress, 0, out ThreadID2); - return true; + ClientId clientid = new ClientId(); + threadID = new IntPtr(); + RtlCreateUserThread(ProcessHandle, IntPtr.Zero, false, 0, (uint)0, IntPtr.Zero, lpLLAddress, baseAddress, out threadID, out clientid); if (threadID == IntPtr.Zero) { Program.getManager().mainLog.Write("Could not create remote thread"); return false; } #if DEBUG - //Program.getManager().mainLog.Write("Thread Status is " + threadStatus); Program.getManager().mainLog.Write("Thread ID is " + threadID); #endif uint responseCode = WaitForSingleObject(threadID, 3000); @@ -399,8 +394,8 @@ namespace IW4MAdmin { if (Pointer != IntPtr.Zero) { - // if (!VirtualFreeEx(ProcessHandle, Pointer, 0, AllocationType.Release)) - // Program.getManager().mainLog.Write("Virtual Free Failed During Exit Cleanup -- Error #" + Marshal.GetLastWin32Error()); + if (!VirtualFreeEx(ProcessHandle, Pointer, 0, AllocationType.Release)) + Program.getManager().mainLog.Write("Virtual Free Failed During Exit Cleanup -- Error #" + Marshal.GetLastWin32Error()); } } diff --git a/Admin/WebFront.cs b/Admin/WebFront.cs index 15edcb2de..6c0d33b4d 100644 --- a/Admin/WebFront.cs +++ b/Admin/WebFront.cs @@ -228,7 +228,7 @@ namespace IW4MAdmin_Web buffer.Append("
"); return buffer.ToString(); case "STATS": - int totalStats = Servers[server].statDB.totalStats(); + int totalStats = 0; buffer.Append("

Starting at #{{TOP}}


"); buffer.Append(""); @@ -239,10 +239,10 @@ namespace IW4MAdmin_Web range = (totalStats - start); else range = 30; - List Stats = Servers[server].statDB.getMultipleStats(start, range).OrderByDescending(x => x.Skill).ToList(); + //List Stats = Servers[server].statDB.getMultipleStats(start, range).OrderByDescending(x => x.Skill).ToList(); buffer.Append(""); cycleFix = 0; - for (int i = 0; i < totalStats; i++) + /*for (int i = 0; i < totalStats; i++) { if (i >= Stats.Count -1 || Stats[i] == null ) continue; @@ -267,7 +267,7 @@ namespace IW4MAdmin_Web buffer.AppendFormat("", P.Name, P.stats.Kills, P.stats.Deaths, P.stats.KDR, P.stats.Skill, Prefix, Link); cycleFix++; } - } + }*/ buffer.Append("
NameKillsDeathsKDRRating
{0}{1}{2}{3}{4}

"); buffer.Append(parsePagination(server, totalStats, 30, Pagination, "stats")); return buffer.ToString().Replace("{{TOP}}", (start + 1).ToString()); @@ -327,14 +327,6 @@ namespace IW4MAdmin_Web str.AppendFormat("{0}
", a.Name); } - Player.stats = Servers[server].statDB.getStats(Player.databaseID); - String Rating = String.Empty; - - if (Player.stats == null) - Rating = "Not Available"; - else - Rating = Player.stats.Skill.ToString(); - StringBuilder IPs = new StringBuilder(); if (logged) @@ -364,7 +356,7 @@ namespace IW4MAdmin_Web if (logged) Screenshot = String.Format("
", forumID, Player.Name); - buffer.AppendFormat("{0}{10}{1}{2}{3}{4}{5}{6} ago{8}", Player.Name, str, IPs, Rating, SharedLibrary.Utilities.nameHTMLFormatted(Player), Player.Connections, Player.getLastConnection(), forumID, Player.Name, "/0/" + Player.databaseID + "/userip/?player", Screenshot); + buffer.AppendFormat("{0}{10}{1}{2}{3}{4}{5}{6} ago{8}", Player.Name, str, IPs, 0, SharedLibrary.Utilities.nameHTMLFormatted(Player), Player.Connections, Player.getLastConnection(), forumID, Player.Name, "/0/" + Player.databaseID + "/userip/?player", Screenshot); buffer.Append(""); } diff --git a/Admin/lib/AdminInterface.dll b/Admin/lib/AdminInterface.dll index b6dd3012f4cc2b6b29d1cae27b3b703972f46f35..caef8306d71041ff5a777e0afac5c5062dfcf027 100644 GIT binary patch delta 1691 zcmc(ei*Hj^9LLY;*7ZS4FK!(j?V#;8IyB;aowk>aunlIAus~pJ&H)Y_a@UN9u^k{t zOUfck6_`hi0wT+Zafv88jU9p%M#dr!VMd$@@-U0Eg0T1?pwsK`c8LB5-t=>R=bYc` zdv5QEh!JsTDIRX0KC5=wH-~MgC-o2OT8dJ3Sg&jGr1H`>JC&Wb52Yr69k>4Bw6&pl zN}Jx#y&qSYwhNk`k=0u5F58&-l?ctnS|r#nwBN|b_ox9smeJ6SXbCRDrF0oCF!(V- zJDmtQ+Ff>hmv&(vzD2KL4`!)BToIY>U=f2B*3=%``-(yHS>`^y zCg_OiVzZf8cANQ00Wq-(rn4GspEeyDv&5cbTJHqs^u(Ru?4!=i;`|9U0Te)o%XT#& zWdO3%iP4j$HYg*|=FBDG`rb1So<*^nu}V`kiGnj`heCbYT`kK|vg36adq4}bCAAx- z@)0NxHBnI+>Rb%{+stZ&G7vqfkHZPkk`pG>p^6^urna)G@;g+q^3`;9kDA?9!6@bn zF>AVrRV_j@wBnRz26%z0t`iS*%4!HjPJ2QU|kBnT76L+Mu0*8|i-S zR2aY17SCybq=05=Ya(a}OiH@55V|4BFGE9lD-5T!s$W%@#Neu{YfV^MUr-c9j;JA< zU`T!swd>kQ11-<8PFf4$L5HlGs?q+U)0-i5q(pC1z)2Z3dLRQ@_Xcug zsJx_vhLnqGRZ8e8%w$?_%r>x4 zr#GNa8t4+EGpiqDe%?>Jj1FT=sfnLgm*-*Wp=XVIbWUh28}jIyF#{SfGfgtyMBg(F zg|8MMq%T6~=R$-o0cU`ZfPFv&Xawd1rNBfW7eK%;&SvG&sfj+Cu+s2 z^2Sw7tDP&>HwBwkuXGvJAbMqNIZjZQ#jc$Q%UQJCvJ%eS?#iY87MuB2&SlOe2 delta 1655 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
    %uI5bqw-{eqM;1F%+`%4>1;$vLxB777elPF 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 OFdO#&`TTFEf&T}a{SUbS diff --git a/Admin/plugins/SamplePlugin.dll b/Admin/plugins/SamplePlugin.dll index 923af901bfddd2ddecc6c2f0da8306f0e8c29678..595f1b2767a18014b9b105a9018532ec1a067168 100644 GIT binary patch literal 7680 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 delta 2328 zcmZ`*Yitx%6#iyrcXm5%$8NXXwy?k~s4OjQ%0rQdq&!L`2voN`8p>na4rOI`r_4@) z(&$2n3I>s8jYh*CAH-;kiD`oIhaqT0@sB1Fl_*L?V`7MgXe9c}@7`&77`&VL?m6E% z_sn1L%dW3aWVnSHvpw{ zt#(1FQwnvn(MT|&zg(%8Ijmzu^t$5as2x~l%(daNV~i@HDM5t55|2xKL*j=LFG;Lb|6=|ui3?P*wo~FkHK!KW;CbHNz(?w9 zs(~v+9g21UTM(vH9g}Dqn5ms2b`qo5AzI)Noe31bD)u;wJx+M{k9(Sot)W*&OT??N ziC!hG5IQaP4?I;r#^MUHmMC}*XSg{Eu1L?1QDNd{OvS_F-Y3k|@U-;&%mAK~-XVO> zngNX7787#6Wuco`oP{yeV2;Fv5|>F_E%6bF-4fFhGZOa@8!#;GLlTcl93@W0E5y6; zCedKuW9&D9s5YON&>kSuqAkI@63-X0Kx@NUEG2cGb_WBiv>K+a(Rw7aozabw*{L~X zc54MhWa$QpEhwju79Px5;$(bDoFTDE;ylSO#zpcgB$JZ31=q-Q?Z#xK1qCFDBbY-x zj77>?3?OiD;*7ata?BzsD*w}Ug6|&>3ly@((B9)4P^3I zmUp~ew(E1ZXSDCN^Bz{`_olO%{_#-zez~}`th}`?SLk!xY^E2f;eu!9u)g;(yU#;Q zpXa#n7q{=X`-VIlPTu$Xopp}4(&^fjDWH99Q^mb%F`FK?U3A)RE>kFEoIKXM86hlX zyL%Z}zb{Yp-vb!1z3uDLIUB1SH<$K=FWoLXo5jksm!?{8-drqqopgU+y5OOsYk1Ix zgcVM{k83z;J=ol34}-`SF~sf7AkROE0@BC{l3`2E6EO>Ya2U%mBaeQbmBj+Xv^_HW z=_P30D0;JIP}~G-yRb{vyuFIWLoT-BaW3D-G6l{q)An$=U&`jKEcEh57PeuYcqW*Q z_5WAy&Q&Z*&$B{-RbA|rDC*5&z1E^ASXp3y;?|;nqK9M0In&>G?#~NfUqtx513eoX=3hRlSx|zOqEtr$L{mVI zDu~EhVTTP%S4`84Yz?cLUfsrJQIKX^UVy}_#J z2#mc{8&b^HX6BBMbn46gG diff --git a/Release Build/lib/AdminInterface.dll b/Release Build/lib/AdminInterface.dll new file mode 100644 index 0000000000000000000000000000000000000000..caef8306d71041ff5a777e0afac5c5062dfcf027 GIT binary patch literal 6656 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 Vt>e}S>!h{7R&J}bf$=}m{spU!l+FME literal 0 HcmV?d00001 diff --git a/Release Build/lib/SharedLibary.dll b/Release Build/lib/SharedLibary.dll new file mode 100644 index 0000000000000000000000000000000000000000..5c8a3a2090262f0c50d37f2f70cf416a6e062aa0 GIT binary patch literal 35840 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
      %uI5bqw-{eqM;1F%+`%4>1;$vLxB777elPF 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 newPlayer = new Dictionary(); + + newPlayer.Add("npID", P.npID); + newPlayer.Add("KILLS", 0); + newPlayer.Add("DEATHS", 0); + newPlayer.Add("KDR", 0); + newPlayer.Add("SKILL", 0); + + Insert("STATS", newPlayer); + } + + public PlayerStats getStats(Player P) + { + String Query = String.Format("SELECT * FROM STATS WHERE npID = '{0}'", P.npID); + DataTable Result = GetDataTable(Query); + + if (Result != null && Result.Rows.Count > 0) + { + DataRow ResponseRow = Result.Rows[0]; + return new PlayerStats( + Convert.ToInt32(ResponseRow["KILLS"]), + Convert.ToInt32(ResponseRow["DEATHS"]), + Convert.ToDouble(ResponseRow["KDR"]), + Convert.ToDouble(ResponseRow["SKILL"]) + ); + } + + else + { + addPlayer(P); + return getStats(P); + } + } + + public void updateStats(Player P, PlayerStats S) + { + Dictionary updatedPlayer = new Dictionary(); + + updatedPlayer.Add("KILLS", S.Kills); + updatedPlayer.Add("DEATHS", S.Deaths); + updatedPlayer.Add("KDR", Math.Round(S.KDR, 2)); + updatedPlayer.Add("SKILL", S.Skill); + + Update("STATS", updatedPlayer, String.Format("npID = '{0}'", P.npID)); + } + } + + public struct PlayerStats + { + public PlayerStats(int K, int D, double DR, double S) + { + Kills = K; + Deaths = D; + KDR = DR; + Skill = S; + } + + public int Kills; + public int Deaths; + public double KDR; + public double Skill; + } } \ No newline at end of file diff --git a/SharedLibary/Database.cs b/SharedLibary/Database.cs index d6dd6435d..840c0d3d3 100644 --- a/SharedLibary/Database.cs +++ b/SharedLibary/Database.cs @@ -125,7 +125,7 @@ namespace SharedLibrary catch (Exception e) { Console.WriteLine(e.Message); - throw new Exception(e.Message); + return new DataTable(); } return dt; } @@ -403,7 +403,7 @@ namespace SharedLibrary } } - public class StatsDB : Database + /*public class StatsDB : Database { public StatsDB(String FN) : base(FN) { } @@ -539,7 +539,7 @@ namespace SharedLibrary Update("STATS", new Dictionary() { { "SKILL", 1 } }, String.Format("Number = '{0}'", D["Number"])); } } - } + }*/ public class AliasesDB : Database { diff --git a/SharedLibary/Event.cs b/SharedLibary/Event.cs index 89fb4272e..158f1bd28 100644 --- a/SharedLibary/Event.cs +++ b/SharedLibary/Event.cs @@ -130,5 +130,6 @@ namespace SharedLibrary public abstract class EventNotify { public abstract void onEvent(Event E); + public abstract void onLoad(); } } diff --git a/SharedLibary/Player.cs b/SharedLibary/Player.cs index 84652cf41..2b9ac82fc 100644 --- a/SharedLibary/Player.cs +++ b/SharedLibary/Player.cs @@ -4,37 +4,6 @@ using System.Text; namespace SharedLibrary { - public class Stats - { - public Stats(int n, int K, int D, double kdr, double skill, double mean, double dev) - { - statIndex = n; - Kills = K; - Deaths = D; - KDR = Math.Round(kdr, 2); - - //Rating = new Moserware.Skills.Rating(mean, dev); - //Skill = Math.Round(Rating.ConservativeRating, 3) * 10; - - } - - public void updateKDR() - { - int tempDeaths = Deaths; // cuz we don't want undefined! - if (Deaths == 0) - tempDeaths = 1; - - KDR = Math.Round((double)((double)Kills / (double)tempDeaths), 2); - } - - public int Kills; - public int Deaths; - public double KDR; - public double Skill; - public int statIndex; - // public Moserware.Skills.Rating Rating; - } - public class Aliases { public Aliases(int Num, String N, String I) @@ -228,7 +197,6 @@ namespace SharedLibrary public Event lastEvent; public String lastOffense; public int Warnings; - public Stats stats; public Aliases Alias; public bool Masked; } diff --git a/SharedLibary/Server.cs b/SharedLibary/Server.cs index 275937540..2ac49b1b5 100644 --- a/SharedLibary/Server.cs +++ b/SharedLibary/Server.cs @@ -21,7 +21,6 @@ namespace SharedLibrary Log = new Log(logFile, Log.Level.Production, port); #endif clientDB = new ClientsDB("clients.rm"); - statDB = new StatsDB("stats_" + Port + ".rm"); aliasDB = new AliasesDB("aliases.rm"); players = new List(new Player[18]); @@ -211,27 +210,7 @@ namespace SharedLibrary /// Reloads all the server configurations /// /// True on sucess - public bool Reload() - { - try - { - messages = null; - maps = null; - rules = null; - initMaps(); - initMessages(); - initRules(); - return true; - } - catch (Exception E) - { - Log.Write("Unable to reload configs! - " + E.Message, Log.Level.Debug); - messages = new List(); - maps = new List(); - rules = new List(); - return false; - } - } + abstract public bool Reload(); /// /// Send a message to all players @@ -384,7 +363,7 @@ namespace SharedLibrary /// /// Read the map configuration /// - private void initMaps() + protected void initMaps() { maps = new List(); @@ -410,7 +389,7 @@ namespace SharedLibrary /// /// Initialize the messages to be broadcasted /// - private void initMessages() + protected void initMessages() { messages = new List(); @@ -447,7 +426,7 @@ namespace SharedLibrary /// /// Initialize the rules configuration /// - private void initRules() + protected void initRules() { rules = new List(); @@ -474,7 +453,7 @@ namespace SharedLibrary abstract public void initCommands(); //Objects - public Log Log; + public Log Log { get; private set; } public List Bans; public Player owner; public List maps; @@ -519,6 +498,5 @@ namespace SharedLibrary // Databases public ClientsDB clientDB; public AliasesDB aliasDB; - public StatsDB statDB; } }