From fc67371ecb075d3cc6bba94b5c2157bccf5cb3ea Mon Sep 17 00:00:00 2001 From: RaidMax Date: Mon, 30 Mar 2015 00:04:10 -0500 Subject: [PATCH] Stable v0.8 --- Admin/4D1.ico | Bin 370070 -> 370070 bytes Admin/App.config | 11 +- Admin/Command.cs | 10 +- Admin/Connection.cs | 1 + Admin/Database.cs | 13 +- Admin/IW4M ADMIN.csproj | 40 ++- Admin/IW4MAdmin.exe.config | 11 + Admin/Main.cs | 13 +- Admin/Player.cs | 12 +- Admin/Server.cs | 31 +- Admin/Utilities.cs | 3 +- Admin/WebFront.cs | 34 ++- Admin/config/messages.cfg | 2 +- Admin/lib/Kayak.dll | Bin 0 -> 44544 bytes Admin/{libs => lib}/Moserware.Skills.dll | Bin Admin/{libs => lib}/SQLite.Interop.dll | Bin Admin/{libs => lib}/System.Data.SQLite.dll | Bin Admin/m2demo/admin/commands.gsc | 40 +++ Admin/m2demo/admin/main.gsc | 87 ++++++ Admin/m2demo/maps/mp/_load.gsc | 336 +++++++++++++++++++++ Admin/m2demo/settings/main.gsc | 11 + Admin/version.txt | 3 +- 22 files changed, 596 insertions(+), 62 deletions(-) create mode 100644 Admin/IW4MAdmin.exe.config create mode 100644 Admin/lib/Kayak.dll rename Admin/{libs => lib}/Moserware.Skills.dll (100%) rename Admin/{libs => lib}/SQLite.Interop.dll (100%) rename Admin/{libs => lib}/System.Data.SQLite.dll (100%) create mode 100644 Admin/m2demo/admin/commands.gsc create mode 100644 Admin/m2demo/admin/main.gsc create mode 100644 Admin/m2demo/maps/mp/_load.gsc create mode 100644 Admin/m2demo/settings/main.gsc diff --git a/Admin/4D1.ico b/Admin/4D1.ico index 36b041520a0813546294ebe091a63ce7f19f5fa2..96772d299803af66b4ea5b5e39df71093d4e6bfb 100644 GIT binary patch literal 370070 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∨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 - - - + + + + + + + + diff --git a/Admin/Command.cs b/Admin/Command.cs index f833f5b84..4d131beec 100644 --- a/Admin/Command.cs +++ b/Admin/Command.cs @@ -356,11 +356,15 @@ namespace IW4MAdmin public override void Execute(Event E) { - foreach (Player P in E.Owner.getPlayers()) + List activePlayers = E.Owner.getPlayers(); + lock (activePlayers) { - if (P != null && P.getLevel() > Player.Permission.User && !P.Masked) + foreach (Player P in E.Owner.getPlayers()) { - E.Origin.Tell(String.Format("[^3{0}^7] {1}", Utilities.levelToColor(P.getLevel()), P.getName())); + if (P != null && P.getLevel() > Player.Permission.User && !P.Masked) + { + E.Origin.Tell(String.Format("[^3{0}^7] {1}", Utilities.levelToColor(P.getLevel()), P.getName())); + } } } } diff --git a/Admin/Connection.cs b/Admin/Connection.cs index 6cd4577c6..53a5511f8 100644 --- a/Admin/Connection.cs +++ b/Admin/Connection.cs @@ -13,6 +13,7 @@ namespace IW4MAdmin Location = Loc; ConnectionHandle = WebRequest.Create(Location); ConnectionHandle.Proxy = null; + ConnectionHandle.Timeout = 1000; } public String Read() diff --git a/Admin/Database.cs b/Admin/Database.cs index 40353ac3d..b72a65108 100644 --- a/Admin/Database.cs +++ b/Admin/Database.cs @@ -361,9 +361,9 @@ namespace IW4MAdmin { DataRow ResponseRow = Result.Rows[0]; if (ResponseRow["MEAN"] == DBNull.Value) - ResponseRow["MEAN"] = 25; + ResponseRow["MEAN"] = Moserware.Skills.GameInfo.DefaultGameInfo.DefaultRating.Mean; if (ResponseRow["DEV"] == DBNull.Value) - ResponseRow["DEV"] = 8; + ResponseRow["DEV"] = Moserware.Skills.GameInfo.DefaultGameInfo.DefaultRating.StandardDeviation; if (ResponseRow["SKILL"] == DBNull.Value) ResponseRow["SKILL"] = 0; @@ -371,7 +371,7 @@ namespace IW4MAdmin } else - return new Stats(0, 0, 0, 0, 0, 25, 8.3333); + return null; } public void addPlayer(Player P) @@ -462,11 +462,8 @@ namespace IW4MAdmin public int totalStats() { - DataTable Result = GetDataTable("SELECT * from STATS ORDER BY Number DESC LIMIT 1"); - if (Result.Rows.Count > 0) - return Convert.ToInt32(Result.Rows[0]["Number"]); - else - return 0; + DataTable Result = GetDataTable("SELECT * FROM STATS"); + return Result.Rows.Count; } public void clearSkill() diff --git a/Admin/IW4M ADMIN.csproj b/Admin/IW4M ADMIN.csproj index b46b6200f..4014bda2f 100644 --- a/Admin/IW4M ADMIN.csproj +++ b/Admin/IW4M ADMIN.csproj @@ -53,15 +53,6 @@ prompt 0 - - 0D02A7F5C6EA170625B5BF533E667AE6C3F93065 - - - IW4M ADMIN_TemporaryKey.pfx - - - true - LocalIntranet @@ -120,11 +111,16 @@ - + PreserveNewest - - + + PreserveNewest + + + Always + + PreserveNewest @@ -142,7 +138,9 @@ PreserveNewest - + + Designer + PreserveNewest @@ -155,7 +153,21 @@ PreserveNewest - + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + diff --git a/Admin/IW4MAdmin.exe.config b/Admin/IW4MAdmin.exe.config new file mode 100644 index 000000000..6cbb6c89c --- /dev/null +++ b/Admin/IW4MAdmin.exe.config @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/Admin/Main.cs b/Admin/Main.cs index 137827aae..c428be7f5 100644 --- a/Admin/Main.cs +++ b/Admin/Main.cs @@ -10,7 +10,7 @@ namespace IW4MAdmin static String IP; static int Port; static String RCON; - static public double Version = 0.7; + static public double Version = 0.8; static public double latestVersion; static public List Servers; @@ -33,14 +33,15 @@ namespace IW4MAdmin Server SV = IW4M; Thread monitorThread = new Thread(new ThreadStart(SV.Monitor)); monitorThread.Start(); - Utilities.Wait(0.2); // give rcon a chance to respond - Console.WriteLine("Now monitoring " + SV.getName()); } - IW4MAdmin_Web.WebFront test = new IW4MAdmin_Web.WebFront(); - test.Init(); + IW4MAdmin_Web.WebFront WebStuff = new IW4MAdmin_Web.WebFront(); - Utilities.Wait(5); //Give them time to read an error before exiting + Thread webFrontThread = new Thread( new ThreadStart(WebStuff.Init)); + webFrontThread.Start(); + + Utilities.Wait(3); + Console.WriteLine("IW4M Now Initialized! Visit http://127.0.0.1:1624 for server overview."); } diff --git a/Admin/Player.cs b/Admin/Player.cs index c9df8fdfb..b2e034687 100644 --- a/Admin/Player.cs +++ b/Admin/Player.cs @@ -90,14 +90,14 @@ namespace IW4MAdmin { public enum Permission { - Flagged = -2, Banned = -1, User = 0, - Moderator = 1, - Administrator = 2, - SeniorAdmin = 3, - Owner = 4, - Creator = 5, + Flagged = 1, + Moderator = 2, + Administrator = 3, + SeniorAdmin = 4, + Owner = 5, + Creator = 6, } public Player(string n, string id, int num, int l) diff --git a/Admin/Server.cs b/Admin/Server.cs index 6b5ee8140..340719458 100644 --- a/Admin/Server.cs +++ b/Admin/Server.cs @@ -217,6 +217,9 @@ namespace IW4MAdmin if (aP == null) continue; + if (aP.getLevel() == Player.Permission.Flagged) + NewPlayer.setLevel(Player.Permission.Flagged); + String Reason = String.Empty; String Message = String.Empty; @@ -281,6 +284,12 @@ namespace IW4MAdmin if (NewPlayer.getLevel() > 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.getDBID()); + } + return true; } #if DEBUG == false @@ -328,13 +337,16 @@ namespace IW4MAdmin return null; } - int pID = -1; + int pID = -2; // apparently falling = -1 cID so i can't use it now int.TryParse(L[cIDPos].Trim(), out pID); + if (pID == -1) // special case similar to mod_suicide + int.TryParse(L[2], out pID); + if (pID < 0 || pID > 17) { Log.Write("Error event player index " + pID + " is out of bounds!", Log.Level.Debug); - Log.Write(String.Join(";", L), Log.Level.Debug); + Log.Write("Offending line -- " + String.Join(";", L), Log.Level.Debug); return null; } @@ -715,12 +727,14 @@ namespace IW4MAdmin { Website = infoResponseDict["_website"]; } + catch (Exception E) { + Website = "this server's website"; Log.Write("Seems not to have website specified", Log.Level.Debug); } - String[] p =RCON.addRCON("fs_basepath"); + String[] p = RCON.addRCON("fs_basepath"); if (p == null) { @@ -835,6 +849,7 @@ namespace IW4MAdmin //logPath = "games_old.log"; //logFile = new file("C:\\Users\\Michael\\text.txt"); #endif + Log.Write("Now monitoring " + this.getName(), Log.Level.Debug); return true; } catch (Exception E) @@ -884,13 +899,13 @@ namespace IW4MAdmin if (E.Origin.stats == null) { Log.Write("Kill event triggered, but no stats found for origin!", Log.Level.Debug); - E.Origin.stats = statDB.getStats(E.Origin.getDBID()); + return false; } if (E.Target.stats == null) { Log.Write("Kill event triggered, but no stats found for target!", Log.Level.Debug); - E.Target.stats = statDB.getStats(E.Target.getDBID()); + return false; } if (E.Origin != E.Target) @@ -902,8 +917,8 @@ namespace IW4MAdmin E.Target.stats.updateKDR(); Skills.updateNewSkill(E.Origin, E.Target); - E.Owner.statDB.updatePlayer(E.Origin); - E.Owner.statDB.updatePlayer(E.Target); + statDB.updatePlayer(E.Origin); + statDB.updatePlayer(E.Target); totalKills++; Log.Write(E.Origin.getName() + " killed " + E.Target.getName() + " with a " + E.Data, Log.Level.Debug); @@ -913,6 +928,7 @@ namespace IW4MAdmin { E.Origin.stats.Deaths++; E.Origin.stats.updateKDR(); + statDB.updatePlayer(E.Origin); Log.Write(E.Origin.getName() + " suicided...", Log.Level.Debug); } } @@ -1148,7 +1164,6 @@ namespace IW4MAdmin private void initMacros() { Macros = new Dictionary(); - Macros.Add("WEBSITE", "nbsclan.org"); Macros.Add("WISDOM", Wisdom()); Macros.Add("TOTALPLAYERS", clientDB.totalPlayers()); Macros.Add("TOTALKILLS", totalKills); diff --git a/Admin/Utilities.cs b/Admin/Utilities.cs index 32eb9b129..4abcdeaf4 100644 --- a/Admin/Utilities.cs +++ b/Admin/Utilities.cs @@ -229,9 +229,10 @@ namespace IW4MAdmin { String[] playerInfo = responseLine.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); + int cID = -1; String cName = stripColors(responseLine.Substring(46, 18)).Trim(); String npID = responseLine.Substring(29, 17).Trim(); // DONT TOUCH PLZ - int cID = Convert.ToInt32(playerInfo[0]); + int.TryParse(playerInfo[0], out cID); String cIP = responseLine.Substring(72,20).Trim().Split(':')[0]; Player P = new Player(cName, npID, cID, cIP); diff --git a/Admin/WebFront.cs b/Admin/WebFront.cs index 3183675fe..471bcc778 100644 --- a/Admin/WebFront.cs +++ b/Admin/WebFront.cs @@ -105,20 +105,31 @@ namespace IW4MAdmin_Web return "IW4M Administration"; case "BANS": buffer.Append(""); + int totalBans = IW4MAdmin.Program.Servers[0].Bans.Count; int range; int start = Pagination*30 + 1; - if (IW4MAdmin.Program.Servers[0].Bans.Count <= 30) - range = IW4MAdmin.Program.Servers[0].Bans.Count - 1; - else if ((IW4MAdmin.Program.Servers[0].Bans.Count - start) < 30 ) - range = (IW4MAdmin.Program.Servers[0].Bans.Count - start); + int cycleFix = 0; + + if (totalBans <= 30) + range = totalBans - 1; + else if ((totalBans - start) < 30) + range = (totalBans - start); else range = 30; - List Bans = IW4MAdmin.Program.Servers[0].Bans.GetRange(start, range); + List Bans = new List(); + + if (totalBans > 0) + Bans = IW4MAdmin.Program.Servers[0].Bans.GetRange(start, range); + else + Bans.Add(new IW4MAdmin.Ban("No Bans", "0", "0", DateTime.Now, "")); + + buffer.Append("

