construction-mod/scripts/MPM/MPM_base.cs
2025-06-05 12:37:16 +02:00

2321 lines
59 KiB
C#

//Give your avarage mpb unless enabled.. :)
$mpm::nukempb = 1; //Mpb's deploy with nukes
$mpm::targetenemies = 0; //Enemy targets/lasers can be targeted
$mpm::targetmpbs = 1; //Mpbs become a target when deployed.
$mpm_loads = 0;
$mpm_ae=0;
$mpm_ve=0;
$mpm_te=0;
$mpm_be=0;
$mpm_ne=0;
//Discourage damage payloads by putting them at end of list. >:D
exec("scripts/mpm/MpM_Ae.cs");
exec("scripts/mpm/MpM_Se.cs"); //Missile datablocks
exec("scripts/mpm/MpM_Te.cs"); //Telleporter Missile
exec("scripts/mpm/MpM_Ve.cs"); //Vehicle missile
exec("scripts/mpm/MpM_Be.cs"); //Multi payload missiles
if ($mpm_NE != 1)
{
$mpm_load[$mpm_loads] = Mpm_Nuke_Load;
$mpm_loads++;
$mpm_load[$mpm_loads] = Mpm_Nuke2_Load;
$mpm_loads++;
$mpm_load[$mpm_loads] = Mpm_Hole_Load;
$mpm_loads++;
$mpm_ne = 1;
}
//All missiles loaded so,
//Don't complain it seems to work perfectly :D
MpmMissile1.LifeTimeMs = -1;
Mpm_B_MIS.LifeTimeMs = -1;
Mpm_B_MIS1.LifeTimeMs = -1;
Mpm_B_MIS2.LifeTimeMs = -1;
Mpm_B_MIS3.LifeTimeMs = -1;
Mpm_B_MIS4.LifeTimeMs = -1;
datablock ItemData(Mpm_Nuke_Load):Mpm_Base_Load
{
cost = 150;
name = "[Weapon] Drain Bramage's, Attomic(tm) Nuke Cannon";
missile = MpmMissile1;
slot = 0;
};
datablock ItemData(Mpm_Nuke2_Load):Mpm_Base_Load
{
cost = 250;
name = "[Weapon] Arrow IV 150 kt Nuke";
missile = MpmMissile1;
slot = 0;
};
datablock ItemData(Mpm_Hole_Load):Mpm_Base_Load
{
cost = 200;
name = "[Weapon] Black Hole";
missile = MpmMissile1;
slot = 0;
};
datablock AudioProfile(LaserTargetSound) {
fileName = "fx/misc/red_alert_short.wav";
description = AudioClose3d;
preload = true;
effect = MotionSensorDeployEffect;
};
datablock TurretData(MpmTurret) : TurretDamageProfile
{
className = TurretBase;
catagory = "Turrets";
shapeFile = "turret_base_large.dts";
preload = true;
mass = 1.0; // Not really relevant
maxDamage = 2.25;
destroyedLevel = 2.25;
disabledLevel = 1.35;
explosion = TurretExplosion;
expDmgRadius = 15.0;
expDamage = 0.66;
expImpulse = 2000.0;
repairRate = 0.5;
emap = true;
thetaMin = 90;
thetaMax = 90;
isShielded = true;
energyPerDamagePoint = 50;
maxEnergy = 150;
rechargeRate = 0.31;
humSound = SensorHumSound;
pausePowerThread = true;
targetNameTag = 'Base';
targetTypeTag = 'Turret';
sensorData = TurretBaseSensorObj;
sensorRadius = TurretBaseSensorObj.detectRadius;
sensorColor = "0 212 45";
heatSignature = 1.0;
};
datablock TurretImageData(MpmBarrel)
{
shapeFile = "Turret_Muzzlepoint.dts";
item = PlasmaBarrelLargePack;
projectile = PlasmaBarrelBolt;
projectileType = LinearFlareProjectile;
usesEnergy = true;
fireEnergy = 1;
minEnergy = 1;
emap = true;
offset = "-0.7 -0.04 -0.4";
rotation = "0 1 0 90";
yawVariance = 30.0; // these will smooth out the elf tracking code.
pitchVariance = 360.0; // more or less just tolerances
// Turret parameters
activationMS = 1000;
deactivateDelayMS = 1500;
thinkTimeMS = 200;
degPerSecTheta = 5;
degPerSecPhi = 5;
attackRadius = 10000;
// State transitions
stateName[0] = "Activate";
stateTransitionOnNotLoaded[0] = "Dead";
stateTransitionOnLoaded[0] = "ActivateReady";
stateName[1] = "ActivateReady";
stateSequence[1] = "Activate";
stateSound[1] = PBLSwitchSound;
stateTimeoutValue[1] = 1;
stateTransitionOnTimeout[1] = "Ready";
stateTransitionOnNotLoaded[1] = "Deactivate";
stateTransitionOnNoAmmo[1] = "NoAmmo";
stateName[2] = "Ready";
stateTransitionOnNotLoaded[2] = "Deactivate";
stateTransitionOnTriggerDown[2] = "Fire";
stateTransitionOnNoAmmo[2] = "NoAmmo";
stateName[3] = "Fire";
stateTransitionOnTimeout[3] = "Reload";
stateTimeoutValue[3] = 0.15; //0.3
stateFire[3] = true;
stateRecoil[3] = LightRecoil;
stateAllowImageChange[3] = false;
stateSequence[3] = "Fire";
stateScript[3] = "onFire";
stateSound[3] = "";
stateName[4] = "Reload";
stateTimeoutValue[4] = 0.4; //0.8
stateAllowImageChange[4] = false;
stateSequence[4] = "Reload";
stateTransitionOnTimeout[4] = "Ready";
stateTransitionOnNotLoaded[4] = "Deactivate";
stateTransitionOnNoAmmo[4] = "NoAmmo";
stateName[5] = "Deactivate";
stateSequence[5] = "Activate";
stateDirection[5] = false;
stateTimeoutValue[5] = 1;
stateTransitionOnLoaded[5] = "ActivateReady";
stateTransitionOnTimeout[5] = "Dead";
stateName[6] = "Dead";
stateTransitionOnLoaded[6] = "ActivateReady";
stateName[7] = "NoAmmo";
stateTransitionOnAmmo[7] = "Reload";
stateSequence[7] = "NoAmmo";
};
datablock StaticShapeData(MpmTurretTarg) : StaticShapeDamageProfile
{
shapeFile = "Turret_Muzzlepoint.dts";
className = Target;
dynamicType = $TypeMasks::SensorObjectType;
heatSignature = 1;
//targetTypeTag = 'mtc';
sensorData = DeployedOutdoorTurretSensor;
maxDamage = 1000;
destroyedLevel = 200.20;
disabledLevel = 200.00;
};
datablock StaticShapeData(VisTarget) : StaticShapeDamageProfile
{
className = "target";
shapeFile = "reticle_bomber.dts";
};
datablock StaticShapeData(TurretArm) : StaticShapeDamageProfile
{
className = "crate";
shapeFile = "turret_base_large.dts";//"vehicle_air_hapc.dts";
};
datablock StaticShapeData(TurretLift) : StaticShapeDamageProfile
{
className = "crate";
shapeFile = "turret_base_mpb.dts";//"vehicle_air_hapc.dts";
};
datablock StaticShapeData(SelectionPad) : StaticShapeDamageProfile
{
className = "crate";
shapeFile = "station_inv_mpb.dts";//"vehicle_air_hapc.dts";
};
datablock TriggerData(nukepadTrigger)
{
tickPeriodMS = 500;
};
function SelectionPad::onDestroyed(%this, %obj, %prevState)
{
%obj.remTrigger();
Parent::onDestroyed(%this, %obj, %prevState);
%obj.schedule(500, "delete");
}
datablock ShapeBaseImageData(Supportl) {
shapeFile = "stackable2L.dts";
mountPoint = 3;
offset = "1.7 1.5 -2";
rotation = "1 0 0 90";
};
datablock ShapeBaseImageData(Supportr) {
shapeFile = "stackable2L.dts";
mountPoint = 2;
offset = "-1.7 1.5 -2";
rotation = "1 0 0 90";
};
datablock ShapeBaseImageData(SupportM1) {
shapeFile = "stackable2L.dts";
mountPoint = 3;
offset = "0 -2.8 0";
rotation = "1 0 0 90";
};
datablock ShapeBaseImageData(SupportM2) {
shapeFile = "stackable2L.dts";
mountPoint = 3;
offset = "0 -4.8 0";
rotation = "1 0 0 90";
};
datablock StaticShapeData(Baseb) : StaticShapeDamageProfile
{
className = "crate";
shapeFile = "stackable2L.dts";//"vehicle_air_hapc.dts";
};
datablock StaticShapeData(FrameS) : StaticShapeDamageProfile
{
className = "crate";
shapeFile = "vehicle_air_scout.dts";//"vehicle_air_hapc.dts";
};
datablock StaticShapeData(CBarrel) : StaticShapeDamageProfile
{
className = "crate";
shapeFile = "weapon_mortar.dts";//"vehicle_air_hapc.dts";
};
datablock StaticShapeData(MImage) : StaticShapeDamageProfile
{
className = "crate";
shapeFile = "bomb.dts";//"vehicle_air_hapc.dts";
};
datablock StaticShapeData(Frame) : StaticShapeDamageProfile
{
className = "crate";
shapeFile = "Vehicle_air_hapc.dts";//"vehicle_air_hapc.dts";
};
datablock StaticShapeData(BoosterM) : StaticShapeDamageProfile
{
className = "crate";
shapeFile = "Weapon_missile_projectile.dts";//"vehicle_air_hapc.dts";
};
datablock TurretData(BaseArmTurret) : TurretBaseLarge
{
className = TurretBase;
catagory = "Turrets";
shapeFile = "turret_base_large.dts";
preload = true;
mass = 1.0; // Not really relevant
maxDamage = 2.25;
destroyedLevel = 2.25;
disabledLevel = 1.35;
explosion = TurretExplosion;
expDmgRadius = 15.0;
expDamage = 0.66;
expImpulse = 2000.0;
repairRate = 0.5;
emap = true;
thetaMin = 0;
thetaMax = 180;
isShielded = true;
energyPerDamagePoint = 50;
maxEnergy = 150;
rechargeRate = 0.31;
humSound = SensorHumSound;
pausePowerThread = true;
canControl = true;
cmdCategory = "Tactical";
cmdIcon = CMDTurretIcon;
cmdMiniIconName = "commander/MiniIcons/com_turretbase_grey";
targetNameTag = 'Base';
targetTypeTag = 'Turret';
sensorData = TurretBaseSensorObj;
sensorRadius = TurretBaseSensorObj.detectRadius;
sensorColor = "0 212 45";
heatSignature = 1.0;
firstPersonOnly = true;
debrisShapeName = "debris_generic.dts";
debris = TurretDebris;
};
function GameBase::MakeTurret(%obj,%loc)
{
//TURRET
%turret = new Turret()
{
className = DeployedTurret;
dataBlock = MpmTurret;
maxdamage = 20;
};
%turret.SetTransform(%loc);
%turret.setSelfPowered();
%turret.mountImage("MpmBarrel",0,false);
%turret.team = %obj.team;
setTargetSensorGroup(%turret.getTarget(), %obj.team);
%turret.startfade(0,0,1);
//SIGN
%sign = new StaticShape(){
dataBlock = MpmTurretTarg;
};
%sign.team = 3;
%sign.setHeat(1);
%obj.mountObject(%sign, 4);
//setTargetSensorGroup(%sign.getTarget(),3);
%obj.signature = %sign;
%sign.owner = %obj;
%turret.aimtarget = %sign;
%turret.mpm_barrel_on();
}
function MpmTurret::onRemove(%this, %obj)
{
%obj.mpm_all_off(1);
Parent::onRemove(%this, %obj);
}
function GameBase::Mpm_Turret(%obj)
{
%turret = new Turret()
{
className = DeployedTurret;
dataBlock = MpmTurret;
maxdamage = 20;
};
%turret.SetTransform(VectorAdd(%obj.getTransform(),realvec(%obj,"0 1.5 -0.5")) SPC %obj.getRotation());
//%obj.MountObject(%turret,5);
%turret.setSelfPowered();
%turret.mountImage("MpmBarrel",0,false);
%turret.team = %obj.team;
%turret.mpb = %obj;
setTargetSensorGroup(%turret.getTarget(), %obj.team);
%turret.mpm_all_on();
%turret.playThread(1,"activate");
%turret.addToMPMGroup(1);
return %turret;
}
function MpmTurret::selectTarget(%this, %turret)
{
%turretTarg = %turret.getTarget();
if(%turretTarg == -1)
return;
if (Isobject(%turret.aimtarget))
{
if (!IsObject(%turret.aimtarget.source) && %turret.canfire)
{
%turret.Mpm_CycleTargets("");
return "";
}
%turret.setTargetObject(%turret.aimtarget);
if (!isObject(%turret.leftpad))
return;
%tdir = VectorNormalize(VectorSub(%turret.aimtarget.getTransform(),%turret.getMuzzlePoint(0)));
%vec = "0 1 0";
%rot = %turret.getSlotRotation(0);
%dir = validateVal(MatrixMulVector("0 0 0" SPC %rot ,%vec));
%diff = VectorDot(%tdir,%dir);
if (%diff > 0.9 && IsObject(%turret.leftpad.getMountedObject(0)) && %turret.canfire)
{
%plyr = %turret.leftpad.getMountedObject(0);
%tdir = VectorNormalize(VectorSub(%turret.aimtarget.targetloc,%plyr.getEYePoint()));
if (!Isobject(%turret.lvistarget))
{
%vistar = new StaticShape()
{
dataBlock = VisTarget;
};
%turret.Play3D(MobileBaseStationdeploySound);
%turret.lvistarget=%vistar;
}
%turret.lvistarget.setScale("0.01 0.01 0.01");
%rot = fullrot(VectorScale(%tdir,-1),"0 0 1");
%pos = VectorAdd(%plyr.getEYePoint(),VectorScale(%tdir,0.5));
%turret.lvistarget.setTransform(%pos SPC %rot);
}
else if (IsObject(%turret.lvistarget))
{
%turret.lvistarget.delete();
}
}
}
function Mpm_Beacon::onDestroyed(%this, %obj, %prevState)
{
Parent::onDestroyed(%this, %obj, %prevState);
%obj.mpm_off_all(1);
%obj.schedule(1500,"delete");
}
function MpmBarrel::onFire( %data, %obj, %slot )
{
//%obj.firempmNow();
}
function GameBase::FireMPMNow(%obj)
{
%tdir = VectorNormalize(VectorSub(%obj.aimtarget.getTransform(),%obj.getMuzzlePoint(0)));
%vec = "0 1 0";
%rot = %obj.getSlotRotation(0);
%dir = validateVal(MatrixMulVector("0 0 0" SPC %rot ,%vec));
%diff = vectorDot(%tdir,%dir);
if (%obj.canfire && IsObject(%obj.rightpad.getMountedObject(0)) && %diff > 0.9)
{
%data = $mpm_load[%obj.load];
if (%data.slot == 1||%data.slot == 2)
%obj.Lauch_mpm(%data.slot);
else if (%data.slot == 3)
{
%obj.Lauch_mpm(1);
%obj.Lauch_mpm(2);
}
else if (%data.slot == 4)
{
%slot=%obj.HasLoad(4);
if (%slot == 3)
%obj.Lauch_mpm(Mfloor(GetRandom()*2+1));
else if (%slot == 2 || %slot == 1)
%obj.Lauch_mpm(%slot);
}
else
%obj.Lauch_mpm(0);
}
}
function GameBase::Lauch_mpm(%obj,%slot)
{
%data = $mpm_load[%obj.load];
%offset = realvec(%obj.barrel,"0 -2 0");
if (%slot == 1)
%barrelt = VectorAdd(%obj.rightbarrel.getWorldBoxCenter(),%offset);
else if (%slot == 2)
%barrelt = VectorAdd(%obj.leftbarrel.getWorldBoxCenter(),%offset);
else
%barrelt = %obj.barrel.getTransform();
%up = Realvec(%obj,"0 0 1");
%start = VectorAdd(%barrelt,VectorScale(%up,5));
%end = %obj.aimtarget.targetloc;
%forward = VectorNormalize(VectorCross(VectorCross(%up,VectorSub(%end,%start)),%up));
if (%data.offset !$= "")
%end = VectorAdd(%end,VectorAdd(VectorScale(%forward,GetWord(%data.offset,0)),VectorScale(%up,GetWord(%data.offset,1))));
%missileblock = %data.missile;
%solution = mpm_calc(%start,%end,%up,%missileblock);
if (%solution != -1)
{
if (%obj.aimtarget.source.player.client)
{
bottomPrint( %obj.aimtarget.source.player.client, "Missile Lauched at your target by:" @ %obj.launcher.namebase, 5, 3);
%obj.aimtarget.source.firedat++;
}
%ltime = GetWord(%solution,0)*1000;
%time = GetWord(%solution,1)*1000;
%loc = GetWord(%solution,2);
%vector = GetWords(%solution,3,5);
%a = GetWord(%solution,6);
%p = Launch_Mpm(%start,%up,"0 0 0",%ltime+200,%missileblock);
%p.team = %obj.team;
%p.source = %obj;
%p.traject = %start SPC %up SPC %loc SPC %a SPC %vector SPC %time;
%p.load = %data;
%p.targetlocation = %end;
%p.owner = %obj.launcher;
%data.schedule(%ltime,"Stage2",%p);
%data.Stage1(%p);
if (%p.owner.player.getObjectMount().base == %obj)
obsproj(%p,%p.owner);
%obj.ammo-= %data.cost;
%dist = VectorDist(%start,%end);
%obj.fuel-= mFloor(%dist/10);
if (%obj.ammo <= 0)
%obj.ammo = 1;
if (%obj.fuel <= 0)
%obj.fuel = 1;
%obj.mpm_load_off(0,%slot+1);
%obj.schedule(30000,"mpm_load_on",%slot+1);
}
}
function obsproj(%p,%player)
{
%client = %player;
if ( !isObject( %client.comCam ) )
{
%client.comCam = new Camera()
{
dataBlock = CommanderCamera;
};
MissionCleanup.add(%client.comCam);
commandToClient(%client, 'ControlObjectResponse', true, getControlObjectType(%p,%client.player));
messageClient(%colObj.client, 'CloseHud', "", 'inventoryScreen');
%client.setControlObject(%client.comCam);
commandToClient(%client, 'CameraAttachResponse', true);
}
%client.comCam.setTransform(%p.getTransform());
%client.comCam.setOrbitMode(%p,%p.getTransform(),0,20,-20);
%client.moveprojectile = %p;
}
function GameData::Armer(%base,%target)
{
%arm = new StaticShape()
{
dataBlock = TurretArm;
};
%arm.setScale("0.1 0.1 0.1");
%arm.playThread(0,"activate");
%base.mountObject(%arm,0);
return(%arm);
}
//turret
// 1barm
// 0base
// 0arm
// 1rbase
// 0barrel
// 0missile
// 2leftjoint
// 3rightjoint
// 1frame
// 3leftarm
// 1leftbarrel
// 0leftmissile
// 4rightarm
// 1rightbarrel
// 0rightmissile
//
function GameBase::Mpm_Barrel_on(%obj)
{
if (!IsObject(%obj.barrel))
{
%arm = new StaticShape()
{
dataBlock = TurretArm;
};
%arm.startFade(0,0,1);
%arm.playThread(1,"elevate");
%arm.stopThread(1);
%arm.setScale("0.1 0.1 0.1");
%obj.mountObject(%arm,0);
%barrel = new StaticShape()
{
dataBlock = CBarrel;
};
%barrel.startFade(0,0,1);
%arm.mountObject(%barrel,0);
%barrel.setScale("8 8 8");
%obj.barrel = %barrel;
%barrel.arm = %arm;
%barrel.turret = %obj;
}
%obj.barrel.startfade(1000,0,0);
}
function GameBase::Mpm_Barrel_off(%obj,%del)
{
%obj.remfromMpmGroup(1);
if (IsObject(%obj.barrel))
{
if (!%del)
{
%obj.barrel.startfade(1000,0,1);
}
else if (%del)
{
%obj.barrel.schedule(1000,"delete");
%obj.barrel.arm.schedule(1000,"delete");
}
}
}
function GameBase::Mpm_Support_on(%obj)
{
if (!IsObject(%obj.barrel.frame))
{
if (%disabled)
{
%basearm = new StaticShape()
{
dataBlock = TurretArm;
};
%basearm.startFade(0,0,1);
%basearm.setScale("0.1 0.1 0.1");
%basearm.playThread(0,"activate");
%basearm.setThreaddir(0,false);
%obj.mountObject(%basearm,1);
%base = new StaticShape()
{
dataBlock = baseb;
};
%base.startFade(0,0,1);
%base.setScale("4.5 4.5 2");
%basearm.mountObject(%base,0);
%obj.base = %base;
%base.arm = %basearm;
%rbase = new StaticShape()
{
dataBlock = baseb;
};
%rbase.startFade(0,0,1);
%rbase.setScale("4.5 4.5 1.9");
%obj.barrel.arm.mountObject(%rbase,1);
%obj.rbase = %rbase;
}
%ghost = new StaticShape()
{
dataBlock = baseb;
};
%ghost.startFade(0,0,1);
%ghost.setScale("1.5 1.5 4");
%obj.barrel.arm.mountObject(%ghost,1);
%obj.barrel.ghost = %ghost;
%ghost.base = %obj;
%frame = new StaticShape()
{
dataBlock = frame;
};
%frame.startFade(0,0,1);
%frame.setScale("0.1 0.1 0.1");
%obj.barrel.MountObject(%frame,1);
%obj.barrel.frame = %frame;
%leftarm = new StaticShape()
{
dataBlock = TurretArm;
};
%leftarm.startFade(0,0,1);
%leftarm.setScale("0.1 0.1 0.1");
%leftarm.playThread(0,"activate");
%leftarm.setThreadDir(0,false);
%leftarm.playThread(1,"elevate");
%frame.MountObject(%leftarm,3);
%frame.leftarm = %leftarm;
%rightarm = new StaticShape()
{
dataBlock = TurretArm;
};
%rightarm.startFade(0,0,1);
%rightarm.setScale("0.1 0.1 0.1");
%rightarm.playThread(0,"activate");
%rightarm.setThreadDir(0,false);
%rightarm.playThread(1,"elevate");
%frame.MountObject(%rightarm,4);
%frame.rightarm = %rightarm;
%leftpad = new StaticShape()
{
dataBlock = SelectionPad;
};
//%leftpad.startFade(0,0,1);
%leftpad.playThread(0,"deploy");
%leftpad.setThreaddir(0,false);
%leftpad.PlayThread(1,"Activate1");
%leftpad.setThreadDir(1,false);
%obj.leftpad=%leftpad;
%leftpad.base = %obj;
//%leftarm.MountObject(%leftpad,0);
%leftpad.setTransform(VectorAdd(%obj.getTransform(),realvec(%obj,"-4.5 -2.5 2.2")) SPC rotAdd(%obj.getRotation(),"0 0 1" SPC 1.56));
%leftpad.setScale("1 1 1");
%rightpad = new StaticShape()
{
dataBlock = SelectionPad;
};
//%rightpad.startFade(0,0,1);
%rightpad.playThread(0,"deploy");
%rightpad.setThreaddir(0,false);
%obj.rightpad=%rightpad;
%rightpad.base = %obj;
%rightpad.PlayThread(1,"Activate1");
%rightpad.setThreadDir(1,false);
//%rightarm.MountObject(%rightpad,0);
%rightpad.setTransform(VectorAdd(%obj.getTransform(),realvec(%obj,"4.5 -2.5 2.2")) SPC rotAdd(%obj.getRotation(),"0 0 -1" SPC 1.56));
%rightpad.setScale("1 1 1");
%leftbarrel = new StaticShape()
{
dataBlock = CBarrel;
};
%leftbarrel.startFade(0,0,1);
%leftbarrel.SetScale("5 4 5");
%leftarm.MountObject(%leftbarrel,1);
%leftarm.barrel = %leftbarrel;
%obj.leftbarrel = %leftbarrel;
%leftbarrel.arm = %leftarm;
%rightbarrel = new StaticShape()
{
dataBlock = CBarrel;
};
%rightbarrel.startFade(0,0,1);
%rightbarrel.SetScale("5 4 5");
%rightarm.MountObject(%rightbarrel,1);
%rightarm.barrel = %rightbarrel;
%obj.rightbarrel = %rightbarrel;
%rightbarrel.arm = %rightarm;
}
//%obj.base.startfade(1000,0,0);
//%obj.rbase.startfade(1000,0,0);
%obj.rightbarrel.startfade(1000,0,0);
%obj.leftbarrel.startfade(1000,0,0);
%obj.rightpad.setThreaddir(0,true);
%obj.leftpad.setThreaddir(0,true);
%obj.rightpad.addtrigger();
%obj.leftpad.addtrigger();
%obj.leftbarrel.arm.setThreadDir(0,true);
%obj.rightbarrel.arm.setThreadDir(0,true);
//%obj.base.arm.setThreaddir(0,true);
%obj.barrel.mountImage("Supportr",2,true);
%obj.barrel.mountImage("Supportl",3,true);
%obj.rightbarrel.mountImage("SupportM1",2,true);
%obj.rightbarrel.mountImage("SupportM2",3,true);
%obj.leftbarrel.mountImage("SupportM1",2,true);
%obj.leftbarrel.mountImage("SupportM2",3,true);
MPM_AddLoadArms(%obj);
}
function GameBase::Mpm_Support_off(%obj,%del)
{
if (IsObject(%obj.barrel.frame))
{
MPM_RemLoadArms(%obj,%del);
if (isObject(%obj.rightpad))
%obj.rightpad.remtrigger();
if (isObject(%obj.leftpad))
%obj.leftpad.remtrigger();
if (!%del)
{
//%obj.base.startfade(1000,0,1);
//%obj.rbase.startfade(1000,0,1);
%obj.rightbarrel.startfade(1000,0,1);
%obj.leftbarrel.startfade(1000,0,1);
%obj.rightpad.setThreaddir(0,false);
%obj.leftpad.setThreaddir(0,false);
%obj.rightpad.setThreaddir(1,false);
%obj.leftpad.setThreaddir(1,false);
if (%obj.leftpad.getMountNodeObject(%i)) {
%passenger = %obj.leftpad.getMountNodeObject(%i);
%passenger.unmount();
}
if (%obj.rightpad.getMountNodeObject(%i)) {
%passenger = %obj.rightpad.getMountNodeObject(%i);
%passenger.unmount();
}
%obj.leftbarrel.arm.setThreadDir(0,false);
%obj.rightbarrel.arm.setThreadDir(0,false);
%obj.barrel.unmountImage(2);
%obj.barrel.unmountImage(3);
%obj.rightbarrel.unmountImage(2);
%obj.rightbarrel.unmountImage(3);
%obj.leftbarrel.unmountImage(2);
%obj.leftbarrel.unmountImage(3);
}
else if (%del)
{
//%obj.base.schedule(1000,"delete");
//%obj.base.arm.schedule(1000,"delete");
//%obj.rbase.schedule(1000,"delete");
%obj.barrel.frame.schedule(1000,"delete");
%obj.barrel.frame.leftarm.schedule(1000,"delete");
%obj.barrel.frame.rightarm.schedule(1000,"delete");
%obj.leftpad.schedule(1000,"delete");
%obj.rightpad.schedule(1000,"delete");
%obj.leftpad.remtrigger();
%obj.rightpad.remtrigger();
%obj.leftbarrel.schedule(1000,"delete");
%obj.rightbarrel.schedule(1000,"delete");
%obj.barrel.ghost.schedule(1000,"delete");
}
}
}
//Litle console spam remover.
function SelectionPad::hasDismountOverrides(%data, %obj)
{
return false;
}
function GameBase::Addtrigger(%obj)
{
if (!IsObject(%obj.trigger))
{
%trigger = new Trigger()
{
dataBlock = nukepadTrigger;
polyhedron = "-0.75 0.75 0.1 1.5 0.0 0.0 0.0 -1.5 0.0 0.0 0.0 2.3";
};
MissionCleanup.add(%trigger);
%trigger.setTransform(%obj.getTransform());
%trigger.pad= %obj;
%trigger.mainObj = %obj;
%trigger.disableObj = %obj;
%obj.trigger = %trigger;
}
}
function GameBase::RemTrigger(%obj)
{
if (IsObject(%obj.trigger))
%obj.trigger.delete();
}
function GameBase::Mpm_Load_on(%obj,%slot)
{
if (!IsObject(%obj.barrel.missile))
{
%missile = new StaticShape()
{
dataBlock = MImage;
};
%missile.startFade(0,0,1);
%missile.setScale("4 8 4");
%obj.barrel.MountObject(%missile,0);
%obj.barrel.missile=%missile;
%leftmissile = new StaticShape()
{
dataBlock = BoosterM;
};
%leftmissile.startFade(0,0,1);
%leftmissile.setScale("10 23 10");
%obj.leftbarrel.MountObject(%leftmissile,0);
%obj.leftbarrel.missile=%leftmissile;
%rightmissile = new StaticShape()
{
dataBlock = BoosterM;
};
%rightmissile.startFade(0,0,1);
%rightmissile.setScale("10 23 10");
%obj.rightbarrel.MountObject(%rightmissile,0);
%obj.rightbarrel.missile=%rightmissile;
}
if (%slot == 1 || %slot == 0)
{
%obj.barrel.missile.setScale("4 8 4");
%obj.barrel.missile.startfade(1000,0,0);
}
if (%slot == 2 || %slot == 0)
{
%obj.rightbarrel.missile.startfade(1000,0,0);
%obj.rightbarrel.missile.setScale("10 23 10");
}
if (%slot == 3 || %slot == 0)
{
%obj.leftbarrel.missile.startfade(1000,0,0);
%obj.leftbarrel.missile.setScale("10 23 10");
}
if (%slot != 0)
%obj.missile[%slot-1] = 1;
else
{
%obj.missile[0] = 1;
%obj.missile[1] = 1;
%obj.missile[2] = 1;
}
}
function GameBase::Mpm_Load_off(%obj,%del,%slot)
{
if (IsObject(%obj.barrel.missile))
{
if (%slot == 1 || %slot == 0)
{
%obj.barrel.missile.startfade(0,0,1);
%obj.barrel.missile.setScale("1 1 1");
}
if (%slot == 2 || %slot == 0)
{
%obj.rightbarrel.missile.startfade(0,0,1);
%obj.rightbarrel.missile.setScale("1 1 1");
}
if (%slot == 3 || %slot == 0)
{
%obj.leftbarrel.missile.startfade(0,0,1);
%obj.leftbarrel.missile.setScale("1 1 1");
}
if (%del)
{
%obj.barrel.missile.schedule(1000,"delete");
%obj.rightbarrel.missile.schedule(1000,"delete");
%obj.leftbarrel.missile.schedule(1000,"delete");
}
}
if (%slot != 0)
%obj.missile[%slot-1] = 0;
else
{
%obj.missile[0] = 0;
%obj.missile[1] = 0;
%obj.missile[2] = 0;
}
}
function GameBase::HasLoad(%obj,%slot)
{
if (%slot < 3)
return (%obj.missile[%slot]==1);
else if (%slot == 3)
return (%obj.missile[1]==1 && %obj.missile[2]==1);
else if (%slot == 4)
return (%obj.missile[1]==1) +(%obj.missile[2]==1)*2;
}
function GameBase::Mpm_All_on(%obj)
{
%obj.mpm_barrel_on();
%obj.mpm_support_on();
%obj.mpm_load_on();
}
function GameBase::Mpm_All_off(%obj,%del)
{
%obj.mpm_barrel_off(%del);
%obj.mpm_support_off(%del);
%obj.mpm_load_off(%del);
if (isObject(%obj.aimtarget))
%obj.aimtarget.delete();
if (isObject(%obj.lvistarge))
%obj.lvistarget.delete();
}
function nukepadTrigger::onEnterTrigger(%data, %obj, %colObj)
{
%pad = %obj.pad;
SelectionPadmount(%pad,%colObj);
}
function nukepadTrigger::onLeaveTrigger(%data, %obj, %colObj)
{
}
function nukepadTrigger::stationTriggered(%data, %obj, %isTriggered)
{
}
function nukepadTrigger::onTickTrigger(%data, %obj)
{
}
function SelectionPadmount(%obj,%col)
{
if (%col.getClassName() !$= "Player" || %obj.base.team != %col.team|| IsObject(%obj.getMountedObject(0)))
return;
%base = %obj.base;
%obj.mountObject(%col,0);
%obj.mVehicle=%col;
%obj.setThreadDir(1,true);
//if (%col.getMountedImage(2) && %col.getMountedImage(2).getName() $= TurretMpm_Anti_DeployableImage)
//{
//%obj.base.ammo+= 20;
//%col.getMountedImage(2).used = 0;
//%col.decInventory(TurretMpm_Anti_Deployable, 1);
//%col.UnMountImage(2);
//}
if (%base.leftpad == %obj)
{
bottomPrint( %col.client, "Welcome to the targetting pad\n Use pack/Healthkid key to cycle targets / active scan target.\n Targets are made by deploying 3 beacons out of the pack you just got.", 10, 3);
//if (%col.getMountedImage(2).getName() != MPM_BeaconPackImage)
//{
%col.setInventory(MPM_BeaconPack,1);
%col.getMountedImage(2).used = 0;
//}
}
if (%base.rightpad == %obj)
{
bottomPrint( %col.client, "Welcome to the launch pad\n Use pack/Healthkid key to lauch / cycle payload.\n Missle cost can be paid by wearing an anti-missile turret on this pad.", 10, 3);
}
}
function PressButton(%obj,%player,%pad,%button)
{
%base = %obj.base;
%list = GetMPMTargetList(%base.team,%base.getTransform(),100,5000);
if (!%base.ammo)
%base.ammo = 50;
if (!%base.fuel)
%base.fuel = 20;
if (%pad == 0)
{
if (%button == 0)
%base.Mpm_CycleTargets(%list,1);
else if (%button == 1)
{
if(%base.canfire != 1)
{
bottomPrint( %player.client, '\c2 [WARNING] \c0 cannot scan because no target is selected.\n Select a target', 10, 2);
}
else
{
obspulse(%base.aimtarget.targetloc,%player.client,5000);
pulse(%base.aimtarget.targetloc);
Mpm_report_scan(%player,%base.aimtarget.targetloc);
%reported = 1;
}
}
if (!%reported)
%base.Mpm_report_targets(%player,%list);
}
else if (%pad == 1)
{
if (%button == 0)
{
%dist = isObject(%obj.target) ? VectorDist(%obj.target.targetloc,%obj.getTransform()) : 0;
if (%base.ammo < $mpm_load[%base.load].cost)
{
bottomPrint( %player.client, "\c2 [WARNING] \c0 cannot fire because the current payload needs more ammo.\n Bring an MPM-Ammo pack (from pack dispenser) to one of the load arms\n to get more ammo.[Needs:" SPC $mpm_load[%base.load].cost SPC "Current:" SPC %base.ammo@"]", 10, 3);
}
else if(%base.fuel < mFloor(%dist/10))
{
bottomPrint( %player.client, "\c2 [WARNING] \c0 cannot fire because the current distance requires more fuel.\n Bring an MPM-Fuel pack (from pack dispenser) to one of the load arms\n to get more ammo.[Needs:" SPC mFloor(%dist/10) SPC "Current:" SPC %base.fuel@"]", 10, 3);
}
else if(%base.canfire != 1)
{
bottomPrint( %player.client, "\c2 [WARNING] \c0 cannot fire because no target is selected.\n Select a target on the left pad.", 10, 2);
}
else if(IsObject($mpm_load[%base.load].vehicle) && !vehicleCheck($mpm_load[%base.load].vehicle, %base.team))
{
bottomPrint( %player.client, "\c2 [WARNING] \c0 cannot fire because Spawned Vehicle will exceed maximum.", 10, 1);
}
else if(!%base.HasLoad($mpm_load[%base.load].slot))
{
bottomPrint( %player.client, "\c2 [WARNING] \c0 cannot fire because the current missile barrel is reloading.", 10, 1);
}
else
{
%base.launcher = %player.client;
%base.firempmNow();
}
}
else if (%button == 1)
{
%base.Mpm_CycleLoad();
%base.Mpm_report_targets(%player,%list);
}
}
}
function GameBase::Mpm_CycleTargets(%obj,%list,%mod)
{
%obj.targetselection+=%mod;
if (%list $= "")
{
%obj.set_mpm_target();
%obj.targetselection = 0;
}
else
{
%count = getWordCount(%list);
if (%obj.targetselection > %count)
{
%obj.targetselection = 0;
%obj.set_mpm_target();
}
else if (%obj.targetselection < 0)
{
%obj.targetselection = %count;
%target = getWord(%list,%obj.targetselection-1);
%dist = VectorDist(%target.targetloc,%obj.getTransform());
%obj.set_mpm_target(%target);
}
else
{
%target = getWord(%list,%obj.targetselection-1);
%obj.set_mpm_target(%target);
}
}
}
function GameBase::Mpm_CycleLoad(%obj)
{
%obj.load++;
if (%obj.load >= $mpm_loads || %obj.load < 0)
%obj.load=0;
}
function GameBase::Mpm_report_targets(%obj,%plyr,%list)
{
%selection=%obj.targetselection;
if (%obj.load $= "")
%obj.load = 0;
%load = %obj.load;
%count = getWordCount(%list);
%dist = VectorDist(%obj.aimtarget.targetloc,%obj.getTransform());
%loadname = $mpm_load[%load].name;
%loadcost = $mpm_load[%load].cost;
if (%dist > 1000)
%distname = "(distance:" @ mFloor(%dist/100)/10 @ "km)";
else
%distname = "(distance:" @ mFloor(%dist/10)*10 @ "m)";
if (isObject(%obj.aimtarget.source.player.client))
%selectionn = %selection SPC "(" @ %obj.aimtarget.source.player.client.nameBase @ "\'s Laser)";
else if (isObject(%obj.aimtarget.source) && %obj.aimtarget.source.getDatablock().getName() $= "MpmTurret")
{
if (%obj.aimtarget.source.mpb.team != %plyr.team)
%selectionn = %selection SPC "(Enemy MPB)";
else
%selectionn = %selection SPC "(Friendly MPB)";
}
else
%selectionn = %selection SPC "(" @ %obj.aimtarget.source.ownername @ "\'s Target)";
if (%count == 0)
%target = "No targetable targets found";
else
if (%selection == 0)
%target = "None /" SPC %count;
else
%target = %selectionn SPC %distname SPC "/" SPC %count;
bottomPrint( %plyr.client, "Target:"SPC %target SPC"\n Payload:"SPC %loadname SPC"\n Payload cost/current => ammo:"SPC %loadcost SPC "/" SPC %obj.ammo SPC "fuel:" SPC mFloor(%dist/10) SPC "/" SPC %obj.fuel, 10, 3);
}
function Mpm_report_scan(%plyr,%pos)
{
%result = pulsescan(%pos,%plyr.team,50);
%line1 = " [Friendly]/[Enemy]\n";
%line2 = "players : ["@ GetWord(%result,0) @"]/["@ GetWord(%result,1) @"]\n";
%line3 = "vehicles: ["@ GetWord(%result,2) @"]/["@ GetWord(%result,3) @"]\n";
bottomPrint( %plyr.client,%line1 @ %line2 @ %line3 , 10, 3);
}
function SelectionPad::playerDismounted(%data, %obj, %player)
{
%obj.setThreadDir(1,false);
}
function GameBase::set_mpm_target(%obj,%target)
{
if (!Isobject(%obj.aimtarget))
{
//SIGN
%sign = new StaticShape(){
dataBlock = MpmTurretTarg;
};
%sign.team = 3;
%sign.setHeat(1);
//setTargetSensorGroup(%sign.getTarget(),3);
%sign.owner = %obj;
%obj.aimtarget = %sign;
}
if (!Isobject(%target))
{
%pos = VectorAdd(%obj.getMuzzlePoint(0),realvec(%obj,"0 3 0")); //Changed target offset to 3
%obj.aimtarget.setTransform(%pos SPC "1 0 0 0");
%obj.aimtarget.targetloc = %pos;
%obj.canfire = 0;
}
else
{
%pos = %target.targetloc ? %target.targetloc : %target.getTransform();
%baseloc = %obj.getMuzzlePoint(0);
%offset = VectorScale(VectorNormalize(VectorSub(%pos,%baseloc)),3);
%up = realvec(%obj,"0 0 1");
%offset = VectorScale(VectorNormalize(VectorCross(VectorCross(%up,%offset),%up)),3);
%obj.aimtarget.setTransform(VectorAdd(%baseloc,%offset) SPC "1 0 0 0");
%obj.aimtarget.source=%target;
%obj.aimtarget.targetloc = %pos;
%obj.canfire = 1;
}
%obj.Play3D(MobileBaseStationUndeploySound);
}
////////////////////////////////LOADING STUFF///////////////////////////
datablock ShapeBaseImageData(MpmFuelPackImage) {
mass = 20;
emap = true;
shapeFile = "stackable4l.dts";
item = MpmFuelPack;
mountPoint = 1;
offset = "0 -0.18 -0.5";
heatSignature = 0;
stateName[0] = "Idle";
stateTransitionOnTriggerDown[0] = "Activate";
stateName[1] = "Activate";
stateScript[1] = "onActivate";
stateTransitionOnTriggerUp[1] = "Idle";
isLarge = true;
maxDepSlope = 360;
deploySound = ItemPickupSound;
minDeployDis = 0.5;
maxDeployDis = 50.0;
};
datablock ShapeBaseImageData(MpmFuelPackImage1):MpmFuelPackImage
{
offset = "0 -0.75 0.25";
};
datablock ItemData(MpmFuelPack) {
className = Pack;
catagory = "Deployables";
shapeFile = "stackable4l.dts";
mass = 5.0;
elasticity = 0.2;
friction = 0.6;
pickupRadius = 1;
rotate = true;
image = "MpmFuelPackImage";
pickUpName = "a Missile Fuel pack";
heatSignature = 0;
emap = true;
};
datablock ShapeBaseImageData(MpmAmmoPackImage) {
mass = 20;
emap = true;
shapeFile = "bomb.dts";
item = MpmAmmoPack;
mountPoint = 1;
offset = "0 -0.18 -0.5";
rotation = "1 0 0 90";
heatSignature = 0;
stateName[0] = "Idle";
stateTransitionOnTriggerDown[0] = "Activate";
stateName[1] = "Activate";
stateScript[1] = "onActivate";
stateTransitionOnTriggerUp[1] = "Idle";
isLarge = true;
maxDepSlope = 360;
deploySound = ItemPickupSound;
minDeployDis = 0.5;
maxDeployDis = 50.0;
};
datablock ShapeBaseImageData(MpmAmmoPackImage1):MpmAmmoPackImage
{
shapeFile = "bomb.dts";
offset = "0 -0.75 1";
rotation = "1 0 0 90";
};
datablock ItemData(MpmAmmoPack) {
className = Pack;
catagory = "Deployables";
shapeFile = "bomb.dts";
mass = 5.0;
elasticity = 0.2;
friction = 0.6;
pickupRadius = 1;
rotate = true;
image = "MpmAmmoPackImage";
pickUpName = "a Missile Ammo pack";
heatSignature = 0;
emap = true;
};
function MpmAmmoPack::onPickup(%this, %obj, %shape, %amount) {
// created to prevent console errors
}
function MpmAmmoPackImage::testNoSurfaceInRange(%item, %plyr)
{
return (!Deployables::searchView(%plyr, $MaxDeployDistance, $TypeMasks::StaticShapeObjectType)) || (!%item.surface.isLoadClamp || %item.surface.loading);
}
function MpmAmmoPackImage::onDeploy(%item, %plyr, %slot)
{
MPM_LoadArmin(%item.surface);
%item.surface.mountImage(MpmAmmoPackImage1,0);
%item.surface.base.ammo += 10;
%plyr.decInventory(MpmAmmoPack, 1);
%plyr.UnMountImage(2);
}
function MpmFuelPack::onPickup(%this, %obj, %shape, %amount) {
// created to prevent console errors
}
function MpmFuelPackImage::testNoSurfaceInRange(%item, %plyr)
{
return (!Deployables::searchView(%plyr, $MaxDeployDistance, $TypeMasks::StaticShapeObjectType)) || (!%item.surface.isLoadClamp || %item.surface.loading);
}
function MpmFuelPackImage::onDeploy(%item, %plyr, %slot)
{
MPM_LoadArmin(%item.surface);
%item.surface.mountImage(MpmFuelPackImage1,0);
%item.surface.base.fuel += 10;
%plyr.decInventory(MpmFuelPack, 1);
%plyr.UnMountImage(2);
}
function MPM_AddLoadArms(%obj)
{
///baseb
if (!isobject(%obj.loadarm1))
{
%rightarm = new StaticShape()
{
dataBlock = TurretLift;
scale = "0.25 0.5 0.8";
};
%rightarm.playThread(0,"activate");
%rightarm.playThread(1,"deploy");
%rightarm.playThread(2,"Elevate");
%rightClamp = new StaticShape()
{
dataBlock = baseb;
scale = "0.5 0.5 1";
};
%rightclamp.isLoadClamp = 1;
%rightclamp.arm = %rightArm;
%rightClamp.base = %obj;
%rightarm.clamp = %rightClamp;
%rightarm.MountObject(%rightClamp,0);
%pos = %obj.getTransform();
%rot = rotadd(rotadd(rotadd(GetWords(%pos,3,6),"0 1 0" SPC $pi/2),"0 0 1" SPC $pi/2),"1 0 0" SPC -1*$pi/4);
%offset = RealVec(%obj,"-2.0 0.70 1.5");
//%offset = RealVec(%obj,"-10 0 1");
%rightarm.setTransform(VectorAdd(%pos,%offset) SPC %rot);
%obj.loadarm1 = %rightarm;
}
if (!isobject(%obj.loadarm2))
{
%leftarm = new StaticShape()
{
dataBlock = TurretLift;
scale = "0.25 0.5 0.8";
};
%leftarm.playThread(0,"activate");
%leftarm.playThread(1,"deploy");
%leftarm.playThread(2,"Elevate");
%leftClamp = new StaticShape()
{
dataBlock = baseb;
scale = "0.5 0.5 1";
};
%leftclamp.isLoadClamp = 1;
%leftclamp.arm = %leftArm;
%leftClamp.base = %obj;
%leftarm.clamp = %leftClamp;
%leftarm.MountObject(%leftClamp,0);
%pos = %obj.getTransform();
%rot = rotadd(rotadd(rotadd(GetWords(%pos,3,6),"0 1 0" SPC -1*$pi/2),"0 0 1" SPC -1*$pi/2),"1 0 0" SPC -1*$pi/4);
%offset = RealVec(%obj,"2.0 0.70 1.5");
//%offset = RealVec(%obj,"-10 0 1");
%leftarm.setTransform(VectorAdd(%pos,%offset) SPC %rot);
%obj.loadarm2 = %leftarm;
}
MPM_LoadArmOut(%obj.loadarm1.clamp);
MPM_LoadArmOut(%obj.loadarm2.clamp);
}
function MPM_LoadArmin(%clamp)
{
//SensorDeploySound
//MotionSensorDeploySound
//StationDeploySound
%clamp.play3d(TurretDeploySound);
%clamp.loading = 1;
//%clamp.arm.setThreaddir(0,true);
%clamp.arm.schedule(800,"setThreaddir",0,true);
%clamp.arm.setThreaddir(1,false);
//%clamp.arm.setThreaddir(2,false);
%clamp.arm.schedule(800,"setThreaddir",2,false);
schedule(2000,0,"MPM_LoadArmOut",%clamp);
}
function MPM_LoadArmOut(%clamp)
{
%clamp.play3d(StationDeploySound);
%clamp.unmountImage(0);
%clamp.arm.schedule(1000,"setThreaddir",0,false);
%clamp.schedule(1000,"play3d",TurretDeploySound);
%clamp.arm.setThreaddir(1,true);
%clamp.arm.schedule(1000,"setThreaddir",2,true);
schedule(2000,%clamp,"MPM_LoadArmFinish",%clamp);
}
function MPM_LoadArmFinish(%clamp)
{
%clamp.loading = "";
}
function MPM_RemLoadArms(%obj,%del)
{
if (isObject(%obj.loadarm1))
{
if (%del)
{
%obj.loadarm1.clamp.delete();
%obj.loadarm1.delete();
%obj.loadarm2.clamp.delete();
%obj.loadarm2.delete();
}
else
{
MPM_LoadArmin(%obj.loadarm1.clamp);
MPM_LoadArmin(%obj.loadarm2.clamp);
}
}
}
/////////////////Not used.////////////////////
function BaseArmTurret::selectTarget(%this, %turret)
{
%turretTarg = %turret.getTarget();
if(%turretTarg == -1)
return;
if ($Host::Purebuild == 1 && $TurretEnableOverride != 1) {
%turret.clearTarget();
return;
}
// if the turret isn't on a team, don't fire at anyone
if(getTargetSensorGroup(%turretTarg) == 0)
{
%turret.clearTarget();
return;
}
// stop firing if turret is disabled or if it needs power and isn't powered
if((!%turret.isPowered()) && (!%turret.needsNoPower))
{
%turret.clearTarget();
return;
}
%TargetSearchMask = $TypeMasks::PlayerObjectType | $TypeMasks::VehicleObjectType | $TypeMasks::StationObjectType | $TypeMasks::GeneratorObjectType |
$TypeMasks::SensorObjectType | $TypeMasks::TurretObjectType; //$TypeMasks::StaticObjectType;
InitContainerRadiusSearch(%turret.getMuzzlePoint(0),
%turret.getMountedImage(0).attackRadius,
%TargetSearchMask);
while ((%potentialTarget = ContainerSearchNext()) != 0) {
if (%potentialtarget) {
%potTargTarg = %potentialTarget.getTarget();
if (%turret.isValidTarget(%potentialTarget)
&& (getTargetSensorGroup(%turretTarg) != getTargetSensorGroup(%potTargTarg))
&& (getTargetSensorGroup(%potTargTarg) != 0)) {
%turret.setTargetObject(%potentialTarget);
return;
}
}
}
}
///////////////////////////BEACON STUFF///////////////////////////
datablock ShapeBaseImageData(MPM_BeaconPackImage)
{
shapeFile = "turret_belly_base.dts";
item = MPM_BeaconPack;
mountPoint = 1;
offset = "0 0 0";
rotation = "1 0 0 90";
emap = true;
deployed = Mpm_Beacon;
stateName[0] = "Idle";
stateTransitionOnTriggerDown[0] = "Activate";
stateName[1] = "Activate";
stateScript[1] = "onActivate";
stateTransitionOnTriggerUp[1] = "Idle";
isLarge = false;
maxDepSlope = 360;
deploySound = ItemPickupSound;
minDeployDis = 0.5;
maxDeployDis = 50.0;
};
datablock ItemData(MPM_BeaconPack)
{
className = Pack;
catagory = "Deployables";
shapeFile = "turret_belly_base.dts";
mass = 1;
elasticity = 0.2;
friction = 0.6;
pickupRadius = 2;
rotate = true;
image = "MPM_BeaconPackImage";
pickUpName = "an beacon pack";
computeCRC = true;
};
datablock StaticShapeData(Mpm_Beacon_Ghost) : StaticShapeDamageProfile {
shapeFile = "stackable4m.dts";
maxDamage = 0.5;
destroyedLevel = 0.5;
disabledLevel = 0.3;
};
function MPM_BeaconPack::onPickup(%this, %obj, %shape, %amount)
{
// created to prevent console errors
}
function MPM_BeaconPackImage::onDeploy(%item, %plyr, %slot) {
%playerVector = vectorNormalize(-1 * getWord(%plyr.getEyeVector(),1) SPC getWord(%plyr.getEyeVector(),0) SPC "0");
%item.surfaceNrm2 = %playerVector;
%rot = fullRot(%item.surfaceNrm,%item.surfaceNrm2);
%rot = rotAdd(%rot,"1 0 0 3.14");
%beacon = new StaticShape()
{
dataBlock = Mpm_Beacon;
};
%ghost = new StaticShape()
{
dataBlock = Mpm_Beacon_Ghost;
scale = "1 1 0.2";
};
%beacon.ghost = %ghost;
%ghost.base = %beacon;
%beacon.setTransform(%item.surfacePt SPC %rot);
%ghost.setTransform(%item.surfacePt SPC %rot);
%beacon.team = %plyr.client.team;
%beacon.setOwner(%plyr);
%beacon.ownername = %plyr.client.namebase;
%ghost.team = %plyr.client.team;
%ghost.setOwner(%plyr);
%beacon.addtoMPMGroup(2);
Mpm_Link(%beacon);
// play the deploy sound
serverPlay3D(%item.deploySound, %beacon.getTransform());
addDSurface(%item.surface,%deplObj);
%plyr.getMountedImage(2).used++;
if (%plyr.getMountedImage(2).used>2)
{
%plyr.getMountedImage(2).used = 0;
%plyr.decInventory(MPM_BeaconPack, 1);
%plyr.UnMountImage(2);
}
return %beacon;
}
function MPM_BeaconPackImage::testObjectTooClose(%item,%surfacePt,%plyr) {
return (GetWord(%plyr.closestmpmbeacon(0),1)<25 && %plyr.closestmpmbeacon(0));
}
function Mpm_Beacon_Ghost::disassemble(%data,%plyr,%obj) {
%base = %obj.base;
%base.destroyed=1;
if (IsObject(%base.link1))
Mpm_Link(%base.link1,%obj);
if (IsObject(%base.link2))
Mpm_Link(%base.link2,%obj);
Parent::onDestroyed(%this, %base, %prevState);
if (IsObject(%base.emitter))
%base.emitter.schedule(500,"delete");
%base.schedule(500, "delete");
parent::disassemble(%data,%plyr,%obj);
}
function GameBase::putpack(%obj)
{
%i = new Item()
{
dataBlock = Mpm_BeaconPack;
};
%i.setTransform(%obj.getTransform());
}
datablock StaticShapeData(Mpm_Beacon) : StaticShapeDamageProfile {
className = "targeting";
shapeFile = "turret_belly_base.dts";
maxDamage = 0.5;
destroyedLevel = 0.5;
disabledLevel = 0.3;
explosion = HandGrenadeExplosion;
expDmgRadius = 1.0;
expDamage = 0.05;
expImpulse = 200;
dynamicType = $TypeMasks::StaticShapeObjectType;
deployedObject = true;
cmdCategory = "DSupport";
cmdIcon = CMDSensorIcon;
cmdMiniIconName = "commander/MiniIcons/com_deploymotionsensor";
targetNameTag = 'Deployed mpm Beacon';
deployAmbientThread = true;
debrisShapeName = "debris_generic_small.dts";
debris = DeployableDebris;
heatSignature = 0;
};
datablock ParticleData(MpmGreenParticle)
{
dragCoeffiecient = 0.0;
gravityCoefficient = 0.0;
inheritedVelFactor = 1.0;
lifetimeMS = 800;
lifetimeVarianceMS = 0;
spinRandomMin = 0.0;
spinRandomMax = 0.0;
windcoefficient = 0;
textureName = "flarebase";
colors[0] = "0.2 1 0.2 0";
colors[1] = "0.2 1 0.2 1";
colors[2] = "0.2 1 0.2 1";
colors[3] = "0.2 1 0.2 0";
sizes[0] = 1;
sizes[1] = 0.75;
sizes[2] = 0.5;
sizes[3] = 0.25;
times[0] = 0.0;
times[1] = 0.25;
times[2] = 0.5;
times[3] = 1;
};
datablock ParticleData(MpmRedParticle):MpmGreenParticle
{
textureName = "flarebase";
colors[0] = "1 0.2 0 0";
colors[1] = "1 0.2 0 1";
colors[2] = "1 0.2 0 1";
colors[3] = "1 0.2 0 0";
sizes[0] = 1;
sizes[1] = 0.75;
sizes[2] = 0.5;
sizes[3] = 0.25;
times[0] = 0.0;
times[1] = 0.25;
times[2] = 0.5;
times[3] = 1;
};
datablock ParticleEmitterData(MpmGreenEmitter)
{
lifetimeMS = 10;
ejectionPeriodMS = 100;
periodVarianceMS = 0;
ejectionVelocity = 0.5;
velocityVariance = 0.0;
ejectionoffset = 0;
thetaMin = 0.0;
thetaMax = 0.0;
orientParticles = false;
orientOnVelocity = false;
particles = "MpmGreenParticle";
};
datablock ParticleEmitterData(MpmRedEmitter):MpmGreenEmitter
{
particles = "MpmRedParticle";
ejectionoffset = 0;
};
function GameBase::Mpm_Beacon_Add(%obj)
{
%pos = GetWords(%obj.getTransform(),0,2);
%rot = "1 0 0 3.14";
%beacon = new StaticShape()
{
dataBlock = Mpm_Beacon;
};
%beacon.setTransform(%pos SPC %rot);
%beacon.team = %obj.client.team;
%beacon.setOwner(%obj);
%beacon.addtoMPMGroup(2);
Mpm_Link(%beacon);
}
function Mpm_Beacon::onDestroyed(%this, %obj, %prevState)
{
%obj.destroyed=1;
if (IsObject(%obj.link1))
Mpm_Link(%obj.link1,%obj);
if (IsObject(%obj.link2))
Mpm_Link(%obj.link2,%obj);
Parent::onDestroyed(%this, %obj, %prevState);
if (IsObject(%obj.emitter))
%obj.emitter.schedule(500,"delete");
if (IsObject(%obj.ghost))
%obj.ghost.schedule(500,"delete");
%obj.schedule(500, "delete");
}
function Mpm_Link(%obj,%exclude)
{
if (!isObject(%obj) || Mpm_checkLink(%obj) || %obj.destroyed)
return "";
%pos = %obj.getTransform();
%maxrange = 200; //max link range boosted from 100 to 200
%mask = $TypeMasks::StaticShapeObjectType;
InitContainerRadiusSearch(%pos,%maxrange,%mask);
%amount=0;
while ((%target = ContainerSearchNext()) != 0)
{
if (mpm_beacons.isMember(%target) && !%target.destroyed)
{
%mpmlist[%amount] = %target;
%amount++;
}
}
for (%i=0;%i<%amount;%i++)
{
%link1 = %mpmlist[%i];
%pos1= %link1.getTransform();
if (isObject(%link1) && %link1 != %obj && %link1 != %exclude && !%link1.linked && VectorDist(%pos,%pos1) < %maxrange)
{
for (%j=%i+1;%i<%amount;%i++)
{
%link2 = %mpmlist[%i];
%pos2= %link2.getTransform();
if (isObject(%link2) && %link2 != %obj && %link2 != %exclude && %link2 != %link1 && !%link2.linked && VectorDist(%pos,%pos2) < %maxrange && VectorDist(%pos1,%pos2) < %maxrange)
{
Mpm_linkup(%obj,%link1,%link2);
}
}
}
}
Mpm_checkLink(%obj);
}
function Mpm_linkup(%b1,%b2,%b3)
{
%b1.link1 = %b2;
%b1.link2 = %b3;
%b1.linked = 1;
Mpm_checkLink(%b1);
%b2.link1 = %b1;
%b2.link2 = %b3;
%b2.linked = 1;
Mpm_checkLink(%b2);
%b3.link1 = %b1;
%b3.link2 = %b2;
%b3.linked = 1;
Mpm_checkLink(%b3);
}
function Mpm_nolink(%obj)
{
return !isObject(%obj) || %obj.destroyed;
}
function Mpm_checkLink(%obj)
{
if (IsObject(%obj.emitter))
%obj.emitter.delete();
if (!%obj.linked || Mpm_nolink(%obj.link1) || Mpm_nolink(%obj.link2) )
{
%obj.linked = 0;
%obj.link1 = 0;
%obj.link2 = 0;
%obj.emitter=CreateEmitter(VectorAdd(%obj.getTransform(),realvec(%obj,"0 0 -1")),MpmRedEmitter,"1 0 0 0");
return "";
}
else
{
%pos = %obj.getTransform();
%pos1 = %obj.link1.getTransform();
%pos2 = %obj.link2.getTransform();
%obj.targetloc = VectorScale(VectorAdd(VectorAdd(%pos1,%pos2),%pos),1/3);
%nrm = VectorNormalize(VectorSub(%obj.targetloc,%pos));
%rot = fullrot(%nrm,"0 0 1");
%obj.emitter=CreateEmitter(VectorAdd(%pos,realvec(%obj,"0 0 -1")),MpmGreenEmitter,%rot);
return 1;
}
}
function GameBase::checkMpmLink(%obj,%exclude)
{
%location = %obj.getTransform();
%range = 200; //max link range boosted from 100 to 200
%mask = $TypeMasks::StaticShapeObjectType;
%done = 0;
InitContainerRadiusSearch(%location,%range,%mask);
while ((%target = ContainerSearchNext()) != 0 && %done != 2)
{
if (mpm_beacons.isMember(%target))
{
if (%target != %obj && %target != %exclude)
{
if (!isObject(%obj.link1) || %obj.link1 == %exclude) //Do we have an link1
{
%obj.link1 = 0; //Totally remove it.
if (%obj.link2 != %target) //We don't already have it right?
if (%target.askMpmLink(%obj,%exclude)) //Can we have you?
{
%obj.MpmLink(%target,1,%exclude); //Take
%done++;
}
}
if (!isObject(%obj.link2) || %obj.link2 == %exclude)
{
%obj.link2 = 0;
if (%obj.link1 != %target)
if (%target.askMpmLink(%obj,%exclude))
{
%obj.MpmLink(%target,2,%exclude);
%done++;
}
}
}
}
}
if (%done == 0)
%obj.MpmLink();
}
function GameBase::AskMpmLink(%target,%sender,%override)
{
if (%target.link1 == %sender || %target.link2 == %sender)
return 1;
if (!IsObject(%target.link1) || %target.link1 == %override)
{
%target.MpmLink(%sender,1,%override);
return 1;
}
if (!IsObject(%target.link2) || %target.link2 == %override)
{
%target.MpmLink(%sender,2,%override);
return 1;
}
return 0;
}
function GameBase::MpmLink(%obj,%link,%part,%exclude)
{
if (IsObject(%obj.emitter))
%obj.emitter.delete();
%location = %obj.getTransform();
%linkedto=0;
if (%part == 1)
%obj.link1=%link;
else if (%part == 2)
%obj.link2=%link;
if (isObject(%obj.link1) && %obj.link1 != %exclude)
%linkedto++;
if (isObject(%obj.link2) && %obj.link2 != %exclude)
%linkedto++;
%obj.linkedto = %linkedto;
if (!%obj.destroyed)
{
if (%linkedto==2)
{
%pos1 = %obj.link1.getTransform();
%pos2 = %obj.link2.getTransform();
%obj.targetloc = VectorScale(VectorAdd(VectorAdd(%pos1,%pos2),%location),1/3);
%nrm = VectorSub(%obj.targetloc,%location);
%rot = fullrot(%nrm,"0 0 1");
%obj.emitter=CreateEmitter(VectorAdd(%location,realvec(%obj,"0 0 -1")),MpmGreenEmitter,%rot);
}
else
{
%obj.emitter=CreateEmitter(VectorAdd(%location,realvec(%obj,"0 0 -1")),MpmRedEmitter,"1 0 0 0");
}
}
}
function GetMPMTargetList(%team,%pos,%min,%max)
{
if (!isObject(MpmGroup))
return "";
for( %c = 0; %c < mpm_beacons.getCount(); %c++ )
{
%beacon = mpm_beacons.getObject(%c);
if (%beacon.team == %team || $mpm::targetenemies)
{
if (findWord(%targetlist,%beacon.link1 SPC %beacon.link2) $= "" && %beacon.linked) //Only want beacons that are linked
{
%dist = VectorDist(%beacon.targetloc,%pos);
if (%dist > %min && %dist < %max) // Hey not too close... too far is bad too
%targetlist = listAdd(%targetlist,%beacon);
}
else if (%beacon.end == %beacon.targetloc && %beacon.islaser) //What have we here?.. a laser target perhaps?
{
%dist = VectorDist(%beacon.targetloc,%pos);
if (%dist > %min && %dist < %max)
%targetlist = listAdd(%targetlist,%beacon);
}
}
}
if ($mpm::targetmpbs) //Nifty lil feature requested by peeps.
for( %c = 0; %c < mpm_turrets.getCount(); %c++ )
{
%beacon = mpm_turrets.getObject(%c);
if (%turret.team != %team || $teamDamage)
{
%dist = VectorDist(%beacon.getTransform(),%pos); //Need transform for location :D
if (%dist > %min && %dist < %max)
%targetlist = listAdd(%targetlist,%beacon);
}
}
return %targetlist;
}
function Gamebase::addToMPMGroup(%obj,%set)
{
if (!isObject(MpmGroup))
{
%main = new SimGroup("MpmGroup");
MissionCleanup.add(%main);
%miss = new Simgroup("mpm_Missiles");
%turrets = new Simgroup("mpm_turrets");
%beacons = new Simgroup("mpm_beacons");
%main.add(%miss);
%main.add(%turrets);
%main.add(%beacons);
}
if (IsObject(%obj))
{
if (%set == 1)
Mpm_Turrets.add(%obj);
else if (%set == 2)
mpm_beacons.add(%obj);
else
mpm_Missiles.add(%obj);
}
}
function GameBase::remfromMpmGroup(%obj,%set)
{
if (!isObject(MpmGroup))
{
%main = new SimGroup("MpmGroup");
MissionCleanup.add(%main);
%miss = new Simgroup("mpm_Missiles");
%turrets = new Simgroup("mpm_turrets");
%beacons = new Simgroup("mpm_beacons");
%main.add(%miss);
%main.add(%turrets);
%main.add(%beacons);
}
if (IsObject(%obj))
{
if (%set == 1 && Mpm_turrets.IsMember(%obj))
Mpm_turrets.remove(%obj);
else if (%set == 2 && Mpm_beacons.IsMember(%obj))
Mpm_beacons.remove(%obj);
else if (Mpm_Missiles.IsMember(%obj))
Mpm_Missiles.remove(%obj);
}
}
function GameBase::closestmpmbeacon(%obj,%exclude)
{
%location = %obj.getTransform();
if (!mpm_beacons.getCount())
return "";
%tbeacon = "";
for( %c = 0; %c < mpm_beacons.getCount(); %c++ )
{
%beacon = mpm_beacons.getObject(%c);
if (%beacon != %obj && %beacon != %exclude && %beacon.team == %obj.team)
{
%pos = pos(%beacon);
%dist = vectorDist(%location,%pos);
if (!%dis || %dist < %dis)
{
%tbeacon = %beacon;
%dis = %dist;
}
}
}
return %tbeacon SPC %dist;
}
function TargetingLaserImage::Onfire(%data,%obj,%slot) {
%p = Parent::onFire(%data, %obj, %slot);
%p.setTarget(%obj.team);
if (%obj.getMountedImage(2) && %obj.getMountedImage(2).getName() $= MPM_BeaconPackImage)
{
bottomPrint( %obj.client, "Keep aiming the targetlaser at the same spot\n to maintain a temperary Missile target", 10, 2);
%obj.laser = %p;
%p.player = %obj;
%end =%obj.TraceLaser();
if (%end != -1)
%obj.laser.end=%end;
%obj.schedule(5000,"ValidateLaser");
}
}
function GameBase::TraceLaser(%obj)
{
%mask = $TypeMasks::TerrainObjectType | $TypeMasks::InteriorObjectType | $TypeMasks::VehicleObjectType |$TypeMasks::StaticShapeObjectType;
%start = %obj.getMuzzlePoint(0);
%end = VectorAdd(%start,VectorScale(%obj.getMuzzleVector(0),3000));
%res = ContainerRayCast(%start,%end,%mask, %obj);
if (%res)
{
return GetWords(%res,1,3);
}
else
return -1;
}
function GameBase::ValidateLaser(%obj)
{
if (IsObject(%obj.laser))
{
%end = %obj.traceLaser();
if (%end != %obj.laser.end || %obj.laser.end==-1)
{
%obj.laser.remfromMpmGroup(2);
%obj.laser.end=%end;
%obj.laser.firedat =0;
}
else
{
%obj.laser.islaser = 1;
%obj.laser.addtoMpmGroup(2);
%obj.play3d(LaserTargetSound);
if (%obj.laser.firedat)
%text = "Missiles lauched at your laser target:"@%obj.laser.firedat;
else
%text = "Noting lauched so far.";
bottomPrint( %obj.client, "Laser stable, temporary target maintained.\n Keep the laser at it\'s current target, to maintain the target.\n" SPC %text , 3, 3);
%obj.laser.targetloc = %obj.laser.end;
%obj.laser.team = %obj.team;
}
%obj.schedule(3000,"ValidateLaser");
}
}
datablock ShockwaveData(PulseWave) {
className = "ShockwaveData";
scale = "1 1 1";
delayMS = "0";
delayVariance = "0";
lifetimeMS = "1000";
lifetimeVariance = "0";
width = "1";
numSegments = "60";
numVertSegments = "1";
velocity = "30";
height = "20";
verticalCurve = "5";
acceleration = "5";
times[0] = "0";
times[1] = "0.25";
times[2] = "0.75";
times[3] = "1";
colors[0] = "1.000000 0.000000 0.000000 1.000000"; //1.0 0.9 0.9
colors[1] = "1.000000 0.000000 0.000000 1.000000"; //0.6 0.6 0.6
colors[2] = "1.000000 0.000000 0.000000 1.000000"; //0.6 0.6 0.6
colors[3] = "1.000000 0.000000 0.000000 0.000000";
texture[0] = "gamegrid";
texture[1] = "gamegrid";
texWrap = "7";
is2D = "1";
mapToTerrain = "0";
orientToNormal = "1";
renderBottom = "1";
renderSquare = "0";
};
datablock ExplosionData(PulseExplosion):BaseExplosion //From blast.cs
{
Shockwave = "PulseWave";
};
datablock TracerProjectileData(PulseProjectile):BaseProjectile
{
Explosion = "PulseExplosion";
};
function pulse(%pos)
{
schedule(200,0,"Serverplay3D",FlashGrenadeExplosionSound,%pos);
for (%i=0;%i<5;%i++)
{
schedule(%i*200,0,"shockwave",%pos,"0 0 1",PulseProjectile);
}
}
function obspulse(%pos,%client,%time)
{
if ( !isObject( %client.comCam ) )
{
%client.comCam = new Camera()
{
dataBlock = CommanderCamera;
};
MissionCleanup.add(%client.comCam);
}
%sign = new StaticShape(){
dataBlock = MpmTurretTarg;
};
%sign.setTransform(VectorAdd(%pos,"0 0 5") SPC "1 0 0 -1");
%client.comCam.setTransform(VectorAdd(%pos,"0 0 50"));
%client.comCam.setOrbitMode(%sign,%pos,-10,50,-10);
%client.setControlObject(%client.comCam);
commandToClient(%client, 'CameraAttachResponse', true);
%client.schedule(%time,"setControlObject",%client.player);
commandToClient(%client, 'ControlObjectResponse', true, getControlObjectType(%client.comcam,%client.player));
messageClient(%client, 'CloseHud', "", 'inventoryScreen');
schedule(%time,%client,"serverCmdResetControlObject",%client);
%sign.schedule(%time+100,"delete");
}
function pulsescan(%pos,%team,%range)
{
%mask = $TypeMasks::PlayerObjectType |$TypeMasks::VehicleObjectType ;
%done = 0;
InitContainerRadiusSearch(%pos,%range,%mask);
%epl = 0;
%fpl = 0;
%evh = 0;
%fvh = 0;
while ((%target = ContainerSearchNext()) != 0)
{
if (%target.getType() & $TypeMasks::PlayerObjectType)
{
if (%target.team != %team)
%epl++;
else
%fpl++;
}
else if(%target.getType() & $TypeMasks::VehicleObjectType)
{
if (%target.team != %team)
%evh++;
else
%fvh++;
}
}
return %fpl SPC %epl SPC %fvh SPC %evh;
}