Additional Server Controls, Other Stuff

Added more name change capabilities to serverControl.cs, adjusted the
Acid Cannon to the new behavior, prep work for sniper zombies and the
new mini boss coming in 3.9.2.
This commit is contained in:
Robert Fritzen 2017-12-21 14:54:47 -06:00
parent 34dc29b805
commit 301ce62a62
35 changed files with 1004 additions and 479 deletions

View file

@ -150,7 +150,7 @@ function WindshearAttacks(%drone) {
schedule(8100, 0, "WindshearAttack_FUNC", "Flare", %drone);
schedule(8200, 0, "WindshearAttack_FUNC", "Flare", %drone);
schedule(8300, 0, "WindshearAttack_FUNC", "Flare", %drone);
MessageAll('MessageAll', "\c4"@$TWM2::BossName["Windshear"]@": Did you actually think those missiles could hit me?");
MessageAll('MessageAll', "\c4"@$TWM2::BossNameInternal["Windshear"]@": Did you actually think those missiles could hit me?");
case 2:
%target = DroneFindNearestPilot(2000,%drone);
if(%target.player) {
@ -170,10 +170,10 @@ function WindshearAttacks(%drone) {
schedule(8100, 0, "WindshearAttack_FUNC", "SidewinderLaunch", %drone SPC %target.player SPC 1);
schedule(8200, 0, "WindshearAttack_FUNC", "SidewinderLaunch", %drone SPC %target.player SPC 1);
schedule(8300, 0, "WindshearAttack_FUNC", "SidewinderLaunch", %drone SPC %target.player SPC 1);
MessageAll('MessageAll', "\c4"@$TWM2::BossName["Windshear"]@": I've got missiles with "@getTaggedString(%target.name)@"'s name on them");
MessageAll('MessageAll', "\c4"@$TWM2::BossNameInternal["Windshear"]@": I've got missiles with "@getTaggedString(%target.name)@"'s name on them");
}
else {
MessageAll('MessageAll', "\c4"@$TWM2::BossName["Windshear"]@": No missiles for now....");
MessageAll('MessageAll', "\c4"@$TWM2::BossNameInternal["Windshear"]@": No missiles for now....");
}
case 3:
%target = DroneFindNearestPilot(2000,%drone);
@ -189,21 +189,21 @@ function WindshearAttacks(%drone) {
schedule(1200, 0, "WindshearAttack_FUNC", "SidewinderLaunch", %drone SPC %target.player SPC 1);
schedule(1300, 0, "WindshearAttack_FUNC", "SidewinderLaunch", %drone SPC %target.player SPC 1);
schedule(1400, 0, "WindshearAttack_FUNC", "SidewinderLaunch", %drone SPC %target.player SPC 1);
MessageAll('MessageAll', "\c4"@$TWM2::BossName["Windshear"]@": I'ma kill me a "@getTaggedString(%target.name)@"!");
MessageAll('MessageAll', "\c4"@$TWM2::BossNameInternal["Windshear"]@": I'ma kill me a "@getTaggedString(%target.name)@"!");
}
else {
schedule(700, 0, "WindshearAttack_FUNC", "Flare", %drone);
schedule(1400, 0, "WindshearAttack_FUNC", "Flare", %drone);
schedule(2100, 0, "WindshearAttack_FUNC", "Flare", %drone);
schedule(2800, 0, "WindshearAttack_FUNC", "Flare", %drone);
MessageAll('MessageAll', "\c4"@$TWM2::BossName["Windshear"]@": FLARES!");
MessageAll('MessageAll', "\c4"@$TWM2::BossNameInternal["Windshear"]@": FLARES!");
}
default:
schedule(700, 0, "WindshearAttack_FUNC", "Flare", %drone);
schedule(1400, 0, "WindshearAttack_FUNC", "Flare", %drone);
schedule(2100, 0, "WindshearAttack_FUNC", "Flare", %drone);
schedule(2800, 0, "WindshearAttack_FUNC", "Flare", %drone);
MessageAll('MessageAll', "\c4"@$TWM2::BossName["Windshear"]@": FLARES! NOW!!!");
MessageAll('MessageAll', "\c4"@$TWM2::BossNameInternal["Windshear"]@": FLARES! NOW!!!");
}
}

View file

