mirror of
https://github.com/mostlikely4r/construction-mod.git
synced 2026-07-12 06:54:34 +00:00
Initial commit
This commit is contained in:
parent
d305f694ac
commit
cbb5d08a0c
128 changed files with 82385 additions and 0 deletions
724
scripts/packs/AntiNuketurret.cs
Normal file
724
scripts/packs/AntiNuketurret.cs
Normal file
|
|
@ -0,0 +1,724 @@
|
|||
datablock TracerProjectileData(Mpm_Aexp1) {
|
||||
className = "TracerProjectileData";
|
||||
emitterDelay = "-1";
|
||||
velInheritFactor = "0";
|
||||
directDamage = "0";
|
||||
hasDamageRadius = "0";
|
||||
indirectDamage = "0";
|
||||
damageRadius = "0";
|
||||
radiusDamageType = "0";
|
||||
kickBackStrength = "0";
|
||||
Explosion = "VehicleExplosion";
|
||||
hasLight = "0";
|
||||
lightRadius = "1";
|
||||
lightColor = "1.000000 1.000000 1.000000 1.000000";
|
||||
hasLightUnderwaterColor = "0";
|
||||
underWaterLightColor = "1.000000 1.000000 1.000000 1.000000";
|
||||
explodeOnWaterImpact = "0";
|
||||
depthTolerance = "5";
|
||||
bubbleEmitTime = "0.5";
|
||||
faceViewer = "0";
|
||||
scale = "1 1 1";
|
||||
dryVelocity = "0.1";
|
||||
wetVelocity = "0.1";
|
||||
fizzleTimeMS = "32";
|
||||
lifetimeMS = "32";
|
||||
explodeOnDeath = "1";
|
||||
reflectOnWaterImpactAngle = "0";
|
||||
deflectionOnWaterImpact = "0";
|
||||
fizzleUnderwaterMS = "-1";
|
||||
activateDelayMS = "-1";
|
||||
doDynamicClientHits = "0";
|
||||
tracerLength = "1";
|
||||
tracerMinPixels = "1";
|
||||
tracerAlpha = "0";
|
||||
tracerColor = "0.000000 0.000000 0.000000 0.000000";
|
||||
tracerTex[0] = "special/tracer00";
|
||||
tracerTex[1] = "special/tracercross";
|
||||
tracerWidth = "0.1";
|
||||
crossViewAng = "0.99";
|
||||
crossSize = "0.1";
|
||||
renderCross = "0";
|
||||
isFXUnit = "1";
|
||||
};
|
||||
|
||||
datablock TracerProjectileData(Mpm_Aexp2) : Mpm_Aexp1{
|
||||
Explosion = "TurretExplosion";
|
||||
};
|
||||
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// Explosions
|
||||
//---------------------------------------------------------------------------
|
||||
datablock ExplosionData(Mpm_Anti_MissileExplosion) {
|
||||
explosionShape = "effect_plasma_explosion.dts";
|
||||
playSpeed = 1.5;
|
||||
soundProfile = GrenadeExplosionSound;
|
||||
faceViewer = true;
|
||||
|
||||
sizes[0] = "0.5 0.5 0.5";
|
||||
sizes[1] = "0.5 0.5 0.5";
|
||||
sizes[2] = "0.5 0.5 0.5";
|
||||
|
||||
emitter[0] = MissileExplosionSmokeEmitter;
|
||||
|
||||
debris = MissileSpikeDebris;
|
||||
debrisThetaMin = 10;
|
||||
debrisThetaMax = 170;
|
||||
debrisNum = 8;
|
||||
debrisNumVariance = 6;
|
||||
debrisVelocity = 15.0;
|
||||
debrisVelocityVariance = 2.0;
|
||||
|
||||
shakeCamera = true;
|
||||
camShakeFreq = "6.0 7.0 7.0";
|
||||
camShakeAmp = "70.0 70.0 70.0";
|
||||
camShakeDuration = 1.0;
|
||||
camShakeRadius = 7.0;
|
||||
};
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
// Projectile
|
||||
//--------------------------------------
|
||||
datablock SeekerProjectileData(Mpm_Anti_Missile) {
|
||||
casingShapeName = "weapon_missile_casement.dts";
|
||||
projectileShapeName = "weapon_missile_projectile.dts";
|
||||
hasDamageRadius = true;
|
||||
indirectDamage = 0.2;
|
||||
damageRadius = 4.0;
|
||||
radiusDamageType = $DamageType::MissileTurret;
|
||||
kickBackStrength = 1000;
|
||||
|
||||
explosion = "Mpm_Anti_MissileExplosion";
|
||||
splash = MissileSplash;
|
||||
velInheritFactor = 0.2; // to compensate for slow starting velocity, this value
|
||||
// is cranked up to full so the missile doesn't start
|
||||
// out behind the player when the player is moving
|
||||
// very quickly - bramage
|
||||
|
||||
baseEmitter = MissileSmokeEmitter;
|
||||
delayEmitter = MissileFireEmitter;
|
||||
puffEmitter = MissilePuffEmitter;
|
||||
bubbleEmitter = GrenadeBubbleEmitter;
|
||||
bubbleEmitTime = 1.0;
|
||||
|
||||
exhaustEmitter = MissileLauncherExhaustEmitter;
|
||||
exhaustTimeMs = 300;
|
||||
exhaustNodeName = "muzzlePoint1";
|
||||
|
||||
lifetimeMS = -1;
|
||||
muzzleVelocity = 20.0;
|
||||
maxVelocity = 20.0;
|
||||
turningSpeed = 110.0;
|
||||
acceleration = 0.0;
|
||||
|
||||
proximityRadius = 3;
|
||||
|
||||
terrainAvoidanceSpeed = 180;
|
||||
terrainScanAhead = 25;
|
||||
terrainHeightFail = 12;
|
||||
terrainAvoidanceRadius = 100;
|
||||
|
||||
flareDistance = 200;
|
||||
flareAngle = 30;
|
||||
|
||||
sound = MissileProjectileSound;
|
||||
|
||||
hasLight = true;
|
||||
lightRadius = 5.0;
|
||||
lightColor = "0.2 0.05 0";
|
||||
|
||||
useFlechette = true;
|
||||
flechetteDelayMs = 550;
|
||||
casingDeb = FlechetteDebris;
|
||||
|
||||
explodeOnWaterImpact = false;
|
||||
};
|
||||
|
||||
datablock TurretData(Mpm_Anti_TurretDeployed) : TurretDamageProfile {
|
||||
className = DeployedTurret;
|
||||
shapeFile = "turret_outdoor_deploy.dts";
|
||||
|
||||
rechargeRate = 0.15;
|
||||
|
||||
mass = 1;
|
||||
maxDamage = 0.80;
|
||||
destroyedLevel = 0.80;
|
||||
disabledLevel = 0.35;
|
||||
|
||||
explosion = HandGrenadeExplosion;
|
||||
expDmgRadius = 5.0;
|
||||
expDamage = 0.5;
|
||||
expImpulse = 500.0;
|
||||
|
||||
repairRate = 0;
|
||||
deployedObject = true;
|
||||
|
||||
thetaMin = 0;
|
||||
thetaMax = 145;
|
||||
thetaNull = 90;
|
||||
primaryAxis = zaxis;
|
||||
|
||||
yawVariance = 30.0; // these will smooth out the elf tracking code.
|
||||
pitchVariance = 30.0; // more or less just tolerances
|
||||
|
||||
isShielded = true;
|
||||
energyPerDamagePoint = 110;
|
||||
maxEnergy = 80;
|
||||
renderWhenDestroyed = true;
|
||||
barrel = DeployableMpm_Anti_TurretBarrel;
|
||||
heatSignature = 0.0;
|
||||
|
||||
//canControl = true;
|
||||
cmdCategory = "DTactical";
|
||||
cmdIcon = CMDTurretIcon;
|
||||
cmdMiniIconName = "commander/MiniIcons/com_turret_grey";
|
||||
targetNameTag = 'Anti Missile';
|
||||
targetTypeTag = 'Turret';
|
||||
sensorData = Mpm_Anti_TurretSensor;
|
||||
sensorRadius = Mpm_Anti_TurretSensor.detectRadius;
|
||||
sensorColor = "191 0 226";
|
||||
|
||||
firstPersonOnly = true;
|
||||
|
||||
debrisShapeName = "debris_generic_small.dts";
|
||||
debris = TurretDebrisSmall;
|
||||
needsPower = true;
|
||||
};
|
||||
|
||||
datablock TurretImageData(DeployableMpm_Anti_TurretBarrel) {
|
||||
shapeFile = "stackable1s.dts";
|
||||
rotation = "-0.57735 0.57735 0.57735 120";
|
||||
offset = "0 -0.3 0";
|
||||
projectile = Mpm_Anti_Missile;
|
||||
projectileType = SeekerProjectile;
|
||||
|
||||
usesEnergy = true;
|
||||
fireEnergy = 7.0;
|
||||
minEnergy = 7.0 * 2;
|
||||
|
||||
isSeeker = true;
|
||||
seekRadius = 300;
|
||||
maxSeekAngle = 30;
|
||||
seekTime = 1.0;
|
||||
minSeekHeat = 0.6;
|
||||
emap = true;
|
||||
minTargetingDistance = 15;
|
||||
|
||||
// Turret parameters
|
||||
activationMS = 250;
|
||||
deactivateDelayMS = 500;
|
||||
thinkTimeMS = 200;
|
||||
degPerSecTheta = 50;
|
||||
degPerSecPhi = 50;
|
||||
attackRadius = 250;
|
||||
|
||||
// State transitions
|
||||
stateName[0] = "Activate";
|
||||
stateTransitionOnNotLoaded[0] = "Dead";
|
||||
stateTransitionOnLoaded[0] = "ActivateReady";
|
||||
|
||||
stateName[1] = "ActivateReady";
|
||||
stateSequence[1] = "Activate";
|
||||
stateSound[1] = IBLSwitchSound;
|
||||
|
||||
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.3;
|
||||
stateFire[3] = true;
|
||||
stateShockwave[3] = true;
|
||||
stateRecoil[3] = LightRecoil;
|
||||
stateAllowImageChange[3] = false;
|
||||
stateSequence[3] = "Fire";
|
||||
stateSound[3] = MissileRackTurretFireSound;
|
||||
stateScript[3] = "onFire";
|
||||
|
||||
stateName[4] ="Reload";
|
||||
stateTimeoutValue[4] = 0.5;
|
||||
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] = 2;
|
||||
stateTransitionOnLoaded[5] = "ActivateReady";
|
||||
stateTransitionOnTimeout[5] = "Dead";
|
||||
|
||||
stateName[6] = "Dead";
|
||||
stateTransitionOnLoaded[6] = "ActivateReady";
|
||||
|
||||
stateName[7] = "NoAmmo";
|
||||
stateTransitionOnAmmo[7] = "Reload";
|
||||
stateSequence[7] = "NoAmmo";
|
||||
|
||||
muzzleSlots = 12;
|
||||
muzzleSlotOffset[0] = "0.65 0.5 0.4";
|
||||
muzzleSlotOffset[1] = "0.35 0.5 0.4";
|
||||
muzzleSlotOffset[2] = "0.15 0.5 0.4";
|
||||
muzzleSlotOffset[3] = "-0.15 0.5 0.4";
|
||||
muzzleSlotOffset[4] = "-0.35 0.5 0.4";
|
||||
muzzleSlotOffset[5] = "-0.65 0.5 0.4";
|
||||
muzzleSlotOffset[6] = "0.65 0.5 0.1";
|
||||
muzzleSlotOffset[7] = "0.35 0.5 0.1";
|
||||
muzzleSlotOffset[8] = "0.15 0.5 0.1";
|
||||
muzzleSlotOffset[9] = "-0.15 0.5 0.1";
|
||||
muzzleSlotOffset[10] = "-0.35 0.5 0.1";
|
||||
muzzleSlotOffset[11] = "-0.65 0.5 0.1";
|
||||
};
|
||||
|
||||
datablock TurretImageData(DeployableMpm_Anti_TurretBarrel1) {
|
||||
shapeFile = "weapon_missile_projectile.dts";
|
||||
rotation = "1 0 0 0";
|
||||
offset = "-0.14 0.15 0.13";
|
||||
|
||||
};
|
||||
|
||||
datablock TurretImageData(DeployableMpm_Anti_TurretBarrel2) {
|
||||
shapeFile = "weapon_missile_projectile.dts";
|
||||
rotation = "1 0 0 0";
|
||||
offset = "-0.14 0.15 -0.13";
|
||||
};
|
||||
|
||||
datablock TurretImageData(DeployableMpm_Anti_TurretBarrel3) {
|
||||
shapeFile = "weapon_missile_projectile.dts";
|
||||
rotation = "1 0 0 0";
|
||||
offset = "-0.43 0.15 0.13";
|
||||
};
|
||||
|
||||
datablock TurretImageData(DeployableMpm_Anti_TurretBarrel4) {
|
||||
shapeFile = "weapon_missile_projectile.dts";
|
||||
rotation = "1 0 0 0";
|
||||
offset = "-0.43 0.15 -0.13";
|
||||
};
|
||||
|
||||
function DeployableMpm_Anti_TurretBarrel::onMount(%this,%obj,%slot) {
|
||||
%obj.currentMuzzleSlot = 0;
|
||||
%obj.schedule(1000,"mountImage",DeployableMpm_Anti_TurretBarrel1,1,true);
|
||||
%obj.schedule(1000,"mountImage",DeployableMpm_Anti_TurretBarrel2,2,true);
|
||||
%obj.schedule(1000,"mountImage",DeployableMpm_Anti_TurretBarrel3,3,true);
|
||||
%obj.schedule(1000,"mountImage",DeployableMpm_Anti_TurretBarrel4,4,true);
|
||||
}
|
||||
|
||||
// TODO - handle unmount
|
||||
|
||||
datablock ShapeBaseImageData(TurretMpm_Anti_DeployableImage) {
|
||||
mass = 1;
|
||||
shapeFile = "pack_deploy_turreto.dts";
|
||||
item = TurretMpm_Anti_Deployable;
|
||||
mountPoint = 1;
|
||||
offset = "0 0 0";
|
||||
deployed = Mpm_Anti_TurretDeployed;
|
||||
stateName[0] = "Idle";
|
||||
stateTransitionOnTriggerDown[0] = "Activate";
|
||||
|
||||
stateName[1] = "Activate";
|
||||
stateScript[1] = "onActivate";
|
||||
stateTransitionOnTriggerUp[1] = "Idle";
|
||||
|
||||
isLarge = true;
|
||||
emap = true;
|
||||
maxDepSlope = 360;
|
||||
deploySound = TurretDeploySound;
|
||||
minDeployDis = 0.5;
|
||||
maxDeployDis = 5.0;
|
||||
};
|
||||
|
||||
datablock ItemData(TurretMpm_Anti_Deployable) {
|
||||
className = Pack;
|
||||
catagory = "Deployables";
|
||||
shapeFile = "pack_deploy_turreti.dts";
|
||||
mass = 1;
|
||||
elasticity = 0.2;
|
||||
friction = 0.6;
|
||||
pickupRadius = 1;
|
||||
rotate = false;
|
||||
image = TurretMpm_Anti_DeployableImage;
|
||||
pickUpName = "an anti missile turret pack";
|
||||
emap = true;
|
||||
};
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
// Functions
|
||||
//--------------------------------------
|
||||
|
||||
function TurretMpm_Anti_DeployableImage::TestNoTerrainFound(%item) {
|
||||
// created to prevent console errors
|
||||
}
|
||||
|
||||
function TurretMpm_Anti_DeployableImage::TestNoInteriorFound(%item) {
|
||||
// created to prevent console errors
|
||||
}
|
||||
|
||||
function TurretMpm_Anti_Deployable::onPickup(%this, %obj, %shape, %amount) {
|
||||
//created to prevent console errors
|
||||
}
|
||||
|
||||
|
||||
function TurretMpm_Anti_DeployableImage::onDeploy(%item, %plyr, %slot) {
|
||||
%className = "Turret";
|
||||
if (IsObject(%item.surface))
|
||||
if (%item.surface.getDatablock().getName() $= Mpm_Anti_TurretDeployed)
|
||||
{
|
||||
for (%i=1;%i<5;%i++)
|
||||
{
|
||||
if (!%item.surface.getMountedImage(%i))
|
||||
{
|
||||
%item.surface.schedule(%i*100,"mountImage","DeployableMpm_Anti_TurretBarrel"@ %i,%i,true);
|
||||
%item.surface.schedule(%i*100,"play3d",NerfGunDryFireSound);
|
||||
%c++;
|
||||
}
|
||||
if (%c)
|
||||
bottomPrint( %plyr.client, "Reloaded anti-mpm Turret with" SPC %c SPC "Missiles", 5,1);
|
||||
}
|
||||
return "";
|
||||
}
|
||||
%playerVector = vectorNormalize(getWord(%plyr.getEyeVector(),1) SPC -1 * getWord(%plyr.getEyeVector(),0) SPC "0");
|
||||
|
||||
if (vAbs(floorVec(%item.surfaceNrm,100)) $= "0 0 1")
|
||||
%item.surfaceNrm2 = %playerVector;
|
||||
else
|
||||
%item.surfaceNrm2 = vectorNormalize(vectorCross(%item.surfaceNrm,"0 0 1"));
|
||||
|
||||
%rot = fullRot(%item.surfaceNrm,%item.surfaceNrm2);
|
||||
|
||||
%deplObj = new (%className)() {
|
||||
dataBlock = %item.deployed;
|
||||
};
|
||||
|
||||
if (%plyr.packSet == 1)
|
||||
%deplObj.isSeeker = true;
|
||||
|
||||
// set orientation
|
||||
%deplObj.setTransform(%item.surfacePt SPC %rot);
|
||||
|
||||
// set team, owner, and handle
|
||||
%deplObj.team = %plyr.client.Team;
|
||||
%deplObj.setOwner(%plyr);
|
||||
|
||||
// set power frequency
|
||||
%deplObj.powerFreq = %plyr.powerFreq;
|
||||
|
||||
// set the sensor group if it needs one
|
||||
if (%deplObj.getTarget() != -1)
|
||||
setTargetSensorGroup(%deplObj.getTarget(), %plyr.client.team);
|
||||
|
||||
// place the deployable in the MissionCleanup/Deployables group (AI reasons)
|
||||
addToDeployGroup(%deplObj);
|
||||
|
||||
//let the AI know as well...
|
||||
AIDeployObject(%plyr.client, %deplObj);
|
||||
|
||||
// play the deploy sound
|
||||
serverPlay3D(%item.deploySound, %deplObj.getTransform());
|
||||
|
||||
// increment the team count for this deployed object
|
||||
$TeamDeployedCount[%plyr.team, %item.item]++;
|
||||
|
||||
%deplObj.deploy();
|
||||
|
||||
// Power object
|
||||
checkPowerObject(%deplObj);
|
||||
|
||||
addDSurface(%item.surface,%deplObj);
|
||||
|
||||
// take the deployable off the player's back and out of inventory
|
||||
%plyr.unmountImage(%slot);
|
||||
%plyr.decInventory(%item.item, 1);
|
||||
bottomPrint( %plyr.client, "Deployed anti-mpm Turret with 4 missiles ammo.\n deploy another anti-mpm turret ontop to resuply.", 5,2);
|
||||
return %deplObj;
|
||||
}
|
||||
|
||||
function Mpm_Anti_TurretDeployed::onDestroyed(%this, %obj, %prevState) {
|
||||
if (%obj.isRemoved)
|
||||
return;
|
||||
if ($Host::InvincibleDeployables != 1 || %obj.damageFailedDecon) {
|
||||
%obj.isRemoved = true;
|
||||
$TeamDeployedCount[%obj.team, TurretMpm_Anti_Deployable]--;
|
||||
remDSurface(%obj);
|
||||
%obj.schedule(500, delete);
|
||||
}
|
||||
Parent::onDestroyed(%this, %obj, %prevState);
|
||||
}
|
||||
|
||||
function DeployableMpm_Anti_TurretBarrel::onFire(%data,%obj,%slot) {
|
||||
%targetObj = %obj.getTargetObject();
|
||||
if (%targetObj) {
|
||||
if (!%obj.getDataBlock().hasLOS(%obj,%slot,%targetObj) && %obj.aquireTime + 2000 < getSimTime()) {
|
||||
%obj.clearTarget();
|
||||
return;
|
||||
}
|
||||
if (%obj.aquireTime + 10000 + getRandom(0,1000) < getSimTime()) {
|
||||
%obj.clearTarget();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
%p = Parent::onFire(%data,%obj,%slot);
|
||||
serverPlay3D(MissileRackTurretFireSound2,%obj.getTransform());
|
||||
|
||||
if (%obj.isSeeker) {
|
||||
if (%obj.getControllingClient())
|
||||
// a player is controlling the turret
|
||||
%target = %obj.getLockedTarget();
|
||||
else
|
||||
// The ai is controlling the turret
|
||||
%target = %obj.getTargetObject();
|
||||
|
||||
if(%target)
|
||||
%p.setObjectTarget(%target);
|
||||
else if(%obj.isLocked())
|
||||
%p.setPositionTarget(%obj.getLockedPosition());
|
||||
else
|
||||
%p.setNoTarget(); // set as unguided. Only happens when itchy trigger can't wait for lock tone.
|
||||
%obj.setEnergyLevel(%obj.getEnergyLevel() - (%data.fireEnergy));
|
||||
}
|
||||
}
|
||||
|
||||
function Mpm_Anti_TurretDeployed::hasLOS(%data,%obj,%slot,%targetObj) {
|
||||
%start = %obj.getMuzzlePoint(%slot);
|
||||
%end = %targetObj.getWorldBoxCenter();
|
||||
%res = containerRayCast(%start,%end,-1,%obj);
|
||||
return firstWord(%res) == %targetObj;
|
||||
}
|
||||
|
||||
function TurretMpm_Anti_DeployableImage::onMount(%data, %obj, %node) {
|
||||
%obj.hasMpm_Anti= true; // set for Mpm_Anti_check
|
||||
%obj.packSet = 0;
|
||||
displayPowerFreq(%obj);
|
||||
}
|
||||
|
||||
function TurretMpm_Anti_DeployableImage::onUnmount(%data, %obj, %node) {
|
||||
%obj.hasMpm_Anti= "";
|
||||
%obj.packSet = 0;
|
||||
}
|
||||
|
||||
|
||||
function Mpm_Anti_TurretDeployed::selectTarget(%this, %turret)
|
||||
{
|
||||
%turretTarg = %turret.getTarget();
|
||||
if(%turretTarg == -1)
|
||||
return;
|
||||
if (Isobject(%turret.aimtarget))
|
||||
{
|
||||
%turret.setTargetObject(%turret.aimtarget);
|
||||
}
|
||||
%target = %turret.get_ampm_target();
|
||||
if (Isobject(%target))
|
||||
{
|
||||
%turret.Lock_ampm_target(%target);
|
||||
}
|
||||
}
|
||||
|
||||
function GameBase::Get_ampm_target(%obj)
|
||||
{
|
||||
%location = %obj.getTransform();
|
||||
if (!Isobject(mpm_missiles))
|
||||
return "";
|
||||
if (!mpm_missiles.getCount())
|
||||
return "";
|
||||
|
||||
%tmissile = "";
|
||||
for( %c = 0; %c < mpm_missiles.getCount(); %c++ )
|
||||
{
|
||||
%missile = mpm_missiles.getObject(%c);
|
||||
if (%missile.load.Hazard(%missile,%obj,200) && !Isobject(%obj.tagged[%missile]) && !%missile.tagged && (!isObject(%missile.tracking) || %obj == %missile.tracking))
|
||||
{
|
||||
%pos = pos(%missile);
|
||||
%dist = vectorDist(%location,%pos);
|
||||
if (!%dis || %dist < %dis)
|
||||
{
|
||||
%tmissile = %missile;
|
||||
%dis = %dist;
|
||||
}
|
||||
}
|
||||
}
|
||||
return %tmissile SPC %dist;
|
||||
}
|
||||
|
||||
function GameBase::Lock_ampm_target(%obj,%target)
|
||||
{
|
||||
if (IsObject(%target)) //Is the target still there?
|
||||
{
|
||||
%predict= %target.predict();
|
||||
%loc = getWords(%predict,0,2);
|
||||
%speed = getWords(%predict,3,5);
|
||||
%pos = %obj.getTransform();
|
||||
%dist = VectorDist(%pos,%loc);
|
||||
//%dir = VectorSub(%pos,%loc);
|
||||
//%gendir = VectorDot(VectorNormalize(%dir),VectorNormalize(%speed));
|
||||
%time = 15;//Limit(%dist/20+5-10,5,50); //%target.radiustime(%pos,100);
|
||||
if (%time > 5 && getSimTime()+ %time*1000 < %target.dietime) //Can we get to the target in time?
|
||||
{
|
||||
%loc = getWords(%target.predict((%time)*1000),0,2);
|
||||
%dist = VectorDist(%pos,%loc);
|
||||
%ttime = %dist / 20; //travel time
|
||||
%ltime = %time - %ttime; //launch time
|
||||
%atime = %ltime - 3; //activate time
|
||||
if (%dist > 10 && %dist < 500 && %atime > 0) //Will it within our limits?
|
||||
{
|
||||
%res = containerRayCast(%obj.getTransform(),%loc, -1,%obj);
|
||||
if (!%res) //Can we hit it from here?
|
||||
{
|
||||
if ((%obj.atime-getSimTime())/1000 > %atime || (%obj.ltime-getSimTime())/1000 < 0) //Is it a better option?
|
||||
{
|
||||
Cancel(%obj.activate);
|
||||
Cancel(%obj.launch);
|
||||
%obj.needtime = getSimTime()+(%time*1000);
|
||||
%obj.atime = getSimTime()+(%atime*1000);
|
||||
%obj.ltime = getSimTime()+(%ltime*1000);
|
||||
%obj.set_ampm_target(%loc);
|
||||
%target.tracking = %obj;
|
||||
%obj.activate = %obj.schedule(%atime*1000,"set_ampm_target",%target,%loc);
|
||||
%obj.launch = %obj.schedule(%ltime*1000,"fire_ampm_now");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function GameBase::set_ampm_target(%obj,%target,%location)
|
||||
{
|
||||
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 (%location $= "" || !Isobject(%target) || IsObject(%obj.tagged[%target]) || !%obj.get_ampm_missile())
|
||||
{
|
||||
Cancel(%obj.launch);
|
||||
%pos = VectorAdd(%obj.getMuzzlePoint(0),realvec(%obj,"0 10 0"));
|
||||
%obj.aimtarget.setTransform(%pos SPC "1 0 0 0");
|
||||
%obj.canfire = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
%obj.aimtarget.setTransform(%location SPC "1 0 0 0");
|
||||
%obj.target = %target;
|
||||
%obj.canfire = 1;
|
||||
}
|
||||
}
|
||||
|
||||
function GameBase::Fire_ampm_now(%obj)
|
||||
{
|
||||
|
||||
%target = %obj.target;
|
||||
if (IsObject(%target) && %obj.canfire && IsObject(%obj.aimtarget))
|
||||
{
|
||||
%slot = %obj.get_ampm_missile();
|
||||
%from = %obj.getMuzzlePoint(%slot);
|
||||
%pos = %obj.aimtarget.getTransform();
|
||||
%vec = VectorSub(%pos,%from);
|
||||
%tdir = VectorNormalize(VectorSub(%pos,%from));
|
||||
%tvec = "0 1 0";
|
||||
%rot = %obj.getSlotRotation(0);
|
||||
%dir = validateVal(MatrixMulVector("0 0 0" SPC %rot ,%tvec));
|
||||
%diff = vectorDot(%tdir,%dir);
|
||||
%time = (%obj.needtime-getSimTime())/1000;
|
||||
%speed = (VectorLen(%vec)/%time)/MpmMissile3.muzzleVelocity;
|
||||
|
||||
if (%diff > 0.9 && %slot)
|
||||
{
|
||||
%p1 = new SeekerProjectile()
|
||||
{
|
||||
datablock = Mpm_B_MIS2;
|
||||
initialDirection = VectorScale(%tdir,%speed);
|
||||
initialPosition = %from;
|
||||
};
|
||||
%p1.schedule(%time*1000+500,"delete");
|
||||
schedule(%time*1000,0,"range",%target,%p1);
|
||||
%p1.getDatablock().schedule(%time*1000,"onExplode",%p1,%pos, 1);
|
||||
%obj.tagged[%target] = %p1;
|
||||
%target.tagged = 1;
|
||||
%obj.set_ampm_target(0);
|
||||
%obj.unMountImage(%slot);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
function range(%p1,%p2)
|
||||
{
|
||||
if (IsObject(%p1) && IsObject(%p2))
|
||||
{
|
||||
%dist = VectorDist(%p1.getTransform(),%p2.getTransform());
|
||||
PlayExplosion(%p1.getTransform(),Mpm_Aexp1);
|
||||
|
||||
if (%dist < 10)
|
||||
{
|
||||
//createLifeEmitter(%p1.getTransform(), MpmJetEmitter3, 5000,"1 0 0 0");
|
||||
PlayExplosion(%p1.getTransform(),Mpm_Aexp2);
|
||||
%p1.load.InterCept(%p1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function GameBase::get_ampm_missile(%obj)
|
||||
{
|
||||
for (%i=1;%i<5; %i++)
|
||||
{
|
||||
if (%obj.getMountedImage(%i)!=0)
|
||||
return %i;
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
//Not used.. ha
|
||||
function inrange(%p,%loc,%range)
|
||||
{
|
||||
if (!Isobject(%p))
|
||||
return "";
|
||||
%c = VectorSub(%p.getTransform(),%loc);
|
||||
%speed = GetWords(%p.predict(),3,5);
|
||||
%r = VectorNormalize(%speed);
|
||||
%v = VectorLen(%speed);
|
||||
%a = %p.getDatablock().Acceleration;
|
||||
|
||||
if (%a != 0)
|
||||
{
|
||||
%root1 = mPow(VectorDot(%r,%c),2) * VectorDot(%r,%r) * (mPow(%g,2)-VectorDot(%c,%c));
|
||||
if (%root1 < 0) //Will never be in range.
|
||||
return "";
|
||||
%root2 = VectorDot(%r,%r)*(VectorDot(%r,%r)*mPow(%v,2)-2*%a*(VectorDot(%r,%c)+mSqrt(%root)));
|
||||
if (%root2 < 0) //Will never be in range.
|
||||
return "";
|
||||
%time = (-1*%v + mSqrt(%root2)/VectorDot(%r,%r))/%a;
|
||||
if (%time < 0) //'was'in range.
|
||||
return "";
|
||||
return %time; //Note this is seconds not ms.
|
||||
}
|
||||
else
|
||||
{
|
||||
%root = mPow(%v)*(4*VectorDot(%r,%c) - 4*VectorDot(%r,%r)*(VectorDot(%c,%c)-mPow(%g,2)));
|
||||
if (%root < 0) //Will never be in range.
|
||||
return "";
|
||||
%time = (-2*%v*VectorDot(%r,%c) + mSqrt(%root)) / (2*VectorDot(%r,%r) * mPow(%v,2));
|
||||
if (%time < 0) //'was'in range.
|
||||
return "";
|
||||
return %time; //Note this is seconds not ms.
|
||||
}
|
||||
}
|
||||
|
||||
1806
scripts/packs/Effectpacks.cs
Normal file
1806
scripts/packs/Effectpacks.cs
Normal file
File diff suppressed because it is too large
Load diff
242
scripts/packs/blastfloor.cs
Normal file
242
scripts/packs/blastfloor.cs
Normal file
|
|
@ -0,0 +1,242 @@
|
|||
//---------------------------------------------------------
|
||||
// Deployable floor
|
||||
//---------------------------------------------------------
|
||||
|
||||
datablock StaticShapeData(DeployedFloor) : StaticShapeDamageProfile {
|
||||
className = "floor";
|
||||
shapeFile = "smiscf.dts";
|
||||
|
||||
maxDamage = 4;
|
||||
destroyedLevel = 4;
|
||||
disabledLevel = 3.5;
|
||||
|
||||
isShielded = true;
|
||||
energyPerDamagePoint = 30;
|
||||
maxEnergy = 200;
|
||||
rechargeRate = 0.25;
|
||||
|
||||
explosion = HandGrenadeExplosion;
|
||||
expDmgRadius = 3.0;
|
||||
expDamage = 0.1;
|
||||
expImpulse = 200.0;
|
||||
|
||||
dynamicType = $TypeMasks::StaticShapeObjectType;
|
||||
deployedObject = true;
|
||||
cmdCategory = "DSupport";
|
||||
cmdIcon = CMDSensorIcon;
|
||||
cmdMiniIconName = "commander/MiniIcons/com_deploymotionsensor";
|
||||
targetNameTag = 'Medium Blast floor';
|
||||
deployAmbientThread = true;
|
||||
debrisShapeName = "debris_generic_small.dts";
|
||||
debris = DeployableDebris;
|
||||
heatSignature = 0;
|
||||
needsPower = true;
|
||||
};
|
||||
|
||||
datablock ShapeBaseImageData(FloorDeployableImage) {
|
||||
mass = 1;
|
||||
emap = true;
|
||||
shapeFile = "stackable1s.dts";
|
||||
item = FloorDeployable;
|
||||
mountPoint = 1;
|
||||
offset = "0 0 0";
|
||||
deployed = DeployedFloor;
|
||||
heatSignature = 0;
|
||||
|
||||
stateName[0] = "Idle";
|
||||
stateTransitionOnTriggerDown[0] = "Activate";
|
||||
|
||||
stateName[1] = "Activate";
|
||||
stateScript[1] = "onActivate";
|
||||
stateTransitionOnTriggerUp[1] = "Idle";
|
||||
|
||||
isLarge = false;
|
||||
maxDepSlope = 360; // also see FloorDeployableImage::testSlopeTooGreat()
|
||||
deploySound = ItemPickupSound;
|
||||
|
||||
minDeployDis = 0.1;
|
||||
maxDeployDis = 50.0;
|
||||
};
|
||||
|
||||
datablock ItemData(FloorDeployable) {
|
||||
className = Pack;
|
||||
catagory = "Deployables";
|
||||
shapeFile = "stackable1s.dts";
|
||||
mass = 1;
|
||||
elasticity = 0.2;
|
||||
friction = 0.6;
|
||||
pickupRadius = 1;
|
||||
rotate = true;
|
||||
image = "FloorDeployableImage";
|
||||
pickUpName = "a medium floor pack";
|
||||
heatSignature = 0;
|
||||
emap = true;
|
||||
};
|
||||
|
||||
function FloorDeployableImage::testSlopeTooGreat(%item) {
|
||||
if (%item.surface) {
|
||||
// Do we link with another Medium Floor?
|
||||
if (%item.surface.getClassName() $= "StaticShape") {
|
||||
if (%item.surface.getDataBlock().className $= "floor") {
|
||||
%floor = 1;
|
||||
}
|
||||
}
|
||||
if (%floor) {
|
||||
if ($Host::Purebuild == true && $Host::Hazard::Enabled != true)
|
||||
return getTerrainAngle(%item.surfaceNrm) > %item.maxDepSlope;
|
||||
else
|
||||
return getTerrainAngle(%item.surfaceNrm) > 1;
|
||||
}
|
||||
else
|
||||
return getTerrainAngle(%item.surfaceNrm) > %item.maxDepSlope;
|
||||
}
|
||||
}
|
||||
|
||||
function FloorDeployableImage::testObjectTooClose(%item) {
|
||||
if ($Host::Purebuild == true && $Host::Hazard::Enabled != true)
|
||||
return "";
|
||||
else {
|
||||
%terrain = %item.surface.getClassName() $= "TerrainBlock";
|
||||
%interior = %item.surface.getClassName() $= "InteriorInstance";
|
||||
if (%item.surface.getClassName() $= "StaticShape") {
|
||||
if (%item.surface.getDataBlock().className $= "floor") {
|
||||
%floor = 1;
|
||||
}
|
||||
}
|
||||
return !(%terrain || %interior || %floor);
|
||||
}
|
||||
}
|
||||
|
||||
function FloorDeployableImage::testNoTerrainFound(%item) {
|
||||
// don't check this for non-Landspike turret deployables
|
||||
}
|
||||
|
||||
function FloorDeployable::onPickup(%this, %obj, %shape, %amount) {
|
||||
// created to prevent console errors
|
||||
}
|
||||
|
||||
function FloorDeployableImage::onDeploy(%item, %plyr, %slot) {
|
||||
//Object
|
||||
%className = "StaticShape";
|
||||
|
||||
%grounded = 0;
|
||||
if (%item.surface.getClassName() $= TerrainBlock)
|
||||
%grounded = 1;
|
||||
|
||||
%playerVector = vectorNormalize(-1 * getWord(%plyr.getEyeVector(),1) SPC getWord(%plyr.getEyeVector(),0) SPC "0");
|
||||
|
||||
%rot = intRot("1 0 0 0",%playerVector);
|
||||
|
||||
%scale = getWords($packSetting["floor",%plyr.packSet],0,2);
|
||||
|
||||
if ($Host::ExpertMode == 1)
|
||||
%scale = getWords(%scale,0,1) SPC firstWord($expertSetting["floor",%plyr.expertSet]);
|
||||
|
||||
%surfaceAdjust = 1;
|
||||
// Do we link with another Medium Floor?
|
||||
if (%item.surface.getClassName() $= "StaticShape") {
|
||||
if (%item.surface.getDataBlock().className $= "floor") {
|
||||
%surfaceAdjust = 0;
|
||||
// [[Most]] Get the relative x y location from the "pure" information.
|
||||
%link = sidelink(%item.surface,%item.surfaceNrm,%item.surfacePt,getWords($packSetting["floor",%plyr.packSet],3,5),"0 0 -0.5");
|
||||
%location = getWords(%link,0,2);
|
||||
%side = getWords(%link,3,5);
|
||||
%dirside = getWords(%link,6,8);
|
||||
// [[Most]] Set the rotation to match the surfaceNrm and match the side.
|
||||
// The power of the full rotation system.. ;)
|
||||
%rot = fullRot(%item.surfaceNrm,vectorScale(%dirside,-1));
|
||||
// [[Most]] Adjust the location to match the scale.
|
||||
%adjust = vectorScale(%item.surfaceNrm,GetWord(%scale,2));
|
||||
%item.surfacePt = vectorSub(%location, %adjust);
|
||||
}
|
||||
}
|
||||
|
||||
// If we do not link with another Medium Floor
|
||||
if(%surfaceAdjust) {
|
||||
%item.surfacePt = vectorSub(%item.surfacePt,"0 0" SPC getWord(%scale,2) - 1); // Rise 1 meter above surface
|
||||
}
|
||||
|
||||
%scale = vectorMultiply(%scale,1/4 SPC 1/3 SPC 2);
|
||||
|
||||
%deplObj = new (%className)() {
|
||||
dataBlock = %item.deployed;
|
||||
scale = %scale;
|
||||
};
|
||||
|
||||
//////////////////////////Apply settings//////////////////////////////
|
||||
|
||||
// [[Location]]:
|
||||
|
||||
// exact:
|
||||
%deplObj.setTransform(%item.surfacePt SPC %rot);
|
||||
|
||||
// misc info
|
||||
addDSurface(%item.surface,%deplObj);
|
||||
|
||||
// [[Settings]]:
|
||||
|
||||
%deplObj.grounded = %grounded;
|
||||
%deplObj.needsFit = 1;
|
||||
|
||||
// [[Normal Stuff]]:
|
||||
|
||||
// if(%deplObj.getDatablock().rechargeRate)
|
||||
// %deplObj.setRechargeRate(%deplObj.getDatablock().rechargeRate);
|
||||
|
||||
// set team, owner, and handle
|
||||
%deplObj.team = %plyr.client.team;
|
||||
%deplObj.setOwner(%plyr);
|
||||
|
||||
// set power frequency
|
||||
%deplObj.powerFreq = %plyr.powerFreq;
|
||||
|
||||
// set the sensor group if it needs one
|
||||
if (%deplObj.getTarget() != -1)
|
||||
setTargetSensorGroup(%deplObj.getTarget(), %plyr.client.team);
|
||||
|
||||
// place the deployable in the MissionCleanup/Deployables group (AI reasons)
|
||||
addToDeployGroup(%deplObj);
|
||||
|
||||
//let the AI know as well...
|
||||
AIDeployObject(%plyr.client, %deplObj);
|
||||
|
||||
// play the deploy sound
|
||||
serverPlay3D(%item.deploySound, %deplObj.getTransform());
|
||||
|
||||
// increment the team count for this deployed object
|
||||
$TeamDeployedCount[%plyr.team, %item.item]++;
|
||||
|
||||
%deplObj.deploy();
|
||||
|
||||
// Power object
|
||||
checkPowerObject(%deplObj);
|
||||
|
||||
deployEffect(%deplObj,%item.surfacePt,%item.surfaceNrm,"floor");
|
||||
|
||||
return %deplObj;
|
||||
}
|
||||
|
||||
function DeployedFloor::onDestroyed(%this, %obj, %prevState) {
|
||||
if (%obj.isRemoved)
|
||||
return;
|
||||
%obj.isRemoved = true;
|
||||
Parent::onDestroyed(%this, %obj, %prevState);
|
||||
$TeamDeployedCount[%obj.team, FloorDeployable]--;
|
||||
remDSurface(%obj);
|
||||
%obj.schedule(500, "delete");
|
||||
cascade(%obj);
|
||||
fireBallExplode(%obj,1);
|
||||
}
|
||||
|
||||
function FloorDeployableImage::onMount(%data, %obj, %node) {
|
||||
%obj.hasFloor = true; // set for floorcheck
|
||||
%obj.packSet = 0;
|
||||
%obj.expertSet = 0;
|
||||
displayPowerFreq(%obj);
|
||||
}
|
||||
|
||||
function FloorDeployableImage::onUnmount(%data, %obj, %node) {
|
||||
%obj.hasFloor = "";
|
||||
%obj.packSet = 0;
|
||||
%obj.expertSet = 0;
|
||||
}
|
||||
271
scripts/packs/blastwall.cs
Normal file
271
scripts/packs/blastwall.cs
Normal file
|
|
@ -0,0 +1,271 @@
|
|||
//---------------------------------------------------------
|
||||
// Deployable wall, Code by Parousia
|
||||
//---------------------------------------------------------
|
||||
|
||||
datablock StaticShapeData(DeployedWall) : StaticShapeDamageProfile {
|
||||
className = "wall";
|
||||
shapeFile = "Bmiscf.dts"; // dmiscf.dts, alternate
|
||||
|
||||
maxDamage = 2;
|
||||
destroyedLevel = 2;
|
||||
disabledLevel = 1.5;
|
||||
|
||||
isShielded = true;
|
||||
energyPerDamagePoint = 60;
|
||||
maxEnergy = 100;
|
||||
rechargeRate = 0.25;
|
||||
|
||||
explosion = HandGrenadeExplosion;
|
||||
expDmgRadius = 3.0;
|
||||
expDamage = 0.1;
|
||||
expImpulse = 200.0;
|
||||
|
||||
dynamicType = $TypeMasks::StaticShapeObjectType;
|
||||
deployedObject = true;
|
||||
cmdCategory = "DSupport";
|
||||
cmdIcon = CMDSensorIcon;
|
||||
cmdMiniIconName = "commander/MiniIcons/com_deploymotionsensor";
|
||||
targetNameTag = 'Light Blast Wall';
|
||||
deployAmbientThread = true;
|
||||
debrisShapeName = "debris_generic_small.dts";
|
||||
debris = DeployableDebris;
|
||||
heatSignature = 0;
|
||||
needsPower = true;
|
||||
};
|
||||
|
||||
datablock ShapeBaseImageData(WallDeployableImage) {
|
||||
mass = 1;
|
||||
emap = true;
|
||||
shapeFile = "stackable1s.dts";
|
||||
item = WallDeployable;
|
||||
mountPoint = 1;
|
||||
offset = "0 0 0";
|
||||
deployed = DeployedWall;
|
||||
heatSignature = 0;
|
||||
|
||||
stateName[0] = "Idle";
|
||||
stateTransitionOnTriggerDown[0] = "Activate";
|
||||
|
||||
stateName[1] = "Activate";
|
||||
stateScript[1] = "onActivate";
|
||||
stateTransitionOnTriggerUp[1] = "Idle";
|
||||
|
||||
isLarge = false;
|
||||
maxDepSlope = 360;
|
||||
deploySound = ItemPickupSound;
|
||||
|
||||
minDeployDis = 0;
|
||||
maxDeployDis = 50.0;
|
||||
};
|
||||
|
||||
datablock ItemData(WallDeployable) {
|
||||
className = Pack;
|
||||
catagory = "Deployables";
|
||||
shapeFile = "stackable1s.dts";
|
||||
mass = 1;
|
||||
elasticity = 0.2;
|
||||
friction = 0.6;
|
||||
pickupRadius = 1;
|
||||
rotate = true;
|
||||
image = "WallDeployableImage";
|
||||
pickUpName = "a light blast wall pack";
|
||||
heatSignature = 0;
|
||||
emap = true;
|
||||
};
|
||||
|
||||
function WallDeployableImage::testObjectTooClose(%item) {
|
||||
return "";
|
||||
}
|
||||
|
||||
function WallDeployableImage::testNoTerrainFound(%item) {
|
||||
// don't check this for non-Landspike turret deployables
|
||||
}
|
||||
|
||||
function WallDeployable::onPickup(%this, %obj, %shape, %amount) {
|
||||
// created to prevent console errors
|
||||
}
|
||||
|
||||
function WallDeployableImage::onDeploy(%item, %plyr, %slot) {
|
||||
//Object
|
||||
%className = "StaticShape";
|
||||
|
||||
%grounded = 0;
|
||||
if (%item.surface.getClassName() $= TerrainBlock)
|
||||
%grounded = 1;
|
||||
|
||||
%playerVector = vectorNormalize(-1 * getWord(%plyr.getEyeVector(),1) SPC getWord(%plyr.getEyeVector(),0) SPC "0");
|
||||
|
||||
if (%item.surfaceinher == 0) {
|
||||
if (vAbs(floorVec(%item.surfaceNrm,100)) $= "0 0 1")
|
||||
%item.surfaceNrm2 = %playerVector;
|
||||
else
|
||||
%item.surfaceNrm2 = vectorNormalize(vectorCross(%item.surfaceNrm,"0 0 1"));
|
||||
}
|
||||
|
||||
%scale = "0.5 8 40"; // Search range for total blast wall size.
|
||||
|
||||
%mCenter = "0 0 -0.5";
|
||||
%pad = pad(%item.surfacePt SPC %item.surfaceNrm SPC %item.surfaceNrm2,%scale,%mCenter);
|
||||
%scale = getWords(%pad,0,2);
|
||||
|
||||
%item.surfacePt = getWords(%pad,3,5);
|
||||
%rot = getWords(%pad,6,9);
|
||||
%offset = %plyr.packSet - 1;
|
||||
if (%plyr.packSet == 3) {
|
||||
%double = 1;
|
||||
%offset = 1;
|
||||
}
|
||||
|
||||
%scale = vectorAdd(%scale,vectorScale("1.01 1.01" SPC %double,mAbs(%offset)));
|
||||
|
||||
%pup = mCeil(getWord(%scale,0)/4); //4 = Avarage blast wall height.
|
||||
%pside = mCeil(getWord(%scale,1)/4); //4 = Avarage blast wall width.
|
||||
%upiece = getWord(%scale,0)/%pup;
|
||||
%spiece = getWord(%scale,1)/%pside;
|
||||
|
||||
%scale = vectorMultiply(%scale,1/4 SPC 1/3 SPC 2);
|
||||
%dir = VectorNormalize(vectorSub(%item.surfacePt,%plyr.getposition()));
|
||||
%adjust = vectorNormalize(vectorProject(%dir,vectorCross(%item.surfaceNrm,%item.surfaceNrm2)));
|
||||
// %adjust = vectorNormalize(vectorCross(%item.surfaceNrm,%item.surfaceNrm2));
|
||||
|
||||
if (%plyr.packSet == 3)
|
||||
%offset = Lev(vectorCouple(%dir,vectorCross(%item.surfaceNrm,%item.surfaceNrm2)));
|
||||
|
||||
%adjust = vectorScale(%adjust,-0.5 * %offset);
|
||||
|
||||
if ($Host::ExpertMode == 1 && %plyr.expertSet == 1) {
|
||||
for (%x = 0;%x < %pup;%x++){
|
||||
for (%y = 0;%y < %pside;%y++){
|
||||
%scale = %upiece SPC %spiece SPC 0.5 + %double;
|
||||
%scale = vectorMultiply(%scale,1/4 SPC 1/3 SPC 2);
|
||||
%deplObj = new (%className)() {
|
||||
dataBlock = %item.deployed;
|
||||
scale = %scale;
|
||||
};
|
||||
%up = vectorScale(%item.surfaceNrm,%upiece * (%x - (%pup / 2) + 0.5));
|
||||
%side = vectorScale(%item.surfaceNrm2,%spiece * (%y - (%pside / 2) + 0.5));
|
||||
%tadjust = vectorAdd(%up,vectorAdd(%side,%adjust));
|
||||
%deplObj.setTransform(vectorAdd(%item.surfacePt,%tadjust) SPC %rot);
|
||||
|
||||
// [[Settings]]:
|
||||
|
||||
%deplObj.grounded = %grounded;
|
||||
%deplObj.Needsfit = 1;
|
||||
addDSurface(%item.surface,%deplObj);
|
||||
|
||||
// [Normal Stuff]]:
|
||||
|
||||
// if(%deplObj.getDatablock().rechargeRate)
|
||||
// %deplObj.setRechargeRate(%deplObj.getDatablock().rechargeRate);
|
||||
|
||||
// set team, owner, and handle
|
||||
%deplObj.team = %plyr.client.Team;
|
||||
%deplObj.setOwner(%plyr);
|
||||
|
||||
// set power frequency
|
||||
%deplObj.powerFreq = %plyr.powerFreq;
|
||||
|
||||
// set the sensor group if it needs one
|
||||
if(%deplObj.getTarget() != -1)
|
||||
setTargetSensorGroup(%deplObj.getTarget(), %plyr.client.team);
|
||||
|
||||
// place the deployable in the MissionCleanup/Deployables group (AI reasons)
|
||||
addToDeployGroup(%deplObj);
|
||||
|
||||
// let the AI know as well...
|
||||
AIDeployObject(%plyr.client, %deplObj);
|
||||
|
||||
// play the deploy sound
|
||||
serverPlay3D(%item.deploySound, %deplObj.getTransform());
|
||||
|
||||
// increment the team count for this deployed object
|
||||
$TeamDeployedCount[%plyr.team, %item.item]++;
|
||||
|
||||
%deplObj.deploy();
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
%deplObj = new (%className)() {
|
||||
dataBlock = %item.deployed;
|
||||
scale = %scale;
|
||||
};
|
||||
|
||||
%deplObj.setTransform(vectorAdd(%item.surfacePt,%adjust) SPC %rot);
|
||||
|
||||
// [[Settings]]:
|
||||
|
||||
%deplObj.grounded = %grounded;
|
||||
%deplObj.Needsfit = 1;
|
||||
addDSurface(%item.surface,%deplObj);
|
||||
|
||||
// [Normal Stuff]]:
|
||||
|
||||
// if(%deplObj.getDatablock().rechargeRate)
|
||||
// %deplObj.setRechargeRate(%deplObj.getDatablock().rechargeRate);
|
||||
|
||||
// set team, owner, and handle
|
||||
%deplObj.team = %plyr.client.Team;
|
||||
%deplObj.setOwner(%plyr);
|
||||
|
||||
// set power frequency
|
||||
%deplObj.powerFreq = %plyr.powerFreq;
|
||||
|
||||
// set the sensor group if it needs one
|
||||
if(%deplObj.getTarget() != -1)
|
||||
setTargetSensorGroup(%deplObj.getTarget(), %plyr.client.team);
|
||||
|
||||
// place the deployable in the MissionCleanup/Deployables group (AI reasons)
|
||||
addToDeployGroup(%deplObj);
|
||||
|
||||
//let the AI know as well...
|
||||
AIDeployObject(%plyr.client, %deplObj);
|
||||
|
||||
// play the deploy sound
|
||||
serverPlay3D(%item.deploySound, %deplObj.getTransform());
|
||||
|
||||
// increment the team count for this deployed object
|
||||
$TeamDeployedCount[%plyr.team, %item.item]++;
|
||||
|
||||
%deplObj.deploy();
|
||||
}
|
||||
|
||||
// Power object
|
||||
checkPowerObject(%deplObj);
|
||||
|
||||
deployEffect(%deplObj,%item.surfacePt,%item.surfaceNrm,"pad");
|
||||
|
||||
return %deplObj;
|
||||
}
|
||||
|
||||
function DeployedWall::onDestroyed(%this, %obj, %prevState) {
|
||||
if (%obj.isRemoved)
|
||||
return;
|
||||
%obj.isRemoved = true;
|
||||
Parent::onDestroyed(%this, %obj, %prevState);
|
||||
$TeamDeployedCount[%obj.team, WallDeployable]--;
|
||||
remDSurface(%obj);
|
||||
%obj.schedule(500, "delete");
|
||||
cascade(%obj);
|
||||
fireBallExplode(%obj,1);
|
||||
}
|
||||
|
||||
function WallDeployableImage::onMount(%data, %obj, %node) {
|
||||
%obj.hasBlast = true; // set for blastcheck
|
||||
%obj.packSet = 0;
|
||||
%obj.expertSet = 0;
|
||||
displayPowerFreq(%obj);
|
||||
}
|
||||
|
||||
function WallDeployableImage::onUnmount(%data, %obj, %node) {
|
||||
%obj.hasBlast = "";
|
||||
%obj.packSet = 0;
|
||||
%obj.expertSet = 0;
|
||||
}
|
||||
|
||||
function doorfunction(%player,%door)
|
||||
{
|
||||
%vec = VectorSub(%door,%player);
|
||||
%dir = VectorNormalize(%vec);
|
||||
%nrm = topVec(VirVec(%door,%dir));
|
||||
}
|
||||
225
scripts/packs/blastwwall.cs
Normal file
225
scripts/packs/blastwwall.cs
Normal file
|
|
@ -0,0 +1,225 @@
|
|||
//---------------------------------------------------------
|
||||
// Deployable wall, Code by Parousia
|
||||
//---------------------------------------------------------
|
||||
|
||||
datablock StaticShapeData(DeployedwWall) : StaticShapeDamageProfile {
|
||||
className = "wwall";
|
||||
shapeFile = "smiscf.dts";
|
||||
|
||||
maxDamage = 0.5;
|
||||
destroyedLevel = 0.5;
|
||||
disabledLevel = 0.3;
|
||||
|
||||
isShielded = true;
|
||||
energyPerDamagePoint = 240;
|
||||
maxEnergy = 50;
|
||||
rechargeRate = 0.25;
|
||||
|
||||
explosion = HandGrenadeExplosion;
|
||||
expDmgRadius = 3.0;
|
||||
expDamage = 0.1;
|
||||
expImpulse = 200.0;
|
||||
|
||||
dynamicType = $TypeMasks::StaticShapeObjectType;
|
||||
deployedObject = true;
|
||||
cmdCategory = "DSupport";
|
||||
cmdIcon = CMDSensorIcon;
|
||||
cmdMiniIconName = "commander/MiniIcons/com_deploymotionsensor";
|
||||
targetNameTag = 'Light Walk Way';
|
||||
deployAmbientThread = true;
|
||||
debrisShapeName = "debris_generic_small.dts";
|
||||
debris = DeployableDebris;
|
||||
heatSignature = 0;
|
||||
needsPower = true;
|
||||
};
|
||||
|
||||
datablock ShapeBaseImageData(wWallDeployableImage) {
|
||||
mass = 1;
|
||||
emap = true;
|
||||
shapeFile = "stackable1s.dts";
|
||||
item = wwallDeployable;
|
||||
mountPoint = 1;
|
||||
offset = "0 0 0";
|
||||
deployed = DeployedwWall;
|
||||
heatSignature = 0;
|
||||
|
||||
stateName[0] = "Idle";
|
||||
stateTransitionOnTriggerDown[0] = "Activate";
|
||||
|
||||
stateName[1] = "Activate";
|
||||
stateScript[1] = "onActivate";
|
||||
stateTransitionOnTriggerUp[1] = "Idle";
|
||||
|
||||
isLarge = false;
|
||||
maxDepSlope = 360;
|
||||
deploySound = ItemPickupSound;
|
||||
|
||||
minDeployDis = 0;
|
||||
maxDeployDis = 50.0;
|
||||
};
|
||||
|
||||
datablock ItemData(wwallDeployable) {
|
||||
className = Pack;
|
||||
catagory = "Deployables";
|
||||
shapeFile = "stackable1s.dts";
|
||||
mass = 1;
|
||||
elasticity = 0.2;
|
||||
friction = 0.6;
|
||||
pickupRadius = 1;
|
||||
rotate = true;
|
||||
image = "wWallDeployableImage";
|
||||
pickUpName = "a light walkway pack";
|
||||
heatSignature = 0;
|
||||
emap = true;
|
||||
};
|
||||
|
||||
function wWallDeployableImage::testObjectTooClose(%item) {
|
||||
return "";
|
||||
}
|
||||
|
||||
function wWallDeployableImage::testNoTerrainFound(%item) {
|
||||
// don't check this for non-Landspike turret deployables
|
||||
}
|
||||
|
||||
function wwallDeployable::onPickup(%this, %obj, %shape, %amount) {
|
||||
// created to prevent console errors
|
||||
}
|
||||
|
||||
function wWallDeployableImage::onDeploy(%item, %plyr, %slot) {
|
||||
//Object
|
||||
%className = "StaticShape";
|
||||
|
||||
%grounded = 0;
|
||||
if (%item.surface.getClassName() $= TerrainBlock)
|
||||
%grounded = 1;
|
||||
|
||||
%playerVector = vectorNormalize(-1 * getWord(%plyr.getEyeVector(),1) SPC getWord(%plyr.getEyeVector(),0) SPC "0");
|
||||
|
||||
%rot = intRot("1 0 0 0",%playerVector);
|
||||
|
||||
%scale ="5 5 0.5";
|
||||
|
||||
if ($Host::ExpertMode == 1) {
|
||||
if (%plyr.expertSet == 2)
|
||||
%scale = getWord(%scale,0) * 2 SPC getWords(%scale,1,2);
|
||||
if (%plyr.expertSet == 3)
|
||||
%scale = getWord(%scale,0) SPC getWord(%scale,1) * 2 SPC getWord(%scale,2);
|
||||
}
|
||||
|
||||
%surfaceAdjust = 1;
|
||||
// Do we link with another shape?
|
||||
if (%item.surface.getClassName() $= "StaticShape") {
|
||||
%surfaceAdjust = 0;
|
||||
// [[Most]] Get the relative x y location from the "pure" informtation.
|
||||
%link = sidelink(%item.surface,%item.surfaceNrm,%item.surfacePt,%scale,"0 0 -0.5");
|
||||
%location = getWords(%link,0,2);
|
||||
%side = getWords(%link,3,5);
|
||||
%dirside = getWords(%link,6,8);
|
||||
// [[Most]] Set the rotation to match the surfaceNrm and match the side.
|
||||
// The power of the full rotation system.. ;)
|
||||
%rot = fullRot(%item.surfaceNrm,%dirside);
|
||||
// [[Most]] Adjust the location to match the scale.
|
||||
%adjust = vectorScale(%item.surfaceNrm,getWord(%scale,2));
|
||||
%item.surfacePt = vectorSub(%location, %adjust);
|
||||
}
|
||||
|
||||
// If we do not link with another shape
|
||||
if(%surfaceAdjust) {
|
||||
%item.surfacePt = vectorSub(%item.surfacePt,"0 0" SPC getWord(%scale,2) - 1); // Rise 1 meter above surface
|
||||
}
|
||||
|
||||
%scale = vectorMultiply(%scale,1/4 SPC 1/3 SPC 2);
|
||||
|
||||
%deplObj = new (%className)() {
|
||||
dataBlock = %item.deployed;
|
||||
scale = %scale;
|
||||
};
|
||||
|
||||
%deplObj.setTransform(%item.surfacePt SPC %rot);
|
||||
|
||||
%axis = vectorCross(virvec(%item.surface,%item.surfaceNrm),virvec(%item.surface,%side));
|
||||
%axis = vectorScale(%axis,-1);
|
||||
%vec1 = vectorScale(virvec(%item.surface,%side),0.5);
|
||||
%vec2 = vectorAdd(vectorScale(virvec(%item.surface,%item.surfaceNrm),-0.5),"0 0 -0.5");
|
||||
|
||||
deployEffect(%deplObj,%location,%side,"walk");
|
||||
%angle = getWord($packSetting["walk",%plyr.packSet],0)/180*$Pi;
|
||||
%deplObj.setTransform(remoterotate(%deplObj,%axis SPC %angle,%item.surface,vectorAdd(%vec2,%vec1)));
|
||||
|
||||
if ($Host::ExpertMode == 1 && %plyr.expertSet == 1) {
|
||||
%v = getRandom()*0.02 SPC getRandom()*0.02 SPC getRandom()*0.02;
|
||||
%deplObj.setTransform(vectorAdd(pos(%deplObj),%v) SPC rot(%deplObj));
|
||||
}
|
||||
|
||||
//////////////////////////Apply settings//////////////////////////////
|
||||
|
||||
// [[Location]]:
|
||||
|
||||
// exact:
|
||||
|
||||
// misc info
|
||||
addDSurface(%item.surface,%deplObj);
|
||||
|
||||
// [[Settings]]:
|
||||
|
||||
%deplObj.grounded = %grounded;
|
||||
%deplObj.needsFit = 1;
|
||||
|
||||
// [[Normal Stuff]]:
|
||||
|
||||
// if(%deplObj.getDatablock().rechargeRate)
|
||||
// %deplObj.setRechargeRate(%deplObj.getDatablock().rechargeRate);
|
||||
|
||||
// set team, owner, and handle
|
||||
%deplObj.team = %plyr.client.team;
|
||||
%deplObj.setOwner(%plyr);
|
||||
|
||||
// set power frequency
|
||||
%deplObj.powerFreq = %plyr.powerFreq;
|
||||
|
||||
// set the sensor group if it needs one
|
||||
if (%deplObj.getTarget() != -1)
|
||||
setTargetSensorGroup(%deplObj.getTarget(), %plyr.client.team);
|
||||
|
||||
// place the deployable in the MissionCleanup/Deployables group (AI reasons)
|
||||
addToDeployGroup(%deplObj);
|
||||
|
||||
//let the AI know as well...
|
||||
AIDeployObject(%plyr.client, %deplObj);
|
||||
|
||||
// play the deploy sound
|
||||
serverPlay3D(%item.deploySound, %deplObj.getTransform());
|
||||
|
||||
// increment the team count for this deployed object
|
||||
$TeamDeployedCount[%plyr.team, %item.item]++;
|
||||
|
||||
%deplObj.deploy();
|
||||
|
||||
// Power object
|
||||
checkPowerObject(%deplObj);
|
||||
|
||||
return %deplObj;
|
||||
}
|
||||
|
||||
function DeployedwWall::onDestroyed(%this, %obj, %prevState) {
|
||||
if (%obj.isRemoved)
|
||||
return;
|
||||
%obj.isRemoved = true;
|
||||
Parent::onDestroyed(%this, %obj, %prevState);
|
||||
$TeamDeployedCount[%obj.team, wwallDeployable]--;
|
||||
remDSurface(%obj);
|
||||
%obj.schedule(500, "delete");
|
||||
cascade(%obj);
|
||||
fireBallExplode(%obj,1);
|
||||
}
|
||||
|
||||
function wWallDeployableImage::onMount(%data, %obj, %node) {
|
||||
%obj.hasWalk = true; // set for wwallcheck
|
||||
%obj.packSet = 0;
|
||||
displayPowerFreq(%obj);
|
||||
}
|
||||
|
||||
function wWallDeployableImage::onUnmount(%data, %obj, %node) {
|
||||
%obj.packSet = 0;
|
||||
%obj.hasWalk = "";
|
||||
}
|
||||
248
scripts/packs/cratepack.cs
Normal file
248
scripts/packs/cratepack.cs
Normal file
|
|
@ -0,0 +1,248 @@
|
|||
//---------------------------------------------------------
|
||||
// Deployable Crates
|
||||
//---------------------------------------------------------
|
||||
|
||||
datablock StaticShapeData(DeployedCrate) : StaticShapeDamageProfile {
|
||||
className = "crate";
|
||||
shapeFile = "stackable3s.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 Crate';
|
||||
deployAmbientThread = true;
|
||||
debrisShapeName = "debris_generic_small.dts";
|
||||
debris = DeployableDebris;
|
||||
heatSignature = 0;
|
||||
needsPower = true;
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedCrate0) : DeployedCrate {
|
||||
shapeFile = "stackable1s.dts";
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedCrate1) : DeployedCrate {
|
||||
shapeFile = "stackable1m.dts";
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedCrate2) : DeployedCrate {
|
||||
shapeFile = "stackable1l.dts";
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedCrate3) : DeployedCrate {
|
||||
shapeFile = "stackable2s.dts";
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedCrate4) : DeployedCrate {
|
||||
shapeFile = "stackable2m.dts";
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedCrate5) : DeployedCrate {
|
||||
shapeFile = "stackable2l.dts";
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedCrate6) : DeployedCrate {
|
||||
shapeFile = "stackable3s.dts";
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedCrate7) : DeployedCrate {
|
||||
shapeFile = "stackable3m.dts";
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedCrate8) : DeployedCrate {
|
||||
shapeFile = "stackable3l.dts";
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedCrate9) : DeployedCrate {
|
||||
shapeFile = "stackable4m.dts";
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedCrate10) : DeployedCrate {
|
||||
shapeFile = "stackable4l.dts";
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedCrate11) : DeployedCrate {
|
||||
shapeFile = "stackable5m.dts";
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedCrate12) : DeployedCrate {
|
||||
shapeFile = "stackable5l.dts";
|
||||
};
|
||||
|
||||
datablock ShapeBaseImageData(CrateDeployableImage) {
|
||||
mass = 1;
|
||||
emap = true;
|
||||
shapeFile = "stackable1s.dts";
|
||||
item = CrateDeployable;
|
||||
mountPoint = 1;
|
||||
offset = "0 0 0";
|
||||
deployed = DeployedCrate;
|
||||
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 ItemData(CrateDeployable) {
|
||||
className = Pack;
|
||||
catagory = "Deployables";
|
||||
shapeFile = "stackable1s.dts";
|
||||
mass = 1;
|
||||
elasticity = 0.2;
|
||||
friction = 0.6;
|
||||
pickupRadius = 1;
|
||||
rotate = true;
|
||||
image = "CrateDeployableImage";
|
||||
pickUpName = "a crate pack";
|
||||
heatSignature = 0;
|
||||
emap = true;
|
||||
};
|
||||
|
||||
function CrateDeployableImage::testObjectTooClose(%item) {
|
||||
return "";
|
||||
}
|
||||
|
||||
function CrateDeployableImage::testNoTerrainFound(%item) {
|
||||
// don't check this for non-Landspike turret deployables
|
||||
}
|
||||
|
||||
function CrateDeployable::onPickup(%this, %obj, %shape, %amount) {
|
||||
// created to prevent console errors
|
||||
}
|
||||
|
||||
function CrateDeployableImage::onDeploy(%item, %plyr, %slot) {
|
||||
%className = "StaticShape";
|
||||
|
||||
%playerVector = vectorNormalize(-1 * getWord(%plyr.getEyeVector(),1) SPC getWord(%plyr.getEyeVector(),0) SPC "0");
|
||||
%item.surfaceNrm2 = %playerVector;
|
||||
%rot = fullRot(%item.surfaceNrm,%item.surfaceNrm2);
|
||||
|
||||
%deplObj = new (%className)() {
|
||||
dataBlock = %item.deployed @ %plyr.packSet;
|
||||
};
|
||||
|
||||
// set orientation
|
||||
%deplObj.setTransform(%item.surfacePt SPC %rot);
|
||||
|
||||
// set the recharge rate right away
|
||||
if (%deplObj.getDatablock().rechargeRate)
|
||||
%deplObj.setRechargeRate(%deplObj.getDatablock().rechargeRate);
|
||||
|
||||
// set team, owner, and handle
|
||||
%deplObj.team = %plyr.client.Team;
|
||||
%deplObj.setOwner(%plyr);
|
||||
|
||||
// place the deployable in the MissionCleanup/Deployables group (AI reasons)
|
||||
addToDeployGroup(%deplObj);
|
||||
|
||||
//let the AI know as well...
|
||||
AIDeployObject(%plyr.client, %deplObj);
|
||||
|
||||
// play the deploy sound
|
||||
serverPlay3D(%item.deploySound, %deplObj.getTransform());
|
||||
|
||||
// increment the team count for this deployed object
|
||||
$TeamDeployedCount[%plyr.team, %item.item]++;
|
||||
|
||||
addDSurface(%item.surface,%deplObj);
|
||||
|
||||
// take the deployable off the player's back and out of inventory
|
||||
%plyr.unmountImage(%slot);
|
||||
%plyr.decInventory(%item.item, 1);
|
||||
|
||||
return %deplObj;
|
||||
}
|
||||
|
||||
function DeployedCrate::onDestroyed(%this,%obj,%prevState) {
|
||||
if (%obj.isRemoved)
|
||||
return;
|
||||
%obj.isRemoved = true;
|
||||
Parent::onDestroyed(%this,%obj,%prevState);
|
||||
$TeamDeployedCount[%obj.team, CrateDeployable]--;
|
||||
remDSurface(%obj);
|
||||
%obj.schedule(500, "delete");
|
||||
}
|
||||
|
||||
function CrateDeployableImage::onMount(%data, %obj, %node) {
|
||||
%obj.hasCrate = true; // set for cratecheck
|
||||
%obj.packSet = 0;
|
||||
}
|
||||
|
||||
function CrateDeployableImage::onUnmount(%data, %obj, %node) {
|
||||
%obj.hasCrate = "";
|
||||
%obj.packSet = 0;
|
||||
}
|
||||
|
||||
function DeployedCrate0::onDestroyed(%this,%obj,%prevState) {
|
||||
DeployedCrate::onDestroyed(%this,%obj,%prevState);
|
||||
}
|
||||
|
||||
function DeployedCrate1::onDestroyed(%this,%obj,%prevState) {
|
||||
DeployedCrate::onDestroyed(%this,%obj,%prevState);
|
||||
}
|
||||
|
||||
function DeployedCrate2::onDestroyed(%this,%obj,%prevState) {
|
||||
DeployedCrate::onDestroyed(%this,%obj,%prevState);
|
||||
}
|
||||
|
||||
function DeployedCrate3::onDestroyed(%this,%obj,%prevState) {
|
||||
DeployedCrate::onDestroyed(%this,%obj,%prevState);
|
||||
}
|
||||
|
||||
function DeployedCrate4::onDestroyed(%this,%obj,%prevState) {
|
||||
DeployedCrate::onDestroyed(%this,%obj,%prevState);
|
||||
}
|
||||
|
||||
function DeployedCrate5::onDestroyed(%this,%obj,%prevState) {
|
||||
DeployedCrate::onDestroyed(%this,%obj,%prevState);
|
||||
}
|
||||
|
||||
function DeployedCrate6::onDestroyed(%this,%obj,%prevState) {
|
||||
DeployedCrate::onDestroyed(%this,%obj,%prevState);
|
||||
}
|
||||
|
||||
function DeployedCrate7::onDestroyed(%this,%obj,%prevState) {
|
||||
DeployedCrate::onDestroyed(%this,%obj,%prevState);
|
||||
}
|
||||
|
||||
function DeployedCrate8::onDestroyed(%this,%obj,%prevState) {
|
||||
DeployedCrate::onDestroyed(%this,%obj,%prevState);
|
||||
}
|
||||
|
||||
function DeployedCrate9::onDestroyed(%this,%obj,%prevState) {
|
||||
DeployedCrate::onDestroyed(%this,%obj,%prevState);
|
||||
}
|
||||
|
||||
function DeployedCrate10::onDestroyed(%this,%obj,%prevState) {
|
||||
DeployedCrate::onDestroyed(%this,%obj,%prevState);
|
||||
}
|
||||
|
||||
function DeployedCrate11::onDestroyed(%this,%obj,%prevState) {
|
||||
DeployedCrate::onDestroyed(%this,%obj,%prevState);
|
||||
}
|
||||
|
||||
function DeployedCrate12::onDestroyed(%this,%obj,%prevState) {
|
||||
DeployedCrate::onDestroyed(%this,%obj,%prevState);
|
||||
}
|
||||
51
scripts/packs/deconExamples.cs
Normal file
51
scripts/packs/deconExamples.cs
Normal file
|
|
@ -0,0 +1,51 @@
|
|||
//------------------------------------------------
|
||||
// Examples of item specific disassemble.
|
||||
//================================================
|
||||
// ----------------
|
||||
// 1. ONE
|
||||
// ================
|
||||
function TelePadDeployedBase::disassemble(%data, %plyr, %hTgt)
|
||||
{
|
||||
%teleteam = %hTgt.team;
|
||||
if(%obj.Hacked) // is it hacked currently?
|
||||
{
|
||||
%teleteam = %hTgt.OldTeam;
|
||||
echo("hacked!");
|
||||
}
|
||||
|
||||
// dising a telepad makes it yours, remove from the other teams list
|
||||
if($TeamDeployedCount[%teleteam, TelePadPack] > 0) // this wasnt the last
|
||||
{
|
||||
if($firstPad[%teleteam] == %hTgt) // the first was disassembled
|
||||
{
|
||||
echo("first pad disassembled");
|
||||
$firstPad[%teleteam] = %ohTgtbj.nextPad; // make the second one the first
|
||||
%hTgt.prevPad = -1;
|
||||
%hTgt.nextPad = %obj;
|
||||
}
|
||||
else
|
||||
{
|
||||
%lastPad = $firstPad[%teleteam];
|
||||
%hTgt.prevPad.nextPad = %hTgt.nextPad;
|
||||
%hTgt.nextPad.prevPad = %hTgt.prevPad;
|
||||
}
|
||||
|
||||
}
|
||||
else // last one
|
||||
{
|
||||
$firstPad[%teleteam] = ""; // remove it
|
||||
}
|
||||
|
||||
%hTgt.shield.delete();
|
||||
}
|
||||
|
||||
// --------------
|
||||
// 2. Two
|
||||
// ==============
|
||||
|
||||
function MobileBaseVehicle::disassemble(%data, %plyr, %hTgt)
|
||||
{
|
||||
%mpbpos = %hTgt.gettransform();
|
||||
%hTgt.delete();
|
||||
teleporteffect(posfromtransform(%mpbpos));
|
||||
}
|
||||
376
scripts/packs/decorationpack.cs
Normal file
376
scripts/packs/decorationpack.cs
Normal file
|
|
@ -0,0 +1,376 @@
|
|||
//---------------------------------------------------------
|
||||
// Deployable Decoration
|
||||
//---------------------------------------------------------
|
||||
|
||||
datablock StaticShapeData(DeployedDecoration) : StaticShapeDamageProfile {
|
||||
className = "decoration";
|
||||
shapeFile = "banner_unity.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 Decoration';
|
||||
deployAmbientThread = true;
|
||||
debrisShapeName = "debris_generic_small.dts";
|
||||
debris = DeployableDebris;
|
||||
heatSignature = 0;
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedDecoration0) : DeployedDecoration {
|
||||
shapeFile = "banner_unity.dts";
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedDecoration1) : DeployedDecoration {
|
||||
shapeFile = "banner_strength.dts";
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedDecoration2) : DeployedDecoration {
|
||||
shapeFile = "banner_honor.dts";
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedDecoration3) : DeployedDecoration {
|
||||
shapeFile = "light_male_dead.dts";
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedDecoration4) : DeployedDecoration {
|
||||
shapeFile = "medium_male_dead.dts";
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedDecoration5) : DeployedDecoration {
|
||||
shapeFile = "heavy_male_dead.dts";
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedDecoration6) : DeployedDecoration {
|
||||
shapeFile = "statue_base.dts";
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedDecoration7) : DeployedDecoration {
|
||||
shapeFile = "statue_lmale.dts";
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedDecoration8) : DeployedDecoration {
|
||||
shapeFile = "statue_lfemale.dts";
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedDecoration9) : DeployedDecoration {
|
||||
shapeFile = "statue_hmale.dts";
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedDecoration10) : DeployedDecoration {
|
||||
shapeFile = "vehicle_grav_tank_wreck.dts";
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedDecoration11) : DeployedDecoration {
|
||||
shapeFile = "vehicle_air_scout_wreck.dts";
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedDecoration12) : DeployedDecoration {
|
||||
shapeFile = "billboard_1.dts";
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedDecoration13) : DeployedDecoration {
|
||||
shapeFile = "billboard_2.dts";
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedDecoration14) : DeployedDecoration {
|
||||
shapeFile = "billboard_3.dts";
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedDecoration15) : DeployedDecoration {
|
||||
shapeFile = "billboard_4.dts";
|
||||
};
|
||||
|
||||
datablock ShapeBaseImageData(DecorationDeployableImage) {
|
||||
mass = 1;
|
||||
emap = true;
|
||||
shapeFile = "statue_lfemale.dts"; // "stackable1s.dts";
|
||||
item = DecorationDeployable;
|
||||
mountPoint = 1;
|
||||
offset = "0 -0.6 -1.9";
|
||||
rotation = "0 0.1 1 180";
|
||||
deployed = DeployedDecoration;
|
||||
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 ItemData(DecorationDeployable) {
|
||||
className = Pack;
|
||||
catagory = "Deployables";
|
||||
shapeFile = "stackable1s.dts";
|
||||
mass = 1;
|
||||
elasticity = 0.2;
|
||||
friction = 0.6;
|
||||
pickupRadius = 1;
|
||||
rotate = true;
|
||||
image = "DecorationDeployableImage";
|
||||
pickUpName = "a decoration pack";
|
||||
heatSignature = 0;
|
||||
emap = true;
|
||||
};
|
||||
|
||||
function DecorationDeployableImage::testObjectTooClose(%item) {
|
||||
return "";
|
||||
}
|
||||
|
||||
function DecorationDeployableImage::testNoTerrainFound(%item) {
|
||||
// don't check this for non-Landspike turret deployables
|
||||
}
|
||||
|
||||
function DecorationDeployable::onPickup(%this, %obj, %shape, %amount) {
|
||||
// created to prevent console errors
|
||||
}
|
||||
|
||||
function DecorationDeployableImage::onDeploy(%item, %plyr, %slot) {
|
||||
%className = "StaticShape";
|
||||
|
||||
%playerVector = vectorNormalize(-1 * getWord(%plyr.getEyeVector(),1) SPC getWord(%plyr.getEyeVector(),0) SPC "0");
|
||||
|
||||
if (vAbs(floorVec(%item.surfaceNrm,100)) $= "0 0 1") {
|
||||
if (%plyr.packSet == 3 || %plyr.packSet == 5)
|
||||
%item.surfaceNrm2 = vectorScale(%playerVector,-1);
|
||||
else
|
||||
%item.surfaceNrm2 = %playerVector;
|
||||
}
|
||||
else {
|
||||
if (%plyr.packSet < 3)
|
||||
%item.surfaceNrm2 = vectorNormalize(vectorCross(%item.surfaceNrm,"0 0 1"));
|
||||
else {
|
||||
%item.surfaceNrm2 = %playerVector;
|
||||
if (%plyr.packSet == 3 || %plyr.packSet == 5)
|
||||
%item.surfaceNrm2 = vectorScale(%item.surfaceNrm2,-1);
|
||||
}
|
||||
}
|
||||
if (%item.surface.needsFit == 1) {
|
||||
if (%plyr.packSet > 5 && %plyr.packSet < 10 && %item.surface.getDataBlock().getName() $= "DeployedDecoration6") {
|
||||
%item.surfaceNrm2 = vectorCross(%item.surfaceNrm,realVec(%item.surface,"0 -1 0"));
|
||||
}
|
||||
}
|
||||
%item.surfaceNrm3 = vectorCross(%item.surfaceNrm,%item.surfaceNrm2);
|
||||
|
||||
|
||||
%rot = fullRot(%item.surfaceNrm,%item.surfaceNrm2);
|
||||
|
||||
%deplObj = new (%className)() {
|
||||
dataBlock = %item.deployed @ %plyr.packSet;
|
||||
};
|
||||
|
||||
if (%plyr.packSet < 3) {
|
||||
%surfacePt2 = %item.surfacePt;
|
||||
%rot2 = %rot;
|
||||
%item.surfaceNrm2 = vectorScale(%item.surfaceNrm2,-1);
|
||||
%item.surfacePt = vectorAdd(%item.surfacePt,vectorScale(%item.surfaceNrm3,2.80));
|
||||
%item.surfacePt = vectorAdd(%item.surfacePt,vectorScale(%item.surfaceNrm,0.25));
|
||||
%rot = rotAdd(%rot,"1 0 0" SPC $Pi / 2);
|
||||
%rot = rotAdd(%rot,"0 1 0" SPC $Pi);
|
||||
%deplObj.lTarget = new StaticShape () {
|
||||
datablock = DeployedLTarget;
|
||||
scale = 2.5/4 SPC 5/3 SPC 0.15 * 2;
|
||||
};
|
||||
%deplObj.lTarget.setTransform(%surfacePt2 SPC %rot2);
|
||||
%deplObj.lTarget.lMain = %deplObj;
|
||||
}
|
||||
|
||||
if (%plyr.packSet > 2 && %plyr.packSet < 6) {
|
||||
%surfacePt2 = vectorAdd(%item.surfacePt,vectorScale(%item.surfaceNrm,0.2));
|
||||
%rot2 = %rot;
|
||||
if (%plyr.packSet == 3) {
|
||||
%surfacePt2 = vectorAdd(%surfacePt2,vectorScale(%item.surfaceNrm2,-0.14));
|
||||
%surfacePt2 = vectorAdd(%surfacePt2,vectorScale(%item.surfaceNrm3,0.51));
|
||||
}
|
||||
else if (%plyr.packSet == 4) {
|
||||
%surfacePt2 = vectorAdd(%surfacePt2,vectorScale(%item.surfaceNrm2,0.25));
|
||||
%surfacePt2 = vectorAdd(%surfacePt2,vectorScale(%item.surfaceNrm3,-0.4));
|
||||
}
|
||||
else if (%plyr.packSet == 5) {
|
||||
%surfacePt2 = vectorAdd(%surfacePt2,vectorScale(%item.surfaceNrm2,0.05));
|
||||
%surfacePt2 = vectorAdd(%surfacePt2,vectorScale(%item.surfaceNrm3,0.4));
|
||||
%rot = rotAdd(%rot,"0 0 -1" SPC $Pi / 4);
|
||||
}
|
||||
%deplObj.lTarget = new StaticShape () {
|
||||
datablock = DeployedLTarget;
|
||||
scale = 0.4/4 SPC 0.5/3 SPC 0.05 * 2;
|
||||
};
|
||||
%deplObj.lTarget.setTransform(%surfacePt2 SPC %rot2);
|
||||
%deplObj.lTarget.lMain = %deplObj;
|
||||
}
|
||||
|
||||
if (%plyr.packSet == 11)
|
||||
%item.surfacePt = vectorAdd(%item.surfacePt,vectorScale(%item.surfaceNrm,-2));
|
||||
|
||||
if (%plyr.packSet > 11 && %plyr.packSet < 16) {
|
||||
%surfacePt2 = %item.surfacePt;
|
||||
%rot2 = %rot;
|
||||
%item.surfaceNrm2 = vectorScale(%item.surfaceNrm2,-1);
|
||||
%item.surfacePt = vectorAdd(%item.surfacePt,vectorScale(%item.surfaceNrm,10.9));
|
||||
%surfacePt2 = vectorAdd(%surfacePt2,vectorScale(%item.surfaceNrm,34));
|
||||
%surfacePt2 = vectorAdd(%surfacePt2,vectorScale(%item.surfaceNrm3,-1));
|
||||
%rot2 = rotAdd(%rot,"1 0 0" SPC $Pi / 2);
|
||||
%deplObj.lTarget = new StaticShape () {
|
||||
datablock = DeployedLTarget;
|
||||
scale = 74/4 SPC 49/3 SPC 4;
|
||||
};
|
||||
%deplObj.lTarget.setTransform(%surfacePt2 SPC %rot2);
|
||||
%deplObj.lTarget.lMain = %deplObj;
|
||||
}
|
||||
|
||||
// set orientation
|
||||
%deplObj.setTransform(%item.surfacePt SPC %rot);
|
||||
|
||||
// set the recharge rate right away
|
||||
if (%deplObj.getDatablock().rechargeRate) {
|
||||
%deplObj.setRechargeRate(%deplObj.getDatablock().rechargeRate);
|
||||
%deplObj.lTarget.setRechargeRate(%deplObj.getDatablock().rechargeRate);
|
||||
}
|
||||
|
||||
// [[Settings]]:
|
||||
%deplObj.needsFit = 1;
|
||||
|
||||
// set team, owner, and handle
|
||||
%deplObj.team = %plyr.client.Team;
|
||||
%deplObj.setOwner(%plyr);
|
||||
if (%deplObj.lTarget) {
|
||||
%deplObj.lTarget.team = %plyr.client.Team;
|
||||
%deplObj.lTarget.setOwner(%plyr);
|
||||
}
|
||||
|
||||
// place the deployable in the MissionCleanup/Deployables group (AI reasons)
|
||||
addToDeployGroup(%deplObj);
|
||||
if (%deplObj.lTarget)
|
||||
addToDeployGroup(%deplObj.lTarget);
|
||||
|
||||
//let the AI know as well...
|
||||
AIDeployObject(%plyr.client,%deplObj);
|
||||
if (%deplObj.lTarget)
|
||||
AIDeployObject(%plyr.client,%deplObj.lTarget);
|
||||
|
||||
// play the deploy sound
|
||||
serverPlay3D(%item.deploySound, %deplObj.getTransform());
|
||||
|
||||
// increment the team count for this deployed object
|
||||
$TeamDeployedCount[%plyr.team, %item.item]++;
|
||||
|
||||
addDSurface(%item.surface,%deplObj);
|
||||
if (%deplObj.lTarget)
|
||||
addDSurface(%deplObj,%deplObj.lTarget);
|
||||
|
||||
// take the deployable off the player's back and out of inventory
|
||||
%plyr.unmountImage(%slot);
|
||||
%plyr.decInventory(%item.item, 1);
|
||||
|
||||
return %deplObj;
|
||||
}
|
||||
|
||||
function DeployedDecoration::onDestroyed(%this,%obj,%prevState) {
|
||||
if (%obj.isRemoved)
|
||||
return;
|
||||
%obj.isRemoved = true;
|
||||
Parent::onDestroyed(%this,%obj,%prevState);
|
||||
$TeamDeployedCount[%obj.team, DecorationDeployable]--;
|
||||
remDSurface(%obj);
|
||||
%obj.schedule(500, "delete");
|
||||
if (isObject(%obj.lTarget))
|
||||
%obj.lTarget.schedule(500, "delete");
|
||||
fireBallExplode(%obj,1);
|
||||
}
|
||||
|
||||
function DecorationDeployableImage::onMount(%data, %obj, %node) {
|
||||
%obj.hasDecoration = true; // set for decorationcheck
|
||||
%obj.packSet = 0;
|
||||
}
|
||||
|
||||
function DecorationDeployableImage::onUnmount(%data, %obj, %node) {
|
||||
%obj.hasDecoration = "";
|
||||
%obj.packSet = 0;
|
||||
}
|
||||
|
||||
function DeployedDecoration0::onDestroyed(%this,%obj,%prevState) {
|
||||
DeployedDecoration::onDestroyed(%this,%obj,%prevState);
|
||||
}
|
||||
|
||||
function DeployedDecoration1::onDestroyed(%this,%obj,%prevState) {
|
||||
DeployedDecoration::onDestroyed(%this,%obj,%prevState);
|
||||
}
|
||||
|
||||
function DeployedDecoration2::onDestroyed(%this,%obj,%prevState) {
|
||||
DeployedDecoration::onDestroyed(%this,%obj,%prevState);
|
||||
}
|
||||
|
||||
function DeployedDecoration3::onDestroyed(%this,%obj,%prevState) {
|
||||
DeployedDecoration::onDestroyed(%this,%obj,%prevState);
|
||||
}
|
||||
|
||||
function DeployedDecoration4::onDestroyed(%this,%obj,%prevState) {
|
||||
DeployedDecoration::onDestroyed(%this,%obj,%prevState);
|
||||
}
|
||||
|
||||
function DeployedDecoration5::onDestroyed(%this,%obj,%prevState) {
|
||||
DeployedDecoration::onDestroyed(%this,%obj,%prevState);
|
||||
}
|
||||
|
||||
function DeployedDecoration6::onDestroyed(%this,%obj,%prevState) {
|
||||
DeployedDecoration::onDestroyed(%this,%obj,%prevState);
|
||||
}
|
||||
|
||||
function DeployedDecoration7::onDestroyed(%this,%obj,%prevState) {
|
||||
DeployedDecoration::onDestroyed(%this,%obj,%prevState);
|
||||
}
|
||||
|
||||
function DeployedDecoration8::onDestroyed(%this,%obj,%prevState) {
|
||||
DeployedDecoration::onDestroyed(%this,%obj,%prevState);
|
||||
}
|
||||
|
||||
function DeployedDecoration9::onDestroyed(%this,%obj,%prevState) {
|
||||
DeployedDecoration::onDestroyed(%this,%obj,%prevState);
|
||||
}
|
||||
|
||||
function DeployedDecoration10::onDestroyed(%this,%obj,%prevState) {
|
||||
DeployedDecoration::onDestroyed(%this,%obj,%prevState);
|
||||
}
|
||||
|
||||
function DeployedDecoration11::onDestroyed(%this,%obj,%prevState) {
|
||||
DeployedDecoration::onDestroyed(%this,%obj,%prevState);
|
||||
}
|
||||
|
||||
function DeployedDecoration12::onDestroyed(%this,%obj,%prevState) {
|
||||
DeployedDecoration::onDestroyed(%this,%obj,%prevState);
|
||||
}
|
||||
|
||||
function DeployedDecoration13::onDestroyed(%this,%obj,%prevState) {
|
||||
DeployedDecoration::onDestroyed(%this,%obj,%prevState);
|
||||
}
|
||||
|
||||
function DeployedDecoration14::onDestroyed(%this,%obj,%prevState) {
|
||||
DeployedDecoration::onDestroyed(%this,%obj,%prevState);
|
||||
}
|
||||
|
||||
function DeployedDecoration15::onDestroyed(%this,%obj,%prevState) {
|
||||
DeployedDecoration::onDestroyed(%this,%obj,%prevState);
|
||||
}
|
||||
|
||||
function DeployedDecoration16::onDestroyed(%this,%obj,%prevState) {
|
||||
DeployedDecoration::onDestroyed(%this,%obj,%prevState);
|
||||
}
|
||||
257
scripts/packs/discturret.cs
Normal file
257
scripts/packs/discturret.cs
Normal file
|
|
@ -0,0 +1,257 @@
|
|||
//--------------------------------------------------------------------------
|
||||
// Datablocks Disc turret
|
||||
//--------------------------------------
|
||||
|
||||
datablock SensorData(DiscTurretSensor)
|
||||
{
|
||||
detects = true;
|
||||
detectsUsingLOS = true;
|
||||
detectsPassiveJammed = false;
|
||||
detectsActiveJammed = false;
|
||||
detectsCloaked = false;
|
||||
detectionPings = true;
|
||||
detectRadius = 60;
|
||||
};
|
||||
|
||||
datablock TurretData(DiscTurretDeployed) : TurretDamageProfile
|
||||
{
|
||||
className = DeployedTurret;
|
||||
shapeFile = "turret_outdoor_deploy.dts";
|
||||
mass = 1;
|
||||
maxDamage = 1.5; //was 0.5;
|
||||
destroyedLevel = 0.5;
|
||||
disabledLevel = 0.21;
|
||||
explosion = SmallTurretExplosion;
|
||||
expDmgRadius = 5.0;
|
||||
expDamage = 0.25;
|
||||
expImpulse = 500.0;
|
||||
repairRate = 0;
|
||||
heatSignature = 0.0;
|
||||
deployedObject = true;
|
||||
thetaMin = 5;
|
||||
thetaMax = 145;
|
||||
thetaNull = 90;
|
||||
primaryAxis = zaxis;
|
||||
isShielded = true;
|
||||
energyPerDamagePoint = 30;
|
||||
maxEnergy = 50;
|
||||
rechargeRate = 0.20; //was 0.10;
|
||||
barrel = DeployableDiscTurretBarrel;
|
||||
canControl = true;
|
||||
cmdCategory = "DTactical";
|
||||
cmdIcon = CMDTurretIcon;
|
||||
cmdMiniIconName = "commander/MiniIcons/com_turret_grey";
|
||||
targetNameTag = 'Disc';
|
||||
targetTypeTag = 'Turret';
|
||||
sensorData = DiscTurretSensor;
|
||||
sensorRadius = DiscTurretSensor.detectRadius;
|
||||
sensorColor = "191 0 226";
|
||||
firstPersonOnly = true;
|
||||
renderWhenDestroyed = true;
|
||||
debrisShapeName = "debris_generic_small.dts";
|
||||
debris = TurretDebrisSmall;
|
||||
};
|
||||
|
||||
datablock TurretImageData(DeployableDiscTurretBarrel)
|
||||
{
|
||||
shapeFile = "weapon_disc.dts";
|
||||
item = DiscTurretBarrel;
|
||||
rotation = "0 1 0 90";
|
||||
//rotation = "0 0 0 0";
|
||||
offset = "0 0 0";
|
||||
projectile = DiscProjectile;
|
||||
projectileType = LinearProjectile;
|
||||
usesEnergy = true;
|
||||
fireEnergy = 10; ///was 20
|
||||
minEnergy = 10; ///was 20
|
||||
lightType = "WeaponFireLight";
|
||||
lightColor = "0.25 0.15 0.15 1.0";
|
||||
lightTime = "1000";
|
||||
lightRadius = "2";
|
||||
muzzleFlash = IndoorTurretMuzzleFlash;
|
||||
|
||||
// Turret parameters
|
||||
activationMS = 150;
|
||||
deactivateDelayMS = 300;
|
||||
thinkTimeMS = 150;
|
||||
degPerSecTheta = 580;
|
||||
degPerSecPhi = 960;
|
||||
attackRadius = 150; //100
|
||||
|
||||
// State Data
|
||||
stateName[0] = "Preactivate";
|
||||
stateTransitionOnLoaded[0] = "Activate";
|
||||
stateTransitionOnNoAmmo[0] = "NoAmmo";
|
||||
|
||||
stateName[1] = "Activate";
|
||||
stateTransitionOnTimeout[1] = "Ready";
|
||||
stateTimeoutValue[1] = 0.05;
|
||||
stateSequence[1] = "Activated";
|
||||
stateSound[1] = DiscSwitchSound;
|
||||
|
||||
stateName[2] = "Ready";
|
||||
stateTransitionOnNoAmmo[2] = "NoAmmo";
|
||||
stateTransitionOnTriggerDown[2] = "Fire";
|
||||
stateSequence[2] = "DiscSpin";
|
||||
stateSound[2] = DiscLoopSound;
|
||||
|
||||
stateName[3] = "Fire";
|
||||
stateTransitionOnTimeout[3] = "Reload";
|
||||
stateTimeoutValue[3] = 0.025;
|
||||
stateFire[3] = true;
|
||||
stateRecoil[3] = LightRecoil;
|
||||
stateAllowImageChange[3] = false;
|
||||
stateSequence[3] = "Fire";
|
||||
stateScript[3] = "onFire";
|
||||
stateSound[3] = DiscFireSound;
|
||||
|
||||
stateName[4] = "Reload";
|
||||
stateTransitionOnNoAmmo[4] = "NoAmmo";
|
||||
stateTransitionOnTimeout[4] = "Ready";
|
||||
stateTimeoutValue[4] = 0.1; // 0.25 load, 0.25 spinup
|
||||
stateAllowImageChange[4] = false;
|
||||
stateSequence[4] = "Reload";
|
||||
stateSound[4] = DiscReloadSound;
|
||||
|
||||
stateName[5] = "NoAmmo";
|
||||
stateTransitionOnAmmo[5] = "Reload";
|
||||
stateSequence[5] = "NoAmmo";
|
||||
stateTransitionOnTriggerDown[5] = "DryFire";
|
||||
|
||||
stateName[6] = "DryFire";
|
||||
//stateSound[6] = DiscDryFireSound;
|
||||
stateTimeoutValue[6] = 0.1;
|
||||
stateTransitionOnTimeout[6] = "NoAmmo";
|
||||
|
||||
};
|
||||
datablock ShapeBaseImageData(DiscTurretDeployableImage)
|
||||
{
|
||||
mass = 1;
|
||||
shapeFile = "pack_deploy_turreti.dts";
|
||||
item = DiscTurretDeployable;
|
||||
mountPoint = 1;
|
||||
offset = "0 0 0";
|
||||
deployed = DiscTurretDeployed;
|
||||
stateName[0] = "Idle";
|
||||
stateTransitionOnTriggerDown[0] = "Activate";
|
||||
|
||||
stateName[1] = "Activate";
|
||||
stateScript[1] = "onActivate";
|
||||
stateTransitionOnTriggerUp[1] = "Idle";
|
||||
|
||||
isLarge = true;
|
||||
emap = true;
|
||||
maxDepSlope = 360;
|
||||
deploySound = TurretDeploySound;
|
||||
minDeployDis = 0.5;
|
||||
maxDeployDis = 5.0;
|
||||
};
|
||||
|
||||
datablock ItemData(DiscTurretDeployable)
|
||||
{
|
||||
className = Pack;
|
||||
catagory = "Deployables";
|
||||
shapeFile = "pack_deploy_turreti.dts";
|
||||
mass = 1;
|
||||
elasticity = 0.2;
|
||||
friction = 0.6;
|
||||
pickupRadius = 1;
|
||||
rotate = false;
|
||||
image = "DiscTurretDeployableImage";
|
||||
pickUpName = "a disc turret pack";
|
||||
emap = true;
|
||||
};
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
// Functions
|
||||
//--------------------------------------
|
||||
|
||||
function DiscTurretDeployableImage::testNoTerrainFound(%item)
|
||||
{
|
||||
// created to prevent console errors
|
||||
}
|
||||
|
||||
function DiscTurretDeployableImage::testNoInteriorFound(%item)
|
||||
{
|
||||
// created to prevent console errors
|
||||
}
|
||||
|
||||
function DiscTurretDeployableImage::onDeploy(%item, %plyr, %slot)
|
||||
{
|
||||
%searchRange = 5.0;
|
||||
%mask = $TypeMasks::TerrainObjectType | $TypeMasks::InteriorObjectType;
|
||||
%eyeVec = %plyr.getEyeVector();
|
||||
%eyeTrans = %plyr.getEyeTransform();
|
||||
%eyePos = posFromTransform(%eyeTrans);
|
||||
%nEyeVec = VectorNormalize(%eyeVec);
|
||||
%scEyeVec = VectorScale(%nEyeVec, %searchRange);
|
||||
%eyeEnd = VectorAdd(%eyePos, %scEyeVec);
|
||||
//%searchResult = containerRayCast(%eyePos, %eyeEnd, %mask, 0);
|
||||
//if(!%searchResult ) {
|
||||
//messageClient(%plyr.client, 'MsgBeaconNoSurface', 'c2Cannot place turret. You are too far from surface.');
|
||||
//return 0;
|
||||
//}
|
||||
%terrPt = %item.surfacept;
|
||||
%terrNrm = %item.surfacenrm;
|
||||
%intAngle = getTerrainAngle(%terrNrm);
|
||||
%rotAxis = vectorNormalize(vectorCross(%terrNrm, "0 0 1"));
|
||||
if ((getWord(%terrNrm, 2) == 1) || (getWord(%terrNrm, 2) == -1))
|
||||
%rotAxis = vectorNormalize(vectorCross(%terrNrm, "0 1 0"));
|
||||
%rotation = %rotAxis @ " " @ %intAngle;
|
||||
%plyr.unmountImage(%slot);
|
||||
%plyr.decInventory(%item.item, 1);
|
||||
|
||||
%deplObj = new Turret() {
|
||||
dataBlock = %item.deployed;
|
||||
position = VectorAdd(%terrPt, VectorScale(%terrNrm, 0.03));
|
||||
rotation = %rotation;
|
||||
};
|
||||
addDSurface(%item.surface,%deplObj);
|
||||
%deplObj.setRechargeRate(%deplObj.getDatablock().rechargeRate);
|
||||
%deplObj.team = %plyr.client.team;
|
||||
%deplObj.setOwner(%plyr);
|
||||
%deplObj.setOwnerClient(%plyr.client);
|
||||
if(%deplObj.getTarget() != -1)
|
||||
setTargetSensorGroup(%deplObj.getTarget(), %plyr.client.team);
|
||||
|
||||
addToDeployGroup(%deplObj);
|
||||
AIDeployObject(%plyr.client, %deplObj);
|
||||
serverPlay3D(%item.deploySound, %deplObj.getTransform());
|
||||
$TeamDeployedCount[%plyr.team, %item.item]++;
|
||||
%deplObj.deploy();
|
||||
%deplObj.playThread($AmbientThread, "ambient");
|
||||
return %deplObj;
|
||||
}
|
||||
|
||||
function DiscTurretDeployable::onPickup(%this, %obj, %shape, %amount)
|
||||
{
|
||||
// created to prevent console errors
|
||||
}
|
||||
|
||||
function DeployableDiscTurretBarrel::onFire( %data, %obj, %slot ) {
|
||||
%energy = %obj.getEnergyLevel();
|
||||
%p = new (LinearProjectile)() {
|
||||
dataBlock = DiscProjectile;
|
||||
initialDirection = %obj.getMuzzleVector(%slot);
|
||||
initialPosition = %obj.getMuzzlePoint(%slot);
|
||||
sourceObject = %obj;
|
||||
damageFactor = 1;
|
||||
sourceSlot = %slot;
|
||||
};
|
||||
%obj.lastProjectile = %p;
|
||||
MissionCleanup.add(%p);
|
||||
%obj.setEnergyLevel(%energy - %data.fireEnergy);
|
||||
}
|
||||
|
||||
function DiscTurretDeployed::onDestroyed(%this, %obj, %prevState) {
|
||||
if (%obj.isRemoved)
|
||||
return;
|
||||
if ($Host::InvincibleDeployables != 1 || %obj.damageFailedDecon) {
|
||||
%obj.isRemoved = true;
|
||||
$TeamDeployedCount[%obj.team, DiscTurretDeployable]--;
|
||||
remDSurface(%obj);
|
||||
%obj.schedule(500, "delete");
|
||||
}
|
||||
Parent::onDestroyed(%this, %obj, %prevState);
|
||||
}
|
||||
|
||||
330
scripts/packs/door.cs
Normal file
330
scripts/packs/door.cs
Normal file
|
|
@ -0,0 +1,330 @@
|
|||
//client.player.setInventory(doorDeployable,1,true);
|
||||
//---------------------------------------------------------
|
||||
// Deployable mspine, Code by Parousia
|
||||
//---------------------------------------------------------
|
||||
datablock StaticShapeData(DeployedDoor) : StaticShapeDamageProfile {
|
||||
className = "door";
|
||||
shapeFile = "Pmiscf.dts"; // b or dmiscf.dts, alternate
|
||||
|
||||
maxDamage = 2;
|
||||
destroyedLevel = 2;
|
||||
disabledLevel = 1.5;
|
||||
|
||||
isShielded = true;
|
||||
energyPerDamagePoint = 60;
|
||||
maxEnergy = 100;
|
||||
rechargeRate = 0.25;
|
||||
|
||||
explosion = HandGrenadeExplosion;
|
||||
expDmgRadius = 3.0;
|
||||
expDamage = 0.1;
|
||||
expImpulse = 200.0;
|
||||
|
||||
dynamicType = $TypeMasks::StaticShapeObjectType;
|
||||
deployedObject = true;
|
||||
cmdCategory = "DSupport";
|
||||
cmdIcon = CMDSensorIcon;
|
||||
cmdMiniIconName = "commander/MiniIcons/com_deploymotionsensor";
|
||||
targetNameTag = 'Door';
|
||||
deployAmbientThread = true;
|
||||
debrisShapeName = "debris_generic_small.dts";
|
||||
debris = DeployableDebris;
|
||||
heatSignature = 0;
|
||||
needsPower = true;
|
||||
};
|
||||
|
||||
datablock ShapeBaseImageData(DoorDeployableImage) {
|
||||
mass = 1;
|
||||
emap = true;
|
||||
shapeFile = "stackable1s.dts";
|
||||
item = DoorDeployable;
|
||||
mountPoint = 1;
|
||||
offset = "0 0 0";
|
||||
deployed = DeployedDoor;
|
||||
heatSignature = 0;
|
||||
|
||||
stateName[0] = "Idle";
|
||||
stateTransitionOnTriggerDown[0] = "Activate";
|
||||
|
||||
stateName[1] = "Activate";
|
||||
stateScript[1] = "onActivate";
|
||||
stateTransitionOnTriggerUp[1] = "Idle";
|
||||
|
||||
isLarge = false;
|
||||
maxDepSlope = 360;
|
||||
deploySound = ItemPickupSound;
|
||||
|
||||
minDeployDis = 0;
|
||||
maxDeployDis = 50.0;
|
||||
};
|
||||
|
||||
datablock ItemData(DoorDeployable) {
|
||||
className = Pack;
|
||||
catagory = "Deployables";
|
||||
shapeFile = "stackable1s.dts";
|
||||
mass = 1;
|
||||
elasticity = 0.2;
|
||||
friction = 0.6;
|
||||
pickupRadius = 1;
|
||||
rotate = true;
|
||||
image = "DoorDeployableImage";
|
||||
pickUpName = "a door pack made by Linker";
|
||||
heatSignature = 0;
|
||||
emap = true;
|
||||
};
|
||||
|
||||
function DoorDeployableImage::testObjectTooClose(%item) {
|
||||
return "";
|
||||
}
|
||||
|
||||
function DoorDeployableImage::testNoTerrainFound(%item) {
|
||||
// don't check this for non-Landspike turret deployables
|
||||
}
|
||||
|
||||
function DoorDeployable::onPickup(%this, %obj, %shape, %amount) {
|
||||
// created to prevent console errors
|
||||
}
|
||||
|
||||
function doorDeployableImage::onMount(%data, %obj, %node) {
|
||||
%obj.hasDoor = true; // set for blastcheck
|
||||
%obj.packSet = 0;
|
||||
%obj.expertSet = 3;
|
||||
displayPowerFreq(%obj);
|
||||
|
||||
}
|
||||
|
||||
function doorDeployableImage::onUnmount(%data, %obj, %node) {
|
||||
%obj.hasDoor = "";
|
||||
%obj.packSet = 0;
|
||||
%obj.expertSet = 0;
|
||||
}
|
||||
|
||||
function doorDeployableImage::onDeploy(%item, %plyr, %slot) {
|
||||
%className = "StaticShape";
|
||||
%grounded = 0;
|
||||
if (%item.surface.getClassName() $= TerrainBlock)
|
||||
%grounded = 1;
|
||||
|
||||
%playerVector = vectorNormalize(-1 * getWord(%plyr.getEyeVector(),1) SPC getWord(%plyr.getEyeVector(),0) SPC "0");
|
||||
|
||||
if (%item.surfaceinher == 0) {
|
||||
if (vAbs(floorVec(%item.surfaceNrm,100)) $= "0 0 1"){
|
||||
%item.surfaceNrm2 = %playerVector;
|
||||
}
|
||||
else{
|
||||
%item.surfaceNrm2 = vectorNormalize(vectorCross(%item.surfaceNrm,"0 0 1"));
|
||||
}
|
||||
}
|
||||
|
||||
%rot1 = fullRot(%item.surfaceNrm,%item.surfaceNrm2);
|
||||
|
||||
%scale1 = "0.5 6 160";
|
||||
%scale2 = "0.5 8 160";
|
||||
%dataBlock = %item.deployed;
|
||||
|
||||
%space = rayDist(%item.surfacePt SPC %item.surfaceNrm,%scale1,$AllObjMask);
|
||||
if (%space != getWord(%scale1,1))
|
||||
%type = true;
|
||||
%scale1 = getWord(%scale1,0) SPC getWord(%scale1,0) SPC %space;
|
||||
|
||||
|
||||
%mCenter = "0 0 -0.5";
|
||||
%pad = pad(%item.surfacePt SPC %item.surfaceNrm SPC %item.surfaceNrm2,%scale2,%mCenter);
|
||||
%scale2 = getWords(%pad,0,2);
|
||||
%item.surfacePt2 = getWords(%pad,3,5);
|
||||
|
||||
//%vec1 = realVec(getWord(%item.surface,0),%item.surfaceNrm);
|
||||
//%vec1 = realVec(%pad,%item.surfaceNrm);
|
||||
%vec1 =validateVal(MatrixMulVector("0 0 0",%item.surfaceNrm));
|
||||
|
||||
if (!%scaleIsSet){
|
||||
%scale1 = vectorMultiply(%scale1,1/4 SPC 1/3 SPC 2);
|
||||
%scale2 = vectorMultiply(%scale2,1/4 SPC 1/3 SPC 2);
|
||||
%x = (getWord(%scale2,1)/0.166666)*0.125;
|
||||
%scale3 = %x SPC 0.166666 SPC getWord(%scale1,2);
|
||||
}
|
||||
|
||||
|
||||
|
||||
%dir1 = VectorNormalize(vectorSub(%item.surfacePt,%item.surfacePt2));
|
||||
%adjust1 = vectorNormalize(vectorProject(%dir1,vectorCross(%item.surfaceNrm,%item.surfaceNrm2)));
|
||||
%offset1 = -0.5;
|
||||
%adjust1 = vectorScale(%adjust1,-0.5 * %offset1);
|
||||
|
||||
%deplObj = new (%className)() {
|
||||
dataBlock = %dataBlock;
|
||||
scale = %scale3;
|
||||
};
|
||||
%deplObj.closedscale = %scale3;
|
||||
%deplObj.openedscale = getwords(%scale3,0,1) SPC 0.1;
|
||||
//////////////////////////Apply settings//////////////////////////////
|
||||
|
||||
// exact:
|
||||
//%deplObj.setTransform(%item.surfacePt SPC %rot1);
|
||||
%deplObj.setTransform(vectorAdd(VectorAdd(%item.surfacePt2, VectorScale(%vec1,getword(%scale3,2)/-4)),%adjust1) SPC %rot1);
|
||||
|
||||
// misc info
|
||||
addDSurface(%item.surface,%deplObj);
|
||||
// [[Settings]]:
|
||||
|
||||
%deplObj.grounded = %grounded;
|
||||
%deplObj.needsFit = 1;
|
||||
%deplObj.isdoor = 1;
|
||||
// [[Normal Stuff]]:
|
||||
|
||||
// set team, owner, and handle
|
||||
%deplObj.team = %plyr.client.team;
|
||||
%deplObj.setOwner(%plyr);
|
||||
|
||||
// set power frequency
|
||||
%deplObj.powerFreq = %plyr.powerFreq;
|
||||
|
||||
// set the sensor group if it needs one
|
||||
if (%deplObj.getTarget() != -1)
|
||||
setTargetSensorGroup(%deplObj.getTarget(), %plyr.client.team);
|
||||
|
||||
// place the deployable in the MissionCleanup/Deployables group (AI reasons)
|
||||
addToDeployGroup(%deplObj);
|
||||
|
||||
//let the AI know as well...
|
||||
AIDeployObject(%plyr.client, %deplObj);
|
||||
|
||||
// play the deploy sound
|
||||
serverPlay3D(%item.deploySound, %deplObj.getTransform());
|
||||
|
||||
// increment the team count for this deployed object
|
||||
$TeamDeployedCount[%plyr.team, %item.item]++;
|
||||
|
||||
%deplObj.deploy();
|
||||
|
||||
// Power object
|
||||
checkPowerObject(%deplObj);
|
||||
%deplobj.timeout=getWord($expertSetting["Door",%plyr.expertSet],0);
|
||||
%deplobj.hasslided=0;
|
||||
|
||||
if (%plyr.packset==0)
|
||||
%deplobj.toggletype=0;
|
||||
|
||||
if (%plyr.packset==1)
|
||||
%deplobj.toggletype=1;
|
||||
|
||||
if (%plyr.packset==2) {
|
||||
%deplobj.toggletype=0;
|
||||
%deplobj.powercontrol=1; //staticshape.cs function StaticShapeData::onGainPowerEnabled |and| function StaticShapeData::onLosePowerDisabled
|
||||
} //for power togle code
|
||||
|
||||
if (%plyr.packset==3) {
|
||||
%deplobj.toggletype=1;
|
||||
%deplobj.powercontrol=1;
|
||||
}
|
||||
//collision door
|
||||
if (%plyr.packset==4){
|
||||
%deplobj.toggletype=0;
|
||||
%deplobj.Collision = true;
|
||||
%deplobj.lv =0;
|
||||
}
|
||||
//owner door
|
||||
if (%plyr.packset==5){
|
||||
%deplobj.toggletype=0;
|
||||
%deplobj.Collision = true;
|
||||
%deplobj.lv =1;
|
||||
}
|
||||
//admin door
|
||||
if (%plyr.packset==6){
|
||||
%deplobj.toggletype=0;
|
||||
%deplobj.Collision = true;
|
||||
%deplobj.lv =2;
|
||||
}
|
||||
if (%plyr.packset==7){
|
||||
%deplobj.toggletype=0;
|
||||
%deplobj.Collision = true;
|
||||
%deplobj.lv =0;
|
||||
%deplobj.canlock = true;
|
||||
}
|
||||
%deplobj.canmove = true;
|
||||
return %deplObj;
|
||||
}
|
||||
|
||||
function Deployeddoor::onDestroyed(%this, %obj, %prevState) {
|
||||
if (%obj.isRemoved)
|
||||
return;
|
||||
%obj.isRemoved = true;
|
||||
Parent::onDestroyed(%this, %obj, %prevState);
|
||||
$TeamDeployedCount[%obj.team, TdoorDeployable]--;
|
||||
remDSurface(%obj);
|
||||
%obj.schedule(500,"delete");
|
||||
cascade(%obj);
|
||||
fireBallExplode(%obj,1);
|
||||
}
|
||||
|
||||
function Deployeddoor::disassemble(%data,%plyr,%hTgt) {
|
||||
disassemble(%data,%plyr,%hTgt);
|
||||
}
|
||||
|
||||
function doorDeployableImage::onMount(%data,%obj,%node) {
|
||||
%obj.hasdoor = true; // set for mspinecheck
|
||||
%obj.packSet = 0;
|
||||
%obj.expertSet = 0;
|
||||
displayPowerFreq(%obj);
|
||||
}
|
||||
|
||||
function doorDeployableImage::onUnmount(%data,%obj,%node) {
|
||||
%obj.hasdoor = "";
|
||||
%obj.packSet = 0;
|
||||
%obj.expertSet = 0;
|
||||
}
|
||||
////////////////////
|
||||
////////////////////
|
||||
function open(%obj){
|
||||
if (!isObject(%obj))
|
||||
return;
|
||||
if (%obj.canmove == true){
|
||||
%obj.moving = "open"; //wat direction its moving
|
||||
%obj.prevscale =%obj.scale; //scale befor this change
|
||||
%obj.closedscale=%obj.scale;//scale it is while fully closed
|
||||
%obj.canmove = false;
|
||||
}
|
||||
|
||||
if (getWord(%obj.scale,2)<0.3){
|
||||
%obj.issliding = 0;
|
||||
%obj.scale = getWord(%obj.scale,0) SPC getWord(%obj.scale,1) SPC 0.1;
|
||||
%obj.settransform(%obj.gettransform());
|
||||
%obj.state = "opened"; //last state used for savebuilding
|
||||
%obj.openedscale = %obj.scale;
|
||||
if (%obj.toggletype ==0)
|
||||
schedule(%obj.timeout*1000,0,"close",%obj,1);
|
||||
else
|
||||
%obj.canmove = true;
|
||||
return;
|
||||
}
|
||||
%obj.scale = getWord(%obj.scale,0) SPC getWord(%obj.scale,1) SPC getWord(%obj.prevscale,2)-0.4;
|
||||
%obj.settransform(%obj.gettransform());
|
||||
%obj.prevscale=%obj.scale;
|
||||
schedule(40,0,"open",%obj);
|
||||
}
|
||||
/////////////////////
|
||||
/////////////////////
|
||||
function close(%obj,%timeout){
|
||||
if (!isObject(%obj))
|
||||
return;
|
||||
if (%obj.canmove == true){
|
||||
%obj.moving = "close"; //wat direction its moving
|
||||
%obj.prevscale =%obj.scale; //scale befor this change
|
||||
%obj.openedscale=%obj.scale;//scale it is while fully opened
|
||||
%obj.canmove = false;
|
||||
}
|
||||
|
||||
if (getWord(%obj.scale,2)>getWord(%obj.closedscale,2)-0.2){
|
||||
%obj.issliding = 0;
|
||||
%obj.scale =getWord(%obj.scale,0) SPC getWord(%obj.scale,1) SPC getWord(%obj.closedscale,2);
|
||||
%obj.settransform(%obj.gettransform());
|
||||
%obj.state = "closed"; //last state used for savebuilding
|
||||
%obj.closedscale = %obj.scale;
|
||||
%obj.canmove = true;
|
||||
return;
|
||||
}
|
||||
%obj.scale = getWord(%obj.scale,0) SPC getWord(%obj.scale,1) SPC getWord(%obj.prevscale,2)+0.4;
|
||||
%obj.settransform(%obj.gettransform());
|
||||
%obj.prevscale=%obj.scale;
|
||||
schedule(40,0,"close",%obj);
|
||||
}
|
||||
322
scripts/packs/doorbu.cs
Normal file
322
scripts/packs/doorbu.cs
Normal file
|
|
@ -0,0 +1,322 @@
|
|||
//---------------------------------------------------------
|
||||
// Deployable door, Code by Linker
|
||||
// Modified by Electricutioner/Thyth to prevent server crash exploit.
|
||||
//---------------------------------------------------------
|
||||
|
||||
datablock EffectProfile(DoorCloseEffect)
|
||||
{
|
||||
effectname = "weapons/missile_fire";
|
||||
minDistance = 0.5;
|
||||
maxDistance = 20.0;
|
||||
};
|
||||
|
||||
datablock AudioProfile(DoorCloseSound)
|
||||
{
|
||||
filename = "fx/vehicles/tank_mortar_fire.wav";
|
||||
description = AudioDefault3d;
|
||||
preload = true;
|
||||
effect = DoorCloseEffect;
|
||||
};
|
||||
|
||||
|
||||
datablock StaticShapeData(DeployedDoor) : StaticShapeDamageProfile {
|
||||
className = "door";
|
||||
shapeFile = "Pmiscf.dts"; // b or dmiscf.dts, alternate
|
||||
|
||||
maxDamage = 2;
|
||||
destroyedLevel = 2;
|
||||
disabledLevel = 1.5;
|
||||
|
||||
isShielded = true;
|
||||
energyPerDamagePoint = 60;
|
||||
maxEnergy = 100;
|
||||
rechargeRate = 0.25;
|
||||
|
||||
explosion = HandGrenadeExplosion;
|
||||
expDmgRadius = 3.0;
|
||||
expDamage = 0.1;
|
||||
expImpulse = 200.0;
|
||||
|
||||
dynamicType = $TypeMasks::StaticShapeObjectType;
|
||||
deployedObject = true;
|
||||
cmdCategory = "DSupport";
|
||||
cmdIcon = CMDSensorIcon;
|
||||
cmdMiniIconName = "commander/MiniIcons/com_deploymotionsensor";
|
||||
targetNameTag = 'Door';
|
||||
deployAmbientThread = true;
|
||||
debrisShapeName = "debris_generic_small.dts";
|
||||
debris = DeployableDebris;
|
||||
heatSignature = 0;
|
||||
needsPower = true;
|
||||
};
|
||||
|
||||
datablock ShapeBaseImageData(DoorDeployableImage) {
|
||||
mass = 1;
|
||||
emap = true;
|
||||
shapeFile = "stackable1s.dts";
|
||||
item = DoorDeployable;
|
||||
mountPoint = 1;
|
||||
offset = "0 0 0";
|
||||
deployed = DeployedDoor;
|
||||
heatSignature = 0;
|
||||
|
||||
stateName[0] = "Idle";
|
||||
stateTransitionOnTriggerDown[0] = "Activate";
|
||||
|
||||
stateName[1] = "Activate";
|
||||
stateScript[1] = "onActivate";
|
||||
stateTransitionOnTriggerUp[1] = "Idle";
|
||||
|
||||
isLarge = false;
|
||||
maxDepSlope = 360;
|
||||
deploySound = ItemPickupSound;
|
||||
|
||||
minDeployDis = 0;
|
||||
maxDeployDis = 50.0;
|
||||
};
|
||||
|
||||
datablock ItemData(DoorDeployable) {
|
||||
className = Pack;
|
||||
catagory = "Deployables";
|
||||
shapeFile = "stackable1s.dts";
|
||||
mass = 1;
|
||||
elasticity = 0.2;
|
||||
friction = 0.6;
|
||||
pickupRadius = 1;
|
||||
rotate = true;
|
||||
image = "DoorDeployableImage";
|
||||
pickUpName = "a door pack made by Linker";
|
||||
heatSignature = 0;
|
||||
emap = true;
|
||||
};
|
||||
|
||||
function DoorDeployableImage::testObjectTooClose(%item) {
|
||||
return "";
|
||||
}
|
||||
|
||||
function DoorDeployableImage::testNoTerrainFound(%item) {
|
||||
// don't check this for non-Landspike turret deployables
|
||||
}
|
||||
|
||||
function DoorDeployable::onPickup(%this, %obj, %shape, %amount) {
|
||||
// created to prevent console errors
|
||||
}
|
||||
|
||||
function DoorDeployableImage::onDeploy(%item, %plyr, %slot) {
|
||||
%className = "StaticShape";
|
||||
%grounded = 0;
|
||||
if (%item.surface.getClassName() $= TerrainBlock)
|
||||
%grounded = 1;
|
||||
|
||||
%playerVector = vectorNormalize(-1 * getWord(%plyr.getEyeVector(),1) SPC getWord(%plyr.getEyeVector(),0) SPC "0");
|
||||
|
||||
if (%item.surfaceinher == 0) {
|
||||
if (vAbs(floorVec(%item.surfaceNrm,100)) $= "0 0 1"){
|
||||
%item.surfaceNrm2 = %playerVector;
|
||||
}
|
||||
else{
|
||||
%item.surfaceNrm2 = vectorNormalize(vectorCross(%item.surfaceNrm,"0 0 1"));
|
||||
}
|
||||
}
|
||||
|
||||
%rot1 = fullRot(%item.surfaceNrm,%item.surfaceNrm2);
|
||||
|
||||
%scale1 = "0.5 6 160";
|
||||
%scale2 = "0.5 8 160";
|
||||
%dataBlock = %item.deployed;
|
||||
|
||||
%space = rayDist(%item.surfacePt SPC %item.surfaceNrm,%scale1,$AllObjMask);
|
||||
if (%space != getWord(%scale1,1))
|
||||
%type = true;
|
||||
%scale1 = getWord(%scale1,0) SPC getWord(%scale1,0) SPC %space;
|
||||
|
||||
|
||||
%mCenter = "0 0 -0.5";
|
||||
%pad = pad(%item.surfacePt SPC %item.surfaceNrm SPC %item.surfaceNrm2,%scale2,%mCenter);
|
||||
%scale2 = getWords(%pad,0,2);
|
||||
%item.surfacePt2 = getWords(%pad,3,5);
|
||||
|
||||
//%vec1 = realVec(getWord(%item.surface,0),%item.surfaceNrm);
|
||||
//%vec1 = realVec(%pad,%item.surfaceNrm);
|
||||
%vec1 =validateVal(MatrixMulVector("0 0 0",%item.surfaceNrm));
|
||||
|
||||
if (!%scaleIsSet){
|
||||
%scale1 = vectorMultiply(%scale1,1/4 SPC 1/3 SPC 2);
|
||||
%scale2 = vectorMultiply(%scale2,1/4 SPC 1/3 SPC 2);
|
||||
%x = (getWord(%scale2,1)/0.166666)*0.125;
|
||||
%scale3 = %x SPC 0.166666 SPC getWord(%scale1,2);
|
||||
}
|
||||
|
||||
|
||||
|
||||
%dir1 = VectorNormalize(vectorSub(%item.surfacePt,%item.surfacePt2));
|
||||
%adjust1 = vectorNormalize(vectorProject(%dir1,vectorCross(%item.surfaceNrm,%item.surfaceNrm2)));
|
||||
%offset1 = -0.5;
|
||||
%adjust1 = vectorScale(%adjust1,-0.5 * %offset1);
|
||||
|
||||
%deplObj = new (%className)() {
|
||||
dataBlock = %dataBlock;
|
||||
scale = %scale3;
|
||||
};
|
||||
%deplObj.closedscale = %scale3;
|
||||
%deplObj.openedscale = getwords(%scale3,0,1) SPC 0.1;
|
||||
//////////////////////////Apply settings//////////////////////////////
|
||||
|
||||
// exact:
|
||||
//%deplObj.setTransform(%item.surfacePt SPC %rot1);
|
||||
%deplObj.setTransform(vectorAdd(VectorAdd(%item.surfacePt2, VectorScale(%vec1,getword(%scale3,2)/-4)),%adjust1) SPC %rot1);
|
||||
|
||||
// misc info
|
||||
addDSurface(%item.surface,%deplObj);
|
||||
// [[Settings]]:
|
||||
|
||||
%deplObj.grounded = %grounded;
|
||||
%deplObj.needsFit = 1;
|
||||
%deplObj.isdoor = 1;
|
||||
// [[Normal Stuff]]:
|
||||
|
||||
// set team, owner, and handle
|
||||
%deplObj.team = %plyr.client.team;
|
||||
%deplObj.setOwner(%plyr);
|
||||
|
||||
// set power frequency
|
||||
%deplObj.powerFreq = %plyr.powerFreq;
|
||||
|
||||
// set the sensor group if it needs one
|
||||
if (%deplObj.getTarget() != -1)
|
||||
setTargetSensorGroup(%deplObj.getTarget(), %plyr.client.team);
|
||||
|
||||
// place the deployable in the MissionCleanup/Deployables group (AI reasons)
|
||||
addToDeployGroup(%deplObj);
|
||||
|
||||
//let the AI know as well...
|
||||
AIDeployObject(%plyr.client, %deplObj);
|
||||
|
||||
// play the deploy sound
|
||||
serverPlay3D(%item.deploySound, %deplObj.getTransform());
|
||||
|
||||
// increment the team count for this deployed object
|
||||
$TeamDeployedCount[%plyr.team, %item.item]++;
|
||||
|
||||
%deplObj.deploy();
|
||||
|
||||
// Power object
|
||||
checkPowerObject(%deplObj);
|
||||
%deplobj.slidevec=%deplobj.dsurface.getedge("0 0 0");
|
||||
|
||||
%deplobj.timeout=getWord($expertSetting["Door",%plyr.expertSet],0);
|
||||
%deplobj.initialtransform=%deplobj.gettransform();
|
||||
%deplobj.hasslided=0;
|
||||
|
||||
if (%plyr.packset==1)
|
||||
%deplobj.toggletype=1;
|
||||
|
||||
if (%plyr.packset==2) {
|
||||
%deplobj.toggletype=0;
|
||||
%deplobj.powercontrol=1;
|
||||
}
|
||||
|
||||
if (%plyr.packset==3) {
|
||||
%deplobj.toggletype=1;
|
||||
%deplobj.powercontrol=1;
|
||||
}
|
||||
|
||||
if (%plyr.packset==0)
|
||||
%deplobj.toggletype=0;
|
||||
|
||||
if (%pad)
|
||||
deployEffect(%deplObj,%item.surfacePt,%item.surfaceNrm,"pad");
|
||||
return %deplObj;
|
||||
}
|
||||
|
||||
function deployeddoor::onDestroyed(%this, %obj, %prevState) {
|
||||
if (%obj.isRemoved)
|
||||
return;
|
||||
%obj.isRemoved = true;
|
||||
Parent::onDestroyed(%this, %obj, %prevState);
|
||||
$TeamDeployedCount[%obj.team, DoorDeployable]--;
|
||||
remDSurface(%obj);
|
||||
%obj.schedule(500, "delete");
|
||||
cascade(%obj);
|
||||
fireBallExplode(%obj,1);
|
||||
}
|
||||
|
||||
function DoorDeployableImage::onMount(%data, %obj, %node) {
|
||||
%obj.hasDoor = true; // set for blastcheck
|
||||
%obj.packSet = 0;
|
||||
%obj.expertSet = 3;
|
||||
displayPowerFreq(%obj);
|
||||
}
|
||||
|
||||
function DoorDeployableImage::onUnmount(%data, %obj, %node) {
|
||||
%obj.hasDoor = "";
|
||||
%obj.packSet = 0;
|
||||
%obj.expertSet = 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
function open(%obj){
|
||||
if (!isObject(%obj))
|
||||
return;
|
||||
if (%obj.issliding !=1 && %obj.canmove == true){
|
||||
%obj.issliding = 1;
|
||||
%obj.moving = "open";
|
||||
%obj.dist = getWord(%obj.scale,2);
|
||||
%amount1 = %obj.dist*100;
|
||||
%amount2 = mfloor(%amount1);
|
||||
%obj.amount = %amount2/5;
|
||||
%obj.oldscale = %obj.scale;
|
||||
%obj.prevscale=%obj.scale;
|
||||
%obj.canmove = false;
|
||||
}
|
||||
|
||||
if (getWord(%obj.scale,2)<0.4){
|
||||
%obj.issliding = 0;
|
||||
%obj.scale = getWord(%obj.scale,0) SPC getWord(%obj.scale,1) SPC 0.1;
|
||||
%obj.settransform(%obj.gettransform());
|
||||
%obj.state = "opened";
|
||||
%obj.openedscale = %obj.scale;
|
||||
if (%obj.toggletype ==0)
|
||||
schedule(%obj.timeout*1000,0,"close",%obj,1);
|
||||
else
|
||||
%obj.canmove = true;
|
||||
return;
|
||||
}
|
||||
%obj.scale = getWord(%obj.scale,0) SPC getWord(%obj.scale,1) SPC getWord(%obj.prevscale,2)-0.4;
|
||||
%obj.settransform(%obj.gettransform());
|
||||
%obj.prevscale=%obj.scale;
|
||||
schedule(40,0,"open",%obj);
|
||||
}
|
||||
/////////////////////
|
||||
/////////////////////
|
||||
function close(%obj,%timeout){
|
||||
if (!isObject(%obj))
|
||||
return;
|
||||
if (%obj.issliding !=1){
|
||||
%obj.issliding = 1;
|
||||
%obj.moving = "close";
|
||||
%obj.dist = getWord(%obj.oldscale,2);
|
||||
%amount1 = %obj.dist*100;
|
||||
%amount2 = mfloor(%amount1);
|
||||
%obj.amount = %amount2/10;
|
||||
%obj.prevscale=%obj.scale;
|
||||
%obj.canmove = false;
|
||||
}
|
||||
|
||||
if (getWord(%obj.scale,2)>getWord(%obj.closedscale,2)-0.2){
|
||||
%obj.issliding = 0;
|
||||
%obj.scale =getWord(%obj.scale,0) SPC getWord(%obj.scale,1) SPC getWord(%obj.closedscale,2);
|
||||
%obj.settransform(%obj.gettransform());
|
||||
%obj.state = "closed";
|
||||
%obj.closedscale = %obj.scale;
|
||||
%obj.canmove = true;
|
||||
return;
|
||||
}
|
||||
%obj.scale = getWord(%obj.scale,0) SPC getWord(%obj.scale,1) SPC getWord(%obj.prevscale,2)+0.4;
|
||||
%obj.settransform(%obj.gettransform());
|
||||
%obj.prevscale=%obj.scale;
|
||||
schedule(40,0,"close",%obj);
|
||||
}
|
||||
|
||||
|
||||
385
scripts/packs/energizer.cs
Normal file
385
scripts/packs/energizer.cs
Normal file
|
|
@ -0,0 +1,385 @@
|
|||
//--------------------------------------------------------------------------
|
||||
// Deployable Energizer
|
||||
//--------------------------------------
|
||||
|
||||
datablock StaticShapeData(DeployedEnergizer) : StaticShapeDamageProfile {
|
||||
className = "energizer";
|
||||
shapeFile = "deploy_sensor_motion.dts";
|
||||
|
||||
maxDamage = 0.5;
|
||||
destroyedLevel = 0.5;
|
||||
disabledLevel = 0.3;
|
||||
|
||||
isShielded = true;
|
||||
energyPerDamagePoint = 30;
|
||||
maxEnergy = 50;
|
||||
rechargeRate = 0.05;
|
||||
|
||||
explosion = SatchelMainExplosion;
|
||||
underwaterExplosion = UnderwaterSatchelMainExplosion;
|
||||
|
||||
expDmgRadius = 20.0;
|
||||
expDamage = 1.25;
|
||||
expImpulse = 1500.0;
|
||||
|
||||
dynamicType = $TypeMasks::StationObjectType;
|
||||
renderWhenDestroyed = false;
|
||||
|
||||
hasLight = true;
|
||||
lightType = "PulsingLight";
|
||||
lightColor = "0.1 0.1 0.8 1.0";
|
||||
lightTime = "100";
|
||||
lightRadius = "3";
|
||||
|
||||
humSound = GeneratorHumSound;
|
||||
|
||||
EnergizeOthers = true;
|
||||
EnergizeRadius = 35;
|
||||
|
||||
dynamicType = $TypeMasks::StaticShapeObjectType;
|
||||
deployedObject = true;
|
||||
cmdCategory = "DSupport";
|
||||
cmdIcon = CMDSwitchIcon;
|
||||
cmdMiniIconName = "commander/MiniIcons/com_switch_grey";
|
||||
targetNameTag = 'Deployed';
|
||||
targetTypeTag = 'Energizer';
|
||||
deployAmbientThread = true;
|
||||
debrisShapeName = "debris_generic_small.dts";
|
||||
debris = DeployableDebris;
|
||||
heatSignature = 0;
|
||||
};
|
||||
|
||||
datablock ItemData(EnergizerLight) : StaticShapeDamageProfile {
|
||||
className = "energizerlight";
|
||||
shapeFile = "beacon.dts";
|
||||
|
||||
maxDamage = 2.0;
|
||||
destroyedLevel = 2.0;
|
||||
disabledLevel = 2.0;
|
||||
|
||||
mass = 1;
|
||||
elasticity = 0.1;
|
||||
friction = 0.9;
|
||||
|
||||
collideable = 1;
|
||||
pickupRadius = 1;
|
||||
sticky = false;
|
||||
|
||||
explosion = HandGrenadeExplosion;
|
||||
expDmgRadius = 1.0;
|
||||
expDamage = 0.1;
|
||||
expImpulse = 200.0;
|
||||
|
||||
dynamicType = $TypeMasks::StaticShapeObjectType;
|
||||
deployedObject = true;
|
||||
|
||||
hasLight = true;
|
||||
lightType = "PulsingLight";
|
||||
lightColor = "0.8 0.1 0.1 1.0";
|
||||
lightTime = "100";
|
||||
lightRadius = "1";
|
||||
|
||||
deployAmbientThread = true;
|
||||
debrisShapeName = "debris_generic_small.dts";
|
||||
debris = DeployableDebris;
|
||||
heatSignature = 0;
|
||||
};
|
||||
|
||||
datablock ShapeBaseImageData(EnergizerDeployableImage) {
|
||||
mass = 1;
|
||||
shapeFile = "deploy_sensor_motion.dts";
|
||||
scale = 2.5 / 3.85 @ " " @ 2.5 / 3.1 @ " " @ 5 / 3.1;
|
||||
item = EnergizerDeployable;
|
||||
mountPoint = 1;
|
||||
offset = "0 0 0";
|
||||
deployed = EnergizerDeployed;
|
||||
stateName[0] = "Idle";
|
||||
stateTransitionOnTriggerDown[0] = "Activate";
|
||||
|
||||
hasLight = true;
|
||||
lightType = "PulsingLight";
|
||||
lightColor = "0.1 0.1 0.8 1.0";
|
||||
lightTime = "100";
|
||||
lightRadius = "3";
|
||||
|
||||
stateName[1] = "Activate";
|
||||
stateScript[1] = "onActivate";
|
||||
stateTransitionOnTriggerUp[1] = "Idle";
|
||||
|
||||
isLarge = true;
|
||||
emap = true;
|
||||
maxDepSlope = 360;
|
||||
deploySound = TurretDeploySound;
|
||||
minDeployDis = 0.5;
|
||||
maxDeployDis = 5.0;
|
||||
};
|
||||
|
||||
datablock ItemData(EnergizerDeployable) {
|
||||
className = Pack;
|
||||
catagory = "Deployables";
|
||||
shapeFile = "deploy_sensor_motion.dts";
|
||||
scale = 2.5 / 3.85 @ " " @ 2.5 / 3.1 @ " " @ 5 / 3.1;
|
||||
mass = 1;
|
||||
|
||||
hasLight = true;
|
||||
lightType = "PulsingLight";
|
||||
lightColor = "0.1 0.1 0.8 1.0";
|
||||
lightTime = "500";
|
||||
lightRadius = "3";
|
||||
|
||||
elasticity = 0.2;
|
||||
friction = 0.6;
|
||||
pickupRadius = 1;
|
||||
rotate = false;
|
||||
image = "EnergizerDeployableImage";
|
||||
pickUpName = "an energizer pack";
|
||||
emap = true;
|
||||
};
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
// Functions
|
||||
//--------------------------------------
|
||||
|
||||
function EnergizerDeployableImage::testObjectTooClose(%item,%surfacePt,%plyr) {
|
||||
%mask = ($TypeMasks::VehicleObjectType | $TypeMasks::MoveableObjectType |
|
||||
$TypeMasks::StaticShapeObjectType |
|
||||
$TypeMasks::ForceFieldObjectType | $TypeMasks::ItemObjectType |
|
||||
$TypeMasks::PlayerObjectType | $TypeMasks::TurretObjectType);
|
||||
|
||||
InitContainerRadiusSearch(%item.surfacePt,30,%mask);
|
||||
|
||||
while ((%test = containerSearchNext()) != 0) {
|
||||
if (%test.team !$= "" && %test.team != %plyr.team)
|
||||
return %test;
|
||||
}
|
||||
Parent::testObjectTooClose(%item,%surfacePt,%plyr);
|
||||
}
|
||||
|
||||
function DeployedEnergizer::disassemble(%data,%plyr,%hTgt) {
|
||||
%hTgt.l1.schedule(500, "delete");
|
||||
%hTgt.l2.schedule(500, "delete");
|
||||
%hTgt.l3.schedule(500, "delete");
|
||||
%hTgt.l4.schedule(500, "delete");
|
||||
disassemble(%data,%plyr,%hTgt);
|
||||
}
|
||||
|
||||
function DeployedEnergizer::onDestroyed(%this, %obj, %prevState) {
|
||||
if (%obj.isRemoved)
|
||||
return;
|
||||
%obj.isRemoved = true;
|
||||
Parent::onDestroyed(%this, %obj, %prevState);
|
||||
$TeamDeployedCount[%obj.team, EnergizerDeployable]--;
|
||||
remDSurface(%obj);
|
||||
%obj.schedule(500, "delete");
|
||||
%obj.l1.schedule(500, "delete");
|
||||
%obj.l2.schedule(500, "delete");
|
||||
%obj.l3.schedule(500, "delete");
|
||||
%obj.l4.schedule(500, "delete");
|
||||
|
||||
RadiusExplosion(%obj, %obj.getWorldBoxCenter(), %obj.expDmgRadius, %obj.expDamage, %obj.expImpulse, %obj, $DamageType::Explosion);
|
||||
fireBallExplode(%obj,10);
|
||||
}
|
||||
|
||||
function EnergizerDeployableImage::onDeploy(%item, %plyr, %slot) {
|
||||
//Object
|
||||
%className = "StaticShape";
|
||||
|
||||
%playerVector = vectorNormalize(-1 * getWord(%plyr.getEyeVector(),1) SPC getWord(%plyr.getEyeVector(),0) SPC "0");
|
||||
|
||||
if (%item.surfaceinher == 0) {
|
||||
if (vAbs(floorVec(%item.surfaceNrm,100)) $= "0 0 1")
|
||||
%item.surfaceNrm2 = %playerVector;
|
||||
else
|
||||
%item.surfaceNrm2 = vectorNormalize(vectorCross(%item.surfaceNrm,"0 0 1"));
|
||||
}
|
||||
|
||||
%rot = fullRot(%item.surfaceNrm,%item.surfaceNrm2);
|
||||
%scale = "5 5 5";
|
||||
|
||||
%deplObj = new (%className)() {
|
||||
dataBlock = "DeployedEnergizer";
|
||||
scale = %scale;
|
||||
};
|
||||
|
||||
// set orientation
|
||||
%deplObj.setTransform(%item.surfacePt SPC %rot);
|
||||
|
||||
//Object
|
||||
%className = "Item";
|
||||
%deplObj.l1 = new (%className)() {
|
||||
dataBlock = "EnergizerLight";
|
||||
position = vectorAdd(%item.surfacePt, "2 0 1");
|
||||
rotation = %rot;
|
||||
scale = "1 1 1";
|
||||
};
|
||||
|
||||
%deplObj.l2 = new (%className)() {
|
||||
dataBlock = "EnergizerLight";
|
||||
position = vectorAdd(%item.surfacePt, "0 2 1");
|
||||
rotation = %rot;
|
||||
scale = "1 1 1";
|
||||
};
|
||||
|
||||
%deplObj.l3 = new (%className)() {
|
||||
dataBlock = "EnergizerLight";
|
||||
position = vectorAdd(%item.surfacePt, "-2 0 1");
|
||||
rotation = %rot;
|
||||
scale = "1 1 1";
|
||||
};
|
||||
|
||||
%deplObj.l4 = new (%className)() {
|
||||
dataBlock = "EnergizerLight";
|
||||
position = vectorAdd(%item.surfacePt, "0 -2 1");
|
||||
rotation = %rot;
|
||||
scale = "1 1 1";
|
||||
};
|
||||
|
||||
%deplObj.team = %plyr.client.team;
|
||||
%deplObj.setOwner(%plyr);
|
||||
%deplObj.l1.team = %plyr.client.team;
|
||||
%deplObj.l1.setOwner(%plyr);
|
||||
%deplObj.l2.team = %plyr.client.team;
|
||||
%deplObj.l2.setOwner(%plyr);
|
||||
%deplObj.l3.team = %plyr.client.team;
|
||||
%deplObj.l3.setOwner(%plyr);
|
||||
%deplObj.l4.team = %plyr.client.team;
|
||||
%deplObj.l4.setOwner(%plyr);
|
||||
addDSurface(%item.surface,%deplObj);
|
||||
|
||||
if (%deplObj.getTarget() != -1)
|
||||
setTargetSensorGroup(%deplObj.getTarget(), %plyr.client.team);
|
||||
if (%deplObj.l1.getTarget() != -1)
|
||||
setTargetSensorGroup(%deplObj.l1.getTarget(), %plyr.client.team);
|
||||
if (%deplObj.l2.getTarget() != -1)
|
||||
setTargetSensorGroup(%deplObj.l1.getTarget(), %plyr.client.team);
|
||||
if (%deplObj.l3.getTarget() != -1)
|
||||
setTargetSensorGroup(%deplObj.l1.getTarget(), %plyr.client.team);
|
||||
if (%deplObj.l4.getTarget() != -1)
|
||||
setTargetSensorGroup(%deplObj.l1.getTarget(), %plyr.client.team);
|
||||
|
||||
addToDeployGroup(%deplObj);
|
||||
addToDeployGroup(%deplObj.l1);
|
||||
addToDeployGroup(%deplObj.l2);
|
||||
addToDeployGroup(%deplObj.l3);
|
||||
addToDeployGroup(%deplObj.l4);
|
||||
|
||||
AIDeployObject(%plyr.client, %deplObj);
|
||||
AIDeployObject(%plyr.client, %deplObj.l1);
|
||||
AIDeployObject(%plyr.client, %deplObj.l2);
|
||||
AIDeployObject(%plyr.client, %deplObj.l3);
|
||||
AIDeployObject(%plyr.client, %deplObj.l4);
|
||||
|
||||
serverPlay3D(%item.deploySound, %deplObj.getTransform());
|
||||
$TeamDeployedCount[%plyr.team, %item.item]++;
|
||||
%deplObj.deploy();
|
||||
|
||||
%deplObj.playThread($AmbientThread, "ambient");
|
||||
|
||||
%plyr.unmountImage(%slot);
|
||||
%plyr.decInventory(%item.item, 1);
|
||||
|
||||
return %deplObj;
|
||||
}
|
||||
|
||||
function EnergizerDeployable::onPickup(%this, %obj, %shape, %amount) {
|
||||
// created to prevent console errors
|
||||
}
|
||||
|
||||
function EnergizeLoop() {
|
||||
if (!isObject(MissionCleanup)) {
|
||||
schedule(10000, 0, "StartEnergizeLoop");
|
||||
return;
|
||||
}
|
||||
|
||||
%dep = nameToID("MissionCleanup/Deployables");
|
||||
%clCount = ClientGroup.getCount();
|
||||
%depCount = %dep.getCount();
|
||||
for (%i=0;%i<%clCount;%i++) {
|
||||
ClientGroup.getObject(%i).shouldEnergize = 0;
|
||||
}
|
||||
for (%i=0;%i<%depCount;%i++) {
|
||||
%obj = %dep.getObject(%i);
|
||||
if (isObject(%obj)) {
|
||||
%data = %obj.getDataBlock();
|
||||
if (%data) {
|
||||
if (%data.energizeOthers && %obj.isEnabled()) {
|
||||
%pos = posFromTransform(%obj.getTransform());
|
||||
for(%i2=0;%i2<%clCount;%i2++) {
|
||||
%obj2 = ClientGroup.getObject(%i2).player;
|
||||
if ((%obj2) && (%obj2 != %obj) && (%obj2.team == %obj.team)) {
|
||||
%pos2 = %obj2.getPosition();
|
||||
if (vectorDist(%pos, %pos2) < %data.EnergizeRadius && %obj2.getArmorSize() $= "Heavy")
|
||||
%obj2.client.shouldEnergize = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
for (%i=0;%i<%clCount;%i++) {
|
||||
%client = ClientGroup.getObject(%i);
|
||||
%obj = %client.player;
|
||||
if (isObject(%obj)) {
|
||||
if ((%client.shouldEnergize) && (!%obj.energized)) {
|
||||
%obj.energized = 1;
|
||||
if (!%obj.hasEnergizer)
|
||||
%obj.setRechargeRate(%obj.getRechargeRate() + 0.5);
|
||||
messageClient(%obj.client, 'msgClient', '\c2Entering energizer coverage.');
|
||||
}
|
||||
else if (!%client.shouldEnergize && %obj.energized) {
|
||||
%obj.energized = "";
|
||||
if (%obj.hasEnergizer)
|
||||
messageClient(%obj.client, 'msgClient', '\c2Leaving energizer coverage, switching to energizer pack.');
|
||||
else {
|
||||
%obj.setRechargeRate(%obj.getRechargeRate() - 0.5);
|
||||
messageClient(%obj.client, 'msgClient', '\c2Leaving energizer coverage, switching to armor power.');
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
for (%i=0;%i<%depCount;%i++) {
|
||||
%obj = %dep.getObject(%i);
|
||||
if (isObject(%obj)) {
|
||||
%data = %obj.getDataBlock();
|
||||
if (%data.energizeOthers) {
|
||||
if (%obj.energized)
|
||||
%obj.energized = "";
|
||||
}
|
||||
else if ((%obj.shouldEnergize) && (!%obj.energized)) {
|
||||
%obj.energized = 1;
|
||||
%obj.setRechargeRate(%obj.getRechargeRate() + 0.5);
|
||||
}
|
||||
else if ((!%obj.shouldEnergize) && (%obj.energized)) {
|
||||
%obj.energized = "";
|
||||
%obj.setRechargeRate(%obj.getRechargeRate() - 0.5);
|
||||
}
|
||||
}
|
||||
}
|
||||
schedule(1000, 0, "EnergizeLoop");
|
||||
}
|
||||
|
||||
function StartEnergizeLoop() {
|
||||
$EnergizeLoop = 1;
|
||||
if (!isObject(MissionCleanup)) {
|
||||
schedule(10000, 0, "StartEnergizeLoop");
|
||||
return;
|
||||
}
|
||||
%depGroup = nameToID("MissionCleanup/Deployables");
|
||||
if (%depGroup <= 0) {
|
||||
%depGroup = new SimGroup("Deployables");
|
||||
MissionCleanup.add(%depGroup);
|
||||
}
|
||||
EnergizeLoop();
|
||||
}
|
||||
|
||||
function EnergizerDeployableImage::onMount(%data, %obj, %node) {
|
||||
%obj.hasEnergizer = true;
|
||||
if (!%obj.energized)
|
||||
%obj.setRechargeRate(%obj.getRechargeRate() + 0.5);
|
||||
}
|
||||
|
||||
function EnergizerDeployableImage::onUnmount(%data, %obj, %node) {
|
||||
%obj.hasEnergizer = "";
|
||||
if (!%obj.energized)
|
||||
%obj.setRechargeRate(%obj.getRechargeRate() - 0.5);
|
||||
}
|
||||
393
scripts/packs/escapepodpack.cs
Normal file
393
scripts/packs/escapepodpack.cs
Normal file
|
|
@ -0,0 +1,393 @@
|
|||
// Escape Pod Pack
|
||||
|
||||
datablock AudioProfile(EscapePodChargeSound) {
|
||||
filename = "fx/misc/cannonstart.wav";
|
||||
description = AudioDefault3d;
|
||||
preload = true;
|
||||
};
|
||||
|
||||
datablock AudioProfile(EscapePodBeepSound) {
|
||||
filename = "fx/misc/warning_beep.wav";
|
||||
description = AudioClosest3d;
|
||||
preload = true;
|
||||
};
|
||||
|
||||
datablock AudioProfile(EscapePodLaunchSound) {
|
||||
filename = "fx/Bonuses/high-level4-blazing.wav";
|
||||
description = AudioBIGExplosion3d;
|
||||
preload = true;
|
||||
};
|
||||
|
||||
datablock AudioProfile(EscapePodLaunchSound2) {
|
||||
filename = "fx/Bonuses/down_passback3_rocket.wav";
|
||||
description = AudioBIGExplosion3d;
|
||||
preload = true;
|
||||
};
|
||||
|
||||
datablock AudioProfile(EscapePodReloadSound) {
|
||||
filename = "fx/powered/turret_heavy_reload.wav";
|
||||
description = AudioClose3d;
|
||||
preload = true;
|
||||
};
|
||||
|
||||
datablock AudioProfile(EscapePodFadeSound) {
|
||||
filename = "fx/Bonuses/upward_perppass2_quark.wav";
|
||||
description = AudioClose3d;
|
||||
preload = true;
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedEscapePod) : StaticShapeDamageProfile {
|
||||
className = "escapepod";
|
||||
shapeFile = "TR2weapon_mortar.dts";
|
||||
|
||||
maxDamage = 1;
|
||||
destroyedLevel = 1;
|
||||
disabledLevel = 1;
|
||||
|
||||
isShielded = true;
|
||||
energyPerDamagePoint = 75;
|
||||
maxEnergy = 50;
|
||||
rechargeRate = 0.35;
|
||||
|
||||
explosion = ShapeExplosion;
|
||||
expDmgRadius = 8.0;
|
||||
expDamage = 0.4;
|
||||
expImpulse = 1500;
|
||||
|
||||
dynamicType = $TypeMasks::StaticShapeObjectType;
|
||||
deployedObject = true;
|
||||
cmdCategory = "DSupport";
|
||||
cmdIcon = CMDSensorIcon;
|
||||
cmdMiniIconName = "commander/MiniIcons/com_deploymotionsensor";
|
||||
targetNameTag = 'Deployed';
|
||||
targetTypeTag = 'Escape Pod';
|
||||
deployAmbientThread = false;
|
||||
debrisShapeName = "debris_generic.dts";
|
||||
debris = DeployableDebris;
|
||||
heatSignature = 1;
|
||||
emap = true;
|
||||
};
|
||||
|
||||
datablock ShapeBaseImageData(EscapePodDeployableImage) {
|
||||
mass = 1;
|
||||
emap = true;
|
||||
shapeFile = "stackable1s.dts";
|
||||
item = EscapePodDeployable;
|
||||
mountPoint = 1;
|
||||
offset = "0 0 0";
|
||||
deployed = DeployedEscapePod;
|
||||
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.25;
|
||||
maxDeployDis = 5;
|
||||
};
|
||||
|
||||
datablock ItemData(EscapePodDeployable) {
|
||||
className = Pack;
|
||||
catagory = "Deployables";
|
||||
shapeFile = "stackable1s.dts";
|
||||
mass = 1;
|
||||
elasticity = 0.2;
|
||||
friction = 0.6;
|
||||
pickupRadius = 3;
|
||||
rotate = true;
|
||||
image = "EscapePodDeployableImage";
|
||||
pickUpName = "an escape pod pack";
|
||||
heatSignature = 0;
|
||||
emap = true;
|
||||
};
|
||||
|
||||
function EscapePodDeployableImage::testNoTerrainFound(%item) {
|
||||
// don't check this for non-Landspike turret deployables
|
||||
}
|
||||
|
||||
function EscapePodDeployable::onPickup(%this, %obj, %shape, %amount) {
|
||||
// created to prevent console errors
|
||||
}
|
||||
|
||||
function EscapePodDeployableImage::onDeploy(%item, %plyr, %slot) {
|
||||
%className = "StaticShape";
|
||||
|
||||
%playerVector = vectorNormalize(-1 * getWord(%plyr.getEyeVector(),1) SPC getWord(%plyr.getEyeVector(),0) SPC "0");
|
||||
|
||||
if (vAbs(floorVec(%item.surfaceNrm,100)) $= "0 0 1")
|
||||
%item.surfaceNrm2 = %playerVector;
|
||||
else
|
||||
%item.surfaceNrm2 = vectorNormalize(vectorCross(%item.surfaceNrm,"0 0 1"));
|
||||
|
||||
%rot = fullRot(%item.surfaceNrm,%item.surfaceNrm2);
|
||||
|
||||
%deplObj = new (%className)() {
|
||||
dataBlock = DeployedEscapePod;
|
||||
scale = "4 2 4";
|
||||
impulse = $packSetting["escapepod",%plyr.packSet];
|
||||
};
|
||||
|
||||
%deplObj.lTarget = new StaticShape () {
|
||||
datablock = DeployedLTarget;
|
||||
scale = vectorMultiply("1 3 0.25",1/4 SPC 1/3 SPC 2);
|
||||
};
|
||||
|
||||
%deplObj.lTarget.lMain = %deplObj;
|
||||
|
||||
// set orientation
|
||||
%deplObj.lTarget.setTransform(%item.surfacePt SPC %rot);
|
||||
adjustEscapePod(%deplObj);
|
||||
escapePodLoop(%deplObj);
|
||||
|
||||
// set the recharge rate right away
|
||||
if (%deplObj.getDatablock().rechargeRate)
|
||||
%deplObj.setRechargeRate(%deplObj.getDatablock().rechargeRate);
|
||||
|
||||
// set team, owner, and handle
|
||||
%deplObj.team = %plyr.client.Team;
|
||||
%deplObj.setOwner(%plyr);
|
||||
if (%deplObj.lTarget) {
|
||||
%deplObj.lTarget.team = %plyr.client.Team;
|
||||
%deplObj.lTarget.setOwner(%plyr);
|
||||
}
|
||||
|
||||
// set the sensor group if it needs one
|
||||
if (%deplObj.getTarget() != -1)
|
||||
setTargetSensorGroup(%deplObj.getTarget(), %plyr.client.team);
|
||||
|
||||
// place the deployable in the MissionCleanup/Deployables group (AI reasons)
|
||||
addToDeployGroup(%deplObj);
|
||||
if (%deplObj.lTarget)
|
||||
addToDeployGroup(%deplObj.lTarget);
|
||||
|
||||
//let the AI know as well...
|
||||
AIDeployObject(%plyr.client, %deplObj);
|
||||
if (%deplObj.lTarget)
|
||||
AIDeployObject(%plyr.client,%deplObj.lTarget);
|
||||
|
||||
// play the deploy sound
|
||||
serverplay3D(%item.deploySound, %deplObj.getTransform());
|
||||
|
||||
// increment the team count for this deployed object
|
||||
$TeamDeployedCount[%plyr.team, %item.item]++;
|
||||
|
||||
%deplObj.deploy();
|
||||
|
||||
addDSurface(%item.surface,%deplObj);
|
||||
if (%deplObj.lTarget)
|
||||
addDSurface(%deplObj,%deplObj.lTarget);
|
||||
|
||||
// take the deployable off the player's back and out of inventory
|
||||
%plyr.unmountImage(%slot);
|
||||
%plyr.decInventory(%item.item, 1);
|
||||
|
||||
return %deplObj;
|
||||
}
|
||||
|
||||
function DeployedEscapePod::onDestroyed(%this,%obj,%prevState) {
|
||||
if (%obj.isRemoved)
|
||||
return;
|
||||
%obj.isRemoved = true;
|
||||
Parent::onDestroyed(%this,%obj,%prevState);
|
||||
$TeamDeployedCount[%obj.team, EscapePodDeployable]--;
|
||||
remDSurface(%obj);
|
||||
%obj.schedule(500, "delete");
|
||||
if (isObject(%obj.lTarget))
|
||||
%obj.lTarget.schedule(500, "delete");
|
||||
if (isObject(%obj.podVehicle))
|
||||
%obj.podVehicle.schedule(500,setDamageState,Destroyed);
|
||||
}
|
||||
|
||||
function DeployedEscapePod::disassemble(%data,%plyr,%obj) {
|
||||
if (isObject(%obj.podVehicle))
|
||||
%obj.podVehicle.startFade(500,0,1);
|
||||
%obj.podVehicle.schedule(500,delete);
|
||||
disassemble(%data,%plyr,%obj);
|
||||
}
|
||||
|
||||
function adjustEscapePod(%obj) {
|
||||
if (!isObject(%obj))
|
||||
return;
|
||||
%lTarget = %obj.lTarget;
|
||||
%pos = %lTarget.getPosition();
|
||||
%rot = %lTarget.getRotation();
|
||||
%nrm = realVec(%lTarget,"0 0 1");
|
||||
%obj.setTransform(vectorAdd(%pos,vectorScale(%nrm,1.25)) SPC %rot);
|
||||
}
|
||||
|
||||
function escapePodLoop(%obj) {
|
||||
if (!isObject(%obj))
|
||||
return;
|
||||
if (%obj.getDamageState() !$= "Enabled")
|
||||
return;
|
||||
cancel(%obj.escapePodLoop);
|
||||
%lTarget = %obj.lTarget;
|
||||
%pos = %lTarget.getPosition();
|
||||
%nrm = realVec(%lTarget,"0 0 1");
|
||||
%nrm2 = realVec(%lTarget,"1 0 0");
|
||||
%epod = %obj.podVehicle;
|
||||
if (isObject(%epod)) {
|
||||
if (%epod.player) {
|
||||
%player = %epod.getMountedObject(0);
|
||||
if (isObject(%player)) {
|
||||
if (%player.getState() $= "Dead") {
|
||||
%remove = true;
|
||||
if (!%player.podFaded) {
|
||||
%player.startFade(2000,0,1);
|
||||
%player.podFaded = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
%remove = true;
|
||||
}
|
||||
else {
|
||||
// Remove when launched manually (no player)
|
||||
if (%epod.launched)
|
||||
%remove = true;
|
||||
}
|
||||
if (%remove == true)
|
||||
%epod.getDataBlock().fadeOutVehicle(%epod);
|
||||
}
|
||||
else {
|
||||
%epod = new HoverVehicle() {
|
||||
dataBlock = "EscapePodVehicle";
|
||||
scale = "1 1 1";
|
||||
team = %obj.team;
|
||||
mountable = "1";
|
||||
selfpower = "1";
|
||||
};
|
||||
%obj.podVehicle = %epod;
|
||||
setTargetSensorGroup(%epod.getTarget(),%epod.team);
|
||||
%epod.launcher = %obj;
|
||||
%epod.setFrozenState(true);
|
||||
%epod.setTransform(vectorAdd(%pos,vectorScale(%nrm,1)) SPC fullRot(%nrm,vectorScale(%nrm2,-1)));
|
||||
%obj.play3D(EscapePodReloadSound);
|
||||
%obj.stopThread($AmbientThread);
|
||||
%obj.setThreadDir($AmbientThread,0);
|
||||
%obj.playThread($AmbientThread,"recoil");
|
||||
%obj.schedule(1000,stopThread,$AmbientThread);
|
||||
}
|
||||
%obj.escapePodLoop = schedule(1000,0,escapePodLoop,%obj);
|
||||
}
|
||||
|
||||
function EscapePodDeployableImage::onMount(%data, %obj, %node) {
|
||||
%obj.hasEscapePod = true; // set for podcheck
|
||||
%obj.packSet = 7;
|
||||
%obj.expertSet = 0;
|
||||
}
|
||||
|
||||
function EscapePodDeployableImage::onUnmount(%data, %obj, %node) {
|
||||
%obj.packSet = 0;
|
||||
%obj.expertSet = 0;
|
||||
%obj.hasEscapePod = "";
|
||||
}
|
||||
|
||||
function EscapePodVehicle::isBlocked(%data,%obj,%player) {
|
||||
%pos = %obj.getPosition();
|
||||
%startPos = vectorAdd(%pos,vectorScale(realVec(%obj,"0 -1 0"),2));
|
||||
%endPos = vectorAdd(%pos,vectorScale(realVec(%obj,"0 1 0"),2));
|
||||
%mask = $TypeMasks::VehicleObjectType | $TypeMasks::StationObjectType | $TypeMasks::GeneratorObjectType | $TypeMasks::SensorObjectType | $TypeMasks::TurretObjectType | $TypeMasks::TerrainObjectType | $TypeMasks::InteriorObjectType | $TypeMasks::ForceFieldObjectType | $TypeMasks::StaticObjectType | $TypeMasks::MoveableObjectType | $TypeMasks::DamagableItemObjectType;
|
||||
%res = containerRayCast(%startPos,%endPos,%mask,%obj);
|
||||
if (%res)
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
function EscapePodVehicle::playerMounted(%data, %obj, %player, %node) {
|
||||
if (%obj.player)
|
||||
return;
|
||||
%obj.player = %player;
|
||||
%obj.playerMountedTime = getSimTime();
|
||||
// commandToClient(%player.client, 'setHudMode', 'Pilot', "Hoverbike", %node);
|
||||
|
||||
// update observers who are following this guy...
|
||||
if ( %player.client.observeCount > 0 )
|
||||
resetObserveFollow( %player.client, false );
|
||||
|
||||
%obj.play3D(EscapePodBeepSound);
|
||||
%data.schedule(1000,actionThreadPlayer,%player,"scoutRoot");
|
||||
%obj.schedule(1500,play3D,EscapePodChargeSound);
|
||||
%data.schedule(3000,launchPod,%obj,%player,%node);
|
||||
}
|
||||
|
||||
function EscapePodVehicle::actionThreadPlayer(%data,%player,%thread) {
|
||||
if (!isObject(%player))
|
||||
return;
|
||||
if (%player.getState() $= "Dead") {
|
||||
%player.startFade(2000,0,1);
|
||||
%player.podFaded = true;
|
||||
}
|
||||
else
|
||||
%player.setActionThread(%thread,true);
|
||||
}
|
||||
|
||||
function EscapePodVehicle::launchPod(%data,%obj,%player,%node) {
|
||||
if (!isObject(%obj))
|
||||
return;
|
||||
%obj.launched = true;
|
||||
%obj.play3D(EscapePodLaunchSound);
|
||||
%obj.play3D(EscapePodLaunchSound2);
|
||||
%launcher = %obj.launcher;
|
||||
if (isObject(%launcher)) {
|
||||
%launcher.stopThread($AmbientThread);
|
||||
%launcher.setThreadDir($AmbientThread,1);
|
||||
%launcher.playThread($AmbientThread,"recoil");
|
||||
%launcher.schedule(1000,stopThread,$AmbientThread);
|
||||
}
|
||||
%obj.setFrozenState(false);
|
||||
%obj.applyImpulse(%obj.getPosition(),vectorScale(realVec(%obj,"0 1 0"),%launcher.impulse));
|
||||
for(%i = 0; %i < 10; %i++)
|
||||
%data.schedule((%i * %i) * 10,emitLaunchPuff,%obj);
|
||||
}
|
||||
|
||||
function EscapePodVehicle::emitLaunchPuff(%data,%obj) {
|
||||
if (!isObject(%obj))
|
||||
return;
|
||||
%em = new ParticleEmissionDummy() {
|
||||
dataBlock = "defaultEmissionDummy";
|
||||
emitter = "VehicleLGESmokeEMitter";
|
||||
position = %obj.getPosition();
|
||||
scale = "1 1 1";
|
||||
velocity = "1";
|
||||
};
|
||||
MissionCleanup.add(%em);
|
||||
%em.schedule(1000,"delete");
|
||||
}
|
||||
|
||||
//function EscapePodVehicle::onDestroyed(%data, %obj, %prevState) {
|
||||
// Parent::onDestroyed(%data, %obj, %prevState);
|
||||
//}
|
||||
|
||||
|
||||
//function EscapePodVehicle::playerDismounted(%data, %obj, %player) {
|
||||
// Parent::playerDismounted(%data, %obj, %player);
|
||||
//}
|
||||
|
||||
function EscapePodVehicle::fadeOutVehicle(%data,%obj) {
|
||||
if (%obj.faded)
|
||||
return;
|
||||
%obj.faded = true;
|
||||
%obj.startFade(1000,4000,1);
|
||||
%obj.schedule(5000,delete);
|
||||
%obj.schedule(4000,play3D,EscapePodFadeSound);
|
||||
}
|
||||
|
||||
function EscapePodVehicle::onAdd(%this, %obj) {
|
||||
Parent::onAdd(%this, %obj);
|
||||
setTargetSensorGroup(%obj.getTarget(),%obj.team);
|
||||
}
|
||||
|
||||
function displayEscapePodBoostPower(%plyr) {
|
||||
%line = $packSetting["escapepod",%plyr.packSet];
|
||||
%max = $packSetting["escapepod",$packSettings["escapepod"]];
|
||||
%power = mAbs(mFloatLength(100 / %max * %line,1));
|
||||
bottomPrint(%plyr.client,"Escape Pod booster set to " @ %power @ "% power" ,2,1);
|
||||
}
|
||||
518
scripts/packs/forcefieldpack.cs
Normal file
518
scripts/packs/forcefieldpack.cs
Normal file
|
|
@ -0,0 +1,518 @@
|
|||
//---------------------------------------------------------
|
||||
// Deployable Force Field
|
||||
//---------------------------------------------------------
|
||||
|
||||
// Translucencies
|
||||
%noPassTrans = 1.0;
|
||||
%teamPassTrans = 0.6;
|
||||
%allPassTrans = 0.2;
|
||||
|
||||
%dimDiv = 4;
|
||||
|
||||
// RGB
|
||||
%colourOn = 0.3;
|
||||
%colourOff = 0.0;
|
||||
|
||||
datablock ForceFieldBareData(DeployedForceField) {
|
||||
className = "forcefield";
|
||||
fadeMS = 1000;
|
||||
baseTranslucency = %allPassTrans;
|
||||
powerOffTranslucency = %allPassTrans / %dimDiv;
|
||||
teamPermiable = false;
|
||||
otherPermiable = false;
|
||||
color = "1.0 1.0 1.0";
|
||||
powerOffColor = "0.0 0.0 0.0";
|
||||
targetNameTag = 'Force Field';
|
||||
targetTypeTag = 'ForceField';
|
||||
texture[0] = "skins/forcef1";
|
||||
texture[1] = "skins/forcef2";
|
||||
texture[2] = "skins/forcef3";
|
||||
texture[3] = "skins/forcef4";
|
||||
texture[4] = "skins/forcef5";
|
||||
framesPerSec = 1; // 10
|
||||
numFrames = 5;
|
||||
scrollSpeed = 15;
|
||||
umapping = 0.01; // 1.0
|
||||
vmapping = 0.01; // 0.15
|
||||
deployedFrom = ForceFieldDeployable;
|
||||
needsPower = true;
|
||||
};
|
||||
|
||||
// No pass
|
||||
datablock ForceFieldBareData(DeployedForceField0) : DeployedForceField {
|
||||
baseTranslucency = %noPassTrans;
|
||||
powerOffTranslucency = %noPassTrans / %dimDiv;
|
||||
teamPermiable = false;
|
||||
otherPermiable = false;
|
||||
color = %colourOn SPC %colourOn SPC %colourOn;
|
||||
powerOffColor = "0.0 0.0 0.0";
|
||||
};
|
||||
|
||||
datablock ForceFieldBareData(DeployedForceField1) : DeployedForceField {
|
||||
baseTranslucency = %noPassTrans;
|
||||
powerOffTranslucency = %noPassTrans / %dimDiv;
|
||||
teamPermiable = false;
|
||||
otherPermiable = false;
|
||||
color = %colourOn SPC %colourOff SPC %colourOff;
|
||||
powerOffColor = "0.0 0.0 0.0";
|
||||
};
|
||||
|
||||
datablock ForceFieldBareData(DeployedForceField2) : DeployedForceField {
|
||||
baseTranslucency = %noPassTrans;
|
||||
powerOffTranslucency = %noPassTrans / %dimDiv;
|
||||
teamPermiable = false;
|
||||
otherPermiable = false;
|
||||
color = %colourOff SPC %colourOn SPC %colourOff;
|
||||
powerOffColor = "0.0 0.0 0.0";
|
||||
};
|
||||
|
||||
datablock ForceFieldBareData(DeployedForceField3) : DeployedForceField {
|
||||
baseTranslucency = %noPassTrans;
|
||||
powerOffTranslucency = %noPassTrans / %dimDiv;
|
||||
teamPermiable = false;
|
||||
otherPermiable = false;
|
||||
color = %colourOff SPC %colourOff SPC %colourOn;
|
||||
powerOffColor = "0.0 0.0 0.0";
|
||||
};
|
||||
|
||||
datablock ForceFieldBareData(DeployedForceField4) : DeployedForceField {
|
||||
baseTranslucency = %noPassTrans;
|
||||
powerOffTranslucency = %noPassTrans / %dimDiv;
|
||||
teamPermiable = false;
|
||||
otherPermiable = false;
|
||||
color = %colourOff SPC %colourOn SPC %colourOn;
|
||||
powerOffColor = "0.0 0.0 0.0";
|
||||
};
|
||||
|
||||
datablock ForceFieldBareData(DeployedForceField5) : DeployedForceField {
|
||||
baseTranslucency = %noPassTrans;
|
||||
powerOffTranslucency = %noPassTrans / %dimDiv;
|
||||
teamPermiable = false;
|
||||
otherPermiable = false;
|
||||
color = %colourOn SPC %colourOff SPC %colourOn;
|
||||
powerOffColor = "0.0 0.0 0.0";
|
||||
};
|
||||
|
||||
datablock ForceFieldBareData(DeployedForceField6) : DeployedForceField {
|
||||
baseTranslucency = %noPassTrans;
|
||||
powerOffTranslucency = %noPassTrans / %dimDiv;
|
||||
teamPermiable = false;
|
||||
otherPermiable = false;
|
||||
color = %colourOn SPC %colourOn SPC %colourOff;
|
||||
powerOffColor = "0.0 0.0 0.0";
|
||||
};
|
||||
|
||||
// Team pass
|
||||
datablock ForceFieldBareData(DeployedForceField7) : DeployedForceField {
|
||||
baseTranslucency = %teamPassTrans;
|
||||
powerOffTranslucency = %teamPassTrans / %dimDiv;
|
||||
teamPermiable = true;
|
||||
otherPermiable = false;
|
||||
color = %colourOn SPC %colourOn SPC %colourOn;
|
||||
powerOffColor = "0.0 0.0 0.0";
|
||||
};
|
||||
|
||||
datablock ForceFieldBareData(DeployedForceField8) : DeployedForceField {
|
||||
baseTranslucency = %teamPassTrans;
|
||||
powerOffTranslucency = %teamPassTrans / %dimDiv;
|
||||
teamPermiable = true;
|
||||
otherPermiable = false;
|
||||
color = %colourOn SPC %colourOff SPC %colourOff;
|
||||
powerOffColor = "0.0 0.0 0.0";
|
||||
};
|
||||
|
||||
datablock ForceFieldBareData(DeployedForceField9) : DeployedForceField {
|
||||
baseTranslucency = %teamPassTrans;
|
||||
powerOffTranslucency = %teamPassTrans / %dimDiv;
|
||||
teamPermiable = true;
|
||||
otherPermiable = false;
|
||||
color = %colourOff SPC %colourOn SPC %colourOff;
|
||||
powerOffColor = "0.0 0.0 0.0";
|
||||
};
|
||||
|
||||
datablock ForceFieldBareData(DeployedForceField10) : DeployedForceField {
|
||||
baseTranslucency = %teamPassTrans;
|
||||
powerOffTranslucency = %teamPassTrans / %dimDiv;
|
||||
teamPermiable = true;
|
||||
otherPermiable = false;
|
||||
color = %colourOff SPC %colourOff SPC %colourOn;
|
||||
powerOffColor = "0.0 0.0 0.0";
|
||||
};
|
||||
|
||||
datablock ForceFieldBareData(DeployedForceField11) : DeployedForceField {
|
||||
baseTranslucency = %teamPassTrans;
|
||||
powerOffTranslucency = %teamPassTrans / %dimDiv;
|
||||
teamPermiable = true;
|
||||
otherPermiable = false;
|
||||
color = %colourOff SPC %colourOn SPC %colourOn;
|
||||
powerOffColor = "0.0 0.0 0.0";
|
||||
};
|
||||
|
||||
datablock ForceFieldBareData(DeployedForceField12) : DeployedForceField {
|
||||
baseTranslucency = %teamPassTrans;
|
||||
powerOffTranslucency = %teamPassTrans / %dimDiv;
|
||||
teamPermiable = true;
|
||||
otherPermiable = false;
|
||||
color = %colourOn SPC %colourOff SPC %colourOn;
|
||||
powerOffColor = "0.0 0.0 0.0";
|
||||
};
|
||||
|
||||
datablock ForceFieldBareData(DeployedForceField13) : DeployedForceField {
|
||||
baseTranslucency = %teamPassTrans;
|
||||
powerOffTranslucency = %teamPassTrans / %dimDiv;
|
||||
teamPermiable = true;
|
||||
otherPermiable = false;
|
||||
color = %colourOn SPC %colourOn SPC %colourOff;
|
||||
powerOffColor = "0.0 0.0 0.0";
|
||||
};
|
||||
|
||||
// All pass
|
||||
datablock ForceFieldBareData(DeployedForceField14) : DeployedForceField {
|
||||
baseTranslucency = %allPassTrans;
|
||||
powerOffTranslucency = %allPassTrans / %dimDiv;
|
||||
teamPermiable = true;
|
||||
otherPermiable = true;
|
||||
color = %colourOn SPC %colourOn SPC %colourOn;
|
||||
powerOffColor = "0.0 0.0 0.0";
|
||||
};
|
||||
|
||||
datablock ForceFieldBareData(DeployedForceField15) : DeployedForceField {
|
||||
baseTranslucency = %allPassTrans;
|
||||
powerOffTranslucency = %allPassTrans / %dimDiv;
|
||||
teamPermiable = true;
|
||||
otherPermiable = true;
|
||||
color = %colourOn SPC %colourOff SPC %colourOff;
|
||||
powerOffColor = "0.0 0.0 0.0";
|
||||
};
|
||||
|
||||
datablock ForceFieldBareData(DeployedForceField16) : DeployedForceField {
|
||||
baseTranslucency = %allPassTrans;
|
||||
powerOffTranslucency = %allPassTrans / %dimDiv;
|
||||
teamPermiable = true;
|
||||
otherPermiable = true;
|
||||
color = %colourOff SPC %colourOn SPC %colourOff;
|
||||
powerOffColor = "0.0 0.0 0.0";
|
||||
};
|
||||
|
||||
datablock ForceFieldBareData(DeployedForceField17) : DeployedForceField {
|
||||
baseTranslucency = %allPassTrans;
|
||||
powerOffTranslucency = %allPassTrans / %dimDiv;
|
||||
teamPermiable = true;
|
||||
otherPermiable = true;
|
||||
color = %colourOff SPC %colourOff SPC %colourOn;
|
||||
powerOffColor = "0.0 0.0 0.0";
|
||||
};
|
||||
|
||||
datablock ForceFieldBareData(DeployedForceField18) : DeployedForceField {
|
||||
baseTranslucency = %allPassTrans;
|
||||
powerOffTranslucency = %allPassTrans / %dimDiv;
|
||||
teamPermiable = true;
|
||||
otherPermiable = true;
|
||||
color = %colourOff SPC %colourOn SPC %colourOn;
|
||||
powerOffColor = "0.0 0.0 0.0";
|
||||
};
|
||||
|
||||
datablock ForceFieldBareData(DeployedForceField19) : DeployedForceField {
|
||||
baseTranslucency = %allPassTrans;
|
||||
powerOffTranslucency = %allPassTrans / %dimDiv;
|
||||
teamPermiable = true;
|
||||
otherPermiable = true;
|
||||
color = %colourOn SPC %colourOff SPC %colourOn;
|
||||
powerOffColor = "0.0 0.0 0.0";
|
||||
};
|
||||
|
||||
datablock ForceFieldBareData(DeployedForceField20) : DeployedForceField {
|
||||
baseTranslucency = %allPassTrans;
|
||||
powerOffTranslucency = %allPassTrans / %dimDiv;
|
||||
teamPermiable = true;
|
||||
otherPermiable = true;
|
||||
color = %colourOn SPC %colourOn SPC %colourOff;
|
||||
powerOffColor = "0.0 0.0 0.0";
|
||||
};
|
||||
|
||||
datablock ShapeBaseImageData(ForceFieldDeployableImage) {
|
||||
mass = 1;
|
||||
emap = true;
|
||||
shapeFile = "ammo_chaingun.dts";
|
||||
item = ForceFieldDeployable;
|
||||
mountPoint = 1;
|
||||
offset = "-0.2 -0.125 0";
|
||||
rotation = "0 -1 0 90";
|
||||
deployed = DeployedForceField;
|
||||
heatSignature = 0;
|
||||
|
||||
stateName[0] = "Idle";
|
||||
stateTransitionOnTriggerDown[0] = "Activate";
|
||||
|
||||
stateName[1] = "Activate";
|
||||
stateScript[1] = "onActivate";
|
||||
stateTransitionOnTriggerUp[1] = "Idle";
|
||||
|
||||
maxDepSlope = 360;
|
||||
deploySound = ItemPickupSound;
|
||||
|
||||
minDeployDis = 0.1;
|
||||
maxDeployDis = 50.0;
|
||||
};
|
||||
|
||||
datablock ItemData(ForceFieldDeployable) {
|
||||
className = Pack;
|
||||
catagory = "Deployables";
|
||||
shapeFile = "stackable1s.dts";
|
||||
mass = 1;
|
||||
elasticity = 0.2;
|
||||
friction = 0.6;
|
||||
pickupRadius = 1;
|
||||
rotate = true;
|
||||
image = "ForceFieldDeployableImage";
|
||||
pickUpName = "a force field pack";
|
||||
heatSignature = 0;
|
||||
emap = true;
|
||||
};
|
||||
|
||||
function ForceFieldDeployableImage::testObjectTooClose(%item) {
|
||||
return;
|
||||
}
|
||||
|
||||
function ForceFieldDeployableImage::testNoTerrainFound(%item) {
|
||||
// don't check this for non-Landspike turret deployables
|
||||
}
|
||||
|
||||
function ForceFieldDeployable::onPickup(%this, %obj, %shape, %amount) {
|
||||
// created to prevent console errors
|
||||
}
|
||||
|
||||
function ForceFieldDeployableImage::onDeploy(%item, %plyr, %slot) {
|
||||
//Object
|
||||
%className = "ForceFieldBare";
|
||||
|
||||
%grounded = 0;
|
||||
if (%item.surface.getClassName() $= TerrainBlock)
|
||||
%grounded = 1;
|
||||
|
||||
%playerVector = vectorNormalize(-1 * getWord(%plyr.getEyeVector(),1) SPC getWord(%plyr.getEyeVector(),0) SPC "0");
|
||||
|
||||
if (%item.surfaceinher == 0) {
|
||||
if (vAbs(floorVec(%item.surfaceNrm,100)) $= "0 0 1")
|
||||
%item.surfaceNrm2 = %playerVector;
|
||||
else
|
||||
%item.surfaceNrm2 = vectorNormalize(vectorCross(%item.surfaceNrm,"0 0 1"));
|
||||
}
|
||||
|
||||
%rot = fullRot(%item.surfaceNrm,%item.surfaceNrm2);
|
||||
%scale = getWords($packSetting["forcefield",%plyr.packSet],0,2);
|
||||
%mCenter = "-0.5 -0.5 -0.5";
|
||||
%pad = pad(%item.surfacePt SPC %item.surfaceNrm SPC %item.surfaceNrm2,%scale,%mCenter);
|
||||
%scale = getWords(%pad,0,2);
|
||||
%item.surfacePt = getWords(%pad,3,5);
|
||||
%rot = getWords(%pad,6,9);
|
||||
|
||||
// Add padding
|
||||
%padSize = 0.01;
|
||||
%scale = vectorAdd(%scale,%padSize * 2 SPC %padSize * 2 SPC -%padSize * 2);
|
||||
%item.surfacePt = vectorSub(%item.surfacePt,vectorScale(vectorNormalize(%item.surfaceNrm),%padSize));
|
||||
%item.surfacePt = vectorSub(%item.surfacePt,vectorScale(vectorNormalize(%item.surfaceNrm2),%padSize));
|
||||
%item.surfacePt = vectorSub(%item.surfacePt,vectorScale(vectorNormalize(vectorCross(%item.surfaceNrm,%item.surfaceNrm2)),-%padSize));
|
||||
|
||||
if ($Host::ExpertMode == 1) {
|
||||
if (isCubic(%item.surface) && (%plyr.expertSet == 1 || %plyr.expertSet == 3) && %plyr.team == %item.surface.team
|
||||
&& %item.surface.getType() & $TypeMasks::StaticShapeObjectType
|
||||
&& (($Host::OnlyOwnerCubicReplace == 0) || (%plyr.client == %item.surface.getOwner()))) {
|
||||
%scale = vectorAdd(realSize(%item.surface),%padSize * 2 SPC %padSize * 2 SPC %padSize * 2);
|
||||
%center = realVec(%item.surface,vectorScale(getWords(%scale,0,1) SPC "0",-0.5));
|
||||
%item.surfacePt = vectorAdd(pos(%item.surface),%center);
|
||||
%rot = rot(%item.surface);
|
||||
%mod = vectorScale(matrixMulVector("0 0 0" SPC %rot ,"0 0 1"),-%padSize);
|
||||
%item.surfacePt = vectorAdd(%item.surfacePt,%mod);
|
||||
%item.surface.getDataBlock().disassemble(%plyr, %item.surface);
|
||||
}
|
||||
}
|
||||
|
||||
// TODO - temporary test fix - remove?
|
||||
%scale = vectorAdd(%scale,"0 0 0");
|
||||
%x = getWord(%scale,0);
|
||||
%y = getWord(%scale,1);
|
||||
%z = getWord(%scale,2);
|
||||
if (%x <= 0)
|
||||
%x = 0.001;
|
||||
if (%y <= 0)
|
||||
%y = 0.001;
|
||||
if (%z <= 0)
|
||||
%z = 0.001;
|
||||
%scale = %x SPC %y SPC %z;
|
||||
|
||||
%deplObj = new (%className)() {
|
||||
dataBlock = %item.deployed @ %plyr.packSet;
|
||||
scale = %scale;
|
||||
};
|
||||
|
||||
// Take the deployable off the player's back and out of inventory
|
||||
if ($Host::ExpertMode == 0) {
|
||||
%plyr.unMountImage(%slot);
|
||||
%plyr.decInventory(%item.item,1);
|
||||
}
|
||||
|
||||
////////////////////////Apply settings//////////////////////////////
|
||||
|
||||
// [[Location]]:
|
||||
|
||||
// exact:
|
||||
%deplObj.setTransform(%item.surfacePt SPC %rot);
|
||||
%deplObj.pzone.setTransform(%item.surfacePt SPC %rot);
|
||||
|
||||
if ($Host::ExpertMode == 1) {
|
||||
if (%plyr.expertSet == 2 || %plyr.expertSet == 3) {
|
||||
%deplObj.noSlow = true;
|
||||
%deplObj.pzone.delete();
|
||||
%deplObj.pzone = "";
|
||||
}
|
||||
}
|
||||
|
||||
// misc info
|
||||
addDSurface(%item.surface,%deplObj);
|
||||
|
||||
// [[Settings]]:
|
||||
|
||||
%deplObj.grounded = %grounded;
|
||||
%deplObj.needsFit = 1;
|
||||
|
||||
// [[Normal Stuff]]:
|
||||
|
||||
// set team, owner, and handle
|
||||
%deplObj.team = %plyr.client.team;
|
||||
%deplObj.setOwner(%plyr);
|
||||
|
||||
// set power frequency
|
||||
%deplObj.powerFreq = %plyr.powerFreq;
|
||||
|
||||
// set the sensor group if it needs one
|
||||
if (%deplObj.getTarget() != -1)
|
||||
setTargetSensorGroup(%deplObj.getTarget(), %plyr.client.team);
|
||||
|
||||
// place the deployable in the MissionCleanup/Deployables group (AI reasons)
|
||||
addToDeployGroup(%deplObj);
|
||||
|
||||
//let the AI know as well...
|
||||
AIDeployObject(%plyr.client, %deplObj);
|
||||
|
||||
// play the deploy sound
|
||||
serverPlay3D(%item.deploySound, %deplObj.getTransform());
|
||||
|
||||
// increment the team count for this deployed object
|
||||
$TeamDeployedCount[%plyr.team, %item.item]++;
|
||||
|
||||
// Power object
|
||||
checkPowerObject(%deplObj);
|
||||
|
||||
if (!%deplObj.powerCount > 0) {
|
||||
%deplObj.getDataBlock().disassemble(0,%deplObj); // Run Item Specific code.
|
||||
messageClient(%plyr.client,'MsgDeployFailed','\c2Force field lost - no power source found!%1','~wfx/misc/misc.error.wav');
|
||||
}
|
||||
|
||||
return %deplObj;
|
||||
}
|
||||
|
||||
/////////////////////////////////////
|
||||
|
||||
function ForceFieldDeployableImage::onMount(%data, %obj, %node) {
|
||||
%obj.hasForceField = true; // set for forcefieldcheck
|
||||
%obj.packSet = 0;
|
||||
%obj.expertSet = 0;
|
||||
displayPowerFreq(%obj);
|
||||
}
|
||||
|
||||
function ForceFieldDeployableImage::onUnmount(%data, %obj, %node) {
|
||||
%obj.hasForceField = "";
|
||||
%obj.packSet = 0;
|
||||
%obj.expertSet = 0;
|
||||
}
|
||||
|
||||
function DeployedForceField::disassemble(%data,%plyr,%obj) {
|
||||
if (isObject(%obj.pzone))
|
||||
%obj.pzone.delete();
|
||||
disassemble(%data,%plyr,%obj);
|
||||
}
|
||||
|
||||
function DeployedForceField0::disassemble(%data,%plyr,%obj) {
|
||||
DeployedForceField::disassemble(%data,%plyr,%obj);
|
||||
}
|
||||
|
||||
function DeployedForceField1::disassemble(%data,%plyr,%obj) {
|
||||
DeployedForceField::disassemble(%data,%plyr,%obj);
|
||||
}
|
||||
|
||||
function DeployedForceField2::disassemble(%data,%plyr,%obj) {
|
||||
DeployedForceField::disassemble(%data,%plyr,%obj);
|
||||
}
|
||||
|
||||
function DeployedForceField3::disassemble(%data,%plyr,%obj) {
|
||||
DeployedForceField::disassemble(%data,%plyr,%obj);
|
||||
}
|
||||
|
||||
function DeployedForceField4::disassemble(%data,%plyr,%obj) {
|
||||
DeployedForceField::disassemble(%data,%plyr,%obj);
|
||||
}
|
||||
|
||||
function DeployedForceField5::disassemble(%data,%plyr,%obj) {
|
||||
DeployedForceField::disassemble(%data,%plyr,%obj);
|
||||
}
|
||||
|
||||
function DeployedForceField6::disassemble(%data,%plyr,%obj) {
|
||||
DeployedForceField::disassemble(%data,%plyr,%obj);
|
||||
}
|
||||
|
||||
function DeployedForceField7::disassemble(%data,%plyr,%obj) {
|
||||
DeployedForceField::disassemble(%data,%plyr,%obj);
|
||||
}
|
||||
|
||||
function DeployedForceField8::disassemble(%data,%plyr,%obj) {
|
||||
DeployedForceField::disassemble(%data,%plyr,%obj);
|
||||
}
|
||||
|
||||
function DeployedForceField9::disassemble(%data,%plyr,%obj) {
|
||||
DeployedForceField::disassemble(%data,%plyr,%obj);
|
||||
}
|
||||
|
||||
function DeployedForceField10::disassemble(%data,%plyr,%obj) {
|
||||
DeployedForceField::disassemble(%data,%plyr,%obj);
|
||||
}
|
||||
|
||||
function DeployedForceField11::disassemble(%data,%plyr,%obj) {
|
||||
DeployedForceField::disassemble(%data,%plyr,%obj);
|
||||
}
|
||||
|
||||
function DeployedForceField12::disassemble(%data,%plyr,%obj) {
|
||||
DeployedForceField::disassemble(%data,%plyr,%obj);
|
||||
}
|
||||
|
||||
function DeployedForceField13::disassemble(%data,%plyr,%obj) {
|
||||
DeployedForceField::disassemble(%data,%plyr,%obj);
|
||||
}
|
||||
|
||||
function DeployedForceField14::disassemble(%data,%plyr,%obj) {
|
||||
DeployedForceField::disassemble(%data,%plyr,%obj);
|
||||
}
|
||||
|
||||
function DeployedForceField15::disassemble(%data,%plyr,%obj) {
|
||||
DeployedForceField::disassemble(%data,%plyr,%obj);
|
||||
}
|
||||
|
||||
function DeployedForceField16::disassemble(%data,%plyr,%obj) {
|
||||
DeployedForceField::disassemble(%data,%plyr,%obj);
|
||||
}
|
||||
|
||||
function DeployedForceField17::disassemble(%data,%plyr,%obj) {
|
||||
DeployedForceField::disassemble(%data,%plyr,%obj);
|
||||
}
|
||||
|
||||
function DeployedForceField18::disassemble(%data,%plyr,%obj) {
|
||||
DeployedForceField::disassemble(%data,%plyr,%obj);
|
||||
}
|
||||
|
||||
function DeployedForceField19::disassemble(%data,%plyr,%obj) {
|
||||
DeployedForceField::disassemble(%data,%plyr,%obj);
|
||||
}
|
||||
|
||||
function DeployedForceField20::disassemble(%data,%plyr,%obj) {
|
||||
DeployedForceField::disassemble(%data,%plyr,%obj);
|
||||
}
|
||||
145
scripts/packs/generator.cs
Normal file
145
scripts/packs/generator.cs
Normal file
|
|
@ -0,0 +1,145 @@
|
|||
//--------------------------------------------------------------------------
|
||||
// Deployable Generator
|
||||
//--------------------------------------------------------------------------
|
||||
|
||||
datablock ShapeBaseImageData(GeneratorDeployableImage) {
|
||||
mass = 1;
|
||||
emap = true;
|
||||
shapeFile = "stackable1s.dts";
|
||||
item = GeneratorDeployable;
|
||||
mountPoint = 1;
|
||||
offset = "0 0 0";
|
||||
deployed = GeneratorLarge;
|
||||
heatSignature = 0;
|
||||
|
||||
stateName[0] = "Idle";
|
||||
stateTransitionOnTriggerDown[0] = "Activate";
|
||||
|
||||
stateName[1] = "Activate";
|
||||
stateScript[1] = "onActivate";
|
||||
stateTransitionOnTriggerUp[1] = "Idle";
|
||||
|
||||
isLarge = true;
|
||||
maxDepSlope = 360;
|
||||
deploySound = ItemPickupSound;
|
||||
|
||||
minDeployDis = 2;
|
||||
maxDeployDis = 5;
|
||||
};
|
||||
|
||||
datablock ItemData(GeneratorDeployable) {
|
||||
className = Pack;
|
||||
catagory = "Deployables";
|
||||
shapeFile = "stackable1s.dts";
|
||||
mass = 1;
|
||||
|
||||
hasLight = true;
|
||||
lightType = "PulsingLight";
|
||||
lightColor = "0.1 0.8 0.8 1.0";
|
||||
lightTime = "1000";
|
||||
lightRadius = "3";
|
||||
|
||||
elasticity = 0.2;
|
||||
friction = 0.6;
|
||||
pickupRadius = 3;
|
||||
rotate = true;
|
||||
image = "GeneratorDeployableImage";
|
||||
pickUpName = "a generator pack";
|
||||
heatSignature = 0;
|
||||
emap = true;
|
||||
};
|
||||
|
||||
function GeneratorDeployableImage::testNoTerrainFound(%item) {
|
||||
// don't check this for non-Landspike turret deployables
|
||||
}
|
||||
|
||||
function GeneratorDeployable::onPickup(%this, %obj, %shape, %amount) {
|
||||
// created to prevent console errors
|
||||
}
|
||||
|
||||
function GeneratorDeployableImage::onDeploy(%item, %plyr, %slot) {
|
||||
%className = "StaticShape";
|
||||
|
||||
%playerVector = vectorNormalize(getWord(%plyr.getEyeVector(),1) SPC -1 * getWord(%plyr.getEyeVector(),0) SPC "0");
|
||||
|
||||
if (vAbs(floorVec(%item.surfaceNrm,100)) $= "0 0 1")
|
||||
%item.surfaceNrm2 = vectorScale(%playerVector,-1);
|
||||
else
|
||||
%item.surfaceNrm2 = vectorNormalize(vectorCross(%item.surfaceNrm,"0 0 1"));
|
||||
|
||||
%rot = fullRot(%item.surfaceNrm,%item.surfaceNrm2);
|
||||
|
||||
%item.surfacePt = vectorAdd(%item.surfacePt,vectorScale(vectorNormalize(vectorCross(%item.surfaceNrm,%item.surfaceNrm2)),2));
|
||||
|
||||
%deplObj = new (%className)() {
|
||||
dataBlock = GeneratorLarge;
|
||||
deployed = true;
|
||||
};
|
||||
|
||||
// set orientation
|
||||
%deplObj.setTransform(%item.surfacePt SPC %rot);
|
||||
|
||||
// set team, owner, and handle
|
||||
%deplObj.team = %plyr.client.Team;
|
||||
%deplObj.setOwner(%plyr);
|
||||
|
||||
// set power frequency
|
||||
%deplObj.powerFreq = %plyr.powerFreq;
|
||||
setTargetName(%deplObj.target,addTaggedString("Frequency" SPC %deplObj.powerFreq));
|
||||
|
||||
// set power
|
||||
%deplObj.setSelfPowered();
|
||||
|
||||
// set the sensor group if it needs one
|
||||
if (%deplObj.getTarget() != -1)
|
||||
setTargetSensorGroup(%deplObj.getTarget(), %plyr.client.team);
|
||||
|
||||
// place the deployable in the MissionCleanup/Deployables group (AI reasons)
|
||||
addToDeployGroup(%deplObj);
|
||||
|
||||
//let the AI know as well...
|
||||
AIDeployObject(%plyr.client, %deplObj);
|
||||
|
||||
// play the deploy sound
|
||||
serverPlay3D(%item.deploySound, %deplObj.getTransform());
|
||||
|
||||
// increment the team count for this deployed object
|
||||
$TeamDeployedCount[%plyr.team, %item.item]++;
|
||||
|
||||
addDSurface(%item.surface,%deplObj);
|
||||
|
||||
%deplObj.playThread($PowerThread,"Power");
|
||||
|
||||
// take the deployable off the player's back and out of inventory
|
||||
%plyr.unmountImage(%slot);
|
||||
%plyr.decInventory(%item.item, 1);
|
||||
|
||||
// add to power list
|
||||
$PowerList = listAdd($PowerList,%deplObj,-1);
|
||||
|
||||
return %deplObj;
|
||||
}
|
||||
|
||||
function GeneratorLarge::onDestroyed(%this,%obj,%prevState) {
|
||||
if (%obj.isRemoved)
|
||||
return;
|
||||
if (%obj.deployed && ($Host::InvincibleDeployables != 1 || %obj.damageFailedDecon)) {
|
||||
%obj.isRemoved = true;
|
||||
%loc = findWord($PowerList,%obj);
|
||||
if (%loc !$= "")
|
||||
$PowerList = listDel($PowerList,%loc);
|
||||
$TeamDeployedCount[%obj.team,GeneratorDeployable]--;
|
||||
remDSurface(%obj);
|
||||
%obj.schedule(500,"delete");
|
||||
}
|
||||
Parent::onDestroyed(%data,%obj,%prevState);
|
||||
}
|
||||
|
||||
function GeneratorDeployableImage::onMount(%data,%obj,%node) {
|
||||
%obj.hasGen = true; // set for gencheck
|
||||
displayPowerFreq(%obj);
|
||||
}
|
||||
|
||||
function GeneratorDeployableImage::onUnmount(%data,%obj,%node) {
|
||||
%obj.hasGen = "";
|
||||
}
|
||||
344
scripts/packs/gravityfieldpack.cs
Normal file
344
scripts/packs/gravityfieldpack.cs
Normal file
|
|
@ -0,0 +1,344 @@
|
|||
//---------------------------------------------------------
|
||||
// Deployable Gravity Field
|
||||
//---------------------------------------------------------
|
||||
|
||||
// Translucencies
|
||||
%fieldTrans = 1.0;
|
||||
%powerOffTrans = 0.25;
|
||||
|
||||
// RGB
|
||||
%colourOn = 0.6;
|
||||
%colourOff = 0.15;
|
||||
%dimDiv = 3;
|
||||
|
||||
datablock ForceFieldBareData(DeployedGravityField) {
|
||||
className = "gravityfield";
|
||||
fadeMS = 1000;
|
||||
baseTranslucency = %fieldTrans;
|
||||
powerOffTranslucency = %powerOffTrans;
|
||||
teamPermiable = true;
|
||||
otherPermiable = true;
|
||||
color = "1.0 1.0 1.0";
|
||||
powerOffColor = "0.0 0.0 0.0";
|
||||
targetTypeTag = 'GravityField';
|
||||
texture[0] = "skins/forcef1";
|
||||
texture[1] = "skins/forcef2";
|
||||
texture[2] = "skins/forcef3";
|
||||
texture[3] = "skins/forcef4";
|
||||
texture[4] = "skins/forcef5";
|
||||
framesPerSec = 10;
|
||||
numFrames = 5;
|
||||
scrollSpeed = 15;
|
||||
umapping = 1.0;
|
||||
vmapping = 0.15;
|
||||
deployedFrom = GravityFieldDeployable;
|
||||
velocityMod = 1;
|
||||
gravityMod = 1;
|
||||
appliedForce = "0 0 0";
|
||||
needsPower = true;
|
||||
};
|
||||
|
||||
// slow
|
||||
datablock ForceFieldBareData(DeployedGravityField0) : DeployedGravityField {
|
||||
baseTranslucency = %fieldTrans;
|
||||
powerOffTranslucency = %powerOffTrans;
|
||||
teamPermiable = true;
|
||||
otherPermiable = true;
|
||||
color = %colourOff/%dimDiv SPC %colourOn/%dimDiv SPC %colourOff/%dimDiv;
|
||||
powerOffColor = "0.0 0.0 0.0";
|
||||
velocityMod = 1;
|
||||
gravityMod = 0;
|
||||
};
|
||||
|
||||
// fast
|
||||
datablock ForceFieldBareData(DeployedGravityField1) : DeployedGravityField {
|
||||
baseTranslucency = %fieldTrans;
|
||||
powerOffTranslucency = %powerOffTrans;
|
||||
teamPermiable = true;
|
||||
otherPermiable = true;
|
||||
color = %colourOff SPC %colourOn SPC %colourOff;
|
||||
powerOffColor = "0.0 0.0 0.0";
|
||||
velocityMod = 1;
|
||||
gravityMod = 0;
|
||||
};
|
||||
|
||||
// zero gravity
|
||||
datablock ForceFieldBareData(DeployedGravityField2) : DeployedGravityField {
|
||||
baseTranslucency = %fieldTrans;
|
||||
powerOffTranslucency = %powerOffTrans;
|
||||
teamPermiable = true;
|
||||
otherPermiable = true;
|
||||
color = %colourOn SPC %colourOn SPC %colourOff;
|
||||
powerOffColor = "0.0 0.0 0.0";
|
||||
velocityMod = 1;
|
||||
gravityMod = 0;
|
||||
};
|
||||
|
||||
// fastfield
|
||||
datablock ForceFieldBareData(DeployedGravityField3) : DeployedGravityField {
|
||||
baseTranslucency = %fieldTrans;
|
||||
powerOffTranslucency = %powerOffTrans;
|
||||
teamPermiable = true;
|
||||
otherPermiable = true;
|
||||
color = %colourOn/%dimDiv SPC %colourOff/%dimDiv SPC %colourOn/%dimDiv;
|
||||
powerOffColor = "0.0 0.0 0.0";
|
||||
velocityMod = 1.5;
|
||||
gravityMod = 0;
|
||||
};
|
||||
|
||||
// super fastfield
|
||||
datablock ForceFieldBareData(DeployedGravityField4) : DeployedGravityField {
|
||||
baseTranslucency = %fieldTrans;
|
||||
powerOffTranslucency = %powerOffTrans;
|
||||
teamPermiable = true;
|
||||
otherPermiable = true;
|
||||
color = %colourOn SPC %colourOff SPC %colourOn;
|
||||
powerOffColor = "0.0 0.0 0.0";
|
||||
velocityMod = 1.7;
|
||||
gravityMod = 0;
|
||||
};
|
||||
|
||||
datablock ShapeBaseImageData(GravityFieldDeployableImage) {
|
||||
mass = 1;
|
||||
emap = true;
|
||||
shapeFile = "ammo_chaingun.dts";
|
||||
item = GravityFieldDeployable;
|
||||
mountPoint = 1;
|
||||
offset = "-0.2 -0.125 0";
|
||||
rotation = "0 -1 0 90";
|
||||
deployed = DeployedGravityField;
|
||||
heatSignature = 0;
|
||||
|
||||
stateName[0] = "Idle";
|
||||
stateTransitionOnTriggerDown[0] = "Activate";
|
||||
|
||||
stateName[1] = "Activate";
|
||||
stateScript[1] = "onActivate";
|
||||
stateTransitionOnTriggerUp[1] = "Idle";
|
||||
|
||||
maxDepSlope = 360;
|
||||
deploySound = ItemPickupSound;
|
||||
|
||||
minDeployDis = 0.1;
|
||||
maxDeployDis = 50.0;
|
||||
};
|
||||
|
||||
datablock ItemData(GravityFieldDeployable) {
|
||||
className = Pack;
|
||||
catagory = "Deployables";
|
||||
shapeFile = "stackable1s.dts";
|
||||
mass = 1;
|
||||
elasticity = 0.2;
|
||||
friction = 0.6;
|
||||
pickupRadius = 1;
|
||||
joint = "4.75 4.75 4.75";
|
||||
rotate = true;
|
||||
image = "GravityFieldDeployableImage";
|
||||
pickUpName = "a gravity field pack";
|
||||
heatSignature = 0;
|
||||
emap = true;
|
||||
};
|
||||
|
||||
function GravityFieldDeployableImage::testObjectTooClose(%item) {
|
||||
return;
|
||||
}
|
||||
|
||||
function GravityFieldDeployableImage::testNoTerrainFound(%item) {
|
||||
// don't check this for non-Landspike turret deployables
|
||||
}
|
||||
|
||||
function GravityFieldDeployable::onPickup(%this, %obj, %shape, %amount) {
|
||||
// created to prevent console errors
|
||||
}
|
||||
|
||||
function GravityFieldDeployableImage::onDeploy(%item, %plyr, %slot) {
|
||||
//Object
|
||||
%className = "ForceFieldBare";
|
||||
|
||||
%grounded = 0;
|
||||
if (%item.surface.getClassName() $= TerrainBlock)
|
||||
%grounded = 1;
|
||||
|
||||
%playerVector = vectorNormalize(-1 * getWord(%plyr.getEyeVector(),1) SPC getWord(%plyr.getEyeVector(),0) SPC "0");
|
||||
|
||||
if (%item.surfaceinher == 0) {
|
||||
if (vAbs(floorVec(%item.surfaceNrm,100)) $= "0 0 1")
|
||||
%item.surfaceNrm2 = %playerVector;
|
||||
else
|
||||
%item.surfaceNrm2 = vectorNormalize(vectorCross(%item.surfaceNrm,"0 0 1"));
|
||||
}
|
||||
|
||||
%rot = fullRot(%item.surfaceNrm,%item.surfaceNrm2);
|
||||
%scale = getWords($packSetting["gravfield",%plyr.packSet],0,2);
|
||||
|
||||
%space = rayDist(%item.surfacePt SPC %item.surfaceNrm,%scale);
|
||||
%scale = getWord(%scale,0) SPC getWord(%scale,0) SPC %space;
|
||||
|
||||
// Shift field position since field handle is not field center
|
||||
%mod = firstWord($packSetting["gravfield",%plyr.packSet]) / 2;
|
||||
%item.surfacePt = vectorSub(%item.surfacePt,vectorScale(vectorNormalize(%item.surfaceNrm2),%mod));
|
||||
%item.surfacePt = vectorSub(%item.surfacePt,vectorScale(vectorNormalize(vectorCross(%item.surfaceNrm,%item.surfaceNrm2)),%mod));
|
||||
|
||||
// Add padding
|
||||
%padSize = 0.01;
|
||||
%scale = vectorAdd(%scale,%padSize * 2 SPC %padSize * 2 SPC %padSize * 2);
|
||||
%item.surfacePt = vectorSub(%item.surfacePt,vectorScale(vectorNormalize(%item.surfaceNrm),%padSize));
|
||||
%item.surfacePt = vectorSub(%item.surfacePt,vectorScale(vectorNormalize(%item.surfaceNrm2),%padSize));
|
||||
%item.surfacePt = vectorSub(%item.surfacePt,vectorScale(vectorNormalize(vectorCross(%item.surfaceNrm,%item.surfaceNrm2)),%padSize));
|
||||
|
||||
// Set datablock
|
||||
if (%plyr.packSet == 0)
|
||||
%dataBlock = nameToID(%item.deployed @ 0);
|
||||
else if (%plyr.packSet == 1)
|
||||
%dataBlock = nameToID(%item.deployed @ 1);
|
||||
else if (%plyr.packSet == 2)
|
||||
%dataBlock = nameToID(%item.deployed @ 0);
|
||||
else if (%plyr.packSet == 3)
|
||||
%dataBlock = nameToID(%item.deployed @ 1);
|
||||
else if (%plyr.packSet == 4)
|
||||
%dataBlock = nameToID(%item.deployed @ 2);
|
||||
else if (%plyr.packSet == 5)
|
||||
%dataBlock = nameToID(%item.deployed @ 3);
|
||||
else if (%plyr.packSet == 6)
|
||||
%dataBlock = nameToID(%item.deployed @ 4);
|
||||
|
||||
%appliedForceVec = vectorNormalize(%item.surfaceNrm);
|
||||
|
||||
if ($Host::ExpertMode == 1) {
|
||||
if (isCubic(%item.surface) && (%plyr.expertSet == 1 || %plyr.expertSet == 2) && %plyr.team == %item.surface.team
|
||||
&& %item.surface.getType() & $TypeMasks::StaticShapeObjectType
|
||||
&& (($Host::OnlyOwnerCubicReplace == 0) || (%plyr.client == %item.surface.getOwner()))) {
|
||||
if (%plyr.expertSet == 2)
|
||||
%appliedForceVec = vectorNormalize(realVec(%item.surface,"0 0 1"));
|
||||
%scale = vectorAdd(realSize(%item.surface),%padSize * 2 SPC %padSize * 2 SPC %padSize * 2);
|
||||
%center = realVec(%item.surface,vectorScale(getWords(%scale,0,1) SPC "0",-0.5));
|
||||
%item.surfacePt = vectorAdd(pos(%item.surface),%center);
|
||||
%rot = rot(%item.surface);
|
||||
%mod = vectorScale(matrixMulVector("0 0 0" SPC %rot ,"0 0 1"),-%padSize);
|
||||
%item.surfacePt = vectorAdd(%item.surfacePt,%mod);
|
||||
%item.surface.getDataBlock().disassemble(%plyr, %item.surface);
|
||||
}
|
||||
}
|
||||
|
||||
%velocityMod = %dataBlock.velocityMod;
|
||||
%gravityMod = %dataBlock.gravityMod;
|
||||
%appliedForce = %dataBlock.appliedForce;
|
||||
|
||||
%slowForce = 500;
|
||||
%fastForce = 1000;
|
||||
|
||||
if (%plyr.packSet == 0)
|
||||
%appliedForce = vectorScale(%appliedForceVec,%slowForce);
|
||||
else if (%plyr.packSet == 1)
|
||||
%appliedForce = vectorScale(%appliedForceVec,%fastForce);
|
||||
else if (%plyr.packSet == 2)
|
||||
%appliedForce = vectorScale(%appliedForceVec,-%slowForce);
|
||||
else if (%plyr.packSet == 3)
|
||||
%appliedForce = vectorScale(%appliedForceVec,-%fastForce);
|
||||
|
||||
%deplObj = new (%className)() {
|
||||
dataBlock = %dataBlock;
|
||||
scale = %scale;
|
||||
velocityMod = %velocityMod;
|
||||
gravityMod = %gravityMod;
|
||||
appliedForce = %appliedForce;
|
||||
};
|
||||
|
||||
// Take the deployable off the player's back and out of inventory
|
||||
if ($Host::ExpertMode == 0) {
|
||||
%plyr.unMountImage(%slot);
|
||||
%plyr.decInventory(%item.item,1);
|
||||
}
|
||||
|
||||
////////////////////////Apply settings//////////////////////////////
|
||||
|
||||
// [[Location]]:
|
||||
|
||||
// exact:
|
||||
%deplObj.setTransform(%item.surfacePt SPC %rot);
|
||||
%deplObj.pzone.setTransform(%item.surfacePt SPC %rot);
|
||||
|
||||
// misc info
|
||||
addDSurface(%item.surface,%deplObj);
|
||||
|
||||
// [[Settings]]:
|
||||
|
||||
%deplObj.grounded = %grounded;
|
||||
%deplObj.needsFit = 1;
|
||||
|
||||
// [[Normal Stuff]]:
|
||||
|
||||
// set team, owner, and handle
|
||||
%deplObj.team = %plyr.client.team;
|
||||
%deplObj.setOwner(%plyr);
|
||||
|
||||
// set power frequency
|
||||
%deplObj.powerFreq = %plyr.powerFreq;
|
||||
|
||||
// set the sensor group if it needs one
|
||||
if (%deplObj.getTarget() != -1)
|
||||
setTargetSensorGroup(%deplObj.getTarget(), %plyr.client.team);
|
||||
|
||||
// place the deployable in the MissionCleanup/Deployables group (AI reasons)
|
||||
addToDeployGroup(%deplObj);
|
||||
|
||||
//let the AI know as well...
|
||||
AIDeployObject(%plyr.client, %deplObj);
|
||||
|
||||
// play the deploy sound
|
||||
serverPlay3D(%item.deploySound, %deplObj.getTransform());
|
||||
|
||||
// increment the team count for this deployed object
|
||||
$TeamDeployedCount[%plyr.team, %item.item]++;
|
||||
|
||||
// Power object
|
||||
checkPowerObject(%deplObj);
|
||||
|
||||
if (!%deplObj.powerCount > 0) {
|
||||
%deplObj.getDataBlock().disassemble(0,%deplObj); // Run Item Specific code.
|
||||
messageClient(%plyr.client,'MsgDeployFailed','\c2Gravity field lost - no power source found!%1','~wfx/misc/misc.error.wav');
|
||||
}
|
||||
|
||||
return %deplObj;
|
||||
}
|
||||
|
||||
/////////////////////////////////////
|
||||
|
||||
function GravityFieldDeployableImage::onMount(%data, %obj, %node) {
|
||||
%obj.hasGravField = true; // set for gravfieldcheck
|
||||
%obj.packSet = 0;
|
||||
%obj.expertSet = 0;
|
||||
displayPowerFreq(%obj);
|
||||
}
|
||||
|
||||
function GravityFieldDeployableImage::onUnmount(%data, %obj, %node) {
|
||||
%obj.hasGravField = "";
|
||||
%obj.packSet = 0;
|
||||
%obj.expertSet = 0;
|
||||
}
|
||||
|
||||
function DeployedGravityField::disassemble(%data,%plyr,%obj) {
|
||||
if (isObject(%obj.pzone))
|
||||
%obj.pzone.delete();
|
||||
disassemble(%data,%plyr,%obj);
|
||||
}
|
||||
|
||||
function DeployedGravityField0::disassemble(%data,%plyr,%obj) {
|
||||
DeployedGravityField::disassemble(%data,%plyr,%obj);
|
||||
}
|
||||
|
||||
function DeployedGravityField1::disassemble(%data,%plyr,%obj) {
|
||||
DeployedGravityField::disassemble(%data,%plyr,%obj);
|
||||
}
|
||||
|
||||
function DeployedGravityField2::disassemble(%data,%plyr,%obj) {
|
||||
DeployedGravityField::disassemble(%data,%plyr,%obj);
|
||||
}
|
||||
|
||||
function DeployedGravityField3::disassemble(%data,%plyr,%obj) {
|
||||
DeployedGravityField::disassemble(%data,%plyr,%obj);
|
||||
}
|
||||
|
||||
function DeployedGravityField4::disassemble(%data,%plyr,%obj) {
|
||||
DeployedGravityField::disassemble(%data,%plyr,%obj);
|
||||
}
|
||||
176
scripts/packs/jumpad.cs
Normal file
176
scripts/packs/jumpad.cs
Normal file
|
|
@ -0,0 +1,176 @@
|
|||
//--------------------------------------------------------------------------
|
||||
// Jumpad
|
||||
//--------------------------------------------------------------------------
|
||||
|
||||
datablock StaticShapeData(DeployedJumpad) : StaticShapeDamageProfile {
|
||||
className = "jumpad";
|
||||
shapeFile = "nexusbase.dts"; // dmiscf.dts, alternate
|
||||
maxDamage = 2.0;
|
||||
destroyedLevel = 2.0;
|
||||
disabledLevel = 2.0;
|
||||
mass = 1;
|
||||
elasticity = 0.1;
|
||||
friction = 0.9;
|
||||
collideable = 1;
|
||||
pickupRadius = 1;
|
||||
sticky=false;
|
||||
|
||||
impulse = 5000;
|
||||
|
||||
hasLight = true;
|
||||
lightType = "PulsingLight";
|
||||
lightColor = "0.1 0.8 0.8 1.0";
|
||||
lightTime = "100";
|
||||
lightRadius = "3";
|
||||
|
||||
explosion = HandGrenadeExplosion;
|
||||
expDmgRadius = 3.0;
|
||||
expDamage = 0.1;
|
||||
expImpulse = 200.0;
|
||||
dynamicType = $TypeMasks::StaticShapeObjectType;
|
||||
deployedObject = true;
|
||||
cmdCategory = "DSupport";
|
||||
cmdIcon = CMDSensorIcon;
|
||||
cmdMiniIconName = "commander/MiniIcons/com_deploymotionsensor";
|
||||
|
||||
targetNameTag = 'Jump';
|
||||
targetTypeTag = 'Pad';
|
||||
deployAmbientThread = true;
|
||||
debrisShapeName = "debris_generic_small.dts";
|
||||
debris = DeployableDebris;
|
||||
heatSignature = 0;
|
||||
};
|
||||
|
||||
datablock ShapeBaseImageData(JumpadDeployableImage) {
|
||||
mass = 1;
|
||||
emap = true;
|
||||
shapeFile = "stackable1s.dts";
|
||||
item = JumpadDeployable;
|
||||
mountPoint = 1;
|
||||
offset = "0 0 0";
|
||||
deployed = DeployedJumpad;
|
||||
heatSignature = 0;
|
||||
collideable = 1;
|
||||
stateName[0] = "Idle";
|
||||
stateTransitionOnTriggerDown[0] = "Activate";
|
||||
|
||||
stateName[1] = "Activate";
|
||||
stateScript[1] = "onActivate";
|
||||
stateTransitionOnTriggerUp[1] = "Idle";
|
||||
|
||||
isLarge = true;
|
||||
maxDepSlope = 360; // 30
|
||||
deploySound = ItemPickupSound;
|
||||
|
||||
minDeployDis = 0.5;
|
||||
maxDeployDis = 5.0;
|
||||
};
|
||||
|
||||
datablock ItemData(JumpadDeployable) {
|
||||
className = Pack;
|
||||
catagory = "Deployables";
|
||||
shapeFile = "stackable1s.dts";
|
||||
mass = 1;
|
||||
elasticity = 0.2;
|
||||
friction = 0.6;
|
||||
pickupRadius = 1;
|
||||
rotate = true;
|
||||
image = "JumpadDeployableImage";
|
||||
pickUpName = "a jump pad pack";
|
||||
heatSignature = 0;
|
||||
emap = true;
|
||||
};
|
||||
|
||||
function JumpadDeployable::onPickup(%this, %obj, %shape, %amount) {
|
||||
// created to prevent console errors
|
||||
}
|
||||
|
||||
function JumpadDeployableImage::onDeploy(%item, %plyr, %slot) {
|
||||
%className = "StaticShape";
|
||||
|
||||
%playerVector = vectorNormalize(-1 * getWord(%plyr.getEyeVector(),1) SPC getWord(%plyr.getEyeVector(),0) SPC "0");
|
||||
|
||||
if (vAbs(floorVec(%item.surfaceNrm,100)) $= "0 0 1")
|
||||
%item.surfaceNrm2 = %playerVector;
|
||||
else
|
||||
%item.surfaceNrm2 = vectorNormalize(vectorCross(%item.surfaceNrm,"0 0 -1"));
|
||||
|
||||
%impulse = firstWord($packSetting["jumpad",%plyr.packSet]);
|
||||
|
||||
%deplObj = new (%className)() {
|
||||
dataBlock = %item.deployed;
|
||||
scale = "1 1 2";
|
||||
};
|
||||
|
||||
// set impulse (jump pad strength)
|
||||
%deplObj.impulse = %impulse;
|
||||
|
||||
// set orientation
|
||||
%deplObj.setDeployRotation(getWords(%item.surfacePt, 0, 1) SPC getWord(%item.surfacePt, 2) + 0.1, %item.surfaceNrm);
|
||||
|
||||
// set the recharge rate right away
|
||||
if (%deplObj.getDatablock().rechargeRate)
|
||||
%deplObj.setRechargeRate(%deplObj.getDatablock().rechargeRate);
|
||||
|
||||
// set team, owner, and handle
|
||||
%deplObj.team = %plyr.client.Team;
|
||||
%deplObj.setOwner(%plyr);
|
||||
|
||||
// place the deployable in the MissionCleanup/Deployables group (AI reasons)
|
||||
addToDeployGroup(%deplObj);
|
||||
|
||||
//let the AI know as well...
|
||||
AIDeployObject(%plyr.client, %deplObj);
|
||||
|
||||
// play the deploy sound
|
||||
serverPlay3D(%item.deploySound, %deplObj.getTransform());
|
||||
|
||||
// increment the team count for this deployed object
|
||||
|
||||
// take the deployable off the player's back and out of inventory
|
||||
%plyr.unmountImage(%slot);
|
||||
%plyr.decInventory(%item.item, 1);
|
||||
|
||||
$TeamDeployedCount[%plyr.team, %item.item]++;
|
||||
|
||||
addDSurface(%item.surface,%deplObj);
|
||||
return %deplObj;
|
||||
}
|
||||
|
||||
function DeployedJumpad::onCollision(%data,%obj,%col) {
|
||||
// TODO - update escape pod
|
||||
if (%col.getClassName() !$= "Player" && %col.getDataBlock().getName() !$= "EscapePodVehicle")
|
||||
return; // Only boost players
|
||||
if (%obj.team == %col.team) {
|
||||
%vel = %col.getVelocity();
|
||||
%vec = realVec(%obj,"0 0 1");
|
||||
%position = getWords(%col.getTransform(), 0, 2);
|
||||
// %impulseVec = vectorScale(%vec,1000); // Jump clear of the pad
|
||||
// %col.applyImpulse(%position, %impulseVec);
|
||||
%col.playAudio(0, MortarFireSound);
|
||||
%impulseVec = vectorScale(%vec,%obj.impulse);
|
||||
// %col.schedule(50, "applyImpulse", %position, %impulseVec);
|
||||
%col.applyImpulse(%position, %impulseVec);
|
||||
}
|
||||
}
|
||||
|
||||
function DeployedJumpad::onDestroyed(%this, %obj, %prevState) {
|
||||
if (%obj.isRemoved)
|
||||
return;
|
||||
%obj.isRemoved = true;
|
||||
Parent::onDestroyed(%this, %obj, %prevState);
|
||||
$TeamDeployedCount[%obj.team, JumpadDeployable]--;
|
||||
remDSurface(%obj);
|
||||
%obj.schedule(500, "delete");
|
||||
fireBallExplode(%obj,1);
|
||||
}
|
||||
|
||||
function JumpadDeployableImage::onMount(%data, %obj, %node) {
|
||||
%obj.hasJumpad = true; // set for jumpadcheck
|
||||
%obj.packSet = 0;
|
||||
}
|
||||
|
||||
function JumpadDeployableImage::onUnmount(%data, %obj, %node) {
|
||||
%obj.hasJumpad = "";
|
||||
%obj.packSet = 0;
|
||||
}
|
||||
123
scripts/packs/largeInventory.cs
Normal file
123
scripts/packs/largeInventory.cs
Normal file
|
|
@ -0,0 +1,123 @@
|
|||
//--------------------------------------------------------------------------
|
||||
// Large Inventory Station
|
||||
//
|
||||
//
|
||||
//--------------------------------------------------------------------------
|
||||
|
||||
datablock ShapeBaseImageData(LargeInventoryDeployableImage) {
|
||||
mass = 1;
|
||||
emap = true;
|
||||
shapeFile = "stackable1s.dts";
|
||||
item = LargeInventoryDeployable;
|
||||
mountPoint = 1;
|
||||
offset = "0 0 0";
|
||||
deployed = StationInventory;
|
||||
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 = 5.0;
|
||||
};
|
||||
|
||||
datablock ItemData(LargeInventoryDeployable)
|
||||
{
|
||||
className = Pack;
|
||||
catagory = "Deployables";
|
||||
shapeFile = "stackable1s.dts";
|
||||
mass = 1;
|
||||
elasticity = 0.2;
|
||||
friction = 0.6;
|
||||
pickupRadius = 1;
|
||||
rotate = true;
|
||||
image = "LargeInventoryDeployableImage";
|
||||
joint = "4.5 4.5 4.5";
|
||||
pickUpName = "a large inventory station pack";
|
||||
heatSignature = 0;
|
||||
emap = true;
|
||||
};
|
||||
|
||||
function LargeInventoryDeployable::onPickup(%this, %obj, %shape, %amount)
|
||||
{
|
||||
// created to prevent console errors
|
||||
}
|
||||
|
||||
function LargeInventoryDeployableImage::onDeploy(%item, %plyr, %slot) {
|
||||
%className = "StaticShape";
|
||||
%plyr.unMountImage(%slot);
|
||||
%plyr.decInventory(%item.item,1);
|
||||
%grounded = 0;
|
||||
if (%item.surface.getClassName() $= TerrainBlock)
|
||||
%grounded = 1;
|
||||
|
||||
%playerVector = vectorNormalize(-1 * getWord(%plyr.getEyeVector(),1) SPC getWord(%plyr.getEyeVector(),0) SPC "0");
|
||||
|
||||
if (vAbs(floorVec(%item.surfaceNrm,100)) $= "0 0 1")
|
||||
%item.surfaceNrm2 = vectorScale(%playerVector,-1);
|
||||
else
|
||||
%item.surfaceNrm2 = vectorNormalize(vectorCross(%item.surfaceNrm,"0 0 1"));
|
||||
|
||||
%rot = fullRot(%item.surfaceNrm,%item.surfaceNrm2);
|
||||
|
||||
%deplObj = new (%className)() //Inventory Station
|
||||
{
|
||||
dataBlock = StationInventory;
|
||||
position = %surfacePt;
|
||||
rotation = %rot;
|
||||
deployed = true;
|
||||
};
|
||||
%deplObj.setTransform(%item.surfacePt SPC %rot);
|
||||
|
||||
%deplObj.team = %plyr.client.Team;
|
||||
%deplObj.setOwner(%plyr);
|
||||
addDSurface(%item.surface,%deplObj);
|
||||
|
||||
// set power frequency
|
||||
%deplObj.powerFreq = %plyr.powerFreq;
|
||||
|
||||
if(%deplObj.getTarget() != -1)
|
||||
setTargetSensorGroup(%deplObj.getTarget(), %plyr.client.team);
|
||||
|
||||
// place the deployable in the MissionCleanup/Deployables group (AI reasons)
|
||||
|
||||
addToDeployGroup(%deplObj);
|
||||
|
||||
//let the AI know as well...
|
||||
|
||||
AIDeployObject(%plyr.client, %deplObj);
|
||||
|
||||
// play the deploy sound
|
||||
serverPlay3D(%item.deploySound, %deplObj.getTransform());
|
||||
|
||||
// increment the team count for this deployed object
|
||||
|
||||
$TeamDeployedCount[%plyr.team, %item.item]++;
|
||||
|
||||
%deplObj.deploy();
|
||||
|
||||
// Adjust the trigger object
|
||||
adjustTrigger(%deplObj);
|
||||
|
||||
// Power object
|
||||
checkPowerObject(%deplObj);
|
||||
|
||||
return %deplObj;
|
||||
}
|
||||
|
||||
function LargeInventoryDeployableImage::testNoTerrainFound(%item)
|
||||
{
|
||||
//return %item.surface.getClassName() !$= TerrainBlock;
|
||||
}
|
||||
|
||||
function LargeInventoryDeployableImage::onMount(%data, %obj, %node) {
|
||||
displayPowerFreq(%obj);
|
||||
}
|
||||
127
scripts/packs/largeSensor.cs
Normal file
127
scripts/packs/largeSensor.cs
Normal file
|
|
@ -0,0 +1,127 @@
|
|||
//--------------------------------------------------------------------------
|
||||
// Large Pulse Sensor
|
||||
//--------------------------------------------------------------------------
|
||||
|
||||
datablock ShapeBaseImageData(LargeSensorDeployableImage) {
|
||||
mass = 1;
|
||||
emap = true;
|
||||
shapeFile = "stackable1s.dts";
|
||||
item = LargeSensorDeployable;
|
||||
mountPoint = 1;
|
||||
offset = "0 0 0";
|
||||
deployed = SensorLargePulse;
|
||||
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 = 5.0;
|
||||
};
|
||||
|
||||
datablock ItemData(LargeSensorDeployable) {
|
||||
className = Pack;
|
||||
catagory = "Deployables";
|
||||
shapeFile = "stackable1s.dts";
|
||||
mass = 1;
|
||||
elasticity = 0.2;
|
||||
friction = 0.6;
|
||||
pickupRadius = 1;
|
||||
rotate = true;
|
||||
image = "LargeSensorDeployableImage";
|
||||
joint = "4.5 4.5 4.5";
|
||||
pickUpName = "a large pulse sensor pack";
|
||||
heatSignature = 0;
|
||||
emap = true;
|
||||
};
|
||||
|
||||
function LargeSensorDeployable::onPickup(%this, %obj, %shape, %amount) {
|
||||
// created to prevent console errors
|
||||
}
|
||||
|
||||
function LargeSensorDeployableImage::testNoTerrainFound(%item) {
|
||||
// don't check this for non-Landspike turret deployables
|
||||
}
|
||||
|
||||
function LargeSensorDeployableImage::onDeploy(%item, %plyr, %slot) {
|
||||
%className = "StaticShape";
|
||||
|
||||
%playerVector = vectorNormalize(getWord(%plyr.getEyeVector(),1) SPC -1 * getWord(%plyr.getEyeVector(),0) SPC "0");
|
||||
%item.surfaceNrm2 = %playerVector;
|
||||
|
||||
if (vAbs(floorVec(%item.surfaceNrm,100)) $= "0 0 1")
|
||||
%item.surfaceNrm2 = %playerVector;
|
||||
else
|
||||
%item.surfaceNrm2 = vectorNormalize(vectorCross(%item.surfaceNrm,"0 0 -1"));
|
||||
|
||||
%rot = fullRot(%item.surfaceNrm,%item.surfaceNrm2);
|
||||
|
||||
%deplObj = new (%className)() {
|
||||
dataBlock = SensorLargePulse;
|
||||
deployed = true;
|
||||
};
|
||||
|
||||
// set orientation
|
||||
%deplObj.setTransform(%item.surfacePt SPC %rot);
|
||||
|
||||
// set team, owner, and handle
|
||||
%deplObj.team = %plyr.client.Team;
|
||||
%deplObj.setOwner(%plyr);
|
||||
|
||||
// set power frequency
|
||||
%deplObj.powerFreq = %plyr.powerFreq;
|
||||
// setTargetName(%deplObj.target,addTaggedString("Frequency" SPC %deplObj.powerFreq));
|
||||
|
||||
// set the sensor group if it needs one
|
||||
if (%deplObj.getTarget() != -1)
|
||||
setTargetSensorGroup(%deplObj.getTarget(), %plyr.client.team);
|
||||
|
||||
// place the deployable in the MissionCleanup/Deployables group (AI reasons)
|
||||
addToDeployGroup(%deplObj);
|
||||
|
||||
//let the AI know as well...
|
||||
AIDeployObject(%plyr.client, %deplObj);
|
||||
|
||||
// play the deploy sound
|
||||
serverPlay3D(%item.deploySound, %deplObj.getTransform());
|
||||
|
||||
// increment the team count for this deployed object
|
||||
$TeamDeployedCount[%plyr.team, %item.item]++;
|
||||
|
||||
addDSurface(%item.surface,%deplObj);
|
||||
|
||||
// %deplObj.playThread($PowerThread,"Power");
|
||||
|
||||
// take the deployable off the player's back and out of inventory
|
||||
%plyr.unmountImage(%slot);
|
||||
%plyr.decInventory(%item.item, 1);
|
||||
|
||||
// Power object
|
||||
checkPowerObject(%deplObj);
|
||||
|
||||
return %deplObj;
|
||||
}
|
||||
|
||||
function SensorLargePulse::onDestroyed(%data,%obj,%prevState) {
|
||||
if (%obj.isRemoved)
|
||||
return;
|
||||
if (%obj.deployed) {
|
||||
%obj.isRemoved = true;
|
||||
$TeamDeployedCount[%obj.team,LargeSensorDeployable]--;
|
||||
remDSurface(%obj);
|
||||
%obj.schedule(500,"delete");
|
||||
}
|
||||
Parent::onDestroyed(%data,%obj,%prevState);
|
||||
}
|
||||
|
||||
function LargeSensorDeployableImage::onMount(%data, %obj, %node) {
|
||||
displayPowerFreq(%obj);
|
||||
}
|
||||
193
scripts/packs/laserturret.cs
Normal file
193
scripts/packs/laserturret.cs
Normal file
|
|
@ -0,0 +1,193 @@
|
|||
//--------------------------------------------------------------------------
|
||||
// Datablocks
|
||||
//--------------------------------------
|
||||
|
||||
datablock SensorData(LaserTurretSensor) {
|
||||
detects = true;
|
||||
detectsUsingLOS = true;
|
||||
detectsPassiveJammed = false;
|
||||
detectsActiveJammed = false;
|
||||
detectsCloaked = false;
|
||||
detectionPings = true;
|
||||
detectRadius = 100;
|
||||
};
|
||||
|
||||
datablock TurretData(LaserDeployed) : TurretDamageProfile {
|
||||
className = DeployedTurret;
|
||||
shapeFile = "camera.dts";
|
||||
mass = 1;
|
||||
maxDamage = 0.5;
|
||||
destroyedLevel = 0.5;
|
||||
disabledLevel = 0.21;
|
||||
explosion = SmallTurretExplosion;
|
||||
expDmgRadius = 5.0;
|
||||
expDamage = 0.25;
|
||||
expImpulse = 500.0;
|
||||
repairRate = 0;
|
||||
heatSignature = 0.0;
|
||||
deployedObject = true;
|
||||
thetaMin = 5;
|
||||
thetaMax = 145;
|
||||
thetaNull = 90;
|
||||
primaryAxis = zaxis;
|
||||
isShielded = true;
|
||||
energyPerDamagePoint = 30;
|
||||
maxEnergy = 100;
|
||||
rechargeRate = 0.15;
|
||||
barrel = DeployableLaserBarrel;
|
||||
canControl = true;
|
||||
cmdCategory = "DTactical";
|
||||
cmdIcon = CMDTurretIcon;
|
||||
cmdMiniIconName = "commander/MiniIcons/com_turret_grey";
|
||||
targetNameTag = 'Laser';
|
||||
targetTypeTag = 'Turret';
|
||||
sensorData = LaserTurretSensor;
|
||||
sensorRadius = LaserTurretSensor.detectRadius;
|
||||
sensorColor = "191 0 226";
|
||||
firstPersonOnly = true;
|
||||
renderWhenDestroyed = true;
|
||||
debrisShapeName = "debris_generic_small.dts";
|
||||
debris = TurretDebrisSmall;
|
||||
};
|
||||
|
||||
datablock TurretImageData(DeployableLaserBarrel) {
|
||||
shapeFile = "turret_muzzlepoint.dts";
|
||||
item = LaserTurretBarrel;
|
||||
//rotation = "0 0 0 0";
|
||||
offset = "0 0 0";
|
||||
projectile = NerfBolt;
|
||||
//projectileType = TargetProjectile;
|
||||
projectileType = LinearFlareProjectile;
|
||||
usesEnergy = true;
|
||||
fireEnergy = 2;
|
||||
minEnergy = 8;
|
||||
lightType = "WeaponFireLight";
|
||||
lightColor = "0.25 0.15 0.15 1.0";
|
||||
lightTime = "1000";
|
||||
lightRadius = "2";
|
||||
muzzleFlash = IndoorTurretMuzzleFlash;
|
||||
//deleteLastProjectile = true;
|
||||
// Turret parameters
|
||||
activationMS = 150;
|
||||
deactivateDelayMS = 300;
|
||||
thinkTimeMS = 150;
|
||||
degPerSecTheta = 580;
|
||||
degPerSecPhi = 960;
|
||||
attackRadius = 100;
|
||||
|
||||
// State transitions
|
||||
stateName[0] = "Activate";
|
||||
stateTransitionOnNotLoaded[0] = "Dead";
|
||||
stateTransitionOnLoaded[0] = "ActivateReady";
|
||||
|
||||
stateName[1] = "ActivateReady";
|
||||
stateSequence[1] = "Activate";
|
||||
stateSound[1] = IBLSwitchSound;
|
||||
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.1;
|
||||
stateFire[3] = true;
|
||||
stateShockwave[3] = true;
|
||||
stateRecoil[3] = LightRecoil;
|
||||
stateAllowImageChange[3] = false;
|
||||
stateSequence[3] = "Fire";
|
||||
stateSound[3] = IBLFireSound;
|
||||
stateScript[3] = "onFire";
|
||||
|
||||
stateName[4] ="Reload";
|
||||
stateTimeoutValue[4] = 0.05;
|
||||
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] = 0.1;
|
||||
stateTransitionOnLoaded[5] = "ActivateReady";
|
||||
stateTransitionOnTimeout[5] = "Dead";
|
||||
|
||||
stateName[6] = "Dead";
|
||||
stateTransitionOnLoaded[6] = "ActivateReady";
|
||||
|
||||
stateName[7] = "NoAmmo";
|
||||
stateTransitionOnAmmo[7] = "Reload";
|
||||
stateSequence[7] = "NoAmmo";
|
||||
};
|
||||
|
||||
datablock ShapeBaseImageData(TurretLaserDeployableImage) {
|
||||
mass = 1;
|
||||
shapeFile = "pack_deploy_turreti.dts";
|
||||
item = TurretLaserDeployable;
|
||||
mountPoint = 1;
|
||||
offset = "0 0 0";
|
||||
deployed = LaserDeployed;
|
||||
stateName[0] = "Idle";
|
||||
stateTransitionOnTriggerDown[0] = "Activate";
|
||||
|
||||
stateName[1] = "Activate";
|
||||
stateScript[1] = "onActivate";
|
||||
stateTransitionOnTriggerUp[1] = "Idle";
|
||||
|
||||
isLarge = true;
|
||||
emap = true;
|
||||
maxDepSlope = 360;
|
||||
deploySound = TurretDeploySound;
|
||||
minDeployDis = 0.5;
|
||||
maxDeployDis = 5.0;
|
||||
};
|
||||
|
||||
datablock ItemData(TurretLaserDeployable) {
|
||||
className = Pack;
|
||||
catagory = "Deployables";
|
||||
shapeFile = "pack_deploy_turreti.dts";
|
||||
mass = 1;
|
||||
elasticity = 0.2;
|
||||
friction = 0.6;
|
||||
pickupRadius = 1;
|
||||
rotate = false;
|
||||
image = TurretLaserDeployableImage;
|
||||
pickUpName = "a laser turret pack";
|
||||
emap = true;
|
||||
};
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
// Functions
|
||||
//--------------------------------------
|
||||
|
||||
function TurretLaserDeployableImage::TestNoTerrainFound(%item) {
|
||||
// created to prevent console errors
|
||||
}
|
||||
|
||||
function TurretLaserDeployableImage::TestNoInteriorFound(%item) {
|
||||
// created to prevent console errors
|
||||
}
|
||||
|
||||
function TurretLaserDeployable::onPickup(%this, %obj, %shape, %amount) {
|
||||
//created to prevent console errors
|
||||
}
|
||||
|
||||
function LaserDeployed::onDestroyed(%this, %obj, %prevState) {
|
||||
if (%obj.isRemoved)
|
||||
return;
|
||||
if ($Host::InvincibleDeployables != 1 || %obj.damageFailedDecon) {
|
||||
%obj.isRemoved = true;
|
||||
$TeamDeployedCount[%obj.team, TurretLaserDeployable]--;
|
||||
remDSurface(%obj);
|
||||
%obj.schedule(500, delete);
|
||||
}
|
||||
Parent::onDestroyed(%this, %obj, %prevState);
|
||||
|
||||
}
|
||||
273
scripts/packs/lightpack.cs
Normal file
273
scripts/packs/lightpack.cs
Normal file
|
|
@ -0,0 +1,273 @@
|
|||
//---------------------------------------------------------
|
||||
// Deployable Light
|
||||
//---------------------------------------------------------
|
||||
|
||||
%colourOn = 0.5;
|
||||
%colourOff = 0.1;
|
||||
|
||||
%strobeColourOn = 1.0;
|
||||
%strobeColourOff = 0.0;
|
||||
|
||||
datablock StaticShapeData(DeployedLightBase) : StaticShapeDamageProfile {
|
||||
className = "lightbase";
|
||||
shapeFile = "pack_deploy_sensor_motion.dts";
|
||||
|
||||
maxDamage = 0.5;
|
||||
destroyedLevel = 0.5;
|
||||
disabledLevel = 0.3;
|
||||
|
||||
maxEnergy = 50;
|
||||
rechargeRate = 0.25;
|
||||
|
||||
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 Light';
|
||||
deployAmbientThread = true;
|
||||
debrisShapeName = "debris_generic_small.dts";
|
||||
debris = DeployableDebris;
|
||||
heatSignature = 0;
|
||||
};
|
||||
|
||||
datablock ItemData(DeployedLight) {
|
||||
shapeFile = "turret_muzzlepoint.dts";
|
||||
hasLight = true;
|
||||
lightType = "ConstantLight";
|
||||
lightColor = "1.0 1.0 1.0 1.0";
|
||||
lightTime = "1000";
|
||||
lightRadius = "15";
|
||||
};
|
||||
|
||||
// Constant
|
||||
|
||||
datablock ItemData(DeployedLight0) : DeployedLight {
|
||||
lightColor = %colourOn SPC %colourOn SPC %colourOn;
|
||||
};
|
||||
|
||||
datablock ItemData(DeployedLight1) : DeployedLight {
|
||||
lightColor = %colourOn SPC %colourOff SPC %colourOff;
|
||||
};
|
||||
|
||||
datablock ItemData(DeployedLight2) : DeployedLight {
|
||||
lightColor = %colourOff SPC %colourOn SPC %colourOff;
|
||||
};
|
||||
|
||||
datablock ItemData(DeployedLight3) : DeployedLight {
|
||||
lightColor = %colourOff SPC %colourOff SPC %colourOn;
|
||||
};
|
||||
|
||||
datablock ItemData(DeployedLight4) : DeployedLight {
|
||||
lightColor = %colourOff SPC %colourOn SPC %colourOn;
|
||||
};
|
||||
|
||||
datablock ItemData(DeployedLight5) : DeployedLight {
|
||||
lightColor = %colourOn SPC %colourOff SPC %colourOn;
|
||||
};
|
||||
|
||||
datablock ItemData(DeployedLight6) : DeployedLight {
|
||||
lightColor = %colourOn SPC %colourOn SPC %colourOff;
|
||||
};
|
||||
|
||||
// Strobe
|
||||
|
||||
datablock ItemData(DeployedLight7) : DeployedLight {
|
||||
lightColor = %strobeColourOn SPC %strobeColourOn SPC %strobeColourOn;
|
||||
lightType = "PulsingLight";
|
||||
lightTime = "50";
|
||||
lightRadius = "10";
|
||||
};
|
||||
|
||||
datablock ItemData(DeployedLight8) : DeployedLight {
|
||||
lightType = "PulsingLight";
|
||||
lightColor = %strobeColourOn SPC %strobeColourOff SPC %strobeColourOff;
|
||||
lightTime = "50";
|
||||
lightRadius = "10";
|
||||
};
|
||||
|
||||
datablock ItemData(DeployedLight9) : DeployedLight {
|
||||
lightType = "PulsingLight";
|
||||
lightColor = %strobeColourOff SPC %strobeColourOn SPC %strobeColourOff;
|
||||
lightTime = "50";
|
||||
lightRadius = "10";
|
||||
};
|
||||
|
||||
datablock ItemData(DeployedLight10) : DeployedLight {
|
||||
lightType = "PulsingLight";
|
||||
lightColor = %strobeColourOff SPC %strobeColourOff SPC %strobeColourOn;
|
||||
lightTime = "50";
|
||||
lightRadius = "10";
|
||||
};
|
||||
|
||||
datablock ItemData(DeployedLight11) : DeployedLight {
|
||||
lightType = "PulsingLight";
|
||||
lightColor = %strobeColourOff SPC %strobeColourOn SPC %strobeColourOn;
|
||||
lightTime = "50";
|
||||
lightRadius = "10";
|
||||
};
|
||||
|
||||
datablock ItemData(DeployedLight12) : DeployedLight {
|
||||
lightType = "PulsingLight";
|
||||
lightColor = %strobeColourOn SPC %strobeColourOff SPC %strobeColourOn;
|
||||
lightTime = "50";
|
||||
lightRadius = "10";
|
||||
};
|
||||
|
||||
datablock ItemData(DeployedLight13) : DeployedLight {
|
||||
lightType = "PulsingLight";
|
||||
lightColor = %strobeColourOn SPC %strobeColourOn SPC %strobeColourOff;
|
||||
lightTime = "50";
|
||||
lightRadius = "10";
|
||||
};
|
||||
|
||||
datablock ShapeBaseImageData(LightDeployableImage) {
|
||||
mass = 1;
|
||||
emap = true;
|
||||
shapeFile = "stackable1s.dts";
|
||||
item = LightDeployable;
|
||||
mountPoint = 1;
|
||||
offset = "0 0 0";
|
||||
deployed = DeployedLightBase;
|
||||
heatSignature = 0;
|
||||
|
||||
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(LightDeployable) {
|
||||
className = Pack;
|
||||
catagory = "Deployables";
|
||||
shapeFile = "stackable1s.dts";
|
||||
mass = 1;
|
||||
elasticity = 0.2;
|
||||
friction = 0.6;
|
||||
pickupRadius = 1;
|
||||
rotate = true;
|
||||
image = "LightDeployableImage";
|
||||
pickUpName = "a light pack";
|
||||
heatSignature = 0;
|
||||
emap = true;
|
||||
};
|
||||
|
||||
function LightDeployableImage::testObjectTooClose(%item) {
|
||||
return "";
|
||||
}
|
||||
|
||||
function LightDeployableImage::testNoTerrainFound(%item) {
|
||||
// don't check this for non-Landspike turret deployables
|
||||
}
|
||||
|
||||
function LightDeployable::onPickup(%this, %obj, %shape, %amount) {
|
||||
// created to prevent console errors
|
||||
}
|
||||
|
||||
function LightDeployableImage::onDeploy(%item, %plyr, %slot) {
|
||||
%className = "StaticShape";
|
||||
|
||||
%playerVector = vectorNormalize(-1 * getWord(%plyr.getEyeVector(),1) SPC getWord(%plyr.getEyeVector(),0) SPC "0");
|
||||
|
||||
if (vAbs(floorVec(%item.surfaceNrm,100)) $= "0 0 1")
|
||||
%item.surfaceNrm2 = %playerVector;
|
||||
else
|
||||
%item.surfaceNrm2 = vectorNormalize(vectorCross(%item.surfaceNrm,"0 0 -1"));
|
||||
|
||||
%rot = fullRot(%item.surfaceNrm,%item.surfaceNrm2);
|
||||
|
||||
%deplObj = new (%className)() {
|
||||
dataBlock = %item.deployed;
|
||||
};
|
||||
|
||||
%deplObj.light = new Item() {
|
||||
datablock = DeployedLight @ %plyr.packSet;
|
||||
static = true;
|
||||
};
|
||||
|
||||
// set orientation
|
||||
%deplObj.setTransform(%item.surfacePt SPC %rot);
|
||||
adjustLight(%deplObj);
|
||||
|
||||
// set the recharge rate right away
|
||||
if (%deplObj.getDatablock().rechargeRate)
|
||||
%deplObj.setRechargeRate(%deplObj.getDatablock().rechargeRate);
|
||||
|
||||
// set team, owner, and handle
|
||||
%deplObj.team = %plyr.client.Team;
|
||||
%deplObj.setOwner(%plyr);
|
||||
%deplObj.light.lightBase = %deplObj;
|
||||
|
||||
// set the sensor group if it needs one
|
||||
if (%deplObj.getTarget() != -1)
|
||||
setTargetSensorGroup(%deplObj.getTarget(), %plyr.client.team);
|
||||
|
||||
// place the deployable in the MissionCleanup/Deployables group (AI reasons)
|
||||
addToDeployGroup(%deplObj);
|
||||
|
||||
//let the AI know as well...
|
||||
AIDeployObject(%plyr.client, %deplObj);
|
||||
|
||||
// play the deploy sound
|
||||
serverPlay3D(%item.deploySound, %deplObj.getTransform());
|
||||
|
||||
// increment the team count for this deployed object
|
||||
$TeamDeployedCount[%plyr.team, %item.item]++;
|
||||
|
||||
addDSurface(%item.surface,%deplObj);
|
||||
|
||||
%deplObj.playThread($PowerThread,"Power");
|
||||
%deplObj.playThread($AmbientThread,"ambient");
|
||||
|
||||
// take the deployable off the player's back and out of inventory
|
||||
%plyr.unmountImage(%slot);
|
||||
%plyr.decInventory(%item.item, 1);
|
||||
|
||||
return %deplObj;
|
||||
}
|
||||
|
||||
function DeployedLightBase::onDestroyed(%this,%obj,%prevState) {
|
||||
if (%obj.isRemoved)
|
||||
return;
|
||||
%obj.isRemoved = true;
|
||||
Parent::onDestroyed(%this,%obj,%prevState);
|
||||
$TeamDeployedCount[%obj.team, LightDeployable]--;
|
||||
remDSurface(%obj);
|
||||
%obj.schedule(500, "delete");
|
||||
if (isObject(%obj.light))
|
||||
%obj.light.schedule(500, "delete");
|
||||
}
|
||||
|
||||
function DeployedLightBase::disassemble(%data,%plyr,%obj) {
|
||||
if (isObject(%obj.light))
|
||||
%obj.light.delete();
|
||||
disassemble(%data,%plyr,%obj);
|
||||
}
|
||||
|
||||
function adjustLight(%obj) {
|
||||
%obj.light.setTransform(vectorAdd(%obj.getPosition(),vectorScale(realVec(%obj,"0 0 1"),1)) SPC %obj.getRotation());
|
||||
}
|
||||
|
||||
function LightDeployableImage::onMount(%data, %obj, %node) {
|
||||
%obj.hasLight = true; // set for lightcheck
|
||||
%obj.packSet = 0;
|
||||
}
|
||||
|
||||
function LightDeployableImage::onUnmount(%data, %obj, %node) {
|
||||
%obj.hasLight = "";
|
||||
%obj.packSet = 0;
|
||||
}
|
||||
238
scripts/packs/logoprojectorpack.cs
Normal file
238
scripts/packs/logoprojectorpack.cs
Normal file
|
|
@ -0,0 +1,238 @@
|
|||
//---------------------------------------------------------
|
||||
// Deployable Logo Logo Projector
|
||||
//---------------------------------------------------------
|
||||
|
||||
datablock StaticShapeData(DeployedLogoProjector) : StaticShapeDamageProfile {
|
||||
className = "logoprojector";
|
||||
shapeFile = "teamlogo_projector.dts";
|
||||
|
||||
maxDamage = 0.5;
|
||||
destroyedLevel = 0.5;
|
||||
disabledLevel = 0.3;
|
||||
|
||||
isShielded = true;
|
||||
energyPerDamagePoint = 240;
|
||||
maxEnergy = 50;
|
||||
rechargeRate = 0.25;
|
||||
|
||||
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 Logo Projector';
|
||||
deployAmbientThread = true;
|
||||
debrisShapeName = "debris_generic_small.dts";
|
||||
debris = DeployableDebris;
|
||||
heatSignature = 0;
|
||||
needsPower = true;
|
||||
};
|
||||
|
||||
datablock ShapeBaseImageData(LogoProjectorDeployableImage) {
|
||||
mass = 1;
|
||||
emap = true;
|
||||
shapeFile = "teamlogo_projector.dts";
|
||||
item = LogoProjectorDeployable;
|
||||
mountPoint = 1;
|
||||
offset = "0 0 0";
|
||||
rotation = "-1 0 0 90";
|
||||
deployed = DeployedLogoProjector;
|
||||
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.1;
|
||||
maxDeployDis = 50.0;
|
||||
};
|
||||
|
||||
datablock ItemData(LogoProjectorDeployable) {
|
||||
className = Pack;
|
||||
catagory = "Deployables";
|
||||
shapeFile = "stackable1s.dts";
|
||||
mass = 1;
|
||||
elasticity = 0.2;
|
||||
friction = 0.6;
|
||||
pickupRadius = 1;
|
||||
rotate = true;
|
||||
image = "LogoProjectorDeployableImage";
|
||||
pickUpName = "a logo projector pack";
|
||||
heatSignature = 0;
|
||||
emap = true;
|
||||
};
|
||||
|
||||
function LogoProjectorDeployableImage::testObjectTooClose(%item) {
|
||||
return "";
|
||||
}
|
||||
|
||||
function LogoProjectorDeployableImage::testNoTerrainFound(%item) {
|
||||
// don't check this for non-Landspike turret deployables
|
||||
}
|
||||
|
||||
function LogoProjectorDeployable::onPickup(%this, %obj, %shape, %amount) {
|
||||
// created to prevent console errors
|
||||
}
|
||||
|
||||
function LogoProjectorDeployableImage::onDeploy(%item, %plyr, %slot) {
|
||||
%className = "StaticShape";
|
||||
|
||||
%playerVector = vectorNormalize(-1 * getWord(%plyr.getEyeVector(),1) SPC getWord(%plyr.getEyeVector(),0) SPC "0");
|
||||
|
||||
if (vAbs(floorVec(%item.surfaceNrm,100)) $= "0 0 1")
|
||||
%item.surfaceNrm2 = %playerVector;
|
||||
else
|
||||
%item.surfaceNrm2 = vectorNormalize(vectorCross(%item.surfaceNrm,"0 0 1"));
|
||||
|
||||
%rot = fullRot(%item.surfaceNrm,%item.surfaceNrm2);
|
||||
|
||||
%deplObj = new (%className)() {
|
||||
dataBlock = %item.deployed;
|
||||
};
|
||||
|
||||
if ($Host::Purebuild == 1)
|
||||
if (%plyr.packSet == 0)
|
||||
%logo = 0;
|
||||
else
|
||||
%logo = %plyr.packSet;
|
||||
else {
|
||||
%logo = 0;
|
||||
}
|
||||
|
||||
switch (%logo) {
|
||||
case 1:
|
||||
%logo = "Base";
|
||||
case 2:
|
||||
%logo = "BaseB";
|
||||
case 3:
|
||||
%logo = "Swolf";
|
||||
case 4:
|
||||
%logo = "DSword";
|
||||
case 5:
|
||||
%logo = "BEagle";
|
||||
case 6:
|
||||
%logo = "COTP";
|
||||
case 7:
|
||||
%logo = "Bioderm";
|
||||
default:
|
||||
%logo = "0";
|
||||
}
|
||||
|
||||
if (%logo $= "0")
|
||||
%deplObj.holoBlock = getTaggedString(Game.getTeamSkin(%plyr.client.team)) @ "Logo";
|
||||
else
|
||||
%deplObj.holoBlock = %logo @ "Logo";
|
||||
|
||||
%deplObj.holo = new StaticShape() {
|
||||
datablock = %deplObj.holoBlock;
|
||||
};
|
||||
|
||||
// set orientation
|
||||
%deplObj.setTransform(%item.surfacePt SPC %rot);
|
||||
adjustHolo(%deplObj);
|
||||
|
||||
// set the recharge rate right away
|
||||
if (%deplObj.getDatablock().rechargeRate)
|
||||
%deplObj.setRechargeRate(%deplObj.getDatablock().rechargeRate);
|
||||
|
||||
// set team, owner, and handle
|
||||
%deplObj.team = %plyr.client.Team;
|
||||
%deplObj.setOwner(%plyr);
|
||||
%deplObj.holo.team = %plyr.client.Team;
|
||||
%deplObj.holo.setOwner(%plyr);
|
||||
%deplObj.holo.projector = %deplObj;
|
||||
|
||||
// set power frequency
|
||||
%deplObj.powerFreq = %plyr.powerFreq;
|
||||
|
||||
// place the deployable in the MissionCleanup/Deployables group (AI reasons)
|
||||
addToDeployGroup(%deplObj);
|
||||
|
||||
//let the AI know as well...
|
||||
AIDeployObject(%plyr.client,%deplObj);
|
||||
|
||||
// play the deploy sound
|
||||
serverPlay3D(%item.deploySound, %deplObj.getTransform());
|
||||
|
||||
// increment the team count for this deployed object
|
||||
$TeamDeployedCount[%plyr.team, %item.item]++;
|
||||
|
||||
addDSurface(%item.surface,%deplObj);
|
||||
|
||||
// take the deployable off the player's back and out of inventory
|
||||
%plyr.unmountImage(%slot);
|
||||
%plyr.decInventory(%item.item, 1);
|
||||
|
||||
// Power object
|
||||
checkPowerObject(%deplObj);
|
||||
|
||||
return %deplObj;
|
||||
}
|
||||
|
||||
function DeployedLogoProjector::onDestroyed(%this,%obj,%prevState) {
|
||||
if (%obj.isRemoved)
|
||||
return;
|
||||
%obj.isRemoved = true;
|
||||
Parent::onDestroyed(%this,%obj,%prevState);
|
||||
$TeamDeployedCount[%obj.team, LogoProjectorDeployable]--;
|
||||
remDSurface(%obj);
|
||||
%obj.schedule(500, "delete");
|
||||
if (isObject(%obj.holo))
|
||||
%obj.holo.schedule(500, "delete");
|
||||
fireBallExplode(%obj,1);
|
||||
}
|
||||
|
||||
function DeployedLogoProjector::disassemble(%data,%plyr,%obj) {
|
||||
if (isObject(%obj.holo))
|
||||
%obj.holo.delete();
|
||||
disassemble(%data,%plyr,%obj);
|
||||
}
|
||||
|
||||
function DeployedLogoProjector::onGainPowerEnabled(%data,%obj) {
|
||||
if (shouldChangePowerState(%obj,true)) {
|
||||
if (isObject(%obj.holo))
|
||||
%obj.holo.delete();
|
||||
%obj.holo = new StaticShape() {
|
||||
datablock = %obj.holoBlock;
|
||||
projector = %obj;
|
||||
};
|
||||
adjustHolo(%obj);
|
||||
%obj.holo.setScale(%obj.getScale());
|
||||
}
|
||||
Parent::onGainPowerEnabled(%data,%obj);
|
||||
}
|
||||
|
||||
function DeployedLogoProjector::onLosePowerDisabled(%data,%obj) {
|
||||
if (shouldChangePowerState(%obj,false)) {
|
||||
if (isObject(%obj.holo))
|
||||
%obj.holo.delete();
|
||||
}
|
||||
Parent::onLosePowerDisabled(%data,%obj);
|
||||
}
|
||||
|
||||
function adjustHolo(%obj) {
|
||||
%obj.holo.setTransform(vectorAdd(%obj.getPosition(),vectorScale(realVec(%obj,"0 0 1"),10)) SPC %obj.getRotation());
|
||||
}
|
||||
|
||||
function LogoProjectorDeployableImage::onMount(%data, %obj, %node) {
|
||||
%obj.hasProjector = true; // set for projectorcheck
|
||||
%obj.packSet = 0;
|
||||
displayPowerFreq(%obj);
|
||||
}
|
||||
|
||||
function LogoProjectorDeployableImage::onUnmount(%data, %obj, %node) {
|
||||
%obj.hasProjector = "";
|
||||
%obj.packSet = 0;
|
||||
}
|
||||
127
scripts/packs/mediumSensor.cs
Normal file
127
scripts/packs/mediumSensor.cs
Normal file
|
|
@ -0,0 +1,127 @@
|
|||
//--------------------------------------------------------------------------
|
||||
// Medium Pulse Sensor
|
||||
//--------------------------------------------------------------------------
|
||||
|
||||
datablock ShapeBaseImageData(MediumSensorDeployableImage) {
|
||||
mass = 1;
|
||||
emap = true;
|
||||
shapeFile = "stackable1s.dts";
|
||||
item = MediumSensorDeployable;
|
||||
mountPoint = 1;
|
||||
offset = "0 0 0";
|
||||
deployed = SensorMediumPulse;
|
||||
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 = 5.0;
|
||||
};
|
||||
|
||||
datablock ItemData(MediumSensorDeployable) {
|
||||
className = Pack;
|
||||
catagory = "Deployables";
|
||||
shapeFile = "stackable1s.dts";
|
||||
mass = 1;
|
||||
elasticity = 0.2;
|
||||
friction = 0.6;
|
||||
pickupRadius = 1;
|
||||
rotate = true;
|
||||
image = "MediumSensorDeployableImage";
|
||||
joint = "4.5 4.5 4.5";
|
||||
pickUpName = "a medium pulse sensor pack";
|
||||
heatSignature = 0;
|
||||
emap = true;
|
||||
};
|
||||
|
||||
function MediumSensorDeployable::onPickup(%this, %obj, %shape, %amount) {
|
||||
// created to prevent console errors
|
||||
}
|
||||
|
||||
function MediumSensorDeployableImage::testNoTerrainFound(%item) {
|
||||
// don't check this for non-Landspike turret deployables
|
||||
}
|
||||
|
||||
function MediumSensorDeployableImage::onDeploy(%item, %plyr, %slot) {
|
||||
%className = "StaticShape";
|
||||
|
||||
%playerVector = vectorNormalize(getWord(%plyr.getEyeVector(),1) SPC -1 * getWord(%plyr.getEyeVector(),0) SPC "0");
|
||||
%item.surfaceNrm2 = %playerVector;
|
||||
|
||||
if (vAbs(floorVec(%item.surfaceNrm,100)) $= "0 0 1")
|
||||
%item.surfaceNrm2 = %playerVector;
|
||||
else
|
||||
%item.surfaceNrm2 = vectorNormalize(vectorCross(%item.surfaceNrm,"0 0 -1"));
|
||||
|
||||
%rot = fullRot(%item.surfaceNrm,%item.surfaceNrm2);
|
||||
|
||||
%deplObj = new (%className)() {
|
||||
dataBlock = SensorMediumPulse;
|
||||
deployed = true;
|
||||
};
|
||||
|
||||
// set orientation
|
||||
%deplObj.setTransform(%item.surfacePt SPC %rot);
|
||||
|
||||
// set team, owner, and handle
|
||||
%deplObj.team = %plyr.client.Team;
|
||||
%deplObj.setOwner(%plyr);
|
||||
|
||||
// set power frequency
|
||||
%deplObj.powerFreq = %plyr.powerFreq;
|
||||
// setTargetName(%deplObj.target,addTaggedString("Frequency" SPC %deplObj.powerFreq));
|
||||
|
||||
// set the sensor group if it needs one
|
||||
if (%deplObj.getTarget() != -1)
|
||||
setTargetSensorGroup(%deplObj.getTarget(), %plyr.client.team);
|
||||
|
||||
// place the deployable in the MissionCleanup/Deployables group (AI reasons)
|
||||
addToDeployGroup(%deplObj);
|
||||
|
||||
//let the AI know as well...
|
||||
AIDeployObject(%plyr.client, %deplObj);
|
||||
|
||||
// play the deploy sound
|
||||
serverPlay3D(%item.deploySound, %deplObj.getTransform());
|
||||
|
||||
// increment the team count for this deployed object
|
||||
$TeamDeployedCount[%plyr.team, %item.item]++;
|
||||
|
||||
addDSurface(%item.surface,%deplObj);
|
||||
|
||||
// %deplObj.playThread($PowerThread,"Power");
|
||||
|
||||
// take the deployable off the player's back and out of inventory
|
||||
%plyr.unmountImage(%slot);
|
||||
%plyr.decInventory(%item.item, 1);
|
||||
|
||||
// Power object
|
||||
checkPowerObject(%deplObj);
|
||||
|
||||
return %deplObj;
|
||||
}
|
||||
|
||||
function SensorMediumPulse::onDestroyed(%data,%obj,%prevState) {
|
||||
if (%obj.isRemoved)
|
||||
return;
|
||||
if (%obj.deployed) {
|
||||
%obj.isRemoved = true;
|
||||
$TeamDeployedCount[%obj.team,MediumSensorDeployable]--;
|
||||
remDSurface(%obj);
|
||||
%obj.schedule(500,"delete");
|
||||
}
|
||||
Parent::onDestroyed(%data,%obj,%prevState);
|
||||
}
|
||||
|
||||
function MediumSensorDeployableImage::onMount(%data, %obj, %node) {
|
||||
displayPowerFreq(%obj);
|
||||
}
|
||||
455
scripts/packs/missilerackturret.cs
Normal file
455
scripts/packs/missilerackturret.cs
Normal file
|
|
@ -0,0 +1,455 @@
|
|||
//--------------------------------------------------------------------------
|
||||
// Datablocks
|
||||
//--------------------------------------
|
||||
|
||||
datablock AudioProfile(MissileRackTurretFireSound) {
|
||||
filename = "";
|
||||
description = AudioDefault3d;
|
||||
preload = true;
|
||||
effect = MissileFireEffect;
|
||||
};
|
||||
|
||||
datablock AudioProfile(MissileRackTurretFireSound2) {
|
||||
filename = "fx/weapons/sniper_miss.wav";
|
||||
description = AudioDefault3d;
|
||||
preload = true;
|
||||
};
|
||||
|
||||
datablock SensorData(MissileRackTurretSensor) {
|
||||
detects = true;
|
||||
detectsUsingLOS = true;
|
||||
detectsPassiveJammed = false;
|
||||
detectsActiveJammed = false;
|
||||
detectsCloaked = false;
|
||||
detectionPings = true;
|
||||
detectRadius = 100;
|
||||
};
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// Explosions
|
||||
//---------------------------------------------------------------------------
|
||||
datablock ExplosionData(MissileRackMissileExplosion) {
|
||||
explosionShape = "effect_plasma_explosion.dts";
|
||||
playSpeed = 1.5;
|
||||
soundProfile = GrenadeExplosionSound;
|
||||
faceViewer = true;
|
||||
|
||||
sizes[0] = "0.5 0.5 0.5";
|
||||
sizes[1] = "0.5 0.5 0.5";
|
||||
sizes[2] = "0.5 0.5 0.5";
|
||||
|
||||
emitter[0] = MissileExplosionSmokeEmitter;
|
||||
|
||||
debris = MissileSpikeDebris;
|
||||
debrisThetaMin = 10;
|
||||
debrisThetaMax = 170;
|
||||
debrisNum = 8;
|
||||
debrisNumVariance = 6;
|
||||
debrisVelocity = 15.0;
|
||||
debrisVelocityVariance = 2.0;
|
||||
|
||||
shakeCamera = true;
|
||||
camShakeFreq = "6.0 7.0 7.0";
|
||||
camShakeAmp = "70.0 70.0 70.0";
|
||||
camShakeDuration = 1.0;
|
||||
camShakeRadius = 7.0;
|
||||
};
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
// Projectile
|
||||
//--------------------------------------
|
||||
datablock SeekerProjectileData(MissileRackMissile) {
|
||||
casingShapeName = "weapon_missile_casement.dts";
|
||||
projectileShapeName = "weapon_missile_projectile.dts";
|
||||
hasDamageRadius = true;
|
||||
indirectDamage = 0.2;
|
||||
damageRadius = 4.0;
|
||||
radiusDamageType = $DamageType::MissileTurret;
|
||||
kickBackStrength = 1000;
|
||||
|
||||
explosion = "MissileRackMissileExplosion";
|
||||
splash = MissileSplash;
|
||||
velInheritFactor = 0.2; // to compensate for slow starting velocity, this value
|
||||
// is cranked up to full so the missile doesn't start
|
||||
// out behind the player when the player is moving
|
||||
// very quickly - bramage
|
||||
|
||||
baseEmitter = MissileSmokeEmitter;
|
||||
delayEmitter = MissileFireEmitter;
|
||||
puffEmitter = MissilePuffEmitter;
|
||||
bubbleEmitter = GrenadeBubbleEmitter;
|
||||
bubbleEmitTime = 1.0;
|
||||
|
||||
exhaustEmitter = MissileLauncherExhaustEmitter;
|
||||
exhaustTimeMs = 300;
|
||||
exhaustNodeName = "muzzlePoint1";
|
||||
|
||||
lifetimeMS = 6000;
|
||||
muzzleVelocity = 10.0;
|
||||
maxVelocity = 80.0;
|
||||
turningSpeed = 110.0;
|
||||
acceleration = 200.0;
|
||||
|
||||
proximityRadius = 3;
|
||||
|
||||
terrainAvoidanceSpeed = 180;
|
||||
terrainScanAhead = 25;
|
||||
terrainHeightFail = 12;
|
||||
terrainAvoidanceRadius = 100;
|
||||
|
||||
flareDistance = 200;
|
||||
flareAngle = 30;
|
||||
|
||||
sound = MissileProjectileSound;
|
||||
|
||||
hasLight = true;
|
||||
lightRadius = 5.0;
|
||||
lightColor = "0.2 0.05 0";
|
||||
|
||||
useFlechette = true;
|
||||
flechetteDelayMs = 550;
|
||||
casingDeb = FlechetteDebris;
|
||||
|
||||
explodeOnWaterImpact = false;
|
||||
};
|
||||
|
||||
datablock TurretData(MissileRackTurretDeployed) : TurretDamageProfile {
|
||||
className = DeployedTurret;
|
||||
shapeFile = "turret_outdoor_deploy.dts";
|
||||
|
||||
rechargeRate = 0.15;
|
||||
|
||||
mass = 1;
|
||||
maxDamage = 0.80;
|
||||
destroyedLevel = 0.80;
|
||||
disabledLevel = 0.35;
|
||||
|
||||
explosion = HandGrenadeExplosion;
|
||||
expDmgRadius = 5.0;
|
||||
expDamage = 0.5;
|
||||
expImpulse = 500.0;
|
||||
|
||||
repairRate = 0;
|
||||
deployedObject = true;
|
||||
|
||||
thetaMin = 0;
|
||||
thetaMax = 145;
|
||||
thetaNull = 90;
|
||||
primaryAxis = zaxis;
|
||||
|
||||
yawVariance = 30.0; // these will smooth out the elf tracking code.
|
||||
pitchVariance = 30.0; // more or less just tolerances
|
||||
|
||||
isShielded = true;
|
||||
energyPerDamagePoint = 110;
|
||||
maxEnergy = 80;
|
||||
renderWhenDestroyed = true;
|
||||
barrel = DeployableMissileRackTurretBarrel;
|
||||
heatSignature = 0.0;
|
||||
|
||||
canControl = true;
|
||||
cmdCategory = "DTactical";
|
||||
cmdIcon = CMDTurretIcon;
|
||||
cmdMiniIconName = "commander/MiniIcons/com_turret_grey";
|
||||
targetNameTag = 'Missile Rack';
|
||||
targetTypeTag = 'Turret';
|
||||
sensorData = MissileRackTurretSensor;
|
||||
sensorRadius = MissileRackTurretSensor.detectRadius;
|
||||
sensorColor = "191 0 226";
|
||||
|
||||
firstPersonOnly = true;
|
||||
|
||||
debrisShapeName = "debris_generic_small.dts";
|
||||
debris = TurretDebrisSmall;
|
||||
needsPower = true;
|
||||
};
|
||||
|
||||
datablock TurretImageData(DeployableMissileRackTurretBarrel) {
|
||||
shapeFile = "stackable1s.dts";
|
||||
rotation = "-0.57735 0.57735 0.57735 120";
|
||||
offset = "0 -0.3 0";
|
||||
projectile = MissileRackMissile;
|
||||
projectileType = SeekerProjectile;
|
||||
|
||||
usesEnergy = true;
|
||||
fireEnergy = 7.0;
|
||||
minEnergy = 7.0 * 2;
|
||||
|
||||
isSeeker = true;
|
||||
seekRadius = 300;
|
||||
maxSeekAngle = 30;
|
||||
seekTime = 1.0;
|
||||
minSeekHeat = 0.6;
|
||||
emap = true;
|
||||
minTargetingDistance = 15;
|
||||
|
||||
// Turret parameters
|
||||
activationMS = 250;
|
||||
deactivateDelayMS = 500;
|
||||
thinkTimeMS = 200;
|
||||
degPerSecTheta = 580;
|
||||
degPerSecPhi = 1080;
|
||||
attackRadius = 250;
|
||||
|
||||
// State transitions
|
||||
stateName[0] = "Activate";
|
||||
stateTransitionOnNotLoaded[0] = "Dead";
|
||||
stateTransitionOnLoaded[0] = "ActivateReady";
|
||||
|
||||
stateName[1] = "ActivateReady";
|
||||
stateSequence[1] = "Activate";
|
||||
stateSound[1] = IBLSwitchSound;
|
||||
|
||||
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.3;
|
||||
stateFire[3] = true;
|
||||
stateShockwave[3] = true;
|
||||
stateRecoil[3] = LightRecoil;
|
||||
stateAllowImageChange[3] = false;
|
||||
stateSequence[3] = "Fire";
|
||||
stateSound[3] = MissileRackTurretFireSound;
|
||||
stateScript[3] = "onFire";
|
||||
|
||||
stateName[4] ="Reload";
|
||||
stateTimeoutValue[4] = 0.5;
|
||||
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] = 2;
|
||||
stateTransitionOnLoaded[5] = "ActivateReady";
|
||||
stateTransitionOnTimeout[5] = "Dead";
|
||||
|
||||
stateName[6] = "Dead";
|
||||
stateTransitionOnLoaded[6] = "ActivateReady";
|
||||
|
||||
stateName[7] = "NoAmmo";
|
||||
stateTransitionOnAmmo[7] = "Reload";
|
||||
stateSequence[7] = "NoAmmo";
|
||||
|
||||
muzzleSlots = 12;
|
||||
muzzleSlotOffset[0] = "0.65 0.5 0.4";
|
||||
muzzleSlotOffset[1] = "0.35 0.5 0.4";
|
||||
muzzleSlotOffset[2] = "0.15 0.5 0.4";
|
||||
muzzleSlotOffset[3] = "-0.15 0.5 0.4";
|
||||
muzzleSlotOffset[4] = "-0.35 0.5 0.4";
|
||||
muzzleSlotOffset[5] = "-0.65 0.5 0.4";
|
||||
muzzleSlotOffset[6] = "0.65 0.5 0.1";
|
||||
muzzleSlotOffset[7] = "0.35 0.5 0.1";
|
||||
muzzleSlotOffset[8] = "0.15 0.5 0.1";
|
||||
muzzleSlotOffset[9] = "-0.15 0.5 0.1";
|
||||
muzzleSlotOffset[10] = "-0.35 0.5 0.1";
|
||||
muzzleSlotOffset[11] = "-0.65 0.5 0.1";
|
||||
};
|
||||
|
||||
datablock TurretImageData(DeployableMissileRackTurretBarrelR) {
|
||||
shapeFile = "stackable1s.dts";
|
||||
rotation = "-0.57735 0.57735 0.57735 120";
|
||||
offset = "0 -0.3 0.5";
|
||||
|
||||
};
|
||||
|
||||
datablock TurretImageData(DeployableMissileRackTurretBarrelL) {
|
||||
shapeFile = "stackable1s.dts";
|
||||
rotation = "-0.57735 0.57735 0.57735 120";
|
||||
offset = "0 -0.3 -0.5";
|
||||
};
|
||||
|
||||
function DeployableMissileRackTurretBarrel::onMount(%this,%obj,%slot) {
|
||||
%obj.currentMuzzleSlot = 0;
|
||||
%obj.schedule(1000,"mountImage",DeployableMissileRackTurretBarrelR,1,true);
|
||||
%obj.schedule(1000,"mountImage",DeployableMissileRackTurretBarrelL,2,true);
|
||||
}
|
||||
|
||||
// TODO - handle unmount
|
||||
|
||||
datablock ShapeBaseImageData(TurretMissileRackDeployableImage) {
|
||||
mass = 1;
|
||||
shapeFile = "pack_deploy_turreto.dts";
|
||||
item = TurretMissileRackDeployable;
|
||||
mountPoint = 1;
|
||||
offset = "0 0 0";
|
||||
deployed = MissileRackTurretDeployed;
|
||||
stateName[0] = "Idle";
|
||||
stateTransitionOnTriggerDown[0] = "Activate";
|
||||
|
||||
stateName[1] = "Activate";
|
||||
stateScript[1] = "onActivate";
|
||||
stateTransitionOnTriggerUp[1] = "Idle";
|
||||
|
||||
isLarge = true;
|
||||
emap = true;
|
||||
maxDepSlope = 360;
|
||||
deploySound = TurretDeploySound;
|
||||
minDeployDis = 0.5;
|
||||
maxDeployDis = 5.0;
|
||||
};
|
||||
|
||||
datablock ItemData(TurretMissileRackDeployable) {
|
||||
className = Pack;
|
||||
catagory = "Deployables";
|
||||
shapeFile = "pack_deploy_turreti.dts";
|
||||
mass = 1;
|
||||
elasticity = 0.2;
|
||||
friction = 0.6;
|
||||
pickupRadius = 1;
|
||||
rotate = false;
|
||||
image = TurretMissileRackDeployableImage;
|
||||
pickUpName = "a missile rack turret pack";
|
||||
emap = true;
|
||||
};
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
// Functions
|
||||
//--------------------------------------
|
||||
|
||||
function TurretMissileRackDeployableImage::TestNoTerrainFound(%item) {
|
||||
// created to prevent console errors
|
||||
}
|
||||
|
||||
function TurretMissileRackDeployableImage::TestNoInteriorFound(%item) {
|
||||
// created to prevent console errors
|
||||
}
|
||||
|
||||
function TurretMissileRackDeployable::onPickup(%this, %obj, %shape, %amount) {
|
||||
//created to prevent console errors
|
||||
}
|
||||
|
||||
function TurretMissileRackDeployableImage::onDeploy(%item, %plyr, %slot) {
|
||||
%className = "Turret";
|
||||
|
||||
%playerVector = vectorNormalize(getWord(%plyr.getEyeVector(),1) SPC -1 * getWord(%plyr.getEyeVector(),0) SPC "0");
|
||||
|
||||
if (vAbs(floorVec(%item.surfaceNrm,100)) $= "0 0 1")
|
||||
%item.surfaceNrm2 = %playerVector;
|
||||
else
|
||||
%item.surfaceNrm2 = vectorNormalize(vectorCross(%item.surfaceNrm,"0 0 1"));
|
||||
|
||||
%rot = fullRot(%item.surfaceNrm,%item.surfaceNrm2);
|
||||
|
||||
%deplObj = new (%className)() {
|
||||
dataBlock = %item.deployed;
|
||||
};
|
||||
|
||||
if (%plyr.packSet == 1)
|
||||
%deplObj.isSeeker = true;
|
||||
|
||||
// set orientation
|
||||
%deplObj.setTransform(%item.surfacePt SPC %rot);
|
||||
|
||||
// set team, owner, and handle
|
||||
%deplObj.team = %plyr.client.Team;
|
||||
%deplObj.setOwner(%plyr);
|
||||
|
||||
// set power frequency
|
||||
%deplObj.powerFreq = %plyr.powerFreq;
|
||||
|
||||
// set the sensor group if it needs one
|
||||
if (%deplObj.getTarget() != -1)
|
||||
setTargetSensorGroup(%deplObj.getTarget(), %plyr.client.team);
|
||||
|
||||
// place the deployable in the MissionCleanup/Deployables group (AI reasons)
|
||||
addToDeployGroup(%deplObj);
|
||||
|
||||
//let the AI know as well...
|
||||
AIDeployObject(%plyr.client, %deplObj);
|
||||
|
||||
// play the deploy sound
|
||||
serverPlay3D(%item.deploySound, %deplObj.getTransform());
|
||||
|
||||
// increment the team count for this deployed object
|
||||
$TeamDeployedCount[%plyr.team, %item.item]++;
|
||||
|
||||
%deplObj.deploy();
|
||||
|
||||
// Power object
|
||||
checkPowerObject(%deplObj);
|
||||
|
||||
addDSurface(%item.surface,%deplObj);
|
||||
|
||||
// take the deployable off the player's back and out of inventory
|
||||
%plyr.unmountImage(%slot);
|
||||
%plyr.decInventory(%item.item, 1);
|
||||
|
||||
return %deplObj;
|
||||
}
|
||||
|
||||
function MissileRackTurretDeployed::onDestroyed(%this, %obj, %prevState) {
|
||||
if (%obj.isRemoved)
|
||||
return;
|
||||
if ($Host::InvincibleDeployables != 1 || %obj.damageFailedDecon) {
|
||||
%obj.isRemoved = true;
|
||||
$TeamDeployedCount[%obj.team, TurretMissileRackDeployable]--;
|
||||
remDSurface(%obj);
|
||||
%obj.schedule(500, delete);
|
||||
}
|
||||
Parent::onDestroyed(%this, %obj, %prevState);
|
||||
}
|
||||
|
||||
function DeployableMissileRackTurretBarrel::onFire(%data,%obj,%slot) {
|
||||
%targetObj = %obj.getTargetObject();
|
||||
if (%targetObj) {
|
||||
if (!%obj.getDataBlock().hasLOS(%obj,%slot,%targetObj) && %obj.aquireTime + 2000 < getSimTime()) {
|
||||
%obj.clearTarget();
|
||||
return;
|
||||
}
|
||||
if (%obj.aquireTime + 10000 + getRandom(0,1000) < getSimTime()) {
|
||||
%obj.clearTarget();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
%p = Parent::onFire(%data,%obj,%slot);
|
||||
serverPlay3D(MissileRackTurretFireSound2,%obj.getTransform());
|
||||
|
||||
if (%obj.isSeeker) {
|
||||
if (%obj.getControllingClient())
|
||||
// a player is controlling the turret
|
||||
%target = %obj.getLockedTarget();
|
||||
else
|
||||
// The ai is controlling the turret
|
||||
%target = %obj.getTargetObject();
|
||||
|
||||
if(%target)
|
||||
%p.setObjectTarget(%target);
|
||||
else if(%obj.isLocked())
|
||||
%p.setPositionTarget(%obj.getLockedPosition());
|
||||
else
|
||||
%p.setNoTarget(); // set as unguided. Only happens when itchy trigger can't wait for lock tone.
|
||||
%obj.setEnergyLevel(%obj.getEnergyLevel() - (%data.fireEnergy));
|
||||
}
|
||||
}
|
||||
|
||||
function MissileRackTurretDeployed::hasLOS(%data,%obj,%slot,%targetObj) {
|
||||
%start = %obj.getMuzzlePoint(%slot);
|
||||
%end = %targetObj.getWorldBoxCenter();
|
||||
%res = containerRayCast(%start,%end,-1,%obj);
|
||||
return firstWord(%res) == %targetObj;
|
||||
}
|
||||
|
||||
function TurretMissileRackDeployableImage::onMount(%data, %obj, %node) {
|
||||
%obj.hasMissileRack = true; // set for missilerackcheck
|
||||
%obj.packSet = 0;
|
||||
displayPowerFreq(%obj);
|
||||
}
|
||||
|
||||
function TurretMissileRackDeployableImage::onUnmount(%data, %obj, %node) {
|
||||
%obj.hasMissileRack = "";
|
||||
%obj.packSet = 0;
|
||||
}
|
||||
282
scripts/packs/mspine.cs
Normal file
282
scripts/packs/mspine.cs
Normal file
|
|
@ -0,0 +1,282 @@
|
|||
//---------------------------------------------------------
|
||||
// Deployable mspine, Code by Parousia
|
||||
//---------------------------------------------------------
|
||||
|
||||
datablock StaticShapeData(DeployedMSpine) : StaticShapeDamageProfile {
|
||||
className = "mspine";
|
||||
shapeFile = "dmiscf.dts";
|
||||
|
||||
maxDamage = 5.0;
|
||||
destroyedLevel = 5.0;
|
||||
disabledLevel = 2.5;
|
||||
|
||||
isShielded = true;
|
||||
energyPerDamagePoint = 240;
|
||||
maxEnergy = 50;
|
||||
rechargeRate = 0.25;
|
||||
|
||||
explosion = HandGrenadeExplosion;
|
||||
expDmgRadius = 5.0;
|
||||
expDamage = 0.5;
|
||||
expImpulse = 200.0;
|
||||
|
||||
dynamicType = $TypeMasks::StaticShapeObjectType;
|
||||
deployedObject = true;
|
||||
cmdCategory = "DSupport";
|
||||
cmdIcon = CMDSensorIcon;
|
||||
cmdMiniIconName = "commander/MiniIcons/com_deploymotionsensor";
|
||||
targetNameTag = 'Medium Support Beam';
|
||||
deployAmbientThread = true;
|
||||
debrisShapeName = "debris_generic_small.dts";
|
||||
debris = DeployableDebris;
|
||||
heatSignature = 0;
|
||||
needsPower = true;
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedMSpinering) : DeployedMSpine {
|
||||
maxDamage = 1.0;
|
||||
destroyedLevel = 1.0;
|
||||
disabledLevel = 0.75;
|
||||
};
|
||||
|
||||
datablock ShapeBaseImageData(mspineDeployableImage) {
|
||||
mass = 1;
|
||||
emap = true;
|
||||
shapeFile = "stackable1s.dts";
|
||||
item = mspineDeployable;
|
||||
mountPoint = 1;
|
||||
offset = "0 0 0";
|
||||
deployed = DeployedMSpine;
|
||||
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.1;
|
||||
maxDeployDis = 50.0;
|
||||
};
|
||||
|
||||
datablock ItemData(mspineDeployable) {
|
||||
className = Pack;
|
||||
catagory = "Deployables";
|
||||
shapeFile = "stackable1s.dts";
|
||||
mass = 1;
|
||||
elasticity = 0.2;
|
||||
friction = 0.6;
|
||||
pickupRadius = 1;
|
||||
joint = "1 1 1";
|
||||
rotate = true;
|
||||
image = "mspineDeployableImage";
|
||||
pickUpName = "a medium support beam pack";
|
||||
heatSignature = 0;
|
||||
emap = true;
|
||||
};
|
||||
|
||||
function mspineDeployableImage::testObjectTooClose(%item) {
|
||||
return "";
|
||||
}
|
||||
|
||||
function mspineDeployableImage::testNoTerrainFound(%item) {
|
||||
// don't check this for non-Landspike turret deployables
|
||||
}
|
||||
|
||||
function mspineDeployable::onPickup(%this, %obj, %shape, %amount) {
|
||||
// created to prevent console errors
|
||||
}
|
||||
|
||||
function mspineDeployableImage::onDeploy(%item, %plyr, %slot) {
|
||||
//Object
|
||||
%className = "StaticShape";
|
||||
|
||||
%grounded = 0;
|
||||
if (%item.surface.getClassName() $= TerrainBlock)
|
||||
%grounded = 1;
|
||||
|
||||
%playerVector = vectorNormalize(-1 * getWord(%plyr.getEyeVector(),1) SPC getWord(%plyr.getEyeVector(),0) SPC "0");
|
||||
|
||||
if (%item.surfaceinher == 0) {
|
||||
if (vAbs(floorVec(%item.surfaceNrm,100)) $= "0 0 1")
|
||||
%item.surfaceNrm2 = %playerVector;
|
||||
else
|
||||
%item.surfaceNrm2 = vectorNormalize(vectorCross(%item.surfaceNrm,"0 0 1"));
|
||||
}
|
||||
|
||||
%rot = fullRot(%item.surfaceNrm,%item.surfaceNrm2);
|
||||
%scale = getWords($packSetting["mspine",%plyr.packSet],0,2);
|
||||
|
||||
%mod = 0.5;
|
||||
|
||||
if (%plyr.packSet >= 5 && %plyr.packSet < 8) {
|
||||
%space = rayDist(%item.surfacePt SPC %item.surfaceNrm,%scale,$AllObjMask);
|
||||
|
||||
if (%space != getWord(%scale,1))
|
||||
%type = 1;
|
||||
|
||||
%scale = getWord(%scale,0) SPC getWord(%scale,0) SPC %space;
|
||||
if (%plyr.packSet == 7)
|
||||
%mod = -0.01;
|
||||
}
|
||||
|
||||
%scaler = getWords($packSetting["mspine",%plyr.packSet],3,5);
|
||||
|
||||
%deplObj = new (%className)() { //Main Spine
|
||||
dataBlock = %item.deployed;
|
||||
scale = vectorMultiply(%scale,1/4 SPC 1/3 SPC 2);
|
||||
};
|
||||
|
||||
if (%plyr.packSet != 0 && (%plyr.packSet == 6 || %plyr.packSet == 7 || %plyr.expertSet == 1)) {
|
||||
%deplObj1 = new (%className)() { //Top add
|
||||
dataBlock = "DeployedMSpinering";
|
||||
scale = vectorMultiply(%scaler,1/4 SPC 1/3 SPC 2);
|
||||
};
|
||||
%deplObj2 = new (%className)() { //Bottom add
|
||||
dataBlock = "DeployedMSpinering";
|
||||
scale = vectorMultiply(%scaler,1/4 SPC 1/3 SPC 2);
|
||||
};
|
||||
|
||||
%h1=vectorAdd(%item.surfacePt,vectorScale(vectorNormalize(%item.surfaceNrm),%mod));
|
||||
%h2=vectorAdd(%item.surfacePt,vectorScale(vectorNormalize(%item.surfaceNrm),GetWord(%scale,2)-%mod-0.5));
|
||||
|
||||
%deplObj1.setTransform(%h1 SPC %rot);
|
||||
%deplObj2.setTransform(%h2 SPC %rot);
|
||||
addDSurface(%deplObj,%deplObj1);
|
||||
%deplObj1.grounded = %grounded;
|
||||
%deplObj1.needsFit = 1;
|
||||
addDSurface(%deplObj,%deplObj2);
|
||||
%deplObj2.grounded = %grounded;
|
||||
%deplObj2.needsFit = 1;
|
||||
%deplObj1.team = %plyr.client.team;
|
||||
%deplObj1.setOwner(%plyr);
|
||||
%deplObj2.team = %plyr.client.team;
|
||||
%deplObj2.setOwner(%plyr);
|
||||
if(%deplObj1.getTarget() != -1)
|
||||
setTargetSensorGroup(%deplObj2.getTarget(), %plyr.client.team);
|
||||
if(%deplObj2.getTarget() != -1)
|
||||
setTargetSensorGroup(%deplObj2.getTarget(), %plyr.client.team);
|
||||
addToDeployGroup(%deplObj1);
|
||||
addToDeployGroup(%deplObj2);
|
||||
AIDeployObject(%plyr.client, %deplObj1);
|
||||
AIDeployObject(%plyr.client, %deplObj2);
|
||||
%deplObj.right = %deplObj1;
|
||||
%deplObj.left = %deplObj2;
|
||||
}
|
||||
|
||||
//////////////////////////Apply settings//////////////////////////////
|
||||
|
||||
// [[Location]]:
|
||||
|
||||
// exact:
|
||||
%deplObj.setTransform(%item.surfacePt SPC %rot);
|
||||
|
||||
// misc info
|
||||
addDSurface(%item.surface,%deplObj);
|
||||
|
||||
// [[Settings]]:
|
||||
|
||||
%deplObj.grounded = %grounded;
|
||||
%deplObj.needsFit = 1;
|
||||
|
||||
// [[Normal Stuff]]:
|
||||
|
||||
// if(%deplObj.getDatablock().rechargeRate)
|
||||
// %deplObj.setRechargeRate(%deplObj.getDatablock().rechargeRate);
|
||||
|
||||
// set team, owner, and handle
|
||||
%deplObj.team = %plyr.client.team;
|
||||
%deplObj.setOwner(%plyr);
|
||||
|
||||
// set power frequency
|
||||
%deplObj.powerFreq = %plyr.powerFreq;
|
||||
%deplObj.right.powerFreq = %plyr.powerFreq;
|
||||
%deplObj.left.powerFreq = %plyr.powerFreq;
|
||||
|
||||
// set the sensor group if it needs one
|
||||
if (%deplObj.getTarget() != -1)
|
||||
setTargetSensorGroup(%deplObj.getTarget(), %plyr.client.team);
|
||||
|
||||
// place the deployable in the MissionCleanup/Deployables group (AI reasons)
|
||||
addToDeployGroup(%deplObj);
|
||||
|
||||
//let the AI know as well...
|
||||
AIDeployObject(%plyr.client, %deplObj);
|
||||
|
||||
// play the deploy sound
|
||||
serverPlay3D(%item.deploySound, %deplObj.getTransform());
|
||||
|
||||
// increment the team count for this deployed object
|
||||
$TeamDeployedCount[%plyr.team, %item.item]++;
|
||||
|
||||
%deplObj.deploy();
|
||||
|
||||
// Power object
|
||||
checkPowerObject(%deplObj);
|
||||
if (isObject(%deplObj.right))
|
||||
checkPowerObject(%deplObj.right);
|
||||
if (isObject(%deplObj.left))
|
||||
checkPowerObject(%deplObj.left);
|
||||
|
||||
if (!%type)
|
||||
deployEffect(%deplObj,%item.surfacePt,%item.surfaceNrm,"mspine");
|
||||
else
|
||||
deployEffect(%deplObj,%item.surfacePt,%item.surfaceNrm,"mspine1");
|
||||
|
||||
return %deplObj;
|
||||
}
|
||||
|
||||
function DeployedMSpine::onDestroyed(%this, %obj, %prevState) {
|
||||
if (%obj.isRemoved)
|
||||
return;
|
||||
%obj.isRemoved = true;
|
||||
Parent::onDestroyed(%this, %obj, %prevState);
|
||||
$TeamDeployedCount[%obj.team, mspineDeployable]--;
|
||||
remDSurface(%obj);
|
||||
%obj.schedule(500, "delete");
|
||||
cascade(%obj);
|
||||
fireBallExplode(%obj,1);
|
||||
if (isObject(%obj.right))
|
||||
%obj.right.schedule(500,setDamageState,Destroyed);
|
||||
if (isObject(%obj.left))
|
||||
%obj.left.schedule(500,setDamageState,Destroyed);
|
||||
}
|
||||
|
||||
function DeployedMSpinering::onDestroyed(%this, %obj, %prevState) {
|
||||
if (%obj.isRemoved)
|
||||
return;
|
||||
%obj.isRemoved = true;
|
||||
Parent::onDestroyed(%this, %obj, %prevState);
|
||||
remDSurface(%obj);
|
||||
%obj.schedule(500, "delete");
|
||||
cascade(%obj);
|
||||
fireBallExplode(%obj,1);
|
||||
}
|
||||
|
||||
function DeployedMSpine::disassemble(%data,%plyr,%hTgt) {
|
||||
if ($Host::Purebuild == 1) { // Remove console spam
|
||||
if (isObject(%hTgt.right))
|
||||
%hTgt.right.getDataBlock().schedule(500,disassemble,0,%hTgt.right);
|
||||
if (isObject(%hTgt.left))
|
||||
%hTgt.left.getDataBlock().schedule(500,disassemble,0,%hTgt.left);
|
||||
}
|
||||
disassemble(%data,%plyr,%hTgt);
|
||||
}
|
||||
|
||||
function mspineDeployableImage::onMount(%data,%obj,%node) {
|
||||
%obj.hasMSpine = true; // set for mspinecheck
|
||||
%obj.packSet = 0;
|
||||
%obj.expertSet = 0;
|
||||
displayPowerFreq(%obj);
|
||||
}
|
||||
|
||||
function mspineDeployableImage::onUnmount(%data,%obj,%node) {
|
||||
%obj.hasMSpine = "";
|
||||
%obj.packSet = 0;
|
||||
%obj.expertSet = 0;
|
||||
}
|
||||
657
scripts/packs/repairpack.cs
Normal file
657
scripts/packs/repairpack.cs
Normal file
|
|
@ -0,0 +1,657 @@
|
|||
//--------------------------------------------------------------------------
|
||||
// Repair Pack
|
||||
// can be used by any armor type
|
||||
// when activated, gives user a "repair gun" that can be used to
|
||||
// repair a damaged object or player. If there is no target in
|
||||
// range for the repair gun, the user is repaired.
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
// Sounds & feedback effects
|
||||
|
||||
datablock EffectProfile(RepairPackActivateEffect)
|
||||
{
|
||||
effectname = "packs/packs.repairPackOn";
|
||||
minDistance = 2.5;
|
||||
maxDistance = 2.5;
|
||||
};
|
||||
|
||||
datablock EffectProfile(RepairPackFireEffect)
|
||||
{
|
||||
effectname = "packs/repair_use";
|
||||
minDistance = 2.5;
|
||||
maxDistance = 5.0;
|
||||
};
|
||||
|
||||
datablock AudioProfile(RepairPackActivateSound)
|
||||
{
|
||||
filename = "fx/packs/packs.repairPackOn.wav";
|
||||
description = AudioClosest3d;
|
||||
preload = true;
|
||||
effect = RepairPackActivateEffect;
|
||||
};
|
||||
|
||||
datablock AudioProfile(RepairPackFireSound)
|
||||
{
|
||||
filename = "fx/packs/repair_use.wav";
|
||||
description = CloseLooping3d;
|
||||
preload = true;
|
||||
effect = RepairPackFireEffect;
|
||||
};
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
// Projectile
|
||||
|
||||
datablock RepairProjectileData(DefaultRepairBeam)
|
||||
{
|
||||
sound = RepairPackFireSound;
|
||||
|
||||
// JTL
|
||||
beamRange = 250; //10
|
||||
// End JTL
|
||||
beamWidth = 0.15;
|
||||
numSegments = 20;
|
||||
texRepeat = 0.20;
|
||||
blurFreq = 10.0;
|
||||
blurLifetime = 1.0;
|
||||
cutoffAngle = 25.0;
|
||||
|
||||
textures[0] = "special/redbump2";
|
||||
textures[1] = "special/redflare";
|
||||
|
||||
};
|
||||
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
// shapebase datablocks
|
||||
|
||||
datablock ShapeBaseImageData(RepairPackImage)
|
||||
{
|
||||
shapeFile = "pack_upgrade_repair.dts";
|
||||
item = RepairPack;
|
||||
mountPoint = 1;
|
||||
offset = "0 0 0";
|
||||
emap = true;
|
||||
|
||||
gun = RepairGunImage;
|
||||
|
||||
stateName[0] = "Idle";
|
||||
stateTransitionOnTriggerDown[0] = "Activate";
|
||||
|
||||
stateName[1] = "Activate";
|
||||
stateScript[1] = "onActivate";
|
||||
stateSequence[1] = "fire";
|
||||
stateSound[1] = RepairPackActivateSound;
|
||||
stateTransitionOnTriggerUp[1] = "Deactivate";
|
||||
|
||||
stateName[2] = "Deactivate";
|
||||
stateScript[2] = "onDeactivate";
|
||||
stateTransitionOnTimeout[2] = "Idle";
|
||||
};
|
||||
|
||||
datablock ItemData(RepairPack)
|
||||
{
|
||||
className = Pack;
|
||||
catagory = "Packs";
|
||||
shapeFile = "pack_upgrade_repair.dts";
|
||||
mass = 1;
|
||||
elasticity = 0.2;
|
||||
friction = 0.6;
|
||||
pickupRadius = 2;
|
||||
rotate = true;
|
||||
image = "RepairPackImage";
|
||||
pickUpName = "a repair pack";
|
||||
|
||||
lightOnlyStatic = true;
|
||||
lightType = "PulsingLight";
|
||||
lightColor = "1 0 0 1";
|
||||
lightTime = 1200;
|
||||
lightRadius = 4;
|
||||
|
||||
computeCRC = true;
|
||||
emap = true;
|
||||
};
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
// Repair Gun
|
||||
|
||||
datablock ShapeBaseImageData(RepairGunImage)
|
||||
{
|
||||
shapeFile = "weapon_repair.dts";
|
||||
offset = "0 0 0";
|
||||
|
||||
usesEnergy = true;
|
||||
minEnergy = 3;
|
||||
cutOffEnergy = 3.1;
|
||||
emap = true;
|
||||
|
||||
repairFactorPlayer = 0.002; // <--- attention DaveG!
|
||||
repairFactorObject = 0.004; // <--- attention DaveG!
|
||||
|
||||
stateName[0] = "Activate";
|
||||
stateTransitionOnTimeout[0] = "ActivateReady";
|
||||
stateTimeoutValue[0] = 0.25;
|
||||
|
||||
stateName[1] = "ActivateReady";
|
||||
stateScript[1] = "onActivateReady";
|
||||
stateSpinThread[1] = Stop;
|
||||
stateTransitionOnAmmo[1] = "Ready";
|
||||
stateTransitionOnNoAmmo[1] = "ActivateReady";
|
||||
|
||||
stateName[2] = "Ready";
|
||||
stateSpinThread[2] = Stop;
|
||||
stateTransitionOnNoAmmo[2] = "Deactivate";
|
||||
stateTransitionOnTriggerDown[2] = "Validate";
|
||||
|
||||
stateName[3] = "Validate";
|
||||
stateTransitionOnTimeout[3] = "Validate";
|
||||
stateTimeoutValue[3] = 0.2;
|
||||
stateEnergyDrain[3] = 3;
|
||||
stateSpinThread[3] = SpinUp;
|
||||
stateScript[3] = "onValidate";
|
||||
stateIgnoreLoadedForReady[3] = true;
|
||||
stateTransitionOnLoaded[3] = "Repair";
|
||||
stateTransitionOnNoAmmo[3] = "Deactivate";
|
||||
stateTransitionOnTriggerUp[3] = "Deactivate";
|
||||
|
||||
stateName[4] = "Repair";
|
||||
stateSound[4] = RepairPackFireSound;
|
||||
stateScript[4] = "onRepair";
|
||||
stateSpinThread[4] = FullSpeed;
|
||||
stateAllowImageChange[4] = false;
|
||||
stateSequence[4] = "activate";
|
||||
stateFire[4] = true;
|
||||
stateEnergyDrain[4] = 9;
|
||||
stateTimeoutValue[4] = 0.2;
|
||||
stateTransitionOnTimeOut[4] = "Repair";
|
||||
stateTransitionOnNoAmmo[4] = "Deactivate";
|
||||
stateTransitionOnTriggerUp[4] = "Deactivate";
|
||||
stateTransitionOnNotLoaded[4] = "Validate";
|
||||
|
||||
stateName[5] = "Deactivate";
|
||||
stateScript[5] = "onDeactivate";
|
||||
stateSpinThread[5] = SpinDown;
|
||||
stateSequence[5] = "activate";
|
||||
stateDirection[5] = false;
|
||||
stateTimeoutValue[5] = 0.2;
|
||||
stateTransitionOnTimeout[5] = "ActivateReady";
|
||||
};
|
||||
|
||||
function RepairPackImage::onUnmount(%data, %obj, %node)
|
||||
{
|
||||
// dismount the repair gun if the player had it mounted
|
||||
// need the extra "if" statement to avoid a console error message
|
||||
if(%obj.getMountedImage($WeaponSlot))
|
||||
if(%obj.getMountedImage($WeaponSlot).getName() $= "RepairGunImage")
|
||||
%obj.unmountImage($WeaponSlot);
|
||||
// if the player was repairing something when the pack was thrown, stop repairing it
|
||||
if(%obj.repairing != 0)
|
||||
stopRepairing(%obj);
|
||||
}
|
||||
|
||||
function RepairPackImage::onActivate(%data, %obj, %slot)
|
||||
{
|
||||
// don't activate the pack if player is piloting a vehicle
|
||||
messageClient( %obj.triggeredBy.client, 'CloseHud', "", 'scoreScreen' );
|
||||
messageClient( %obj.triggeredBy.client, 'CloseHud', "", 'inventoryScreen' );
|
||||
|
||||
commandToClient(%obj.triggeredBy.client, 'StationVehicleShowHud');
|
||||
|
||||
if(%obj.isPilot())
|
||||
{
|
||||
%obj.setImageTrigger(%slot, false);
|
||||
return;
|
||||
}
|
||||
|
||||
if(!isObject(%obj.getMountedImage($WeaponSlot)) || %obj.getMountedImage($WeaponSlot).getName() !$= "RepairGunImage")
|
||||
{
|
||||
messageClient(%obj.client, 'MsgRepairPackOn', '\c2Repair pack activated.');
|
||||
|
||||
// make sure player's arm thread is "look"
|
||||
%obj.setArmThread(look);
|
||||
|
||||
// mount the repair gun
|
||||
%obj.mountImage(RepairGunImage, $WeaponSlot);
|
||||
// clientCmdsetRepairReticle found in hud.cs
|
||||
commandToClient(%obj.client, 'setRepairReticle');
|
||||
}
|
||||
}
|
||||
|
||||
function RepairPackImage::onDeactivate(%data, %obj, %slot)
|
||||
{
|
||||
//called when the player hits the "pack" key again (toggle)
|
||||
%obj.setImageTrigger(%slot, false);
|
||||
// if repair gun was mounted, unmount it
|
||||
if(%obj.getMountedImage($WeaponSlot).getName() $= "RepairGunImage")
|
||||
%obj.unmountImage($WeaponSlot);
|
||||
}
|
||||
|
||||
function RepairGunImage::onMount(%this,%obj,%slot)
|
||||
{
|
||||
%obj.setImageAmmo(%slot,true);
|
||||
if ( !isDemo() )
|
||||
commandToClient( %obj.client, 'setRepairPackIconOn' );
|
||||
}
|
||||
|
||||
function RepairGunImage::onUnmount(%this,%obj,%slot)
|
||||
{
|
||||
// called when player switches to another weapon
|
||||
|
||||
// stop repairing whatever player was repairing
|
||||
if(%obj.repairing)
|
||||
stopRepairing(%obj);
|
||||
|
||||
%obj.setImageTrigger(%slot, false);
|
||||
// "turn off" the repair pack -- player needs to hit the "pack" key to
|
||||
// activate the repair gun again
|
||||
%obj.setImageTrigger($BackpackSlot, false);
|
||||
if ( !isDemo() )
|
||||
commandToClient( %obj.client, 'setRepairPackIconOff' );
|
||||
}
|
||||
|
||||
function RepairGunImage::onActivateReady(%this,%obj,%slot)
|
||||
{
|
||||
%obj.errMsgSent = false;
|
||||
%obj.selfRepairing = false;
|
||||
%obj.repairing = 0;
|
||||
%obj.setImageLoaded(%slot, false);
|
||||
}
|
||||
|
||||
function RepairGunImage::onValidate(%this,%obj,%slot)
|
||||
{
|
||||
// this = repairgunimage datablock
|
||||
// obj = player wielding the repair gun
|
||||
// slot = weapon slot
|
||||
|
||||
if(%obj.getEnergyLevel() <= %this.cutOffEnergy)
|
||||
{
|
||||
stopRepairing(%obj);
|
||||
return;
|
||||
}
|
||||
%repGun = %obj.getMountedImage(%slot);
|
||||
// muzVec is the vector coming from the repair gun's "muzzle"
|
||||
%muzVec = %obj.getMuzzleVector(%slot);
|
||||
// muzNVec = normalized muzVec
|
||||
%muzNVec = VectorNormalize(%muzVec);
|
||||
%repairRange = DefaultRepairBeam.beamRange;
|
||||
// scale muzNVec to the range the repair beam can reach
|
||||
%muzScaled = VectorScale(%muzNVec, %repairRange);
|
||||
// muzPoint = the actual point of the gun's "muzzle"
|
||||
%muzPoint = %obj.getMuzzlePoint(%slot);
|
||||
// rangeEnd = muzzle point + length of beam
|
||||
%rangeEnd = VectorAdd(%muzPoint, %muzScaled);
|
||||
// search for just about anything that can be damaged as well as interiors
|
||||
%searchMasks = $TypeMasks::PlayerObjectType | $TypeMasks::VehicleObjectType |
|
||||
$TypeMasks::StaticShapeObjectType | $TypeMasks::TurretObjectType | $TypeMasks::InteriorObjectType;
|
||||
// search for objects within the beam's range that fit the masks above
|
||||
%scanTarg = ContainerRayCast(%muzPoint, %rangeEnd, %searchMasks, %obj);
|
||||
// screen out interiors
|
||||
if(%scanTarg && !(%scanTarg.getType() & $TypeMasks::InteriorObjectType))
|
||||
{
|
||||
// a target in range was found
|
||||
%repTgt = firstWord(%scanTarg);
|
||||
// is the prospective target damaged?
|
||||
if(%repTgt.notRepairable)
|
||||
{
|
||||
// this is an object that cant be repaired at all
|
||||
// -- mission specific flag set on the object
|
||||
if(!%obj.errMsgSent)
|
||||
{
|
||||
messageClient(%obj.client, 'MsgRepairPackIrrepairable', '\c2Target is not repairable.', %repTgt);
|
||||
%obj.errMsgSent = true;
|
||||
}
|
||||
// if player was repairing something, stop the repairs -- we're done
|
||||
if(%obj.repairing)
|
||||
stopRepairing(%obj);
|
||||
}
|
||||
else if(%repTgt.getDamageLevel())
|
||||
{
|
||||
// yes, it's damaged
|
||||
if(%repTgt != %obj.repairing)
|
||||
{
|
||||
if(isObject(%obj.repairing))
|
||||
stopRepairing(%obj);
|
||||
|
||||
%obj.repairing = %repTgt;
|
||||
}
|
||||
// setting imageLoaded to true sends us to repair state (function onRepair)
|
||||
%obj.setImageLoaded(%slot, true);
|
||||
}
|
||||
else
|
||||
{
|
||||
// there is a target in range, but it's not damaged
|
||||
if(!%obj.errMsgSent)
|
||||
{
|
||||
// if the target isn't damaged, send a message to that effect only once
|
||||
// JTL - repair ourselves if target is not damaged
|
||||
if(%obj.getDamageLevel()) {
|
||||
if(%obj.repairing != 0)
|
||||
if(%obj.repairing != %obj)
|
||||
stopRepairing(%obj);
|
||||
if(isObject(%obj.repairing))
|
||||
stopRepairing(%obj);
|
||||
|
||||
%obj.repairing = %obj;
|
||||
// quick, to onRepair!
|
||||
%obj.setImageLoaded(%slot, true);
|
||||
return;
|
||||
}
|
||||
else {
|
||||
messageClient(%obj.client, 'MsgRepairPackNotDamaged', '\c2Target is not damaged.', %repTgt);
|
||||
%obj.errMsgSent = true;
|
||||
}
|
||||
}
|
||||
// if player was repairing something, stop the repairs -- we're done
|
||||
if(%obj.repairing)
|
||||
stopRepairing(%obj);
|
||||
}
|
||||
}
|
||||
|
||||
//AI hack - too many things influence the aiming, so I'm going to force the repair object for bots only
|
||||
else if (%obj.client.isAIControlled() && isObject(%obj.client.repairObject))
|
||||
{
|
||||
%repTgt = %obj.client.repairObject;
|
||||
%repPoint = %repTgt.getAIRepairPoint();
|
||||
if (%repPoint $= "0 0 0")
|
||||
%repPoint = %repTgt.getWorldBoxCenter();
|
||||
%repTgtVector = VectorNormalize(VectorSub(%muzPoint, %repPoint));
|
||||
%aimVector = VectorNormalize(VectorSub(%muzPoint, %rangeEnd));
|
||||
|
||||
//if the dot product is very close (ie. we're aiming in the right direction)
|
||||
if (VectorDot(%repTgtVector, %aimVector) > 0.85)
|
||||
{
|
||||
//do an LOS to make sure nothing is in the way...
|
||||
%scanTarg = ContainerRayCast(%muzPoint, %repPoint, %searchMasks, %obj);
|
||||
if (firstWord(%scanTarg) == %repTgt)
|
||||
{
|
||||
// yes, it's damaged
|
||||
|
||||
if(isObject(%obj.repairing))
|
||||
stopRepairing(%obj);
|
||||
|
||||
%obj.repairing = %repTgt;
|
||||
// setting imageLoaded to true sends us to repair state (function onRepair)
|
||||
%obj.setImageLoaded(%slot, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if(%obj.getDamageLevel())
|
||||
{
|
||||
// there is no target in range, but the player is damaged
|
||||
// check to see if we were repairing something before -- if so, stop repairing old target
|
||||
if(%obj.repairing != 0)
|
||||
if(%obj.repairing != %obj)
|
||||
stopRepairing(%obj);
|
||||
if(isObject(%obj.repairing))
|
||||
stopRepairing(%obj);
|
||||
|
||||
%obj.repairing = %obj;
|
||||
// quick, to onRepair!
|
||||
%obj.setImageLoaded(%slot, true);
|
||||
}
|
||||
else
|
||||
{
|
||||
// there is no target in range, and the player isn't damaged
|
||||
if(!%obj.errMsgSent)
|
||||
{
|
||||
// send an error message only once
|
||||
messageClient(%obj.client, 'MsgRepairPackNoTarget', '\c2No target to repair.');
|
||||
%obj.errMsgSent = true;
|
||||
}
|
||||
stopRepairing(%obj);
|
||||
}
|
||||
}
|
||||
|
||||
function RepairGunImage::onRepair(%this,%obj,%slot)
|
||||
{
|
||||
// this = repairgunimage datablock
|
||||
// obj = player wielding the repair gun
|
||||
// slot = weapon slot
|
||||
|
||||
if(%obj.getEnergyLevel() <= %this.cutOffEnergy)
|
||||
{
|
||||
stopRepairing(%obj);
|
||||
return;
|
||||
}
|
||||
// reset the flag that indicates an error message has been sent
|
||||
%obj.errMsgSent = false;
|
||||
%target = %obj.repairing;
|
||||
if(!%target)
|
||||
{
|
||||
// no target -- whoops! never mind
|
||||
stopRepairing(%obj);
|
||||
}
|
||||
else
|
||||
{
|
||||
%target.repairedBy = %obj.client; //keep track of who last repaired this item
|
||||
if(%obj.repairing == %obj)
|
||||
{
|
||||
// player is self-repairing
|
||||
if(%obj.getDamageLevel())
|
||||
{
|
||||
if(!%obj.selfRepairing)
|
||||
{
|
||||
// no need for a projectile, just send a message and up the repair rate
|
||||
messageClient(%obj.client, 'MsgRepairPackPlayerSelfRepair', '\c2Repairing self.');
|
||||
%obj.selfRepairing = true;
|
||||
startRepairing(%obj, true);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
messageClient(%obj.client, 'MsgRepairPackSelfDone', '\c2Repairs completed on self.');
|
||||
stopRepairing(%obj);
|
||||
%obj.errMsgSent = true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// make sure we still have a target -- more vector fun!!!
|
||||
%muzVec = %obj.getMuzzleVector(%slot);
|
||||
%muzNVec = VectorNormalize(%muzVec);
|
||||
%repairRange = DefaultRepairBeam.beamRange;
|
||||
%muzScaled = VectorScale(%muzNVec, %repairRange);
|
||||
%muzPoint = %obj.getMuzzlePoint(%slot);
|
||||
%rangeEnd = VectorAdd(%muzPoint, %muzScaled);
|
||||
|
||||
%searchMasks = $TypeMasks::PlayerObjectType | $TypeMasks::VehicleObjectType |
|
||||
$TypeMasks::StaticShapeObjectType | $TypeMasks::TurretObjectType;
|
||||
|
||||
//AI hack to help "fudge" the repairing stuff...
|
||||
if (%obj.client.isAIControlled() && isObject(%obj.client.repairObject) && %obj.client.repairObject == %obj.repairing)
|
||||
{
|
||||
%repTgt = %obj.client.repairObject;
|
||||
%repPoint = %repTgt.getAIRepairPoint();
|
||||
if (%repPoint $= "0 0 0")
|
||||
%repPoint = %repTgt.getWorldBoxCenter();
|
||||
%repTgtVector = VectorNormalize(VectorSub(%muzPoint, %repPoint));
|
||||
%aimVector = VectorNormalize(VectorSub(%muzPoint, %rangeEnd));
|
||||
|
||||
//if the dot product is very close (ie. we're aiming in the right direction)
|
||||
if (VectorDot(%repTgtVector, %aimVector) > 0.85)
|
||||
%scanTarg = ContainerRayCast(%muzPoint, %repPoint, %searchMasks, %obj);
|
||||
}
|
||||
else
|
||||
%scanTarg = ContainerRayCast(%muzPoint, %rangeEnd, %searchMasks, %obj);
|
||||
|
||||
if (%scanTarg)
|
||||
{
|
||||
%pos = getWords(%scanTarg, 1, 3);
|
||||
%obstructMask = $TypeMasks::InteriorObjectType | $TypeMasks::TerrainObjectType;
|
||||
%obstruction = ContainerRayCast(%muzPoint, %pos, %obstructMask, %obj);
|
||||
if (%obstruction)
|
||||
%scanTarg = "0";
|
||||
}
|
||||
|
||||
if(%scanTarg)
|
||||
{
|
||||
// there's still a target out there
|
||||
%repTgt = firstWord(%scanTarg);
|
||||
// is the target damaged?
|
||||
if(%repTgt.getDamageLevel())
|
||||
{
|
||||
if(%repTgt != %obj.repairing)
|
||||
{
|
||||
// the target is not the same as the one we were just repairing
|
||||
// stop repairing old target, start repairing new target
|
||||
stopRepairing(%obj);
|
||||
if(isObject(%obj.repairing))
|
||||
stopRepairing(%obj);
|
||||
|
||||
%obj.repairing = %repTgt;
|
||||
// extract the name of what player is repairing based on what it is
|
||||
// if it's a player, it's the player's name (duh)
|
||||
// if it's an object, look for a nametag
|
||||
// if object has no nametag, just say what it is (e.g. generatorLarge)
|
||||
if(%repTgt.getClassName() $= Player)
|
||||
%tgtName = getTaggedString(%repTgt.client.name);
|
||||
else if(%repTgt.getGameName() !$= "")
|
||||
%tgtName = %repTgt.getGameName();
|
||||
else
|
||||
%tgtName = %repTgt.getDatablock().getName();
|
||||
messageClient(%obj.client, 'MsgRepairPackRepairingObj', '\c2Repairing %1.', %tgtName, %repTgt);
|
||||
startRepairing(%obj, false);
|
||||
}
|
||||
else
|
||||
{
|
||||
// it's the same target as last time
|
||||
// changed to fix "2 players can't repair same object" bug
|
||||
if(%obj.repairProjectile == 0)
|
||||
{
|
||||
if(%repTgt.getClassName() $= Player)
|
||||
%tgtName = getTaggedString(%repTgt.client.name);
|
||||
else if(%repTgt.getGameName() !$= "")
|
||||
%tgtName = %repTgt.getGameName();
|
||||
else
|
||||
%tgtName = %repTgt.getDatablock().getName();
|
||||
messageClient(%obj.client, 'MsgRepairPackRepairingObj', '\c2Repairing %1.', %tgtName, %repTgt);
|
||||
startRepairing(%obj, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
%rateOfRepair = %this.repairFactorObject;
|
||||
if(%repTgt.getClassName() $= Player)
|
||||
{
|
||||
%tgtName = getTaggedString(%repTgt.client.name);
|
||||
%rateOfRepair = %this.repairFactorPlayer;
|
||||
}
|
||||
else if(%repTgt.getGameName() !$= "")
|
||||
%tgtName = %repTgt.getGameName();
|
||||
else
|
||||
%tgtName = %repTgt.getDatablock().getName();
|
||||
if(%repTgt != %obj.repairing)
|
||||
{
|
||||
// it isn't the same object we were repairing previously
|
||||
messageClient(%obj.client, 'MsgRepairPackNotDamaged', '\c2%1 is not damaged.', %tgtName);
|
||||
}
|
||||
else
|
||||
{
|
||||
// same target, but not damaged -- we must be done
|
||||
messageClient(%obj.client, 'MsgRepairPackDone', '\c2Repairs completed.');
|
||||
Game.objectRepaired(%repTgt, %tgtName);
|
||||
}
|
||||
%obj.errMsgSent = true;
|
||||
stopRepairing(%obj);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// whoops, we lost our target
|
||||
messageClient(%obj.client, 'MsgRepairPackLostTarget', '\c2Repair target no longer in range.');
|
||||
stopRepairing(%obj);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function RepairGunImage::onDeactivate(%this,%obj,%slot)
|
||||
{
|
||||
stopRepairing(%obj);
|
||||
}
|
||||
|
||||
function stopRepairing(%player)
|
||||
{
|
||||
// %player = the player who was using the repair pack
|
||||
|
||||
if(%player.selfRepairing)
|
||||
{
|
||||
// there is no projectile for self-repairing
|
||||
%player.setRepairRate(%player.getRepairRate() - %player.repairingRate);
|
||||
%player.selfRepairing = false;
|
||||
}
|
||||
else if(%player.repairing > 0)
|
||||
{
|
||||
// player was repairing something else
|
||||
//if(%player.repairing.beingRepaired > 0)
|
||||
//{
|
||||
// don't decrement this stuff if it's already at 0 -- though it shouldn't be
|
||||
//%player.repairing.beingRepaired--;
|
||||
%player.repairing.setRepairRate(%player.repairing.getRepairRate() - %player.repairingRate);
|
||||
//}
|
||||
if(%player.repairProjectile > 0)
|
||||
{
|
||||
// is there a repair projectile? delete it
|
||||
%player.repairProjectile.delete();
|
||||
%player.repairProjectile = 0;
|
||||
}
|
||||
}
|
||||
%player.repairing = 0;
|
||||
%player.repairingRate = 0;
|
||||
%player.setImageTrigger($WeaponSlot, false);
|
||||
%player.setImageLoaded($WeaponSlot, false);
|
||||
}
|
||||
|
||||
function startRepairing(%player, %self)
|
||||
{
|
||||
// %player = the player who was using the repair pack
|
||||
// %self = boolean -- is player repairing him/herself?
|
||||
|
||||
if(%self)
|
||||
{
|
||||
// one repair, hold the projectile
|
||||
%player.setRepairRate(%player.getRepairRate() + RepairGunImage.repairFactorPlayer);
|
||||
%player.selfRepairing = true;
|
||||
%player.repairingRate = RepairGunImage.repairFactorPlayer;
|
||||
}
|
||||
else
|
||||
{
|
||||
//if(%player.repairing.beingRepaired $= "")
|
||||
// %player.repairing.beingRepaired = 1;
|
||||
//else
|
||||
// %player.repairing.beingRepaired++;
|
||||
|
||||
//AI hack...
|
||||
if (%player.client.isAIControlled() && %player.client.repairObject == %player.repairing)
|
||||
{
|
||||
%initialPosition = %player.getMuzzlePoint($WeaponSlot);
|
||||
%initialDirection = VectorSub(%initialPosition, %player.repairing.getWorldBoxCenter());
|
||||
}
|
||||
else
|
||||
{
|
||||
%initialDirection = %player.getMuzzleVector($WeaponSlot);
|
||||
%initialPosition = %player.getMuzzlePoint($WeaponSlot);
|
||||
}
|
||||
if(%player.repairing.getClassName() $= Player)
|
||||
%repRate = RepairGunImage.repairFactorPlayer;
|
||||
else
|
||||
%repRate = RepairGunImage.repairFactorObject;
|
||||
%player.repairing.setRepairRate(%player.repairing.getRepairRate() + %repRate);
|
||||
|
||||
%player.repairingRate = %repRate;
|
||||
%player.repairProjectile = new RepairProjectile() {
|
||||
dataBlock = DefaultRepairBeam;
|
||||
initialDirection = %initialDirection;
|
||||
initialPosition = %initialPosition;
|
||||
sourceObject = %player;
|
||||
sourceSlot = $WeaponSlot;
|
||||
targetObject = %player.repairing;
|
||||
};
|
||||
MissionCleanup.add(%player.repairProjectile);
|
||||
}
|
||||
}
|
||||
|
||||
function RepairPack::onPickup(%this, %obj, %shape, %amount)
|
||||
{
|
||||
// created to prevent console errors
|
||||
}
|
||||
758
scripts/packs/satchelCharge.cs
Normal file
758
scripts/packs/satchelCharge.cs
Normal file
|
|
@ -0,0 +1,758 @@
|
|||
//--------------------------------------------------------------------------
|
||||
// Satchel Charge pack
|
||||
// can be used by any armor type
|
||||
// when activated, throws the pack -- when activated again (before
|
||||
// picking up another pack), detonates with a BIG explosion.
|
||||
|
||||
// Set up defaults for nonexisting vars
|
||||
|
||||
$SatchelChargeMultiplier = 1;
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
// Sounds
|
||||
|
||||
datablock EffectProfile(SatchelChargeActivateEffect)
|
||||
{
|
||||
effectname = "packs/satchel_pack_activate";
|
||||
minDistance = 2.5;
|
||||
maxDistance = 2.5;
|
||||
};
|
||||
|
||||
datablock EffectProfile(SatchelChargeExplosionEffect)
|
||||
{
|
||||
effectname = "packs/satchel_pack_detonate";
|
||||
minDistance = 2.5;
|
||||
maxDistance = 5.0;
|
||||
};
|
||||
|
||||
datablock EffectProfile(SatchelChargePreExplosionEffect)
|
||||
{
|
||||
effectname = "explosions/explosion.xpl03";
|
||||
minDistance = 10.0;
|
||||
maxDistance = 30.0;
|
||||
};
|
||||
|
||||
datablock AudioProfile(SatchelChargeActivateSound)
|
||||
{
|
||||
filename = "fx/packs/satchel_pack_activate.wav";
|
||||
description = AudioClose3d;
|
||||
preload = true;
|
||||
effect = SatchelChargeActivateEffect;
|
||||
};
|
||||
|
||||
datablock AudioProfile(SatchelChargeExplosionSound)
|
||||
{
|
||||
filename = "fx/packs/satchel_pack_detonate.wav";
|
||||
description = AudioBIGExplosion3d;
|
||||
preload = true;
|
||||
effect = SatchelChargeExplosionEffect;
|
||||
};
|
||||
|
||||
datablock AudioProfile(SatchelChargePreExplosionSound)
|
||||
{
|
||||
filename = "fx/explosions/explosion.xpl03.wav";
|
||||
description = AudioBIGExplosion3d;
|
||||
preload = true;
|
||||
effect = SatchelChargePreExplosionEffect;
|
||||
};
|
||||
|
||||
datablock AudioProfile(UnderwaterSatchelChargeExplosionSound)
|
||||
{
|
||||
filename = "fx/weapons/mortar_explode_UW.wav";
|
||||
description = AudioBIGExplosion3d;
|
||||
preload = true;
|
||||
effect = SatchelChargeExplosionEffect;
|
||||
};
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
// Satchel Debris
|
||||
//----------------------------------------------------------------------------
|
||||
datablock ParticleData( SDebrisSmokeParticle )
|
||||
{
|
||||
dragCoeffiecient = 1.0;
|
||||
gravityCoefficient = 0.0;
|
||||
inheritedVelFactor = 0.2;
|
||||
|
||||
lifetimeMS = 1000;
|
||||
lifetimeVarianceMS = 100;
|
||||
|
||||
textureName = "particleTest";
|
||||
|
||||
useInvAlpha = true;
|
||||
|
||||
spinRandomMin = -60.0;
|
||||
spinRandomMax = 60.0;
|
||||
|
||||
colors[0] = "0.4 0.4 0.4 1.0";
|
||||
colors[1] = "0.3 0.3 0.3 0.5";
|
||||
colors[2] = "0.0 0.0 0.0 0.0";
|
||||
sizes[0] = 0.0;
|
||||
sizes[1] = 2.0;
|
||||
sizes[2] = 3.0;
|
||||
times[0] = 0.0;
|
||||
times[1] = 0.5;
|
||||
times[2] = 1.0;
|
||||
};
|
||||
|
||||
datablock ParticleEmitterData( SDebrisSmokeEmitter )
|
||||
{
|
||||
ejectionPeriodMS = 7;
|
||||
periodVarianceMS = 1;
|
||||
|
||||
ejectionVelocity = 1.0; // A little oomph at the back end
|
||||
velocityVariance = 0.2;
|
||||
|
||||
thetaMin = 0.0;
|
||||
thetaMax = 40.0;
|
||||
|
||||
particles = "SDebrisSmokeParticle";
|
||||
};
|
||||
|
||||
|
||||
datablock DebrisData( SatchelDebris )
|
||||
{
|
||||
emitters[0] = SDebrisSmokeEmitter;
|
||||
|
||||
explodeOnMaxBounce = true;
|
||||
|
||||
elasticity = 0.4;
|
||||
friction = 0.2;
|
||||
|
||||
lifetime = 0.3;
|
||||
lifetimeVariance = 0.02;
|
||||
};
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
// Bubbles
|
||||
//----------------------------------------------------------------------------
|
||||
datablock ParticleData(SatchelBubbleParticle)
|
||||
{
|
||||
dragCoefficient = 0.0;
|
||||
gravityCoefficient = -0.25;
|
||||
inheritedVelFactor = 0.0;
|
||||
constantAcceleration = 0.0;
|
||||
lifetimeMS = 1500;
|
||||
lifetimeVarianceMS = 600;
|
||||
useInvAlpha = false;
|
||||
textureName = "special/bubbles";
|
||||
|
||||
spinRandomMin = -100.0;
|
||||
spinRandomMax = 100.0;
|
||||
|
||||
colors[0] = "0.7 0.8 1.0 0.0";
|
||||
colors[1] = "0.7 0.8 1.0 0.4";
|
||||
colors[2] = "0.7 0.8 1.0 0.0";
|
||||
sizes[0] = 2.0;
|
||||
sizes[1] = 2.0;
|
||||
sizes[2] = 2.0;
|
||||
times[0] = 0.0;
|
||||
times[1] = 0.8;
|
||||
times[2] = 1.0;
|
||||
};
|
||||
|
||||
datablock ParticleEmitterData(SatchelBubbleEmitter)
|
||||
{
|
||||
ejectionPeriodMS = 10;
|
||||
periodVarianceMS = 0;
|
||||
ejectionVelocity = 1.0;
|
||||
ejectionOffset = 7.0;
|
||||
velocityVariance = 0.5;
|
||||
thetaMin = 0;
|
||||
thetaMax = 80;
|
||||
phiReferenceVel = 0;
|
||||
phiVariance = 360;
|
||||
overrideAdvances = false;
|
||||
particles = "MortarExplosionBubbleParticle";
|
||||
};
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
// Satchel Explosion Particle effects
|
||||
//--------------------------------------
|
||||
datablock ParticleData(SatchelExplosionSmoke)
|
||||
{
|
||||
dragCoeffiecient = 0.4;
|
||||
gravityCoefficient = -0.0; // rises slowly
|
||||
inheritedVelFactor = 0.025;
|
||||
|
||||
lifetimeMS = 2000;
|
||||
lifetimeVarianceMS = 0;
|
||||
|
||||
textureName = "particleTest";
|
||||
|
||||
useInvAlpha = true;
|
||||
spinRandomMin = -200.0;
|
||||
spinRandomMax = 200.0;
|
||||
|
||||
textureName = "special/Smoke/smoke_001";
|
||||
|
||||
colors[0] = "1.0 0.7 0.0 1.0";
|
||||
colors[1] = "0.2 0.2 0.2 0.5";
|
||||
colors[2] = "0.0 0.0 0.0 0.0";
|
||||
sizes[0] = 7.0;
|
||||
sizes[1] = 17.0;
|
||||
sizes[2] = 2.0;
|
||||
times[0] = 0.0;
|
||||
times[1] = 0.4;
|
||||
times[2] = 1.0;
|
||||
};
|
||||
|
||||
datablock ParticleEmitterData(SatchelExplosionSmokeEmitter)
|
||||
{
|
||||
ejectionPeriodMS = 10;
|
||||
periodVarianceMS = 0;
|
||||
|
||||
ejectionVelocity = 14.25;
|
||||
velocityVariance = 2.25;
|
||||
|
||||
thetaMin = 0.0;
|
||||
thetaMax = 180.0;
|
||||
|
||||
lifetimeMS = 200;
|
||||
|
||||
particles = "SatchelExplosionSmoke";
|
||||
};
|
||||
|
||||
datablock ParticleData(UnderwaterSatchelExplosionSmoke)
|
||||
{
|
||||
dragCoeffiecient = 105.0;
|
||||
gravityCoefficient = -0.0;
|
||||
inheritedVelFactor = 0.025;
|
||||
|
||||
constantAcceleration = -1.0;
|
||||
|
||||
lifetimeMS = 1500;
|
||||
lifetimeVarianceMS = 0;
|
||||
|
||||
textureName = "particleTest";
|
||||
|
||||
useInvAlpha = false;
|
||||
spinRandomMin = -200.0;
|
||||
spinRandomMax = 200.0;
|
||||
|
||||
textureName = "special/Smoke/smoke_001";
|
||||
|
||||
colors[0] = "0.4 0.4 1.0 1.0";
|
||||
colors[1] = "0.4 0.4 1.0 0.5";
|
||||
colors[2] = "0.0 0.0 0.0 0.0";
|
||||
sizes[0] = 7.0;
|
||||
sizes[1] = 17.0;
|
||||
sizes[2] = 2.0;
|
||||
times[0] = 0.0;
|
||||
times[1] = 0.2;
|
||||
times[2] = 1.0;
|
||||
};
|
||||
|
||||
datablock ParticleEmitterData(UnderwaterSatchelExplosionSmokeEmitter)
|
||||
{
|
||||
ejectionPeriodMS = 10;
|
||||
periodVarianceMS = 0;
|
||||
|
||||
ejectionVelocity = 14.25;
|
||||
velocityVariance = 2.25;
|
||||
|
||||
thetaMin = 0.0;
|
||||
thetaMax = 180.0;
|
||||
|
||||
lifetimeMS = 200;
|
||||
|
||||
particles = "UnderwaterSatchelExplosionSmoke";
|
||||
};
|
||||
|
||||
|
||||
datablock ParticleData(SatchelSparks)
|
||||
{
|
||||
dragCoefficient = 1;
|
||||
gravityCoefficient = 0.0;
|
||||
inheritedVelFactor = 0.2;
|
||||
constantAcceleration = 0.0;
|
||||
lifetimeMS = 500;
|
||||
lifetimeVarianceMS = 150;
|
||||
textureName = "special/bigSpark";
|
||||
colors[0] = "0.56 0.36 0.26 1.0";
|
||||
colors[1] = "0.56 0.36 0.26 1.0";
|
||||
colors[2] = "1.0 0.36 0.26 0.0";
|
||||
sizes[0] = 0.5;
|
||||
sizes[1] = 0.5;
|
||||
sizes[2] = 0.75;
|
||||
times[0] = 0.0;
|
||||
times[1] = 0.5;
|
||||
times[2] = 1.0;
|
||||
|
||||
};
|
||||
|
||||
datablock ParticleEmitterData(SatchelSparksEmitter)
|
||||
{
|
||||
ejectionPeriodMS = 1;
|
||||
periodVarianceMS = 0;
|
||||
ejectionVelocity = 40;
|
||||
velocityVariance = 20.0;
|
||||
ejectionOffset = 0.0;
|
||||
thetaMin = 0;
|
||||
thetaMax = 180;
|
||||
phiReferenceVel = 0;
|
||||
phiVariance = 360;
|
||||
overrideAdvances = false;
|
||||
orientParticles = true;
|
||||
lifetimeMS = 200;
|
||||
particles = "SatchelSparks";
|
||||
};
|
||||
|
||||
datablock ParticleData(UnderwaterSatchelSparks)
|
||||
{
|
||||
dragCoefficient = 1;
|
||||
gravityCoefficient = 0.0;
|
||||
inheritedVelFactor = 0.2;
|
||||
constantAcceleration = 0.0;
|
||||
lifetimeMS = 500;
|
||||
lifetimeVarianceMS = 350;
|
||||
textureName = "special/underwaterSpark";
|
||||
colors[0] = "0.6 0.6 1.0 1.0";
|
||||
colors[1] = "0.6 0.6 1.0 1.0";
|
||||
colors[2] = "0.6 0.6 1.0 0.0";
|
||||
sizes[0] = 0.5;
|
||||
sizes[1] = 0.5;
|
||||
sizes[2] = 0.75;
|
||||
times[0] = 0.0;
|
||||
times[1] = 0.5;
|
||||
times[2] = 1.0;
|
||||
|
||||
};
|
||||
|
||||
datablock ParticleEmitterData(UnderwaterSatchelSparksEmitter)
|
||||
{
|
||||
ejectionPeriodMS = 2;
|
||||
periodVarianceMS = 0;
|
||||
ejectionVelocity = 30;
|
||||
velocityVariance = 5.0;
|
||||
ejectionOffset = 0.0;
|
||||
thetaMin = 0;
|
||||
thetaMax = 70;
|
||||
phiReferenceVel = 0;
|
||||
phiVariance = 360;
|
||||
overrideAdvances = false;
|
||||
orientParticles = true;
|
||||
lifetimeMS = 100;
|
||||
particles = "UnderwaterSatchelSparks";
|
||||
};
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// Explosion
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
datablock ExplosionData(SatchelSubExplosion)
|
||||
{
|
||||
explosionShape = "disc_explosion.dts";
|
||||
faceViewer = true;
|
||||
explosionScale = "0.5 0.5 0.5";
|
||||
|
||||
debris = SatchelDebris;
|
||||
debrisThetaMin = 10;
|
||||
debrisThetaMax = 80;
|
||||
debrisNum = 8;
|
||||
debrisVelocity = 60.0;
|
||||
debrisVelocityVariance = 15.0;
|
||||
|
||||
lifetimeMS = 1000;
|
||||
delayMS = 0;
|
||||
|
||||
emitter[0] = SatchelExplosionSmokeEmitter;
|
||||
emitter[1] = SatchelSparksEmitter;
|
||||
|
||||
offset = 0.0;
|
||||
|
||||
playSpeed = 1.5;
|
||||
|
||||
sizes[0] = "1.5 1.5 1.5";
|
||||
sizes[1] = "3.0 3.0 3.0";
|
||||
times[0] = 0.0;
|
||||
times[1] = 1.0;
|
||||
};
|
||||
|
||||
datablock ExplosionData(SatchelSubExplosion2)
|
||||
{
|
||||
explosionShape = "disc_explosion.dts";
|
||||
faceViewer = true;
|
||||
explosionScale = "0.7 0.7 0.7";
|
||||
|
||||
debris = SatchelDebris;
|
||||
debrisThetaMin = 10;
|
||||
debrisThetaMax = 170;
|
||||
debrisNum = 8;
|
||||
debrisVelocity = 60.0;
|
||||
debrisVelocityVariance = 15.0;
|
||||
|
||||
lifetimeMS = 1000;
|
||||
delayMS = 50;
|
||||
|
||||
emitter[0] = SatchelExplosionSmokeEmitter;
|
||||
emitter[1] = SatchelSparksEmitter;
|
||||
|
||||
offset = 9.0;
|
||||
|
||||
playSpeed = 1.5;
|
||||
|
||||
sizes[0] = "1.5 1.5 1.5";
|
||||
sizes[1] = "1.5 1.5 1.5";
|
||||
times[0] = 0.0;
|
||||
times[1] = 1.0;
|
||||
};
|
||||
|
||||
datablock ExplosionData(SatchelSubExplosion3)
|
||||
{
|
||||
explosionShape = "disc_explosion.dts";
|
||||
faceViewer = true;
|
||||
explosionScale = "1.0 1.0 1.0";
|
||||
|
||||
debris = SatchelDebris;
|
||||
debrisThetaMin = 10;
|
||||
debrisThetaMax = 170;
|
||||
debrisNum = 8;
|
||||
debrisVelocity = 60.0;
|
||||
debrisVelocityVariance = 15.0;
|
||||
|
||||
lifetimeMS = 2000;
|
||||
delayMS = 100;
|
||||
|
||||
emitter[0] = SatchelExplosionSmokeEmitter;
|
||||
emitter[1] = SatchelSparksEmitter;
|
||||
|
||||
offset = 9.0;
|
||||
|
||||
playSpeed = 2.5;
|
||||
|
||||
sizes[0] = "1.0 1.0 1.0";
|
||||
sizes[1] = "1.0 1.0 1.0";
|
||||
times[0] = 0.0;
|
||||
times[1] = 1.0;
|
||||
};
|
||||
|
||||
datablock ExplosionData(SatchelMainExplosion)
|
||||
{
|
||||
soundProfile = SatchelChargePreExplosionSound;
|
||||
|
||||
subExplosion[0] = SatchelSubExplosion;
|
||||
subExplosion[1] = SatchelSubExplosion2;
|
||||
subExplosion[2] = SatchelSubExplosion3;
|
||||
};
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// Underwater Explosion
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
datablock ExplosionData(UnderwaterSatchelSubExplosion)
|
||||
{
|
||||
explosionShape = "disc_explosion.dts";
|
||||
faceViewer = true;
|
||||
explosionScale = "0.5 0.5 0.5";
|
||||
|
||||
|
||||
lifetimeMS = 1000;
|
||||
delayMS = 0;
|
||||
|
||||
emitter[0] = UnderwaterSatchelExplosionSmokeEmitter;
|
||||
emitter[1] = UnderwaterSatchelSparksEmitter;
|
||||
emitter[2] = SatchelBubbleEmitter;
|
||||
|
||||
offset = 0.0;
|
||||
|
||||
playSpeed = 0.75;
|
||||
|
||||
sizes[0] = "1.5 1.5 1.5";
|
||||
sizes[1] = "2.5 2.5 2.5";
|
||||
sizes[2] = "2.0 2.0 2.0";
|
||||
times[0] = 0.0;
|
||||
times[1] = 0.5;
|
||||
times[2] = 1.0;
|
||||
};
|
||||
|
||||
datablock ExplosionData(UnderwaterSatchelSubExplosion2)
|
||||
{
|
||||
explosionShape = "disc_explosion.dts";
|
||||
faceViewer = true;
|
||||
explosionScale = "0.7 0.7 0.7";
|
||||
|
||||
|
||||
lifetimeMS = 1000;
|
||||
delayMS = 50;
|
||||
|
||||
emitter[0] = UnderwaterSatchelExplosionSmokeEmitter;
|
||||
emitter[1] = UnderwaterSatchelSparksEmitter;
|
||||
emitter[2] = SatchelBubbleEmitter;
|
||||
|
||||
offset = 9.0;
|
||||
|
||||
playSpeed = 0.75;
|
||||
|
||||
sizes[0] = "1.5 1.5 1.5";
|
||||
sizes[1] = "1.0 1.0 1.0";
|
||||
sizes[2] = "0.75 0.75 0.75";
|
||||
times[0] = 0.0;
|
||||
times[1] = 0.5;
|
||||
times[2] = 1.0;
|
||||
};
|
||||
|
||||
datablock ExplosionData(UnderwaterSatchelSubExplosion3)
|
||||
{
|
||||
explosionShape = "disc_explosion.dts";
|
||||
faceViewer = true;
|
||||
explosionScale = "1.0 1.0 1.0";
|
||||
|
||||
|
||||
lifetimeMS = 2000;
|
||||
delayMS = 100;
|
||||
|
||||
emitter[0] = UnderwaterSatchelExplosionSmokeEmitter;
|
||||
emitter[1] = UnderwaterSatchelSparksEmitter;
|
||||
emitter[2] = SatchelBubbleEmitter;
|
||||
|
||||
offset = 9.0;
|
||||
|
||||
playSpeed = 1.25;
|
||||
|
||||
sizes[0] = "1.0 1.0 1.0";
|
||||
sizes[1] = "1.0 1.0 1.0";
|
||||
sizes[2] = "0.5 0.5 0.5";
|
||||
times[0] = 0.0;
|
||||
times[1] = 0.5;
|
||||
times[2] = 1.0;
|
||||
};
|
||||
|
||||
datablock ExplosionData(UnderwaterSatchelMainExplosion)
|
||||
{
|
||||
soundProfile = UnderwaterSatchelChargeExplosionSound;
|
||||
|
||||
subExplosion[0] = UnderwaterSatchelSubExplosion;
|
||||
subExplosion[1] = UnderwaterSatchelSubExplosion2;
|
||||
subExplosion[2] = UnderwaterSatchelSubExplosion3;
|
||||
};
|
||||
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
// Projectile
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
// shapebase datablocks
|
||||
datablock ShapeBaseImageData(SatchelChargeImage)
|
||||
{
|
||||
shapeFile = "pack_upgrade_satchel.dts";
|
||||
item = SatchelCharge;
|
||||
mountPoint = 1;
|
||||
offset = "0 0 0";
|
||||
emap = true;
|
||||
};
|
||||
|
||||
datablock ItemData(SatchelCharge)
|
||||
{
|
||||
className = Pack;
|
||||
catagory = "Packs";
|
||||
image = SatchelChargeImage;
|
||||
shapeFile = "pack_upgrade_satchel.dts";
|
||||
mass = 1;
|
||||
elasticity = 0.2;
|
||||
friction = 0.6;
|
||||
pickupRadius = 2;
|
||||
rotate = true;
|
||||
pickUpName = "a satchel charge pack";
|
||||
|
||||
computeCRC = true;
|
||||
};
|
||||
|
||||
datablock ItemData(SatchelChargeThrown)
|
||||
{
|
||||
shapeFile = "pack_upgrade_satchel.dts";
|
||||
explosion = SatchelMainExplosion;
|
||||
underwaterExplosion = UnderwaterSatchelMainExplosion;
|
||||
mass = 1;
|
||||
elasticity = 0.1;
|
||||
friction = 0.9;
|
||||
rotate = false;
|
||||
pickupRadius = 0;
|
||||
noTimeout = true;
|
||||
armDelay = 3000;
|
||||
maxDamage = 0.6;
|
||||
|
||||
kickBackStrength = 4000;
|
||||
|
||||
computeCRC = true;
|
||||
};
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
|
||||
function SatchelCharge::onUse(%this, %obj)
|
||||
{
|
||||
if (!$Host::SatchelChargeEnabled) {
|
||||
if ($Host::Purebuild == 1)
|
||||
messageAll('msgClient','\c2%1 just tried to drop a Satchel Charge!',%obj.client.name);
|
||||
else
|
||||
messageTeam(%obj.client.team,'msgClient','\c2%1 just tried to drop a Satchel Charge!',%obj.client.name);
|
||||
%obj.decInventory(SatchelCharge, 1);
|
||||
return;
|
||||
}
|
||||
if ($Host::Purebuild == 1)
|
||||
messageAll('msgClient','\c2%1 just dropped a Satchel Charge!',%obj.client.name);
|
||||
else
|
||||
messageTeam(%obj.client.team,'msgClient','\c2%1 just dropped a Satchel Charge!',%obj.client.name);
|
||||
%item = new Item() {
|
||||
dataBlock = SatchelChargeThrown;
|
||||
rotation = "0 0 1 " @ (getRandom() * 360);
|
||||
scale = $SatchelChargeMultiplier SPC $SatchelChargeMultiplier SPC $SatchelChargeMultiplier;
|
||||
};
|
||||
MissionCleanup.add(%item);
|
||||
// take pack out of inventory and unmount image
|
||||
%obj.decInventory(SatchelCharge, 1);
|
||||
%obj.throwObject(%item);
|
||||
//error("throwing satchel charge #" @ %item);
|
||||
%obj.thrownChargeId = %item;
|
||||
%item.sourceObject = %obj;
|
||||
%item.armed = false;
|
||||
%item.damaged = 0.0;
|
||||
%item.thwart = false;
|
||||
// arm itself 3 seconds after being thrown
|
||||
schedule(%item.getDatablock().armDelay, %item, "initArmSatchelCharge", %item);
|
||||
messageClient(%obj.client, 'MsgSatchelChargePlaced', "\c2Satchel charge deployed.");
|
||||
}
|
||||
|
||||
function initArmSatchelCharge(%satchel)
|
||||
{
|
||||
// "deet deet deet" sound
|
||||
%satchel.playAudio(1, SatchelChargeActivateSound);
|
||||
// also need to play "antenna extending" animation
|
||||
%satchel.playThread(0, "deploy");
|
||||
%satchel.playThread(1, "activate");
|
||||
|
||||
// delay the actual arming until after sound is done playing
|
||||
schedule( 2200, 0, "armSatchelCharge", %satchel );
|
||||
}
|
||||
|
||||
function armSatchelCharge(%satchel)
|
||||
{
|
||||
%satchel.armed = true;
|
||||
commandToClient( %satchel.sourceObject.client, 'setSatchelArmed' );
|
||||
}
|
||||
|
||||
function detonateSatchelCharge(%player)
|
||||
{
|
||||
%satchelCharge = %player.thrownChargeId;
|
||||
// can't detonate the satchel charge if it isn't armed
|
||||
if(!%satchelCharge.armed)
|
||||
return;
|
||||
|
||||
//error("Detonating satchel charge #" @ %satchelCharge @ " for player #" @ %player);
|
||||
|
||||
if(%satchelCharge.getDamageState() !$= Destroyed)
|
||||
{
|
||||
%satchelCharge.setDamageState(Destroyed);
|
||||
%satchelCharge.blowup();
|
||||
}
|
||||
|
||||
// Clear the player's HUD:
|
||||
if (isObject(%player.client))
|
||||
%player.client.clearBackpackIcon();
|
||||
}
|
||||
|
||||
function SatchelChargeThrown::onEnterLiquid(%data, %obj, %coverage, %type)
|
||||
{
|
||||
// lava types
|
||||
if(%type >=4 && %type <= 6)
|
||||
{
|
||||
if(%obj.getDamageState() !$= "Destroyed")
|
||||
{
|
||||
%obj.armed = true;
|
||||
detonateSatchelCharge(%obj.sourceObject);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// quickSand
|
||||
if(%type == 7)
|
||||
if(isObject(%obj.sourceObject))
|
||||
%obj.sourceObject.thrownChargeId = 0;
|
||||
|
||||
Parent::onEnterLiquid(%data, %obj, %coverage, %type);
|
||||
}
|
||||
|
||||
function SatchelChargeImage::onMount(%data, %obj, %node)
|
||||
{
|
||||
%obj.thrownChargeId = 0;
|
||||
}
|
||||
|
||||
function SatchelChargeImage::onUnmount(%data, %obj, %node)
|
||||
{
|
||||
}
|
||||
|
||||
function SatchelChargeThrown::onDestroyed(%this, %object, %lastState)
|
||||
{
|
||||
if(%object.kaboom)
|
||||
return;
|
||||
else
|
||||
{
|
||||
%object.kaboom = true;
|
||||
|
||||
// the "thwart" flag is set if the charge is destroyed with weapons rather
|
||||
// than detonated. A less damaging explosion, but visually the same scale.
|
||||
if(%object.thwart)
|
||||
{
|
||||
messageClient(%object.sourceObject.client, 'msgSatchelChargeDetonate', "\c2Satchel charge destroyed.");
|
||||
%dmgRadius = 10 * $SatchelChargeMultiplier;
|
||||
%dmgMod = 0.3 * $SatchelChargeMultiplier;
|
||||
%expImpulse = limitSatchelImpulse(1000 * $SatchelChargeMultiplier);
|
||||
%dmgType = $DamageType::Explosion;
|
||||
}
|
||||
else
|
||||
{
|
||||
messageClient(%object.sourceObject.client, 'msgSatchelChargeDetonate', "\c2Satchel charge detonated!");
|
||||
%dmgRadius = 20 * $SatchelChargeMultiplier;
|
||||
%dmgMod = 1.0 * $SatchelChargeMultiplier;
|
||||
%expImpulse = limitSatchelImpulse(2500 * $SatchelChargeMultiplier);
|
||||
%dmgType = $DamageType::SatchelCharge;
|
||||
}
|
||||
|
||||
%object.blowingUp = true;
|
||||
RadiusExplosion(%object, %object.getPosition(), %dmgRadius, %dmgMod, %expImpulse, %object.sourceObject, %dmgType);
|
||||
|
||||
%object.schedule(1000, "delete");
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------
|
||||
// z0dd - ZOD, 5/8/02. Addition. Satchel bug fix. Prior to fix,
|
||||
// clients couldn't pick up packs when satchel was destroyed from dmg.
|
||||
if(isObject(%object.sourceObject))
|
||||
%object.sourceObject.thrownChargeId = 0;
|
||||
}
|
||||
|
||||
function SatchelChargeThrown::onCollision(%data,%obj,%col)
|
||||
{
|
||||
// Do nothing...
|
||||
}
|
||||
|
||||
function SatchelChargeThrown::damageObject(%data, %targetObject, %sourceObject, %position, %amount, %damageType)
|
||||
{
|
||||
if (!%object.blowingUp)
|
||||
{
|
||||
%targetObject.damaged += %amount;
|
||||
|
||||
if(%targetObject.damaged >= %targetObject.getDataBlock().maxDamage &&
|
||||
%targetObject.getDamageState() !$= Destroyed)
|
||||
{
|
||||
%targetObject.thwart = true;
|
||||
%targetObject.setDamageState(Destroyed);
|
||||
%targetObject.blowup();
|
||||
|
||||
// clear the player's HUD:
|
||||
if (isObject(%targetObject.sourceObject.client))
|
||||
%targetObject.sourceObject.client.clearBackPackIcon();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function SatchelCharge::onPickup(%this, %obj, %shape, %amount)
|
||||
{
|
||||
// created to prevent console errors
|
||||
}
|
||||
|
||||
function limitSatchelImpulse(%val) {
|
||||
if (%val > 50000)
|
||||
%val = 50000;
|
||||
return %val;
|
||||
}
|
||||
143
scripts/packs/solarpanel.cs
Normal file
143
scripts/packs/solarpanel.cs
Normal file
|
|
@ -0,0 +1,143 @@
|
|||
//--------------------------------------------------------------------------
|
||||
// Deployable Solar Panel
|
||||
//--------------------------------------------------------------------------
|
||||
|
||||
datablock ShapeBaseImageData(SolarPanelDeployableImage) {
|
||||
mass = 1;
|
||||
emap = true;
|
||||
shapeFile = "stackable1s.dts";
|
||||
item = SolarPanelDeployable;
|
||||
mountPoint = 1;
|
||||
offset = "0 0 0";
|
||||
deployed = SolarPanel;
|
||||
heatSignature = 0;
|
||||
|
||||
stateName[0] = "Idle";
|
||||
stateTransitionOnTriggerDown[0] = "Activate";
|
||||
|
||||
stateName[1] = "Activate";
|
||||
stateScript[1] = "onActivate";
|
||||
stateTransitionOnTriggerUp[1] = "Idle";
|
||||
|
||||
isLarge = true;
|
||||
maxDepSlope = 360;
|
||||
deploySound = ItemPickupSound;
|
||||
|
||||
minDeployDis = 1.5;
|
||||
maxDeployDis = 5;
|
||||
};
|
||||
|
||||
datablock ItemData(SolarPanelDeployable) {
|
||||
className = Pack;
|
||||
catagory = "Deployables";
|
||||
shapeFile = "stackable1s.dts";
|
||||
mass = 1;
|
||||
|
||||
hasLight = true;
|
||||
lightType = "PulsingLight";
|
||||
lightColor = "0.1 0.8 0.8 1.0";
|
||||
lightTime = "1000";
|
||||
lightRadius = "3";
|
||||
|
||||
elasticity = 0.2;
|
||||
friction = 0.6;
|
||||
pickupRadius = 3;
|
||||
rotate = true;
|
||||
image = "SolarPanelDeployableImage";
|
||||
pickUpName = "a solar panel pack";
|
||||
heatSignature = 0;
|
||||
emap = true;
|
||||
};
|
||||
|
||||
function SolarPanelDeployableImage::testNoTerrainFound(%item) {
|
||||
// don't check this for non-Landspike turret deployables
|
||||
}
|
||||
|
||||
function SolarPanelDeployable::onPickup(%this, %obj, %shape, %amount) {
|
||||
// created to prevent console errors
|
||||
}
|
||||
|
||||
function SolarPanelDeployableImage::onDeploy(%item, %plyr, %slot) {
|
||||
%className = "StaticShape";
|
||||
|
||||
%playerVector = vectorNormalize(getWord(%plyr.getEyeVector(),1) SPC -1 * getWord(%plyr.getEyeVector(),0) SPC "0");
|
||||
|
||||
if (vAbs(floorVec(%item.surfaceNrm,100)) $= "0 0 1")
|
||||
%item.surfaceNrm2 = %playerVector;
|
||||
else
|
||||
%item.surfaceNrm2 = vectorNormalize(vectorCross(%item.surfaceNrm,"0 0 -1"));
|
||||
|
||||
%rot = fullRot(%item.surfaceNrm,%item.surfaceNrm2);
|
||||
|
||||
%deplObj = new (%className)() {
|
||||
dataBlock = SolarPanel;
|
||||
deployed = true;
|
||||
};
|
||||
|
||||
// set orientation
|
||||
%deplObj.setTransform(%item.surfacePt SPC %rot);
|
||||
|
||||
// set team, owner, and handle
|
||||
%deplObj.team = %plyr.client.Team;
|
||||
%deplObj.setOwner(%plyr);
|
||||
|
||||
// set power frequency
|
||||
%deplObj.powerFreq = %plyr.powerFreq;
|
||||
setTargetName(%deplObj.target,addTaggedString("Frequency" SPC %deplObj.powerFreq));
|
||||
|
||||
// set power
|
||||
%deplObj.setSelfPowered();
|
||||
|
||||
// set the sensor group if it needs one
|
||||
if (%deplObj.getTarget() != -1)
|
||||
setTargetSensorGroup(%deplObj.getTarget(), %plyr.client.team);
|
||||
|
||||
// place the deployable in the MissionCleanup/Deployables group (AI reasons)
|
||||
addToDeployGroup(%deplObj);
|
||||
|
||||
//let the AI know as well...
|
||||
AIDeployObject(%plyr.client, %deplObj);
|
||||
|
||||
// play the deploy sound
|
||||
serverPlay3D(%item.deploySound, %deplObj.getTransform());
|
||||
|
||||
// increment the team count for this deployed object
|
||||
$TeamDeployedCount[%plyr.team, %item.item]++;
|
||||
|
||||
addDSurface(%item.surface,%deplObj);
|
||||
|
||||
%deplObj.playThread($PowerThread,"Power");
|
||||
|
||||
// take the deployable off the player's back and out of inventory
|
||||
%plyr.unmountImage(%slot);
|
||||
%plyr.decInventory(%item.item, 1);
|
||||
|
||||
// add to power list
|
||||
$PowerList = listAdd($PowerList,%deplObj,-1);
|
||||
|
||||
return %deplObj;
|
||||
}
|
||||
|
||||
function SolarPanel::onDestroyed(%this,%obj,%prevState) {
|
||||
if (%obj.isRemoved)
|
||||
return;
|
||||
if (%obj.deployed && ($Host::InvincibleDeployables != 1 || %obj.damageFailedDecon)) {
|
||||
%obj.isRemoved = true;
|
||||
%loc = findWord($PowerList,%obj);
|
||||
if (%loc !$= "")
|
||||
$PowerList = listDel($PowerList,%loc);
|
||||
$TeamDeployedCount[%obj.team,SolarPanelDeployable]--;
|
||||
remDSurface(%obj);
|
||||
%obj.schedule(500,"delete");
|
||||
}
|
||||
Parent::onDestroyed(%data,%obj,%prevState);
|
||||
}
|
||||
|
||||
function SolarPanelDeployableImage::onMount(%data,%obj,%node) {
|
||||
%obj.hasGen = true; // set for gencheck
|
||||
displayPowerFreq(%obj);
|
||||
}
|
||||
|
||||
function SolarPanelDeployableImage::onUnmount(%data,%obj,%node) {
|
||||
%obj.hasGen = "";
|
||||
}
|
||||
285
scripts/packs/spine.cs
Normal file
285
scripts/packs/spine.cs
Normal file
|
|
@ -0,0 +1,285 @@
|
|||
//---------------------------------------------------------
|
||||
// Deployable Spine, Code by Mostlikely, Prettied by JackTL
|
||||
//---------------------------------------------------------
|
||||
|
||||
datablock StaticShapeData(DeployedSpine) : StaticShapeDamageProfile {
|
||||
className = "spine";
|
||||
shapeFile = "Pmiscf.dts";
|
||||
|
||||
maxDamage = 0.5;
|
||||
destroyedLevel = 0.5;
|
||||
disabledLevel = 0.3;
|
||||
|
||||
isShielded = true;
|
||||
energyPerDamagePoint = 240;
|
||||
maxEnergy = 50;
|
||||
rechargeRate = 0.25;
|
||||
|
||||
explosion = HandGrenadeExplosion;
|
||||
expDmgRadius = 3.0;
|
||||
expDamage = 0.1;
|
||||
expImpulse = 200.0;
|
||||
|
||||
dynamicType = $TypeMasks::StaticShapeObjectType;
|
||||
deployedObject = true;
|
||||
cmdCategory = "DSupport";
|
||||
cmdIcon = CMDSensorIcon;
|
||||
cmdMiniIconName = "commander/MiniIcons/com_deploymotionsensor";
|
||||
targetNameTag = 'Light Support Beam';
|
||||
deployAmbientThread = true;
|
||||
debrisShapeName = "debris_generic_small.dts";
|
||||
debris = DeployableDebris;
|
||||
heatSignature = 0;
|
||||
needsPower = true;
|
||||
};
|
||||
datablock StaticShapeData(DeployedSpine2) : StaticShapeDamageProfile {
|
||||
className = "spine";
|
||||
shapeFile = "Xmiscf.dts";
|
||||
|
||||
maxDamage = 0.5;
|
||||
destroyedLevel = 0.5;
|
||||
disabledLevel = 0.3;
|
||||
|
||||
isShielded = true;
|
||||
energyPerDamagePoint = 240;
|
||||
maxEnergy = 50;
|
||||
rechargeRate = 0.25;
|
||||
|
||||
explosion = HandGrenadeExplosion;
|
||||
expDmgRadius = 3.0;
|
||||
expDamage = 0.1;
|
||||
expImpulse = 200.0;
|
||||
|
||||
dynamicType = $TypeMasks::StaticShapeObjectType;
|
||||
deployedObject = true;
|
||||
cmdCategory = "DSupport";
|
||||
cmdIcon = CMDSensorIcon;
|
||||
cmdMiniIconName = "commander/MiniIcons/com_deploymotionsensor";
|
||||
targetNameTag = 'Light Support Beam';
|
||||
deployAmbientThread = true;
|
||||
debrisShapeName = "debris_generic_small.dts";
|
||||
debris = DeployableDebris;
|
||||
heatSignature = 0;
|
||||
needsPower = true;
|
||||
};
|
||||
datablock StaticShapeData(DeployedWoodSpine) : StaticShapeDamageProfile {
|
||||
className = "spine";
|
||||
shapeFile = "stackable5m.dts";
|
||||
|
||||
maxDamage = 0.5;
|
||||
destroyedLevel = 0.5;
|
||||
disabledLevel = 0.3;
|
||||
|
||||
isShielded = true;
|
||||
energyPerDamagePoint = 240;
|
||||
maxEnergy = 50;
|
||||
rechargeRate = 0.25;
|
||||
|
||||
explosion = HandGrenadeExplosion;
|
||||
expDmgRadius = 3.0;
|
||||
expDamage = 0.1;
|
||||
expImpulse = 200.0;
|
||||
|
||||
dynamicType = $TypeMasks::StaticShapeObjectType;
|
||||
deployedObject = true;
|
||||
cmdCategory = "DSupport";
|
||||
cmdIcon = CMDSensorIcon;
|
||||
cmdMiniIconName = "commander/MiniIcons/com_deploymotionsensor";
|
||||
targetNameTag = 'Light Support Beam';
|
||||
deployAmbientThread = true;
|
||||
debrisShapeName = "debris_generic_small.dts";
|
||||
debris = DeployableDebris;
|
||||
heatSignature = 0;
|
||||
needsPower = true;
|
||||
};
|
||||
|
||||
datablock ShapeBaseImageData(spineDeployableImage) {
|
||||
mass = 1;
|
||||
emap = true;
|
||||
shapeFile = "ammo_plasma.dts";
|
||||
item = spineDeployable;
|
||||
mountPoint = 1;
|
||||
offset = "0 -0.2 -0.55";
|
||||
deployed = DeployedSpine;
|
||||
heatSignature = 0;
|
||||
|
||||
stateName[0] = "Idle";
|
||||
stateTransitionOnTriggerDown[0] = "Activate";
|
||||
|
||||
stateName[1] = "Activate";
|
||||
stateScript[1] = "onActivate";
|
||||
stateTransitionOnTriggerUp[1] = "Idle";
|
||||
|
||||
isLarge = false;
|
||||
maxDepSlope = 360;
|
||||
deploySound = ItemPickupSound;
|
||||
|
||||
minDeployDis = 0.1;
|
||||
maxDeployDis = 50.0;
|
||||
};
|
||||
|
||||
datablock ItemData(spineDeployable) {
|
||||
className = Pack;
|
||||
catagory = "Deployables";
|
||||
shapeFile = "stackable1s.dts";
|
||||
mass = 1;
|
||||
elasticity = 0.2;
|
||||
friction = 0.6;
|
||||
pickupRadius = 1;
|
||||
rotate = true;
|
||||
image = "spineDeployableImage";
|
||||
pickUpName = "a light support beam pack";
|
||||
heatSignature = 0;
|
||||
emap = true;
|
||||
};
|
||||
|
||||
function spineDeployableImage::testObjectTooClose(%item) {
|
||||
return "";
|
||||
}
|
||||
|
||||
function spineDeployableImage::testNoTerrainFound(%item) {
|
||||
// don't check this for non-Landspike turret deployables
|
||||
}
|
||||
|
||||
function spineDeployable::onPickup(%this, %obj, %shape, %amount) {
|
||||
// created to prevent console errors
|
||||
}
|
||||
|
||||
function spineDeployableImage::onDeploy(%item, %plyr, %slot) {
|
||||
//Object
|
||||
%className = "StaticShape";
|
||||
|
||||
%grounded = 0;
|
||||
if (%item.surface.getClassName() $= TerrainBlock)
|
||||
%grounded = 1;
|
||||
|
||||
%playerVector = vectorNormalize(-1 * getWord(%plyr.getEyeVector(),1) SPC getWord(%plyr.getEyeVector(),0) SPC "0");
|
||||
|
||||
if (%item.surfaceinher == 0) {
|
||||
if (vAbs(floorVec(%item.surfaceNrm,100)) $= "0 0 1")
|
||||
%item.surfaceNrm2 = %playerVector;
|
||||
else
|
||||
%item.surfaceNrm2 = vectorNormalize(vectorCross(%item.surfaceNrm,"0 0 1"));
|
||||
}
|
||||
|
||||
%item.surfaceNrm3 = vectorCross(%item.surfaceNrm,%item.surfaceNrm2);
|
||||
|
||||
%rot = fullRot(%item.surfaceNrm,%item.surfaceNrm2);
|
||||
%scale = getWords($packSetting["spine",%plyr.packSet],0,2);
|
||||
%dataBlock = %item.deployed;
|
||||
|
||||
if (%plyr.packSet == 5) {
|
||||
%space = rayDist(%item.surfacePt SPC %item.surfaceNrm,%scale,$AllObjMask);
|
||||
if (%space != getWord(%scale,1))
|
||||
%type = true;
|
||||
%scale = getWord(%scale,0) SPC getWord(%scale,0) SPC %space;
|
||||
}
|
||||
else if (%plyr.packSet == 6 || %plyr.packSet == 7) {
|
||||
%mCenter = "0 0 -0.5";
|
||||
%pad = pad(%item.surfacePt SPC %item.surfaceNrm SPC %item.surfaceNrm2,%scale,%mCenter);
|
||||
%scale = getWords(%pad,0,2);
|
||||
%item.surfacePt = getWords(%pad,3,5);
|
||||
%rot = getWords(%pad,6,9);
|
||||
if (%plyr.packSet == 7) {
|
||||
%scale = vectorMultiply(%scale,1.845 SPC 2 SPC 1.744); // Update dfunctions.cs if changed!
|
||||
%scaleIsSet = 1;
|
||||
%item.surfacePt = vectorAdd(%item.surfacePt,vectorScale(%item.surfaceNrm3,0.5));
|
||||
%rot = rotAdd(%rot,"1 0 0" SPC $Pi);
|
||||
%dataBlock = "DeployedWoodSpine";
|
||||
}
|
||||
}
|
||||
|
||||
if (!%scaleIsSet)
|
||||
%scale = vectorMultiply(%scale,1/4 SPC 1/3 SPC 2);
|
||||
|
||||
%deplObj = new (%className)() {
|
||||
dataBlock = %dataBlock;
|
||||
scale = %scale;
|
||||
};
|
||||
|
||||
//////////////////////////Apply settings//////////////////////////////
|
||||
|
||||
// [[Location]]:
|
||||
|
||||
// exact:
|
||||
%deplObj.setTransform(%item.surfacePt SPC %rot);
|
||||
|
||||
// misc info
|
||||
addDSurface(%item.surface,%deplObj);
|
||||
|
||||
// [[Settings]]:
|
||||
|
||||
%deplObj.grounded = %grounded;
|
||||
%deplObj.needsFit = 1;
|
||||
|
||||
// [[Normal Stuff]]:
|
||||
|
||||
// if(%deplObj.getDatablock().rechargeRate)
|
||||
// %deplObj.setRechargeRate(%deplObj.getDatablock().rechargeRate);
|
||||
|
||||
// set team, owner, and handle
|
||||
%deplObj.team = %plyr.client.team;
|
||||
%deplObj.setOwner(%plyr);
|
||||
|
||||
// set power frequency
|
||||
%deplObj.powerFreq = %plyr.powerFreq;
|
||||
|
||||
// set the sensor group if it needs one
|
||||
if (%deplObj.getTarget() != -1)
|
||||
setTargetSensorGroup(%deplObj.getTarget(), %plyr.client.team);
|
||||
|
||||
// place the deployable in the MissionCleanup/Deployables group (AI reasons)
|
||||
addToDeployGroup(%deplObj);
|
||||
|
||||
//let the AI know as well...
|
||||
AIDeployObject(%plyr.client, %deplObj);
|
||||
|
||||
// play the deploy sound
|
||||
serverPlay3D(%item.deploySound, %deplObj.getTransform());
|
||||
|
||||
// increment the team count for this deployed object
|
||||
$TeamDeployedCount[%plyr.team, %item.item]++;
|
||||
|
||||
%deplObj.deploy();
|
||||
|
||||
// Power object
|
||||
checkPowerObject(%deplObj);
|
||||
|
||||
if (%pad)
|
||||
deployEffect(%deplObj,%item.surfacePt,%item.surfaceNrm,"pad");
|
||||
else if (%type)
|
||||
deployEffect(%deplObj,%item.surfacePt,%item.surfaceNrm,"spine1");
|
||||
else
|
||||
deployEffect(%deplObj,%item.surfacePt,%item.surfaceNrm,"spine");
|
||||
|
||||
return %deplObj;
|
||||
}
|
||||
|
||||
/////////////////////////////////////
|
||||
|
||||
function DeployedSpine::onDestroyed(%this, %obj, %prevState) {
|
||||
if (%obj.isRemoved)
|
||||
return;
|
||||
%obj.isRemoved = true;
|
||||
Parent::onDestroyed(%this, %obj, %prevState);
|
||||
$TeamDeployedCount[%obj.team, spineDeployable]--;
|
||||
remDSurface(%obj);
|
||||
%obj.schedule(500, "delete");
|
||||
cascade(%obj);
|
||||
fireBallExplode(%obj,1);
|
||||
}
|
||||
|
||||
function DeployedWoodSpine::onDestroyed(%this, %obj, %prevState) {
|
||||
DeployedSpine::onDestroyed(%this, %obj, %prevState);
|
||||
}
|
||||
|
||||
function spineDeployableImage::onMount(%data, %obj, %node) {
|
||||
%obj.hasSpine = true; // set for spinecheck
|
||||
%obj.packSet = 0;
|
||||
displayPowerFreq(%obj);
|
||||
}
|
||||
|
||||
function spineDeployableImage::onUnmount(%data, %obj, %node) {
|
||||
%obj.hasSpine = "";
|
||||
%obj.packSet = 0;
|
||||
}
|
||||
273
scripts/packs/switch.cs
Normal file
273
scripts/packs/switch.cs
Normal file
|
|
@ -0,0 +1,273 @@
|
|||
//--------------------------------------------------------------------------
|
||||
// Deployable Switch
|
||||
//--------------------------------------------------------------------------
|
||||
|
||||
datablock StaticShapeData(DeployedSwitch) : StaticShapeDamageProfile {
|
||||
className = "switch";
|
||||
shapeFile = "switch.dts";
|
||||
|
||||
maxDamage = 1.00;
|
||||
destroyedLevel = 1.00;
|
||||
disabledLevel = 0.75;
|
||||
|
||||
isShielded = true;
|
||||
energyPerDamagePoint = 30;
|
||||
maxEnergy = 100;
|
||||
rechargeRate = 0.05;
|
||||
|
||||
explosion = HandGrenadeExplosion;
|
||||
expDmgRadius = 1.0;
|
||||
expDamage = 0.3;
|
||||
expImpulse = 500;
|
||||
|
||||
dynamicType = $TypeMasks::StaticShapeObjectType;
|
||||
deployedObject = true;
|
||||
cmdCategory = "DSupport";
|
||||
cmdIcon = CMDSensorIcon;
|
||||
cmdMiniIconName = "commander/MiniIcons/com_switch_grey";
|
||||
targetNameTag = 'Deployed';
|
||||
targetTypeTag = 'Switch';
|
||||
// deployAmbientThread = true;
|
||||
debrisShapeName = "debris_generic_small.dts";
|
||||
debris = DeployableDebris;
|
||||
heatSignature = 0;
|
||||
emap = true;
|
||||
};
|
||||
|
||||
datablock ShapeBaseImageData(SwitchDeployableImage) {
|
||||
mass = 1;
|
||||
emap = true;
|
||||
shapeFile = "stackable1s.dts";
|
||||
item = SwitchDeployable;
|
||||
mountPoint = 1;
|
||||
offset = "0 0 0";
|
||||
deployed = DeployedSwitch;
|
||||
heatSignature = 0;
|
||||
|
||||
stateName[0] = "Idle";
|
||||
stateTransitionOnTriggerDown[0] = "Activate";
|
||||
|
||||
stateName[1] = "Activate";
|
||||
stateScript[1] = "onActivate";
|
||||
stateTransitionOnTriggerUp[1] = "Idle";
|
||||
|
||||
isLarge = true;
|
||||
maxDepSlope = 360;
|
||||
deploySound = ItemPickupSound;
|
||||
|
||||
flatMinDeployDis = 0.25;
|
||||
flatMaxDeployDis = 5.0;
|
||||
|
||||
minDeployDis = 2;
|
||||
maxDeployDis = 5;
|
||||
};
|
||||
|
||||
datablock ItemData(SwitchDeployable) {
|
||||
className = Pack;
|
||||
catagory = "Deployables";
|
||||
shapeFile = "stackable1s.dts";
|
||||
mass = 1;
|
||||
|
||||
hasLight = true;
|
||||
lightType = "PulsingLight";
|
||||
lightColor = "0.1 0.8 0.8 1.0";
|
||||
lightTime = "1000";
|
||||
lightRadius = "3";
|
||||
|
||||
elasticity = 0.2;
|
||||
friction = 0.6;
|
||||
pickupRadius = 3;
|
||||
rotate = true;
|
||||
image = "SwitchDeployableImage";
|
||||
pickUpName = "a switch pack";
|
||||
heatSignature = 0;
|
||||
emap = true;
|
||||
};
|
||||
|
||||
datablock AudioProfile(SwitchToggledSound) {
|
||||
filename = "fx/misc/flipflop_taken.wav";
|
||||
description = AudioClosest3d;
|
||||
preload = true;
|
||||
};
|
||||
|
||||
function SwitchDeployableImage::testNoTerrainFound(%item) {
|
||||
// don't check this for non-Landspike turret deployables
|
||||
}
|
||||
|
||||
function SwitchDeployable::onPickup(%this, %obj, %shape, %amount) {
|
||||
// created to prevent console errors
|
||||
}
|
||||
|
||||
function SwitchDeployableImage::onDeploy(%item, %plyr, %slot) {
|
||||
%className = "StaticShape";
|
||||
|
||||
%playerVector = vectorNormalize(getWord(%plyr.getEyeVector(),1) SPC -1 * getWord(%plyr.getEyeVector(),0) SPC "0");
|
||||
%item.surfaceNrm2 = %playerVector;
|
||||
|
||||
if (vAbs(floorVec(%item.surfaceNrm,100)) $= "0 0 1")
|
||||
%item.surfaceNrm2 = %playerVector;
|
||||
else
|
||||
%item.surfaceNrm2 = vectorNormalize(vectorCross(%item.surfaceNrm,"0 0 -1"));
|
||||
|
||||
%rot = fullRot(%item.surfaceNrm,%item.surfaceNrm2);
|
||||
|
||||
%deplObj = new (%className)() {
|
||||
scale = "0.5 0.5 0.5";
|
||||
dataBlock = DeployedSwitch;
|
||||
deployed = true;
|
||||
};
|
||||
|
||||
%deplObj.switchRadius = $packSetting["switch",%plyr.packSet];
|
||||
|
||||
// TODO - handle normal state on deploy
|
||||
if ($Host::ExpertMode == 1) {
|
||||
if (%plyr.expertSet == 1)
|
||||
%deplObj.timed = 1;
|
||||
else if (%plyr.expertSet == 2)
|
||||
%deplObj.timed = 2;
|
||||
}
|
||||
|
||||
// set orientation
|
||||
%deplObj.setTransform(%item.surfacePt SPC %rot);
|
||||
|
||||
// set team, owner, and handle
|
||||
%deplObj.team = %plyr.client.Team;
|
||||
%deplObj.setOwner(%plyr);
|
||||
|
||||
// set power frequency
|
||||
%deplObj.powerFreq = %plyr.powerFreq;
|
||||
|
||||
// set skin
|
||||
setTargetSkin(%deplObj.target,Game.getTeamSkin(%plyr.client.team));
|
||||
|
||||
// set power
|
||||
%deplObj.setSelfPowered();
|
||||
setTargetName(%deplObj.target,addTaggedString("Frequency" SPC %deplObj.powerFreq));
|
||||
|
||||
// set the sensor group if it needs one
|
||||
if (%deplObj.getTarget() != -1)
|
||||
setTargetSensorGroup(%deplObj.getTarget(), %plyr.client.team);
|
||||
|
||||
// place the deployable in the MissionCleanup/Deployables group (AI reasons)
|
||||
addToDeployGroup(%deplObj);
|
||||
|
||||
//let the AI know as well...
|
||||
AIDeployObject(%plyr.client, %deplObj);
|
||||
|
||||
// play the deploy sound
|
||||
serverPlay3D(%item.deploySound, %deplObj.getTransform());
|
||||
|
||||
// increment the team count for this deployed object
|
||||
$TeamDeployedCount[%plyr.team, %item.item]++;
|
||||
|
||||
addDSurface(%item.surface,%deplObj);
|
||||
|
||||
%deplObj.playThread($PowerThread,"Power");
|
||||
%deplObj.playThread($AmbientThread,"ambient");
|
||||
|
||||
if (%deplObj.timed == 2) {
|
||||
%deplObj.stopThread($AmbientThread);
|
||||
setTargetName(%deplObj.target,addTaggedString("Disabled Frequency" SPC %deplObj.powerFreq));
|
||||
%deplObj.isSwitchedOff = true;
|
||||
}
|
||||
|
||||
// take the deployable off the player's back and out of inventory
|
||||
%plyr.unmountImage(%slot);
|
||||
%plyr.decInventory(%item.item, 1);
|
||||
|
||||
return %deplObj;
|
||||
}
|
||||
|
||||
function DeployedSwitch::onCollision(%data,%obj,%col) {
|
||||
toggleSwitch(%obj,-1,%col);
|
||||
}
|
||||
|
||||
function toggleSwitch(%obj,%state,%col,%delayed) {
|
||||
if (%obj.isRemoved)
|
||||
return;
|
||||
// TODO - prevent switching while waiting for timed delay / cancel timed delay if switch is hit?
|
||||
%switchDelay = 1000;
|
||||
%switchTimedDelay = 5000;
|
||||
if (%state $= "")
|
||||
%state = -1;
|
||||
if (%col == 0 || %col $= "")
|
||||
%force = true;
|
||||
if (!%force) {
|
||||
if (%col.getClassName() !$= "Player")
|
||||
return;
|
||||
if (%col.getState() $= "Dead" || %col.FFZapped == true)
|
||||
return;
|
||||
if (%obj.team != %col.team && %obj.team != 0)
|
||||
return;
|
||||
if (!(%obj.switchTime < getSimTime())) {
|
||||
messageClient(%col.client, 'msgClient', '\c2Must wait %1 seconds between switching states.',mCeil((%obj.switchTime - getSimTime())/1000));
|
||||
return;
|
||||
}
|
||||
}
|
||||
if ((%obj.isSwitchedOff || (%force == true && %state == true)) && !(%force == true && %state == false)) {
|
||||
%state = true;
|
||||
%obj.isSwitchedOff = "";
|
||||
}
|
||||
else {
|
||||
%state = false;
|
||||
%obj.isSwitchedOff = true;
|
||||
}
|
||||
%switchCount = 0;
|
||||
%count = getWordCount($PowerList);
|
||||
// TODO - report number of successes and failures
|
||||
for(%i=0;%i<%count;%i++) {
|
||||
%powerObj = getWord($PowerList,%i);
|
||||
if (vectorDist(%obj.getPosition(),%powerObj.getPosition()) < %obj.switchRadius
|
||||
&& !%powerObj.isRemoved && %obj.powerFreq == %powerObj.powerFreq
|
||||
&& %obj.team == %powerObj.team) {
|
||||
toggleGenerator(%powerObj,%state);
|
||||
%switchCount++;
|
||||
}
|
||||
}
|
||||
if (%state == true) {
|
||||
%obj.play3D(SwitchToggledSound);
|
||||
%obj.playThread($AmbientThread,"ambient");
|
||||
setTargetName(%obj.target,addTaggedString("Frequency" SPC %obj.powerFreq));
|
||||
if (!%force)
|
||||
messageClient(%col.client, 'msgClient', '\c2%1 objects attempted switched on.',%switchCount);
|
||||
}
|
||||
else {
|
||||
%obj.play3D(SwitchToggledSound);
|
||||
%obj.stopThread($AmbientThread);
|
||||
setTargetName(%obj.target,addTaggedString("Disabled Frequency" SPC %obj.powerFreq));
|
||||
if (!%force)
|
||||
messageClient(%col.client, 'msgClient', '\c2%1 objects attempted switched off.',%switchCount);
|
||||
}
|
||||
%obj.switchTime = getSimTime() + %switchDelay;
|
||||
cancel(%obj.timedSched);
|
||||
if (%obj.timed > 0 && !%delayed) {
|
||||
if (%obj.timed == 1)
|
||||
%obj.timedSched = schedule(%switchTimedDelay,0,toggleSwitch,%obj,1,0,true);
|
||||
else if (%obj.timed == 2)
|
||||
%obj.timedSched = schedule(%switchTimedDelay,0,toggleSwitch,%obj,0,0,true);
|
||||
%obj.switchTime = getSimTime() + %switchDelay + %switchTimedDelay;
|
||||
}
|
||||
}
|
||||
|
||||
function DeployedSwitch::onDestroyed(%this,%obj,%prevState) {
|
||||
if (%obj.isRemoved)
|
||||
return;
|
||||
%obj.isRemoved = true;
|
||||
Parent::onDestroyed(%this, %obj, %prevState);
|
||||
$TeamDeployedCount[%obj.team, SwitchDeployable]--;
|
||||
remDSurface(%obj);
|
||||
%obj.schedule(500, "delete");
|
||||
}
|
||||
|
||||
function SwitchDeployableImage::onMount(%data,%obj,%node) {
|
||||
%obj.hasSwitch = true; // set for switchcheck
|
||||
%obj.packSet = 2;
|
||||
%obj.expertSet = 0;
|
||||
displayPowerFreq(%obj);
|
||||
}
|
||||
|
||||
function SwitchDeployableImage::onUnmount(%data,%obj,%node) {
|
||||
%obj.hasSwitch = "";
|
||||
%obj.packSet = 0;
|
||||
%obj.expertSet = 0;
|
||||
}
|
||||
564
scripts/packs/telepadpack.cs
Normal file
564
scripts/packs/telepadpack.cs
Normal file
|
|
@ -0,0 +1,564 @@
|
|||
//---------------------------------------------------------
|
||||
// Deployable Telepad
|
||||
//---------------------------------------------------------
|
||||
|
||||
datablock ShapeBaseImageData(TelePadDeployableImage) {
|
||||
mass = 1;
|
||||
emap = true;
|
||||
shapeFile = "stackable1s.dts";
|
||||
item = TelePadPack;
|
||||
mountPoint = 1;
|
||||
offset = "0 0 0";
|
||||
deployed = TelePadDeployedBase;
|
||||
heatSignature = 0;
|
||||
|
||||
stateName[0] = "Idle";
|
||||
stateTransitionOnTriggerDown[0] = "Activate";
|
||||
|
||||
stateName[1] = "Activate";
|
||||
stateScript[1] = "onActivate";
|
||||
stateTransitionOnTriggerUp[1] = "Idle";
|
||||
|
||||
isLarge = true;
|
||||
maxDepSlope = 360;
|
||||
deploySound = StationDeploySound;
|
||||
|
||||
minDeployDis = 0.5;
|
||||
maxDeployDis = 5.0;
|
||||
};
|
||||
|
||||
datablock ItemData(TelePadPack) {
|
||||
className = Pack;
|
||||
catagory = "Deployables";
|
||||
shapeFile = "stackable1s.dts";
|
||||
mass = 1;
|
||||
elasticity = 0.2;
|
||||
friction = 0.6;
|
||||
pickupRadius = 1;
|
||||
rotate = false;
|
||||
image = "TelePadDeployableImage";
|
||||
pickUpName = "a teleport pad pack";
|
||||
heatSignature = 0;
|
||||
joint = "2 2 2";
|
||||
computeCRC = true;
|
||||
emap = true;
|
||||
};
|
||||
|
||||
datablock SensorData(TelePadBaseSensorObj) {
|
||||
detects = true;
|
||||
detectsUsingLOS = true;
|
||||
detectsPassiveJammed = false;
|
||||
detectsActiveJammed = false;
|
||||
detectsCloaked = false;
|
||||
detectionPings = true;
|
||||
detectRadius = 10;
|
||||
};
|
||||
|
||||
datablock StaticShapeData(TelePadDeployedBase) : StaticShapeDamageProfile {
|
||||
className = "teleport";
|
||||
shapeFile = "nexuscap.dts";
|
||||
|
||||
maxDamage = 2.00;
|
||||
destroyedLevel = 2.00;
|
||||
disabledLevel = 1.35;
|
||||
|
||||
isShielded = true;
|
||||
energyPerDamagePoint = 250;
|
||||
maxEnergy = 100;
|
||||
rechargeRate = 1;
|
||||
|
||||
explosion = ShapeExplosion; // DeployablesExplosion;
|
||||
expDmgRadius = 18.0;
|
||||
expDamage = 0.1;
|
||||
expImpulse = 200.0;
|
||||
|
||||
dynamicType = $TypeMasks::StationObjectType;
|
||||
deployedObject = true;
|
||||
cmdCategory = "DSupport";
|
||||
cmdIcon = CMDSwitchIcon;
|
||||
cmdMiniIconName = "commander/MiniIcons/com_switch_grey";
|
||||
targetNameTag = 'Deployed';
|
||||
targetTypeTag = 'Teleport Pad';
|
||||
|
||||
debrisShapeName = "debris_generic.dts";
|
||||
debris = DeployableDebris;
|
||||
|
||||
heatSignature = 0;
|
||||
needsPower = true;
|
||||
|
||||
humSound = SensorHumSound;
|
||||
pausePowerThread = true;
|
||||
sensorData = TelePadBaseSensorObj;
|
||||
sensorRadius = TelePadBaseSensorObj.detectRadius;
|
||||
sensorColor = "0 212 45";
|
||||
firstPersonOnly = true;
|
||||
|
||||
lightType = "PulsingLight";
|
||||
lightColor = "0 1 0 1";
|
||||
lightTime = 1200;
|
||||
lightRadius = 6;
|
||||
};
|
||||
|
||||
datablock StaticShapeData(TelePadBeam) {
|
||||
className = "Station";
|
||||
catagory = "DSupport";
|
||||
shapefile = "nexus_effect.dts";
|
||||
collideable = 1;
|
||||
needsNoPower = true;
|
||||
emap="true";
|
||||
sensorData = TelePadBaseSensorObj;
|
||||
sensorRadius = TelePadBaseSensorObj.detectRadius;
|
||||
sensorColor = "0 212 45";
|
||||
|
||||
cmdCategory = "DSupport";
|
||||
targetNameTag = 'Teleport';
|
||||
targetTypeTag = 'Pad';
|
||||
|
||||
lightType = "PulsingLight";
|
||||
lightColor = "0 1 0 1";
|
||||
lightTime = 1200;
|
||||
lightRadius = 6;
|
||||
};
|
||||
|
||||
datablock AudioProfile(TelePadAccessDeniedSound) {
|
||||
filename = "gui/vote_nopass.wav";
|
||||
description = AudioClosest3d;
|
||||
preload = true;
|
||||
};
|
||||
|
||||
datablock AudioProfile(TelePadBeamSound) {
|
||||
filename = "fx/vehicles/inventory_pad_on.wav";
|
||||
description = AudioClosest3d;
|
||||
preload = true;
|
||||
};
|
||||
|
||||
datablock AudioProfile(TelePadPowerUpSound) {
|
||||
filename = "fx/powered/turret_heavy_activate.wav";
|
||||
description = AudioClosest3d;
|
||||
preload = true;
|
||||
};
|
||||
|
||||
datablock AudioProfile(TelePadPowerDownSound) {
|
||||
filename = "fx/powered/inv_pad_off.wav";
|
||||
description = AudioClosest3d;
|
||||
preload = true;
|
||||
};
|
||||
|
||||
datablock ParticleData(TelePadTeleportParticle)
|
||||
{
|
||||
dragCoeffiecient = 0.0;
|
||||
gravityCoefficient = 0.0;
|
||||
inheritedVelFactor = 0.0;
|
||||
|
||||
lifetimeMS = 1200;
|
||||
lifetimeVarianceMS = 400;
|
||||
|
||||
textureName = "special/lightFalloffMono";
|
||||
|
||||
useInvAlpha = false;
|
||||
spinRandomMin = -200.0;
|
||||
spinRandomMax = 200.0;
|
||||
|
||||
colors[0] = "0.5 0.8 0.2 1.0";
|
||||
colors[1] = "0.6 0.9 0.3 1.0";
|
||||
colors[2] = "0.7 1.0 0.4 1.0";
|
||||
sizes[0] = 0.2;
|
||||
sizes[1] = 0.1;
|
||||
sizes[2] = 0.05;
|
||||
times[0] = 0.0;
|
||||
times[1] = 0.5;
|
||||
times[2] = 1.0;
|
||||
};
|
||||
|
||||
datablock ParticleEmitterData(TelePadTeleportEmitter)
|
||||
{
|
||||
ejectionPeriodMS = 1;
|
||||
ejectionOffset = 7.0;
|
||||
periodVarianceMS = 0.0;
|
||||
ejectionVelocity = 2.0;
|
||||
velocityVariance = 2.0;
|
||||
thetaMin = 0.0;
|
||||
thetaMax = 10.0;
|
||||
lifetimeMS = 0;
|
||||
|
||||
particles = "TelePadTeleportParticle";
|
||||
};
|
||||
|
||||
function TelePadDeployedBase::onDestroyed(%this,%obj,%prevState) {
|
||||
if (%obj.isRemoved)
|
||||
return;
|
||||
%obj.isRemoved = true;
|
||||
Parent::onDestroyed(%this,%obj,%prevState);
|
||||
$TeamDeployedCount[%obj.team,TelePadPack]--;
|
||||
%obj.isRemoved = true;
|
||||
remDSurface(%obj);
|
||||
%obj.beam.schedule(150,"delete");
|
||||
%obj.schedule(500,"delete");
|
||||
}
|
||||
|
||||
function TelePadDeployedBase::disassemble(%data,%plyr,%obj) {
|
||||
if (isObject(%obj.beam))
|
||||
%obj.beam.delete();
|
||||
%obj.isRemoved = true;
|
||||
disassemble(%data,%plyr,%obj);
|
||||
}
|
||||
|
||||
function TelePadDeployedBase::onGainPowerEnabled(%data,%obj) {
|
||||
if (shouldChangePowerState(%obj,true)) {
|
||||
tp_fadeIn(%obj,true);
|
||||
%obj.playThread($AmbientThread,"ambient");
|
||||
%obj.setThreadDir($AmbientThread,true);
|
||||
|
||||
%obj.playThread($ActivateThread,"transition");
|
||||
%obj.setThreadDir($ActivateThread,false);
|
||||
|
||||
%obj.play3D(TelePadPowerUpSound);
|
||||
}
|
||||
Parent::onGainPowerEnabled(%data,%obj);
|
||||
}
|
||||
|
||||
function TelePadDeployedBase::onLosePowerDisabled(%data,%obj) {
|
||||
if (shouldChangePowerState(%obj,false)) {
|
||||
tp_fadeOut(%obj,true);
|
||||
%obj.stopThread($AmbientThread);
|
||||
|
||||
%obj.playThread($ActivateThread,"transition");
|
||||
%obj.setThreadDir($ActivateThread,true);
|
||||
|
||||
%obj.play3D(TelePadPowerDownSound);
|
||||
}
|
||||
Parent::onLosePowerDisabled(%data,%obj);
|
||||
}
|
||||
|
||||
function TelePadDeployedBase::onCollision(%data,%obj,%col) {
|
||||
if (%col.justTeleported || %obj.isRemoved)
|
||||
return;
|
||||
|
||||
// verify pad.team is team associated and is on player's team
|
||||
if (%obj.team != %col.team && %obj.team != 0 && %obj.teleMode != 1 && %obj.frequency > 0) {
|
||||
%obj.play3D(TelePadAccessDeniedSound);
|
||||
messageClient(%col.client,'msgClient','\c2Access Denied -- Wrong team.');
|
||||
%col.justTeleported = true;
|
||||
schedule(2000,0,"unTeleport",%col);
|
||||
return;
|
||||
}
|
||||
|
||||
// verify that pad can transmit
|
||||
if (%obj.teleMode == 3) {
|
||||
%obj.play3D(TelePadAccessDeniedSound);
|
||||
messageClient(%col.client,'msgClient','\c2Access Denied -- This pad can only receive.');
|
||||
%col.justTeleported = true;
|
||||
schedule(2000,0,"unTeleport",%col);
|
||||
return;
|
||||
}
|
||||
|
||||
// Discover next pad to teleport to
|
||||
%dgroup = nameToID(Deployables);
|
||||
%destPad = 0;
|
||||
%firstPad = 0;
|
||||
for(%depIndex = 0; %depIndex < %dgroup.getCount(); %depIndex++) {
|
||||
%dep = %dgroup.getObject(%depIndex);
|
||||
if (%dep.getDataBlock().className $= "teleport") {
|
||||
if (%dep != %obj && %dep.frequency == %obj.frequency && %dep.team == %obj.team && %dep.teleMode != 2) {
|
||||
if (%dep.isPowered() && %dep.isEnabled() && !(%dep.getEnergyLevel() < %dep.getDataBlock().maxEnergy)) {
|
||||
if (!%firstPad || %dep < %firstPad)
|
||||
%firstPad = %dep;
|
||||
if (%dep > %obj && (!%destPad || %dep < %destPad)) {
|
||||
%destPad = %dep;
|
||||
}
|
||||
}
|
||||
else
|
||||
%notEnabled = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!%destPad)
|
||||
%destPad = %firstPad;
|
||||
|
||||
if (!%obj.isPowered() || !%obj.isEnabled()) {
|
||||
%obj.play3D(TelePadAccessDeniedSound);
|
||||
if (!%obj.isPowered() && !%obj.isEnabled())
|
||||
messageClient(%col.client,'msgClient','\c2Unable to teleport, telepad is damaged and has no power.');
|
||||
else if (!%obj.isEnabled())
|
||||
messageClient(%col.client,'msgClient','\c2Unable to teleport, telepad is damaged.');
|
||||
else if (!%obj.isPowered())
|
||||
messageClient(%col.client,'msgClient','\c2Unable to teleport, telepad is not powered.');
|
||||
else
|
||||
messageClient(%col.client,'msgClient','\c2Unable to teleport, telepad malfunction.');
|
||||
%col.justTeleported = true;
|
||||
schedule(2000,0,"unTeleport",%col);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!%destPad) {
|
||||
%obj.play3D(TelePadAccessDeniedSound);
|
||||
if (%notEnabled)
|
||||
messageClient(%col.client,'msgClient','\c2Unable to teleport, destination is damaged, has no power or is recharging.');
|
||||
else
|
||||
messageClient(%col.client,'msgClient','\c2Unable to teleport, no other pads to teleport to.');
|
||||
%col.justTeleported = true;
|
||||
schedule(2000,0,"unTeleport",%col);
|
||||
return;
|
||||
}
|
||||
|
||||
if (tp_isBlocked(%destPad,%col)) {
|
||||
%obj.play3D(TelePadAccessDeniedSound);
|
||||
messageClient(%col.client,'msgClient','\c2Unable to teleport, destination is blocked.');
|
||||
%col.justTeleported = true;
|
||||
schedule(2000,0,"unTeleport",%col);
|
||||
return;
|
||||
}
|
||||
|
||||
if (%obj.getEnergyLevel() < %obj.getDataBlock().maxEnergy) {
|
||||
%obj.play3D(TelePadAccessDeniedSound);
|
||||
messageClient(%col.client,'msgClient','\c2Unable to teleport, telepad is recharging.');
|
||||
%col.justTeleported = true;
|
||||
schedule(2000,0,"unTeleport",%col);
|
||||
return;
|
||||
}
|
||||
|
||||
// center player on pad
|
||||
if (!tp_isBlocked(%obj,%col))
|
||||
tp_adjustPlayer(%obj,%col);
|
||||
|
||||
// fade out player
|
||||
%col.disableMove(true);
|
||||
pl_fadeOut(%col);
|
||||
|
||||
// pad power up effect
|
||||
tp_fadePadIn(%obj);
|
||||
tp_fadePadIn(%destPad);
|
||||
|
||||
// fade out beams
|
||||
schedule(600,0,"tp_fadeOut",%obj);
|
||||
schedule(750,0,"tp_fadeOut",%destPad);
|
||||
|
||||
// pad power down effect
|
||||
schedule(1500,0,"tp_fadePadOut",%obj);
|
||||
schedule(1550,0,"tp_fadePadOut",%destPad);
|
||||
|
||||
// fade in beams
|
||||
schedule(3000,0,"tp_fadeIn",%obj);
|
||||
schedule(3050,0,"tp_fadeIn",%destPad);
|
||||
|
||||
// Zap energy
|
||||
%obj.setEnergyLevel(0);
|
||||
%destPad.setEnergyLevel(0);
|
||||
|
||||
%col.justTeleported = true;
|
||||
|
||||
messageClient(%col.client,'msgClient',"~wfx/misc/diagnostic_on.wav");
|
||||
schedule(500,0,"teleport",%col,%destPad,%obj); // schedule their teleportation
|
||||
tp_emitter(%obj);
|
||||
}
|
||||
|
||||
function tp_isBlocked(%pad,%obj) {
|
||||
%padPos = %pad.getPosition();
|
||||
%telePos = vectorAdd(%padPos,vectorScale(realVec(%pad,"0 0 1"),-2.5));
|
||||
if (containerRayCast(%padPos,%telePos,-1,%pad))
|
||||
%blocked = true;
|
||||
if (!$Host::AllowUnderground) {
|
||||
%terrain = getTerrainHeight2(%telePos);
|
||||
if (getWord(%telePos,2) < getWord(%terrain,2) || %terrain $= "")
|
||||
%blocked = true;
|
||||
}
|
||||
if (isObject(%obj)) {
|
||||
%adjust = vectorAdd(vectorScale(vectorNormalize(realVec(%pad,"0 0 1")),-1.35),vectorSub(%obj.getPosition(),%obj.getWorldBoxCenter()));
|
||||
%pos = vectorAdd(%padPos,%adjust);
|
||||
if (!$Host::AllowUnderground) {
|
||||
%terrain = getTerrainHeight2(%pos);
|
||||
if (getWord(%pos,2) < getWord(%terrain,2) || %terrain $= "")
|
||||
%blocked = true;
|
||||
}
|
||||
if (containerRayCast(%telePos,%pos,-1,%obj))
|
||||
%blocked = true;
|
||||
}
|
||||
return %blocked;
|
||||
}
|
||||
|
||||
// player
|
||||
function pl_fadeIn(%obj) {
|
||||
%obj.startFade(500,0,false);
|
||||
messageClient(%col.client,'msgClient',"~wfx/misc/diagnostic_on.wav");
|
||||
}
|
||||
|
||||
function pl_fadeOut(%obj) {
|
||||
%obj.startFade(500,0,true);
|
||||
messageClient(%col.client,'msgClient',"~wfx/misc/diagnostic_on.wav");
|
||||
}
|
||||
|
||||
// beam and sound
|
||||
function tp_fadeIn(%obj,%silent) {
|
||||
if (%obj.isPowered() && %obj.isEnabled()) {
|
||||
if (!%silent)
|
||||
%obj.play3D(DiscReloadSound);
|
||||
%obj.beam.startFade(100,0,false);
|
||||
}
|
||||
}
|
||||
|
||||
function tp_fadeOut(%obj,%silent) {
|
||||
if (!%silent)
|
||||
%obj.play3D(TelePadBeamSound);
|
||||
%obj.beam.startFade(100,0,true);
|
||||
}
|
||||
|
||||
// pad
|
||||
function tp_fadePadIn(%obj) {
|
||||
%obj.playThread($ActivateThread,"transition");
|
||||
%obj.setThreadDir($ActivateThread,true);
|
||||
}
|
||||
|
||||
function tp_fadePadOut(%obj) {
|
||||
%obj.playThread($ActivateThread,"transition");
|
||||
%obj.setThreadDir($ActivateThread,false);
|
||||
}
|
||||
|
||||
// fancy emitter
|
||||
function tp_emitter(%obj) {
|
||||
%em = new ParticleEmissionDummy() {
|
||||
scale = "1 1 1";
|
||||
dataBlock = "defaultEmissionDummy";
|
||||
emitter = "TelePadTeleportEmitter";
|
||||
velocity = "1";
|
||||
};
|
||||
%adjust = vectorScale(realVec(%obj,"0 0 1"),7);
|
||||
%em.setTransform(vectorAdd(%obj.getPosition(),%adjust) SPC rotAdd(%obj.getRotation(),"1 0 0" SPC $Pi));
|
||||
MissionCleanup.add(%em);
|
||||
%em.schedule(1000,"delete");
|
||||
}
|
||||
|
||||
function unTeleport(%pl) {
|
||||
if (isObject(%pl))
|
||||
%pl.justTeleported = false;
|
||||
}
|
||||
|
||||
function teleport(%pl,%destPad,%src) {
|
||||
%pl.setVelocity("0 0 0"); //slow me down, ive been falling :)
|
||||
%pl.schedule(500,disableMove,false);
|
||||
pl_fadeIn(%pl);
|
||||
schedule(2650,0,"unTeleport",%pl);
|
||||
|
||||
if (!isObject(%destPad)) {// lost the destination
|
||||
messageClient(%pl.client,'msgClient','\c2Lost destination!');
|
||||
tp_adjustPlayer(%src,%pl);
|
||||
}
|
||||
else {
|
||||
if (%pl.team == %src.team)
|
||||
messageClient(%pl.client,'msgClient','\c2Teleporting on frequency %1.',%src.frequency);
|
||||
else
|
||||
messageClient(%pl.client,'msgClient','\c2Teleporting on ENEMY frequency %1!',%src.frequency);
|
||||
tp_adjustPlayer(%destPad,%pl);
|
||||
tp_emitter(%destPad);
|
||||
}
|
||||
}
|
||||
|
||||
function tp_adjustPlayer(%pad,%obj) {
|
||||
%adjust = vectorAdd(vectorScale(vectorNormalize(realVec(%pad,"0 0 1")),-1.35),vectorSub(%obj.getPosition(),%obj.getWorldBoxCenter()));
|
||||
%rot = %obj.getRotation();
|
||||
%obj.setTransform(vectorAdd(%pad.getPosition(),%adjust) SPC %rot);
|
||||
}
|
||||
|
||||
function tp_adjustBeam(%pad) {
|
||||
%rot = rotAdd(%pad.getRotation(),"1 0 0" SPC $Pi);
|
||||
%pad.beam.setTransform(%pad.getPosition() SPC %rot);
|
||||
}
|
||||
|
||||
function TelePadPack::onPickup(%this,%obj,%shape,%amount) {
|
||||
// created to prevent console errors
|
||||
}
|
||||
|
||||
function TelePadDeployableImage::onDeploy(%item,%plyr,%slot) {
|
||||
%className = "StaticShape";
|
||||
|
||||
%item.surfacePt = vectorAdd(%item.surfacePt,vectorScale(%item.surfaceNrm,0.4));
|
||||
|
||||
%playerVector = vectorNormalize(getWord(%plyr.getEyeVector(),1) SPC -1 * getWord(%plyr.getEyeVector(),0) SPC "0");
|
||||
%item.surfaceNrm2 = %playerVector;
|
||||
|
||||
if (vAbs(floorVec(%item.surfaceNrm,100)) $= "0 0 1")
|
||||
%item.surfaceNrm2 = vectorScale(%playerVector,-1);
|
||||
else
|
||||
%item.surfaceNrm2 = vectorNormalize(vectorCross(%item.surfaceNrm,"0 0 1"));
|
||||
|
||||
%rot = fullRot(vectorScale(%item.surfaceNrm,-1),%item.surfaceNrm2);
|
||||
|
||||
%deplObj = new (%className)() {
|
||||
dataBlock = TelePadDeployedBase;
|
||||
scale = "1 1 1";
|
||||
deployed = true;
|
||||
teleMode = %plyr.expertSet;
|
||||
};
|
||||
|
||||
// set orientation
|
||||
%deplObj.setTransform(%item.surfacePt SPC %rot);
|
||||
|
||||
// set team, owner, and handle
|
||||
%deplObj.team = %plyr.client.team;
|
||||
%deplObj.setOwner(%plyr);
|
||||
|
||||
// set power frequency
|
||||
%deplObj.powerFreq = %plyr.powerFreq;
|
||||
|
||||
// set the sensor group if it needs one
|
||||
if (%deplObj.getTarget() != -1)
|
||||
setTargetSensorGroup(%deplObj.getTarget(),%plyr.client.team);
|
||||
|
||||
// set frequency
|
||||
%frequency = %plyr.packSet;
|
||||
if (!%frequency)
|
||||
%frequency = 1;
|
||||
%deplObj.frequency = %frequency;
|
||||
setTargetName(%deplObj.target,addTaggedString("Frequency" SPC %frequency));
|
||||
|
||||
// attach beam
|
||||
%deplObj.beam = new (StaticShape)() {
|
||||
dataBlock = TelePadBeam;
|
||||
scale = "1 1 0.4";
|
||||
};
|
||||
|
||||
// set orientation
|
||||
tp_adjustBeam(%deplObj);
|
||||
|
||||
%deplObj.beam.playThread(0,"ambient");
|
||||
%deplObj.beam.setThreadDir(0,true);
|
||||
// The flash animation plays forwards, then back automatically,so we have to alternate the thread direcction...
|
||||
%deplObj.beam.flashThreadDir = true;
|
||||
|
||||
%deplObj.beam.base = %deplObj;
|
||||
|
||||
// place the deployable in the MissionCleanup/Deployables group (AI reasons)
|
||||
addToDeployGroup(%deplObj);
|
||||
|
||||
//let the AI know as well...
|
||||
AIDeployObject(%plyr.client,%deplObj);
|
||||
|
||||
// play the deploy sound
|
||||
serverPlay3D(%item.deploySound,%deplObj.getTransform());
|
||||
|
||||
// increment the team count for this deployed object
|
||||
$TeamDeployedCount[%plyr.team,%item.item]++;
|
||||
|
||||
addDSurface(%item.surface,%deplObj);
|
||||
|
||||
// take the deployable off the player's back and out of inventory
|
||||
%plyr.unmountImage(%slot);
|
||||
%plyr.decInventory(%item.item,1);
|
||||
|
||||
// Power object
|
||||
checkPowerObject(%deplObj);
|
||||
|
||||
return %deplObj;
|
||||
}
|
||||
|
||||
function TelePadDeployableImage::onMount(%data,%obj,%node) {
|
||||
%obj.hasTele = true; // set for telecheck
|
||||
%obj.packSet = 1;
|
||||
%obj.expertSet = 0;
|
||||
displayPowerFreq(%obj);
|
||||
}
|
||||
|
||||
function TelePadDeployableImage::onUnmount(%data,%obj,%node) {
|
||||
%obj.hasTele = "";
|
||||
%obj.packSet = 0;
|
||||
%obj.expertSet = 0;
|
||||
}
|
||||
258
scripts/packs/treepack.cs
Normal file
258
scripts/packs/treepack.cs
Normal file
|
|
@ -0,0 +1,258 @@
|
|||
//---------------------------------------------------------
|
||||
// Deployable Tree, original code by Parousia
|
||||
//---------------------------------------------------------
|
||||
|
||||
datablock StaticShapeData(DeployedTree) : StaticShapeDamageProfile {
|
||||
className = "tree";
|
||||
shapeFile = "borg19.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 Tree';
|
||||
deployAmbientThread = true;
|
||||
debrisShapeName = "debris_generic_small.dts";
|
||||
debris = DeployableDebris;
|
||||
heatSignature = 0;
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedTree0) : DeployedTree {
|
||||
shapeFile = "borg16.dts";
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedTree1) : DeployedTree {
|
||||
shapeFile = "borg17.dts";
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedTree2) : DeployedTree {
|
||||
shapeFile = "borg18.dts";
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedTree3) : DeployedTree {
|
||||
shapeFile = "borg19.dts";
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedTree4) : DeployedTree {
|
||||
shapeFile = "dorg15.dts";
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedTree5) : DeployedTree {
|
||||
shapeFile = "dorg16.dts";
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedTree6) : DeployedTree {
|
||||
shapeFile = "dorg17.dts";
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedTree7) : DeployedTree {
|
||||
shapeFile = "dorg18.dts";
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedTree8) : DeployedTree {
|
||||
shapeFile = "dorg19.dts";
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedTree9) : DeployedTree {
|
||||
shapeFile = "porg3.dts";
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedTree10) : DeployedTree {
|
||||
shapeFile = "porg6.dts";
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedTree11) : DeployedTree {
|
||||
shapeFile = "sorg20.dts";
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedTree12) : DeployedTree {
|
||||
shapeFile = "sorg22.dts";
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedTree13) : DeployedTree {
|
||||
shapeFile = "xorg3.dts";
|
||||
};
|
||||
|
||||
datablock ShapeBaseImageData(TreeDeployableImage) {
|
||||
mass = 1;
|
||||
emap = true;
|
||||
shapeFile = "stackable1s.dts";
|
||||
item = TreeDeployable;
|
||||
mountPoint = 1;
|
||||
offset = "0 0 0";
|
||||
deployed = DeployedTree;
|
||||
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 ItemData(TreeDeployable) {
|
||||
className = Pack;
|
||||
catagory = "Deployables";
|
||||
shapeFile = "stackable1s.dts";
|
||||
mass = 1;
|
||||
elasticity = 0.2;
|
||||
friction = 0.6;
|
||||
pickupRadius = 1;
|
||||
rotate = true;
|
||||
image = "TreeDeployableImage";
|
||||
pickUpName = "a tree pack";
|
||||
heatSignature = 0;
|
||||
emap = true;
|
||||
};
|
||||
|
||||
function TreeDeployableImage::testObjectTooClose(%item) {
|
||||
return "";
|
||||
}
|
||||
|
||||
function TreeDeployableImage::testNoTerrainFound(%item) {
|
||||
// don't check this for non-Landspike turret deployables
|
||||
}
|
||||
|
||||
function TreeDeployable::onPickup(%this, %obj, %shape, %amount) {
|
||||
// created to prevent console errors
|
||||
}
|
||||
|
||||
function TreeDeployableImage::onDeploy(%item, %plyr, %slot) {
|
||||
%className = "StaticShape";
|
||||
|
||||
%playerVector = vectorNormalize(-1 * getWord(%plyr.getEyeVector(),1) SPC getWord(%plyr.getEyeVector(),0) SPC "0");
|
||||
%item.surfaceNrm2 = %playerVector;
|
||||
%rot = fullRot(%item.surfaceNrm,%item.surfaceNrm2);
|
||||
|
||||
%deplObj = new (%className)() {
|
||||
dataBlock = %item.deployed @ %plyr.packSet;
|
||||
scale = vectorScale("1 1 1",$expertSetting["tree",%plyr.expertSet]);
|
||||
};
|
||||
|
||||
// set orientation
|
||||
%deplObj.setTransform(%item.surfacePt SPC %rot);
|
||||
|
||||
// set the recharge rate right away
|
||||
if (%deplObj.getDatablock().rechargeRate)
|
||||
%deplObj.setRechargeRate(%deplObj.getDatablock().rechargeRate);
|
||||
|
||||
// set team, owner, and handle
|
||||
%deplObj.team = %plyr.client.Team;
|
||||
%deplObj.setOwner(%plyr);
|
||||
|
||||
// place the deployable in the MissionCleanup/Deployables group (AI reasons)
|
||||
addToDeployGroup(%deplObj);
|
||||
|
||||
//let the AI know as well...
|
||||
AIDeployObject(%plyr.client, %deplObj);
|
||||
|
||||
// play the deploy sound
|
||||
serverPlay3D(%item.deploySound, %deplObj.getTransform());
|
||||
|
||||
// increment the team count for this deployed object
|
||||
$TeamDeployedCount[%plyr.team, %item.item]++;
|
||||
|
||||
addDSurface(%item.surface,%deplObj);
|
||||
|
||||
// take the deployable off the player's back and out of inventory
|
||||
%plyr.unmountImage(%slot);
|
||||
%plyr.decInventory(%item.item, 1);
|
||||
|
||||
return %deplObj;
|
||||
}
|
||||
|
||||
function DeployedTree::onDestroyed(%this,%obj,%prevState) {
|
||||
if (%obj.isRemoved)
|
||||
return;
|
||||
%obj.isRemoved = true;
|
||||
Parent::onDestroyed(%this,%obj,%prevState);
|
||||
$TeamDeployedCount[%obj.team, TreeDeployable]--;
|
||||
remDSurface(%obj);
|
||||
%obj.schedule(500, "delete");
|
||||
}
|
||||
|
||||
function TreeDeployableImage::onMount(%data, %obj, %node) {
|
||||
%obj.hasTree = true; // set for treecheck
|
||||
%obj.packSet = 0;
|
||||
%obj.expertSet = 5;
|
||||
}
|
||||
|
||||
function TreeDeployableImage::onUnmount(%data, %obj, %node) {
|
||||
%obj.hasTree = "";
|
||||
%obj.packSet = 0;
|
||||
%obj.expertSet = 0;
|
||||
}
|
||||
|
||||
function DeployedTree0::onDestroyed(%this,%obj,%prevState) {
|
||||
DeployedTree::onDestroyed(%this,%obj,%prevState);
|
||||
}
|
||||
|
||||
function DeployedTree1::onDestroyed(%this,%obj,%prevState) {
|
||||
DeployedTree::onDestroyed(%this,%obj,%prevState);
|
||||
}
|
||||
|
||||
function DeployedTree2::onDestroyed(%this,%obj,%prevState) {
|
||||
DeployedTree::onDestroyed(%this,%obj,%prevState);
|
||||
}
|
||||
|
||||
function DeployedTree3::onDestroyed(%this,%obj,%prevState) {
|
||||
DeployedTree::onDestroyed(%this,%obj,%prevState);
|
||||
}
|
||||
|
||||
function DeployedTree4::onDestroyed(%this,%obj,%prevState) {
|
||||
DeployedTree::onDestroyed(%this,%obj,%prevState);
|
||||
}
|
||||
|
||||
function DeployedTree5::onDestroyed(%this,%obj,%prevState) {
|
||||
DeployedTree::onDestroyed(%this,%obj,%prevState);
|
||||
}
|
||||
|
||||
function DeployedTree6::onDestroyed(%this,%obj,%prevState) {
|
||||
DeployedTree::onDestroyed(%this,%obj,%prevState);
|
||||
}
|
||||
|
||||
function DeployedTree7::onDestroyed(%this,%obj,%prevState) {
|
||||
DeployedTree::onDestroyed(%this,%obj,%prevState);
|
||||
}
|
||||
|
||||
function DeployedTree8::onDestroyed(%this,%obj,%prevState) {
|
||||
DeployedTree::onDestroyed(%this,%obj,%prevState);
|
||||
}
|
||||
|
||||
function DeployedTree9::onDestroyed(%this,%obj,%prevState) {
|
||||
DeployedTree::onDestroyed(%this,%obj,%prevState);
|
||||
}
|
||||
|
||||
function DeployedTree10::onDestroyed(%this,%obj,%prevState) {
|
||||
DeployedTree::onDestroyed(%this,%obj,%prevState);
|
||||
}
|
||||
|
||||
function DeployedTree11::onDestroyed(%this,%obj,%prevState) {
|
||||
DeployedTree::onDestroyed(%this,%obj,%prevState);
|
||||
}
|
||||
|
||||
function DeployedTree12::onDestroyed(%this,%obj,%prevState) {
|
||||
DeployedTree::onDestroyed(%this,%obj,%prevState);
|
||||
}
|
||||
|
||||
function DeployedTree13::onDestroyed(%this,%obj,%prevState) {
|
||||
DeployedTree::onDestroyed(%this,%obj,%prevState);
|
||||
}
|
||||
393
scripts/packs/tripwire.cs
Normal file
393
scripts/packs/tripwire.cs
Normal file
|
|
@ -0,0 +1,393 @@
|
|||
// Tripwire
|
||||
|
||||
datablock ForceFieldBareData(TripField) : DeployedForceField {
|
||||
baseTranslucency = 0.1;
|
||||
powerOffTranslucency = 0.0;
|
||||
teamPermiable = true;
|
||||
otherPermiable = true;
|
||||
color = "1 0 0";
|
||||
powerOffColor = "0.0 0.0 0.0";
|
||||
deployedFrom = "";
|
||||
needsPower = false;
|
||||
};
|
||||
|
||||
datablock AudioProfile(TripwireSound) {
|
||||
filename = "fx/misc/rolechange.wav";
|
||||
description = AudioClosest3d;
|
||||
preload = true;
|
||||
};
|
||||
|
||||
datablock TriggerData(TripTrigger) {
|
||||
// TODO - check this
|
||||
tickPeriodMS = 200;
|
||||
};
|
||||
|
||||
function TripTrigger::onEnterTrigger(%data, %obj, %colObj) {
|
||||
// TODO - keep trip FF scaled down until trip is triggered - vehicle fix?
|
||||
%baseObj = %obj.baseObj;
|
||||
%baseObj.triggerCount++;
|
||||
if (%baseObj.triggerCount > 1)
|
||||
return;
|
||||
%baseObj.play3D(TripwireSound);
|
||||
if (isObject(%baseObj.tripField)) {
|
||||
cancel(%baseObj.tripField.hideSched);
|
||||
%baseObj.tripField.getDataBlock().gainPower(%baseObj.tripField);
|
||||
}
|
||||
%tripMode = %baseObj.tripMode;
|
||||
while (%tripMode > 1 && %tripMode > -1 && %tripMode !$= "")
|
||||
%tripMode = %tripMode - 2;
|
||||
%count = getWordCount($PowerList);
|
||||
for(%i=0;%i<%count;%i++) {
|
||||
%powerObj = getWord($PowerList,%i);
|
||||
if (vectorDist(%baseObj.getPosition(),%powerObj.getPosition()) < %baseObj.switchRadius
|
||||
&& !%powerObj.isRemoved && %baseObj.powerFreq == %powerObj.powerFreq
|
||||
&& %baseObj.team == %powerObj.team) {
|
||||
%r = toggleGenerator(%powerObj,!%tripMode);
|
||||
%r1 = firstWord(%r);
|
||||
%r2 = getTaggedString(getWord(%r,1));
|
||||
%r3 = getWord(%r,2);
|
||||
if (%r1 == -3) {
|
||||
cancel(%powerObj.toggleSched);
|
||||
%powerObj.toggleSched = schedule(%r3 + 100,0,toggleGenerator,%powerObj,!%tripMode);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function TripTrigger::onLeaveTrigger(%data, %obj, %colObj) {
|
||||
%baseObj = %obj.baseObj;
|
||||
%baseObj.triggerCount--;
|
||||
if (%baseObj.triggerCount > 0)
|
||||
return;
|
||||
%baseObj.play3D(TripwireSound);
|
||||
if (isObject(%baseObj.tripField)) {
|
||||
cancel(%baseObj.tripField.hideSched);
|
||||
%baseObj.tripField.hideSched = %baseObj.tripField.getDataBlock().schedule(2000,losePower,%baseObj.tripField);
|
||||
}
|
||||
%tripMode = %baseObj.tripMode;
|
||||
if (%tripMode == 2 || %tripMode == 3)
|
||||
return;
|
||||
if (%tripMode == 4 || %tripMode == 5)
|
||||
%timed = true;
|
||||
while (%tripMode > 1 && %tripMode > -1 && %tripMode !$= "")
|
||||
%tripMode = %tripMode - 2;
|
||||
%count = getWordCount($PowerList);
|
||||
for(%i=0;%i<%count;%i++) {
|
||||
%powerObj = getWord($PowerList,%i);
|
||||
if (vectorDist(%baseObj.getPosition(),%powerObj.getPosition()) < %baseObj.switchRadius
|
||||
&& !%powerObj.isRemoved && %baseObj.powerFreq == %powerObj.powerFreq
|
||||
&& %baseObj.team == %powerObj.team) {
|
||||
if (%timed) {
|
||||
cancel(%powerObj.toggleSched);
|
||||
%powerObj.toggleSched = schedule(5000,0,delayedToggleGenerator,%powerObj,%tripMode);
|
||||
}
|
||||
else {
|
||||
%r = toggleGenerator(%powerObj,%tripMode);
|
||||
%r1 = firstWord(%r);
|
||||
%r2 = getTaggedString(getWord(%r,1));
|
||||
%r3 = getWord(%r,2);
|
||||
if (%r1 == -3) {
|
||||
cancel(%powerObj.toggleSched);
|
||||
%powerObj.toggleSched = schedule(%r3 + 100,0,toggleGenerator,%powerObj,%tripMode);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function delayedToggleGenerator(%powerObj,%tripMode) {
|
||||
%r = toggleGenerator(%powerObj,%tripMode);
|
||||
%r1 = firstWord(%r);
|
||||
%r2 = getTaggedString(getWord(%r,1));
|
||||
%r3 = getWord(%r,2);
|
||||
if (%r1 == -3) {
|
||||
cancel(%powerObj.toggleSched);
|
||||
%powerObj.toggleSched = schedule(%r3 + 100,0,toggleGenerator,%powerObj,%tripMode);
|
||||
}
|
||||
}
|
||||
|
||||
function TripTrigger::onTickTrigger(%data, %obj) {
|
||||
}
|
||||
|
||||
function TripTrigger::onTrigger(%this, %triggerId, %on) {
|
||||
}
|
||||
|
||||
datablock StaticShapeData(DeployedTripwire) : StaticShapeDamageProfile {
|
||||
className = "tripwire";
|
||||
shapeFile = "camera.dts";
|
||||
|
||||
maxDamage = 0.2;
|
||||
destroyedLevel = 0.2;
|
||||
disabledLevel = 0.2;
|
||||
|
||||
isShielded = false;
|
||||
energyPerDamagePoint = 40;
|
||||
maxEnergy = 30;
|
||||
rechargeRate = 0.05;
|
||||
|
||||
explosion = HandGrenadeExplosion;
|
||||
expDmgRadius = 1.0;
|
||||
expDamage = 0.3;
|
||||
expImpulse = 500;
|
||||
|
||||
dynamicType = $TypeMasks::StaticShapeObjectType;
|
||||
deployedObject = true;
|
||||
cmdCategory = "DSupport";
|
||||
cmdIcon = CMDSensorIcon;
|
||||
cmdMiniIconName = "commander/MiniIcons/com_deploymotionsensor";
|
||||
targetNameTag = 'Deployed';
|
||||
targetTypeTag = 'Tripwire';
|
||||
deployAmbientThread = true;
|
||||
debrisShapeName = "debris_generic_small.dts";
|
||||
debris = DeployableDebris;
|
||||
heatSignature = 0;
|
||||
emap = true;
|
||||
};
|
||||
|
||||
datablock ShapeBaseImageData(TripwireDeployableImage) {
|
||||
mass = 1;
|
||||
emap = true;
|
||||
shapeFile = "camera.dts";
|
||||
item = TripwireDeployable;
|
||||
mountPoint = 1;
|
||||
offset = "0 0 0";
|
||||
rotation = "-1 0 0 90";
|
||||
deployed = DeployedTripwire;
|
||||
heatSignature = 0;
|
||||
|
||||
stateName[0] = "Idle";
|
||||
stateTransitionOnTriggerDown[0] = "Activate";
|
||||
|
||||
stateName[1] = "Activate";
|
||||
stateScript[1] = "onActivate";
|
||||
stateTransitionOnTriggerUp[1] = "Idle";
|
||||
|
||||
isLarge = false;
|
||||
maxDepSlope = 360;
|
||||
deploySound = ItemPickupSound;
|
||||
|
||||
minDeployDis = 0.25;
|
||||
maxDeployDis = 5;
|
||||
};
|
||||
|
||||
datablock ItemData(TripwireDeployable) {
|
||||
className = Pack;
|
||||
catagory = "Deployables";
|
||||
shapeFile = "stackable1s.dts";
|
||||
mass = 1;
|
||||
elasticity = 0.2;
|
||||
friction = 0.6;
|
||||
pickupRadius = 3;
|
||||
rotate = true;
|
||||
image = "TripwireDeployableImage";
|
||||
pickUpName = "a tripwire pack";
|
||||
heatSignature = 0;
|
||||
emap = true;
|
||||
};
|
||||
|
||||
function TripwireDeployableImage::testNoTerrainFound(%item) {
|
||||
// don't check this for non-Landspike turret deployables
|
||||
}
|
||||
|
||||
function TripwireDeployable::onPickup(%this, %obj, %shape, %amount) {
|
||||
// created to prevent console errors
|
||||
}
|
||||
|
||||
function TripwireDeployableImage::onDeploy(%item, %plyr, %slot) {
|
||||
%className = "StaticShape";
|
||||
|
||||
%playerVector = vectorNormalize(-1 * getWord(%plyr.getEyeVector(),1) SPC getWord(%plyr.getEyeVector(),0) SPC "0");
|
||||
|
||||
if (%item.surfaceinher == 0) {
|
||||
if (vAbs(floorVec(%item.surfaceNrm,100)) $= "0 0 1")
|
||||
%item.surfaceNrm2 = %playerVector;
|
||||
else
|
||||
%item.surfaceNrm2 = vectorNormalize(vectorCross(%item.surfaceNrm,"0 0 1"));
|
||||
}
|
||||
|
||||
%rot = fullRot(%item.surfaceNrm,%item.surfaceNrm2);
|
||||
|
||||
%deplObj = new (%className)() {
|
||||
dataBlock = DeployedTripwire;
|
||||
};
|
||||
|
||||
%deplObj.switchRadius = getWord($packSetting["tripwire",%plyr.packSet],0);
|
||||
%deplObj.fieldMode = getWord($packSetting["tripwire",%plyr.packSet],1);
|
||||
%deplObj.tripMode = %plyr.expertSet;
|
||||
if (%deplObj.fieldMode == 1)
|
||||
%deplObj.beamRange = 160;
|
||||
else
|
||||
%deplObj.beamRange = 30;
|
||||
|
||||
%deplObj.tripField = new ForceFieldBare() {
|
||||
dataBlock = TripField;
|
||||
scale = "0.05 0.05 0.1";
|
||||
};
|
||||
|
||||
%deplObj.tripField.pzone.delete();
|
||||
|
||||
%deplObj.tripTrigger = new Trigger() {
|
||||
dataBlock = TripTrigger;
|
||||
polyhedron = "0 1 0 1 0 0 0 -1 0 0 0 1";
|
||||
scale = "0.05 0.05 0.1";
|
||||
};
|
||||
|
||||
%deplObj.tripTrigger.baseObj = %deplObj;
|
||||
|
||||
// set orientation
|
||||
%deplObj.setTransform(%item.surfacePt SPC %rot);
|
||||
adjustTripwire(%deplObj);
|
||||
|
||||
// set the recharge rate right away
|
||||
if (%deplObj.getDatablock().rechargeRate)
|
||||
%deplObj.setRechargeRate(%deplObj.getDatablock().rechargeRate);
|
||||
|
||||
// set team, owner, and handle
|
||||
%deplObj.team = %plyr.client.Team;
|
||||
%deplObj.setOwner(%plyr);
|
||||
|
||||
// set power frequency
|
||||
%deplObj.powerFreq = %plyr.powerFreq;
|
||||
setTargetName(%deplObj.target,addTaggedString("Frequency" SPC %deplObj.powerFreq));
|
||||
|
||||
// set the sensor group if it needs one
|
||||
if (%deplObj.getTarget() != -1)
|
||||
setTargetSensorGroup(%deplObj.getTarget(), %plyr.client.team);
|
||||
|
||||
// place the deployable in the MissionCleanup/Deployables group (AI reasons)
|
||||
addToDeployGroup(%deplObj);
|
||||
|
||||
//let the AI know as well...
|
||||
AIDeployObject(%plyr.client, %deplObj);
|
||||
|
||||
// play the deploy sound
|
||||
serverPlay3D(%item.deploySound, %deplObj.getTransform());
|
||||
|
||||
// increment the team count for this deployed object
|
||||
$TeamDeployedCount[%plyr.team, %item.item]++;
|
||||
|
||||
%deplObj.deploy();
|
||||
|
||||
addDSurface(%item.surface,%deplObj);
|
||||
|
||||
// take the deployable off the player's back and out of inventory
|
||||
%plyr.unmountImage(%slot);
|
||||
%plyr.decInventory(%item.item, 1);
|
||||
|
||||
return %deplObj;
|
||||
}
|
||||
|
||||
function DeployedTripwire::onDestroyed(%this,%obj,%prevState) {
|
||||
if (%obj.isRemoved)
|
||||
return;
|
||||
%obj.isRemoved = true;
|
||||
Parent::onDestroyed(%this,%obj,%prevState);
|
||||
$TeamDeployedCount[%obj.team, TripwireDeployable]--;
|
||||
remDSurface(%obj);
|
||||
%obj.schedule(500, "delete");
|
||||
if (isObject(%obj.tripField))
|
||||
%obj.tripField.schedule(500, "delete");
|
||||
if (isObject(%obj.tripTrigger))
|
||||
%obj.tripTrigger.schedule(500, "delete");
|
||||
}
|
||||
|
||||
function DeployedTripwire::disassemble(%data,%plyr,%obj) {
|
||||
if (isObject(%obj.tripField))
|
||||
%obj.tripField.delete();
|
||||
if (isObject(%obj.tripTrigger))
|
||||
%obj.tripTrigger.delete();
|
||||
disassemble(%data,%plyr,%obj);
|
||||
}
|
||||
|
||||
function adjustTripwire(%obj) {
|
||||
if (!isObject(%obj))
|
||||
return;
|
||||
cancel(%obj.adjustSched);
|
||||
%pos = %obj.getPosition();
|
||||
%nrm = realVec(%obj,"0 0 1");
|
||||
%nrm2 = realVec(%obj,"1 0 0");
|
||||
%nrm3 = realVec(%obj,"0 1 0");
|
||||
|
||||
// TODO - temporary - remove
|
||||
if ($TripWireFlareMode == true) {
|
||||
%pos = vectorAdd(%obj.getPosition(),vectorScale(%nrm,0.35));
|
||||
%vec = vectorScale(%nrm,0.7);
|
||||
%p = new FlareProjectile() {
|
||||
dataBlock = FlareGrenadeProj;
|
||||
initialDirection = %vec;
|
||||
initialPosition = %pos;
|
||||
sourceObject = %obj;
|
||||
sourceSlot = 0;
|
||||
};
|
||||
FlareSet.add(%p);
|
||||
MissionCleanup.add(%p);
|
||||
%p.schedule(6000,"delete");
|
||||
}
|
||||
|
||||
// save ourselves re-doing some calculations
|
||||
%mask = $TypeMasks::VehicleObjectType | $TypeMasks::StationObjectType | $TypeMasks::GeneratorObjectType | $TypeMasks::SensorObjectType | $TypeMasks::TurretObjectType | $TypeMasks::TerrainObjectType | $TypeMasks::InteriorObjectType | $TypeMasks::StaticObjectType | $TypeMasks::MoveableObjectType | $TypeMasks::DamagableItemObjectType;
|
||||
if (%obj.fieldMode == 1) {
|
||||
// new pad data can be done here for both field and trigger
|
||||
// "normal" (no hit) beamRange limited to 0.5m - 8m
|
||||
// max beamRange limited to 0.5m - 160m
|
||||
%pad = pad(%obj.getPosition() SPC realVec(%obj,"0 0 1") SPC realVec(%obj,"1 0 0"),0.5 SPC limit(%obj.beamRange,0.5,8) SPC limit(%obj.beamRange,0.5,160),"-0.5 -0.5 -0.5",%mask,%obj.tripField);
|
||||
%newScale = getWords(%pad,0,2);
|
||||
%newPos = getWords(%pad,3,5);
|
||||
%newRot = getWords(%pad,6,9);
|
||||
}
|
||||
else {
|
||||
// beam
|
||||
%dist = rayDist(vectorAdd(%pos,vectorScale(%nrm,0.1)) SPC %nrm,1 SPC %obj.beamRange SPC %obj.beamRange,%mask,%obj.tripField);
|
||||
}
|
||||
|
||||
if (isObject(%obj.tripField)) {
|
||||
%obj2 = %obj.tripField;
|
||||
if (%obj.fieldMode == 0) {
|
||||
%scale = %obj2.getScale();
|
||||
%newPos = vectorAdd(%pos,vectorAdd(vectorScale(%nrm2,-(getWord(%scale,0) / 2)),vectorScale(%nrm3,-(getWord(%scale,1) / 2))));
|
||||
%newRot = %obj.getRotation();
|
||||
%newScale = getWords(%scale,0,1) SPC %dist;
|
||||
}
|
||||
%oldData = %obj2.oldData;
|
||||
%newData = %newPos SPC %newRot SPC %newScale;
|
||||
if (%oldData !$= %newData && %obj.triggerCount == 0) {
|
||||
// call gainPower() before modifying forcefield!
|
||||
%obj2.getDataBlock().gainPower(%obj2);
|
||||
%obj2.setTransform(%newPos SPC %newRot);
|
||||
%obj2.setScale(%newScale);
|
||||
%obj2.oldData = %newData;
|
||||
cancel(%obj2.hideSched);
|
||||
%obj2.hideSched = %obj2.getDataBlock().schedule(2000,losePower,%obj2);
|
||||
}
|
||||
}
|
||||
if (isObject(%obj.tripTrigger)) {
|
||||
%obj2 = %obj.tripTrigger;
|
||||
if (%obj.fieldMode == 0) {
|
||||
%scale = %obj2.getScale();
|
||||
%newPos = vectorAdd(%pos,vectorAdd(vectorScale(%nrm2,-(getWord(%scale,0) / 2)),vectorScale(%nrm3,-(getWord(%scale,1) / 2))));
|
||||
%newRot = %obj.getRotation();
|
||||
%newScale = getWords(%scale,0,1) SPC %dist;
|
||||
}
|
||||
%oldData = %obj2.oldData;
|
||||
%newData = %newPos SPC %newRot SPC %newScale;
|
||||
if (%oldData !$= %newData && %obj.triggerCount == 0) {
|
||||
%obj2.setTransform(%newPos SPC %newRot);
|
||||
%obj2.setScale(%newScale);
|
||||
%obj2.oldData = %newData;
|
||||
}
|
||||
}
|
||||
%obj.adjustSched = schedule(1000,0,adjustTripwire,%obj);
|
||||
}
|
||||
|
||||
function TripwireDeployableImage::onMount(%data, %obj, %node) {
|
||||
%obj.hasTripwire = true; // set for tripcheck
|
||||
%obj.packSet = 2;
|
||||
%obj.expertSet = 0;
|
||||
displayPowerFreq(%obj);
|
||||
}
|
||||
|
||||
function TripwireDeployableImage::onUnmount(%data, %obj, %node) {
|
||||
%obj.packSet = 0;
|
||||
%obj.expertSet = 0;
|
||||
%obj.hasTripwire = "";
|
||||
}
|
||||
141
scripts/packs/turretpack.cs
Normal file
141
scripts/packs/turretpack.cs
Normal file
|
|
@ -0,0 +1,141 @@
|
|||
// turretpack.cs - turret pack
|
||||
//
|
||||
|
||||
datablock ShapeBaseImageData(TurretDeployableImage)
|
||||
{
|
||||
mass = 1;
|
||||
emap = true;
|
||||
|
||||
shapeFile = "stackable1s.dts";
|
||||
item = TurretBasePack;
|
||||
mountPoint = 1;
|
||||
offset = "0 -0.2 0";
|
||||
|
||||
minDeployDis = 0.5;
|
||||
maxDeployDis = 5.0;
|
||||
|
||||
deployed = TurretDeployedBase;
|
||||
heatSignature = 0;
|
||||
|
||||
stateName[0] = "Idle";
|
||||
stateTransitionOnTriggerDown[0] = "Activate";
|
||||
|
||||
|
||||
|
||||
stateName[1] = "Activate";
|
||||
stateScript[1] = "onActivate";
|
||||
stateTransitionOnTriggerUp[1] = "Idle";
|
||||
|
||||
isLarge = true;
|
||||
maxDepSlope = 360;
|
||||
deploySound = StationDeploySound;
|
||||
};
|
||||
|
||||
datablock ItemData(TurretBasePack)
|
||||
{
|
||||
className = Pack;
|
||||
catagory = "Deployables";
|
||||
shapeFile = "stackable1s.dts";
|
||||
mass = 1;
|
||||
elasticity = 0.2;
|
||||
friction = 0.6;
|
||||
pickupRadius = 1;
|
||||
rotate = false;
|
||||
image = "TurretDeployableImage";
|
||||
pickUpName = "a base turret pack";
|
||||
heatSignature = 0;
|
||||
|
||||
computeCRC = true;
|
||||
emap = true;
|
||||
|
||||
};
|
||||
|
||||
datablock TurretData(TurretDeployedBase) : TurretDamageProfile
|
||||
{
|
||||
className = DeployedTurret;
|
||||
shapeFile = "turret_base_large.dts";
|
||||
|
||||
rechargeRate = 0.31;
|
||||
|
||||
selfPower = true;
|
||||
|
||||
needsPower = true;
|
||||
mass = 1;
|
||||
maxDamage = 2.25;
|
||||
destroyedLevel = 2.25;
|
||||
disabledLevel = 1.35;
|
||||
repairRate = 0;
|
||||
explosion = TurretExplosion;
|
||||
expDmgRadius = 15.0;
|
||||
expDamage = 0.7;
|
||||
expImpulse = 2000.0;
|
||||
|
||||
deployedObject = true;
|
||||
|
||||
thetaMin = 15;
|
||||
thetaMax = 140;
|
||||
//thetaNull = 90;
|
||||
|
||||
isShielded = true;
|
||||
energyPerDamagePoint = 50;
|
||||
maxEnergy = 150;
|
||||
|
||||
humSound = SensorHumSound;
|
||||
heatSignature = 1;
|
||||
pausePowerThread = true;
|
||||
|
||||
canControl = true;
|
||||
cmdCategory = "DTactical";
|
||||
cmdIcon = CMDTurretIcon;
|
||||
cmdMiniIconName = "commander/MiniIcons/com_turret_grey";
|
||||
targetNameTag = 'Deployed Base';
|
||||
targetTypeTag = 'Turret';
|
||||
sensorData = TurretBaseSensorObj;
|
||||
sensorRadius = TurretBaseSensorObj.detectRadius;
|
||||
sensorColor = "0 212 45";
|
||||
|
||||
firstPersonOnly = true;
|
||||
|
||||
debrisShapeName = "debris_generic.dts";
|
||||
debris = TurretDebris;
|
||||
};
|
||||
|
||||
function TurretBasePack::onPickup(%this, %obj, %shape, %amount)
|
||||
{
|
||||
// created to prevent console errors
|
||||
}
|
||||
|
||||
function TurretDeployableImage::onDeploy(%item, %plyr, %slot)
|
||||
{
|
||||
%deplObj = Parent::onDeploy(%item, %plyr, %slot);
|
||||
%origBarrel = %item.item.origBarrel;
|
||||
if(%origBarrel !$= "")
|
||||
{
|
||||
%deplObj.mountImage(%origBarrel, 0, false);
|
||||
%item.item.origBarrel = "";
|
||||
}
|
||||
%playerVector = vectorNormalize(getWord(%plyr.getEyeVector(),1) SPC -1 * getWord(%plyr.getEyeVector(),0) SPC "0");
|
||||
|
||||
%item.surfacenrm = VectorNormalize(%item.surfacenrm);
|
||||
//echo(%playervector);
|
||||
if (vAbs(floorVec(%item.surfaceNrm,100)) $= "0 0 1")
|
||||
%item.surfaceNrm2 = vectorScale(%playerVector,1);
|
||||
else
|
||||
%item.surfaceNrm2 = vectorNormalize(vectorCross(%item.surfaceNrm,"0 0 1"));
|
||||
|
||||
%rot = fullRot(%item.surfaceNrm,%item.surfaceNrm2);
|
||||
|
||||
%deplObj.setTransform(%item.surfacePt SPC %rot);
|
||||
//%deplObj.setSelfPowered();
|
||||
//%deplObj.playThread($PowerThread,"Power");
|
||||
|
||||
addDSurface(%item.surface,%deplObj);
|
||||
addToDeployGroup(%deplObj);
|
||||
%deplObj.powerFreq = %plyr.powerFreq;
|
||||
%deplObj.team = %plyr.team;
|
||||
checkPowerObject(%deplObj);
|
||||
}
|
||||
|
||||
function TurretDeployableImage::onMount(%data, %obj, %node) {
|
||||
displayPowerFreq(%obj);
|
||||
}
|
||||
764
scripts/packs/vehiclepad.cs
Normal file
764
scripts/packs/vehiclepad.cs
Normal file
|
|
@ -0,0 +1,764 @@
|
|||
//======================================
|
||||
// made by dynablade
|
||||
//====================================== Deployable Vehicle Pad
|
||||
|
||||
|
||||
datablock StaticShapeData(DeployableVehicleStation) : StaticShapeDamageProfile
|
||||
{
|
||||
className = Station;
|
||||
catagory = "Stations";
|
||||
shapeFile = "Vehicle_pad_station.dts";
|
||||
maxDamage = 7.5;
|
||||
destroyedLevel = 7.5;
|
||||
disabledLevel = 7.5;
|
||||
explosion = ShapeExplosion;
|
||||
expDmgRadius = 10.0;
|
||||
expDamage = 0.4;
|
||||
expImpulse = 1500.0;
|
||||
dynamicType = $TypeMasks::StationObjectType;
|
||||
isShielded = true;
|
||||
energyPerDamagePoint = 500;
|
||||
maxEnergy = 250;
|
||||
rechargeRate = 0.31;
|
||||
humSound = StationVehicleHumSound;
|
||||
|
||||
cmdCategory = "Support";
|
||||
cmdIcon = CMDVehicleStationIcon;
|
||||
cmdMiniIconName = "commander/MiniIcons/com_vehicle_pad_inventory";
|
||||
targetTypeTag = 'Deployable Vehicle Station';
|
||||
|
||||
debrisShapeName = "debris_generic.dts";
|
||||
debris = StationDebris;
|
||||
needsPower = true;
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployableVehiclePad)
|
||||
{
|
||||
className = vpad;
|
||||
catagory = "Stations";
|
||||
shapeFile = "Vehicle_pad.dts";
|
||||
maxDamage = 7.5;
|
||||
destroyedLevel = 7.5;
|
||||
disabledLevel = 7.5;
|
||||
explosion = ShapeExplosion;
|
||||
expDmgRadius = 10.0;
|
||||
expDamage = 0.4;
|
||||
expImpulse = 1500.0;
|
||||
rechargeRate = 0.05;
|
||||
targetTypeTag = 'Deployable Vehicle Station';
|
||||
needsPower = true;
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployableVehiclePad2) : DeployableVehiclePad
|
||||
{
|
||||
className = vpad;
|
||||
shapeFile = "station_teleport.dts";
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
datablock StaticShapeData(DeployableVehiclePadBottom) : StaticShapeDamageProfile {
|
||||
className = "floor";
|
||||
shapeFile = "bmiscf.dts";
|
||||
|
||||
maxDamage = 4;
|
||||
destroyedLevel = 4;
|
||||
disabledLevel = 3.5;
|
||||
|
||||
isShielded = true;
|
||||
energyPerDamagePoint = 30;
|
||||
maxEnergy = 200;
|
||||
rechargeRate = 0.25;
|
||||
|
||||
explosion = HandGrenadeExplosion;
|
||||
expDmgRadius = 3.0;
|
||||
expDamage = 0.1;
|
||||
expImpulse = 200.0;
|
||||
|
||||
dynamicType = $TypeMasks::StaticShapeObjectType;
|
||||
deployedObject = true;
|
||||
cmdCategory = "DSupport";
|
||||
cmdIcon = CMDSensorIcon;
|
||||
cmdMiniIconName = "commander/MiniIcons/com_deploymotionsensor";
|
||||
targetNameTag = 'Medium Blast floor';
|
||||
deployAmbientThread = true;
|
||||
debrisShapeName = "debris_generic_small.dts";
|
||||
debris = DeployableDebris;
|
||||
heatSignature = 0;
|
||||
needsPower = true;
|
||||
};
|
||||
|
||||
datablock StaticShapeData(PotPipe) : DeployableVehiclePadBottom
|
||||
{
|
||||
shapeFile = "silver_pole.dts";
|
||||
targetNameTag = 'Pot Powered';
|
||||
targetTypeTag = 'Alloy forge';
|
||||
};
|
||||
|
||||
datablock ParticleData(DVPADP)
|
||||
{
|
||||
dragCoeffiecient = 0.0;
|
||||
gravityCoefficient = 0.0;
|
||||
inheritedVelFactor = 0.0;
|
||||
|
||||
lifetimeMS = 1500;
|
||||
lifetimeVarianceMS = 0;
|
||||
|
||||
spinRandomMin = 30.0;
|
||||
spinRandomMax = 30.0;
|
||||
windcoefficient = 0;
|
||||
textureName = "skins/jetflare03";
|
||||
|
||||
colors[0] = "0.3 0.3 1.0 0.1";
|
||||
colors[1] = "0.3 0.3 1.0 1";
|
||||
colors[2] = "0.3 0.3 1.0 1";
|
||||
colors[3] = "0.3 0.3 1.0 0.1";
|
||||
|
||||
sizes[0] = 5;
|
||||
sizes[1] = 5;
|
||||
sizes[2] = 5;
|
||||
sizes[3] = 5;
|
||||
|
||||
times[0] = 0.25;
|
||||
times[1] = 0.5;
|
||||
times[2] = 0.75;
|
||||
times[3] = 1;
|
||||
|
||||
};
|
||||
|
||||
datablock ParticleEmitterData(DVPADE)
|
||||
{
|
||||
lifetimeMS = 10;
|
||||
ejectionPeriodMS = 10;
|
||||
periodVarianceMS = 0;
|
||||
|
||||
ejectionVelocity = 0.01;
|
||||
velocityVariance = 0.0;
|
||||
ejectionoffset = 8;
|
||||
thetaMin = 80.0;
|
||||
thetaMax = 100.0;
|
||||
|
||||
phiReferenceVel = "180";
|
||||
phiVariance = "5";
|
||||
orientParticles = false;
|
||||
orientOnVelocity = false;
|
||||
|
||||
particles = "DVPADP";
|
||||
};
|
||||
|
||||
datablock ParticleData(SIGMAP)
|
||||
{
|
||||
dragCoeffiecient = 0.0;
|
||||
gravityCoefficient = -0.5;
|
||||
inheritedVelFactor = 0.0;
|
||||
|
||||
lifetimeMS = 1500;
|
||||
lifetimeVarianceMS = 1000;
|
||||
|
||||
spinRandomMin = -30.0;
|
||||
spinRandomMax = 30.0;
|
||||
windcoefficient = 0;
|
||||
textureName = "skins/jetflare03";
|
||||
|
||||
colors[0] = "1 1 0 0"; //Wacky collors :P
|
||||
colors[1] = "0 1 1 1";
|
||||
colors[2] = "1 0 1 1";
|
||||
colors[3] = "0 1 0 1";
|
||||
|
||||
sizes[0] = 5;
|
||||
sizes[1] = 5;
|
||||
sizes[2] = 5;
|
||||
sizes[3] = 5;
|
||||
|
||||
times[0] = 0.5;
|
||||
times[1] = 0.6;
|
||||
times[2] = 0.8;
|
||||
times[3] = 1;
|
||||
|
||||
};
|
||||
|
||||
datablock ParticleEmitterData(SIGMAE)
|
||||
{
|
||||
lifetimeMS = 10;
|
||||
ejectionPeriodMS = 50;
|
||||
periodVarianceMS = 0;
|
||||
|
||||
ejectionVelocity = 1.0;
|
||||
velocityVariance = 0.5;
|
||||
ejectionoffset = 0.5;
|
||||
thetaMin = 80.0;
|
||||
thetaMax = 100.0;
|
||||
|
||||
phiReferenceVel = "0";
|
||||
phiVariance = "360";
|
||||
orientParticles = false;
|
||||
orientOnVelocity = false;
|
||||
|
||||
particles = "SIGMAP";
|
||||
};
|
||||
|
||||
|
||||
function DeployableVehicleStation::onAdd(%this, %obj)
|
||||
{
|
||||
Parent::onAdd(%this, %obj);
|
||||
|
||||
%obj.setRechargeRate(%obj.getDatablock().rechargeRate);
|
||||
%trigger = new Trigger()
|
||||
{
|
||||
dataBlock = stationTrigger;
|
||||
polyhedron = "-0.75 0.75 0.0 1.5 0.0 0.0 0.0 -1.5 0.0 0.0 0.0 2.0";
|
||||
};
|
||||
MissionCleanup.add(%trigger);
|
||||
%trigger.setTransform(%obj.getTransform());
|
||||
%trigger.station = %obj;
|
||||
%obj.trigger = %trigger;
|
||||
}
|
||||
|
||||
function DeployableVehicleStation::stationReady(%data, %obj)
|
||||
{
|
||||
// Make sure none of the other popup huds are active:
|
||||
messageClient( %obj.triggeredBy.client, 'CloseHud', "", 'scoreScreen' );
|
||||
messageClient( %obj.triggeredBy.client, 'CloseHud', "", 'inventoryScreen' );
|
||||
|
||||
//Display the Vehicle Station GUI
|
||||
commandToClient(%obj.triggeredBy.client, 'StationVehicleShowHud');
|
||||
}
|
||||
|
||||
function DeployableVehicleStation::stationFinished(%data, %obj)
|
||||
{
|
||||
//Hide the Vehicle Station GUI
|
||||
commandToClient(%obj.triggeredBy.client, 'StationVehicleHideHud');
|
||||
}
|
||||
|
||||
function DeployableVehicleStation::getSound(%data, %forward)
|
||||
{
|
||||
if(%forward)
|
||||
return "StationVehicleAcitvateSound";
|
||||
else
|
||||
return "StationVehicleDeactivateSound";
|
||||
}
|
||||
|
||||
function DeployableVehicleStation::setPlayersPosition(%data, %obj, %trigger, %colObj)
|
||||
{
|
||||
%vel = getWords(%colObj.getVelocity(), 0, 1) @ " 0";
|
||||
if((VectorLen(%vel) < 22) && (%obj.triggeredBy != %colObj))
|
||||
{
|
||||
%posXY = getWords(%trigger.getTransform(),0 ,1);
|
||||
%posZ = getWord(%trigger.getTransform(), 2);
|
||||
%rotZ = getWord(%obj.getTransform(), 5);
|
||||
%angle = getWord(%obj.getTransform(), 6);
|
||||
%angle += 3.141592654;
|
||||
if(%angle > 6.283185308)
|
||||
%angle = %angle - 6.283185308;
|
||||
%colObj.setvelocity("0 0 0");
|
||||
%colObj.setTransform(%posXY @ " " @ %posZ + 0.2 @ " " @ "0 0 " @ %rotZ @ " " @ %angle );//center player on object
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
function DeployableVehiclePad::onAdd(%this, %obj)
|
||||
{
|
||||
Parent::onAdd(%this, %obj);
|
||||
|
||||
%obj.ready = true;
|
||||
%obj.setRechargeRate(%obj.getDatablock().rechargeRate);
|
||||
}
|
||||
|
||||
function DeployableVehiclePad2::onAdd(%this, %obj)
|
||||
{
|
||||
Parent::onAdd(%this, %obj);
|
||||
|
||||
%obj.ready = true;
|
||||
%obj.setRechargeRate(%obj.getDatablock().rechargeRate);
|
||||
}
|
||||
|
||||
|
||||
function GiveStation(%obj,%transform)
|
||||
{
|
||||
%pos = getWords(%transform,0,2);
|
||||
%rot = getWords(%transform,3,5) SPC (getWord(%transform,6)/3.14*180);
|
||||
%sv = new StaticShape()
|
||||
{
|
||||
scale = "1 1 1";
|
||||
dataBlock = DeployableVehicleStation;
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
team = %obj.team;
|
||||
position = %pos;
|
||||
rotation = %rot;
|
||||
};
|
||||
|
||||
%sv.setTransform(%transform);
|
||||
%sv.powerFreq = %obj.powerFreq;
|
||||
MissionCleanup.add(%sv);
|
||||
//%sv.getDataBlock().gainPower(%sv);
|
||||
//%obj.getDatablock().gainPower(%obj);
|
||||
checkPowerObject(%obj);
|
||||
checkPowerObject(%sv);
|
||||
%sv.pad = %obj;
|
||||
%obj.station = %sv;
|
||||
%sv.trigger.mainObj = %obj;
|
||||
%sv.trigger.disableObj = %sv;
|
||||
adjustTrigger(%sv);
|
||||
|
||||
//Remove unwanted vehicles
|
||||
if(%obj.scoutVehicle !$= "Removed")
|
||||
%sv.vehicle[scoutvehicle] = true;
|
||||
if(%obj.assaultVehicle !$= "Removed")
|
||||
%sv.vehicle[assaultVehicle] = true;
|
||||
if(%obj.AlternateMobileBase !$= "Removed")
|
||||
%sv.vehicle[AlternateMobileBase] = true;
|
||||
if(%obj.mobileBaseVehicle !$= "Removed") // TeleToMPB();
|
||||
%sv.vehicle[mobileBasevehicle] = true;
|
||||
if(%obj.PyroXL !$= "Removed")
|
||||
%sv.vehicle[PyroXL] = true;
|
||||
if(%obj.scoutFlyer !$= "Removed")
|
||||
%sv.vehicle[scoutFlyer] = true;
|
||||
if(%obj.bomberFlyer !$= "Removed")
|
||||
%sv.vehicle[bomberFlyer] = true;
|
||||
if(%obj.hapcFlyer !$= "Removed")
|
||||
%sv.vehicle[hapcFlyer] = true;
|
||||
if(%obj.hoverBike !$= "Removed")
|
||||
%sv.vehicle[hoverBike] = true;
|
||||
return %sv;
|
||||
}
|
||||
|
||||
function DeployableVehiclePad::onEndSequence(%data, %obj, %thread)
|
||||
{
|
||||
if(%thread == $ActivateThread)
|
||||
{
|
||||
%obj.ready = true;
|
||||
%obj.stopThread($ActivateThread);
|
||||
}
|
||||
Parent::onEndSequence(%data, %obj, %thread);
|
||||
}
|
||||
|
||||
function DeployableVehiclePad2::onEndSequence(%data, %obj, %thread)
|
||||
{
|
||||
if(%thread == $ActivateThread)
|
||||
{
|
||||
%obj.ready = true;
|
||||
%obj.stopThread($ActivateThread);
|
||||
}
|
||||
Parent::onEndSequence(%data, %obj, %thread);
|
||||
}
|
||||
|
||||
function DeployableVehiclePad::gainPower(%data, %obj)
|
||||
{
|
||||
if (isObject(%obj.station))
|
||||
%obj.station.setSelfPowered();
|
||||
Parent::gainPower(%data, %obj);
|
||||
}
|
||||
|
||||
function DeployableVehiclePad2::gainPower(%data, %obj)
|
||||
{
|
||||
if (isObject(%obj.station))
|
||||
%obj.station.setSelfPowered();
|
||||
Parent::gainPower(%data, %obj);
|
||||
}
|
||||
|
||||
function DeployableVehiclePad::losePower(%data, %obj)
|
||||
{
|
||||
if (isObject(%obj.station))
|
||||
%obj.station.clearSelfPowered();
|
||||
Parent::losePower(%data, %obj);
|
||||
}
|
||||
|
||||
function DeployableVehiclePad2::losePower(%data, %obj)
|
||||
{
|
||||
if (isObject(%obj.station))
|
||||
%obj.station.clearSelfPowered();
|
||||
Parent::losePower(%data, %obj);
|
||||
}
|
||||
|
||||
function DeployableVehiclePad::onDestroyed(%this, %obj, %prevState)
|
||||
{
|
||||
if (isObject(%obj))
|
||||
disassembleVehilcepad(%obj,%plyr);
|
||||
Parent::onDestroyed(%this, %obj, %prevState);
|
||||
$TeamDeployedCount[%obj.team, VehiclePadPack]--;
|
||||
%obj.schedule(500, "delete");
|
||||
%obj.station.schedule(500, "delete");
|
||||
%obj.back.schedule(500,"delete");
|
||||
}
|
||||
|
||||
function DeployableVehiclePad2::onDestroyed(%this, %obj, %prevState)
|
||||
{
|
||||
if (isObject(%obj))
|
||||
disassembleVehilcepad(%obj,%plyr);
|
||||
Parent::onDestroyed(%this, %obj, %prevState);
|
||||
$TeamDeployedCount[%obj.team, VehiclePadPack]--;
|
||||
%obj.schedule(500, "delete");
|
||||
%obj.station.schedule(500, "delete");
|
||||
%obj.back.schedule(500,"delete");
|
||||
}
|
||||
|
||||
|
||||
|
||||
function DeployableVehicleStation::onDestroyed(%this, %obj, %prevState)
|
||||
{
|
||||
if (isObject(%obj.pad))
|
||||
disassembleVehilcepad(%obj.pad,%plyr);
|
||||
Parent::onDestroyed(%this, %obj, %prevState);
|
||||
$TeamDeployedCount[%obj.team, VehiclePadPack]--;
|
||||
%obj.schedule(500, "delete");
|
||||
%obj.station.schedule(500, "delete");
|
||||
%obj.back.schedule(500,"delete");
|
||||
}
|
||||
|
||||
function DeployableVehiclePadBottom::onDestroyed(%this, %obj, %prevState)
|
||||
{
|
||||
if (isObject(%obj.station))
|
||||
disassembleVehilcepad(%obj.station,%plyr);
|
||||
Parent::onDestroyed(%this, %obj, %prevState);
|
||||
$TeamDeployedCount[%obj.team, VehiclePadPack]--;
|
||||
%obj.schedule(500, "delete");
|
||||
%obj.station.schedule(500, "delete");
|
||||
%obj.back.schedule(500,"delete");
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
datablock ShapeBaseImageData(VehiclePadPackImage)
|
||||
{
|
||||
mass = 1;
|
||||
emap = true;
|
||||
|
||||
shapeFile = "pack_deploy_inventory.dts";
|
||||
item = VehiclePadPack;
|
||||
mountPoint = 1;
|
||||
offset = "0 0 0";
|
||||
heatSignature = 0;
|
||||
deployed = DeployableVehiclePad;
|
||||
|
||||
stateName[0] = "Idle";
|
||||
stateTransitionOnTriggerDown[0] = "Activate";
|
||||
|
||||
stateName[1] = "Activate";
|
||||
stateScript[1] = "onActivate";
|
||||
stateTransitionOnTriggerUp[1] = "Idle";
|
||||
|
||||
maxDepSlope = 360;
|
||||
deploySound = StationDeploySound;
|
||||
|
||||
minDeployDis = 0;
|
||||
maxDeployDis = 50.0; //meters from body
|
||||
|
||||
};
|
||||
|
||||
datablock ItemData(VehiclePadPack)
|
||||
{
|
||||
className = Pack;
|
||||
catagory = "Deployables";
|
||||
shapeFile = "pack_deploy_inventory.dts";
|
||||
mass = 1;
|
||||
elasticity = 0.2;
|
||||
friction = 0.6;
|
||||
pickupRadius = 1;
|
||||
rotate = false;
|
||||
image = "VehiclePadPackImage";
|
||||
pickUpName = "a deployable vehicle pad";
|
||||
heatSignature = 0;
|
||||
|
||||
emap = true;
|
||||
};
|
||||
|
||||
function VehiclePadPackImage::onMount(%this, %obj, %slot)
|
||||
{
|
||||
%this.imagemount = %obj;
|
||||
%obj.hasVehiclepad = 1;
|
||||
}
|
||||
|
||||
function VehiclePadPackImage::onUnmount(%data,%obj,%node)
|
||||
{
|
||||
%obj.hasVehiclepad = "";
|
||||
}
|
||||
|
||||
function VehiclePadPack::onPickup(%this, %pack, %player, %amount)
|
||||
{
|
||||
%player.packcharge = %pack.charge;
|
||||
%player.lastvpad = %pack.vpad;
|
||||
}
|
||||
|
||||
|
||||
function VehiclePadPack::onThrow(%this,%pack,%player)
|
||||
{
|
||||
%this.charge = %player.packcharge;
|
||||
%this.vpad = %player.lastvpad;
|
||||
%player.packcharge = "";
|
||||
%player.lastvpad = "";
|
||||
serverPlay3D(ItemThrowSound, %player.getTransform());
|
||||
%pack.schedulePop();
|
||||
}
|
||||
|
||||
|
||||
|
||||
function VehiclePadPackImage::onDeploy(%item, %plyr, %slot)
|
||||
{
|
||||
if (IsObject(%plyr.lastvpad) && IsObject(%plyr.lastvpad.station))
|
||||
%plyr.packcharge = 0;
|
||||
if (IsObject(%plyr.lastvpad) && !IsObject(%plyr.lastvpad.station))
|
||||
%plyr.packcharge = 1;
|
||||
if (!IsObject(%plyr.lastvpad))
|
||||
%plyr.packcharge = 0;
|
||||
|
||||
|
||||
// take the deployable off the player's back and out of inventory
|
||||
if (%plyr.packcharge == 1)
|
||||
{
|
||||
%plyr.unmountImage(%slot);
|
||||
%plyr.decInventory(%item.item, 1);
|
||||
$TeamDeployedCount[%plyr.team, %item.item]++;
|
||||
%playerVector = vectorNormalize(-1 * getWord(%plyr.getEyeVector(),1) SPC getWord(%plyr.getEyeVector(),0) SPC "0");
|
||||
if (vAbs(floorVec(%item.surfaceNrm,100)) $= "0 0 1")
|
||||
%item.surfaceNrm2 = vectorScale(%playerVector,1);
|
||||
else
|
||||
%item.surfaceNrm2 = vectorNormalize(vectorCross(%item.surfaceNrm,"0 0 -1"));
|
||||
|
||||
%rot = fullRot(%item.surfaceNrm,%item.surfaceNrm2);
|
||||
%vpad = %plyr.lastvpad;
|
||||
%deplObj = GiveStation(%vpad,%item.surfacePt SPC %rot);
|
||||
%deplObj.deploy();
|
||||
addDSurface(%item.surface,%deplObj);
|
||||
%deplObj.setOwner(%plyr);
|
||||
%plyr.packcharge = "";
|
||||
%plyr.lastvpad = "";
|
||||
%vpad.isRemoved = 0;
|
||||
%vpad.back.isRemoved = 0;
|
||||
if (%vpad.style ==2)
|
||||
{
|
||||
%deplObj.emitter = CreateEmitter(%item.surfacePt,SIGMAE);
|
||||
%deplObj.emitter.setRotation(%deplObj.getRotation());
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
%dist = VectorSub(%item.surfacept,%plyr.getTransform());
|
||||
%nrm = VirVec(%item.surface,%item.surfacenrm);
|
||||
%img = VirVec(%item.surface,VectorNormalize(VectorCross(VectorCross(%item.surfacenrm,%dist),%item.surfacenrm)));
|
||||
%item.surfacenrm2 = realvec(%item.surface,VectorCross(%nrm,topvec(%img)));
|
||||
// create the actual deployable
|
||||
%rot = %item.getInitialRotation(%plyr);
|
||||
|
||||
if (%plyr.packset == 1)
|
||||
%block = DeployableVehiclePad2;
|
||||
else
|
||||
%block = DeployableVehiclePad;
|
||||
|
||||
%deplObj = new StaticShape()
|
||||
{
|
||||
dataBlock = %block;
|
||||
};
|
||||
%back = new StaticShape()
|
||||
{
|
||||
dataBlock = DeployableVehiclePadBottom;
|
||||
};
|
||||
%back.needsfit = 1;
|
||||
%deplObj.needsfit = 1;
|
||||
%deplObj.style = %plyr.packset;
|
||||
%pos = getWords(%item.surface.getEdge(%nrm),0,2);
|
||||
%deplObj.setTransform(%pos SPC fullrot(%item.surfacenrm,%item.surfacenrm2));
|
||||
if (VectorDot(vAbs(VectorNormalize(topvec(%img))),%item.surface.getRealSize())== %item.surfacesizex)
|
||||
{
|
||||
%x= %item.surfacesizex;
|
||||
%y= %item.surfacesizey;
|
||||
%item.surfacesizex = %y;
|
||||
%item.surfacesizey = %x;
|
||||
}
|
||||
%deplObj.setRealSize(%item.surfacesizex SPC %item.surfacesizey SPC "1.5");
|
||||
%back.setTransform(%pos SPC fullrot(%item.surfacenrm,%item.surfacenrm2));
|
||||
%back.setRealSize(VectorMultiply(%deplObj.getRealSize(),"1 1 0.1"));
|
||||
if (%plyr.packset == 2)
|
||||
{
|
||||
%back.potpipes();
|
||||
}
|
||||
// %deplObj.setTransform(modifyTransform(%pos SPC %rot, "0 0 -1 0 0 0 0"));
|
||||
%deplObj.back = %back;
|
||||
%back.station = %deplObj;
|
||||
// set the recharge rate right away
|
||||
if(%deplObj.getDatablock().rechargeRate)
|
||||
%deplObj.setRechargeRate(%deplObj.getDatablock().rechargeRate);
|
||||
|
||||
// set team, owner, and handle
|
||||
%deplObj.team = %plyr.client.Team;
|
||||
%back.team = %plyr.client.Team;
|
||||
%deplObj.setOwner(%plyr);
|
||||
%back.setOwner(%plyr);
|
||||
|
||||
// set the sensor group if it needs one
|
||||
if(%deplObj.getTarget() != -1)
|
||||
setTargetSensorGroup(%deplObj.getTarget(), %plyr.client.team);
|
||||
|
||||
// place the deployable in the MissionCleanup/Deployables group (AI reasons)
|
||||
addToDeployGroup(%deplObj);
|
||||
addToDeployGroup(%deplObj.back);
|
||||
|
||||
//let the AI know as well...
|
||||
AIDeployObject(%plyr.client, %deplObj);
|
||||
|
||||
// play the deploy sound
|
||||
serverPlay3D(%item.deploySound, %deplObj.getTransform());
|
||||
|
||||
// increment the team count for this deployed object
|
||||
%deplObj.getDatablock().onAdd(%deplObj);
|
||||
%deplObj.deploy();
|
||||
//%deplObj.setSelfPowered();
|
||||
%plyr.packcharge++;
|
||||
%plyr.lastvpad = %deplObj;
|
||||
%deplObj.powerFreq = %plyr.powerFreq;
|
||||
%back.powerFreq = %plyr.powerFreq;
|
||||
checkPowerObject(%deplobj);
|
||||
checkPowerObject(%back);
|
||||
%deplObj.isRemoved = 1;
|
||||
%back.isRemoved = 1;
|
||||
schedule(6000,0,"FadePad",%deplObj,%plyr);
|
||||
addDSurface(%item.surface,%deplObj);
|
||||
addDSurface(%item.surface,%back);
|
||||
}
|
||||
}
|
||||
|
||||
function FadePad(%obj,%plyr)
|
||||
{
|
||||
if (!Isobject(%obj.station))
|
||||
{
|
||||
schedule(100,%obj,"disassembleVehilcepad",%obj,%plyr);
|
||||
}
|
||||
}
|
||||
|
||||
function GameBase::PotPipes(%obj)
|
||||
{
|
||||
%obj.pipe1 = new StaticShape()
|
||||
{
|
||||
dataBlock = PotPipe;
|
||||
scale = "0.5 0.5 0.5";
|
||||
};
|
||||
%obj.pipe2 = new StaticShape()
|
||||
{
|
||||
dataBlock = PotPipe;
|
||||
scale = "0.5 0.5 0.5";
|
||||
};
|
||||
%obj.pipe3 = new StaticShape()
|
||||
{
|
||||
dataBlock = PotPipe;
|
||||
scale = "0.5 0.5 0.5";
|
||||
};
|
||||
%obj.pipe4 = new StaticShape()
|
||||
{
|
||||
dataBlock = PotPipe;
|
||||
scale = "0.5 0.5 0.5";
|
||||
};
|
||||
%obj.pipe1.setTransform(%obj.getEdge("0.9 0.9 1") SPC %obj.getRotation());
|
||||
%obj.pipe2.setTransform(%obj.getEdge("0.9 -0.9 1")SPC %obj.getRotation());
|
||||
%obj.pipe3.setTransform(%obj.getEdge("-0.9 -0.9 1")SPC %obj.getRotation());
|
||||
%obj.pipe4.setTransform(%obj.getEdge("-0.9 0.9 1")SPC %obj.getRotation());
|
||||
%obj.pipe1.emitter = CreateEmitter(%obj.pipe1.getEdge("0 0 1"),HeavyDamageSmoke);
|
||||
%obj.pipe2.emitter = CreateEmitter(%obj.pipe2.getEdge("0 0 1"),HeavyDamageSmoke);
|
||||
%obj.pipe3.emitter = CreateEmitter(%obj.pipe3.getEdge("0 0 1"),HeavyDamageSmoke);
|
||||
%obj.pipe4.emitter = CreateEmitter(%obj.pipe4.getEdge("0 0 1"),HeavyDamageSmoke);
|
||||
addToDeployGroup(%obj.pipe1);
|
||||
addToDeployGroup(%obj.pipe2);
|
||||
addToDeployGroup(%obj.pipe3);
|
||||
addToDeployGroup(%obj.pipe4);
|
||||
}
|
||||
|
||||
function GameBase::RemPotPipes(%obj)
|
||||
{
|
||||
if (IsObject(%obj.pipe1))
|
||||
{
|
||||
%obj.pipe1.emitter.delete();
|
||||
%obj.pipe1.delete();
|
||||
}
|
||||
if (IsObject(%obj.pipe2))
|
||||
{
|
||||
%obj.pipe2.emitter.delete();
|
||||
%obj.pipe2.delete();
|
||||
}
|
||||
if (IsObject(%obj.pipe3))
|
||||
{
|
||||
%obj.pipe3.emitter.delete();
|
||||
%obj.pipe3.delete();
|
||||
}
|
||||
if (IsObject(%obj.pipe4))
|
||||
{
|
||||
%obj.pipe4.emitter.delete();
|
||||
%obj.pipe4.delete();
|
||||
}
|
||||
}
|
||||
|
||||
function VehiclePadPackImage::testSurfaceTooNarrow(%item,%surface)
|
||||
{
|
||||
%nrm = getWords(%item.surface,4,6);
|
||||
%mask = invFace(%nrm);
|
||||
%narrower = vectorMultiply(%mask,%item.surface.getRealSize());
|
||||
%fx = vectorNormalize(topVec(%narrower));
|
||||
%fy = VectorCross(%nrm,%fx);
|
||||
%sx = VectorLen(VectorMultiply(%fx,%item.surface.getRealSize()));
|
||||
%sy = VectorLen(VectorMultiply(%fy,%item.surface.getRealSize()));
|
||||
|
||||
if (%sx < 17 || %sy < 17 || %sx < %sy*0.5 || %sy < %sx*0.5)
|
||||
{
|
||||
return !%item.imagemount.packcharge;
|
||||
}
|
||||
else
|
||||
{
|
||||
%item.surfacesizex = %sx;
|
||||
%item.surfacesizey = %sy;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
function VehiclePadPackImage::testNoInteriorFound(%item,%surface)
|
||||
{
|
||||
return !IsCubic(%item.surface) && !%item.imagemount.packcharge;
|
||||
}
|
||||
|
||||
function DeployableVehiclePad::disassemble(%data,%plyr,%obj)
|
||||
{
|
||||
if (isObject(%obj))
|
||||
disassembleVehilcepad(%obj,%plyr);
|
||||
disassemble(%data,%plyr,%obj);
|
||||
}
|
||||
|
||||
function DeployableVehiclePad2::disassemble(%data,%plyr,%obj)
|
||||
{
|
||||
if (isObject(%obj))
|
||||
disassembleVehilcepad(%obj,%plyr);
|
||||
disassemble(%data,%plyr,%obj);
|
||||
}
|
||||
|
||||
function DeployableVehicleStation::disassemble(%data,%plyr,%obj)
|
||||
{
|
||||
if (isObject(%obj.pad))
|
||||
disassembleVehilcepad(%obj.pad,%plyr);
|
||||
disassemble(%data,%plyr,%obj);
|
||||
}
|
||||
|
||||
function DeployableVehiclePadBottom::disassemble(%data,%plyr,%obj)
|
||||
{
|
||||
if (isObject(%obj.station))
|
||||
disassembleVehilcepad(%obj.station,%plyr);
|
||||
disassemble(%data,%plyr,%obj);
|
||||
}
|
||||
|
||||
function PotPipe::disassemble(%data,%plyr,%obj)
|
||||
{
|
||||
if (%obj.emitter)
|
||||
%obj.emitter.delete();
|
||||
disassemble(%data,%plyr,%obj);
|
||||
}
|
||||
|
||||
function disassembleVehilcepad(%station,%plyr)
|
||||
{
|
||||
%station.back.rempotpipes();
|
||||
if (%station.station.emitter)
|
||||
%station.station.emitter.delete();
|
||||
if (isObject(%station.station))
|
||||
disassemble("",%plyr,%station.station);
|
||||
|
||||
if (isObject(%station.back))
|
||||
disassemble("",%plyr,%station.back);
|
||||
disassemble("",%plyr,%station);
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue