From feb37123e2ca6d5badd5cb8e58413b2ba055f82b Mon Sep 17 00:00:00 2001 From: RaidMax Date: Sun, 23 Aug 2015 16:58:48 -0500 Subject: [PATCH] So I can work on my desktop --- Admin/Command.cs | 2 +- Admin/Manager.cs | 9 +-- Admin/Server.cs | 82 ++++++++++++------------- Admin/Utilities.cs | 44 ++++++------- Admin/lib/SharedLibary.dll | Bin 38912 -> 38912 bytes Admin/plugins/$SimpleStatsPlugin.dll | Bin 0 -> 8192 bytes Admin/plugins/SamplePlugin.dll | Bin 7680 -> 8192 bytes Admin/plugins/WebfrontPlugin.dll | Bin 25600 -> 26624 bytes Admin/webfront/footer.html | 28 +++++++++ Admin/webfront/header.html | 6 +- Release Build/lib/SharedLibary.dll | Bin 38912 -> 38912 bytes Release Build/plugins/SamplePlugin.dll | Bin 7680 -> 8192 bytes SamplePlugin/Main.cs | 40 ++++++++++++ SamplePlugin/SamplePlugin.csproj | 2 +- SharedLibary/Server.cs | 2 +- SharedLibary/Utilities.cs | 22 +++++++ Webfront Plugin/Framework.cs | 56 +++++++++++------ Webfront Plugin/Main.cs | 25 +++----- Webfront Plugin/Manager.cs | 38 +++++++++--- 19 files changed, 236 insertions(+), 120 deletions(-) create mode 100644 Admin/plugins/$SimpleStatsPlugin.dll diff --git a/Admin/Command.cs b/Admin/Command.cs index d7a74219a..88d4c982a 100644 --- a/Admin/Command.cs +++ b/Admin/Command.cs @@ -11,7 +11,7 @@ namespace IW4MAdmin public override void Execute(Event E) { - if (E.Owner.owner == null) + if (E.Owner.clientDB.getOwner() == null) { E.Origin.setLevel(Player.Permission.Owner); E.Origin.Tell("Congratulations, you have claimed ownership of this server!"); diff --git a/Admin/Manager.cs b/Admin/Manager.cs index a365753aa..1c7e75240 100644 --- a/Admin/Manager.cs +++ b/Admin/Manager.cs @@ -60,12 +60,9 @@ namespace IW4MAdmin if (S == null) continue; - if (!isIW4MStillRunning(S.pID()) || !S.isRunning) + if (!isIW4MStillRunning(S.pID())) { Thread Defunct = ThreadList[S.pID()]; - - if (!S.isRunning) - Utilities.shutdownInterface(S.pID()); S.isRunning = false; if (Defunct != null) @@ -73,6 +70,10 @@ namespace IW4MAdmin Defunct.Join(); ThreadList[S.pID()] = null; } + + if (!S.isRunning) + Utilities.shutdownInterface(S.pID()); + mainLog.Write("Server with PID #" + S.pID() + " can no longer be monitored.", Log.Level.Debug); activePIDs.Remove(S.pID()); defunctServers.Add(S); diff --git a/Admin/Server.cs b/Admin/Server.cs index 45aa43e0f..b66ef3123 100644 --- a/Admin/Server.cs +++ b/Admin/Server.cs @@ -16,8 +16,7 @@ namespace IW4MAdmin { commandQueue = new Queue(); } - - + private void getAliases(List returnAliases, Aliases currentAlias) { foreach(String IP in currentAlias.IPS) @@ -47,43 +46,7 @@ namespace IW4MAdmin return allAliases; getAliases(allAliases, currentIdentityAliases); - return allAliases; - - /* - List aliasAliases = new List(); - Aliases currentAliases = aliasDB.getPlayer(Origin.databaseID); - - if (currentAliases == null) - { - Log.Write("No aliases found for " + Origin.Name, Log.Level.Debug); - return; - } - - foreach (String IP in currentAliases.getIPS()) - { - List tmp = aliasDB.getPlayer(IP); - if (tmp != null) - aliasAliases = tmp; - - foreach (Aliases a in aliasAliases) - { - if (a == null) - continue; - - Player aliasPlayer = clientDB.getPlayer(a.getNumber()); - - if (aliasPlayer != null) - { - aliasPlayer.Alias = a; - - if (returnPlayers.Exists(p => p.databaseID == aliasPlayer.databaseID == false)) - { - returnPlayers.Add(aliasPlayer); - getAliases(returnPlayers, aliasPlayer); - } - } - } - } */ + return allAliases; } //Add player object p to `players` list @@ -411,7 +374,7 @@ namespace IW4MAdmin override public void setDvar(String Dvar, String Value) { - lastDvarPointer = Utilities.executeCommand(PID, Dvar + " " + Value, lastDvarPointer); + lastDvarPointer = Utilities.executeCommand(PID, Dvar + " " + "\"" + Value + "\"", lastDvarPointer); } [DllImport("kernel32.dll")] @@ -427,6 +390,10 @@ namespace IW4MAdmin if (events.Count > 0) { Event curEvent = events.Peek(); + + if (curEvent == null) + continue; + processEvent(curEvent); foreach (Plugin P in PluginImporter.potentialPlugins) { @@ -610,6 +577,9 @@ namespace IW4MAdmin { try { + // clear out any lingering instances + Utilities.shutdownInterface(PID); + // inject our dll if (!Utilities.initalizeInterface(PID)) { @@ -646,8 +616,19 @@ namespace IW4MAdmin } // our settings - setDvar("sv_kickBanTime", "3600"); // 1 hour - setDvar("g_logSync", "1"); // yas + setDvar("sv_kickbantime", "3600"); // 1 hour + + int logSync = -1; + Int32.TryParse(getDvar("g_logSync").current, out oneLog); + + if (logSync == 0) + { + Log.Write("g_logsync is not set to 1, restarting map..."); + setDvar("g_logSync", "1"); // yas + executeCommand("map_restart"); + SharedLibrary.Utilities.Wait(10); + } + if (Mod == String.Empty || oneLog == 1) logPath = Basepath + '\\' + "m2demo" + '\\' + logPath; @@ -799,7 +780,17 @@ namespace IW4MAdmin { Log.Write("New map loaded - " + clientnum + " active players", Log.Level.Debug); - String newMapName = getDvar("mapname").current; + String newMapName = "0"; + String newGametype = "0"; + String newHostName = "0"; + + while(newMapName == "0" || newGametype == "0" || newHostName == "0") // weird anomaly here. + { + newMapName = getDvar("mapname").current; + newGametype = getDvar("g_gametype").current; + newHostName = getDvar("sv_hostname").current; + } + Map newMap = maps.Find(m => m.Name.Equals(newMapName)); if (newMap != null) @@ -807,6 +798,9 @@ namespace IW4MAdmin else mapname = newMapName; + Gametype = newGametype; + hostname = SharedLibrary.Utilities.stripColors(newHostName); + return true; } @@ -912,6 +906,8 @@ namespace IW4MAdmin commands = new List(); + owner = clientDB.getOwner(); + if(owner == null) commands.Add(new Owner("owner", "claim ownership of the server", "owner", Player.Permission.User, 0, false)); diff --git a/Admin/Utilities.cs b/Admin/Utilities.cs index 608f3d165..6d6c9b4a0 100644 --- a/Admin/Utilities.cs +++ b/Admin/Utilities.cs @@ -288,7 +288,7 @@ namespace IW4MAdmin } } - IntPtr memoryForDvarName = allocateAndWrite(Encoding.ASCII.GetBytes(Command + "\0"), ProcessHandle); // this gets disposed next call + IntPtr memoryForDvarName = allocateAndWrite(Encoding.ASCII.GetBytes(Command + '\0'), ProcessHandle); // this gets disposed next call if (memoryForDvarName == IntPtr.Zero) { @@ -343,49 +343,45 @@ namespace IW4MAdmin return false; } - IntPtr baseAddress = IntPtr.Zero; + List baseAddresses = new List(); System.Diagnostics.Process P = System.Diagnostics.Process.GetProcessById(pID); foreach (System.Diagnostics.ProcessModule M in P.Modules) { - if (M.ModuleName == "AdminInterface.dll") - baseAddress = M.BaseAddress; + if (M.ModuleName == "AdminInterface.dll" && M.BaseAddress != IntPtr.Zero) + baseAddresses.Add(M.BaseAddress); } - if (baseAddress == IntPtr.Zero) - { - Program.getManager().mainLog.Write("Base address was not found!"); - return false; - } - - IntPtr lpLLAddress = GetProcAddress(GetModuleHandle("kernel32.dll"), "FreeLibrary"); - + IntPtr lpLLAddress = GetProcAddress(GetModuleHandle("kernel32.dll"), "FreeLibraryAndExitThread"); if (lpLLAddress == IntPtr.Zero) { - Program.getManager().mainLog.Write("Could not obtain address of function address"); + Program.getManager().mainLog.Write("Could not obtain address of freelibary"); return false; } 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) + foreach (IntPtr baseAddress in baseAddresses) { - Program.getManager().mainLog.Write("Could not create remote thread"); - return false; - } + 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 ID is " + threadID); #endif - uint responseCode = WaitForSingleObject(threadID, 3000); + uint responseCode = WaitForSingleObject(threadID, 3000); - if (responseCode != 0x00000000L) - { - Program.getManager().mainLog.Write("Thread did not finish in a timely manner!"); - Program.getManager().mainLog.Write("Last error is: " + Marshal.GetLastWin32Error()); - return false; + if (responseCode != 0x00000000L) + { + Program.getManager().mainLog.Write("Thread did not finish in a timely manner!", Log.Level.Debug); + Program.getManager().mainLog.Write("Last error is: " + Marshal.GetLastWin32Error(), Log.Level.Debug); + return false; + } } CloseHandle(ProcessHandle); diff --git a/Admin/lib/SharedLibary.dll b/Admin/lib/SharedLibary.dll index 9c9a72cb140bf4893852c08ee8749dac87ce1849..12c35247211a87b337e1bb1f8dda43a128e15b74 100644 GIT binary patch delta 1045 zcmX|=ZAg<*6vzM1b5mE_Gqr3Q&f0L~G8J>J=?ATCPOUVh6e}W-loYMiw5Uj?B_@Q< z^?>-H{F3x)B0XA4mMhDOUZ`(HF9`Laq9`K21V!h0$$L5Xp5OhSb1u)zX&d3&M)=+? zHnskB_;d>QK76^_*f9)LgGL0fv#@oEVHPkDmtF(RqLt4OcW`OkN3op?E{jmGJW9xT zM4`U|7~KVMA{TN=75pb_(m|3^fcOReBS7@hHAT$70$5}ci)}TGH0hEpPT;1+i8YOB zvBa`1B}*o=lBJR9R@7$Mb(UWokhOAky6DZZnFB9OIFKF-`*o@oZKv=>>C1V0yu6FS z9N)6GL?E?l8{TdO;;2Y!an;5`+P_NgavI}Sk9x>QCmQuhxQarrN$LI;XeZ9*Z4$%R7jn{w8vd!hfq-@=?i?YdX`IikOs<}{?TNkkXR+3mVw zLk3ZtLVXAbt?V}PH99VwV0W-xqjupGo5G+*-9k6Ji&>4%2_n0P%Aow2(T8!NpH1Ve zMl&Sd$8U{Z5aqhq$y!)&2;B>=8ybs}yUz!X9H+sY+&}$ey5U zi%MC>G4>P*k(rz8 z$jfxPojJLM4xh*8$&)thYf22ZUEK{AcEFEA^os>h2aB@Spo!*DqTO(!mdEr7$yY9+3mS5*C|a!)|3>O{61*-HBVat+u=$rifEkNq_3 z$ZMhE`>~h0fTKq}d9ms7g-stecjfKe+FfvGLYnM&y3jP_0**GA#tF` w#6?MCJu%$kA+1H_sOPe830qBkWH@Y1kbZ_rImvkDH{)jur1-w?TsS-CAF_b#0RR91 delta 817 zcmX}qTSyd97zgnG%+Yphccv}F3tGCkp`|Oj?dlq4=w7^}wz-K4_2xri5d=Ymi*Be1 zV!95P&;_G?Fxw?z)C}!vT9SoAffPYO4_&O5KntPh%+8?$f9Cw=`_7q%`PxSLwo$&X zi|h?92fDX&V&G=II2{HKg06=^CJ7kh^zQ*Zb$bX%k&Jw{)W~IU+ay2NniQeU$||Sf z5sNkt5OW0Jq@~^h*~5P_a>u0OJCmiOro-}>$slm!(rjLHs)qI}5oqFQl4w$Cw5d%w zX;~(z-eQvcmIMycC5tO*F&;>-^CG(zFwm~_vbqW>O-{Fsa@1X_$hpj%CBA4ty2ADHJd)2OkGPVfk$$eBY`GpJQ0S1|RgdXw;ub8e15_ybr7DvcDJXNYvM2S2{ zOO2`=ahxnb8y%?u?4x>tF{X0SM_%HL+~|6nVal~SZI)6;q1ooinrKlC)j-M}IWvUCz1pJnp&YoO|wLhSMLpK^hV1c;0%8=v%0{3<-R9unczM zju#U2JFTzm{FXBH%Fg_}?Hg6ko%76!Q8XRLtr-Q&@am3XJ4SXUXH?vhmFeh+?+I1U zjuA~M8ol_y-<)iW_8O@>+mtqKE=pZQvQgL$pcSYG5}L*nTO?fS_~HXy|bk z<-gTBM45y#1-&!e7$Qn@Al8@jMD3t$IZV{Op7(CJK@@A^$ACZBglB5jVh#9Lw*r7C zzJ_)KlVT8^&v?F91SYl(p}~%B$J11XV1353$}R-iRyvP|b={7qsSFW~G@;U5=D4D; zZ7Q|UuV7*plSGP8|L5R>>Y;1Z>tJvUptG|x4Sn%mqRo9eRiF|AN%kkAT}grCz7Nf~ z_fZIM|K%>Q+hd(6x&jCE>+n?ha%?M5$T!e!KoJK0`VQfC0c}}D)0?5QEl?eGxA4&0 zAH|S*@9pZc)NDr&S{NazUFn3xj-jVvSI{RerbWc6HkgPBif4)`rAI8(YLB)9U@Uhllc=TZX=)qM=>l8C$D!Rz<+PdL; zN4)Q1a(v`gBn>Yky^-F{eJUO0m?4JV8{o#Zw&;#bGA9Iw(s*m^XQnfU4fzt+gqsrRD&`I?QQX-zl z%*PKTJPSSJY9x)78UFxm(#VE9k|F88AEbE1`zwvAnu~=Hckcj*c&~xbDR~tVez>0S zv-Jd3U(-eP5+Fpvo}Ti{5EQ-Q8%pdjLB7a{<=r z_5f{u)GF>{iA8!5vjl2XyrdA17J6b`JlOsBsjG{t zDF`5Q#x%!<2L+ikds})R#+4-(_F)UaTv>WT4uj*(uMI;Q^N1OGUe#pzsJbMp+9Hca zP3TuyiyEv0RGfyrG?M#;5hdJ-cwf6TnCZ(5^bPdi4Ft1X2K*^(+x;j}2@2-%?9SCZ z+nMuO;^jEeW6VF9qgh0RkAdA2CnvM0&ja6vb-R0{>=sxU1*r1SZC`F}W#nf)1B9&s z+XNxtoKpm=2yrIFnD&Ql%(=)Qap9JL@p-d=D zc}aOriPOI*-v{ha8TJaC6j%^=Mc`8cpA-0o`e$mK{zG7!#=Z6k%xlA1j^<%VoIa~v z*5dR{z#a6LLivIANzi{J@W%rGO<+R5tZk)zh+3SE>sdWckLwrp1U;`m3;3r3zb~-0 zY(3Ex3HfN3!D`AA%Pzj zXbQ9iJ}hua;5EPt^rW99N@$BZNNBuxJ8#}AHAksqrWFrf1LWMRX<8^ z2zMWSP=6ZSLH!zLo#nd#j{@GSe}n#&a{6;C<`-xAi{;{fqjmqVsjM ze_wwSS@b>qpQ%fEOaCb)m1N7m(@sE5*{AGki2?SubSVAGk(O?yi;lMJQtno6(Fc{C z^y~B)%FqC^D?|6vQ-GhKp8#$a$_~1L_HKdu1?B{{(P7X>rM*CZjrJA#5#SlbHbXwW zuACRm%L1>{=jm(od-Od@;ns`b(>|pi@Q{KFCf%dlgPGA}UFd)+;?@Gl+43Uk%Z*h9 zQ7JeoL`R6CIxbBt-<6`!wYQ-?+Yq^L+AY<~)=|otm1^0VE!XF4CsQhyDOWRVqi&^Q zI;AyCVfX>ej?iq`T(UeC25sK-tkRTSFukQ!#AB?XDHwpVX3Z>^zC{(k=z3+lK)EHq zW>x5vS*~08rK&}lV$Jnv?2_fwXl&6c)@v5cS+#T3rUCtRxa$P+t~2GDC32mUPMI4O z%lFMWYsSIxV3`Y|=eSu36rQp?-*z3kuSxUKg>&ad%;Eyhl5yKAm#B$H(zDTP(y?n{ z5XdZ*f^hHvK}hP=l3BBY_A$F$_9<(bwRxY8WlvCU0Te1RAvBB$VRMWwaV%*3IL%Uy zj!~Ali-ak2qVCk}ij@hifSHsxJ&ZbzS1;?b>n#k|a1s_cXpJt`g|bzwv8ThnZ&eEA zrMz7$TdRT%a@O*To?T_pjm%NkxnR%LJ@cK|m8$71ZR|JeA<>Gpjf_#Zy5!k&^KZk- zduGY1n9a^KY#gnZYjv;5_=cBZU?!cK<+;_ItXiS`Z|}C#8gV#eC4|mQ&Ik!>)%LL$giH3g>wKtg@pcd-?x6UHlJ!_;=$GQ{!6$IT6CEVS|XR~*^kj(*efP!3cnoiUlbbi`&al`8pBzi$6NneiGwQ=yxW{u(|cfr z$9qwrAMaT!US(ht-tHBeoD}3l)q6Z+i z*6I>uI2-0g(|Wt-z^%zx>~kPs7$>*#F+7*@IL6t*n8|>b*p*jrdVpV@c$QI+~+E z(ZDxqTeX|pjk%!d97g0h8kI=)!t-%NVTPvBT9q^CAuLypKF?-jT!Zchwl`e-dr9ef zM-I_TkB$DtpPbH)J%9a+zy0cGZ~X(szWK=6Q(c3vJ*gR_v>1w#x((OD)F!;BDS(EW zh{eE4;Az()sZDweOf3yUn%Z^9C!|wX#88r3Qe9C)RZ?BaEm1>PVzG`6H4;-J9W1A^ zT=FD0V{s#*Boc|F8B?LND?(}_@&4{;R7-9_tt;3owMcR)9@SYFKP^!WhNuyIc2V%H zz))fdEvh7=!mr&+KS2qx+uxzXC@Tdo;g02U%6=A8Qux*=kF5=coNguwLBC%*l{ zOMm!FUwYvft1aGhHjC?4!CgFyiymJ#{Iin}4Ne~zE>&#jY_p?h-NMDQxYbxVfY&fG z)lz{C{J&ai;kR_Q|5MyHxV5n~zPSe++&{c*xjb#+nkFwpmL;!W%zdi|I^@3>8@2pz zQ20xY{3~L4t#-~B%s-M)z?N zv!1G)*^O~>7`Fl%+cyhX$63yI1}=SAjH^0ML4t2|t2XxICegR@@R&)+vzIlIb)dV9 zXz~aa^u5zq8Qfg>R>kE(N7P?$mT1OmfOF57D^|lfCFEi>L{{R30 literal 0 HcmV?d00001 diff --git a/Admin/plugins/SamplePlugin.dll b/Admin/plugins/SamplePlugin.dll index 5eb61a6df9f7554bc8325f8d7b7ee129dcd6f42b..4ae5be1185c267c81724a296f6989fbf47382a5b 100644 GIT binary patch delta 2480 zcmZ9OYiv|S6vzK_=ia;9+p_Jpu#~pYZcAmmh0@BSJhVcAltzK-iUBdCh1Rz81-pd` z4J?(1Vj3)7f;JV!fP|~5nKXVray1BnOk2&Ye znVH_*opx`&rGYSnrm~rOUEt z$`+;lKENEmYP%Y;MQA&lFl{4SXgdd`NBo@IGnTPlg@PGdy!075y}u{Z-6wBP>Ws2f zhcKgx%$6aY*>7Y^FQdFAW3)DY8rYcN*4Pn~h}zMdN&_{j2lf=dNUtN)efbqWU!has zln3IMl&Rc~&lMca3_o4|LMK=Ib}1Wum(*xS^Ww`4_q3ci5h`f`ld?w8=+9#_k$hrW zAl_oQS?1WJMMq*HO^zKuC9zTVOrp|LNZ9f7G=v5jB~peTZ#7)K)nJ%6g&6Sw4R)l6 z`EHAHAvu*6203z{g7G}lJ!;NQsxm#daYkec;g72-H|na0r$@A3)%age@OIcyLq-A| zIjB?TW?IuT%48b-yffxaJ>`0K?)y#ltJ2+Q< zi-gts*&*9}&3(_Bm}z*|ii5gkQTH3G^v)|hhmsvYGt;&4DT(#Q+q+v6Tq!zg#F|Xyev6cv|*J2XB)3_)1&8mru}sS@YKh zJ^ZB^F#F_ql(88H%gx26gFWU3Gl193Iy1yqT!wmih3R=fiTbh}z<0 zi7LMrt3*Bg_&TLEi3X&hd$RU1=_>F|3V{*6&jb!@dh(Ed!|m3VqngKWp@9?H@)Bv_ z6;k3=(xiPZk|TVfEQDgc=DnJ$HJdcsH8*K))f^xn#y%|{&>Yr$f$YFZauePn9X2t7 zEhxizIe>3rn0ru#G_wX5wYLn@ljbnpGtB`Wn+ljf){yhfSMeue=1IyAns4w6LV2t3 zlv%1|^CQ}yH^0zHzoY!Fd5PEHtoaKjh=0s02#TQfH^QV8Wun;flTmAos1kFm0x}LFQ;nK87flXqIcnG}AGg_C;Fmz!}Q@xJ<6$ z_EsQ)??j`{yi;=!hj9Y$;4HF*}ts^@8@T`jYh^SWqHP*zLwnus%^kH=b(Bt%n8r)t+}5=_1ocX8s)>u%;8 zwMT6_Ri9qc{|j%Ww^tWaU3*2Y@6cVq_*%v$7_*+f80V=>d}|Mkt_@ByvO3RyFz?IP zU#vT}?o^<*YsYWyU{0ZJ6&V4)-+eh}mu>kZ#nFnf-D2AHA5sP{Mu7k-c|$7sL+ZZR z;#g=yxcjH!N9*2t`_uOyJM#A3_UOmsd?L`B`c1?L?5}puh4O6gXOeq0bZ|6~dsP}o Osz-wbKZ^sEzJCF{!>(EY delta 1823 zcmZ9Ne{54#6vw~!-TU6k>nJN@UAL8OU4@kbW3bH)0W*FHs3gFg2@(v(7@Z_5bi^nn zb_AI?(Xd=Z&6FVEKf`EDkw^??(Ww7`U^D`nAP@thMoBb56cWGpb|~WZ$G8jy6CG<>ScopR z(SdYGACWUUO+ad1<|MGLhwXVuWdtu(nYlzMRatlJ=+QZ;Y9|@x8mT%*CM%2qlr}nu zu^y%lJK0K#$tq%MC?kX(R^xJ9DBLrilJ8|Q4%W$ZHJx+~;bk^ah-~LmVno<>yRhqa zVfU?qlNqAmC2P6fMApNCTx{p)GH>RPqdVL?b0$rCA|sOZL?C0b-0Yhq1wU!$O^*Nl zo)WVcYRhsb<2&?=^>uGr86UDU=KDICcbK=U=N2u@wTe~nv0wBHAIHTJ@`9yw zj9q6r%klxsv}M2LC(b^{$G4V0TIIUsR9PuIFqc*NY;KwKv4gC_yH**N{nWp(JhsdZ z-&kH`P&phn>!V(cS3VwA^Hm5hsvNo3@`&Ym(#IdlEL7|oR=cK@W_O?N475%SVw5Ps zJk+yMhmD7Ejkbr?;vw=;%O}NZ+TCKc{w%O4H_XikKF3L}rSR2=cgA{O7rekl)Nt;* z5$`e*^v+qYFFI%=Fa77WaqiDTBxZ0UUBv24hCbXa=Fr0W7 zT=2N)3XI}}zy@LXlx4x*WbNE-bgk|f9Ij%DdYev@8sfjInVycds)qIk^%3=_)u(pR)3jevKk$GLstc$P zr_`?qi=WkH#K|j|B>qv?Na+eOU4-2dQGs$dB4&y~Bt#qs@G=_Egp6pwEcBCG@QcVb zpwvoLc#cxSaqqo?L~!WDib@HFoJ<%Ran{_i!AZkUTc9O!K3g zAR5V(Xy(yKeguz2(hk54a2Umt&+7xhr6Q-V27l96ieJhPjy@)JSNNy=2c@k}$%@@? zHr}(RYr)}e(J}4IrEz_&tVYKpTk=DZZV|ch8soncV$6Dw@1=ufx*-}7GQTidB*y;5 oSJ;g!WL`$K1MzavqBmCT)O(`6`B3HG(y499hpT@V1C2%h0$*P_c>n+a diff --git a/Admin/plugins/WebfrontPlugin.dll b/Admin/plugins/WebfrontPlugin.dll index 8ac2cbfed28b389a93c355204b7e341a9dce4dfc..13768a93d2d578dfd62a1ac17d45847049e494ff 100644 GIT binary patch delta 11865 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 delta 10837 zcmbtadw5jUwO{+3IcLtCnK@*iNhZl8A(KFoA(IDzKoST@LL?}@d14KoU12YlD z2s5MBf(4b1^@&x~YOSwgs@7LqRI0W5DWCSXp^E7Bd8@TPsMS`yzrD{SB;Nad_m4aI zX6^ObYp=cbTI=jHkbZ@wpJ&%>tK59&pO;eZbC{G0Kl2l<07G|~M=##>^JUhZ7ZZI? zFw#V=>aL1V;5MQF=yjWkO0yM8UABwWn4Z(XisHK>dnJprGqR7c8n!BXh*cIJh6V9C z0bhkQ`q?C+XJ-cDfkd4IMD{D2%NgY|G|nCgYO??WA1k~hgecGFsNBEq-hVavR9}rEe&uvWGE^( z9O#%{!&kV|5WFA{hV|QdFowYCd5i~~O33SIUqv$J4}Wve$d!b`9p- zZWJZnz(Thh#oiqgv#)vLtma2rJ+rb6S|l|C2cZ&ikJAW4C5?Jw6m)AnMJ^-K<%|d4 z)DzPfZHP4iZ+npuh5gBD-~pu%gvXfxJk;2_4TRkon+Pf>r`I=oLruJCwj$4$ zD1FBpJ48^p9-AT-OT_@Ih3UE=)W#@-9&)X4 zc}Rl;Q=u@W_uFs3J!IMAkA@NV5@!r}uN#R*XqWE9o>^!DpAhyr?cm?eClvaeX)ade zZeK1b55eb5heXn`3O*~ z@y3ujOTTJuxT)LH!#CBPCSczzOm$`hgeJzv+Y@7R1ZrSXNf6;S9F&W z;LHQ4hW?3^lF4h?6OV?G-#Oo4;1p|c6WlAe4-d}*&-L&s?8EiY=O$p-nGcg8llv0A zLo<^L1kZ1I!c7tG=VsqR(3ZzJ34^l;p!L77K3SSf{i5k85*pOfoW*i7_t$%Kc9JIx zP5>H9fMC`s7#y@UGt?X}w3}ng1RCT49(2&fOlLU&*j*Uv4PUGLajA!^Hyh-Knr+?7dWZaz`?4- zQ2*|s0B^1Hf*b?#b=Z-y`vtbqG9q@NVJ6$+WxUNb8Rk6kFkI!~*cupcdH|{+l*SLj zcpHqjxyId%6sCA#;;o_Gh0hHYVPj{B$)X*W=S>`!qr>HSvJ*x{h+=0$2-Ttrqzp02 zV_l)5t>*}4apDu2E*L7V8+gs5(M%frw!$Pw`EM>Q^GvuYTVAJ6mkw�vq7 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 + \ No newline at end of file diff --git a/Admin/webfront/header.html b/Admin/webfront/header.html index 71dc83cda..17d7dbb2c 100644 --- a/Admin/webfront/header.html +++ b/Admin/webfront/header.html @@ -278,7 +278,6 @@ border-radius: 0px 0px 11px 11px; } - .players { float: left; width: 400px; @@ -331,6 +330,11 @@ font-size: 14pt; width: 505px; } + + .playerAlias, .playerIPs + { + display: none; + } .chatFormat_submit, .chatFormat_submit:hover { diff --git a/Release Build/lib/SharedLibary.dll b/Release Build/lib/SharedLibary.dll index 9c9a72cb140bf4893852c08ee8749dac87ce1849..12c35247211a87b337e1bb1f8dda43a128e15b74 100644 GIT binary patch delta 1045 zcmX|=ZAg<*6vzM1b5mE_Gqr3Q&f0L~G8J>J=?ATCPOUVh6e}W-loYMiw5Uj?B_@Q< z^?>-H{F3x)B0XA4mMhDOUZ`(HF9`Laq9`K21V!h0$$L5Xp5OhSb1u)zX&d3&M)=+? zHnskB_;d>QK76^_*f9)LgGL0fv#@oEVHPkDmtF(RqLt4OcW`OkN3op?E{jmGJW9xT zM4`U|7~KVMA{TN=75pb_(m|3^fcOReBS7@hHAT$70$5}ci)}TGH0hEpPT;1+i8YOB zvBa`1B}*o=lBJR9R@7$Mb(UWokhOAky6DZZnFB9OIFKF-`*o@oZKv=>>C1V0yu6FS z9N)6GL?E?l8{TdO;;2Y!an;5`+P_NgavI}Sk9x>QCmQuhxQarrN$LI;XeZ9*Z4$%R7jn{w8vd!hfq-@=?i?YdX`IikOs<}{?TNkkXR+3mVw zLk3ZtLVXAbt?V}PH99VwV0W-xqjupGo5G+*-9k6Ji&>4%2_n0P%Aow2(T8!NpH1Ve zMl&Sd$8U{Z5aqhq$y!)&2;B>=8ybs}yUz!X9H+sY+&}$ey5U zi%MC>G4>P*k(rz8 z$jfxPojJLM4xh*8$&)thYf22ZUEK{AcEFEA^os>h2aB@Spo!*DqTO(!mdEr7$yY9+3mS5*C|a!)|3>O{61*-HBVat+u=$rifEkNq_3 z$ZMhE`>~h0fTKq}d9ms7g-stecjfKe+FfvGLYnM&y3jP_0**GA#tF` w#6?MCJu%$kA+1H_sOPe830qBkWH@Y1kbZ_rImvkDH{)jur1-w?TsS-CAF_b#0RR91 delta 817 zcmX}qTSyd97zgnG%+Yphccv}F3tGCkp`|Oj?dlq4=w7^}wz-K4_2xri5d=Ymi*Be1 zV!95P&;_G?Fxw?z)C}!vT9SoAffPYO4_&O5KntPh%+8?$f9Cw=`_7q%`PxSLwo$&X zi|h?92fDX&V&G=II2{HKg06=^CJ7kh^zQ*Zb$bX%k&Jw{)W~IU+ay2NniQeU$||Sf z5sNkt5OW0Jq@~^h*~5P_a>u0OJCmiOro-}>$slm!(rjLHs)qI}5oqFQl4w$Cw5d%w zX;~(z-eQvcmIMycC5tO*F&;>-^CG(zFwm~_vbqW>O-{Fsa@1X_$hpj%CBA4ty2ADHJd)2OkGPVfk$$eBY`GpJQ0S1|RgdXw;ub8e15_ybr7DvcDJXNYvM2S2{ zOO2`=ahxnb8y%?u?4x>tF{X0SM_%HL+~|6nVal~SZI)6;q1o~5nKXVray1BnOk2&Ye znVH_*opx`&rGYSnrm~rOUEt z$`+;lKENEmYP%Y;MQA&lFl{4SXgdd`NBo@IGnTPlg@PGdy!075y}u{Z-6wBP>Ws2f zhcKgx%$6aY*>7Y^FQdFAW3)DY8rYcN*4Pn~h}zMdN&_{j2lf=dNUtN)efbqWU!has zln3IMl&Rc~&lMca3_o4|LMK=Ib}1Wum(*xS^Ww`4_q3ci5h`f`ld?w8=+9#_k$hrW zAl_oQS?1WJMMq*HO^zKuC9zTVOrp|LNZ9f7G=v5jB~peTZ#7)K)nJ%6g&6Sw4R)l6 z`EHAHAvu*6203z{g7G}lJ!;NQsxm#daYkec;g72-H|na0r$@A3)%age@OIcyLq-A| zIjB?TW?IuT%48b-yffxaJ>`0K?)y#ltJ2+Q< zi-gts*&*9}&3(_Bm}z*|ii5gkQTH3G^v)|hhmsvYGt;&4DT(#Q+q+v6Tq!zg#F|Xyev6cv|*J2XB)3_)1&8mru}sS@YKh zJ^ZB^F#F_ql(88H%gx26gFWU3Gl193Iy1yqT!wmih3R=fiTbh}z<0 zi7LMrt3*Bg_&TLEi3X&hd$RU1=_>F|3V{*6&jb!@dh(Ed!|m3VqngKWp@9?H@)Bv_ z6;k3=(xiPZk|TVfEQDgc=DnJ$HJdcsH8*K))f^xn#y%|{&>Yr$f$YFZauePn9X2t7 zEhxizIe>3rn0ru#G_wX5wYLn@ljbnpGtB`Wn+ljf){yhfSMeue=1IyAns4w6LV2t3 zlv%1|^CQ}yH^0zHzoY!Fd5PEHtoaKjh=0s02#TQfH^QV8Wun;flTmAos1kFm0x}LFQ;nK87flXqIcnG}AGg_C;Fmz!}Q@xJ<6$ z_EsQ)??j`{yi;=!hj9Y$;4HF*}ts^@8@T`jYh^SWqHP*zLwnus%^kH=b(Bt%n8r)t+}5=_1ocX8s)>u%;8 zwMT6_Ri9qc{|j%Ww^tWaU3*2Y@6cVq_*%v$7_*+f80V=>d}|Mkt_@ByvO3RyFz?IP zU#vT}?o^<*YsYWyU{0ZJ6&V4)-+eh}mu>kZ#nFnf-D2AHA5sP{Mu7k-c|$7sL+ZZR z;#g=yxcjH!N9*2t`_uOyJM#A3_UOmsd?L`B`c1?L?5}puh4O6gXOeq0bZ|6~dsP}o Osz-wbKZ^sEzJCF{!>(EY delta 1823 zcmZ9Ne{54#6vw~!-TU6k>nJN@UAL8OU4@kbW3bH)0W*FHs3gFg2@(v(7@Z_5bi^nn zb_AI?(Xd=Z&6FVEKf`EDkw^??(Ww7`U^D`nAP@thMoBb56cWGpb|~WZ$G8jy6CG<>ScopR z(SdYGACWUUO+ad1<|MGLhwXVuWdtu(nYlzMRatlJ=+QZ;Y9|@x8mT%*CM%2qlr}nu zu^y%lJK0K#$tq%MC?kX(R^xJ9DBLrilJ8|Q4%W$ZHJx+~;bk^ah-~LmVno<>yRhqa zVfU?qlNqAmC2P6fMApNCTx{p)GH>RPqdVL?b0$rCA|sOZL?C0b-0Yhq1wU!$O^*Nl zo)WVcYRhsb<2&?=^>uGr86UDU=KDICcbK=U=N2u@wTe~nv0wBHAIHTJ@`9yw zj9q6r%klxsv}M2LC(b^{$G4V0TIIUsR9PuIFqc*NY;KwKv4gC_yH**N{nWp(JhsdZ z-&kH`P&phn>!V(cS3VwA^Hm5hsvNo3@`&Ym(#IdlEL7|oR=cK@W_O?N475%SVw5Ps zJk+yMhmD7Ejkbr?;vw=;%O}NZ+TCKc{w%O4H_XikKF3L}rSR2=cgA{O7rekl)Nt;* z5$`e*^v+qYFFI%=Fa77WaqiDTBxZ0UUBv24hCbXa=Fr0W7 zT=2N)3XI}}zy@LXlx4x*WbNE-bgk|f9Ij%DdYev@8sfjInVycds)qIk^%3=_)u(pR)3jevKk$GLstc$P zr_`?qi=WkH#K|j|B>qv?Na+eOU4-2dQGs$dB4&y~Bt#qs@G=_Egp6pwEcBCG@QcVb zpwvoLc#cxSaqqo?L~!WDib@HFoJ<%Ran{_i!AZkUTc9O!K3g zAR5V(Xy(yKeguz2(hk54a2Umt&+7xhr6Q-V27l96ieJhPjy@)JSNNy=2c@k}$%@@? zHr}(RYr)}e(J}4IrEz_&tVYKpTk=DZZV|ch8soncV$6Dw@1=ufx*-}7GQTidB*y;5 oSJ;g!WL`$K1MzavqBmCT)O(`6`B3HG(y499hpT@V1C2%h0$*P_c>n+a diff --git a/SamplePlugin/Main.cs b/SamplePlugin/Main.cs index 1a5f7e81f..018e6ec10 100644 --- a/SamplePlugin/Main.cs +++ b/SamplePlugin/Main.cs @@ -98,7 +98,12 @@ namespace SamplePlugin killerStats.KDR = killerStats.Kills / killerStats.Deaths; playerStats.updateStats(Killer, killerStats); + + killerStats.killStreak++; + killerStats.deathStreak = 0; } + + Killer.Tell(messageOnStreak(killerStats.killStreak, killerStats.deathStreak)); } if (E.Type == Event.GType.Death) @@ -110,6 +115,11 @@ namespace SamplePlugin victimStats.KDR = victimStats.Kills / victimStats.Deaths; playerStats.updateStats(Victim, victimStats); + + victimStats.deathStreak++; + victimStats.killStreak = 0; + + Victim.Tell(messageOnStreak(victimStats.killStreak, victimStats.deathStreak)); } } @@ -123,6 +133,32 @@ namespace SamplePlugin } + private String messageOnStreak(int killStreak, int deathStreak) + { + String Message = ""; + switch (killStreak) + { + case 5: + Message = "Great job! You're on a ^55 killstreak!"; + break; + case 10: + Message = "Amazing! ^510 ^7kills without dying!"; + break; + } + + switch (deathStreak) + { + case 5: + Message = "Pick it up soldier, you've died 5 times in a row..."; + break; + case 10: + Message = "Seriously? ^510 ^7deaths without getting a kill?"; + break; + } + + return Message; + } + public override string Name { get { return "Basic Stats"; } @@ -204,11 +240,15 @@ namespace SamplePlugin Deaths = D; KDR = DR; Skill = S; + deathStreak = 0; + killStreak = 0; } public int Kills; public int Deaths; public double KDR; public double Skill; + public int deathStreak; + public int killStreak; } } \ No newline at end of file diff --git a/SamplePlugin/SamplePlugin.csproj b/SamplePlugin/SamplePlugin.csproj index af79b039c..d6b4f2969 100644 --- a/SamplePlugin/SamplePlugin.csproj +++ b/SamplePlugin/SamplePlugin.csproj @@ -47,7 +47,7 @@ - copy /Y "$(TargetDir)$(TargetName).dll" "$(SolutionDir)Admin\plugins\$(TargetName).dll" + copy /Y "$(TargetDir)$(TargetName).dll" "$(SolutionDir)Admin\plugins\$SimpleStatsPlugin.dll"