diff --git a/Classic/prefs/serverPrefs.cs b/Classic/prefs/serverPrefs.cs index 033a2bd..3bf3632 100644 --- a/Classic/prefs/serverPrefs.cs +++ b/Classic/prefs/serverPrefs.cs @@ -147,10 +147,10 @@ $Host::PUGPassword = "pickup"; $Host::PUGpasswordAlwaysOn = 0; $Host::PureServer = 0; $Host::SCtFProMode = 0; -$Host::ServerRules1 = "\c2if\c4(\c3%client.fun == \c5true \c4&& \c3%client.Llama_Grabs \c4< \c51\c4)"; -$Host::ServerRules2 = " \c1Be_Courteous\c4(\c2%client, %game\c4);"; -$Host::ServerRules3 = "\c2else if\c4(\c3%client.attitude \c4!$ = \c5%client.fun\c4)"; -$Host::ServerRules4 = " \c1Try_2_Have_Fun\c4(\c2%client, %attitude\c4);"; +$Host::ServerRules1 = "\c2if\c4(\c3%client.attitude \c4$= \c5\"fun\" \c4&& \c3%client.Llama_Grabs \c4< \c51\c4) {"; +$Host::ServerRules2 = " \c1keepTeamsBalanced\c4(\c2%client\c4); \c1dontSwitch2WinningTeam(\c2%client\c4); }"; +$Host::ServerRules3 = "\c2else if\c4(\c3%client.attitude \c4$= \c5\"too_serious\"\c4) {"; +$Host::ServerRules4 = " \c1try2HaveFun\c4(\c2%client, %attitude\c4); \c1thisIsPubServer\c4(\c2%client, %attitude\c4); }"; $Host::ShowEndingPlayerScores = 1; $Host::ShowIngamePlayerScores = 1; $Host::Siege::Halftime = 20000; diff --git a/Classic/scripts/CTFGame.cs b/Classic/scripts/CTFGame.cs index 2fc1edc..0a8d2db 100644 --- a/Classic/scripts/CTFGame.cs +++ b/Classic/scripts/CTFGame.cs @@ -255,35 +255,6 @@ function Flag::onLeaveLiquid(%data, %obj, %type) cancel(%obj.lavaEnterThread); } -function ProjectileData::onCollision(%data, %projectile, %targetObject, %modifier, %position, %normal) -{ - if(!isObject(%targetObject) && !isObject(%projectile.sourceObject)) - return; - if(!(%targetObject.getType() & ($TypeMasks::StaticTSObjectType | $TypeMasks::InteriorObjectType | - $TypeMasks::TerrainObjectType | $TypeMasks::WaterObjectType))) - { - if(%projectile.sourceObject.team !$= %targetObject.team) - { - if(%targetObject.getDataBlock().getClassName() $= "PlayerData" && %data.getName() $= "DiscProjectile") - { - %mask = $TypeMasks::StaticShapeObjectType | $TypeMasks::InteriorObjectType | $TypeMasks::TerrainObjectType; - %start = %targetObject.getWorldBoxCenter(); - %distance = mFloor(VectorDist(%start, %projectile.initialPosition)); - %end = getWord(%start, 0) SPC getWord(%start, 1) SPC getWord(%start, 2) - 15; - %grounded = ContainerRayCast(%start, %end, %mask, 0); - if(!%grounded) - { - %projectile.sourceObject.client.scoreMidAir++; - messageClient(%projectile.sourceObject.client, 'MsgMidAir', '\c0You received a %1 point bonus for a successful mid air shot.~wfx/misc/bounty_bonus.wav', Game.SCORE_PER_MIDAIR, %data.radiusDamageType, %distance); - messageTeamExcept(%projectile.sourceObject.client, 'MsgMidAir', '\c5%1 hit a mid air shot.', %projectile.sourceObject.client.name, %data.radiusDamageType, %distance); - Game.recalcScore(%projectile.sourceObject.client); - } - } - } - Parent::onCollision(%data, %projectile, %targetObject, %modifier, %position, %normal); - } -} - }; //-------------------------------------------------------------------------- diff --git a/Classic/scripts/DMGame.cs b/Classic/scripts/DMGame.cs index af1d30d..782a1f6 100644 --- a/Classic/scripts/DMGame.cs +++ b/Classic/scripts/DMGame.cs @@ -704,36 +704,7 @@ package DMGame // explode it vgc schedule(2000, %mineObj, "explodeMine", %mineObj, true); } - - function ProjectileData::onCollision(%data, %projectile, %targetObject, %modifier, %position, %normal) - { - if(!isObject(%targetObject) && !isObject(%projectile.sourceObject)) - return; - if(!(%targetObject.getType() & ($TypeMasks::StaticTSObjectType | $TypeMasks::InteriorObjectType | - $TypeMasks::TerrainObjectType | $TypeMasks::WaterObjectType))) - { - if(%projectile.sourceObject.team !$= %targetObject.team) - { - if(%targetObject.getDataBlock().getClassName() $= "PlayerData" && %data.getName() $= "DiscProjectile") - { - %mask = $TypeMasks::StaticShapeObjectType | $TypeMasks::InteriorObjectType | $TypeMasks::TerrainObjectType; - %start = %targetObject.getWorldBoxCenter(); - %distance = mFloor(VectorDist(%start, %projectile.initialPosition)); - %end = getWord(%start, 0) SPC getWord(%start, 1) SPC getWord(%start, 2) - 15; - %grounded = ContainerRayCast(%start, %end, %mask, 0); - if(!%grounded) - { - %projectile.sourceObject.client.scoreMidAir++; - messageClient(%projectile.sourceObject.client, 'MsgMidAir', '\c0You hit a successful mid air shot.~wfx/misc/bounty_bonus.wav', %data.radiusDamageType, %distance); - messageTeamExcept(%projectile.sourceObject.client, 'MsgMidAir', '\c5%1 hit a mid air shot.', %projectile.sourceObject.client.name, %data.radiusDamageType, %distance); - Game.recalcScore(%projectile.sourceObject.client); - } - } - } - Parent::onCollision(%data, %projectile, %targetObject, %modifier, %position, %normal); - } - } - + //Take out anything vehicle related function Armor::damageObject(%data, %targetObject, %sourceObject, %position, %amount, %damageType, %momVec, %mineSC) { diff --git a/Classic/scripts/LakRabbitGame.cs b/Classic/scripts/LakRabbitGame.cs index da79d4a..9e2d1f7 100644 --- a/Classic/scripts/LakRabbitGame.cs +++ b/Classic/scripts/LakRabbitGame.cs @@ -2098,7 +2098,7 @@ function plzBounceOffGrid(%obj, %bounceForce, %count) %vec = VectorNormalize(%vec); %vec = VectorScale(%vec, 25); } - else if (%oldSpeed < 300) + else if (%oldSpeed < 60) //Max speed a boost gets applied to a bounce: Added so runners cant abuse %vec = VectorScale(%vec, 1.15); // apply the impulse to the object diff --git a/Classic/scripts/SCtFGame.cs b/Classic/scripts/SCtFGame.cs index f4e71ea..d486513 100644 --- a/Classic/scripts/SCtFGame.cs +++ b/Classic/scripts/SCtFGame.cs @@ -262,35 +262,6 @@ package SCtFGame if(isEventPending(%obj.lavaEnterThread)) cancel(%obj.lavaEnterThread); } - - function ProjectileData::onCollision(%data, %projectile, %targetObject, %modifier, %position, %normal) - { - if(!isObject(%targetObject) && !isObject(%projectile.sourceObject)) - return; - if(!(%targetObject.getType() & ($TypeMasks::StaticTSObjectType | $TypeMasks::InteriorObjectType | - $TypeMasks::TerrainObjectType | $TypeMasks::WaterObjectType))) - { - if(%projectile.sourceObject.team !$= %targetObject.team) - { - if(%targetObject.getDataBlock().getClassName() $= "PlayerData" && %data.getName() $= "DiscProjectile") - { - %mask = $TypeMasks::StaticShapeObjectType | $TypeMasks::InteriorObjectType | $TypeMasks::TerrainObjectType; - %start = %targetObject.getWorldBoxCenter(); - %distance = mFloor(VectorDist(%start, %projectile.initialPosition)); - %end = getWord(%start, 0) SPC getWord(%start, 1) SPC getWord(%start, 2) - 15; - %grounded = ContainerRayCast(%start, %end, %mask, 0); - if(!%grounded) - { - %projectile.sourceObject.client.scoreMidAir++; - messageClient(%projectile.sourceObject.client, 'MsgMidAir', '\c0You received a %1 point bonus for a successful mid air shot.~wfx/misc/bounty_bonus.wav', Game.SCORE_PER_MIDAIR, %data.radiusDamageType, %distance); - messageTeamExcept(%projectile.sourceObject.client, 'MsgMidAir', '\c5%1 hit a mid air shot.', %projectile.sourceObject.client.name, %data.radiusDamageType, %distance); - Game.recalcScore(%projectile.sourceObject.client); - } - } - } - Parent::onCollision(%data, %projectile, %targetObject, %modifier, %position, %normal); - } - } function stationTrigger::onEnterTrigger(%data, %obj, %colObj) { diff --git a/Classic/scripts/autoexec/Autobalance.cs b/Classic/scripts/autoexec/Autobalance.cs index 3eadafa..9f872c8 100644 --- a/Classic/scripts/autoexec/Autobalance.cs +++ b/Classic/scripts/autoexec/Autobalance.cs @@ -7,6 +7,15 @@ // $Host::EnableAutobalance = 1; // // exec("scripts/autoexec/Autobalance.cs"); +// +// How far behind otherteam must be to use All Mode. +// Meaning picking from a pool of all players on the $BigTeam instead of just the lowest scoring players. +// 400 equals 400 points. 4 caps behind. +$Autobalance::AMThreshold = 300; +// Based on BigTeams Top3 scorers. If BigTeams Top3 scorers is greater than the otherTeams Top3 + Top3Threshold. Use AllMode. +$Autobalance::Top3Threshold = 400; +// If it takes too long for specific canidates to die. After a time choose anyone. +$Autobalance::Fallback = 90000; // Run from TeamBalanceNotify.cs via NotifyUnbalanced function Autobalance( %game ) @@ -14,7 +23,7 @@ function Autobalance( %game ) if(isEventPending($AutoBalanceSchedule)) cancel($AutoBalanceSchedule); - if( $TBNStatus !$= "NOTIFY" ) //If Status has changed to EVEN or anything else (GameOver reset). + if($TBNStatus !$= "NOTIFY") //If Status has changed to EVEN or anything else (GameOver reset). return; //Difference Variables @@ -28,33 +37,67 @@ function Autobalance( %game ) $BigTeam = 2; else return; + + $Autobalace::UseAllMode = 0; + %otherTeam = $BigTeam == 1 ? 2 : 1; + %bigTeamTop3 = $TeamRank[$BigTeam, 0].score + $TeamRank[$BigTeam, 1].score + $TeamRank[$BigTeam, 2].score; + %otherTeamTop3 = $TeamRank[%otherTeam, 0].score + $TeamRank[%otherTeam, 1].score + $TeamRank[%otherTeam, 2].score; + //Anyone who dies is eligable to switch + //If BigTeam score is greater than otherteam score + threshold or BigTeam Top3 is greater than otherTeam Top3 + Top3Threshold + if($TeamScore[$BigTeam] > ($TeamScore[%otherTeam] + $Autobalance::AMThreshold) || $TeamRank[%otherTeam, count] $= 0 || %bigTeamTop3 > (%otherTeamTop3 + $Autobalance::Top3Threshold)) + $Autobalace::UseAllMode = 1; + //echo("Allmode " @ $Autobalace::UseAllMode); - %otherteam = $BigTeam == 1 ? 2 : 1; - if($TeamRank[$BigTeam, count] - $TeamRank[%otherteam, count] >= 3) + //Select lower half of team rank as canidates for team change + if(!$Autobalace::UseAllMode) + { + $Autobalance::Max = mFloor($TeamRank[$BigTeam, count]/2); + for(%i = $Autobalance::Max; %i < $TeamRank[$BigTeam, count]; %i++) + { + //echo(%i); echo($TeamRank[$BigTeam, %i].nameBase); + $Autobalance::Canidate[%i] = $TeamRank[$BigTeam, %i]; + } + %a = " selected"; + } + + if($TeamRank[$BigTeam, count] - $TeamRank[%otherTeam, count] >= 3) %s = "s"; //Warning message - messageAll('MsgTeamBalanceNotify', '\c1Teams are unbalanced: \c0Autobalance will switch the next respawning player%2 on Team %1.', $TeamName[$BigTeam], %s); + messageAll('MsgTeamBalanceNotify', '\c1Teams are unbalanced: \c0Autobalance will switch the next%3 respawning player%2 on Team %1.', $TeamName[$BigTeam], %s, %a); +} + +// Return true if client is a canidate +function CheckCanidate(%client) +{ + for(%i = $Autobalance::Max; %i < $TeamRank[$BigTeam, count]; %i++) + { + if(%client $= $Autobalance::Canidate[%i]) + return true; + } + return false; } package Autobalance { -// called from player scripts function DefaultGame::onClientKilled(%game, %clVictim, %clKiller, %damageType, %implement, %damageLocation) { parent::onClientKilled(%game, %clVictim, %clKiller, %damageType, %implement, %damageLocation); if($BigTeam !$= "" && %clVictim.team == $BigTeam) { - %otherteam = $BigTeam == 1 ? 2 : 1; - if($TeamRank[$BigTeam, count] - $TeamRank[%otherteam, count] >= 2) + %otherTeam = $BigTeam == 1 ? 2 : 1; + if($TeamRank[$BigTeam, count] - $TeamRank[%otherTeam, count] >= 2) { - //If someone switches to observer or disconnects - if(%damageType !$= 0) + if($Autobalance::CanidateFallbackTime $= "") + $Autobalance::CanidateFallbackTime = getSimTime(); + + //damageType 0: If someone switches to observer or disconnects + if(%damageType !$= 0 && (CheckCanidate(%clVictim) || $Autobalace::UseAllMode || (getSimTime() - $Autobalance::CanidateFallbackTime > $Autobalance::Fallback))) { echo(%clVictim.nameBase @ " has been moved to Team " @ %otherTeam @ " for balancing."); - messageClient(%clVictim, 'MsgTeamBalanceNotify', '\c0You were switched to Team %1 for balancing.~wfx/powered/vehicle_screen_on.wav', $TeamName[%otherteam]); + messageClient(%clVictim, 'MsgTeamBalanceNotify', '\c0You were switched to Team %1 for balancing.~wfx/powered/vehicle_screen_on.wav', $TeamName[%otherTeam]); messageAllExcept(%clVictim, -1, 'MsgTeamBalanceNotify', '~wfx/powered/vehicle_screen_on.wav'); Game.clientChangeTeam( %clVictim, %otherTeam, 0 ); @@ -64,6 +107,7 @@ function DefaultGame::onClientKilled(%game, %clVictim, %clKiller, %damageType, % { $BigTeam = ""; ResetTBNStatus(); + deleteVariables("$Autobalace::Canidate*"); } } } @@ -74,6 +118,7 @@ function DefaultGame::gameOver(%game) //Reset Autobalance $BigTeam = ""; + deleteVariables("$Autobalace::Canidate*"); } }; diff --git a/Classic/scripts/autoexec/MidAirDetRep.cs b/Classic/scripts/autoexec/MidAirDetRep.cs new file mode 100644 index 0000000..2c9ec93 --- /dev/null +++ b/Classic/scripts/autoexec/MidAirDetRep.cs @@ -0,0 +1,151 @@ +// MidAir Detection Replacement +// For CTF, LCTF, DM +// Script By: DarkTiger +// v1.0 +// +$MADR::Minimum = 10; + +//Replacing Classic Midair Hit Detection +// +//function ProjectileData::onCollision(%data, %projectile, %targetObject, %modifier, %position, %normal) +//{ +// if(!isObject(%targetObject) && !isObject(%projectile.sourceObject)) +// return; +// if(!(%targetObject.getType() & ($TypeMasks::StaticTSObjectType | $TypeMasks::InteriorObjectType | +// $TypeMasks::TerrainObjectType | $TypeMasks::WaterObjectType))) +// { +// if(%projectile.sourceObject.team !$= %targetObject.team) +// { +// if(%targetObject.getDataBlock().getClassName() $= "PlayerData" && %data.getName() $= "DiscProjectile") +// { +// %mask = $TypeMasks::StaticShapeObjectType | $TypeMasks::InteriorObjectType | $TypeMasks::TerrainObjectType; +// %start = %targetObject.getWorldBoxCenter(); +// %distance = mFloor(VectorDist(%start, %projectile.initialPosition)); +// %end = getWord(%start, 0) SPC getWord(%start, 1) SPC getWord(%start, 2) - 15; +// %grounded = ContainerRayCast(%start, %end, %mask, 0); +// if(!%grounded) +// { +// %projectile.sourceObject.client.scoreMidAir++; +// messageClient(%projectile.sourceObject.client, 'MsgMidAir', '\c0You received a %1 point bonus for a successful mid air shot.~wfx/misc/bounty_bonus.wav', Game.SCORE_PER_MIDAIR, %data.radiusDamageType, %distance); +// messageTeamExcept(%projectile.sourceObject.client, 'MsgMidAir', '\c5%1 hit a mid air shot.', %projectile.sourceObject.client.name, %data.radiusDamageType, %distance); +// Game.recalcScore(%projectile.sourceObject.client); +// } +// } +// } +// Parent::onCollision(%data, %projectile, %targetObject, %modifier, %position, %normal); +// } +//} + +package midAirMsg +{ + +function detonateGrenade(%obj) // from lakRabbitGame.cs for grenade tracking +{ + %obj.maNade = 1; + $maObjExplode = %obj; + parent::detonateGrenade(%obj); +} + +function ProjectileData::onExplode(%data, %proj, %pos, %mod) +{ + %cl = %proj.sourceObject.client; + + if(isObject(%cl)) + %cl.expData = %data TAB %proj.initialPosition TAB %pos; + + parent::onExplode(%data, %proj, %pos, %mod); +} + +function DefaultGame::onClientDamaged(%game, %clVictim, %clAttacker, %damageType, %implement, %damageLoc) +{ + if(%game.class $= "CTFGame" || %game.class $= "DMGame" || %game.class $= "SCtFGame") // did it this way so dont have to copy paste 3 fucntions + { + if(isObject(%clVictim.player) && isObject(%clAttacker.player)) + { + if(%clVictim != %clAttacker && %clVictim.team != %clAttacker.team) + { + %dist = vectorDist(%clAttacker.player.getPosition(), %clVictim.player.getPosition()); + switch$(%damageType) + { + //case $DamageType::Blaster: + //if(maRayTestDis(%clVictim.player) >= $MADR::Minimum) + //maMessage(%clAttacker,"Blaster",%dist); + case $DamageType::Plasma: + if(maRayTestDis(%clVictim.player) >= $MADR::Minimum && maDirect(%clAttacker)) + maMessage(%clAttacker,"Plasma Rifle",%dist); + case $DamageType::Disc: + if(maRayTestDis(%clVictim.player) >= $MADR::Minimum && maDirect(%clAttacker)) + maMessage(%clAttacker,"Spinfusor",%dist); + case $DamageType::Grenade: + if($dtObjExplode.dtNade) + {//for hand genades method out of lakRabbit + //if(maRayTestDis(%clVictim.player) >= $MADR::Minimum) + //maMessage(%clAttacker,"Hand Grenade",%dist); + } + else //Grenade Launcher + { + if(maRayTestDis(%clVictim.player) >= $MADR::Minimum && maDirect(%clAttacker)) + maMessage(%clAttacker,"Grenade Launcher",%dist); + } + //case $DamageType::Laser: + //if(maRayTestDis(%clVictim.player) >= $MADR::Minimum) + //maMessage(%clAttacker,"Laser Rifle",%dist); + case $DamageType::Mortar: + if(maRayTestDis(%clVictim.player) >= $MADR::Minimum && maDirect(%clAttacker)) + maMessage(%clAttacker,"Fusion Mortar",%dist); + //case $DamageType::ShockLance: + //if(maRayTestDis(%clVictim.player) >= $MADR::Minimum) + //maMessage(%clAttacker,"ShockLance",%dist); + //case $DamageType::Mine: + //if(maRayTestDis(%clVictim.player) >= $MADR::Minimum) + //maMessage(%clAttacker,"Mine",%dist); + } + } + } + } + + parent::onClientDamaged(%game, %clVictim, %clAttacker, %damageType, %implement, %damageLoc); +} + +}; + +// Prevent package from being activated if it is already +if(!isActivePackage(midAirMsg)) + activatePackage(midAirMsg); + +function maDirect(%client)// tests for direct hit with aoe weapons +{ + %field = %client.expData; + %data = getField(%field,0); %sPos = getField(%field,1); %ePos = getField(%field,2); + + if(%data.hasDamageRadius) + { + %mask = $TypeMasks::PlayerObjectType; + %vec = vectorNormalize(vectorSub(%ePos,%sPos)); + %ray = containerRayCast(%ePos, VectorAdd(%ePos, VectorScale(VectorNormalize(%vec), 5)), %mask, -1); + if(%ray) + return 1; + } + return 0; +} + +function maRayTestDis(%targetObject)// tests for height of target +{ + %mask = $TypeMasks::StaticShapeObjectType | $TypeMasks::InteriorObjectType | $TypeMasks::TerrainObjectType; + %rayStart = %targetObject.getWorldBoxCenter(); + %rayEnd = VectorAdd(%rayStart,"0 0" SPC -5000); + %ray = ContainerRayCast(%rayStart, %rayEnd, %mask, %targetObject); + + if(%ray) + return vectorDist(%rayStart,getWords(%ray,1,3)) - 1.15; + + return 0; +} + +function maMessage(%client,%porjName,%distance)// Send message +{ + %client.scoreMidAir++; + messageClient(%client, 'MsgMidAir', '\c0You received a %1 point bonus for a successful mid air shot. [%2m, %3]~wfx/misc/bounty_bonus.wav', Game.SCORE_PER_MIDAIR, mFloor(%distance), %porjName); + messageTeamExcept(%client, 'MsgMidAir', '\c5%1 hit a mid air shot. [%2m, %3]', %client.name, mFloor(%distance), %porjName); + Game.recalcScore(%client); +} diff --git a/Classic/scripts/autoexec/VoteMenu.cs b/Classic/scripts/autoexec/VoteMenu.cs index bd56b60..32dff60 100644 --- a/Classic/scripts/autoexec/VoteMenu.cs +++ b/Classic/scripts/autoexec/VoteMenu.cs @@ -430,7 +430,7 @@ function serverCmdStartNewVote(%client, %typeName, %arg1, %arg2, %arg3, %arg4, % return; if(!%isAdmin || (%isAdmin && %client.ForceVote)) - %msg = %client.nameBase @ " initiated a vote to " @ (Game.noSplashDamage == 0 ? "enable" : "disable") @ " splash damage."; + %msg = %client.nameBase @ " initiated a vote to " @ (Game.noSplashDamage == 1 ? "enable" : "disable") @ " splash damage."; case "VotePro": if(!$CurrentMissionType $= "LakRabbit") @@ -569,15 +569,7 @@ function playerStartNewVote(%client, %typeName, %arg1, %arg2, %arg3, %arg4, %tea } } else - { - if(%typeName $= "VoteChangeTimeLimit") - { - if(%arg1 $= "999") - %time = "Unlimited"; - else - %time = %arg1; - } - + { %count = ClientGroup.getCount(); for(%i = 0; %i < %count; %i++) { @@ -592,6 +584,7 @@ function playerStartNewVote(%client, %typeName, %arg1, %arg2, %arg3, %arg4, %tea case "VoteSkipMission": messageClient( %cl, 'VoteStarted', "\c2" @ %msg, %client.name, "skip the mission"); case "VoteChangeTimeLimit": + if(%arg1 $= "999") %time = "Unlimited"; else %time = %arg1; messageClient( %cl, 'VoteStarted', "\c2" @ %msg, %client.name, "change the time limit to", %time); case "VoteKickPlayer": messageClient( %cl, 'VoteStarted', "\c2" @ %msg, %client.name, "kick player", %arg1.name); diff --git a/Classic/scripts/autoexec/zDarkTigerStats.cs b/Classic/scripts/autoexec/zDarkTigerStats.cs index 10d4cf4..9449877 100644 --- a/Classic/scripts/autoexec/zDarkTigerStats.cs +++ b/Classic/scripts/autoexec/zDarkTigerStats.cs @@ -143,12 +143,36 @@ // clientDmgStats optimization and cleanup // Score hud bug with viewing last month map stats // Remove dtTurret stat unused -// +// +// 7.4 +// Fix for mine disc kill stat +// Fix for name to client id function not working in lak +// Reworked a ugly fix for %kPlayer var in clientKillStats +// Lightning stats tweak +// Changed time restriction on flag escort from 3 to 5 +// Adjusted clientShotsFired, to fix warnings, still unsure why flyingVehicleObject is getting passed into a onFire? +// Added server crashing tracking, not 100% accurate +// +// 7.5 +// Fixed averages was useing the total avg instead of game avg +// Removed distance calc from weapon score on throwables +// Fixed killStreaks +// Fixed unused vars reset +// +// 7.6 +// Removed the cross check form mine disc, as the timer cross check is enough +// Converted kdr to decimal to better match website and is less confusing +// Commented out nexusCampingKills/Deaths as we currenlty dont support hunters +// Commented out server stat client crash, it will just echo to the console if it sees any +// Removed lockout schedule on chain kills, left the multi kill one in as its kind of nessaary in how it functions +// Renamed mid air distance vars to know at a glance how its tracking, Ex: instead of cgMaDist renamed to cgMAHitDist +// Fixed land spike turret stats + //-----------Settings------------ //Notes score ui width is 592 -$dtStats::version = 7.35; -//disable stats system restart required; -$dtStats::Enable = 1; +$dtStats::version = 7.6; +//disable stats system +$dtStats::Enable = 1; //enable disable map stats $dtStats::mapStats = 1; //Only self client can see his own stats, any stat, unless admin @@ -177,7 +201,7 @@ $dtStats::loadAfter = 0;//keep 0 not finished //Control whats displayed $dtStats::Live = 1; $dtStats::KD = 0;// disabled -$dtStats::Hist =1; +$dtStats::Hist =1; //Leaderboards stuff //To rebuild the leaderboards manually type lStatsCycle(1) into the console; @@ -371,8 +395,10 @@ $dtStats::FV[$dtStats::FC["CTFGame","TG"]++,"CTFGame","TG"] = "winCount"; $dtStats::FV[$dtStats::FC["CTFGame","TG"]++,"CTFGame","TG"] = "lossCount"; $dtStats::FV[$dtStats::FC["CTFGame","TG"]++,"CTFGame","TG"] = "destruction"; $dtStats::FV[$dtStats::FC["CTFGame","Min"]++,"CTFGame","Min"] = "heldTimeSec"; +$dtStats::FV[$dtStats::FC["CTFGame","Min"]++,"CTFGame","Min"] = "heldTimeSecLow"; $dtStats::FV[$dtStats::FC["CTFGame","AvgI"]++,"CTFGame","AvgI"] = "heldTimeSec"; $dtStats::FV[$dtStats::FC["CTFGame","Max"]++,"CTFGame","Max"] = "grabSpeed"; +$dtStats::FV[$dtStats::FC["CTFGame","Max"]++,"CTFGame","Max"] = "grabSpeedLow"; $dtStats::FV[$dtStats::FC["CTFGame","Avg"]++,"CTFGame","Avg"] = "grabSpeed"; $dtStats::FV[$dtStats::FC["CTFGame","Avg"]++,"CTFGame","Avg"] = "capEfficiency"; $dtStats::FV[$dtStats::FC["CTFGame","Avg"]++,"CTFGame","Avg"] = "winLostPct"; @@ -469,8 +495,10 @@ $dtStats::FVG[$dtStats::FCG["SCtFGame","TG"]++,"SCtFGame","TG"] = "flagDefends"; $dtStats::FV[$dtStats::FC["SCtFGame","TG"]++,"SCtFGame","TG"] = "winCount";// in this script only $dtStats::FV[$dtStats::FC["SCtFGame","TG"]++,"SCtFGame","TG"] = "lossCount"; $dtStats::FV[$dtStats::FC["SCtFGame","Min"]++,"SCtFGame","Min"] = "heldTimeSec"; +$dtStats::FV[$dtStats::FC["SCtFGame","Min"]++,"SCtFGame","Min"] = "heldTimeSecLow"; $dtStats::FV[$dtStats::FC["SCtFGame","AvgI"]++,"SCtFGame","AvgI"] = "heldTimeSec"; $dtStats::FV[$dtStats::FC["SCtFGame","Max"]++,"SCtFGame","Max"] = "grabSpeed"; +$dtStats::FV[$dtStats::FC["SCtFGame","Max"]++,"SCtFGame","Max"] = "grabSpeedLow"; $dtStats::FV[$dtStats::FC["SCtFGame","Avg"]++,"SCtFGame","Avg"] = "grabSpeed"; $dtStats::FV[$dtStats::FC["SCtFGame","Avg"]++,"SCtFGame","Avg"] = "capEfficiency"; $dtStats::FV[$dtStats::FC["SCtFGame","Avg"]++,"SCtFGame","Avg"] = "winLostPct"; @@ -591,7 +619,7 @@ $dtStats::FV[$dtStats::FC["TG"]++,"TG"] = "groundDeaths"; $dtStats::FV[$dtStats::FC["TG"]++,"TG"] = "plasmaTurretKills"; $dtStats::FV[$dtStats::FC["TG"]++,"TG"] = "plasmaTurretDeaths"; $dtStats::FV[$dtStats::FC["TG"]++,"TG"] = "aaTurretKills"; -$dtStats::FV[$dtStats::FC["TG"]++,"TG"] = "aaTurretDeaths"; +$dtStats::FV[$dtStats::FC["TG"]++,"TG"] = "aaTurretDeaths"; $dtStats::FV[$dtStats::FC["TG"]++,"TG"] = "elfTurretKills"; $dtStats::FV[$dtStats::FC["TG"]++,"TG"] = "elfTurretDeaths"; $dtStats::FV[$dtStats::FC["TG"]++,"TG"] = "mortarTurretKills"; @@ -628,8 +656,8 @@ $dtStats::FV[$dtStats::FC["TG"]++,"TG"] = "forceFieldPowerUpKills"; $dtStats::FV[$dtStats::FC["TG"]++,"TG"] = "forceFieldPowerUpDeaths"; $dtStats::FV[$dtStats::FC["TG"]++,"TG"] = "crashKills"; $dtStats::FV[$dtStats::FC["TG"]++,"TG"] = "crashDeaths"; -$dtStats::FV[$dtStats::FC["TG"]++,"TG"] = "nexusCampingKills"; -$dtStats::FV[$dtStats::FC["TG"]++,"TG"] = "nexusCampingDeaths"; +//$dtStats::FV[$dtStats::FC["TG"]++,"TG"] = "nexusCampingKills"; +//$dtStats::FV[$dtStats::FC["TG"]++,"TG"] = "nexusCampingDeaths"; //Damage Stats $dtStats::FV[$dtStats::FC["TG"]++,"TG"] = "cgDmg"; @@ -664,7 +692,6 @@ $dtStats::FV[$dtStats::FC["TG"]++,"TG"] = "satchelShotsFired"; $dtStats::FV[$dtStats::FC["TG"]++,"TG"] = "cgHits"; $dtStats::FV[$dtStats::FC["TG"]++,"TG"] = "laserHits"; $dtStats::FV[$dtStats::FC["TG"]++,"TG"] = "blasterHits"; -//$dtStats::FV[$dtStats::FC["TG"]++,"TG"] = "elfHits"; $dtStats::FV[$dtStats::FC["TG"]++,"TG"] = "discHits"; $dtStats::FV[$dtStats::FC["TG"]++,"TG"] = "grenadeHits"; $dtStats::FV[$dtStats::FC["TG"]++,"TG"] = "hGrenadeHits"; @@ -674,6 +701,7 @@ $dtStats::FV[$dtStats::FC["TG"]++,"TG"] = "plasmaHits"; $dtStats::FV[$dtStats::FC["TG"]++,"TG"] = "shockHits"; $dtStats::FV[$dtStats::FC["TG"]++,"TG"] = "mineHits"; $dtStats::FV[$dtStats::FC["TG"]++,"TG"] = "satchelHits"; + //aoe hits $dtStats::FV[$dtStats::FC["TG"]++,"TG"] = "plasmaDmgHits"; $dtStats::FV[$dtStats::FC["TG"]++,"TG"] = "discDmgHits"; @@ -715,6 +743,7 @@ $dtStats::FV[$dtStats::FC["TG"]++,"TG"] = "EVKills"; $dtStats::FV[$dtStats::FC["TG"]++,"TG"] = "EVDeaths"; $dtStats::FV[$dtStats::FC["TG"]++,"TG"] = "lightningMAkills"; $dtStats::FV[$dtStats::FC["TG"]++,"TG"] = "lightningMAHits"; +$dtStats::FV[$dtStats::FC["TG"]++,"TG"] = "lightningMAEVHits"; $dtStats::FV[$dtStats::FC["TG"]++,"TG"] = "lightningMAEVKills"; $dtStats::FV[$dtStats::FC["TG"]++,"TG"] = "EVHitWep"; $dtStats::FV[$dtStats::FC["TG"]++,"TG"] = "EVMAHit"; @@ -827,7 +856,7 @@ $dtStats::FV[$dtStats::FC["TG"]++,"TG"] = "shockCom"; $dtStats::FV[$dtStats::FC["TG"]++,"TG"] = "satchelCom"; //source kill velocity - note no mine -$dtStats::FV[$dtStats::FC["Max"]++,"Max"] ="cgKillSV"; +$dtStats::FV[$dtStats::FC["Max"]++,"Max"] = "cgKillSV"; $dtStats::FV[$dtStats::FC["Max"]++,"Max"] = "discKillSV"; $dtStats::FV[$dtStats::FC["Max"]++,"Max"] = "grenadeKillSV"; $dtStats::FV[$dtStats::FC["Max"]++,"Max"] = "laserKillSV"; @@ -839,7 +868,7 @@ $dtStats::FV[$dtStats::FC["Max"]++,"Max"] = "hGrenadeKillSV"; $dtStats::FV[$dtStats::FC["Max"]++,"Max"] = "missileKillSV"; //source hit velocity - note no mine -$dtStats::FV[$dtStats::FC["Max"]++,"Max"] ="cgHitSV"; +$dtStats::FV[$dtStats::FC["Max"]++,"Max"] = "cgHitSV"; $dtStats::FV[$dtStats::FC["Max"]++,"Max"] = "discHitSV"; $dtStats::FV[$dtStats::FC["Max"]++,"Max"] = "grenadeHitSV"; $dtStats::FV[$dtStats::FC["Max"]++,"Max"] = "laserHitSV"; @@ -851,7 +880,7 @@ $dtStats::FV[$dtStats::FC["Max"]++,"Max"] = "hGrenadeHitSV"; $dtStats::FV[$dtStats::FC["Max"]++,"Max"] = "missileHitSV"; //victim velocity -$dtStats::FV[$dtStats::FC["Max"]++,"Max"] ="cgKillVV"; +$dtStats::FV[$dtStats::FC["Max"]++,"Max"] = "cgKillVV"; $dtStats::FV[$dtStats::FC["Max"]++,"Max"] = "discKillVV"; $dtStats::FV[$dtStats::FC["Max"]++,"Max"] = "grenadeKillVV"; $dtStats::FV[$dtStats::FC["Max"]++,"Max"] = "laserKillVV"; @@ -900,17 +929,17 @@ $dtStats::FV[$dtStats::FC["TG"]++,"TG"] = "discAoeMA"; $dtStats::FV[$dtStats::FC["TG"]++,"TG"] = "plasmaAoeMA"; //ma dist -$dtStats::FV[$dtStats::FC["Max"]++,"Max"] = "cgMADist"; -$dtStats::FV[$dtStats::FC["Max"]++,"Max"] = "discMADist"; -$dtStats::FV[$dtStats::FC["Max"]++,"Max"] = "grenadeMADist"; -$dtStats::FV[$dtStats::FC["Max"]++,"Max"] = "laserMADist"; -$dtStats::FV[$dtStats::FC["Max"]++,"Max"] = "mortarMADist"; -$dtStats::FV[$dtStats::FC["Max"]++,"Max"] = "shockMADist"; -$dtStats::FV[$dtStats::FC["Max"]++,"Max"] = "plasmaMADist"; -$dtStats::FV[$dtStats::FC["Max"]++,"Max"] = "blasterMADist"; -$dtStats::FV[$dtStats::FC["Max"]++,"Max"] = "hGrenadeMADist"; -$dtStats::FV[$dtStats::FC["Max"]++,"Max"] = "missileMADist"; -$dtStats::FV[$dtStats::FC["Max"]++,"Max"] = "mineMADist"; +$dtStats::FV[$dtStats::FC["Max"]++,"Max"] = "cgMAHitDist"; +$dtStats::FV[$dtStats::FC["Max"]++,"Max"] = "discMAHitDist"; +$dtStats::FV[$dtStats::FC["Max"]++,"Max"] = "grenadeMAHitDist"; +$dtStats::FV[$dtStats::FC["Max"]++,"Max"] = "laserMAHitDist"; +$dtStats::FV[$dtStats::FC["Max"]++,"Max"] = "mortarMAHitDist"; +$dtStats::FV[$dtStats::FC["Max"]++,"Max"] = "shockMAHitDist"; +$dtStats::FV[$dtStats::FC["Max"]++,"Max"] = "plasmaMAHitDist"; +$dtStats::FV[$dtStats::FC["Max"]++,"Max"] = "blasterMAHitDist"; +$dtStats::FV[$dtStats::FC["Max"]++,"Max"] = "hGrenadeMAHitDist"; +$dtStats::FV[$dtStats::FC["Max"]++,"Max"] = "missileMAHitDist"; +$dtStats::FV[$dtStats::FC["Max"]++,"Max"] = "mineMAHitDist"; $dtStats::FV[$dtStats::FC["Max"]++,"Max"] = "cgHitDist"; @@ -1183,20 +1212,15 @@ $dtStats::FV[$dtStats::FC["TG"]++,"TG"] = "null";//rng number //Unused vars that are not tracked but used for other things $dtStats::unused[$dtStats::unusedCount++] = "timeToLive"; -$dtStats::unused[$dtStats::unusedCount++] = "at"; -$dtStats::unused[$dtStats::unusedCount++] = "gt"; +$dtStats::unused[$dtStats::unusedCount++] = "ksCounter"; //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //MapStats Vars //////////////////////////////////////////////////////////////////////////////// //NOTE DO NOT RECOUNT!!!!// NOTE DO NOT RECOUNT!!!!// NOTE DO NOT RECOUNT!!!! -//108 stats per game type is a hard limit, change at yor own risk - -//If you need to remove a stat its best to leave a gap in the numbers or replace it -//If you need to replace a stat simply rename the stat you want remvoed with the new stat do not change array numbers -//If you want to add a new stat just add it at the end of the list and increasing the index number by 1 from the last one -//If you do need to recount for whatever reason, it best to do it at the start of a month as recounting will zero out stats that were not in the same postion as last time +//100 stats per game type is a soft limit, change at yor own risk +//If you need to remove a stat its best to leave a gap in the array index or replace it with something new //1 $mapStats::mapVars[1,"CTFGame"] = "scoreTG";//note this starts at 1 for... reasions @@ -1264,7 +1288,7 @@ $mapStats::mapVars[47,"CTFGame"] = "hGrenadeKillsTG"; $mapStats::mapVars[48,"CTFGame"] = "satchelKillsTG"; //16 $mapStats::mapVars[49,"CTFGame"] = "discHitDistMax"; -$mapStats::mapVars[50,"CTFGame"] = "discMADistMAx"; +$mapStats::mapVars[50,"CTFGame"] = "discMAHitDistMax"; $mapStats::mapVars[51,"CTFGame"] = "totalTimeTG"; //17 $mapStats::mapVars[52,"CTFGame"] = "InventoryDepTG"; @@ -1282,6 +1306,7 @@ $mapStats::mapVars[60,"CTFGame"] = "distMovTG"; $mapStats::mapVars[61,"CTFGame"] = "repairpackpickupCountTG"; $mapStats::mapVars[62,"CTFGame"] = "repairpackpickupEnemyTG"; $mapStats::mapVars[63,"CTFGame"] = "invyEatRepairPackTG"; + $mapStats::mapVarCount["CTFGame"] = 63; //////////////////////////////////////////////////////////////////////////////// //1 @@ -1818,7 +1843,6 @@ package dtStats{ $mapID::gameID = addNum($mapID::gameID,1); if($dtStats::debugEchos) error("GAME ID" SPC $mapID::gameID SPC "//////////////////////////////"); - export( "$mapID::*", "serverStats/mapIDList.cs", false ); } } function DefaultGame::forceObserver( %game, %client, %reason ){ @@ -1955,7 +1979,7 @@ package dtStats{ %clAttacker.dmgdFlagTime = getSimTime(); } function CTFGame::testEscortAssist(%game, %victimID, %killerID){ - if((getSimTime() - %victimID.dmgdFlagTime) < %game.TIME_CONSIDERED_FLAGCARRIER_THREAT && %killerID.player.holdingFlag $= "") + if((getSimTime() - %victimID.dmgdFlagTime) < 5000 && %killerID.player.holdingFlag $= "") return true; return false; } @@ -1965,7 +1989,7 @@ package dtStats{ %clAttacker.dmgdFlagTime = getSimTime(); } function SCtFGame::testEscortAssist(%game, %victimID, %killerID){ - if((getSimTime() - %victimID.dmgdFlagTime) < %game.TIME_CONSIDERED_FLAGCARRIER_THREAT && %killerID.player.holdingFlag $= "") + if((getSimTime() - %victimID.dmgdFlagTime) < 5000 && %killerID.player.holdingFlag $= "") return true; return false; } @@ -2235,8 +2259,12 @@ package dtStatsGame{ if(!%player.flagStatsWait){ %grabspeed = mFloor(VectorLen(setWord(%player.getVelocity(), 2, 0)) * 3.6); if(%grabSpeed > %player.client.dtStats.grabSpeed){ - if($TeamRank[2,"count"] > 5 && $TeamRank[1,"count"] > 5) + if($TeamRank[2,"count"] > 5 && $TeamRank[1,"count"] > 5){ %player.client.dtStats.grabSpeed = %grabSpeed; + %player.client.dtStats.grabSpeedLow = %grabSpeed; + } + else + %player.client.dtStats.grabSpeedLow = %grabSpeed; } } } @@ -2248,8 +2276,12 @@ package dtStatsGame{ if(%game.dtTotalFlagTime[%flag]){ %heldTime = (getSimTime() - %game.dtTotalFlagTime[%flag])/1000; if(%heldTime < %player.client.dtStats.heldTimeSec || !%player.client.dtStats.heldTimeSec){ - if($TeamRank[2,"count"] > 5 && $TeamRank[1,"count"] > 5) + if($TeamRank[2,"count"] > 5 && $TeamRank[1,"count"] > 5){ %player.client.dtStats.heldTimeSec = %heldTime; + %player.client.dtStats.heldTimeLow = %heldTime; + } + else + %player.client.dtStats.heldTimeLow = %heldTime; } } } @@ -2415,22 +2447,7 @@ function dtGameLink(%game, %client, %arg1, %arg2, %arg3, %arg4, %arg5){ } } } -function tsPlayerCountTeam( %teamindex ) -{ - %count = 0; - %lim = ClientGroup.getCount(); - - for ( %i = 0; %i < %lim; %i++ ) - { - %client = ClientGroup.getObject( %i ); - - if ( %client.team == %teamindex ) - %count++; - } - - return %count; -} function ArenaHud(%game, %client, %tag){ if(%client.viewStats && $dtStats::enableRefresh){ statsMenu(%client, %game.class); @@ -2462,8 +2479,7 @@ function ArenaHud(%game, %client, %tag){ { // Send team name - %teamPlayerCount = tsPlayerCountTeam( %iTeam ); - %teamPlayerCountPlural = %teamPlayerCount == 1 ? "" : "s"; + %teamPlayerCountPlural = $TeamRank[%iTeam,count] == 1 ? "" : "s"; messageClient( %client, 'SetLineHud', "", %tag, %index++, '\t%1 (%2) %3 Player%4', %game.getTeamName(%iTeam), $TeamScore[%iTeam], %teamPlayerCount, %teamPlayerCountPlural ); messageClient( %client, 'SetLineHud', "", %tag, %index++, ""); @@ -3611,7 +3627,6 @@ function CTFHud(%game, %client, %tag){// defaultGame/evo %obsTimeStr = %game.formatTime(%obsTime, false); if(%client.isAdmin ||%client.isSuperAdmin || !$dtStats::viewSelf){ messageClient(%client, 'SetLineHud', "", %tag, %index, '\t+ %1%2', %cl.name, %obsTimeStr,%cl); - } else if(%cl == %client){ messageClient(%client, 'SetLineHud', "", %tag, %index, '\t+ %1%2', %cl.name, %obsTimeStr,%cl); @@ -3645,11 +3660,12 @@ function dtStatsMissionDropReady(%game, %client){ // called when client has fini %name = stripChars( detag( getTaggedString( %client.name ) ), "\cp\co\c6\c7\c8\c9" ); %crash = 0; - if(clientCrash(%name) && !$dtStats::cs[%client]){ - $dtStats::cs[%client] = 1; - $dtServer::clientCrash[cleanMapName($CurrentMission),%game.class]++; - $dtServer::clientCrashCount++; - %crash = 1; + if(clientCrash(%name)){// && !$dtStats::cs[%client] + error("Client Crash" SPC %name); + //$dtStats::cs[%client] = 1; + //$dtServer::clientCrash[cleanMapName($CurrentMission),%game.class]++; + //$dtServer::clientCrashCount++; + //%crash = 1; } if(!isObject(%client.dtStats)){ @@ -3807,8 +3823,8 @@ function DefaultGame::postGameStats(%game,%dtStats){ //stats to add up at the en %dtStats.shockScore = %dtStats.shockKill + %dtStats.shockMA + %dtStats.shockKillAir + (%dtStats.shockKillDist/2) + %dtStats.shockCom + %dtStats.shockRearShot; %dtStats.plasmaScore = %dtStats.plasmaKill + %dtStats.plasmaMA + %dtStats.plasmaKillAir + (%dtStats.plasmaKillDist/50) + %dtStats.plasmaCom; %dtStats.blasterScore = %dtStats.blasterKill + %dtStats.blasterMA + %dtStats.blasterKillAir + (%dtStats.blasterKillDist/50) + %dtStats.blasterCom; - %dtStats.mineScore = %dtStats.mineKill + %dtStats.mineMA + %dtStats.mineKillAir + (%dtStats.mineKillDist/20) + %dtStats.mineCom; - %dtStats.satchelScore = %dtStats.satchelKill + %dtStats.satchelMA + %dtStats.satchelKillAir + (%dtStats.satchelKillDist/20) + %dtStats.satchelCom; + %dtStats.mineScore = %dtStats.mineKill + %dtStats.mineMA + %dtStats.mineKillAir + %dtStats.mineCom; + %dtStats.satchelScore = %dtStats.satchelKill + %dtStats.satchelMA + %dtStats.satchelKillAir + %dtStats.satchelCom; %dtStats.weaponScore = %dtStats.cgScore + %dtStats.discScore + @@ -4117,7 +4133,7 @@ function secToMinSec(%sec){ return(%min @ ":" @ %sec); } -function formatTime(%ms) +function dtFormatTime(%ms) { %sec = mFloor(%ms / 1000); %min = mFloor(%sec / 60); @@ -4170,13 +4186,14 @@ function getDynamicField(%obj,%field){ } function getCNameToCID(%name){ if(%name !$= ""){ - if(isObject(%name) && %name.getClassName() $= "GameConnection" || %name.getClassName() $= "AIConnection"){ - return %name; // not a name its a client so return it + if(isObject(%name)){ + if(%name.getClassName() $= "GameConnection" || %name.getClassName() $= "AIConnection") + return %name; // not a name its a client so return it } else{ for (%i = 0; %i < ClientGroup.getCount(); %i++){ %client = ClientGroup.getObject(%i); - if(getTaggedString(%client.name) $= %name){ + if(stripChars(getTaggedString( %client.name ), "\cp\co\c6\c7\c8\c9" ) $= %name){ return %client; } } @@ -4665,8 +4682,8 @@ function incGameStats(%dtStats,%game) {// record that games stats and inc by one } case "Min": %val = getDynamicField(%dtStats,%varName); - setValueField(%dtStats,%varNameType,"g",%game,%c,%val); + %varID = $mapStats::mapVarIndex[%varNameType,%game]; if(%varID > 0 && $dtStats::mapStats){ %varID -= 1; @@ -4686,6 +4703,7 @@ function incGameStats(%dtStats,%game) {// record that games stats and inc by one } case "Avg" or "AvgI": %val = getDynamicField(%dtStats,%varName); + setValueField(%dtStats,%varNameType,"g",%game,%c,%val); %varID = $mapStats::mapVarIndex[%varNameType,%game]; if(%varID > 0 && %val != 0 && $dtStats::mapStats){ %varID -= 1; @@ -4727,8 +4745,6 @@ function incGameStats(%dtStats,%game) {// record that games stats and inc by one %total = getField(%t,1); %gameCount = getField(%t,2); } - if(%x ==1) - setValueField(%dtStats,%varNameType,"g",%game,%c,%avg);// may not be needed setValueField(%dtStats,%varNameType,"t",%game,%x, hasValue(%avg) @ "%a" @ hasValue(%total) @ "%a" @ hasValue(%gameCount)); } } @@ -4742,6 +4758,20 @@ function cropDec(%num){ return %num @ "x"; else return getSubStr(%num,0,%dot) @ "x"; +} +function cropFloat(%num,%x){ + %length = strlen(%num); + %dot = strPos(%num,"."); + if(%dot != -1){ + %int =getSubStr(%num,0,%dot); + %decLen = %length - strLen(%int)-1; + %x = %decLen >= %x ? %x : %decLen; + error(%x); + %dec = getSubStr(%num,%dot,%dot+%x); + return %int @ %dec; + } + else + return %num; } function addNum(%a,%b){ if(strPos(%a,"x") == -1 && strPos(%b,"x") == -1){ @@ -4992,6 +5022,10 @@ function resetDtStats(%dtStats,%game,%slow){ schedule(32*%i,0,"resetChain",%game,%dtStats,%x,(%i * %amount)); } schedule(32*(%i+1),0,"resetChain",%game,%dtStats,(%x+%leftOver),(%i * %amount)); + for(%i = 1; %i <= $dtStats::unusedCount; %i++){//script unused + %var = $dtStats::unused[%i]; + setDynamicField(%dtStats,%var,0); + } } else{ for(%q = 0; %q < $statsVars::count[%game]; %q++){ @@ -5072,15 +5106,17 @@ function clientKillStats(%game,%clVictim, %clKiller, %damageType, %implement, %d %clVictim.lastHitBy = 0; } else if(!isObject(%clKiller) && isObject(%implement)){ - if(%damageType == $DamageType::IndoorDepTurret || %damageLocation == $DamageType::OutdoorDepTurret){ + if(%damageType == $DamageType::IndoorDepTurret || %damageType == $DamageType::OutdoorDepTurret){ %clKiller = %implement.owner; } else %clKiller = %implement.getControllingClient(); } - %clVictim.lastPlayer = %clVictim.player; %killerDT = %clKiller.dtStats; %victimDT = %clVictim.dtStats; + //fail safe in case package is out of order + %victimPlayer = isObject(%clVictim.player) ? %clVictim.player : %clVictim.lastPlayer; + %killerPlayer = isObject(%clKiller.player) ? %clKiller.player : %clKiller.lastPlayer; %clVictim.lp = "";//last position for distMove //------------------------------------------------------------------------------ %victimDT.timeToLive += getSimTime() - %clVictim.spawnTime; @@ -5090,27 +5126,23 @@ function clientKillStats(%game,%clVictim, %clKiller, %damageType, %implement, %d %killerDT.teamkillCount++; //------------------------------------------------------------------------------ if(%clKiller.team != %clVictim.team){ - if(isObject(%clKiller.player)) - %kPlayer = %clKiller.player; - else if(isObject(%clKiller.lastPlayer)) - %kPlayer = %clKiller.lastPlayer; - if(isObject(%clVictim.player) && isObject(%kPlayer) && %damageType != $DamageType::IndoorDepTurret && %damageLocation != $DamageType::OutdoorDepTurret){ + if(isObject(%victimPlayer) && isObject(%killerPlayer) && %damageType != $DamageType::IndoorDepTurret && %damageLocation != $DamageType::OutdoorDepTurret){ //------------------------------------------------------------------------------ - %clKiller.k++; %clVictim.k = 0; + %killerDT.ksCounter++; %victimDT.ksCounter = 0; if(%clVictim == %clKiller || %damageType == $DamageType::Suicide || %damageType == $DamageType::Lava || %damageType == $DamageType::OutOfBounds || %damageType == $DamageType::Ground || %damageType == $DamageType::Lightning){ - %clVictim.k = %clKiller.k = 0; + %victimDT.ksCounter = %killerDT.ksCounter = 0; } - if(%killerDT.killStreak < %clKiller.k){ - %killerDT.killStreak = %clKiller.k; + if(%killerDT.killStreak < %killerDT.ksCounter){ + %killerDT.killStreak = %killerDT.ksCounter; } //------------------------------------------------------------------------------ - if(%clVictim.player.hitBy[%clKiller]){ + if(%victimPlayer.hitBy[%clKiller]){ %killerDT.assist--; } //------------------------------------------------------------------------------ %isCombo = 0; - if(%kPlayer.combo[%clVictim.player] > 1){ + if(%killerPlayer.combo[%victimPlayer] > 1){ %killerDT.comboCount++; %isCombo =1; } @@ -5122,7 +5154,7 @@ function clientKillStats(%game,%clVictim, %clKiller, %damageType, %implement, %d //------------------------------------------------------------------------------ statsGroup.lastKill = %killerDT; //------------------------------------------------------------------------------ - if(%kPlayer.getState() $= "Dead"){ + if(%killerPlayer.getState() $= "Dead"){ %killerDT.deathKills++; } //------------------------------------------------------------------------------ @@ -5137,53 +5169,50 @@ function clientKillStats(%game,%clVictim, %clKiller, %damageType, %implement, %d }%clKiller.mKill = getSimTime(); //------------------------------------------------------------------------------ if(getSimTime() - %clKiller.mCKill < 10000){ - %clKiller.chainCount++; - if(!isEventPending(%clKiller.chainID)) - %clKiller.chainID = schedule(256,0,"chainKill",%clKiller,%killerDT); + if(%clKiller.chainCount++ > 1) + chainKill(%killerDT,%clKiller); } else{ - %clKiller.chainCount = 1; + %clKiller.chainCount = 1; }%clKiller.mCKill = getSimTime(); //------------------------------------------------------------------------------ - if(rayTest(%clVictim.player, $dtStats::midAirHeight)){%vcAir =1;}else{%vcAir =2;} - if(rayTest(%kPlayer, $dtStats::midAirHeight)){%kcAir =1;}else{%kcAir =2;} + if(rayTest(%victimPlayer, $dtStats::midAirHeight)){%vcAir =1;}else{%vcAir =2;} + if(rayTest(%killerPlayer, $dtStats::midAirHeight)){%kcAir =1;}else{%kcAir =2;} - switch$(%clVictim.player.getArmorSize()){ + switch$(%victimPlayer.getArmorSize()){ case "Light":%killerDT.armorL++; %victimDT.armorLD++; - switch$(%kPlayer.getArmorSize()){ + switch$(%killerPlayer.getArmorSize()){ case "Light": %killerDT.armorLL++; %victimDT.armorLLD++; case "Medium":%killerDT.armorML++; %victimDT.armorLMD++; case "Heavy": %killerDT.armorHL++; %victimDT.armorLHD++; } case "Medium": %killerDT.armorM++; %victimDT.armorMD++; - switch$(%kPlayer.getArmorSize()){ + switch$(%killerPlayer.getArmorSize()){ case "Light": %killerDT.armorLM++; %victimDT.armorMLD++; case "Medium":%killerDT.armorMM++; %victimDT.armorMMD++; case "Heavy": %killerDT.armorHM++; %victimDT.armorMHD++; } case "Heavy":%killerDT.armorH++; %victimDT.armorHD++; - switch$(%kPlayer.getArmorSize()){ + switch$(%killerPlayer.getArmorSize()){ case "Light": %killerDT.armorLH++; %victimDT.armorHLD++; case "Medium":%killerDT.armorMH++; %victimDT.armorHMD++; case "Heavy": %killerDT.armorHH++; %victimDT.armorHHD++; } } //------------------------------------------------------------------------------ - %dis = vectorDist(%kPlayer.getPosition(),%clVictim.player.getPosition()); - %vD = vectorSub(%clVictim.player.getVelocity(),%kPlayer.getVelocity()); - %rvel = mFloor(vectorLen(%vD) * 3.6); - %victimVel = mFloor(vectorLen(%clVictim.player.getVelocity()) * 3.6); + %dis = vectorDist(%killerPlayer.getPosition(),%victimPlayer.getPosition()); + %victimVel = mFloor(vectorLen(%victimPlayer.getVelocity()) * 3.6); } else{ %kcAir = %vcAir = 0; - %rvel = %dis = 0; + %dis = 0; } //------------------------------------------------------------------------------ - if(%clVictim.EVDamageType && %clVictim.EVDamageType != %damageType){ // they were hit by something befor they were killed + if(%clVictim.EVDamageType && %clVictim.EVDamageType != %damageType && (getSimTime() - %clVictim.EVDamagetime) < 10000){ // they were hit by something befor they were killed %killerDT.EVKillsWep++; %victimDT.EVDeathsWep++; - if(rayTest(%clVictim.player, $dtStats::midAirHeight)){ + if(rayTest(%victimPlayer, $dtStats::midAirHeight)){ if(%clVictim.EVDamageType == $DamageType::Lightning && (getSimTime() - %clVictim.EVDamagetime) < 3000){ %killerDT.lightningMAkills++; %clKiller.dtMessage("Lightning MidAir Kill","fx/misc/MA2.wav",1); @@ -5219,8 +5248,8 @@ function clientKillStats(%game,%clVictim, %clKiller, %damageType, %implement, %d if(%killerDT.discKillVV < %victimVel){%killerDT.discKillVV = %victimVel;} if(%killerDT.discKillSV < %clKiller.dtShotSpeed){%killerDT.discKillSV = %clKiller.dtShotSpeed;} if(%isCombo){%killerDT.discCom++;} - if(%clVictim.md == 1 && (getSimTime() - %clVictim.mdTime1) < 256){%killerDT.minePlusDiscKill++;} - + if((getSimTime() - %clKiller.mdHitTime) < 256){%killerDT.minePlusDiscKill++;} + if(%kcAir == 1 && %vcAir == 1){%killerDT.discKillAir++;%victimDT.discDeathAir++;%killerDT.discKillAirAir++;%victimDT.discDeathAirAir++;} else if(%kcAir == 2 && %vcAir == 1){%killerDT.discKillAir++;%victimDT.discDeathAir++;%killerDT.discKillGroundAir++;%victimDT.discDeathGroundAir++;} else if(%kcAir == 1 && %vcAir == 2){%killerDT.discKillGround++;%victimDT.discDeathGround++;%killerDT.discKillAirGround++;%victimDT.discDeathAirGround++;} @@ -5325,7 +5354,8 @@ function clientKillStats(%game,%clVictim, %clKiller, %damageType, %implement, %d if(%killerDT.mineKillDist < %dis){%killerDT.mineKillDist = %dis;} if(%killerDT.mineKillVV < %victimVel){%killerDT.mineKillVV = %victimVel;} if(%isCombo){%killerDT.mineCom++;} - if(%clVictim.md == 2 && (getSimTime() - %clVictim.mdTime2) < 256){%killerDT.minePlusDiscKill++;} + if((getSimTime() - %clKiller.mdHitTime) < 256){%killerDT.minePlusDiscKill++;} + if(%kcAir == 1 && %vcAir == 1){%killerDT.mineKillAir++;%victimDT.mineDeathAir++;%killerDT.mineKillAirAir++;%victimDT.mineDeathAirAir++;} else if(%kcAir == 2 && %vcAir == 1){%killerDT.mineKillAir++;%victimDT.mineDeathAir++;%killerDT.mineKillGroundAir++;%victimDT.mineDeathGroundAir++;} else if(%kcAir == 1 && %vcAir == 2){%killerDT.mineKillGround++;%victimDT.mineDeathGround++;%killerDT.mineKillAirGround++;%victimDT.mineDeathAirGround++;} @@ -5457,13 +5487,14 @@ function multiKillDelayer(%clKiller,%killerDT){ %killerDT.decupleKill++; default: if(%clKiller.mkCounter > 10) - %killerDT.nuclearKill++; + %killerDT.nuclearKill++; } %killerDT.multiKill++; %clKiller.mkCounter = 1; } -function chainKill(%clKiller,%killerDT){ +function chainKill(%killerDT,%clKiller){ + %killerDT.chainKill++; switch(%clKiller.chainCount){ case 2: %killerDT.doubleChainKill++; @@ -5475,20 +5506,15 @@ function chainKill(%clKiller,%killerDT){ %killerDT.quintupleChainKill++; case 6: %killerDT.sextupleChainKill++; - default: - if(%clKiller.chainCount > 6) - switch(%clKiller.chainCount){ - case 7: - %killerDT.septupleChainKill++; - case 8: - %killerDT.octupleChainKill++; - case 9: - %killerDT.nonupleChainKill++; - case 10: - %killerDT.decupleChainKill++; - } + case 7: + %killerDT.septupleChainKill++; + case 8: + %killerDT.octupleChainKill++; + case 9: + %killerDT.nonupleChainKill++; + case 10: + %killerDT.decupleChainKill++; } - %killerDT.chainKill++; } function GameConnection::dtMessage(%this,%message,%sfx,%bypass){ if(!%this.isAIControlled()){ @@ -5508,21 +5534,28 @@ function GameConnection::dtMessage(%this,%message,%sfx,%bypass){ } function rayTest(%targetObject,%dis){ - %mask = $TypeMasks::StaticShapeObjectType | $TypeMasks::InteriorObjectType | $TypeMasks::TerrainObjectType; - %rayStart = %targetObject.getWorldBoxCenter(); - %rayEnd = VectorAdd(%rayStart,"0 0" SPC ((%dis+1.15) * -1)); - %ground = !ContainerRayCast(%rayStart, %rayEnd, %mask, %targetObject); - return %ground; + if(isObject(%targetObject)){ + %mask = $TypeMasks::StaticShapeObjectType | $TypeMasks::InteriorObjectType | $TypeMasks::TerrainObjectType; + %rayStart = %targetObject.getWorldBoxCenter(); + %rayEnd = VectorAdd(%rayStart,"0 0" SPC ((%dis+1.15) * -1)); + %ground = !ContainerRayCast(%rayStart, %rayEnd, %mask, %targetObject); + return %ground; + } + else + return 0; } function rayTestDis(%targetObject){ - %mask = $TypeMasks::StaticShapeObjectType | $TypeMasks::InteriorObjectType | $TypeMasks::TerrainObjectType; - %rayStart = %targetObject.getWorldBoxCenter(); - %rayEnd = VectorAdd(%rayStart,"0 0" SPC -5000); - %ray = ContainerRayCast(%rayStart, %rayEnd, %mask, %targetObject); - if(!%ray) + if(isObject(%targetObject)){ + %mask = $TypeMasks::StaticShapeObjectType | $TypeMasks::InteriorObjectType | $TypeMasks::TerrainObjectType; + %rayStart = %targetObject.getWorldBoxCenter(); + %rayEnd = VectorAdd(%rayStart,"0 0" SPC -5000); + %ray = ContainerRayCast(%rayStart, %rayEnd, %mask, %targetObject); + if(!%ray) + return 0; + return vectorDist(%rayStart,getWords(%ray,1,3)) - 1.15; + } + else return 0; - %dis = vectorDist(%rayStart,getWords(%ray,1,3)) - 1.15; - return %dis; } function vectorRayCast(%startPos,%vec,%dis){ %mask = $TypeMasks::StaticShapeObjectType | $TypeMasks::InteriorObjectType | $TypeMasks::TerrainObjectType | $TypeMasks::PlayerObjectType; @@ -5551,9 +5584,9 @@ function testHit(%client){ %ray = containerRayCast(%ePos, VectorAdd(%ePos, VectorScale(VectorNormalize(%vec), 5)), %mask, -1); if(%ray){ %dmgType = %data.radiusDamageType; - //error(%dmgType); + //error(%dmgType); return 1; - } + } } } return 0; @@ -5563,40 +5596,48 @@ function clientDmgStats(%data,%position,%sourceObject, %targetObject, %damageTyp %damageType == $DamageType::OutOfBounds || %damageType == $DamageType::Lava || %damageType == $DamageType::VehicleSpawn || %damageType == $DamageType::ForceFieldPowerup || %damageType == $DamageType::Lightning || %damageType == $DamageType::NexusCamping){ - if(isObject(%targetObject)){ - %targetObject.client.EVDamageType = %damageType; - %targetObject.client.EVDamagetime = getSimTime(); - } - return; - } + if(isObject(%targetObject)){ + %targetObject.client.EVDamageType = %damageType; + %targetObject.client.EVDamagetime = getSimTime(); + } + if(getSimTime() - %targetClient.lastHitTime < 5000){ + %sourceClient = %targetClient.lastHitBy; + if(rayTest(%targetObject, $dtStats::midAirHeight) && %damageType == $DamageType::Lightning) + %sourceClient.dtStats.lightningMAEVHits++; + else + %sourceDT.EVMAHit++; + } + return; + } //------------------------------------------------------------------------------ if(%amount > 0 && %damageType > 0){ if(isObject(%sourceObject)){ %sourceClass = %sourceObject.getClassName(); if(%sourceClass $= "Player"){ %sourceClient = %sourceObject.client; + %sourceClient.lastPlayer = %sourceClient.player; %sourceDT = %sourceClient.dtStats; - %aoeHIT = testHit(%sourceClient); + %directHit = testHit(%sourceClient); %sv = mFloor(vectorLen(%sourceObject.getVelocity()) * 3.6); } else if(%sourceClass $= "Turret" || %sourceClass $= "FlyingVehicle" || %sourceClass $= "HoverVehicle" || %sourceClass $= "WheeledVehicle"){ %sourceClient = %sourceObject.getControllingClient(); %sourceDT = %sourceClient.dtStats; - %aoeHIT = 0; + %directHit = 0; } else{ - %aoeHIT = 0; + %directHit = 0; } } if(isObject(%targetObject)){ %targetClass = %targetObject.getClassName(); if(%targetClass $= "Player"){ %targetClient = %targetObject.client; + %targetClient.lastPlayer = %targetClient.player;//used for when some how client kill is out of order %targetDT = %targetClient.dtStats; %vv = mFloor(vectorLen(%targetObject.getVelocity()) * 3.6); if(%sourceClass $= "Player" && %targetClient.team != %sourceClient.team && %sourceObject != %targetObject){ %dis = vectorDist(%targetObject.getPosition(),%sourceObject.getPosition()); - %targetObject.dtPlayer = %targetObject.player; if(!%targetObject.combo[%sourceClient,%damageType]){ %targetObject.combo[%sourceClient,%damageType] = 1; %sourceClient.player.combo[%targetObject]++; @@ -5610,12 +5651,12 @@ function clientDmgStats(%data,%position,%sourceObject, %targetObject, %damageTyp %targetClient.lastHitBy = %sourceClient; %targetClient.lastHitTime = getSimTime(); - if(%targetClient.EVDamageType && %targetClient.EVDamageType != %damageType){ // they were hit by something befor they were killed + if(%targetClient.EVDamageType && %targetClient.EVDamageType != %damageType && (getSimTime() - %targetClient.EVDamagetime) < 3000){ // they were hit by something befor they were killed %sourceDT.EVHitWep++; - if(rayTest(%targetClient.player, $dtStats::midAirHeight) && %damageType != $DamageType::Bullet){ - if(%targetClient.EVDamageType == $DamageType::Lightning && (getSimTime() - %targetClient.EVDamagetime) < 3000){ + if(rayTest(%targetObject, $dtStats::midAirHeight) && %damageType != $DamageType::Bullet){ + if(%targetClient.EVDamageType == $DamageType::Lightning){ %sourceDT.lightningMAHits++; - %sourceClient.dtMessage("Lightning MidAir Hit","fx/Bonuses/down_perppass3_bunnybump.wav",0); + //%sourceClient.dtMessage("Lightning MidAir Hit","fx/Bonuses/down_perppass3_bunnybump.wav",0); } else %sourceDT.EVMAHit++; @@ -5649,7 +5690,7 @@ function clientDmgStats(%data,%position,%sourceObject, %targetObject, %damageTyp case "left_middle":%sourceDT.hitHeadLeft++; %targetDT.hitTakenHeadLeft++; } } - %rayTest = rayTestDis(%targetObject); + %rayTest = rayTestDis(%targetObject); if(%rayTest >= $dtStats::midAirHeight && %damageType != $DamageType::Bullet){ if(%sourceDT.maHitDist < %dis){%sourceDT.maHitDist = %dis;} if(%sourceDT.maHitHeight < %rayTest){%sourceDT.maHitHeight = %rayTest;} @@ -5667,22 +5708,22 @@ function clientDmgStats(%data,%position,%sourceObject, %targetObject, %damageTyp if(%sourceDT.blasterHitDist < %dis){%sourceDT.blasterHitDist = %dis;} if(%sourceDT.weaponHitDist < %dis){%sourceDT.weaponHitDist = %dis;} if(%rayTest >= $dtStats::midAirHeight){ - if(%sourceDT.blasterMADist < %dis){%sourceDT.blasterMADist = %dis;} + if(%sourceDT.blasterMAHitDist < %dis){%sourceDT.blasterMAHitDist = %dis;} %sourceDT.blasterMA++; } if(%sourceDT.blasterHitSV < %sourceObject.client.dtShotSpeed){%sourceDT.blasterHitSV = %sourceObject.client.dtShotSpeed;} if(%sourceDT.blasterHitVV < %vv){%sourceDT.blasterHitVV = %vv;} case $DamageType::Plasma: %sourceDT.plasmaDmg += %amount; - if(%aoeHIT){%sourceDT.plasmaHits++;%sourceDT.plasmaDmgHits++;} + if(%directHit){%sourceDT.plasmaHits++;%sourceDT.plasmaDmgHits++;} else{%sourceDT.plasmaDmgHits++;} %sourceDT.plasmaACC = (%sourceDT.plasmaHits / (%sourceDT.plasmaShotsFired ? %sourceDT.plasmaShotsFired : 1)) * 100; %sourceDT.plasmaDmgACC = (%sourceDT.plasmaDmgHits / (%sourceDT.plasmaShotsFired ? %sourceDT.plasmaShotsFired : 1)) * 100; if(%sourceDT.plasmaHitDist < %dis){%sourceDT.plasmaHitDist = %dis;} if(%sourceDT.weaponHitDist < %dis){%sourceDT.weaponHitDist = %dis;} if(%rayTest >= $dtStats::midAirHeight){ - if(%sourceDT.plasmaMADist < %dis){%sourceDT.plasmaMADist = %dis;} - if(%aoeHIT){ + if(%sourceDT.plasmaMAHitDist < %dis){%sourceDT.plasmaMAHitDist = %dis;} + if(%directHit){ %sourceDT.plasmaMA++; %sourceDT.plasmaAoeMA++; } @@ -5699,25 +5740,25 @@ function clientDmgStats(%data,%position,%sourceObject, %targetObject, %damageTyp if(%sourceDT.cgHitDist < %dis){%sourceDT.cgHitDist = %dis;} if(%sourceDT.weaponHitDist < %dis){%sourceDT.weaponHitDist = %dis;} if(%rayTest >= $dtStats::midAirHeight){ - if(%sourceDT.cgMADist < %dis){%sourceDT.cgMADist = %dis;} + if(%sourceDT.cgMAHitDist < %dis){%sourceDT.cgMAHitDist = %dis;} %sourceDT.cgMA++; } if(%sourceDT.cgHitSV < %sourceObject.client.dtShotSpeed){%sourceDT.cgHitSV = %sourceObject.client.dtShotSpeed;} if(%sourceDT.cgHitVV < %vv){%sourceDT.cgHitVV = %vv;} case $DamageType::Disc: %sourceDT.discDmg += %amount; - if(%aoeHIT){%sourceDT.discHits++;%sourceDT.discDmgHits++;} + if(%directHit){%sourceDT.discHits++;%sourceDT.discDmgHits++;} else{%sourceDT.discDmgHits++;} %sourceDT.discACC = (%sourceDT.discHits / (%sourceDT.discShotsFired ? %sourceDT.discShotsFired : 1)) * 100; %sourceDT.discDmgACC = (%sourceDT.discDmgHits / (%sourceDT.discShotsFired ? %sourceDT.discShotsFired : 1)) * 100; if(%sourceDT.discHitDist < %dis){%sourceDT.discHitDist = %dis;} if(%sourceDT.weaponHitDist < %dis){%sourceDT.weaponHitDist = %dis;} - if(%targetClient.md == 1 && (getSimTime() - %targetClient.mdTime1) < 256){%sourceDT.minePlusDisc++;} - %targetClient.md = 2; + %targetClient.mdHit = 0; + if((getSimTime() - %targetClient.mdTime1) < 256){%sourceDT.minePlusDisc++; %targetClient.mdHit = 1;} %targetClient.mdTime2 = getSimTime(); if(%rayTest >= $dtStats::midAirHeight){ - if(%sourceDT.discMADist < %dis){%sourceDT.discMADist = %dis;} - if(%aoeHIT){ + if(%sourceDT.discMAHitDist < %dis){%sourceDT.discMAHitDist = %dis;} + if(%directHit){ %sourceDT.discMA++; %sourceDT.discAoeMA++; } @@ -5734,7 +5775,7 @@ function clientDmgStats(%data,%position,%sourceObject, %targetObject, %damageTyp if(%sourceDT.hGrenadeHitDist < %dis){%sourceDT.hGrenadeHitDist = %dis;} if(%sourceDT.weaponHitDist < %dis){%sourceDT.weaponHitDist = %dis;} if(%rayTest >= $dtStats::midAirHeight){ - if(%sourceDT.hGrenadeMADist < %dis){%sourceDT.hGrenadeMADist = %dis;} + if(%sourceDT.hGrenadeMAHitDist < %dis){%sourceDT.hGrenadeMAHitDist = %dis;} %sourceDT.hGrenadeMA++; } if(%sourceDT.hGrenadeHitSV < %sourceObject.client.dtShotSpeed){%sourceDT.hGrenadeHitSV = %sourceObject.client.dtShotSpeed;} @@ -5742,14 +5783,14 @@ function clientDmgStats(%data,%position,%sourceObject, %targetObject, %damageTyp } else{ %sourceDT.grenadeDmg += %amount; - if(%aoeHIT){%sourceDT.grenadeHits++;%sourceDT.grenadeDmgHits++;} + if(%directHit){%sourceDT.grenadeHits++;%sourceDT.grenadeDmgHits++;} else{%sourceDT.grenadeDmgHits++;} %sourceDT.grenadeACC = (%sourceDT.grenadeHits / (%sourceDT.grenadeShotsFired ? %sourceDT.grenadeShotsFired : 1)) * 100; %sourceDT.grenadeDmgACC = (%sourceDT.grenadeDmgHits / (%sourceDT.grenadeShotsFired ? %sourceDT.grenadeShotsFired : 1)) * 100; if(%sourceDT.grenadeHitDist < %dis){%sourceDT.grenadeHitDist = %dis;} if(%rayTest >= $dtStats::midAirHeight){ - if(%sourceDT.grenadeMADist < %dis){%sourceDT.grenadeMADist = %dis;} - if(%aoeHIT){ + if(%sourceDT.grenadeMAHitDist < %dis){%sourceDT.grenadeMAHitDist = %dis;} + if(%directHit){ %sourceDT.grenadeMA++; %sourceDT.grenadeAoeMA++; } @@ -5772,22 +5813,22 @@ function clientDmgStats(%data,%position,%sourceObject, %targetObject, %damageTyp if(%sourceDT.laserHitDist < %dis){%sourceDT.laserHitDist = %dis;} if(%sourceDT.weaponHitDist < %dis){%sourceDT.weaponHitDist = %dis;} if(%rayTest >= $dtStats::midAirHeight){ - if(%sourceDT.laserMADist < %dis){%sourceDT.laserMADist = %dis;} + if(%sourceDT.laserMAHitDist < %dis){%sourceDT.laserMAHitDist = %dis;} %sourceDT.laserMA++; } if(%sourceDT.laserHitSV < %sourceObject.client.dtShotSpeed){%sourceDT.laserHitSV = %sourceObject.client.dtShotSpeed;} if(%sourceDT.laserHitVV < %vv){%sourceDT.laserHitVV = %vv;} case $DamageType::Mortar: %sourceDT.mortarDmg += %amount; - if(%aoeHIT){%sourceDT.mortarHits++;%sourceDT.mortarDmgHits++;} + if(%directHit){%sourceDT.mortarHits++;%sourceDT.mortarDmgHits++;} else{%sourceDT.mortarDmgHits++;} %sourceDT.mortarACC = (%sourceDT.mortarHits / (%sourceDT.mortarShotsFired ? %sourceDT.mortarShotsFired : 1)) * 100; %sourceDT.mortarDmgACC = (%sourceDT.mortarDmgHits / (%sourceDT.mortarShotsFired ? %sourceDT.mortarShotsFired : 1)) * 100; if(%sourceDT.mortarHitDist < %dis){%sourceDT.mortarHitDist = %dis;} if(%sourceDT.weaponHitDist < %dis){%sourceDT.weaponHitDist = %dis;} if(%rayTest >= $dtStats::midAirHeight){ - if(%sourceDT.mortarMADist < %dis){%sourceDT.mortarMADist = %dis;} - if(%aoeHIT){ + if(%sourceDT.mortarMAHitDist < %dis){%sourceDT.mortarMAHitDist = %dis;} + if(%directHit){ %sourceDT.mortarMA++; %sourceDT.mortarAoeMA++; } @@ -5803,7 +5844,7 @@ function clientDmgStats(%data,%position,%sourceObject, %targetObject, %damageTyp if(%sourceDT.missileHitDist < %dis){%sourceDT.missileHitDist = %dis;} if(%sourceDT.weaponHitDist < %dis){%sourceDT.weaponHitDist = %dis;} if(%rayTest >= $dtStats::midAirHeight){ - if(%sourceDT.missileMADist < %dis){%sourceDT.missileMADist = %dis;} + if(%sourceDT.missileMAHitDist < %dis){%sourceDT.missileMAHitDist = %dis;} %sourceDT.missileMA++; } if(%sourceDT.missileHitSV < %sourceObject.client.dtShotSpeed){%sourceDT.missileHitSV = %sourceObject.client.dtShotSpeed;} @@ -5818,7 +5859,7 @@ function clientDmgStats(%data,%position,%sourceObject, %targetObject, %damageTyp if(%sourceDT.shockHitDist < %dis){%sourceDT.shockHitDist = %dis;} if(%sourceDT.weaponHitDist < %dis){%sourceDT.weaponHitDist = %dis;} if(%rayTest >= $dtStats::midAirHeight){ - if(%sourceDT.shockMADist < %dis){%sourceDT.shockMADist = %dis;} + if(%sourceDT.shockMAHitDist < %dis){%sourceDT.shockMAHitDist = %dis;} %sourceDT.shockMA++; } if(%sourceDT.shockHitSV < %sourceObject.client.dtShotSpeed){%sourceDT.shockHitSV = %sourceObject.client.dtShotSpeed;} @@ -5828,11 +5869,11 @@ function clientDmgStats(%data,%position,%sourceObject, %targetObject, %damageTyp %sourceDT.mineHits++; %sourceDT.mineACC = (%sourceDT.mineHits / (%sourceDT.mineShotsFired ? %sourceDT.mineShotsFired : 1)) * 100; if(%sourceDT.mineHitDist < %dis){%sourceDT.mineHitDist = %dis;} - if(%targetClient.md == 2 && (getSimTime() - %targetClient.mdTime2) < 256){%sourceDT.minePlusDisc++;} - %targetClient.md = 1; + %targetClient.mdHit = 0; + if((getSimTime() - %targetClient.mdTime2) < 256){%sourceDT.minePlusDisc++; %targetClient.mdHit = 1;} %targetClient.mdTime1 = getSimTime(); if(%rayTest >= $dtStats::midAirHeight){ - if(%sourceDT.mineMADist < %dis){%sourceDT.mineMADist = %dis;} + if(%sourceDT.mineMAHitDist < %dis){%sourceDT.mineMAHitDist = %dis;} %sourceDT.mineMA++; } if(%sourceDT.mineHitVV < %vv){%sourceDT.mineHitVV = %vv;} @@ -5855,7 +5896,7 @@ function clientDmgStats(%data,%position,%sourceObject, %targetObject, %damageTyp %sourceDT.blasterHits++; %sourceDT.blasterACC = (%sourceDT.blasterHits / (%sourceDT.blasterShotsFired ? %sourceDT.blasterShotsFired : 1)) * 100; case $DamageType::Plasma: - if(%aoeHIT){%sourceDT.plasmaHits++;%sourceDT.plasmaDmgHits++;} + if(%directHit){%sourceDT.plasmaHits++;%sourceDT.plasmaDmgHits++;} else{%sourceDT.plasmaDmgHits++;} %sourceDT.plasmaACC = (%sourceDT.plasmaHits / (%sourceDT.plasmaShotsFired ? %sourceDT.plasmaShotsFired : 1)) * 100; %sourceDT.plasmaDmgACC = (%sourceDT.plasmaDmgHits / (%sourceDT.plasmaShotsFired ? %sourceDT.plasmaShotsFired : 1)) * 100; @@ -5863,7 +5904,7 @@ function clientDmgStats(%data,%position,%sourceObject, %targetObject, %damageTyp %sourceDT.cgHits++; %sourceDT.cgACC = (%sourceDT.cgHits / (%sourceDT.cgShotsFired ? %sourceDT.cgShotsFired : 1)) * 100; case $DamageType::Disc: - if(%aoeHIT){%sourceDT.discHits++;%sourceDT.discDmgHits++;} + if(%directHit){%sourceDT.discHits++;%sourceDT.discDmgHits++;} else{%sourceDT.discDmgHits++;} %sourceDT.discACC = (%sourceDT.discHits / (%sourceDT.discShotsFired ? %sourceDT.discShotsFired : 1)) * 100; %sourceDT.discDmgACC = (%sourceDT.discDmgHits / (%sourceDT.discShotsFired ? %sourceDT.discShotsFired : 1)) * 100; @@ -5873,7 +5914,7 @@ function clientDmgStats(%data,%position,%sourceObject, %targetObject, %damageTyp %sourceDT.hGrenadeACC = (%sourceDT.hGrenadeHits / (%sourceDT.hGrenadeShotsFired ? %sourceDT.hGrenadeShotsFired : 1)) * 100; } else{ - if(%aoeHIT){%sourceDT.grenadeHits++;%sourceDT.grenadeDmgHits++;} + if(%directHit){%sourceDT.grenadeHits++;%sourceDT.grenadeDmgHits++;} else{%sourceDT.grenadeDmgHits++;} %sourceDT.grenadeACC = (%sourceDT.grenadeHits / (%sourceDT.grenadeShotsFired ? %sourceDT.grenadeShotsFired : 1)) * 100; %sourceDT.grenadeDmgACC = (%sourceDT.grenadeDmgHits / (%sourceDT.grenadeShotsFired ? %sourceDT.grenadeShotsFired : 1)) * 100; @@ -5882,7 +5923,7 @@ function clientDmgStats(%data,%position,%sourceObject, %targetObject, %damageTyp %sourceDT.laserHits++; %sourceDT.laserACC = (%sourceDT.laserHits / (%sourceDT.laserShotsFired ? %sourceDT.laserShotsFired : 1)) * 100; case $DamageType::Mortar: - if(%aoeHIT){%sourceDT.mortarHits++;%sourceDT.mortarDmgHits++;} + if(%directHit){%sourceDT.mortarHits++;%sourceDT.mortarDmgHits++;} else{%sourceDT.mortarDmgHits++;} %sourceDT.mortarACC = (%sourceDT.mortarHits / (%sourceDT.mortarShotsFired ? %sourceDT.mortarShotsFired : 1)) * 100; %sourceDT.mortarDmgACC = (%sourceDT.mortarDmgHits / (%sourceDT.mortarShotsFired ? %sourceDT.mortarShotsFired : 1)) * 100; @@ -5905,17 +5946,22 @@ function clientDmgStats(%data,%position,%sourceObject, %targetObject, %damageTyp } } function clientShotsFired(%data, %sourceObject, %projectile){ // could do a fov check to see if we are trying to aim at a player - if(isObject(%projectile) && isObject(%sourceObject)){ - if(%projectile.sourceObject.getClassName() !$= "Player") + if(isObject(%projectile.sourceObject) && isObject(%sourceObject)){ + if(%projectile.sourceObject.getClassName() !$= "Player"){ %sourceClient = %projectile.sourceObject.getControllingClient(); + } else %sourceClient = %sourceObject.client; } - - if(!isObject(%sourceClient.dtStats)){ return;} + if(!isObject(%sourceClient.dtStats)) + return; + %dtStats = %sourceClient.dtStats; - if(%data.directDamageType !$= ""){%damageType = %data.directDamageType;} - else{%damageType = %data.radiusDamageType;} + if(%data.hasDamageRadius) + %damageType = %data.radiusDamageType; + else + %damageType = %data.directDamageType; + %dtStats.shotsFired++; %sourceClient.dtShotSpeed = %projectile.dtShotSpeed = mFloor(vectorLen(%sourceObject.getVelocity()) * 3.6); switch$(%damageType){// list of all damage types to track see damageTypes.cs @@ -6062,18 +6108,6 @@ function numReduce(%num,%des){ return 0; } -function kdr(%x,%y) -{ - if(%x == 0) - return 0; - else if(%y == 0) - return 100; - - if(%x >= %y) - return 100 - mFloatLength((%y / %x) * 100,1) + 0; - else - return mFloatLength((%x / %y) * 100,1) - 100 + 0; -} function menuReset(%client){ %client.viewMenu = 0; %client.viewClient = 0; @@ -6179,14 +6213,6 @@ function statsMenu(%client,%game){ $dtStats::Enable = 0; %client.GlArg4 = 0; case "reset": - $dtServer::serverHangTotal = 0; - $dtServer::serverHangMicro = 0; - $dtServer::serverHangTime = 0; - $dtServer::serverHangLast = 0; - $dtServer::hostHang = 0; - $dtServer::hostTime = 0; - $dtServer::hostHangLast = 0; - $dtServer::clientCrashCount = 0; %client.GlArg4 = 0; } //------------------------------------------------------------------------------ @@ -6217,8 +6243,8 @@ function statsMenu(%client,%game){ messageClient( %client, 'SetLineHud', "", %tag, %index++, %line,%vClient,%game,1); //------------------------------------------------------------------------------ messageClient( %client, 'SetLineHud', "", %tag, %index++, ""); - %line = ' + Reset Server Metrics'; - messageClient( %client, 'SetLineHud', "", %tag, %index++, %line,%vClient,"reset",0); + //%line = ' + Reset Server Metrics'; + //messageClient( %client, 'SetLineHud', "", %tag, %index++, %line,%vClient,"reset",0); %a1 = ($dtServer::serverHangMap[cleanMapName($CurrentMission),%game] ? "" @ $dtServer::serverHangMap[cleanMapName($CurrentMission),%game] : 0); %a2 = ($dtServer::serverHangTotal ? "" @ $dtServer::serverHangTotal : 0); %a3 = (($dtServer::serverHangLast !$= "") ? "" @ $dtServer::serverHangLast : 0); @@ -6230,9 +6256,9 @@ function statsMenu(%client,%game){ %b4 = ($dtServer::hostHangTime ? "" @ $dtServer::hostHangTime : 0); %c1 = ($dtStats::pingAvg ? $dtStats::pingAvg : 0); - %cli = ($dtServer::clientCrashCount ? "" @ $dtServer::clientCrashCount : 0); - %line = 'Server Ping Avg = %1 - Client Issues = %2'; - messageClient( %client, 'SetLineHud', "", %tag, %index++, %line,%c1@"ms",%cli); + //%cli = ($dtServer::clientCrashCount ? "" @ $dtServer::clientCrashCount : 0); + %line = 'Server Ping Avg = %1'; + messageClient( %client, 'SetLineHud', "", %tag, %index++, %line,%c1@"ms"); %line = 'Server Hangs - This Map = %1 - All Time = %2'; messageClient( %client, 'SetLineHud', "", %tag, %index++, %line,%a1,%a2); @@ -6245,10 +6271,10 @@ function statsMenu(%client,%game){ messageClient( %client, 'SetLineHud', "", %tag, %index++, %line,%b3,%b4); %id = new scriptObject(); %id.delete(); %line = 'ID Count - %1 out of 2147483647 %2%% Up Time - %3'; - messageClient( %client, 'SetLineHud', "", %tag, %index++, %line,%id,mFloor((%id / 2147483647) * 100),formatTime(getSimTime())); + messageClient( %client, 'SetLineHud', "", %tag, %index++, %line,%id,mFloor((%id / 2147483647) * 100),dtFormatTime(getSimTime())); %max = 30; - %limit = 5; + %limit = 6; %v = $dtServerVars::upTimeCount-1; %line = 'Server Run Time History'; messageClient( %client, 'SetLineHud', "", %tag, %index++, %line,%limit); @@ -6285,11 +6311,19 @@ function statsMenu(%client,%game){ $dtServer::voteFor[%map,%client.lgame] = 0; $dtServer::skipCount[%map,%client.lgame] = 0; $dtServer::maxPlayers[%map,%client.lgame] = 0; - $dtServer::clientCrash[%map,%client.lgame] = 0; + //$dtServer::clientCrash[%map,%client.lgame] = 0; $dtServer::serverHangMap[%map,%client.lgame] = 0; $dtServer::serverHangMapMicro[%map,%client.lgame] = 0; $dtServer::hostHangMap[%map,%client.lgame] = 0; + $dtServerVars::serverCrash[%mis, %client.lgame] = 0; } + $dtServer::serverHangTotal = 0; + $dtServer::serverHangTime = 0; + $dtServer::serverHangLast = 0; + $dtServer::hostHang = 0; + $dtServer::hostTime = 0; + $dtServer::hostHangLast = 0; + //$dtServer::clientCrashCount = 0; %client.cat = %cat = 1; } else if(%cat !$= "C"){ @@ -7589,7 +7623,8 @@ function statsMenu(%client,%game){ %line = '\t%1\t%2\t%3\t%4'; messageClient( %client, 'SetLineHud', "", %tag, %index++, %line,%i1,%i2,%i3,%i4); - %i1 = "KDR:" SPC kdr(%vClient.kills,%vClient.deaths) @ "%"; + %kdr = %vClient.deaths ? mFloatLength(%vClient.kills/%vClient.deaths,2)+0 : %vClient.kills; + %i1 = "KDR:" SPC %kdr; %i2 = "KillStreak:" SPC %dtVClient.killStreak; %i3 = "MineDisc:" SPC %dtVClient.minePlusDisc; %i4 = %dtVClient.plasmaMA + %dtVClient.discMA + %dtVClient.mineMA + %dtVClient.grenadeMA + %dtVClient.hGrenadeMA + %dtVClient.mortarMA + %dtVClient.shockMA + %dtVClient.laserMA + @@ -8685,7 +8720,7 @@ function statsMenu(%client,%game){ %var1 = "minePlusDiscTG"; %var1Title = "Mine + Disc:"; %var1Name = "Mine Disc Hits"; %var1TypeName = "Total"; %var2 = "discACCAvg"; %var2Title = "Spinfusor Acc:"; %var2Name = "Spinfusor Accuracy"; %var2TypeName = "Percentage"; - %var3 = "discMADistMax"; %var3Title = "Disc MA Dist:"; %var3Name = "Spinfusor MidAir Distance"; %var3TypeName = "Meters"; + %var3 = "discMAHitDistMax"; %var3Title = "Disc MA Dist:"; %var3Name = "Spinfusor MidAir Distance"; %var3TypeName = "Meters"; %i1 = getField($lData::data[%var1,%client.lgame,%lType,%mon,%year],0) ? getField($lData::name[%var1,%client.lgame,%lType,%mon,%year],0) : %NA; %i2 = getField($lData::data[%var2,%client.lgame,%lType,%mon,%year],0) ? getField($lData::name[%var2,%client.lgame,%lType,%mon,%year],0) : %NA; %i3 = getField($lData::data[%var3,%client.lgame,%lType,%mon,%year],0) ? getField($lData::name[%var3,%client.lgame,%lType,%mon,%year],0) : %NA; @@ -9115,7 +9150,7 @@ function statsMenu(%client,%game){ //12 %var1 = "lightningDeathsTG"; %var1Title = "Lightning Deaths:"; %var1Name = "Lightning Deaths"; %var1TypeName = "Total"; %var2 = "lightningKillsTG"; %var2Title = "Lightning Kills:"; %var2Name = "Lightning Kills"; %var2TypeName = "Total"; - %var3 = "lightningMAkillsTG"; %var3Title = "Lightning MA Kills"; %var3Name = "Lightning MA Kills"; %var3TypeName = "Total"; + %var3 = "lightningMAkillsTG"; %var3Title = "Lightning + MA Kills"; %var3Name = "Lightning MA Kills, Lightning + Wep"; %var3TypeName = "Total"; %i1 = getField($lData::data[%var1,%client.lgame,%lType,%mon,%year],0) ? getField($lData::name[%var1,%client.lgame,%lType,%mon,%year],0) : %NA; %i2 = getField($lData::data[%var2,%client.lgame,%lType,%mon,%year],0) ? getField($lData::name[%var2,%client.lgame,%lType,%mon,%year],0) : %NA; %i3 = getField($lData::data[%var3,%client.lgame,%lType,%mon,%year],0) ? getField($lData::name[%var3,%client.lgame,%lType,%mon,%year],0) : %NA; @@ -9128,6 +9163,22 @@ function statsMenu(%client,%game){ %nameTitle3 = "" @ %var3Title SPC "" @ %i3; messageClient( %client, 'SetLineHud', "", %tag, %index++, %line,%vClient,0,%nameTitle1,%nameTitle2,%nameTitle3,%vsc1,%vsc2,%vsc3); + //13 + //%var1 = "lightningMAEVKillsTG"; %var1Title = "MA + Lightning Kills:"; %var1Name = "MA Lightning Kills, Wep + Lightning"; %var1TypeName = "Total"; + //%var2 = "lightningMAHitsTG"; %var2Title = "Lightning + Ma Hits:"; %var2Name = "Lightning Kills"; %var2TypeName = "Total"; + //%var3 = "lightningMAEVHitsTG"; %var3Title = "Ma Hits + Lightning"; %var3Name = "Lightning MA Kills"; %var3TypeName = "Total"; + //%i1 = getField($lData::data[%var1,%client.lgame,%lType,%mon,%year],0) ? getField($lData::name[%var1,%client.lgame,%lType,%mon,%year],0) : %NA; + //%i2 = getField($lData::data[%var2,%client.lgame,%lType,%mon,%year],0) ? getField($lData::name[%var2,%client.lgame,%lType,%mon,%year],0) : %NA; + //%i3 = getField($lData::data[%var3,%client.lgame,%lType,%mon,%year],0) ? getField($lData::name[%var3,%client.lgame,%lType,%mon,%year],0) : %NA; + //%client.statsFieldSet[%vsc1 = %f++] = %var1 TAB %var1Name TAB %var1TypeName; + //%client.statsFieldSet[%vsc2 = %f++] = %var2 TAB %var2Name TAB %var2TypeName; + //%client.statsFieldSet[%vsc3 = %f++] = %var3 TAB %var3Name TAB %var3TypeName; + //%line = '\t%3\t%4\t%5'; + //%nameTitle1 = "" @ %var1Title SPC "" @ %i1; + //%nameTitle2 = "" @ %var2Title SPC "" @ %i2; + //%nameTitle3 = "" @ %var3Title SPC "" @ %i3; + //messageClient( %client, 'SetLineHud', "", %tag, %index++, %line,%vClient,0,%nameTitle1,%nameTitle2,%nameTitle3,%vsc1,%vsc2,%vsc3); + for(%i = %index; %i < 15; %i++) messageClient( %client, 'SetLineHud', "", %tag, %index++, ''); messageClient( %client, 'SetLineHud', "", %tag, %index++, 'Click on player name to view the top %1 players', $dtStats::topAmount); @@ -11114,7 +11165,7 @@ function loadMapLeaderBoards(%reset){ else{ if($dtStats::lsmMap){ if($dtStats::debugEchos){error("Deleting old file" SPC %filepath);} - schedule((%i+1) * 1000,0,"deleteFile",%filepath); + schedule((%i+1) * 500,0,"deleteFile",%filepath); } } } @@ -11597,22 +11648,7 @@ function sortMapStats(%varIndex,%game,%lType,%mapIndex){ //Server Stats //////////////////////////////////////////////////////////////////////////////// -function dtSaveServerVars(){ - $dtServerVars::lastSimTime = getSimTime(); - $dtServerVars::lastDate = formattimestring("mm/dd/yy hh:nn:a"); - $dtServerVars::lastMission = cleanMapName($CurrentMission); - schedule(1,0,"export", "$dtServerVars::*", "serverStats/serverVars.cs", false ); - schedule(1000,0,"export", "$dtServer::serverHang*", "serverStats/serverHangs.cs", false ); - schedule(2000,0,"export", "$dtServer::hostHang*", "serverStats/hostHangs.cs", false ); - schedule(3000,0,"export", "$dtServer::playCount*", "serverStats/playCount.cs", false ); - schedule(3000,0,"export", "$dtServer::lastPlay*", "serverStats/lastPlay.cs", false ); - schedule(4000,0,"export", "$dtServer::mapDisconnects*", "serverStats/mapDisconnects.cs", false ); - schedule(5000,0,"export", "$dtServer::mapReconnects*", "serverStats/mapReconnects.cs", false ); - schedule(6000,0,"export", "$dtServer::voteFor*", "serverStats/voteFor.cs", false ); - schedule(7000,0,"export", "$dtServer::skipCount*", "serverStats/skipCount.cs", false ); - schedule(8000,0,"export", "$dtServer::maxPlayers*", "serverStats/maxPlayers.cs", false ); - schedule(9000,0,"export", "$dtServer::clientCrash*", "serverStats/clientCrash.cs", false ); -} + $dtStats::prefTestTime = 512;// the lower the better tracking $dtStats::prefTestIdleTime = 10*1000;// if no one is playing just run slow $dtStats::prefTolerance = 128;//this number is to account for base line preformance and differences between engine simTime and realtime @@ -11620,7 +11656,7 @@ $dtStats::prefLog = 0; // enable logging of server hangs function prefTest(%time,%skip){ %real = getRealTime(); %plCount = $HostGamePlayerCount - $HostGameBotCount; - if(isGameRun() && !$dtStats::building && %plCount > 0){// only track during run time + if(isGameRun() && !$dtStats::building && %plCount > 1){// only track during run time %dif = (%real - %time) - $dtStats::prefTestTime; //echo(%dif); if(%dif > $dtStats::prefTolerance && !%skip){ @@ -11630,27 +11666,20 @@ function prefTest(%time,%skip){ $dtServer::serverHangMap[cleanMapName($CurrentMission),Game.class]++; $dtServer::serverHangLast = formattimestring("hh:nn:a mm-dd-yy"); $dtServer::serverHangTime = %dif; - LogPrefIssue(%msg SPC "Map:" SPC $CurrentMission SPC Game.class SPC "UpTime:" SPC formatTime(getSimTime())); + LogPrefIssue(%msg SPC "Map:" SPC $CurrentMission SPC Game.class SPC "UpTime:" SPC dtFormatTime(getSimTime())); %skip = 1; } else %skip = 0; - dtPingAvg(); + dtPingAvg(); } - if($dtStats::prefEnable){ - if(isGameRun() && %plCount > 0) + if(isGameRun() && %plCount > 1) schedule($dtStats::prefTestTime, 0, "prefTest",%real,%skip); else schedule($dtStats::prefTestIdleTime, 0, "prefTest",%real,1); } } -function dtBuildEvent(){ - if(getTimeDif($dtStats::buildSetTime) < 900000){ - if(!isEventPending($dtStats::buildEvent)) - $dtStats::buildEvent = schedule(getTimeDif($dtStats::buildSetTime),0,"lStatsCycle",1); - } -} function dtPingAvg(){ %ping = %pc = 0; for(%i = 0; %i < ClientGroup.getCount(); %i++){ @@ -11668,13 +11697,19 @@ function dtPingAvg(){ } if(%pc > 4){ if($dtStats::pingAvg > 1000){//network issues - %msg = "Host Hang Event" SPC formattimestring("hh:nn:a mm-dd-yy") SPC $dtStats::pingAvg SPC "ms"; + %msg = "Host Hang Event" SPC formattimestring("hh:nn:a mm-dd-yy") SPC $dtStats::pingAvg SPC "ms" SPC "ms" SPC %pc; if($dtStats::debugEchos){error(%msg);} $dtServer::hostHangMap[cleanMapName($CurrentMission),Game.class]++; $dtServer::hostHangTotal++; $dtServer::hostHangLast = formattimestring("hh:nn:a mm-dd-yy"); $dtServer::hostHangTime = %pingT / %pc; - LogPrefIssue(%msg SPC "Map:" SPC $CurrentMission SPC Game.class SPC "UpTime:" SPC formatTime(getSimTime())); + LogPrefIssue(%msg SPC "Map:" SPC $CurrentMission SPC Game.class SPC "UpTime:" SPC dtFormatTime(getSimTime())); + } + else if($dtStats::pingAvg > 500){ + %msg = "Small Host Event" SPC formattimestring("hh:nn:a mm-dd-yy") SPC $dtStats::pingAvg SPC "ms" SPC %pc; + if($dtStats::debugEchos){error(%msg);} + + LogPrefIssue(%msg SPC "Map:" SPC $CurrentMission SPC Game.class SPC "UpTime:" SPC dtFormatTime(getSimTime())); } } } @@ -11705,6 +11740,25 @@ function LogPrefIssue(%msg) { } } } +function dtSaveServerVars(){ + $dtServerVars::lastSimTime = getSimTime(); + $dtServerVars::lastDate = formattimestring("mm/dd/yy hh:nn:a"); + $dtServerVars::lastMission = cleanMapName($CurrentMission); + $dtServerVars::lastGameType = Game.class; + $dtServerVars::lastPlayerCount = $HostGamePlayerCount - $HostGameBotCount; + schedule(1,0,"export", "$dtServerVars::*", "serverStats/serverVars.cs", false ); + schedule(1000,0,"export", "$dtServer::serverHang*", "serverStats/serverHangs.cs", false ); + schedule(2000,0,"export", "$dtServer::hostHang*", "serverStats/hostHangs.cs", false ); + schedule(3000,0,"export", "$dtServer::playCount*", "serverStats/playCount.cs", false ); + schedule(3000,0,"export", "$dtServer::lastPlay*", "serverStats/lastPlay.cs", false ); + schedule(4000,0,"export", "$dtServer::mapDisconnects*", "serverStats/mapDisconnects.cs", false ); + schedule(5000,0,"export", "$dtServer::mapReconnects*", "serverStats/mapReconnects.cs", false ); + schedule(6000,0,"export", "$dtServer::voteFor*", "serverStats/voteFor.cs", false ); + schedule(7000,0,"export", "$dtServer::skipCount*", "serverStats/skipCount.cs", false ); + schedule(8000,0,"export", "$dtServer::maxPlayers*", "serverStats/maxPlayers.cs", false ); + //schedule(9000,0,"export", "$dtServer::clientCrash*", "serverStats/clientCrash.cs", false ); + schedule(9000,0,"export", "$mapID::*", "serverStats/mapIDList.cs", false ); +} function dtLoadServerVars(){// keep function at the bottom if($dtStats::Enable){ if(!statsGroup.serverStart){ @@ -11713,14 +11767,21 @@ function dtLoadServerVars(){// keep function at the bottom if(isFile("serverStats/serverVars.cs")){ exec("serverStats/serverVars.cs"); %date = $dtServerVars::lastDate; - %upTime = formatTime($dtServerVars::lastSimTime); + %upTime = dtFormatTime($dtServerVars::lastSimTime); %mis = $dtServerVars::lastMission; if($dtStats::debugEchos){schedule(6000,0,"error","last server uptime = " SPC %date @ "-" @ %upTime @ "-" @ %mis);} - $dtServerVars::upTime[$dtServerVars::upTimeCount] = %date @ "-" @ %upTime @ "-" @ %mis; - } - if($dtServerVars::upTimeCount++ >= 30){ - $dtServerVars::upTimeCount = 0; + $dtServerVars::upTime[$dtServerVars::upTimeCount++] = %date @ "-" @ %upTime @ "-" @ %mis; + if($dtServerVars::lastPlayerCount > 0){ + $dtServerVars::serverCrash[%mis, $dtServerVars::lastGameType]++; + $dtServerVars::crashLog[$dtServerVars::crashLogCount++] =%date @ "-" @ %upTime @ "-" @ %mis @ "-" @ $dtServerVars::lastGameType @ "-" @ $dtServerVars::lastPlayerCount; + $dtServerVars::lastPlayerCount = 0; + } } + if($dtServerVars::upTimeCount >= 30) + $dtServerVars::upTimeCount = 0; + if($dtServerVars::crashLogCount >= 15) + $dtServerVars::crashLogCount = 0; + $dtServerVars::lastSimTime = getSimTime(); $dtServerVars::lastDate = formattimestring("mm/dd/yy hh:nn:a"); export( "$dtServerVars::*", "serverStats/serverVars.cs", false ); @@ -11742,8 +11803,8 @@ function dtLoadServerVars(){// keep function at the bottom exec("serverStats/skipCount.cs"); if(isFile("serverStats/maxPlayers.cs")) exec("serverStats/maxPlayers.cs"); - if(isFile("serverStats/clientCrash.cs")) - exec("serverStats/clientCrash.cs"); + //if(isFile("serverStats/clientCrash.cs")) + //exec("serverStats/clientCrash.cs"); genBlanks(); buildVarList(); startMonitor(); diff --git a/Classic/scripts/player.cs b/Classic/scripts/player.cs index 50436f2..8a1ff90 100644 --- a/Classic/scripts/player.cs +++ b/Classic/scripts/player.cs @@ -2800,23 +2800,21 @@ function Armor::damageObject(%data, %targetObject, %sourceObject, %position, %am %flash = 0.75; // Teratos: Originally from Eolk? Mine+Disc tracking/death message support. - // No Schedules by DarkTiger + // No Schedules by DarkTiger Ver.2 %targetClient.mineDisc = false; switch$(%damageType) { - case $DamageType::Disc: - if(%targetClient.mdc == 1 && (getSimTime() - %targetClient.mdcTime1) < 256) - %targetClient.mineDisc = true; + case $DamageType::Disc: + if((getSimTime() - %targetClient.mdcTime1) < 256) + %targetClient.mineDisc = true; + + %targetClient.mdcTime2 = getSimTime(); - %targetClient.mdc = 2; - %targetClient.mdcTime2 = getSimTime(); - - case $DamageType::Mine: - if(%targetClient.mdc == 2 && (getSimTime() - %targetClient.mdcTime2) < 256) - %targetClient.mineDisc = true; - - %targetClient.mdc = 1; - %targetClient.mdcTime1 = getSimTime(); + case $DamageType::Mine: + if((getSimTime() - %targetClient.mdcTime2) < 256) + %targetClient.mineDisc = true; + + %targetClient.mdcTime1 = getSimTime(); } // -- End Mine+Disc insert. diff --git a/Classic/scripts/server.cs b/Classic/scripts/server.cs index 5d5e95c..d204627 100644 --- a/Classic/scripts/server.cs +++ b/Classic/scripts/server.cs @@ -670,6 +670,9 @@ function GameConnection::onConnect( %client, %name, %raceGender, %skin, %voice, %realName = getField( %authInfo, 0 ); if ( $PlayingOnline && $Host::NoSmurfs ) %name = %realName; + + //Remove <> to not mess up tribesnext json + %name = stripChars( detag( %name ), "<>" ); if ( strcmp( %name, %realName ) == 0 ) {