Demon Zombie, Other Fixes

Fixed a speed issue in the new zombie AI, added Demon Zombies back in.
This commit is contained in:
Robert Fritzen 2017-10-17 14:57:12 -05:00
parent 141e94ef7c
commit 0f6ac8cc6b
6 changed files with 125 additions and 83 deletions

View file

@ -107,5 +107,7 @@ PLEASE NOTE: I've moved all old changelogs into the version_history folder. This
* Re-did his ground detection script to "hopefully" eradicate those funny moments when he suicide bombs the ground, ending the fight * Re-did his ground detection script to "hopefully" eradicate those funny moments when he suicide bombs the ground, ending the fight
* Lord Vardison * Lord Vardison
* Fixed an erraneous text prompt that would appear when the shadow rift detonated outside of WTF difficulty stating vardison had healed when in fact he did not * Fixed an erraneous text prompt that would appear when the shadow rift detonated outside of WTF difficulty stating vardison had healed when in fact he did not
* Gameplay Changes
* The Helljump 'Oh Lordy' modifier has been changed to 'Reduces the cooldown time of the Zombie Lord's Photon Cannon by 50%'.
* General Bug Fixes * General Bug Fixes
* Addressed the issue when gaining more than 1 million EXP that would result in your total EXP being reset by the difference between 1 million exp and your current exp. * Addressed the issue when gaining more than 1 million EXP that would result in your total EXP being reset by the difference between 1 million exp and your current exp.

View file

