Boss Balancing Pass

Another balancing pass to the bosses in TWM2.
This commit is contained in:
Robert Fritzen 2017-06-30 22:52:31 -05:00
parent 17e5696299
commit e8f761555c
10 changed files with 86 additions and 70 deletions

View file

@ -89,7 +89,7 @@ PLEASE NOTE: For the Legacy (Pre-GitHub Versions) Changelogs, please see LEGACY
* Adjusted the daily challenge script to point to the correct link, effectively re-enabling the system * Adjusted the daily challenge script to point to the correct link, effectively re-enabling the system
* Addressed the bug preventing weapon challenge progress from recording * Addressed the bug preventing weapon challenge progress from recording
* Flipped the /help public and /help additional roles, now using /help will provide the list of accessors * Flipped the /help public and /help additional roles, now using /help will provide the list of accessors
* Removed all aspects of daily exp recording as we are no longer capping progression in the mod * Removed all remaining EXP capping codes as the cap was removed in 3.9
* Re-did the Challenge Menus in the F2 Menu * Re-did the Challenge Menus in the F2 Menu
* Renamed Weapon Challenges to just Challenges * Renamed Weapon Challenges to just Challenges
* From this menu, players now select General Tasks or Weapon Challenges * From this menu, players now select General Tasks or Weapon Challenges
@ -100,7 +100,7 @@ PLEASE NOTE: For the Legacy (Pre-GitHub Versions) Changelogs, please see LEGACY
* TWM2 Challenge System Changes * TWM2 Challenge System Changes
* Depricated the Blacklist Challenges, and replaced it with Wargames challenges, which are focused on PvP tasks across all modes. * Depricated the Blacklist Challenges, and replaced it with Wargames challenges, which are focused on PvP tasks across all modes.
* Let's see who can complete some of those "tough" ones :) * Let's see who can complete some of those "tough" ones :)
* Completed the Zombie Slaying Challenges, allowing players to earn some nice healthy batches of EXP for slaying zombies * "Finally" completed the Zombie Slaying Challenges category, zombie hunters rejoice for bonus EXP!
* Added boss challenges for the bosses that did not have any: * Added boss challenges for the bosses that did not have any:
* Shade Lord * Shade Lord
* Ghost of Fire * Ghost of Fire
@ -111,24 +111,52 @@ PLEASE NOTE: For the Legacy (Pre-GitHub Versions) Changelogs, please see LEGACY
* Addressed the bug preventing the four Vardison challenges for specific difficulty completions from actually completing * Addressed the bug preventing the four Vardison challenges for specific difficulty completions from actually completing
* Internally, Redid the entire challenge system to automate most of it, allowing for eally easy deployment of future challenges * Internally, Redid the entire challenge system to automate most of it, allowing for eally easy deployment of future challenges
* Added in some cool new features for these as well for things such as hidden challenges, and embedded additional requirements * Added in some cool new features for these as well for things such as hidden challenges, and embedded additional requirements
* Added in the necessary hooks to enable officer ranks 10 - 15 * All menus are now generated via script instead of hardcoded, making fixing issues with the system much easier
* Have fun! * Enabled officer ranks 10 - 15
* Re-did the Officer Promotion windows to preview the rewards upcoming at that level * Re-did the Officer Promotion windows to preview the rewards upcoming at that officer level
* Added in the capability to "reset" your entire TWM2 progression upon hitting max level of Officer 15 (Max Level) * Added in the capability to "reset" your entire TWM2 progression upon hitting max level of Officer 15 (Max Level)
* I'm currently considering replacing this with a different system, will be decided as a 3.92 feature * This is a temporary feature that will be replaced in 3.9.2
* Depricated the Store and Money systems, these systems will become progression based unlocks for "higher" officer levels (10 - 15) * Depricated the Store and Money systems, these systems will become progression based unlocks for "higher" officer levels (10 - 15)
* Armor effects will not return * Armor effects will not return
* Armor flags will return in 3.92 * Armor flags will return in 3.92
* Fixed the bug with Demon Lord zombies not targeting properly * Fixed the bug with Demon Lord zombies not targeting properly
* Fixed a console warning bug caused by zombie objects despawning and then calling a scan method * Fixed a console warning bug caused by zombie objects despawning and then calling a scan method
* Shifter Zombies now have a randomzied element in their teleport method * Shifter Zombies now have a randomzied element in their teleport method
* Plasma Torpedo Cannon now requires officer level 9 (Phantom) * Fixed a code bug with Lord Yvex which caused his death pulse to be replaced by nightmare missiles
* Plasma Torpedo Cannon now requires officer level 9 (Was 4)
* Addressed the bug preventing the challenges for reaching officer ranks from completing * Addressed the bug preventing the challenges for reaching officer ranks from completing
* Weapon Balancing Pass * Weapon Balancing Pass
* Grapple Hook * Grapple Hook
* Slowed down the attacher projectile a bit, lowering the range * Slowed down the attacher projectile a bit, lowering the range
* Grapple hook now requires 60% armor energy and consumes this when firing * Grapple hook now requires 60% armor energy and consumes this when firing
* There is now a 5 second cooldown when firing to prevent for quick escapes * There is now a 5 second cooldown when firing to prevent for quick escapes
* Boss Balancing Pass
* Lord Yvex
* Health reduced to 40,000 (Was 50,000)
* Nightmare time reduced to 33% of what it was (NOTE: This change also applies to Lord Vardison)
* Nightmare damage taken is unchanged
* Yvex Healing from Nightmares reduced by 50%
* Lord Rog
* Health reduced to 50,000 (Was 65,000)
* Rog's Blade of Vengeance now only restores 1000HP (Was 2500HP)
* Removed Elite Demons from his spawning pool (These minions are reserved for Lord Vardison)
* Reduced Lord Rog's Meteor Attacks to 1 and 5 meteors respectively (Was 3 and 15)
* Static Discharge Attack
* Lord Rog freeze time increased to 8.5 seconds (Was 7 seconds)
* Inflicted freeze time reduced to 10 seconds (Was 15 seconds)
* Damage per second increased to 0.6 (Was 0.5)
* This equates to a 20% damage reduction when considering the attack duration decrease
* Laser attack now only fires 25 pulses instead of 40
* Ghost of Fire
* Now immune to death by falling under the map
* Sorry TWM1 Vets, but this strategy is no longer going to work ;)
* 1000% armor increase to all fire damage types
* This should hammer home the point to not use fire weapons on the Ghost of Fire
* Mt. Death no longer instantly triggers (No more ear rape)
* There is now a three second delay between his attack trigger and the first pulse
* Added four additional bursts to compensate
* Reduced the amount of cursed flames spawned to 1 and 3 (Was 3 and 5)
* As a reminder folks, you can block these with Flare Grenades ;)
3.8 -> 3.9: 3.8 -> 3.9:
* Progression System Adjustments * Progression System Adjustments

