From d736c3a8ff6ff213bbcdeb76217e9fed7310cd38 Mon Sep 17 00:00:00 2001 From: ChocoTaco Date: Wed, 7 May 2025 20:30:56 -0400 Subject: [PATCH 1/8] Add LCTF --- Classic/scripts/autoexec/ObserveFlag.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Classic/scripts/autoexec/ObserveFlag.cs b/Classic/scripts/autoexec/ObserveFlag.cs index 9d53409..9f9d353 100644 --- a/Classic/scripts/autoexec/ObserveFlag.cs +++ b/Classic/scripts/autoexec/ObserveFlag.cs @@ -142,7 +142,7 @@ if (!isActivePackage(PizzaThings)) function serverCmdObserveFirstFlag(%client) { - if(Game.class !$= CTFGame && Game.class !$= SCtFGame) + if(Game.class !$= CTFGame && Game.class !$= SCtFGame && Game.class !$= LCTFGame ) return; // client must be an observer @@ -160,7 +160,7 @@ function serverCmdObserveFirstFlag(%client) function serverCmdObserveSecondFlag(%client) { - if(Game.class !$= CTFGame && Game.class !$= SCtFGame) + if(Game.class !$= CTFGame && Game.class !$= SCtFGame && Game.class !$= LCTFGame ) return; // client must be an observer @@ -184,7 +184,7 @@ function observeFlag(%client, %target, %type, %flagTeam) if(!isObject(%client) || !isObject(%target) || !isObject(%client.camera)) return; - if(Game.class !$= CTFGame && Game.class !$= SCtFGame) + if(Game.class !$= CTFGame && Game.class !$= SCtFGame && Game.class !$= LCTFGame ) return; if(%client.team > 0) From d21c5060c575d465abda7e2dcca7f31bfc42ee1c Mon Sep 17 00:00:00 2001 From: ChocoTaco Date: Wed, 14 May 2025 14:42:52 -0400 Subject: [PATCH 2/8] Oops --- Classic/scripts/autoexec/z_dtStats.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/Classic/scripts/autoexec/z_dtStats.cs b/Classic/scripts/autoexec/z_dtStats.cs index 5757627..448a3b0 100644 --- a/Classic/scripts/autoexec/z_dtStats.cs +++ b/Classic/scripts/autoexec/z_dtStats.cs @@ -13383,7 +13383,6 @@ function dtPingStats(){ %cl.dtStats.stat["idleTime"] += ($dtStats::prefTestTime/1000)/60; if(!%cl.isAIControlled()){ %ping = %cl.getPing(); - %cl.lastPing = %ping; %cl.pingTotal += %ping; %cl.pingCount++; %cl.dtStats.stat["pingAvg"] = %cl.pingTotal / %cl.pingCount; From 37f30b8654754b85f1a6fbfaaf69ac0d5bc9d24e Mon Sep 17 00:00:00 2001 From: ChocoTaco Date: Wed, 14 May 2025 14:43:42 -0400 Subject: [PATCH 3/8] Full sweep --- Classic/scripts/autoexec/flagTunnelingFix.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Classic/scripts/autoexec/flagTunnelingFix.cs b/Classic/scripts/autoexec/flagTunnelingFix.cs index a7a6e35..3761a01 100644 --- a/Classic/scripts/autoexec/flagTunnelingFix.cs +++ b/Classic/scripts/autoexec/flagTunnelingFix.cs @@ -279,7 +279,7 @@ function DefaultGame::flagColTest(%game, %flag, %rsTeam, %ext){ if(%player.lastSim > 0 && (%player.getState() !$= "Dead")){// only check at speed //%fdot = vectorDot(vectorNormalize(%player.getVelocity()),vectorNormalize(VectorSub(%flagPos, %playerPos))); // %tickDist = vectorLen(%player.getVelocity()) * ($flagSimTime/1000); - %sweepCount = mFloor(vectorDist(%playerPos, %player.oldPos) + 1.5); + %sweepCount = mFloor(vectorDist(%playerPos, %player.oldPos) + 2); if((getSimTime() - %player.lastSim) <= 128){//make sure are last position is valid //schedule(1000,0,"drawBeamItem", %player.oldPos,%playerPos,15000); for(%i = 0; %i < %sweepCount; %i++){// sweep behind us to see if we should have hit something From 8297f5e5b660bb8886668a77a397e79c6d1fab77 Mon Sep 17 00:00:00 2001 From: ChocoTaco Date: Wed, 14 May 2025 14:48:00 -0400 Subject: [PATCH 4/8] Added OuterWildsLT --- Classic/prefs/MapRotation.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Classic/prefs/MapRotation.cs b/Classic/prefs/MapRotation.cs index 83cd9cd..3bb80e2 100644 --- a/Classic/prefs/MapRotation.cs +++ b/Classic/prefs/MapRotation.cs @@ -525,7 +525,7 @@ addRotationMap("Bridgepoint", "LCTF",1,1,-1,14); addRotationMap("NarcolepsyLT", "LCTF",1,1,-1,14); addRotationMap("WhiteDwarfDeluxeLT", "LCTF",1,0,-1,14); addRotationMap("ClusterUnFuct", "LCTF",1,1,8,-1); -addRotationMap("OuterWilds", "LCTF",1,1,-1,12); +addRotationMap("OuterWildsLT", "LCTF",1,1,-1,12); addRotationMap("Drafts", "LCTF",1,1,-1,12); addRotationMap("DermCrossingDeluxeLT", "LCTF",1,1,-1,-1); addRotationMap("SuperiorWaterworks", "LCTF",1,0,-1,12); From fae87aa449dcaaab13681929b39fe76101d6f1f4 Mon Sep 17 00:00:00 2001 From: ChocoTaco Date: Wed, 14 May 2025 14:50:46 -0400 Subject: [PATCH 5/8] LCTF Things --- Classic/scripts/LCTFGame.cs | 111 ++++++++++++++++++++++++++++++++++-- 1 file changed, 105 insertions(+), 6 deletions(-) diff --git a/Classic/scripts/LCTFGame.cs b/Classic/scripts/LCTFGame.cs index 075786a..c9754c3 100644 --- a/Classic/scripts/LCTFGame.cs +++ b/Classic/scripts/LCTFGame.cs @@ -23,6 +23,15 @@ exec("scripts/aiLCTF.cs"); //exec the prefs //exec("prefs/LCTFPrefs.cs"); +//Time for auto overtime sudden-death mode +$LCTF::Overtime = 5; //5 Minutes, 0 to disable +//Damage scales for Chaingun and Grenade Launcher +//1 = 100%, 0.85 = 85%, 0 = OFF, etc +$LCTF::CGDamageScale = "0"; +$LCTF::GLDamageScale = "0"; +//Ban Mines +$LCTF::BanMines = 0; + function setArmorDefaults(%armor) { switch$ ( %armor ) @@ -57,7 +66,7 @@ function setArmorDefaults(%armor) $InvBanList[LCTF, "Mortar"] = 1; $InvBanList[LCTF, "SniperRifle"] = 1; // Misc - $InvBanList[LCTF, "Mine"] = 0; + $InvBanList[LCTF, "Mine"] = $LCTF::BanMines; $InvBanList[LCTF, "ConcussionGrenade"] = 0; $InvBanList[LCTF, "CameraGrenade"] = 1; $InvBanList[LCTF, "FlareGrenade"] = 1; @@ -368,7 +377,22 @@ package LCTFGame //Take out anything vehicle related function Armor::damageObject(%data, %targetObject, %sourceObject, %position, %amount, %damageType, %momVec, %mineSC) { - //error("Armor::damageObject( "@%data@", "@%targetObject@", "@%sourceObject@", "@%position@", "@%amount@", "@%damageType@", "@%momVec@" )"); + //CG and GL Damage Scales + if($LCTF::CGDamageScale){ + if(Game.class $= "LCTFGame" && %damageType $= $DamageType::Bullet){ + %amount *= $LCTF::CGDamageScale; + } + } + if($LCTF::GLDamageScale){ + if(isObject($LCTFLastExploded)){ + %name = $LCTFLastExploded.getName();// find what what exploded last + if(Game.class $= "LCTFGame" && %name $= "BasicGrenade"){// BasicGrenade is the nade launcher + %amount *= $LCTF::GLDamageScale; + } + } + } + + //error("Armor::damageObject( "@%data@", "@%targetObject@", "@%sourceObject@", "@%position@", "@%amount@", "@%damageType@", "@%momVec@" )"); if(%targetObject.invincible || %targetObject.getState() $= "Dead") return; @@ -474,6 +498,12 @@ package LCTFGame playPain( %targetObject ); } } + + //Needed for Grenade Launcher type detection + function ProjectileData::onExplode(%data, %proj, %pos, %mod){ + $LCTFLastExploded = %data;// record what exploded + parent::onExplode(%data, %proj, %pos, %mod); + } }; ///////////////////////////////////////////////////////////////////////////////////////// @@ -672,8 +702,8 @@ function LCTFGame::playerTouchFlag(%game, %player, %flag) if ((%flag.carrier $= "") && (%player.getState() !$= "Dead")) { // z0dd - ZOD, 5/07/04. Cancel the lava return. - if(isEventPending(%obj.lavaEnterThread)) - cancel(%obj.lavaEnterThread); + if(isEventPending(%flag.lavaEnterThread)) + cancel(%flag.lavaEnterThread); //flag isn't held and has been touched by a live player if (%client.team == %flag.team) @@ -683,6 +713,12 @@ function LCTFGame::playerTouchFlag(%game, %player, %flag) } // toggle visibility of the flag setTargetRenderMask(%flag.waypoint.getTarget(), %flag.isHome ? 0 : 1); + + if( %player > 0 ) + { + %player.setInvincibleMode(0 ,0.00); + %player.setInvincible( false ); // fire your weapon and your invincibility goes away. + } } function LCTFGame::playerTouchOwnFlag(%game, %player, %flag) @@ -1511,14 +1547,77 @@ function LCTFGame::resetDontScoreTimer(%game, %team) $dontScoreTimer[%team] = false; } +function LCTFGame::checkTimeLimit(%game, %forced) +{ + // Don't add extra checks: + if ( %forced ) + cancel( %game.timeCheck ); + + // if there is no time limit, check back in a minute to see if it's been set + if(($Host::TimeLimit $= "") || $Host::TimeLimit == 0) + { + %game.timeCheck = %game.schedule(20000, "checkTimeLimit"); + return; + } + + %curTimeLeftMS = ($Host::TimeLimit * 60 * 1000) + $missionStartTime - getSimTime(); + + if (%curTimeLeftMS <= 0) + { + %teamOneCaps = mFloor($TeamScore[1] / %game.SCORE_PER_TEAM_FLAG_CAP); + %teamTwoCaps = mFloor($TeamScore[2] / %game.SCORE_PER_TEAM_FLAG_CAP); + if(%teamOneCaps == %teamTwoCaps && $LCTF::Overtime && $Host::TournamentMode){ //Setting exists + if(!%game.overtime){ + %game.overtime = 1; + if($LCTF::Overtime > 1){ %s = "s"; } + messageAll('MsgOvertime', '\c2Sudden-Death Overtime Initiated: %1 Minute%2 Remaining~wfx/powered/turret_heavy_activate.wav', $LCTF::Overtime, %s); + echo("Sudden-Death Overtime Initiated"); + UpdateClientTimes($LCTF::Overtime * 60 * 1000); + EndCountdown($LCTF::Overtime * 60 * 1000); + %game.timeCheck = %game.schedule($LCTF::Overtime * 60 * 1000, "timeLimitReached"); + } + } + else{ + if(%game.scheduleVote !$= ""){ + if(!%game.voteOT){ + messageAll('MsgOvertime', '\c2Vote Overtime Initiated.~wfx/powered/turret_heavy_activate.wav'); + %game.voteOT = 1; + } + } + else{ + %game.timeLimitReached(); + } + } + } + else + { + if(%curTimeLeftMS >= 20000) + %game.timeCheck = %game.schedule(20000, "checkTimeLimit"); + else + %game.timeCheck = %game.schedule(%curTimeLeftMS + 1, "checkTimeLimit"); + + //now synchronize everyone's clock + messageAll('MsgSystemClock', "", $Host::TimeLimit, %curTimeLeftMS); + } +} + function LCTFGame::checkScoreLimit(%game, %team) { %scoreLimit = MissionGroup.CTF_scoreLimit * %game.SCORE_PER_TEAM_FLAG_CAP; // default of 5 if scoreLimit not defined if(%scoreLimit $= "") %scoreLimit = 5 * %game.SCORE_PER_TEAM_FLAG_CAP; - if($TeamScore[%team] >= %scoreLimit) - %game.scoreLimitReached(); + if(%game.overtime){ + %teamOneCaps = mFloor($TeamScore[1] / %game.SCORE_PER_TEAM_FLAG_CAP); + %teamTwoCaps = mFloor($TeamScore[2] / %game.SCORE_PER_TEAM_FLAG_CAP); + if(%teamOneCaps != %teamTwoCaps){ + %game.scoreLimitReached(); + } + } + else{ + if($TeamScore[%team] >= %scoreLimit) + %game.scoreLimitReached(); + } } function LCTFGame::awardScoreFlagReturn(%game, %cl, %perc) From d1131f76b347b94c3613a58019d9a5e051ebdaf5 Mon Sep 17 00:00:00 2001 From: ChocoTaco Date: Wed, 14 May 2025 14:51:15 -0400 Subject: [PATCH 6/8] Numerous fixes --- Classic/scripts/autoexec/VoteMenu.cs | 45 ++++++++++++---------------- 1 file changed, 19 insertions(+), 26 deletions(-) diff --git a/Classic/scripts/autoexec/VoteMenu.cs b/Classic/scripts/autoexec/VoteMenu.cs index f8beadb..27bc536 100644 --- a/Classic/scripts/autoexec/VoteMenu.cs +++ b/Classic/scripts/autoexec/VoteMenu.cs @@ -486,19 +486,8 @@ function serverCmdStartNewVote(%client, %typeName, %arg1, %arg2, %arg3, %arg4, % } else //is an admin { - if($Host::TournamentMode) //Admins still have the option to set the time to 30 minutes in Tourney Mode - { - if(%arg1 !$= "30") //30 minutes only - { - messageClient(%client, "", "\c2Invalid time selection."); - return; - } - } - else - { - messageClient(%client, "", "\c2Invalid time selection."); - return; - } + messageClient(%client, "", "\c2Invalid time selection."); + return; } } @@ -834,21 +823,21 @@ function serverCmdStartNewVote(%client, %typeName, %arg1, %arg2, %arg3, %arg4, % // LakRabbit Stuff case "VoteDuelMode": - if(!$CurrentMissionType $= "LakRabbit") + if($CurrentMissionType !$= "LakRabbit") return; if(!%isAdmin || (%isAdmin && %client.ForceVote)) %msg = %client.nameBase @ " initiated a vote to " @ (Game.duelMode == 0 ? "enable" : "disable") @ " duel mode."; case "VoteSplashDamage": - if(!$CurrentMissionType $= "LakRabbit") + if($CurrentMissionType !$= "LakRabbit") return; if(!%isAdmin || (%isAdmin && %client.ForceVote)) %msg = %client.nameBase @ " initiated a vote to " @ (Game.noSplashDamage == 1 ? "enable" : "disable") @ " splash damage."; case "VotePro": - if(!$CurrentMissionType $= "LakRabbit") + if($CurrentMissionType !$= "LakRabbit") return; if(!%isAdmin || (%isAdmin && %client.ForceVote)) @@ -856,7 +845,7 @@ function serverCmdStartNewVote(%client, %typeName, %arg1, %arg2, %arg3, %arg4, % //Deathmatch Stuff case "DMSLOnlyMode": - if(!$CurrentMissionType $= "DM") + if($CurrentMissionType !$= "DM") return; if(!%isAdmin || (%isAdmin && %client.ForceVote)) @@ -864,18 +853,21 @@ function serverCmdStartNewVote(%client, %typeName, %arg1, %arg2, %arg3, %arg4, % //LCTF Stuff case "LCTFProMode": - if(!$CurrentMissionType $= "LCTF") + if($CurrentMissionType !$= "LCTF") return; if(!%isAdmin || (%isAdmin && %client.ForceVote)) %msg = %client.nameBase @ " initiated a vote to " @ (Game.LCTFProMode == 0 ? "enable" : "disable") @ " pro mode."; case "LCTFOneMine": - if(!$CurrentMissionType $= "LCTF") - return; + if($CurrentMissionType !$= "LCTF") + return; - if(!%isAdmin || (%isAdmin && %client.ForceVote)) - %msg = %client.nameBase @ " initiated a vote to " @ (Game.LCTFOneMine == 0 ? "enable" : "disable") @ " one mine mode."; + if($InvBanList[LCTF, "Mine"]) + messageClient(%client, "", "\c2Mines are disabled at this time."); + + if(!%isAdmin || (%isAdmin && %client.ForceVote)) + %msg = %client.nameBase @ " initiated a vote to " @ (Game.LCTFOneMine == 0 ? "enable" : "disable") @ " one mine mode."; case "showServerRules": if (($Host::ServerRules[1] !$= "") && (!%client.CantView)) @@ -1220,7 +1212,8 @@ function DefaultGame::voteChangeTimeLimit( %game, %admin, %newLimit ) { messageAll( 'MsgAdminForce', '\c2The Admin %2 changed the mission time limit to %1 minutes.', %display, %admin.name ); $Host::TimeLimit = %newLimit; - adminLog(%admin, " has changed the mission time limit to " @ %display @ " minutes."); + adminLog(%admin, " has changed the mission time limit to " @ %display @ " minutes."); + $TimeLimitChanged = 1; } else { @@ -1230,9 +1223,9 @@ function DefaultGame::voteChangeTimeLimit( %game, %admin, %newLimit ) { messageAll('MsgVotePassed', '\c2The mission time limit was set to %1 minutes by vote.', %display); $Host::TimeLimit = %newLimit; - // VoteOvertime - ResetVOTimeChanged(%game); - // Reset the voted time limit when changing mission + // VoteOvertime + ResetVOTimeChanged(%game); + // Reset the voted time limit when changing mission $TimeLimitChanged = 1; //Log Vote % From 3a1a6beaf63c297d1b0502807f99bf4e992d7811 Mon Sep 17 00:00:00 2001 From: ChocoTaco Date: Wed, 14 May 2025 14:51:26 -0400 Subject: [PATCH 7/8] Added Overtime --- Classic/scripts/CTFGame.cs | 73 +++++++++++++++++++++++++++++++++++--- 1 file changed, 69 insertions(+), 4 deletions(-) diff --git a/Classic/scripts/CTFGame.cs b/Classic/scripts/CTFGame.cs index 95373d2..e26cda5 100755 --- a/Classic/scripts/CTFGame.cs +++ b/Classic/scripts/CTFGame.cs @@ -9,6 +9,8 @@ //exec the AI scripts exec("scripts/aiCTF.cs"); +//Time for auto overtime sudden-death mode +$CTF::Overtime = 5; //5 Minutes, 0 to disable //-- tracking --- function CTFGame::initGameVars(%game) @@ -376,8 +378,8 @@ function CTFGame::playerTouchFlag(%game, %player, %flag) if ((%flag.carrier $= "") && (%player.getState() !$= "Dead")) { // z0dd - ZOD, 5/07/04. Cancel the lava return. - if(isEventPending(%obj.lavaEnterThread)) - cancel(%obj.lavaEnterThread); + if(isEventPending(%flag.lavaEnterThread)) + cancel(%flag.lavaEnterThread); //flag isn't held and has been touched by a live player if (%client.team == %flag.team) @@ -1245,14 +1247,77 @@ function CTFGame::resetDontScoreTimer(%game, %team) $dontScoreTimer[%team] = false; } +function CTFGame::checkTimeLimit(%game, %forced) +{ + // Don't add extra checks: + if ( %forced ) + cancel( %game.timeCheck ); + + // if there is no time limit, check back in a minute to see if it's been set + if(($Host::TimeLimit $= "") || $Host::TimeLimit == 0) + { + %game.timeCheck = %game.schedule(20000, "checkTimeLimit"); + return; + } + + %curTimeLeftMS = ($Host::TimeLimit * 60 * 1000) + $missionStartTime - getSimTime(); + + if (%curTimeLeftMS <= 0) + { + %teamOneCaps = mFloor($TeamScore[1] / %game.SCORE_PER_TEAM_FLAG_CAP); + %teamTwoCaps = mFloor($TeamScore[2] / %game.SCORE_PER_TEAM_FLAG_CAP); + if(%teamOneCaps == %teamTwoCaps && $CTF::Overtime && $Host::TournamentMode){ //Setting exists + if(!%game.overtime){ + %game.overtime = 1; + if($CTF::Overtime > 1){ %s = "s"; } + messageAll('MsgOvertime', '\c2Sudden-Death Overtime Initiated: %1 Minute%2 Remaining~wfx/powered/turret_heavy_activate.wav', $CTF::Overtime, %s); + echo("Sudden-Death Overtime Initiated"); + UpdateClientTimes($CTF::Overtime * 60 * 1000); + EndCountdown($CTF::Overtime * 60 * 1000); + %game.timeCheck = %game.schedule($CTF::Overtime * 60 * 1000, "timeLimitReached"); + } + } + else{ + if(%game.scheduleVote !$= ""){ + if(!%game.voteOT){ + messageAll('MsgOvertime', '\c2Vote Overtime Initiated.~wfx/powered/turret_heavy_activate.wav'); + %game.voteOT = 1; + } + } + else{ + %game.timeLimitReached(); + } + } + } + else + { + if(%curTimeLeftMS >= 20000) + %game.timeCheck = %game.schedule(20000, "checkTimeLimit"); + else + %game.timeCheck = %game.schedule(%curTimeLeftMS + 1, "checkTimeLimit"); + + //now synchronize everyone's clock + messageAll('MsgSystemClock', "", $Host::TimeLimit, %curTimeLeftMS); + } +} + function CTFGame::checkScoreLimit(%game, %team) { %scoreLimit = MissionGroup.CTF_scoreLimit * %game.SCORE_PER_TEAM_FLAG_CAP; // default of 5 if scoreLimit not defined if(%scoreLimit $= "") %scoreLimit = 5 * %game.SCORE_PER_TEAM_FLAG_CAP; - if($TeamScore[%team] >= %scoreLimit) - %game.scoreLimitReached(); + if(%game.overtime){ + %teamOneCaps = mFloor($TeamScore[1] / %game.SCORE_PER_TEAM_FLAG_CAP); + %teamTwoCaps = mFloor($TeamScore[2] / %game.SCORE_PER_TEAM_FLAG_CAP); + if(%teamOneCaps != %teamTwoCaps){ + %game.scoreLimitReached(); + } + } + else{ + if($TeamScore[%team] >= %scoreLimit) + %game.scoreLimitReached(); + } } function CTFGame::awardScoreFlagReturn(%game, %cl, %perc) From 9ba847500eb75fa66b1d87ac202cc87384717f8e Mon Sep 17 00:00:00 2001 From: ChocoTaco Date: Wed, 14 May 2025 14:51:48 -0400 Subject: [PATCH 8/8] Fixed lava bug --- Classic/scripts/SCtFGame.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Classic/scripts/SCtFGame.cs b/Classic/scripts/SCtFGame.cs index 4a3a74e..00e6b85 100644 --- a/Classic/scripts/SCtFGame.cs +++ b/Classic/scripts/SCtFGame.cs @@ -427,8 +427,8 @@ function SCtFGame::playerTouchFlag(%game, %player, %flag) if ((%flag.carrier $= "") && (%player.getState() !$= "Dead")) { // z0dd - ZOD, 5/07/04. Cancel the lava return. - if(isEventPending(%obj.lavaEnterThread)) - cancel(%obj.lavaEnterThread); + if(isEventPending(%flag.lavaEnterThread)) + cancel(%flag.lavaEnterThread); //flag isn't held and has been touched by a live player if (%client.team == %flag.team)