@ -1,99 +1,126 @@
datablock PlayerData(DemonZombieArmor) : LightMaleHumanArmor datablock PlayerData(DemonZombieArmor) : LightMaleHumanArmor {
{ boundingBox = "1.63 1.63 2.6";
boundingBox = "1.63 1.63 2.6"; maxDamage = 4.0;
maxDamage = 4.0; minImpactSpeed = 35;
minImpactSpeed = 35; shapeFile = "bioderm_heavy.dts";
shapeFile = "bioderm_heavy.dts";
debrisShapeName = "bio_player_debris.dts"; debrisShapeName = "bio_player_debris.dts";
//Foot Prints //Foot Prints
decalData = HeavyBiodermFootprint; decalData = HeavyBiodermFootprint;
decalOffset = 0.4; decalOffset = 0.4;
waterBreathSound = WaterBreathBiodermSound; waterBreathSound = WaterBreathBiodermSound;
damageScale[$DamageType::M1700] = 2.0; damageScale[$DamageType::M1700] = 2.0;
max[RepairKit] = 0; max[RepairKit] = 0;
max[Mine] = 0; max[Mine] = 0;
max[Grenade] = 0; max[Grenade] = 0;
}; };
function DZombiemovetotarget(%zombie){ function DemonZombieArmor::AI(%datablock, %zombie) {
if(!isobject(%zombie)) if(!isObject(%zombie) || %zombie.getState() $= "dead") {
return; return;
if(%zombie.getState() $= "dead")
return;
%pos = %zombie.getworldboxcenter();
%closestClient = ZombieLookForTarget(%zombie);
%closestDistance = getWord(%closestClient,1);
%closestClient = getWord(%closestClient,0).Player;
if(%closestDistance <= $zombie::detectDist){
if(%zombie.hastarget != 1 && %closestdistance >= 10 && %closestdistance <= 150){
DzombieFire(%zombie,%closestclient);
%zombie.canjump = 0;
schedule(4000, %zombie, "Zsetjump", %zombie);
} }
if(%zombie.hastarget != 1){ %zPos = %zombie.getPosition();
serverPlay3d("ZombieHOWL",%zombie.getWorldBoxCenter()); if(%zombie.hasTarget) {
%zombie.hastarget = 1; if(!isObject(%zombie.targetedPlayer) || %zombie.targetedPlayer.getState() $= "dead") {
%zombie.targetedPlayer = 0;
%zombie.hasTarget = 0;
%datablock.schedule(%zombie.updateTimeFrequency, "AI", %zombie);
return;
}
%tPos = %zombie.targetedPlayer.getPosition();
%distance = vectorDist(%zPos, %tPos);
if(%distance > 20 && %distance <= 250) {
if(%zombie.canFireWeapon) {
%datablock.zFire(%zombie, %zombie.targetedPlayer);
}
}
%datablock.move(%zombie);
} }
else {
%targetParams = TWM2Lib_Zombie_Core("lookForTarget", %zombie);
%target = getWord(targetParams, 0);
%distance = getWord(%targetParams, 1);
if(isObject(%target.player)) {
//Got a target player... let's go!
if(%distance <= $zombie::detectDist) {
%zombie.hasTarget = 1;
%zombie.targetedPlayer = %target.player;
}
}
//Nothing to hunt... random movement...
if(!%zombie.hasTarget) {
%zombie.zombieRmove = schedule(%zombie.updateTimeFrequency, %zombie, "TWM2Lib_Zombie_Core", "zRandomMoveLoop", %zombie);
}
}
%datablock.schedule(%zombie.updateTimeFrequency, "AI", %zombie);
}
function DemonZombieArmor::move(%datablock, %zombie) {
if(!isObject(%zombie) || %zombie.getState() $= "dead") {
return;
}
%pos = %zombie.getWorldBoxCenter();
%upvec = "150";
%chance = (getrandom() * 20); %chance = (getrandom() * 20);
if(%chance >= 19) if(%chance >= 19) {
serverPlay3d("ZombieMoan",%zombie.getWorldBoxCenter()); serverPlay3d("ZombieMoan", %zombie.getWorldBoxCenter());
}
%vector = ZgetFacingDirection(%zombie,%closestClient,%pos); %vector = TWM2Lib_Zombie_Core("zombieGetFacingDirection", %zombie, %zombie.targetedPlayer.getPosition());
%distance = vectorDist(%pos, %zombie.targetedPlayer.getPosition());
if (%closestdistance >= 10 && %closestdistance <= 150 && %zombie.canjump == 1){ if(%distance <= $Zombie::LungeDistance && %zombie.canjump == 1) {
DzombieFire(%zombie,%closestclient); %vector = vectorScale(%vector, 4);
%zombie.canjump = 0; }
schedule(4000, %zombie, "Zsetjump", %zombie); %vector = vectorScale(%vector, %zombie.speed);
}
%vector = vectorscale(%vector, $Zombie::DForwardSpeed);
%upvec = "150"; %upvec = "150";
%x = Getword(%vector,0); %x = Getword(%vector,0);
%y = Getword(%vector,1); %y = Getword(%vector,1);
%z = Getword(%vector,2); %z = Getword(%vector,2);
if(%z >= ($Zombie::DForwardSpeed / 3 * 2)) if(%z >= (%zombie.speed / 3 * 2)) {
%upvec = (%upvec * 5); %upvec = (%upvec * 5);
}
%vector = %x@" "@%y@" "@%upvec; %vector = %x@" "@%y@" "@%upvec;
%zombie.applyImpulse(%pos, %vector); %zombie.applyImpulse(%pos, %vector);
}
else if(%zombie.hastarget == 1){
%zombie.hastarget = 0;
%zombie.zombieRmove = schedule(100, %zombie, "ZSetRandomMove", %zombie);
}
%zombie.moveloop = schedule(500, %zombie, "DZombiemovetotarget", %zombie);
} }
function DZombieFire(%zombie,%closestclient){ function DemonZombieArmor::zFire(%datablock, %zombie, %targetObject) {
%pos = %zombie.getMuzzlePoint(4); if(!isObject(%zombie) || %zombie.getState() $= "dead") {
%tpos = %closestclient.getWorldBoxCenter(); return;
%tvel = %closestclient.getvelocity(); }
%vec = vectorsub(%tpos,%pos); if(!isObject(%targetObject)) {
%dist = vectorlen(%vec); return;
%velpredict = vectorscale(%tvel,(%dist / 50)); }
%vector = vectoradd(%vec,%velpredict); TWM2Lib_Zombie_Core("setZFlag", %zombie, "canFireWeapon", 0);
%ndist = vectorlen(%vector); %pos = %zombie.getMuzzlePoint(4);
%upvec = "0 0 "@((%ndist / 50) * (%ndist / 50) * 2); %tpos = %targetObject.getWorldBoxCenter();
%vector = vectornormalize(vectoradd(%vector,%upvec)); %tvel = %targetObject.getvelocity();
if(Game.CheckModifier("ItBurns") == 1) { %vec = vectorsub(%tpos, %pos);
%p = new GrenadeProjectile() { %dist = vectorlen(%vec);
dataBlock = DemonFlamingFireball; %velpredict = vectorscale(%tvel, (%dist / 50));
initialDirection = %vector; %vector = vectoradd(%vec, %velpredict);
initialPosition = %pos; %ndist = vectorlen(%vector);
sourceObject = %zombie; %upvec = "0 0 "@((%ndist / 50) * (%ndist / 50) * 2);
sourceSlot = 4; %vector = vectornormalize(vectoradd(%vector, %upvec));
}; if(Game.CheckModifier("ItBurns") == 1) {
} %p = new GrenadeProjectile() {
else { dataBlock = DemonFlamingFireball;
%p = new GrenadeProjectile() { initialDirection = %vector;
dataBlock = DemonFireball; initialPosition = %pos;
initialDirection = %vector; sourceObject = %zombie;
initialPosition = %pos; sourceSlot = 4;
sourceObject = %zombie; };
sourceSlot = 4; }
}; else {
} %p = new GrenadeProjectile() {
} dataBlock = DemonFireball;
initialDirection = %vector;
initialPosition = %pos;
sourceObject = %zombie;
sourceSlot = 4;
};
}
schedule(4000, 0, "TWM2Lib_Zombie_Core", "setZFlag", %zombie, "canFireWeapon", 1);
}

View file

