Deadlock Fix

Fix the deadlocking issue, tweak some of the new zombie AI and speeds.
This commit is contained in:
Robert Fritzen 2017-12-23 14:55:00 -06:00
parent e5792ecc9a
commit 42d636b4b8
7 changed files with 93 additions and 50 deletions

View file

@ -101,30 +101,36 @@ function ChallengeDownload::onLine(%this, %line) {
////////////////////////////////////////////////// //////////////////////////////////////////////////
function doChallengeKillRecording(%sourceObject, %targetObject) { function doChallengeKillRecording(%sourceObject, %targetObject) {
if(%sourceObject.team == %targetObject.team) { if(%sourceObject $= "" || %targetObject $= "") {
//Teamkill = no recorded challenge :) return;
return; }
} if(%sourceObject.team == %targetObject.team) {
//killed a player? //Teamkill = no recorded challenge :)
if(isClientControlledPlayer(%targetObject)) { return;
//echo("Kill: "@%sourceObject.client@"/"@%targetObject.lastDamagedImage@""); }
recordAction(%sourceObject.client, "PKC", "single\t"@%targetObject.lastDamagedImage@"\t1"); //killed a player?
recordAction(%sourceObject.client, "PKC", "total\t1"); if(isClientControlledPlayer(%targetObject)) {
} //echo("Kill: "@%sourceObject.client@"/"@%targetObject.lastDamagedImage@"");
else { recordAction(%sourceObject.client, "PKC", "single\t"@%targetObject.lastDamagedImage@"\t1");
//killed a zombie recordAction(%sourceObject.client, "PKC", "total\t1");
%zType = %targetObject.type; }
if(!isSet(%zType)) { else {
//illegal target for challenge set, end here //killed a zombie
return; %zType = %targetObject.type;
} if(!isSet(%zType)) {
recordAction(%sourceObject.client, "ZKC", "total\t1"); //illegal target for challenge set, end here
recordAction(%sourceObject.client, "ZKC", "single\t"@%zType@"\t1"); return;
recordAction(%sourceObject.client, "ZKC", "single\t"@%targetObject.lastDamagedImage@"\t"@%zType@"\t1"); }
} recordAction(%sourceObject.client, "ZKC", "total\t1");
recordAction(%sourceObject.client, "ZKC", "single\t"@%zType@"\t1");
recordAction(%sourceObject.client, "ZKC", "single\t"@%targetObject.lastDamagedImage@"\t"@%zType@"\t1");
}
} }
function recordAction(%client, %action, %variables) { function recordAction(%client, %action, %variables) {
if(!%client || %client $= "") {
return;
}
%ymd = formattimestring("yymmdd"); %ymd = formattimestring("yymmdd");
%so = %client.TWM2Controller; %so = %client.TWM2Controller;
checkDateOnChallenge(%client); checkDateOnChallenge(%client);
@ -236,6 +242,9 @@ function allCheckCompletion(%client) {
} }
function checkCompletion(%client, %cID) { function checkCompletion(%client, %cID) {
if(!%client || %client $= "") {
return;
}
%challenge = $Challenges::Challenge[%cID]; %challenge = $Challenges::Challenge[%cID];
%cType = trim(getField(%challenge, 0)); %cType = trim(getField(%challenge, 0));
%cCond = getsubstr(getField(%challenge, 3), 1, strlen(getField(%challenge, 3))); %cCond = getsubstr(getField(%challenge, 3), 1, strlen(getField(%challenge, 3)));

View file

@ -770,6 +770,9 @@ $Challenge::IsNotMultiTier["SoulsticeBombard"] = true;
//Core Functions //Core Functions
function GameConnection::AllowedToDoNW(%client, %name) { function GameConnection::AllowedToDoNW(%client, %name) {
if(!%client || %client $= "") {
return 0;
}
if($Challenge::FlagDisabled[%name]) { if($Challenge::FlagDisabled[%name]) {
return 0; return 0;
} }
@ -798,6 +801,9 @@ function GameConnection::AllowedToDoNW(%client, %name) {
} }
function GameConnection::CheckNWChallengeCompletion(%client, %name) { function GameConnection::CheckNWChallengeCompletion(%client, %name) {
if(!%client || %client $= "") {
return false;
}
%scriptController = %client.TWM2Core; %scriptController = %client.TWM2Core;
if(%scriptController.challengeComplete[%name] == 1) { if(%scriptController.challengeComplete[%name] == 1) {
return true; return true;

View file

@ -186,6 +186,10 @@ function postObjectDestroyed(%source, %targetObject, %dType, %dLoc) {
//Skip terrain and interiors //Skip terrain and interiors
return; return;
} }
if((%source.isZombie || %source.isBoss) && !%source.isPlayerZombie) {
//Stop here.
return;
}
if(!isObject(%source) || %source $= "") { if(!isObject(%source) || %source $= "") {
%SDB = ""; %SDB = "";
%sourceObject = 0; %sourceObject = 0;

View file

@ -4,6 +4,9 @@
//Handles the successive and specific weapon kill listing //Handles the successive and specific weapon kill listing
function PerformSuccessiveKills(%player, %damageType) { function PerformSuccessiveKills(%player, %damageType) {
if(!isObject(%player) || !%player.isAlive()) {
return;
}
cancel(%player.successiveReset); cancel(%player.successiveReset);
%currentKills = %player.killsinarow2; %currentKills = %player.killsinarow2;
%currentDTKills = %player.kills[%damageType]; %currentDTKills = %player.kills[%damageType];
@ -47,6 +50,9 @@ function DoStreakPrint(%player, %kills, %damageType) {
} }
function DoSuccessivePrint(%player) { function DoSuccessivePrint(%player) {
if(!isObject(%player) || !%player.isAlive()) {
return;
}
%client = %player.client; %client = %player.client;
messageClient(%client, 'msgSoundFX', "~wfx/misc/MA1.wav"); messageClient(%client, 'msgSoundFX', "~wfx/misc/MA1.wav");
recordAction(%client, "SKC", %player.successive@"\t1"); recordAction(%client, "SKC", %player.successive@"\t1");

View file

@ -49,7 +49,7 @@ $Zombie::TypeSpeed[11] = 1200;
$Zombie::BaseJumpCooldown = 1500; $Zombie::BaseJumpCooldown = 1500;
//$Zombie::SpeedMultiplier[#]: An additional multiplier to be applied to the zombie's base speed when calculating the impulse, used to fine tune speed values //$Zombie::SpeedMultiplier[#]: An additional multiplier to be applied to the zombie's base speed when calculating the impulse, used to fine tune speed values
$Zombie::SpeedMultiplier[2] = 0.6; $Zombie::SpeedMultiplier[2] = 0.95;
$Zombie::SpeedMultiplier[3] = 0.8; $Zombie::SpeedMultiplier[3] = 0.8;
$Zombie::SpeedMultiplier[4] = 0.75; $Zombie::SpeedMultiplier[4] = 0.75;

View file

@ -59,15 +59,32 @@ function RavagerZombieArmor::AI(%datablock, %zombie) {
if(!isObject(%zombie) || %zombie.getState() $= "dead") { if(!isObject(%zombie) || %zombie.getState() $= "dead") {
return; return;
} }
if(isSet(%zombie.targetedPlayer)) { if(%zombie.targetedPlayer !$= "") {
if(!isObject(%zombie.targetedPlayer) || %zombie.targetedPlayer.getState() $= "dead") { if(!isObject(%zombie.targetedPlayer) || %zombie.targetedPlayer.getState() $= "dead") {
%zombie.ambushing = 0; %zombie.ambushing = 0;
%zombie.fullAttack = 0; %zombie.fullAttack = 0;
%zombie.ambushPosition = 0; %zombie.ambushPosition = 0;
%zombie.targetedPlayer = 0; %zombie.targetedPlayer = "";
%zombie.hasTarget = 0; %zombie.hasTarget = 0;
} }
} }
else {
%targetParams = TWM2Lib_Zombie_Core("lookForTarget", %zombie);
%target = getWord(%targetParams, 0);
%distance = getWord(%targetParams, 1);
if(isObject(%target.player)) {
if(%distance <= $zombie::detectDist) {
%zombie.hasTarget = 1;
%zombie.targetedPlayer = %target.player;
}
}
else {
//No target, random movement.
%zombie.zombieRmove = schedule(500, %zombie, "TWM2Lib_Zombie_Core", "zRandomMoveLoop", %zombie);
%zombie.setActionThread("ski", true);
}
}
//
if(%zombie.ambushing) { if(%zombie.ambushing) {
//We're currently in an ambush maneuver, continue moving to position //We're currently in an ambush maneuver, continue moving to position
if(vectorDist(%zombie.getPosition(), %zombie.ambushPosition) < 10) { if(vectorDist(%zombie.getPosition(), %zombie.ambushPosition) < 10) {
@ -78,31 +95,37 @@ function RavagerZombieArmor::AI(%datablock, %zombie) {
} }
else { else {
//If the target is near us, break off the ambush and go in for the kill... //If the target is near us, break off the ambush and go in for the kill...
%distanceToTarget = vectorDist(%zombie.getPosition(), %zombie.targetedPlayer.getPosition()); if(!isObject(%zombie.targetedPlayer)) {
if(%distanceToTarget < 20) { //Target is dead... Look for a new one.
%zombie.targetedPlayer = "";
%zombie.hasTarget = 0;
%zombie.ambushing = 0; %zombie.ambushing = 0;
%zombie.fullAttack = 1; %zombie.fullAttack = 0;
%zombie.ambushPosition = 0; %zombie.ambushPosition = 0;
} }
//Otherwise, keep moving... else {
%datablock.move(%zombie); %distanceToTarget = vectorDist(%zombie.getPosition(), %zombie.targetedPlayer.getPosition());
if(%distanceToTarget < 20) {
%zombie.ambushing = 0;
%zombie.fullAttack = 1;
%zombie.ambushPosition = 0;
}
//Otherwise, keep moving...
%datablock.move(%zombie);
}
} }
} }
else { else {
if(!%zombie.hasTarget) { //Ambush logic, determine if the best plan of action is a ambush, or a direct approach
%targetParams = TWM2Lib_Zombie_Core("lookForTarget", %zombie); if(!isObject(%zombie.targetedPlayer)) {
%target = getWord(targetParams, 0); //Target is dead... Look for a new one.
%distance = getWord(%targetParams, 1); %zombie.targetedPlayer = "";
if(isObject(%target.player)) { %zombie.hasTarget = 0;
if(%distance <= $zombie::detectDist) { %zombie.ambushing = 0;
%zombie.hasTarget = 1; %zombie.fullAttack = 0;
%zombie.targetedPlayer = %target.player; %zombie.ambushPosition = 0;
}
}
//Outside targeting range, ignore...
} }
if(%zombie.hasTarget) { else {
//Ambush logic, determine if the best plan of action is a ambush, or a direct approach
%distanceToTarget = vectorDist(%zombie.getPosition(), %zombie.targetedPlayer.getPosition()); %distanceToTarget = vectorDist(%zombie.getPosition(), %zombie.targetedPlayer.getPosition());
if(%distanceToTarget > 50 && getRandom(1,10) == 1 && !%zombie.ambushing && !%zombie.fullAttack) { if(%distanceToTarget > 50 && getRandom(1,10) == 1 && !%zombie.ambushing && !%zombie.fullAttack) {
//Ambush: Move to a side position from the target, then strike. //Ambush: Move to a side position from the target, then strike.
@ -118,11 +141,6 @@ function RavagerZombieArmor::AI(%datablock, %zombie) {
%datablock.move(%zombie); %datablock.move(%zombie);
} }
} }
else {
//No target, random movement.
%zombie.zombieRmove = schedule(500, %zombie, "TWM2Lib_Zombie_Core", "zRandomMoveLoop", %zombie);
%zombie.setActionThread("ski", true);
}
} }
%datablock.schedule(500, "AI", %zombie); %datablock.schedule(500, "AI", %zombie);
} }

View file

@ -2805,7 +2805,7 @@ function Armor::onCollision(%this, %obj, %col, %forceVehicleNode) {
%obj.onfire = 1; %obj.onfire = 1;
schedule(10, %obj, "burnloop", %obj); schedule(10, %obj, "burnloop", %obj);
} }
if(%col.getState() $= "Dead" && (!%obj.isZombie && !%col.isZombie)) { if(%col.getState() $= "Dead" && (!%obj.isZombie && !%obj.isBoss)) {
%obj.lasttouchedcorpse = %col; %obj.lasttouchedcorpse = %col;
%gotSomething = false; %gotSomething = false;
// it's corpse-looting time! // it's corpse-looting time!