@ -162,7 +162,7 @@ function SpawnVegenor(%position) {
Datablock = "VegenorZombieArmor";
};
%Cpos = vectorAdd(%position, "0 0 5");
MessageAll('MsgBossSpawn', "\c4"@$TWM2::BossName["Vegenor"]@": Time to engage the enemy soldiers!!!");
MessageAll('MsgBossSpawn', "\c4"@$TWM2::BossNameInternal["Vegenor"]@": Time to engage the enemy soldiers!!!");
%command = "Vegenormovetotarget";
%zombie.ticks = 0;
@ -201,7 +201,7 @@ function Vegenormovetotarget(%zombie){
%zombie.startFade(1000, 0, false);
%zombie.setPosition(vectorAdd(vectoradd(%closestclient.player.getPosition(), "0 0 20"), TWM2Lib_MainControl("getRandomPosition", 25 TAB 1)));
%zombie.setVelocity("0 0 0");
MessageAll('msgAntiFall', "\c4"@$TWM2::BossName["Vegenor"]@": Falling, How about no...");
MessageAll('msgAntiFall', "\c4"@$TWM2::BossNameInternal["Vegenor"]@": Falling, How about no...");
}
%closestDistance = getWord(%closestClient,1);
%closestClient = getWord(%closestClient,0).Player;
@ -267,9 +267,9 @@ function VegenorAttack_FUNC(%att, %args) {
%msg = getrandom(1,2);
switch(%msg) {
case 1:
messageall('MsgSummon',"\c4"@$TWM2::BossName["Vegenor"]@": Attack the enemy");
messageall('MsgSummon',"\c4"@$TWM2::BossNameInternal["Vegenor"]@": Attack the enemy");
case 2:
messageall('MsgSummon',"\c4"@$TWM2::BossName["Vegenor"]@": Hunt them all down");
messageall('MsgSummon',"\c4"@$TWM2::BossNameInternal["Vegenor"]@": Hunt them all down");
}
for(%i = 0; %i < 6; %i++) {
%pos = vectoradd(%z.getPosition(), TWM2Lib_MainControl("getRandomPosition", 10 TAB 1));
@ -313,23 +313,23 @@ function VegenorAttack(%z) {
case 1:
%target = FindValidTarget(%z);
if(isObject(%target.player) && !%target.ignoredbyZombs) {
MessageAll('MessageAll', "\c4"@$TWM2::BossName["Vegenor"]@": Flame on "@getTaggedString(%target.name)@"!");
MessageAll('MessageAll', "\c4"@$TWM2::BossNameInternal["Vegenor"]@": Flame on "@getTaggedString(%target.name)@"!");
VegenorAttack_FUNC("SetFire", %target.player);
}
else {
MessageAll('MessageAll', "\c4"@$TWM2::BossName["Vegenor"]@": heh, "@getTaggedString(%target.name)@" is already dead!");
MessageAll('MessageAll', "\c4"@$TWM2::BossNameInternal["Vegenor"]@": heh, "@getTaggedString(%target.name)@" is already dead!");
}
case 2:
%target = FindValidTarget(%z);
if(isObject(%target.player) && !%target.ignoredbyZombs) {
MessageAll('MessageAll', "\c4"@$TWM2::BossName["Vegenor"]@": Lets insert some fire into your life, "@getTaggedString(%target.name)@"!");
MessageAll('MessageAll', "\c4"@$TWM2::BossNameInternal["Vegenor"]@": Lets insert some fire into your life, "@getTaggedString(%target.name)@"!");
VegenorAttack_FUNC("FlameMissileSingle", %target.player);
}
else {
MessageAll('MessageAll', "\c4"@$TWM2::BossName["Vegenor"]@": Hiding from me "@getTaggedString(%target.name)@"?");
MessageAll('MessageAll', "\c4"@$TWM2::BossNameInternal["Vegenor"]@": Hiding from me "@getTaggedString(%target.name)@"?");
}
case 3:
MessageAll('MessageAll', "\c4"@$TWM2::BossName["Vegenor"]@": Fire Missiles For ALL!!");
MessageAll('MessageAll', "\c4"@$TWM2::BossNameInternal["Vegenor"]@": Fire Missiles For ALL!!");
for(%i = 0; %i < ClientGroup.getCount(); %i++) {
%cl = ClientGroup.getObject(%i);
if(isObject(%cl.player) && %cl.player.getState() !$= "dead") {
@ -339,13 +339,13 @@ function VegenorAttack(%z) {
case 4:
%target = FindValidTarget(%z);
if(isObject(%target.player) && !%target.ignoredbyZombs) {
MessageAll('MessageAll', "\c4"@$TWM2::BossName["Vegenor"]@": Hey "@getTaggedString(%target.name)@", LOOK UP!!!");
MessageAll('MessageAll', "\c4"@$TWM2::BossNameInternal["Vegenor"]@": Hey "@getTaggedString(%target.name)@", LOOK UP!!!");
VegenorAttack_FUNC("MeteorDrop", %target.player);
}
else {
MessageAll('MessageAll', "\c4"@$TWM2::BossName["Vegenor"]@": Hiding does not beat me "@getTaggedString(%target.name)@"!!!");
MessageAll('MessageAll', "\c4"@$TWM2::BossNameInternal["Vegenor"]@": Hiding does not beat me "@getTaggedString(%target.name)@"!!!");
}
default:
MessageAll('MessageAll', "\c4"@$TWM2::BossName["Vegenor"]@": I shall wait!!!");
MessageAll('MessageAll', "\c4"@$TWM2::BossNameInternal["Vegenor"]@": I shall wait!!!");
}
}

View file

@ -408,10 +408,10 @@ function StartGhostFire(%pos) {
%Ghost.isGOF = 1;
%Ghost.isBoss = 1;
MissionCleanup.add(%Ghost);
%Ghost.target = createTarget(%Ghost, ""@$TWM2::BossName["GoF"]@"", "", "Male3", '', %Ghost.team, PlayerSensor);
%Ghost.target = createTarget(%Ghost, ""@$TWM2::BossName["GhostOfFire"]@"", "", "Male3", '', %Ghost.team, PlayerSensor);
setTargetSensorData(%Ghost.target, PlayerSensor);
setTargetSensorGroup(%Ghost.target, 30);
setTargetName(%Ghost.target, addtaggedstring($TWM2::BossName["GoF"]));
setTargetName(%Ghost.target, addtaggedstring($TWM2::BossName["GhostOfFire"]));
GOFAttack_FUNC("ConsiderFlamethrower", %Ghost);
GOFDoRandomAttacks(%ghost);
@ -460,7 +460,7 @@ function GOFPerformMove(%ghost,%closestClient,%closestDistance) {
%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...");
MessageAll('msgBossAlertAttack', "\c4"@$TWM2::BossNameInternal["GhostOfFire"]@": My ghostly powers allow me to laugh aside your hopes of me falling to my death...");
}
%pos = %ghost.getworldboxcenter();
%closestClient = %closestClient.Player;
@ -605,7 +605,7 @@ function GOFAttack_FUNC(%att, %args) {
%fP = vectorAdd(%cP, %nP2);
GOFAttack_FUNC("FireBlast", %g TAB %cP);
%g.setTransform(%fP);
messageall('TheFireMsg',"\c4"@$TWM2::BossName["GoF"]@": Experience the glorious flames..");
messageall('TheFireMsg',"\c4"@$TWM2::BossNameInternal["GhostOfFire"]@": Experience the glorious flames..");
case "Flamecano":
%g = getWord(%args, 0);
@ -706,18 +706,18 @@ function GOFDoRandomAttacks(%g) {
case 1:
if(isObject(%target.player)) {
GOFAttack_FUNC("FireBlast", %g TAB %target.player.getPosition());
messageall('TheFireMsg',"\c4"@$TWM2::BossName["GoF"]@": Time to heat things up "@getTaggedString(%target.name)@".");
messageall('TheFireMsg',"\c4"@$TWM2::BossNameInternal["GhostOfFire"]@": Time to heat things up "@getTaggedString(%target.name)@".");
}
else {
messageall('TheFireMsg',"\c4"@$TWM2::BossName["GoF"]@": Frightened of my fire? Good.");
messageall('TheFireMsg',"\c4"@$TWM2::BossNameInternal["GhostOfFire"]@": Frightened of my fire? Good.");
}
case 2:
if(isObject(%target.player)) {
GOFAttack_FUNC("Fireball", %g SPC %target.player);
messageall('TheFireMsg',"\c4"@$TWM2::BossName["GoF"]@": Hey "@getTaggedString(%target.name)@", Dodge this!");
messageall('TheFireMsg',"\c4"@$TWM2::BossNameInternal["GhostOfFire"]@": Hey "@getTaggedString(%target.name)@", Dodge this!");
}
else {
messageall('TheFireMsg',"\c4"@$TWM2::BossName["GoF"]@": Frightened of this? Good.");
messageall('TheFireMsg',"\c4"@$TWM2::BossNameInternal["GhostOfFire"]@": Frightened of this? Good.");
}
case 3:
if(isObject(%target.player)) {
@ -726,10 +726,10 @@ function GOFDoRandomAttacks(%g) {
schedule(800, 0, GOFAttack_FUNC, "Fireball", %g SPC %target.player);
schedule(1200, 0, GOFAttack_FUNC, "Fireball", %g SPC %target.player);
schedule(1600, 0, GOFAttack_FUNC, "Fireball", %g SPC %target.player);
messageall('TheFireMsg',"\c4"@$TWM2::BossName["GoF"]@": I have a Flame Storm cooked up nicely for "@getTaggedString(%target.name)@", enjoy...");
messageall('TheFireMsg',"\c4"@$TWM2::BossNameInternal["GhostOfFire"]@": I have a Flame Storm cooked up nicely for "@getTaggedString(%target.name)@", enjoy...");
}
else {
messageall('TheFireMsg',"\c4"@$TWM2::BossName["GoF"]@": I love Fire.. it's Good your scared.");
messageall('TheFireMsg',"\c4"@$TWM2::BossNameInternal["GhostOfFire"]@": I love Fire.. it's Good your scared.");
}
case 4:
if(isObject(%target.player)) {
@ -738,36 +738,36 @@ function GOFDoRandomAttacks(%g) {
schedule(800, 0, GOFAttack_FUNC, "FireBlast", %g TAB vectorAdd(%target.player.getPosition(), "0 0 35"));
schedule(1200, 0, GOFAttack_FUNC, "FireBlast", %g TAB vectorAdd(%target.player.getPosition(), "0 0 40"));
schedule(1600, 0, GOFAttack_FUNC, "FireBlast", %g TAB vectorAdd(%target.player.getPosition(), "0 0 45"));
messageall('TheFireMsg',"\c4"@$TWM2::BossName["GoF"]@": Hear that, it's the sound of exploding fire ending your life...");
messageall('TheFireMsg',"\c4"@$TWM2::BossNameInternal["GhostOfFire"]@": Hear that, it's the sound of exploding fire ending your life...");
}
else {
messageall('TheFireMsg',"\c4"@$TWM2::BossName["GoF"]@": Frightened Of Fire? Good.");
messageall('TheFireMsg',"\c4"@$TWM2::BossNameInternal["GhostOfFire"]@": Frightened Of Fire? Good.");
}
case 5:
if(isObject(%target.player)) {
GOFDoFlameCano(%g, %target);
messageall('TheFireMsg',"\c4"@$TWM2::BossName["GoF"]@": I Intend Every Moment... FLAMECANO!");
messageall('TheFireMsg',"\c4"@$TWM2::BossNameInternal["GhostOfFire"]@": I Intend Every Moment... FLAMECANO!");
}
else {
messageall('TheFireMsg',"\c4"@$TWM2::BossName["GoF"]@": Oh Well, The Volcanic Explosion Can Wait.");
messageall('TheFireMsg',"\c4"@$TWM2::BossNameInternal["GhostOfFire"]@": Oh Well, The Volcanic Explosion Can Wait.");
}
case 6:
if(isObject(%target.player)) {
GOFAttack_FUNC("LaunchSeekfire", %g SPC %target.player SPC 1);
messageall('TheFireMsg',"\c4"@$TWM2::BossName["GoF"]@": Clensic Flames Will Persue You "@getTaggedString(%target.name)@"!");
messageall('TheFireMsg',"\c4"@$TWM2::BossNameInternal["GhostOfFire"]@": Clensic Flames Will Persue You "@getTaggedString(%target.name)@"!");
}
else {
messageall('TheFireMsg',"\c4"@$TWM2::BossName["GoF"]@": Darn, I Love Cursed Fire.");
messageall('TheFireMsg',"\c4"@$TWM2::BossNameInternal["GhostOfFire"]@": Darn, I Love Cursed Fire.");
}
case 7:
if(isObject(%target.player)) {
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"]@": "@getTaggedString(%target.name)@", I present to you the gift, of cursed flames...");
messageall('TheFireMsg',"\c4"@$TWM2::BossNameInternal["GhostOfFire"]@": "@getTaggedString(%target.name)@", I present to you the gift, of cursed flames...");
}
else {
messageall('TheFireMsg',"\c4"@$TWM2::BossName["GoF"]@": Darn, I Love Mega Cursed Fire.");
messageall('TheFireMsg',"\c4"@$TWM2::BossNameInternal["GhostOfFire"]@": Darn, I Love Mega Cursed Fire.");
}
case 8:
if(isObject(%target.player)) {
@ -776,27 +776,27 @@ function GOFDoRandomAttacks(%g) {
%time = %i * 100;
schedule(%time, 0, GOFAttack_FUNC, "Fireball", %g SPC %target.player);
}
messageall('TheFireMsg',"\c4"@$TWM2::BossName["GoF"]@": Lets unleash the fireballs upon "@getTaggedString(%target.name)@"!!!");
messageall('TheFireMsg',"\c4"@$TWM2::BossNameInternal["GhostOfFire"]@": Lets unleash the fireballs upon "@getTaggedString(%target.name)@"!!!");
}
else {
messageall('TheFireMsg',"\c4"@$TWM2::BossName["GoF"]@": I love Fire.. it's Good your scared.");
messageall('TheFireMsg',"\c4"@$TWM2::BossNameInternal["GhostOfFire"]@": I love Fire.. it's Good your scared.");
}
case 9:
GOFAttack_FUNC("FBSpiral", %g SPC 200);
messageall('TheFireMsg',"\c4"@$TWM2::BossName["GoF"]@": Let the flaming spinner begin!");
messageall('TheFireMsg',"\c4"@$TWM2::BossNameInternal["GhostOfFire"]@": Let the flaming spinner begin!");
case 10:
GOFAttack_FUNC("FBSpiral", %g SPC 200);
schedule(1000, 0, GOFAttack_FUNC, "FBSpiral", %g SPC 200);
schedule(2000, 0, GOFAttack_FUNC, "FBSpiral", %g SPC 200);
schedule(3000, 0, GOFAttack_FUNC, "FBSpiral", %g SPC 200);
schedule(4000, 0, GOFAttack_FUNC, "FBSpiral", %g SPC 200);
messageall('TheFireMsg',"\c4"@$TWM2::BossName["GoF"]@": CLENSE ALL!");
messageall('TheFireMsg',"\c4"@$TWM2::BossNameInternal["GhostOfFire"]@": CLENSE ALL!");
case 11:
GOFAttack_FUNC("Ultracano", %g SPC "0 0" SPC getTerrainHeight("0 0 0"));
schedule(3000, 0, GOFAttack_FUNC, "Ultracano", %g SPC "0 0" SPC getTerrainHeight("0 0 0"));
schedule(6000, 0, GOFAttack_FUNC, "Ultracano", %g SPC "0 0" SPC getTerrainHeight("0 0 0"));
schedule(9000, 0, GOFAttack_FUNC, "Ultracano", %g SPC "0 0" SPC getTerrainHeight("0 0 0"));
messageall('TheFireMsg',"\c4"@$TWM2::BossName["GoF"]@": ERUPT!!! MY VOLCANO!!!!");
messageall('TheFireMsg',"\c4"@$TWM2::BossNameInternal["GhostOfFire"]@": ERUPT!!! MY VOLCANO!!!!");
case 12:
GOFAttack_FUNC("Ultracano", %g SPC "0 0" SPC getTerrainHeight("0 0 0"));
schedule(3000, 0, GOFAttack_FUNC, "Ultracano", %g SPC "0 0" SPC getTerrainHeight("0 0 0"));
@ -806,7 +806,7 @@ function GOFDoRandomAttacks(%g) {
schedule(15000, 0, GOFAttack_FUNC, "Ultracano", %g SPC "0 0" SPC getTerrainHeight("0 0 0"));
schedule(18000, 0, GOFAttack_FUNC, "Ultracano", %g SPC "0 0" SPC getTerrainHeight("0 0 0"));
schedule(20000, 0, GOFAttack_FUNC, "Ultracano", %g SPC "0 0" SPC getTerrainHeight("0 0 0"));
messageall('TheFireMsg',"\c4"@$TWM2::BossName["GoF"]@": YES YES YES!!!! SUPERVOLCANO GO!!!!!");
messageall('TheFireMsg',"\c4"@$TWM2::BossNameInternal["GhostOfFire"]@": YES YES YES!!!! SUPERVOLCANO GO!!!!!");
case 13 or 14 or 15:
if(isObject(%target.player)) {
%store = %target.player.getPosition();
@ -818,10 +818,10 @@ function GOFDoRandomAttacks(%g) {
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::BossNameInternal["GhostOfFire"]@": Rise Mt. Death... Cleanse "@getTaggedString(%target.name)@"!");
}
else {
messageall('TheFireMsg',"\c4"@$TWM2::BossName["GoF"]@": Mt Death can await....");
messageall('TheFireMsg',"\c4"@$TWM2::BossNameInternal["GhostOfFire"]@": Mt Death can await....");
}
}
schedule(25000,0,"GOFDoRandomAttacks", %g);

View file

@ -148,13 +148,13 @@ function SpawnGhostOfLightning(%position) {
Datablock = "LightningGhostArmor";
};
%Cpos = vectorAdd(%position, "0 0 5");
MessageAll('msgBossAlertreturn', "\c4"@$TWM2::BossName["GoL"]@": It's time to show you the shocking power of electricity");
MessageAll('msgBossAlertreturn', "\c4"@$TWM2::BossNameInternal["GhostOfLightning"]@": It's time to show you the shocking power of electricity");
%command = "GoLmovetotarget";
InitiateBoss(%Ghost, "GhostOfLightning");
%Ghost.team = 30;
%zname = CollapseEscape("\c7"@$TWM2::BossName["GoL"]@"");
%zname = $TWM2::BossName["GhostOfLightning"];
DoGoLAttacks(%ghost);
%Ghost.target = createTarget(%Ghost, %zname, "", "Derm3", '', %Ghost.team, PlayerSensor);
@ -185,12 +185,12 @@ function GoLmovetotarget(%Ghost){
%Ghost.startFade(1000, 0, false);
%Ghost.setPosition(vectorAdd(%ghost.getPosition(), "0 0 500"));
%Ghost.setVelocity("0 0 0");
MessageAll('msgBossAlertAttack', "\c4"@$TWM2::BossName["GoL"]@": I'm back!!!");
MessageAll('msgBossAlertAttack', "\c4"@$TWM2::BossNameInternal["GhostOfLightning"]@": I'm back!!!");
}
%closestDistance = getWord(%closestClient,1);
%closestClient = getWord(%closestClient,0).Player;
if(%closestDistance < 20) {
MessageAll('msgBossAlertAttack', "\c4"@$TWM2::BossName["GoL"]@": I don't think so!");
MessageAll('msgBossAlertAttack', "\c4"@$TWM2::BossNameInternal["GhostOfLightning"]@": I don't think so!");
//ATTACK
%p = new ShockLanceProjectile() {
dataBlock = GoLShocker;
@ -243,10 +243,10 @@ function DoGoLAttacks(%ghost) {
%target = FindValidTarget(%ghost);
if(!isObject(%target.player)) {
schedule(35000, 0, "DoGoLAttacks", %ghost);
MessageAll('msgBossAlertAttack', "\c4"@$TWM2::BossName["GoL"]@": Meh, no targets for me.");
MessageAll('msgBossAlertAttack', "\c4"@$TWM2::BossNameInternal["GhostOfLightning"]@": Meh, no targets for me.");
return;
}
MessageAll('msgBossAlertAttack', "\c4"@$TWM2::BossName["GoL"]@": Lightning Strike Away!!!");
MessageAll('msgBossAlertAttack', "\c4"@$TWM2::BossNameInternal["GhostOfLightning"]@": Lightning Strike Away!!!");
%p = discharge2(%target.player.getPosition(),"0 0 -1");
%p.setEnergyPercentage(1);
addToShock(%p);
@ -255,20 +255,20 @@ function DoGoLAttacks(%ghost) {
%target = FindValidTarget(%ghost);
if(!isObject(%target.player)) {
schedule(35000, 0, "DoGoLAttacks", %ghost);
MessageAll('msgBossAlertAttack', "\c4"@$TWM2::BossName["GoL"]@": Meh, no targets for me.");
MessageAll('msgBossAlertAttack', "\c4"@$TWM2::BossNameInternal["GhostOfLightning"]@": Meh, no targets for me.");
return;
}
MessageAll('msgBossAlertAttack', "\c4"@$TWM2::BossName["GoL"]@": Watch Electricity Chase You!!!");
MessageAll('msgBossAlertAttack', "\c4"@$TWM2::BossNameInternal["GhostOfLightning"]@": Watch Electricity Chase You!!!");
%vec = vectorNormalize(vectorSub(%target.player.getPosition(),%ghost.getPosition()));
createMissileSeekingProjectile("IonMissile", %target, %ghost, %ghost.getMuzzlePoint(0), %vec, 4, 100);
case 3:
%target = FindValidTarget(%ghost);
if(!isObject(%target.player)) {
schedule(35000, 0, "DoGoLAttacks", %ghost);
MessageAll('msgBossAlertAttack', "\c4"@$TWM2::BossName["GoL"]@": Meh, no targets for me.");
MessageAll('msgBossAlertAttack', "\c4"@$TWM2::BossNameInternal["GhostOfLightning"]@": Meh, no targets for me.");
return;
}
MessageAll('msgBossAlertAttack', "\c4"@$TWM2::BossName["GoL"]@": Die Now...");
MessageAll('msgBossAlertAttack', "\c4"@$TWM2::BossNameInternal["GhostOfLightning"]@": Die Now...");
%target = %target.player;
%p = new ShockLanceProjectile() {
dataBlock = GoLShocker;
@ -283,10 +283,10 @@ function DoGoLAttacks(%ghost) {
%totalDamage = 50;
%target.getDataBlock().damageObject(%target, %ghost, %target.getPosition(), %totalDamage, $DamageType::ShockLance);
case 4:
MessageAll('msgBossAlertAttack', "\c4"@$TWM2::BossName["GoL"]@": Its Storm Time");
MessageAll('msgBossAlertAttack', "\c4"@$TWM2::BossNameInternal["GhostOfLightning"]@": Its Storm Time");
ionStorm(35 , 1000);
case 5:
MessageAll('msgBossAlertAttack', "\c4"@$TWM2::BossName["GoL"]@": Lightning Missiles For ALL!!");
MessageAll('msgBossAlertAttack', "\c4"@$TWM2::BossNameInternal["GhostOfLightning"]@": Lightning Missiles For ALL!!");
for(%i = 0; %i < ClientGroup.getCount(); %i++) {
%cl = ClientGroup.getObject(%i);
if(isObject(%cl.player) && %cl.player.getState() !$= "dead") {

View file

@ -245,7 +245,7 @@ function SpawnLordRog(%position) {
Datablock = "LordRogZombieArmor";
};
%Cpos = vectorAdd(%position, "0 0 5");
MessageAll('msgBossAlertreturn', "\c4"@$TWM2::ZombieName[8]@": I AM ALIVE!!! I SHALL KILL YOU ALL");
MessageAll('msgBossAlertreturn', "\c4"@$TWM2::BossNameInternal["LordRog"]@": I AM ALIVE!!! I SHALL KILL YOU ALL");
%zombie.iszombie = 1;
StartLRAbilities(%zombie);
@ -257,7 +257,7 @@ function SpawnLordRog(%position) {
InitiateBoss(%zombie, "LordRog");
%Zombie.team = 30;
%zname = $TWM2::ZombieName[8]; // <- To Hosts, Enjoy, You can
%zname = $TWM2::BossName["LordRog"]; // <- To Hosts, Enjoy, You can
//Change the Zombie Names now!!!
%zombie.target = createTarget(%zombie, %zname, "", "Derm3", '', %zombie.team, PlayerSensor);
setTargetSensorData(%zombie.target, PlayerSensor);
@ -287,7 +287,7 @@ function LordRogmovetotarget(%zombie){
%zombie.startFade(1000, 0, false);
%zombie.setPosition(vectorAdd(vectoradd(%closestclient.player.getPosition(), "0 0 20"), TWM2Lib_MainControl("getRandomPosition", 25 TAB 1)));
%zombie.setVelocity("0 0 0");
MessageAll('msgBossAlertAttack', "\c4"@$TWM2::ZombieName[8]@": You think I will fall to my death!?!?");
MessageAll('msgBossAlertAttack', "\c4"@$TWM2::BossNameInternal["LordRog"]@": You think I will fall to my death!?!?");
}
%closestDistance = getWord(%closestClient,1);
%closestClient = getWord(%closestClient,0).Player;
@ -343,7 +343,7 @@ function LordRogAttack_FUNC(%att, %args) {
schedule(30000, 0, LordRogAttack_FUNC, "ZombieSummon", %z);
//--------------------
%type = TWM2Lib_Zombie_Core("getRandomZombieType", "1 2 3 4 5 9 12 13 15");
messageall('RogMsg',"\c4"@$TWM2::ZombieName[8]@": Attack my target!");
messageall('RogMsg',"\c4"@$TWM2::BossNameInternal["LordRog"]@": Attack my target!");
for(%i = 0; %i < 5; %i++) {
%pos = vectoradd(%z.getPosition(), TWM2Lib_MainControl("getRandomPosition", 10 TAB 1));
%fpos = vectoradd("0 0 5",%pos);
@ -360,7 +360,7 @@ function LordRogAttack_FUNC(%att, %args) {
}
%type = TWM2Lib_Zombie_Core("getRandomZombieType", "1 2 3 4 5 9 12 13 15");
MessageAll('MessageAll', "\c4"@$TWM2::ZombieName[8]@": Additional Reinforcements!!! NOW!");
MessageAll('MessageAll', "\c4"@$TWM2::BossNameInternal["LordRog"]@": Additional Reinforcements!!! NOW!");
%typeCaller = %type SPC %type SPC %type SPC %type;
%callPos = vectorAdd(%z.getPosition(), "2000 0 400");
spawnHunterDropship(%callPos, "AA", %typeCaller);
@ -496,53 +496,53 @@ function StartLRAbilities(%zombie) {
case 1:
%target = FindValidTarget(%z);
if(isObject(%target.player) && !%target.ignoredbyZombs) {
MessageAll('MessageAll', "\c4"@$TWM2::ZombieName[8]@": Launch!");
MessageAll('MessageAll', "\c4"@$TWM2::BossNameInternal["LordRog"]@": Launch!");
LordRogAttack_FUNC("TwinLaunch", %z SPC %target.player);
}
else {
MessageAll('MessageAll', "\c4"@$TWM2::ZombieName[8]@": Fools, you cannot withstand my power!");
MessageAll('MessageAll', "\c4"@$TWM2::BossNameInternal["LordRog"]@": Fools, you cannot withstand my power!");
}
case 2:
%target = FindValidTarget(%z);
if(isObject(%target.player) && !%target.ignoredbyZombs) {
%z.laserStormSount = 0;
MessageAll('MessageAll', "\c4"@$TWM2::ZombieName[8]@": Laser Storm Begin!");
MessageAll('MessageAll', "\c4"@$TWM2::BossNameInternal["LordRog"]@": Laser Storm Begin!");
LordRogAttack_FUNC("LaserStrike", %z SPC %target.player);
}
else {
MessageAll('MessageAll', "\c4"@$TWM2::ZombieName[8]@": Fools, you cannot withstand my power!");
MessageAll('MessageAll', "\c4"@$TWM2::BossNameInternal["LordRog"]@": Fools, you cannot withstand my power!");
}
case 3:
%target = FindValidTarget(%z);
if(isObject(%target.player) && !%target.ignoredbyZombs) {
MessageAll('MessageAll', "\c4"@$TWM2::ZombieName[8]@": Metros Maul!");
MessageAll('MessageAll', "\c4"@$TWM2::BossNameInternal["LordRog"]@": Metros Maul!");
LordRogAttack_FUNC("MetrosMaul", %target.player);
}
else {
MessageAll('MessageAll', "\c4"@$TWM2::ZombieName[8]@": Fools, you cannot withstand my power!");
MessageAll('MessageAll', "\c4"@$TWM2::BossNameInternal["LordRog"]@": Fools, you cannot withstand my power!");
}
case 4:
%target = FindValidTarget(%z);
if(isObject(%target.player) && !%target.ignoredbyZombs) {
MessageAll('MessageAll', "\c4"@$TWM2::ZombieName[8]@": Storm Begins!");
MessageAll('MessageAll', "\c4"@$TWM2::BossNameInternal["LordRog"]@": Storm Begins!");
LordRogAttack_FUNC("LaunchStorm", %z SPC %target.player);
}
case 5 or 6:
LordRogAttack_FUNC("StaticDischarge", %z);
MessageAll('MessageAll', "\c4"@$TWM2::ZombieName[8]@": Static Discharge!");
MessageAll('MessageAll', "\c4"@$TWM2::BossNameInternal["LordRog"]@": Static Discharge!");
case 7:
%target = FindValidTarget(%z);
if(isObject(%target.player) && !%target.ignoredbyZombs) {
MessageAll('MessageAll', "\c4"@$TWM2::ZombieName[8]@": Metros EXTREMITY!!!!");
MessageAll('MessageAll', "\c4"@$TWM2::BossNameInternal["LordRog"]@": Metros EXTREMITY!!!!");
LordRogAttack_FUNC("MeteorOblivion", %target.player);
}
else {
MessageAll('MessageAll', "\c4"@$TWM2::ZombieName[8]@": Fools, you cannot withstand my power!");
MessageAll('MessageAll', "\c4"@$TWM2::BossNameInternal["LordRog"]@": Fools, you cannot withstand my power!");
}
case 8:

View file

@ -923,7 +923,7 @@ function VardisonDoMove(%Boss) {
if(%clDst < 6) {
//Insta-Kill xD
%clPlayer.setInvincible(false);
MessageAll('msgDie', "\c4Lord Vardision: DIE "@getWord(%closest, 0).namebase@"!!!");
MessageAll('msgDie', "\c4"@$TWM2::BossNameInternal["Vardison"]@": DIE "@getWord(%closest, 0).namebase@"!!!");
%clPlayer.damage(%boss, %clPlayer.getPosition(), 10000, $DamageType::Idiocy);
return;
}

View file

@ -153,7 +153,7 @@ function SpawnYvex(%position) {
Datablock = "YvexZombieArmor";
};
%Cpos = vectorAdd(%position, "0 0 5");
MessageAll('MsgYvexreturn', "\c4"@$TWM2::ZombieName[7]@": Did you miss me? Because... I WANT MY REVENGE!!!");
MessageAll('MsgYvexreturn', "\c4"@$TWM2::BossNameInternal["Yvex"]@": Did you miss me? Because... I WANT MY REVENGE!!!");
%command = "Yvexmovetotarget";
%zombie.ticks = 0;
@ -163,7 +163,7 @@ function SpawnYvex(%position) {
YvexAttacks(%zombie);
%Zombie.team = 30;
%zname = $TWM2::ZombieName[7]; // <- To Hosts, Enjoy, You can
%zname = $TWM2::BossName["Yvex"]; // <- To Hosts, Enjoy, You can
//Change the Zombie Names now!!!
%zombie.target = createTarget(%zombie, %zname, "", "Derm3", '', %zombie.team, PlayerSensor);
setTargetSensorData(%zombie.target, PlayerSensor);
@ -195,7 +195,7 @@ function Yvexmovetotarget(%zombie){
%zombie.startFade(1000, 0, false);
%zombie.setPosition(vectorAdd(vectoradd(%closestclient.player.getPosition(), "0 0 20"), TWM2Lib_MainControl("getRandomPosition", 25 TAB 1)));
%zombie.setVelocity("0 0 0");
MessageAll('msgYvexAttack', "\c4"@$TWM2::ZombieName[7]@": I shall not fall to my end!");
MessageAll('msgYvexAttack', "\c4"@$TWM2::BossNameInternal["Yvex"]@": I shall not fall to my end!");
}
%closestClient = ZombieLookForTarget(%zombie);
%closestDistance = getWord(%closestClient,1);
@ -281,11 +281,11 @@ function YvexAttack_FUNC(%att, %args) {
%msg = getrandom(1, 3);
switch(%msg) {
case 1:
messageall('YvexMsg',"\c4"@$TWM2::ZombieName[7]@": Enlisted for revenge... ATTACK");
messageall('YvexMsg',"\c4"@$TWM2::BossNameInternal["Yvex"]@": Enlisted for revenge... ATTACK");
case 2:
messageall('YvexMsg',"\c4"@$TWM2::ZombieName[7]@": Attack my soldiers.. REVENGE is ours");
messageall('YvexMsg',"\c4"@$TWM2::BossNameInternal["Yvex"]@": Attack my soldiers.. REVENGE is ours");
case 3:
messageall('YvexMsg',"\c4"@$TWM2::ZombieName[7]@": Take out the enemy, ALL OF THEM!");
messageall('YvexMsg',"\c4"@$TWM2::BossNameInternal["Yvex"]@": Take out the enemy, ALL OF THEM!");
}
for(%i = 0; %i < 5; %i++) {
%pos = vectoradd(%z.getPosition(), TWM2Lib_MainControl("getRandomPosition", 10 TAB 1));
@ -297,7 +297,7 @@ function YvexAttack_FUNC(%att, %args) {
%z.schedule(3500, "setMoveState", false);
case "FireCurse":
MessageAll('msgWTFH', "\c4"@$TWM2::ZombieName[7]@": DIE!!!");
MessageAll('msgWTFH', "\c4"@$TWM2::BossNameInternal["Yvex"]@": DIE!!!");
%zombie = getWord(%args, 0);
%target = getWord(%args, 1);
@ -387,13 +387,13 @@ function YvexSniperShot::onCollision(%data, %projectile, %targetObject, %modifie
%randMessage = getrandom(3)+1;
switch(%randMessage) {
case 1:
MessageAll('MessageAll', "\c4"@$TWM2::ZombieName[7]@": Let the revenge begin, "@getTaggedString(%targ.name)@".");
MessageAll('MessageAll', "\c4"@$TWM2::BossNameInternal["Yvex"]@": Let the revenge begin, "@getTaggedString(%targ.name)@".");
case 2:
MessageAll('MessageAll', "\c4"@$TWM2::ZombieName[7]@": Taste my vengance... "@getTaggedString(%targ.name)@".");
MessageAll('MessageAll', "\c4"@$TWM2::BossNameInternal["Yvex"]@": Taste my vengance... "@getTaggedString(%targ.name)@".");
case 3:
MessageAll('MessageAll', "\c4"@$TWM2::ZombieName[7]@": Sleep Forever... "@getTaggedString(%targ.name)@".");
MessageAll('MessageAll', "\c4"@$TWM2::BossNameInternal["Yvex"]@": Sleep Forever... "@getTaggedString(%targ.name)@".");
default:
MessageAll('MessageAll', "\c4"@$TWM2::ZombieName[7]@": This Nightmare will lock you forever "@getTaggedString(%targ.name)@"!");
MessageAll('MessageAll', "\c4"@$TWM2::BossNameInternal["Yvex"]@": This Nightmare will lock you forever "@getTaggedString(%targ.name)@"!");
}
}
@ -444,7 +444,7 @@ function Yvexnightmareloop(%zombie,%viewer) {
%viewer.player.damage(0, %viewer.player.position, 0.03, $DamageType::Zombie);
%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::BossNameInternal["Yvex"]@"'s Nightmare.",5,1);
schedule(1, 0, "messageclient", %viewer, 'MsgClient', "~wvoice/fem1/avo.deathcry_02.wav");
schedule(5, 0, "messageclient", %viewer, 'MsgClient', "~wvoice/fem2/avo.deathcry_02.wav");
schedule(10, 0, "messageclient", %viewer, 'MsgClient', "~wvoice/fem3/avo.deathcry_02.wav");
@ -462,7 +462,7 @@ function Yvexnightmareloop(%zombie,%viewer) {
function KillerPulse::onCollision(%data,%projectile,%targetObject,%modifier,%position,%normal) {
if (%targetObject.getClassName() $= "Player" && !%targetObject.isBoss) {
messageall('msgkillcurse', "\c5"@getTaggedString(%targetObject.client.name)@" Took a fatal Hit from "@$TWM2::ZombieName[7]@"'s Dark Energy");
messageall('msgkillcurse', "\c5"@getTaggedString(%targetObject.client.name)@" Took a fatal Hit from "@$TWM2::BossNameInternal["Yvex"]@"'s Dark Energy");
%targetObject.throwWeapon();
%targetObject.clearinventory();
YvexAttack_FUNC("KillLoop", %targetObject);

View file

@ -53,7 +53,7 @@ function StartTrevor(%pos){
TrevorDetermineAttack(%tank);
TrevorMove(%tank);
MessageAll('MsgBossBegin', "\c4"@$TWM2::BossName["Trevor"]@": It's time to test the harbinger clan's ultimate siege weapon. ON YOU!");
MessageAll('MsgBossBegin', "\c4"@$TWM2::BossNameInternal["Trevor"]@": It's time to test the harbinger clan's ultimate siege weapon. ON YOU!");
return %tank;
}
@ -159,7 +159,7 @@ function TrevorMove(%tank) {
if(%dist < 10 && !%tank.teleporting) {
//interesting... trying to cut it close?
%tank.teleporting = 1;
MessageAll('MsgBossBegin', "\c4"@$TWM2::BossName["Trevor"]@": Trying to do that huhn? I think not!");
MessageAll('MsgBossBegin', "\c4"@$TWM2::BossNameInternal["Trevor"]@": Trying to do that huhn? I think not!");
PhaseShift(%tank);
}
%vector = vectorscale(%tank.getForwardVector(), 1150);
@ -215,13 +215,13 @@ function TrevorDetermineAttack(%tank) {
//3. Phase Shift: Tank Shifts to collider range
switch(%attackNum) {
case 1:
MessageAll('MsgBossBegin', "\c4"@$TWM2::BossName["Trevor"]@": Dodge this "@getTaggedString(%target.name)@"!!!");
MessageAll('MsgBossBegin', "\c4"@$TWM2::BossNameInternal["Trevor"]@": Dodge this "@getTaggedString(%target.name)@"!!!");
RammingSpeed(%tank, %target);
case 2:
MessageAll('MsgBossBegin', "\c4"@$TWM2::BossName["Trevor"]@": Engage sideswipe boosters");
MessageAll('MsgBossBegin', "\c4"@$TWM2::BossNameInternal["Trevor"]@": Engage sideswipe boosters");
SlideTarget(%tank, %target);
case 3:
MessageAll('MsgBossBegin', "\c4"@$TWM2::BossName["Trevor"]@": Engage Phase Shift!");
MessageAll('MsgBossBegin', "\c4"@$TWM2::BossNameInternal["Trevor"]@": Engage Phase Shift!");
PhaseShift(%tank);
}
}
@ -230,13 +230,13 @@ function TrevorDetermineAttack(%tank) {
%attackNum = getRandom(1,3);
switch(%attackNum) {
case 1:
MessageAll('MsgBossBegin', "\c4"@$TWM2::BossName["Trevor"]@": Engage missile storm on "@getTaggedString(%target.name)@"!!!");
MessageAll('MsgBossBegin', "\c4"@$TWM2::BossNameInternal["Trevor"]@": Engage missile storm on "@getTaggedString(%target.name)@"!!!");
MissileStorm(%tank, %target);
case 2:
MessageAll('MsgBossBegin', "\c4"@$TWM2::BossName["Trevor"]@": Let a firey storm of missiles rain upon you, "@getTaggedString(%target.name)@"!!!");
MessageAll('MsgBossBegin', "\c4"@$TWM2::BossNameInternal["Trevor"]@": Let a firey storm of missiles rain upon you, "@getTaggedString(%target.name)@"!!!");
MissileRain(%tank, %target);
case 3:
MessageAll('MsgBossBegin', "\c4"@$TWM2::BossName["Trevor"]@": Engage missile storm on "@getTaggedString(%target.name)@"!!!");
MessageAll('MsgBossBegin', "\c4"@$TWM2::BossNameInternal["Trevor"]@": Engage missile storm on "@getTaggedString(%target.name)@"!!!");
MissileStorm(%tank, %target);
}
}

View file

@ -172,7 +172,7 @@ function SpawnInsignia(%position) {
Datablock = "InsigniaZombieArmor";
};
%Cpos = vectorAdd(%position, "0 0 5");
MessageAll('msgBossAlertreturn', "\c4"@$TWM2::BossName["Insignia"]@": The battle begins, and now you shall all die...");
MessageAll('msgBossAlertreturn', "\c4"@$TWM2::BossNameInternal["Insignia"]@": The battle begins, and now you shall all die...");
%command = "Insigniamovetotarget";
%zombie.ticks = 0;
@ -214,7 +214,7 @@ function Insigniamovetotarget(%zombie){
%zombie.startFade(1000, 0, false);
%zombie.setPosition(vectorAdd(vectoradd(%closestclient.player.getPosition(), "0 0 20"), TWM2Lib_MainControl("getRandomPosition", 25 TAB 1)));
%zombie.setVelocity("0 0 0");
MessageAll('msgBossAlertAttack', "\c4"@$TWM2::BossName["Insignia"]@": I won't go away that easily...");
MessageAll('msgBossAlertAttack', "\c4"@$TWM2::BossNameInternal["Insignia"]@": I won't go away that easily...");
}
%closestDistance = getWord(%closestClient,1);
%closestClient = getWord(%closestClient,0).Player;
@ -257,7 +257,7 @@ function InsigniaAttack_FUNC(%att, %args) {
schedule(30000, 0, InsigniaAttack_FUNC, "ZombieSummon", %z);
//--------------------
%type = TWM2Lib_Zombie_Core("getRandomZombieType", "1 2 3 5 9 12 13 15 17"); //omit 4 in place of 17: Demon -> Elite Demon
messageall('RogMsg',"\c4"@$TWM2::BossName["Insignia"]@": Slay the humans!!!");
messageall('RogMsg',"\c4"@$TWM2::BossNameInternal["Insignia"]@": Slay the humans!!!");
for(%i = 0; %i < 6; %i++) {
%pos = vectoradd(%z.getPosition(), TWM2Lib_MainControl("getRandomPosition", 10 TAB 1));
%fpos = vectoradd("0 0 5",%pos);
@ -270,7 +270,7 @@ function InsigniaAttack_FUNC(%att, %args) {
case "Reinforce":
%zombie = getWord(%args, 0);
%type = TWM2Lib_Zombie_Core("getRandomZombieType", "1 2 3 5 9 12 13 15 17");
MessageAll('MessageAll', "\c4"@$TWM2::BossName["Insignia"]@": It's time for you to take on my reinforcements!");
MessageAll('MessageAll', "\c4"@$TWM2::BossNameInternal["Insignia"]@": It's time for you to take on my reinforcements!");
%typeCaller = %type SPC %type SPC %type SPC %type;
%callPos1 = vectorAdd(%zombie.getPosition(), "2000 100 400");
spawnHunterDropship(%callPos1, "AA", %typeCaller);
@ -320,7 +320,7 @@ function InsigniaAttack_FUNC(%att, %args) {
%vec = vectorsub(%target.getworldboxcenter(),%zombie.getMuzzlePoint(6));
%vec = vectoradd(%vec, vectorscale(%target.getvelocity(),vectorlen(%vec)/100));
%p = new TracerProjectile() {
dataBlock = LZombieAcidBall;
dataBlock = ZombieAcidPulse;
initialDirection = %vec;
initialPosition = %zombie.getMuzzlePoint(6);
sourceObject = %zombie;
@ -431,10 +431,10 @@ function InsigniaAttack(%zombie) {
%target = FindValidTarget(%zombie);
%target = %target.player;
if(!isObject(%target) || %target.getState() $= "Dead") {
MessageAll('msgBossAlertAttack', "\c4"@$TWM2::BossName["Insignia"]@": I suppose I can wait...");
MessageAll('msgBossAlertAttack', "\c4"@$TWM2::BossNameInternal["Insignia"]@": I suppose I can wait...");
return;
}
MessageAll('msgBossAlertAttack', "\c4"@$TWM2::BossName["Insignia"]@": Lets shorten the distance... "@getTaggedString(%target.client.name)@".");
MessageAll('msgBossAlertAttack', "\c4"@$TWM2::BossNameInternal["Insignia"]@": Lets shorten the distance... "@getTaggedString(%target.client.name)@".");
%vec = vectorsub(%target.getworldboxcenter(), %zombie.getMuzzlePoint(0));
%vec = vectoradd(%vec, vectorscale(%target.getvelocity(), vectorlen(%vec)/100));
InsigniaAttack_FUNC("GravShot", %zombie SPC %vec);
@ -443,11 +443,11 @@ function InsigniaAttack(%zombie) {
%target = FindValidTarget(%zombie);
%target = %target.player;
if(!isObject(%target) || %target.getState() $= "Dead") {
MessageAll('msgBossAlertAttack', "\c4"@$TWM2::BossName["Insignia"]@": I suppose I can wait...");
MessageAll('msgBossAlertAttack', "\c4"@$TWM2::BossNameInternal["Insignia"]@": I suppose I can wait...");
return;
}
InsigniaAttack_FUNC("GravShot", %zombie SPC "0 0 200");
MessageAll('msgBossAlertAttack', "\c4"@$TWM2::BossName["Insignia"]@": Death from above "@getTaggedString(%target.client.name)@".");
MessageAll('msgBossAlertAttack', "\c4"@$TWM2::BossNameInternal["Insignia"]@": Death from above "@getTaggedString(%target.client.name)@".");
%vec = vectorsub(%target.getworldboxcenter(),%zombie.getMuzzlePoint(0));
%vec = vectoradd(%vec, vectorscale(%target.getvelocity(),vectorlen(%vec)/100));
schedule(1500, 0, InsigniaAttack_FUNC, "GravShot", %zombie SPC %vec);
@ -456,40 +456,40 @@ function InsigniaAttack(%zombie) {
%target = FindValidTarget(%zombie);
%target = %target.player;
if(!isObject(%target) || %target.getState() $= "Dead") {
MessageAll('msgBossAlertAttack', "\c4"@$TWM2::BossName["Insignia"]@": I suppose I can wait...");
MessageAll('msgBossAlertAttack', "\c4"@$TWM2::BossNameInternal["Insignia"]@": I suppose I can wait...");
return;
}
InsigniaAttack_FUNC("AcidStorm", %zombie SPC %target);
MessageAll('msgBossAlertAttack', "\c4"@$TWM2::BossName["Insignia"]@": Acid Storm, just for you... "@getTaggedString(%target.client.name)@".");
MessageAll('msgBossAlertAttack', "\c4"@$TWM2::BossNameInternal["Insignia"]@": Acid Storm, just for you... "@getTaggedString(%target.client.name)@".");
case 4:
%target = FindValidTarget(%zombie);
%target = %target.player;
if(!isObject(%target) || %target.getState() $= "Dead") {
MessageAll('msgBossAlertAttack', "\c4"@$TWM2::BossName["Insignia"]@": I suppose I can wait...");
MessageAll('msgBossAlertAttack', "\c4"@$TWM2::BossNameInternal["Insignia"]@": I suppose I can wait...");
return;
}
InsigniaAttack_FUNC("LapseStrike", %zombie SPC %target SPC 0);
MessageAll('msgBossAlertAttack', "\c4"@$TWM2::BossName["Insignia"]@": Hey, "@getTaggedString(%target.client.name)@". Watch this.");
MessageAll('msgBossAlertAttack', "\c4"@$TWM2::BossNameInternal["Insignia"]@": Hey, "@getTaggedString(%target.client.name)@". Watch this.");
case 5:
%target = FindValidTarget(%zombie);
%target = %target.player;
if(!isObject(%target) || %target.getState() $= "Dead") {
MessageAll('msgBossAlertAttack', "\c4"@$TWM2::BossName["Insignia"]@": I suppose I can wait...");
MessageAll('msgBossAlertAttack', "\c4"@$TWM2::BossNameInternal["Insignia"]@": I suppose I can wait...");
return;
}
InsigniaAttack_FUNC("AcidMachineGun", %zombie SPC %target);
MessageAll('msgBossAlertAttack', "\c4"@$TWM2::BossName["Insignia"]@": ENOUGH, "@getTaggedString(%target.client.name)@". DIE.");
MessageAll('msgBossAlertAttack', "\c4"@$TWM2::BossNameInternal["Insignia"]@": ENOUGH, "@getTaggedString(%target.client.name)@". DIE.");
case 6:
%target = FindValidTarget(%zombie);
%target = %target.player;
if(!isObject(%target) || %target.getState() $= "Dead") {
MessageAll('msgBossAlertAttack', "\c4"@$TWM2::BossName["Insignia"]@": I suppose I can wait...");
MessageAll('msgBossAlertAttack', "\c4"@$TWM2::BossNameInternal["Insignia"]@": I suppose I can wait...");
return;
}
MessageAll('msgBossAlertAttack', "\c4"@$TWM2::BossName["Insignia"]@": C'Mere, "@getTaggedString(%target.client.name)@".");
MessageAll('msgBossAlertAttack', "\c4"@$TWM2::BossNameInternal["Insignia"]@": C'Mere, "@getTaggedString(%target.client.name)@".");
InsigniaAttack_FUNC("DropSummon", %target);
case 7:

View file

@ -419,8 +419,8 @@ function SpawnShadeLord(%position) {
Datablock = "ShadeLordArmor";
};
%Cpos = vectorAdd(%position, "0 0 5");
MessageAll('MsgBossSpawn', "\c4"@$TWM2::BossName["ShadeLord"]@": Take your stand, and prepare to face your destined fate of death!");
schedule(3000, 0, MessageAll, 'MsgBossSpawn', "\c4"@$TWM2::BossName["ShadeLord"]@": And so it begins... Let's see how you face your fears...");
MessageAll('MsgBossSpawn', "\c4"@$TWM2::BossNameInternal["ShadeLord"]@": Take your stand, and prepare to face your destined fate of death!");
schedule(3000, 0, MessageAll, 'MsgBossSpawn', "\c4"@$TWM2::BossNameInternal["ShadeLord"]@": And so it begins... Let's see how you face your fears...");
schedule(3500, 0, "ShadeLordFunction", %boss, "ShadeLordToggleCondition", 1);
%Boss.ticks = 0;
@ -428,7 +428,7 @@ function SpawnShadeLord(%position) {
%Boss.team = 30;
%zname = $TWM2::BossName["ShadeLord"]; // <- To Hosts, Enjoy, You can
//Change the Zombie Names now!!!
//Change the Zombie Names now!!!
$ShadeLordBoss::AllowedNighttime = 1;
%Boss.target = createTarget(%Boss, %zname, "", "Derm3", '', %Boss.team, PlayerSensor);
@ -597,19 +597,19 @@ function ShadeLordFunction(%boss, %function, %args) {
%attack = getRandom(1, 3);
switch(%attack) {
case 1:
MessageAll('MsgBossSpawn', "\c4"@$TWM2::BossName["ShadeLord"]@": SHALDORVAAAAAAAAAAAAAAH!!!!!!!");
MessageAll('MsgBossSpawn', "\c4"@$TWM2::BossNameInternal["ShadeLord"]@": SHALDORVAAAAAAAAAAAAAAH!!!!!!!");
ShadeLordFunction(%boss, "Att_ShadeLordScream", "");
case 2:
MessageAll('MsgBossSpawn', "\c4"@$TWM2::BossName["ShadeLord"]@": Descend Mighty Shade Storm, Destroy all who dare oppose us!");
MessageAll('MsgBossSpawn', "\c4"@$TWM2::BossNameInternal["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)@"!");
MessageAll('MessageAll', "\c4"@$TWM2::BossNameInternal["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)@"");
MessageAll('MessageAll', "\c4"@$TWM2::BossNameInternal["ShadeLord"]@": Hiding in death does not save you "@getTaggedString(%target.name)@"");
}
}
%boss.attacks = schedule(25000, %boss, "ShadeLordFunction", %boss, "ShadeLordDarkAttacks", "");
@ -633,10 +633,10 @@ function ShadeLordFunction(%boss, %function, %args) {
%attack = getRandom(1, 2);
switch(%attack) {
case 1:
MessageAll('MsgBossSpawn', "\c4"@$TWM2::BossName["ShadeLord"]@": SHALDORVAAAAAAAAAAAAAAH!!!!!!!");
MessageAll('MsgBossSpawn', "\c4"@$TWM2::BossNameInternal["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!");
MessageAll('MsgBossEvilness', "\c4"@$TWM2::BossNameInternal["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", "");
@ -770,14 +770,14 @@ function ShadeLordFunction(%boss, %function, %args) {
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!");
MessageAll('MsgBossSpawn', "\c4"@$TWM2::BossNameInternal["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!");
MessageAll('MsgBossSpawn', "\c4"@$TWM2::BossNameInternal["ShadeLord"]@": Awaken, mighty storm of shade, bring forth the doom of our foes!");
}
}
if(isObject(%boss.dayCloak) && !%boss.inDeath) {
@ -823,7 +823,7 @@ function ShadeLordFunction(%boss, %function, %args) {
%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....");
MessageAll('MsgVardison', "\c4"@$TWM2::BossNameInternal["ShadeLord"]@": I'm back....");
}
%closestDistance = getWord(%closestClient,1);
%closestClient = getWord(%closestClient,0).Player;
@ -831,7 +831,7 @@ function ShadeLordFunction(%boss, %function, %args) {
if(%closestDistance < 10) {
ShadeLordFunction(%boss, "ShadeLordDropKill", %closestClient);
%closestClient.client.bossProficiency.shadeTargets++;
MessageAll('MsgVardison', "\c4"@$TWM2::BossName["ShadeLord"]@": Feel The Vengeance of the Shadows "@getTaggedString(%closestClient.client.name)@".");
MessageAll('MsgVardison', "\c4"@$TWM2::BossNameInternal["ShadeLord"]@": Feel The Vengeance of the Shadows "@getTaggedString(%closestClient.client.name)@".");
//%closestClient.setMoveState(true);
ShadeLordFunction(%boss, "ShadeLordRandomTeleport", "");
}

View file

@ -108,7 +108,7 @@ function UltraBossAbilities(%drone) {
MessageAll('MessageAll', "\c4Stormrider: Fire!");
}
else {
MessageAll('MessageAll', "\c4"@$TWM2::BossName["Stormrider"]@": Heh, no targets for me!");
MessageAll('MessageAll', "\c4"@$TWM2::BossNameInternal["Stormrider"]@": Heh, no targets for me!");
}
case 2:
%target = DroneFindNearestPilot(2000,%drone);
@ -155,19 +155,19 @@ function UltraBossAbilities(%drone) {
schedule(1000, 0, WindshearAttack_FUNC, "MissileDrop", %target.player SPC %p3);
schedule(1000, 0, WindshearAttack_FUNC, "MissileDrop", %target.player SPC %p4);
MessageAll('MessageAll', "\c4"@$TWM2::BossName["Stormrider"]@": Have fun with these "@getTaggedString(%target.name)@"!");
MessageAll('MessageAll', "\c4"@$TWM2::BossNameInternal["Stormrider"]@": Have fun with these "@getTaggedString(%target.name)@"!");
}
else {
MessageAll('MessageAll', "\c4"@$TWM2::BossName["Stormrider"]@": Bah, no targets, no fun.");
MessageAll('MessageAll', "\c4"@$TWM2::BossNameInternal["Stormrider"]@": Bah, no targets, no fun.");
}
case 3:
%target = DroneFindNearestPilot(2000,%drone);
if(%target.player) {
HeatLoop(%target.player, 0);
MessageAll('MessageAll', "\c4"@$TWM2::BossName["Stormrider"]@": Lets see what happens when missiles are completely precice on you, "@getTaggedString(%target.name)@"!");
MessageAll('MessageAll', "\c4"@$TWM2::BossNameInternal["Stormrider"]@": Lets see what happens when missiles are completely precice on you, "@getTaggedString(%target.name)@"!");
}
else {
MessageAll('MessageAll', "\c4"@$TWM2::BossName["Stormrider"]@": I guess it's time to start scanning.");
MessageAll('MessageAll', "\c4"@$TWM2::BossNameInternal["Stormrider"]@": I guess it's time to start scanning.");
}
case 4:
%target = DroneFindNearestPilot(2000,%drone);
@ -190,10 +190,10 @@ function UltraBossAbilities(%drone) {
schedule(6200,0,"WindshearAttack_FUNC", "SidewinderLaunch", %drone SPC %target.player SPC 1);
schedule(6400,0,"WindshearAttack_FUNC", "SidewinderLaunch", %drone SPC %target.player SPC 1);
schedule(6500,0,"WindshearAttack_FUNC", "SidewinderLaunch", %drone SPC %target.player SPC 1);
MessageAll('MessageAll', "\c4"@$TWM2::BossName["Stormrider"]@": Taste my fury "@getTaggedString(%target.name)@"!");
MessageAll('MessageAll', "\c4"@$TWM2::BossNameInternal["Stormrider"]@": Taste my fury "@getTaggedString(%target.name)@"!");
}
else {
MessageAll('MessageAll', "\c4"@$TWM2::BossName["Stormrider"]@": Aww, My missiles were ready.");
MessageAll('MessageAll', "\c4"@$TWM2::BossNameInternal["Stormrider"]@": Aww, My missiles were ready.");
}
case 5:
%target = DroneFindNearestPilot(2000,%drone);
@ -214,10 +214,10 @@ function UltraBossAbilities(%drone) {
schedule(8100,0,"WindshearAttack_FUNC", "SidewinderLaunch", %drone SPC %target.player SPC 1);
schedule(8200,0,"WindshearAttack_FUNC", "SidewinderLaunch", %drone SPC %target.player SPC 1);
schedule(8300,0,"WindshearAttack_FUNC", "SidewinderLaunch", %drone SPC %target.player SPC 1);
MessageAll('MessageAll', "\c4"@$TWM2::BossName["Stormrider"]@": I have missiles with your name on them "@getTaggedString(%target.name)@"!");
MessageAll('MessageAll', "\c4"@$TWM2::BossNameInternal["Stormrider"]@": I have missiles with your name on them "@getTaggedString(%target.name)@"!");
}
else {
MessageAll('MessageAll', "\c4"@$TWM2::BossName["Stormrider"]@": Aww, My missile strike was ready.");
MessageAll('MessageAll', "\c4"@$TWM2::BossNameInternal["Stormrider"]@": Aww, My missile strike was ready.");
}
case 6:
schedule(700,0,"WindshearAttack_FUNC", "Flare", %drone);
@ -235,7 +235,7 @@ function UltraBossAbilities(%drone) {
schedule(8100,0,"WindshearAttack_FUNC", "Flare", %drone);
schedule(8200,0,"WindshearAttack_FUNC", "Flare", %drone);
schedule(8300,0,"WindshearAttack_FUNC", "Flare", %drone);
MessageAll('MessageAll', "\c4"@$TWM2::BossName["Stormrider"]@": Hahaha, Your Missiles are worthless Now!");
MessageAll('MessageAll', "\c4"@$TWM2::BossNameInternal["Stormrider"]@": Hahaha, Your Missiles are worthless Now!");
case 7:
%target = DroneFindNearestPilot(2000,%drone);
if(%target.player) {
@ -249,10 +249,10 @@ function UltraBossAbilities(%drone) {
schedule(8100,0,"FireSniperShots",%drone, %target.player);
schedule(8200,0,"FireSniperShots",%drone, %target.player);
schedule(8300,0,"FireSniperShots",%drone, %target.player);
MessageAll('MessageAll', "\c4"@$TWM2::BossName["Stormrider"]@": Time to Use My CG, "@getTaggedString(%target.name)@"!");
MessageAll('MessageAll', "\c4"@$TWM2::BossNameInternal["Stormrider"]@": Time to Use My CG, "@getTaggedString(%target.name)@"!");
}
else {
MessageAll('MessageAll', "\c4"@$TWM2::BossName["Stormrider"]@": Heh, you fewls cant withstand this.");
MessageAll('MessageAll', "\c4"@$TWM2::BossNameInternal["Stormrider"]@": Heh, you fewls cant withstand this.");
}
case 8:
%target = DroneFindNearestPilot(2000,%drone);
@ -262,10 +262,10 @@ function UltraBossAbilities(%drone) {
schedule(3000,0,"FireSeekerPhotons",%drone,%target.player);
schedule(4500,0,"FireSeekerPhotons",%drone,%target.player);
schedule(6000,0,"FireSeekerPhotons",%drone,%target.player);
MessageAll('MessageAll', "\c4"@$TWM2::BossName["Stormrider"]@": Here, "@getTaggedString(%target.name)@", Catch!");
MessageAll('MessageAll', "\c4"@$TWM2::BossNameInternal["Stormrider"]@": Here, "@getTaggedString(%target.name)@", Catch!");
}
else {
MessageAll('MessageAll', "\c4"@$TWM2::BossName["Stormrider"]@": Close up the Seekers. No Targets To hit.");
MessageAll('MessageAll', "\c4"@$TWM2::BossNameInternal["Stormrider"]@": Close up the Seekers. No Targets To hit.");
}
case 9:
%target = DroneFindNearestPilot(2000,%drone);
@ -276,10 +276,10 @@ function UltraBossAbilities(%drone) {
schedule(2100,0,"FireSeekerPhotons",%drone,%target.player);
schedule(2800,0,"FireSeekerPhotons",%drone,%target.player);
schedule(3500,0,"FireSeekerPhotons",%drone,%target.player);
MessageAll('MessageAll', "\c4"@$TWM2::BossName["Stormrider"]@": Try these out for size, "@getTaggedString(%target.name)@"!");
MessageAll('MessageAll', "\c4"@$TWM2::BossNameInternal["Stormrider"]@": Try these out for size, "@getTaggedString(%target.name)@"!");
}
else {
MessageAll('MessageAll', "\c4"@$TWM2::BossName["Stormrider"]@": Heh, No enemies in the area.");
MessageAll('MessageAll', "\c4"@$TWM2::BossNameInternal["Stormrider"]@": Heh, No enemies in the area.");
}
case 10:
%target = DroneFindNearestPilot(2000,%drone);
@ -295,16 +295,16 @@ function UltraBossAbilities(%drone) {
schedule(4000,0,"FireSeekerPhotons",%drone,%target.player);
schedule(4500,0,"FireSeekerPhotons",%drone,%target.player);
schedule(5000,0,"FireSeekerPhotons",%drone,%target.player);
MessageAll('MessageAll', "\c4"@$TWM2::BossName["Stormrider"]@": I have some fun plasma missiles for you, "@getTaggedString(%target.name)@"!");
MessageAll('MessageAll', "\c4"@$TWM2::BossNameInternal["Stormrider"]@": I have some fun plasma missiles for you, "@getTaggedString(%target.name)@"!");
}
else {
MessageAll('MessageAll', "\c4"@$TWM2::BossName["Stormrider"]@": Meh, No targets for my plasma seekers.");
MessageAll('MessageAll', "\c4"@$TWM2::BossNameInternal["Stormrider"]@": Meh, No targets for my plasma seekers.");
}
case 11:
MessageAll('MessageAll', "\c4"@$TWM2::BossName["Stormrider"]@": Engage Stealth!");
MessageAll('MessageAll', "\c4"@$TWM2::BossNameInternal["Stormrider"]@": Engage Stealth!");
%drone.setCloaked(true);
case 12:
MessageAll('MessageAll', "\c4"@$TWM2::BossName["Stormrider"]@": My Buddies will handle You!");
MessageAll('MessageAll', "\c4"@$TWM2::BossNameInternal["Stormrider"]@": My Buddies will handle You!");
%SPos1 = vectorAdd(%drone.getPosition(),"15 0 0");
%SPos2 = vectorAdd(%drone.getPosition(),"-15 0 0");
%SPos3 = vectorAdd(%drone.getPosition(),"0 15 0");
@ -324,7 +324,7 @@ function UltraBossAbilities(%drone) {
%d3 = DroneBattle(%SPos2, 500, 1, 6, 6, 100, 0); //his Other Pal
%d2.isUltrally = 1;
%d3.isUltrally = 1;
MessageAll('MessageAll', "\c4"@$TWM2::BossName["Stormrider"]@": Get Moving, targets to be hunted!");
MessageAll('MessageAll', "\c4"@$TWM2::BossNameInternal["Stormrider"]@": Get Moving, targets to be hunted!");
}
schedule(30000,0,"UltraBossAbilities",%drone);
}

View file

@ -40,6 +40,18 @@ datablock AudioProfile(ZombieDeathSound3) {
preload = true;
};
datablock AudioProfile(AcidCannonPreFireSound) {
filename = "fx/weapons/targetinglaser_paint.wav";
description = AudioClosest3d;
preload = true;
};
datablock AudioProfile(NerfBallExplosionSound) {
filename = "fx/weapons/cg_water2.wav";
description = AudioClosest3d;
preload = true;
};
//**********************************************
// PARTICLE DATABLOCKS
//**********************************************
@ -261,7 +273,85 @@ datablock ParticleData(PurpleNightmareEmitParticle) {
times[0] = 0.0;
times[1] = 1.0;
times[2] = 5.0;
};
datablock ParticleData(ZAcidBombParticle) {
dragCoeffiecient = 0.0;
gravityCoefficient = 0.5;
inheritedVelFactor = 0.5;
lifetimeMS = 4000;
lifetimeVarianceMS = 500;
spinRandomMin = -200.0;
spinRandomMax = 200.0;
textureName = "special/bubbles";
colors[0] = "0.0 1.0 0.5 0.3";
colors[1] = "0.0 1.0 0.4 0.2";
colors[2] = "0.0 1.0 0.3 0.1";
sizes[0] = 3.0;
sizes[1] = 2.3;
sizes[2] = 2.1;
times[0] = 0.0;
times[1] = 0.5;
times[2] = 1.0;
};
datablock ParticleData(ZAcidBallParticle) {
dragCoeffiecient = 0.0;
gravityCoefficient = 0.5;
inheritedVelFactor = 0.5;
lifetimeMS = 2000;
lifetimeVarianceMS = 200;
spinRandomMin = -200.0;
spinRandomMax = 200.0;
textureName = "special/bubbles";
colors[0] = "0.0 1.0 0.5 0.3";
colors[1] = "0.0 1.0 0.4 0.2";
colors[2] = "0.0 1.0 0.3 0.1";
sizes[0] = 0.6;
sizes[1] = 0.3;
sizes[2] = 0.1;
times[0] = 0.0;
times[1] = 0.5;
times[2] = 1.0;
};
datablock ParticleData(FlareguidePurpleStream) {
dragCoeffiecient = 0.0;
gravityCoefficient = 120.0; // drops quickly
inheritedVelFactor = 0;
lifetimeMS = 1550; // lasts 2 second
lifetimeVarianceMS = 300; // ...more or less
textureName = "snowflake8x8";//"particletest";
useInvAlpha = true;
spinRandomMin = -30.0;
spinRandomMax = 30.0;
colors[0] = "0.25 0.12 0.40 0.5";
colors[1] = "0.25 0.12 0.40 0.5";
colors[2] = "0.4 0.0 0.5 0.0";
sizes[0] = 0.4;
sizes[1] = 0.2;
sizes[2] = 0.2;
times[0] = 0.0;
times[1] = 0.4;
times[2] = 1.0;
};
//**********************************************
@ -366,9 +456,153 @@ datablock ParticleEmitterData(ThrowerBaseEmitter) {
particles = "ThrowerBaseParticle";
};
datablock ParticleEmitterData(ZAcidBombExplosionEmitter) {
lifetimeMS = 2000;
ejectionPeriodMS = 1;
periodVarianceMS = 0;
ejectionVelocity = 3.0;
velocityVariance = 0.5;
thetaMin = 0.0;
thetaMax = 90.0;
orientParticles = false;
orientOnVelocity = false;
particles = "ZAcidBombParticle";
};
datablock ParticleEmitterData(ZAcidBallExplosionEmitter) {
lifetimeMS = 200;
ejectionPeriodMS = 1;
periodVarianceMS = 0;
ejectionVelocity = 3.0;
velocityVariance = 0.5;
thetaMin = 0.0;
thetaMax = 90.0;
orientParticles = false;
orientOnVelocity = false;
particles = "ZAcidBallParticle";
};
datablock ParticleEmitterData(FlareguidePurpleStreamEmitter) {
ejectionPeriodMS = 15;
periodVarianceMS = 5;
ejectionVelocity = 1.25;
velocityVariance = 0.50;
thetaMin = 0.0;
thetaMax = 90.0;
particles = "FlareguidePurpleStream";
};
//**********************************************
// EXPLOSION DATABLOCKS
//**********************************************
datablock ExplosionData(ZAcidBombExplosion) {
emitter[0] = ZAcidBombExplosionEmitter;
soundProfile = NerfBallExplosionSound;
};
datablock ExplosionData(ZAcidBallExplosion) {
emitter[0] = ZAcidBallExplosionEmitter;
soundProfile = NerfBallExplosionSound;
};
//**********************************************
// PROJECTILE DATABLOCKS
//**********************************************
datablock TracerProjectileData(ZombieAcidPulse) {
doDynamicClientHits = true;
projectileShapeName = "";
directDamage = 0.0;
directDamageType = $DamageType::ZAcid;
hasDamageRadius = true;
indirectDamage = 0.24;
damageRadius = 4.0;
kickBackStrength = 0.0;
radiusDamageType = $DamageType::ZAcid;
sound = BlasterProjectileSound;
explosion = ZAcidBallExplosion;
ImageSource = "AcidCannonImage";
dryVelocity = 100.0;
wetVelocity = 100.0;
velInheritFactor = 1.0;
fizzleTimeMS = 4000;
lifetimeMS = 1000;
explodeOnDeath = false;
reflectOnWaterImpactAngle = 0.0;
explodeOnWaterImpact = true;
deflectionOnWaterImpact = 0.0;
fizzleUnderwaterMS = -1;
activateDelayMS = 100;
tracerLength = 5;
tracerAlpha = false;
tracerMinPixels = 3;
tracerColor = "0 1 0 1";
tracerTex[0] = "special/landSpikeBolt";
tracerTex[1] = "special/landSpikeBoltCross";
tracerWidth = 0.5;
crossSize = 0.79;
crossViewAng = 0.990;
renderCross = true;
emap = true;
};
datablock TracerProjectileData(SSZombieAcidBall) {
doDynamicClientHits = true;
projectileShapeName = "";
directDamage = 0.25;
directDamageType = $DamageType::ZAcid;
hasDamageRadius = true;
indirectDamage = 0.1;
damageRadius = 4.0;
kickBackStrength = 0.0;
radiusDamageType = $DamageType::ZAcid;
sound = BlasterProjectileSound;
explosion = ZAcidBallExplosion;
dryVelocity = 400.0;
wetVelocity = 400.0;
velInheritFactor = 1.0;
fizzleTimeMS = 4000;
lifetimeMS = 4000;
explodeOnDeath = false;
reflectOnWaterImpactAngle = 0.0;
explodeOnWaterImpact = true;
deflectionOnWaterImpact = 0.0;
fizzleUnderwaterMS = -1;
activateDelayMS = 100;
tracerLength = 5;
tracerAlpha = false;
tracerMinPixels = 3;
tracerColor = "0 1 0 1";
tracerTex[0] = "special/landSpikeBolt";
tracerTex[1] = "special/landSpikeBoltCross";
tracerWidth = 0.5;
crossSize = 0.79;
crossViewAng = 0.990;
renderCross = true;
emap = true;
};
datablock GrenadeProjectileData(DemonFireball) {
projectileShapeName = "plasmabolt.dts";
emitterDelay = -1;
@ -530,6 +764,109 @@ datablock LinearFlareProjectileData(DMPlasma) {
flareBaseTexture = "flarebase";
};
datablock TracerProjectileData(SniperZombieAcidShot) {
doDynamicClientHits = true;
projectileShapeName = "";
directDamage = 0.4;
directDamageType = $DamageType::ZAcid;
hasDamageRadius = true;
indirectDamage = 0.25;
damageRadius = 6.0;
kickBackStrength = 0.0;
radiusDamageType = $DamageType::ZAcid;
sound = BlasterProjectileSound;
explosion = ZAcidBallExplosion;
dryVelocity = 1000.0;
wetVelocity = 1000.0;
velInheritFactor = 1.0;
fizzleTimeMS = 4000;
lifetimeMS = 4000;
explodeOnDeath = false;
reflectOnWaterImpactAngle = 0.0;
explodeOnWaterImpact = true;
deflectionOnWaterImpact = 0.0;
fizzleUnderwaterMS = -1;
activateDelayMS = 100;
tracerLength = 5;
tracerAlpha = false;
tracerMinPixels = 3;
tracerColor = "0 1 0 1";
tracerTex[0] = "special/landSpikeBolt";
tracerTex[1] = "special/landSpikeBoltCross";
tracerWidth = 0.3;
crossSize = 0.79;
crossViewAng = 0.990;
renderCross = true;
emap = true;
};
datablock TracerProjectileData(FlareguideSniperZombieAcidShot) {
doDynamicClientHits = true;
projectileShapeName = "";
directDamage = 0.6;
directDamageType = $DamageType::ZAcid;
hasDamageRadius = true;
indirectDamage = 0.25;
damageRadius = 10.0;
kickBackStrength = 0.0;
radiusDamageType = $DamageType::ZAcid;
sound = BlasterProjectileSound;
explosion = ZAcidBallExplosion;
dryVelocity = 1500.0;
wetVelocity = 1500.0;
velInheritFactor = 1.0;
fizzleTimeMS = 4000;
lifetimeMS = 4000;
explodeOnDeath = true;
reflectOnWaterImpactAngle = 0.0;
explodeOnWaterImpact = true;
deflectionOnWaterImpact = 0.0;
fizzleUnderwaterMS = -1;
activateDelayMS = 100;
tracerLength = 5;
tracerAlpha = false;
tracerMinPixels = 3;
tracerColor = "1 0 0.5 1";
tracerTex[0] = "special/landSpikeBolt";
tracerTex[1] = "special/landSpikeBoltCross";
tracerWidth = 0.3;
crossSize = 0.79;
crossViewAng = 0.990;
renderCross = true;
emap = true;
};
datablock GrenadeProjectileData(FlareguideSniperBurstRound) {
projectileShapeName = "turret_muzzlepoint.dts"; //Really small and hard to see
emitterDelay = -1;
directDamage = 0.0;
hasDamageRadius = false;
indirectDamage = 0.3;
damageRadius = 4.0;
radiusDamageType = $DamageType::ZAcid;
kickBackStrength = 0;
bubbleEmitTime = 1.0;
sound = BlasterProjectileSound;
explosion = ZAcidBallExplosion;
//explodeOnMaxBounce = true;
velInheritFactor = 0.5;
baseEmitter[0] = FlareguidePurpleStreamEmitter;
grenadeElasticity = 0.4;
grenadeFriction = 0.2;
armingDelayMS = 100; // was 400
muzzleVelocity = 0;
drag = 0.1;
};
datablock SeekerProjectileData(BossMissiles) {
casingShapeName = "weapon_missile_casement.dts";
projectileShapeName = "weapon_missile_projectile.dts";

View file

@ -22,31 +22,31 @@ function InitiateBoss(%Boss, %name) {
$TWM2::BossGoing = 1;
switch$(%name) {
case "Yvex":
%print = "<color:FF0000>BOSS BATTLE \n LORD YVEX";
%print = "<color:FF0000>BOSS BATTLE \n LORD YVEX \n Fist Of Vengeance Field Commander";
case "CnlWindshear":
%print = "<color:FF0000>BOSS BATTLE \n COLONEL WINDSHEAR";
%print = "<color:FF0000>BOSS BATTLE \n COLONEL WINDSHEAR \n Harbinger Aerial Admiral";
case "GhostOfLightning":
%print = "<color:FF0000>BOSS BATTLE \n GHOST OF LIGHTNING";
%print = "<color:FF0000>BOSS BATTLE \n THE GHOST OF LIGHTNING \n Dark Shadow Entity";
case "Vengenor":
%print = "<color:FF0000>BOSS BATTLE \n GENERAL VENGENOR";
%print = "<color:FF0000>BOSS BATTLE \n GENERAL VENGENOR \n Fist of Vengeance Siege General";
case "LordRog":
%print = "<color:FF0000>BOSS BATTLE \n LORD ROG";
%print = "<color:FF0000>BOSS BATTLE \n LORD ROG \n Fist Of Vengeance Field Commander";
case "Insignia":
%print = "<color:FF0000>BOSS BATTLE \n MAJOR INSIGNIA";
%print = "<color:FF0000>BOSS BATTLE \n MAJOR INSIGNIA \n Fist of Vengeance Space Fleet Commander";
case "Vardison1":
%print = "<color:FF0000>BOSS BATTLE \n LORD VARDISON";
%print = "<color:FF0000>BOSS BATTLE \n LORD VARDISON \n Leader of the Fist of Vengeance";
case "Vardison2":
%print = "<color:FF0000>BOSS ALERT \n LORD VARDISON HAS ENTERED HIS SECOND FORM";
case "Vardison3":
%print = "<color:FF0000>BOSS ALERT \n LORD VARDISON HAS ENTERED HIS FINAL FORM";
case "Trevor":
%print = "<color:FF0000>BOSS BATTLE \n LORDRANIUS TREVOR";
%print = "<color:FF0000>BOSS BATTLE \n LORDRANIUS TREVOR \n Leader of the Harbinger Clan";
case "Stormrider":
%print = "<color:FF0000>CLASSIC BOSS BATTLE \n COMMANDER STORMRIDER";
%print = "<color:FF0000>CLASSIC BOSS BATTLE \n COMMANDER STORMRIDER \n Harbinger Air Assault Commander";
case "GhostOfFire":
%print = "<color:FF0000>CLASSIC BOSS BATTLE \n GHOST OF FIRE";
%print = "<color:FF0000>CLASSIC BOSS BATTLE \n THE GHOST OF FIRE \n Dark Shadow Entity";
case "ShadeLord":
%print = "<color:FF0000>BOSS BATTLE \n THE SHADE LORD";
%print = "<color:FF0000>BOSS BATTLE \n THE SHADE LORD \n Guardian of the Realm of Shadows";
}
//INITIATE TO CLIENTS
%count = ClientGroup.getCount();
@ -77,7 +77,7 @@ function resetBossProficiency(%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('MsgSPCurrentObjective1', "", "Boss Battle: "@$TWM2::BossNameInternal[%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") {
@ -199,7 +199,7 @@ function GameConnection::GiveBossAward(%client, %bossName) {
%scriptController.save(%file);
%award = mFloor($TWM2::BossXPAward[%bossName] / %scriptController.bossDefeatCount[%bossName]);
GainExperience(%client, %award, ""@%bossName@" defeated, congratulations! ");
GainExperience(%client, %award, ""@$TWM2::BossNameInternal[%bossName]@" defeated, congratulations! ");
CheckBossChallenge(%client, %bossName);
CheckBossProficiency(%client, %bossName);
}

View file

@ -17,7 +17,7 @@ function PlayerLordFire1(%Player) {
function PlayerLordFire2(%player) {
%p = new TracerProjectile() {
dataBlock = LZombieAcidBall;
dataBlock = ZombieAcidPulse;
initialDirection = %player.getMuzzleVector(6);
initialPosition = %player.getMuzzlePoint(6);
sourceObject = %player;

View file

@ -43,6 +43,7 @@ $Zombie::TypeSpeed[3] = 4000;
$Zombie::TypeSpeed[4] = 240;
$Zombie::TypeSpeed[5] = 1500;
$Zombie::TypeSpeed[6] = 1200;
$Zombie::TypeSpeed[11] = 240;
//$Zombie::BaseJumpCooldown: The time zombies must elapse before jumping / lunging
$Zombie::BaseJumpCooldown = 1500;
@ -558,6 +559,7 @@ function TWM2Lib_Zombie_Core(%functionName, %arg1, %arg2, %arg3, %arg4) {
};
%zombie.mountImage(ZSniperImage1, 4);
%zombie.mountImage(ZSniperImage2, 5);
%zombie.mountImage(ZSniperImage3, 6);
//Ultra-Demon Zombie
case 12:
@ -611,7 +613,16 @@ function TWM2Lib_Zombie_Core(%functionName, %arg1, %arg2, %arg3, %arg4) {
%zombie = new player(){
Datablock = "EliteDemonZombieArmor";
};
%zombie.mountImage(ZdummyslotImg, 4);
%zombie.mountImage(ZdummyslotImg, 4);
//Flareguide Sniper Zombie (Mini-Boss)
case 11:
%zombie = new player(){
Datablock = "FlareguideSniperZombieArmor";
};
%zombie.mountImage(ZSniperImage1, 4);
%zombie.mountImage(ZSniperImage2, 5);
%zombie.mountImage(ZSniperImage3, 6);
}
//Verify that we spawned a zombie object, force spawn a normal zombie if we did not.
if(!isObject(%zombie)) {

View file

@ -24,6 +24,7 @@ datablock PlayerData(DemonZombieArmor) : LightMaleHumanArmor {
damageScale[$DamageType::Burn] = 0.001;
damageScale[$DamageType::Fire] = 0.001;
damageScale[$DamageType::CrimsonHawk] = 1.9;
damageScale[$DamageType::AcidCannon] = 3.0;
max[RepairKit] = 0;
max[Mine] = 0;

View file

@ -23,7 +23,8 @@ datablock PlayerData(DemonMotherZombieArmor) : LightMaleHumanArmor {
damageScale[$DamageType::plasma] = 0.001;
damageScale[$DamageType::Napalm] = 0.001;
damageScale[$DamageType::Burn] = 0.001;
damageScale[$DamageType::Fire] = 0.001;
damageScale[$DamageType::Fire] = 0.001;
damageScale[$DamageType::AcidCannon] = 3.0;
max[RepairKit] = 0;
max[Mine] = 0;
@ -224,7 +225,7 @@ function DemonMotherZombieArmor::AttackFunction(%datablock, %zombie, %attackFunc
%vec = vectorSub(%target.getWorldBoxCenter(), %zombie.getMuzzlePoint(4));
%vec = vectorAdd(%vec, vectorScale(%target.getVelocity(), vectorLen(%vec) / 100));
%p = new TracerProjectile() {
dataBlock = LZombieAcidBall;
dataBlock = ZombieAcidPulse;
initialDirection = %vec;
initialPosition = %zombie.getMuzzlePoint(4);
sourceObject = %zombie;

View file

@ -28,6 +28,7 @@ datablock PlayerData(DemonUltraZombieArmor) : LightMaleHumanArmor {
damageScale[$DamageType::SA2400] = 5.0;
damageScale[$DamageType::Model1887] = 4.0;
damageScale[$DamageType::CrimsonHawk] = 1.9;
damageScale[$DamageType::AcidCannon] = 3.0;
max[RepairKit] = 0;
max[Mine] = 0;

View file

@ -21,6 +21,7 @@ datablock PlayerData(EliteDemonZombieArmor) : LightMaleHumanArmor {
damageScale[$DamageType::Fire] = 0.1;
damageScale[$DamageType::Napalm] = 0.1;
damageScale[$DamageType::Plasma] = 0.1;
damageScale[$DamageType::AcidCannon] = 3.0;
max[RepairKit] = 0;
max[Mine] = 0;

View file

@ -41,6 +41,7 @@ datablock PlayerData(LordZombieArmor) : HeavyMaleBiodermArmor {
damageScale[$DamageType::SCD343] = 4.0;
damageScale[$DamageType::SA2400] = 5.0;
damageScale[$DamageType::Model1887] = 4.0;
damageScale[$DamageType::AcidCannon] = 3.0;
max[RepairKit] = 0;
max[Mine] = 0;

View file

@ -30,6 +30,7 @@ datablock PlayerData(ZombieArmor) : LightMaleHumanArmor {
damageScale[$DamageType::SA2400] = 5.0;
damageScale[$DamageType::Model1887] = 4.0;
damageScale[$DamageType::CrimsonHawk] = 1.9;
damageScale[$DamageType::AcidCannon] = 3.0;
max[RepairKit] = 0;
max[Mine] = 0;

View file

@ -26,6 +26,7 @@ datablock PlayerData(RapierZombieArmor) : LightMaleBiodermArmor {
damageScale[$DamageType::Model1887] = 4.0;
damageScale[$DamageType::Missile] = 100.0;
damageScale[$DamageType::CrimsonHawk] = 1.9;
damageScale[$DamageType::AcidCannon] = 3.0;
max[RepairKit] = 0;
max[Mine] = 0;

View file

@ -11,6 +11,7 @@ datablock PlayerData(RavagerZombieArmor) : LightMaleBiodermArmor {
damageScale[$DamageType::SA2400] = 5.0;
damageScale[$DamageType::Model1887] = 4.0;
damageScale[$DamageType::CrimsonHawk] = 1.9;
damageScale[$DamageType::AcidCannon] = 3.0;
max[RepairKit] = 0;
max[Mine] = 0;

View file

@ -30,6 +30,7 @@ datablock PlayerData(ShifterZombieArmor) : LightMaleHumanArmor {
damageScale[$DamageType::SA2400] = 5.0;
damageScale[$DamageType::Model1887] = 4.0;
damageScale[$DamageType::CrimsonHawk] = 1.9;
damageScale[$DamageType::AcidCannon] = 3.0;
max[RepairKit] = 0;
max[Mine] = 0;

View file

@ -9,6 +9,7 @@ datablock PlayerData(SSZombieArmor) : LightMaleBiodermArmor {
damageScale[$DamageType::SA2400] = 5.0;
damageScale[$DamageType::Model1887] = 4.0;
damageScale[$DamageType::CrimsonHawk] = 1.9;
damageScale[$DamageType::AcidCannon] = 3.0;
max[RepairKit] = 0;
max[Mine] = 0;

View file

@ -1,3 +1,7 @@
//Phantom139 Note: The sniper zombie prefers to stay away from players, it does not infect on contact, but instead runs away
$TWM2::ArmorHasCollisionFunction[SniperZombieArmor] = false;
$TWM2::ArmorHasCollisionFunction[FlareguideSniperZombieArmor] = false;
datablock PlayerData(SniperZombieArmor) : LightMaleHumanArmor {
boundingBox = "1.63 1.63 2.6";
maxDamage = 2.5;
@ -18,6 +22,26 @@ datablock PlayerData(SniperZombieArmor) : LightMaleHumanArmor {
damageScale[$DamageType::SA2400] = 5.0;
damageScale[$DamageType::Model1887] = 4.0;
damageScale[$DamageType::CrimsonHawk] = 1.9;
damageScale[$DamageType::AcidCannon] = 3.0;
max[RepairKit] = 0;
max[Mine] = 0;
max[Grenade] = 0;
};
datablock PlayerData(FlareguideSniperZombieArmor) : SniperZombieArmor {
boundingBox = "1.63 1.63 2.6";
maxDamage = 20.0;
minImpactSpeed = 35;
shapeFile = "bioderm_heavy.dts";
debrisShapeName = "bio_player_debris.dts";
//Foot Prints
decalData = HeavyBiodermFootprint;
decalOffset = 0.4;
waterBreathSound = WaterBreathBiodermSound;
max[RepairKit] = 0;
max[Mine] = 0;
@ -38,6 +62,14 @@ datablock ShapeBaseImageData(ZSniperImage2) {
emap = true;
};
datablock ShapeBaseImageData(ZSniperImage3) {
shapeFile = "weapon_elf.dts";
offset = "0.0 0.3 0";
rotation = "1 0 0 90";
armThread = looksn;
emap = true;
};
function SniperZombiemovetotarget(%zombie){
if(!isobject(%zombie))
return;
@ -113,7 +145,7 @@ function SniperZombieFire(%zombie,%closestclient){
%accuracy = (vectorlen(%vec) / %num);
%vec = vectoradd(%vec, vectorscale(%closestclient.getvelocity(), %accuracy));
%p = new TracerProjectile() { //TWM2 Sniper zombies use ALSWP Snipers :P
dataBlock = ALSWPBullet;
dataBlock = SniperZombieAcidShot;
initialDirection = %vec;
initialPosition = %zombie.getMuzzlePoint(4);
sourceObject = %zombie;
@ -121,3 +153,24 @@ function SniperZombieFire(%zombie,%closestclient){
};
ServerPlay3D(ALSWPFireSound, %zombie.getPosition());
}
function FlareguideSniperZombieAcidShot::onExplode(%data, %proj, %pos, %mod) {
Parent::OnExplode(%data, %proj, %pos, %mod);
//Create the mini-pulses
for (%i = 0; %i < 6; %i++) {
%x = getRandom(-3, 3);
%y = getRandom(-3, 3);
%z = 5;
%vec = %x SPC %y SPC %z;
%vec = VectorScale(%vec, 200);
%p = new (GrenadeProjectile)() {
dataBlock = FlareguideSniperBurstRound;
initialDirection = %vec;
initialPosition = %pos;
};
MissionCleanup.add(%p);
%p.sourceObject = %proj.sourceObject;
return;
}
}

View file

@ -30,6 +30,7 @@ datablock PlayerData(SummonerZombieArmor) : LightMaleHumanArmor {
damageScale[$DamageType::SA2400] = 5.0;
damageScale[$DamageType::Model1887] = 4.0;
damageScale[$DamageType::CrimsonHawk] = 1.9;
damageScale[$DamageType::AcidCannon] = 3.0;
max[RepairKit] = 0;
max[Mine] = 0;

View file

@ -9,6 +9,7 @@ datablock PlayerData(VolatileRavagerZombieArmor) : LightMaleBiodermArmor {
damageScale[$DamageType::SA2400] = 5.0;
damageScale[$DamageType::Model1887] = 4.0;
damageScale[$DamageType::CrimsonHawk] = 1.9;
damageScale[$DamageType::AcidCannon] = 3.0;
max[RepairKit] = 0;
max[Mine] = 0;

View file

@ -22,6 +22,7 @@ datablock PlayerData(WraithZombieArmor) : LightMaleHumanArmor {
damageScale[$DamageType::SA2400] = 5.0;
damageScale[$DamageType::Model1887] = 4.0;
damageScale[$DamageType::CrimsonHawk] = 1.9;
damageScale[$DamageType::AcidCannon] = 3.0;
max[RepairKit] = 0;
max[Mine] = 0;

View file

@ -90,6 +90,7 @@ $DamageType::ES77PulsePhaser = 89;
$DamageType::Wp400 = 90;
$DamageType::SCD343 = 91;
$DamageType::Model1887 = 92;
$DamageType::AcidCannon = 93;
//Phantom139: TWM2 3.9.2: Updated these "special" damage types to have much higher index values
@ -174,6 +175,17 @@ $DamageTypeText[79] = 'Javelin';
$DamageTypeText[80] = 'Stinger';
$DamageTypeText[81] = 'Static Grenade';
$DamageTypeText[82] = 'Plasmasaber';
$DamageTypeText[83] = 'Blade of Vengance Assassination';
$DamageTypeText[84] = 'MG42';
$DamageTypeText[85] = 'MRXX ZC4';
$DamageTypeText[86] = 'Plasma Torpedo';
$DamageTypeText[87] = 'Crimson Hawk';
$DamageTypeText[88] = 'M93 Trafca';
$DamageTypeText[89] = 'ES-77 Pulse Phaser';
$DamageTypeText[90] = 'WP 400';
$DamageTypeText[91] = 'SCD-343';
$DamageTypeText[92] = 'Model 1887';
$DamageTypeText[93] = 'Acid Cannon';
$DamageTypeText[998] = 'water';
$DamageTypeText[998] = 'nexus camping';

View file

@ -164,6 +164,11 @@ $DeathMessageSelfKill[$DamageType::PTorpedo, 2] = '\c0%1 took proton detonation
$DeathMessageSelfKill[$DamageType::PTorpedo, 3] = '\c0%1\'s proton torpedo aiming skills are self-evident.';
$DeathMessageSelfKill[$DamageType::PTorpedo, 4] = '\c0%1 annihilates %2self into dust with a proton torpedo';
$DeathMessageSelfKill[$DamageType::AcidCannon, 0] = '\c0%1 applied a lethal dose of acid upon %2self.';
$DeathMessageSelfKill[$DamageType::AcidCannon, 1] = '\c0%1 turned %3 acid cannon on %2self.';
$DeathMessageSelfKill[$DamageType::AcidCannon, 2] = '\c0%1 still doesn\'t have the hang of FoV acid weapon technology.';
$DeathMessageSelfKill[$DamageType::AcidCannon, 3] = '\c0%1\'s self melting skills speak for themself.';
$DeathMessageSelfKill[$DamageType::AcidCannon, 4] = '\c0%1 melts %2self into a liquid pool with the acid cannon.';
//used when a player is killed by a teammate
$DeathMessageTeamKillCount = 1;
@ -210,6 +215,7 @@ $DeathMessageTeamKill[$DamageType::PTorpedo, 0] = '\c0%4 vaporized TEAMMATE %1 w
$DeathMessageTeamKill[$DamageType::CrimsonHawk, 0] = '\c0%4 eliminates TEAMMATE %1 with %6 crimson hawk pistol!';
$DeathMessageTeamKill[$DamageType::M93, 0] = '\c0%4 nails TEAMMATE %1 with a burst fired M93 pistol!';
$DeathMessageTeamKill[$DamageType::ES77PulsePhaser, 0] = '\c0%4 eliminates TEAMMATE %1 with %6 ES-77 Pulse Phaser!';
$DeathMessageTeamKill[$DamageType::AcidCannon, 0] = '\c0%4 metled TEAMMATE %1 with %6 Acid Cannon!';
//these used when a player is killed by an enemy
$DeathMessageCount = 5;
@ -516,7 +522,7 @@ $DeathMessage[$DamageType::Zombie, 4] = '\c0%1 is sliced and diced by a zombie.'
$DeathMessage[$DamageType::ZAcid, 0] = '\c0%1 gets blasted by zombie acid.';
$DeathMessage[$DamageType::ZAcid, 1] = '\c0%1 is in horrible pain from the infectious acid.';
$DeathMessage[$DamageType::ZAcid, 2] = '\c0%1 will be a zombie soon, thanks to that acid.';
$DeathMessage[$DamageType::ZAcid, 3] = '\c0%1 is blasted by a lord zombie.';
$DeathMessage[$DamageType::ZAcid, 3] = '\c0%1 is blasted by a zombie acid cannon.';
$DeathMessage[$DamageType::ZAcid, 4] = '\c0%1 burns in pain from zombie acid.';
$DeathMessage[$DamageType::Fire, 0] = '\c0%1 gets %2self burnt again.';
@ -607,7 +613,7 @@ $DeathMessage[$DamageType::LaserRifle, 0] = '\c0%4 beamed down %1 with a Laser R
$DeathMessage[$DamageType::LaserRifle, 1] = '\c0%4 blasts ultimate laser beams into %1.';
$DeathMessage[$DamageType::LaserRifle, 2] = '\c0%4 utilizes advanced Laser Technology on %1';
$DeathMessage[$DamageType::LaserRifle, 3] = '\c0%4 burns holes into %1 from %6 laser rifle.';
$DeathMessage[$DamageType::LaserRifle, 4] = '\c0%4 gives %1 some laser therapy, too bad it was lethal.';
$DeathMessage[$DamageType::LaserRifle, 4] = '\c0%4 gives %1 some laser therapy, unfortunately, it was lethal.';
$DeathMessage[$DamageType::Burn, 0] = '\c0%1 screams fire, nobody comes to aid %2.';
$DeathMessage[$DamageType::Burn, 1] = '\c0%1 is to the ³rd Degree.';
@ -616,7 +622,7 @@ $DeathMessage[$DamageType::Burn, 3] = '\c0%1 becomes engulfed in fire, and dies.
$DeathMessage[$DamageType::Burn, 4] = '\c0%1 experiences spontanious combustion.';
$DeathMessage[$DamageType::Fire, 0] = '\c0%4 burns %1 with a flamethrower.';
$DeathMessage[$DamageType::Fire, 1] = '\c0%4 burns %1, then flips the switch again to ensure.';
$DeathMessage[$DamageType::Fire, 1] = '\c0%4 burns %1, then flips the switch again to ensure the job is done.';
$DeathMessage[$DamageType::Fire, 2] = '\c0%1 walks into %4\'s stream of flames';
$DeathMessage[$DamageType::Fire, 3] = '\c0%4 defines the words third degree for %1.';
$DeathMessage[$DamageType::Fire, 4] = '\c0%1 experiences spontanious combustion from %4.';
@ -709,4 +715,10 @@ $DeathMessage[$DamageType::ES77PulsePhaser, 0] = '\c0%4 nails %1 with repeated h
$DeathMessage[$DamageType::ES77PulsePhaser, 1] = '\c0%4 eliminates %1 with %6 ES-77 Pulse Phaser.';
$DeathMessage[$DamageType::ES77PulsePhaser, 2] = '\c0%4 shows %1 the power of the pulse phaser.';
$DeathMessage[$DamageType::ES77PulsePhaser, 3] = '\c0%4 fires off superheated pulse shots in %1\'s direction.';
$DeathMessage[$DamageType::ES77PulsePhaser, 4] = '\c0%4 makes short work of %1 with a pulse phaser.';
$DeathMessage[$DamageType::ES77PulsePhaser, 4] = '\c0%4 makes short work of %1 with a pulse phaser.';
$DeathMessage[$DamageType::AcidCannon, 0] = '\c0%4 strikes down %1 with an acid cannon.';
$DeathMessage[$DamageType::AcidCannon, 1] = '\c0%4 melts %1 into a puddle with the FoV acid cannon.';
$DeathMessage[$DamageType::AcidCannon, 2] = '\c0%4 turned FoV weapon\'s tech in %1\'s direction.';
$DeathMessage[$DamageType::AcidCannon, 3] = '\c0%4 nails %1 with an acid cannon.';
$DeathMessage[$DamageType::AcidCannon, 4] = '\c0%4 ends %1 quickly and painfully with an acid cannon.';

View file

@ -1,322 +1,171 @@
// Acid Cannon
datablock AudioProfile(AcidCannonPreFireSound) {
filename = "fx/weapons/targetinglaser_paint.wav";
description = AudioClosest3d;
preload = true;
};
datablock AudioProfile(NerfBallExplosionSound) {
filename = "fx/weapons/cg_water2.wav";
description = AudioClosest3d;
preload = true;
};
datablock TracerProjectileData(AcidCannonPulse) {
doDynamicClientHits = true;
//acid bomb
datablock ParticleData(ZAcidBombParticle) {
dragCoeffiecient = 0.0;
gravityCoefficient = 0.5;
inheritedVelFactor = 0.5;
projectileShapeName = "";
directDamage = 0.3;
directDamageType = $DamageType::AcidCannon;
hasDamageRadius = true;
indirectDamage = 0.35;
damageRadius = 10.0;
kickBackStrength = 0.0;
radiusDamageType = $DamageType::AcidCannon;
sound = BlasterProjectileSound;
explosion = ZAcidBallExplosion;
lifetimeMS = 4000;
lifetimeVarianceMS = 500;
ImageSource = "AcidCannonImage";
spinRandomMin = -200.0;
spinRandomMax = 200.0;
dryVelocity = 150.0;
wetVelocity = 150.0;
velInheritFactor = 1.0;
fizzleTimeMS = 1200;
lifetimeMS = 1500;
explodeOnDeath = false;
reflectOnWaterImpactAngle = 0.0;
explodeOnWaterImpact = true;
deflectionOnWaterImpact = 0.0;
fizzleUnderwaterMS = -1;
textureName = "special/bubbles";
activateDelayMS = 100;
colors[0] = "0.0 1.0 0.5 0.3";
colors[1] = "0.0 1.0 0.4 0.2";
colors[2] = "0.0 1.0 0.3 0.1";
sizes[0] = 3.0;
sizes[1] = 2.3;
sizes[2] = 2.1;
times[0] = 0.0;
times[1] = 0.5;
times[2] = 1.0;
};
datablock ParticleEmitterData(ZAcidBombExplosionEmitter) {
lifetimeMS = 2000;
ejectionPeriodMS = 1;
periodVarianceMS = 0;
ejectionVelocity = 3.0;
velocityVariance = 0.5;
thetaMin = 0.0;
thetaMax = 90.0;
orientParticles = false;
orientOnVelocity = false;
particles = "ZAcidBombParticle";
};
datablock ExplosionData(ZAcidBombExplosion) {
emitter[0] = ZAcidBombExplosionEmitter;
soundProfile = NerfBallExplosionSound;
};
//
datablock ParticleData(ZAcidBallParticle) {
dragCoeffiecient = 0.0;
gravityCoefficient = 0.5;
inheritedVelFactor = 0.5;
lifetimeMS = 2000;
lifetimeVarianceMS = 200;
spinRandomMin = -200.0;
spinRandomMax = 200.0;
textureName = "special/bubbles";
colors[0] = "0.0 1.0 0.5 0.3";
colors[1] = "0.0 1.0 0.4 0.2";
colors[2] = "0.0 1.0 0.3 0.1";
sizes[0] = 0.6;
sizes[1] = 0.3;
sizes[2] = 0.1;
times[0] = 0.0;
times[1] = 0.5;
times[2] = 1.0;
};
datablock ParticleEmitterData(ZAcidBallExplosionEmitter) {
lifetimeMS = 200;
ejectionPeriodMS = 1;
periodVarianceMS = 0;
ejectionVelocity = 3.0;
velocityVariance = 0.5;
thetaMin = 0.0;
thetaMax = 90.0;
orientParticles = false;
orientOnVelocity = false;
particles = "ZAcidBallParticle";
};
datablock ExplosionData(ZAcidBallExplosion) {
emitter[0] = ZAcidBallExplosionEmitter;
soundProfile = NerfBallExplosionSound;
};
datablock TracerProjectileData(LZombieAcidBall) {
doDynamicClientHits = true;
projectileShapeName = "";
directDamage = 0.0;
directDamageType = $DamageType::ZAcid;
hasDamageRadius = true;
indirectDamage = 0.24;
damageRadius = 4.0;
kickBackStrength = 0.0;
radiusDamageType = $DamageType::ZAcid;
sound = BlasterProjectileSound;
explosion = ZAcidBallExplosion;
ImageSource = "AcidCannonImage";
dryVelocity = 100.0;
wetVelocity = 100.0;
velInheritFactor = 1.0;
fizzleTimeMS = 4000;
lifetimeMS = 1000;
explodeOnDeath = false;
reflectOnWaterImpactAngle = 0.0;
explodeOnWaterImpact = true;
deflectionOnWaterImpact = 0.0;
fizzleUnderwaterMS = -1;
activateDelayMS = 100;
tracerLength = 5;
tracerAlpha = false;
tracerMinPixels = 3;
tracerColor = "0 1 0 1";
tracerLength = 5;
tracerAlpha = false;
tracerMinPixels = 3;
tracerColor = "0 1 0 1";
tracerTex[0] = "special/landSpikeBolt";
tracerTex[1] = "special/landSpikeBoltCross";
tracerWidth = 0.5;
crossSize = 0.79;
crossViewAng = 0.990;
renderCross = true;
emap = true;
crossSize = 0.79;
crossViewAng = 0.990;
renderCross = true;
emap = true;
};
datablock TracerProjectileData(SSZombieAcidBall) {
doDynamicClientHits = true;
projectileShapeName = "";
directDamage = 0.0;
directDamageType = $DamageType::ZAcid;
hasDamageRadius = true;
indirectDamage = 0.4;
damageRadius = 7.0;
kickBackStrength = 0.0;
radiusDamageType = $DamageType::ZAcid;
sound = BlasterProjectileSound;
explosion = ZAcidBallExplosion;
dryVelocity = 400.0;
wetVelocity = 400.0;
velInheritFactor = 1.0;
fizzleTimeMS = 4000;
lifetimeMS = 4000;
explodeOnDeath = false;
reflectOnWaterImpactAngle = 0.0;
explodeOnWaterImpact = true;
deflectionOnWaterImpact = 0.0;
fizzleUnderwaterMS = -1;
activateDelayMS = 100;
tracerLength = 5;
tracerAlpha = false;
tracerMinPixels = 3;
tracerColor = "0 1 0 1";
tracerTex[0] = "special/landSpikeBolt";
tracerTex[1] = "special/landSpikeBoltCross";
tracerWidth = 0.5;
crossSize = 0.79;
crossViewAng = 0.990;
renderCross = true;
emap = true;
};
function AcidCannonPulse::onExplode(%data, %proj, %pos, %mod) {
Parent::OnExplode(%data, %proj, %pos, %mod);
%TargetSearchMask = $TypeMasks::PlayerObjectType;
InitContainerRadiusSearch(%pos, %data.damageRadius, %TargetSearchMask);
while ((%potentialTarget = ContainerSearchNext()) != 0) {
if(%potentialTarget.isAlive()) {
if(((%potentialTarget.client.team == %proj.sourceObject.client.team) && $TeamDamage) || %potentialTarget.client.team != %proj.sourceObject.client.team) {
%potentialTarget.setWhiteout(1.0);
}
}
}
}
datablock ShapeBaseImageData(AcidCannonImage) {
className = WeaponImage;
shapeFile = "weapon_energy.dts";
item = AcidCannon;
projectile = LZombieAcidBall;
projectileType = TracerProjectile;
HasChallenges = 0;
//RankRequire = $TWM2::RankRequire["PulsePhaser"];
//No rank required, this weapon is picked up from killed zombies
className = WeaponImage;
shapeFile = "weapon_energy.dts";
item = AcidCannon;
projectile = AcidCannonPulse;
projectileType = TracerProjectile;
usesEnergy = true;
fireEnergy = 4;
minEnergy = 4;
HasChallenges = 0;
//RankRequire = $TWM2::RankRequire["PulsePhaser"];
//No rank required, this weapon is picked up from killed zombies
stateName[0] = "Activate";
stateTransitionOnTimeout[0] = "ActivateReady";
stateTimeoutValue[0] = 0.5;
stateSequence[0] = "Activate";
stateSound[0] = BlasterSwitchSound;
usesEnergy = true;
fireEnergy = 4;
minEnergy = 4;
stateName[1] = "ActivateReady";
stateTransitionOnLoaded[1] = "Ready";
stateTransitionOnNoAmmo[1] = "NoAmmo";
stateName[0] = "Activate";
stateTransitionOnTimeout[0] = "ActivateReady";
stateTimeoutValue[0] = 0.5;
stateSequence[0] = "Activate";
stateSound[0] = BlasterSwitchSound;
stateName[2] = "Ready";
stateTransitionOnNoAmmo[2] = "NoAmmo";
stateTransitionOnTriggerDown[2] = "Fire";
stateName[1] = "ActivateReady";
stateTransitionOnLoaded[1] = "Ready";
stateTransitionOnNoAmmo[1] = "NoAmmo";
stateName[3] = "Fire";
stateTransitionOnTimeout[3] = "Reload";
stateTimeoutValue[3] = 0.3;
stateFire[3] = true;
stateRecoil[3] = NoRecoil;
stateAllowImageChange[3] = false;
stateSequence[3] = "Fire";
//stateSound[3] = PPWFireSound;
stateScript[3] = "onFire";
stateName[2] = "Ready";
stateTransitionOnNoAmmo[2] = "NoAmmo";
stateTransitionOnTriggerDown[2] = "Fire";
stateName[4] = "Reload";
stateTransitionOnNoAmmo[4] = "NoAmmo";
stateTransitionOnTimeout[4] = "Ready";
stateTimeoutValue[4] = 4.2;
stateAllowImageChange[4] = false;
stateSequence[4] = "Reload";
stateName[3] = "Fire";
stateTransitionOnTimeout[3] = "Reload";
stateTimeoutValue[3] = 0.3;
stateFire[3] = true;
stateRecoil[3] = NoRecoil;
stateAllowImageChange[3] = false;
stateSequence[3] = "Fire";
//stateSound[3] = PPWFireSound;
stateScript[3] = "onFire";
stateName[5] = "NoAmmo";
stateTransitionOnAmmo[5] = "Reload";
stateSequence[5] = "NoAmmo";
stateTransitionOnTriggerDown[5] = "DryFire";
stateName[4] = "Reload";
stateTransitionOnNoAmmo[4] = "NoAmmo";
stateTransitionOnTimeout[4] = "Ready";
stateTimeoutValue[4] = 4.2;
stateAllowImageChange[4] = false;
stateSequence[4] = "Reload";
stateName[6] = "DryFire";
stateTimeoutValue[6] = 0.3;
stateSound[6] = BlasterDryFireSound;
stateTransitionOnTimeout[6] = "Ready";
stateName[5] = "NoAmmo";
stateTransitionOnAmmo[5] = "Reload";
stateSequence[5] = "NoAmmo";
stateTransitionOnTriggerDown[5] = "DryFire";
stateName[6] = "DryFire";
stateTimeoutValue[6] = 0.3;
stateSound[6] = BlasterDryFireSound;
stateTransitionOnTimeout[6] = "Ready";
};
datablock ItemData(AcidCannon) {
className = Weapon;
catagory = "Spawn Items";
shapeFile = "weapon_energy.dts";
image = AcidCannonImage;
mass = 1;
alwaysAllowPickup = 1;
elasticity = 0.2;
friction = 0.6;
pickupRadius = 2;
className = Weapon;
catagory = "Spawn Items";
shapeFile = "weapon_energy.dts";
image = AcidCannonImage;
mass = 1;
alwaysAllowPickup = 1;
elasticity = 0.2;
friction = 0.6;
pickupRadius = 2;
pickUpName = "an Acid Cannon";
};
function AcidCannonImage::onMount(%this, %obj, %slot) {
Parent::onMount(%this, %obj, %slot);
Parent::onMount(%this, %obj, %slot);
}
function AcidCannonImage::onUnmount(%this,%obj,%slot) {
Parent::onUnmount(%this, %obj, %slot);
Parent::onUnmount(%this, %obj, %slot);
}
function AcidCannonImage::onFire(%data,%obj,%slot) {
AcidCannonAttack(%obj, %slot, 0);
AcidCannonAttack(%obj, %slot, 0);
}
function AcidCannonAttack(%object, %slot, %chargecount) {
%muzzleVec = %object.getMuzzleVector(%slot);
%muzzlePt = %object.getMuzzlePoint(%slot);
if(%chargecount <= 5) {
if(%chargecount == 1) {
serverPlay3D(AcidCannonPreFireSound, %muzzlePt);
}
%charge = new ParticleEmissionDummy() {
position = %muzzlePt;
dataBlock = "defaultEmissionDummy";
emitter = "BurnEmitter";
};
MissionCleanup.add(%charge);
%charge.schedule(100, "delete");
}
if(%chargecount == 7) {
%p = new TracerProjectile() {
dataBlock = LZombieAcidBall;
initialDirection = %muzzleVec;
initialPosition = %muzzlePt;
sourceObject = %object;
sourceSlot = 0;
};
MissionCleanup.add(%p);
serverPlay3D(CentaurArtilleryFireSound, %muzzlePt);
}
if(%chargecount == 9) {
%p = new TracerProjectile() {
dataBlock = LZombieAcidBall;
initialDirection = %muzzleVec;
initialPosition = %muzzlePt;
sourceObject = %object;
sourceSlot = 0;
};
MissionCleanup.add(%p);
serverPlay3D(CentaurArtilleryFireSound, %muzzlePt);
}
//
if(%chargecount <= 9) {
%chargecount++;
schedule(100, 0, "AcidCannonAttack", %object, %slot, %chargecount);
}
%muzzleVec = %object.getMuzzleVector(%slot);
%muzzlePt = %object.getMuzzlePoint(%slot);
if(%chargecount <= 5) {
if(%chargecount == 1) {
serverPlay3D(AcidCannonPreFireSound, %muzzlePt);
}
%charge = new ParticleEmissionDummy() {
position = %muzzlePt;
dataBlock = "defaultEmissionDummy";
emitter = "BurnEmitter";
};
MissionCleanup.add(%charge);
%charge.schedule(100, "delete");
}
if(%chargecount == 7 || %chargecount == 9) {
%p = new TracerProjectile() {
dataBlock = AcidCannonPulse;
initialDirection = %muzzleVec;
initialPosition = %muzzlePt;
sourceObject = %object;
sourceSlot = 0;
};
MissionCleanup.add(%p);
serverPlay3D(CentaurArtilleryFireSound, %muzzlePt);
}
//
if(%chargecount <= 9) {
%chargecount++;
schedule(100, 0, "AcidCannonAttack", %object, %slot, %chargecount);
}
}

View file

@ -0,0 +1,217 @@
datablock TracerProjectileData(M1Bullet) {
doDynamicClientHits = true;
directDamage = 0.65;
directDamageType = $DamageType::M1;
explosion = "ChaingunExplosion";
splash = ChaingunSplash;
HeadMultiplier = 1.5;
LegsMultiplier = 0.35;
HeadShotKill = 1;
ImageSource = "NLS22AcidSniperImage";
kickBackStrength = 15.0;
sound = ChaingunProjectile;
dryVelocity = 3000.0;
wetVelocity = 2000.0;
velInheritFactor = 1.0;
fizzleTimeMS = 1000;
lifetimeMS = 1000;
explodeOnDeath = false;
reflectOnWaterImpactAngle = 0.0;
explodeOnWaterImpact = false;
deflectionOnWaterImpact = 0.0;
fizzleUnderwaterMS = 3000;
tracerLength = 20.0;
tracerAlpha = false;
tracerMinPixels = 6;
tracerColor = 211.0/255.0 @ " " @ 215.0/255.0 @ " " @ 120.0/255.0 @ " 0.75";
tracerTex[0] = "special/tracer00";
tracerTex[1] = "special/tracercross";
tracerWidth = 0.09;
crossSize = 0.20;
crossViewAng = 0.990;
renderCross = true;
decalData[0] = ChaingunDecal1;
decalData[1] = ChaingunDecal2;
decalData[2] = ChaingunDecal3;
decalData[3] = ChaingunDecal4;
decalData[4] = ChaingunDecal5;
decalData[5] = ChaingunDecal6;
};
datablock ItemData(NLS22AcidSniperAmmo) {
className = Ammo;
catagory = "Ammo";
shapeFile = "ammo_chaingun.dts";
mass = 1;
elasticity = 0.2;
friction = 0.6;
pickupRadius = 2;
pickUpName = "Some NLS-22 Acid Sniper Canisters";
computeCRC = true;
};
//--------------------------------------------------------------------------
// Weapon
//--------------------------------------
datablock ShapeBaseImageData(NLS22AcidSniperImage) {
className = WeaponImage;
shapeFile = "weapon_sniper.dts";
mass = 10;
item = NLS22AcidSniper;
ammo = NLS22AcidSniperAmmo;
projectile = M1Bullet;
projectileType = TracerProjectile;
emap = true;
armThread = looksn;
//ClipStuff
ClipName = "NLS22AcidSniperClip";
ClipPickupName["NLS22AcidSniperClip"] = "A Few Boxes Of NLS-22 Acid Canisters";
ShowsClipInHud = 1;
ClipReloadTime = 4;
ClipReturn = 4;
InitialClips = 5;
//
//Challenges
HasChallenges = 1;
ChallengeCt = 8;
Challenge[1] = "NLS-22 Hunter\t100\t150\tNone";
Challenge[2] = "NLS-22 Expert\t200\t250\tNone";
Challenge[3] = "NLS-22 Master\t500\t500\tNone";
Challenge[4] = "NLS-22 God\t1000\t1000\tNone";
Challenge[5] = "NLS-22 Bronze Commendation\t2500\t10000\tNone";
Challenge[6] = "NLS-22 Silver Commendation\t5000\t25000\tNone";
Challenge[7] = "NLS-22 Gold Commendation\t10000\t50000\tNone";
Challenge[8] = "NLS-22 Titan Commendation\t25000\t75000\tNone";
GunName = "NLS-22 Acid Sniper Rifle";
//
RankRequire = $TWM2::RankRequire["M1"];
casing = ShellDebris;
shellExitDir = "1.0 0.3 1.0";
shellExitOffset = "0.15 -0.56 -0.1";
shellExitVariance = 15.0;
shellVelocity = 3.0;
stateName[0] = "Activate";
stateTransitionOnTimeout[0] = "ActivateReady";
stateTimeoutValue[0] = 0.5;
stateSequence[0] = "Activate";
stateSound[0] = ChaingunSwitchSound;
stateName[1] = "ActivateReady";
stateTransitionOnLoaded[1] = "Ready";
stateTransitionOnNoAmmo[1] = "NoAmmo";
stateName[2] = "Ready";
stateTransitionOnNoAmmo[2] = "NoAmmo";
stateTransitionOnTriggerDown[2] = "CheckWet";
stateName[3] = "Fire";
stateTransitionOnTimeout[3] = "Reload";
stateTimeoutValue[3] = 0.01;
stateFire[3] = true;
stateRecoil[3] = LightRecoil;
stateAllowImageChange[3] = false;
stateScript[3] = "onFire";
stateSound[3] = "M1FireSound";
stateName[4] = "Reload";
stateTransitionOnNoAmmo[4] = "NoAmmo";
stateTransitionOnTimeout[4] = "Ready";
stateTimeoutValue[4] = 0.9;
stateAllowImageChange[4] = false;
stateSequence[4] = "Reload";
stateName[5] = "NoAmmo";
stateTransitionOnAmmo[5] = "Reload";
stateSequence[5] = "NoAmmo";
stateTransitionOnTriggerDown[5] = "DryFire";
stateName[6] = "DryFire";
stateSound[6] = ChaingunDryFireSound;
stateTimeoutValue[6] = 1.0;
stateTransitionOnTimeout[6] = "NoAmmo";
stateName[7] = "WetFire";
stateSound[7] = PlasmaFireWetSound;
stateTimeoutValue[7] = 1.0;
stateTransitionOnTimeout[7] = "Ready";
stateName[8] = "CheckWet";
stateTransitionOnWet[8] = "WetFire";
stateTransitionOnNotWet[8] = "Fire";
};
datablock ItemData(NLS22AcidSniper) {
className = Weapon;
catagory = "Spawn Items";
shapeFile = "weapon_sniper.dts";
image = NLS22AcidSniperImage;
mass = 1.0;
elasticity = 0.0;
friction = 0.6;
pickupRadius = 2;
pickUpName = "a NLS-22 Acid Sniper Rifle";
computeCRC = true;
emap = true;
};
//Two images make the scope
datablock ShapeBaseImageData(NLS22AcidSniperScopeImage) : NLS22AcidSniperImage {
shapeFile = "turret_belly_barrell.dts";
offset = "0 0.25 0.25";
rotation = "1 0 0 180";
};
datablock ShapeBaseImageData(NLS22AcidSniperScopeImage2) : NLS22AcidSniperImage {
shapeFile = "turret_belly_barrell.dts";
offset = "0 0.3 0.25";
rotation = "1 0 0 0";
};
datablock ShapeBaseImageData(NLS22AcidSniperBarrelImage) : NLS22AcidSniperImage {
shapeFile = "weapon_elf.dts";
offset = "0 0.3 0";
rotation = "1 0 0 0";
};
function NLS22AcidSniperImage::onMount(%this,%obj,%slot) {
if(!$TWM2::AllowSnipers) {
bottomPrint(%obj.client, "The host has disabled sniper weapons.", 2, 2);
%obj.throwweapon(1);
%obj.throwweapon(0);
}
Parent::onMount(%this, %obj, %slot);
%obj.mountImage(NLS22AcidSniperScopeImage, 5);
%obj.mountImage(NLS22AcidSniperScopeImage2, 6);
%obj.mountImage(NLS22AcidSniperBarrelImage, 7);
}
function NLS22AcidSniperImage::onUnmount(%this,%obj,%slot) {
Parent::onUnmount(%this, %obj, %slot);
%obj.unmountImage(5);
%obj.unmountImage(6);
%obj.unmountImage(7);
}
function M1SniperRifleImage::onFire(%data, %obj, %slot) {
if(!$TWM2::AllowSnipers) {
bottomPrint(%obj.client, "The host has disabled sniper weapons.", 2, 2);
%obj.throwweapon(1);
%obj.throwweapon(0);
}
%p = Parent::onFire(%data, %obj, %slot);
}