@ -202,6 +202,15 @@ function LordZombieArmor::AI(%datablock, %zombie) {
} }
//Am I engaged with something? //Am I engaged with something?
if(%zombie.hasTarget) { if(%zombie.hasTarget) {
if(!isObject(%zombie.targetedPlayer) || %zombie.targetedPlayer.getState() $= "dead") {
%zombie.targetIsTank = 0;
%zombie.targetedPlayer = 0;
%zombie.hasTarget = 0;
%zombie.movePoint = 0;
%zombie.movingToPosition = 0;
%datablock.schedule(%zombie.updateTimeFrequency, "AI", %zombie);
return;
}
//Is it a tank? //Is it a tank?
%tPos = %zombie.targetedPlayer.getPosition(); %tPos = %zombie.targetedPlayer.getPosition();
if(%zombie.targetIsTank) { if(%zombie.targetIsTank) {
@ -379,7 +388,11 @@ function LordZombieArmor::zFire(%datablock, %zombie, %targetObject) {
}; };
MissionCleanup.add(%p); MissionCleanup.add(%p);
schedule(2000, 0, "TWM2Lib_Zombie_Core", "setZFlag", %zombie, "firingWeapon", 0); schedule(2000, 0, "TWM2Lib_Zombie_Core", "setZFlag", %zombie, "firingWeapon", 0);
schedule($Zombie::ZombieLordPhotonCooldown, 0, "TWM2Lib_Zombie_Core", "setZFlag", %zombie, "canFireWeapon", 1); %cooldown = $Zombie::ZombieLordPhotonCooldown;
if(Game.CheckModifier("OhLordy") == 1) {
%cooldown *= 0.5;
}
schedule(%cooldown, 0, "TWM2Lib_Zombie_Core", "setZFlag", %zombie, "canFireWeapon", 1);
} }
function LordZombieArmor::makeShield(%datablock, %zombie) { function LordZombieArmor::makeShield(%datablock, %zombie) {

View file

@ -65,7 +65,7 @@ function ZombieArmor::Move(%datablock, %zombie) {
%ld = $Zombie::LungeDistance; %ld = $Zombie::LungeDistance;
} }
if(%closestDistance <= %ld && %zombie.canjump == 1) { if(%closestDistance <= %ld && %zombie.canjump == 1) {
%vector = vectorScale(%vector, (%zombie.speed * 4)); %vector = vectorScale(%vector, 4);
} }
%vector = vectorScale(%vector, %zombie.speed); %vector = vectorScale(%vector, %zombie.speed);
%upvec = "150"; %upvec = "150";

View file

@ -118,7 +118,7 @@ function RavagerZombieArmor::Move(%datablock, %zombie) {
//Lunge behavior //Lunge behavior
if(!%zombie.ambushing && vectorDist(%zombie.targetedPlayer.getPosition(), %zombie.getPosition()) <= $Zombie::LungeDistance && %zombie.canJump && getWord(%vector, 2) <= 0.8) { if(!%zombie.ambushing && vectorDist(%zombie.targetedPlayer.getPosition(), %zombie.getPosition()) <= $Zombie::LungeDistance && %zombie.canJump && getWord(%vector, 2) <= 0.8) {
%zombie.setVelocity("0 0 0"); %zombie.setVelocity("0 0 0");
%vector = vectorScale(%vector, %zombie.speed * 2); %vector = vectorScale(%vector, 2);
%upvec *= 3.5; %upvec *= 3.5;
TWM2Lib_Zombie_Core("setZFlag", %zombie, "canJump", 0); TWM2Lib_Zombie_Core("setZFlag", %zombie, "canJump", 0);
schedule($Zombie::BaseJumpCooldown, 0, TWM2Lib_Zombie_Core, "setZFlag", %zombie, "canJump", 1); schedule($Zombie::BaseJumpCooldown, 0, TWM2Lib_Zombie_Core, "setZFlag", %zombie, "canJump", 1);

View file

@ -4770,7 +4770,7 @@ function DefaultGame::ToggleModifiers(%game, %modifier, %toggleTo) {
%ModifierDesc = "Normal zombies are now cloaked... mwuhahaha!!!"; %ModifierDesc = "Normal zombies are now cloaked... mwuhahaha!!!";
$HellJump::Modifier["YouCantSeeMe"] = %toggleTo; $HellJump::Modifier["YouCantSeeMe"] = %toggleTo;
case "Oh Lordy": case "Oh Lordy":
%ModifierDesc = "Zombie lords shoot 4 pulses instead of 2"; %ModifierDesc = "Reduces the cooldown rate of the Zombie Lord Photon Cannon by 50%";
$HellJump::Modifier["OhLordy"] = %toggleTo; $HellJump::Modifier["OhLordy"] = %toggleTo;
case "It BURNS!": case "It BURNS!":
%ModifierDesc = "Demon Zombie Fireballs now cause Burns"; %ModifierDesc = "Demon Zombie Fireballs now cause Burns";