mirror of
https://github.com/ChocoTaco1/TacoServer.git
synced 2026-07-15 08:04:39 +00:00
Merge branch 'NoEvo'
This commit is contained in:
commit
b34564237b
10 changed files with 1668 additions and 511 deletions
|
|
@ -8,6 +8,7 @@ $Host::AllowAdminStopVote = 1;
|
||||||
$Host::AllowAdminStopVotes = 1;
|
$Host::AllowAdminStopVotes = 1;
|
||||||
$Host::AllowAdminVotes = 1;
|
$Host::AllowAdminVotes = 1;
|
||||||
$Host::AllowMapScript = "True";
|
$Host::AllowMapScript = "True";
|
||||||
|
$Host::AllowPlayerTournamentModeVotekick = 0;
|
||||||
$Host::AllowPlayerVoteChangeMission = 1;
|
$Host::AllowPlayerVoteChangeMission = 1;
|
||||||
$Host::AllowPlayerVoteSkipMission = 1;
|
$Host::AllowPlayerVoteSkipMission = 1;
|
||||||
$Host::AllowPlayerVoteTeamDamage = 0;
|
$Host::AllowPlayerVoteTeamDamage = 0;
|
||||||
|
|
@ -139,6 +140,8 @@ $Host::LoadScreenShowLogo = 0;
|
||||||
$Host::LoadScreenShowLogoName = "dpub/DPUB_logo";
|
$Host::LoadScreenShowLogoName = "dpub/DPUB_logo";
|
||||||
$Host::LogIntentionalQuit = 1;
|
$Host::LogIntentionalQuit = 1;
|
||||||
$Host::Map = "VaubanLak";
|
$Host::Map = "VaubanLak";
|
||||||
|
$Host::MapChangeMSG = 0;
|
||||||
|
$Host::MapChangeMSGContent = "<color:3cb4b4><font:Sui Generis:22>Pickup Night\n<color:3cb4b4><font:Univers:18>Saturday, March 5th\n<color:3cb4b4><font:Univers:16>Join discord for details";
|
||||||
$Host::MarkDnDObjectives = 1;
|
$Host::MarkDnDObjectives = 1;
|
||||||
$Host::MaxBotDifficulty = 0;
|
$Host::MaxBotDifficulty = 0;
|
||||||
$Host::MaxMessageLen = 140;
|
$Host::MaxMessageLen = 140;
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
//--- GAME RULES BEGIN ---
|
//--- GAME RULES BEGIN ---
|
||||||
//Prevent enemy from capturing your flag
|
//Prevent enemy from capturing your flag
|
||||||
//Score one point for grabbing the enemy's flag
|
//Score one point for grabbing the enemy's flag
|
||||||
//To capture, your flag must be at its stand
|
//To capture, your flag must be at its stand
|
||||||
//Score 100 points each time enemy flag is captured
|
//Score 100 points each time enemy flag is captured
|
||||||
//--- GAME RULES END ---
|
//--- GAME RULES END ---
|
||||||
|
|
@ -13,14 +13,14 @@ exec("scripts/aiCTF.cs");
|
||||||
//-- tracking ---
|
//-- tracking ---
|
||||||
function CTFGame::initGameVars(%game)
|
function CTFGame::initGameVars(%game)
|
||||||
{
|
{
|
||||||
// ---------------------------------------------------
|
// ---------------------------------------------------
|
||||||
// z0dd - ZOD, 9/29/02. Removed T2 demo code from here
|
// z0dd - ZOD, 9/29/02. Removed T2 demo code from here
|
||||||
%game.SCORE_PER_SUICIDE = 0; // z0dd - ZOD, 8/19/02. No penalty for suicide! Was -10
|
%game.SCORE_PER_SUICIDE = 0; // z0dd - ZOD, 8/19/02. No penalty for suicide! Was -10
|
||||||
%game.SCORE_PER_TEAMKILL = -10;
|
%game.SCORE_PER_TEAMKILL = -10;
|
||||||
%game.SCORE_PER_DEATH = 0;
|
%game.SCORE_PER_DEATH = 0;
|
||||||
%game.SCORE_PER_TK_DESTROY = -10; // z0dd - ZOD, 10/03/02. Penalty for TKing equiptment.
|
%game.SCORE_PER_TK_DESTROY = -10; // z0dd - ZOD, 10/03/02. Penalty for TKing equiptment.
|
||||||
|
|
||||||
%game.SCORE_PER_KILL = 10;
|
%game.SCORE_PER_KILL = 10;
|
||||||
%game.SCORE_PER_PLYR_FLAG_CAP = 30;
|
%game.SCORE_PER_PLYR_FLAG_CAP = 30;
|
||||||
%game.SCORE_PER_PLYR_FLAG_TOUCH = 20;
|
%game.SCORE_PER_PLYR_FLAG_TOUCH = 20;
|
||||||
%game.SCORE_PER_TEAM_FLAG_CAP = 100;
|
%game.SCORE_PER_TEAM_FLAG_CAP = 100;
|
||||||
|
|
@ -32,7 +32,7 @@ function CTFGame::initGameVars(%game)
|
||||||
|
|
||||||
%game.SCORE_PER_TURRET_KILL = 10; // controlled
|
%game.SCORE_PER_TURRET_KILL = 10; // controlled
|
||||||
%game.SCORE_PER_TURRET_KILL_AUTO = 5; // uncontrolled, z0dd - ZOD, 5/27/03. More points, was 3
|
%game.SCORE_PER_TURRET_KILL_AUTO = 5; // uncontrolled, z0dd - ZOD, 5/27/03. More points, was 3
|
||||||
%game.SCORE_PER_FLAG_DEFEND = 5;
|
%game.SCORE_PER_FLAG_DEFEND = 5;
|
||||||
%game.SCORE_PER_CARRIER_KILL = 5;
|
%game.SCORE_PER_CARRIER_KILL = 5;
|
||||||
%game.SCORE_PER_FLAG_RETURN = 10;
|
%game.SCORE_PER_FLAG_RETURN = 10;
|
||||||
%game.SCORE_PER_STALEMATE_RETURN = 15;
|
%game.SCORE_PER_STALEMATE_RETURN = 15;
|
||||||
|
|
@ -74,7 +74,7 @@ function CTFGame::initGameVars(%game)
|
||||||
|
|
||||||
%game.TIME_CONSIDERED_FLAGCARRIER_THREAT = 3 * 1000; //after damaging enemy flag carrier
|
%game.TIME_CONSIDERED_FLAGCARRIER_THREAT = 3 * 1000; //after damaging enemy flag carrier
|
||||||
%game.RADIUS_GEN_DEFENSE = 20; //meters
|
%game.RADIUS_GEN_DEFENSE = 20; //meters
|
||||||
%game.RADIUS_FLAG_DEFENSE = 20; //meters
|
%game.RADIUS_FLAG_DEFENSE = 20; //meters
|
||||||
|
|
||||||
%game.TOUCH_DELAY_MS = 20000; //20 secs
|
%game.TOUCH_DELAY_MS = 20000; //20 secs
|
||||||
|
|
||||||
|
|
@ -87,9 +87,9 @@ function CTFGame::initGameVars(%game)
|
||||||
%game.stalemateTimeMS = 60000;
|
%game.stalemateTimeMS = 60000;
|
||||||
%game.stalemateFreqMS = 15000;
|
%game.stalemateFreqMS = 15000;
|
||||||
%game.stalemateDurationMS = 6000;
|
%game.stalemateDurationMS = 6000;
|
||||||
|
|
||||||
|
|
||||||
// ---------------------------------------------------
|
// ---------------------------------------------------
|
||||||
|
|
||||||
// z0dd - ZOD, 9/29/02. Removed T2 demo code from here
|
// z0dd - ZOD, 9/29/02. Removed T2 demo code from here
|
||||||
}
|
}
|
||||||
|
|
@ -242,7 +242,7 @@ function Flag::onEnterLiquid(%data, %obj, %coverage, %type)
|
||||||
if(%type > 3) // 1-3 are water, 4+ is lava and quicksand(?)
|
if(%type > 3) // 1-3 are water, 4+ is lava and quicksand(?)
|
||||||
{
|
{
|
||||||
//error("flag("@%obj@") is in liquid type" SPC %type);
|
//error("flag("@%obj@") is in liquid type" SPC %type);
|
||||||
// Changed slightly so this can be cancelled if it leaves the
|
// Changed slightly so this can be cancelled if it leaves the
|
||||||
// lava before its supposed to be returned - Ilys
|
// lava before its supposed to be returned - Ilys
|
||||||
%obj.lavaEnterThread = Game.schedule(3000, "flagReturn", %obj);
|
%obj.lavaEnterThread = Game.schedule(3000, "flagReturn", %obj);
|
||||||
}
|
}
|
||||||
|
|
@ -251,7 +251,7 @@ function Flag::onEnterLiquid(%data, %obj, %coverage, %type)
|
||||||
function Flag::onLeaveLiquid(%data, %obj, %type)
|
function Flag::onLeaveLiquid(%data, %obj, %type)
|
||||||
{
|
{
|
||||||
// Added to stop the flag retrun if it slides out of the lava - Ilys
|
// Added to stop the flag retrun if it slides out of the lava - Ilys
|
||||||
if(isEventPending(%obj.lavaEnterThread))
|
if(isEventPending(%obj.lavaEnterThread))
|
||||||
cancel(%obj.lavaEnterThread);
|
cancel(%obj.lavaEnterThread);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -298,35 +298,35 @@ function CTFGame::getTeamSkin(%game, %team)
|
||||||
else if(%team == 2)
|
else if(%team == 2)
|
||||||
%skin = 'dsword';
|
%skin = 'dsword';
|
||||||
else %skin = 'base';
|
else %skin = 'base';
|
||||||
|
|
||||||
case "badlands":
|
case "badlands":
|
||||||
if(%team == 1)
|
if(%team == 1)
|
||||||
%skin = 'swolf';
|
%skin = 'swolf';
|
||||||
else if(%team == 2)
|
else if(%team == 2)
|
||||||
%skin = 'dsword';
|
%skin = 'dsword';
|
||||||
else %skin = 'base';
|
else %skin = 'base';
|
||||||
|
|
||||||
case "ice":
|
case "ice":
|
||||||
if(%team == 1)
|
if(%team == 1)
|
||||||
%skin = 'swolf';
|
%skin = 'swolf';
|
||||||
else if(%team == 2)
|
else if(%team == 2)
|
||||||
%skin = 'beagle';
|
%skin = 'beagle';
|
||||||
else %skin = 'base';
|
else %skin = 'base';
|
||||||
|
|
||||||
case "desert":
|
case "desert":
|
||||||
if(%team == 1)
|
if(%team == 1)
|
||||||
%skin = 'cotp';
|
%skin = 'cotp';
|
||||||
else if(%team == 2)
|
else if(%team == 2)
|
||||||
%skin = 'beagle';
|
%skin = 'beagle';
|
||||||
else %skin = 'base';
|
else %skin = 'base';
|
||||||
|
|
||||||
case "Volcanic":
|
case "Volcanic":
|
||||||
if(%team == 1)
|
if(%team == 1)
|
||||||
%skin = 'dsword';
|
%skin = 'dsword';
|
||||||
else if(%team == 2)
|
else if(%team == 2)
|
||||||
%skin = 'cotp';
|
%skin = 'cotp';
|
||||||
else %skin = 'base';
|
else %skin = 'base';
|
||||||
|
|
||||||
default:
|
default:
|
||||||
if(%team == 2)
|
if(%team == 2)
|
||||||
%skin = 'baseb';
|
%skin = 'baseb';
|
||||||
|
|
@ -334,7 +334,7 @@ function CTFGame::getTeamSkin(%game, %team)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else %skin = $teamSkin[%team];
|
else %skin = $teamSkin[%team];
|
||||||
|
|
||||||
//error("%skin = " SPC getTaggedString(%skin));
|
//error("%skin = " SPC getTaggedString(%skin));
|
||||||
return %skin;
|
return %skin;
|
||||||
}
|
}
|
||||||
|
|
@ -358,7 +358,7 @@ function CTFGame::missionLoadDone(%game)
|
||||||
for(%i = 1; %i < (%game.numTeams + 1); %i++)
|
for(%i = 1; %i < (%game.numTeams + 1); %i++)
|
||||||
$teamScore[%i] = 0;
|
$teamScore[%i] = 0;
|
||||||
|
|
||||||
// remove
|
// remove
|
||||||
MissionGroup.clearFlagWaypoints();
|
MissionGroup.clearFlagWaypoints();
|
||||||
|
|
||||||
//reset some globals, just in case...
|
//reset some globals, just in case...
|
||||||
|
|
@ -376,7 +376,7 @@ function CTFGame::playerTouchFlag(%game, %player, %flag)
|
||||||
if ((%flag.carrier $= "") && (%player.getState() !$= "Dead"))
|
if ((%flag.carrier $= "") && (%player.getState() !$= "Dead"))
|
||||||
{
|
{
|
||||||
// z0dd - ZOD, 5/07/04. Cancel the lava return.
|
// z0dd - ZOD, 5/07/04. Cancel the lava return.
|
||||||
if(isEventPending(%obj.lavaEnterThread))
|
if(isEventPending(%obj.lavaEnterThread))
|
||||||
cancel(%obj.lavaEnterThread);
|
cancel(%obj.lavaEnterThread);
|
||||||
|
|
||||||
//flag isn't held and has been touched by a live player
|
//flag isn't held and has been touched by a live player
|
||||||
|
|
@ -390,7 +390,7 @@ function CTFGame::playerTouchFlag(%game, %player, %flag)
|
||||||
}
|
}
|
||||||
|
|
||||||
function CTFGame::playerTouchOwnFlag(%game, %player, %flag)
|
function CTFGame::playerTouchOwnFlag(%game, %player, %flag)
|
||||||
{
|
{
|
||||||
if(%flag.isHome)
|
if(%flag.isHome)
|
||||||
{
|
{
|
||||||
if (%player.holdingFlag !$= "")
|
if (%player.holdingFlag !$= "")
|
||||||
|
|
@ -400,7 +400,7 @@ function CTFGame::playerTouchOwnFlag(%game, %player, %flag)
|
||||||
%game.flagReturn(%flag, %player);
|
%game.flagReturn(%flag, %player);
|
||||||
|
|
||||||
//call the AI function
|
//call the AI function
|
||||||
%game.AIplayerTouchOwnFlag(%player, %flag);
|
%game.AIplayerTouchOwnFlag(%player, %flag);
|
||||||
}
|
}
|
||||||
|
|
||||||
function CTFGame::playerTouchEnemyFlag(%game, %player, %flag)
|
function CTFGame::playerTouchEnemyFlag(%game, %player, %flag)
|
||||||
|
|
@ -419,7 +419,7 @@ function CTFGame::playerTouchEnemyFlag(%game, %player, %flag)
|
||||||
%client = %player.client;
|
%client = %player.client;
|
||||||
%player.holdingFlag = %flag; //%player has this flag
|
%player.holdingFlag = %flag; //%player has this flag
|
||||||
%flag.carrier = %player; //this %flag is carried by %player
|
%flag.carrier = %player; //this %flag is carried by %player
|
||||||
|
|
||||||
// attach the camera to the flag.carrier
|
// attach the camera to the flag.carrier
|
||||||
if($Observers)
|
if($Observers)
|
||||||
{
|
{
|
||||||
|
|
@ -430,10 +430,10 @@ function CTFGame::playerTouchEnemyFlag(%game, %player, %flag)
|
||||||
observeFlag(%cl, %player.client, 2, %flag.team);
|
observeFlag(%cl, %player.client, 2, %flag.team);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
%player.mountImage(FlagImage, $FlagSlot, true, %game.getTeamSkin(%flag.team));
|
%player.mountImage(FlagImage, $FlagSlot, true, %game.getTeamSkin(%flag.team));
|
||||||
%game.playerGotFlagTarget(%player);
|
%game.playerGotFlagTarget(%player);
|
||||||
|
|
||||||
//only cancel the return timer if the player is in bounds...
|
//only cancel the return timer if the player is in bounds...
|
||||||
if(!%client.outOfBounds)
|
if(!%client.outOfBounds)
|
||||||
{
|
{
|
||||||
|
|
@ -484,7 +484,7 @@ function CTFGame::playerTouchEnemyFlag(%game, %player, %flag)
|
||||||
{
|
{
|
||||||
// get the grab speed
|
// get the grab speed
|
||||||
%grabspeed = mFloor(VectorLen(setWord(%player.getVelocity(), 2, 0)) * 3.6);
|
%grabspeed = mFloor(VectorLen(setWord(%player.getVelocity(), 2, 0)) * 3.6);
|
||||||
|
|
||||||
if(%grabspeed > $stats::MaxGrabSpeed || ($stats::MaxGrabSpeed $= ""))
|
if(%grabspeed > $stats::MaxGrabSpeed || ($stats::MaxGrabSpeed $= ""))
|
||||||
{
|
{
|
||||||
$stats::MaxGrabSpeed = %grabspeed;
|
$stats::MaxGrabSpeed = %grabspeed;
|
||||||
|
|
@ -493,20 +493,20 @@ function CTFGame::playerTouchEnemyFlag(%game, %player, %flag)
|
||||||
}
|
}
|
||||||
|
|
||||||
%flag.hide(true);
|
%flag.hide(true);
|
||||||
%flag.startFade(0, 0, false);
|
%flag.startFade(0, 0, false);
|
||||||
%flag.isHome = false;
|
%flag.isHome = false;
|
||||||
if(%flag.stand)
|
if(%flag.stand)
|
||||||
%flag.stand.getDataBlock().onFlagTaken(%flag.stand);//animate, if exterior stand
|
%flag.stand.getDataBlock().onFlagTaken(%flag.stand);//animate, if exterior stand
|
||||||
|
|
||||||
$flagStatus[%flag.team] = %client.nameBase;
|
$flagStatus[%flag.team] = %client.nameBase;
|
||||||
%teamName = %game.getTeamName(%flag.team);
|
%teamName = %game.getTeamName(%flag.team);
|
||||||
|
|
||||||
if(%grabspeed)
|
if(%grabspeed)
|
||||||
{
|
{
|
||||||
messageTeamExcept(%client, 'MsgCTFFlagTaken', '\c2Teammate %1 took the %2 flag. (speed: %5Kph)~wfx/misc/flag_snatch.wav', %client.name, %teamName, %flag.team, %client.nameBase, %grabspeed);
|
messageTeamExcept(%client, 'MsgCTFFlagTaken', '\c2Teammate %1 took the %2 flag. (Speed: %5Kph)~wfx/misc/flag_snatch.wav', %client.name, %teamName, %flag.team, %client.nameBase, %grabspeed);
|
||||||
messageTeam(%flag.team, 'MsgCTFFlagTaken', '\c2Your flag has been taken by %1! (speed: %5Kph)~wfx/misc/flag_taken.wav',%client.name, 0, %flag.team, %client.nameBase, %grabspeed);
|
messageTeam(%flag.team, 'MsgCTFFlagTaken', '\c2Your flag has been taken by %1! (Speed: %5Kph)~wfx/misc/flag_taken.wav',%client.name, 0, %flag.team, %client.nameBase, %grabspeed);
|
||||||
messageTeam(0, 'MsgCTFFlagTaken', '\c2%1 took the %2 flag. (speed: %5Kph)~wfx/misc/flag_snatch.wav', %client.name, %teamName, %flag.team, %client.nameBase, %grabspeed);
|
messageTeam(0, 'MsgCTFFlagTaken', '\c2%1 took the %2 flag. (Speed: %5Kph)~wfx/misc/flag_snatch.wav', %client.name, %teamName, %flag.team, %client.nameBase, %grabspeed);
|
||||||
messageClient(%client, 'MsgCTFFlagTaken', '\c2You took the %2 flag. (speed: %5Kph)~wfx/misc/flag_snatch.wav', %client.name, %teamName, %flag.team, %client.nameBase, %grabspeed);
|
messageClient(%client, 'MsgCTFFlagTaken', '\c2You took the %2 flag. (Speed: %5Kph)~wfx/misc/flag_snatch.wav', %client.name, %teamName, %flag.team, %client.nameBase, %grabspeed);
|
||||||
|
|
||||||
if(%grabspeed > 300)
|
if(%grabspeed > 300)
|
||||||
messageAll('', "~wfx/Bonuses/high-level4-blazing.wav");
|
messageAll('', "~wfx/Bonuses/high-level4-blazing.wav");
|
||||||
|
|
@ -519,7 +519,7 @@ function CTFGame::playerTouchEnemyFlag(%game, %player, %flag)
|
||||||
messageClient(%client, 'MsgCTFFlagTaken', '\c2You took the %2 flag.~wfx/misc/flag_snatch.wav', %client.name, %teamName, %flag.team, %client.nameBase);
|
messageClient(%client, 'MsgCTFFlagTaken', '\c2You took the %2 flag.~wfx/misc/flag_snatch.wav', %client.name, %teamName, %flag.team, %client.nameBase);
|
||||||
}
|
}
|
||||||
logEcho(%client.nameBase@" (pl "@%player@"/cl "@%client@") took team "@%flag.team@" flag ("@%grabspeed@")"); // MP: 6/15/2011 added grabspeed.
|
logEcho(%client.nameBase@" (pl "@%player@"/cl "@%client@") took team "@%flag.team@" flag ("@%grabspeed@")"); // MP: 6/15/2011 added grabspeed.
|
||||||
|
|
||||||
//call the AI function
|
//call the AI function
|
||||||
%game.AIplayerTouchEnemyFlag(%player, %flag);
|
%game.AIplayerTouchEnemyFlag(%player, %flag);
|
||||||
|
|
||||||
|
|
@ -559,19 +559,19 @@ function CTFGame::playerDroppedFlag(%game, %player)
|
||||||
{
|
{
|
||||||
%client = %player.client;
|
%client = %player.client;
|
||||||
%flag = %player.holdingFlag;
|
%flag = %player.holdingFlag;
|
||||||
|
|
||||||
%game.updateFlagTransform(%flag); // z0dd - ZOD, 8/4/02, Call to KineticPoet's flag updater
|
%game.updateFlagTransform(%flag); // z0dd - ZOD, 8/4/02, Call to KineticPoet's flag updater
|
||||||
%held = %game.formatTime(getSimTime() - %game.flagHeldTime[%flag], false); // z0dd - ZOD, 8/15/02. How long did player hold flag?
|
%held = %game.formatTime(getSimTime() - %game.flagHeldTime[%flag], false); // z0dd - ZOD, 8/15/02. How long did player hold flag?
|
||||||
|
|
||||||
%game.playerLostFlagTarget(%player);
|
%game.playerLostFlagTarget(%player);
|
||||||
|
|
||||||
if($Host::ClassicEvoStats)
|
if($Host::ClassicEvoStats)
|
||||||
%game.totalFlagHeldTime[%flag] = 0;
|
%game.totalFlagHeldTime[%flag] = 0;
|
||||||
|
|
||||||
%player.holdingFlag = ""; //player isn't holding a flag anymore
|
%player.holdingFlag = ""; //player isn't holding a flag anymore
|
||||||
%flag.carrier = ""; //flag isn't held anymore
|
%flag.carrier = ""; //flag isn't held anymore
|
||||||
$flagStatus[%flag.team] = "<In the Field>";
|
$flagStatus[%flag.team] = "<In the Field>";
|
||||||
|
|
||||||
// attach the camera to the flag
|
// attach the camera to the flag
|
||||||
if($Observers)
|
if($Observers)
|
||||||
{
|
{
|
||||||
|
|
@ -582,9 +582,9 @@ function CTFGame::playerDroppedFlag(%game, %player)
|
||||||
observeFlag(%cl, $TeamFlag[%flag.team], 1, %flag.team);
|
observeFlag(%cl, $TeamFlag[%flag.team], 1, %flag.team);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
%player.unMountImage($FlagSlot);
|
%player.unMountImage($FlagSlot);
|
||||||
%flag.hide(false); //Does the throwItem function handle this?
|
%flag.hide(false); //Does the throwItem function handle this?
|
||||||
|
|
||||||
%teamName = %game.getTeamName(%flag.team);
|
%teamName = %game.getTeamName(%flag.team);
|
||||||
messageTeamExcept(%client, 'MsgCTFFlagDropped', '\c2Teammate %1 dropped the %2 flag. (Held: %4)~wfx/misc/flag_drop.wav', %client.name, %teamName, %flag.team, %held); // z0dd - ZOD, 8/15/02. How long flag was held
|
messageTeamExcept(%client, 'MsgCTFFlagDropped', '\c2Teammate %1 dropped the %2 flag. (Held: %4)~wfx/misc/flag_drop.wav', %client.name, %teamName, %flag.team, %held); // z0dd - ZOD, 8/15/02. How long flag was held
|
||||||
|
|
@ -598,7 +598,7 @@ function CTFGame::playerDroppedFlag(%game, %player)
|
||||||
//don't duplicate the schedule if there's already one in progress...
|
//don't duplicate the schedule if there's already one in progress...
|
||||||
if ($FlagReturnTimer[%flag] <= 0)
|
if ($FlagReturnTimer[%flag] <= 0)
|
||||||
$FlagReturnTimer[%flag] = %game.schedule(%game.FLAG_RETURN_DELAY - %game.fadeTimeMS, "flagReturnFade", %flag);
|
$FlagReturnTimer[%flag] = %game.schedule(%game.FLAG_RETURN_DELAY - %game.fadeTimeMS, "flagReturnFade", %flag);
|
||||||
|
|
||||||
//call the AI function
|
//call the AI function
|
||||||
%game.AIplayerDroppedFlag(%player, %flag);
|
%game.AIplayerDroppedFlag(%player, %flag);
|
||||||
}
|
}
|
||||||
|
|
@ -608,7 +608,7 @@ function CTFGame::flagCap(%game, %player)
|
||||||
%client = %player.client;
|
%client = %player.client;
|
||||||
%flag = %player.holdingFlag;
|
%flag = %player.holdingFlag;
|
||||||
%flag.carrier = "";
|
%flag.carrier = "";
|
||||||
|
|
||||||
// when a player cap the flag, attach to flag again
|
// when a player cap the flag, attach to flag again
|
||||||
if($Observers)
|
if($Observers)
|
||||||
{
|
{
|
||||||
|
|
@ -620,100 +620,92 @@ function CTFGame::flagCap(%game, %player)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
%held = %game.formatTime(getSimTime() - %game.flagHeldTime[%flag], false); // z0dd - ZOD, 8/15/02. How long did player hold flag?
|
%held = %game.formatTime(getSimTime() - %game.flagHeldTime[%flag], true); // z0dd - ZOD, 8/15/02. How long did player hold flag?
|
||||||
|
|
||||||
%game.playerLostFlagTarget(%player);
|
%game.playerLostFlagTarget(%player);
|
||||||
|
|
||||||
if($Host::ClassicEvoStats)
|
if($Host::ClassicEvoStats)
|
||||||
{
|
{
|
||||||
%record = false;
|
%record = false;
|
||||||
if($TotalTeamPlayerCount >= $Host::MinFlagRecordPlayerCount)
|
%mincheck = false;
|
||||||
%recordit = true;
|
if($TotalTeamPlayerCount >= $Host::MinFlagRecordPlayerCount)
|
||||||
if(%game.totalFlagHeldTime[%flag])
|
%mincheck = true;
|
||||||
{
|
if(%game.totalFlagHeldTime[%flag])
|
||||||
%held2 = getSimTime() - %game.totalFlagHeldTime[%flag];
|
{
|
||||||
%realtime = %game.formatTime(%held2, true);
|
%held2 = getSimTime() - %game.totalFlagHeldTime[%flag];
|
||||||
if(%client.team == 1)
|
%realtime = %game.formatTime(%held2, true);
|
||||||
{
|
%tm = %client.team;
|
||||||
if((%held2 < $flagstats::heldTeam1) || $flagstats::heldTeam1 == 0)
|
|
||||||
{
|
|
||||||
if(%recordit)
|
|
||||||
{
|
|
||||||
$flagstats::heldTeam1 = %held2;
|
|
||||||
$flagstats::realTeam1 = %realTime;
|
|
||||||
$flagstats::nickTeam1 = %client.nameBase;
|
|
||||||
}
|
|
||||||
%record = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if(%client.team == 2)
|
|
||||||
{
|
|
||||||
if((%held2 < $flagstats::heldTeam2) || $flagstats::heldTeam2 == 0)
|
|
||||||
{
|
|
||||||
if(%recordit)
|
|
||||||
{
|
|
||||||
$flagstats::heldTeam2 = %held2;
|
|
||||||
$flagstats::realTeam2 = %realTime;
|
|
||||||
$flagstats::nickTeam2 = %client.nameBase;
|
|
||||||
}
|
|
||||||
%record = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(%record == true)
|
if(%tm == 1 || %tm == 2)
|
||||||
{
|
{
|
||||||
if(%recordit)
|
if((%held2 < $flagstats::heldTeam[%tm]) || $flagstats::heldTeam[%tm] == 0)
|
||||||
{
|
{
|
||||||
%fileOut = "stats/maps/classic/" @ $CurrentMissionType @ "/" @ $CurrentMission @ ".txt";
|
if(%mincheck)
|
||||||
export("$flagstats::*", %fileOut, false);
|
{
|
||||||
schedule(4000, 0, "messageAll", 'MsgCTFNewRecord', "\c2It's a new record! Time: \c3"@%realtime@"\c2.~wfx/misc/hunters_horde.wav");
|
%prevheld2 = $flagstats::heldTeam[%tm];
|
||||||
}
|
$flagstats::heldTeam[%tm] = %held2;
|
||||||
else
|
$flagstats::realTeam[%tm] = %realTime;
|
||||||
schedule(4000, 0, "messageClient", %client, '', "\c2New flag records are disabled until" SPC $Host::MinFlagRecordPlayerCount SPC "players.");
|
$flagstats::nickTeam[%tm] = %client.nameBase;
|
||||||
}
|
}
|
||||||
|
%record = true;
|
||||||
if(!$Host::TournamentMode)
|
}
|
||||||
bottomprint(%client, "You captured the flag in " @ %realTime @ " seconds", 3);
|
}
|
||||||
|
|
||||||
$stats::caps[%client]++;
|
if(%record == true)
|
||||||
if($stats::caps[%client] > $stats::caps_counter)
|
{
|
||||||
{
|
if(%mincheck)
|
||||||
$stats::caps_counter = $stats::caps[%client];
|
{
|
||||||
$stats::caps_client = getTaggedString(%client.name);
|
%fileOut = "stats/maps/classic/" @ $CurrentMissionType @ "/" @ $CurrentMission @ ".txt";
|
||||||
}
|
export("$flagstats::*", %fileOut, false);
|
||||||
|
if(%prevheld2)
|
||||||
if(%held2 < $stats::fastestCap || !$stats::fastestCap)
|
%saved = "\c2Saved: \c3-" @ %game.formatTime(%prevheld2 - %held2, true) @ "\c2";
|
||||||
{
|
schedule(4000, 0, "messageAll", 'MsgCTFNewRecord', "\c2It's a new record! Time: \c3"@%realtime@"\c2 " @ %saved @ "~wfx/misc/hunters_horde.wav");
|
||||||
$stats::fastestCap = %held2;
|
}
|
||||||
$stats::fastcap_time = %realTime;
|
else
|
||||||
$stats::fastcap_client = getTaggedString(%client.name);
|
schedule(4000, 0, "messageClient", %client, '', "\c2New flag records are disabled until" SPC $Host::MinFlagRecordPlayerCount SPC "players.");
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
bottomprint(%client, "You captured the flag in" SPC %realTime SPC "seconds.", 10, 1);
|
||||||
|
|
||||||
|
$stats::caps[%client]++;
|
||||||
|
if($stats::caps[%client] > $stats::caps_counter)
|
||||||
|
{
|
||||||
|
$stats::caps_counter = $stats::caps[%client];
|
||||||
|
$stats::caps_client = getTaggedString(%client.name);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(%held2 < $stats::fastestCap || !$stats::fastestCap)
|
||||||
|
{
|
||||||
|
$stats::fastestCap = %held2;
|
||||||
|
$stats::fastcap_time = %realTime;
|
||||||
|
$stats::fastcap_client = getTaggedString(%client.name);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//award points to player and team
|
//award points to player and team
|
||||||
%teamName = %game.getTeamName(%flag.team);
|
%teamName = %game.getTeamName(%flag.team);
|
||||||
messageTeamExcept(%client, 'MsgCTFFlagCapped', '\c2%1 captured the %2 flag! (Held: %5)~wfx/misc/flag_capture.wav', %client.name, %teamName, %flag.team, %client.team, %held);
|
messageTeamExcept(%client, 'MsgCTFFlagCapped', '\c2%1 captured the %2 flag! (Held: %5)~wfx/misc/flag_capture.wav', %client.name, %teamName, %flag.team, %client.team, %held);
|
||||||
messageTeam(%flag.team, 'MsgCTFFlagCapped', '\c2Your flag was captured by %1. (Held: %5)~wfx/misc/flag_lost.wav', %client.name, 0, %flag.team, %client.team, %held);
|
messageTeam(%flag.team, 'MsgCTFFlagCapped', '\c2Your flag was captured by %1. (Held: %5)~wfx/misc/flag_lost.wav', %client.name, 0, %flag.team, %client.team, %held);
|
||||||
messageTeam(0, 'MsgCTFFlagCapped', '\c2%1 captured the %2 flag! (Held: %5)~wfx/misc/flag_capture.wav', %client.name, %teamName, %flag.team, %client.team, %held);
|
messageTeam(0, 'MsgCTFFlagCapped', '\c2%1 captured the %2 flag! (Held: %5)~wfx/misc/flag_capture.wav', %client.name, %teamName, %flag.team, %client.team, %held);
|
||||||
messageClient(%client, 'MsgCTFFlagCapped', '\c2You captured the %2 flag! (Held: %5)~wfx/misc/flag_capture.wav', %client.name, %teamName, %flag.team, %client.team, %held); // Yogi, 8/18/02. 3rd param changed 0 -> %client.name
|
messageClient(%client, 'MsgCTFFlagCapped', '\c2You captured the %2 flag! (Held: %5)~wfx/misc/flag_capture.wav', %client.name, %teamName, %flag.team, %client.team, %held); // Yogi, 8/18/02. 3rd param changed 0 -> %client.name
|
||||||
|
|
||||||
logEcho(%client.nameBase@" (pl "@%player@"/cl "@%client@") capped team "@%client.team@" flag"@" (Held: "@%held@")"); // MP: 6/14/2011 The team is wrong, but the stats program auto-corrects it, so just leave as is
|
logEcho(%client.nameBase@" (pl "@%player@"/cl "@%client@") capped team "@%client.team@" flag"@" (Held: "@%held@")"); // MP: 6/14/2011 The team is wrong, but the stats program auto-corrects it, so just leave as is
|
||||||
%player.holdingFlag = ""; //no longer holding it.
|
%player.holdingFlag = ""; //no longer holding it.
|
||||||
%player.unMountImage($FlagSlot);
|
%player.unMountImage($FlagSlot);
|
||||||
%game.awardScoreFlagCap(%client, %flag);
|
%game.awardScoreFlagCap(%client, %flag);
|
||||||
%game.flagReset(%flag);
|
%game.flagReset(%flag);
|
||||||
|
|
||||||
//call the AI function
|
//call the AI function
|
||||||
%game.AIflagCap(%player, %flag);
|
%game.AIflagCap(%player, %flag);
|
||||||
|
|
||||||
//Determine score status
|
//Determine score status
|
||||||
%caplimit = MissionGroup.CTF_scoreLimit;
|
%caplimit = MissionGroup.CTF_scoreLimit;
|
||||||
%otherteam = ( %client.team == 1 ) ? 2 : 1;
|
%otherteam = ( %client.team == 1 ) ? 2 : 1;
|
||||||
//Find out caps from score
|
//Find out caps from score
|
||||||
%clientteamcaps = mFloor($TeamScore[%client.team] / %game.SCORE_PER_TEAM_FLAG_CAP);
|
%clientteamcaps = mFloor($TeamScore[%client.team] / %game.SCORE_PER_TEAM_FLAG_CAP);
|
||||||
%otherteamcaps = mFloor($TeamScore[%otherteam] / %game.SCORE_PER_TEAM_FLAG_CAP);
|
%otherteamcaps = mFloor($TeamScore[%otherteam] / %game.SCORE_PER_TEAM_FLAG_CAP);
|
||||||
|
|
||||||
//Determine Gamepoint
|
//Determine Gamepoint
|
||||||
if(%clientteamcaps >= (%caplimit - 1))
|
if(%clientteamcaps >= (%caplimit - 1))
|
||||||
{
|
{
|
||||||
|
|
@ -766,7 +758,7 @@ function CTFGame::flagReturn(%game, %flag, %player)
|
||||||
else
|
else
|
||||||
%otherTeam = 1;
|
%otherTeam = 1;
|
||||||
%teamName = %game.getTeamName(%flag.team);
|
%teamName = %game.getTeamName(%flag.team);
|
||||||
|
|
||||||
// when the flag return, attach to flag again
|
// when the flag return, attach to flag again
|
||||||
if($Observers)
|
if($Observers)
|
||||||
{
|
{
|
||||||
|
|
@ -777,7 +769,7 @@ function CTFGame::flagReturn(%game, %flag, %player)
|
||||||
observeFlag(%cl, $TeamFlag[%flag.team], 1, %flag.team);
|
observeFlag(%cl, $TeamFlag[%flag.team], 1, %flag.team);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (%player !$= "")
|
if (%player !$= "")
|
||||||
{
|
{
|
||||||
//a player returned it
|
//a player returned it
|
||||||
|
|
@ -787,7 +779,7 @@ function CTFGame::flagReturn(%game, %flag, %player)
|
||||||
messageTeam(0, 'MsgCTFFlagReturned', '\c2%1 returned the %2 flag.~wfx/misc/flag_return.wav', %client.name, %teamName, %flag.team);
|
messageTeam(0, 'MsgCTFFlagReturned', '\c2%1 returned the %2 flag.~wfx/misc/flag_return.wav', %client.name, %teamName, %flag.team);
|
||||||
messageClient(%client, 'MsgCTFFlagReturned', '\c2You returned your flag.~wfx/misc/flag_return.wav', %client.name, %teamName, %flag.team); // Yogi, 8/18/02. 3rd param changed 0 -> %client.name
|
messageClient(%client, 'MsgCTFFlagReturned', '\c2You returned your flag.~wfx/misc/flag_return.wav', %client.name, %teamName, %flag.team); // Yogi, 8/18/02. 3rd param changed 0 -> %client.name
|
||||||
logEcho(%client.nameBase@" (pl "@%player@"/cl "@%client@") returned team "@%flag.team@" flag");
|
logEcho(%client.nameBase@" (pl "@%player@"/cl "@%client@") returned team "@%flag.team@" flag");
|
||||||
|
|
||||||
// find out what type of return it is
|
// find out what type of return it is
|
||||||
// stalemate return?
|
// stalemate return?
|
||||||
|
|
||||||
|
|
@ -803,14 +795,14 @@ function CTFGame::flagReturn(%game, %flag, %player)
|
||||||
{
|
{
|
||||||
%enemyFlagDist = vectorDist($flagPos[%flag.team], $flagPos[%otherTeam]);
|
%enemyFlagDist = vectorDist($flagPos[%flag.team], $flagPos[%otherTeam]);
|
||||||
%dist = vectorDist(%flag.position, %flag.originalPosition);
|
%dist = vectorDist(%flag.position, %flag.originalPosition);
|
||||||
|
|
||||||
%rawRatio = %dist/%enemyFlagDist;
|
%rawRatio = %dist/%enemyFlagDist;
|
||||||
%ratio = %rawRatio < 1 ? %rawRatio : 1;
|
%ratio = %rawRatio < 1 ? %rawRatio : 1;
|
||||||
%percentage = mFloor( (%ratio) * 10 ) * 10;
|
%percentage = mFloor( (%ratio) * 10 ) * 10;
|
||||||
%game.awardScoreFlagReturn(%player.client, %percentage);
|
%game.awardScoreFlagReturn(%player.client, %percentage);
|
||||||
}
|
}
|
||||||
// ---------------------------------------------------
|
// ---------------------------------------------------
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
//returned due to timer
|
//returned due to timer
|
||||||
|
|
@ -896,10 +888,10 @@ function CTFGame::antiTurtle(%game)
|
||||||
|
|
||||||
if(%game.stalemateSchedule > 0)
|
if(%game.stalemateSchedule > 0)
|
||||||
%game.stalemateSchedule = 0;
|
%game.stalemateSchedule = 0;
|
||||||
|
|
||||||
for (%i = 1; %i <= Game.numTeams; %i++)
|
for (%i = 1; %i <= Game.numTeams; %i++)
|
||||||
Game.flagReturn($TeamFlag[%i]);
|
Game.flagReturn($TeamFlag[%i]);
|
||||||
|
|
||||||
messageAll( "", "\c3Both flags returned to bases to break stalemate.~wfx/misc/flag_return.wav");
|
messageAll( "", "\c3Both flags returned to bases to break stalemate.~wfx/misc/flag_return.wav");
|
||||||
error(formatTimeString("HH:nn:ss") SPC "Anti-Turtle thread ended");
|
error(formatTimeString("HH:nn:ss") SPC "Anti-Turtle thread ended");
|
||||||
}
|
}
|
||||||
|
|
@ -931,7 +923,7 @@ function CTFGame::flagReset(%game, %flag)
|
||||||
%flag.stand.getDataBlock().onFlagReturn(%flag.stand);//animate, if exterior stand
|
%flag.stand.getDataBlock().onFlagReturn(%flag.stand);//animate, if exterior stand
|
||||||
|
|
||||||
//fade the flag in...
|
//fade the flag in...
|
||||||
%flag.startFade(%game.fadeTimeMS, 0, false);
|
%flag.startFade(%game.fadeTimeMS, 0, false);
|
||||||
|
|
||||||
// dont render base target
|
// dont render base target
|
||||||
setTargetRenderMask(%flag.waypoint.getTarget(), 0);
|
setTargetRenderMask(%flag.waypoint.getTarget(), 0);
|
||||||
|
|
@ -949,7 +941,7 @@ function CTFGame::flagReset(%game, %flag)
|
||||||
{
|
{
|
||||||
cancel(%flag.searchSchedule);
|
cancel(%flag.searchSchedule);
|
||||||
}
|
}
|
||||||
// --------------------------------------------------------------------------
|
// --------------------------------------------------------------------------
|
||||||
}
|
}
|
||||||
|
|
||||||
function CTFGame::timeLimitReached(%game)
|
function CTFGame::timeLimitReached(%game)
|
||||||
|
|
@ -1035,7 +1027,7 @@ function CTFGame::gameOver(%game)
|
||||||
}
|
}
|
||||||
|
|
||||||
messageAll('MsgClearObjHud', "");
|
messageAll('MsgClearObjHud', "");
|
||||||
for(%i = 0; %i < ClientGroup.getCount(); %i ++)
|
for(%i = 0; %i < ClientGroup.getCount(); %i ++)
|
||||||
{
|
{
|
||||||
%client = ClientGroup.getObject(%i);
|
%client = ClientGroup.getObject(%i);
|
||||||
%game.resetScore(%client);
|
%game.resetScore(%client);
|
||||||
|
|
@ -1045,7 +1037,7 @@ function CTFGame::gameOver(%game)
|
||||||
}
|
}
|
||||||
|
|
||||||
function CTFGame::onClientDamaged(%game, %clVictim, %clAttacker, %damageType, %implement, %damageLoc)
|
function CTFGame::onClientDamaged(%game, %clVictim, %clAttacker, %damageType, %implement, %damageLoc)
|
||||||
{
|
{
|
||||||
if(%clVictim.headshot && %damageType == $DamageType::Laser && %clVictim.team != %clAttacker.team)
|
if(%clVictim.headshot && %damageType == $DamageType::Laser && %clVictim.team != %clAttacker.team)
|
||||||
{
|
{
|
||||||
%clAttacker.scoreHeadshot++;
|
%clAttacker.scoreHeadshot++;
|
||||||
|
|
@ -1073,16 +1065,16 @@ function CTFGame::onClientDamaged(%game, %clVictim, %clAttacker, %damageType, %i
|
||||||
|
|
||||||
//the DefaultGame will set some vars
|
//the DefaultGame will set some vars
|
||||||
DefaultGame::onClientDamaged(%game, %clVictim, %clAttacker, %damageType, %implement, %damageLoc);
|
DefaultGame::onClientDamaged(%game, %clVictim, %clAttacker, %damageType, %implement, %damageLoc);
|
||||||
|
|
||||||
//if victim is carrying a flag and is not on the attackers team, mark the attacker as a threat for x seconds(for scoring purposes)
|
//if victim is carrying a flag and is not on the attackers team, mark the attacker as a threat for x seconds(for scoring purposes)
|
||||||
if ((%clVictim.holdingFlag !$= "") && (%clVictim.team != %clAttacker.team))
|
if ((%clVictim.holdingFlag !$= "") && (%clVictim.team != %clAttacker.team))
|
||||||
{
|
{
|
||||||
%clAttacker.dmgdFlagCarrier = true;
|
%clAttacker.dmgdFlagCarrier = true;
|
||||||
cancel(%clAttacker.threatTimer); //restart timer
|
cancel(%clAttacker.threatTimer); //restart timer
|
||||||
%clAttacker.threatTimer = schedule(%game.TIME_CONSIDERED_FLAGCARRIER_THREAT, %clAttacker.dmgdFlagCarrier = false);
|
%clAttacker.threatTimer = schedule(%game.TIME_CONSIDERED_FLAGCARRIER_THREAT, %clAttacker.dmgdFlagCarrier = false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////
|
||||||
function CTFGame::clientMissionDropReady(%game, %client)
|
function CTFGame::clientMissionDropReady(%game, %client)
|
||||||
{
|
{
|
||||||
|
|
@ -1096,8 +1088,8 @@ function CTFGame::clientMissionDropReady(%game, %client)
|
||||||
//%game.populateTeamRankArray(%client);
|
//%game.populateTeamRankArray(%client);
|
||||||
|
|
||||||
//messageClient(%client, 'MsgYourRankIs', "", -1);
|
//messageClient(%client, 'MsgYourRankIs', "", -1);
|
||||||
|
|
||||||
messageClient(%client, 'MsgMissionDropInfo', '\c0You are in mission %1 (%2).', $MissionDisplayName, $MissionTypeDisplayName, $ServerName );
|
messageClient(%client, 'MsgMissionDropInfo', '\c0You are in mission %1 (%2).', $MissionDisplayName, $MissionTypeDisplayName, $ServerName );
|
||||||
|
|
||||||
DefaultGame::clientMissionDropReady(%game, %client);
|
DefaultGame::clientMissionDropReady(%game, %client);
|
||||||
}
|
}
|
||||||
|
|
@ -1122,34 +1114,34 @@ function CTFGame::recalcScore(%game, %cl)
|
||||||
// ---------------------------------------------------
|
// ---------------------------------------------------
|
||||||
// z0dd - ZOD, 9/29/02. Removed T2 demo code from here
|
// z0dd - ZOD, 9/29/02. Removed T2 demo code from here
|
||||||
%cl.offenseScore = %killPoints +
|
%cl.offenseScore = %killPoints +
|
||||||
%cl.suicides * %game.SCORE_PER_SUICIDE +
|
%cl.suicides * %game.SCORE_PER_SUICIDE +
|
||||||
%cl.escortAssists * %game.SCORE_PER_ESCORT_ASSIST +
|
%cl.escortAssists * %game.SCORE_PER_ESCORT_ASSIST +
|
||||||
%cl.teamKills * %game.SCORE_PER_TEAMKILL +
|
%cl.teamKills * %game.SCORE_PER_TEAMKILL +
|
||||||
%cl.tkDestroys * %game.SCORE_PER_TK_DESTROY + // z0dd - ZOD, 10/03/02. Penalty for tking equiptment.
|
%cl.tkDestroys * %game.SCORE_PER_TK_DESTROY + // z0dd - ZOD, 10/03/02. Penalty for tking equiptment.
|
||||||
%cl.scoreHeadshot * %game.SCORE_PER_HEADSHOT +
|
%cl.scoreHeadshot * %game.SCORE_PER_HEADSHOT +
|
||||||
%cl.scoreRearshot * %game.SCORE_PER_REARSHOT + // z0dd - ZOD, 8/25/02. Added Lance rear shot messages
|
%cl.scoreRearshot * %game.SCORE_PER_REARSHOT + // z0dd - ZOD, 8/25/02. Added Lance rear shot messages
|
||||||
%cl.scoreMidAir * %game.SCORE_PER_MIDAIR +
|
%cl.scoreMidAir * %game.SCORE_PER_MIDAIR +
|
||||||
%cl.flagCaps * %game.SCORE_PER_PLYR_FLAG_CAP +
|
%cl.flagCaps * %game.SCORE_PER_PLYR_FLAG_CAP +
|
||||||
%cl.flagGrabs * %game.SCORE_PER_PLYR_FLAG_TOUCH +
|
%cl.flagGrabs * %game.SCORE_PER_PLYR_FLAG_TOUCH +
|
||||||
%cl.genDestroys * %game.SCORE_PER_DESTROY_GEN +
|
%cl.genDestroys * %game.SCORE_PER_DESTROY_GEN +
|
||||||
%cl.sensorDestroys * %game.SCORE_PER_DESTROY_SENSOR +
|
%cl.sensorDestroys * %game.SCORE_PER_DESTROY_SENSOR +
|
||||||
%cl.turretDestroys * %game.SCORE_PER_DESTROY_TURRET +
|
%cl.turretDestroys * %game.SCORE_PER_DESTROY_TURRET +
|
||||||
%cl.iStationDestroys * %game.SCORE_PER_DESTROY_ISTATION +
|
%cl.iStationDestroys * %game.SCORE_PER_DESTROY_ISTATION +
|
||||||
%cl.vstationDestroys * %game.SCORE_PER_DESTROY_VSTATION +
|
%cl.vstationDestroys * %game.SCORE_PER_DESTROY_VSTATION +
|
||||||
%cl.mpbtstationDestroys * %game.SCORE_PER_DESTROY_MPBTSTATION + // z0dd - ZOD 3/30/02. MPB Teleporter
|
%cl.mpbtstationDestroys * %game.SCORE_PER_DESTROY_MPBTSTATION + // z0dd - ZOD 3/30/02. MPB Teleporter
|
||||||
%cl.solarDestroys * %game.SCORE_PER_DESTROY_SOLAR +
|
%cl.solarDestroys * %game.SCORE_PER_DESTROY_SOLAR +
|
||||||
%cl.sentryDestroys * %game.SCORE_PER_DESTROY_SENTRY +
|
%cl.sentryDestroys * %game.SCORE_PER_DESTROY_SENTRY +
|
||||||
%cl.depSensorDestroys * %game.SCORE_PER_DESTROY_DEP_SENSOR +
|
%cl.depSensorDestroys * %game.SCORE_PER_DESTROY_DEP_SENSOR +
|
||||||
%cl.depTurretDestroys * %game.SCORE_PER_DESTROY_DEP_TUR +
|
%cl.depTurretDestroys * %game.SCORE_PER_DESTROY_DEP_TUR +
|
||||||
%cl.depStationDestroys * %game.SCORE_PER_DESTROY_DEP_INV +
|
%cl.depStationDestroys * %game.SCORE_PER_DESTROY_DEP_INV +
|
||||||
%cl.vehicleScore + %cl.vehicleBonus;
|
%cl.vehicleScore + %cl.vehicleBonus;
|
||||||
|
|
||||||
%cl.defenseScore = %cl.genDefends * %game.SCORE_PER_GEN_DEFEND +
|
%cl.defenseScore = %cl.genDefends * %game.SCORE_PER_GEN_DEFEND +
|
||||||
%cl.flagDefends * %game.SCORE_PER_FLAG_DEFEND +
|
%cl.flagDefends * %game.SCORE_PER_FLAG_DEFEND +
|
||||||
%cl.carrierKills * %game.SCORE_PER_CARRIER_KILL +
|
%cl.carrierKills * %game.SCORE_PER_CARRIER_KILL +
|
||||||
%cl.escortAssists * %game.SCORE_PER_ESCORT_ASSIST +
|
%cl.escortAssists * %game.SCORE_PER_ESCORT_ASSIST +
|
||||||
%cl.turretKills * %game.SCORE_PER_TURRET_KILL_AUTO +
|
%cl.turretKills * %game.SCORE_PER_TURRET_KILL_AUTO +
|
||||||
%cl.mannedturretKills * %game.SCORE_PER_TURRET_KILL +
|
%cl.mannedturretKills * %game.SCORE_PER_TURRET_KILL +
|
||||||
%cl.genRepairs * %game.SCORE_PER_REPAIR_GEN +
|
%cl.genRepairs * %game.SCORE_PER_REPAIR_GEN +
|
||||||
%cl.SensorRepairs * %game.SCORE_PER_REPAIR_SENSOR +
|
%cl.SensorRepairs * %game.SCORE_PER_REPAIR_SENSOR +
|
||||||
%cl.TurretRepairs * %game.SCORE_PER_REPAIR_TURRET +
|
%cl.TurretRepairs * %game.SCORE_PER_REPAIR_TURRET +
|
||||||
|
|
@ -1161,7 +1153,7 @@ function CTFGame::recalcScore(%game, %cl)
|
||||||
%cl.sentryRepairs * %game.SCORE_PER_REPAIR_SENTRY +
|
%cl.sentryRepairs * %game.SCORE_PER_REPAIR_SENTRY +
|
||||||
%cl.depInvRepairs * %game.SCORE_PER_REPAIR_DEP_INV +
|
%cl.depInvRepairs * %game.SCORE_PER_REPAIR_DEP_INV +
|
||||||
%cl.depTurretRepairs * %game.SCORE_PER_REPAIR_DEP_TUR +
|
%cl.depTurretRepairs * %game.SCORE_PER_REPAIR_DEP_TUR +
|
||||||
%cl.returnPts;
|
%cl.returnPts;
|
||||||
// ---------------------------------------------------
|
// ---------------------------------------------------
|
||||||
|
|
||||||
// z0dd - ZOD, 9/29/02. Removed T2 demo code from here
|
// z0dd - ZOD, 9/29/02. Removed T2 demo code from here
|
||||||
|
|
@ -1174,14 +1166,14 @@ function CTFGame::recalcScore(%game, %cl)
|
||||||
function CTFGame::updateKillScores(%game, %clVictim, %clKiller, %damageType, %implement)
|
function CTFGame::updateKillScores(%game, %clVictim, %clKiller, %damageType, %implement)
|
||||||
{
|
{
|
||||||
// is this a vehicle kill rather than a player kill
|
// is this a vehicle kill rather than a player kill
|
||||||
|
|
||||||
// console error message suppression
|
// console error message suppression
|
||||||
if( isObject( %implement ) )
|
if( isObject( %implement ) )
|
||||||
{
|
{
|
||||||
if( %implement.getDataBlock().getName() $= "AssaultPlasmaTurret" || %implement.getDataBlock().getName() $= "BomberTurret" ) // gunner
|
if( %implement.getDataBlock().getName() $= "AssaultPlasmaTurret" || %implement.getDataBlock().getName() $= "BomberTurret" ) // gunner
|
||||||
%clKiller = %implement.vehicleMounted.getMountNodeObject(1).client;
|
%clKiller = %implement.vehicleMounted.getMountNodeObject(1).client;
|
||||||
else if(%implement.getDataBlock().catagory $= "Vehicles") // pilot
|
else if(%implement.getDataBlock().catagory $= "Vehicles") // pilot
|
||||||
%clKiller = %implement.getMountNodeObject(0).client;
|
%clKiller = %implement.getMountNodeObject(0).client;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(%game.testTurretKill(%implement)) //check for turretkill before awarded a non client points for a kill
|
if(%game.testTurretKill(%implement)) //check for turretkill before awarded a non client points for a kill
|
||||||
|
|
@ -1195,7 +1187,7 @@ function CTFGame::updateKillScores(%game, %clVictim, %clKiller, %damageType, %im
|
||||||
if (%game.testGenDefend(%clVictim, %clKiller))
|
if (%game.testGenDefend(%clVictim, %clKiller))
|
||||||
%game.awardScoreGenDefend(%clKiller);
|
%game.awardScoreGenDefend(%clKiller);
|
||||||
|
|
||||||
if(%game.testCarrierKill(%clVictim, %clKiller))
|
if(%game.testCarrierKill(%clVictim, %clKiller))
|
||||||
%game.awardScoreCarrierKill(%clKiller);
|
%game.awardScoreCarrierKill(%clKiller);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
@ -1203,35 +1195,35 @@ function CTFGame::updateKillScores(%game, %clVictim, %clKiller, %damageType, %im
|
||||||
%game.awardScoreFlagDefend(%clKiller);
|
%game.awardScoreFlagDefend(%clKiller);
|
||||||
}
|
}
|
||||||
if (%game.testEscortAssist(%clVictim, %clKiller))
|
if (%game.testEscortAssist(%clVictim, %clKiller))
|
||||||
%game.awardScoreEscortAssist(%clKiller);
|
%game.awardScoreEscortAssist(%clKiller);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (%game.testSuicide(%clVictim, %clKiller, %damageType)) //otherwise test for suicide
|
if (%game.testSuicide(%clVictim, %clKiller, %damageType)) //otherwise test for suicide
|
||||||
{
|
{
|
||||||
%game.awardScoreSuicide(%clVictim);
|
%game.awardScoreSuicide(%clVictim);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (%game.testTeamKill(%clVictim, %clKiller, %damageType)) //otherwise test for a teamkill
|
if (%game.testTeamKill(%clVictim, %clKiller, %damageType)) //otherwise test for a teamkill
|
||||||
%game.awardScoreTeamKill(%clVictim, %clKiller);
|
%game.awardScoreTeamKill(%clVictim, %clKiller);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function CTFGame::testFlagDefend(%game, %victimID, %killerID)
|
function CTFGame::testFlagDefend(%game, %victimID, %killerID)
|
||||||
{
|
{
|
||||||
InitContainerRadiusSearch(%victimID.plyrPointOfDeath, %game.RADIUS_FLAG_DEFENSE, $TypeMasks::ItemObjectType);
|
InitContainerRadiusSearch(%victimID.plyrPointOfDeath, %game.RADIUS_FLAG_DEFENSE, $TypeMasks::ItemObjectType);
|
||||||
%objID = containerSearchNext();
|
%objID = containerSearchNext();
|
||||||
while(%objID != 0)
|
while(%objID != 0)
|
||||||
{
|
{
|
||||||
%objType = %objID.getDataBlock().getName();
|
%objType = %objID.getDataBlock().getName();
|
||||||
if ((%objType $= "Flag") && (%objID.team == %killerID.team))
|
if ((%objType $= "Flag") && (%objID.team == %killerID.team))
|
||||||
return true; //found the(a) killer's flag near the victim's point of death
|
return true; //found the(a) killer's flag near the victim's point of death
|
||||||
else
|
else
|
||||||
%objID = containerSearchNext();
|
%objID = containerSearchNext();
|
||||||
}
|
}
|
||||||
return false; //didn't find a qualifying flag within required radius of victims point of death
|
return false; //didn't find a qualifying flag within required radius of victims point of death
|
||||||
}
|
}
|
||||||
|
|
||||||
function CTFGame::testGenDefend(%game, %victimID, %killerID)
|
function CTFGame::testGenDefend(%game, %victimID, %killerID)
|
||||||
|
|
@ -1241,23 +1233,23 @@ function CTFGame::testGenDefend(%game, %victimID, %killerID)
|
||||||
while(%objID != 0)
|
while(%objID != 0)
|
||||||
{
|
{
|
||||||
%objType = %objID.getDataBlock().ClassName;
|
%objType = %objID.getDataBlock().ClassName;
|
||||||
if ((%objType $= "generator") && (%objID.team == %killerID.team))
|
if ((%objType $= "generator") && (%objID.team == %killerID.team))
|
||||||
return true; //found a killer's generator within required radius of victim's death
|
return true; //found a killer's generator within required radius of victim's death
|
||||||
else
|
else
|
||||||
%objID = containerSearchNext();
|
%objID = containerSearchNext();
|
||||||
}
|
}
|
||||||
return false; //didn't find a qualifying gen within required radius of victim's point of death
|
return false; //didn't find a qualifying gen within required radius of victim's point of death
|
||||||
}
|
}
|
||||||
|
|
||||||
function CTFGame::testCarrierKill(%game, %victimID, %killerID)
|
function CTFGame::testCarrierKill(%game, %victimID, %killerID)
|
||||||
{
|
{
|
||||||
%flag = %victimID.plyrDiedHoldingFlag;
|
%flag = %victimID.plyrDiedHoldingFlag;
|
||||||
return ((%flag !$= "") && (%flag.team == %killerID.team));
|
return ((%flag !$= "") && (%flag.team == %killerID.team));
|
||||||
}
|
}
|
||||||
|
|
||||||
function CTFGame::testEscortAssist(%game, %victimID, %killerID)
|
function CTFGame::testEscortAssist(%game, %victimID, %killerID)
|
||||||
{
|
{
|
||||||
return (%victimID.dmgdFlagCarrier);
|
return (%victimID.dmgdFlagCarrier);
|
||||||
}
|
}
|
||||||
|
|
||||||
function CTFGame::awardScoreFlagCap(%game, %cl, %flag)
|
function CTFGame::awardScoreFlagCap(%game, %cl, %flag)
|
||||||
|
|
@ -1344,14 +1336,14 @@ function CTFGame::checkScoreLimit(%game, %team)
|
||||||
// default of 5 if scoreLimit not defined
|
// default of 5 if scoreLimit not defined
|
||||||
if(%scoreLimit $= "")
|
if(%scoreLimit $= "")
|
||||||
%scoreLimit = 5 * %game.SCORE_PER_TEAM_FLAG_CAP;
|
%scoreLimit = 5 * %game.SCORE_PER_TEAM_FLAG_CAP;
|
||||||
if($TeamScore[%team] >= %scoreLimit)
|
if($TeamScore[%team] >= %scoreLimit)
|
||||||
%game.scoreLimitReached();
|
%game.scoreLimitReached();
|
||||||
}
|
}
|
||||||
|
|
||||||
function CTFGame::awardScoreFlagReturn(%game, %cl, %perc)
|
function CTFGame::awardScoreFlagReturn(%game, %cl, %perc)
|
||||||
{
|
{
|
||||||
%cl.flagReturns++; //give flagreturn stat
|
%cl.flagReturns++; //give flagreturn stat
|
||||||
|
|
||||||
// ---------------------------------------------------
|
// ---------------------------------------------------
|
||||||
// z0dd - ZOD, 9/29/02. Removed T2 demo code from here
|
// z0dd - ZOD, 9/29/02. Removed T2 demo code from here
|
||||||
if (%game.SCORE_PER_FLAG_RETURN != 0)
|
if (%game.SCORE_PER_FLAG_RETURN != 0)
|
||||||
|
|
@ -1361,7 +1353,7 @@ function CTFGame::awardScoreFlagReturn(%game, %cl, %perc)
|
||||||
messageClient(%cl, 'scoreFlaRetMsg', 'Flag return - exceeded capping distance - %1 point bonus.', %pts, %perc);
|
messageClient(%cl, 'scoreFlaRetMsg', 'Flag return - exceeded capping distance - %1 point bonus.', %pts, %perc);
|
||||||
else if(%perc == 0)
|
else if(%perc == 0)
|
||||||
messageClient(%cl, 'scoreFlaRetMsg', 'You gently place the flag back on the stand.', %pts, %perc);
|
messageClient(%cl, 'scoreFlaRetMsg', 'You gently place the flag back on the stand.', %pts, %perc);
|
||||||
else
|
else
|
||||||
messageClient(%cl, 'scoreFlaRetMsg', '\c0Flag return from %2%% of capping distance - %1 point bonus.', %pts, %perc);
|
messageClient(%cl, 'scoreFlaRetMsg', '\c0Flag return from %2%% of capping distance - %1 point bonus.', %pts, %perc);
|
||||||
%cl.returnPts += %pts;
|
%cl.returnPts += %pts;
|
||||||
}
|
}
|
||||||
|
|
@ -1403,7 +1395,7 @@ function CTFGame::awardScoreCarrierKill(%game, %killerID)
|
||||||
messageTeamExcept(%killerID, 'msgCarKill', '\c2%1 stopped the enemy flag carrier.', %killerID.name); // z0dd - ZOD, 8/15/02. Tell team
|
messageTeamExcept(%killerID, 'msgCarKill', '\c2%1 stopped the enemy flag carrier.', %killerID.name); // z0dd - ZOD, 8/15/02. Tell team
|
||||||
//messageTeamExcept(%killerID, 'msgCarKill', '\c0Teammate %1 received a %2 point bonus for stopping the enemy flag carrier!', %killerID.name, %game.SCORE_PER_CARRIER_KILL);
|
//messageTeamExcept(%killerID, 'msgCarKill', '\c0Teammate %1 received a %2 point bonus for stopping the enemy flag carrier!', %killerID.name, %game.SCORE_PER_CARRIER_KILL);
|
||||||
}
|
}
|
||||||
%game.recalcScore(%killerID);
|
%game.recalcScore(%killerID);
|
||||||
return %game.SCORE_PER_CARRIER_KILL;
|
return %game.SCORE_PER_CARRIER_KILL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1415,7 +1407,7 @@ function CTFGame::awardScoreFlagDefend(%game, %killerID)
|
||||||
messageClient(%killerID, 'msgFlagDef', '\c0You received a %1 point bonus for defending your flag!', %game.SCORE_PER_FLAG_DEFEND);
|
messageClient(%killerID, 'msgFlagDef', '\c0You received a %1 point bonus for defending your flag!', %game.SCORE_PER_FLAG_DEFEND);
|
||||||
messageTeamExcept(%killerID, 'msgFlagDef', '\c2%1 defended our flag.', %killerID.name); // z0dd - ZOD, 8/15/02. Tell team
|
messageTeamExcept(%killerID, 'msgFlagDef', '\c2%1 defended our flag.', %killerID.name); // z0dd - ZOD, 8/15/02. Tell team
|
||||||
//messageTeamExcept(%killerID, 'msgFlagDef', '\c0Teammate %1 received a %2 point bonus for defending your flag!', %killerID.name, %game.SCORE_PER_FLAG_DEFEND);
|
//messageTeamExcept(%killerID, 'msgFlagDef', '\c0Teammate %1 received a %2 point bonus for defending your flag!', %killerID.name, %game.SCORE_PER_FLAG_DEFEND);
|
||||||
}
|
}
|
||||||
%game.recalcScore(%killerID);
|
%game.recalcScore(%killerID);
|
||||||
return %game.SCORE_PER_FLAG_DEFEND;
|
return %game.SCORE_PER_FLAG_DEFEND;
|
||||||
}
|
}
|
||||||
|
|
@ -1569,7 +1561,7 @@ function CTFGame::testValidRepair(%game, %obj)
|
||||||
return false;
|
return false;
|
||||||
else if(%obj.team != %obj.repairedBy.team)
|
else if(%obj.team != %obj.repairedBy.team)
|
||||||
return false;
|
return false;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if(%obj.soiledByEnemyRepair)
|
if(%obj.soiledByEnemyRepair)
|
||||||
%obj.soiledByEnemyRepair = false;
|
%obj.soiledByEnemyRepair = false;
|
||||||
|
|
@ -1722,8 +1714,8 @@ function CTFGame::resetScore(%game, %client)
|
||||||
%client.depSensorDestroys = 0;
|
%client.depSensorDestroys = 0;
|
||||||
%client.depTurretDestroys = 0;
|
%client.depTurretDestroys = 0;
|
||||||
%client.depStationDestroys = 0;
|
%client.depStationDestroys = 0;
|
||||||
%client.vehicleScore = 0;
|
%client.vehicleScore = 0;
|
||||||
%client.vehicleBonus = 0;
|
%client.vehicleBonus = 0;
|
||||||
|
|
||||||
%client.flagDefends = 0;
|
%client.flagDefends = 0;
|
||||||
%client.defenseScore = 0;
|
%client.defenseScore = 0;
|
||||||
|
|
@ -1752,7 +1744,7 @@ function CTFGame::enterMissionArea(%game, %playerData, %player)
|
||||||
{
|
{
|
||||||
if(%player.getState() $= "Dead")
|
if(%player.getState() $= "Dead")
|
||||||
return;
|
return;
|
||||||
%player.client.outOfBounds = false;
|
%player.client.outOfBounds = false;
|
||||||
messageClient(%player.client, 'EnterMissionArea', '\c1You are back in the mission area.');
|
messageClient(%player.client, 'EnterMissionArea', '\c1You are back in the mission area.');
|
||||||
logEcho(%player.client.nameBase@" (pl "@%player@"/cl "@%player.client@") entered mission area");
|
logEcho(%player.client.nameBase@" (pl "@%player@"/cl "@%player.client@") entered mission area");
|
||||||
|
|
||||||
|
|
@ -1799,7 +1791,7 @@ function CTFGame::boundaryLoseFlag(%game, %player)
|
||||||
%flag.setCollisionTimeout(%player);
|
%flag.setCollisionTimeout(%player);
|
||||||
|
|
||||||
%held = %game.formatTime(getSimTime() - %game.flagHeldTime[%flag], false); // z0dd - ZOD, 8/15/02. How long did player hold flag?
|
%held = %game.formatTime(getSimTime() - %game.flagHeldTime[%flag], false); // z0dd - ZOD, 8/15/02. How long did player hold flag?
|
||||||
|
|
||||||
if($Host::ClassicEvoStats)
|
if($Host::ClassicEvoStats)
|
||||||
%game.totalFlagHeldTime[%flag] = 0;
|
%game.totalFlagHeldTime[%flag] = 0;
|
||||||
|
|
||||||
|
|
@ -1860,28 +1852,28 @@ function CTFGame::vehicleDestroyed(%game, %vehicle, %destroyer)
|
||||||
%vehicleType = getTaggedString(%data.targetTypeTag);
|
%vehicleType = getTaggedString(%data.targetTypeTag);
|
||||||
if(%vehicleType !$= "MPB")
|
if(%vehicleType !$= "MPB")
|
||||||
%vehicleType = strlwr(%vehicleType);
|
%vehicleType = strlwr(%vehicleType);
|
||||||
|
|
||||||
%enemyTeam = ( %destroyer.team == 1 ) ? 2 : 1;
|
%enemyTeam = ( %destroyer.team == 1 ) ? 2 : 1;
|
||||||
|
|
||||||
%scorer = 0;
|
%scorer = 0;
|
||||||
%multiplier = 1;
|
%multiplier = 1;
|
||||||
|
|
||||||
%passengers = 0;
|
%passengers = 0;
|
||||||
for(%i = 0; %i < %data.numMountPoints; %i++)
|
for(%i = 0; %i < %data.numMountPoints; %i++)
|
||||||
if(%vehicle.getMountNodeObject(%i))
|
if(%vehicle.getMountNodeObject(%i))
|
||||||
%passengers++;
|
%passengers++;
|
||||||
|
|
||||||
//what destroyed this vehicle
|
//what destroyed this vehicle
|
||||||
if(%destroyer.client)
|
if(%destroyer.client)
|
||||||
{
|
{
|
||||||
//it was a player, or his mine, satchel, whatever...
|
//it was a player, or his mine, satchel, whatever...
|
||||||
%destroyer = %destroyer.client;
|
%destroyer = %destroyer.client;
|
||||||
%scorer = %destroyer;
|
%scorer = %destroyer;
|
||||||
|
|
||||||
// determine if the object used was a mine
|
// determine if the object used was a mine
|
||||||
if(%vehicle.lastDamageType == $DamageType::Mine)
|
if(%vehicle.lastDamageType == $DamageType::Mine)
|
||||||
%multiplier = 2;
|
%multiplier = 2;
|
||||||
}
|
}
|
||||||
else if(%destroyer.getClassName() $= "Turret")
|
else if(%destroyer.getClassName() $= "Turret")
|
||||||
{
|
{
|
||||||
if(%destroyer.getControllingClient())
|
if(%destroyer.getControllingClient())
|
||||||
|
|
@ -1890,12 +1882,12 @@ function CTFGame::vehicleDestroyed(%game, %vehicle, %destroyer)
|
||||||
%destroyer = %destroyer.getControllingClient();
|
%destroyer = %destroyer.getControllingClient();
|
||||||
%scorer = %destroyer;
|
%scorer = %destroyer;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
%destroyerName = "A turret";
|
%destroyerName = "A turret";
|
||||||
%multiplier = 0;
|
%multiplier = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if(%destroyer.getDataBlock().catagory $= "Vehicles")
|
else if(%destroyer.getDataBlock().catagory $= "Vehicles")
|
||||||
{
|
{
|
||||||
// Vehicle vs vehicle kill!
|
// Vehicle vs vehicle kill!
|
||||||
|
|
@ -1903,7 +1895,7 @@ function CTFGame::vehicleDestroyed(%game, %vehicle, %destroyer)
|
||||||
%gunnerNode = 1;
|
%gunnerNode = 1;
|
||||||
else
|
else
|
||||||
%gunnerNode = 0;
|
%gunnerNode = 0;
|
||||||
|
|
||||||
if(%destroyer.getMountNodeObject(%gunnerNode))
|
if(%destroyer.getMountNodeObject(%gunnerNode))
|
||||||
{
|
{
|
||||||
%destroyer = %destroyer.getMountNodeObject(%gunnerNode).client;
|
%destroyer = %destroyer.getMountNodeObject(%gunnerNode).client;
|
||||||
|
|
@ -1914,23 +1906,23 @@ function CTFGame::vehicleDestroyed(%game, %vehicle, %destroyer)
|
||||||
else // Is there anything else we care about?
|
else // Is there anything else we care about?
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
||||||
if(%destroyerName $= "")
|
if(%destroyerName $= "")
|
||||||
%destroyerName = %destroyer.name;
|
%destroyerName = %destroyer.name;
|
||||||
|
|
||||||
if(%vehicle.team == %destroyer.team) // team kill
|
if(%vehicle.team == %destroyer.team) // team kill
|
||||||
{
|
{
|
||||||
%pref = (%vehicleType $= "Assault Tank") ? "an" : "a";
|
%pref = (%vehicleType $= "Assault Tank") ? "an" : "a";
|
||||||
messageAll( 'msgVehicleTeamDestroy', '\c0%1 TEAMKILLED %3 %2!', %destroyerName, %vehicleType, %pref);
|
messageAll( 'msgVehicleTeamDestroy', '\c0%1 TEAMKILLED %3 %2!', %destroyerName, %vehicleType, %pref);
|
||||||
}
|
}
|
||||||
|
|
||||||
else // legit kill
|
else // legit kill
|
||||||
{
|
{
|
||||||
//messageTeamExcept(%destroyer, 'msgVehicleDestroy', '\c0%1 destroyed an enemy %2.', %destroyerName, %vehicleType); // z0dd - ZOD, 8/20/02. not needed with new messenger on line below
|
//messageTeamExcept(%destroyer, 'msgVehicleDestroy', '\c0%1 destroyed an enemy %2.', %destroyerName, %vehicleType); // z0dd - ZOD, 8/20/02. not needed with new messenger on line below
|
||||||
teamDestroyMessage(%destroyer, 'msgVehDestroyed', '\c5%1 destroyed an enemy %2!', %destroyerName, %vehicleType); // z0dd - ZOD, 8/20/02. Send teammates a destroy message
|
teamDestroyMessage(%destroyer, 'msgVehDestroyed', '\c5%1 destroyed an enemy %2!', %destroyerName, %vehicleType); // z0dd - ZOD, 8/20/02. Send teammates a destroy message
|
||||||
messageTeam(%enemyTeam, 'msgVehicleDestroy', '\c0%1 destroyed your team\'s %2.', %destroyerName, %vehicleType);
|
messageTeam(%enemyTeam, 'msgVehicleDestroy', '\c0%1 destroyed your team\'s %2.', %destroyerName, %vehicleType);
|
||||||
//messageClient(%destroyer, 'msgVehicleDestroy', '\c0You destroyed an enemy %1.', %vehicleType);
|
//messageClient(%destroyer, 'msgVehicleDestroy', '\c0You destroyed an enemy %1.', %vehicleType);
|
||||||
|
|
||||||
if(%scorer)
|
if(%scorer)
|
||||||
{
|
{
|
||||||
%value = %game.awardScoreVehicleDestroyed(%scorer, %vehicleType, %multiplier, %passengers);
|
%value = %game.awardScoreVehicleDestroyed(%scorer, %vehicleType, %multiplier, %passengers);
|
||||||
|
|
@ -1942,7 +1934,7 @@ function CTFGame::vehicleDestroyed(%game, %vehicle, %destroyer)
|
||||||
function CTFGame::awardScoreVehicleDestroyed(%game, %client, %vehicleType, %mult, %passengers)
|
function CTFGame::awardScoreVehicleDestroyed(%game, %client, %vehicleType, %mult, %passengers)
|
||||||
{
|
{
|
||||||
// z0dd - ZOD, 9/29/02. Removed T2 demo code from here
|
// z0dd - ZOD, 9/29/02. Removed T2 demo code from here
|
||||||
|
|
||||||
if(%vehicleType $= "Grav Cycle")
|
if(%vehicleType $= "Grav Cycle")
|
||||||
%base = %game.SCORE_PER_DESTROY_WILDCAT;
|
%base = %game.SCORE_PER_DESTROY_WILDCAT;
|
||||||
else if(%vehicleType $= "Assault Tank")
|
else if(%vehicleType $= "Assault Tank")
|
||||||
|
|
@ -1955,11 +1947,11 @@ function CTFGame::awardScoreVehicleDestroyed(%game, %client, %vehicleType, %mult
|
||||||
%base = %game.SCORE_PER_DESTROY_BOMBER;
|
%base = %game.SCORE_PER_DESTROY_BOMBER;
|
||||||
else if(%vehicleType $= "Heavy Transport")
|
else if(%vehicleType $= "Heavy Transport")
|
||||||
%base = %game.SCORE_PER_DESTROY_TRANSPORT;
|
%base = %game.SCORE_PER_DESTROY_TRANSPORT;
|
||||||
|
|
||||||
%total = ( %base * %mult ) + ( %passengers * %game.SCORE_PER_PASSENGER );
|
%total = ( %base * %mult ) + ( %passengers * %game.SCORE_PER_PASSENGER );
|
||||||
|
|
||||||
%client.vehicleScore += %total;
|
%client.vehicleScore += %total;
|
||||||
|
|
||||||
messageClient(%client, 'msgVehicleScore', '\c0You received a %1 point bonus for destroying an enemy %2.', %total, %vehicleType);
|
messageClient(%client, 'msgVehicleScore', '\c0You received a %1 point bonus for destroying an enemy %2.', %total, %vehicleType);
|
||||||
%game.recalcScore(%client);
|
%game.recalcScore(%client);
|
||||||
return %total;
|
return %total;
|
||||||
|
|
@ -1967,9 +1959,9 @@ function CTFGame::awardScoreVehicleDestroyed(%game, %client, %vehicleType, %mult
|
||||||
|
|
||||||
function CTFGame::shareScore(%game, %client, %amount)
|
function CTFGame::shareScore(%game, %client, %amount)
|
||||||
{
|
{
|
||||||
// z0dd - ZOD, 9/29/02. Removed T2 demo code from here
|
// z0dd - ZOD, 9/29/02. Removed T2 demo code from here
|
||||||
|
|
||||||
//error("share score of"SPC %amount SPC "from client:" SPC %client);
|
//error("share score of"SPC %amount SPC "from client:" SPC %client);
|
||||||
// all of the player in the bomber and tank share the points
|
// all of the player in the bomber and tank share the points
|
||||||
// gained from any of the others
|
// gained from any of the others
|
||||||
%vehicle = %client.vehicleMounted;
|
%vehicle = %client.vehicleMounted;
|
||||||
|
|
@ -1991,9 +1983,9 @@ function CTFGame::shareScore(%game, %client, %amount)
|
||||||
%occCl.vehicleBonus += %amount;
|
%occCl.vehicleBonus += %amount;
|
||||||
%game.recalcScore(%occCl);
|
%game.recalcScore(%occCl);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -2003,7 +1995,7 @@ function CTFGame::awardScoreTurretKill(%game, %victimID, %implement)
|
||||||
{
|
{
|
||||||
if (%killer == %victimID)
|
if (%killer == %victimID)
|
||||||
%game.awardScoreSuicide(%victimID);
|
%game.awardScoreSuicide(%victimID);
|
||||||
else if (%killer.team == %victimID.team) //player controlling a turret killed a teammate
|
else if (%killer.team == %victimID.team) //player controlling a turret killed a teammate
|
||||||
{
|
{
|
||||||
%killer.teamKills++;
|
%killer.teamKills++;
|
||||||
%game.awardScoreTurretTeamKill(%victimID, %killer);
|
%game.awardScoreTurretTeamKill(%victimID, %killer);
|
||||||
|
|
@ -2014,22 +2006,22 @@ function CTFGame::awardScoreTurretKill(%game, %victimID, %implement)
|
||||||
%killer.mannedturretKills++;
|
%killer.mannedturretKills++;
|
||||||
%game.recalcScore(%killer);
|
%game.recalcScore(%killer);
|
||||||
%game.awardScoreDeath(%victimID);
|
%game.awardScoreDeath(%victimID);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if ((%killer = %implement.owner) != 0) //if it isn't controlled, award score to whoever deployed it
|
else if ((%killer = %implement.owner) != 0) //if it isn't controlled, award score to whoever deployed it
|
||||||
{
|
{
|
||||||
if (%killer.team == %victimID.team)
|
if (%killer.team == %victimID.team)
|
||||||
{
|
{
|
||||||
%game.awardScoreDeath(%victimID);
|
%game.awardScoreDeath(%victimID);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
%killer.turretKills++;
|
%killer.turretKills++;
|
||||||
%game.recalcScore(%killer);
|
%game.recalcScore(%killer);
|
||||||
%game.awardScoreDeath(%victimID);
|
%game.awardScoreDeath(%victimID);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//default is, no one was controlling it, no one owned it. No score given.
|
//default is, no one was controlling it, no one owned it. No score given.
|
||||||
}
|
}
|
||||||
|
|
||||||
function CTFGame::testKill(%game, %victimID, %killerID)
|
function CTFGame::testKill(%game, %victimID, %killerID)
|
||||||
|
|
@ -2039,8 +2031,8 @@ function CTFGame::testKill(%game, %victimID, %killerID)
|
||||||
|
|
||||||
function CTFGame::awardScoreKill(%game, %killerID)
|
function CTFGame::awardScoreKill(%game, %killerID)
|
||||||
{
|
{
|
||||||
%killerID.kills++;
|
%killerID.kills++;
|
||||||
%game.recalcScore(%killerID);
|
%game.recalcScore(%killerID);
|
||||||
return %game.SCORE_PER_KILL;
|
return %game.SCORE_PER_KILL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -2050,7 +2042,7 @@ function checkVehicleCamping( %team )
|
||||||
%position = $flagPos[%team];
|
%position = $flagPos[%team];
|
||||||
%radius = 15;
|
%radius = 15;
|
||||||
InitContainerRadiusSearch(%position, %radius, $TypeMasks::VehicleObjectType );
|
InitContainerRadiusSearch(%position, %radius, $TypeMasks::VehicleObjectType );
|
||||||
|
|
||||||
while ((%vehicle = containerSearchNext()) != 0)
|
while ((%vehicle = containerSearchNext()) != 0)
|
||||||
{
|
{
|
||||||
%dist = containerSearchCurrRadDamageDist();
|
%dist = containerSearchCurrRadDamageDist();
|
||||||
|
|
@ -2058,12 +2050,12 @@ function checkVehicleCamping( %team )
|
||||||
if (%dist > %radius)
|
if (%dist > %radius)
|
||||||
continue;
|
continue;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
//if( %vehicle.team == %team )
|
//if( %vehicle.team == %team )
|
||||||
applyVehicleCampDamage( %vehicle );
|
applyVehicleCampDamage( %vehicle );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if( %team == 1 )
|
if( %team == 1 )
|
||||||
Game.campThread_1 = schedule( 1000, 0, "checkVehicleCamping", 1 );
|
Game.campThread_1 = schedule( 1000, 0, "checkVehicleCamping", 1 );
|
||||||
else
|
else
|
||||||
|
|
@ -2079,9 +2071,9 @@ function applyVehicleCampDamage( %vehicle )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
%client = %vehicle.getMountNodeObject(0).client; // grab the pilot
|
%client = %vehicle.getMountNodeObject(0).client; // grab the pilot
|
||||||
|
|
||||||
messageClient( %client, 'serverMessage', "Can't park vehicles in flag zones!" );
|
messageClient( %client, 'serverMessage', "Can't park vehicles in flag zones!" );
|
||||||
%vehicle.getDataBlock().damageObject( %vehicle, 0, "0 0 0", 0.5, 0);
|
%vehicle.getDataBlock().damageObject( %vehicle, 0, "0 0 0", 0.5, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
// z0dd - ZOD, 10/02/02. Hack for flag collision bug.
|
// z0dd - ZOD, 10/02/02. Hack for flag collision bug.
|
||||||
|
|
@ -2152,14 +2144,14 @@ function CTFGame::voteAntiTurtleTime(%game, %admin, %newLimit)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
%totalVotes = %game.totalVotesFor + %game.totalVotesAgainst;
|
%totalVotes = %game.totalVotesFor + %game.totalVotesAgainst;
|
||||||
if(%totalVotes > 0 && (%game.totalVotesFor / (ClientGroup.getCount() - $HostGameBotCount)) > ($Host::VotePasspercent / 100))
|
if(%totalVotes > 0 && (%game.totalVotesFor / (ClientGroup.getCount() - $HostGameBotCount)) > ($Host::VotePasspercent / 100))
|
||||||
{
|
{
|
||||||
messageAll('MsgVotePassed', '\c2The anti-turtle time is set to %1.', %display);
|
messageAll('MsgVotePassed', '\c2The anti-turtle time is set to %1.', %display);
|
||||||
$Host::ClassicAntiTurtleTime = %newLimit;
|
$Host::ClassicAntiTurtleTime = %newLimit;
|
||||||
%cause = "(vote)";
|
%cause = "(vote)";
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
messageAll('MsgVoteFailed', '\c2The vote to change the anti-turtle time did not pass: %1 percent.', mFloor(%game.totalVotesFor/(ClientGroup.getCount() - $HostGameBotCount) * 100));
|
messageAll('MsgVoteFailed', '\c2The vote to change the anti-turtle time did not pass: %1 percent.', mFloor(%game.totalVotesFor/(ClientGroup.getCount() - $HostGameBotCount) * 100));
|
||||||
}
|
}
|
||||||
if(%cause !$= "")
|
if(%cause !$= "")
|
||||||
logEcho($AdminCl.name @ ": anti-turtle time set to "@%display SPC %cause, 1);
|
logEcho($AdminCl.name @ ": anti-turtle time set to "@%display SPC %cause, 1);
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load diff
|
|
@ -11,6 +11,10 @@
|
||||||
// $Host::PUGPassword = "pickup";
|
// $Host::PUGPassword = "pickup";
|
||||||
// PUG Password is always on no matter what
|
// PUG Password is always on no matter what
|
||||||
// $Host::$PUGpasswordAlwaysOn = 1;
|
// $Host::$PUGpasswordAlwaysOn = 1;
|
||||||
|
// Enable a center print between map changes
|
||||||
|
// $Host::MapChangeMSG = 0;
|
||||||
|
// Message Content
|
||||||
|
// $Host::MapChangeMSGContent = "<color:3cb4b4><font:Sui Generis:22>Pickup Night\n<color:3cb4b4><font:Univers:18>Saturday, March 5th\n<color:3cb4b4><font:Univers:16>Join discord for details";
|
||||||
|
|
||||||
package MissionTypeOptions
|
package MissionTypeOptions
|
||||||
{
|
{
|
||||||
|
|
@ -62,6 +66,9 @@ function loadMissionStage2()
|
||||||
deactivatePackage(LockedTeams);
|
deactivatePackage(LockedTeams);
|
||||||
|
|
||||||
parent::loadMissionStage2();
|
parent::loadMissionStage2();
|
||||||
|
|
||||||
|
if($Host::MapChangeMSG)
|
||||||
|
centerPrintAll($Host::MapChangeMSGContent, 12, 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -4,12 +4,12 @@
|
||||||
//$Host::AllowAdminVotes = 1;
|
//$Host::AllowAdminVotes = 1;
|
||||||
//$Host::AllowAdminStopVote = 1;
|
//$Host::AllowAdminStopVote = 1;
|
||||||
//$Host::AllowAdminPassVote = 1;
|
//$Host::AllowAdminPassVote = 1;
|
||||||
//$Host::AllowMapScript = "True";
|
|
||||||
//$Host::AllowPlayerVoteChangeMission = 1;
|
//$Host::AllowPlayerVoteChangeMission = 1;
|
||||||
//$Host::AllowPlayerVoteSkipMission = 1;
|
//$Host::AllowPlayerVoteSkipMission = 1;
|
||||||
//$Host::AllowPlayerVoteTimeLimit = 1;
|
//$Host::AllowPlayerVoteTimeLimit = 1;
|
||||||
//$Host::AllowPlayerVoteTournamentMode = 1;
|
//$Host::AllowPlayerVoteTournamentMode = 1;
|
||||||
//$Host::AllowPlayerVoteTeamDamage = 0;
|
//$Host::AllowPlayerVoteTeamDamage = 0;
|
||||||
|
//$Host::AllowPlayerTournamentModeVotekick = 0;
|
||||||
|
|
||||||
//Vote Delay
|
//Vote Delay
|
||||||
//Delay the ability to vote (For everyone) at the beginning of the match
|
//Delay the ability to vote (For everyone) at the beginning of the match
|
||||||
|
|
@ -157,7 +157,7 @@ function DefaultGame::sendGameVoteMenu(%game, %client, %key)
|
||||||
messageClient(%client, 'MsgVoteItem', "", %key, 'VoteFFAMode', 'Change server to Free For All.', 'Vote Free For All Mode');
|
messageClient(%client, 'MsgVoteItem', "", %key, 'VoteFFAMode', 'Change server to Free For All.', 'Vote Free For All Mode');
|
||||||
messageClient(%client, 'MsgVoteItem', "", %key, 'VoteChangeTimeLimit', 'change the time limit', 'Vote to Change the Time Limit');
|
messageClient(%client, 'MsgVoteItem', "", %key, 'VoteChangeTimeLimit', 'change the time limit', 'Vote to Change the Time Limit');
|
||||||
|
|
||||||
if(%multipleTeams)
|
if(%multipleTeams && $Host::AllowPlayerVoteTeamDamage)
|
||||||
{
|
{
|
||||||
if($teamDamage)
|
if($teamDamage)
|
||||||
messageClient(%client, 'MsgVoteItem', "", %key, 'VoteTeamDamage', 'disable team damage', 'Vote to Disable Team Damage');
|
messageClient(%client, 'MsgVoteItem', "", %key, 'VoteTeamDamage', 'disable team damage', 'Vote to Disable Team Damage');
|
||||||
|
|
@ -258,6 +258,12 @@ function serverCmdStartNewVote(%client, %typeName, %arg1, %arg2, %arg3, %arg4, %
|
||||||
switch$(%typeName)
|
switch$(%typeName)
|
||||||
{
|
{
|
||||||
case "VoteKickPlayer":
|
case "VoteKickPlayer":
|
||||||
|
if($Host::TournamentMode && !$Host::AllowPlayerTournamentModeVotekick) // Dont allow Votekicks in Tournament Mode
|
||||||
|
{
|
||||||
|
messageClient(%client, "", "\c2No votekicks in Tournament Mode.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if(%client == %arg1) // client is trying to votekick himself
|
if(%client == %arg1) // client is trying to votekick himself
|
||||||
return; // Use the leave button instead, pal.
|
return; // Use the leave button instead, pal.
|
||||||
|
|
||||||
|
|
@ -292,7 +298,7 @@ function serverCmdStartNewVote(%client, %typeName, %arg1, %arg2, %arg3, %arg4, %
|
||||||
%msg = %client.nameBase @ " initiated a vote to kick player " @ %arg1.nameBase @ ".";
|
%msg = %client.nameBase @ " initiated a vote to kick player " @ %arg1.nameBase @ ".";
|
||||||
|
|
||||||
//Notify any admins on the other team
|
//Notify any admins on the other team
|
||||||
for(%i = 0; %i < ClientGroup.getCount(); %i++)
|
for(%i = 0; %i < ClientGroup.getCount(); %i++)
|
||||||
{
|
{
|
||||||
%cl = ClientGroup.getObject(%i);
|
%cl = ClientGroup.getObject(%i);
|
||||||
if(%cl.isAdmin == true && %cl.team !$= %arg1.team) //Not on admins team
|
if(%cl.isAdmin == true && %cl.team !$= %arg1.team) //Not on admins team
|
||||||
|
|
@ -428,6 +434,7 @@ function serverCmdStartNewVote(%client, %typeName, %arg1, %arg2, %arg3, %arg4, %
|
||||||
%msg = %client.nameBase @ " initiated a vote to change the time limit to " @ %time SPC "minutes.";
|
%msg = %client.nameBase @ " initiated a vote to change the time limit to " @ %time SPC "minutes.";
|
||||||
// VoteOvertime
|
// VoteOvertime
|
||||||
StartVOTimeVote(%game);
|
StartVOTimeVote(%game);
|
||||||
|
|
||||||
$CMHasVoted[%client.guid]++;
|
$CMHasVoted[%client.guid]++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -494,7 +501,7 @@ function serverCmdStartNewVote(%client, %typeName, %arg1, %arg2, %arg3, %arg4, %
|
||||||
}
|
}
|
||||||
|
|
||||||
case "stopRunningVote":
|
case "stopRunningVote":
|
||||||
if($VOStatus !$="InProgress") //Dont allow a stop vote after time has expired, then no new time is set - VoteOverTime
|
if($VOStatus !$="InProgress" || $Host::TournamentMode) //Dont allow a stop vote after time has expired, then no new time is set - VoteOverTime
|
||||||
{
|
{
|
||||||
if(%client.isSuperAdmin || (%client.isAdmin && $Host::AllowAdminStopVote))
|
if(%client.isSuperAdmin || (%client.isAdmin && $Host::AllowAdminStopVote))
|
||||||
{
|
{
|
||||||
|
|
@ -802,7 +809,7 @@ function DefaultGame::voteKickPlayer(%game, %admin, %client)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
||||||
for ( %idx = 0; %idx < ClientGroup.getCount(); %idx++ )
|
for ( %idx = 0; %idx < ClientGroup.getCount(); %idx++ )
|
||||||
{
|
{
|
||||||
%cl = ClientGroup.getObject( %idx );
|
%cl = ClientGroup.getObject( %idx );
|
||||||
|
|
@ -1538,6 +1545,7 @@ function serverCmdClientPickedTeam(%client, %option)
|
||||||
if($Host::TournamentMode && %client.team !$= 0) //Added
|
if($Host::TournamentMode && %client.team !$= 0) //Added
|
||||||
{
|
{
|
||||||
messageClient( %client, '', "Teams are locked. Ask an admin to set your team." );
|
messageClient( %client, '', "Teams are locked. Ask an admin to set your team." );
|
||||||
|
schedule(1000, 0, "ClearCenterPrint", %client); //So Press FIRE when ready is cleared, later down the pipe
|
||||||
serverCmdClientMakeObserver( %client );
|
serverCmdClientMakeObserver( %client );
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
|
|
@ -1565,22 +1573,22 @@ function serverCmdClientTeamChange(%client, %option)
|
||||||
// 3 for three reminder notifications
|
// 3 for three reminder notifications
|
||||||
|
|
||||||
function VoteSound(%teamSpecific, %typename, %arg1, %arg2, %msg)
|
function VoteSound(%teamSpecific, %typename, %arg1, %arg2, %msg)
|
||||||
{
|
{
|
||||||
if(Game.scheduleVote !$= "" && $Host::EnableVoteSoundReminders > 0) //Game.scheduleVote !$= "" is if vote is active
|
if(Game.scheduleVote !$= "" && $Host::EnableVoteSoundReminders > 0) //Game.scheduleVote !$= "" is if vote is active
|
||||||
{
|
{
|
||||||
%vip = "Vote in Progress:";
|
%vip = "Vote in Progress:";
|
||||||
//%yn = "Press Insert for Yes or Delete for No.";
|
//%yn = "Press Insert for Yes or Delete for No.";
|
||||||
|
|
||||||
switch$(%typeName)
|
switch$(%typeName)
|
||||||
{
|
{
|
||||||
case "VoteKickPlayer":
|
case "VoteKickPlayer":
|
||||||
if(%arg1.team != 0 && Game.numTeams > 1) //Not observer
|
if(%arg1.team != 0 && Game.numTeams > 1) //Not observer
|
||||||
{
|
{
|
||||||
for(%i = 0; %i < ClientGroup.getCount(); %i++)
|
for(%i = 0; %i < ClientGroup.getCount(); %i++)
|
||||||
{
|
{
|
||||||
%cl = ClientGroup.getObject(%i);
|
%cl = ClientGroup.getObject(%i);
|
||||||
if (%cl.isAdmin == true)
|
if (%cl.isAdmin == true)
|
||||||
{
|
{
|
||||||
if(%cl.team !$= %arg1.team) //Not on admins team
|
if(%cl.team !$= %arg1.team) //Not on admins team
|
||||||
messageClient(%cl, '', '\c5[A]\c1%1 \c0To kick %2 on the other team.~wgui/objective_notification.wav', %vip, %arg1.name);
|
messageClient(%cl, '', '\c5[A]\c1%1 \c0To kick %2 on the other team.~wgui/objective_notification.wav', %vip, %arg1.name);
|
||||||
else //Is on admins team
|
else //Is on admins team
|
||||||
|
|
|
||||||
|
|
@ -76,7 +76,8 @@ function DefaultGame::gameOver(%game)
|
||||||
// Starting a TimeVote - Sets flags so the game wont end during this vote
|
// Starting a TimeVote - Sets flags so the game wont end during this vote
|
||||||
function StartVOTimeVote(%game)
|
function StartVOTimeVote(%game)
|
||||||
{
|
{
|
||||||
$VOStatus = "Starting";
|
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.
|
// Tribes wont change the time after its reached zero and you cant change it again afterwards until a gameover/map change.
|
||||||
|
|
|
||||||
|
|
@ -12,9 +12,10 @@ $discordBot::autoStart = 0;
|
||||||
//used on the bot to help split thigns up
|
//used on the bot to help split thigns up
|
||||||
$discordBot::cmdSplit = "%c%";
|
$discordBot::cmdSplit = "%c%";
|
||||||
$discordBot::cmdSubSplit = "%t%";
|
$discordBot::cmdSubSplit = "%t%";
|
||||||
//These are set via the bot
|
//These are set via the bot
|
||||||
$discordBot::monitorChannel = 0;
|
$discordBot::monitorChannel = 0;
|
||||||
$discordBot::serverFeed = 1;
|
$discordBot::serverFeed = 1;
|
||||||
|
|
||||||
package discordPackage
|
package discordPackage
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
@ -202,6 +203,7 @@ function discordBotProcess(%type, %var1, %var2, %var3, %var4, %var5, %var6)
|
||||||
sendToDiscordEmote(%msg, $discordBot::serverFeed);
|
sendToDiscordEmote(%msg, $discordBot::serverFeed);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function sendToDiscord(%msg,%channel)
|
function sendToDiscord(%msg,%channel)
|
||||||
{
|
{
|
||||||
if(isObject(discord) && %msg !$= "")
|
if(isObject(discord) && %msg !$= "")
|
||||||
|
|
@ -223,14 +225,16 @@ function sendToDiscordEmote(%msg,%channel)//emote filter will be applyed used in
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
function discordCon(){
|
function discordCon(){
|
||||||
if(discord.lastState !$= "Connected"){
|
if(discord.lastState !$= "Connected" && discord.lastState !$= "Connecting"){
|
||||||
if(isEventPending($discordBot::reconnectEvent))
|
if(isEventPending($discordBot::reconnectEvent))
|
||||||
cancel($discordBot::reconnectEvent);
|
cancel($discordBot::reconnectEvent);
|
||||||
if(isObject(discord))
|
if(isObject(discord))
|
||||||
discord.delete();
|
discord.delete();
|
||||||
new TCPObject(discord);
|
new TCPObject(discord);
|
||||||
discord.lastState = "Connecting";
|
discord.lastState = "Connecting";
|
||||||
discord.connect($discordBot::IP);
|
//discord.connect($discordBot::IP);
|
||||||
|
discord.schedule(1000, "connect", $discordBot::IP);
|
||||||
|
//discord.schedule(5000, "send", "AUTH" @ $discordBot::cmdSplit @ $discordBot::cmdSplit @ $Host::GameName @ "\r\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
function discordKill(){
|
function discordKill(){
|
||||||
|
|
@ -241,36 +245,39 @@ function discordKill(){
|
||||||
|
|
||||||
function discord::onDNSFailed(%this){
|
function discord::onDNSFailed(%this){
|
||||||
%this.lastState = "DNSFailed";
|
%this.lastState = "DNSFailed";
|
||||||
error(%this.lastState);
|
error("Discord" SPC %this.lastState);
|
||||||
}
|
}
|
||||||
|
|
||||||
function discord::onConnectFailed(%this){
|
function discord::onConnectFailed(%this){
|
||||||
%this.lastState = "ConnectFailed";
|
|
||||||
error(%this.lastState);
|
|
||||||
discord.delete();
|
|
||||||
if(isEventPending($discordBot::reconnectEvent))
|
if(isEventPending($discordBot::reconnectEvent))
|
||||||
cancel($discordBot::reconnectEvent);
|
cancel($discordBot::reconnectEvent);
|
||||||
$discordBot::reconnectEvent = schedule($discordBot::reconnectTimeout,0,"discordCon");
|
$discordBot::reconnectEvent = schedule($discordBot::reconnectTimeout,0,"discordCon");
|
||||||
|
%this.lastState = "ConnectFailed";
|
||||||
|
error("Discord" SPC %this.lastState);
|
||||||
|
discord.delete();
|
||||||
}
|
}
|
||||||
|
|
||||||
function discord::onDNSResolved(%this){
|
function discord::onDNSResolved(%this){
|
||||||
%this.lastState = "DNSResolved";
|
%this.lastState = "DNSResolved";
|
||||||
error(%this.lastState);
|
error("Discord" SPC %this.lastState);
|
||||||
}
|
}
|
||||||
|
|
||||||
function discord::onConnected(%this){
|
function discord::onConnected(%this){
|
||||||
|
discord.schedule(1000, "send", "AUTH" @ $discordBot::cmdSplit @ $discordBot::cmdSplit @ $Host::GameName @ "\r\n");
|
||||||
%this.lastState = "Connected";
|
%this.lastState = "Connected";
|
||||||
error(%this.lastState);
|
error("Discord" SPC %this.lastState);
|
||||||
discord.send("AUTH" @ $discordBot::cmdSplit @ $discordBot::cmdSplit @ $Host::GameName @ "\r\n");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function discord::onDisconnect(%this){
|
function discord::onDisconnect(%this){
|
||||||
%this.lastState = "Disconnected";
|
if(%this.lastState $= "Connecting" && $discordBot::failCon++ < 20){
|
||||||
error(%this.lastState);
|
schedule(5000,0,"discordCon");
|
||||||
discord.delete();
|
}
|
||||||
if(isEventPending($discordBot::reconnectEvent))
|
if(isEventPending($discordBot::reconnectEvent))
|
||||||
cancel($discordBot::reconnectEvent);
|
cancel($discordBot::reconnectEvent);
|
||||||
$discordBot::reconnectEvent = schedule($discordBot::reconnectTimeout,0,"discordCon");
|
$discordBot::reconnectEvent = schedule($discordBot::reconnectTimeout,0,"discordCon");
|
||||||
|
%this.lastState = "Disconnected";
|
||||||
|
error("Discord" SPC %this.lastState);
|
||||||
|
discord.delete();
|
||||||
}
|
}
|
||||||
|
|
||||||
function discord::onLine(%this, %line){
|
function discord::onLine(%this, %line){
|
||||||
|
|
@ -279,6 +286,34 @@ function discord::onLine(%this, %line){
|
||||||
switch$(%cmd){
|
switch$(%cmd){
|
||||||
//case "Discord":
|
//case "Discord":
|
||||||
//messageAll( 'MsgDiscord', '\c3Discord: \c4%1 %2',getWord(%lineStrip,1),getWords(%lineStrip,2,getWordCount(%lineStrip) -1));
|
//messageAll( 'MsgDiscord', '\c3Discord: \c4%1 %2',getWord(%lineStrip,1),getWords(%lineStrip,2,getWordCount(%lineStrip) -1));
|
||||||
|
case "PLOTSTOP":
|
||||||
|
$pathMaps::running = 0;
|
||||||
|
case "PLOTPLAYER":
|
||||||
|
startPlayerPlot(getWord(%lineStrip,1));
|
||||||
|
case "GETSTAT":
|
||||||
|
%var = getWord(%lineStrip,1);
|
||||||
|
%mon = getWord(%lineStrip,2);
|
||||||
|
%year = getWord(%lineStrip,3);
|
||||||
|
%game = getWord(%lineStrip,4);
|
||||||
|
%returnIndex = getWord(%lineStrip,5);
|
||||||
|
%nameList = $lData::name[%var,%game,"month",%mon,%year];
|
||||||
|
%dataList = $lData::data[%var,%game,"month",%mon,%year];
|
||||||
|
%nameList = strreplace(%nameList,"\t","%t");
|
||||||
|
%dataList = strreplace(%dataList,"\t","%t");
|
||||||
|
error("Discord" SPC "GETSTAT" SPC %var SPC %mon SPC %year SPC %game SPC %returnIndex);
|
||||||
|
discord.schedule(32,"send","SINSTAT" @ "%c%" @ %nameList @ "%c%" @ %dataList @ "%c%" @ %returnIndex @ "%c%" @ %var @ "\r\n");
|
||||||
|
case "GENSTATS":
|
||||||
|
if(!$genStatsLockout){
|
||||||
|
$genStatsLockout = 1;
|
||||||
|
%month = getWord(%lineStrip,1);
|
||||||
|
%year = getWord(%lineStrip,2);
|
||||||
|
if(%month > 0 && %year > 0){
|
||||||
|
schedule(1000, 0, "sendLDATA", %month, %year, "CTFGame");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
sendToDiscord("Already Building Please Wait", $discordBot::monitorChannel);
|
||||||
|
}
|
||||||
case "PING":
|
case "PING":
|
||||||
discord.send("PONG" @ $discordBot::cmdSplit @ "\r\n");
|
discord.send("PONG" @ $discordBot::cmdSplit @ "\r\n");
|
||||||
case "PINGAVG":
|
case "PINGAVG":
|
||||||
|
|
@ -308,20 +343,143 @@ function discord::onLine(%this, %line){
|
||||||
}
|
}
|
||||||
case "PINGLIST":
|
case "PINGLIST":
|
||||||
if(isObject(discord) && discord.lastState $= "Connected"){
|
if(isObject(discord) && discord.lastState $= "Connected"){
|
||||||
%channel = 1;
|
|
||||||
if(ClientGroup.getCount() > 0){
|
if(ClientGroup.getCount() > 0){
|
||||||
for(%i = 0; %i < ClientGroup.getCount(); %i++){
|
for(%i = 0; %i < ClientGroup.getCount(); %i++){
|
||||||
%cl = ClientGroup.getObject(%i);
|
%cl = ClientGroup.getObject(%i);
|
||||||
%ping = %cl.isAIControlled() ? 0 : %cl.getPing();
|
%ping = %cl.isAIControlled() ? 0 : %cl.getPing();
|
||||||
%msg = %cl.namebase @ $discordBot::cmdSubSplit @ %ping @ $discordBot::cmdSubSplit @ %i;
|
%msg = %cl.namebase @ $discordBot::cmdSubSplit @ %ping @ $discordBot::cmdSubSplit @ %i;
|
||||||
discord.schedule(%i*32,"send","MSGSTACK" @ $discordBot::cmdSplit @ (%channel-1) @ $discordBot::cmdSplit @ %msg @ "\r\n");
|
discord.schedule(%i*32,"send","MSGSTACK" @ $discordBot::cmdSplit @ ($discordBot::monitorChannel) @ $discordBot::cmdSplit @ %msg @ "\r\n");
|
||||||
}
|
}
|
||||||
discord.schedule((%i+1)*32,"send","PROCSTACK" @ $discordBot::cmdSplit @ (%channel-1) @ $discordBot::cmdSplit @ "msgList" @ "\r\n");
|
discord.schedule((%i+1)*32,"send","PROCSTACK" @ $discordBot::cmdSplit @ ($discordBot::monitorChannel) @ $discordBot::cmdSplit @ "msgList" @ "\r\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
error("Bad Command" SPC %line);
|
error("Discord Bad Command" SPC %line);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(!isObject(discord) && $discordBot::autoStart)
|
if(!isObject(discord) && $discordBot::autoStart){
|
||||||
discordCon();
|
discordCon();
|
||||||
|
}
|
||||||
|
|
||||||
|
function sendLDATA(%month, %year, %type){
|
||||||
|
%file = new FileObject();
|
||||||
|
RootGroup.add(%file);
|
||||||
|
%folderPath = "serverStats/LData/*.cs";
|
||||||
|
%count = getFileCount(%folderPath);
|
||||||
|
%found = 0;
|
||||||
|
for (%i = 0; %i < %count; %i++){
|
||||||
|
%filepath = findNextfile(%folderPath);
|
||||||
|
%fieldPath =strreplace(%filePath,"-","\t");
|
||||||
|
%game = getField(%fieldPath,1);
|
||||||
|
%m = getField(%fieldPath,2); // 0 path / 1 game / 2 mon / 3 year / 4 type / 5 .cs
|
||||||
|
%y = getField(%fieldPath,3);
|
||||||
|
//%lType = getField(%fieldPath,4);
|
||||||
|
if(%month $= %m && %y $= %year && %game $= %type){
|
||||||
|
%found = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$dtSendDataMon = %month;
|
||||||
|
$dtSendDataYear = %year;
|
||||||
|
$dtSendDataType = %type;
|
||||||
|
if(isFile(%filepath) && %found){
|
||||||
|
sendToDiscord("Building Big Stats", $discordBot::monitorChannel);
|
||||||
|
%file.OpenForRead(%filepath);
|
||||||
|
%i = 0;
|
||||||
|
while(!%file.isEOF()){
|
||||||
|
%line = %file.readLine();
|
||||||
|
if(strPos(%line,"%tguid") == -1){
|
||||||
|
discord.schedule((%i++)*32,"send","STATSDATA" @ "%c%" @ $dtSendDataMon @ "%c%" @ $dtSendDataType @ "%c%" @ %line @ "\r\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
error("Sent LData To Discord" SPC %month SPC %year SPC %type SPC %i);
|
||||||
|
discord.schedule((%i++*32)+1000,"send","PROCSTACK" @ $discordBot::cmdSplit @ ($discordBot::monitorChannel) @ $discordBot::cmdSplit @ "buildStats" @ $discordBot::cmdSplit @ %month @ $discordBot::cmdSplit @ %year @ $discordBot::cmdSplit @ %type @ $discordBot::cmdSplit @ "\r\n");
|
||||||
|
schedule((%i++*32)+1000, 0, "unlockStatGen");
|
||||||
|
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
sendToDiscord("Error no file found", $discordBot::monitorChannel);
|
||||||
|
$genStatsLockout = 0;
|
||||||
|
}
|
||||||
|
%file.close();
|
||||||
|
%file.delete();
|
||||||
|
}
|
||||||
|
function unlockStatGen(){
|
||||||
|
$genStatsLockout = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
//Player Path Maps
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
$pathMaps::maxCount = 32000;// default point count
|
||||||
|
$pathMaps::speed = 500;
|
||||||
|
function sendPrx(%x){
|
||||||
|
for(%i = %x; %i < $prx::count && (%i - %x) < 50; %i++){
|
||||||
|
%line = $prx::data[%i];
|
||||||
|
%msg = "CDATA" @ "%c%" @ %i @ "%c%" @ %line @ "\r\n";
|
||||||
|
if(isObject(discord))
|
||||||
|
discord.send(%msg);
|
||||||
|
//discord.schedule(%i,"send",%msg);
|
||||||
|
}
|
||||||
|
if(%i < $prx::count)
|
||||||
|
schedule(128, 0, "sendPrx", %i);
|
||||||
|
else
|
||||||
|
discord.schedule(5000,"send","PROCSTACK" @ $discordBot::cmdSplit @ ($discordBot::monitorChannel) @ $discordBot::cmdSplit @ "buildprx" @ $discordBot::cmdSplit @ $prx::terFile @ $discordBot::cmdSplit @ $prx::misFile @ "\r\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
function startPlayerPlot(%count){
|
||||||
|
if(!$pathMaps::running && (($MatchStarted + $missionRunning) == 2)){
|
||||||
|
if(%count > 1000){
|
||||||
|
$pathMaps::maxCount = %count;
|
||||||
|
}
|
||||||
|
$prx::terFile = Terrain.terrainFile;
|
||||||
|
$prx::misFile = $missionName;
|
||||||
|
$prx::count = 0;
|
||||||
|
$pathMaps::running = 1;
|
||||||
|
pathMapData();
|
||||||
|
sendToDiscord("Player Plot Started" SPC $pathMaps::maxCount, $discordBot::monitorChannel);
|
||||||
|
error("Player Plot Started");
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
sendToDiscord("Game Has Not Started Yet", $discordBot::monitorChannel);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function floorVector(%vec){
|
||||||
|
return mFloor(getWord(%vec,0)) SPC mFloor(getWord(%vec,1)) SPC mFloor(getWord(%vec,2));
|
||||||
|
}
|
||||||
|
function pathDataPoint(%client){
|
||||||
|
%player = %client.player;
|
||||||
|
if(isObject(%player)){
|
||||||
|
%veh = (isObject(%client.vehicleMounted)) ? %client.vehicleMounted.getDataBlock().getName() : 0;
|
||||||
|
$prx::data[$prx::Count] = %client.nameBase @ "%c" @ %pos @ "%c" @ %client.team @ "%c" @ isObject(%player.holdingFlag) @ "%c" @ %veh @ "%c" @ getSimTime();
|
||||||
|
$prx::count++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function pathMapData(){ //loop to collect player position data
|
||||||
|
for(%x = 0; %x < ClientGroup.getCount(); %x++){
|
||||||
|
%client = ClientGroup.getObject(%x);
|
||||||
|
%player = %client.player;
|
||||||
|
if(isObject(%player)){
|
||||||
|
%pos = %player.getPosition();
|
||||||
|
%fpos = floorVector(%pos);
|
||||||
|
if(%player.lpm !$= %fpos){
|
||||||
|
%veh = (isObject(%client.vehicleMounted)) ? %client.vehicleMounted.getDataBlock().getName() : 0;
|
||||||
|
$prx::data[$prx::Count] = %client.nameBase @ "%c" @ %pos @ "%c" @ %client.team @ "%c" @ isObject(%player.holdingFlag) @ "%c" @ %veh @ "%c" @ getSimTime();
|
||||||
|
$prx::count++;
|
||||||
|
}
|
||||||
|
%player.lpm = %fpos;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(!($prx::eCount++ % 10)){error("pathMapData" SPC $prx::Count);}
|
||||||
|
|
||||||
|
if($pathMaps::running && (($MatchStarted + $missionRunning) == 2) && $prx::Count < $pathMaps::maxCount){// note will stop at end of mission
|
||||||
|
schedule($pathMaps::speed, 0,"pathMapData");
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
$pathMaps::running = 0;
|
||||||
|
sendToDiscord("Player Plot Processing", $discordBot::monitorChannel);
|
||||||
|
error("Player Plot Tracking Has Ended");
|
||||||
|
sendPrx(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1782,7 +1782,7 @@ function DefaultGame::clientMissionDropReady(%game, %client)
|
||||||
%nickTeam2 = ($flagstats::heldTeam2 ? $flagstats::nickTeam2 : "N/A");
|
%nickTeam2 = ($flagstats::heldTeam2 ? $flagstats::nickTeam2 : "N/A");
|
||||||
%realTeam2 = ($flagstats::heldTeam2 ? $flagstats::realTeam2 : "N/A");
|
%realTeam2 = ($flagstats::heldTeam2 ? $flagstats::realTeam2 : "N/A");
|
||||||
|
|
||||||
BottomPrint(%client, "Best caps on " @ $CurrentMission @ ":\n" @ getTaggedString(%game.getTeamName(1)) @ ":" SPC %nickTeam1 @ " in " @ %realTeam1 @ " seconds\n" @ getTaggedString(%game.getTeamName(2)) @ ":" SPC %nickTeam2 @ " in " @ %realTeam2 @ " seconds", 10, 3);
|
BottomPrint(%client, "Best caps on " @ $CurrentMission @ ":\n" @ getTaggedString(%game.getTeamName(1)) @ ":" SPC %nickTeam1 @ " in " @ %realTeam1 @ " seconds\n" @ getTaggedString(%game.getTeamName(2)) @ ":" SPC %nickTeam2 @ " in " @ %realTeam2 @ " seconds", 20, 3);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
|
||||||
|
|
@ -186,8 +186,9 @@ $Host::AllowAdminVotes = 1;
|
||||||
$Host::AllowPlayerVoteChangeMission = 1;
|
$Host::AllowPlayerVoteChangeMission = 1;
|
||||||
$Host::AllowPlayerVoteSkipMission = 1;
|
$Host::AllowPlayerVoteSkipMission = 1;
|
||||||
$Host::AllowPlayerVoteTimeLimit = 1;
|
$Host::AllowPlayerVoteTimeLimit = 1;
|
||||||
$Host::AllowPlayerVoteTournamentMode = 0;
|
$Host::AllowPlayerVoteTournamentMode = 1;
|
||||||
$Host::AllowPlayerVoteTeamDamage = 0;
|
$Host::AllowPlayerVoteTeamDamage = 1;
|
||||||
|
$Host::AllowPlayerTournamentModeVotekick = 1;
|
||||||
$Host::NoBaseRapeEnabled = 1; //Enable or Disable No Base Rape
|
$Host::NoBaseRapeEnabled = 1; //Enable or Disable No Base Rape
|
||||||
$Host::NoBaseRapePlayerCount = 14; //Min number players the turn off No Base Rape
|
$Host::NoBaseRapePlayerCount = 14; //Min number players the turn off No Base Rape
|
||||||
$Host::AveragePings = 1; //Show Average ping in F2 menu
|
$Host::AveragePings = 1; //Show Average ping in F2 menu
|
||||||
|
|
@ -209,6 +210,8 @@ $Host::ClassicDailyHardRestart = 0;
|
||||||
$Host::ClassicDailyHardRestartTime = "10\t00\tam"; //Hard Restart Server Time Ex:10am
|
$Host::ClassicDailyHardRestartTime = "10\t00\tam"; //Hard Restart Server Time Ex:10am
|
||||||
$Host::LoadScreenShowLogo = 0; //Special Logo on LoadScreen
|
$Host::LoadScreenShowLogo = 0; //Special Logo on LoadScreen
|
||||||
$Host::LoadScreenShowLogoName = "dpub/DPUB_logo"; //Logo location Filename
|
$Host::LoadScreenShowLogoName = "dpub/DPUB_logo"; //Logo location Filename
|
||||||
|
$Host::MapChangeMSG = 0; //Center Print between mapchanges
|
||||||
|
$Host::MapChangeMSGContent = "<color:3cb4b4><font:Sui Generis:22>Pickup Night\n<color:3cb4b4><font:Univers:16>Saturday, March 5th\n<color:3cb4b4><font:Univers:16>Join discord for details";
|
||||||
|
|
||||||
//LakRabbit
|
//LakRabbit
|
||||||
$Host::LakRabbitUnlimitedDJ = 1; //Unlimited disc-jumps if enabled
|
$Host::LakRabbitUnlimitedDJ = 1; //Unlimited disc-jumps if enabled
|
||||||
|
|
|
||||||
991
Classic/scripts/weapTurretCode.cs
Normal file
991
Classic/scripts/weapTurretCode.cs
Normal file
|
|
@ -0,0 +1,991 @@
|
||||||
|
//-------------------------------------- Ammo functions
|
||||||
|
function Ammo::onCollision(%data, %obj, %col)
|
||||||
|
{
|
||||||
|
// %data = datablock of object; %obj = object number
|
||||||
|
// %col = thing that collided with object (hopefully a player)
|
||||||
|
|
||||||
|
if (%col.getDataBlock().className $= Armor)
|
||||||
|
{
|
||||||
|
%ammoName = %data.getName();
|
||||||
|
%ammoStore = %col.inv[%ammoName];
|
||||||
|
|
||||||
|
// if player has ammo pack, increase max amount of ammo
|
||||||
|
if(%col.getMountedImage($BackpackSlot) != 0)
|
||||||
|
{
|
||||||
|
if(%col.getMountedImage($BackpackSlot).getName() $= "AmmoPackImage")
|
||||||
|
%aMax = (%col.getDataBlock().max[%ammoName]) + AmmoPack.max[%ammoName];
|
||||||
|
else
|
||||||
|
%aMax = %col.getDataBlock().max[%ammoName];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
%aMax = %col.getDataBlock().max[%ammoName];
|
||||||
|
|
||||||
|
if(%col.inv[%ammoName] < %aMax)
|
||||||
|
{
|
||||||
|
if( %obj.ammoStore $= "" )
|
||||||
|
%obj.ammoStore = $AmmoIncrement[ %ammoName ];
|
||||||
|
|
||||||
|
%col.incInventory(%ammoName, %obj.ammoStore);
|
||||||
|
serverPlay3D(ItemPickupSound, %col.getTransform());
|
||||||
|
%obj.respawn();
|
||||||
|
if (%col.client > 0)
|
||||||
|
messageClient(%col.client, 'MsgItemPickup', '\c0You picked up %1.', %data.pickUpName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function GrenadeThrown::onCollision(%data, %obj, %col)
|
||||||
|
{
|
||||||
|
// nothing you can do now...
|
||||||
|
}
|
||||||
|
|
||||||
|
function HandInventory::onCollision(%data, %obj, %col)
|
||||||
|
{
|
||||||
|
// %data = datablock of object; %obj = object number
|
||||||
|
// %col = thing that collided with object (hopefully a player)
|
||||||
|
if (%col.getDataBlock().className $= Armor)
|
||||||
|
{
|
||||||
|
%ammoName = %data.getName();
|
||||||
|
%ammoStore = %col.inv[%ammoName];
|
||||||
|
|
||||||
|
// if player has ammo pack, increase max amount of ammo
|
||||||
|
if(%col.getMountedImage($BackpackSlot) != 0)
|
||||||
|
{
|
||||||
|
if(%col.getMountedImage($BackpackSlot).getName() $= "AmmoPackImage")
|
||||||
|
%aMax = (%col.getDataBlock().max[%ammoName]) + AmmoPack.max[%ammoName];
|
||||||
|
else
|
||||||
|
%aMax = %col.getDataBlock().max[%ammoName];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
%aMax = %col.getDataBlock().max[%ammoName];
|
||||||
|
|
||||||
|
if(%data.isGrenade)
|
||||||
|
{
|
||||||
|
// it's a grenade -- see if it matches the type the player is carrying
|
||||||
|
%pgType = "None";
|
||||||
|
for(%x = 0; $InvGrenade[%x] !$= ""; %x++)
|
||||||
|
{
|
||||||
|
%gren = $NameToInv[$InvGrenade[%x]];
|
||||||
|
if(%col.inv[%gren] > 0)
|
||||||
|
{
|
||||||
|
%pgType = %gren;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if((%pgType $= "None") || (%pgType $= %ammoName))
|
||||||
|
{
|
||||||
|
// player either has no grenades or this type of grenades -- OK to pick up more
|
||||||
|
%canPickup = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// player has a different kind of grenade -- don't pick this kind up
|
||||||
|
%canPickup = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(%data.isMine) // z0dd - ZOD, 5/19/03. Check mines too!
|
||||||
|
{
|
||||||
|
// it's a mine -- see if it matches the type the player is carrying
|
||||||
|
%pmType = "None";
|
||||||
|
for(%y = 0; $InvMine[%y] !$= ""; %y++)
|
||||||
|
{
|
||||||
|
%mine = $NameToInv[$InvMine[%y]];
|
||||||
|
if(%col.inv[%mine] > 0)
|
||||||
|
{
|
||||||
|
%pmType = %mine;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if((%pmType $= "None") || (%pmType $= %ammoName))
|
||||||
|
{
|
||||||
|
// player either has no mines or this type of mine -- OK to pick up more
|
||||||
|
%canPickup = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// player has a different kind of mine -- don't pick this kind up
|
||||||
|
%canPickup = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
%canPickup = true;
|
||||||
|
|
||||||
|
if(%canPickup)
|
||||||
|
{
|
||||||
|
if(%col.inv[%ammoName] < %aMax)
|
||||||
|
{
|
||||||
|
//-------------------------------------------------------------------------------------------
|
||||||
|
// z0dd - ZOD, 4/17/02. Don't allow player to pickup full ammo if they tossed less than full.
|
||||||
|
if( %obj.ammoStore $= "" )
|
||||||
|
%obj.ammoStore = $AmmoIncrement[ %ammoName ];
|
||||||
|
%col.incInventory(%ammoName, %obj.ammoStore);
|
||||||
|
//-------------------------------------------------------------------------------------------
|
||||||
|
serverPlay3D(ItemPickupSound, %col.getTransform());
|
||||||
|
|
||||||
|
//Item respawn fix
|
||||||
|
if (%obj.isStatic())
|
||||||
|
%obj.respawn();
|
||||||
|
else
|
||||||
|
%obj.delete();
|
||||||
|
|
||||||
|
if (%col.client > 0)
|
||||||
|
messageClient(%col.client, 'MsgItemPickup', '\c0You picked up %1.', %data.pickUpName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//-------------------------------------- Specific turret functions
|
||||||
|
|
||||||
|
function SentryTurret::onAdd(%data, %obj)
|
||||||
|
{
|
||||||
|
Parent::onAdd(%data, %obj);
|
||||||
|
|
||||||
|
//error("error");
|
||||||
|
%obj.mountImage(%data.barrel, 0, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
function TurretDeployedCamera::onAdd(%this, %obj)
|
||||||
|
{
|
||||||
|
Parent::onAdd(%this, %obj);
|
||||||
|
%obj.mountImage(DeployableCameraBarrel, 0, true);
|
||||||
|
%obj.setRechargeRate(%this.rechargeRate);
|
||||||
|
|
||||||
|
%obj.setAutoFire(false); // z0dd - ZOD, 4/17/02. Server crash fix related to controlable cameras
|
||||||
|
}
|
||||||
|
|
||||||
|
function TurretDeployedCamera::onDestroyed(%this, %obj, %prevState)
|
||||||
|
{
|
||||||
|
Parent::onDestroyed(%this, %obj, %prevState);
|
||||||
|
$TeamDeployedCount[%obj.team, DeployedCamera]--;
|
||||||
|
// doesn't seem to delete itself, so...
|
||||||
|
%obj.schedule(500, "delete");
|
||||||
|
}
|
||||||
|
|
||||||
|
function ScoutFlyer::onTrigger(%data, %obj, %trigger, %state)
|
||||||
|
{
|
||||||
|
// data = ScoutFlyer datablock
|
||||||
|
// obj = ScoutFlyer object number
|
||||||
|
// trigger = 0 for "fire", 1 for "jump", 3 for "thrust"
|
||||||
|
// state = 1 for firing, 0 for not firing
|
||||||
|
if(%trigger == 0)
|
||||||
|
{
|
||||||
|
switch (%state) {
|
||||||
|
case 0:
|
||||||
|
%obj.fireWeapon = false;
|
||||||
|
%obj.setImageTrigger(2, false);
|
||||||
|
%obj.setImageTrigger(3, false);
|
||||||
|
case 1:
|
||||||
|
%obj.fireWeapon = true;
|
||||||
|
if(%obj.nextWeaponFire == 2) {
|
||||||
|
%obj.setImageTrigger(2, true);
|
||||||
|
%obj.setImageTrigger(3, false);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
%obj.setImageTrigger(2, false);
|
||||||
|
%obj.setImageTrigger(3, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function ScoutFlyer::playerDismounted(%data, %obj, %player)
|
||||||
|
{
|
||||||
|
%obj.fireWeapon = false;
|
||||||
|
%obj.setImageTrigger(2, false);
|
||||||
|
%obj.setImageTrigger(3, false);
|
||||||
|
setTargetSensorGroup(%obj.getTarget(), %obj.team);
|
||||||
|
|
||||||
|
if( %player.client.observeCount > 0 )
|
||||||
|
resetObserveFollow( %player.client, true );
|
||||||
|
}
|
||||||
|
|
||||||
|
function ScoutChaingunImage::onFire(%data,%obj,%slot)
|
||||||
|
{
|
||||||
|
// obj = ScoutFlyer object number
|
||||||
|
// slot = 2
|
||||||
|
|
||||||
|
Parent::onFire(%data,%obj,%slot);
|
||||||
|
%obj.nextWeaponFire = 3;
|
||||||
|
schedule(%data.fireTimeout, 0, "fireNextGun", %obj);
|
||||||
|
}
|
||||||
|
|
||||||
|
function ScoutChaingunPairImage::onFire(%data,%obj,%slot)
|
||||||
|
{
|
||||||
|
// obj = ScoutFlyer object number
|
||||||
|
// slot = 3
|
||||||
|
|
||||||
|
Parent::onFire(%data,%obj,%slot);
|
||||||
|
%obj.nextWeaponFire = 2;
|
||||||
|
schedule(%data.fireTimeout, 0, "fireNextGun", %obj);
|
||||||
|
}
|
||||||
|
|
||||||
|
function fireNextGun(%obj)
|
||||||
|
{
|
||||||
|
if(%obj.fireWeapon)
|
||||||
|
{
|
||||||
|
if(%obj.nextWeaponFire == 2)
|
||||||
|
{
|
||||||
|
%obj.setImageTrigger(2, true);
|
||||||
|
%obj.setImageTrigger(3, false);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
%obj.setImageTrigger(2, false);
|
||||||
|
%obj.setImageTrigger(3, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
%obj.setImageTrigger(2, false);
|
||||||
|
%obj.setImageTrigger(3, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function ScoutChaingunImage::onTriggerDown(%this, %obj, %slot)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
function ScoutChaingunImage::onTriggerUp(%this, %obj, %slot)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
function ScoutChaingunImage::onMount(%this, %obj, %slot)
|
||||||
|
{
|
||||||
|
// %obj.setImageAmmo(%slot,true);
|
||||||
|
}
|
||||||
|
|
||||||
|
function ScoutChaingunPairImage::onMount(%this, %obj, %slot)
|
||||||
|
{
|
||||||
|
// %obj.setImageAmmo(%slot,true);
|
||||||
|
}
|
||||||
|
|
||||||
|
function ScoutChaingunImage::onUnmount(%this,%obj,%slot)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
function ScoutChaingunPairImage::onUnmount(%this,%obj,%slot)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function BomberTurret::onDamage(%data, %obj)
|
||||||
|
{
|
||||||
|
%newDamageVal = %obj.getDamageLevel();
|
||||||
|
if(%obj.lastDamageVal !$= "")
|
||||||
|
if(isObject(%obj.getObjectMount()) && %obj.lastDamageVal > %newDamageVal)
|
||||||
|
%obj.getObjectMount().setDamageLevel(%newDamageVal);
|
||||||
|
%obj.lastDamageVal = %newDamageVal;
|
||||||
|
}
|
||||||
|
|
||||||
|
function BomberTurret::damageObject(%this, %targetObject, %sourceObject, %position, %amount, %damageType ,%vec, %client, %projectile)
|
||||||
|
{
|
||||||
|
//If vehicle turret is hit then apply damage to the vehicle
|
||||||
|
%vehicle = %targetObject.getObjectMount();
|
||||||
|
if(%vehicle)
|
||||||
|
%vehicle.getDataBlock().damageObject(%vehicle, %sourceObject, %position, %amount, %damageType, %vec, %client, %projectile);
|
||||||
|
}
|
||||||
|
|
||||||
|
function VehicleTurret::onEndSequence(%data, %obj, %thread)
|
||||||
|
{
|
||||||
|
if($DeployThread == %thread)
|
||||||
|
%obj.stopThread($DeployThread);
|
||||||
|
}
|
||||||
|
|
||||||
|
function BomberTurret::onTrigger(%data, %obj, %trigger, %state)
|
||||||
|
{
|
||||||
|
//error("onTrigger: trigger = " @ %trigger @ ", state = " @ %state);
|
||||||
|
//error("obj = " @ %obj @ ", class " @ %obj.getClassName());
|
||||||
|
switch (%trigger)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
%obj.fireTrigger = %state;
|
||||||
|
if(%obj.selectedWeapon == 1)
|
||||||
|
{
|
||||||
|
%obj.setImageTrigger(4, false);
|
||||||
|
if(%obj.getImageTrigger(6))
|
||||||
|
{
|
||||||
|
%obj.setImageTrigger(6, false);
|
||||||
|
ShapeBaseImageData::deconstruct(%obj.getMountedImage(6), %obj);
|
||||||
|
}
|
||||||
|
if(%state)
|
||||||
|
%obj.setImageTrigger(2, true);
|
||||||
|
else
|
||||||
|
%obj.setImageTrigger(2, false);
|
||||||
|
}
|
||||||
|
else if(%obj.selectedWeapon == 2)
|
||||||
|
{
|
||||||
|
%obj.setImageTrigger(2, false);
|
||||||
|
if(%obj.getImageTrigger(6))
|
||||||
|
{
|
||||||
|
%obj.setImageTrigger(6, false);
|
||||||
|
ShapeBaseImageData::deconstruct(%obj.getMountedImage(6), %obj);
|
||||||
|
}
|
||||||
|
if(%state)
|
||||||
|
%obj.setImageTrigger(4, true);
|
||||||
|
else
|
||||||
|
%obj.setImageTrigger(4, false);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
%obj.setImageTrigger(2, false);
|
||||||
|
%obj.setImageTrigger(4, false);
|
||||||
|
if(%state)
|
||||||
|
%obj.setImageTrigger(6, true);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
%obj.setImageTrigger(6, false);
|
||||||
|
BomberTargetingImage::deconstruct(%obj.getMountedImage(6), %obj);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
case 2:
|
||||||
|
if(%state)
|
||||||
|
{
|
||||||
|
%obj.getDataBlock().playerDismount(%obj);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function BomberTurret::playerDismount(%data, %obj)
|
||||||
|
{
|
||||||
|
//Passenger Exiting
|
||||||
|
%obj.fireTrigger = 0;
|
||||||
|
%obj.setImageTrigger(2, false);
|
||||||
|
%obj.setImageTrigger(4, false);
|
||||||
|
if(%obj.getImageTrigger(6))
|
||||||
|
{
|
||||||
|
%obj.setImageTrigger(6, false);
|
||||||
|
ShapeBaseImageData::deconstruct(%obj.getMountedImage(6), %obj);
|
||||||
|
}
|
||||||
|
%client = %obj.getControllingClient();
|
||||||
|
%client.player.isBomber = false;
|
||||||
|
commandToClient(%client, 'endBomberSight');
|
||||||
|
// %client.player.setControlObject(%client.player);
|
||||||
|
%client.player.mountVehicle = false;
|
||||||
|
// %client.player.getDataBlock().doDismount(%client.player);
|
||||||
|
|
||||||
|
//turret auto fire if ai mounted, if ai, %client = -1 - Lagg...
|
||||||
|
if (%client > 0)
|
||||||
|
{
|
||||||
|
if(%client.player.getState() !$= "Dead")
|
||||||
|
%client.player.mountImage(%client.player.lastWeapon, $WeaponSlot);
|
||||||
|
}
|
||||||
|
setTargetSensorGroup(%obj.getTarget(), 0);
|
||||||
|
setTargetNeverVisMask(%obj.getTarget(), 0xffffffff);
|
||||||
|
}
|
||||||
|
|
||||||
|
//function BomberTurret::getHudNum(%data, %num)
|
||||||
|
//{
|
||||||
|
// if(%num == 1)
|
||||||
|
// return 0;
|
||||||
|
// else
|
||||||
|
// return 4;
|
||||||
|
//}
|
||||||
|
|
||||||
|
function AIAimingTurretBarrel::onFire(%this,%obj,%slot)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
function BomberBombImage::onUnmount(%this,%obj,%slot)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
function BomberBombPairImage::onUnmount(%this,%obj,%slot)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
function BomberTurretBarrel::firePair(%this, %obj, %slot)
|
||||||
|
{
|
||||||
|
%obj.setImageTrigger( 3, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
function BomberTurretBarrelPair::stopFire(%this, %obj, %slot)
|
||||||
|
{
|
||||||
|
%obj.setImageTrigger( 3, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
function BomberTurretBarrelPair::onMount(%this, %obj, %slot)
|
||||||
|
{
|
||||||
|
// %obj.setImageAmmo(%slot,true);
|
||||||
|
}
|
||||||
|
|
||||||
|
function BomberTurretBarrel::onMount(%this, %obj, %slot)
|
||||||
|
{
|
||||||
|
// %obj.setImageAmmo(%slot,true);
|
||||||
|
}
|
||||||
|
|
||||||
|
function BomberBombImage::firePair(%this, %obj, %slot)
|
||||||
|
{
|
||||||
|
%obj.setImageTrigger( 5, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
function BomberBombPairImage::stopFire(%this, %obj, %slot)
|
||||||
|
{
|
||||||
|
%obj.setImageTrigger( 5, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
function BomberBombPairImage::onMount(%this, %obj, %slot)
|
||||||
|
{
|
||||||
|
// %obj.setImageAmmo(%slot,true);
|
||||||
|
}
|
||||||
|
|
||||||
|
function BomberBombImage::onMount(%this, %obj, %slot)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
function BomberBombImage::onUnmount(%this,%obj,%slot)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
function BomberBombPairImage::onUnmount(%this,%obj,%slot)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
function MobileTurretBase::onAdd(%this, %obj)
|
||||||
|
{
|
||||||
|
Parent::onAdd(%this, %obj);
|
||||||
|
setTargetSensorGroup(%obj.target, %obj.team);
|
||||||
|
// setTargetNeverVisMask(%obj.target, 0xffffffff); // z0dd - ZOD, 4/17/02. Causes mpb sensor to be shown in middle of map on cmd screen instead of MPB as origin. no idea why
|
||||||
|
}
|
||||||
|
|
||||||
|
function MobileTurretBase::onDamage(%data, %obj)
|
||||||
|
{
|
||||||
|
%newDamageVal = %obj.getDamageLevel();
|
||||||
|
if(%obj.lastDamageVal !$= "")
|
||||||
|
if(isObject(%obj.getObjectMount()) && %obj.lastDamageVal > %newDamageVal)
|
||||||
|
%obj.getObjectMount().setDamageLevel(%newDamageVal);
|
||||||
|
%obj.lastDamageVal = %newDamageVal;
|
||||||
|
}
|
||||||
|
|
||||||
|
function MobileTurretBase::damageObject(%this, %targetObject, %sourceObject, %position, %amount, %damageType ,%vec, %client, %projectile)
|
||||||
|
{
|
||||||
|
//If vehicle turret is hit then apply damage to the vehicle
|
||||||
|
%vehicle = %targetObject.getObjectMount();
|
||||||
|
if(%vehicle)
|
||||||
|
%vehicle.getDataBlock().damageObject(%vehicle, %sourceObject, %position, %amount, %damageType, %vec, %client, %projectile);
|
||||||
|
}
|
||||||
|
|
||||||
|
function MobileTurretBase::onEndSequence(%data, %obj, %thread)
|
||||||
|
{
|
||||||
|
//Used so that the parent wont be called..
|
||||||
|
}
|
||||||
|
|
||||||
|
function AssaultPlasmaTurret::onDamage(%data, %obj)
|
||||||
|
{
|
||||||
|
%newDamageVal = %obj.getDamageLevel();
|
||||||
|
if(%obj.lastDamageVal !$= "")
|
||||||
|
if(isObject(%obj.getObjectMount()) && %obj.lastDamageVal > %newDamageVal)
|
||||||
|
%obj.getObjectMount().setDamageLevel(%newDamageVal);
|
||||||
|
%obj.lastDamageVal = %newDamageVal;
|
||||||
|
}
|
||||||
|
|
||||||
|
function AssaultPlasmaTurret::damageObject(%this, %targetObject, %sourceObject, %position, %amount, %damageType ,%vec, %client, %projectile)
|
||||||
|
{
|
||||||
|
//If vehicle turret is hit then apply damage to the vehicle
|
||||||
|
%vehicle = %targetObject.getObjectMount();
|
||||||
|
if(%vehicle)
|
||||||
|
%vehicle.getDataBlock().damageObject(%vehicle, %sourceObject, %position, %amount, %damageType, %vec, %client, %projectile);
|
||||||
|
}
|
||||||
|
|
||||||
|
function AssaultPlasmaTurret::onTrigger(%data, %obj, %trigger, %state)
|
||||||
|
{
|
||||||
|
switch (%trigger) {
|
||||||
|
case 0:
|
||||||
|
%obj.fireTrigger = %state;
|
||||||
|
if(%obj.selectedWeapon == 1)
|
||||||
|
{
|
||||||
|
%obj.setImageTrigger(4, false);
|
||||||
|
if(%state)
|
||||||
|
%obj.setImageTrigger(2, true);
|
||||||
|
else
|
||||||
|
%obj.setImageTrigger(2, false);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
%obj.setImageTrigger(2, false);
|
||||||
|
if(%state)
|
||||||
|
%obj.setImageTrigger(4, true);
|
||||||
|
else
|
||||||
|
%obj.setImageTrigger(4, false);
|
||||||
|
}
|
||||||
|
case 2:
|
||||||
|
if(%state)
|
||||||
|
{
|
||||||
|
%obj.getDataBlock().playerDismount(%obj);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function AssaultPlasmaTurret::playerDismount(%data, %obj)
|
||||||
|
{
|
||||||
|
//Passenger Exiting
|
||||||
|
%obj.fireTrigger = 0;
|
||||||
|
%obj.setImageTrigger(2, false);
|
||||||
|
%obj.setImageTrigger(4, false);
|
||||||
|
%client = %obj.getControllingClient();
|
||||||
|
// %client.setControlObject(%client.player);
|
||||||
|
//turret auto fire if ai mounted, if ai, %client = -1 - Lagg...
|
||||||
|
if (%client > 0)
|
||||||
|
{
|
||||||
|
%client.player.mountImage(%client.player.lastWeapon, $WeaponSlot);
|
||||||
|
}
|
||||||
|
%client.player.mountVehicle = false;
|
||||||
|
setTargetSensorGroup(%obj.getTarget(), 0);
|
||||||
|
setTargetNeverVisMask(%obj.getTarget(), 0xffffffff);
|
||||||
|
// %client.player.getDataBlock().doDismount(%client.player);
|
||||||
|
}
|
||||||
|
|
||||||
|
//function AssaultPlasmaTurret::getHudNum(%data, %num)
|
||||||
|
//{
|
||||||
|
// if(%num == 1)
|
||||||
|
// return 1;
|
||||||
|
// else
|
||||||
|
// return 3;
|
||||||
|
//}
|
||||||
|
|
||||||
|
|
||||||
|
// ------------------------------------------
|
||||||
|
// camera functions
|
||||||
|
// ------------------------------------------
|
||||||
|
|
||||||
|
$CameraDeployTime = 1000;
|
||||||
|
$CameraDeployCheckMax = 6;
|
||||||
|
$CameraMinVelocity = 0.1;
|
||||||
|
|
||||||
|
function CameraGrenadeThrown::onThrow(%this, %gren)
|
||||||
|
{
|
||||||
|
// schedule a check to see if the camera is at rest but not deployed
|
||||||
|
%gren.checkCount = 0;
|
||||||
|
%gren.velocCheck = %this.schedule($CameraDeployTime, "checkCameraDeploy", %gren);
|
||||||
|
}
|
||||||
|
|
||||||
|
function CameraGrenadeThrown::onStickyCollision(%data, %obj)
|
||||||
|
{
|
||||||
|
cancel(%obj.velocCheck);
|
||||||
|
%pos = %obj.getLastStickyPos();
|
||||||
|
%norm = %obj.getLastStickyNormal();
|
||||||
|
|
||||||
|
%intAngle = getTerrainAngle(%norm); // staticShape.cs
|
||||||
|
%rotAxis = vectorNormalize(vectorCross(%norm, "0 0 1"));
|
||||||
|
if (getWord(%norm, 2) == 1 || getWord(%norm, 2) == -1)
|
||||||
|
%rotAxis = vectorNormalize(vectorCross(%norm, "0 1 0"));
|
||||||
|
|
||||||
|
%rotation = %rotAxis @ " " @ %intAngle;
|
||||||
|
%dcSucc = activateCamera(%pos, %rotation, %obj.sourceObject, %obj.sourceObject.team);
|
||||||
|
if(%dcSucc == 0)
|
||||||
|
messageClient(%obj.sourceObject.client, 'MsgDeployFailed', '\c2Your team\'s control network has reached its capacity for this item.~wfx/misc/misc.error.wav');
|
||||||
|
%obj.schedule(50,"delete");
|
||||||
|
}
|
||||||
|
|
||||||
|
function CameraGrenadeThrown::checkCameraDeploy(%this, %gren)
|
||||||
|
{
|
||||||
|
%gren.checkCount++;
|
||||||
|
if(VectorLen(%gren.getVelocity()) < $CameraMinVelocity)
|
||||||
|
{
|
||||||
|
// camera has come to rest but not deployed -- probably on a staticshape (station, gen, etc)
|
||||||
|
// no resolution, so get rid of it
|
||||||
|
%gren.schedule(50, "delete");
|
||||||
|
}
|
||||||
|
else if(%gren.checkCount >= $CameraDeployCheckMax)
|
||||||
|
{
|
||||||
|
// camera's still moving but it's been check several times -- it was thrown from too great
|
||||||
|
// a height or off the edge of the world -- delete it
|
||||||
|
%gren.schedule(50, "delete");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// check back in a little while
|
||||||
|
%gren.velocCheck = %this.schedule($CameraDeployTime, "checkCameraDeploy", %gren);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function activateCamera(%position, %rotation, %sourceObj, %team)
|
||||||
|
{
|
||||||
|
if($TeamDeployedCount[%team, DeployedCamera] >= $TeamDeployableMax[DeployedCamera])
|
||||||
|
{
|
||||||
|
// team has too many cameras deployed already, don't deploy this one
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
%dCam = new Turret()
|
||||||
|
{
|
||||||
|
dataBlock = "TurretDeployedCamera";
|
||||||
|
team = %team;
|
||||||
|
needsNoPower = true;
|
||||||
|
owner = %sourceObj.client;
|
||||||
|
ownerHandle = %sourceObj.client.handle;
|
||||||
|
position = %position;
|
||||||
|
rotation = %rotation;
|
||||||
|
};
|
||||||
|
addToDeployGroup(%dCam);
|
||||||
|
|
||||||
|
if(%dCam.getTarget() != -1)
|
||||||
|
setTargetSensorGroup(%dCam.getTarget(), %team);
|
||||||
|
|
||||||
|
%dCam.playAudio($DeploySound, CameraGrenadeAttachSound);
|
||||||
|
%dCam.deploy();
|
||||||
|
%dCam.playThread($AmbientThread, "ambient");
|
||||||
|
|
||||||
|
// increment team's deployed count for cameras
|
||||||
|
$TeamDeployedCount[%team, DeployedCamera]++;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
function FlareGrenade::onUse(%this, %obj)
|
||||||
|
{
|
||||||
|
// a stripped-down version of HandInventory::onUse from weapons.cs
|
||||||
|
if(Game.handInvOnUse(%data, %obj)) {
|
||||||
|
%obj.decInventory(%this, 1);
|
||||||
|
%p = new FlareProjectile() {
|
||||||
|
dataBlock = FlareGrenadeProj;
|
||||||
|
initialDirection = %obj.getEyeVector();
|
||||||
|
initialPosition = getBoxCenter(%obj.getWorldBox());
|
||||||
|
sourceObject = %obj;
|
||||||
|
sourceSlot = 0;
|
||||||
|
};
|
||||||
|
FlareSet.add(%p);
|
||||||
|
MissionCleanup.add(%p);
|
||||||
|
serverPlay3D(GrenadeThrowSound, getBoxCenter(%obj.getWorldBox()));
|
||||||
|
%p.schedule(6000, "delete");
|
||||||
|
// miscellaneous grenade-throwing cleanup stuff
|
||||||
|
%obj.lastThrowTime[%data] = getSimTime();
|
||||||
|
%obj.throwStrength = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// uncomment when explosion type can be set from script (dont want underwater explosion here)
|
||||||
|
//function grenadeOnEnterLiquid(%data, %obj, %coverage, %type, %flash)
|
||||||
|
//{
|
||||||
|
// // 4: Lava
|
||||||
|
// // 5: Hot Lava
|
||||||
|
// // 6: Crusty Lava
|
||||||
|
// if(%type >=4 && %type <= 6)
|
||||||
|
// {
|
||||||
|
// if(%obj.getDamageState() !$= "Destroyed")
|
||||||
|
// {
|
||||||
|
// cancel(%obj.detThread);
|
||||||
|
// if(%flash)
|
||||||
|
// detonateFlashGrenade(%obj);
|
||||||
|
// else
|
||||||
|
// detonateGrenade(%obj);
|
||||||
|
// return(true);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// // flash grenades do not ignore quicksand
|
||||||
|
// if((%type == 7) && !%flash)
|
||||||
|
// return(true);
|
||||||
|
//
|
||||||
|
// return(false);
|
||||||
|
//}
|
||||||
|
|
||||||
|
function GrenadeThrown::onThrow(%this, %gren)
|
||||||
|
{
|
||||||
|
AIGrenadeThrown(%gren);
|
||||||
|
%gren.detThread = schedule(1500, %gren, "detonateGrenade", %gren);
|
||||||
|
}
|
||||||
|
|
||||||
|
//function GrenadeThrown::onEnterLiquid(%data, %obj, %coverage, %type)
|
||||||
|
//{
|
||||||
|
// if(!grenadeOnEnterLiquid(%data, %obj, %coverage, %type, false))
|
||||||
|
// Parent::onEnterLiquid(%data, %obj, %coverage, %type);
|
||||||
|
//}
|
||||||
|
|
||||||
|
function ConcussionGrenadeThrown::onThrow(%this, %gren)
|
||||||
|
{
|
||||||
|
AIGrenadeThrown(%gren);
|
||||||
|
%gren.detThread = schedule(2000, %gren, "detonateGrenade", %gren);
|
||||||
|
}
|
||||||
|
|
||||||
|
//function ConcussionGrenadeThrown::onEnterLiquid(%data, %obj, %coverage, %type)
|
||||||
|
//{
|
||||||
|
// if(!grenadeOnEnterLiquid(%data, %obj, %coverage, %type, false))
|
||||||
|
// Parent::onEnterLiquid(%data, %obj, %coverage, %type);
|
||||||
|
//}
|
||||||
|
|
||||||
|
function detonateGrenade(%obj)
|
||||||
|
{
|
||||||
|
%obj.setDamageState(Destroyed);
|
||||||
|
%data = %obj.getDataBlock();
|
||||||
|
RadiusExplosion( %obj, %obj.getPosition(), %data.damageRadius, %data.indirectDamage,
|
||||||
|
%data.kickBackStrength, %obj.sourceObject, %data.radiusDamageType);
|
||||||
|
%obj.schedule(500,"delete");
|
||||||
|
}
|
||||||
|
|
||||||
|
function FlashGrenadeThrown::onThrow(%this, %gren)
|
||||||
|
{
|
||||||
|
%gren.detThread = schedule(2000, %gren, "detonateFlashGrenade", %gren);
|
||||||
|
}
|
||||||
|
|
||||||
|
//function FlashGrenadeThrown::onEnterLiquid(%data, %obj, %coverage, %type)
|
||||||
|
//{
|
||||||
|
// if(!grenadeOnEnterLiquid(%data, %obj, %coverage, %type, true))
|
||||||
|
// Parent::onEnterLiquid(%data, %obj, %coverage, %type);
|
||||||
|
//}
|
||||||
|
|
||||||
|
function detonateFlashGrenade(%hg)
|
||||||
|
{
|
||||||
|
%maxWhiteout = %hg.getDataBlock().maxWhiteout;
|
||||||
|
%thrower = %hg.sourceObject.client;
|
||||||
|
%hg.setDamageState(Destroyed);
|
||||||
|
%hgt = %hg.getTransform();
|
||||||
|
%plX = firstword(%hgt);
|
||||||
|
%plY = getWord(%hgt, 1);
|
||||||
|
%plZ = getWord(%hgt, 2);
|
||||||
|
%pos = %plX @ " " @ %plY @ " " @ %plZ;
|
||||||
|
//all this stuff below ripped from projectiles.cs
|
||||||
|
|
||||||
|
InitContainerRadiusSearch(%pos, 100.0, $TypeMasks::PlayerObjectType |
|
||||||
|
$TypeMasks::TurretObjectType);
|
||||||
|
|
||||||
|
while ((%damage = containerSearchNext()) != 0)
|
||||||
|
{
|
||||||
|
%dist = containerSearchCurrDist();
|
||||||
|
|
||||||
|
%eyeXF = %damage.getEyeTransform();
|
||||||
|
%epX = firstword(%eyeXF);
|
||||||
|
%epY = getWord(%eyeXF, 1);
|
||||||
|
%epZ = getWord(%eyeXF, 2);
|
||||||
|
%eyePos = %epX @ " " @ %epY @ " " @ %epZ;
|
||||||
|
%eyeVec = %damage.getEyeVector();
|
||||||
|
|
||||||
|
// Make sure we can see the thing...
|
||||||
|
if (ContainerRayCast(%eyePos, %pos, $TypeMasks::TerrainObjectType |
|
||||||
|
$TypeMasks::InteriorObjectType |
|
||||||
|
$TypeMasks::StaticObjectType, %damage) !$= "0")
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
%distFactor = 1.0;
|
||||||
|
if (%dist >= 100)
|
||||||
|
%distFactor = 0.0;
|
||||||
|
else if (%dist >= 20) {
|
||||||
|
%distFactor = 1.0 - ((%dist - 20.0) / 80.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
%dif = VectorNormalize(VectorSub(%pos, %eyePos));
|
||||||
|
%dot = VectorDot(%eyeVec, %dif);
|
||||||
|
|
||||||
|
%difAcos = mRadToDeg(mAcos(%dot));
|
||||||
|
%dotFactor = 1.0;
|
||||||
|
if (%difAcos > 60)
|
||||||
|
%dotFactor = ((1.0 - ((%difAcos - 60.0) / 120.0)) * 0.2) + 0.3;
|
||||||
|
else if (%difAcos > 45)
|
||||||
|
%dotFactor = ((1.0 - ((%difAcos - 45.0) / 15.0)) * 0.5) + 0.5;
|
||||||
|
|
||||||
|
%totalFactor = %dotFactor * %distFactor;
|
||||||
|
|
||||||
|
%prevWhiteOut = %damage.getWhiteOut();
|
||||||
|
|
||||||
|
if(!%prevWhiteOut)
|
||||||
|
if(!$teamDamage)
|
||||||
|
{
|
||||||
|
if(%damage.client != %thrower && %damage.client.team == %thrower.team)
|
||||||
|
messageClient(%damage.client, 'teamWhiteOut', '\c1You were hit by %1\'s whiteout grenade.', getTaggedString(%thrower.name));
|
||||||
|
}
|
||||||
|
|
||||||
|
%whiteoutVal = %prevWhiteOut + %totalFactor;
|
||||||
|
if(%whiteoutVal > %maxWhiteout)
|
||||||
|
{
|
||||||
|
//error("whitout at max");
|
||||||
|
%whiteoutVal = %maxWhiteout;
|
||||||
|
}
|
||||||
|
//bot cheat! don't blind the thrower - Lagg... 1-8-2004
|
||||||
|
if (%damage.client == %thrower && %thrower.isAIControlled())
|
||||||
|
continue;
|
||||||
|
|
||||||
|
%damage.setWhiteOut( %whiteoutVal );
|
||||||
|
}
|
||||||
|
%hg.schedule( 500, "delete" );
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------
|
||||||
|
// mine functions
|
||||||
|
// ----------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
function MineDeployed::onThrow(%this, %mine, %thrower)
|
||||||
|
{
|
||||||
|
%mine.armed = false;
|
||||||
|
%mine.damaged = 0;
|
||||||
|
%mine.detonated = false;
|
||||||
|
%mine.depCount = 0;
|
||||||
|
%mine.theClient = %thrower.client;
|
||||||
|
$TeamDeployedCount[%mine.sourceObject.team, MineDeployed]++; // z0dd - ZOD, 8/13/02, Moved this from deployMineCheck to here. Fixes mine count bug
|
||||||
|
|
||||||
|
schedule(1500, %mine, "deployMineCheck", %mine, %thrower);
|
||||||
|
}
|
||||||
|
|
||||||
|
function deployMineCheck(%mineObj, %player)
|
||||||
|
{
|
||||||
|
if(%mineObj.depCount > %mineObj.getDatablock().maxDepCount)
|
||||||
|
explodeMine(%mineObj, true);
|
||||||
|
|
||||||
|
// wait until the mine comes to rest
|
||||||
|
if(%mineObj.getVelocity() $= "0 0 0")
|
||||||
|
{
|
||||||
|
// 2-second delay before mine is armed -- let deploy thread play out etc.
|
||||||
|
schedule(%mineObj.getDatablock().armTime, %mineObj, "armDeployedMine", %mineObj);
|
||||||
|
|
||||||
|
// check for other deployed mines in the vicinity
|
||||||
|
InitContainerRadiusSearch(%mineObj.getWorldBoxCenter(), %mineObj.getDatablock().spacing, $TypeMasks::ItemObjectType);
|
||||||
|
while((%itemObj = containerSearchNext()) != 0)
|
||||||
|
{
|
||||||
|
if(%itemObj == %mineObj)
|
||||||
|
continue;
|
||||||
|
%ioType = %itemObj.getDatablock().getName();
|
||||||
|
if(%ioType $= "MineDeployed")
|
||||||
|
schedule(100, %mineObj, "explodeMine", %mineObj, true);
|
||||||
|
else
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
// play "deploy" thread
|
||||||
|
%mineObj.playThread(0, "deploy");
|
||||||
|
serverPlay3D(MineDeploySound, %mineObj.getTransform());
|
||||||
|
%mineTeam = %mineObj.sourceObject.team;
|
||||||
|
//$TeamDeployedCount[%mineTeam, MineDeployed]++; // z0dd - ZOD, 8/13/02, Moved the increment to MineDeployed::onThrow. Fixes mine count bug
|
||||||
|
if($TeamDeployedCount[%mineTeam, MineDeployed] > $TeamDeployableMax[MineDeployed])
|
||||||
|
{
|
||||||
|
messageClient( %player.client, '', 'Maximum allowable mines deployed.' );
|
||||||
|
schedule(100, %mineObj, "explodeMine", %mineObj, true);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//start the thread that keeps checking for objects near the mine...
|
||||||
|
mineCheckVicinity(%mineObj);
|
||||||
|
|
||||||
|
//let the AI know *after* it's come to rest...
|
||||||
|
AIDeployMine(%mineObj);
|
||||||
|
|
||||||
|
//let the game know there's a deployed mine
|
||||||
|
Game.notifyMineDeployed(%mineObj);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//schedule this deploy check again a little later
|
||||||
|
%mineObj.depCount++;
|
||||||
|
schedule(500, %mineObj, "deployMineCheck", %mineObj, %player);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function armDeployedMine(%mine)
|
||||||
|
{
|
||||||
|
%mine.armed = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function mineCheckVicinity(%mine)
|
||||||
|
{
|
||||||
|
// this function is called after the mine has been deployed. It will check the
|
||||||
|
// immediate area around the mine (2.5 meters at present) for players or vehicles
|
||||||
|
// passing by, and detonate if any are found. This is to extend the range of the
|
||||||
|
// mine so players don't have to collide with them to set them off.
|
||||||
|
|
||||||
|
// don't bother to check if mine isn't armed yet
|
||||||
|
if(%mine.armed)
|
||||||
|
{
|
||||||
|
// don't keep checking if mine is already detonating
|
||||||
|
if(!%mine.boom)
|
||||||
|
{
|
||||||
|
// the actual check for objects in the area
|
||||||
|
%mineLoc = %mine.getWorldBoxCenter();
|
||||||
|
%masks = $TypeMasks::PlayerObjectType | $TypeMasks::VehicleObjectType;
|
||||||
|
%detonateRange = %mine.getDatablock().proximity;
|
||||||
|
%noExplode = 0;
|
||||||
|
InitContainerRadiusSearch(%mineLoc, %detonateRange, %masks);
|
||||||
|
while((%tgt = containerSearchNext()) != 0)
|
||||||
|
{
|
||||||
|
if(!$TeamDamage)
|
||||||
|
{
|
||||||
|
if(%mine.team == %tgt.team)
|
||||||
|
%noExplode = 1;
|
||||||
|
}
|
||||||
|
if(%noExplode == 0)
|
||||||
|
{
|
||||||
|
%mine.detonated = true;
|
||||||
|
schedule(50, %mine, "explodeMine", %mine, false);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// if nothing set off the mine, schedule another check
|
||||||
|
if(!%mine.detonated)
|
||||||
|
schedule(300, %mine, "mineCheckVicinity", %mine);
|
||||||
|
}
|
||||||
|
|
||||||
|
function MineDeployed::onCollision(%data, %obj, %col)
|
||||||
|
{
|
||||||
|
// don't detonate if mine isn't armed yet
|
||||||
|
if(!%obj.armed)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// don't detonate if mine is already detonating
|
||||||
|
if(%obj.boom)
|
||||||
|
return;
|
||||||
|
|
||||||
|
%noExplode = 0;
|
||||||
|
//check to see what it is that collided with the mine
|
||||||
|
%struck = %col.getClassName();
|
||||||
|
if(%struck $= "Player" || %struck $= "WheeledVehicle" || %struck $= "FlyingVehicle")
|
||||||
|
{
|
||||||
|
if(!$teamDamage)
|
||||||
|
{
|
||||||
|
if(%obj.team == %col.getOwnerClient().team)
|
||||||
|
%noExplode = 1;
|
||||||
|
}
|
||||||
|
if(%noExplode == 0)
|
||||||
|
{
|
||||||
|
//error("Mine detonated due to collision with #"@%col@" ("@%struck@"); armed = "@%obj.armed);
|
||||||
|
explodeMine(%obj, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function explodeMine(%mo, %noDamage)
|
||||||
|
{
|
||||||
|
%mo.noDamage = %noDamage;
|
||||||
|
%mo.setDamageState(Destroyed);
|
||||||
|
}
|
||||||
|
|
||||||
|
function MineDeployed::damageObject(%data, %targetObject, %sourceObject, %position, %amount, %damageType)
|
||||||
|
{
|
||||||
|
// -----------------------------
|
||||||
|
// z0dd - ZOD, 5/09/04. If gameplay changes in affect, no mine disc
|
||||||
|
if($Host::ClassicLoadMineChanges)
|
||||||
|
{
|
||||||
|
if(!%targetObject.armed)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// -----------------------------
|
||||||
|
|
||||||
|
if(%targetObject.boom)
|
||||||
|
return;
|
||||||
|
|
||||||
|
%targetObject.damaged += %amount;
|
||||||
|
|
||||||
|
if(%targetObject.damaged >= %data.maxDamage)
|
||||||
|
{
|
||||||
|
%targetObject.setDamageState(Destroyed);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function MineDeployed::onDestroyed(%data, %obj, %lastState)
|
||||||
|
{
|
||||||
|
%obj.boom = true;
|
||||||
|
%mineTeam = %obj.team;
|
||||||
|
$TeamDeployedCount[%mineTeam, MineDeployed]--;
|
||||||
|
// %noDamage is a boolean flag -- don't want to set off all other mines in
|
||||||
|
// vicinity if there's a "mine overload", so apply no damage/impulse if true
|
||||||
|
if(!%obj.noDamage)
|
||||||
|
RadiusExplosion(%obj,
|
||||||
|
%obj.getPosition(),
|
||||||
|
%data.damageRadius,
|
||||||
|
%data.indirectDamage,
|
||||||
|
%data.kickBackStrength,
|
||||||
|
%obj.sourceObject,
|
||||||
|
%data.radiusDamageType);
|
||||||
|
|
||||||
|
%obj.schedule(600, "delete");
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue