From 0f6ac8cc6b85649ca1f0e7629a75263d2b2b27f4 Mon Sep 17 00:00:00 2001 From: Robert Fritzen Date: Tue, 17 Oct 2017 14:57:12 -0500 Subject: [PATCH] Demon Zombie, Other Fixes Fixed a speed issue in the new zombie AI, added Demon Zombies back in. --- README.md | 2 + scripts/TWM2/Zombie/ZombieTypes/Demon.cs | 185 ++++++++++++--------- scripts/TWM2/Zombie/ZombieTypes/Lord.cs | 15 +- scripts/TWM2/Zombie/ZombieTypes/Normal.cs | 2 +- scripts/TWM2/Zombie/ZombieTypes/Ravager.cs | 2 +- scripts/defaultGame.cs | 2 +- 6 files changed, 125 insertions(+), 83 deletions(-) diff --git a/README.md b/README.md index 0d0b886..64cfa30 100644 --- a/README.md +++ b/README.md @@ -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. \ No newline at end of file diff --git a/scripts/TWM2/Zombie/ZombieTypes/Demon.cs b/scripts/TWM2/Zombie/ZombieTypes/Demon.cs index 4e0a9bf..15860d4 100644 --- a/scripts/TWM2/Zombie/ZombieTypes/Demon.cs +++ b/scripts/TWM2/Zombie/ZombieTypes/Demon.cs @@ -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); +} \ No newline at end of file diff --git a/scripts/TWM2/Zombie/ZombieTypes/Lord.cs b/scripts/TWM2/Zombie/ZombieTypes/Lord.cs index 5693e1e..ce6c401 100644 --- a/scripts/TWM2/Zombie/ZombieTypes/Lord.cs +++ b/scripts/TWM2/Zombie/ZombieTypes/Lord.cs @@ -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) { diff --git a/scripts/TWM2/Zombie/ZombieTypes/Normal.cs b/scripts/TWM2/Zombie/ZombieTypes/Normal.cs index 2a188f4..82f1292 100644 --- a/scripts/TWM2/Zombie/ZombieTypes/Normal.cs +++ b/scripts/TWM2/Zombie/ZombieTypes/Normal.cs @@ -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"; diff --git a/scripts/TWM2/Zombie/ZombieTypes/Ravager.cs b/scripts/TWM2/Zombie/ZombieTypes/Ravager.cs index 85b1d0c..1d1566e 100644 --- a/scripts/TWM2/Zombie/ZombieTypes/Ravager.cs +++ b/scripts/TWM2/Zombie/ZombieTypes/Ravager.cs @@ -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); diff --git a/scripts/defaultGame.cs b/scripts/defaultGame.cs index 1edc19b..c1510c9 100644 --- a/scripts/defaultGame.cs +++ b/scripts/defaultGame.cs @@ -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";