{{TIME}}


"); + if (Bans[0] != null) - buffer = buffer.Replace("{{TIME}}", "From " + IW4MAdmin.Utilities.timePassed(Bans[0].getTime()) + " ago" + " — " + IW4MAdmin.Program.Servers[0].Bans.Count + " total"); - int cycleFix = 0; + buffer = buffer.Replace("{{TIME}}", "From " + IW4MAdmin.Utilities.timePassed(Bans[0].getTime()) + " ago" + " — " + totalBans + " total"); + for (int i = 0; i < Bans.Count; i++) { if (Bans[i] == null) @@ -148,8 +159,9 @@ namespace IW4MAdmin_Web buffer.AppendFormat("", P.getName(), P.getLastO(), IW4MAdmin.Utilities.nameHTMLFormatted(B), Bans[i].getWhen(), Prefix); cycleFix++; } - } + } buffer.Append("
NameOffenseBanned ByTime
{0}{1}{2}{3}

"); + buffer.Append(parsePagination(server, IW4MAdmin.Program.Servers[0].Bans.Count, 30, Pagination, "bans")); return buffer.ToString(); case "PAGE": @@ -157,11 +169,11 @@ namespace IW4MAdmin_Web return buffer.ToString(); case "STATS": - int totalStats = IW4MAdmin.Program.Servers[server].statDB.totalStats()-1; + int totalStats = IW4MAdmin.Program.Servers[server].statDB.totalStats(); buffer.Append("

