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
* 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
* 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
* 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
{
boundingBox = "1.63 1.63 2.6";
maxDamage = 4.0;
minImpactSpeed = 35;
shapeFile = "bioderm_heavy.dts";
datablock PlayerData(DemonZombieArmor) : LightMaleHumanArmor {
boundingBox = "1.63 1.63 2.6";
maxDamage = 4.0;
minImpactSpeed = 35;
shapeFile = "bioderm_heavy.dts";
debrisShapeName = "bio_player_debris.dts";
debrisShapeName = "bio_player_debris.dts";
//Foot Prints
decalData = HeavyBiodermFootprint;
decalOffset = 0.4;
//Foot Prints
decalData = HeavyBiodermFootprint;
decalOffset = 0.4;
waterBreathSound = WaterBreathBiodermSound;
waterBreathSound = WaterBreathBiodermSound;
damageScale[$DamageType::M1700] = 2.0;
damageScale[$DamageType::M1700] = 2.0;
max[RepairKit] = 0;
max[Mine] = 0;
max[Grenade] = 0;
};
function DZombiemovetotarget(%zombie){
if(!isobject(%zombie))
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);
function DemonZombieArmor::AI(%datablock, %zombie) {
if(!isObject(%zombie) || %zombie.getState() $= "dead") {
return;
}
if(%zombie.hastarget != 1){
serverPlay3d("ZombieHOWL",%zombie.getWorldBoxCenter());
%zombie.hastarget = 1;
%zPos = %zombie.getPosition();
if(%zombie.hasTarget) {
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);
if(%chance >= 19)
serverPlay3d("ZombieMoan",%zombie.getWorldBoxCenter());
%vector = ZgetFacingDirection(%zombie,%closestClient,%pos);
if (%closestdistance >= 10 && %closestdistance <= 150 && %zombie.canjump == 1){
DzombieFire(%zombie,%closestclient);
%zombie.canjump = 0;
schedule(4000, %zombie, "Zsetjump", %zombie);
}
%vector = vectorscale(%vector, $Zombie::DForwardSpeed);
if(%chance >= 19) {
serverPlay3d("ZombieMoan", %zombie.getWorldBoxCenter());
}
%vector = TWM2Lib_Zombie_Core("zombieGetFacingDirection", %zombie, %zombie.targetedPlayer.getPosition());
%distance = vectorDist(%pos, %zombie.targetedPlayer.getPosition());
if(%distance <= $Zombie::LungeDistance && %zombie.canjump == 1) {
%vector = vectorScale(%vector, 4);
}
%vector = vectorScale(%vector, %zombie.speed);
%upvec = "150";
%x = Getword(%vector,0);
%y = Getword(%vector,1);
%z = Getword(%vector,2);
if(%z >= ($Zombie::DForwardSpeed / 3 * 2))
%upvec = (%upvec * 5);
if(%z >= (%zombie.speed / 3 * 2)) {
%upvec = (%upvec * 5);
}
%vector = %x@" "@%y@" "@%upvec;
%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);
%zombie.applyImpulse(%pos, %vector);
}
function DZombieFire(%zombie,%closestclient){
%pos = %zombie.getMuzzlePoint(4);
%tpos = %closestclient.getWorldBoxCenter();
%tvel = %closestclient.getvelocity();
%vec = vectorsub(%tpos,%pos);
%dist = vectorlen(%vec);
%velpredict = vectorscale(%tvel,(%dist / 50));
%vector = vectoradd(%vec,%velpredict);
%ndist = vectorlen(%vector);
%upvec = "0 0 "@((%ndist / 50) * (%ndist / 50) * 2);
%vector = vectornormalize(vectoradd(%vector,%upvec));
if(Game.CheckModifier("ItBurns") == 1) {
%p = new GrenadeProjectile() {
dataBlock = DemonFlamingFireball;
initialDirection = %vector;
initialPosition = %pos;
sourceObject = %zombie;
sourceSlot = 4;
};
}
else {
%p = new GrenadeProjectile() {
dataBlock = DemonFireball;
initialDirection = %vector;
initialPosition = %pos;
sourceObject = %zombie;
sourceSlot = 4;
};
}
}
function DemonZombieArmor::zFire(%datablock, %zombie, %targetObject) {
if(!isObject(%zombie) || %zombie.getState() $= "dead") {
return;
}
if(!isObject(%targetObject)) {
return;
}
TWM2Lib_Zombie_Core("setZFlag", %zombie, "canFireWeapon", 0);
%pos = %zombie.getMuzzlePoint(4);
%tpos = %targetObject.getWorldBoxCenter();
%tvel = %targetObject.getvelocity();
%vec = vectorsub(%tpos, %pos);
%dist = vectorlen(%vec);
%velpredict = vectorscale(%tvel, (%dist / 50));
%vector = vectoradd(%vec, %velpredict);
%ndist = vectorlen(%vector);
%upvec = "0 0 "@((%ndist / 50) * (%ndist / 50) * 2);
%vector = vectornormalize(vectoradd(%vector, %upvec));
if(Game.CheckModifier("ItBurns") == 1) {
%p = new GrenadeProjectile() {
dataBlock = DemonFlamingFireball;
initialDirection = %vector;
initialPosition = %pos;
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?
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?
%tPos = %zombie.targetedPlayer.getPosition();
if(%zombie.targetIsTank) {
@ -379,7 +388,11 @@ function LordZombieArmor::zFire(%datablock, %zombie, %targetObject) {
};
MissionCleanup.add(%p);
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) {

View file

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

View file

@ -118,7 +118,7 @@ function RavagerZombieArmor::Move(%datablock, %zombie) {
//Lunge behavior
if(!%zombie.ambushing && vectorDist(%zombie.targetedPlayer.getPosition(), %zombie.getPosition()) <= $Zombie::LungeDistance && %zombie.canJump && getWord(%vector, 2) <= 0.8) {
%zombie.setVelocity("0 0 0");
%vector = vectorScale(%vector, %zombie.speed * 2);
%vector = vectorScale(%vector, 2);
%upvec *= 3.5;
TWM2Lib_Zombie_Core("setZFlag", %zombie, "canJump", 0);
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!!!";
$HellJump::Modifier["YouCantSeeMe"] = %toggleTo;
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;
case "It BURNS!":
%ModifierDesc = "Demon Zombie Fireballs now cause Burns";