mirror of
https://github.com/mostlikely4r/construction-mod.git
synced 2026-01-19 19:24:44 +00:00
1807 lines
54 KiB
C#
1807 lines
54 KiB
C#
function Gamebase::addTofxGroup(%obj,%set)
|
|
{
|
|
if (!isObject(%obj))
|
|
return "";
|
|
if (!isObject(fxGroup))
|
|
{
|
|
%main = new SimGroup("fxGroup");
|
|
MissionCleanup.add(%main);
|
|
%em = new Simgroup("fx_emitters");
|
|
%au = new Simgroup("fx_audio");
|
|
%pa = new Simgroup("fx_packs");
|
|
%main.add(%em);
|
|
%main.add(%au);
|
|
%main.add(%pa);
|
|
}
|
|
if (IsObject(%obj))
|
|
{
|
|
if (%set == 1)
|
|
fx_audio.add(%obj);
|
|
else if (%set == 2)
|
|
fx_packs.add(%obj);
|
|
else
|
|
fx_emitters.add(%obj);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/////////EMITTER PACK//////////
|
|
|
|
//Example of using expert setting to select pack setting mode.
|
|
//Note uses custom (plugin) packsettings mode
|
|
|
|
//Format <PackImageName> = "%modes %lines %name"
|
|
//%modes gives the highest mode like the old settings
|
|
//%lines gives the amount of words in the settings which are the name of the mode
|
|
// -1 gives the entire content of the mode
|
|
// 2 would give the first 3 words of the mode
|
|
//%name gives the name of the pack as in %name "set to" %modename
|
|
|
|
$expertSettings[EmitterDepImage] = "3 -1 Emitter Pack:[Options]";
|
|
|
|
$expertSetting[EmitterDepImage,0] = "Select Emitter";
|
|
$expertSetting[EmitterDepImage,1] = "Select Emitter selection mode";
|
|
$expertSetting[EmitterDepImage,2] = "Select Power logic";
|
|
$expertSetting[EmitterDepImage,3] = "Select Cloak logic";
|
|
|
|
//These are my personal browse of the first few datablocks.
|
|
$packSettings[EmitterDepImage] = "13 1 Emitter Pack:[Emitter]";
|
|
$packSetting[EmitterDepImage,0] = "Small Steam ReverseEmitter";
|
|
$packSetting[EmitterDepImage,1] = "Small Bubbles GrenadeBubbleEmitter";
|
|
$packSetting[EmitterDepImage,2] = "Large Foam VehicleFoamEmitter";
|
|
$packSetting[EmitterDepImage,3] = "Small Fire PlasmaExplosionEmitter";
|
|
$packSetting[EmitterDepImage,4] = "Plasma Stream PlasmaRifleEmitter";
|
|
$packSetting[EmitterDepImage,5] = "Large Bubbles DiscExplosionBubbleEmitter";
|
|
$packSetting[EmitterDepImage,6] = "Dark Smoke GDebrisSmokeEmitter";
|
|
$packSetting[EmitterDepImage,7] = "Small Smoke GrenadeSmokeEmitter";
|
|
$packSetting[EmitterDepImage,8] = "Small Spark ELFSparksEmitter";
|
|
$packSetting[EmitterDepImage,9] = "Green Smoke MortarSmokeEmitter";
|
|
$packSetting[EmitterDepImage,10] = "Fire Stream MissileFireEmitter";
|
|
$packSetting[EmitterDepImage,11] = "Water Stream WaterStreamEmitter";
|
|
$packSetting[EmitterDepImage,12] = "min hole LoadingE2";
|
|
$packSetting[EmitterDepImage,13] = "wisps flair LoadingE";
|
|
|
|
//Note how the extra %id defines the nesting of the modes.
|
|
//While previous settings could also include %id=0 I chose not to use that
|
|
//since nesting isn't directly compatible with the unified code.
|
|
//Using non nesting format for the previous allows me to use the unified code
|
|
//for that setting.
|
|
|
|
$packSettings[EmitterDepImage,1] = "1 -1 Emitter Pack: [Selection mode]";
|
|
$packSetting[EmitterDepImage,0,1] = "Small selection";
|
|
$packSetting[EmitterDepImage,1,1] = "Sellect from datablocks";
|
|
|
|
$packSettings[EmitterDepImage,2] = "3 -1 Emitter Pack: [Power Logic]";
|
|
$packSetting[EmitterDepImage,0,2] = "Always on";
|
|
$packSetting[EmitterDepImage,1,2] = "On when powered";
|
|
$packSetting[EmitterDepImage,2,2] = "Off when powered";
|
|
$packSetting[EmitterDepImage,3,2] = "5 sec on when power change";
|
|
|
|
$packSettings[EmitterDepImage,3] = "1 -1 Emitter Pack: [Cloak Logic]";
|
|
$packSetting[EmitterDepImage,0,3] = "Always Vissible";
|
|
$packSetting[EmitterDepImage,1,3] = "Cloaked when emitting";
|
|
//Removed
|
|
$packSetting[EmitterDepImage,2,3] = "Cloaked when not emtting";
|
|
$packSetting[EmitterDepImage,3,3] = "Always Cloaked";
|
|
|
|
|
|
datablock ParticleData( WaterStreamParticle )
|
|
{
|
|
dragCoeffiecient = 0.0;
|
|
gravityCoefficient = 1.0;
|
|
inheritedVelFactor = 0.0;
|
|
|
|
lifetimeMS = 25000;
|
|
lifetimeVarianceMS = 100;
|
|
|
|
textureName = "special/bubbles";
|
|
|
|
useInvAlpha = false;
|
|
|
|
spinRandomMin = -360.0;
|
|
spinRandomMax = 360.0;
|
|
|
|
colors[0] = "0.4 0.4 0.8 1.0";
|
|
colors[1] = "0.3 0.3 0.8 0.1";
|
|
colors[2] = "0.0 0.0 0.8 0.0";
|
|
sizes[0] = 0.4;
|
|
sizes[1] = 0.5;
|
|
sizes[2] = 0.7;
|
|
times[0] = 0.0;
|
|
times[1] = 0.5;
|
|
times[2] = 1.0;
|
|
};
|
|
|
|
datablock ParticleEmitterData( WaterStreamEmitter )
|
|
{
|
|
ejectionPeriodMS = 5;
|
|
periodVarianceMS = 1;
|
|
|
|
ejectionVelocity = 30.0; // A little oomph at the back end
|
|
velocityVariance = 1.0;
|
|
|
|
thetaMin = 0.0;
|
|
thetaMax = 1.0;
|
|
|
|
|
|
orientParticles = False;
|
|
orientOnVelocity = False;
|
|
|
|
particles = "WaterStreamParticle";
|
|
};
|
|
|
|
|
|
datablock StaticShapeData(EmitterDep) : DeployedCrate
|
|
{
|
|
shapeFile = "stackable4l.dts";
|
|
needsPower = true;
|
|
};
|
|
|
|
datablock ShapeBaseImageData(EmitterDepImage) {
|
|
mass = 1;
|
|
emap = true;
|
|
shapeFile = "stackable4l.dts";
|
|
item = EmitterDepPack;
|
|
mountPoint = 1;
|
|
offset = "0 -0.18 -0.5";
|
|
deployed = EmitterDepImage;
|
|
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(EmitterDepPack) {
|
|
className = Pack;
|
|
catagory = "Deployables";
|
|
shapeFile = "stackable4l.dts";
|
|
mass = 1;
|
|
elasticity = 0.2;
|
|
friction = 0.6;
|
|
pickupRadius = 1;
|
|
rotate = true;
|
|
image = "EmitterDepImage";
|
|
pickUpName = "an Emitter pack";
|
|
heatSignature = 0;
|
|
emap = true;
|
|
};
|
|
|
|
function EmitterDepPack::onPickup(%this, %obj, %shape, %amount) {
|
|
// created to prevent console errors
|
|
}
|
|
|
|
function EmitterDep::gainPower(%data, %obj)
|
|
{
|
|
if (%obj.pLogic==0)
|
|
EmitterDepSet(%obj,1);
|
|
if (%obj.pLogic==1)
|
|
EmitterDepSet(%obj,1);
|
|
if (%obj.pLogic==2)
|
|
EmitterDepSet(%obj,0);
|
|
if (%obj.pLogic==3)
|
|
{
|
|
EmitterDepSet(%obj,1);
|
|
schedule(5000,%obj,"EmitterDepSet",%obj,0);
|
|
}
|
|
}
|
|
|
|
function EmitterDep::losePower(%data, %obj)
|
|
{
|
|
if (%obj.pLogic==0)
|
|
EmitterDepSet(%obj,1);
|
|
if (%obj.pLogic==1)
|
|
EmitterDepSet(%obj,0);
|
|
if (%obj.pLogic==2)
|
|
EmitterDepSet(%obj,1);
|
|
if (%obj.pLogic==3)
|
|
{
|
|
EmitterDepSet(%obj,1);
|
|
schedule(5000,%obj,"EmitterDepSet",%obj,0);
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function EmitterDepImage::onDeploy(%item, %plyr, %slot) {
|
|
|
|
%playerVector = vectorNormalize(-1 * getWord(%plyr.getEyeVector(),1) SPC getWord(%plyr.getEyeVector(),0) SPC "0");
|
|
%item.surfaceNrm2 = %playerVector;
|
|
%rot = fullRot(%item.surfaceNrm,%item.surfaceNrm2);
|
|
|
|
%deplObj = new StaticShape()
|
|
{
|
|
dataBlock = "EmitterDep";
|
|
scale = "0.5 0.5 0.1";
|
|
};
|
|
|
|
// 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);
|
|
if (%plyr.packset == -1)
|
|
%deplObj.Emitterblock = datablockGroup.getObject(%plyr.packset[0]);
|
|
else if (%plyr.packset[0] $= "")
|
|
%deplObj.Emitterblock = GetWord($packSetting[EmitterDepImage,0],2);
|
|
else
|
|
%deplObj.EmitterBlock = %plyr.packset[0];
|
|
|
|
%deplObj.pLogic = %plyr.packset[2];
|
|
%deplObj.cLogic = %plyr.packset[3];
|
|
|
|
// 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.powerFreq = %plyr.powerFreq;
|
|
checkPowerObject(%deplObj);
|
|
if (!%plyr.client.isAdmin)
|
|
{
|
|
%plyr.unmountImage(%slot);
|
|
%plyr.decInventory(%item.item, 1);
|
|
}
|
|
|
|
|
|
return %deplObj;
|
|
}
|
|
|
|
function EmitterDep::onDestroyed(%this,%obj,%prevState) {
|
|
if (%obj.isRemoved)
|
|
return;
|
|
%obj.isRemoved = true;
|
|
EmitterDepSet(%obj,0);
|
|
Parent::onDestroyed(%this,%obj,%prevState);
|
|
$TeamDeployedCount[%obj.team, EmitterDepPack]--;
|
|
remDSurface(%obj);
|
|
%obj.schedule(500, "delete");
|
|
}
|
|
|
|
function EmitterDepImage::onMount(%data, %obj, %node) {
|
|
displayPowerFreq(%obj);
|
|
%obj.hasEmpack = true; // not needed anymore
|
|
%obj.packSet = 0;
|
|
%obj.packSet[0] = 0;
|
|
%obj.packSet[1] = 0;
|
|
%obj.packSet[2] = 0;
|
|
%obj.packSet[3] = 0;
|
|
}
|
|
|
|
function EmitterDepImage::onUnmount(%data, %obj, %node) {
|
|
%obj.hasEmpack = ""; // not needed anymore
|
|
%obj.packSet = 0;
|
|
%obj.packSet[0] = 0;
|
|
%obj.packSet[1] = 0;
|
|
%obj.packSet[2] = 0;
|
|
%obj.packSet[3] = 0;
|
|
}
|
|
|
|
function EmitterDepSet(%obj,%set)
|
|
{
|
|
if (ISobject(%obj))
|
|
{
|
|
if (!%set && IsObject(%obj.emitter))
|
|
{
|
|
%obj.emitter.delete();
|
|
if (%obj.cLogic == 2 || %obj.cLogic == 3)
|
|
%obj.startfade(0,0,1);
|
|
else if (%obj.cLogic == 1)
|
|
%obj.startfade(0,0,0);
|
|
}
|
|
if (%set && !ISobject(%obj.emitter))
|
|
{
|
|
%obj.emitter = CreateEmitter("0 0 0",%obj.emitterblock);
|
|
%obj.emitter.addTofxGroup();
|
|
%obj.emitter.setTransform(%obj.getTransform());
|
|
if (%obj.cLogic == 1 || %obj.cLogic == 3)
|
|
%obj.startfade(0,0,1);
|
|
else if (%obj.cLogic == 2)
|
|
%obj.startfade(0,0,0);
|
|
}
|
|
}
|
|
}
|
|
|
|
//Example of nested setting modes with plugin capability.
|
|
//All but the first part of packssets are fully global defined.
|
|
//Expert mode and the very first packset refer back to the unified code.
|
|
|
|
function EmitterDepImage::ChangeMode(%data,%plyr,%val,%level)
|
|
{
|
|
if (%level == 0)
|
|
{
|
|
//Selecting emitter
|
|
if (!%plyr.expertSet)
|
|
{
|
|
if (!%plyr.packset[1])
|
|
{
|
|
Parent::ChangeMode(%data,%plyr,%val,%level);
|
|
%plyr.packset[0] = GetWord($packSetting[EmitterDepImage,%plyr.packset],2);
|
|
}
|
|
else
|
|
{
|
|
%plyr.packset = -1;
|
|
%plyr.packset[0] = nextEmitter(%plyr.packset[0]+%val,%val);
|
|
%name = datablockGroup.getObject(%plyr.packset[0]).GetName();
|
|
bottomPrint(%plyr.client,"Emitter pack set to emit:"SPC %name,2,1);
|
|
}
|
|
}
|
|
//Selecting selection mode/PowerLogic/CloakLogic
|
|
else if (%plyr.expertSet > 0)
|
|
{
|
|
%set = %plyr.expertSet;
|
|
%image = %data.getName();
|
|
%settings = $packSettings[%image,%set];
|
|
|
|
%plyr.packSet[%set] = %plyr.packSet[%set] + %val;
|
|
if (%plyr.packSet[%set] > getWord(%settings,0))
|
|
%plyr.packSet[%set] = 0;
|
|
if (%plyr.packSet[%set] < 0)
|
|
%plyr.packSet[%set] = getWord(%settings,0);
|
|
|
|
%packname = GetWords(%settings,2,getWordCount(%settings));
|
|
%curset = $PackSetting[%image,%plyr.packSet[%set],%set];
|
|
if (getWord(%settings,1) == -1)
|
|
%line = GetWords(%curset,0,getWordCount(%curset));
|
|
else
|
|
%line = GetWords(%curset,0,getWord(%settings,1));
|
|
bottomPrint(%plyr.client,%packname SPC "set to"SPC %line,2,1);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
Parent::ChangeMode(%data,%plyr,%val,%level);
|
|
}
|
|
}
|
|
|
|
//Custion function to browse through all datablocks for emitter types.
|
|
//Allthought the cyclign takes forever and there can't be 1 proper name for each emitter
|
|
//It allows the player to fully utilize t2's content.
|
|
|
|
function nextEmitter(%start,%dir)
|
|
{
|
|
if (%dir == 1)
|
|
{
|
|
for(%i = %start; %i < DatablockGroup.getCount() ; %i++)
|
|
{
|
|
if (datablockGroup.getObject(%i).particles !$= "")
|
|
{
|
|
return %i;
|
|
}
|
|
}
|
|
return nextEmitter(0,1);
|
|
}
|
|
else
|
|
{
|
|
for(%i = %start; %i > 0; %i--)
|
|
{
|
|
if (datablockGroup.getObject(%i).particles !$= "")
|
|
{
|
|
return %i;
|
|
}
|
|
}
|
|
return nextEmitter(DatablockGroup.getCount(),-1);
|
|
}
|
|
}
|
|
|
|
/////////Audio PACK//////////
|
|
//This is a total copy/past from the emitter deployable
|
|
|
|
|
|
$expertSettings[AudioDepImage] = "3 -1 Emitter Pack:[Options]";
|
|
$expertSetting[AudioDepImage,0] = "Select Emitter";
|
|
$expertSetting[AudioDepImage,1] = "Select Emitter selection mode";
|
|
$expertSetting[AudioDepImage,2] = "Select Power logic";
|
|
$expertSetting[AudioDepImage,3] = "Select Loop logic";
|
|
|
|
//Some I made myself
|
|
$packSettings[AudioDepImage] = "16 1 Emitter Pack:[Emitter]";
|
|
$packSetting[AudioDepImage,0] = "Jeti howl1 fx/environment/yeti_howl1.wav";
|
|
$packSetting[AudioDepImage,1] = "Jeti howl2 fx/environment/yeti_howl2.wav";
|
|
$packSetting[AudioDepImage,2] = "Jeti growl fx/environment/growl1.wav";
|
|
$packSetting[AudioDepImage,3] = "Frog sounds fx/environment/frog2.wav";
|
|
$packSetting[AudioDepImage,4] = "fly swarm fx/environment/fly_swarm.wav";
|
|
$packSetting[AudioDepImage,5] = "Bird sound1 fx/environment/bird_echo4.wav";
|
|
$packSetting[AudioDepImage,6] = "Bird sound2 fx/environment/bird_echo5.wav";
|
|
$packSetting[AudioDepImage,7] = "Ocean waves fx/environment/Oceanwaves.wav";
|
|
$packSetting[AudioDepImage,8] = "River stream fx/environment/River2.wav";
|
|
$packSetting[AudioDepImage,9] = "Cha ching fx/misc/bounty_bonus.wav";
|
|
$packSetting[AudioDepImage,10] = "Mario party fx/Bonuses/mario-6notes.wav";
|
|
$packSetting[AudioDepImage,11] = "Slick music fx/Bonuses/med-level4-slick.wav";
|
|
$packSetting[AudioDepImage,12] = "test music t2Intro.wav";
|
|
$packSetting[AudioDepImage,13] = "Tessios Heist-swing fx/bonuses/horz_straipass2_heist.wav";
|
|
$packSetting[AudioDepImage,14] = "Swami swashi fx/bonuses/low-level2-spitting.wav";
|
|
$packSetting[AudioDepImage,15] = "Smoking something fx/bonuses/med-level1-modest.wav";
|
|
$packSetting[AudioDepImage,16] = "Swami swashi2 fx/bonuses/med-level3-shining.wav";
|
|
|
|
$packSettings[AudioDepImage,1] = "1 -1 Emitter Pack: [Selection mode]";
|
|
$packSetting[AudioDepImage,0,1] = "Small selection";
|
|
$packSetting[AudioDepImage,1,1] = "Sellect from datablocks";
|
|
|
|
$packSettings[AudioDepImage,2] = "3 -1 Emitter Pack: [Power Logic]";
|
|
$packSetting[AudioDepImage,0,2] = "Always on";
|
|
$packSetting[AudioDepImage,1,2] = "On when powered";
|
|
$packSetting[AudioDepImage,2,2] = "Off when powered";
|
|
$packSetting[AudioDepImage,3,2] = "5 sec on when power change";
|
|
|
|
//Cloak logic was left out as it won't help the global image.
|
|
//And it will only worsen spam.
|
|
|
|
$packSettings[AudioDepImage,3] = "1 -1 Emitter Pack: [Loop Logic]";
|
|
$packSetting[AudioDepImage,0,3] = "Use standard";
|
|
$packSetting[AudioDepImage,1,3] = "Always loop";
|
|
|
|
|
|
|
|
datablock StaticShapeData(AudioDep) : DeployedCrate
|
|
{
|
|
shapeFile = "stackable2l.dts";
|
|
needsPower = true;
|
|
};
|
|
|
|
datablock ShapeBaseImageData(AudioDepImage) {
|
|
mass = 1;
|
|
emap = true;
|
|
shapeFile = "stackable3s.dts";
|
|
item = AudioDepPack;
|
|
mountPoint = 1;
|
|
offset = "0.5 -0.5 0";
|
|
rotation = "0 1 0 90";
|
|
deployed = AudioDepImage;
|
|
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(AudioDepPack) {
|
|
className = Pack;
|
|
catagory = "Deployables";
|
|
shapeFile = "stackable3s.dts";
|
|
mass = 1;
|
|
elasticity = 0.2;
|
|
friction = 0.6;
|
|
pickupRadius = 1;
|
|
rotate = true;
|
|
image = "AudioDepImage";
|
|
pickUpName = "an Sound pack";
|
|
heatSignature = 0;
|
|
emap = true;
|
|
};
|
|
|
|
|
|
function AudioDepPack::onPickup(%this, %obj, %shape, %amount) {
|
|
// created to prevent console errors
|
|
}
|
|
|
|
function AudioDep::gainPower(%data, %obj)
|
|
{
|
|
if (%obj.pLogic==0)
|
|
AudioDepSet(%obj,1);
|
|
if (%obj.pLogic==1)
|
|
AudioDepSet(%obj,1);
|
|
if (%obj.pLogic==2)
|
|
AudioDepSet(%obj,0);
|
|
if (%obj.pLogic==3)
|
|
{
|
|
AudioDepSet(%obj,1);
|
|
schedule(5000,%obj,"AudioDepSet",%obj,0);
|
|
}
|
|
}
|
|
|
|
function AudioDep::losePower(%data, %obj)
|
|
{
|
|
if (%obj.pLogic==0)
|
|
AudioDepSet(%obj,1);
|
|
if (%obj.pLogic==1)
|
|
AudioDepSet(%obj,0);
|
|
if (%obj.pLogic==2)
|
|
AudioDepSet(%obj,1);
|
|
if (%obj.pLogic==3)
|
|
{
|
|
AudioDepSet(%obj,1);
|
|
schedule(5000,%obj,"AudioDepSet",%obj,0);
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function AudioDepImage::onDeploy(%item, %plyr, %slot) {
|
|
|
|
%playerVector = vectorNormalize(-1 * getWord(%plyr.getEyeVector(),1) SPC getWord(%plyr.getEyeVector(),0) SPC "0");
|
|
%item.surfaceNrm2 = %playerVector;
|
|
%rot = fullRot(%item.surfaceNrm,%item.surfaceNrm2);
|
|
|
|
%deplObj = new StaticShape()
|
|
{
|
|
dataBlock = "AudioDep";
|
|
scale = "0.4 0.4 0.1";
|
|
};
|
|
|
|
// 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);
|
|
if (%plyr.packset == -1)
|
|
%deplObj.Audioblock = datablockGroup.getObject(%plyr.packset[0]);
|
|
else if (%plyr.packset[0] !$= "")
|
|
%deplObj.AudioBlock = %plyr.packset[0];
|
|
else
|
|
%deplObj.Audioblock = GetWord($packSetting[AudioDepImage,0],2);
|
|
|
|
|
|
%deplObj.pLogic = %plyr.packset[2];
|
|
%deplObj.lLogic = %plyr.packset[3];
|
|
|
|
// 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.powerFreq = %plyr.powerFreq;
|
|
checkPowerObject(%deplObj);
|
|
|
|
if (!%plyr.client.isAdmin)
|
|
{
|
|
%plyr.unmountImage(%slot);
|
|
%plyr.decInventory(%item.item, 1);
|
|
}
|
|
return %deplObj;
|
|
}
|
|
|
|
function AudioDep::onDestroyed(%this,%obj,%prevState) {
|
|
if (%obj.isRemoved)
|
|
return;
|
|
%obj.isRemoved = true;
|
|
AudioDepSet(%obj,0);
|
|
Parent::onDestroyed(%this,%obj,%prevState);
|
|
$TeamDeployedCount[%obj.team, AudioDepPack]--;
|
|
remDSurface(%obj);
|
|
%obj.schedule(500, "delete");
|
|
}
|
|
|
|
function AudioDepImage::onMount(%data, %obj, %node) {
|
|
displayPowerFreq(%obj);
|
|
%obj.hasAupack = true; // not needed
|
|
%obj.packSet = 0;
|
|
%obj.packSet[0] = "";
|
|
%obj.packSet[1] = 0;
|
|
%obj.packSet[2] = 0;
|
|
%obj.packSet[3] = 0;
|
|
}
|
|
|
|
function AudioDepImage::onUnmount(%data, %obj, %node) {
|
|
%obj.hasAupack = "";
|
|
%obj.packSet = 0;
|
|
%obj.packSet[0] = "";
|
|
%obj.packSet[1] = 0;
|
|
%obj.packSet[2] = 0;
|
|
%obj.packSet[3] = 0;
|
|
}
|
|
|
|
//We will keep calling the audio emitter %obj.emitter
|
|
//This will make sure in deconstruct the auto emitter is removed
|
|
function AudioDepSet(%obj,%set)
|
|
{
|
|
if (ISobject(%obj))
|
|
{
|
|
if (!%set && IsObject(%obj.emitter))
|
|
{
|
|
%obj.emitter.delete();
|
|
}
|
|
if (%set && !ISobject(%obj.emitter))
|
|
{
|
|
//The only working check to keep faulty emitters from staying around
|
|
//Doesn't remove the console spam thougt.. :P
|
|
%obj.emitter = CreateAudioEmitter(%obj.getTransform(),%obj.Audioblock,%obj.lLogic);
|
|
if (isObject(%obj.emitter))
|
|
%obj.emitter.addTofxGroup(1);
|
|
if ($audiopackloaded[%obj.emitter.filename]==1 && !Isfile(%obj.emitter.filename))
|
|
{
|
|
disassemble(%obj.getdatablock(),%obj.owner,%obj);
|
|
}
|
|
else
|
|
{
|
|
//%obj.emitter.setTransform(%obj.getTransform());
|
|
$audiopackloaded[%obj.emitter.filename]=1;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// Just copy/past the emitter changemode since it needs almost totaly the same modes
|
|
function AudioDepImage::ChangeMode(%data,%plyr,%val,%level)
|
|
{
|
|
if (%level == 0)
|
|
{
|
|
//Selecting emitter
|
|
if (!%plyr.expertSet)
|
|
{
|
|
if (!%plyr.packset[1])
|
|
{
|
|
Parent::ChangeMode(%data,%plyr,%val,%level);
|
|
%plyr.packset[0] = GetWord($packSetting[AudioDepImage,%plyr.packset],2);
|
|
}
|
|
else
|
|
{
|
|
%plyr.packset = -1;
|
|
%plyr.packset[0] = nextsEmitter(%plyr.packset[0]+%val,%val);
|
|
%name = datablockGroup.getObject(%plyr.packset[0]).GetName();
|
|
bottomPrint(%plyr.client,"sound pack set to play:"SPC %name,2,1);
|
|
}
|
|
}
|
|
//Selecting selection mode/PowerLogic/CloakLogic
|
|
else if (%plyr.expertSet > 0)
|
|
{
|
|
%set = %plyr.expertSet;
|
|
%image = %data.getName();
|
|
%settings = $packSettings[%image,%set];
|
|
|
|
%plyr.packSet[%set] = %plyr.packSet[%set] + %val;
|
|
if (%plyr.packSet[%set] > getWord(%settings,0))
|
|
%plyr.packSet[%set] = 0;
|
|
if (%plyr.packSet[%set] < 0)
|
|
%plyr.packSet[%set] = getWord(%settings,0);
|
|
|
|
%packname = GetWords(%settings,2,getWordCount(%settings));
|
|
%curset = $PackSetting[%image,%plyr.packSet[%set],%set];
|
|
if (getWord(%settings,1) == -1)
|
|
%line = GetWords(%curset,0,getWordCount(%curset));
|
|
else
|
|
%line = GetWords(%curset,0,getWord(%settings,1));
|
|
bottomPrint(%plyr.client,%packname SPC "set to"SPC %line,2,1);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
Parent::ChangeMode(%data,%plyr,%val,%level);
|
|
}
|
|
}
|
|
|
|
|
|
//Like promissed another browsing function.
|
|
|
|
|
|
function nextsEmitter(%start,%dir)
|
|
{
|
|
if (%dir == 1)
|
|
{
|
|
for(%i = %start; %i < DatablockGroup.getCount() ; %i++)
|
|
{
|
|
if (datablockGroup.getObject(%i).description.volume !$= "")// && isFile(DatablockGroup.getObject(%i).filename))
|
|
{
|
|
return %i;
|
|
}
|
|
}
|
|
return nextsEmitter(0,1);
|
|
}
|
|
else
|
|
{
|
|
for(%i = %start; %i > 0; %i--)
|
|
{
|
|
if (datablockGroup.getObject(%i).description.volume !$= "" ) //&& isFile(DatablockGroup.getObject(%i).filename))
|
|
{
|
|
return %i;
|
|
}
|
|
}
|
|
return nextsEmitter(DatablockGroup.getCount(),-1);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
//Variant for createEmitter
|
|
//Can be modified to using custom audio files not found in datablocks
|
|
//Can also be futher extended to use other custom variables to people's desire
|
|
//Currently included looping mode and lifetime.
|
|
//Profile and description could be used.. however it will lessen the ability to
|
|
//modify the emitter.
|
|
|
|
//it seems some clients deploying some sounds result in an faulty emitter
|
|
//I'l make sure those won't life to see the day.. but it's wierd still
|
|
|
|
//Added the ability to use file name as %data, so you don't need datablocks.. :D
|
|
|
|
function CreateAudioEmitter(%trans,%data,%forcelooping,%lifetime)
|
|
{
|
|
|
|
%dat = (IsObject(%data));
|
|
|
|
%desc = %data.description;
|
|
|
|
if (%forcelooping)
|
|
%looping=1;
|
|
else
|
|
%looping = %desc.isLooping;
|
|
|
|
%filename = %data.filename;
|
|
|
|
%audio = new AudioEmitter()
|
|
{
|
|
position = GetWords(%trans,0,2);
|
|
rotation = GetWords(%trans,3,6);
|
|
scale = "1 1 1";
|
|
fileName = %dat ? %data.fileName : %data;
|
|
useProfileDescription = "0";
|
|
|
|
outsideAmbient = "1";
|
|
volume = %dat ? %desc.volume : "1";
|
|
isLooping = %dat ? %looping : "1";
|
|
is3D = %dat ? %desc.is3D : "1";
|
|
minDistance = %dat ? %desc.minDistance : "20";
|
|
maxDistance = %dat ? %desc.maxDistance : "100";
|
|
coneInsideAngle = %dat ? %desc.coneInsideAngle : "360";
|
|
coneOutsideAngle = %dat ? %desc.coneOutsideAngle : "360";
|
|
coneOutsideVolume = %dat ? %desc.coneOutsideVolume : "1";
|
|
coneVector = %dat ? %desc.coneVector : "0 0 1";
|
|
loopCount = %dat ? %desc.loopCount : "-1";
|
|
minLoopGap = %dat ? %desc.minLoopGap : "0";
|
|
maxLoopGap = %dat ? %desc.maxLoopGap : "0";
|
|
type = "EffectAudioType";
|
|
};
|
|
|
|
if (%lifetime !$="")
|
|
%audio.schedule(%lifetime.delete());
|
|
return %audio;
|
|
}
|
|
|
|
|
|
/////////DISPENSER PACK//////////
|
|
|
|
//Another nessted pack setting
|
|
|
|
//Format <PackImageName> = "%modes %lines %name"
|
|
//%modes gives the highest mode like the old settings
|
|
//%lines gives the amount of words in the settings which are the name of the mode
|
|
// -1 gives the entire content of the mode
|
|
// 2 would give the first 3 words of the mode
|
|
//%name gives the name of the pack as in %name "set to" %modename
|
|
|
|
$expertSettings[DispenserDepImage] = "8 -1 Dispenser Pack:[Options]";
|
|
$expertSetting[DispenserDepImage,0] = "[T2 Packs]";
|
|
$expertSetting[DispenserDepImage,1] = "[Basic Building Parts]";
|
|
$expertSetting[DispenserDepImage,2] = "[Base Assets]";
|
|
$expertSetting[DispenserDepImage,3] = "[T2 Deployables]";
|
|
$expertSetting[DispenserDepImage,4] = "[Decoration packs]";
|
|
$expertSetting[DispenserDepImage,5] = "[Misc Deployables]";
|
|
$expertSetting[DispenserDepImage,6] = "[Barrels]";
|
|
$expertSetting[DispenserDepImage,7] = "[Weapons]";
|
|
$expertSetting[DispenserDepImage,8] = "[Ammo]";
|
|
|
|
|
|
//Hacky hacky way to get modes working.. hahaha
|
|
$packSettings[DispenserDepImage] = "8 1 Dispenser Pack:[T2 Packs]";
|
|
|
|
//Snagged from player.cs
|
|
$packSettings[DispenserDepImage,0] = "8 1 Dispenser Pack:[T2 Packs]";
|
|
$packSetting[DispenserDepImage,0,0] = "[Cycle packs] cycle";
|
|
$packSetting[DispenserDepImage,1,0] = "[Random pack] random";
|
|
$packSetting[DispenserDepImage,2,0] = "Energy Pack EnergyPack";
|
|
$packSetting[DispenserDepImage,3,0] = "Repair Pack RepairPack";
|
|
$packSetting[DispenserDepImage,4,0] = "Shield Pack ShieldPack";
|
|
$packSetting[DispenserDepImage,5,0] = "Cloak Pack CloakingPack";
|
|
$packSetting[DispenserDepImage,6,0] = "Jammer Pack SensorJammerPack";
|
|
$packSetting[DispenserDepImage,7,0] = "Ammunition Pack AmmoPack";
|
|
$packSetting[DispenserDepImage,8,0] = "Satchel Charge SatchelCharge";
|
|
|
|
$packSettings[DispenserDepImage,1] = "8 1 Dispenser Pack:[Basic Building Parts]";
|
|
$packSetting[DispenserDepImage,0,1] = "[Cycle packs] cycle";
|
|
$packSetting[DispenserDepImage,1,1] = "[Random pack] random";
|
|
$packSetting[DispenserDepImage,2,1] = "Light beam spinedeployable";
|
|
$packSetting[DispenserDepImage,3,1] = "Light walkway wWallDeployable";
|
|
$packSetting[DispenserDepImage,4,1] = "Light BlastWall WallDeployable";
|
|
$packSetting[DispenserDepImage,5,1] = "Medium beam mspineDeployable";
|
|
$packSetting[DispenserDepImage,6,1] = "Medium Floor floorDeployable";
|
|
$packSetting[DispenserDepImage,7,1] = "Force Field ForceFieldDeployable";
|
|
$packSetting[DispenserDepImage,8,1] = "Gravity Field GravityFieldDeployable";
|
|
|
|
|
|
$packSettings[DispenserDepImage,2] = "9 1 Dispenser Pack:[Base Assets]";
|
|
$packSetting[DispenserDepImage,0,2] = "[Cycle packs] cycle";
|
|
$packSetting[DispenserDepImage,1,2] = "[Random pack] random";
|
|
$packSetting[DispenserDepImage,2,2] = "Large Inventory-station LargeInventoryDeployable";
|
|
$packSetting[DispenserDepImage,3,2] = "Medium-Sensor Pack MediumSensorDeployable";
|
|
$packSetting[DispenserDepImage,4,2] = "Large-Sensor Pack LargeSensorDeployable";
|
|
$packSetting[DispenserDepImage,5,2] = "Logo-Projector Pack LogoProjectorDeployable";
|
|
$packSetting[DispenserDepImage,6,2] = "Deployable Turret-Base TurretBasePack";
|
|
$packSetting[DispenserDepImage,7,2] = "Solar-Panel Pack SolarPanelDeployable";
|
|
$packSetting[DispenserDepImage,8,2] = "Generator Pack GeneratorDeployable";
|
|
$packSetting[DispenserDepImage,9,2] = "Switch Pack SwitchDeployable";
|
|
|
|
$packSettings[DispenserDepImage,3] = "6 1 Dispenser Pack:[T2 Deployables]";
|
|
$packSetting[DispenserDepImage,0,3] = "[Cycle packs] cycle";
|
|
$packSetting[DispenserDepImage,1,3] = "[Random pack] random";
|
|
$packSetting[DispenserDepImage,2,3] = "Motion-Sensor Pack MotionSensorDeployable";
|
|
$packSetting[DispenserDepImage,3,3] = "Pulse-Sensor Pack PulseSensorDeployable";
|
|
$packSetting[DispenserDepImage,4,3] = "Landspike Turret TurretOutdoorDeployable";
|
|
$packSetting[DispenserDepImage,5,3] = "SpiderClamp Turret TurretIndoorDeployable";
|
|
$packSetting[DispenserDepImage,6,3] = "Inventory Station InventoryDeployable";
|
|
|
|
$packSettings[DispenserDepImage,4] = "7 1 Dispenser Pack:[Decoration packs]";
|
|
$packSetting[DispenserDepImage,0,4] = "[Cycle packs] cycle";
|
|
$packSetting[DispenserDepImage,1,4] = "[Random pack] random";
|
|
$packSetting[DispenserDepImage,2,4] = "Decoration Pack DecorationDeployable";
|
|
$packSetting[DispenserDepImage,3,4] = "Crate Pack PulseSensorDeployable";
|
|
$packSetting[DispenserDepImage,4,4] = "Light Pack LightDeployable";
|
|
$packSetting[DispenserDepImage,5,4] = "Emitter Pack EmitterDepPack";
|
|
$packSetting[DispenserDepImage,6,4] = "Audio Pack AudioDepPack";
|
|
$packSetting[DispenserDepImage,7,4] = "Tree Pack TreeDeployable";
|
|
|
|
$packSettings[DispenserDepImage,5] = "15 1 Dispenser Pack:[Misc Deployables]";
|
|
$packSetting[DispenserDepImage,0,5] = "[Cycle packs] cycle";
|
|
$packSetting[DispenserDepImage,1,5] = "[Random pack] random";
|
|
$packSetting[DispenserDepImage,2,5] = "Jump Pad JumpadDeployable";
|
|
$packSetting[DispenserDepImage,3,5] = "Teleport Pad TelePadPack";
|
|
$packSetting[DispenserDepImage,4,5] = "Tripwire Pack TripwireDeployable";
|
|
$packSetting[DispenserDepImage,5,5] = "Escape Pod EscapePodDeployable";
|
|
$packSetting[DispenserDepImage,6,5] = "Pack Dispenser DispenserDepPack";
|
|
$packSetting[DispenserDepImage,7,5] = "Detonation pack DetonationDeppack";
|
|
$packSetting[DispenserDepImage,8,5] = "Energize pack EnergizerDeployable";
|
|
$packSetting[DispenserDepImage,9,5] = "Disc turret DiscTurretDeployable";
|
|
$packSetting[DispenserDepImage,10,5] = "Laser turret TurretLaserDeployable";
|
|
$packSetting[DispenserDepImage,11,5] = "Rack Turret TurretMissileRackDeployable";
|
|
$packSetting[DispenserDepImage,12,5] = "Anti Turret TurretMpm_Anti_Deployable";
|
|
$packSetting[DispenserDepImage,13,5] = "MpmFuel pack MpmFuelPack";
|
|
$packSetting[DispenserDepImage,14,5] = "MpmAmmo pack MpmAmmoPack";
|
|
$packSetting[DispenserDepImage,15,5] = "Mpm TargetBeacon Mpm_BeaconPack";
|
|
|
|
|
|
|
|
$packSettings[DispenserDepImage,6] = "6 1 Dispenser Pack:[Decoration packs]";
|
|
$packSetting[DispenserDepImage,0,6] = "[Cycle packs] cycle";
|
|
$packSetting[DispenserDepImage,1,6] = "[Random pack] random";
|
|
$packSetting[DispenserDepImage,2,6] = "ELF Barrel ELFBarrelPack";
|
|
$packSetting[DispenserDepImage,3,6] = "Mortar Barrel MortarBarrelPack";
|
|
$packSetting[DispenserDepImage,4,6] = "Plasma Barrel PlasmaBarrelPack";
|
|
$packSetting[DispenserDepImage,5,6] = "AA Barrel AABarrelPack";
|
|
$packSetting[DispenserDepImage,6,6] = "Missile Barrel MissileBarrelPack";
|
|
|
|
$packSettings[DispenserDepImage,7] = "17 1 Dispenser Pack:[Weapons]";
|
|
$packSetting[DispenserDepImage,0,7] = "[Cycle packs] cycle";
|
|
$packSetting[DispenserDepImage,1,7] = "[Random pack] random";
|
|
$packSetting[DispenserDepImage,2,7] = "Blaster gun Blaster";
|
|
$packSetting[DispenserDepImage,3,7] = "Plasma Rifle Plasma";
|
|
$packSetting[DispenserDepImage,4,7] = "Quad Chaingun Chaingun";
|
|
$packSetting[DispenserDepImage,5,7] = "Spinfusor lauchner Disc";
|
|
$packSetting[DispenserDepImage,6,7] = "Grenade Launcher GrenadeLauncher";
|
|
$packSetting[DispenserDepImage,7,7] = "Laser Rifle SniperRifle";
|
|
$packSetting[DispenserDepImage,8,7] = "ELF Projector ELFGun";
|
|
$packSetting[DispenserDepImage,9,7] = "Fusion Mortar Mortar";
|
|
$packSetting[DispenserDepImage,10,7] = "Missile Launcher MissileLauncher";
|
|
$packSetting[DispenserDepImage,11,7] = "Shock lance ShockLance";
|
|
$packSetting[DispenserDepImage,12,7] = "Construction Tool ConstructionTool";
|
|
$packSetting[DispenserDepImage,13,7] = "Nerf Gun NerfGun";
|
|
$packSetting[DispenserDepImage,14,7] = "NerfBall Launcher NerfBallLauncher";
|
|
$packSetting[DispenserDepImage,15,7] = "Super Chaingun SuperChaingun";
|
|
$packSetting[DispenserDepImage,16,7] = "Transport gun Transgun";
|
|
$packSetting[DispenserDepImage,17,7] = "Grapler gun TractorGun";
|
|
|
|
$packSettings[DispenserDepImage,8] = "9 1 Dispenser Pack:[Ammo]";
|
|
$packSetting[DispenserDepImage,0,8] = "[Cycle packs] cycle";
|
|
$packSetting[DispenserDepImage,1,8] = "[Random pack] random";
|
|
$packSetting[DispenserDepImage,2,8] = "Plasma Ammo PlasmaAmmo";
|
|
$packSetting[DispenserDepImage,3,8] = "Disc Ammo DiscAmmo";
|
|
$packSetting[DispenserDepImage,4,8] = "GrenadeLaucher Ammo GrenadeLauncherAmmo";
|
|
$packSetting[DispenserDepImage,5,8] = "FusionMortar Ammo MortarAmmo";
|
|
$packSetting[DispenserDepImage,6,8] = "MissileLauncher Ammo MissileLauncherAmmo";
|
|
$packSetting[DispenserDepImage,7,8] = "Chaingun Ammo ChaingunAmmo";
|
|
$packSetting[DispenserDepImage,8,8] = "NerfBallLauncher Ammo NerfBallLauncherAmmo";
|
|
$packSetting[DispenserDepImage,9,8] = "SuperChaingun Ammo SuperChaingunAmmo";
|
|
|
|
|
|
///(Arg my poor fingers.. :()
|
|
|
|
|
|
datablock ParticleData( DispenserEffectParticle )
|
|
{
|
|
dragCoeffiecient = 0.0;
|
|
gravityCoefficient = 0.0;
|
|
inheritedVelFactor = 0.0;
|
|
|
|
lifetimeMS = 250;
|
|
lifetimeVarianceMS = 100;
|
|
|
|
textureName = "flarebase";
|
|
|
|
useInvAlpha = false;
|
|
|
|
spinRandomMin = -360.0;
|
|
spinRandomMax = 360.0;
|
|
|
|
colors[0] = "0.4 0.4 0.4 1.0";
|
|
colors[1] = "0.3 0.3 0.3 0.1";
|
|
colors[2] = "0.0 0.0 0.0 0.0";
|
|
sizes[0] = 0.4;
|
|
sizes[1] = 0.5;
|
|
sizes[2] = 0.7;
|
|
times[0] = 0.0;
|
|
times[1] = 0.5;
|
|
times[2] = 1.0;
|
|
};
|
|
|
|
datablock ParticleEmitterData( DispenserEffectEmitter )
|
|
{
|
|
ejectionPeriodMS = 5;
|
|
periodVarianceMS = 1;
|
|
|
|
ejectionVelocity = 5.0; // A little oomph at the back end
|
|
velocityVariance = 2.0;
|
|
|
|
thetaMin = 20.0;
|
|
thetaMax = 30.0;
|
|
phiReferenceVel = "0";
|
|
phiVariance = "360";
|
|
|
|
orientParticles = False;
|
|
orientOnVelocity = False;
|
|
|
|
particles = "DispenserEffectParticle";
|
|
};
|
|
|
|
|
|
datablock StaticShapeData(DispenserDep) : DeployedCrate
|
|
{
|
|
shapeFile = "stackable4m.dts";
|
|
needsPower = true;
|
|
};
|
|
|
|
datablock ShapeBaseImageData(DispenserDepImage) {
|
|
mass = 1;
|
|
emap = true;
|
|
shapeFile = "stackable4m.dts";
|
|
item = DispenserDepPack;
|
|
mountPoint = 1;
|
|
offset = "0 -0.18 -0.5";
|
|
deployed = DispenserDep;
|
|
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(DispenserDepPack) {
|
|
className = Pack;
|
|
catagory = "Deployables";
|
|
shapeFile = "stackable4m.dts";
|
|
mass = 1;
|
|
elasticity = 0.2;
|
|
friction = 0.6;
|
|
pickupRadius = 1;
|
|
rotate = true;
|
|
image = "DispenserDepImage";
|
|
pickUpName = "an pack Dispenser";
|
|
heatSignature = 0;
|
|
emap = true;
|
|
};
|
|
|
|
function DispenserDepPack::onPickup(%this, %obj, %shape, %amount) {
|
|
// created to prevent console errors
|
|
}
|
|
|
|
function DispenserDep::gainPower(%data, %obj)
|
|
{
|
|
respawnpack(%obj);
|
|
}
|
|
|
|
function DispenserDep::losePower(%data, %obj)
|
|
{
|
|
if (isObject(%obj.emitter))
|
|
%obj.emitter.delete();
|
|
}
|
|
|
|
|
|
|
|
function DispenserDepImage::onDeploy(%item, %plyr, %slot) {
|
|
|
|
%playerVector = vectorNormalize(-1 * getWord(%plyr.getEyeVector(),1) SPC getWord(%plyr.getEyeVector(),0) SPC "0");
|
|
%item.surfaceNrm2 = %playerVector;
|
|
%rot = fullRot(%item.surfaceNrm,%item.surfaceNrm2);
|
|
|
|
%deplObj = new StaticShape()
|
|
{
|
|
dataBlock = "DispenserDep";
|
|
scale = "1.5 1.5 0.5";
|
|
};
|
|
|
|
// 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);
|
|
|
|
|
|
%set1 = %plyr.packSet ? %plyr.packSet : 0;
|
|
%set2 = %plyr.expertSet ? %plyr.expertSet : 0;
|
|
%name = GetWord($packSetting[DispenserDepImage, %set1,%set2],2);
|
|
|
|
%deplObj.packblock = %name;
|
|
%deplObj.set1 = %set1;
|
|
%deplObj.set2 = %set2;
|
|
|
|
// 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.powerFreq = %plyr.powerFreq;
|
|
checkPowerObject(%deplObj);
|
|
respawnpack(%deplObj);
|
|
|
|
if (!%plyr.client.isAdmin)
|
|
{
|
|
%plyr.unmountImage(%slot);
|
|
%plyr.decInventory(%item.item, 1);
|
|
}
|
|
|
|
return %deplObj;
|
|
}
|
|
|
|
function DispenserDep::onDestroyed(%this,%obj,%prevState) {
|
|
if (%obj.isRemoved)
|
|
return;
|
|
%obj.isRemoved = true;
|
|
if (isObject(%obj.emitter))
|
|
%obj.emitter.delete();
|
|
Parent::onDestroyed(%this,%obj,%prevState);
|
|
$TeamDeployedCount[%obj.team, DispenserDepPack]--;
|
|
remDSurface(%obj);
|
|
%obj.schedule(500, "delete");
|
|
}
|
|
|
|
function DispenserDepImage::onMount(%data, %obj, %node) {
|
|
displayPowerFreq(%obj);
|
|
%obj.hasEmpack = true; // not needed anymore
|
|
%obj.packSet = 0;
|
|
%obj.packSet[0] = 0;
|
|
%obj.packSet[1] = 0;
|
|
%obj.packSet[2] = 0;
|
|
%obj.packSet[3] = 0;
|
|
}
|
|
|
|
function DispenserDepImage::onUnmount(%data, %obj, %node) {
|
|
%obj.hasEmpack = ""; // not needed anymore
|
|
%obj.packSet = 0;
|
|
%obj.packSet[0] = 0;
|
|
%obj.packSet[1] = 0;
|
|
%obj.packSet[2] = 0;
|
|
%obj.packSet[3] = 0;
|
|
}
|
|
|
|
|
|
|
|
//Respawns dispenser's item.
|
|
|
|
function respawnpack(%disp,%override)
|
|
{
|
|
if ((!IsObject(%disp.pack)) && isObject(%disp))
|
|
{
|
|
%name = %disp.packblock;
|
|
%set1 = %disp.set1;
|
|
%set2 = %disp.set2;
|
|
|
|
if (%name $= "cycle")
|
|
{
|
|
%disp.set1++;
|
|
%max = GetWord($packSettings[DispenserDepImage,%set2 ],0);
|
|
if (%disp.set1 > %max || %disp.set1 < 2)
|
|
%disp.set1 = 2;
|
|
%name = GetWord($packSetting[DispenserDepImage, %disp.set1,%set2],2);
|
|
}
|
|
else if (%name $= "random")
|
|
{
|
|
%max = GetWord($packSettings[DispenserDepImage,%set2 ],0);
|
|
%set1 = mFloor(getRandom()*(%max-2) +2);
|
|
%name = GetWord($packSetting[DispenserDepImage, %set1,%set2],2);
|
|
}
|
|
%pack = new Item()
|
|
{
|
|
dataBlock = %name;
|
|
static = false;
|
|
rotate = true;
|
|
};
|
|
%pack.startFade(0,0,1);
|
|
%pos = VectorAdd(RealVec(%disp,"0 0 1"),%disp.getEdge("0 0 1"));
|
|
%pack.setTransform(%pos SPC "0 0 1" SPC getRandom()*$Pi*2);
|
|
%em = createLifeEmitter(%pos,DispenserEffectEmitter,1000);
|
|
%pack.startFade(1000,0,0);
|
|
%em.setRotation(%disp.getRotation);
|
|
%pack.dispenser = %disp;
|
|
%disp.emitter = %pack; //Lil hook to make it get removed when disas
|
|
%disp.pack = %pack;
|
|
%pack.addTofxGroup(2);
|
|
}
|
|
}
|
|
|
|
//Not much has changed.. :D
|
|
|
|
function DispenserDepImage::ChangeMode(%data,%plyr,%val,%level)
|
|
{
|
|
if (%level == 0)
|
|
{
|
|
if (%plyr.expertset $= "")
|
|
%plyr.expertset = 0;
|
|
//Selecting Dispenser
|
|
%set = %plyr.expertSet $= "" ? 0 : %plyr.expertSet;
|
|
%image = %data.getName();
|
|
%settings = $packSettings[%image,%set];
|
|
|
|
%plyr.packSet = %plyr.packSet + %val;
|
|
if (%plyr.packSet > getWord(%settings,0))
|
|
%plyr.packSet = 0;
|
|
if (%plyr.packSet < 0)
|
|
%plyr.packSet = getWord(%settings,0);
|
|
|
|
%packname = GetWords(%settings,2,getWordCount(%settings));
|
|
%curset = $PackSetting[%image,%plyr.packSet,%set];
|
|
if (getWord(%settings,1) == -1)
|
|
%line = GetWords(%curset,0,getWordCount(%curset));
|
|
else
|
|
%line = GetWords(%curset,0,getWord(%settings,1));
|
|
bottomPrint(%plyr.client,%packname SPC "set to"SPC %line,2,1);
|
|
|
|
}
|
|
else
|
|
{
|
|
Parent::ChangeMode(%data,%plyr,%val,%level);
|
|
}
|
|
}
|
|
|
|
/////////Detonation PACK//////////
|
|
|
|
|
|
$expertSettings[DetonationDepImage] = "2 -1 Detonation Pack:[Options]";
|
|
|
|
$expertSetting[DetonationDepImage,0] = "Select Payload";
|
|
$expertSetting[DetonationDepImage,1] = "Select Detonation logic";
|
|
$expertSetting[DetonationDepImage,2] = "Select Detonation Time";
|
|
|
|
$packSettings[DetonationDepImage] = "12 1 Detonation Pack:[Payload]";
|
|
$packSetting[DetonationDepImage,0] = "Dud Explosion 5";
|
|
$packSetting[DetonationDepImage,1] = "Repair Pulse 20";
|
|
$packSetting[DetonationDepImage,2] = "Cloack Pulse 20";
|
|
$packSetting[DetonationDepImage,3] = "Decon Pulse 20";
|
|
$packSetting[DetonationDepImage,4] = "ESP Pulse 60";
|
|
$packSetting[DetonationDepImage,5] = "Morph Pulse 60";
|
|
$packSetting[DetonationDepImage,6] = "Ion Zap 30";
|
|
$packSetting[DetonationDepImage,7] = "Mortar Fountain 30";
|
|
$packSetting[DetonationDepImage,8] = "Bomber Crash 30";
|
|
$packSetting[DetonationDepImage,9] = "Satchel Charge 30";
|
|
$packSetting[DetonationDepImage,10] = "Atommic NukeCannon 120";
|
|
$packSetting[DetonationDepImage,11] = "ArrowIV 150ktNuke 180";
|
|
$packSetting[DetonationDepImage,12] = "Dark Hole 360";
|
|
|
|
$packSettings[DetonationDepImage,1] = "4 -1 Detonation Pack: [Detonation Logic]";
|
|
$packSetting[DetonationDepImage,0,1] = "Detonate when armed";
|
|
$packSetting[DetonationDepImage,1,1] = "Detonate when powered";
|
|
$packSetting[DetonationDepImage,2,1] = "Detonate when not powered";
|
|
$packSetting[DetonationDepImage,3,1] = "Detonate when deconstructed";
|
|
$packSetting[DetonationDepImage,4,1] = "Detonate when destroyed";
|
|
|
|
$packSettings[DetonationDepImage,2] = "7 -1 Detonation Pack: [Detonation Time]";
|
|
$packSetting[DetonationDepImage,0,2] = "3 Seconds";
|
|
$packSetting[DetonationDepImage,1,2] = "5 Seconds";
|
|
$packSetting[DetonationDepImage,2,2] = "10 Secconds";
|
|
$packSetting[DetonationDepImage,3,2] = "20 Seconds";
|
|
$packSetting[DetonationDepImage,4,2] = "30 Seconds";
|
|
$packSetting[DetonationDepImage,5,2] = "60 Seconds";
|
|
$packSetting[DetonationDepImage,6,2] = "120 Seconds";
|
|
$packSetting[DetonationDepImage,7,2] = "600 Seconds";
|
|
|
|
|
|
datablock StaticShapeData(DetonationDep) : DeployedCrate
|
|
{
|
|
shapeFile = "stackable2l.dts";
|
|
needsPower = true;
|
|
targetNameTag = 'Detonation';
|
|
targetTypeTag = '';
|
|
};
|
|
|
|
datablock StaticShapeData(DetonationDepArm) : DeployedCrate
|
|
{
|
|
shapeFile = "stackable4m.dts";
|
|
needsPower = true;
|
|
};
|
|
|
|
|
|
|
|
datablock ShapeBaseImageData(DetonationDepImage) {
|
|
mass = 1;
|
|
emap = true;
|
|
shapeFile = "stackable2l.dts";
|
|
item = DetonationDepPack;
|
|
mountPoint = 1;
|
|
offset = "0 -1 -1";
|
|
deployed = DetonationDepImage;
|
|
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(DetonationDepPack) {
|
|
explosion = SatchelMainExplosion;
|
|
underwaterExplosion = UnderwaterSatchelMainExplosion;
|
|
className = Pack;
|
|
catagory = "Deployables";
|
|
shapeFile = "stackable2l.dts";
|
|
mass = 1;
|
|
elasticity = 0.2;
|
|
friction = 0.6;
|
|
pickupRadius = 1;
|
|
rotate = true;
|
|
image = "DetonationDepImage";
|
|
pickUpName = "an Detonation pack";
|
|
heatSignature = 0;
|
|
emap = true;
|
|
armDelay = 3000;
|
|
maxDamage = 0.6;
|
|
|
|
kickBackStrength = 4000;
|
|
|
|
};
|
|
|
|
function DetonationDepPack::onPickup(%this, %obj, %shape, %amount) {
|
|
// created to prevent console errors
|
|
}
|
|
|
|
function DetonationDep::gainPower(%data, %obj)
|
|
{
|
|
if (%obj.dlogic==1 && %obj.armed)
|
|
{
|
|
%obj.detsched = schedule(%obj.dettime*1000,%obj,"DetonationDepDetonate",%obj);
|
|
PlaydetTimer(%obj,%obj.dettime);
|
|
}
|
|
else if (%obj.dlogic == 1)
|
|
{
|
|
%obj.wantdet = 1;
|
|
}
|
|
else if (%obj.dlogic == 2)
|
|
{
|
|
if (%obj.armed)
|
|
serverplay3d(MTCThinkSound,%obj.getTransform());
|
|
StopDetTimer(%obj);
|
|
//Cancel(%Obj.armsch);
|
|
%obj.wantdet = 0;
|
|
Cancel(%obj.detsched);
|
|
}
|
|
}
|
|
|
|
function DetonationDep::losePower(%data, %obj)
|
|
{
|
|
if (%obj.dlogic==2 && %obj.armed)
|
|
{
|
|
%obj.detsched = schedule(%obj.dettime*1000,%obj,"DetonationDepDetonate",%obj);
|
|
PlaydetTimer(%obj,%obj.dettime);
|
|
}
|
|
else if (%obj.dlogic == 2)
|
|
{
|
|
%obj.wantdet = 1;
|
|
}
|
|
else if (%obj.dlogic == 1)
|
|
{
|
|
if (%obj.armed)
|
|
serverplay3d(MTCThinkSound,%obj.getTransform());
|
|
StopDetTimer(%obj);
|
|
//Cancel(%Obj.armsch);
|
|
%obj.wantdet = 0;
|
|
Cancel(%obj.detsched);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
function DetonationDepImage::onDeploy(%item, %plyr, %slot) {
|
|
|
|
if (!$Host::SatchelChargeEnabled)
|
|
{
|
|
messageAll("", "\c2"@ %plyr.client.namebase @" tried to deploy a Detonation pack.");
|
|
%plyr.unmountImage(%slot);
|
|
%plyr.decInventory(%item.item, 1);
|
|
return;
|
|
}
|
|
|
|
%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 StaticShape()
|
|
{
|
|
dataBlock = "DetonationDep";
|
|
scale = "0.4 0.4 1.2";
|
|
};
|
|
%Arm1 = new StaticShape()
|
|
{
|
|
dataBlock = "DetonationDeparm";
|
|
scale = "2 2.2 2";
|
|
};
|
|
%arm2= new StaticShape()
|
|
{
|
|
dataBlock = "DetonationDeparm";
|
|
scale = "2 2.2 2";
|
|
};
|
|
%arm3= new StaticShape()
|
|
{
|
|
dataBlock = "DetonationDeparm";
|
|
scale = "0.8 0.8 0.4";
|
|
};
|
|
%arm4= new StaticShape()
|
|
{
|
|
dataBlock = "DetonationDeparm";
|
|
scale = "0.8 0.8 0.4";
|
|
};
|
|
%deplObj.ownername = %plyr.client.namebase;
|
|
setTargetName(%deplObj.target,addTaggedString(%plyr.client.namebase SPC "\'s detonation pack [arming]"));
|
|
if (%deplObj.getTarget() != -1)
|
|
setTargetSensorGroup(%deplObj.getTarget(), %plyr.client.team);
|
|
|
|
%rot1=rotadd(%rot,"0 1 0 -1.57");
|
|
%rot2=rotadd(%rot,"0 1 0" SPC $Pi / 2);
|
|
%rot3=rotadd(%rot,"0 1 0" SPC -1*$Pi / 2);
|
|
// set orientation
|
|
%deplObj.setTransform(%item.surfacePt SPC %rot1);
|
|
%deplObj.setEdge(%item.surfacePt,"1 0 0");
|
|
|
|
%arm1.setTransform(%item.surfacePt SPC %rot);
|
|
%arm1.setEdge(%deplObj.getEdge("1 0 1"),"0 0 -1");
|
|
%arm2.setTransform(%item.surfacePt SPC %rot);
|
|
%arm2.setEdge(%deplObj.getEdge("1 0 -1"),"0 0 -1");
|
|
%arm3.setTransform(%item.surfacePt SPC %rot2);
|
|
%arm3.setEdge(%arm1.getEdge("-0.9 0 1"),"1 0 -1");
|
|
%arm4.setTransform(%item.surfacePt SPC %rot3);
|
|
%arm4.setEdge(%arm2.getEdge("0.9 0 1"),"-1 0 -1");
|
|
|
|
//%deplobj.emitter = CreateEmitter(%deplObj.getEdge("0 0 0"),LoadingE);
|
|
//%deplobj.emitter.setRotation(%rot);
|
|
%emitter1 = CreateEmitter(%arm1.getEdge("0 0 1.2"),LoadingE2);
|
|
%emitter2 = CreateEmitter(%arm2.getEdge("0 0 1.2"),LoadingE2);
|
|
%deplobj.children=6;
|
|
%deplobj.child[0] = %arm1;
|
|
%deplobj.child[1] = %arm2;
|
|
%deplobj.child[2] = %arm3;
|
|
%deplobj.child[3] = %arm4;
|
|
%deplobj.child[4] = %emitter1;
|
|
%deplobj.child[5] = %emitter2;
|
|
|
|
%arm1.parent = %deplobj;
|
|
%arm2.parent = %deplobj;
|
|
%arm3.parent = %deplobj;
|
|
%arm4.parent = %deplobj;
|
|
%deplobj.payload = %plyr.packset;
|
|
%deplobj.armtime = getWord($packSetting[DetonationDepImage,%plyr.packset],2);
|
|
%deplobj.dettime = getWord($packSetting[DetonationDepImage,%plyr.packset[2],2],0);
|
|
|
|
// 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);
|
|
%arm1.team = %plyr.client.Team;
|
|
%arm1.setOwner(%plyr);
|
|
%arm2.team = %plyr.client.Team;
|
|
%arm2.setOwner(%plyr);
|
|
%arm3.team = %plyr.client.Team;
|
|
%arm3.setOwner(%plyr);
|
|
%arm4.team = %plyr.client.Team;
|
|
%arm4.setOwner(%plyr);
|
|
|
|
%deplObj.dLogic = %plyr.packset[1];
|
|
|
|
|
|
// 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.powerFreq = %plyr.powerFreq;
|
|
checkPowerObject(%deplObj);
|
|
|
|
//Warnings
|
|
%warns = mfloor(%deplobj.armtime/30);
|
|
for (%i =0; %i<%warns;%i++)
|
|
{
|
|
schedule(%i*30000,%deplObj,"bottomPrint",%plyr.client,"Detonation pack arming in" SPC (%warns-%i)*30 SPC"seconds",2,1);
|
|
}
|
|
%name = %plyr.client.namebase;
|
|
messageAll("", "\c2"@ %name @" deployed a Detonation pack.");//~wfx/misc/red_alert.wav");
|
|
|
|
%detpoint = new WayPoint()
|
|
{
|
|
position = %item.surfacept;
|
|
rotation = "1 0 0 0";
|
|
scale = "1 1 1";
|
|
name = "Arming Detonation pack";
|
|
dataBlock = "WayPointMarker";
|
|
lockCount = "0";
|
|
homingCount = "0";
|
|
};
|
|
MissionCleanup.add(%detpoint);
|
|
%detpoint.schedule(5 * 1000, "delete");
|
|
|
|
%plyr.unmountImage(%slot);
|
|
%plyr.decInventory(%item.item, 1);
|
|
|
|
%deplObj.armsch = schedule(%deplobj.armtime*1000,%deplObj,"ArmDetonationDep",%deplObj);
|
|
|
|
return %deplObj;
|
|
}
|
|
|
|
|
|
function DetonationDep::onDestroyed(%this,%obj,%prevState) {
|
|
if (%obj.isRemoved)
|
|
return;
|
|
if (%obj.dlogic==4 && %obj.armed)
|
|
{
|
|
%obj.armed = 0;
|
|
DetonationDepDetonate(%obj);
|
|
}
|
|
%obj.isRemoved = true;
|
|
Parent::onDestroyed(%this,%obj,%prevState);
|
|
$TeamDeployedCount[%obj.team, DetonationDepPack]--;
|
|
remDSurface(%obj);
|
|
for(%i=0;%i<%obj.children;%i++)
|
|
{
|
|
if (isObject(%obj.child[%i]))
|
|
%obj.child[%i].schedule(500, "delete");
|
|
}
|
|
%obj.schedule(500, "delete");
|
|
}
|
|
|
|
function DetonationDep::disassemble(%data,%plyr,%obj) {
|
|
if (!isObject(%obj) || %obj.isRemoved)
|
|
return;
|
|
if (%obj.dlogic==3 && %obj.armed)
|
|
{
|
|
DetonationDepDetonate(%obj);
|
|
//PlaydetTimer(%obj,%obj.dettime);
|
|
|
|
}
|
|
for(%i=0;%i<%obj.children;%i++)
|
|
{
|
|
if (isObject(%obj.child[%i]))
|
|
%obj.child[%i].delete();
|
|
}
|
|
Parent::disassemble(%data,%plyr,%obj);
|
|
}
|
|
|
|
function DetonationDepArm::disassemble(%data,%plyr,%obj) {
|
|
Cancel(%Obj.armsch);
|
|
if (!isObject(%obj) || %obj.isRemoved)
|
|
return;
|
|
if (isObject(%obj.parent)) {
|
|
%obj.parent.getDatablock().disassemble(%plyr,%obj.parent);
|
|
}
|
|
Parent::disassemble(%data,%plyr,%obj);
|
|
}
|
|
|
|
function StartArmDetonationDep(%obj)
|
|
{
|
|
Cancel(%obj.detsched);
|
|
Cancel(%Obj.armsch);
|
|
StopDetTimer(%obj);
|
|
%obj.armed = 0;
|
|
setTargetName(%Obj.target,addTaggedString(%obj.owner.namebase SPC "\'s detonation pack [arming]"));
|
|
if (isObject(%obj.child[4]))
|
|
%obj.child[4].delete();
|
|
if (isObject(%obj.child[5]))
|
|
%obj.child[5].delete();
|
|
%obj.child[4] = CreateEmitter(%obj.child[0].getEdge("0 0 1.2"),LoadingE2);
|
|
%obj.child[5] = CreateEmitter(%obj.child[1].getEdge("0 0 1.2"),LoadingE2);
|
|
|
|
%Obj.armsch = schedule(%obj.armtime*1000,%Obj,"ArmDetonationDep",%obj);
|
|
}
|
|
|
|
function ArmDetonationDep(%obj)
|
|
{
|
|
Cancel(%obj.detsched);
|
|
Cancel(%Obj.armsch);
|
|
StopDetTimer(%obj);
|
|
|
|
setTargetName(%Obj.target,addTaggedString(%obj.ownername SPC "\'s detonation pack [armed]"));
|
|
serverplay3d(MTCThinkSound,%obj.getTransform());
|
|
|
|
if (isObject(%obj.child[4]))
|
|
%obj.child[4].delete();
|
|
if (isObject(%obj.child[5]))
|
|
%obj.child[5].delete();
|
|
%obj.child[4] = CreateEmitter(%obj.getEdge("0 0 0"),LoadingE);
|
|
%obj.child[4].setRotation(%obj.child[0].getrotation());
|
|
%obj.armed = 1;
|
|
|
|
if (%obj.dlogic == 0 || %obj.wantdet)
|
|
{
|
|
%obj.detsched = schedule(%obj.dettime*1000,%obj,"DetonationDepDetonate",%obj);
|
|
PlaydetTimer(%obj,%obj.dettime);
|
|
}
|
|
}
|
|
|
|
function PlaydetTimer(%obj,%timeleft)
|
|
{
|
|
StopDetTimer(%obj);
|
|
%times = "1 2 3 5 10 30 60";
|
|
%obj.counting = 1;
|
|
for (%i=0;%i<7;%i++)
|
|
{
|
|
%tt = GetWord(%times,%i);
|
|
if (%tt<=%timeleft)
|
|
{
|
|
%point = %timeleft-%tt;
|
|
%obj.countsound[%i] = schedule(%point*1000,%obj,"PlaydetSound",%obj,GetWord(%times,%i));
|
|
}
|
|
}
|
|
if (%obj.dlogic != 0)
|
|
{
|
|
//%time = (%obj.dettime < 30) ? 30 : %obj.dettime;
|
|
//%obj.countsound[8] = schedule(%timeleft*1000,%obj,"PlaydetTimer",%obj,%time);
|
|
}
|
|
}
|
|
|
|
function StopDetTimer(%obj)
|
|
{
|
|
%obj.counting = 0;
|
|
for (%i=0;%i<8;%i++)
|
|
{
|
|
Cancel(%obj.countsound[%i]);
|
|
}
|
|
}
|
|
|
|
function PlaydetSound(%obj,%time)
|
|
{
|
|
if (isObject(%obj) && %obj.counting)
|
|
{
|
|
setTargetName(%obj.target,addTaggedString(%obj.ownername SPC "\'s detonation pack ["@ %time @" seconds mark]"));
|
|
ServerPlay3D(MessageRecieveSound,%obj.getTransform());
|
|
}
|
|
}
|
|
|
|
function DetonationDepImage::onMount(%data, %obj, %node) {
|
|
displayPowerFreq(%obj);
|
|
%obj.hasEmpack = true; // not needed anymore
|
|
%obj.packSet = 0;
|
|
%obj.expertSet = 0;
|
|
%obj.packSet[0] = 0;
|
|
%obj.packSet[1] = 0;
|
|
%obj.packSet[2] = 0;
|
|
}
|
|
|
|
function DetonationDepImage::onUnmount(%data, %obj, %node) {
|
|
%obj.hasEmpack = ""; // not needed anymore
|
|
%obj.packSet = 0;
|
|
%obj.expertSet = 0;
|
|
%obj.packSet[0] = 0;
|
|
%obj.packSet[1] = 0;
|
|
%obj.packSet[2] = 0;
|
|
}
|
|
|
|
|
|
|
|
function DetonationDepImage::ChangeMode(%data,%plyr,%val,%level)
|
|
{
|
|
if (%level == 0)
|
|
{
|
|
//Selecting Detonation
|
|
if (!%plyr.expertSet)
|
|
{
|
|
Parent::ChangeMode(%data,%plyr,%val,%level);
|
|
//%plyr.packset[0] = GetWord($packSetting[DetonationDepImage,%plyr.packset],2);
|
|
}
|
|
//Selecting selection mode/PowerLogic/CloakLogic
|
|
else if (%plyr.expertSet > 0)
|
|
{
|
|
%set = %plyr.expertSet;
|
|
%image = %data.getName();
|
|
%settings = $packSettings[%image,%set];
|
|
|
|
%plyr.packSet[%set] = %plyr.packSet[%set] + %val;
|
|
if (%plyr.packSet[%set] > getWord(%settings,0))
|
|
%plyr.packSet[%set] = 0;
|
|
if (%plyr.packSet[%set] < 0)
|
|
%plyr.packSet[%set] = getWord(%settings,0);
|
|
|
|
%packname = GetWords(%settings,2,getWordCount(%settings));
|
|
%curset = $PackSetting[%image,%plyr.packSet[%set],%set];
|
|
if (getWord(%settings,1) == -1)
|
|
%line = GetWords(%curset,0,getWordCount(%curset));
|
|
else
|
|
%line = GetWords(%curset,0,getWord(%settings,1));
|
|
bottomPrint(%plyr.client,%packname SPC "set to"SPC %line,2,1);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
Parent::ChangeMode(%data,%plyr,%val,%level);
|
|
}
|
|
}
|
|
|
|
function DetonationDepDetonate(%obj)
|
|
{
|
|
if (!%obj.payload)
|
|
{
|
|
//do nothing
|
|
}
|
|
else if (%obj.payload == 1)
|
|
{
|
|
Aidpulse(%obj.getTransform(),%obj.owner,0);
|
|
}
|
|
else if (%obj.payload == 2)
|
|
{
|
|
Aidpulse(%obj.getTransform(),%obj.owner,1);
|
|
}
|
|
else if (%obj.payload == 3)
|
|
{
|
|
Aidpulse(%obj.getTransform(),%obj.owner,2);
|
|
}
|
|
else if (%obj.payload == 4)
|
|
{
|
|
Aidpulse(%obj.getTransform(),%obj.owner,3);
|
|
}
|
|
else if (%obj.payload == 5)
|
|
{
|
|
Aidpulse(%obj.getTransform(),%obj.owner,4);
|
|
}
|
|
else if (%obj.payload == 6)
|
|
{
|
|
%obj.Zap(5000);
|
|
}
|
|
else if (%obj.payload == 7)
|
|
{
|
|
for (%i=0;%i<5;%i++)
|
|
{
|
|
%ranupvec = GetRandom()*2-1 SPC GetRandom()*2-1 SPC GetRandom()*1;
|
|
MortarShot.Create(%obj.getEdge("-2 0 0"),VectorScale(realvec(%obj,%ranupvec),0.5));
|
|
}
|
|
}
|
|
else if (%obj.payload == 8)
|
|
{
|
|
for (%i=0;%i<5;%i++)
|
|
{
|
|
%ranupvec = GetRandom()*2-1 SPC GetRandom()*2-1 SPC GetRandom()*1;
|
|
BomberBomb.Create(%obj.getEdge("-2 0 0"),realvec(%obj,%ranupvec),VectorScale(realvec(%obj,%ranupvec),20));
|
|
}
|
|
}
|
|
else if (%obj.payload == 9)
|
|
{
|
|
scatchelkaboom(%obj.getEdge("-2 0 0"),%obj.owner);
|
|
}
|
|
else if (%obj.payload == 10)
|
|
{
|
|
BigFatNukeDrop(%obj.getTransform());
|
|
}
|
|
else if (%obj.payload == 11)
|
|
{
|
|
ShoulderNuclear.onExplode(%obj, %obj.getTransform());
|
|
}
|
|
else if (%obj.payload == 12)
|
|
{
|
|
%pos = %obj.getTransform();
|
|
%mask = $TypeMasks::StaticShapeObjectType | $TypeMasks::ForceFieldObjectType | $TypeMasks::InteriorObjectType;
|
|
%res = containerRayCast(%pos,"0 0 500",%mask, %obj);
|
|
if (%res)
|
|
%inside = 1;
|
|
dome(VectorAdd(%pos,"0 0" SPC (1-%inside)*200),60000,%inside);
|
|
}
|
|
if (!%obj.isRemoved)
|
|
{
|
|
if (%obj.payload == 0 || %obj.payload > 9)
|
|
%obj.setDamageState(Destroyed);
|
|
else
|
|
{
|
|
StartArmDetonationDep(%obj);
|
|
}
|
|
}
|
|
}
|
|
|
|
function scatchelkaboom(%pos,%owner)
|
|
{
|
|
%pack = new Item()
|
|
{
|
|
dataBlock = SatchelChargeThrown;
|
|
static = false;
|
|
rotate = true;
|
|
};
|
|
//%pack.sourceObject = %owner.player;
|
|
//%pack.blowingUp=1;
|
|
%pack.setTransform(%pos);
|
|
%pack.armed = True;
|
|
%pack.Schedule(50,"setDamageState",Destroyed);
|
|
}
|
|
|