From 48dddeb526279210b6f234eef6a769011071bba1 Mon Sep 17 00:00:00 2001 From: ChocoTaco Date: Sat, 26 Apr 2025 19:29:09 -0400 Subject: [PATCH 01/37] Prefs changes (OneMine) --- Classic/prefs/serverPrefs.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/Classic/prefs/serverPrefs.cs b/Classic/prefs/serverPrefs.cs index d3a0a4c..4374ddd 100644 --- a/Classic/prefs/serverPrefs.cs +++ b/Classic/prefs/serverPrefs.cs @@ -115,6 +115,7 @@ $Host::LakRabbitShowFlagIcon = 1; $Host::LakRabbitShowFlagTask = 0; $Host::LakRabbitUnlimitedDJ = 1; $Host::LCTFProMode = 0; +$Host::LCTFOneMine = 0; $Host::LoadingScreenUseDebrief = 1; $Host::LoadScreenColor1 = "05edad"; $Host::LoadScreenColor2 = "29DEE7"; From 5f323ddb27dfeaef149d183e830ea4ad5e1c2ad7 Mon Sep 17 00:00:00 2001 From: ChocoTaco Date: Mon, 28 Apr 2025 12:40:12 -0400 Subject: [PATCH 02/37] On by default --- Classic/scripts/autoexec/MemPatches.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Classic/scripts/autoexec/MemPatches.cs b/Classic/scripts/autoexec/MemPatches.cs index ea21e3f..ff9b7eb 100644 --- a/Classic/scripts/autoexec/MemPatches.cs +++ b/Classic/scripts/autoexec/MemPatches.cs @@ -51,9 +51,9 @@ function serverCmd(%client) //Disable UE box on crash //Used if a clean crash is desired -//memPatch("7dc7fc","90"); +memPatch("7dc7fc","90"); //Loops Crash patch (Prevent the Uncaught Exception dialog from appearing) -//memPatch("006ff376", "909090909090"); +memPatch("006ff376", "909090909090"); //Show Linux Icon in server list //memPatch("5C9628","80CB05"); From bac741baf676f2fd37db5d6b8f4038b9b8a513ed Mon Sep 17 00:00:00 2001 From: ChocoTaco Date: Sat, 3 May 2025 01:42:22 -0400 Subject: [PATCH 03/37] LCTF Things --- Classic/scripts/LCTFGame.cs | 91 +++++++++---------- .../scripts/autoexec/MissionTypeOptions.cs | 7 +- 2 files changed, 50 insertions(+), 48 deletions(-) diff --git a/Classic/scripts/LCTFGame.cs b/Classic/scripts/LCTFGame.cs index 3d25335..075786a 100644 --- a/Classic/scripts/LCTFGame.cs +++ b/Classic/scripts/LCTFGame.cs @@ -132,7 +132,7 @@ function LCTFGame::initGameVars(%game) %game.SCORE_PER_REPAIR_DEP_TUR = 3; %game.SCORE_PER_REPAIR_DEP_INV = 2; - %game.FLAG_RETURN_DELAY = 45 * 1000; + %game.FLAG_RETURN_DELAY = 25 * 1000; %game.TIME_CONSIDERED_FLAGCARRIER_THREAT = 3 * 1000; %game.RADIUS_GEN_DEFENSE = 20; @@ -2521,61 +2521,58 @@ function Player::maxInventory(%this, %data){ function LCTFGame::LCTFOneMine(%game, %admin, %arg1, %arg2, %arg3, %arg4) { - if( $countdownStarted && $MatchStarted ) - { - if(%admin) - { - killeveryone(); + if(%admin) + { + killeveryone(); - if($Host::LCTFOneMine) - { - messageAll('MsgAdminForce', '\c2The Admin has disabled One Mine Inventory.'); + if($Host::LCTFOneMine) + { + messageAll('MsgAdminForce', '\c2The Admin has disabled One Mine Inventory.'); + + if (isActivePackage(LCTFOneMine)) + deactivatePackage(LCTFOneMine); + + $Host::LCTFOneMine = false; + } + else + { + messageAll('MsgAdminForce', '\c2The Admin has enabled One Mine Inventory.'); + + if (!isActivePackage(LCTFOneMine)) + activatePackage(LCTFOneMine); + + $Host::LCTFOneMine = true; + } + } + else + { + %totalVotes = %game.totalVotesFor + %game.totalVotesAgainst; + if(%totalVotes > 0 && (%game.totalVotesFor / ClientGroup.getCount()) > ($Host::VotePasspercent / 100)) + { + killeveryone(); + + if($Host::LCTFOneMine) + { + messageAll('MsgVotePassed', '\c2One Mine Inventory Disabled.'); if (isActivePackage(LCTFOneMine)) deactivatePackage(LCTFOneMine); - $Host::LCTFOneMine = false; - } - else - { - messageAll('MsgAdminForce', '\c2The Admin has enabled One Mine Inventory.'); + $Host::LCTFOneMine = false; + } + else + { + messageAll('MsgVotePassed', '\c2One Mine Inventory Enabled.'); if (!isActivePackage(LCTFOneMine)) activatePackage(LCTFOneMine); - $Host::LCTFOneMine = true; - } - } - else - { - %totalVotes = %game.totalVotesFor + %game.totalVotesAgainst; - if(%totalVotes > 0 && (%game.totalVotesFor / ClientGroup.getCount()) > ($Host::VotePasspercent / 100)) - { - killeveryone(); - - if($Host::LCTFOneMine) - { - messageAll('MsgVotePassed', '\c2One Mine Inventory Disabled.'); - - if (isActivePackage(LCTFOneMine)) - deactivatePackage(LCTFOneMine); - - $Host::LCTFOneMine = false; - } - else - { - messageAll('MsgVotePassed', '\c2One Mine Inventory Enabled.'); - - if (!isActivePackage(LCTFOneMine)) - activatePackage(LCTFOneMine); - - $Host::LCTFOneMine = true; - } - } - else - messageAll('MsgVoteFailed', '\c2Mode change did not pass: %1 percent.', mFloor(%game.totalVotesFor/ClientGroup.getCount() * 100)); - } - } + $Host::LCTFOneMine = true; + } + } + else + messageAll('MsgVoteFailed', '\c2Mode change did not pass: %1 percent.', mFloor(%game.totalVotesFor/ClientGroup.getCount() * 100)); + } } // For voting to work properly - evo admin.ovl diff --git a/Classic/scripts/autoexec/MissionTypeOptions.cs b/Classic/scripts/autoexec/MissionTypeOptions.cs index fcf176d..4cc0454 100644 --- a/Classic/scripts/autoexec/MissionTypeOptions.cs +++ b/Classic/scripts/autoexec/MissionTypeOptions.cs @@ -44,7 +44,12 @@ function loadMissionStage2() //Tournament Mode specifics if($Host::TournamentMode) - $Host::TimeLimit = 30; //TimeLimit Always 30 minutes in Tourney Mode + { + if(!$CurrentMissionType $= "LCTF") + $Host::TimeLimit = 30; //TimeLimit Always 30 minutes in Tourney Mode + else //LCTF 20 Minutes + $Host::TimeLimit = 20; //TimeLimit Always 20 minutes in LCTF Tourney Mode + } else { //Disable if active From 62c0dffc0dc927435e61c364818679c3ead371d4 Mon Sep 17 00:00:00 2001 From: ChocoTaco Date: Sun, 4 May 2025 12:56:48 -0400 Subject: [PATCH 04/37] Update flagTunnelingFix.cs Removed Spaces --- Classic/scripts/autoexec/flagTunnelingFix.cs | 168 +++++++++---------- 1 file changed, 84 insertions(+), 84 deletions(-) diff --git a/Classic/scripts/autoexec/flagTunnelingFix.cs b/Classic/scripts/autoexec/flagTunnelingFix.cs index e8fa9ec..6d669f6 100644 --- a/Classic/scripts/autoexec/flagTunnelingFix.cs +++ b/Classic/scripts/autoexec/flagTunnelingFix.cs @@ -1,39 +1,39 @@ -//Fixes for collision tunneling and other issues, note only tested in classic +//Fixes for collision tunneling and other issues, note only tested in classic //Script By:DarkTiger //v3.7 - removed bypass code //v3.6 - lctf and SCtFGame //v3.5 - tweaks -//v3.4 - switch over to using SAT/OBB for hitbox detection accuracy, also heavy optimizations becuase of this change +//v3.4 - switch over to using SAT/OBB for hitbox detection accuracy, also heavy optimizations becuase of this change //v3.3 - fixed ceiling deadstoping,fixed wall and ceiling tunneling $antiObjTunnel //V3.2 - script refactor, removed flag sim in favor of just an offset on toss - -$ftEnable = 1;//disables all + +$ftEnable = 1;//disables all $limitFlagCalls = 1; // prevents frame perfect events witch can cause bad outcomes $antiCeiling = 1; // note this is auto enabled with $boxStuckFix as it needs to check for this $antiObjTunnel = 0;//prevents terrain and interior tunneling more thigns can be added see first part of DefaultGame::flagColTest $antiFlagImpluse = 1000;//time out period to prevent explosions from effecting flags on drop/toss -$boxStuckFix = 1;// enables flag offset, spawns the flag outside of the player to keep it from getting stuck -$flagOffset = 1;// how far to offset the flag 1m seems like it works 90% of the time +$boxStuckFix = 1;// enables flag offset, spawns the flag outside of the player to keep it from getting stuck +$flagOffset = 1;// how far to offset the flag 1m seems like it works 90% of the time // adds initial update to setVelocity and setTransform to updates its parameters across clients -//enable $flagResetTime with setting it to 5000 if you disable a mempatch - -//expermental flag static fix +//enable $flagResetTime with setting it to 5000 if you disable a mempatch + +//expermental flag static fix //memPatch("60456c","11000018");//transform memPatch("6040ff","01"); //setVelocity -$flagResetTime = 0;// 1000-5000 if you want this feature enabled, resets flag to stand in case of desync should not be needed +$flagResetTime = 0;// 1000-5000 if you want this feature enabled, resets flag to stand in case of desync should not be needed -//best to leave these values alone unless you understand what the code is doing -$flagSimTime = 64;//note a higher the time, the larger the sweep scans will be -$flagCheckRadius = 50; +//best to leave these values alone unless you understand what the code is doing +$flagSimTime = 64;//note a higher the time, the larger the sweep scans will be +$flagCheckRadius = 50; $playerSizeBox = "1.2 1.2 2.3"; $flagBoxSize = "0.796666 0.139717 2.46029"; //0 = old AABB method uses fixed box size makes the player bit narrow //1 = new OBB method uses perfect box intersection -//2 = AABB method but uses boundbox can make the player larger then it is given there direction -//3 = AABB fixed sizes uses $playerSizeBox and $flagBoxSize to do the box checking +//2 = AABB method but uses boundbox can make the player larger then it is given there direction +//3 = AABB fixed sizes uses $playerSizeBox and $flagBoxSize to do the box checking $boxCollision = 1;// off is the old AABB method aka the old method package flagFix{ @@ -41,28 +41,28 @@ package flagFix{ parent::throwObject(%this,%obj); %data = %obj.getDatablock(); if($ftEnable && %data.getName() $= "Flag"){ - %tpos = %obj.getTransform(); - %fpos = getWords(%tpos,0, 2); + %tpos = %obj.getTransform(); + %fpos = getWords(%tpos,0, 2); %obj.dtLastPos = %fpos; %vel = %obj.getVelocity(); %posOffset = VectorAdd(%fpos, VectorScale(VectorNormalize(%vel), 2)); - + if($antiCeiling){//flag height 2.46029 - //0.1 offset any fp errors with the flag position being at ground level, 2.4 offset flag height offset + some extra + //0.1 offset any fp errors with the flag position being at ground level, 2.4 offset flag height offset + some extra %upRay = containerRayCast(vectorAdd(%fpos,"0 0 0.1"), vectorAdd(%fpos,"0 0 2.5"), $TypeMasks::InteriorObjectType | $TypeMasks::StaticTSObjectType | $TypeMasks::ForceFieldObjectType, %obj); if(%upRay){ %obj.setTransform(vectorSub(%this.getPosition(),"0 0" SPC 0.3) SPC getWords(%this.getTransform(),3,6)); %obj.setVelocity(getWords(%vel,0,1) SPC 0); - } - } + } + } if($boxStuckFix && !%upRay){ %wallMask = $TypeMasks::TerrainObjectType | $TypeMasks::InteriorObjectType | $TypeMasks::StaticObjectType | $TypeMasks::ForceFieldObjectType | $TypeMasks::VehicleObjectType; %wallRay = containerRayCast(%fpos, %posOffset, %wallMask, %obj); - + %fwoPos = VectorAdd(%fpos, VectorScale(VectorNormalize(%vel), $flagOffset)); - + %upRay = containerRayCast(vectorAdd(%fwoPos,"0 0 0.1"), vectorAdd(%fwoPos,"0 0 2.5"), $TypeMasks::InteriorObjectType | $TypeMasks::StaticTSObjectType | $TypeMasks::ForceFieldObjectType, %obj); - + if(!%wallRay){// make sure we dont end up in a wall if(!%upRay){ %obj.setTransform(%fwoPos SPC getWords(%this.getTransform(),3,6)); @@ -71,7 +71,7 @@ package flagFix{ } } } - } + } function CTFGame::startMatch(%game){ parent::startMatch(%game); @@ -90,7 +90,7 @@ package flagFix{ %game.atHomeFlagLoop(); } } - + function SCtFGame::startMatch(%game){ parent::startMatch(%game); if(!isEventPending(Game.flagLoop)){ @@ -99,7 +99,7 @@ package flagFix{ %game.atHomeFlagLoop(); } } - + function PracticeCTFGame::startMatch(%game){ parent::startMatch(%game); if(!isEventPending(Game.flagLoop)){ @@ -113,77 +113,77 @@ package flagFix{ function CTFGame::playerTouchFlag(%game, %player, %flag){ if(%flag.lastFlagCallms > 0 && $limitFlagCalls){ %timeDif = getSimTime() - %flag.lastFlagCallms; - if(%timeDif < 32){ - return; + if(%timeDif < 32){ + return; } } %flag.lastFlagCallms = getSimTime(); parent::playerTouchFlag(%game, %player, %flag); } - + function LCTFGame::playerTouchFlag(%game, %player, %flag){ if(%flag.lastFlagCallms > 0 && $limitFlagCalls){ %timeDif = getSimTime() - %flag.lastFlagCallms; if(%timeDif < 32){ - return; + return; } } %flag.lastFlagCallms = getSimTime(); parent::playerTouchFlag(%game, %player, %flag); } - + function SCtFGame::playerTouchFlag(%game, %player, %flag){ if(%flag.lastFlagCallms > 0 && $limitFlagCalls){ %timeDif = getSimTime() - %flag.lastFlagCallms; if(%timeDif < 32){ - return; + return; } } %flag.lastFlagCallms = getSimTime(); parent::playerTouchFlag(%game, %player, %flag); } - + function PracticeCTFGame::playerTouchFlag(%game, %player, %flag){ if(%flag.lastFlagCallms > 0 && $limitFlagCalls){ %timeDif = getSimTime() - %flag.lastFlagCallms; if(%timeDif < 32){ - return; + return; } } %flag.lastFlagCallms = getSimTime(); parent::playerTouchFlag(%game, %player, %flag); } - + function CTFGame::playerDroppedFlag(%game, %player){ %flag = %player.holdingFlag; %flag.lastDropTime = getSimTime(); parent::playerDroppedFlag(%game, %player); } - + function LCTFGame::playerDroppedFlag(%game, %player){ %flag = %player.holdingFlag; %flag.lastDropTime = getSimTime(); parent::playerDroppedFlag(%game, %player); } - + function SCtFGame::playerDroppedFlag(%game, %player){ %flag = %player.holdingFlag; %flag.lastDropTime = getSimTime(); parent::playerDroppedFlag(%game, %player); } - + function PracticeCTFGame::playerDroppedFlag(%game, %player){ %flag = %player.holdingFlag; %flag.lastDropTime = getSimTime(); parent::playerDroppedFlag(%game, %player); } - + function Flag::shouldApplyImpulse(%data, %obj){ - %val = parent::shouldApplyImpulse(%data, %obj); + %val = parent::shouldApplyImpulse(%data, %obj); if(%val && $antiFlagImpluse > 0 && %obj.lastDropTime > 0){ %time = getSimTime() - %obj.lastDropTime; if(%time < $antiFlagImpluse){ - %val = 0; + %val = 0; } } return %val; @@ -195,11 +195,11 @@ function vectorMul(%a,%b){ %x = getWords(%a,0) * getWords(%b,0); %y = getWords(%a,1) * getWords(%b,1); %z = getWords(%a,2) * getWords(%b,2); - return %x SPC %y SPC %z; + return %x SPC %y SPC %z; } function generateBoxData(){ - + %playerSize = $playerSizeBox; //"1.2 1.2 2.3"; %halfSize = vectorMul(%playerSize, "0.5 0.5 0"); $plrBoxMin = %minA = VectorSub("0 0 0", %halfSize); @@ -222,12 +222,12 @@ function generateBoxData(){ %box[5] = "1 0 1"; %box[6] = "0 1 1"; %box[7] = "1 1 1"; - + for(%i = 0; %i < 8; %i++){ $playerBoxData[%i] = vectorAdd(%minA, vectorMul(%vSubA, %box[%i])); $flagBoxData[%i] = vectorAdd(%minB, vectorMul(%vSubB, %box[%i])); } - + }generateBoxData(); function vectorLerp(%point1, %point2, %t) { @@ -237,7 +237,7 @@ function vectorLerp(%point1, %point2, %t) { function boxIntersectAABB(%plr, %flg, %lerpPos){ if($boxCollision == 2){ %fpos = %flg.getPosition(); - + %a = vectorAdd($plrBoxMin, %lerpPos) SPC vectorAdd($plrBoxMax, %lerpPos); %b = vectorAdd($flagBoxMin, %fpos) SPC vectorAdd($flagBoxMax, %fpos); } @@ -246,7 +246,7 @@ function boxIntersectAABB(%plr, %flg, %lerpPos){ %a = vectorAdd(getWords(%plrMinMax,0,2), %lerpPos) SPC vectorAdd(getWords(%plrMinMax,3,5), %lerpPos); %b = %flg.getWorldBox(); } - + return (getWord(%a, 0) <= getWord(%b, 3) && getWord(%a, 3) >= getWord(%b, 0)) && (getWord(%a, 1) <= getWord(%b, 4) && getWord(%a, 4) >= getWord(%b, 1)) && (getWord(%a, 2)<= getWord(%b, 5) && getWord(%a, 5) >= getWord(%b, 2)); @@ -259,7 +259,7 @@ function DefaultGame::flagColTest(%game, %flag, %rsTeam, %ext){ if(!%flag.isHome && $antiObjTunnel){ %fOffset =vectorAdd(%flagPos,"0 0 0.1"); %dist = vectorDist(%flag.dtLastPos, %fOffset); - if(%dist > 2.5){//2.5 is the rough flag height + if(%dist > 2.5){//2.5 is the rough flag height %wallMask = $TypeMasks::TerrainObjectType | $TypeMasks::InteriorObjectType; %terRay = containerRayCast(%flag.dtLastPos, %fOffset, %wallMask, %flag); if(%terRay){ @@ -288,7 +288,7 @@ function DefaultGame::flagColTest(%game, %flag, %rsTeam, %ext){ %lerpPos = vectorLerp(%playerPos, %player.oldPos, %i/(%sweepCount-1));//back sweep //%point = MatrixMulPoint(%lerpPos SPC %rot, "-0.6 -0.6 0"); //schedule(1000+(%i*128), 0, "drawBoxItemC", %point, %rot, "1.2 1.2 2.3", 15000); - if($boxCollision == 1 && boxIntersect(%player, %flag, %lerpPos)){ + if($boxCollision == 1 && boxIntersect(%player, %flag, %lerpPos)){ // %point = MatrixMulPoint(%flagPos SPC %rot,"-0.398 -0.069 0"); // schedule(1000+(%i*128), 0, "drawBoxItemC", %point, %rot, "0.796666 0.139717 4", 15000); %flag.getDataBlock().onCollision(%flag, %player); @@ -306,7 +306,7 @@ function DefaultGame::flagColTest(%game, %flag, %rsTeam, %ext){ %player.lastSim = getSimTime(); } //error("scan count" SPC %scanCount SPC %scanPlrCount); -} +} function DefaultGame::atHomeFlagLoop(%game){ if(isObject($TeamFlag[1]) && isObject($TeamFlag[2])){ @@ -321,36 +321,36 @@ function DefaultGame::atHomeFlagLoop(%game){ %game.flagResetTime = 0; } %game.flagResetTime += $flagSimTime; - } - + } + if($TeamFlag[1].isHome && $TeamFlag[2].isHome){//11 - %game.flagColTest($TeamFlag[1],1,0);// only look at the other team - %game.flagColTest($TeamFlag[2],1,0);// only look at the other team + %game.flagColTest($TeamFlag[1],1,0);// only look at the other team + %game.flagColTest($TeamFlag[2],1,0);// only look at the other team } else if(!$TeamFlag[1].isHome && $TeamFlag[2].isHome){//01 if(isObject($TeamFlag[1].carrier)){// flag has been dropped - %game.flagColTest($TeamFlag[2],1, $TeamFlag[1].carrier); //scan for other team expect for are carrier + %game.flagColTest($TeamFlag[2],1, $TeamFlag[1].carrier); //scan for other team expect for are carrier } else{ - %game.flagColTest($TeamFlag[1],0,0);// scan for everyone can touch it - %game.flagColTest($TeamFlag[2],1,0);// team 2 flag is still at home so only scan for the other team + %game.flagColTest($TeamFlag[1],0,0);// scan for everyone can touch it + %game.flagColTest($TeamFlag[2],1,0);// team 2 flag is still at home so only scan for the other team } } else if($TeamFlag[1].isHome && !$TeamFlag[2].isHome){//10 if(isObject($TeamFlag[2].carrier)){// flag has been dropped - %game.flagColTest($TeamFlag[1],1, $TeamFlag[2].carrier); //scan for other team expect for are carrier + %game.flagColTest($TeamFlag[1],1, $TeamFlag[2].carrier); //scan for other team expect for are carrier } else{ - %game.flagColTest($TeamFlag[1],1,0);// team 1 flag is still at home so only scan for the other team - %game.flagColTest($TeamFlag[2],0,0);// scan for everyone can touch it + %game.flagColTest($TeamFlag[1],1,0);// team 1 flag is still at home so only scan for the other team + %game.flagColTest($TeamFlag[2],0,0);// scan for everyone can touch it } } else if(!$TeamFlag[1].isHome && !$TeamFlag[2].isHome){//00 if(!isObject($TeamFlag[1].carrier)){// flag has been dropped - %game.flagColTest($TeamFlag[1],0,0);// scan for everyone can touch it + %game.flagColTest($TeamFlag[1],0,0);// scan for everyone can touch it } if(!isObject($TeamFlag[2].carrier)){// flag has been dropped - %game.flagColTest($TeamFlag[2],0,0);// scan for everyone can touch it + %game.flagColTest($TeamFlag[2],0,0);// scan for everyone can touch it } } } @@ -362,80 +362,80 @@ function DefaultGame::atHomeFlagLoop(%game){ function boxIntersect(%objA, %objB, %scanPos) { // Retrieve the 8 corners of the box for both objects - %matrixA = %objA.getTransform(); - if(getWordCount(%scanPos)){// need to check a postion other then default + %matrixA = %objA.getTransform(); + if(getWordCount(%scanPos)){// need to check a postion other then default %matrixA = %scanPos SPC getWords(%matrixA,3,6); } - %matrixB = %objB.getTransform(); + %matrixB = %objB.getTransform(); + - %cornerA[0] = MatrixMulPoint(%matrixA, "-0.6 -0.6 0"); %cornerA[1] = MatrixMulPoint(%matrixA, "0.6 -0.6 0"); %cornerA[2] = MatrixMulPoint(%matrixA, "-0.6 0.6 0"); %cornerA[3] = MatrixMulPoint(%matrixA, "0.6 0.6 0"); - + %cornerA[4] = MatrixMulPoint(%matrixA, "-0.6 -0.6 2.3"); %cornerA[5] = MatrixMulPoint(%matrixA, "0.6 -0.6 2.3"); %cornerA[6] = MatrixMulPoint(%matrixA, "-0.6 0.6 2.3"); - %cornerA[7] = MatrixMulPoint(%matrixA, "0.6 0.6 2.3"); - - + %cornerA[7] = MatrixMulPoint(%matrixA, "0.6 0.6 2.3"); + + %cornerB[0] = MatrixMulPoint(%matrixB, "-0.398333 -0.0698583 -0.1"); %cornerB[1] = MatrixMulPoint(%matrixB, "0.398333 -0.0698583 -0.1"); %cornerB[2] = MatrixMulPoint(%matrixB, "-0.398333 0.0698587 -0.1"); %cornerB[3] = MatrixMulPoint(%matrixB, "0.398333 0.0698587 -0.1"); - + %cornerB[4] = MatrixMulPoint(%matrixB, "-0.398333 -0.0698583 2.46029"); %cornerB[5] = MatrixMulPoint(%matrixB, "0.398333 -0.0698583 2.46029"); %cornerB[6] = MatrixMulPoint(%matrixB, "-0.398333 0.0698587 2.46029"); - %cornerB[7] = MatrixMulPoint(%matrixB, "0.398333 0.0698587 2.46029"); - + %cornerB[7] = MatrixMulPoint(%matrixB, "0.398333 0.0698587 2.46029"); + // Define the axes to test (these are the edges of both boxes) %ax[0] = vectorNormalize(vectorSub(%cornerA[1], %cornerA[0]));//X cross forward and up %ax[1] = vectorNormalize(vectorSub(%cornerA[2], %cornerA[0]));//Y forward vector %ax[2] = "0 0 1"; - + %ax[3] = vectorNormalize(vectorSub(%cornerB[1], %cornerB[0]));//X cross forward and up %ax[4] = vectorNormalize(vectorSub(%cornerB[2], %cornerB[0])); //Y forward vector %ax[5] = "0 0 1"; - + // For each axis for (%i = 0; %i < 6; %i++) { %axis = %ax[%i]; - + // Project each corner of box A onto the axis %minProjA = vectorDot(%cornerA[0], %axis); %maxProjA = %minProjA; - + for (%j = 1; %j < 8; %j++) { %projA = vectorDot(%cornerA[%j], %axis); - + %minProjA = (%projA < %minProjA) ? %projA : %minProjA; %maxProjA = (%projA > %maxProjA) ? %projA : %maxProjA; } - + // Project each corner of box B onto the axis %minProjB = vectorDot(%cornerB[0], %axis); %maxProjB = %minProjB; - + for (%j = 1; %j < 8; %j++) { %projB = vectorDot(%cornerB[%j], %axis); %minProjB = (%projB < %minProjB) ? %projB : %minProjB; %maxProjB = (%projB > %maxProjB) ? %projB : %maxProjB; } - + // Check for overlap if (%maxProjA < %minProjB || %maxProjB < %minProjA) { return false; // No overlap on this axis, boxes do not intersect } } - + return true; // Overlap on all axes, boxes intersect } function testFlagSpeed(%speed){ - %player = LocalClientConnection.player; + %player = LocalClientConnection.player; %fvec = %player.getForwardVector(); %vel = vectorScale(%fvec,%speed); %player.setVelocity(%vel); From 982207a2df2b1577fb691599c50403abb3529a3c Mon Sep 17 00:00:00 2001 From: ChocoTaco Date: Sun, 4 May 2025 13:00:33 -0400 Subject: [PATCH 05/37] Update MapRotation.cs --- Classic/prefs/MapRotation.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Classic/prefs/MapRotation.cs b/Classic/prefs/MapRotation.cs index fa47405..0e847ad 100644 --- a/Classic/prefs/MapRotation.cs +++ b/Classic/prefs/MapRotation.cs @@ -387,10 +387,10 @@ addRotationMap("SignalDX", "CTF",1,0,8,24); //In Rotation ///////////////////////////////////////////////////////////////////// -addRotationMap("VaubanLak", "Lakrabbit",1,0,8,-1); +addRotationMap("VaubanLak", "Lakrabbit",1,1,8,-1); addRotationMap("MiniSunDried", "Lakrabbit",1,1,-1,12); addRotationMap("Sundance", "Lakrabbit",1,1,-1,-1); -addRotationMap("TWL_BeachBlitzLak", "Lakrabbit",1,0,-1,-1); +addRotationMap("TWL_BeachBlitzLak", "Lakrabbit",1,1,-1,-1); addRotationMap("DesertofDeathLak", "Lakrabbit",1,1,-1,-1); addRotationMap("Raindance_nefLak", "Lakrabbit",1,1,-1,-1); addRotationMap("SunDriedLak", "Lakrabbit",1,1,-1,-1); @@ -402,11 +402,11 @@ addRotationMap("BoxLak", "Lakrabbit",1,1,-1,10); addRotationMap("TitaniaLak", "Lakrabbit",1,0,8,-1); addRotationMap("TibbawLak", "Lakrabbit",1,1,-1,-1); addRotationMap("InfernusLak", "Lakrabbit",1,1,-1,-1); -addRotationMap("S8_GeothermalLak", "Lakrabbit",1,1,-1,-1); +addRotationMap("S8_GeothermalLak", "Lakrabbit",1,0,-1,-1); addRotationMap("CankerLak", "Lakrabbit",1,1,-1,-1); addRotationMap("DustRunLak", "Lakrabbit",1,1,-1,-1); addRotationMap("CrossfiredLak", "Lakrabbit",1,1,-1,-1); -addRotationMap("CloakofLak", "Lakrabbit",1,1,-1,-1); +addRotationMap("CloakofLak", "Lakrabbit",1,0,-1,-1); addRotationMap("SpectreLak", "Lakrabbit",1,1,-1,-1); //Voteable, But not in rotation From fe1689b730ed984e6d4608eb0e6dab45dfa7a9f0 Mon Sep 17 00:00:00 2001 From: ChocoTaco Date: Mon, 5 May 2025 12:45:09 -0400 Subject: [PATCH 06/37] Update MissionTypeOptions.cs --- Classic/scripts/autoexec/MissionTypeOptions.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Classic/scripts/autoexec/MissionTypeOptions.cs b/Classic/scripts/autoexec/MissionTypeOptions.cs index 4cc0454..c76b69a 100644 --- a/Classic/scripts/autoexec/MissionTypeOptions.cs +++ b/Classic/scripts/autoexec/MissionTypeOptions.cs @@ -45,10 +45,10 @@ function loadMissionStage2() //Tournament Mode specifics if($Host::TournamentMode) { - if(!$CurrentMissionType $= "LCTF") + if($CurrentMissionType $= "LCTF") //TimeLimit Always 20 minutes in LCTF Tourney Mode + $Host::TimeLimit = 20; + else $Host::TimeLimit = 30; //TimeLimit Always 30 minutes in Tourney Mode - else //LCTF 20 Minutes - $Host::TimeLimit = 20; //TimeLimit Always 20 minutes in LCTF Tourney Mode } else { From ff7e73530c2976bdd2c55ec5663cbfb9ac8e801f Mon Sep 17 00:00:00 2001 From: ChocoTaco Date: Mon, 5 May 2025 12:45:22 -0400 Subject: [PATCH 07/37] Old method by default --- 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 6d669f6..e901d8e 100644 --- a/Classic/scripts/autoexec/flagTunnelingFix.cs +++ b/Classic/scripts/autoexec/flagTunnelingFix.cs @@ -34,7 +34,7 @@ $flagBoxSize = "0.796666 0.139717 2.46029"; //1 = new OBB method uses perfect box intersection //2 = AABB method but uses boundbox can make the player larger then it is given there direction //3 = AABB fixed sizes uses $playerSizeBox and $flagBoxSize to do the box checking -$boxCollision = 1;// off is the old AABB method aka the old method +$boxCollision = 0; // off is the old AABB method aka the old method package flagFix{ function ShapeBase::throwObject(%this,%obj){ From 50bc00229b8380c15d049ba3b1e50cdc5e7ef627 Mon Sep 17 00:00:00 2001 From: ChocoTaco Date: Wed, 7 May 2025 16:19:20 -0400 Subject: [PATCH 08/37] Added RunenmachtLT --- Classic/prefs/MapRotation.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Classic/prefs/MapRotation.cs b/Classic/prefs/MapRotation.cs index 0e847ad..83cd9cd 100644 --- a/Classic/prefs/MapRotation.cs +++ b/Classic/prefs/MapRotation.cs @@ -475,7 +475,7 @@ addRotationMap("Blink", "LCTF",1,0,-1,-1); addRotationMap("HillSideLT", "LCTF",1,1,-1,10); addRotationMap("IcePick", "LCTF",1,1,-1,16); addRotationMap("OsIrisLT", "LCTF",1,0,-1,-1); -addRotationMap("GrassyKnoll", "LCTF",1,1,-1,-1); +addRotationMap("GrassyKnollLT", "LCTF",1,1,-1,-1); addRotationMap("TWL2_MuddySwamp", "LCTF",1,0,8,-1); addRotationMap("SandyRunLT", "LCTF",1,0,-1,12); addRotationMap("Sentry", "LCTF",1,1,-1,-1); @@ -533,6 +533,7 @@ addRotationMap("FrozenForgeLT", "LCTF",1,1,-1,20); addRotationMap("TWL2_CelerityLT", "LCTF",1,1,-1,20); addRotationMap("El_FinLT", "LCTF",1,1,-1,14); addRotationMap("CapriLT", "LCTF",1,1,-1,14); +addRotationMap("RunenmachtLT", "LCTF",1,1,-1,14); // _____ _ _ _ _ From 16bdd87af12926f2b951ba21ce1f3e01f6c31515 Mon Sep 17 00:00:00 2001 From: ChocoTaco Date: Wed, 7 May 2025 16:19:40 -0400 Subject: [PATCH 09/37] Flag Tunneling v3.8 --- Classic/scripts/autoexec/flagTunnelingFix.cs | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/Classic/scripts/autoexec/flagTunnelingFix.cs b/Classic/scripts/autoexec/flagTunnelingFix.cs index e901d8e..a7a6e35 100644 --- a/Classic/scripts/autoexec/flagTunnelingFix.cs +++ b/Classic/scripts/autoexec/flagTunnelingFix.cs @@ -1,5 +1,6 @@ //Fixes for collision tunneling and other issues, note only tested in classic //Script By:DarkTiger +//v3.8 - removed sweep optimization/ bug fix in old method //v3.7 - removed bypass code //v3.6 - lctf and SCtFGame //v3.5 - tweaks @@ -32,9 +33,6 @@ $flagBoxSize = "0.796666 0.139717 2.46029"; //0 = old AABB method uses fixed box size makes the player bit narrow //1 = new OBB method uses perfect box intersection -//2 = AABB method but uses boundbox can make the player larger then it is given there direction -//3 = AABB fixed sizes uses $playerSizeBox and $flagBoxSize to do the box checking -$boxCollision = 0; // off is the old AABB method aka the old method package flagFix{ function ShapeBase::throwObject(%this,%obj){ @@ -282,7 +280,7 @@ function DefaultGame::flagColTest(%game, %flag, %rsTeam, %ext){ //%fdot = vectorDot(vectorNormalize(%player.getVelocity()),vectorNormalize(VectorSub(%flagPos, %playerPos))); // %tickDist = vectorLen(%player.getVelocity()) * ($flagSimTime/1000); %sweepCount = mFloor(vectorDist(%playerPos, %player.oldPos) + 1.5); - if((getSimTime() - %player.lastSim) <= 128 && %flagDist-2 < %sweepCount){//make sure are last position is valid + 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 %lerpPos = vectorLerp(%playerPos, %player.oldPos, %i/(%sweepCount-1));//back sweep @@ -294,7 +292,7 @@ function DefaultGame::flagColTest(%game, %flag, %rsTeam, %ext){ %flag.getDataBlock().onCollision(%flag, %player); break; } - else if($boxCollision > 1 && boxIntersectAABB(%player, %flag, %lerpPos)){ + else if(!$boxCollision && boxIntersectAABB(%player, %flag, %lerpPos)){ %flag.getDataBlock().onCollision(%flag, %player); break; } @@ -439,4 +437,4 @@ function testFlagSpeed(%speed){ %fvec = %player.getForwardVector(); %vel = vectorScale(%fvec,%speed); %player.setVelocity(%vel); -} +} \ No newline at end of file From d736c3a8ff6ff213bbcdeb76217e9fed7310cd38 Mon Sep 17 00:00:00 2001 From: ChocoTaco Date: Wed, 7 May 2025 20:30:56 -0400 Subject: [PATCH 10/37] 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 11/37] 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 12/37] 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 13/37] 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 14/37] 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 15/37] 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 16/37] 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 17/37] 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) From a8af516f52d47e373aeff6a77c9971dfc49733b5 Mon Sep 17 00:00:00 2001 From: ChocoTaco Date: Sat, 17 May 2025 13:41:52 -0400 Subject: [PATCH 18/37] Rework --- Classic/scripts/autoexec/flagTunnelingFix.cs | 112 +++++++------------ 1 file changed, 43 insertions(+), 69 deletions(-) diff --git a/Classic/scripts/autoexec/flagTunnelingFix.cs b/Classic/scripts/autoexec/flagTunnelingFix.cs index 3761a01..3012bdb 100644 --- a/Classic/scripts/autoexec/flagTunnelingFix.cs +++ b/Classic/scripts/autoexec/flagTunnelingFix.cs @@ -1,5 +1,6 @@ //Fixes for collision tunneling and other issues, note only tested in classic //Script By:DarkTiger +//v4.3 - logic rework remove any skips in the checks //v3.8 - removed sweep optimization/ bug fix in old method //v3.7 - removed bypass code //v3.6 - lctf and SCtFGame @@ -31,6 +32,7 @@ $flagCheckRadius = 50; $playerSizeBox = "1.2 1.2 2.3"; $flagBoxSize = "0.796666 0.139717 2.46029"; +$boxCollision = 0; //0 = old AABB method uses fixed box size makes the player bit narrow //1 = new OBB method uses perfect box intersection @@ -189,43 +191,16 @@ package flagFix{ }; activatePackage(flagFix); -function vectorMul(%a,%b){ - %x = getWords(%a,0) * getWords(%b,0); - %y = getWords(%a,1) * getWords(%b,1); - %z = getWords(%a,2) * getWords(%b,2); - return %x SPC %y SPC %z; -} - function generateBoxData(){ + %halfSize = vectorScale($playerSizeBox, 0.5); + $plrBoxMin = getWords(VectorSub("0 0 0", %halfSize),0,1) SPC 0; + $plrBoxMax = getWords(%halfSize,0,1) SPC getWord($playerSizeBox,2); + $plrBox = $plrBoxMin SPC $plrBoxMax; - %playerSize = $playerSizeBox; //"1.2 1.2 2.3"; - %halfSize = vectorMul(%playerSize, "0.5 0.5 0"); - $plrBoxMin = %minA = VectorSub("0 0 0", %halfSize); - $plrBoxMax = %maxA = getWords(%halfSize,0,1) SPC getWord(%playerSize,2); - $plrBox = %minA SPC %maxA; - %vSubA = vectorSub(%maxA, %minA); - - %flagSize = $flagBoxSize; - %halfSize = vectorMul(%flagSize, "0.5 0.5 0"); - $flagBoxMin = %minB = VectorSub("0 0 -0.1", %halfSize); - $flagBoxMax = %maxB = getWords(%halfSize,0,1) SPC getWord(%flagSize,2); - $flagBox = %minB SPC %maxB; - %vSubB = vectorSub(%maxB, %minB); - - %box[0] = "0 0 0"; - %box[1] = "1 0 0"; - %box[2] = "0 1 0"; - %box[3] = "1 1 0"; - %box[4] = "0 0 1"; - %box[5] = "1 0 1"; - %box[6] = "0 1 1"; - %box[7] = "1 1 1"; - - for(%i = 0; %i < 8; %i++){ - $playerBoxData[%i] = vectorAdd(%minA, vectorMul(%vSubA, %box[%i])); - $flagBoxData[%i] = vectorAdd(%minB, vectorMul(%vSubB, %box[%i])); - } - + %halfSize = vectorScale($flagBoxSize, 0.5); + $flagBoxMin = getWords(VectorSub("0 0 0", %halfSize),0,1) SPC 0; + $flagBoxMax = getWords(%halfSize,0,1) SPC getWord($flagBoxSize,2); + $flagBox = $flagBoxMin SPC $flagBoxMax; }generateBoxData(); function vectorLerp(%point1, %point2, %t) { @@ -233,7 +208,8 @@ function vectorLerp(%point1, %point2, %t) { } function boxIntersectAABB(%plr, %flg, %lerpPos){ - if($boxCollision == 2){ + %testMode = 0; + if(%testMode == 1){ %fpos = %flg.getPosition(); %a = vectorAdd($plrBoxMin, %lerpPos) SPC vectorAdd($plrBoxMax, %lerpPos); @@ -250,7 +226,7 @@ function boxIntersectAABB(%plr, %flg, %lerpPos){ (getWord(%a, 2)<= getWord(%b, 5) && getWord(%a, 5) >= getWord(%b, 2)); } -function DefaultGame::flagColTest(%game, %flag, %rsTeam, %ext){ +function DefaultGame::flagColTest(%game, %flag, %rsTeam,%fc){ //////////////////////////////////////////////////////////////////////////////// //obj tunneling check %flagPos = %flag.getPosition(); @@ -273,37 +249,32 @@ function DefaultGame::flagColTest(%game, %flag, %rsTeam, %ext){ InitContainerRadiusSearch( %flagPos, $flagCheckRadius, $TypeMasks::PlayerObjectType); while((%player = containerSearchNext()) != 0){ %playerPos = %player.getPosition(); - //%rot = getWords(%player.getTransform(),3,6); - if((%rsTeam && %flag.team != %player.team) || !%rsTeam || %player == %ext){ - %flagDist = vectorDist(%flagPos, %playerPos); - 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) + 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 - %lerpPos = vectorLerp(%playerPos, %player.oldPos, %i/(%sweepCount-1));//back sweep - //%point = MatrixMulPoint(%lerpPos SPC %rot, "-0.6 -0.6 0"); - //schedule(1000+(%i*128), 0, "drawBoxItemC", %point, %rot, "1.2 1.2 2.3", 15000); - if($boxCollision == 1 && boxIntersect(%player, %flag, %lerpPos)){ - // %point = MatrixMulPoint(%flagPos SPC %rot,"-0.398 -0.069 0"); - // schedule(1000+(%i*128), 0, "drawBoxItemC", %point, %rot, "0.796666 0.139717 4", 15000); - %flag.getDataBlock().onCollision(%flag, %player); - break; - } - else if(!$boxCollision && boxIntersectAABB(%player, %flag, %lerpPos)){ - %flag.getDataBlock().onCollision(%flag, %player); - break; - } - } + //%toPlayer = vectorNormalize(vectorSub(%flagPos,%playerPos)); + //%moveDir = vectorNormalize(%player.getVelocity()); + //%d = vectorDot( %toPlayer, %moveDir ); + if(((%flag.team != %player.team) || !%rsTeam || %fc == %player) && %player.getState() !$= "Dead"){ + //%futurePos = vectorAdd(%playerPos, vectorScale(%player.getVelocity(), $flagSimTime / 1000)); + if(%player.lastSim[%flag] $= "" || (getSimTime() - %player.lastSim[%flag]) >= 128){ + %lastPos = vectorSub(%playerPos, vectorScale(%player.getVelocity(), $flagSimTime / 1000)); + %player.oldPos[%flag] = %lastPos;// old data so lets do it velocity based + } + %sweepCount = mFloor(vectorDist(%playerPos, %player.oldPos[%flag]) + 1);// min of 2 + for(%i = 0; %i < %sweepCount; %i++){// sweep behind us to see if we should have hit something + %lerpPos = vectorLerp(%playerPos, %player.oldPos[%flag], %i/(%sweepCount-1));//back sweep + if($boxCollision == 1 && boxIntersect(%player, %flag, %lerpPos)){ + %flag.getDataBlock().onCollision(%flag, %player); + break; + } + else if(!$boxCollision && boxIntersectAABB(%player, %flag, %lerpPos)){ + %flag.getDataBlock().onCollision(%flag, %player); + //error("hit" SPC %player.count++); + break; } } } - %player.oldPos = %playerPos; - %player.lastSim = getSimTime(); + %player.oldPos[%flag] = %playerPos; + %player.lastSim[%flag] = getSimTime(); } - //error("scan count" SPC %scanCount SPC %scanPlrCount); } function DefaultGame::atHomeFlagLoop(%game){ @@ -321,13 +292,16 @@ function DefaultGame::atHomeFlagLoop(%game){ %game.flagResetTime += $flagSimTime; } + //%game.flagColTest($TeamFlag[1]); + //%game.flagColTest($TeamFlag[2]); + if($TeamFlag[1].isHome && $TeamFlag[2].isHome){//11 %game.flagColTest($TeamFlag[1],1,0);// only look at the other team %game.flagColTest($TeamFlag[2],1,0);// only look at the other team } else if(!$TeamFlag[1].isHome && $TeamFlag[2].isHome){//01 if(isObject($TeamFlag[1].carrier)){// flag has been dropped - %game.flagColTest($TeamFlag[2],1, $TeamFlag[1].carrier); //scan for other team expect for are carrier + %game.flagColTest($TeamFlag[2],1,$TeamFlag[1].carrier); //scan for other team expect for are carrier } else{ %game.flagColTest($TeamFlag[1],0,0);// scan for everyone can touch it @@ -336,7 +310,7 @@ function DefaultGame::atHomeFlagLoop(%game){ } else if($TeamFlag[1].isHome && !$TeamFlag[2].isHome){//10 if(isObject($TeamFlag[2].carrier)){// flag has been dropped - %game.flagColTest($TeamFlag[1],1, $TeamFlag[2].carrier); //scan for other team expect for are carrier + %game.flagColTest($TeamFlag[1],1,$TeamFlag[2].carrier); //scan for other team expect for are carrier } else{ %game.flagColTest($TeamFlag[1],1,0);// team 1 flag is still at home so only scan for the other team @@ -345,10 +319,10 @@ function DefaultGame::atHomeFlagLoop(%game){ } else if(!$TeamFlag[1].isHome && !$TeamFlag[2].isHome){//00 if(!isObject($TeamFlag[1].carrier)){// flag has been dropped - %game.flagColTest($TeamFlag[1],0,0);// scan for everyone can touch it + %game.flagColTest($TeamFlag[1],0);// scan for everyone can touch it } if(!isObject($TeamFlag[2].carrier)){// flag has been dropped - %game.flagColTest($TeamFlag[2],0,0);// scan for everyone can touch it + %game.flagColTest($TeamFlag[2],0);// scan for everyone can touch it } } } @@ -437,4 +411,4 @@ function testFlagSpeed(%speed){ %fvec = %player.getForwardVector(); %vel = vectorScale(%fvec,%speed); %player.setVelocity(%vel); -} \ No newline at end of file +} From 1e6ad89251d4376b254254780f7d3baf2bbdb787 Mon Sep 17 00:00:00 2001 From: ChocoTaco Date: Wed, 18 Jun 2025 17:22:29 -0400 Subject: [PATCH 19/37] Create spawnDir.cs --- Classic/scripts/autoexec/spawnDir.cs | 107 +++++++++++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100644 Classic/scripts/autoexec/spawnDir.cs diff --git a/Classic/scripts/autoexec/spawnDir.cs b/Classic/scripts/autoexec/spawnDir.cs new file mode 100644 index 0000000..2f3b0cd --- /dev/null +++ b/Classic/scripts/autoexec/spawnDir.cs @@ -0,0 +1,107 @@ +// points players in the diretion of the enemy flag home position when outdoors +// Script By: DarkTiger +// version 1.0 + +function CTFGame::pickTeamSpawn(%game, %team) { + return %game.pickTeamSpawnRot(%team); +} +function LCTFGame::pickTeamSpawn(%game, %team) { + return %game.pickTeamSpawnRot(%team); +} +function SCtFGame::pickTeamSpawn(%game, %team) { + return %game.pickTeamSpawnRot(%team); +} + +function DefaultGame::pickTeamSpawnRot(%game, %team){ +// early exit if no nav graph + if (!navGraphExists()) + { + echo("No navigation graph is present. Build one."); + return -1; + } + + for (%attempt = 0; %attempt < 20; %attempt++) + { + // finds a random spawn sphere + // selects inside/outside on this random sphere + // if the navgraph exists, then uses it to grab a random node as spawn + // location/rotation + %sphere = %game.selectSpawnSphere(%team); + if (%sphere == -1) + { + echo("No spawn spheres found for team " @ %team); + return -1; + } + + %zone = %game.selectSpawnZone(%sphere); + %useIndoor = %zone; + %useOutdoor = !%zone; + if (%zone) + %area = "indoor"; + else + %area = "outdoor"; + + %radius = %sphere.radius; + %sphereTrans = %sphere.getTransform(); + %sphereCtr = getWord(%sphereTrans, 0) @ " " @ getWord(%sphereTrans, 1) @ " " @ getWord(%sphereTrans, 2); //don't need full transform here, just x, y, z + //echo("Selected Sphere is " @ %sphereCtr @ " with a radius of " @ %radius @ " meters. Selecting from " @ %area @ " zone."); + + %avoidThese = $TypeMasks::VehicleObjectType | $TypeMasks::MoveableObjectType | + $TypeMasks::PlayerObjectType | $TypeMasks::TurretObjectType; + + for (%tries = 0; %tries < 10; %tries++) + { + %nodeIndex = navGraph.randNode(%sphereCtr, %radius, %useIndoor, %useOutdoor); + if (%nodeIndex >= 0) + { + %loc = navGraph.randNodeLoc(%nodeIndex); + %adjUp = VectorAdd(%loc, "0 0 1.0"); // don't go much below + + if (ContainerBoxEmpty( %avoidThese, %adjUp, 2.0)) + break; + } + } + + if (%nodeIndex >= 0) + { + %loc = navGraph.randNodeLoc(%nodeIndex); + if (%zone)//spawn indoors + { + %fpos = getWords($TeamFlag[%team == 1 ? 2 : 1].originalPosition,0,2); + %flos = containerRayCast(vectorAdd(%loc,"0 0 1"), vectorAdd(%fpos, "0 0 1"), $TypeMasks::InteriorObjectType | $TypeMasks::StaticTSObjectType | $TypeMasks::ForceFieldObjectType); + if(%flos){// do we have anything inbetween us and the flag if not face it + if(vectorDist(%loc, getWords(%flos,1,3)) < 25){ + //error("indoor" SPC %loc); + %trns = %loc @ " 0 0 1 0"; + %spawnLoc = whereToLook(%trns); + return %spawnLoc; + } + } + //error("outdoor" SPC %loc); + %rot = %game.selectSpawnDir(%loc, %team, %zone); + %spawnLoc = %loc @ %rot; + return %spawnLoc; + } + //error("outdoor" SPC %loc); + %rot = %game.selectSpawnDir(%loc, %team, %zone); + %spawnLoc = %loc @ %rot; + return %spawnLoc; + } + } +} + +//face flag when spawn +function DefaultGame::selectSpawnDir(%game, %loc, %team, %zone){ + %team = %team == 1 ? 2 : 1; + %fpos = getWords($TeamFlag[%team].originalPosition,0,2); + //this used only when spawn loc is not on an interior. This points spawning player to the ctr of spawnshpere + %fpos = setWord(%fpos, 2, 0); + %loc = setWord(%loc, 2, 0); + + if(VectorDist(%loc, %fpos) == 0) + return " 0 0 1 0 "; + + %vec = VectorNormalize(VectorSub(%fpos, %loc)); + %angle = mAcos(getWord(%vec, 1)); + return (%loc < %fpos) ? (" 0 0 1 " @ %angle) : (" 0 0 1 " @ -%angle);// this works some how +} From 9aea8e23a6c52e5193d3f39d14d6aaffc1e47b27 Mon Sep 17 00:00:00 2001 From: ChocoTaco Date: Mon, 23 Jun 2025 15:38:00 -0400 Subject: [PATCH 20/37] Overtime Bug --- Classic/scripts/CTFGame.cs | 20 +++++++++++--------- Classic/scripts/LCTFGame.cs | 20 +++++++++++--------- 2 files changed, 22 insertions(+), 18 deletions(-) diff --git a/Classic/scripts/CTFGame.cs b/Classic/scripts/CTFGame.cs index e26cda5..5677f3c 100755 --- a/Classic/scripts/CTFGame.cs +++ b/Classic/scripts/CTFGame.cs @@ -1266,8 +1266,9 @@ function CTFGame::checkTimeLimit(%game, %forced) { %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){ + if(%teamOneCaps == %teamTwoCaps && $CTF::Overtime && (($TeamRank[1, count] + $TeamRank[2, count]) > 6)){ + 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); @@ -1277,14 +1278,15 @@ function CTFGame::checkTimeLimit(%game, %forced) %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 + { + if(%game.scheduleVote !$= "" && !%game.voteOT) + { + messageAll('MsgOvertime', '\c2Vote Overtime Initiated.~wfx/powered/turret_heavy_activate.wav'); + %game.voteOT = 1; } - else{ + else + { %game.timeLimitReached(); } } diff --git a/Classic/scripts/LCTFGame.cs b/Classic/scripts/LCTFGame.cs index c9754c3..e856790 100644 --- a/Classic/scripts/LCTFGame.cs +++ b/Classic/scripts/LCTFGame.cs @@ -1566,8 +1566,9 @@ function LCTFGame::checkTimeLimit(%game, %forced) { %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){ + if(%teamOneCaps == %teamTwoCaps && $LCTF::Overtime && (($TeamRank[1, count] + $TeamRank[2, count]) > 6)){ + 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); @@ -1577,14 +1578,15 @@ function LCTFGame::checkTimeLimit(%game, %forced) %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 + { + if(%game.scheduleVote !$= "" && !%game.voteOT) + { + messageAll('MsgOvertime', '\c2Vote Overtime Initiated.~wfx/powered/turret_heavy_activate.wav'); + %game.voteOT = 1; } - else{ + else + { %game.timeLimitReached(); } } From 7fe6bb3b98e039924a1c2237c56fb1556d868fda Mon Sep 17 00:00:00 2001 From: ChocoTaco Date: Fri, 27 Jun 2025 13:45:38 -0400 Subject: [PATCH 21/37] Wrong message --- Classic/scripts/autoexec/VoteMenu.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Classic/scripts/autoexec/VoteMenu.cs b/Classic/scripts/autoexec/VoteMenu.cs index 27bc536..f0f72bc 100644 --- a/Classic/scripts/autoexec/VoteMenu.cs +++ b/Classic/scripts/autoexec/VoteMenu.cs @@ -867,7 +867,7 @@ function serverCmdStartNewVote(%client, %typeName, %arg1, %arg2, %arg3, %arg4, % 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."; + %msg = %client.nameBase @ " initiated a vote to " @ (Game.LCTFOneMine == 1 ? "enable" : "disable") @ " one mine mode."; case "showServerRules": if (($Host::ServerRules[1] !$= "") && (!%client.CantView)) From 7cd1cb8815e19990ab5a0cf632aedc82726333ed Mon Sep 17 00:00:00 2001 From: ChocoTaco1 Date: Mon, 18 Aug 2025 16:15:26 -0400 Subject: [PATCH 22/37] LoadingScreen Safeguards Shorter time Added check --- Classic/scripts/autoexec/zDebriefLoadingScreen.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Classic/scripts/autoexec/zDebriefLoadingScreen.cs b/Classic/scripts/autoexec/zDebriefLoadingScreen.cs index b43ec39..f3396fd 100755 --- a/Classic/scripts/autoexec/zDebriefLoadingScreen.cs +++ b/Classic/scripts/autoexec/zDebriefLoadingScreen.cs @@ -51,7 +51,7 @@ // First Screen loading time (Map Screen) // If this is set too low the second screen wont show at all -$dtLoadingScreen::FirstScreen = 5500; +$dtLoadingScreen::FirstScreen = 3000; // Second Screen Delay $dtLoadingScreen::Delay = 0; @@ -149,6 +149,10 @@ if (!isActivePackage(LoadScreenPackage) && $Host::LoadingScreenUseDebrief) // Just make our own function ALTsendModInfoToClient(%client) { + if(%client.isReady){ + return; + } + // Wont allow Debrief on consecutive map loads if(%client.loaded) { From 90620a1c6c5900f5136688a45f9945a2f3af1a57 Mon Sep 17 00:00:00 2001 From: ChocoTaco1 Date: Mon, 18 Aug 2025 17:56:46 -0400 Subject: [PATCH 23/37] Removed some things --- Classic/scripts/autoexec/MemPatches.cs | 85 +++++++++++++------------- 1 file changed, 42 insertions(+), 43 deletions(-) diff --git a/Classic/scripts/autoexec/MemPatches.cs b/Classic/scripts/autoexec/MemPatches.cs index ff9b7eb..bfd3888 100644 --- a/Classic/scripts/autoexec/MemPatches.cs +++ b/Classic/scripts/autoexec/MemPatches.cs @@ -4,59 +4,58 @@ //From Krash memPatch("756076","6169"); -// Thanks Turkeh -// TraversalRoot Console spam fix -function suppressTraversalRootPatch() -{ - if($tvpatched) - return; +//// Thanks Turkeh +//// TraversalRoot Console spam fix +//function suppressTraversalRootPatch() +//{ + //if($tvpatched) + //return; - warn("Patching traversal root error..."); - memPatch("56AD8A", "90909090909090909090909090909090909090909090"); - memPatch("56D114", "90909090909090909090909090909090909090909090"); - $tvpatched = 1; -} + //warn("Patching traversal root error..."); + //memPatch("56AD8A", "90909090909090909090909090909090909090909090"); + //memPatch("56D114", "90909090909090909090909090909090909090909090"); + //$tvpatched = 1; +//} -if (!$CmdArmor::Patched) -{ - $CmdArmor::Patched = true; - //memPatch("6FC746", "66B8000090906683FE017408ACAA84C075FA89D05F5EC3"); - memPatch("6FC746", "83FE017408ACAA84C075FA89D05F5EC3"); - //Removed register size override (cmp si, 1 -> cmp esi, 1) and got rid of - //weird NASM garbage code at the beginning. Had a mov ax, 0 which did nothing - //and wasn't necessary anyways because of xor eax, eax in the original. It also - //generated several NOPs after that for no reason. -} +//if (!$CmdArmor::Patched) +//{ + //$CmdArmor::Patched = true; + ////memPatch("6FC746", "66B8000090906683FE017408ACAA84C075FA89D05F5EC3"); + //memPatch("6FC746", "83FE017408ACAA84C075FA89D05F5EC3"); + ////Removed register size override (cmp si, 1 -> cmp esi, 1) and got rid of + ////weird NASM garbage code at the beginning. Had a mov ax, 0 which did nothing + ////and wasn't necessary anyways because of xor eax, eax in the original. It also + ////generated several NOPs after that for no reason. +//} -function serverCmd(%client) -{ - // Stick your own administrative action code here - messageAll('msgAll',"\c3" @ %client.namebase SPC "is attempting to crash the server!"); +//function serverCmd(%client) +//{ + //// Stick your own administrative action code here + //messageAll('msgAll',"\c3" @ %client.namebase SPC "is attempting to crash the server!"); - messageClient(%client, 'onClientBanned', ""); - messageAllExcept( %client, -1, 'MsgClientDrop', "", %client.name, %client ); + //messageClient(%client, 'onClientBanned', ""); + //messageAllExcept( %client, -1, 'MsgClientDrop', "", %client.name, %client ); - // kill and delete this client - if( isObject(%client.player) ) - %client.player.scriptKill(0); + //// kill and delete this client + //if( isObject(%client.player) ) + //%client.player.scriptKill(0); - if ( isObject( %client ) ) - { - %client.setDisconnectReason("You have been banned for attempting to crash the server."); - %client.schedule(700, "delete"); - } + //if ( isObject( %client ) ) + //{ + //%client.setDisconnectReason("You have been banned for attempting to crash the server."); + //%client.schedule(700, "delete"); + //} - BanList::add(%client.guid, %client.getAddress(), $Host::BanTime); -} + //BanList::add(%client.guid, %client.getAddress(), $Host::BanTime); +//} -//Disable UE box on crash +//Disable UE box on crash (Tribesnext Preview Unpatched Only) //Used if a clean crash is desired -memPatch("7dc7fc","90"); +//memPatch("7dc7fc","90"); //Loops Crash patch (Prevent the Uncaught Exception dialog from appearing) -memPatch("006ff376", "909090909090"); +//memPatch("006ff376", "909090909090"); //Show Linux Icon in server list //memPatch("5C9628","80CB05"); - -//Bahke MPB stability fix -//memPatch("614120","9090"); \ No newline at end of file +//Show no Linux Icon +//memPatch("5C9628","80CB01"); From d5a0cad2a253c519c451c0ac140a9e29968e6c21 Mon Sep 17 00:00:00 2001 From: ChocoTaco1 Date: Mon, 18 Aug 2025 18:00:24 -0400 Subject: [PATCH 24/37] Update 10.59 --- Classic/scripts/autoexec/z_dtStats.cs | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/Classic/scripts/autoexec/z_dtStats.cs b/Classic/scripts/autoexec/z_dtStats.cs index 448a3b0..f6a03cf 100644 --- a/Classic/scripts/autoexec/z_dtStats.cs +++ b/Classic/scripts/autoexec/z_dtStats.cs @@ -1,4 +1,5 @@ + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Stats system for classic and base // Script BY: DarkTiger @@ -15,7 +16,7 @@ // Note See bottom of file for full log ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //-----------Settings----------- -$dtStats::version = 10.58; +$dtStats::version = 10.59; //disable stats system $dtStats::Enable = $Host::dtStatsEnable $= "" ? ($Host::dtStatsEnable = 1) : $Host::dtStatsEnable; if(!$dtStats::Enable){ return;}// so it disables with a restart @@ -1862,6 +1863,8 @@ $statsName["discKillGroundTG"] = "Ground Disc Kills" TAB "Total"; $statsName["WLRAvg"] = "Win Loss Ratio" TAB "Average"; $statsName["roundsWonTG"] = "Rounds Won" TAB "Total"; $statsName["hatTricksTG"] = "Hat Tricks" TAB "Total"; +$statsName["OffKillsTG"] = "Offensive Kills" TAB "Total"; +$statsName["DefKillsTG"] = "Defensive Kills" TAB "Total"; $panelCount = 0; $upperWepPanel[$panelCount, "CTFGame"] = "discMAHitDistMax"; $upperWepPanel[$panelCount++, "CTFGame"] = "plasmaMAHitDistMax";$upperWepPanel[$panelCount++, "CTFGame"] = "blasterMAHitDistMax"; @@ -16456,7 +16459,7 @@ function genBigStats(%game, %lType, %mon, %year){ %year = 2024; } %callCount = 0; - %callTime = 16; + %callTime = 32; deleteVariables("$textColor*"); %mainXSize =1860; %mainySize = 1115; @@ -16688,7 +16691,7 @@ function genMapStatsImg(%game,%count){ return; } %callCount = 0; - %callTime = 16; + %callTime = 32; deleteVariables("$textColor*"); %mainXSize =1860; %mainySize = 1115; @@ -16955,12 +16958,12 @@ function imgCycle3(%img, %count){ } %img.yc++; if(%img.yc < %img.y) - schedule(32,0,"imgCycle3",%img); + schedule(32,0,"imgCycle3",%img, %count); else{ %img.close(); %img.delete(); deleteVariables("$textColor*"); - error("Stats Image Done"); + error("Stats Image Done" SPC %count); genBigMapStats(%count++); } } @@ -17202,7 +17205,7 @@ function renderArenaMapTextTM(%id){ %sizeX = 1280+20; %sizeY = 810; - %callTime = 8; + %callTime = 32; %spaceing = 20; %justLeft = 355; %justLeft2 = 55; @@ -17979,7 +17982,7 @@ function renderLCTFMapTextTM(%id){ %sizeX = 1280+20; %sizeY = 810; - %callTime = 8; + %callTime = 32; %spaceing = 20; %justLeft = 355; %justLeft2 = 55; @@ -18756,7 +18759,7 @@ function renderCTFMapTextTM(%id){ %sizeX = 1280+20; %sizeY = 1115; - %callTime = 8; + %callTime = 32; %spaceing = 20; %justLeft = 355; %justLeft2 = 55; @@ -19804,6 +19807,12 @@ function dtBuildMissionList(%reset){ } else if ( getSubStr( %line, 0, 18 ) $= "// MissionTypes = " ){ %typeList = getSubStr( %line, 18, 1000 ); + if(strstr(%typeList,"CTF") != -1 && strstr(%typeList,"LCTF") == -1){ + %typeList = %typeList SPC "LCTF"; + } + if(strstr(%typeList,"CTF") != -1 && strstr(%typeList,"SCtF") == -1){ + %typeList = %typeList SPC "SCtF"; + } break; } } From e96039866f74e6fd16e2b65f3be29af98772d4f7 Mon Sep 17 00:00:00 2001 From: ChocoTaco1 Date: Sat, 27 Sep 2025 17:49:57 -0400 Subject: [PATCH 25/37] Comp Reversions --- Classic/scripts/CTFGame.cs | 2 +- Classic/scripts/autoexec/TacoOverrides.cs | 11 --- Classic/scripts/defaultGame.cs | 4 +- Classic/scripts/packs/cloakingpack.cs | 2 +- Classic/scripts/packs/sensorjammerpack.cs | 47 ++++++----- Classic/scripts/player.cs | 12 +-- Classic/scripts/vehicles/vehicle_tank.cs | 2 +- Classic/scripts/weapons/flashGrenade.cs | 2 +- Classic/scripts/weapons/missileLauncher.cs | 83 +++++++++---------- Classic/scripts/weapons/mortar.cs | 95 +++++++++++----------- README.md | 25 +++--- 11 files changed, 135 insertions(+), 150 deletions(-) diff --git a/Classic/scripts/CTFGame.cs b/Classic/scripts/CTFGame.cs index 5677f3c..bf65472 100755 --- a/Classic/scripts/CTFGame.cs +++ b/Classic/scripts/CTFGame.cs @@ -2019,7 +2019,7 @@ function CTFGame::awardScoreKill(%game, %killerID) function checkVehicleCamping( %team ) { %position = $flagPos[%team]; - %radius = 15; + %radius = 5; InitContainerRadiusSearch(%position, %radius, $TypeMasks::VehicleObjectType ); while ((%vehicle = containerSearchNext()) != 0) diff --git a/Classic/scripts/autoexec/TacoOverrides.cs b/Classic/scripts/autoexec/TacoOverrides.cs index 640ee4b..0e8fb6e 100644 --- a/Classic/scripts/autoexec/TacoOverrides.cs +++ b/Classic/scripts/autoexec/TacoOverrides.cs @@ -323,17 +323,6 @@ function serverCmdScopeCommanderMap(%client, %scope) %client.player.ccActive = %scope; } -//Mortar Throw Reload Fix -// function ShapeBase::throwWeapon(%this) -// { -// if((%this.getMountedImage($WeaponSlot).getName() $= "MortarImage" || %this.getMountedImage($WeaponSlot).getName() $= "MissileLauncherImage" || %this.getMountedImage($WeaponSlot).getName() $= "ShockLanceImage") && -// (%this.getImageState($WeaponSlot) $= "Reload" || %this.getImageState($WeaponSlot) $= "Fire")){ -// return; -// } - -// parent::throwWeapon(%this); -// } - // Added object check function VehicleData::damageObject(%data, %targetObject, %sourceObject, %position, %amount, %damageType, %momVec, %theClient, %proj) diff --git a/Classic/scripts/defaultGame.cs b/Classic/scripts/defaultGame.cs index 46f4386..64609f6 100644 --- a/Classic/scripts/defaultGame.cs +++ b/Classic/scripts/defaultGame.cs @@ -459,9 +459,9 @@ function DefaultGame::createPlayer(%game, %client, %spawnLoc, %respawn) if(%respawn) { %player.setInvincible(true); - %player.setCloaked(true); // z0dd - ZOD, 8/6/02. Don't spawn players cloaked //was // + //%player.setCloaked(true); // z0dd - ZOD, 8/6/02. Don't spawn players cloaked %player.setInvincibleMode($InvincibleTime,0.02); - %player.respawnCloakThread = %player.schedule($InvincibleTime * 50, "setRespawnCloakOff"); // z0dd - ZOD, 8/6/02. Don't spawn players cloaked //was 1000 + //%player.respawnCloakThread = %player.schedule($InvincibleTime * 50, "setRespawnCloakOff"); // z0dd - ZOD, 8/6/02. Don't spawn players cloaked //was 1000 %player.schedule($InvincibleTime * 1000, "setInvincible", false); } diff --git a/Classic/scripts/packs/cloakingpack.cs b/Classic/scripts/packs/cloakingpack.cs index b21ae1c..5ed4048 100755 --- a/Classic/scripts/packs/cloakingpack.cs +++ b/Classic/scripts/packs/cloakingpack.cs @@ -34,7 +34,7 @@ datablock AudioDescription(CloakLooping3d) is3D = true; minDistance= 10.0; - MaxDistance= 55.0; //Was 50 + MaxDistance= 50.0; type = $EffectAudioType; environmentLevel = 1.0; }; diff --git a/Classic/scripts/packs/sensorjammerpack.cs b/Classic/scripts/packs/sensorjammerpack.cs index b7085ef..2ac0e64 100644 --- a/Classic/scripts/packs/sensorjammerpack.cs +++ b/Classic/scripts/packs/sensorjammerpack.cs @@ -64,7 +64,7 @@ datablock ItemData(SensorJammerPack) }; -datablock SensorData(JammerSensorObjectPassive) //v2 was commented out... +datablock SensorData(JammerSensorObjectPassive) { // same detection info as 'PlayerObject' sensorData detects = true; @@ -76,7 +76,7 @@ datablock SensorData(JammerSensorObjectPassive) //v2 was commented out... detectFOVPercent = 1.3; useObjectFOV = true; - detectscloaked = 1; //v2 + //detectscloaked = 1; //v2 jams = true; jamsOnlyGroup = true; @@ -96,52 +96,55 @@ datablock SensorData(JammerSensorObjectActive) detectFOVPercent = 1.3; useObjectFOV = true; - detectscloaked = 1; //v2 + //detectscloaked = 1; //v2 jams = true; jamsOnlyGroup = true; jamsUsingLOS = true; - jamRadius = 45; //was 30 + jamRadius = 30; }; function SensorJammerPackImage::onMount(%data, %obj, %slot) { - setTargetSensorData(%obj.client.target, JammerSensorObjectPassive); //v2 - %obj.setImageTrigger(%slot, false); - commandToClient( %obj.client, 'setSenJamIconOff' ); - %obj.setJammerFX(false); + setTargetSensorData(%obj.client.target, JammerSensorObjectPassive); } -function deactivateJammer(%data, %obj, %slot) +function SensorJammerPackImage::onUnmount(%data, %obj, %slot) { - SensorJammerPackImage::onDeactivate(%data, %obj, %slot); -} - -function SensorJammerPackImage::onUnmount(%data, %obj, %slot) //v2 -{ - %obj.setImageTrigger(%slot, false); setTargetSensorData(%obj.client.target, PlayerSensor); + %obj.setImageTrigger(%slot, false); } function SensorJammerPackImage::onActivate(%data, %obj, %slot) { messageClient(%obj.client, 'MsgSensorJammerPackOn', '\c2Sensor jammer pack on.'); setTargetSensorData(%obj.client.target, JammerSensorObjectActive); + // z0dd - ZOD, 9/29/02. Removed T2 demo code from here commandToClient( %obj.client, 'setSenJamIconOn' ); + %obj.setJammerFX( true ); } function SensorJammerPackImage::onDeactivate(%data, %obj, %slot) { messageClient(%obj.client, 'MsgSensorJammerPackOff', '\c2Sensor jammer pack off.'); - setTargetSensorData(%obj.client.target, PlayerSensor); //v2 H bug fix %obj.setImageTrigger(%slot, false); - setTargetSensorData(%obj.client.target, JammerSensorObjectPassive); //v2 was PlayerSensor + + // ---------------------------------------------------------------------- + // z0dd - ZOD, 4/25/02. This function is actually getting called AFTER + // ::onUnmount. We must check to see what the players current sensor data + // is, then if it is NOT PlayerSensor, set to passive jam, bug fix. + if(getTargetSensorData(%obj.client.target).getName() !$= "PlayerSensor") + setTargetSensorData(%obj.client.target, JammerSensorObjectPassive); + // ---------------------------------------------------------------------- + + // z0dd - ZOD, 9/29/02. Removed T2 demo code from here commandToClient( %obj.client, 'setSenJamIconOff' ); + %obj.setJammerFX( false ); } - -function SensorJammerPack::onPickup(%this, %obj, %shape, %amount) -{ -//Nope -} +// z0dd - ZOD, 5/18/03. Removed functions, created parent. Streamline. +//function SensorJammerPack::onPickup(%this, %obj, %shape, %amount) +//{ + // created to prevent console errors +//} diff --git a/Classic/scripts/player.cs b/Classic/scripts/player.cs index 5139f30..d9558c1 100755 --- a/Classic/scripts/player.cs +++ b/Classic/scripts/player.cs @@ -1085,8 +1085,8 @@ datablock ParticleData(LightPuff) textureName = "particleTest"; colors[0] = "0.46 0.36 0.26 0.4"; colors[1] = "0.46 0.46 0.36 0.0"; - sizes[0] = 0.8; //was 0.4 - sizes[1] = 1.4; //was 1.0 + sizes[0] = 0.4; + sizes[1] = 1.0; }; datablock ParticleEmitterData(LightPuffEmitter) @@ -1123,9 +1123,9 @@ datablock ParticleData(LiftoffDust) colors[0] = "0.46 0.36 0.26 0.0"; colors[1] = "0.46 0.46 0.36 0.4"; colors[2] = "0.46 0.46 0.36 0.0"; - sizes[0] = 0.6; //was 0.2 - sizes[1] = 1.0; //was 0.6 - sizes[2] = 1.4; //was 1.0 + sizes[0] = 0.2; + sizes[1] = 0.6; + sizes[2] = 1.0; times[0] = 0.0; times[1] = 0.5; times[2] = 1.0; @@ -1765,7 +1765,7 @@ datablock PlayerData(HeavyMaleHumanArmor) : HeavyPlayerDamageProfile //Value changed halfway between base and classic. //Classic is 54, Base is 75 //Shield breaks right at two mine-disc - energyPerDamagePoint = 60.0; // shield energy required to block one point of damage + energyPerDamagePoint = 54.0; // shield energy required to block one point of damage rechargeRate = 0.256; jetForce = 29.58 * 180; diff --git a/Classic/scripts/vehicles/vehicle_tank.cs b/Classic/scripts/vehicles/vehicle_tank.cs index 6cac286..55432e7 100755 --- a/Classic/scripts/vehicles/vehicle_tank.cs +++ b/Classic/scripts/vehicles/vehicle_tank.cs @@ -235,7 +235,7 @@ datablock HoverVehicleData(AssaultVehicle) : TankDamageProfile isShielded = true; rechargeRate = 1.0; - energyPerDamagePoint = 142; //was 135 + energyPerDamagePoint = 135; maxEnergy = 400; minJetEnergy = 15; jetEnergyDrain = 2.0; diff --git a/Classic/scripts/weapons/flashGrenade.cs b/Classic/scripts/weapons/flashGrenade.cs index 7bb3eda..7241668 100755 --- a/Classic/scripts/weapons/flashGrenade.cs +++ b/Classic/scripts/weapons/flashGrenade.cs @@ -37,7 +37,7 @@ datablock ItemData(FlashGrenadeThrown) radiusDamageType = $DamageType::Grenade; kickBackStrength = 1000; computeCRC = true; - maxWhiteout = 0.78; // z0dd - ZOD, 9/8/02. Was 1.2 //Reduced. Was 0.9 Choco + maxWhiteout = 0.9; // z0dd - ZOD, 9/8/02. Was 1.2 }; datablock ItemData(FlashGrenade) diff --git a/Classic/scripts/weapons/missileLauncher.cs b/Classic/scripts/weapons/missileLauncher.cs index abaec08..65063fe 100644 --- a/Classic/scripts/weapons/missileLauncher.cs +++ b/Classic/scripts/weapons/missileLauncher.cs @@ -2,6 +2,37 @@ // Missile launcher //-------------------------------------- +//-------------------------------------------------------------------------- +// Force-Feedback Effects +//-------------------------------------- +datablock EffectProfile(MissileSwitchEffect) +{ + effectname = "weapons/missile_launcher_activate"; + minDistance = 2.5; + maxDistance = 2.5; +}; + +datablock EffectProfile(MissileFireEffect) +{ + effectname = "weapons/missile_fire"; + minDistance = 2.5; + maxDistance = 5.0; +}; + +datablock EffectProfile(MissileDryFireEffect) +{ + effectname = "weapons/missile_launcher_dryfire"; + minDistance = 2.5; + maxDistance = 2.5; +}; + +datablock EffectProfile(MissileExplosionEffect) +{ + effectname = "explosions/explosion.xpl23"; + minDistance = 10; + maxDistance = 30; +}; + //-------------------------------------------------------------------------- // Sounds //-------------------------------------- @@ -10,6 +41,7 @@ datablock AudioProfile(MissileSwitchSound) filename = "fx/weapons/missile_launcher_activate.wav"; description = AudioClosest3d; preload = true; + effect = MissileSwitchEffect; }; datablock AudioProfile(MissileFireSound) @@ -17,6 +49,7 @@ datablock AudioProfile(MissileFireSound) filename = "fx/weapons/missile_fire.WAV"; description = AudioDefault3d; preload = true; + effect = MissileFireEffect; }; datablock AudioProfile(MissileProjectileSound) @@ -45,6 +78,7 @@ datablock AudioProfile(MissileExplosionSound) filename = "fx/explosions/explosion.xpl23.wav"; description = AudioBIGExplosion3d; preload = true; + effect = MissileExplosionEffect; }; datablock AudioProfile(MissileDryFireSound) @@ -52,6 +86,7 @@ datablock AudioProfile(MissileDryFireSound) filename = "fx/weapons/missile_launcher_dryfire.wav"; description = AudioClose3d; preload = true; + effect = MissileDryFireEffect; }; @@ -727,9 +762,9 @@ datablock ShapeBaseImageData(MissileLauncherImage) stateSequence[0] = "Activate"; stateSound[0] = MissileSwitchSound; - stateName[1] = "ActivateReady"; - stateTransitionOnAmmo[1] = "Ready"; - stateTransitionOnNoAmmo[1] = "FirstLoad"; + stateName[1] = "ActivateReady"; + stateTransitionOnLoaded[1] = "Ready"; + stateTransitionOnNoAmmo[1] = "NoAmmo"; stateName[2] = "Ready"; stateTransitionOnNoAmmo[2] = "NoAmmo"; @@ -792,9 +827,6 @@ datablock ShapeBaseImageData(MissileLauncherImage) stateSequence[10] = "Fire"; stateScript[10] = "onDumbFire"; stateSound[10] = MissileFireSound; - - stateName[11] = "FirstLoad"; - stateTransitionOnAmmo[11] = "Ready"; }; function MissileLauncherImage::onDumbFire(%data,%obj,%slot) @@ -815,42 +847,3 @@ function MissileLauncherImage::onDumbFire(%data,%obj,%slot) %obj.decInventory(%data.ammo, 1); return %p; } -function MissileLauncherImage::onUnmount(%this,%obj,%slot){ - parent::onUnmount(%this,%obj,%slot); - if(isEventPending(%obj.reloadDelaySch)) - cancel(%obj.reloadDelaySch); -} -function MissileLauncherImage::onMount(%this,%obj,%slot){ - - if(%obj.getClassName() !$= "Player") - return; - - if (%this.armthread $= "") - %obj.setArmThread(look); - else - %obj.setArmThread(%this.armThread); - - if(%obj.getMountedImage($WeaponSlot).ammo !$= ""){ - if (%obj.getInventory(%this.ammo)){ - - %fireAndReloadTime = mFloor((%this.stateTimeoutValue[4] + %this.stateTimeoutValue[3]) * 1000); - - if(%obj.lfireTime[%this.getName()] && (getSimTime() - %obj.lfireTime[%this.getName()]) < %fireAndReloadTime){ - if(isEventPending(%obj.reloadDelaySch)){ - cancel(%obj.reloadDelaySch); - } - %time = mFloor(%fireAndReloadTime - (getSimTime() - %obj.lfireTime[%this.getName()])); - %obj.reloadDelaySch = schedule(%time, 0, "ammoStateDelay", %obj, %slot, true); - } - else{ - %obj.setImageAmmo(%slot,true); - } - } - } - - %obj.client.setWeaponsHudActive(%this.item); - if(%obj.getMountedImage($WeaponSlot).ammo !$= "") - %obj.client.setAmmoHudCount(%obj.getInventory(%this.ammo)); - else - %obj.client.setAmmoHudCount(-1); -} \ No newline at end of file diff --git a/Classic/scripts/weapons/mortar.cs b/Classic/scripts/weapons/mortar.cs index 876ee09..4d33872 100644 --- a/Classic/scripts/weapons/mortar.cs +++ b/Classic/scripts/weapons/mortar.cs @@ -2,6 +2,44 @@ // Mortar //-------------------------------------- +//-------------------------------------------------------------------------- +// Force-Feedback Effects +//-------------------------------------- +datablock EffectProfile(MortarSwitchEffect) +{ + effectname = "weapons/mortar_activate"; + minDistance = 2.5; + maxDistance = 2.5; +}; + +datablock EffectProfile(MortarFireEffect) +{ + effectname = "weapons/mortar_fire"; + minDistance = 2.5; + maxDistance = 5.0; +}; + +datablock EffectProfile(MortarReloadEffect) +{ + effectname = "weapons/mortar_reload"; + minDistance = 2.5; + maxDistance = 2.5; +}; + +datablock EffectProfile(MortarDryFireEffect) +{ + effectname = "weapons/mortar_dryfire"; + minDistance = 2.5; + maxDistance = 2.5; +}; + +datablock EffectProfile(MortarExplosionEffect) +{ + effectname = "explosions/explosion.xpl03"; + minDistance = 30; + maxDistance = 65; +}; + //-------------------------------------------------------------------------- // Sounds //-------------------------------------- @@ -10,6 +48,7 @@ datablock AudioProfile(MortarSwitchSound) filename = "fx/weapons/mortar_activate.wav"; description = AudioClosest3d; preload = true; + effect = MortarSwitchEffect; }; datablock AudioProfile(MortarReloadSound) @@ -17,6 +56,7 @@ datablock AudioProfile(MortarReloadSound) filename = "fx/weapons/mortar_reload.wav"; description = AudioClosest3d; preload = true; + effect = MortarReloadEffect; }; datablock AudioProfile(MortarIdleSound) @@ -25,6 +65,7 @@ datablock AudioProfile(MortarIdleSound) filename = "fx/weapons/plasma_rifle_idle.wav"; description = ClosestLooping3d; preload = true; + effect = PlasmaIdleEffect; }; datablock AudioProfile(MortarFireSound) @@ -32,6 +73,7 @@ datablock AudioProfile(MortarFireSound) filename = "fx/weapons/mortar_fire.wav"; description = AudioDefault3d; preload = true; + effect = MortarFireEffect; }; datablock AudioProfile(MortarProjectileSound) @@ -46,6 +88,7 @@ datablock AudioProfile(MortarExplosionSound) filename = "fx/weapons/mortar_explode.wav"; description = AudioBIGExplosion3d; preload = true; + effect = MortarExplosionEffect; }; datablock AudioProfile(UnderwaterMortarExplosionSound) @@ -53,6 +96,7 @@ datablock AudioProfile(UnderwaterMortarExplosionSound) filename = "fx/weapons/mortar_explode_UW.wav"; description = AudioBIGExplosion3d; preload = true; + effect = MortarExplosionEffect; }; datablock AudioProfile(MortarDryFireSound) @@ -60,6 +104,7 @@ datablock AudioProfile(MortarDryFireSound) filename = "fx/weapons/mortar_dryfire.wav"; description = AudioClose3d; preload = true; + effect = MortarDryFireEffect; }; //---------------------------------------------------------------------------- @@ -740,8 +785,8 @@ datablock ShapeBaseImageData(MortarImage) stateSound[0] = MortarSwitchSound; stateName[1] = "ActivateReady"; - stateTransitionOnAmmo[1] = "Ready"; - stateTransitionOnNoAmmo[1] = "FirstLoad"; + stateTransitionOnLoaded[1] = "Ready"; + stateTransitionOnNoAmmo[1] = "NoAmmo"; stateName[2] = "Ready"; stateTransitionOnNoAmmo[2] = "NoAmmo"; @@ -775,50 +820,4 @@ datablock ShapeBaseImageData(MortarImage) stateSound[6] = MortarDryFireSound; stateTimeoutValue[6] = 1.5; stateTransitionOnTimeout[6] = "NoAmmo"; - - stateName[7] = "FirstLoad"; - stateTransitionOnAmmo[7] = "Ready"; }; - -function MortarImage::onUnmount(%this,%obj,%slot){ - parent::onUnmount(%this,%obj,%slot); - if(isEventPending(%obj.reloadDelaySch)) - cancel(%obj.reloadDelaySch); -} -function MortarImage::onMount(%this,%obj,%slot){ - - if(%obj.getClassName() !$= "Player") - return; - - if (%this.armthread $= "") - %obj.setArmThread(look); - else - %obj.setArmThread(%this.armThread); - - if(%obj.getMountedImage($WeaponSlot).ammo !$= ""){ - if (%obj.getInventory(%this.ammo)){ - %fireAndReloadTime = mFloor((%this.stateTimeoutValue[4] + %this.stateTimeoutValue[3]) * 1000); - if(%obj.lfireTime[%this.getName()] && (getSimTime() - %obj.lfireTime[%this.getName()]) < %fireAndReloadTime){ - if(isEventPending(%obj.reloadDelaySch)){ - cancel(%obj.reloadDelaySch); - } - %time = mFloor(%fireAndReloadTime - (getSimTime() - %obj.lfireTime[%this.getName()])); - %obj.reloadDelaySch = schedule(%time, 0, "ammoStateDelay", %obj, %slot, true); - } - else{ - %obj.setImageAmmo(%slot,true); - } - } - } - - %obj.client.setWeaponsHudActive(%this.item); - if(%obj.getMountedImage($WeaponSlot).ammo !$= "") - %obj.client.setAmmoHudCount(%obj.getInventory(%this.ammo)); - else - %obj.client.setAmmoHudCount(-1); -} - -function ammoStateDelay(%obj, %slot, %state){ - if(isObject(%obj) && %obj.getState() !$= "Dead") - %obj.setImageAmmo(%slot, %state); -} \ No newline at end of file diff --git a/README.md b/README.md index 568c238..1a83266 100644 --- a/README.md +++ b/README.md @@ -45,19 +45,20 @@ Discord: [Tribes 2 Discord](https://playt2.com/discord) --- ### Important Gameplay Changes over stock classic - - OG blaster buffed for Heavy Armors - - No Vehicle Zone around flag is bigger 5 >> 15 - - Heavy Shield Nerfed (54 to block 1 DMG, is now 60) + - OG blaster buffed against Heavy Armors (Not Tournament Mode Only) - Max FOV 120 >> 138 (For Wide Screens) - - Item respawn time can be changed (default 30) - - Cloak Sound 50m >> 55m - - Bigger ground dust puffs (For cloak) 0.4 larger - - Sensor Jammer jam radius is buffed to jam cloaks 30 >> 45 - - Sensor Jammer can passively see cloaker's triangle - - Mortor reload rework (Player can throw, but must wait until reload time has passed) - - Tank Shield Nerf (135 to block 1 DMG, is now 142) - - Whiteout grenades are less seizurely (Due to spamming) 0.9 >> 0.78 - - All water viscosity follows a global preset + - Item respawn time can be changed (Optional) + - All water viscosity follows a global preset (3) + - No Vehicle Zone around flag is bigger 5 >> 15 + - Heavy Shield Nerfed (54 to block 1 DMG, is now 60) + - Cloak Sound 50m >> 55m + - Bigger ground dust puffs (For cloak) 0.4 larger + - Sensor Jammer jam radius is buffed to jam cloaks 30 >> 45 + - Sensor Jammer can passively see cloaker's triangle + - Mortor reload rework (Player can throw, but must wait until reload time has passed) + - Tank Shield Nerf (135 to block 1 DMG, is now 142) + - Whiteout grenades are less seizurely (Due to spamming) 0.9 >> 0.78 + - Spawn fade-in effect --- From 8af6ce887cddcf7b63ea0888f7bf8f2dacf95e27 Mon Sep 17 00:00:00 2001 From: ChocoTaco1 Date: Sat, 27 Sep 2025 17:57:13 -0400 Subject: [PATCH 26/37] Update 10.60 --- Classic/scripts/autoexec/z_dtStats.cs | 113 +++++++++----------------- 1 file changed, 38 insertions(+), 75 deletions(-) diff --git a/Classic/scripts/autoexec/z_dtStats.cs b/Classic/scripts/autoexec/z_dtStats.cs index f6a03cf..a7e97cd 100644 --- a/Classic/scripts/autoexec/z_dtStats.cs +++ b/Classic/scripts/autoexec/z_dtStats.cs @@ -16,7 +16,7 @@ // Note See bottom of file for full log ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //-----------Settings----------- -$dtStats::version = 10.59; +$dtStats::version = 10.60; //disable stats system $dtStats::Enable = $Host::dtStatsEnable $= "" ? ($Host::dtStatsEnable = 1) : $Host::dtStatsEnable; if(!$dtStats::Enable){ return;}// so it disables with a restart @@ -13981,8 +13981,10 @@ package dtBanSys{ //Reapply the gag function GameConnection::onConnect( %client, %name, %raceGender, %skin, %voice, %voicePitch ){ + if (banList_checkClient(%client, getField(%client.t2csri_authInfo, 3))){ + return 0; + } parent::onConnect( %client, %name, %raceGender, %skin, %voice, %voicePitch ); - %client.isGagged = ($chatGagged[getClientCleanIP(%client)] || $chatGagged[%client.guid]); //restore status } @@ -13991,7 +13993,8 @@ package dtBanSys{ %time = (%time $= "") ? 100000 : %time; %name = getClientBanName(%guid, %ipAddress); %bareIP = getCleanIP(%ipAddress); - if(!isObject($dtBanTemp::GUID[%guid]) && !isObject($dtBanTemp::GUID[%bareIP])){ + //error("GUID" SPC %guid SPC "IP" SPC %bareIP); + if(!isObject($dtBanTemp::GUID[%guid]) && !isObject($dtBanTemp::IP[%bareIP])){ if(!isObject(dtBanList)){ new simGroup(dtBanList); RootGroup.add(dtBanList); @@ -14001,64 +14004,20 @@ package dtBanSys{ name = %name; guid = %guid; ip = %bareip; - banDateTime = dtMarkDate(); + banDateTime = dtMarkDate(); banLengthMin = %time; }; dtBanList.add(%banObj); - if(!%bareIP) + if(%bareIP !$= "0") $dtBanTemp::IP[%bareIP] = %banObj; if(%guid){ $dtBanTemp::GUID[%guid] = %banObj; rmvWhiteListGuid(%guid); } } - if(isObject($dtBanTemp::GUID[%guid]) && !isObject($dtBanTemp::GUID[%bareIP])){ - %obj = $dtBanTemp::GUID[%guid]; - %obj.ip = %bareIP; - } - else if(isObject($dtBanTemp::GUID[%bareIP]) && !isObject($dtBanTemp::GUID[%guid])){ - %obj = $dtBanTemp::GUID[%bareIP]; - %obj.guid = %guid; - } - saveBanList(); } - function banList_checkIP(%client){ - %ip = getClientCleanIP(%client); - %obj = $dtBanTemp::IP[%ip]; - if(isObject(%obj) && %obj.banDateTime > 0){ - %delta = getTimeDelta(%obj.banDateTime); - if (%delta < %obj.banLengthMin){ - pushFailJoin(%obj.name, %obj.gui, 0, "Kick/Ban" SPC %obj.banDateTime - %delta SPC "Minutes Left", 1); - return 1; - } - else{ - unbanUserObj(%obj); - } - } - return 0; - } - - // from tribes next did not want to override this but need to pass %client id into ban check to avoid wierd issues - function serverCmdt2csri_challengeResponse(%client, %serverChallenge){ - if (%client.doneAuthenticating) - return; - - if (%client.t2csri_serverChallenge $= %serverChallenge){ - // check to see if the client is GUID banned, now that we verified their certificate - if (banList_checkClientGUID(%client, getField(%client.t2csri_authInfo, 3))){ - return; - } - - // client checks out... continue loading sequence - %client.onConnect(%client.tname, %client.trgen, %client.tskin, %client.tvoic, %client.tvopi); - } - else{ - %client.setDisconnectReason("Invalid server challenge. Check your account key for corruption."); - %client.delete(); - } - } }; function dtIsAdmin(%client,%guid){ @@ -14082,10 +14041,12 @@ function dtIsAdmin(%client,%guid){ return false; } - - -function banList_checkClientGUID(%client, %guid){// only one we care about in whitelist mode - %obj = $dtBanTemp::GUID[%guid]; +function banList_checkClient(%client, %guid){// only one we care about in whitelist mode + //error("banlist check" SPC "client" SPC %client SPC "Guid" SPC %guid); + %objA = $dtBanTemp::GUID[%guid]; + %ip = getClientCleanIP(%client); + %objB = $dtBanTemp::IP[%ip]; + %obj = (isObject(%objA) == 1) ? %objA : %objB; if (isObject(%obj) && %obj.banDateTime > 0){ %delta = getTimeDelta(%obj.banDateTime); if (%delta < %obj.banLengthMin){ @@ -14099,30 +14060,31 @@ function banList_checkClientGUID(%client, %guid){// only one we care about in wh unbanUserObj(%obj); } } + if(isObject(%objA)){ + %realName = getField(%client.t2csri_authInfo, 0 ); + if(%realName !$= "") + %name = trim(%realName); + else + %name = trim(stripChars( detag( getTaggedString( %fc.name ) ), "\cp\co\c6\c7\c8\c9\c0" )); - %realName = getField(%client.t2csri_authInfo, 0 ); - if(%realName !$= "") - %name = trim(%realName); - else - %name = trim(stripChars( detag( getTaggedString( %fc.name ) ), "\cp\co\c6\c7\c8\c9\c0" )); + %safe = ( dtIsAdmin(%client,%guid) || isObject($dtWhtList::WhiteList[%guid])); + if(!%safe){ + pushFailJoin(%name, %guid, 0, "Not Whitelisted", 0); + if($dtServerVars::WhiteListMode){ + %client.setDisconnectReason("Server is locked, please message admin or wait for approval"); + %client.delete(); + return 1; + } + } - %safe = ( dtIsAdmin(%client,%guid) || isObject($dtWhtList::WhiteList[%guid])); - if(!%safe){ - pushFailJoin(%name, %guid, 0, "Not Whitelisted", 0); - if($dtServerVars::WhiteListMode){ - %client.setDisconnectReason("Server is locked, please message admin or wait for approval"); + // this is here in case of banned ip is a whitelisted account + if($dtServerVars::IPBanListMode && $dtIPList[%ip] && !isObject($dtWhtList::WhiteList[%guid])){ + pushFailJoin(%name, %client.guid, %ip, "IP Ban List", 2); + %client.setDisconnectReason("You are not allowed to play on this server."); %client.delete(); return 1; } } - - %ip = getClientCleanIP(%client);// this is here in case of banned ip is a whitelisted account - if($dtServerVars::IPBanListMode && $dtIPList[%ip] && !isObject($dtWhtList::WhiteList[%guid])){ - pushFailJoin(%name, %client.guid, %ip, "IP Ban List", 2); - %client.setDisconnectReason("You are not allowed to play on this server."); - %client.delete(); - return 1; - } return 0; } @@ -20571,16 +20533,17 @@ function mapCyleTest(){ // Added custom two team debrief as well as a evo style extended stats // Reworked enable disable, only disables stats saving and stats access, do to systems relying on systems // -// 10.1 - 10.2 - 10.3 +// 10.1 - 10.2 - 10.3 - 10.6 // Ban system changes // Fix bad loop in ban system // Misc arena things // Added LCTF Naming // serverPrefs Support -//////////////////////////////////////////////////////////////////////////////// -////////////////////////////////Storage///////////////////////////////////////// -//////////////////////////////////////////////////////////////////////////////// +// bansystem rework doto new tribes next changes + +//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// function testVarsRandomAll(%max){ %game = Game.class; for(%q = 0; %q < $statsVars::count[%game]; %q++){ From b5ed76eb54f48a431c2c1fd9bc93a89fda26da45 Mon Sep 17 00:00:00 2001 From: ChocoTaco1 Date: Sat, 27 Sep 2025 18:06:42 -0400 Subject: [PATCH 27/37] Fix Readme logo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1a83266..a7e3d5f 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -![Tribes 2](https://media.discordapp.net/attachments/1160685717303861413/1160685718176280666/68747470733a2f2f63646e2e646973636f72646170702e636f6d2f6174746163686d656e74732f3532313739373031323031343735393937302f3637383436303530353539373134393231342f5461636f5365727665722e706e67.png?ex=671814cf&is=6716c34f&hm=7d071d3b2e221ad89b80de48f91e4ed17d548573c16ed512f3a03efaa719b605&) +![Tribes 2](https://playt2.com/images/avatar300.png) # TacoServer ## A Tribes 2 server with competitive features that is also open-source. From e1f42951afa3af8e13321f1bfe8cbb2c360f1a9c Mon Sep 17 00:00:00 2001 From: ChocoTaco1 Date: Mon, 27 Oct 2025 14:06:01 -0400 Subject: [PATCH 28/37] Reenable Zodd's rapid fire fix Forgot this existed, whoops Use classic code --- Classic/scripts/projectiles.cs | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/Classic/scripts/projectiles.cs b/Classic/scripts/projectiles.cs index 1ba0fd7..3e30715 100644 --- a/Classic/scripts/projectiles.cs +++ b/Classic/scripts/projectiles.cs @@ -62,21 +62,20 @@ function ShapeBaseImageData::onFire(%data, %obj, %slot) { // --------------------------------------------------------------------------- // z0dd - ZOD, 9/3/02. Anti rapid fire mortar/missile fix. - // if (%obj.cantFire !$= "") - // { - // return 0; - // } + if (%obj.cantFire !$= "") + { + return 0; + } - // %wpnName = %data.getName(); - // if((%wpnName $= "MortarImage") || (%wpnName $= "MissileLauncherImage")) - // { - // %obj.cantFire = 1; - // %preventTime = %data.stateTimeoutValue[4]; - // //%preventTime = (%data.stateTimeoutValue[4] + %data.stateTimeoutValue[3]) - 0.032; - // %obj.reloadSchedule = schedule(%preventTime * 1000, %obj, resetFire, %obj); - // } + %wpnName = %data.getName(); + if((%wpnName $= "MortarImage") || (%wpnName $= "MissileLauncherImage")) + { + %obj.cantFire = 1; + %preventTime = %data.stateTimeoutValue[4]; + %obj.reloadSchedule = schedule(%preventTime * 1000, %obj, resetFire, %obj); + } // --------------------------------------------------------------------------- - %obj.lfireTime[%data.getName()] = getSimTime(); + //%obj.lfireTime[%data.getName()] = getSimTime(); %data.lightStart = getSimTime(); From 3e858b564963516a903477d9826b4e0470125195 Mon Sep 17 00:00:00 2001 From: ChocoTaco1 Date: Tue, 28 Oct 2025 14:42:20 -0400 Subject: [PATCH 29/37] General updates --- Classic/prefs/MapRotation.cs | 623 ------------------------------ Classic/prefs/mapRotation.cs | 507 ++++++++++++++++++++++++ Classic/prefs/serverPrefs.cs | 16 +- Classic/scripts/serverDefaults.cs | 20 +- 4 files changed, 525 insertions(+), 641 deletions(-) delete mode 100644 Classic/prefs/MapRotation.cs create mode 100644 Classic/prefs/mapRotation.cs diff --git a/Classic/prefs/MapRotation.cs b/Classic/prefs/MapRotation.cs deleted file mode 100644 index 3bb80e2..0000000 --- a/Classic/prefs/MapRotation.cs +++ /dev/null @@ -1,623 +0,0 @@ -// __ __ _____ _ _ _ -// | \/ | | __ \ | | | | (_) -// | \ / | __ _ _ __ | |__) |___ | |_ __ _| |_ _ ___ _ __ -// | |\/| |/ _` | '_ \ | _ // _ \| __/ _` | __| |/ _ \| '_ \ -// | | | | (_| | |_) | | | \ \ (_) | || (_| | |_| | (_) | | | | -// |_| |_|\__,_| .__/ |_| \_\___/ \__\__,_|\__|_|\___/|_| |_| -// | | -// |_| -// -// Use of this file -// To add a new map follow this rules: -// 1. Find the file name, ending in .mis (ie BeggarsRun.mis) -// 2. Add a line with this syntact: addRotationMap(filename, gametype, %voteable, %cycle, %min. %max); -// -//addRotationMap("MAP_NAME","MAP_MODE",VOTEABLE,IN-ROTATION,MINIMUM_PLAYERS,MAXIMUM_PLAYERS); -// -// Example: addRotationMap("BeggarsRun","CTF",1,1,-1,64); -// Beggar's Run will be in the mapRotation. It's in the cycle and can be voted. The map has no minimum player count requirement, and a 64 player max. -// -// Example: addRotationMap("BeggarsRun","CTF",1,0,10,20); -// Beggar's Run will be in the mapRotation. It's not in the cycle, but can be voted. The map has a minimum player count requirement of 10, and 20 players is the maximum to be picked. -// -// Example: addRotationMap("BeggarsRun","CTF",0,0,18,-1); -// Beggar's Run won't be in the mapRotation. It's not in the cycle and can't be voted. The map has a minimum player count requirement of 18, and has no maximum for players. -// -// -//addRotationMap("Casern_Cavite","Bounty",1,1,0,64); -//addRotationMap("Sirocco","CnH",1,1,0,64); -//addRotationMap("aabaaGH","CTF",1,0,0,64); -//addRotationMap("AcidRain","DnD",1,1,0,64); -//addRotationMap("AgentsOfFortune","Hunters",1,1,0,64); -//addRotationMap("SunDriedLak1","LakRabbit",1,1,0,64); -//addRotationMap("Arrakis","Rabbit",1,1,0,64); -//addRotationMap("VulcansHammer","Siege",1,1,0,64); -//addRotationMap("AgentsOfFortune","TeamHunters",1,1,0,64); -// - - -// _____ _______ ______ -// / ____|__ __| ____| -// | | | | | |__ -// | | | | | __| -// | |____ | | | | -// \_____| |_| |_| -///////////////////////////////////////////////////////////////////// - -//Small Maps -///////////////////////////////////////////////////////////////////// - -//addRotationMap("SmallCrossing", "CTF",1,1,-1,16); //Using DMP Version -addRotationMap("TWL2_CanyonCrusadeDeluxe", "CTF",1,1,-1,24); -addRotationMap("RoundTheMountain", "CTF",1,1,-1,18); -addRotationMap("oasisintensity", "CTF",1,1,-1,10); -addRotationMap("Minotaur", "CTF",1,0,-1,18); -addRotationMap("SmallMelee", "CTF",1,0,-1,12); -addRotationMap("Machineeggs", "CTF",1,1,-1,10); -addRotationMap("Mac_FlagArena", "CTF",1,0,-1,14); -addRotationMap("SmallTimeCTF", "CTF",1,0,-1,14); -addRotationMap("TWL2_Hildebrand", "CTF",1,1,-1,18); -addRotationMap("ArenaDome", "CTF",1,0,-1,12); -addRotationMap("Firestorm", "CTF",1,0,-1,12); -addRotationMap("Bulwark", "CTF",1,1,-1,12); -addRotationMap("Blink", "CTF",1,0,-1,10); -addRotationMap("Discord", "CTF",1,1,6,16); -addRotationMap("TWL2_MidnightMayhemDeluxe", "CTF",1,0,8,12); -addRotationMap("Sentry", "CTF",1,1,-1,14); -addRotationMap("TWL2_Skylight", "CTF",1,1,-1,10); -addRotationMap("Exhumed", "CTF",1,0,-1,12); -addRotationMap("FrozenHope", "CTF",1,1,8,12); -addRotationMap("ClusterUnFuct", "CTF",1,0,8,12); -//addRotationMap("Raspian", "CTF",1,0,8,12); -addRotationMap("Zilch", "CTF",1,1,6,12); -addRotationMap("SuperHappyBouncyFunTime", "CTF",1,0,-1,12); -addRotationMap("SuperiorWaterworks", "CTF",1,0,-1,12); -//addRotationMap("TWL2_FrozenHope", "CTF",1,0,8,20); -//addRotationMap("Island", "CTF",1,1,-1,12); -//addRotationMap("TitForTat", "CTF",1,1,-1,12); -//addRotationMap("Cinerarium", "CTF",1,0,-1,12); //Using DMP Version -//addRotationMap("StarFallCTF", "CTF",1,0,6,12); //Using DMP Version -//addRotationMap("TWL_OsIris", "CTF",1,0,8,18); -//addRotationMap("FrostPipe", "CTF",1,0,-1,12); - -//Medium Maps -///////////////////////////////////////////////////////////////////// - -addRotationMap("HighOctane", "CTF",1,0,10,24); -addRotationMap("S5_Mordacity", "CTF",1,1,10,24); -addRotationMap("S5_Damnation", "CTF",1,1,12,20); -addRotationMap("TWL2_JaggedClaw", "CTF",1,1,14,28); -addRotationMap("S5_Massive", "CTF",1,1,12,32); -addRotationMap("TWL_Stonehenge", "CTF",1,1,8,20); -addRotationMap("TWL_Feign", "CTF",1,1,10,28); -addRotationMap("TheFray", "CTF",1,0,10,20); -//addRotationMap("DangerousCrossing_nef", "CTF",1,1,8,20); -addRotationMap("TWL_DangerousCrossing", "CTF",1,0,10,28); -addRotationMap("TWL2_Ocular", "CTF",1,1,20,-1); -addRotationMap("Dire", "CTF",1,0,10,16); -addRotationMap("berlard", "CTF",1,1,12,24); -addRotationMap("S8_Opus", "CTF",1,1,12,24); -addRotationMap("TWL_BeggarsRun", "CTF",1,0,18,24); -addRotationMap("Headstone", "CTF",1,1,8,24); -addRotationMap("Signal", "CTF",1,0,8,24); -addRotationMap("S5_Woodymyrk", "CTF",1,1,10,32); -addRotationMap("TenebrousCTF", "CTF",1,0,8,12); -addRotationMap("Prismatic", "CTF",1,0,16,32); -addRotationMap("TWL_WilderZone", "CTF",1,1,12,32); -addRotationMap("S5_Mimicry", "CTF",1,0,12,32); -addRotationMap("TWL_Snowblind", "CTF",1,1,20,-1); -addRotationMap("ShortFall", "CTF",1,0,18,28); -addRotationMap("IceRidge_nef", "CTF",1,0,12,32); -//addRotationMap("Disjointed", "CTF",1,0,8,20); -addRotationMap("TWL2_MuddySwamp", "CTF",1,0,10,24); -addRotationMap("HighAnxiety", "CTF",1,1,-1,12); -addRotationMap("S5_Centaur", "CTF",1,1,-1,12); -addRotationMap("S8_Cardiac", "CTF",1,1,18,-1); -addRotationMap("CirclesEdge", "CTF",1,0,10,24); -addRotationMap("S5_Icedance", "CTF",1,1,10,28); -addRotationMap("Surreal", "CTF",1,0,24,-1); -addRotationMap("TWL2_Drifts", "CTF",1,0,14,24); -//addRotationMap("TWL2_Drorck", "CTF",1,0,12,24); -addRotationMap("S5_HawkingHeat", "CTF",1,0,16,28); -addRotationMap("TWL2_Celerity", "CTF",1,1,12,32); -addRotationMap("Draco", "CTF",1,0,8,24); -//addRotationMap("Pariah", "CTF",1,0,8,24); //Using DMP Version -//addRotationMap("Mirage", "CTF",1,0,8,20); -addRotationMap("Norty", "CTF",1,1,18,32); - -//Voteable but Not in Rotation -///////////////////////////////////////////////////////////////////// - -addRotationMap("TWL2_IceDagger", "CTF",1,1,10,20); -addRotationMap("TWL_Titan", "CTF",1,0,16,32); -addRotationMap("Burstside", "CTF",1,0,10,20); -addRotationMap("Infernus", "CTF",1,0,18,26); -addRotationMap("Confusco", "CTF",1,0,10,20); -//addRotationMap("Snowcone", "CTF",1,0,10,20); -addRotationMap("S5_Drache", "CTF",1,0,16,28); -//addRotationMap("JadeValley", "CTF",1,0,10,20); -addRotationMap("S5_Sherman", "CTF",1,1,24,-1); -addRotationMap("S5_Silenus", "CTF",1,0,8,20); -addRotationMap("S5_Reynard", "CTF",1,0,10,20); -//addRotationMap("Coppersky", "CTF",1,0,8,20); -//addRotationMap("TWL2_Crevice", "CTF",1,0,10,20); -addRotationMap("TWL_SubZero", "CTF",1,0,16,32); -addRotationMap("Fallout", "CTF",1,1,16,24); -//addRotationMap("TheClocktower", "CTF",1,0,10,20); -//addRotationMap("SoylentGreen", "CTF",1,0,10,20); -//addRotationMap("Ramparts", "CTF",1,0,10,20); -//addRotationMap("Blastside_nef", "CTF",1,0,10,24); -//addRotationMap("NatureMagic", "CTF",1,0,10,20); -//addRotationMap("TWL_Damnation", "CTF",1,0,10,20); -addRotationMap("TWL_DeadlyBirdsSong", "CTF",1,0,24,32); -addRotationMap("Vauban", "CTF",1,0,18,-1); -addRotationMap("TWL_Pandemonium", "CTF",1,0,16,24); -addRotationMap("TWL_WhiteDwarf", "CTF",1,0,18,24); -//addRotationMap("Cinereous", "CTF",1,0,12,20); - -//Vehicle Maps -///////////////////////////////////////////////////////////////////// - -addRotationMap("Logans_Run", "CTF",1,1,14,28); -addRotationMap("Rollercoaster_nef", "CTF",1,1,8,-1); -addRotationMap("HostileLoch", "CTF",1,1,8,12); -addRotationMap("TWL_BeachBlitz", "CTF",1,1,18,28); -addRotationMap("TWL2_Magnum", "CTF",1,1,12,-1); -//addRotationMap("MoonDance", "CTF",1,0,12,28); //Using DMP Version -addRotationMap("Raindance_nef", "CTF",1,1,12,28); -addRotationMap("TWL_Magmatic", "CTF",1,0,14,28); -addRotationMap("TWL2_FrozenGlory", "CTF",1,1,12,24); -addRotationMap("LandingParty", "CTF",1,0,16,20); -addRotationMap("TWL_Crossfire", "CTF",1,1,18,28); -//addRotationMap("TitanV", "CTF",1,0,12,28); -//addRotationMap("Rollercoaster_nef_FZ", "CTF",1,1,8,28); -//addRotationMap("The_Calm", "CTF",1,0,12,24); -addRotationMap("TWL2_Dissention", "CTF",1,0,16,32); - -//Vehicle Maps: Voteable, But Not in Rotation -///////////////////////////////////////////////////////////////////// - -addRotationMap("SubZeroV", "CTF",1,0,12,24); -addRotationMap("S8_Geothermal", "CTF",1,0,12,24); -addRotationMap("Lakefront", "CTF",1,0,16,24); -addRotationMap("ShockRidge", "CTF",1,0,12,24); -addRotationMap("TWL2_BlueMoon", "CTF",1,1,18,32); -addRotationMap("TWL_Katabatic", "CTF",1,0,16,32); -addRotationMap("SandOcean", "CTF",1,0,12,28); -addRotationMap("ks_braistv", "CTF",1,0,12,24); -addRotationMap("Nightdance", "CTF",1,0,16,24); -addRotationMap("TWL_Abaddon", "CTF",1,0,16,24); -//addRotationMap("StarIce", "CTF",1,0,12,24); -//addRotationMap("FilteredDust", "CTF",1,0,12,24); -//addRotationMap("Choke", "CTF",1,0,12,24); -addRotationMap("TWL_Chokepoint", "CTF",1,0,12,24); -//addRotationMap("TWL_Starfallen", "CTF",1,0,12,24); -//addRotationMap("ConstructionYard", "CTF",1,0,12,24); -//addRotationMap("AcidRain", "CTF",1,0,12,24); -addRotationMap("Agorazscium", "CTF",1,0,12,24); - -//BIG Vehicle Maps -///////////////////////////////////////////////////////////////////// - -addRotationMap("Circleofstones", "CTF",1,1,16,-1); -addRotationMap("Ruined", "CTF",1,0,24,-1); -//addRotationMap("FullCircle", "CTF",1,0,18,30); -//addRotationMap("Surro", "CTF",1,0,18,24); -addRotationMap("TWL2_RoughLand", "CTF",1,0,16,-1); -addRotationMap("HarvestDance", "CTF",1,1,24,-1); -//addRotationMap("WindyGap", "CTF",1,0,24,-1); -addRotationMap("Fenix", "CTF",1,1,26,-1); -addRotationMap("Hillside", "CTF",1,0,28,-1); -addRotationMap("TWL_Slapdash", "CTF",1,0,24,-1); -addRotationMap("BerylBasin", "CTF",1,1,20,-1); -//addRotationMap("TWL_Frozen", "CTF",1,0,20,-1); -addRotationMap("TWL_Harvester", "CTF",1,1,24,-1); -addRotationMap("TWL2_Bleed", "CTF",1,0,24,-1); -addRotationMap("DeathBirdsFly1", "CTF",1,1,24,-1); -//addRotationMap("Scarabrae_nef", "CTF",1,0,28,-1); -addRotationMap("aabaa", "CTF",1,1,28,-1); -addRotationMap("TWL_Reversion", "CTF",1,1,28,-1); -addRotationMap("Horde", "CTF",1,0,24,-1); -addRotationMap("CloakofNightV", "CTF",1,0,24,-1); -//addRotationMap("TWL2_Ruined", "CTF",1,1,18,-1); -//addRotationMap("Glade", "CTF",1,1,28,-1); -//addRotationMap("Pantheon", "CTF",1,0,20,-1); -//addRotationMap("Archipelago", "CTF",1,0,20,-1); -//addRotationMap("Sangre_de_Grado", "CTF",1,0,20,-1); - -//DMP Mappack -///////////////////////////////////////////////////////////////////// -addRotationMap("DMP_Agroleon", "CTF",1,1,18,28); -addRotationMap("DMP_Astro", "CTF",1,0,16,26); -addRotationMap("DMP_BastardForge", "CTF",1,1,8,28); -addRotationMap("DMP_BitterGorge", "CTF",1,0,24,-1); -addRotationMap("DMP_Bunkered", "CTF",1,0,6,14); -addRotationMap("DMP_Cinerarium", "CTF",1,1,-1,20); -addRotationMap("DMP_DermCity", "CTF",1,0,-1,-1); -addRotationMap("DMP_Embers", "CTF",1,0,-1,14); -addRotationMap("DMP_EmeraldSpit", "CTF",1,0,10,20); -addRotationMap("DMP_FaceCrossing", "CTF",1,0,10,20); -addRotationMap("DMP_Hoth", "CTF",1,1,26,-1); -addRotationMap("DMP_IceGiant", "CTF",1,0,20,32); -addRotationMap("DMP_IsleDeBatalla", "CTF",1,0,10,20); -addRotationMap("DMP_LavaGods", "CTF",1,0,10,20); -addRotationMap("DMP_Magellan", "CTF",1,1,10,28); -addRotationMap("DMP_MoonDance", "CTF",1,1,12,32); -addRotationMap("DMP_Pantheon", "CTF",1,0,16,24); -addRotationMap("DMP_Paranoia", "CTF",1,0,6,10); -addRotationMap("DMP_Pariah", "CTF",1,1,8,24); -addRotationMap("DMP_PipeDream", "CTF",1,0,8,16); -addRotationMap("DMP_RavineV", "CTF",1,0,12,28); -addRotationMap("DMP_ScorchedEarth", "CTF",1,0,24,-1); -addRotationMap("DMP_SimpleFlagArena", "CTF",1,0,-1,12); -addRotationMap("DMP_SpinCycle", "CTF",1,1,-1,16); -addRotationMap("DMP_StarFall", "CTF",1,0,-1,16); -addRotationMap("DMP_Tyre", "CTF",1,1,16,-1); -addRotationMap("DMP_Wasteland", "CTF",1,0,10,20); - -addRotationMap("SC_Normal", "CTF",1,0,-1,16); -//addRotationMap("SC_Badlands", "CTF",1,0,-1,16); -//addRotationMap("SC_Desert", "CTF",1,0,-1,16); -//addRotationMap("SC_Lush", "CTF",1,0,-1,16); -addRotationMap("SC_Ice", "CTF",1,1,-1,16); -addRotationMap("SC_Night", "CTF",1,0,-1,16); -//addRotationMap("DX_Badlands", "CTF",1,0,10,20); -//addRotationMap("DX_Desert", "CTF",1,0,10,20); -addRotationMap("DX_Ice", "CTF",1,1,10,28); -//addRotationMap("HO_Badlands", "CTF",1,1,8,24); -//addRotationMap("HO_Desert", "CTF",1,0,8,24); -addRotationMap("HO_Ice", "CTF",1,1,8,28); -addRotationMap("HO_Lush", "CTF",1,0,8,24); -addRotationMap("Attrition", "CTF",1,0,-1,10); -//addRotationMap("Chasmaclysmic", "CTF",1,1,-1,-1); -//addRotationMap("DBS_Smoothed", "CTF",1,0,-1,-1); -addRotationMap("PuliVeivari", "CTF",1,0,-1,-1); -addRotationMap("PlanetX", "CTF",1,0,-1,-1); -//addRotationMap("Ravine", "CTF",1,1,-1,-1); -addRotationMap("Stripmine", "CTF",1,0,-1,-1); - -//Not In Rotation - Not Voteable -///////////////////////////////////////////////////////////////////// - -//addRotationMap("Sandstorm", "CTF",1,0,-1,-1); -//addRotationMap("Starfallen", "CTF",1,0,-1,-1); -//addRotationMap("Stonehenge_nef", "CTF",1,0,-1,-1); -addRotationMap("Extractor", "CTF",1,0,16,-1); -//addRotationMap("AstersDescent", "CTF",1,0,-1,-1); -//addRotationMap("Azoth", "CTF",1,0,-1,-1); -//addRotationMap("BattleGrove", "CTF",1,0,-1,-1); -//addRotationMap("Durango", "CTF",1,0,-1,-1); -//addRotationMap("DustLust", "CTF",1,0,-1,-1); -//addRotationMap("IceGulch", "CTF",1,0,-1,-1); -//addRotationMap("MountainMist", "CTF",1,0,-1,-1); -//addRotationMap("Peak", "CTF",1,0,-1,-1); -//addRotationMap("Pendulum", "CTF",1,0,-1,-1); -//addRotationMap("S5_Misadventure", "CTF",1,0,-1,-1); -//addRotationMap("S8_CentralDogma", "CTF",1,0,-1,-1); -//addRotationMap("S8_Mountking", "CTF",1,0,-1,-1); -//addRotationMap("S8_Zilch", "CTF",1,0,-1,-1); -//addRotationMap("TWL2_CloakOfNight", "CTF",1,0,-1,-1); -//addRotationMap("TWL_BaNsHee", "CTF",1,0,-1,-1); -//addRotationMap("TWL_Boss", "CTF",1,0,-1,-1); -//addRotationMap("TWL_NoShelter", "CTF",1,0,-1,-1); -//addRotationMap("TWL_Clusterfuct", "CTF",1,0,-1,-1); -addRotationMap("TWL_Curtilage", "CTF",1,0,-1,-1); -//addRotationMap("TWL_Deserted", "CTF",1,0,-1,-1); -//addRotationMap("TWL_Frostclaw", "CTF",1,0,-1,-1); -//addRotationMap("TWL_Neve", "CTF",1,0,-1,-1); -//addRotationMap("TWL_Ramparts", "CTF",1,0,-1,-1); -//addRotationMap("TWL_Sandstorm", "CTF",1,0,-1,-1); -//addRotationMap("TWL_WoodyMyrk", "CTF",1,0,-1,-1); -//addRotationMap("OctoberRust", "CTF",1,0,-1,-1); -//addRotationMap("DevilsElbow", "CTF",1,0,-1,-1); -//addRotationMap("CloudCity", "CTF",1,0,-1,-1); -//addRotationMap("Damnation", "CTF",1,0,-1,-1); -//addRotationMap("DeathBirdsFly", "CTF",1,0,-1,-1); -//addRotationMap("Desiccator", "CTF",1,0,-1,-1); -//addRotationMap("DustToDust", "CTF",1,0,-1,-1); -//addRotationMap("Katabatic", "CTF",1,0,-1,-1); -//addRotationMap("Quagmire", "CTF",1,0,-1,-1); -//addRotationMap("Recalescence", "CTF",1,0,-1,-1); -//addRotationMap("Reversion", "CTF",1,0,-1,-1); -//addRotationMap("RiverDance", "CTF",1,0,-1,-1); -//addRotationMap("Sanctuary", "CTF",1,0,-1,-1); -//addRotationMap("ThinIce", "CTF",1,0,-1,-1); -//addRotationMap("Tombstone", "CTF",1,0,-1,-1); -//addRotationMap("Broadside_nef", "CTF",1,0,-1,-1); -//addRotationMap("Camelland", "CTF",1,0,-1,-1); -//addRotationMap("HighTrepidation", "CTF",1,0,-1,-1); -//addRotationMap("SmallDesertofDeath", "CTF",1,0,-1,-1); -//addRotationMap("BasinFury", "CTF",1,0,-1,-1); -//addRotationMap("Cadaver", "CTF",1,0,-1,-1); -//addRotationMap("EivoItoxico", "CTF",1,0,-1,-1); -//addRotationMap("Einfach", "CTF",1,0,-1,-1); -//addRotationMap("PicnicTable", "CTF",1,0,-1,-1); -//addRotationMap("Hostility", "CTF",1,0,-1,-1); -//addRotationMap("HighWire", "CTF",1,0,-1,-1); -//addRotationMap("CloudBurst", "CTF",1,0,-1,-1); -//addRotationMap("CloseCombat", "CTF",1,0,-1,-1); -//addRotationMap("DesertofDeath_nef", "CTF",1,0,-1,-1); -//addRotationMap("Gorgon", "CTF",1,0,-1,-1); -//addRotationMap("Magmatic", "CTF",1,0,-1,-1); -//addRotationMap("Sub-zero", "CTF",1,0,-1,-1); - - -// Custom -///////////////////////////////////////////////////////////////////// - -addRotationMap("CoconutFury", "CTF",1,0,-1,-1); -addRotationMap("CinderCone", "CTF",1,0,-1,-1); -addRotationMap("Sector1", "CTF",1,0,-1,-1); -//addRotationMap("Slamnation", "CTF",0,0,-1,-1); -//addRotationMap("MountaintopMayhem", "CTF",0,0,-1,-1); - -addRotationMap("ChasmClash", "CTF",1,0,-1,14); -//addRotationMap("FrostBite", "CTF",1,0,-1,-1); -//addRotationMap("Lapiths", "CTF",1,0,-1,-1); -addRotationMap("GreenLawn", "CTF",1,1,12,32); -addRotationMap("OuterWilds", "CTF",1,1,-1,12); -addRotationMap("Jettisoned", "CTF",1,0,-1,10); -addRotationMap("Moonwalk", "CTF",1,1,12,-1); -addRotationMap("Drafts", "CTF",1,1,-1,12); -//addRotationMap("IslaHermano", "CTF",1,0,-1,-1); -addRotationMap("DermCrossingDeluxe", "CTF",1,0,-1,-1); -addRotationMap("DaftGulch", "CTF",1,1,16,24); -addRotationMap("Triad", "CTF",1,0,12,20); -addRotationMap("Vaubania", "CTF",1,0,-1,12); -addRotationMap("VanDamnedCTF", "CTF",1,1,-1,14); -addRotationMap("HillKingCTF", "CTF",1,1,-1,18); -addRotationMap("Bonespur", "CTF",1,1,-1,14); -addRotationMap("Bridgepoint", "CTF",1,0,-1,18); -addRotationMap("Narcolepsy", "CTF",1,1,-1,20); -addRotationMap("WhiteDwarfDeluxe", "CTF",1,0,-1,14); -addRotationMap("SmallSpit", "CTF",1,1,-1,20); -addRotationMap("MisadventureV2", "CTF",1,1,12,28); -addRotationMap("El_Fin", "CTF",1,1,-1,14); -addRotationMap("HogansRun24", "CTF",1,0,-1,14); -addRotationMap("SignalDX", "CTF",1,0,8,24); - -// _ _ _ _ _ _ -// | | | | | | | | (_) | -// | | __ _| | ___ __ __ _| |__ | |__ _| |_ -// | | / _` | |/ / '__/ _` | '_ \| '_ \| | __| -// | |___| (_| | <| | | (_| | |_) | |_) | | |_ -// |______\__,_|_|\_\_| \__,_|_.__/|_.__/|_|\__| -///////////////////////////////////////////////////////////////////// - -//In Rotation -///////////////////////////////////////////////////////////////////// - -addRotationMap("VaubanLak", "Lakrabbit",1,1,8,-1); -addRotationMap("MiniSunDried", "Lakrabbit",1,1,-1,12); -addRotationMap("Sundance", "Lakrabbit",1,1,-1,-1); -addRotationMap("TWL_BeachBlitzLak", "Lakrabbit",1,1,-1,-1); -addRotationMap("DesertofDeathLak", "Lakrabbit",1,1,-1,-1); -addRotationMap("Raindance_nefLak", "Lakrabbit",1,1,-1,-1); -addRotationMap("SunDriedLak", "Lakrabbit",1,1,-1,-1); -addRotationMap("SkinnyDipLak", "Lakrabbit",1,0,-1,-1); -addRotationMap("SaddiesHill", "Lakrabbit",1,0,-1,-1); -addRotationMap("HavenLak", "Lakrabbit",1,0,-1,-1); -addRotationMap("LushLak", "Lakrabbit",1,1,8,-1); -addRotationMap("BoxLak", "Lakrabbit",1,1,-1,10); -addRotationMap("TitaniaLak", "Lakrabbit",1,0,8,-1); -addRotationMap("TibbawLak", "Lakrabbit",1,1,-1,-1); -addRotationMap("InfernusLak", "Lakrabbit",1,1,-1,-1); -addRotationMap("S8_GeothermalLak", "Lakrabbit",1,0,-1,-1); -addRotationMap("CankerLak", "Lakrabbit",1,1,-1,-1); -addRotationMap("DustRunLak", "Lakrabbit",1,1,-1,-1); -addRotationMap("CrossfiredLak", "Lakrabbit",1,1,-1,-1); -addRotationMap("CloakofLak", "Lakrabbit",1,0,-1,-1); -addRotationMap("SpectreLak", "Lakrabbit",1,1,-1,-1); - -//Voteable, But not in rotation -///////////////////////////////////////////////////////////////////// - -addRotationMap("TreasureIslandLak", "Lakrabbit",1,1,-1,-1); -addRotationMap("Sulfide", "Lakrabbit",1,0,-1,-1); -addRotationMap("FrozenFuryLak", "Lakrabbit",1,0,-1,-1); -addRotationMap("Arrakis", "Lakrabbit",1,0,-1,-1); -addRotationMap("EquinoxLak", "Lakrabbit",1,0,-1,-1); -addRotationMap("PhasmaDustLak", "Lakrabbit",1,0,-1,12); -addRotationMap("GodsRiftLak", "Lakrabbit",1,0,-1,-1); -addRotationMap("SolsDescentLak", "Lakrabbit",1,0,-1,-1); -addRotationMap("Crater71Lak", "Lakrabbit",1,0,6,-1); - -//Not Voteable, Not in rotation -///////////////////////////////////////////////////////////////////// - -//addRotationMap("EscaladeLak", "Lakrabbit",1,0,-1,-1); -//addRotationMap("MagmaticLak", "Lakrabbit",1,0,-1,-1); -//addRotationMap("HillsOfSorrow", "Lakrabbit",1,0,-1,-1); -//addRotationMap("TWL2_MuddySwampLak", "Lakrabbit",1,0,-1,-1); -//addRotationMap("SandStormLak", "Lakrabbit",1,0,-1,-1); -//addRotationMap("BeggarsRunLak", "Lakrabbit",1,0,-1,-1); -//addRotationMap("DamnnationLak", "Lakrabbit",1,0,-1,-1); - - -// _ _____ _______ ______ -// | | / ____|__ __| ____| -// | | | | | | | |__ -// | | | | | | | __| -// | |___| |____ | | | | -// |______\_____| |_| |_| -///////////////////////////////////////////////////////////////////// - -//In Rotation -///////////////////////////////////////////////////////////////////// -addRotationMap("DangerousCrossingLT", "LCTF",1,0,-1,-1); -addRotationMap("SmallCrossingLT", "LCTF",1,0,-1,12); -addRotationMap("DireLT", "LCTF",1,0,-1,-1); -addRotationMap("RoundTheMountainLT", "LCTF",1,1,-1,-1); -addRotationMap("CirclesEdgeLT", "LCTF",1,1,-1,-1); -addRotationMap("TenebrousCTF", "LCTF",1,0,-1,-1); -addRotationMap("TheFray", "LCTF",1,0,-1,-1); -addRotationMap("SignalLT", "LCTF",1,0,-1,-1); -addRotationMap("S5_DamnationLT", "LCTF",1,0,8,-1); -addRotationMap("S5_Icedance", "LCTF",1,1,-1,-1); -addRotationMap("S5_Mordacity", "LCTF",1,1,10,-1); -addRotationMap("S5_SilenusLT", "LCTF",1,0,-1,-1); -addRotationMap("TWL2_CanyonCrusadeDeluxeLT", "LCTF",1,1,-1,-1); -addRotationMap("TWL2_HildebrandLT", "LCTF",1,1,-1,-1); -addRotationMap("TWL2_SkylightLT", "LCTF",1,1,-1,-1); -addRotationMap("TWL_FeignLT", "LCTF",1,0,-1,-1); -addRotationMap("TWL_RollercoasterLT", "LCTF",1,0,-1,-1); -addRotationMap("TWL_StonehengeLT", "LCTF",1,1,-1,-1); -addRotationMap("TWL_WilderZoneLT", "LCTF",1,0,-1,-1); -addRotationMap("oasisintensity", "LCTF",1,1,-1,10); -addRotationMap("berlard", "LCTF",1,1,-1,-1); -addRotationMap("RaindanceLT", "LCTF",1,0,-1,-1); -addRotationMap("SmallTimeLT", "LCTF",1,0,-1,-1); -addRotationMap("ArenaDome", "LCTF",1,1,-1,10); -addRotationMap("Bulwark", "LCTF",1,1,-1,-1); -addRotationMap("Discord", "LCTF",1,1,-1,-1); -addRotationMap("S5_MassiveLT", "LCTF",1,0,-1,-1); -addRotationMap("Blink", "LCTF",1,0,-1,-1); -addRotationMap("HillSideLT", "LCTF",1,1,-1,10); -addRotationMap("IcePick", "LCTF",1,1,-1,16); -addRotationMap("OsIrisLT", "LCTF",1,0,-1,-1); -addRotationMap("GrassyKnollLT", "LCTF",1,1,-1,-1); -addRotationMap("TWL2_MuddySwamp", "LCTF",1,0,8,-1); -addRotationMap("SandyRunLT", "LCTF",1,0,-1,12); -addRotationMap("Sentry", "LCTF",1,1,-1,-1); -addRotationMap("DMP_Cinerarium", "LCTF",1,1,-1,14); -addRotationMap("Exhumed", "LCTF",1,1,-1,-1); -addRotationMap("S8_ZilchLT", "LCTF",1,1,-1,-1); -addRotationMap("TWL_BeachBlitzLT", "LCTF",1,0,-1,-1); -addRotationMap("FrozenHopeLT", "LCTF",1,1,-1,-1); -//addRotationMap("Confusco", "LCTF",1,0,6,-1); -addRotationMap("TWL2_JaggedClawLT", "LCTF",1,1,-1,-1); - -//Voteable, But not in rotation -///////////////////////////////////////////////////////////////////// - -addRotationMap("BeggarsRunLT", "LCTF",1,0,-1,-1); -addRotationMap("S5_WoodymyrkLT", "LCTF",1,0,-1,-1); -addRotationMap("S8_Opus", "LCTF",1,0,-1,-1); -addRotationMap("TWL_DangerousCrossing", "LCTF",1,0,-1,-1); - -//DMP Mappack -///////////////////////////////////////////////////////////////////// -addRotationMap("AttritionLT", "LCTF",1,1,-1,-1); -addRotationMap("RushLT", "LCTF",1,1,-1,-1); -addRotationMap("HillKingLT", "LCTF",1,1,-1,-1); -addRotationMap("DMP_BastardForgeLT", "LCTF",1,1,-1,-1); -addRotationMap("VanDamnedLT", "LCTF",1,1,-1,-1); -addRotationMap("DMP_Paranoia", "LCTF",1,0,-1,-1); -addRotationMap("DMP_SpincycleLT", "LCTF",1,1,-1,-1); -addRotationMap("Ravine", "LCTF",1,1,-1,-1); -// addRotationMap("DX_Badlands", "LCTF",1,0,-1,-1); -// addRotationMap("DX_Desert", "LCTF",1,0,-1,-1); -addRotationMap("DX_Ice", "LCTF",1,1,-1,-1); -addRotationMap("PipeDreamLT", "LCTF",1,0,-1,-1); -addRotationMap("DMP_LavaGods", "LCTF",1,0,10,20); -addRotationMap("DMP_StarFallLT", "LCTF",1,1,-1,-1); -addRotationMap("DMP_BunkeredLT", "LCTF",1,1,-1,12); -addRotationMap("DMP_PariahLT", "LCTF",1,1,-1,-1); - -//Not Voteable, Not in rotation -///////////////////////////////////////////////////////////////////// - -//addRotationMap("SurrealLT", "LCTF",1,0,-1,-1); -addRotationMap("DuelersDelight", "LCTF",1,0,-1,12); -addRotationMap("SmallSpit", "LCTF",1,1,-1,14); -addRotationMap("BonespurLT", "LCTF",1,1,-1,14); -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("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); -addRotationMap("FrozenForgeLT", "LCTF",1,1,-1,20); -addRotationMap("TWL2_CelerityLT", "LCTF",1,1,-1,20); -addRotationMap("El_FinLT", "LCTF",1,1,-1,14); -addRotationMap("CapriLT", "LCTF",1,1,-1,14); -addRotationMap("RunenmachtLT", "LCTF",1,1,-1,14); - - -// _____ _ _ _ _ -// | __ \ | | | | | | | | -// | | | | ___ __ _| |_| |__ _ __ ___ __ _| |_ ___| |__ -// | | | |/ _ \/ _` | __| '_ \| '_ ` _ \ / _` | __/ __| '_ \ -// | |__| | __/ (_| | |_| | | | | | | | | (_| | || (__| | | | -// |_____/ \___|\__,_|\__|_| |_|_| |_| |_|\__,_|\__\___|_| |_| -///////////////////////////////////////////////////////////////////// - -addRotationMap("RaspDM", "DM",1,1,8,-1); -addRotationMap("EntombedDM", "DM",1,1,-1,-1); -addRotationMap("IceDomeDM", "DM",1,1,-1,-1); -addRotationMap("HoofToeDM", "DM",1,1,6,-1); -addRotationMap("ArenaDomeDM", "DM",1,1,-1,-1); -addRotationMap("VulcansWrathDM", "DM",1,1,-1,-1); -addRotationMap("RampartsDM", "DM",1,1,-1,-1); -addRotationMap("ShrineDM", "DM",1,1,-1,12); -addRotationMap("LiveBaitDM", "DM",1,1,-1,-1); -addRotationMap("FourSquareDM", "DM",1,1,-1,10); -addRotationMap("BrigDM", "DM",1,1,-1,8); -addRotationMap("PitsDM", "DM",1,1,-1,10); -addRotationMap("RingofFireDM", "DM",1,1,-1,10); -addRotationMap("GorgonDM", "DM",1,1,-1,10); - - -// _____ _ -// | __ \ | | -// | | | |_ _ ___| | -// | | | | | | |/ _ \ | -// | |__| | |_| | __/ | -// |_____/ \__,_|\___|_| -///////////////////////////////////////////////////////////////////// - -//addRotationMap("AgentsOfFortune", "Duel",1,1,-1,-1); -//addRotationMap("Casern_Cavite", "Duel",1,1,-1,-1); -//addRotationMap("Equinox", "Duel",1,1,-1,-1); -//addRotationMap("Escalade", "Duel",1,1,-1,-1); -//addRotationMap("Fracas", "Duel",1,1,-1,-1); -//addRotationMap("Invictus", "Duel",1,1,-1,-1); -//addRotationMap("MyrkWood", "Duel",1,1,-1,-1); -//addRotationMap("Oasis", "Duel",1,1,-1,-1); -//addRotationMap("Pyroclasm", "Duel",1,1,-1,-1); -//addRotationMap("Rasp", "Duel",1,1,-1,-1); -//addRotationMap("SunDried", "Duel",1,1,-1,-1); -//addRotationMap("Talus", "Duel",1,1,-1,-1); -//addRotationMap("Underhill", "Duel",1,1,-1,-1); -//addRotationMap("Whiteout", "Duel",1,1,-1,-1); -//addRotationMap("Tombstone", "Duel",1,1,-1,-1); -//addRotationMap("VaubanLak", "Duel",1,1,-1,-1); -//addRotationMap("DesertofDeathLak", "Duel",1,1,-1,-1); - - - -// _____ _ -// / ____(_) -// | (___ _ ___ __ _ ___ -// \___ \| |/ _ \/ _` |/ _ \ -// ____) | | __/ (_| | __/ -// |_____/|_|\___|\__, |\___| -// __/ | -// |___/ -///////////////////////////////////////////////////////////////////// - -//addRotationMap("Alcatraz", "Siege",1,1,-1,-1); -//addRotationMap("BridgeTooFar", "Siege",1,1,-1,-1); -//addRotationMap("Caldera", "Siege",1,1,-1,-1); -//addRotationMap("Gauntlet", "Siege",1,1,-1,-1); -//addRotationMap("IceBound", "Siege",1,1,-1,-1); -//addRotationMap("Isleofman", "Siege",1,1,-1,-1); -//addRotationMap("Masada", "Siege",1,1,-1,-1); -//addRotationMap("Respite", "Siege",1,1,-1,-1); -//addRotationMap("Trident", "Siege",1,1,-1,-1); -//addRotationMap("UltimaThule", "Siege",1,1,-1,-1); - - - -// _ _ _ -// | | | | | | -// | |__| |_ _ _ __ | |_ ___ _ __ ___ -// | __ | | | | '_ \| __/ _ \ '__/ __| -// | | | | |_| | | | | || __/ | \__ \ -// |_| |_|\__,_|_| |_|\__\___|_| |___/ -///////////////////////////////////////////////////////////////////// - -//addRotationMap("MiniSunDried","Hunters",1,1,-1,-1); -//addRotationMap("DustToDust","Hunters",1,1,-1,-1); diff --git a/Classic/prefs/mapRotation.cs b/Classic/prefs/mapRotation.cs new file mode 100644 index 0000000..dc64408 --- /dev/null +++ b/Classic/prefs/mapRotation.cs @@ -0,0 +1,507 @@ +//To use this file add a new map with the following rules: +//1. Find the file name, ending in .mis (ie BeggarsRun.mis) +//2. Add a line with this syntact: addRotationMap(filename, gametype, %voteable, %cycle, %min. %max); +//Example: addRotationMap("MAP_NAME","MAP_MODE",VOTEABLE,IN-ROTATION,MINIMUM_PLAYERS,MAXIMUM_PLAYERS); +//------------------------------------------------------------------------------- +addRotationMap("SC_Normal","CTF",true,false,-1,16); +//addRotationMap("SC_Badlands","CTF",true,false,-1,16); +//addRotationMap("SC_Desert","CTF",true,false,-1,16); +//addRotationMap("SC_Lush","CTF",true,false,-1,16); +addRotationMap("SC_Ice","CTF",true,true,-1,16); +addRotationMap("SC_Night","CTF",true,false,-1,16); +addRotationMap("TWL_DangerousCrossing","CTF",true,false,-1,20); +//addRotationMap("DX_Badlands","CTF",true,false,-1,20); +//addRotationMap("DX_Desert","CTF",true,false,-1,20); +addRotationMap("DX_Ice","CTF",true,true,-1,20); +addRotationMap("HighOctane","CTF",true,false,10,24); +//addRotationMap("HO_Badlands","CTF",true,true,10,24); +//addRotationMap("HO_Desert","CTF",true,false,10,24); +addRotationMap("HO_Ice","CTF",true,true,10,24); +addRotationMap("HO_Lush","CTF",true,false,10,24); +addRotationMap("TWL2_CanyonCrusadeDeluxe","CTF",true,true,-1,-1); +addRotationMap("TWL2_Skylight","CTF",true,false,-1,12); +addRotationMap("TWL2_Hildebrand","CTF",true,true,-1,18); +addRotationMap("RoundTheMountain","CTF",true,true,-1,14); +addRotationMap("oasisintensity","CTF",true,true,-1,12); +addRotationMap("Machineeggs","CTF",true,true,-1,10); +addRotationMap("Mac_FlagArena","CTF",true,false,-1,10); +addRotationMap("SmallTimeCTF","CTF",true,true,-1,12); +addRotationMap("ArenaDome","CTF",true,true,-1,10); +addRotationMap("Bulwark","CTF",true,true,-1,12); +addRotationMap("Discord","CTF",true,true,-1,16); +addRotationMap("Sentry","CTF",true,true,-1,12); +addRotationMap("FrozenHope","CTF",true,true,8,12); +addRotationMap("ClusterUnFuct","CTF",true,true,8,12); +addRotationMap("Zilch","CTF",true,true,6,12); +addRotationMap("SuperHappyBouncyFunTime","CTF",true,false,-1,12); +addRotationMap("SuperiorWaterworks","CTF",true,true,-1,10); +//addRotationMap("TWL2_FrozenHope","CTF",true,false,-1,12); +//addRotationMap("Island","CTF",true,true,-1,12); +//addRotationMap("TitForTat","CTF",true,true,-1,12); +//addRotationMap("TWL_OsIris","CTF",true,false,8,18); +//addRotationMap("FrostPipe","CTF",true,false,-1,12); +//addRotationMap("Raspian","CTF",true,false,8,12); +//addRotationMap("Exhumed","CTF",true,false,-1,12); +//addRotationMap("Blink","CTF",true,false,-1,10); +//addRotationMap("Firestorm","CTF",true,false,-1,12); +//addRotationMap("SmallMelee","CTF",true,false,-1,12); +//addRotationMap("Attrition","CTF",true,true,-1,10); +//addRotationMap("Coppersky","CTF",true,false,8,20); +//addRotationMap("S5_Silenus","CTF",true,false,8,20); +//------------------------------------------------------------------------------- +addRotationMap("TWL_Stonehenge","CTF",true,false,8,-1); +addRotationMap("TWL_Feign","CTF",true,true,8,32); +addRotationMap("TWL_Snowblind","CTF",true,false,14,-1); +addRotationMap("TWL_BeggarsRun","CTF",true,true,14,-1); +addRotationMap("TWL_WilderZone","CTF",true,false,12,-1); +addRotationMap("TWL_Titan","CTF",true,false,14,-1); +addRotationMap("TWL_SubZero","CTF",true,true,14,-1); +addRotationMap("TWL_DeadlyBirdsSong","CTF",true,false,14,-1); +addRotationMap("TWL_Pandemonium","CTF",true,false,14,-1); +addRotationMap("TWL2_MidnightMayhemDeluxe","CTF",true,true,12,-1); +addRotationMap("TWL2_JaggedClaw","CTF",true,true,12,-1); +addRotationMap("TWL2_Ocular","CTF",true,true,14,-1); +addRotationMap("TWL2_Drifts","CTF",true,false,14,-1); +addRotationMap("TWL2_Celerity","CTF",true,true,12,-1); +addRotationMap("Minotaur","CTF",true,false,12,-1); +addRotationMap("S5_Centaur","CTF",true,false,-1,12); +addRotationMap("S5_Mordacity","CTF",true,true,10,32); +addRotationMap("S5_Damnation","CTF",true,false,12,-1); +addRotationMap("S5_Massive","CTF",true,true,12,-1); +addRotationMap("S5_Mimicry","CTF",true,true,12,-1); +addRotationMap("S5_Icedance","CTF",true,true,10,-1); +addRotationMap("S5_Woodymyrk","CTF",true,true,10,-1); +addRotationMap("S8_Cardiac","CTF",true,true,14,-1); +addRotationMap("TheFray","CTF",true,false,10,32); +addRotationMap("berlard","CTF",true,true,12,32); +addRotationMap("Headstone","CTF",true,true,12,32); +addRotationMap("Signal","CTF",true,false,12,32); +addRotationMap("TenebrousCTF","CTF",true,false,10,24); +addRotationMap("Prismatic","CTF",true,false,12,32); +addRotationMap("IceRidge_nef","CTF",true,true,12,-1); +addRotationMap("CirclesEdge","CTF",true,false,12,-1); +addRotationMap("Surreal","CTF",true,false,20,-1); +addRotationMap("Norty","CTF",true,true,14,-1); +addRotationMap("Confusco","CTF",true,false,14,32); +addRotationMap("Vauban","CTF",true,false,14,-1); +//addRotationMap("TWL2_MuddySwamp","CTF",true,false,12,32); +//addRotationMap("TWL2_Drorck","CTF",true,false,12,32); +//addRotationMap("TWL2_Crevice","CTF",true,false,12,32); +//addRotationMap("TWL2_IceDagger","CTF",true,false,12,32); +//addRotationMap("S5_HawkingHeat","CTF",true,false,12,32); +//addRotationMap("S5_Drache","CTF",true,true,12,32); +//addRotationMap("S5_Sherman","CTF",true,false,20,-1); +//addRotationMap("S5_Reynard","CTF",true,false,14,32); +//addRotationMap("S8_Opus","CTF",true,false,10,32); +//addRotationMap("ShortFall","CTF",true,false,12,32); +//addRotationMap("Disjointed","CTF",true,false,12,32); +//addRotationMap("HighAnxiety","CTF",true,false,-1,12); +//addRotationMap("Dire","CTF",true,false,10,32); +//addRotationMap("Draco","CTF",true,false,12,32); +//addRotationMap("Mirage","CTF",true,false,12,32); +//addRotationMap("TWL_WhiteDwarf","CTF",true,false,14,-1); +//addRotationMap("Cinereous","CTF",true,false,14,-1); +//addRotationMap("Fallout","CTF",true,false,14,32); +//addRotationMap("TheClocktower","CTF",true,false,10,20); +//addRotationMap("SoylentGreen","CTF",true,false,10,20); +//addRotationMap("Ramparts","CTF",true,false,14,-1); +//addRotationMap("Blastside_nef","CTF",true,false,14,-1); +//addRotationMap("NatureMagic","CTF",true,false,14,-1); +//addRotationMap("TWL_Damnation","CTF",true,false,12,32); +//addRotationMap("Snowcone","CTF",true,false,12,32); +//addRotationMap("JadeValley","CTF",true,false,12,32); +//addRotationMap("Burstside","CTF",true,false,12,32); +//addRotationMap("Infernus","CTF",true,false,14,-1); +//------------------------------------------------------------------------------- +addRotationMap("TWL_Katabatic","CTF",true,false,14,-1); +addRotationMap("TWL_Crossfire","CTF",true,true,14,-1); +addRotationMap("TWL_BeachBlitz","CTF",true,true,12,-1); +addRotationMap("TWL_Magmatic","CTF",true,false,14,-1); +addRotationMap("TWL_Harvester","CTF",true,true,20,-1); +addRotationMap("TWL2_BlueMoon","CTF",true,true,14,-1); +addRotationMap("TWL2_Bleed","CTF",true,false,20,-1); +addRotationMap("TWL2_Dissention","CTF",true,false,14,-1); +addRotationMap("TWL2_Magnum","CTF",true,true,12,-1); +addRotationMap("TWL2_FrozenGlory","CTF",true,true,12,-1); +addRotationMap("Logans_Run","CTF",true,false,12,32); +addRotationMap("Rollercoaster_nef","CTF",true,true,10,-1); +addRotationMap("HostileLoch","CTF",true,false,14,32); +addRotationMap("Raindance_nef","CTF",true,true,12,-1); +addRotationMap("LandingParty","CTF",true,false,12,20); +addRotationMap("ShockRidge","CTF",true,false,12,-1); +addRotationMap("Nightdance","CTF",true,false,14,32); +addRotationMap("TWL_Abaddon","CTF",true,false,20,-1); +addRotationMap("Agorazscium","CTF",true,false,12,32); +addRotationMap("Circleofstones","CTF",true,true,14,-1); +addRotationMap("Ruined","CTF",true,false,14,-1); +addRotationMap("Fenix","CTF",true,false,20,-1); +addRotationMap("Hillside","CTF",true,false,24,-1); +addRotationMap("TWL_Slapdash","CTF",true,false,24,-1); +addRotationMap("BerylBasin","CTF",true,false,14,-1); +addRotationMap("DeathBirdsFly1","CTF",true,false,24,-1); +addRotationMap("aabaa","CTF",true,false,28,-1); +addRotationMap("CloakofNightV","CTF",true,false,24,-1); +addRotationMap("Sangre_de_Grado","CTF",true,false,20,-1); +addRotationMap("FullCircle","CTF",true,false,14,-1); +//addRotationMap("Lakefront","CTF",true,false,14,-1); +//addRotationMap("S8_Geothermal","CTF",true,false,12,32); +//addRotationMap("TWL_Frozen","CTF",true,false,20,-1); +//addRotationMap("TWL_Chokepoint","CTF",true,false,12,24); +//addRotationMap("TWL_Starfallen","CTF",true,false,12,24); +//addRotationMap("TWL_Reversion","CTF",true,false,28,-1); +//addRotationMap("TWL2_RoughLand","CTF",true,false,16,-1); +//addRotationMap("TWL2_Ruined","CTF",true,true,18,-1); +//addRotationMap("SandOcean","CTF",true,false,16,24); +//addRotationMap("ks_braistv","CTF",true,true,12,24); +//addRotationMap("Horde","CTF",true,false,24,-1); +//addRotationMap("Glade","CTF",true,true,28,-1); +//addRotationMap("Pantheon","CTF",true,false,20,-1); +//addRotationMap("Archipelago","CTF",true,false,20,-1); +//addRotationMap("TitanV","CTF",true,false,12,28); +//addRotationMap("The_Calm","CTF",true,false,12,24); +//addRotationMap("Surro","CTF",true,false,18,24); +//addRotationMap("HarvestDance","CTF",true,false,24,-1); +//addRotationMap("WindyGap","CTF",true,false,24,-1); +addRotationMap("Scarabrae_nef","CTF",true,false,28,-1); +//addRotationMap("StarIce","CTF",true,false,12,24); +//addRotationMap("FilteredDust","CTF",true,false,12,24); +//addRotationMap("Choke","CTF",true,false,12,24); +//addRotationMap("ConstructionYard","CTF",true,false,12,24); +//addRotationMap("AcidRain","CTF",true,false,12,24); +//addRotationMap("SubZeroV","CTF",true,true,12,24); +//------------------------------------------------------------------------------- +//addRotationMap("DMP_Agroleon","CTF",true,true,18,28); +//addRotationMap("DMP_Astro","CTF",true,false,16,26); +addRotationMap("DMP_BastardForge","CTF",true,true,12,32); +addRotationMap("DMP_BitterGorge","CTF",true,false,24,-1); +//addRotationMap("DMP_Bunkered","CTF",true,true,6,14); +addRotationMap("DMP_Cinerarium","CTF",true,true,-1,14); +//addRotationMap("DMP_DermCity","CTF",true,false,-1,-1); +//addRotationMap("DMP_Embers","CTF",true,false,-1,14); +//addRotationMap("DMP_EmeraldSpit","CTF",true,false,10,20); +//addRotationMap("DMP_FaceCrossing","CTF",true,false,10,20); +addRotationMap("DMP_Hoth","CTF",true,false,24,-1); +//addRotationMap("DMP_IceGiant","CTF",true,false,20,32); +//addRotationMap("DMP_IsleDeBatalla","CTF",true,false,10,20); +//addRotationMap("DMP_LavaGods","CTF",true,false,10,20); +addRotationMap("DMP_Magellan","CTF",true,false,12,32); +addRotationMap("DMP_MoonDance","CTF",true,true,12,-1); +//addRotationMap("DMP_Pantheon","CTF",true,false,16,24); +addRotationMap("DMP_Paranoia","CTF",true,false,-1,16); +addRotationMap("DMP_Pariah","CTF",true,true,8,32); +addRotationMap("DMP_PipeDream","CTF",true,false,8,24); +addRotationMap("DMP_RavineV","CTF",true,false,12,32); +//addRotationMap("DMP_ScorchedEarth","CTF",true,false,24,-1); +addRotationMap("DMP_SimpleFlagArena","CTF",true,true,-1,14); +addRotationMap("DMP_SpinCycle","CTF",true,true,-1,12); +addRotationMap("DMP_StarFall","CTF",true,true,-1,14); +addRotationMap("DMP_Tyre","CTF",true,true,14,-1); +//addRotationMap("DMP_Wasteland","CTF",true,false,12,32); +//addRotationMap("Chasmaclysmic","CTF",true,true,-1,-1); +//addRotationMap("DBS_Smoothed","CTF",true,false,-1,-1); +//addRotationMap("PuliVeivari","CTF",true,false,-1,-1); +//addRotationMap("PlanetX","CTF",true,false,-1,-1); +//addRotationMap("Ravine","CTF",true,true,-1,-1); +//addRotationMap("Stripmine","CTF",true,false,-1,-1); +//------------------------------------------------------------------------------- +//addRotationMap("S5_Misadventure","CTF",true,false,-1,-1); +//addRotationMap("S8_CentralDogma","CTF",true,false,-1,-1); +//addRotationMap("S8_Mountking","CTF",true,false,-1,-1); +//addRotationMap("S8_Zilch","CTF",true,false,-1,-1); +//addRotationMap("TWL2_CloakOfNight","CTF",true,false,-1,-1); +//addRotationMap("TWL_BaNsHee","CTF",true,false,-1,-1); +//addRotationMap("TWL_Boss","CTF",true,false,-1,-1); +//addRotationMap("TWL_NoShelter","CTF",true,false,-1,-1); +//addRotationMap("TWL_Clusterfuct","CTF",true,false,-1,-1); +//addRotationMap("TWL_Curtilage","CTF",true,false,-1,-1); +//addRotationMap("TWL_Deserted","CTF",true,false,-1,-1); +//addRotationMap("TWL_Frostclaw","CTF",true,false,-1,-1); +//addRotationMap("TWL_Neve","CTF",true,false,-1,-1); +//addRotationMap("TWL_Ramparts","CTF",true,false,-1,-1); +//addRotationMap("TWL_Sandstorm","CTF",true,false,-1,-1); +//addRotationMap("TWL_WoodyMyrk","CTF",true,false,-1,-1); +//addRotationMap("Sandstorm","CTF",true,false,-1,-1); +//addRotationMap("Starfallen","CTF",true,false,-1,-1); +//addRotationMap("Stonehenge_nef","CTF",true,false,-1,-1); +//addRotationMap("Extractor","CTF",true,false,16,-1); +//addRotationMap("AstersDescent","CTF",true,false,-1,-1); +//addRotationMap("Azoth","CTF",true,false,-1,-1); +//addRotationMap("BattleGrove","CTF",true,false,-1,-1); +//addRotationMap("Durango","CTF",true,false,-1,-1); +//addRotationMap("DustLust","CTF",true,false,-1,-1); +//addRotationMap("IceGulch","CTF",true,false,-1,-1); +//addRotationMap("MountainMist","CTF",true,false,-1,-1); +//addRotationMap("Peak","CTF",true,false,-1,-1); +//addRotationMap("Pendulum","CTF",true,false,-1,-1); +//addRotationMap("OctoberRust","CTF",true,false,-1,-1); +//addRotationMap("DevilsElbow","CTF",true,false,-1,-1); +//addRotationMap("CloudCity","CTF",true,false,-1,-1); +//addRotationMap("Damnation","CTF",true,false,-1,-1); +//addRotationMap("DeathBirdsFly","CTF",true,false,-1,-1); +//addRotationMap("Desiccator","CTF",true,false,-1,-1); +//addRotationMap("DustToDust","CTF",true,false,-1,-1); +//addRotationMap("Katabatic","CTF",true,false,-1,-1); +//addRotationMap("Quagmire","CTF",true,false,-1,-1); +//addRotationMap("Recalescence","CTF",true,false,-1,-1); +//addRotationMap("Reversion","CTF",true,false,-1,-1); +//addRotationMap("RiverDance","CTF",true,false,-1,-1); +//addRotationMap("Sanctuary","CTF",true,false,-1,-1); +//addRotationMap("ThinIce","CTF",true,false,-1,-1); +//addRotationMap("Tombstone","CTF",true,false,-1,-1); +//addRotationMap("Broadside_nef","CTF",true,false,-1,-1); +//addRotationMap("Camelland","CTF",true,false,-1,-1); +//addRotationMap("HighTrepidation","CTF",true,false,-1,-1); +//addRotationMap("SmallDesertofDeath","CTF",true,false,-1,-1); +//addRotationMap("BasinFury","CTF",true,false,-1,-1); +//addRotationMap("Cadaver","CTF",true,false,-1,-1); +//addRotationMap("EivoItoxico","CTF",true,false,-1,-1); +//addRotationMap("Einfach","CTF",true,false,-1,-1); +//addRotationMap("PicnicTable","CTF",true,false,-1,-1); +//addRotationMap("Hostility","CTF",true,false,-1,-1); +//addRotationMap("HighWire","CTF",true,false,-1,-1); +//addRotationMap("CloudBurst","CTF",true,false,-1,-1); +//addRotationMap("CloseCombat","CTF",true,false,-1,-1); +//addRotationMap("DesertofDeath_nef","CTF",true,false,-1,-1); +//addRotationMap("Gorgon","CTF",true,false,-1,-1); +//addRotationMap("Magmatic","CTF",true,false,-1,-1); +//------------------------------------------------------------------------------- +addRotationMap("SmallSpit","CTF",true,true,-1,12); +addRotationMap("MisadventureV2","CTF",true,false,12,32); +addRotationMap("El_Fin","CTF",true,true,-1,14); +addRotationMap("HogansRun24","CTF",true,false,14,-1); +addRotationMap("VanDamnedCTF","CTF",true,true,-1,12); +addRotationMap("HillKingCTF","CTF",true,true,-1,12); +addRotationMap("DaftGulch","CTF",true,false,12,32); +addRotationMap("Triad","CTF",true,false,12,32); +addRotationMap("Moonwalk","CTF",true,true,12,-1); +addRotationMap("GreenLawn","CTF",true,true,12,-1); +addRotationMap("OuterWilds","CTF",true,true,-1,14); +addRotationMap("CoconutFury","CTF",true,false,-1,32); +addRotationMap("TWL2_FrozenGlory_Thawed","CTF",true,false,12,-1); +addRotationMap("Sector1","CTF",true,false,-1,-1); +//addRotationMap("CinderCone","CTF",true,false,-1,-1); +//addRotationMap("Slamnation","CTF",false,false,-1,-1); +//addRotationMap("MountaintopMayhem","CTF",false,false,-1,-1); +//addRotationMap("ChasmClash","CTF",true,false,-1,14); +//addRotationMap("FrostBite","CTF",true,false,-1,-1); +//addRotationMap("Lapiths","CTF",true,false,-1,-1); +//addRotationMap("Jettisoned","CTF",true,false,-1,-1); +//addRotationMap("Drafts","CTF",true,true,-1,12); +//addRotationMap("IslaHermano","CTF",true,false,-1,-1); +//addRotationMap("DermCrossingDeluxe","CTF",true,false,-1,-1); +//addRotationMap("Vaubania","CTF",true,true,-1,12); +//addRotationMap("Bonespur","CTF",true,true,-1,14); +//addRotationMap("Bridgepoint","CTF",true,false,-1,18); +//addRotationMap("Narcolepsy","CTF",true,false,-1,20); +//addRotationMap("WhiteDwarfDeluxe","CTF",true,true,-1,14); +//addRotationMap("SignalDX","CTF",true,false,8,24); +//------------------------------------------------------------------------------- +//------------------------------------------------------------------------------- +//------------------------------------------------------------------------------- +//------------------------------------------------------------------------------- +addRotationMap("VaubanLak","Lakrabbit",true,false,8,-1); +addRotationMap("MiniSunDried","Lakrabbit",true,true,-1,12); +addRotationMap("Sundance","Lakrabbit",true,true,-1,-1); +addRotationMap("TWL_BeachBlitzLak","Lakrabbit",true,true,-1,-1); +addRotationMap("DesertofDeathLak","Lakrabbit",true,true,-1,-1); +addRotationMap("Raindance_nefLak","Lakrabbit",true,true,-1,-1); +addRotationMap("SunDriedLak","Lakrabbit",true,true,-1,-1); +addRotationMap("SkinnyDipLak","Lakrabbit",true,false,-1,-1); +addRotationMap("SaddiesHill","Lakrabbit",true,false,-1,-1); +addRotationMap("HavenLak","Lakrabbit",true,false,-1,-1); +addRotationMap("LushLak","Lakrabbit",true,false,8,-1); +addRotationMap("BoxLak","Lakrabbit",true,true,-1,10); +addRotationMap("TitaniaLak","Lakrabbit",true,false,8,-1); +addRotationMap("TibbawLak","Lakrabbit",true,true,-1,-1); +addRotationMap("InfernusLak","Lakrabbit",true,true,-1,-1); +addRotationMap("S8_GeothermalLak","Lakrabbit",true,false,-1,-1); +addRotationMap("CankerLak","Lakrabbit",true,true,-1,-1); +addRotationMap("DustRunLak","Lakrabbit",true,true,-1,-1); +addRotationMap("CrossfiredLak","Lakrabbit",true,true,-1,-1); +addRotationMap("CloakofLak","Lakrabbit",true,false,-1,-1); +addRotationMap("SpectreLak","Lakrabbit",true,false,-1,-1); +addRotationMap("TreasureIslandLak","Lakrabbit",true,true,-1,-1); +addRotationMap("Sulfide","Lakrabbit",true,false,-1,-1); +addRotationMap("FrozenFuryLak","Lakrabbit",true,false,-1,-1); +addRotationMap("Arrakis","Lakrabbit",true,false,-1,-1); +addRotationMap("EquinoxLak","Lakrabbit",true,false,-1,-1); +addRotationMap("PhasmaDustLak","Lakrabbit",true,true,-1,12); +addRotationMap("GodsRiftLak","Lakrabbit",true,false,-1,-1); +addRotationMap("SolsDescentLak","Lakrabbit",true,true,-1,-1); +addRotationMap("Crater71Lak","Lakrabbit",true,false,6,-1); +//------------------------------------------------------------------------------- +addRotationMap("darrellw-Starlight","Lakrabbit",true,false,-1,-1); +addRotationMap("Hybrid-SunChips","Lakrabbit",true,false,-1,-1); +addRotationMap("Hybrid-TealMagic","Lakrabbit",true,false,-1,-1); +addRotationMap("Tacocat-AshnDust","Lakrabbit",true,false,-1,-1); +addRotationMap("Tacocat-Breaker","Lakrabbit",true,true,-1,-1); +addRotationMap("Tacocat-DantesHill","Lakrabbit",true,true,-1,-1); +addRotationMap("Tacocat-DeepCool","Lakrabbit",true,false,-1,-1); +addRotationMap("Tacocat-EmeraldRun","Lakrabbit",true,true,-1,-1); +addRotationMap("Tacocat-FairField","Lakrabbit",true,true,-1,-1); +addRotationMap("Tacocat-FireBrand","Lakrabbit",true,true,-1,-1); +addRotationMap("Tacocat-FroastyLak","Lakrabbit",true,false,-1,-1); +addRotationMap("Tacocat-IronGiant","Lakrabbit",true,false,-1,-1); +addRotationMap("Tacocat-Jagged","Lakrabbit",true,true,-1,-1); +addRotationMap("Tacocat-LucidCold","Lakrabbit",true,true,-1,-1); +addRotationMap("Tacocat-MiddlePassage","Lakrabbit",true,true,-1,-1); +addRotationMap("Tacocat-Mirage","Lakrabbit",true,true,-1,-1); +addRotationMap("Tacocat-Muave","Lakrabbit",true,true,-1,-1); +addRotationMap("Tacocat-Silencio","Lakrabbit",true,true,-1,-1); +addRotationMap("Tacocat-SnowCrevice","Lakrabbit",true,true,-1,-1); +addRotationMap("Tacocat-Spire","Lakrabbit",true,true,-1,-1); +addRotationMap("Tacocat-TheStill","Lakrabbit",true,true,-1,-1); +addRotationMap("Tacocat-Toxica","Lakrabbit",true,true,-1,-1); +addRotationMap("Tacocat-WhiteCap","Lakrabbit",true,true,-1,-1); +addRotationMap("Tacocat-Moonscape","Lakrabbit",true,true,-1,-1); +addRotationMap("Tacocat-Temporal","Lakrabbit",true,false,-1,-1); +addRotationMap("Tacocat-Vein","Lakrabbit",true,false,-1,-1); +addRotationMap("DarkTiger-LakIce","Lakrabbit",true,true,-1,-1); +addRotationMap("Tacocat-BigSky","Lakrabbit",true,false,-1,-1); +addRotationMap("Tacocat-Thawed","Lakrabbit",true,true,-1,-1); +addRotationMap("Tacocat-Circular","Lakrabbit",true,true,-1,-1); +addRotationMap("Tacocat-RollingGreen","Lakrabbit",true,true,-1,-1); +addRotationMap("Tacocat-Hellmire","Lakrabbit",true,true,-1,-1); +addRotationMap("Tacocat-HighLaktane","Lakrabbit",true,false,-1,-1); +addRotationMap("Tacocat-Hillview","Lakrabbit",true,true,-1,-1); +addRotationMap("Tacocat-IceCap","Lakrabbit",true,false,-1,-1); +addRotationMap("Tacocat-Yerba","Lakrabbit",true,true,-1,-1); +addRotationMap("Tacocat-ColdFoot","Lakrabbit",true,true,-1,-1); +addRotationMap("Tacocat-Dunes","Lakrabbit",true,true,-1,-1); +addRotationMap("Tacocat-Rusted","Lakrabbit",true,true,-1,-1); +addRotationMap("Tacocat-FrostRun","Lakrabbit",true,true,-1,-1); +addRotationMap("Tacocat-Zambre","Lakrabbit",true,false,-1,-1); +addRotationMap("Tacocat-SoylentJade","Lakrabbit",true,true,-1,-1); +//addRotationMap("EscaladeLak","Lakrabbit",true,false,-1,-1); +//addRotationMap("MagmaticLak","Lakrabbit",true,false,-1,-1); +//addRotationMap("HillsOfSorrow","Lakrabbit",true,false,-1,-1); +//addRotationMap("TWL2_MuddySwampLak","Lakrabbit",true,false,-1,-1); +//addRotationMap("SandStormLak","Lakrabbit",true,false,-1,-1); +//addRotationMap("BeggarsRunLak","Lakrabbit",true,false,-1,-1); +//addRotationMap("DamnnationLak","Lakrabbit",true,false,-1,-1); +//------------------------------------------------------------------------------- +//------------------------------------------------------------------------------- +//------------------------------------------------------------------------------- +//------------------------------------------------------------------------------- +addRotationMap("DangerousCrossingLT","LCTF",true,false,-1,-1); +addRotationMap("DX_Ice","LCTF",true,true,-1,-1); +//addRotationMap("DX_Badlands","LCTF",true,false,-1,-1); +//addRotationMap("DX_Desert","LCTF",true,false,-1,-1); +addRotationMap("SmallCrossingLT","LCTF",true,false,-1,-1); +addRotationMap("DireLT","LCTF",true,false,-1,-1); +addRotationMap("RoundTheMountainLT","LCTF",true,true,-1,-1); +addRotationMap("TWL_FeignLT","LCTF",true,false,-1,-1); +addRotationMap("TWL_RollercoasterLT","LCTF",true,false,10,-1); +addRotationMap("TWL_StonehengeLT","LCTF",true,true,-1,-1); +addRotationMap("TWL_WilderZoneLT","LCTF",true,false,-1,-1); +addRotationMap("TWL_BeachBlitzLT","LCTF",true,true,-1,-1); +addRotationMap("TWL2_CanyonCrusadeDeluxeLT","LCTF",true,true,-1,-1); +addRotationMap("TWL2_HildebrandLT","LCTF",true,true,-1,-1); +addRotationMap("TWL2_SkylightLT","LCTF",true,false,-1,-1); +addRotationMap("TWL2_JaggedClawLT","LCTF",true,false,-1,-1); +addRotationMap("S5_MassiveLT","LCTF",true,false,-1,-1); +addRotationMap("S5_DamnationLT","LCTF",true,false,8,-1); +addRotationMap("S5_Icedance","LCTF",true,true,10,-1); +addRotationMap("S5_Mordacity","LCTF",true,true,10,-1); +addRotationMap("S8_ZilchLT","LCTF",true,true,-1,-1); +addRotationMap("CirclesEdgeLT","LCTF",true,true,10,-1); +addRotationMap("TenebrousCTF","LCTF",true,false,-1,-1); +addRotationMap("oasisintensity","LCTF",true,true,-1,10); +addRotationMap("berlard","LCTF",true,true,-1,-1); +addRotationMap("RaindanceLT","LCTF",true,false,-1,-1); +addRotationMap("SmallTimeLT","LCTF",true,false,-1,-1); +addRotationMap("ArenaDome","LCTF",true,true,-1,10); +addRotationMap("Bulwark","LCTF",true,true,-1,-1); +addRotationMap("Discord","LCTF",true,true,-1,-1); +addRotationMap("HillSideLT","LCTF",true,true,-1,-1); +addRotationMap("IcePick","LCTF",true,true,-1,16); +addRotationMap("OsIrisLT","LCTF",true,true,-1,-1); +addRotationMap("GrassyKnollLT","LCTF",true,true,-1,-1); +addRotationMap("SandyRunLT","LCTF",true,false,-1,12); +addRotationMap("Sentry","LCTF",true,true,-1,-1); +addRotationMap("Exhumed","LCTF",true,false,-1,-1); +addRotationMap("FrozenHopeLT","LCTF",true,true,-1,-1); +//addRotationMap("TheFray","LCTF",true,false,-1,-1); +//addRotationMap("SignalLT","LCTF",true,false,-1,-1); +//------------------------------------------------------------------------------- +addRotationMap("HillKingLT","LCTF",true,true,-1,-1); +addRotationMap("DMP_BastardForgeLT","LCTF",true,true,10,-1); +addRotationMap("DMP_Paranoia","LCTF",true,false,-1,-1); +addRotationMap("DMP_SpincycleLT","LCTF",true,true,-1,-1); +addRotationMap("DMP_Cinerarium","LCTF",true,true,-1,-1); +addRotationMap("DMP_StarFallLT","LCTF",true,true,-1,-1); +addRotationMap("DMP_BunkeredLT","LCTF",true,true,-1,-1); +addRotationMap("DMP_PariahLT","LCTF",true,true,-1,-1); +addRotationMap("DMP_SimpleFlagArena","LCTF",true,true,-1,-1); +addRotationMap("VanDamnedLT","LCTF",true,true,-1,-1); +addRotationMap("Ravine","LCTF",true,true,10,-1); +addRotationMap("PipeDreamLT","LCTF",true,true,-1,-1); +//addRotationMap("DMP_LavaGods","LCTF",true,false,10,20); +//addRotationMap("AttritionLT","LCTF",true,true,-1,-1); +//addRotationMap("RushLT","LCTF",true,false,-1,-1); +//------------------------------------------------------------------------------- +addRotationMap("SmallSpit","LCTF",true,true,10,-1); +addRotationMap("ClusterUnFuct","LCTF",true,true,10,-1); +addRotationMap("OuterWildsLT","LCTF",true,true,-1,-1); +addRotationMap("SuperiorWaterworks","LCTF",true,true,-1,-1); +addRotationMap("FrozenForgeLT","LCTF",true,true,-1,-1); +addRotationMap("El_FinLT","LCTF",true,true,-1,-1); +addRotationMap("CapriLT","LCTF",true,true,-1,-1); +addRotationMap("RunenmachtLT","LCTF",true,true,-1,-1); +addRotationMap("Machineeggs","LCTF",true,true,-1,-1); +addRotationMap("Mac_FlagArena","LCTF",true,false,-1,-1); +addRotationMap("SuperHappyBouncyFuntime","LCTF",true,false,-1,-1); +addRotationMap("NarcolepsyLT","LCTF",true,false,10,-1); +//addRotationMap("BonespurLT","LCTF",true,true,-1,14); +//addRotationMap("DuelersDelight","LCTF",true,false,-1,12); +//addRotationMap("TWL2_CelerityLT","LCTF",true,true,-1,20); +//addRotationMap("Drafts","LCTF",true,true,-1,12); +//addRotationMap("DermCrossingDeluxeLT","LCTF",true,true,-1,-1); +//addRotationMap("Bridgepoint","LCTF",true,true,-1,14); +//addRotationMap("WhiteDwarfDeluxeLT","LCTF",true,false,-1,14); +//addRotationMap("SurrealLT","LCTF",true,false,-1,-1); +//addRotationMap("Confusco","LCTF",true,false,6,-1); +//addRotationMap("TWL2_MuddySwamp","LCTF",true,false,8,-1); +//addRotationMap("Blink","LCTF",true,false,-1,-1); +//addRotationMap("S8_Opus","LCTF",true,false,-1,-1); +//addRotationMap("BeggarsRunLT","LCTF",true,false,-1,-1); +//addRotationMap("S5_WoodymyrkLT","LCTF",true,false,-1,-1); +//addRotationMap("S5_SilenusLT","LCTF",true,false,-1,-1); +//------------------------------------------------------------------------------- +//------------------------------------------------------------------------------- +//------------------------------------------------------------------------------- +//------------------------------------------------------------------------------- +addRotationMap("RaspDM","DM",true,true,8,-1); +addRotationMap("EntombedDM","DM",true,true,-1,-1); +addRotationMap("IceDomeDM","DM",true,true,-1,-1); +addRotationMap("HoofToeDM","DM",true,true,6,-1); +addRotationMap("ArenaDomeDM","DM",true,true,-1,-1); +addRotationMap("VulcansWrathDM","DM",true,true,-1,-1); +addRotationMap("RampartsDM","DM",true,true,-1,-1); +addRotationMap("ShrineDM","DM",true,true,-1,12); +addRotationMap("LiveBaitDM","DM",true,true,-1,-1); +addRotationMap("FourSquareDM","DM",true,true,-1,10); +addRotationMap("BrigDM","DM",true,true,-1,8); +addRotationMap("PitsDM","DM",true,true,-1,10); +addRotationMap("RingofFireDM","DM",true,true,-1,10); +addRotationMap("GorgonDM","DM",true,true,-1,10); +//------------------------------------------------------------------------------- +//------------------------------------------------------------------------------- +//------------------------------------------------------------------------------- +//------------------------------------------------------------------------------- +//addRotationMap("Alcatraz","Siege",true,true,-1,-1); +//addRotationMap("Caldera","Siege",true,true,-1,-1); +//addRotationMap("Gauntlet","Siege",true,true,-1,-1); +//addRotationMap("IceBound","Siege",true,true,-1,-1); +//addRotationMap("Masada","Siege",true,true,-1,-1); +//addRotationMap("Respite","Siege",true,true,-1,-1); +//addRotationMap("UltimaThule","Siege",true,true,-1,-1); +//addRotationMap("BridgeTooFar","Siege",true,true,-1,-1); +//addRotationMap("IsleOfMan","Siege",true,true,-1,-1); +//addRotationMap("Trident","Siege",true,true,-1,-1); +//------------------------------------------------------------------------------- +//------------------------------------------------------------------------------- +//------------------------------------------------------------------------------- +//------------------------------------------------------------------------------- +//addRotationMap("MiniSunDried","Hunters",true,true,-1,-1); +//addRotationMap("DustToDust","Hunters",true,true,-1,-1); diff --git a/Classic/prefs/serverPrefs.cs b/Classic/prefs/serverPrefs.cs index 4374ddd..218f6da 100644 --- a/Classic/prefs/serverPrefs.cs +++ b/Classic/prefs/serverPrefs.cs @@ -56,7 +56,7 @@ $Host::ClassicLoadVRamChanges = 0; $Host::ClassicLogEchoEnabled = 0; $Host::ClassicMaxVotes = 3; $Host::ClassicMaxTelepads = 3; -$Host::ClassicMOTD = "Tribes 2 Test\nServer brought to you via Commuity Effort\nCelebrating 20 Years of Tribes2!"; +$Host::ClassicMOTD = "Tribes 2 Test\nServer brought to you via Commuity Effort\nCelebrating 25 Years of Tribes2!"; $Host::ClassicMOTDLines = 3; $Host::ClassicMOTDTime = 6; $Host::ClassicNoNullVoiceSpam = 0; @@ -123,7 +123,7 @@ $Host::LoadScreenColor3 = "33CCCC"; $Host::LoadScreenLine1 = "Join Discord:"; $Host::LoadScreenLine1_Msg = "playt2.com/discord"; $Host::LoadScreenLine2 = "Game Modes:"; -$Host::LoadScreenLine2_Msg = "LakRabbit, Capture the Flag, DeathMatch, (Light Only) Capture the Flag"; +$Host::LoadScreenLine2_Msg = "Lak, CTF, DeathMatch, LCTF"; $Host::LoadScreenLine3 = "Get Mappacks:"; $Host::LoadScreenLine3_Msg = "playt2.com/mappacks"; $Host::LoadScreenLine4 = "Server Location:"; @@ -132,7 +132,7 @@ $Host::LoadScreenLine5 = "Server Hosted:"; $Host::LoadScreenLine5_Msg = "Internet"; $Host::LoadScreenLine6 = "Server Github:"; $Host::LoadScreenLine6_Msg = "https://github.com/ChocoTaco1/TacoServer"; -$Host::LoadScreenMOTD1 = "Celebrating 20 Years of Tribes2!"; +$Host::LoadScreenMOTD1 = "Celebrating 25 Years of Tribes2!"; $Host::LoadScreenMOTD2 = "Come play Arena on Wednesday Nights!"; $Host::LoadScreenMOTD3 = "Lak crowd early evenings after work during the week."; $Host::LoadScreenMOTD4 = "Big CTF games Fridays, Saturdays, and Sundays!"; @@ -160,10 +160,10 @@ $Host::PUGautoPassword = 0; $Host::PUGPassword = "pickup"; $Host::PUGpasswordAlwaysOn = 0; $Host::PureServer = 0; -$Host::ServerRules1 = "\c2if\c4(\c3%client.attitude \c4$= \c5\"fun\" \c4&& \c3%client.Llama_Grabs \c4< \c51\c4) {"; -$Host::ServerRules2 = " \c1keepTeamsBalanced\c4(\c2%client\c4); \c1dontSwitch2WinningTeam(\c2%client\c4); }"; -$Host::ServerRules3 = "\c2else if\c4(\c3%client.attitude \c4$= \c5\"too_serious\"\c4) {"; -$Host::ServerRules4 = " \c1try2HaveFun\c4(\c2%client, %attitude\c4); \c1thisIsPubServer\c4(\c2%client, %attitude\c4); }"; +$Host::ServerRules1 = "1. Don\'t Llama Grab. (Grab flag slowly)"; +$Host::ServerRules2 = "2. Don\'t sit on teams and AFK. Move to observer."; +$Host::ServerRules3 = "3. Don\'t Excessively teamkill or teamkill on purpose."; +$Host::ServerRules4 = "4. Don\'t spam chat with inappropriate topics. Play the game."; $Host::ShowEndingPlayerScores = 1; $Host::ShowIngamePlayerScores = 1; $Host::Siege::Halftime = 20000; @@ -191,7 +191,7 @@ $Host::TN::echo = 1; $Host::TournamentMode = 0; $Host::useCustomSkins = 1; $Host::VoteCooldown = 120; -$Host::VoteDelayTime = 120; +$Host::VoteDelayTime = 60; $Host::VotePassPercent = 60; $Host::VoteSpread = 20; $Host::VoteTime = "45"; diff --git a/Classic/scripts/serverDefaults.cs b/Classic/scripts/serverDefaults.cs index f52d72c..d51f88b 100755 --- a/Classic/scripts/serverDefaults.cs +++ b/Classic/scripts/serverDefaults.cs @@ -141,16 +141,16 @@ $Host::LoadScreenColor3 = "33CCCC"; //Loading Screen color; Accents $Host::LoadScreenLine1 = "Join Discord:"; //Loading screen Line 1 Topic $Host::LoadScreenLine1_Msg = "playt2.com/discord"; //Loading Screen Line 1 Message $Host::LoadScreenLine2 = "Game Modes:"; //Loading screen Line 2 Topic -$Host::LoadScreenLine2_Msg = "LakRabbit, Capture the Flag, DeathMatch, (Light Only) Capture the Flag"; //Loading Screen Line 2 Message +$Host::LoadScreenLine2_Msg = "Lak, CTF, DeathMatch, LCTF"; //Loading Screen Line 2 Message $Host::LoadScreenLine3 = "Get Mappacks:"; //Loading screen Line 3 Topic $Host::LoadScreenLine3_Msg = "playt2.com/mappacks"; //Loading Screen Line 3 Message $Host::LoadScreenLine4 = "Server Location:"; //Loading screen Line 4 Topic -$Host::LoadScreenLine4_Msg = "Iowa"; //Loading Screen Line 4 Message +$Host::LoadScreenLine4_Msg = "Somewhere"; //Loading Screen Line 4 Message $Host::LoadScreenLine5 = "Server Hosted:"; //Loading screen Line 5 Topic (Debrief LoadScreen Only) -$Host::LoadScreenLine5_Msg = "Google Compute Engine"; //Loading Screen Line 5 Message (Debrief LoadScreen Only) +$Host::LoadScreenLine5_Msg = "Internet"; //Loading Screen Line 5 Message (Debrief LoadScreen Only) $Host::LoadScreenLine6 = "Server Github:"; //Loading screen Line 6 Topic (Debrief LoadScreen Only) $Host::LoadScreenLine6_Msg = "https://github.com/ChocoTaco1/TacoServer"; //Loading Screen Line 6 Message (Debrief LoadScreen Only) -$Host::LoadScreenMOTD1 = "Celebrating 20 Years of Tribes2!"; //MOTD or Events Line 1 Message (Debrief LoadScreen Only) +$Host::LoadScreenMOTD1 = "Celebrating 25 Years of Tribes2!"; //MOTD or Events Line 1 Message (Debrief LoadScreen Only) $Host::LoadScreenMOTD2 = "Come play Arena on Wednesday Nights!"; //MOTD or Events Line 2 Message (Debrief LoadScreen Only) $Host::LoadScreenMOTD3 = "Lak crowd early evenings after work during the week."; //MOTD or Events Line 3 Message (Debrief LoadScreen Only) $Host::LoadScreenMOTD4 = "Big CTF games Fridays, Saturdays, and Sundays!"; //MOTD or Events Line 4 Message (Debrief LoadScreen Only) @@ -160,7 +160,7 @@ $Host::ClassicChatLog = 1; $Host::ClassicChatLogPath = "logs/Chat/"; $Host::ClassicConnectLog = 1; $Host::ClassicConnLogPath = "logs/Connect/log.txt"; -$Host::ClassicMOTD = "Discord PUB\nServer brought to you by Ravin and Choco\nCelebrating 20 Years of Tribes2!"; +$Host::ClassicMOTD = "Tribes 2 Test\nServer brought to you via Commuity Effort\nCelebrating 25 Years of Tribes2!"; $Host::ClassicMOTDLines = 3; $Host::ClassicMOTDTime = 6; $Host::ClassicRotationCustom = 1; @@ -171,10 +171,10 @@ $Host::ClassicSuppressTraversalRootError = 1; //Suppress console spam e $Host::ClassicMaxVotes = 5; //Max a player can vote per mission $Host::ClassicVoteLog = 1; //Log Votes $Host::ClassicVoteLogPath = "logs/Vote/Vote.log"; //Vote Log location -$Host::ServerRules1 = "\c2if\c4(\c3%client.attitude \c4$= \c5\"fun\" \c4&& \c3%client.Llama_Grabs \c4< \c51\c4) {"; -$Host::ServerRules2 = " \c1keepTeamsBalanced\c4(\c2%client\c4); \c1dontSwitch2WinningTeam(\c2%client\c4); }"; -$Host::ServerRules3 = "\c2else if\c4(\c3%client.attitude \c4$= \c5\"too_serious\"\c4) {"; -$Host::ServerRules4 = " \c1try2HaveFun\c4(\c2%client, %attitude\c4); \c1thisIsPubServer\c4(\c2%client, %attitude\c4); }"; +$Host::ServerRules1 = "1. Don\'t Llama Grab. (Grab flag slowly)"; +$Host::ServerRules2 = "2. Don\'t sit on teams and AFK. Move to observer."; +$Host::ServerRules3 = "3. Don\'t Excessively teamkill or teamkill on purpose."; +$Host::ServerRules4 = "4. Don\'t spam chat with inappropriate topics. Play the game."; $Host::AnimateWithTransitions = 1; //????????????? T1 engine var may or may not help timescale ????????????? $Host::AllowAdmin2Admin = 0; $Host::AllowAdminBan = 0; @@ -201,7 +201,7 @@ $Host::KickObserverStartOnJoin = 0; //Start KickObserver Timer as so $Host::KickObserverTimeout = 1200; //How long player can stay in observer before being booted (1200 is 20 mins) //$Host::ClassicBanlist = "prefs/banlist.cs"; $Host::VoteCooldown = 120; //Time cooldown that dosnt allow a player to vote again after theyve initiated a vote (120 is 2 mins) -$Host::VoteDelayTime = 120; //Delay the ability to vote (For everyone) at the beginning of the match (120 is 2 minutes) +$Host::VoteDelayTime = 60; //Delay the ability to vote (For everyone) at the beginning of the match (120 is 2 minutes) $Host::ClassicTeamKillLog = 1; //Enable/Disable Teamkill Logging $Host::ClassicTeamKillLogPath = "logs/TeamKills/teamkills.log"; //TeamKill Log Path $Host::ClassicDailyHardRestart = 0; //Enable/Disable Daily Hard Restart From 3bd45778321eab461e6704eece9d43025b5739d3 Mon Sep 17 00:00:00 2001 From: ChocoTaco1 Date: Wed, 29 Oct 2025 15:31:04 -0400 Subject: [PATCH 30/37] Vote Overtime Redo --- Classic/scripts/CTFGame.cs | 37 ++++++--- Classic/scripts/LCTFGame.cs | 37 ++++++--- Classic/scripts/LakRabbitGame.cs | 39 ++++++++++ Classic/scripts/autoexec/VoteMenu.cs | 10 +-- Classic/scripts/autoexec/VoteOverTime.cs | 99 ------------------------ 5 files changed, 95 insertions(+), 127 deletions(-) delete mode 100644 Classic/scripts/autoexec/VoteOverTime.cs diff --git a/Classic/scripts/CTFGame.cs b/Classic/scripts/CTFGame.cs index bf65472..d75e4ba 100755 --- a/Classic/scripts/CTFGame.cs +++ b/Classic/scripts/CTFGame.cs @@ -1266,7 +1266,13 @@ function CTFGame::checkTimeLimit(%game, %forced) { %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 && (($TeamRank[1, count] + $TeamRank[2, count]) > 6)){ + if(%game.scheduleVote !$= "" && !%game.voteOT && !$Host::TournamentMode) + { + messageAll('MsgOvertime', '\c2Vote Overtime Initiated.~wfx/powered/turret_heavy_activate.wav'); + %game.voteOT = 1; + } + else if(%teamOneCaps == %teamTwoCaps && $CTF::Overtime && (($TeamRank[1, count] + $TeamRank[2, count]) > 6)) + { if(!%game.overtime) { %game.overtime = 1; @@ -1276,19 +1282,30 @@ function CTFGame::checkTimeLimit(%game, %forced) UpdateClientTimes($CTF::Overtime * 60 * 1000); EndCountdown($CTF::Overtime * 60 * 1000); %game.timeCheck = %game.schedule($CTF::Overtime * 60 * 1000, "timeLimitReached"); + + //Cancel vote if any + if(%game.scheduleVote !$= "") + { + messageAll('closeVoteHud', ""); + cancel(Game.scheduleVote); + Game.scheduleVote = ""; + Game.kickClient = ""; + clearVotes(); + + //Stop vote chimes + for(%i = 0; %i < $Host::EnableVoteSoundReminders; %i++) + { + if(isEventPending(Game.voteReminder[%i])) + cancel(Game.voteReminder[%i]); + Game.voteReminder[%i] = ""; + } + messageAll('MsgOvertime', "\c2Vote has been cancelled due to Sudden-Death Overtime."); + } } } else { - if(%game.scheduleVote !$= "" && !%game.voteOT) - { - messageAll('MsgOvertime', '\c2Vote Overtime Initiated.~wfx/powered/turret_heavy_activate.wav'); - %game.voteOT = 1; - } - else - { - %game.timeLimitReached(); - } + %game.timeLimitReached(); } } else diff --git a/Classic/scripts/LCTFGame.cs b/Classic/scripts/LCTFGame.cs index e856790..9de5730 100644 --- a/Classic/scripts/LCTFGame.cs +++ b/Classic/scripts/LCTFGame.cs @@ -1566,7 +1566,13 @@ function LCTFGame::checkTimeLimit(%game, %forced) { %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 && (($TeamRank[1, count] + $TeamRank[2, count]) > 6)){ + if(%game.scheduleVote !$= "" && !%game.voteOT && !$Host::TournamentMode) + { + messageAll('MsgOvertime', '\c2Vote Overtime Initiated.~wfx/powered/turret_heavy_activate.wav'); + %game.voteOT = 1; + } + else if(%teamOneCaps == %teamTwoCaps && $LCTF::Overtime && (($TeamRank[1, count] + $TeamRank[2, count]) > 6)) + { if(!%game.overtime) { %game.overtime = 1; @@ -1576,19 +1582,30 @@ function LCTFGame::checkTimeLimit(%game, %forced) UpdateClientTimes($LCTF::Overtime * 60 * 1000); EndCountdown($LCTF::Overtime * 60 * 1000); %game.timeCheck = %game.schedule($LCTF::Overtime * 60 * 1000, "timeLimitReached"); + + //Cancel vote if any + if(%game.scheduleVote !$= "") + { + messageAll('closeVoteHud', ""); + cancel(Game.scheduleVote); + Game.scheduleVote = ""; + Game.kickClient = ""; + clearVotes(); + + //Stop vote chimes + for(%i = 0; %i < $Host::EnableVoteSoundReminders; %i++) + { + if(isEventPending(Game.voteReminder[%i])) + cancel(Game.voteReminder[%i]); + Game.voteReminder[%i] = ""; + } + messageAll('MsgOvertime', "\c2Vote has been cancelled due to Sudden-Death Overtime."); + } } } else { - if(%game.scheduleVote !$= "" && !%game.voteOT) - { - messageAll('MsgOvertime', '\c2Vote Overtime Initiated.~wfx/powered/turret_heavy_activate.wav'); - %game.voteOT = 1; - } - else - { - %game.timeLimitReached(); - } + %game.timeLimitReached(); } } else diff --git a/Classic/scripts/LakRabbitGame.cs b/Classic/scripts/LakRabbitGame.cs index e7cfe1d..d9cba89 100644 --- a/Classic/scripts/LakRabbitGame.cs +++ b/Classic/scripts/LakRabbitGame.cs @@ -2017,6 +2017,45 @@ function LakRabbitGame::resetFlag(%game, %flag) cancel(%game.updateFlagThread[%flag]); // z0dd - ZOD, 8/4/02. Cancel this flag's thread to KineticPoet's flag updater } +function LakRabbitGame::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) + { + if(%game.scheduleVote !$= "" && !%game.voteOT && !$Host::TournamentMode) + { + 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); + } +} + // ----- These functions are native to Rabbit function LakRabbitGame::timeLimitReached(%game) diff --git a/Classic/scripts/autoexec/VoteMenu.cs b/Classic/scripts/autoexec/VoteMenu.cs index f0f72bc..e6c37af 100644 --- a/Classic/scripts/autoexec/VoteMenu.cs +++ b/Classic/scripts/autoexec/VoteMenu.cs @@ -502,8 +502,6 @@ function serverCmdStartNewVote(%client, %typeName, %arg1, %arg2, %arg3, %arg4, % { if(%arg1 $= "999") %time = "unlimited"; else %time = %arg1; %msg = %client.nameBase @ " initiated a vote to change the time limit to " @ %time SPC "minutes."; - // VoteOvertime - StartVOTimeVote(%game); $CMHasVoted[%client.guid]++; } @@ -583,7 +581,8 @@ function serverCmdStartNewVote(%client, %typeName, %arg1, %arg2, %arg3, %arg4, % case "stopRunningVote": if(%client.isSuperAdmin || (%client.isAdmin && $Host::AllowAdminStopVote)) { - if($VOStatus $="InProgress") //Dont allow a stop vote after time has expired, then no new time is set - VoteOverTime + %curTimeLeftMS = ($Host::TimeLimit * 60 * 1000) + $missionStartTime - getSimTime(); + if(%curTimeLeftMS <= 0) //Dont allow a stop vote after time has expired, then no new time is set - VoteOverTime { messageClient(%client, "", "\c2Can't stop time vote after time has expired."); return; @@ -1223,8 +1222,6 @@ 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 $TimeLimitChanged = 1; @@ -1243,9 +1240,6 @@ function DefaultGame::voteChangeTimeLimit( %game, %admin, %newLimit ) votePercentLog(%newLimit, %typeName, %key, %game.totalVotesFor, %game.totalVotesAgainst, %totalVotes, %game.totalVotesNone); //Show Vote % messageAll('', '\c1Vote %6: \c0Yea: %1 Nay: %2 Abstain: %7 Total: %3 [%4%5]', %game.totalVotesFor, %game.totalVotesAgainst, %totalVotes, mfloor((%game.totalVotesFor/(ClientGroup.getCount() - %game.totalVotesNone)) * 100), "%", %key, %game.totalVotesNone); - - // VoteOvertime - ResetVOall(%game); } } diff --git a/Classic/scripts/autoexec/VoteOverTime.cs b/Classic/scripts/autoexec/VoteOverTime.cs deleted file mode 100644 index 70eb648..0000000 --- a/Classic/scripts/autoexec/VoteOverTime.cs +++ /dev/null @@ -1,99 +0,0 @@ -// Vote OverTime Script -// -// Dont allow the match to end if a time vote is pending -// Or if the timelimit has changed -// -// Changes were also made in how time votes are handled in scripts/autoexec/VoteMenu.cs -// DefaultGame::voteChangeMission, DefaultGame::voteChangeTimeLimit, serverCmdStartNewVote -// -// The VoteChangeTimeLimit functions in evo dictate VOStatus conditions - -$VOStatus = "Normal"; - -package VoteOverTime -{ - -function DefaultGame::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) - { - //Vote Overtime - //Check if Time Vote is starting or active or if the timelimit has changed. - //If the timelimit has changed, don't end the game. - switch$($VOStatus) - { - case Starting: - if($missionRunning) - { - messageAll('', '\c2Vote Overtime Initiated.~wfx/powered/turret_heavy_activate.wav', %display); - $VOStatus = "InProgress"; - } - case InProgress: - //Do Nothing - case TimeChanged: - //Do Nothing - case Normal: - // time's up, put down your pencils - %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 DefaultGame::gameOver(%game) -{ - Parent::gameOver(%game); - - //Reset everything to do with Vote Overtime - ResetVOall(%game); -} - -}; - -// Various Flags for the different situations -// Starting a TimeVote - Sets flags so the game wont end during this vote -function StartVOTimeVote(%game) -{ - if(!$Host::TournamentMode) - $VOStatus = "Starting"; -} - -// Tribes wont change the time after its reached zero and you cant change it again afterwards until a gameover/map change. -// But this serves its purpose for extending the game whether it works (technically) or not. -function ResetVOTimeChanged(%game) -{ - $VOStatus = "TimeChanged"; -} - -// Reset everything. So everything functions normally after a map change. -function ResetVOall(%game) -{ - $VOStatus = "Normal"; -} - - -// Prevent package from being activated if it is already -if (!isActivePackage(VoteOverTime)) - activatePackage(VoteOverTime); From 14caa5aca580d3afefc9641472e2ae42b7cfae32 Mon Sep 17 00:00:00 2001 From: ChocoTaco1 Date: Sun, 2 Nov 2025 20:45:05 -0500 Subject: [PATCH 31/37] Removed --- Classic/prefs/mapRotation.cs | 42 ---------------------------- Classic/prefs/serverPrefs.cs | 1 - Classic/scripts/autoexec/VoteMenu.cs | 12 ++++---- 3 files changed, 6 insertions(+), 49 deletions(-) diff --git a/Classic/prefs/mapRotation.cs b/Classic/prefs/mapRotation.cs index dc64408..7906e8b 100644 --- a/Classic/prefs/mapRotation.cs +++ b/Classic/prefs/mapRotation.cs @@ -330,48 +330,6 @@ addRotationMap("GodsRiftLak","Lakrabbit",true,false,-1,-1); addRotationMap("SolsDescentLak","Lakrabbit",true,true,-1,-1); addRotationMap("Crater71Lak","Lakrabbit",true,false,6,-1); //------------------------------------------------------------------------------- -addRotationMap("darrellw-Starlight","Lakrabbit",true,false,-1,-1); -addRotationMap("Hybrid-SunChips","Lakrabbit",true,false,-1,-1); -addRotationMap("Hybrid-TealMagic","Lakrabbit",true,false,-1,-1); -addRotationMap("Tacocat-AshnDust","Lakrabbit",true,false,-1,-1); -addRotationMap("Tacocat-Breaker","Lakrabbit",true,true,-1,-1); -addRotationMap("Tacocat-DantesHill","Lakrabbit",true,true,-1,-1); -addRotationMap("Tacocat-DeepCool","Lakrabbit",true,false,-1,-1); -addRotationMap("Tacocat-EmeraldRun","Lakrabbit",true,true,-1,-1); -addRotationMap("Tacocat-FairField","Lakrabbit",true,true,-1,-1); -addRotationMap("Tacocat-FireBrand","Lakrabbit",true,true,-1,-1); -addRotationMap("Tacocat-FroastyLak","Lakrabbit",true,false,-1,-1); -addRotationMap("Tacocat-IronGiant","Lakrabbit",true,false,-1,-1); -addRotationMap("Tacocat-Jagged","Lakrabbit",true,true,-1,-1); -addRotationMap("Tacocat-LucidCold","Lakrabbit",true,true,-1,-1); -addRotationMap("Tacocat-MiddlePassage","Lakrabbit",true,true,-1,-1); -addRotationMap("Tacocat-Mirage","Lakrabbit",true,true,-1,-1); -addRotationMap("Tacocat-Muave","Lakrabbit",true,true,-1,-1); -addRotationMap("Tacocat-Silencio","Lakrabbit",true,true,-1,-1); -addRotationMap("Tacocat-SnowCrevice","Lakrabbit",true,true,-1,-1); -addRotationMap("Tacocat-Spire","Lakrabbit",true,true,-1,-1); -addRotationMap("Tacocat-TheStill","Lakrabbit",true,true,-1,-1); -addRotationMap("Tacocat-Toxica","Lakrabbit",true,true,-1,-1); -addRotationMap("Tacocat-WhiteCap","Lakrabbit",true,true,-1,-1); -addRotationMap("Tacocat-Moonscape","Lakrabbit",true,true,-1,-1); -addRotationMap("Tacocat-Temporal","Lakrabbit",true,false,-1,-1); -addRotationMap("Tacocat-Vein","Lakrabbit",true,false,-1,-1); -addRotationMap("DarkTiger-LakIce","Lakrabbit",true,true,-1,-1); -addRotationMap("Tacocat-BigSky","Lakrabbit",true,false,-1,-1); -addRotationMap("Tacocat-Thawed","Lakrabbit",true,true,-1,-1); -addRotationMap("Tacocat-Circular","Lakrabbit",true,true,-1,-1); -addRotationMap("Tacocat-RollingGreen","Lakrabbit",true,true,-1,-1); -addRotationMap("Tacocat-Hellmire","Lakrabbit",true,true,-1,-1); -addRotationMap("Tacocat-HighLaktane","Lakrabbit",true,false,-1,-1); -addRotationMap("Tacocat-Hillview","Lakrabbit",true,true,-1,-1); -addRotationMap("Tacocat-IceCap","Lakrabbit",true,false,-1,-1); -addRotationMap("Tacocat-Yerba","Lakrabbit",true,true,-1,-1); -addRotationMap("Tacocat-ColdFoot","Lakrabbit",true,true,-1,-1); -addRotationMap("Tacocat-Dunes","Lakrabbit",true,true,-1,-1); -addRotationMap("Tacocat-Rusted","Lakrabbit",true,true,-1,-1); -addRotationMap("Tacocat-FrostRun","Lakrabbit",true,true,-1,-1); -addRotationMap("Tacocat-Zambre","Lakrabbit",true,false,-1,-1); -addRotationMap("Tacocat-SoylentJade","Lakrabbit",true,true,-1,-1); //addRotationMap("EscaladeLak","Lakrabbit",true,false,-1,-1); //addRotationMap("MagmaticLak","Lakrabbit",true,false,-1,-1); //addRotationMap("HillsOfSorrow","Lakrabbit",true,false,-1,-1); diff --git a/Classic/prefs/serverPrefs.cs b/Classic/prefs/serverPrefs.cs index 218f6da..a20e0a7 100644 --- a/Classic/prefs/serverPrefs.cs +++ b/Classic/prefs/serverPrefs.cs @@ -5,7 +5,6 @@ $Host::AllowAdminKick = 1; $Host::AllowAdminPassVote = 1; $Host::allowAdminPlayerVotes = "0"; $Host::AllowAdminStopVote = 1; -$Host::AllowAdminStopVotes = 1; $Host::AllowAdminVotes = 1; $Host::AllowMapScript = "True"; $Host::AllowPlayerVoteChangeMission = 1; diff --git a/Classic/scripts/autoexec/VoteMenu.cs b/Classic/scripts/autoexec/VoteMenu.cs index e6c37af..8c6f300 100644 --- a/Classic/scripts/autoexec/VoteMenu.cs +++ b/Classic/scripts/autoexec/VoteMenu.cs @@ -581,12 +581,12 @@ function serverCmdStartNewVote(%client, %typeName, %arg1, %arg2, %arg3, %arg4, % case "stopRunningVote": if(%client.isSuperAdmin || (%client.isAdmin && $Host::AllowAdminStopVote)) { - %curTimeLeftMS = ($Host::TimeLimit * 60 * 1000) + $missionStartTime - getSimTime(); - if(%curTimeLeftMS <= 0) //Dont allow a stop vote after time has expired, then no new time is set - VoteOverTime - { - messageClient(%client, "", "\c2Can't stop time vote after time has expired."); - return; - } + // %curTimeLeftMS = ($Host::TimeLimit * 60 * 1000) + $missionStartTime - getSimTime(); + // if(%curTimeLeftMS <= 0) //Dont allow a stop vote after time has expired, then no new time is set - VoteOverTime + // { + // messageClient(%client, "", "\c2Can't stop vote after time has expired."); + // return; + // } stopCurrentVote(%client); adminLog(%client, " stopped the vote in progress."); From d24df745abf305bffb12fa1edf3a60abd867ba26 Mon Sep 17 00:00:00 2001 From: ChocoTaco1 Date: Mon, 3 Nov 2025 16:19:53 -0500 Subject: [PATCH 32/37] Added Overtime Reset --- Classic/scripts/CTFGame.cs | 3 +++ Classic/scripts/LCTFGame.cs | 3 +++ 2 files changed, 6 insertions(+) diff --git a/Classic/scripts/CTFGame.cs b/Classic/scripts/CTFGame.cs index d75e4ba..3d5ebe0 100755 --- a/Classic/scripts/CTFGame.cs +++ b/Classic/scripts/CTFGame.cs @@ -952,6 +952,9 @@ function CTFGame::gameOver(%game) } for(%j = 1; %j <= %game.numTeams; %j++) $TeamScore[%j] = 0; + + %game.voteOT = 0; + %game.overtime = 0; } function CTFGame::onClientDamaged(%game, %clVictim, %clAttacker, %damageType, %implement, %damageLoc) diff --git a/Classic/scripts/LCTFGame.cs b/Classic/scripts/LCTFGame.cs index 9de5730..b0dcd2b 100644 --- a/Classic/scripts/LCTFGame.cs +++ b/Classic/scripts/LCTFGame.cs @@ -689,6 +689,9 @@ function LCTFGame::gameOver(%game) if (isActivePackage(LCTFOneMine)) deactivatePackage(LCTFOneMine); + + %game.voteOT = 0; + %game.overtime = 0; } From 6075098d7902ba321cbb205cbbe4ca4b8bf6c022 Mon Sep 17 00:00:00 2001 From: ChocoTaco1 Date: Mon, 3 Nov 2025 16:28:06 -0500 Subject: [PATCH 33/37] Added TR2 Bonus, Overtime Reset, rabbitSplash Added TR2 Bonus, Overtime Reset, rabbitSplash --- Classic/scripts/LakRabbitGame.cs | 210 +++++++++++++++++-------------- 1 file changed, 113 insertions(+), 97 deletions(-) diff --git a/Classic/scripts/LakRabbitGame.cs b/Classic/scripts/LakRabbitGame.cs index d9cba89..0dea6d2 100644 --- a/Classic/scripts/LakRabbitGame.cs +++ b/Classic/scripts/LakRabbitGame.cs @@ -166,6 +166,23 @@ // 1 - Players get 999 or unlimited DiscJumps // +datablock ItemData(LakFakeFlag2) : flag +{ + lightColor = "0.1 0.1 0.9 1.0"; + className = LakFakeFlag; + lightTime = "100"; + lightRadius = "5"; +}; + +datablock ItemData(LakFakeFlag4) : LakFakeFlag2 +{ + lightColor = "0.9 0.9 0.1 1.0"; +}; + +datablock ItemData(LakFakeFlag8) : LakFakeFlag2 +{ + lightColor = "0.1 0.9 0.1 1.0"; +}; package LakRabbitGame { @@ -417,7 +434,12 @@ function Armor::damageObject(%data, %targetObject, %sourceObject, %position, %am // no splash damage vote if(Game.noSplashDamage && %percentDam < 98 && $lastObjExplode && !$lastObjExplode.isHandNade && %damageType != $DamageType::Mine) - %amount = 0.0; + { + if(!%targetObject.holdingFlag) + %amount = 0.0; + else if(((getSimTime() - %targetObject.client.rabbitSplash) < 15000)) //Turn on splash for rabbit after not making a shot for an alotted time + %amount = 0.0; + } switch$(%damageType) { @@ -435,6 +457,10 @@ function Armor::damageObject(%data, %targetObject, %sourceObject, %position, %am %sound = %defaultSound; } + %tgPos = %targetObject.getPosition(); + %terrHeight = getTerrainHeight(getWords(%tgPos,0,1)); + %playerHeight = mAbs(getWord(%tgPos,2) - %terrHeight); + // special knockback if you hit too close, max 15% chance (point blank).. 5% at 30meters, 1% chance for any MA // Slap based on a Disc headshot @@ -483,6 +509,42 @@ function Armor::damageObject(%data, %targetObject, %sourceObject, %position, %am messageAll('msgSlapmessage','\c0%1 is taking a short tour around the map.', %targetObject.client.name ); } } + else if(%ma && getRandom(1,35) <= %chance && %playerHeight >= 100 && %targetObject.holdingFlag) + { + + Game.playerDroppedFlag(%targetObject); + + %position = %targetObject.getPosition(); + %count = 40; + %ttl = 60000; + %player = %targetObject; + if( %position $= "" ) + { + error("No position passed!"); + return 0; + } + if( %count <= 0 ) + { + error("Number of flags to spew must be greater than 0!"); + return 0; + } + + %flagArr[0] = LakFakeFlag8; + %flagArr[1] = LakFakeFlag2; + %flagArr[2] = LakFakeFlag4; + + while( %count > 0 ) + { + %index = mFloor(getRandom() * 3); + // throwDummyFlag(location, Datablock); + LakRabbitGame::throwDummyFlag(%position, %flagArr[%index], %player, %ttl); + %count--; + } + + %targetObject.blowup(); + %targetObject.scriptKill($DamageType::Explosion); + %sound = '~wfx/misc/MA1.wav'; + } %weapon = "Disc"; case $DamageType::Grenade: if($lastObjExplode.isHandNade) //Hand grenades @@ -746,10 +808,15 @@ function Armor::damageObject(%data, %targetObject, %sourceObject, %position, %am } // borlak -- make a sound when you hit someone - if(%sound $= "" && %sourceObject.client.team != %targetObject.client.team) - messageClient(%sourceObject.client,'MsgHitSound','~wfx/misc/diagnostic_beep.wav'); - else if(%sound !$= "") + // if(%sound $= "" && %sourceObject.client.team != %targetObject.client.team) + // messageClient(%sourceObject.client,'MsgHitSound','~wfx/misc/diagnostic_beep.wav'); + // else if(%sound !$= ""){ + if(%sound !$= ""){ messageAll('msgSpecialHitSound', %sound); + if(%sourceObject.holdingFlag){ + %sourceObject.client.rabbitSplash = getSimTime(); + } + } // borlak -- rabbit should be able to kill heavies/mediums fast(er) in duel mode if(%targetObject.client.armor $= "Heavy" || %targetObject.client.armor $= "Medium") @@ -1905,6 +1972,7 @@ function LakRabbitGame::playerTouchFlag(%game, %player, %flag) cancel(%game.updateFlagThread[%flag]); // z0dd - ZOD, 8/4/02. Cancel this flag's thread to KineticPoet's flag updater %player.freeDJ = 0; %flag.bounced = 0; + %player.client.rabbitSplash = getSimTime(); %player.client.startTime = getSimTime(); %player.holdingFlag = %flag; @@ -2131,6 +2199,9 @@ function LakRabbitGame::gameOver(%game) // borlak -- delete variables deleteVariables("$LakFired*"); deleteVariables("$LakDamaged*"); + + %game.voteOT = 0; + %game.overtime = 0; } function LakRabbitGame::resetScore(%game, %client) @@ -2656,96 +2727,41 @@ function LakRabbitGame::applyConcussion(%game, %player) %game.dropFlag( %player ); } -//--------------------------------Footnotes--------------------------------------- -// -// -//To make vote options work in evo admin mod, demonstration only below -// -//function serverCmdStartNewVote(%client, %typeName, %arg1, %arg2, %arg3, %arg4, %playerVote) -//{ -// parent::serverCmdStartNewVote(%client, %typeName, %arg1, %arg2, %arg3, %arg4, %playerVote); -// -// // sonic9k 11/6/2003 - Added support for LakRabbit DuelMode option -// // -// case "VoteDuelMode": -// if( %isAdmin && !%client.ForceVote ) -// { -// adminStartNewVote(%client, %typename, %arg1, %arg2, %arg3, %arg4); -// adminLog(%client, " has toggled " @ %arg1 @ " (" @ %arg2 @ ")"); -// } -// else -// { -// if(Game.scheduleVote !$= "") -// { -// messageClient(%client, 'voteAlreadyRunning', '\c2A vote is already in progress.'); -// return; -// } -// %actionMsg = ($Host::LakRabbitDuelMode ? "disable Duel mode" : "enable Duel mode"); -// for(%idx = 0; %idx < ClientGroup.getCount(); %idx++) -// { -// %cl = ClientGroup.getObject(%idx); -// if(!%cl.isAIControlled()) -// { -// messageClient(%cl, 'VoteStarted', '\c2%1 initiated a vote to %2.', %client.name, %actionMsg); -// %clientsVoting++; -// } -// } -// playerStartNewVote(%client, %typename, %arg1, %arg2, %arg3, %arg4, %clientsVoting); -// } -// // -// // sonic9k 11/6/2003 - Added support for LakRabbit SplashDamage option -// // -// case "VoteSplashDamage": -// if( %isAdmin && !%client.ForceVote ) -// { -// adminStartNewVote(%client, %typename, %arg1, %arg2, %arg3, %arg4); -// adminLog(%client, " has toggled " @ %arg1 @ " (" @ %arg2 @ ")"); -// } -// else -// { -// if(Game.scheduleVote !$= "") -// { -// messageClient(%client, 'voteAlreadyRunning', '\c2A vote is already in progress.'); -// return; -// } -// %actionMsg = ($Host::LakRabbitNoSplashDamage ? "enable SplashDamage" : "disable SplashDamage"); -// for(%idx = 0; %idx < ClientGroup.getCount(); %idx++) -// { -// %cl = ClientGroup.getObject(%idx); -// if(!%cl.isAIControlled()) -// { -// messageClient(%cl, 'VoteStarted', '\c2%1 initiated a vote to %2.', %client.name, %actionMsg); -// %clientsVoting++; -// } -// } -// playerStartNewVote(%client, %typename, %arg1, %arg2, %arg3, %arg4, %clientsVoting); -// } -// // -// // chocotaco 8/7/2018 - Added support for LakRabbit Pro option -// // -// case "VotePro": -// if( %isAdmin && !%client.ForceVote ) -// { -// adminStartNewVote(%client, %typename, %arg1, %arg2, %arg3, %arg4); -// adminLog(%client, " has toggled " @ %arg1 @ " (" @ %arg2 @ ")"); -// } -// else -// { -// if(Game.scheduleVote !$= "") -// { -// messageClient(%client, 'voteAlreadyRunning', '\c2A vote is already in progress.'); -// return; -// } -// %actionMsg = ($Host::LakRabbitPubPro ? "disable Pro mode" : "enable Pro mode"); -// for(%idx = 0; %idx < ClientGroup.getCount(); %idx++) -// { -// %cl = ClientGroup.getObject(%idx); -// if(!%cl.isAIControlled()) -// { -// messageClient(%cl, 'VoteStarted', '\c2%1 initiated a vote to %2.', %client.name, %actionMsg); -// %clientsVoting++; -// } -// } -// playerStartNewVote(%client, %typename, %arg1, %arg2, %arg3, %arg4, %clientsVoting); -// } -//} +function LakRabbitGame::throwDummyFlag(%position, %datablock, %player, %ttl) +{ + %client = %player.client; + + // create a flag and throw it + %droppedflag = new Item() { + position = %position; + rotation = "0 0 1 " @ (getRandom() * 360); + scale = "1 1 1"; + dataBlock = %datablock; + collideable = "0"; + static = "0"; + rotate = "1"; + team = "0"; + isFake = 1; + }; + MissionCleanup.add(%droppedflag); + + %vec = (-1.0 + getRandom() * 2.0) SPC (-1.0 + getRandom() * 2.0) SPC getRandom(); + %vec = VectorScale(%vec, getrandom(250,1000) + (getRandom() * 300)); + + // Add player's velocity + if (%player !$= "") + { + %droppedflag.setCollisionTimeout(%player); + %vec = vectorAdd(%vec, %player.getVelocity()); + } + + %droppedflag.applyImpulse(%pos, %vec); + + %droppedFlag.die = schedule(getrandom(1500,3500), 0, "removeLakFakeFlag", %droppedflag); +} + +function removeLakFakeFlag(%flag) +{ + %flag.startFade(600, 0, true); + %flag.schedule(601, "delete"); +} From 97c9bf7270374ba190dfa9caba5f2f42eedcdad6 Mon Sep 17 00:00:00 2001 From: ChocoTaco1 Date: Sun, 23 Nov 2025 13:14:18 -0500 Subject: [PATCH 34/37] Update LakRabbitGame.cs --- Classic/scripts/LakRabbitGame.cs | 174 +++++++++++++++++-------------- 1 file changed, 93 insertions(+), 81 deletions(-) diff --git a/Classic/scripts/LakRabbitGame.cs b/Classic/scripts/LakRabbitGame.cs index 0dea6d2..f5cdf80 100644 --- a/Classic/scripts/LakRabbitGame.cs +++ b/Classic/scripts/LakRabbitGame.cs @@ -457,94 +457,106 @@ function Armor::damageObject(%data, %targetObject, %sourceObject, %position, %am %sound = %defaultSound; } - %tgPos = %targetObject.getPosition(); - %terrHeight = getTerrainHeight(getWords(%tgPos,0,1)); - %playerHeight = mAbs(getWord(%tgPos,2) - %terrHeight); + if(%targetObject.holdingFlag) + { + %tgPos = %targetObject.getPosition(); + %terrHeight = getTerrainHeight(getWords(%tgPos,0,1)); + %playerHeight = mAbs(getWord(%tgPos,2) - %terrHeight); + } - // special knockback if you hit too close, max 15% chance (point blank).. 5% at 30meters, 1% chance for any MA + if(%targetObject.holdingFlag && %playerHeight >= 100) + { + // tr2 style flag drop.. it does kill the rabbit - // Slap based on a Disc headshot - //%chance = mFloor(25 - %distance/3); - //if(%ma && getRandom(1,50) <= %chance && %targetObject.client.headshot) + %chance = mFloor(20 - %distance/%playerHeight); + if(%chance <= 0) %chance = 1; + if(%ma && getRandom(1,100) <= %chance) + { + Game.playerDroppedFlag(%targetObject); - //Normal Slap - %chance = mFloor(15 - %distance/3); - if(%chance <= 0) %chance = 1; - - if(%ma && getRandom(1,100) <= %chance) + %position = %targetObject.getPosition(); + %count = 40; + %ttl = 60000; + %player = %targetObject; + if( %position $= "" ) { - if(%targetObject.holdingFlag) - { - Game.playerDroppedFlag(%targetObject); - //Added so cloak is turned off when slapped. - %targetObject.setCloaked(false); - %targetObject.freeDJ = 1; - } - if(%sourceObject.holdingFlag && Game.duelMode) - { - duelBonus(%sourceObject.client); - $LakDamaged[%targetObject.client] = 0; - } - - // lower damage and make invincible to ground damage to make it a little more fun - %amount = 0.01; - %targetObject.setKnockback(true); - %targetObject.schedule(15000, "setKnockback", false); - - %p = %targetObject.getWorldBoxCenter(); - %muzzleVec = %sourceObject.getMuzzleVector(0); - %impulseVec = VectorScale(%muzzleVec, 25000); - %targetObject.applyImpulse(%p, %impulseVec); - %sound = '~wfx/misc/slapshot.wav'; - - %slapmsg = getRandom(1,3); - switch$(%slapmsg) - { - case 1: - messageAll('msgSlapmessage','\c0%1 wonders what the five fingers said to the face.', %targetObject.client.name ); - case 2: - messageAll('msgSlapmessage','\c0%1 gets slapped the heck out!', %targetObject.client.name ); - case 3: - messageAll('msgSlapmessage','\c0%1 is taking a short tour around the map.', %targetObject.client.name ); - } + error("No position passed!"); + return 0; } - else if(%ma && getRandom(1,35) <= %chance && %playerHeight >= 100 && %targetObject.holdingFlag) + if( %count <= 0 ) { - - Game.playerDroppedFlag(%targetObject); - - %position = %targetObject.getPosition(); - %count = 40; - %ttl = 60000; - %player = %targetObject; - if( %position $= "" ) - { - error("No position passed!"); - return 0; - } - if( %count <= 0 ) - { - error("Number of flags to spew must be greater than 0!"); - return 0; - } - - %flagArr[0] = LakFakeFlag8; - %flagArr[1] = LakFakeFlag2; - %flagArr[2] = LakFakeFlag4; - - while( %count > 0 ) - { - %index = mFloor(getRandom() * 3); - // throwDummyFlag(location, Datablock); - LakRabbitGame::throwDummyFlag(%position, %flagArr[%index], %player, %ttl); - %count--; - } - - %targetObject.blowup(); - %targetObject.scriptKill($DamageType::Explosion); - %sound = '~wfx/misc/MA1.wav'; + error("Number of flags to spew must be greater than 0!"); + return 0; } + + %flagArr[0] = LakFakeFlag8; + %flagArr[1] = LakFakeFlag2; + %flagArr[2] = LakFakeFlag4; + + while( %count > 0 ) + { + %index = mFloor(getRandom() * 3); + // throwDummyFlag(location, Datablock); + LakRabbitGame::throwDummyFlag(%position, %flagArr[%index], %player, %ttl); + %count--; + } + + %targetObject.blowup(); + %targetObject.scriptKill($DamageType::Explosion); + %sound = '~wfx/misc/MA1.wav'; + } + } + else + { + // special knockback if you hit too close, max 15% chance (point blank).. 5% at 30meters, 1% chance for any MA + + // Slap based on a Disc headshot + //%chance = mFloor(25 - %distance/3); + //if(%ma && getRandom(1,50) <= %chance && %targetObject.client.headshot) + + //Normal Slap + %chance = mFloor(15 - %distance/3); + if(%chance <= 0) %chance = 1; + + if(%ma && getRandom(1,100) <= %chance) + { + if(%targetObject.holdingFlag) + { + Game.playerDroppedFlag(%targetObject); + //Added so cloak is turned off when slapped. + %targetObject.setCloaked(false); + %targetObject.freeDJ = 1; + } + if(%sourceObject.holdingFlag && Game.duelMode) + { + duelBonus(%sourceObject.client); + $LakDamaged[%targetObject.client] = 0; + } + + // lower damage and make invincible to ground damage to make it a little more fun + %amount = 0.01; + %targetObject.setKnockback(true); + %targetObject.schedule(15000, "setKnockback", false); + + %p = %targetObject.getWorldBoxCenter(); + %muzzleVec = %sourceObject.getMuzzleVector(0); + %impulseVec = VectorScale(%muzzleVec, 25000); + %targetObject.applyImpulse(%p, %impulseVec); + %sound = '~wfx/misc/slapshot.wav'; + + %slapmsg = getRandom(1,3); + switch$(%slapmsg) + { + case 1: + messageAll('msgSlapmessage','\c0%1 wonders what the five fingers said to the face.', %targetObject.client.name ); + case 2: + messageAll('msgSlapmessage','\c0%1 gets slapped the heck out!', %targetObject.client.name ); + case 3: + messageAll('msgSlapmessage','\c0%1 is taking a short tour around the map.', %targetObject.client.name ); + } + } + } %weapon = "Disc"; case $DamageType::Grenade: if($lastObjExplode.isHandNade) //Hand grenades @@ -2757,7 +2769,7 @@ function LakRabbitGame::throwDummyFlag(%position, %datablock, %player, %ttl) %droppedflag.applyImpulse(%pos, %vec); - %droppedFlag.die = schedule(getrandom(1500,3500), 0, "removeLakFakeFlag", %droppedflag); + %droppedFlag.die = schedule(getrandom(1500,5500), 0, "removeLakFakeFlag", %droppedflag); } function removeLakFakeFlag(%flag) From e99b0131834fd818da39fbce6ae21ecb201615b1 Mon Sep 17 00:00:00 2001 From: ChocoTaco1 Date: Fri, 5 Dec 2025 16:48:41 -0500 Subject: [PATCH 35/37] Update TacoOverrides.cs Treat all vehicles the same --- Classic/scripts/autoexec/TacoOverrides.cs | 30 ++++++----------------- 1 file changed, 7 insertions(+), 23 deletions(-) diff --git a/Classic/scripts/autoexec/TacoOverrides.cs b/Classic/scripts/autoexec/TacoOverrides.cs index 0e8fb6e..d5840ef 100644 --- a/Classic/scripts/autoexec/TacoOverrides.cs +++ b/Classic/scripts/autoexec/TacoOverrides.cs @@ -57,7 +57,7 @@ function VehicleData::onDestroyed(%data, %obj, %prevState) %zVel = (getRandom() * 100.0) + 50.0; %flingVel = %xVel @ " " @ %yVel @ " " @ %zVel; %flingee.applyImpulse(%flingee.getTransform(), %flingVel); - echo("got player..." @ %flingee.getClassName()); + //echo("got player..." @ %flingee.getClassName()); %flingee.damage(0, %obj.getPosition(), 0.4, $DamageType::Crash); } } @@ -70,29 +70,13 @@ function VehicleData::onDestroyed(%data, %obj, %prevState) %data.deleteAllMounted(%obj); // ----------------------------------------------------------------------------------------- // z0dd - ZOD - Czar, 6/24/02. Move this vehicle out of the way so nothing collides with it. - if(%data.getName() $="AssaultVehicle") - { - // %obj.setFrozenState(true); - %obj.schedule(500, "delete"); //was 2000 - //%data.schedule(500, 'onAvoidCollisions', %obj); + %obj.setFrozenState(true); + %obj.schedule(2000, "delete"); //was 500 + %data.schedule(500, 'onAvoidCollisions', %obj); - //Transfer the vehicle far away - %obj.schedule(128, "setPosition", vectorAdd(%obj.getPosition(), "40 -27 10000")); //Lowered: was 500 - } - else if(%data.getName() $="BomberFlyer" || %data.getName() $="MobileBaseVehicle") - { - // %obj.setFrozenState(true); - %obj.schedule(2000, "delete"); //was 2000 - //%data.schedule(500, 'onAvoidCollisions', %obj); + //Transfer the vehicle far away + %obj.schedule(128, "setPosition", vectorAdd(%obj.getPosition(), "40 -27 10000")); //Lowered: was 500 - //Transfer the vehicle far away - %obj.schedule(128, "setPosition", vectorAdd(%obj.getPosition(), "40 -27 10000")); //Lowered: was 500 - } - else - { - %obj.setFrozenState(true); - %obj.schedule(500, "delete"); //was 500 - } // ----------------------------------------------------------------------------------------- } @@ -422,4 +406,4 @@ if (!isActivePackage(TacoOverrides)) // %z = getWord(%impulseVec, 2) / %data.mass; // %vel = %x SPC %y SPC %z; // %this.setVelocity(vectorAdd(%this.getVelocity(), %vel)); -// } \ No newline at end of file +// } From 47e19322791fd973808cc650852080fd208d5226 Mon Sep 17 00:00:00 2001 From: ChocoTaco1 Date: Mon, 15 Dec 2025 12:43:12 -0500 Subject: [PATCH 36/37] TotalTeamPlayerCount fix Improper team count for lakrabbit which effects things like setnextmission votes --- Classic/scripts/autoexec/TeamManagement.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Classic/scripts/autoexec/TeamManagement.cs b/Classic/scripts/autoexec/TeamManagement.cs index 8785f05..5862199 100644 --- a/Classic/scripts/autoexec/TeamManagement.cs +++ b/Classic/scripts/autoexec/TeamManagement.cs @@ -42,7 +42,7 @@ function GetTeamCounts(%game) if($countdownStarted && $MatchStarted) { //Variables - $TotalTeamPlayerCount = $TeamRank[1, count] + $TeamRank[2, count]; + $TotalTeamPlayerCount = (Game.class $= "LakRabbitGame") ? $TeamRank[0, count] : ($TeamRank[1, count] + $TeamRank[2, count]); $AllPlayerCount = $HostGamePlayerCount; //Observers From 74ed8c8cdee8a798833fcf2ad5d6786ecb7a335b Mon Sep 17 00:00:00 2001 From: ChocoTaco1 Date: Mon, 5 Jan 2026 15:57:01 -0500 Subject: [PATCH 37/37] Added LCTF --- Classic/scripts/inventory.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Classic/scripts/inventory.cs b/Classic/scripts/inventory.cs index 1093efd..5dbac31 100644 --- a/Classic/scripts/inventory.cs +++ b/Classic/scripts/inventory.cs @@ -445,7 +445,7 @@ function ShapeBase::throwObject(%this,%obj) { %obj.static = false; // z0dd - ZOD - SquirrelOfDeath, 10/02/02. Hack for flag collision bug. - if(Game.Class $= CTFGame || Game.Class $= PracticeCTFGame || Game.Class $= SCtFGame) + if(Game.Class $= CTFGame || Game.Class $= PracticeCTFGame || Game.Class $= SCtFGame || Game.Class $= LCTFGame) %obj.searchSchedule = Game.schedule(10, "startFlagCollisionSearch", %obj); } //------------------------------------------------------------------