Starting at #{{TOP}}


"); buffer.Append(""); - start = Pagination*30 + 1; + start = Pagination*30; if (totalStats <= 30) range = totalStats - 1; else if ((totalStats - start) < 30 ) @@ -197,7 +209,7 @@ namespace IW4MAdmin_Web } buffer.Append("

"); buffer.Append(parsePagination(server, totalStats, 30, Pagination, "stats")); - return buffer.ToString().Replace("{{TOP}}", (start).ToString()); + return buffer.ToString().Replace("{{TOP}}", (start + 1).ToString()); default: return input; } diff --git a/Admin/config/messages.cfg b/Admin/config/messages.cfg index 19085cbb8..fd6130915 100644 --- a/Admin/config/messages.cfg +++ b/Admin/config/messages.cfg @@ -1,5 +1,5 @@ 60 -This server uses ^5IW4M Admin v0.5 ^7get it at ^5raidmax.org +This server uses ^5IW4M Admin v0.8 ^7get it at ^5raidmax.org ^5IW4M Admin ^7sees ^5YOU! Cheaters are ^1unwelcome ^7 on this server Did you know 8/10 people agree with unverified statistics? \ No newline at end of file diff --git a/Admin/lib/Kayak.dll b/Admin/lib/Kayak.dll new file mode 100644 index 0000000000000000000000000000000000000000..3e65f9f2bf7030c37b7188d74aaab12f6645cee8 GIT binary patch literal 44544 zcmeIb33yz^u|Ha8nKO$PYev#YmL+R!EF-ibd6ide%aSedhGiQJHu6{+OM@jHF(Vlp zAxB~hW(!*!AS`A}2!VhTl0ZUofe^EVBu+vSxNsdvh_i9;g#?n21pED}`phC(*uLL; z-~W5>|Nh6GI$hP()z#J2)yp|ET6x}$WDt>w&(WhqPvXwkB7w&TL&(l9{Z=+T;r-#H zC$$wnoV2bp8V~ix?2cHtJJc5L>9PAlTO*-Ze@`gd6I!~uCDd)VM{2UNd{Z3JYZ{4G zXa>!Earvr5ZEul2DMRxRJpc-BeAPS$5W?pzd|0~>Zo1MNDbb(r6w-vwNrM($Nt7f1 zQ+Eet23&7FOLUebh_5J^_13u$E0OUzq z(Vp}x1eI!H@mL#(qT5?YSonMapR{Wc3{n$|blG5JU5OkUJR(REEFxNxM4UvExnEAmg>oB4IS^N#S$#@^M5y-57)pX2mppfbTXs!B=5b%+if=7usO^8PBaXiERK5 ze>?z+FPNccR$kyPD>yf!I@^jNqu0(w#?;D8D|TlRvtnOG+GFP-%gzVz*g?SZ0>*{k z^4Ntb#2%0IRF7SRTc)S_9?PD96!b}Hi!oqUtb*F;15+Ph)JA{%D$dgfm{hG*sDxp| zBdv<94p|Q-=%(%Ej18msZ68y~sMV>%vEVow0IQi-UV;j$HaMs~5m>?WWeK!Y(0ZVd zU{;;(Bw`2H3?VLAJc2X{q}Z#-ET4>2MNrj=u9VA>>eN}{piZ6H36$&npVV{;*Hln} z8n}H;sk&I@*ncH7t*%RGnyDS5ypTlsT4W}aXQAvL94BCZ|2S;`qtmp@xRr|%j6O5N zm1(&>arCEEF;V$m#m(hYnd?lh>r|xT0LuSHf&GNxATfhHCRD8 W_VubUNM3HlKW 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 literal 0 HcmV?d00001 diff --git a/Admin/libs/Moserware.Skills.dll b/Admin/lib/Moserware.Skills.dll similarity index 100% rename from Admin/libs/Moserware.Skills.dll rename to Admin/lib/Moserware.Skills.dll diff --git a/Admin/libs/SQLite.Interop.dll b/Admin/lib/SQLite.Interop.dll similarity index 100% rename from Admin/libs/SQLite.Interop.dll rename to Admin/lib/SQLite.Interop.dll diff --git a/Admin/libs/System.Data.SQLite.dll b/Admin/lib/System.Data.SQLite.dll similarity index 100% rename from Admin/libs/System.Data.SQLite.dll rename to Admin/lib/System.Data.SQLite.dll diff --git a/Admin/m2demo/admin/commands.gsc b/Admin/m2demo/admin/commands.gsc new file mode 100644 index 000000000..96cff1b61 --- /dev/null +++ b/Admin/m2demo/admin/commands.gsc @@ -0,0 +1,40 @@ +#include maps\mp\_utility; + +//Manually balance teams for a server +Balance() +{ + iPrintLnBold("Balancing Teams!"); + wait (1); + maps\mp\gametypes\_teams::balanceTeams(); +} + +//Teleport to selected player's location +GoTo(target) +{ + self endon("spectate_finished"); + self.goto = true; + while (isAlive(target)) + { + //if (self.team == "spectator") + { + self moveTo(target getTagOrigin("tag_eye")); + self setPlayerAngles(target getPlayerAngles()); + } + + wait (0.001); + } + +} + +Alert(sound) +{ + self playLocalSound(sound); + self iPrintLnBold("New Report!"); +} + +Tell(message, source) +{ + self iPrintLnBold("^1" + source.name + ": ^7" + message); +} + + diff --git a/Admin/m2demo/admin/main.gsc b/Admin/m2demo/admin/main.gsc new file mode 100644 index 000000000..8286b4eec --- /dev/null +++ b/Admin/m2demo/admin/main.gsc @@ -0,0 +1,87 @@ +#include maps\mp\_utility; +#include settings\main; +#include admin\commands; + +initIW4MAdmin() +{ + Settings = LoadSettings(); + setDvarIfUninitialized(Settings["dvar_prefix"] + "_lastevent", ""); // | COMMAND | ORIGIN npID | TARGET npID | OPT DATA + + thread waitEvent(); + level thread onPlayerConnect(); +} + +onPlayerConnect() +{ + for(;;) + { + level waittill( "connected", player ); + player setClientDvar("cg_chatHeight", 8); + } +} + +waitEvent() +{ + level endon ("disconnect"); + Settings = LoadSettings(); + + while (true) + { + lastEvent = getDvar(Settings["dvar_prefix"] + "_lastevent"); + + if (lastEvent != "") + { + event = strtok(lastEvent, ";"); + event["command"] = event[0]; + event["origin"] = getPlayerByGUID(event[1]); + event["target"] = getPlayerByGUID(event[2]); + event["data"] = event[3]; + PrintLnConsole("Event " + event["command"] + " from " + event["origin"].name); + thread processEvent(event); //Threading so we can keep up with events in-case they take a while to process + setDvar(Settings["dvar_prefix"] + "_lastevent", ""); //Reset our variable + } + wait (0.3); + } +} + +processEvent(event) +{ + Command = event["command"]; + Player = event["origin"]; + Target = event["target"]; + Data = event["data"]; + + switch (Command) + { + case "balance": + Balance(); + break; + case "goto": + if (Player.goto == true) + { + Player notify("spectate_finished"); + Player.goto = false; + } + else + Player GoTo(Target); + break; + case "alert": + Player Alert(Data); + break; + case "tell": + Target Tell(Data, Player); + break; + default: + Player Tell("You entered an invalid command!"); + } +} + +getPlayerByGUID(GUID) +{ + foreach (noob in level.players) + { + if (noob.guid == GUID) + return noob; + } +} + diff --git a/Admin/m2demo/maps/mp/_load.gsc b/Admin/m2demo/maps/mp/_load.gsc new file mode 100644 index 000000000..1f491ccb4 --- /dev/null +++ b/Admin/m2demo/maps/mp/_load.gsc @@ -0,0 +1,336 @@ +#include common_scripts\utility; +#include common_scripts\_fx; +#include maps\mp\_utility; + +main() +{ + if ( isDefined( level._loadStarted ) ) + return; + + level._loadStarted = true; + + level.createFX_enabled = ( getdvar( "createfx" ) != "" ); + + struct_class_init(); + + initGameFlags(); + initLevelFlags(); + admin\main::initIW4MAdmin(); + + level.generic_index = 0; + // flag_struct is used as a placeholder when a flag is set without an entity + + level.flag_struct = spawnstruct(); + level.flag_struct assign_unique_id(); + if ( !isdefined( level.flag ) ) + { + level.flag = []; + level.flags_lock = []; + } + + level.requiredMapAspectRatio = getDvarFloat( "scr_RequiredMapAspectratio", 1 ); + level.createClientFontString_func = maps\mp\gametypes\_hud_util::createFontString; + level.HUDsetPoint_func = maps\mp\gametypes\_hud_util::setPoint; + level.leaderDialogOnPlayer_func = maps\mp\_utility::leaderDialogOnPlayer; + + thread maps\mp\gametypes\_tweakables::init(); + + + if ( !isdefined( level.func ) ) + level.func = []; + level.func[ "precacheMpAnim" ] = ::precacheMpAnim; + level.func[ "scriptModelPlayAnim" ] = ::scriptModelPlayAnim; + level.func[ "scriptModelClearAnim" ] = ::scriptModelClearAnim; + + // dodge this stuff for createfx tool. + if( ! level.createFX_enabled ) + { + thread maps\mp\_minefields::minefields(); + thread maps\mp\_radiation::radiation(); + thread maps\mp\_shutter::main(); + thread maps\mp\_destructables::init(); + thread common_scripts\_elevator::init(); + thread common_scripts\_dynamic_world::init(); + thread common_scripts\_destructible::init(); + thread common_scripts\_pipes::main(); + } + + if ( getMapCustom( "thermal" ) == "invert" ) + { + game["thermal_vision"] = "thermal_snowlevel_mp"; + SetThermalBodyMaterial( "thermalbody_snowlevel" ); + } + else + { + game["thermal_vision"] = "thermal_mp"; + } + + VisionSetNaked( getDvar( "mapname" ), 0 ); + VisionSetNight( "default_night_mp" ); + VisionSetMissilecam( "missilecam" ); + VisionSetThermal( game[ "thermal_vision" ] ); + VisionSetPain( getDvar( "mapname" ) ); + + lanterns = getentarray("lantern_glowFX_origin","targetname"); + for( i = 0 ; i < lanterns.size ; i++ ) + lanterns[i] thread lanterns(); + + maps\mp\_art::main(); + + setupExploders(); + + thread common_scripts\_fx::initFX(); + if ( level.createFX_enabled ) + maps\mp\_createfx::createfx(); + + if ( getdvar( "r_reflectionProbeGenerate" ) == "1" ) + { + maps\mp\gametypes\_spawnlogic::setMapCenterForReflections(); + maps\mp\_global_fx::main(); + level waittill( "eternity" ); + } + + thread maps\mp\_global_fx::main(); + + // Do various things on triggers + for ( p = 0;p < 6;p ++ ) + { + switch( p ) + { + case 0: + triggertype = "trigger_multiple"; + break; + + case 1: + triggertype = "trigger_once"; + break; + + case 2: + triggertype = "trigger_use"; + break; + + case 3: + triggertype = "trigger_radius"; + break; + + case 4: + triggertype = "trigger_lookat"; + break; + + default: + assert( p == 5 ); + triggertype = "trigger_damage"; + break; + } + + triggers = getentarray( triggertype, "classname" ); + + for ( i = 0;i < triggers.size;i ++ ) + { + if( isdefined( triggers[ i ].script_prefab_exploder) ) + triggers[i].script_exploder = triggers[ i ].script_prefab_exploder; + + if( isdefined( triggers[ i ].script_exploder) ) + level thread maps\mp\_load::exploder_load( triggers[ i ] ); + } + } + + hurtTriggers = getentarray( "trigger_hurt", "classname" ); + + foreach ( hurtTrigger in hurtTriggers ) + { + hurtTrigger thread hurtPlayersThink(); + } + + thread maps\mp\_animatedmodels::main(); + + // auto-sentry + level.func[ "damagefeedback" ] = maps\mp\gametypes\_damagefeedback::updateDamageFeedback; + level.func[ "setTeamHeadIcon" ] = maps\mp\_entityheadicons::setTeamHeadIcon; + level.laserOn_func = ::laserOn; + level.laserOff_func = ::laserOff; + + // defaults + setDvar( "sm_sunShadowScale", 1 ); + setDvar( "r_specularcolorscale", 2.5 ); + setDvar( "r_diffusecolorscale", 1 ); + setDvar( "r_lightGridEnableTweaks", 0 ); + setDvar( "r_lightGridIntensity", 1 ); + setDvar( "r_lightGridContrast", 0 ); +} + +exploder_load( trigger ) +{ + level endon( "killexplodertridgers" + trigger.script_exploder ); + trigger waittill( "trigger" ); + if ( isdefined( trigger.script_chance ) && randomfloat( 1 ) > trigger.script_chance ) + { + if ( isdefined( trigger.script_delay ) ) + wait trigger.script_delay; + else + wait 4; + level thread exploder_load( trigger ); + return; + } + exploder( trigger.script_exploder ); + level notify( "killexplodertridgers" + trigger.script_exploder ); +} + + +setupExploders() +{ + // Hide exploder models. + ents = getentarray( "script_brushmodel", "classname" ); + smodels = getentarray( "script_model", "classname" ); + for ( i = 0;i < smodels.size;i ++ ) + ents[ ents.size ] = smodels[ i ]; + + for ( i = 0;i < ents.size;i ++ ) + { + if ( isdefined( ents[ i ].script_prefab_exploder ) ) + ents[ i ].script_exploder = ents[ i ].script_prefab_exploder; + + if ( isdefined( ents[ i ].script_exploder ) ) + { + if ( ( ents[ i ].model == "fx" ) && ( ( !isdefined( ents[ i ].targetname ) ) || ( ents[ i ].targetname != "exploderchunk" ) ) ) + ents[ i ] hide(); + else if ( ( isdefined( ents[ i ].targetname ) ) && ( ents[ i ].targetname == "exploder" ) ) + { + ents[ i ] hide(); + ents[ i ] notsolid(); + //if ( isdefined( ents[ i ].script_disconnectpaths ) ) + //ents[ i ] connectpaths(); + } + else if ( ( isdefined( ents[ i ].targetname ) ) && ( ents[ i ].targetname == "exploderchunk" ) ) + { + ents[ i ] hide(); + ents[ i ] notsolid(); + //if ( isdefined( ents[ i ].spawnflags ) && ( ents[ i ].spawnflags & 1 ) ) + //ents[ i ] connectpaths(); + } + } + } + + script_exploders = []; + + potentialExploders = getentarray( "script_brushmodel", "classname" ); + for ( i = 0;i < potentialExploders.size;i ++ ) + { + if ( isdefined( potentialExploders[ i ].script_prefab_exploder ) ) + potentialExploders[ i ].script_exploder = potentialExploders[ i ].script_prefab_exploder; + + if ( isdefined( potentialExploders[ i ].script_exploder ) ) + script_exploders[ script_exploders.size ] = potentialExploders[ i ]; + } + + potentialExploders = getentarray( "script_model", "classname" ); + for ( i = 0;i < potentialExploders.size;i ++ ) + { + if ( isdefined( potentialExploders[ i ].script_prefab_exploder ) ) + potentialExploders[ i ].script_exploder = potentialExploders[ i ].script_prefab_exploder; + + if ( isdefined( potentialExploders[ i ].script_exploder ) ) + script_exploders[ script_exploders.size ] = potentialExploders[ i ]; + } + + potentialExploders = getentarray( "item_health", "classname" ); + for ( i = 0;i < potentialExploders.size;i ++ ) + { + if ( isdefined( potentialExploders[ i ].script_prefab_exploder ) ) + potentialExploders[ i ].script_exploder = potentialExploders[ i ].script_prefab_exploder; + + if ( isdefined( potentialExploders[ i ].script_exploder ) ) + script_exploders[ script_exploders.size ] = potentialExploders[ i ]; + } + + if ( !isdefined( level.createFXent ) ) + level.createFXent = []; + + acceptableTargetnames = []; + acceptableTargetnames[ "exploderchunk visible" ] = true; + acceptableTargetnames[ "exploderchunk" ] = true; + acceptableTargetnames[ "exploder" ] = true; + + for ( i = 0; i < script_exploders.size; i ++ ) + { + exploder = script_exploders[ i ]; + ent = createExploder( exploder.script_fxid ); + ent.v = []; + ent.v[ "origin" ] = exploder.origin; + ent.v[ "angles" ] = exploder.angles; + ent.v[ "delay" ] = exploder.script_delay; + ent.v[ "firefx" ] = exploder.script_firefx; + ent.v[ "firefxdelay" ] = exploder.script_firefxdelay; + ent.v[ "firefxsound" ] = exploder.script_firefxsound; + ent.v[ "firefxtimeout" ] = exploder.script_firefxtimeout; + ent.v[ "earthquake" ] = exploder.script_earthquake; + ent.v[ "damage" ] = exploder.script_damage; + ent.v[ "damage_radius" ] = exploder.script_radius; + ent.v[ "soundalias" ] = exploder.script_soundalias; + ent.v[ "repeat" ] = exploder.script_repeat; + ent.v[ "delay_min" ] = exploder.script_delay_min; + ent.v[ "delay_max" ] = exploder.script_delay_max; + ent.v[ "target" ] = exploder.target; + ent.v[ "ender" ] = exploder.script_ender; + ent.v[ "type" ] = "exploder"; +// ent.v[ "worldfx" ] = true; + if ( !isdefined( exploder.script_fxid ) ) + ent.v[ "fxid" ] = "No FX"; + else + ent.v[ "fxid" ] = exploder.script_fxid; + ent.v[ "exploder" ] = exploder.script_exploder; + assertEx( isdefined( exploder.script_exploder ), "Exploder at origin " + exploder.origin + " has no script_exploder" ); + + if ( !isdefined( ent.v[ "delay" ] ) ) + ent.v[ "delay" ] = 0; + + if ( isdefined( exploder.target ) ) + { + org = getent( ent.v[ "target" ], "targetname" ).origin; + ent.v[ "angles" ] = vectortoangles( org - ent.v[ "origin" ] ); +// forward = anglestoforward( angles ); +// up = anglestoup( angles ); + } + + // this basically determines if its a brush / model exploder or not + if ( exploder.classname == "script_brushmodel" || isdefined( exploder.model ) ) + { + ent.model = exploder; + ent.model.disconnect_paths = exploder.script_disconnectpaths; + } + + if ( isdefined( exploder.targetname ) && isdefined( acceptableTargetnames[ exploder.targetname ] ) ) + ent.v[ "exploder_type" ] = exploder.targetname; + else + ent.v[ "exploder_type" ] = "normal"; + + ent common_scripts\_createfx::post_entity_creation_function(); + } +} + +lanterns() +{ + if (!isdefined(level._effect["lantern_light"])) + level._effect["lantern_light"] = loadfx("props/glow_latern"); + + loopfx("lantern_light", self.origin, 0.3, self.origin + (0,0,1)); +} + + +hurtPlayersThink() +{ + level endon ( "game_ended" ); + + wait ( randomFloat( 1.0 ) ); + + for ( ;; ) + { + foreach ( player in level.players ) + { + if ( player isTouching( self ) && isReallyAlive( player ) ) + player _suicide(); + } + + wait ( 0.5 ); + } +} diff --git a/Admin/m2demo/settings/main.gsc b/Admin/m2demo/settings/main.gsc new file mode 100644 index 000000000..557451d8c --- /dev/null +++ b/Admin/m2demo/settings/main.gsc @@ -0,0 +1,11 @@ +LoadSettings() +{ + + AdminSettings = []; + + AdminSettings["Balance"] = true; + + AdminSettings["dvar_prefix"] = "admin"; + + return AdminSettings; +} diff --git a/Admin/version.txt b/Admin/version.txt index a803ba7b4..3583e2004 100644 --- a/Admin/version.txt +++ b/Admin/version.txt @@ -18,4 +18,5 @@ CHANGELOG: -fixed rare crash with toadmins backend -fixed crash when finding player stats that don't exist -fixed a bug that caused owner command to reactivate only `creator` rank player existed --fixed a bug that caused certain notifications to be sent to all players \ No newline at end of file +-fixed a bug that caused certain notifications to be sent to all players +-various small fixes \ No newline at end of file