mirror of
https://github.com/PhantomGamesDevelopment/TWM2.git
synced 2026-01-19 19:44:47 +00:00
Demon Zombie, Other Fixes
Fixed a speed issue in the new zombie AI, added Demon Zombies back in.
This commit is contained in:
parent
141e94ef7c
commit
0f6ac8cc6b
|
|
@ -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.
|
||||
|
|
@ -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);
|
||||
}
|
||||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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";
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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";
|
||||
|
|
|
|||
Loading…
Reference in a new issue