From 72e1591f450ae606c1291a4b669803d1bfa0d9e9 Mon Sep 17 00:00:00 2001 From: Robert Fritzen Date: Tue, 5 Sep 2017 15:54:48 -0500 Subject: [PATCH] Boss Proficiency Added the back end for the new boss proficiency system coming in 3.9b, Shade Lord proficiency is now installed. --- scripts/TWM2/Bosses/ShadeLord.cs | 928 +++++++++++++++-------------- scripts/TWM2/Systems/BossSystem.cs | 708 ++++++++++++---------- 2 files changed, 860 insertions(+), 776 deletions(-) diff --git a/scripts/TWM2/Bosses/ShadeLord.cs b/scripts/TWM2/Bosses/ShadeLord.cs index 8c6e971..a1d4c69 100644 --- a/scripts/TWM2/Bosses/ShadeLord.cs +++ b/scripts/TWM2/Bosses/ShadeLord.cs @@ -1,3 +1,16 @@ +$Boss::Proficiency["ShadeLord", 0] = "Team Bronze\t1000\tDefeat the Shade Lord with your team dying no more than 25 times"; +$Boss::ProficiencyCode["ShadeLord", 0] = "$TWM2::BossManager.bossKills < 25"; +$Boss::Proficiency["ShadeLord", 1] = "Team Silver\t5000\tDefeat the Shade Lord with your team dying no more than 15 times"; +$Boss::ProficiencyCode["ShadeLord", 1] = "$TWM2::BossManager.bossKills < 15"; +$Boss::Proficiency["ShadeLord", 2] = "Team Gold\t10000\tDefeat the Shade Lord with your team dying no more than 10 times"; +$Boss::ProficiencyCode["ShadeLord", 2] = "$TWM2::BossManager.bossKills < 10"; +$Boss::Proficiency["ShadeLord", 3] = "Unbroken\t25000\tDefeat the Shade Lord without dying, and dealing more than 15% damage to him"; +$Boss::ProficiencyCode["ShadeLord", 3] = "[bProf].bossDeaths == 0 && [dPerc] > 15"; +$Boss::Proficiency["ShadeLord", 4] = "Smite the Shadows\t50000\tDefeat the Shade Lord with the shade lord causing no deaths"; +$Boss::ProficiencyCode["ShadeLord", 4] = "$TWM2::BossManager.bossKills == 0"; +$Boss::Proficiency["ShadeLord", 5] = "Shade Buster\t7500\tDefeat the Shade Lord without dying once by the elemental shade"; +$Boss::ProficiencyCode["ShadeLord", 5] = "[bProf].shadeDeaths == 0"; + //SHADE LORD datablock ParticleData(ShadeSwordParticle) { dragCoeffiecient = 0.0; @@ -428,477 +441,478 @@ function SpawnShadeLord(%position) { } function ShadeLordFunction(%boss, %function, %args) { - switch$(%function) { + switch$(%function) { - //------------- - //Boss Attacks - //------------- - case "Att_ShadeStrike": - %target = getWord(%args, 0); - %boss.setMoveState(true); - %boss.schedule(5000, setMoveState, false); - %boss.setActionThread($Zombie::RogThread,true); - // - %bPos = %boss.getPosition(); - %start1 = vectorAdd(%bPos, "300 -300 50"); - %go = vectorAdd(%bPos, "-300 300 50"); - %interval = 15; - for(%i = 0; %i < 3; %i++) { - %neg = %i % 2 == 0 ? 1 : -1; - %start = vectorAdd(%start1, %neg*%interval*%i@" 0 0"); - %vec = vectorNormalize(vectorSub(%go,%start)); - %p = new SeekerProjectile() { - dataBlock = ShadeLordSword; - initialDirection = %vec; - initialPosition = %start; - }; - %p.sourceObject = %boss; - %p.targetedPlayer = %target; - %beacon = new BeaconObject() { - dataBlock = "SubBeacon"; - beaconType = "vehicle"; - position = %target.player.getWorldBoxCenter(); - }; - %beacon.team = 0; - %beacon.setTarget(0); - MissionCleanup.add(%beacon); - %p.setObjectTarget(%beacon); - DemonMotherMissileFollow(%target,%beacon,%p); - } + //------------- + //Boss Attacks + //------------- + case "Att_ShadeStrike": + %target = getWord(%args, 0); + %boss.setMoveState(true); + %boss.schedule(5000, setMoveState, false); + %boss.setActionThread($Zombie::RogThread,true); + // + %bPos = %boss.getPosition(); + %start1 = vectorAdd(%bPos, "300 -300 50"); + %go = vectorAdd(%bPos, "-300 300 50"); + %interval = 15; + for(%i = 0; %i < 3; %i++) { + %neg = %i % 2 == 0 ? 1 : -1; + %start = vectorAdd(%start1, %neg*%interval*%i@" 0 0"); + %vec = vectorNormalize(vectorSub(%go,%start)); + %p = new SeekerProjectile() { + dataBlock = ShadeLordSword; + initialDirection = %vec; + initialPosition = %start; + }; + %p.sourceObject = %boss; + %p.targetedPlayer = %target; + %beacon = new BeaconObject() { + dataBlock = "SubBeacon"; + beaconType = "vehicle"; + position = %target.player.getWorldBoxCenter(); + }; + %beacon.team = 0; + %beacon.setTarget(0); + MissionCleanup.add(%beacon); + %p.setObjectTarget(%beacon); + DemonMotherMissileFollow(%target,%beacon,%p); + } - case "Att_HealSequence": - %count = getWord(%args, 0); - if(!isObject(%boss) || %boss.getState() $= "dead") { - return; - } - if(%count == 0) { - %boss.setMoveState(true); - %boss.setPosition(vectorAdd(%boss.getPosition(), TWM2Lib_MainControl("getRandomPosition", 300 TAB 1))); - cancel(%boss.moveLoop); - } - if(%count < 25) { - %boss.setDamageLevel(%boss.getDamageLevel() - 0.1); - createLifeEmitter(%boss.getPosition(), PrebeamEmitter, 5000); - } - else { - %boss.schedule(3000, setMoveState, false); - %boss.moveloop = schedule(3000, %boss, "ShadeLordFunction", %boss, "ShadeLordDoMove", ""); - return; - } - schedule(200, %boss, "ShadeLordFunction", %boss, "Att_HealSequence", %count++); + case "Att_HealSequence": + %count = getWord(%args, 0); + if(!isObject(%boss) || %boss.getState() $= "dead") { + return; + } + if(%count == 0) { + %boss.setMoveState(true); + %boss.setPosition(vectorAdd(%boss.getPosition(), TWM2Lib_MainControl("getRandomPosition", 300 TAB 1))); + cancel(%boss.moveLoop); + } + if(%count < 25) { + %boss.setDamageLevel(%boss.getDamageLevel() - 0.1); + createLifeEmitter(%boss.getPosition(), PrebeamEmitter, 5000); + } + else { + %boss.schedule(3000, setMoveState, false); + %boss.moveloop = schedule(3000, %boss, "ShadeLordFunction", %boss, "ShadeLordDoMove", ""); + return; + } + schedule(200, %boss, "ShadeLordFunction", %boss, "Att_HealSequence", %count++); - case "Att_ShadeLordDecend": - %count = getWord(%args, 0); - if(%count == 0) { - cancel(%boss.moveLoop); - //%boss.rapierShield = 1; - %boss.setMoveState(true); - if(isObject(%boss.shadeStorm)) { - %boss.shadeStorm.delete(); - } - } - else if(%count > 0 && %count <= 25) { - %pos = "0 0 "@ 250 - (10 * %count); - if(isObject(%boss.shadeStorm)) { - %boss.shadeStorm.delete(); - } - %boss.shadeStorm = new ParticleEmissionDummy(){ - position = vectoradd(%boss.getPosition(), %pos); - dataBlock = "defaultEmissionDummy"; - emitter = "ShadeStormEmitter"; //ShadeStormEmitter - }; - } - else if(%count == 26) { - for(%i = 0; %i < ClientGroup.getCount(); %i++) { - %cl = ClientGroup.getObject(%i); - if(isObject(%cl.player) && %cl.player.getState() !$= "dead") { - ShadeLordFunction(%boss, "ShadeLordDropKill", %cl.player); - } - } - if(isObject(%boss.shadeStorm)) { - %boss.shadeStorm.delete(); - } - %boss.shadeStorm = new ParticleEmissionDummy(){ - position = vectoradd(%boss.getPosition(), "0 0 0.5"); - dataBlock = "defaultEmissionDummy"; - emitter = "ShadeStormEmitter"; //ShadeStormEmitter - }; - } - else if(%count > 26 && %count < 40) { - if(isObject(%boss.shadeStorm)) { - %boss.shadeStorm.delete(); - } - %boss.shadeStorm = new ParticleEmissionDummy(){ - position = vectoradd(%boss.getPosition(), "0 0 1.5"); - dataBlock = "defaultEmissionDummy"; - emitter = "ShadeStormEmitter"; //ShadeStormEmitter - }; - } - else if(%count == 40) { - %boss.setMoveState(false); - %boss.moveloop = schedule(3000, %boss, "ShadeLordFunction", %boss, "ShadeLordDoMove", ""); - //flash all - for(%i = 0; %i < ClientGroup.getCount(); %i++) { - %cl = ClientGroup.getObject(%i); - if(isObject(%cl.player) && %cl.player.getState() !$= "dead") { - %cl.player.setWhiteout(1.0); - } - } - return; - } - %count++; - schedule(300, %boss, "ShadeLordFunction", %boss, "Att_ShadeLordDecend", %count); + case "Att_ShadeLordDecend": + %count = getWord(%args, 0); + if(%count == 0) { + cancel(%boss.moveLoop); + //%boss.rapierShield = 1; + %boss.setMoveState(true); + if(isObject(%boss.shadeStorm)) { + %boss.shadeStorm.delete(); + } + } + else if(%count > 0 && %count <= 25) { + %pos = "0 0 "@ 250 - (10 * %count); + if(isObject(%boss.shadeStorm)) { + %boss.shadeStorm.delete(); + } + %boss.shadeStorm = new ParticleEmissionDummy(){ + position = vectoradd(%boss.getPosition(), %pos); + dataBlock = "defaultEmissionDummy"; + emitter = "ShadeStormEmitter"; //ShadeStormEmitter + }; + } + else if(%count == 26) { + for(%i = 0; %i < ClientGroup.getCount(); %i++) { + %cl = ClientGroup.getObject(%i); + if(isObject(%cl.player) && %cl.player.getState() !$= "dead") { + ShadeLordFunction(%boss, "ShadeLordDropKill", %cl.player); + } + } + if(isObject(%boss.shadeStorm)) { + %boss.shadeStorm.delete(); + } + %boss.shadeStorm = new ParticleEmissionDummy(){ + position = vectoradd(%boss.getPosition(), "0 0 0.5"); + dataBlock = "defaultEmissionDummy"; + emitter = "ShadeStormEmitter"; //ShadeStormEmitter + }; + } + else if(%count > 26 && %count < 40) { + if(isObject(%boss.shadeStorm)) { + %boss.shadeStorm.delete(); + } + %boss.shadeStorm = new ParticleEmissionDummy(){ + position = vectoradd(%boss.getPosition(), "0 0 1.5"); + dataBlock = "defaultEmissionDummy"; + emitter = "ShadeStormEmitter"; //ShadeStormEmitter + }; + } + else if(%count == 40) { + %boss.setMoveState(false); + %boss.moveloop = schedule(3000, %boss, "ShadeLordFunction", %boss, "ShadeLordDoMove", ""); + //flash all + for(%i = 0; %i < ClientGroup.getCount(); %i++) { + %cl = ClientGroup.getObject(%i); + if(isObject(%cl.player) && %cl.player.getState() !$= "dead") { + %cl.player.setWhiteout(1.0); + } + } + return; + } + %count++; + schedule(300, %boss, "ShadeLordFunction", %boss, "Att_ShadeLordDecend", %count); - case "Att_ShadeLordScream": - cancel(%boss.moveloop); - %boss.setMoveState(true); - %boss.schedule(5000, setMoveState, false); - //create emitter - %screamEmit = new ParticleEmissionDummy(){ - position = vectoradd(%boss.getPosition(),"0 0 0.5"); - dataBlock = "defaultEmissionDummy"; - emitter = "ShadeLordScreamEmitter"; //ShadeStormEmitter - }; - %screamEmit.schedule(5000, "delete"); - - //knock down and throw weapons in radius. - %TargetSearchMask = $TypeMasks::PlayerObjectType; - InitContainerRadiusSearch(%boss.getPosition(), 45, %TargetSearchMask); - while ((%potentialTarget = ContainerSearchNext()) != 0) { - if(isSet(%potentialTarget.client)) { - //throw guns, knock down. - %potentialTarget.setActionThread("death1", true); - %potentialTarget.throwweapon(1); - %potentialTarget.throwweapon(0); - %potentialTarget.setMoveState(true); - %potentialTarget.schedule(3000, setMoveState, false); - } - } - // - %boss.moveloop = schedule(5000, %boss, "ShadeLordFunction", %boss, "ShadeLordDoMove", ""); + case "Att_ShadeLordScream": + cancel(%boss.moveloop); + %boss.setMoveState(true); + %boss.schedule(5000, setMoveState, false); + //create emitter + %screamEmit = new ParticleEmissionDummy(){ + position = vectoradd(%boss.getPosition(),"0 0 0.5"); + dataBlock = "defaultEmissionDummy"; + emitter = "ShadeLordScreamEmitter"; //ShadeStormEmitter + }; + %screamEmit.schedule(5000, "delete"); - //------------- - //Boss Functions - //------------- - case "ShadeLordDarkAttacks": - if(!isObject(%boss) || %boss.getState() $= "Dead") { - return; - } - if(isObject(%boss.dayCloak)) { - %boss.dayCloak.delete(); - } - if(%boss.randomFX $= "") { - %boss.randomFX = ShadeLordFunction(%boss, "ShadeStormFX", ""); - } - if(%boss.antiSky $= "") { - %boss.antiSky = ShadeLordFunction(%boss, "ShadeStormAntiSky", ""); - } - %attack = getRandom(1, 3); - switch(%attack) { - case 1: - MessageAll('MsgBossSpawn', "\c4"@$TWM2::BossName["ShadeLord"]@": SHALDORVAAAAAAAAAAAAAAH!!!!!!!"); - ShadeLordFunction(%boss, "Att_ShadeLordScream", ""); - case 2: - MessageAll('MsgBossSpawn', "\c4"@$TWM2::BossName["ShadeLord"]@": Descend Mighty Shade Storm, Destroy all who dare oppose us!"); - ShadeLordFunction(%boss, "Att_ShadeLordDecend", 0); - case 3: - %target = FindValidTarget(%boss); - MessageAll('MessageAll', "\c4"@$TWM2::BossName["ShadeLord"]@": Come forth my shade, Destroy "@getTaggedString(%target.name)@"!"); - if(isObject(%target.player)) { - ShadeLordFunction(%boss, "Att_ShadeStrike", %target.player); - } - else { - MessageAll('MessageAll', "\c4"@$TWM2::BossName["ShadeLord"]@": Hiding in death does not save you "@getTaggedString(%target.name)@""); - } - } - %boss.attacks = schedule(25000, %boss, "ShadeLordFunction", %boss, "ShadeLordDarkAttacks", ""); + //knock down and throw weapons in radius. + %TargetSearchMask = $TypeMasks::PlayerObjectType; + InitContainerRadiusSearch(%boss.getPosition(), 45, %TargetSearchMask); + while ((%potentialTarget = ContainerSearchNext()) != 0) { + if(isSet(%potentialTarget.client)) { + //throw guns, knock down. + %potentialTarget.setActionThread("death1", true); + %potentialTarget.throwweapon(1); + %potentialTarget.throwweapon(0); + %potentialTarget.setMoveState(true); + %potentialTarget.schedule(3000, setMoveState, false); + } + } + // + %boss.moveloop = schedule(5000, %boss, "ShadeLordFunction", %boss, "ShadeLordDoMove", ""); - case "ShadeLordLightAttacks": - if(!isObject(%boss) || %boss.getState() $= "Dead") { - return; - } - if(isObject(%boss.shadeStorm)) { - %boss.shadeStorm.delete(); - } - if(!isObject(%boss) || !%boss.getState() $= "dead") { - if(isObject(%boss.dayCloak)) { - %boss.dayCloak.delete(); - } - if(isObject(%boss.shadeStorm)) { - %boss.shadeStorm.delete(); - } - return; - } - %attack = getRandom(1, 2); - switch(%attack) { - case 1: - MessageAll('MsgBossSpawn', "\c4"@$TWM2::BossName["ShadeLord"]@": SHALDORVAAAAAAAAAAAAAAH!!!!!!!"); - ShadeLordFunction(%boss, "Att_ShadeLordScream", ""); - case 2: - MessageAll('MsgBossEvilness', "\c4"@$TWM2::BossName["ShadeLord"]@": Come forth, and return to me the power of the shadows!"); - ShadeLordFunction(%boss, "Att_HealSequence", 0); - } - %boss.attacks = schedule(25000, %boss, "ShadeLordFunction", %boss, "ShadeLordLightAttacks", ""); + //------------- + //Boss Functions + //------------- + case "ShadeLordDarkAttacks": + if(!isObject(%boss) || %boss.getState() $= "Dead") { + return; + } + if(isObject(%boss.dayCloak)) { + %boss.dayCloak.delete(); + } + if(%boss.randomFX $= "") { + %boss.randomFX = ShadeLordFunction(%boss, "ShadeStormFX", ""); + } + if(%boss.antiSky $= "") { + %boss.antiSky = ShadeLordFunction(%boss, "ShadeStormAntiSky", ""); + } + %attack = getRandom(1, 3); + switch(%attack) { + case 1: + MessageAll('MsgBossSpawn', "\c4"@$TWM2::BossName["ShadeLord"]@": SHALDORVAAAAAAAAAAAAAAH!!!!!!!"); + ShadeLordFunction(%boss, "Att_ShadeLordScream", ""); + case 2: + MessageAll('MsgBossSpawn', "\c4"@$TWM2::BossName["ShadeLord"]@": Descend Mighty Shade Storm, Destroy all who dare oppose us!"); + ShadeLordFunction(%boss, "Att_ShadeLordDecend", 0); + case 3: + %target = FindValidTarget(%boss); + MessageAll('MessageAll', "\c4"@$TWM2::BossName["ShadeLord"]@": Come forth my shade, Destroy "@getTaggedString(%target.name)@"!"); + if(isObject(%target.player)) { + ShadeLordFunction(%boss, "Att_ShadeStrike", %target.player); + } + else { + MessageAll('MessageAll', "\c4"@$TWM2::BossName["ShadeLord"]@": Hiding in death does not save you "@getTaggedString(%target.name)@""); + } + } + %boss.attacks = schedule(25000, %boss, "ShadeLordFunction", %boss, "ShadeLordDarkAttacks", ""); - case "ShadeStormFX": - if(!isObject(%boss) || %boss.getState() $= "Dead") { - return; - } - %bPos = %boss.getPosition(); - %start1 = vectorAdd(%bPos, "300 -300 50"); - %go = vectorAdd(%bPos, "-300 300 50"); - %interval = 15; - for(%i = 0; %i < 20; %i++) { - %neg = %i % 2 == 0 ? 1 : -1; - %start = vectorAdd(%start1, %neg*%interval*%i@" 0 0"); - %vec = vectorNormalize(vectorSub(%go,%start)); - %p = new SeekerProjectile() { - dataBlock = ShadeLordSword; - initialDirection = %vec; - initialPosition = %start; - }; - %p.sourceObject = %boss; - MissionCleanup.add(%p); - } - %boss.randomFX = schedule(getRandom(10000, 25000), %boss, "ShadeLordFunction", %boss, "ShadeStormFX", ""); - - case "ShadeStormAntiSky": - if(!isObject(%boss) || %boss.getState() $= "Dead") { - return; - } - if(!$ShadeLordBoss::AllowedNighttime) { - return; - } - %killHeight = getWord(%boss.getPosition(), 2) + 50; - for(%i = 0; %i < ClientGroup.getCount(); %i++) { - %cl = ClientGroup.getObject(%i); - if(isObject(%cl.player) && %cl.player.getState() !$= "dead") { - if(getWord(%cl.player.getPosition(), 2) >= %killHeight) { - ShadeLordFunction(%boss, "ShadeLordDropKill", %cl.player); - } - } - } - %boss.antiSky = schedule(2500, %boss, "ShadeLordFunction", %boss, "ShadeStormAntiSky", ""); + case "ShadeLordLightAttacks": + if(!isObject(%boss) || %boss.getState() $= "Dead") { + return; + } + if(isObject(%boss.shadeStorm)) { + %boss.shadeStorm.delete(); + } + if(!isObject(%boss) || !%boss.getState() $= "dead") { + if(isObject(%boss.dayCloak)) { + %boss.dayCloak.delete(); + } + if(isObject(%boss.shadeStorm)) { + %boss.shadeStorm.delete(); + } + return; + } + %attack = getRandom(1, 2); + switch(%attack) { + case 1: + MessageAll('MsgBossSpawn', "\c4"@$TWM2::BossName["ShadeLord"]@": SHALDORVAAAAAAAAAAAAAAH!!!!!!!"); + ShadeLordFunction(%boss, "Att_ShadeLordScream", ""); + case 2: + MessageAll('MsgBossEvilness', "\c4"@$TWM2::BossName["ShadeLord"]@": Come forth, and return to me the power of the shadows!"); + ShadeLordFunction(%boss, "Att_HealSequence", 0); + } + %boss.attacks = schedule(25000, %boss, "ShadeLordFunction", %boss, "ShadeLordLightAttacks", ""); - case "ShadeLordDoDeath": - %boss.RapierShield = 1; - %boss.inDeath = 1; - if(isObject(%boss.dayCloak)) { - %boss.dayCloak.delete(); - } - if(isObject(%boss.shadeStorm)) { - %boss.shadeStorm.delete(); - } - //set on fire - %fire = new ParticleEmissionDummy(){ - position = vectoradd(%boss.getPosition(),"0 0 0.5"); - dataBlock = "defaultEmissionDummy"; - emitter = "BurnEmitter"; - }; - MissionCleanup.add(%fire); - %fire.schedule(5000, delete); - // - %Boss.setMoveState(true); - %boss.setActionThread("death1", true); - %boss.schedule(5000, "blowup"); - %boss.schedule(5000, "scriptkill"); - schedule(4999, 0, eval, ""@%boss@".rapierShield = 0;"); - - Serverplay3D($Ion::ThunderSound[mFloor(getRandom() * $Ion::ThunderSoundCount)],%boss.getPosition()); - Serverplay3D($Ion::ThunderSound[mFloor(getRandom() * $Ion::ThunderSoundCount)],%boss.getPosition()); - Serverplay3D($Ion::ThunderSound[mFloor(getRandom() * $Ion::ThunderSoundCount)],%boss.getPosition()); - Serverplay3D($Ion::ThunderSound[mFloor(getRandom() * $Ion::ThunderSoundCount)],%boss.getPosition()); - Serverplay3D($Ion::ThunderSound[mFloor(getRandom() * $Ion::ThunderSoundCount)],%boss.getPosition()); - Serverplay3D($Ion::ThunderSound[mFloor(getRandom() * $Ion::ThunderSoundCount)],%boss.getPosition()); + case "ShadeStormFX": + if(!isObject(%boss) || %boss.getState() $= "Dead") { + return; + } + %bPos = %boss.getPosition(); + %start1 = vectorAdd(%bPos, "300 -300 50"); + %go = vectorAdd(%bPos, "-300 300 50"); + %interval = 15; + for(%i = 0; %i < 20; %i++) { + %neg = %i % 2 == 0 ? 1 : -1; + %start = vectorAdd(%start1, %neg*%interval*%i@" 0 0"); + %vec = vectorNormalize(vectorSub(%go,%start)); + %p = new SeekerProjectile() { + dataBlock = ShadeLordSword; + initialDirection = %vec; + initialPosition = %start; + }; + %p.sourceObject = %boss; + MissionCleanup.add(%p); + } + %boss.randomFX = schedule(getRandom(10000, 25000), %boss, "ShadeLordFunction", %boss, "ShadeStormFX", ""); - case "ShadeLordToggleCondition": - %flag = getWord(%args, 0); - if(!isObject(%boss) || %boss.getState() $= "dead") { - return; - } - cancel(%boss.attacks); - if(%flag) { - Serverplay3D($Ion::ThunderSound[mFloor(getRandom() * $Ion::ThunderSoundCount)], %boss.getPosition()); - Serverplay3D($Ion::ThunderSound[mFloor(getRandom() * $Ion::ThunderSoundCount)], %boss.getPosition()); - Serverplay3D($Ion::ThunderSound[mFloor(getRandom() * $Ion::ThunderSoundCount)], %boss.getPosition()); - Serverplay3D($Ion::ThunderSound[mFloor(getRandom() * $Ion::ThunderSoundCount)], %boss.getPosition()); - Serverplay3D($Ion::ThunderSound[mFloor(getRandom() * $Ion::ThunderSoundCount)], %boss.getPosition()); - Serverplay3D($Ion::ThunderSound[mFloor(getRandom() * $Ion::ThunderSoundCount)], %boss.getPosition()); - %Boss.setMoveState(true); - %Boss.setActionThread("cel4",true); - %Boss.schedule(3500, "SetMoveState", false); - skyVeryDark(); + case "ShadeStormAntiSky": + if(!isObject(%boss) || %boss.getState() $= "Dead") { + return; + } + if(!$ShadeLordBoss::AllowedNighttime) { + return; + } + %killHeight = getWord(%boss.getPosition(), 2) + 50; + for(%i = 0; %i < ClientGroup.getCount(); %i++) { + %cl = ClientGroup.getObject(%i); + if(isObject(%cl.player) && %cl.player.getState() !$= "dead") { + if(getWord(%cl.player.getPosition(), 2) >= %killHeight) { + ShadeLordFunction(%boss, "ShadeLordDropKill", %cl.player); + } + } + } + %boss.antiSky = schedule(2500, %boss, "ShadeLordFunction", %boss, "ShadeStormAntiSky", ""); - %boss.attacks = ShadeLordFunction(%boss, "ShadeLordDarkAttacks", ""); - } - else { - Serverplay3D($Ion::ThunderSound[mFloor(getRandom() * $Ion::ThunderSoundCount)], %boss.getPosition()); - Serverplay3D($Ion::ThunderSound[mFloor(getRandom() * $Ion::ThunderSoundCount)], %boss.getPosition()); - Serverplay3D($Ion::ThunderSound[mFloor(getRandom() * $Ion::ThunderSoundCount)], %boss.getPosition()); - Serverplay3D($Ion::ThunderSound[mFloor(getRandom() * $Ion::ThunderSoundCount)], %boss.getPosition()); - Serverplay3D($Ion::ThunderSound[mFloor(getRandom() * $Ion::ThunderSoundCount)], %boss.getPosition()); - Serverplay3D($Ion::ThunderSound[mFloor(getRandom() * $Ion::ThunderSoundCount)], %boss.getPosition()); - %Boss.setMoveState(true); - %Boss.setActionThread("death1",true); - %Boss.schedule(3000, "setActionThread", "cel4", true); - %Boss.schedule(4500, "SetMoveState", false); - skyDusk(); - - cancel(%boss.antiSky); - cancel(%boss.randomFX); - - %boss.antiSky = ""; - %boss.randomFX = ""; - %boss.attacks = schedule(4500, %boss, "ShadeLordFunction", %boss, "ShadeLordLightAttacks", ""); - } + case "ShadeLordDoDeath": + %boss.RapierShield = 1; + %boss.inDeath = 1; + if(isObject(%boss.dayCloak)) { + %boss.dayCloak.delete(); + } + if(isObject(%boss.shadeStorm)) { + %boss.shadeStorm.delete(); + } + //set on fire + %fire = new ParticleEmissionDummy(){ + position = vectoradd(%boss.getPosition(),"0 0 0.5"); + dataBlock = "defaultEmissionDummy"; + emitter = "BurnEmitter"; + }; + MissionCleanup.add(%fire); + %fire.schedule(5000, delete); + // + %Boss.setMoveState(true); + %boss.setActionThread("death1", true); + %boss.schedule(5000, "blowup"); + %boss.schedule(5000, "scriptkill"); + schedule(4999, 0, eval, ""@%boss@".rapierShield = 0;"); - case "ShadeLordDoMove": - if(!isobject(%boss) || %boss.getState() $= "Dead") { - if(isObject(%boss.dayCloak)) { - %boss.dayCloak.delete(); - } - if(isObject(%boss.shadeStorm)) { - %boss.shadeStorm.delete(); - } - return; - } - if(%boss.getDamageLeftPct() < 0.025) { - ShadeLordFunction(%boss, "ShadeLordDoDeath", ""); - } - if(%boss.getDamageLeftPct() < 0.4) { - if($ShadeLordBoss::AllowedNighttime == 1) { - $ShadeLordBoss::AllowedNighttime = 0; - ShadeLordFunction(%boss, "ShadeLordToggleCondition", 0); - MessageAll('MsgBossSpawn', "\c4"@$TWM2::BossName["ShadeLord"]@": No, You will not break the barrier of dark!"); - } - } - else { - if($ShadeLordBoss::AllowedNighttime == 0) { - $ShadeLordBoss::AllowedNighttime = 1; - ShadeLordFunction(%boss, "ShadeLordToggleCondition", 1); - MessageAll('MsgBossSpawn', "\c4"@$TWM2::BossName["ShadeLord"]@": Awaken, mighty storm of shade, bring forth the doom of our foes!"); - } - } - if(isObject(%boss.dayCloak) && !%boss.inDeath) { - %boss.dayCloak.delete(); - %boss.dayCloak = new ParticleEmissionDummy(){ - position = vectoradd(%boss.getPosition(),"0 0 0.5"); - dataBlock = "defaultEmissionDummy"; - emitter = "dayCloakEmitter"; //ShadeStormEmitter - }; - MissionCleanup.add(%boss.dayCloak); - } - else { - if($ShadeLordBoss::AllowedNighttime == 0) { - %boss.dayCloak = new ParticleEmissionDummy(){ - position = vectoradd(%boss.getPosition(),"0 0 0.5"); - dataBlock = "defaultEmissionDummy"; - emitter = "dayCloakEmitter"; //ShadeStormEmitter - }; - } - } - if(isObject(%boss.shadeStorm)) { - %boss.shadeStorm.delete(); - %boss.shadeStorm = new ParticleEmissionDummy(){ - position = vectoradd(%boss.getPosition(),"0 0 250"); - dataBlock = "defaultEmissionDummy"; - emitter = "ShadeStormEmitter"; //ShadeStormEmitter - }; - } - else { - if($ShadeLordBoss::AllowedNighttime == 1) { - %boss.shadeStorm = new ParticleEmissionDummy(){ - position = vectoradd(%boss.getPosition(),"0 0 250"); - dataBlock = "defaultEmissionDummy"; - emitter = "ShadeStormEmitter"; //ShadeStormEmitter - }; - } - } - %pos = %boss.getworldboxcenter(); - %closestClient = ZombieLookForTarget(%boss); - %z = getWord(%pos, 2); - if(%z < -300) { - %boss.startFade(400, 0, true); - %boss.startFade(1000, 0, false); - %boss.setPosition(vectorAdd(vectoradd(%closestclient.getPosition(), "0 0 20"), TWM2Lib_MainControl("getRandomPosition", 25 TAB 1))); - %boss.setVelocity("0 0 0"); - MessageAll('MsgVardison', "\c4"@$TWM2::BossName["ShadeLord"]@": I'm back...."); - } - %closestDistance = getWord(%closestClient,1); - %closestClient = getWord(%closestClient,0).Player; - if(%closestDistance <= $Zombie::detectDist) { - if(%closestDistance < 10) { - ShadeLordFunction(%boss, "ShadeLordDropKill", %closestClient); - MessageAll('MsgVardison', "\c4"@$TWM2::BossName["ShadeLord"]@": Feel The Vengeance of the Shadows "@getTaggedString(%closestClient.client.name)@"."); - %closestClient.setMoveState(true); - ShadeLordFunction(%boss, "ShadeLordRandomTeleport", ""); - } - if(%boss.hastarget != 1){ - %boss.hastarget = 1; - } - %vector = ZgetFacingDirection(%boss,%closestClient,%pos); - %vector = vectorscale(%vector, ($Zombie::DForwardSpeed) * 0.6); - %upvec = "150"; - %x = Getword(%vector,0); - %y = Getword(%vector,1); - %z = Getword(%vector,2); - if(%z >= ($Zombie::DForwardSpeed)) - %upvec = (%upvec * 5); - %vector = %x@" "@%y@" "@%upvec; - %boss.applyImpulse(%pos, %vector); - } - else if(%boss.hastarget == 1){ - %boss.hastarget = 0; - %boss.DemonRmove = schedule(100, %boss, "ZSetRandomMove", %boss); - } - %boss.moveloop = schedule(230, %boss, "ShadeLordFunction", %boss, "ShadeLordDoMove", ""); + Serverplay3D($Ion::ThunderSound[mFloor(getRandom() * $Ion::ThunderSoundCount)],%boss.getPosition()); + Serverplay3D($Ion::ThunderSound[mFloor(getRandom() * $Ion::ThunderSoundCount)],%boss.getPosition()); + Serverplay3D($Ion::ThunderSound[mFloor(getRandom() * $Ion::ThunderSoundCount)],%boss.getPosition()); + Serverplay3D($Ion::ThunderSound[mFloor(getRandom() * $Ion::ThunderSoundCount)],%boss.getPosition()); + Serverplay3D($Ion::ThunderSound[mFloor(getRandom() * $Ion::ThunderSoundCount)],%boss.getPosition()); + Serverplay3D($Ion::ThunderSound[mFloor(getRandom() * $Ion::ThunderSoundCount)],%boss.getPosition()); - case "ShadeLordRandomTeleport": - if(%boss.getState() $= "dead") { - return; - } - %newPosition = vectorAdd(%boss.getPosition(), TWM2Lib_MainControl("getRandomPosition", 150 TAB 1)); - %boss.setPosition(%newPosition); + case "ShadeLordToggleCondition": + %flag = getWord(%args, 0); + if(!isObject(%boss) || %boss.getState() $= "dead") { + return; + } + cancel(%boss.attacks); + if(%flag) { + Serverplay3D($Ion::ThunderSound[mFloor(getRandom() * $Ion::ThunderSoundCount)], %boss.getPosition()); + Serverplay3D($Ion::ThunderSound[mFloor(getRandom() * $Ion::ThunderSoundCount)], %boss.getPosition()); + Serverplay3D($Ion::ThunderSound[mFloor(getRandom() * $Ion::ThunderSoundCount)], %boss.getPosition()); + Serverplay3D($Ion::ThunderSound[mFloor(getRandom() * $Ion::ThunderSoundCount)], %boss.getPosition()); + Serverplay3D($Ion::ThunderSound[mFloor(getRandom() * $Ion::ThunderSoundCount)], %boss.getPosition()); + Serverplay3D($Ion::ThunderSound[mFloor(getRandom() * $Ion::ThunderSoundCount)], %boss.getPosition()); + %Boss.setMoveState(true); + %Boss.setActionThread("cel4",true); + %Boss.schedule(3500, "SetMoveState", false); + skyVeryDark(); - case "ShadeLordDropKill": - %target = getWord(%args, 0); - %incoming = vectorAdd(%target.getPosition(), vectorAdd(TWM2Lib_MainControl("getRandomPosition", 70 TAB 1), "0 0 250")); - %vec = vectorNormalize(vectorSub(%target.getPosition(),%incoming)); - %p = new SeekerProjectile() { - dataBlock = ShadeLordSword; - initialDirection = %vec; - initialPosition = %incoming; - }; - %p.sourceObject = %boss; - %p.targetedPlayer = %target; - %beacon = new BeaconObject() { - dataBlock = "SubBeacon"; - beaconType = "vehicle"; - position = %target.getWorldBoxCenter(); - }; - %beacon.team = 0; - %beacon.setTarget(0); - MissionCleanup.add(%beacon); - %p.setObjectTarget(%beacon); - DemonMotherMissileFollow(%target,%beacon,%p); + %boss.attacks = ShadeLordFunction(%boss, "ShadeLordDarkAttacks", ""); + } + else { + Serverplay3D($Ion::ThunderSound[mFloor(getRandom() * $Ion::ThunderSoundCount)], %boss.getPosition()); + Serverplay3D($Ion::ThunderSound[mFloor(getRandom() * $Ion::ThunderSoundCount)], %boss.getPosition()); + Serverplay3D($Ion::ThunderSound[mFloor(getRandom() * $Ion::ThunderSoundCount)], %boss.getPosition()); + Serverplay3D($Ion::ThunderSound[mFloor(getRandom() * $Ion::ThunderSoundCount)], %boss.getPosition()); + Serverplay3D($Ion::ThunderSound[mFloor(getRandom() * $Ion::ThunderSoundCount)], %boss.getPosition()); + Serverplay3D($Ion::ThunderSound[mFloor(getRandom() * $Ion::ThunderSoundCount)], %boss.getPosition()); + %Boss.setMoveState(true); + %Boss.setActionThread("death1",true); + %Boss.schedule(3000, "setActionThread", "cel4", true); + %Boss.schedule(4500, "SetMoveState", false); + skyDusk(); - //------------- - //Misc Functions - //------------- - case "DoReturnMissile": - %ini = getWord(%args, 0); - %src = getWord(%args, 1); - %final = vectorAdd(%ini.getPosition(), vectorAdd(TWM2Lib_MainControl("getRandomPosition", 70 TAB 1), "0 0 250")); - %vec = vectorNormalize(vectorSub(%final, %ini.getPosition())); - %p = new SeekerProjectile() { - dataBlock = ShadeLordSword; - initialDirection = %vec; - initialPosition = vectorAdd(%ini.getPosition(), "0 0 3"); - }; - %p.sourceObject = %src; + cancel(%boss.antiSky); + cancel(%boss.randomFX); - default: - error("ShadeLordFunction(): Non-existent SL function call "@%function@"."); + %boss.antiSky = ""; + %boss.randomFX = ""; + %boss.attacks = schedule(4500, %boss, "ShadeLordFunction", %boss, "ShadeLordLightAttacks", ""); + } - } + case "ShadeLordDoMove": + if(!isobject(%boss) || %boss.getState() $= "Dead") { + if(isObject(%boss.dayCloak)) { + %boss.dayCloak.delete(); + } + if(isObject(%boss.shadeStorm)) { + %boss.shadeStorm.delete(); + } + return; + } + if(%boss.getDamageLeftPct() < 0.025) { + ShadeLordFunction(%boss, "ShadeLordDoDeath", ""); + } + if(%boss.getDamageLeftPct() < 0.4) { + if($ShadeLordBoss::AllowedNighttime == 1) { + $ShadeLordBoss::AllowedNighttime = 0; + ShadeLordFunction(%boss, "ShadeLordToggleCondition", 0); + MessageAll('MsgBossSpawn', "\c4"@$TWM2::BossName["ShadeLord"]@": No, You will not break the barrier of dark!"); + } + } + else { + if($ShadeLordBoss::AllowedNighttime == 0) { + $ShadeLordBoss::AllowedNighttime = 1; + ShadeLordFunction(%boss, "ShadeLordToggleCondition", 1); + MessageAll('MsgBossSpawn', "\c4"@$TWM2::BossName["ShadeLord"]@": Awaken, mighty storm of shade, bring forth the doom of our foes!"); + } + } + if(isObject(%boss.dayCloak) && !%boss.inDeath) { + %boss.dayCloak.delete(); + %boss.dayCloak = new ParticleEmissionDummy(){ + position = vectoradd(%boss.getPosition(),"0 0 0.5"); + dataBlock = "defaultEmissionDummy"; + emitter = "dayCloakEmitter"; //ShadeStormEmitter + }; + MissionCleanup.add(%boss.dayCloak); + } + else { + if($ShadeLordBoss::AllowedNighttime == 0) { + %boss.dayCloak = new ParticleEmissionDummy(){ + position = vectoradd(%boss.getPosition(),"0 0 0.5"); + dataBlock = "defaultEmissionDummy"; + emitter = "dayCloakEmitter"; //ShadeStormEmitter + }; + } + } + if(isObject(%boss.shadeStorm)) { + %boss.shadeStorm.delete(); + %boss.shadeStorm = new ParticleEmissionDummy(){ + position = vectoradd(%boss.getPosition(),"0 0 250"); + dataBlock = "defaultEmissionDummy"; + emitter = "ShadeStormEmitter"; //ShadeStormEmitter + }; + } + else { + if($ShadeLordBoss::AllowedNighttime == 1) { + %boss.shadeStorm = new ParticleEmissionDummy(){ + position = vectoradd(%boss.getPosition(),"0 0 250"); + dataBlock = "defaultEmissionDummy"; + emitter = "ShadeStormEmitter"; //ShadeStormEmitter + }; + } + } + %pos = %boss.getworldboxcenter(); + %closestClient = ZombieLookForTarget(%boss); + %z = getWord(%pos, 2); + if(%z < -300) { + %boss.startFade(400, 0, true); + %boss.startFade(1000, 0, false); + %boss.setPosition(vectorAdd(vectoradd(%closestclient.getPosition(), "0 0 20"), TWM2Lib_MainControl("getRandomPosition", 25 TAB 1))); + %boss.setVelocity("0 0 0"); + MessageAll('MsgVardison', "\c4"@$TWM2::BossName["ShadeLord"]@": I'm back...."); + } + %closestDistance = getWord(%closestClient,1); + %closestClient = getWord(%closestClient,0).Player; + if(%closestDistance <= $Zombie::detectDist) { + if(%closestDistance < 10) { + ShadeLordFunction(%boss, "ShadeLordDropKill", %closestClient); + MessageAll('MsgVardison', "\c4"@$TWM2::BossName["ShadeLord"]@": Feel The Vengeance of the Shadows "@getTaggedString(%closestClient.client.name)@"."); + //%closestClient.setMoveState(true); + ShadeLordFunction(%boss, "ShadeLordRandomTeleport", ""); + } + if(%boss.hastarget != 1){ + %boss.hastarget = 1; + } + %vector = ZgetFacingDirection(%boss,%closestClient,%pos); + %vector = vectorscale(%vector, ($Zombie::DForwardSpeed) * 0.6); + %upvec = "150"; + %x = Getword(%vector,0); + %y = Getword(%vector,1); + %z = Getword(%vector,2); + if(%z >= ($Zombie::DForwardSpeed)) { + %upvec = (%upvec * 5); + } + %vector = %x@" "@%y@" "@%upvec; + %boss.applyImpulse(%pos, %vector); + } + else if(%boss.hastarget == 1){ + %boss.hastarget = 0; + %boss.DemonRmove = schedule(100, %boss, "ZSetRandomMove", %boss); + } + %boss.moveloop = schedule(230, %boss, "ShadeLordFunction", %boss, "ShadeLordDoMove", ""); + + case "ShadeLordRandomTeleport": + if(%boss.getState() $= "dead") { + return; + } + %newPosition = vectorAdd(%boss.getPosition(), TWM2Lib_MainControl("getRandomPosition", 150 TAB 1)); + %boss.setPosition(%newPosition); + + case "ShadeLordDropKill": + %target = getWord(%args, 0); + %incoming = vectorAdd(%target.getPosition(), vectorAdd(TWM2Lib_MainControl("getRandomPosition", 70 TAB 1), "0 0 250")); + %vec = vectorNormalize(vectorSub(%target.getPosition(),%incoming)); + %p = new SeekerProjectile() { + dataBlock = ShadeLordSword; + initialDirection = %vec; + initialPosition = %incoming; + }; + %p.sourceObject = %boss; + %p.targetedPlayer = %target; + %beacon = new BeaconObject() { + dataBlock = "SubBeacon"; + beaconType = "vehicle"; + position = %target.getWorldBoxCenter(); + }; + %beacon.team = 0; + %beacon.setTarget(0); + MissionCleanup.add(%beacon); + %p.setObjectTarget(%beacon); + DemonMotherMissileFollow(%target,%beacon,%p); + + //------------- + //Misc Functions + //------------- + case "DoReturnMissile": + %ini = getWord(%args, 0); + %src = getWord(%args, 1); + %final = vectorAdd(%ini.getPosition(), vectorAdd(TWM2Lib_MainControl("getRandomPosition", 70 TAB 1), "0 0 250")); + %vec = vectorNormalize(vectorSub(%final, %ini.getPosition())); + %p = new SeekerProjectile() { + dataBlock = ShadeLordSword; + initialDirection = %vec; + initialPosition = vectorAdd(%ini.getPosition(), "0 0 3"); + }; + %p.sourceObject = %src; + + default: + error("ShadeLordFunction(): Non-existent SL function call "@%function@"."); + + } } diff --git a/scripts/TWM2/Systems/BossSystem.cs b/scripts/TWM2/Systems/BossSystem.cs index ac87d75..c98aecb 100644 --- a/scripts/TWM2/Systems/BossSystem.cs +++ b/scripts/TWM2/Systems/BossSystem.cs @@ -1,340 +1,410 @@ -function InitiateBoss(%Boss, %name) { - if($TWM::PlayingHorde || $TWM::PlayingHelljump) { - error("SERVER: Cannot initiate boss, in horde/helljump"); - return; - } - - if(!isObject($TWM2::BossManager)) { - $TWM2::BossManager = new scriptObject() { - class = "BossManager"; - }; - } - if(!%Boss.isMultiPhaseBoss && !%Boss.isFirstPhase) { - $TWM2::BossManager.bossKills = 0; - } - $TWM2::BossManager.bossObject = %Boss; - $TWM2::BossManager.activeBoss = %name; +//BossSystem.cs +//Robert C. Fritzen (Phantom139) +//TWM 2 - $TWM2::BossGoing = 1; - switch$(%name) { - case "Yvex": - %print = "BOSS BATTLE \n LORD YVEX"; - case "CnlWindshear": - %print = "BOSS BATTLE \n COLONEL WINDSHEAR"; - case "GhostOfLightning": - %print = "BOSS BATTLE \n GHOST OF LIGHTNING"; - case "Vengenor": - %print = "BOSS BATTLE \n GENERAL VENGENOR"; - case "LordRog": - %print = "BOSS BATTLE \n LORD ROG"; - case "Insignia": - %print = "BOSS BATTLE \n MAJOR INSIGNIA"; - case "Vardison1": - %print = "BOSS BATTLE \n LORD VARDISON"; - case "Vardison2": - %print = "BOSS ALERT \n LORD VARDISON HAS ENTERED HIS SECOND FORM"; - case "Vardison3": - %print = "BOSS ALERT \n LORD VARDISON HAS ENTERED HIS FINAL FORM"; - case "Trevor": - %print = "BOSS BATTLE \n LORDRANIUS TREVOR"; - case "Stormrider": - %print = "CLASSIC BOSS BATTLE \n COMMANDER STORMRIDER"; - case "GhostOfFire": - %print = "CLASSIC BOSS BATTLE \n GHOST OF FIRE"; - case "ShadeLord": - %print = "BOSS BATTLE \n THE SHADE LORD"; - } - //INITIATE TO CLIENTS - %count = ClientGroup.getCount(); - for(%i = 0; %i < %count; %i++) { - %cl = ClientGroup.getObject(%i); - BottomPrint(%cl, ""@%print@"", 5, 3); - %cl.damageToBoss = 0; - } - %boss.isBoss = 1; // the isBoss Flag helps us out with things - BossCheckUp(%boss, %name); - - if($BossMaxHealth[%name] $= "") { - $BossMaxHealth[%name] = %boss.getMaxDamage(); - } +function InitiateBoss(%Boss, %name) { + if($TWM::PlayingHorde || $TWM::PlayingHelljump) { + error("SERVER: Cannot initiate boss, in horde/helljump"); + return; + } + + if(!isObject($TWM2::BossManager)) { + $TWM2::BossManager = new scriptObject() { + class = "BossManager"; + }; + } + if(!%Boss.isMultiPhaseBoss && !%Boss.isFirstPhase) { + $TWM2::BossManager.bossKills = 0; + } + $TWM2::BossManager.bossObject = %Boss; + $TWM2::BossManager.activeBoss = %name; + + $TWM2::BossGoing = 1; + switch$(%name) { + case "Yvex": + %print = "BOSS BATTLE \n LORD YVEX"; + case "CnlWindshear": + %print = "BOSS BATTLE \n COLONEL WINDSHEAR"; + case "GhostOfLightning": + %print = "BOSS BATTLE \n GHOST OF LIGHTNING"; + case "Vengenor": + %print = "BOSS BATTLE \n GENERAL VENGENOR"; + case "LordRog": + %print = "BOSS BATTLE \n LORD ROG"; + case "Insignia": + %print = "BOSS BATTLE \n MAJOR INSIGNIA"; + case "Vardison1": + %print = "BOSS BATTLE \n LORD VARDISON"; + case "Vardison2": + %print = "BOSS ALERT \n LORD VARDISON HAS ENTERED HIS SECOND FORM"; + case "Vardison3": + %print = "BOSS ALERT \n LORD VARDISON HAS ENTERED HIS FINAL FORM"; + case "Trevor": + %print = "BOSS BATTLE \n LORDRANIUS TREVOR"; + case "Stormrider": + %print = "CLASSIC BOSS BATTLE \n COMMANDER STORMRIDER"; + case "GhostOfFire": + %print = "CLASSIC BOSS BATTLE \n GHOST OF FIRE"; + case "ShadeLord": + %print = "BOSS BATTLE \n THE SHADE LORD"; + } + //INITIATE TO CLIENTS + %count = ClientGroup.getCount(); + for(%i = 0; %i < %count; %i++) { + %cl = ClientGroup.getObject(%i); + BottomPrint(%cl, ""@%print@"", 5, 3); + %cl.damageToBoss = 0; + resetBossProficiency(%cl); + } + %boss.isBoss = 1; // the isBoss Flag helps us out with things + BossCheckUp(%boss, %name); + + if($BossMaxHealth[%name] $= "") { + $BossMaxHealth[%name] = %boss.getMaxDamage(); + } +} + +function resetBossProficiency(%client) { + if(isObject(%client.bossProficiency)) { + %client.bossProficiency.delete(); + } + %client.bossProficiency = new ScriptObject() { + class = "BossProficiency"; + name = "ClientBossProficiency_" + %client; + client = %client; + }; } function BossCheckUp(%boss, %name) { - %percentage = (mFloor(%boss.getDamageLeft()*100) / mFloor(%boss.getMaxDamage()*100)) * 100; - MessageAll('MsgSPCurrentObjective1', "", "Boss Battle: "@$TWM2::BossName[%name]@" [Boss Kill Count: "@$TWM2::BossManager.bossKills@"]"); - MessageAll('MsgSPCurrentObjective2', "", "Boss HP: "@mFloor(%boss.getDamageLeft()*100)@"/"@mFloor(%boss.getMaxDamage()*100)@" ("@%percentage@"%)"); + %percentage = (mFloor(%boss.getDamageLeft()*100) / mFloor(%boss.getMaxDamage()*100)) * 100; + MessageAll('MsgSPCurrentObjective1', "", "Boss Battle: "@$TWM2::BossName[%name]@" [Boss Kill Count: "@$TWM2::BossManager.bossKills@"]"); + MessageAll('MsgSPCurrentObjective2', "", "Boss HP: "@mFloor(%boss.getDamageLeft()*100)@"/"@mFloor(%boss.getMaxDamage()*100)@" ("@%percentage@"%)"); - if(%name !$= "CnlWindshear" && %name !$= "Trevor" && %name !$= "Stormrider") { - if(!isObject(%boss) || %boss.getState() $= "dead") { - if(%name $= "Vardison1") { - %count = ClientGroup.getCount(); - for(%i = 0; %i < %count; %i++) { - %cl = ClientGroup.getObject(%i); - recordAction(%cl, "BOSS", "Vardison1"); - } - SpawnVardison2(%boss.getPosition()); - return; - } - if(%name $= "Vardison2") { - %count = ClientGroup.getCount(); - for(%i = 0; %i < %count; %i++) { - %cl = ClientGroup.getObject(%i); - recordAction(%cl, "BOSS", "Vardison2"); - } - SpawnVardison3(%boss.getPosition()); - return; - } - //the boss has been defeated, horrah!!! - %count = ClientGroup.getCount(); - for(%i = 0; %i < %count; %i++) { - %cl = ClientGroup.getObject(%i); - if(%cl.damageToBoss > 0) { - %cl.GiveBossAward(%name); - } - } - $TWM2::BossGoing = 0; - MessageAll('MsgSPCurrentObjective1', "", "Welcome to TWM2!"); - MessageAll('MsgSPCurrentObjective2', "", "Phantom139, DoL, Signal360"); - return; - } - schedule(1000, 0, "BossCheckUp", %boss, %name); - } - else { - if(!isObject(%boss)) { - %count = ClientGroup.getCount(); - for(%i = 0; %i < %count; %i++) { - %cl = ClientGroup.getObject(%i); - if(%cl.damageToBoss) { - %cl.GiveBossAward(%name); - } - } - MessageAll('MsgSPCurrentObjective1', "", "Welcome to TWM2!"); - MessageAll('MsgSPCurrentObjective2', "", "Phantom139, DoL, Signal360"); - $TWM2::BossGoing = 0; - return; - } - schedule(1000, 0, "BossCheckUp", %boss, %name); - } + if(%name !$= "CnlWindshear" && %name !$= "Trevor" && %name !$= "Stormrider") { + if(!isObject(%boss) || %boss.getState() $= "dead") { + if(%name $= "Vardison1") { + %count = ClientGroup.getCount(); + for(%i = 0; %i < %count; %i++) { + %cl = ClientGroup.getObject(%i); + recordAction(%cl, "BOSS", "Vardison1"); + } + SpawnVardison2(%boss.getPosition()); + return; + } + if(%name $= "Vardison2") { + %count = ClientGroup.getCount(); + for(%i = 0; %i < %count; %i++) { + %cl = ClientGroup.getObject(%i); + recordAction(%cl, "BOSS", "Vardison2"); + } + SpawnVardison3(%boss.getPosition()); + return; + } + //the boss has been defeated, horrah!!! + %count = ClientGroup.getCount(); + for(%i = 0; %i < %count; %i++) { + %cl = ClientGroup.getObject(%i); + if(%cl.damageToBoss > 0) { + %cl.GiveBossAward(%name); + } + } + $TWM2::BossGoing = 0; + MessageAll('MsgSPCurrentObjective1', "", "Welcome to TWM2!"); + MessageAll('MsgSPCurrentObjective2', "", "Phantom139, DoL, Signal360"); + return; + } + schedule(1000, 0, "BossCheckUp", %boss, %name); + } + else { + if(!isObject(%boss)) { + %count = ClientGroup.getCount(); + for(%i = 0; %i < %count; %i++) { + %cl = ClientGroup.getObject(%i); + if(%cl.damageToBoss) { + %cl.GiveBossAward(%name); + } + } + MessageAll('MsgSPCurrentObjective1', "", "Welcome to TWM2!"); + MessageAll('MsgSPCurrentObjective2', "", "Phantom139, DoL, Signal360"); + $TWM2::BossGoing = 0; + return; + } + schedule(1000, 0, "BossCheckUp", %boss, %name); + } } function GameConnection::GiveBossAward(%client, %bossName) { - %scriptController = %client.TWM2Core; - %file = ""@$TWM::RanksDirectory@"/"@%client.guid@"/Saved.TWMSave"; - //you earn less EXP every time you defeat a specific boss, so tread lightly on those defeat counts :) - - %damageCount = %client.damageToBoss; - %maxHP = $BossMaxHealth[%bossName]; - - %percentage = (%damageCount / %maxHP) * 100; - if(%percentage > 5) { - recordAction(%client, "BOSS", %bossName); - - if(!isSet(%scriptController.bossDefeatCount[%bossName])) { - %scriptController.bossDefeatCount[%bossName] = 0; - } - if(%bossName $= "Yvex") { - AwardClient(%client, "1"); - } - else if(%bossName $= "CnlWindshear") { - AwardClient(%client, "8"); - } - else if(%bossName $= "GhostOfLightning") { - AwardClient(%client, "9"); - } - else if(%bossName $= "Vengenor") { - AwardClient(%client, "10"); - } - else if(%bossName $= "LordRog") { - AwardClient(%client, "11"); - } - else if(%bossName $= "Insignia") { - AwardClient(%client, "12"); - } - else if(%bossName $= "GhostOfFire") { - AwardClient(%client, "27"); - } - else if(%bossName $= "Stormrider") { - AwardClient(%client, "28"); - } - else if(%bossName $= "ShadeLord") { - AwardClient(%client, "30"); - } - //VARDISON - else if(%bossName $= "Vardison3") { - AwardClient(%client, 13); - if($TWM2::VardisonDifficulty == 1) { - CompleteNWChallenge(%client, "VardEasy"); - } - else if($TWM2::VardisonDifficulty == 2) { - CompleteNWChallenge(%client, "VardNorm"); - } - else if($TWM2::VardisonDifficulty == 3) { - CompleteNWChallenge(%client, "VardHard"); - } - else if($TWM2::VardisonDifficulty == 4) { - CompleteNWChallenge(%client, "VardWtf"); - } - } - else if(%bossName $= "Trevor") { - AwardClient(%client, 15); - } - //rank writing - %scriptController.bossDefeatCount[%bossName]++; - %scriptController.save(%file); + %scriptController = %client.TWM2Core; + %file = ""@$TWM::RanksDirectory@"/"@%client.guid@"/Saved.TWMSave"; + //you earn less EXP every time you defeat a specific boss, so tread lightly on those defeat counts :) - %award = mFloor($TWM2::BossXPAward[%bossName] / %scriptController.bossDefeatCount[%bossName]); - GainExperience(%client, %award, ""@%bossName@" defeated, congratulations! "); - CheckBossChallenge(%client, %bossName); - } - else { - MessageClient(%client, 'msgFailed', "\c5Command: The boss was defeated, however your input to the team effort was minimal... you must provide support to your allies in need."); - MessageClient(%client, 'msgFailed', "\c2Data: You inflicted "@%percentage@"% damage to the boss, in order to be eligable for rewards, you must inflict at least 5%."); - } + %damageCount = %client.damageToBoss; + %maxHP = $BossMaxHealth[%bossName]; + + %percentage = (%damageCount / %maxHP) * 100; + if(%percentage > 5) { + recordAction(%client, "BOSS", %bossName); + + if(!isSet(%scriptController.bossDefeatCount[%bossName])) { + %scriptController.bossDefeatCount[%bossName] = 0; + } + if(%bossName $= "Yvex") { + AwardClient(%client, "1"); + } + else if(%bossName $= "CnlWindshear") { + AwardClient(%client, "8"); + } + else if(%bossName $= "GhostOfLightning") { + AwardClient(%client, "9"); + } + else if(%bossName $= "Vengenor") { + AwardClient(%client, "10"); + } + else if(%bossName $= "LordRog") { + AwardClient(%client, "11"); + } + else if(%bossName $= "Insignia") { + AwardClient(%client, "12"); + } + else if(%bossName $= "GhostOfFire") { + AwardClient(%client, "27"); + } + else if(%bossName $= "Stormrider") { + AwardClient(%client, "28"); + } + else if(%bossName $= "ShadeLord") { + AwardClient(%client, "30"); + } + //VARDISON + else if(%bossName $= "Vardison3") { + AwardClient(%client, 13); + if($TWM2::VardisonDifficulty == 1) { + CompleteNWChallenge(%client, "VardEasy"); + } + else if($TWM2::VardisonDifficulty == 2) { + CompleteNWChallenge(%client, "VardNorm"); + } + else if($TWM2::VardisonDifficulty == 3) { + CompleteNWChallenge(%client, "VardHard"); + } + else if($TWM2::VardisonDifficulty == 4) { + CompleteNWChallenge(%client, "VardWtf"); + } + } + else if(%bossName $= "Trevor") { + AwardClient(%client, 15); + } + //rank writing + %scriptController.bossDefeatCount[%bossName]++; + %scriptController.save(%file); + + %award = mFloor($TWM2::BossXPAward[%bossName] / %scriptController.bossDefeatCount[%bossName]); + GainExperience(%client, %award, ""@%bossName@" defeated, congratulations! "); + CheckBossChallenge(%client, %bossName); + CheckBossProficiency(%client, %bossName); + } + else { + MessageClient(%client, 'msgFailed', "\c5Command: The boss was defeated, however your input to the team effort was minimal... you must provide support to your allies in need."); + MessageClient(%client, 'msgFailed', "\c2Data: You inflicted "@%percentage@"% damage to the boss, in order to be eligable for rewards, you must inflict at least 5%."); + } } function FindValidTarget(%boss, %counter) { //This is usefull - if(%counter $= "") { - %counter = 10; //10 attempts - } - for(%i = 0; %i < %counter; %i++) { - %test = ClientGroup.getObject(getRandom(0, ClientGroup.getCount())); - if(isObject(%test)) { - %tPL = %test.getControlObject(); - if(isObject(%tPL)) { - if(isPlayer(%tPL)) { - if(%tPL.getState() !$= "dead") { - //Got one! - return %test; - } - } - else { - return %test; - } - } - } - } - return -1; //Found nothing. + if(%counter $= "") { + %counter = 10; //10 attempts + } + for(%i = 0; %i < %counter; %i++) { + %test = ClientGroup.getObject(getRandom(0, ClientGroup.getCount())); + if(isObject(%test)) { + %tPL = %test.getControlObject(); + if(isObject(%tPL)) { + if(isPlayer(%tPL)) { + if(%tPL.getState() !$= "dead") { + //Got one! + return %test; + } + } + else { + return %test; + } + } + } + } + return -1; //Found nothing. } function CheckBossChallenge(%client, %boss) { - %scriptController = %client.TWM2Core; - %dc = %scriptController.bossDefeatCount[%boss]; - switch$(%boss) { - case "Yvex": - if(%dc >= 3) { - CompleteNWChallenge(%client, "Yvex1"); - } - if(%dc >= 5) { - CompleteNWChallenge(%client, "Yvex2"); - } - if(%dc >= 10) { - CompleteNWChallenge(%client, "Yvex3"); - } - case "CnlWindshear": - if(%dc >= 3) { - CompleteNWChallenge(%client, "CWS1"); - } - if(%dc >= 5) { - CompleteNWChallenge(%client, "CWS2"); - } - if(%dc >= 10) { - CompleteNWChallenge(%client, "CWS3"); - } - case "GhostOfLightning": - if(%dc >= 3) { - CompleteNWChallenge(%client, "GOL1"); - } - if(%dc >= 5) { - CompleteNWChallenge(%client, "GOL2"); - } - if(%dc >= 10) { - CompleteNWChallenge(%client, "GOL3"); - } - case "GhostOfFire": - if(%dc >= 1) { - CompleteNWChallenge(%client, "GOF1"); - } - if(%dc >= 3) { - CompleteNWChallenge(%client, "GOF2"); - } - if(%dc >= 5) { - CompleteNWChallenge(%client, "GOF3"); - } - case "Vegenor": - if(%dc >= 3) { - CompleteNWChallenge(%client, "Veg1"); - } - if(%dc >= 5) { - CompleteNWChallenge(%client, "Veg2"); - } - if(%dc >= 10) { - CompleteNWChallenge(%client, "Veg3"); - } - case "LordRog": - if(%dc >= 2) { - CompleteNWChallenge(%client, "LRog1"); - } - if(%dc >= 4) { - CompleteNWChallenge(%client, "LRog2"); - } - if(%dc >= 7) { - CompleteNWChallenge(%client, "LRog3"); - } - case "Insignia": - if(%dc >= 2) { - CompleteNWChallenge(%client, "Ins1"); - } - if(%dc >= 4) { - CompleteNWChallenge(%client, "Ins2"); - } - if(%dc >= 7) { - CompleteNWChallenge(%client, "Ins3"); - } - case "Vardison3": - if(%dc >= 1) { - CompleteNWChallenge(%client, "Vard1"); - } - if(%dc >= 3) { - CompleteNWChallenge(%client, "Vard2"); - } - if(%dc >= 5) { - CompleteNWChallenge(%client, "Vard3"); - } - case "Stormrider": - if(%dc >= 3) { - CompleteNWChallenge(%client, "Stormrider1"); - } - if(%dc >= 5) { - CompleteNWChallenge(%client, "Stormrider2"); - } - if(%dc >= 10) { - CompleteNWChallenge(%client, "Stormrider3"); - } - case "Trevor": - if(%dc >= 2) { - CompleteNWChallenge(%client, "Trev1"); - } - if(%dc >= 4) { - CompleteNWChallenge(%client, "Trev2"); - } - if(%dc >= 7) { - CompleteNWChallenge(%client, "Trev3"); - } - case "ShadeLord": - if(%dc >= 1) { - CompleteNWChallenge(%client, "ShadeLord1"); - } - if(%dc >= 2) { - CompleteNWChallenge(%client, "ShadeLord2"); - } - if(%dc >= 3) { - CompleteNWChallenge(%client, "ShadeLord3"); - } - } + %scriptController = %client.TWM2Core; + %dc = %scriptController.bossDefeatCount[%boss]; + switch$(%boss) { + case "Yvex": + if(%dc >= 3) { + CompleteNWChallenge(%client, "Yvex1"); + } + if(%dc >= 5) { + CompleteNWChallenge(%client, "Yvex2"); + } + if(%dc >= 10) { + CompleteNWChallenge(%client, "Yvex3"); + } + case "CnlWindshear": + if(%dc >= 3) { + CompleteNWChallenge(%client, "CWS1"); + } + if(%dc >= 5) { + CompleteNWChallenge(%client, "CWS2"); + } + if(%dc >= 10) { + CompleteNWChallenge(%client, "CWS3"); + } + case "GhostOfLightning": + if(%dc >= 3) { + CompleteNWChallenge(%client, "GOL1"); + } + if(%dc >= 5) { + CompleteNWChallenge(%client, "GOL2"); + } + if(%dc >= 10) { + CompleteNWChallenge(%client, "GOL3"); + } + case "GhostOfFire": + if(%dc >= 1) { + CompleteNWChallenge(%client, "GOF1"); + } + if(%dc >= 3) { + CompleteNWChallenge(%client, "GOF2"); + } + if(%dc >= 5) { + CompleteNWChallenge(%client, "GOF3"); + } + case "Vegenor": + if(%dc >= 3) { + CompleteNWChallenge(%client, "Veg1"); + } + if(%dc >= 5) { + CompleteNWChallenge(%client, "Veg2"); + } + if(%dc >= 10) { + CompleteNWChallenge(%client, "Veg3"); + } + case "LordRog": + if(%dc >= 2) { + CompleteNWChallenge(%client, "LRog1"); + } + if(%dc >= 4) { + CompleteNWChallenge(%client, "LRog2"); + } + if(%dc >= 7) { + CompleteNWChallenge(%client, "LRog3"); + } + case "Insignia": + if(%dc >= 2) { + CompleteNWChallenge(%client, "Ins1"); + } + if(%dc >= 4) { + CompleteNWChallenge(%client, "Ins2"); + } + if(%dc >= 7) { + CompleteNWChallenge(%client, "Ins3"); + } + case "Vardison3": + if(%dc >= 1) { + CompleteNWChallenge(%client, "Vard1"); + } + if(%dc >= 3) { + CompleteNWChallenge(%client, "Vard2"); + } + if(%dc >= 5) { + CompleteNWChallenge(%client, "Vard3"); + } + case "Stormrider": + if(%dc >= 3) { + CompleteNWChallenge(%client, "Stormrider1"); + } + if(%dc >= 5) { + CompleteNWChallenge(%client, "Stormrider2"); + } + if(%dc >= 10) { + CompleteNWChallenge(%client, "Stormrider3"); + } + case "Trevor": + if(%dc >= 2) { + CompleteNWChallenge(%client, "Trev1"); + } + if(%dc >= 4) { + CompleteNWChallenge(%client, "Trev2"); + } + if(%dc >= 7) { + CompleteNWChallenge(%client, "Trev3"); + } + case "ShadeLord": + if(%dc >= 1) { + CompleteNWChallenge(%client, "ShadeLord1"); + } + if(%dc >= 2) { + CompleteNWChallenge(%client, "ShadeLord2"); + } + if(%dc >= 3) { + CompleteNWChallenge(%client, "ShadeLord3"); + } + } +} + +function CheckBossProficiency(%client, %bossName) { + if(!%client || %client $= "" || !isObject(%client)) { + return; + } + if(%bossName $= "") { + return; + } + //Proficiency: Added TWM2 3.9.2 + // Awards clients for completing feats during the boss fight + MessageClient(%client, 'msgTag', "\c5==== PROFICIENCY AWARDS ===="); + %count = 0; + %totalEXP = 0; + + %damageCount = %client.damageToBoss; + %maxHP = $BossMaxHealth[%bossName]; + %dPerc = (%damageCount / %maxHP) * 100; + + for(%i = 0; $Boss::Proficiency[%bossName, %i] !$= ""; %i++) { + //Proficiency Code Inputs: + // [bossName]: Name of the boss, internally + // [client]: client ID + // [bProf]: client's boss proficiency object + // [dPerc]: client's damage percentage + %prof = $Boss::Proficiency[%bossName, %i]; + %pName = getField(%prof, 0); + %pExp = getField(%prof, 1); + %pDesc = getField(%prof, 2); + %code = $Boss::ProficiencyCode[%bossName, %i]; + %eCode = strReplace(%code, "[bossName]", %bossName); + %eCode = strReplace(%eCode, "[client]", %client); + %eCode = strReplace(%eCode, "[bProf]", %client.bossProficiency); + %eCode = strReplace(%eCode, "[dPerc]", %dPerc); + //Generate the code and eval it + %evalCode = "return "@%eCode@";"; + %award = eval(%evalCode); + if(%award == true) { + %totalEXP += %pExp; + GainExperience(%client, %pExp, %pName); + %count++; + MessageClient(%client, 'msgFailed', "\c5* "@%pName@": "@%pDesc); + } + } + if(!%count) { + MessageClient(%client, 'msgFailed', "\c5* No Awards Were Earned, Try Again Next Time!"); + } + else { + MessageClient(%client, 'msgFailed', "\c5* Summary: You earned "@%count@" proficiency awards, totaling "@%totalEXP@"EXP points, well done!"); + } } function BossManager::addKill(%this, %tObj) { - %this.bossKills++; + %this.bossKills++; + if(isObject(%tObj.client.bossProficiency)) { + %tObj.client.bossProficiency.bossDeaths++; + } } //Load The Boss Files