View file

@ -374,8 +374,9 @@ datablock PlayerData(GhostFireArmor) : MediumPlayerDamageProfile
maxGrenades = 1; // Max number of different grenades the player can have maxGrenades = 1; // Max number of different grenades the player can have
maxMines = 1; // Max number of different mines the player can have maxMines = 1; // Max number of different mines the player can have
damageScale[$DamageType::plasma] = 0.05; damageScale[$DamageType::plasma] = 0.001;
damageScale[$DamageType::Burn] = 0.05; damageScale[$DamageType::Burn] = 0.001;
damageScale[$DamageType::Fire] = 0.001;
damageScale[$DamageType::Bullet] = 0.10; //I deny you shrike n0bs damageScale[$DamageType::Bullet] = 0.10; //I deny you shrike n0bs
// Inventory restrictions // Inventory restrictions
@ -461,9 +462,13 @@ function GOFPerformMove(%ghost,%closestClient,%closestDistance) {
%ghost.TargetCL = %closestClient; %ghost.TargetCL = %closestClient;
%ghost.DistToTarg = %closestDistance; %ghost.DistToTarg = %closestDistance;
%zposition = %ghost.getPosition(); %zposition = %ghost.getPosition();
%Zzaxis = getword(%zposition,2); %z = getWord(%zposition, 2);
if(%Zzaxis < $zombie::falldieheight) { if(%z < -300) {
%ghost.scriptkill($DamageType::Suicide); %ghost.startFade(400, 0, true);
%ghost.startFade(1000, 0, false);
%ghost.setPosition(vectorAdd(vectoradd(%closestclient.player.getPosition(), "0 0 20"), TWM2Lib_MainControl("getRandomPosition", 25 TAB 1)));
%ghost.setVelocity("0 0 0");
MessageAll('msgBossAlertAttack', "\c4"@$TWM2::BossName["GoF"]@": My ghostly powers allow me to laugh aside your hopes of me falling to my death...");
} }
%pos = %ghost.getworldboxcenter(); %pos = %ghost.getworldboxcenter();
%closestClient = %closestClient.Player; %closestClient = %closestClient.Player;
@ -757,8 +762,6 @@ function GOFDoRandomAttacks(%g) {
case 6: case 6:
if(isObject(%target.player)) { if(isObject(%target.player)) {
GOFAttack_FUNC("LaunchSeekfire", %g SPC %target.player SPC 1); GOFAttack_FUNC("LaunchSeekfire", %g SPC %target.player SPC 1);
GOFAttack_FUNC("LaunchSeekfire", %g SPC %target.player SPC 1500);
GOFAttack_FUNC("LaunchSeekfire", %g SPC %target.player SPC 3000);
messageall('TheFireMsg',"\c4"@$TWM2::BossName["GoF"]@": Clensic Flames Will Persue You "@getTaggedString(%target.name)@"!"); messageall('TheFireMsg',"\c4"@$TWM2::BossName["GoF"]@": Clensic Flames Will Persue You "@getTaggedString(%target.name)@"!");
} }
else { else {
@ -769,8 +772,6 @@ function GOFDoRandomAttacks(%g) {
GOFAttack_FUNC("LaunchSeekfire", %g SPC %target.player SPC 1); GOFAttack_FUNC("LaunchSeekfire", %g SPC %target.player SPC 1);
GOFAttack_FUNC("LaunchSeekfire", %g SPC %target.player SPC 1500); GOFAttack_FUNC("LaunchSeekfire", %g SPC %target.player SPC 1500);
GOFAttack_FUNC("LaunchSeekfire", %g SPC %target.player SPC 3000); GOFAttack_FUNC("LaunchSeekfire", %g SPC %target.player SPC 3000);
GOFAttack_FUNC("LaunchSeekfire", %g SPC %target.player SPC 4500);
GOFAttack_FUNC("LaunchSeekfire", %g SPC %target.player SPC 6000);
messageall('TheFireMsg',"\c4"@$TWM2::BossName["GoF"]@": "@getTaggedString(%target.name)@", I present to you the gift, of cursed flames..."); messageall('TheFireMsg',"\c4"@$TWM2::BossName["GoF"]@": "@getTaggedString(%target.name)@", I present to you the gift, of cursed flames...");
} }
else { else {
@ -817,10 +818,14 @@ function GOFDoRandomAttacks(%g) {
case 13 or 14 or 15: case 13 or 14 or 15:
if(isObject(%target.player)) { if(isObject(%target.player)) {
%store = %target.player.getPosition(); %store = %target.player.getPosition();
GOFAttack_FUNC("Ultracano", %g SPC %store); //GOFAttack_FUNC("Ultracano", %g SPC %store);
schedule(3000, 0, GOFAttack_FUNC, "Ultracano", %g SPC %store); schedule(3000, 0, GOFAttack_FUNC, "Ultracano", %g SPC %store);
schedule(6000, 0, GOFAttack_FUNC, "Ultracano", %g SPC %store); schedule(6000, 0, GOFAttack_FUNC, "Ultracano", %g SPC %store);
schedule(9000, 0, GOFAttack_FUNC, "Ultracano", %g SPC %store); schedule(9000, 0, GOFAttack_FUNC, "Ultracano", %g SPC %store);
schedule(12000, 0, GOFAttack_FUNC, "Ultracano", %g SPC %store);
schedule(15000, 0, GOFAttack_FUNC, "Ultracano", %g SPC %store);
schedule(16000, 0, GOFAttack_FUNC, "Ultracano", %g SPC %store);
schedule(17000, 0, GOFAttack_FUNC, "Ultracano", %g SPC %store);
messageall('TheFireMsg',"\c4"@$TWM2::BossName["GoF"]@": Rise Mt. Death... Cleanse "@getTaggedString(%target.name)@"!"); messageall('TheFireMsg',"\c4"@$TWM2::BossName["GoF"]@": Rise Mt. Death... Cleanse "@getTaggedString(%target.name)@"!");
} }
else { else {

View file

@ -100,7 +100,7 @@ datablock SeekerProjectileData(LordRogStiloutte) {
datablock PlayerData(LordRogZombieArmor) : LightMaleHumanArmor { datablock PlayerData(LordRogZombieArmor) : LightMaleHumanArmor {
boundingBox = "1.63 1.63 2.6"; boundingBox = "1.63 1.63 2.6";
maxDamage = 650.0; maxDamage = 500.0;
minImpactSpeed = 35; minImpactSpeed = 35;
shapeFile = "bioderm_heavy.dts"; shapeFile = "bioderm_heavy.dts";
@ -342,7 +342,7 @@ function LordRogAttack_FUNC(%att, %args) {
} }
schedule(30000, 0, LordRogAttack_FUNC, "ZombieSummon", %z); schedule(30000, 0, LordRogAttack_FUNC, "ZombieSummon", %z);
//-------------------- //--------------------
%type = getRandomZombieType("1 2 3 5 9 12 13 15 17"); //omit 4 in place of 17: Demon -> Elite Demon %type = getRandomZombieType("1 2 3 4 5 9 12 13 15");
messageall('RogMsg',"\c4"@$TWM2::ZombieName[8]@": Attack my target!"); messageall('RogMsg',"\c4"@$TWM2::ZombieName[8]@": Attack my target!");
for(%i = 0; %i < 5; %i++) { for(%i = 0; %i < 5; %i++) {
%pos = vectoradd(%z.getPosition(), TWM2Lib_MainControl("getRandomPosition", 10 TAB 1)); %pos = vectoradd(%z.getPosition(), TWM2Lib_MainControl("getRandomPosition", 10 TAB 1));
@ -359,7 +359,7 @@ function LordRogAttack_FUNC(%att, %args) {
return; return;
} }
%type = getRandomZombieType("1 2 3 5 9 12 13 15 17"); %type = getRandomZombieType("1 2 3 4 5 9 12 13 15");
MessageAll('MessageAll', "\c4"@$TWM2::ZombieName[8]@": Additional Reinforcements!!! NOW!"); MessageAll('MessageAll', "\c4"@$TWM2::ZombieName[8]@": Additional Reinforcements!!! NOW!");
%typeCaller = %type SPC %type SPC %type SPC %type; %typeCaller = %type SPC %type SPC %type SPC %type;
%callPos = vectorAdd(%z.getPosition(), "2000 0 400"); %callPos = vectorAdd(%z.getPosition(), "2000 0 400");
@ -415,7 +415,7 @@ function LordRogAttack_FUNC(%att, %args) {
return; return;
} }
%z.laserStormSount++; %z.laserStormSount++;
if(%z.laserStormSount < 40) { if(%z.laserStormSount < 25) {
%vec = vectorsub(%t.getworldboxcenter(), %z.getMuzzlePoint(6)); %vec = vectorsub(%t.getworldboxcenter(), %z.getMuzzlePoint(6));
%vec = vectoradd(%vec, vectorscale(%t.getvelocity(), vectorlen(%vec)/100)); %vec = vectoradd(%vec, vectorscale(%t.getvelocity(), vectorlen(%vec)/100));
%p = new LinearFlareProjectile() { %p = new LinearFlareProjectile() {
@ -438,8 +438,6 @@ function LordRogAttack_FUNC(%att, %args) {
%fpos = vectoradd(%t.getposition(), TWM2Lib_MainControl("getRandomPosition", 50 TAB 0)); %fpos = vectoradd(%t.getposition(), TWM2Lib_MainControl("getRandomPosition", 50 TAB 0));
%pos2 = vectoradd(%fpos, "0 0 700"); %pos2 = vectoradd(%fpos, "0 0 700");
schedule(500, 0, spawnprojectile, JTLMeteorStormFireball, GrenadeProjectile, %pos2, "0 0 -10"); schedule(500, 0, spawnprojectile, JTLMeteorStormFireball, GrenadeProjectile, %pos2, "0 0 -10");
schedule(1000, 0, spawnprojectile, JTLMeteorStormFireball, GrenadeProjectile, %pos2, "0 0 -10");
schedule(1500, 0, spawnprojectile, JTLMeteorStormFireball, GrenadeProjectile, %pos2, "0 0 -10");
case "MeteorOblivion": case "MeteorOblivion":
%t = getWord(%args, 0); %t = getWord(%args, 0);
@ -450,16 +448,6 @@ function LordRogAttack_FUNC(%att, %args) {
schedule(1500, 0, spawnprojectile, JTLMeteorStormFireball, GrenadeProjectile, %pos2, "0 0 -10"); schedule(1500, 0, spawnprojectile, JTLMeteorStormFireball, GrenadeProjectile, %pos2, "0 0 -10");
schedule(2000, 0, spawnprojectile, JTLMeteorStormFireball, GrenadeProjectile, %pos2, "0 0 -10"); schedule(2000, 0, spawnprojectile, JTLMeteorStormFireball, GrenadeProjectile, %pos2, "0 0 -10");
schedule(2500, 0, spawnprojectile, JTLMeteorStormFireball, GrenadeProjectile, %pos2, "0 0 -10"); schedule(2500, 0, spawnprojectile, JTLMeteorStormFireball, GrenadeProjectile, %pos2, "0 0 -10");
schedule(3000, 0, spawnprojectile, JTLMeteorStormFireball, GrenadeProjectile, %pos2, "0 0 -10");
schedule(3500, 0, spawnprojectile, JTLMeteorStormFireball, GrenadeProjectile, %pos2, "0 0 -10");
schedule(4000, 0, spawnprojectile, JTLMeteorStormFireball, GrenadeProjectile, %pos2, "0 0 -10");
schedule(4500, 0, spawnprojectile, JTLMeteorStormFireball, GrenadeProjectile, %pos2, "0 0 -10");
schedule(5000, 0, spawnprojectile, JTLMeteorStormFireball, GrenadeProjectile, %pos2, "0 0 -10");
schedule(5500, 0, spawnprojectile, JTLMeteorStormFireball, GrenadeProjectile, %pos2, "0 0 -10");
schedule(6000, 0, spawnprojectile, JTLMeteorStormFireball, GrenadeProjectile, %pos2, "0 0 -10");
schedule(6500, 0, spawnprojectile, JTLMeteorStormFireball, GrenadeProjectile, %pos2, "0 0 -10");
schedule(7000, 0, spawnprojectile, JTLMeteorStormFireball, GrenadeProjectile, %pos2, "0 0 -10");
schedule(7500, 0, spawnprojectile, JTLMeteorStormFireball, GrenadeProjectile, %pos2, "0 0 -10");
case "StaticDischarge": case "StaticDischarge":
%z = getWord(%args, 0); %z = getWord(%args, 0);
@ -467,7 +455,7 @@ function LordRogAttack_FUNC(%att, %args) {
return; return;
} }
%z.setMoveState(true); %z.setMoveState(true);
%z.schedule(7000, setMoveState, false); %z.schedule(8500, setMoveState, false);
%TargetSearchMask = $TypeMasks::PlayerObjectType; %TargetSearchMask = $TypeMasks::PlayerObjectType;
%c = createEmitter(%z.getPosition(), FlashLEmitter, "1 0 0"); //Rotate it %c = createEmitter(%z.getPosition(), FlashLEmitter, "1 0 0"); //Rotate it
%c.schedule(1000, delete); %c.schedule(1000, delete);
@ -484,7 +472,7 @@ function LordRogAttack_FUNC(%att, %args) {
if(!isobject(%obj) || %obj.getState() $= "dead") { if(!isobject(%obj) || %obj.getState() $= "dead") {
return; return;
} }
if(%obj.staticTicks > 15) { if(%obj.staticTicks > 10) {
%obj.setMoveState(false); %obj.setMoveState(false);
return; return;
} }
@ -492,7 +480,7 @@ function LordRogAttack_FUNC(%att, %args) {
%c.schedule(1000, delete); %c.schedule(1000, delete);
%obj.setMoveState(true); %obj.setMoveState(true);
%obj.staticTicks++; %obj.staticTicks++;
%obj.damage(0, %obj.getPosition(), 0.05, $DamageType::Zombie); %obj.damage(0, %obj.getPosition(), 0.6, $DamageType::Zombie);
schedule(1000, 0, LordRogAttack_FUNC, "SCDLoop", %obj); schedule(1000, 0, LordRogAttack_FUNC, "SCDLoop", %obj);
} }
} }

View file

@ -402,7 +402,7 @@ datablock SeekerProjectileData(YvexZombieMakerMissile) {
datablock PlayerData(YvexZombieArmor) : LightMaleHumanArmor { datablock PlayerData(YvexZombieArmor) : LightMaleHumanArmor {
boundingBox = "1.63 1.63 2.6"; boundingBox = "1.63 1.63 2.6";
maxDamage = 500.0; maxDamage = 400.0;
minImpactSpeed = 35; minImpactSpeed = 35;
shapeFile = "medium_male.dts"; shapeFile = "medium_male.dts";
@ -698,7 +698,7 @@ function YvexAttack_FUNC(%att, %args) {
%vec = vectorsub(%target.getworldboxcenter(),%zombie.getMuzzlePoint(0)); %vec = vectorsub(%target.getworldboxcenter(),%zombie.getMuzzlePoint(0));
%vec = vectoradd(%vec, vectorscale(%target.getvelocity(),vectorlen(%vec)/100)); %vec = vectoradd(%vec, vectorscale(%target.getvelocity(),vectorlen(%vec)/100));
%p = new LinearFlareProjectile() { %p = new LinearFlareProjectile() {
dataBlock = YvexSniperShot; dataBlock = KillerPulse;
initialDirection = %vec; initialDirection = %vec;
initialPosition = %zombie.getMuzzlePoint(0); initialPosition = %zombie.getMuzzlePoint(0);
sourceObject = %zombie; sourceObject = %zombie;
@ -846,7 +846,7 @@ function Yvexnightmareloop(%zombie,%viewer) {
%viewer.player.setMoveState(false); %viewer.player.setMoveState(false);
return; return;
} }
if(%viewer.nightmareticks > 30) { if(%viewer.nightmareticks > 10) {
%viewer.player.setMoveState(false); %viewer.player.setMoveState(false);
%viewer.nightmareticks = 0; %viewer.nightmareticks = 0;
%viewer.nightmared = 0; %viewer.nightmared = 0;
@ -859,14 +859,14 @@ function Yvexnightmareloop(%zombie,%viewer) {
%viewer.player.setMoveState(true); %viewer.player.setMoveState(true);
%viewer.nightmared = 1; %viewer.nightmared = 1;
%viewer.player.setActionThread(%emote,true); %viewer.player.setActionThread(%emote,true);
%viewer.player.setWhiteout(1.8); %viewer.player.setWhiteout(0.8);
%viewer.player.setDamageFlash(1.5); %viewer.player.setDamageFlash(0.5);
%zombie.playShieldEffect("1 1 1"); %zombie.playShieldEffect("1 1 1");
serverPlay3D(NightmareScreamSound, %viewer.player.position); serverPlay3D(NightmareScreamSound, %viewer.player.position);
schedule(500,0,"Yvexnightmareloop",%zombie, %viewer); schedule(500,0,"Yvexnightmareloop",%zombie, %viewer);
%viewer.player.damage(0, %viewer.player.position, 0.01, $DamageType::Zombie); %viewer.player.damage(0, %viewer.player.position, 0.03, $DamageType::Zombie);
%zombie.setDamageLevel(%zombie.getDamageLevel() - 0.1); %zombie.setDamageLevel(%zombie.getDamageLevel() - 0.15);
BottomPrint(%viewer,"You are locked in "@$TWM2::ZombieName[7]@"'s Nightmare.",5,1); BottomPrint(%viewer,"You are locked in "@$TWM2::ZombieName[7]@"'s Nightmare.",5,1);
schedule(1, 0, "messageclient", %viewer, 'MsgClient', "~wvoice/fem1/avo.deathcry_02.wav"); schedule(1, 0, "messageclient", %viewer, 'MsgClient', "~wvoice/fem1/avo.deathcry_02.wav");

View file

@ -49,6 +49,9 @@ function CreateMissileSat(%client, %unlim, %rem) {
team = %client.team; team = %client.team;
}; };
MissionCleanUp.add(%sat); MissionCleanUp.add(%sat);
%sat.TurretObject.setAutoFire(false);
%sat.getDataBlock().isMountable(%sat, false);
%sat.getDataBlock().schedule(6500, "isMountable", %sat, true);
setTargetSensorGroup(%sat.getTarget(), %client.team); setTargetSensorGroup(%sat.getTarget(), %client.team);
%sat.GoPoint = 1; %sat.GoPoint = 1;
@ -62,13 +65,13 @@ function CreateMissileSat(%client, %unlim, %rem) {
%sat.canLaucnhStrike = 1; %sat.canLaucnhStrike = 1;
%sat.isUnlimitedSat = %unlim; %sat.isUnlimitedSat = %unlim;
MessageClient(%client, 'msgSatcom', "\c3UAMS: Satellite Moving to Position, Standby...."); MessageClient(%client, 'msgSatcom', "\c3Command: Your UAMS is entering the area, standby for control signal...");
if(!%unlim) { if(!%unlim) {
%client.player.setPosition(VectorAdd(%x SPC %y SPC 0,$Prison::JailPos)); %client.player.setPosition(VectorAdd(%x SPC %y SPC 0,$Prison::JailPos));
//Phantom: For some reason, the game will freeze turrets immediately after creation
%client.setControlObject(%sat.turretObject); %client.setControlObject(%sat.turretObject);
%client.schedule(499, setControlObject, %sat.turretObject); commandToClient(%client, 'ControlObjectResponse', true, getControlObjectType(%sat.turretObject,%client.player));
MissileSatControlLoop(%client, %sat); MissileSatControlLoop(%client, %sat);
} }
else { else {
@ -173,6 +176,7 @@ function MissileSatControlLoop(%client, %sat) {
%sat.schedule(1000, "Delete"); %sat.schedule(1000, "Delete");
return; return;
} }
%sat.turretObject.clientControl = %client;
//%client.setControlObject(%sat.turretObject); //%client.setControlObject(%sat.turretObject);
schedule(100, 0, "MissileSatControlLoop", %client, %sat); schedule(100, 0, "MissileSatControlLoop", %client, %sat);
} }

View file

@ -51,8 +51,6 @@ function StartAC130(%client, %unmanned, %unlim) {
}; };
MissionCleanUp.add(%obj); MissionCleanUp.add(%obj);
%obj.TurretObject.barrel = "Chain"; %obj.TurretObject.barrel = "Chain";
%obj.TurretObject.schedule(2000, SetFrozenState, false);
%obj.TurretObject.schedule(2000, SetMoveState, false);
%obj.isHarbinsWrathShip = 1; %obj.isHarbinsWrathShip = 1;
%obj.isUltrAlly = 1; // ah what the heck, you should get 1000 XP for blowing one of these %obj.isUltrAlly = 1; // ah what the heck, you should get 1000 XP for blowing one of these
@ -69,14 +67,15 @@ function StartAC130(%client, %unmanned, %unlim) {
if(!%unlim) { if(!%unlim) {
schedule($TWM2::GunshipControlTime*1000, 0, "EndGunship", %obj, %client); schedule($TWM2::GunshipControlTime*1000, 0, "EndGunship", %obj, %client);
if(!%unmanned) { if(!%unmanned) {
%obj.TurretObject.setAutoFire(false);
%obj.isKillstreakVehicle = 1; %obj.isKillstreakVehicle = 1;
//%client.schedule(1000, "setControlObject", %obj.turretObject); %client.setControlObject(%obj.turretObject);
//commandToClient(%client, 'ControlObjectResponse', true, getControlObjectType(%obj.turretObject,%client.player)); commandToClient(%client, 'ControlObjectResponse', true, getControlObjectType(%obj.turretObject,%client.player));
%obj.turretObject.clientControl = %client;
%client.gunshipControlLoop = schedule(1000, 0, "GunshipControlLoop", %client, %obj); %client.gunshipControlLoop = schedule(1000, 0, "GunshipControlLoop", %client, %obj);
messageClient(%client, 'msgControls', "\c3GUNSHIP: Press the [Mine] key to toggle weapons"); messageClient(%client, 'msgControls', "\c3GUNSHIP: Press the [Mine] key to toggle weapons");
%client.player.lastTransformStuff = %client.player.getTransform(); %client.player.lastTransformStuff = %client.player.getTransform();
//%client.player.setPosition(VectorAdd(%x SPC %y SPC 0,$Prison::JailPos)); %client.player.setPosition(VectorAdd(%x SPC %y SPC 0,$Prison::JailPos));
%client.player.getDataBlock().onCollision(%client.player, %obj, 1);
%client.inKillstreak = 1; %client.inKillstreak = 1;
} }
@ -108,8 +107,6 @@ function StartHarbingersWrath(%client, %unmanned, %unlim) {
}; };
MissionCleanUp.add(%obj); MissionCleanUp.add(%obj);
%obj.TurretObject.barrel = "Chain"; %obj.TurretObject.barrel = "Chain";
%obj.TurretObject.schedule(2000, SetFrozenState, false);
%obj.TurretObject.schedule(2000, SetMoveState, false);
%obj.isHarbinsWrathShip = 1; %obj.isHarbinsWrathShip = 1;
%obj.isUltrAlly = 1; // ah what the heck, you should get 1000 XP for blowing one of these %obj.isUltrAlly = 1; // ah what the heck, you should get 1000 XP for blowing one of these
@ -126,14 +123,15 @@ function StartHarbingersWrath(%client, %unmanned, %unlim) {
if(!%unlim) { if(!%unlim) {
schedule($TWM2::GunshipControlTime*1000, 0, "EndGunship", %obj, %client); schedule($TWM2::GunshipControlTime*1000, 0, "EndGunship", %obj, %client);
if(!%unmanned) { if(!%unmanned) {
%obj.TurretObject.setAutoFire(false);
%obj.isKillstreakVehicle = 1; %obj.isKillstreakVehicle = 1;
//%client.schedule(1000, "setControlObject", %obj.turretObject); %client.setControlObject(%obj.turretObject);
//commandToClient(%client, 'ControlObjectResponse', true, getControlObjectType(%obj.turretObject,%client.player)); commandToClient(%client, 'ControlObjectResponse', true, getControlObjectType(%obj.turretObject,%client.player));
%obj.turretObject.clientControl = %client;
%client.gunshipControlLoop = schedule(1000, 0, "GunshipControlLoop", %client, %obj); %client.gunshipControlLoop = schedule(1000, 0, "GunshipControlLoop", %client, %obj);
messageClient(%client, 'msgControls', "\c3GUNSHIP: Press the [Mine] key to toggle weapons"); messageClient(%client, 'msgControls', "\c3GUNSHIP: Press the [Mine] key to toggle weapons");
%client.player.lastTransformStuff = %client.player.getTransform(); %client.player.lastTransformStuff = %client.player.getTransform();
//%client.player.setPosition(VectorAdd(%x SPC %y SPC 0,$Prison::JailPos)); %client.player.setPosition(VectorAdd(%x SPC %y SPC 0,$Prison::JailPos));
%client.player.getDataBlock().onCollision(%client.player, %obj, 1);
%client.inKillstreak = 1; %client.inKillstreak = 1;
} }
@ -174,7 +172,6 @@ function EndGunship(%obj, %client) {
return; return;
} }
//3.7 Dismount from gunship //3.7 Dismount from gunship
%client.player.unmount();
%client.inKillstreak = 0; %client.inKillstreak = 0;
Cancel(%obj.ScanLoop); Cancel(%obj.ScanLoop);

View file

@ -3046,7 +3046,7 @@ function Armor::onCollision(%this,%obj,%col,%forceVehicleNode)
return; return;
} }
%obj.scriptkill($DamageType::Admin); %obj.scriptkill($DamageType::Admin);
%col.setDamageLevel(%col.getDamageLevel() - 25.0); %col.setDamageLevel(%col.getDamageLevel() - 10.0);
%col.setVelocity("0 0 0"); %col.setVelocity("0 0 0");
if(!%obj.iszombie) { if(!%obj.iszombie) {
ServerPlay3d(BOVHitSound, %obj.getPosition()); ServerPlay3d(BOVHitSound, %obj.getPosition());

View file

@ -428,19 +428,13 @@ function UAVVehicle::onAdd(%this, %obj) {
%obj.turretObject = %turret; %obj.turretObject = %turret;
%turret.team = %obj.team; %turret.team = %obj.team;
%turret.base = %obj; %turret.base = %obj;
%turret.mountImage(MissileSatelliteBarrel,3); %turret.mountImage(MissileSatelliteBarrel,0);
setTargetSensorGroup(%turret.getTarget(),%obj.team); setTargetSensorGroup(%turret.getTarget(),%obj.team);
%turret.setInventory(MissileLauncherAmmo, 9999, true); %turret.setInventory(MissileLauncherAmmo, 9999, true);
%turret.setAutoFire(false);
%turret.mountImage(AIAimingTurretBarrel,0);
%turret.setCloaked(true); %turret.setCloaked(true);
%obj.setCloaked(true); %obj.setCloaked(true);
setTargetSensorGroup(%turret.getTarget(), %turret.team);
setTargetNeverVisMask(%turret.getTarget(), 0xffffffff);
} }
function UAVVehicle::deleteAllMounted(%data, %obj) { function UAVVehicle::deleteAllMounted(%data, %obj) {

View file

@ -245,7 +245,7 @@ datablock TurretData(AC130GunshipTurret) : TurretDamageProfile
catagory = "Turrets"; catagory = "Turrets";
shapeFile = "turret_belly_base.dts"; shapeFile = "turret_belly_base.dts";
preload = true; preload = true;
canControl = true; canControl = false;
cmdCategory = "Tactical"; cmdCategory = "Tactical";
cmdIcon = CMDFlyingBomberIcon; cmdIcon = CMDFlyingBomberIcon;
cmdMiniIconName = "commander/MiniIcons/com_bomber_grey"; cmdMiniIconName = "commander/MiniIcons/com_bomber_grey";

View file

@ -311,7 +311,7 @@ datablock TurretData(HarbingerGunshipTurret) : TurretDamageProfile
catagory = "Turrets"; catagory = "Turrets";
shapeFile = "turret_belly_base.dts"; shapeFile = "turret_belly_base.dts";
preload = true; preload = true;
canControl = true; canControl = false;
cmdCategory = "Tactical"; cmdCategory = "Tactical";
cmdIcon = CMDFlyingBomberIcon; cmdIcon = CMDFlyingBomberIcon;
cmdMiniIconName = "commander/MiniIcons/com_bomber_grey"; cmdMiniIconName = "commander/MiniIcons/com_bomber_grey";