mirror of
https://github.com/mostlikely4r/construction-mod.git
synced 2026-01-19 19:24:44 +00:00
1577 lines
47 KiB
C#
1577 lines
47 KiB
C#
//******************************************************************************
|
|
//* Default StaticShape functions
|
|
//******************************************************************************
|
|
|
|
function shouldChangePowerState(%obj,%state) {
|
|
if (%obj.lastState $= "")
|
|
return true;
|
|
if (%obj.isSwitchedOff == true)
|
|
return false;
|
|
return %obj.lastState != %state;
|
|
}
|
|
|
|
function StaticShapeData::onCollision(%data,%obj,%col) {
|
|
//general collision funciton made so i dont have to make
|
|
//1 function for evry object i want to turn into doors
|
|
if (%obj.isdoor !=true && %obj.getdatablock().getname() !$="Deployeddoor")
|
|
return;
|
|
if (%obj.Collision !=true)
|
|
return;
|
|
if (%obj.canmove == false) //if it cant move
|
|
return; //stop here
|
|
if (%col.getClassName() !$= "Player" && %col.getDataBlock().getName() !$= "EscapePodVehicle")
|
|
return;
|
|
if (%obj.team != %col.team)
|
|
return;
|
|
if (%obj.islocked == true){
|
|
messageclient(%col.client, 'MsgClient',"Access Denied");
|
|
return;
|
|
}
|
|
%obj.issliding = 0;
|
|
%client = %col.client;
|
|
%level = %obj.level;
|
|
%owner = %obj.getOwner();
|
|
%ownerguid = %obj.Ownerguid;
|
|
////////////////////
|
|
//door level chek //
|
|
////////////////////
|
|
if (%obj.lv == 4 && %ownerguid != %client.guid){
|
|
messageclient(%client, 'MsgClient',"Access Denied"@%owner.namebase );
|
|
return;
|
|
}
|
|
else if (%obj.lv == 5 && %ownerguid != %client.guid && !%client.isadmin){
|
|
messageclient(%client, 'MsgClient',"Access Denied");
|
|
return;
|
|
}
|
|
////////////////
|
|
//name of door//
|
|
////////////////
|
|
else if (%obj.lv == 1)
|
|
%lv = "owner";
|
|
else if (%obj.lv == 2)
|
|
%lv = "admin";
|
|
else
|
|
%lv = "Collision";
|
|
messageclient(%client, 'MsgClient',"Access Granted");
|
|
if (%obj.timeout $="")
|
|
%obj.timeout=1;
|
|
%obj.closedscale=%obj.scale;
|
|
schedule(10,0,"open",%obj);
|
|
}
|
|
|
|
function StaticShapeData::onGainPowerEnabled(%data,%obj) {
|
|
if (!shouldChangePowerState(%obj,true))
|
|
return;
|
|
%obj.lastState = true;
|
|
if(%data.ambientThreadPowered)
|
|
%obj.playThread($AmbientThread, "ambient");
|
|
// if it's a deployed object, schedule the power thread; else play it immediately
|
|
if(%data.deployAmbientThread)
|
|
%obj.schedule(750, "playThread", $PowerThread, "Power");
|
|
else
|
|
%obj.playThread($PowerThread,"Power");
|
|
// deployable objects get their recharge rate set right away -- don't set it again unless
|
|
// the object has just been re-enabled
|
|
if(%obj.initDeploy)
|
|
%obj.initDeploy = false;
|
|
else {
|
|
if(%obj.getRechargeRate() <= 0) {
|
|
if (%data.needsPower) {
|
|
%obj.setRechargeRate(%data.rechargeRate + ((%obj.powerCount - 1) * (%data.rechargeRate * 0.5) ));
|
|
}
|
|
else {
|
|
%oldERate = %obj.getRechargeRate();
|
|
%obj.setRechargeRate(%oldERate + %data.rechargeRate);
|
|
}
|
|
}
|
|
}
|
|
if(%data.humSound !$= "")
|
|
%obj.playAudio($HumSound, %data.humSound);
|
|
%obj.setPoweredState(true);
|
|
if (%data.className $= "Generator")
|
|
checkPowerGenerator(%obj,1);
|
|
if (%obj.isdoor == 1 || %obj.getdatablock().getname() $="Deployeddoor") {
|
|
if (%obj.canlock == true) //if the door can lock on poweron
|
|
%obj.islocked=true; //lock it
|
|
if (%obj.canmove == false) //if it cant move
|
|
return; //stop here
|
|
if (%obj.powercontrol == 1) {
|
|
if (%obj.toggletype ==1){
|
|
if (%obj.moving $="close" || %obj.moving $="" || %going $="opening"){
|
|
schedule(10,0,"open",%obj);
|
|
}
|
|
else if (%obj.moving $="open" || %going $="closeing"){
|
|
schedule(10,0,"close",%obj);
|
|
}
|
|
}
|
|
else
|
|
schedule(10,0,"open",%obj);
|
|
}
|
|
}
|
|
}
|
|
|
|
function StaticShapeData::onLosePowerDisabled(%data,%obj) {
|
|
if (!shouldChangePowerState(%obj,false))
|
|
return;
|
|
%obj.lastState = false;
|
|
%client = %obj.getControllingClient();
|
|
if(%client != 0)
|
|
serverCmdResetControlObject(%client);
|
|
|
|
if(%data.ambientThreadPowered)
|
|
%obj.pauseThread($AmbientThread);
|
|
if(!%data.alwaysAmbient) {
|
|
%obj.stopThread($PowerThread);
|
|
// MES -- drop shields and stop them from regenerating after power loss
|
|
%obj.setRechargeRate(0.0);
|
|
%obj.setEnergyLevel(0.0);
|
|
}
|
|
if(%data.humSound !$= "")
|
|
%obj.stopAudio($HumSound);
|
|
%obj.setPoweredState(false);
|
|
if (%data.className $= "Generator")
|
|
checkPowerGenerator(%obj,-1);
|
|
if (%obj.isdoor == 1 || %obj.getdatablock().getname() $="Deployeddoor") {
|
|
if (%obj.canlock == true) //if the door can lock on poweron
|
|
%obj.islocked=false; //unlock it
|
|
if (%obj.canmove == false) //if it cant move
|
|
return; //stop here
|
|
if (%obj.powercontrol == 1) {
|
|
if (%obj.toggletype ==1){
|
|
if (%obj.moving $="close" || %obj.moving $="" || %going $="opening"){
|
|
schedule(10,0,"open",%obj);
|
|
}
|
|
else if (%obj.moving $="open" || %going $="closeing"){
|
|
schedule(10,0,"close",%obj);
|
|
}
|
|
}
|
|
else
|
|
schedule(10,0,"open",%obj);
|
|
}
|
|
}
|
|
}
|
|
|
|
function StaticShapeData::gainPower(%data,%obj) {
|
|
if(%obj.isEnabled())
|
|
%data.onGainPowerEnabled(%obj);
|
|
Parent::gainPower(%data,%obj);
|
|
}
|
|
|
|
function StaticShapeData::losePower(%data,%obj) {
|
|
if(%obj.isEnabled())
|
|
%data.onLosePowerDisabled(%obj);
|
|
Parent::losePower(%data,%obj);
|
|
}
|
|
|
|
function ShapeBaseData::onEnabled()
|
|
{
|
|
}
|
|
|
|
function ShapeBaseData::onDisabled()
|
|
{
|
|
}
|
|
|
|
function StaticShapeData::onEnabled(%data, %obj, %prevState) {
|
|
if(%obj.isPowered())
|
|
%data.onGainPowerEnabled(%obj);
|
|
Parent::onEnabled(%data, %obj, %prevState);
|
|
}
|
|
|
|
function StaticShapeData::onDisabled(%data, %obj, %prevState) {
|
|
if(%obj.isPowered() || (%data.className $= "Generator"))
|
|
%data.onLosePowerDisabled(%obj);
|
|
Parent::onDisabled(%data, %obj, %prevState);
|
|
}
|
|
|
|
function StaticShape::deploy(%this)
|
|
{
|
|
%this.playThread($DeployThread, "deploy");
|
|
}
|
|
|
|
function StaticShapeData::onEndSequence(%data, %obj, %thread)
|
|
{
|
|
if(%thread == $DeployThread && !%data.needsPower)
|
|
%obj.setSelfPowered();
|
|
Parent::onEndSequence(%data, %obj, %thread);
|
|
}
|
|
|
|
function ShapeBaseData::onEndSequence()
|
|
{
|
|
}
|
|
|
|
//******************************************************************************
|
|
//* Example explosion
|
|
//******************************************************************************
|
|
|
|
datablock EffectProfile(ShapeExplosionEffect)
|
|
{
|
|
effectname = "explosions/explosion.xpl03";
|
|
minDistance = 10;
|
|
maxDistance = 50;
|
|
};
|
|
|
|
datablock AudioProfile(ShapeExplosionSound)
|
|
{
|
|
filename = "fx/explosions/explosion.xpl03.wav";
|
|
description = AudioExplosion3d;
|
|
preload = true;
|
|
effect = ShapeExplosionEffect;
|
|
};
|
|
|
|
datablock ExplosionData(ShapeExplosion)
|
|
{
|
|
explosionShape = "disc_explosion.dts";
|
|
soundProfile = ShapeExplosionSound;
|
|
faceViewer = true;
|
|
};
|
|
|
|
//******************************************************************************
|
|
//* Player Armors - Data Blocks (live players are now StaticTSObjects)
|
|
//******************************************************************************
|
|
|
|
datablock StaticShapeData(HeavyMaleHuman_Dead)
|
|
{
|
|
className = "deadArmor";
|
|
catagory = "Player Armors";
|
|
shapeFile = "heavy_male_dead.dts";
|
|
isInvincible = true;
|
|
};
|
|
|
|
datablock StaticShapeData(MediumMaleHuman_Dead)
|
|
{
|
|
className = "deadArmor";
|
|
catagory = "Player Armors";
|
|
shapeFile = "medium_male_dead.dts";
|
|
isInvincible = true;
|
|
};
|
|
|
|
datablock StaticShapeData(LightMaleHuman_Dead)
|
|
{
|
|
className = "deadArmor";
|
|
catagory = "Player Armors";
|
|
shapeFile = "light_male_dead.dts";
|
|
isInvincible = true;
|
|
};
|
|
|
|
function deadArmor::onAdd(%data, %obj)
|
|
{
|
|
Parent::onAdd(%data, %obj);
|
|
}
|
|
|
|
//*****************************************************************************
|
|
//* Flagstands - Data Blocks
|
|
//*****************************************************************************
|
|
datablock StaticShapeData(InteriorFlagStand)
|
|
{
|
|
className = "FlagIntStand";
|
|
catagory = "Objectives";
|
|
shapefile = "int_flagstand.dts";
|
|
isInvincible = true;
|
|
needsNoPower = true;
|
|
};
|
|
|
|
datablock StaticShapeData(ExteriorFlagStand)
|
|
{
|
|
className = "FlagIntStand";
|
|
catagory = "Objectives";
|
|
shapefile = "ext_flagstand.dts";
|
|
isInvincible = true;
|
|
needsNoPower = true;
|
|
};
|
|
|
|
///////////////////////////////////////////
|
|
//flagIntStand::onAdd(%this, %obj)
|
|
//%this: objects datablock
|
|
//%obj: the actual object being added
|
|
///////////////////////////////////////////
|
|
|
|
function ExteriorFlagStand::onAdd(%this, %obj)
|
|
{
|
|
Parent::onAdd(%this, %obj);
|
|
%obj.playThread($ActivateThread, "activate");
|
|
}
|
|
|
|
function ExteriorFlagStand::onFlagTaken(%this, %obj)
|
|
{
|
|
%obj.setThreadDir($ActivateThread, 0);
|
|
}
|
|
|
|
function ExteriorFlagStand::onFlagReturn(%this, %obj)
|
|
{
|
|
%obj.setThreadDir($ActivateThread, 1);
|
|
}
|
|
|
|
function ExteriorFlagStand::onCollision(%this, %obj, %colObj)
|
|
{
|
|
game.flagStandCollision(%this, %obj, %colObj);
|
|
}
|
|
|
|
function InteriorFlagStand::onCollision(%this, %obj, %colObj)
|
|
{
|
|
game.flagStandCollision(%this, %obj, %colObj);
|
|
}
|
|
|
|
///////////////////////////////////////////////
|
|
//end flag stand functions
|
|
///////////////////////////////////////////////
|
|
|
|
datablock StaticShapeData(FlipFlop)
|
|
{
|
|
catagory = "Objectives";
|
|
shapefile = "switch.dts";
|
|
|
|
isInvincible = true;
|
|
cmdCategory = "Objectives";
|
|
cmdIcon = "CMDSwitchIcon";
|
|
cmdMiniIconName = "commander/MiniIcons/com_switch_grey";
|
|
targetTypeTag = 'Switch';
|
|
alwaysAmbient = true;
|
|
needsNoPower = true;
|
|
emap = true;
|
|
};
|
|
|
|
function FlipFlop::onCollision(%data,%obj,%col)
|
|
{
|
|
if (%col.getDataBlock().className $= Armor && %col.getState() !$= "Dead")
|
|
%data.playerTouch(%obj, %col);
|
|
}
|
|
|
|
function FlipFlop::playerTouch(%data,%obj,%col)
|
|
{
|
|
messageAll('MsgPlayerTouchSwitch', 'Player %1 touched switch %2', %col, %obj);
|
|
}
|
|
|
|
//******************************************************************************
|
|
//* Organics - *
|
|
//******************************************************************************
|
|
|
|
//function to add random Organics to mission pre-creation
|
|
//(could be used to add other things...its cool with bioderm armors ;) )
|
|
|
|
function randomOrg(%organicName, %num, %radius)
|
|
{
|
|
%SPACING = 1.0; //meters between center of organic and another object
|
|
|
|
//return help info
|
|
if(%organicName $="" || !%num || !%radius) {
|
|
echo("randomOrg(<shape name>, <quantity>, <radius of grove desired>);");
|
|
return;
|
|
}
|
|
|
|
%organicIndex = -1;
|
|
// --------------------------------------------------------
|
|
// z0dd - ZOD, 5/8/02. Typo fix.
|
|
//for (%i = 0; %i < $NumAStaticTSObjects; %i++) {
|
|
for (%i = 0; %i < $NumStaticTSObjects; %i++) {
|
|
if (getWord($StaticTSObjects[%i], 1) $= %organicName) {
|
|
%organicIndex = %i;
|
|
break;
|
|
}
|
|
}
|
|
if (%organicIndex == -1) {
|
|
error("There is no static shape named" SPC %organicName);
|
|
return;
|
|
}
|
|
%shapeFileName = getWord($StaticTSObjects[%organicIndex], 2);
|
|
|
|
%maxSlope = getWord($StaticTSObjects[%organicIndex], 3);
|
|
if (%maxSlope $= "")
|
|
%maxSlope = 40;
|
|
|
|
%zOffset = getWord($StaticTSObjects[%organicIndex], 4);
|
|
if (%zOffset $= "")
|
|
%zOffset = 0;
|
|
|
|
%slopeWithTerrain = getWord($StaticTSObjects[%organicIndex], 5);
|
|
if (%slopeWithTerrain $= "")
|
|
%slopeWithTerrain = false;
|
|
|
|
%minScale = getWord($StaticTSObjects[%organicIndex], 6);
|
|
%maxScale = getWord($StaticTSObjects[%organicIndex], 7);
|
|
|
|
//set up folders in mis file
|
|
$RandomOrganicsAdded++; //to keep track of groups
|
|
if(!isObject(RandomOrganics)) {
|
|
%randomOrgGroup = new simGroup(RandomOrganics);
|
|
MissionGroup.add(%randomOrgGroup);
|
|
}
|
|
%groupName = "Addition"@$RandomOrganicsAdded@%organicName;
|
|
%group = new simGroup(%groupName);
|
|
RandomOrganics.add(%group);
|
|
|
|
|
|
%ctr = LocalClientConnection.camera.getPosition();
|
|
%areaX = getWord(%ctr, 0) - %radius;
|
|
%areaY = getWord(%ctr, 1) - %radius;
|
|
|
|
%orgCount = %num;
|
|
while((%orgCount > 0) && (%retries < (15000 / %maxSlope))) //theoretically, a thorough number of retries
|
|
{
|
|
//find a tile
|
|
%x = (getRandom(mFloor(%areaX / 8), mFloor((%areaX + (%radius * 2)) / 8)) * 8) + 4; //tile center
|
|
%y = (getRandom(mFloor(%areaY / 8), mFloor((%areaY + (%radius * 2)) / 8)) * 8) + 4;
|
|
|
|
%start = %x @ " " @ %y @ " 2000";
|
|
%end = %x @ " " @ %y @ " -1";
|
|
%ground = containerRayCast(%start, %end, $TypeMasks::TerrainObjectType, 0);
|
|
%z = getWord(%ground, 3);
|
|
%z += %zOffset;
|
|
%position = %x @ " " @ %y @ " " @ %z;
|
|
|
|
|
|
// get normal from both sides of the square
|
|
%start = %x + 2 @ " " @ %y @ " 2000";
|
|
%end = %x + 2 @ " " @ %y @ " -1";
|
|
%hit1 = containerRayCast(%start, %end, $TypeMasks::TerrainObjectType, 0);
|
|
|
|
%start = %x - 2 @ " " @ %y @ " 2000";
|
|
%end = %x - 2 @ " " @ %y @ " -1";
|
|
%hit2 = containerRayCast(%start, %end, $TypeMasks::TerrainObjectType, 0);
|
|
|
|
%norm1 = getWord(%hit1, 4) @ " " @ getWord(%hit1, 5) @ " " @ getWord(%hit1, 6);
|
|
%norm2 = getWord(%hit2, 4) @ " " @ getWord(%hit2, 5) @ " " @ getWord(%hit2, 6);
|
|
|
|
//if either side of tile has greater slope than allowed, move on.
|
|
%angNorm1 = getTerrainAngle(%norm1);
|
|
%angNorm2 = getTerrainAngle(%norm2);
|
|
if ((getTerrainAngle(%norm1) > %maxSlope) || (getTerrainAngle(%norm2) > %maxslope))
|
|
{
|
|
%retries++;
|
|
continue;
|
|
}
|
|
|
|
%terrainNormal = VectorAdd(%norm1, %norm2);
|
|
%terrainNormal = VectorNormalize(%terrainNormal);
|
|
|
|
//search surroundings for obstacles. If obstructed, move on.
|
|
InitContainerRadiusSearch(%position, %spacing, $TypeMasks::VehicleObjectType |
|
|
$TypeMasks::MoveableObjectType |
|
|
$TypeMasks::StaticShapeObjectType |
|
|
// -----------------------------
|
|
// z0dd - ZOD, 5/8/02. Typo fix.
|
|
//$TypeMasks::TSStaticShapeObjectType |
|
|
$TypeMasks::StaticTSObjectType |
|
|
$TypeMasks::ForceFieldObjectType |
|
|
$TypeMasks::TurretObjectType |
|
|
$TypeMasks::InteriorObjectType |
|
|
$TypeMasks::ItemObjectType);
|
|
%this = containerSearchNext();
|
|
if(%this)
|
|
{
|
|
%retries++;
|
|
continue;
|
|
}
|
|
|
|
|
|
//rotate it
|
|
if(%slopeWithTerrain)
|
|
{
|
|
%rotAxis = vectorCross(%terrainNormal, "0 0 1");
|
|
%rotAxis = vectorNormalize(%rotAxis);
|
|
%rotation = %rotAxis @ " " @ getTerrainAngle(%terrainNormal);
|
|
}
|
|
else %rotation = "1 0 0 0";
|
|
%randomAngle = getRandom(360);
|
|
%zrot = MatrixCreate("0 0 0", "0 0 1 " @ %randomAngle);
|
|
%orient = MatrixCreate(%position, %rotation);
|
|
%finalXForm = validateVal(MatrixMultiply(%orient, %zrot));
|
|
|
|
|
|
//scale it
|
|
%scaleMin = 8; //default min
|
|
%scaleMax = 14; //default max
|
|
if(%minScale)
|
|
%scaleMin = %minScale * 10;
|
|
if(%maxScale)
|
|
%scaleMax = %maxScale * 10;
|
|
%scaleInt = getRandom(%scaleMin, %scaleMax);
|
|
%scale = %scaleInt/10;
|
|
%evenScale = %scale SPC %scale SPC %scale;
|
|
|
|
//create it
|
|
%position = %x SPC %y SPC (%z += %zoffset);
|
|
%newOrganic = new TSStatic() {
|
|
position = %position;
|
|
rotation = %rotation;
|
|
scale = %evenScale;
|
|
shapeName = %shapeFileName;
|
|
};
|
|
%group.add(%newOrganic);
|
|
%newOrganic.setTransform(%finalXForm);
|
|
|
|
%orgCount--; //dec number of shapes left to place
|
|
%retries = 0; //reset retry counter
|
|
}
|
|
if (%orgCount > 0)
|
|
{
|
|
error("Unable to place all shapes, area saturated.");
|
|
error("Looking for clear area " @ (%spacing * 2) @ " meters in diameter, with a max slope of " @ %maxSlope);
|
|
}
|
|
echo("Placed " @ %num - %orgCount @ " of " @ %num);
|
|
}
|
|
|
|
function getTerrainAngle(%point)
|
|
{
|
|
%up = "0 0 1";
|
|
%angleRad = mACos(vectorDot(%point, %up));
|
|
%angleDeg = mRadToDeg(%angleRad);
|
|
//echo("angle is "@%angleDeg);
|
|
return %angleDeg;
|
|
}
|
|
function randomGrove(%organicName, %num, %radius)
|
|
{
|
|
%minHeight = 0;
|
|
%maxHeight = 1000;
|
|
%SPACING = 1.5; //meters between center of organic and another object
|
|
|
|
//return help info
|
|
if(%organicName $="" || !%num || !%radius) {
|
|
echo("randomOrg(<shape name>, <quantity>[, radius of grove desired]);");
|
|
return;
|
|
}
|
|
|
|
%organicIndex = -1;
|
|
for (%i = 0; %i < $NumStaticTSObjects; %i++) {
|
|
if (getWord($StaticTSObjects[%i], 1) $= %organicName) {
|
|
%organicIndex = %i;
|
|
break;
|
|
}
|
|
}
|
|
if (%organicIndex == -1) {
|
|
error("There is no static shape named" SPC %organicName);
|
|
return;
|
|
}
|
|
%shapeFileName = getWord($StaticTSObjects[%organicIndex], 2);
|
|
|
|
%maxSlope = getWord($StaticTSObjects[%organicIndex], 3);
|
|
if (%maxSlope $= "")
|
|
%maxSlope = 40;
|
|
|
|
%zOffset = getWord($StaticTSObjects[%organicIndex], 4);
|
|
if (%zOffset $= "")
|
|
%zOffset = 0;
|
|
|
|
%slopeWithTerrain = getWord($StaticTSObjects[%organicIndex], 5);
|
|
if (%slopeWithTerrain $= "")
|
|
%slopeWithTerrain = false;
|
|
|
|
%minScale = getWord($StaticTSObjects[%organicIndex], 6);
|
|
%maxScale = getWord($StaticTSObjects[%organicIndex], 7);
|
|
|
|
//set up folders in mis file
|
|
$RandomOrganicsAdded++; //to keep track of groups
|
|
if(!isObject(RandomOrganics)) {
|
|
%randomOrgGroup = new simGroup(RandomOrganics);
|
|
MissionGroup.add(%randomOrgGroup);
|
|
}
|
|
%groupName = "Addition"@$RandomOrganicsAdded@%organicName;
|
|
%group = new simGroup(%groupName);
|
|
RandomOrganics.add(%group);
|
|
|
|
|
|
%ctr = LocalClientConnection.camera.getPosition();
|
|
%areaX = getWord(%ctr, 0) - %radius;
|
|
%areaY = getWord(%ctr, 1) - %radius;
|
|
|
|
%orgCount = %num;
|
|
while((%orgCount > 0) && (%retries < (15000 / %maxSlope))) //theoretically, a thorough number of retries
|
|
{
|
|
//find a tile
|
|
%x = (getRandom(mFloor(%areaX / 8), mFloor((%areaX + (%radius * 2)) / 8)) * 8) + 4; //tile center
|
|
%y = (getRandom(mFloor(%areaY / 8), mFloor((%areaY + (%radius * 2)) / 8)) * 8) + 4;
|
|
|
|
%start = %x @ " " @ %y @ " 2000";
|
|
%end = %x @ " " @ %y @ " -1";
|
|
%ground = containerRayCast(%start, %end, $TypeMasks::TerrainObjectType, 0);
|
|
%z = getWord(%ground, 3);
|
|
|
|
|
|
// elevation test
|
|
if ((%z < %minHeight) || (%z > %maxHeight))
|
|
{
|
|
echo("Broke height range rules. Readjust allowable elevations.");
|
|
%retries++;
|
|
echo("Z is " @ %z);
|
|
continue;
|
|
}
|
|
%z += %zOffset;
|
|
%position = %x @ " " @ %y @ " " @ %z;
|
|
|
|
|
|
// get normal from both sides of the square
|
|
%start = %x + 2 @ " " @ %y @ " 2000";
|
|
%end = %x + 2 @ " " @ %y @ " -1";
|
|
%hit1 = containerRayCast(%start, %end, $TypeMasks::TerrainObjectType, 0);
|
|
|
|
%start = %x - 2 @ " " @ %y @ " 2000";
|
|
%end = %x - 2 @ " " @ %y @ " -1";
|
|
%hit2 = containerRayCast(%start, %end, $TypeMasks::TerrainObjectType, 0);
|
|
|
|
%norm1 = getWord(%hit1, 4) @ " " @ getWord(%hit1, 5) @ " " @ getWord(%hit1, 6);
|
|
%norm2 = getWord(%hit2, 4) @ " " @ getWord(%hit2, 5) @ " " @ getWord(%hit2, 6);
|
|
|
|
//if either side of tile has greater slope than allowed, move on.
|
|
%angNorm1 = getTerrainAngle(%norm1);
|
|
%angNorm2 = getTerrainAngle(%norm2);
|
|
if ((getTerrainAngle(%norm1) > %maxSlope) || (getTerrainAngle(%norm2) > %maxslope))
|
|
{
|
|
%retries++;
|
|
continue;
|
|
}
|
|
|
|
%terrainNormal = VectorAdd(%norm1, %norm2);
|
|
%terrainNormal = VectorNormalize(%terrainNormal);
|
|
|
|
//search surroundings for obstacles. If obstructed, move on.
|
|
InitContainerRadiusSearch(%position, %spacing, $TypeMasks::VehicleObjectType |
|
|
$TypeMasks::MoveableObjectType |
|
|
$TypeMasks::StaticShapeObjectType |
|
|
// -----------------------------
|
|
// z0dd - ZOD, 5/8/02. Typo fix.
|
|
//$TypeMasks::TSStaticShapeObjectType |
|
|
$TypeMasks::StaticTSObjectType |
|
|
$TypeMasks::ForceFieldObjectType |
|
|
$TypeMasks::TurretObjectType |
|
|
$TypeMasks::InteriorObjectType |
|
|
$TypeMasks::ItemObjectType);
|
|
%this = containerSearchNext();
|
|
if(%this)
|
|
{
|
|
%retries++;
|
|
continue;
|
|
}
|
|
|
|
|
|
//rotate it
|
|
if(%slopeWithTerrain)
|
|
{
|
|
%rotAxis = vectorCross(%terrainNormal, "0 0 1");
|
|
%rotAxis = vectorNormalize(%rotAxis);
|
|
%rotation = %rotAxis @ " " @ getTerrainAngle(%terrainNormal);
|
|
}
|
|
else %rotation = "1 0 0 0";
|
|
%randomAngle = getRandom(360);
|
|
%zrot = MatrixCreate("0 0 0", "0 0 1 " @ %randomAngle);
|
|
%orient = MatrixCreate(%position, %rotation);
|
|
%finalXForm = validateVal(MatrixMultiply(%orient, %zrot));
|
|
|
|
|
|
//scale it
|
|
%scaleMin = 8; //default min
|
|
%scaleMax = 14; //default max
|
|
if(%minScale)
|
|
%scaleMin = %minScale * 10;
|
|
if(%maxScale)
|
|
%scaleMax = %maxScale * 10;
|
|
%scaleInt = getRandom(%scaleMin, %scaleMax);
|
|
%scale = %scaleInt/10;
|
|
%evenScale = %scale SPC %scale SPC %scale;
|
|
|
|
//create it
|
|
|
|
%position = %x SPC %y SPC (%z += %zoffset);
|
|
%newOrganic = new TSStatic() {
|
|
position = %position;
|
|
rotation = %rotation;
|
|
scale = %evenScale;
|
|
shapeName = %shapeFileName;
|
|
};
|
|
%group.add(%newOrganic);
|
|
%newOrganic.setTransform(%finalXForm);
|
|
|
|
%orgCount--; //dec number of shapes left to place
|
|
%retries = 0; //reset retry counter
|
|
}
|
|
if (%orgCount > 0)
|
|
{
|
|
error("Unable to place all shapes, area saturated.");
|
|
error("Looking for clear area " @ (%spacing * 2) @ " meters in diameter, with a max slope of " @ %maxSlope);
|
|
}
|
|
echo("Placed " @ %num - %orgCount @ " of " @ %num);
|
|
}
|
|
|
|
|
|
function randomRock(%rock, %quantity, %radius, %maxElev)
|
|
{
|
|
if (!%radius || !%quantity || !%rock)
|
|
{
|
|
echo("randomRock(<name>, <quantity>, <radius>, [maximum elevation]");
|
|
return;
|
|
}
|
|
|
|
if (!%maxElev)
|
|
%maxElev = 2000;
|
|
|
|
|
|
%rotation[0] = "0 0 1 0";
|
|
%rotation[1] = "0.999378 -0.0145686 -0.0321219 194.406";
|
|
%rotation[2] = "0.496802 0.867682 0.0177913 176.44";
|
|
%rotation[3] = "0.991261 0.0933696 0.0931923 181.867";
|
|
%rotation[4] = "0.246801 0.360329 -0.899584 92.3648";
|
|
%rotation[5] = "1 0 0 82.59";
|
|
%rotation[6] = "0.0546955 -0.629383 0.55201 116.103";
|
|
|
|
%spacing = 4.0; //check 4 meters around object for collisions before placing
|
|
%ctr = localClientConnection.camera.getPosition();
|
|
%areaX = getWord(%ctr, 0) - %radius;
|
|
%areaY = getWord(%ctr, 1) - %radius;
|
|
|
|
$RandomOrganicsAdded++;
|
|
if(!isObject(RandomRocks)) {
|
|
%randomOrgGroup = new simGroup(RandomRocks);
|
|
MissionGroup.add(%randomOrgGroup);
|
|
}
|
|
%groupName = "Addition"@$RandomOrganicsAdded@%rock;
|
|
%group = new simGroup(%groupName);
|
|
RandomRocks.add(%group);
|
|
|
|
%orgCount = %quantity;
|
|
while((%orgCount > 0) && (%retries < (15000 / %maxSlope))) //theoretically, a thorough number of retries
|
|
{
|
|
//find a tile
|
|
%x = %areaX + getRandom(%radius * 2);
|
|
%y = %areaY + getRandom(%radius * 2);
|
|
|
|
%start = %x @ " " @ %y @ " 2000";
|
|
%end = %x @ " " @ %y @ " -1";
|
|
%ground = containerRayCast(%start, %end, $TypeMasks::TerrainObjectType, 0);
|
|
%position = getWord(%ground, 1) @ " " @ getWord(%ground, 2) @ " " @ getWord(%ground, 3);
|
|
echo("position =*" @ %position @ "*");
|
|
%z = getWord(%position, 2);
|
|
|
|
|
|
// elevation test
|
|
if (%z > %maxElev) //65 meters and above only
|
|
{
|
|
%retries++;
|
|
echo("Z is " @ %z);
|
|
continue;
|
|
}
|
|
|
|
|
|
//search surroundings for obstacles. If obstructed, move on.
|
|
InitContainerRadiusSearch(%position, %spacing, $TypeMasks::VehicleObjectType |
|
|
$TypeMasks::MoveableObjectType |
|
|
$TypeMasks::StaticShapeObjectType |
|
|
// -----------------------------
|
|
// z0dd - ZOD, 5/8/02. Typo fix.
|
|
//$TypeMasks::TSStaticShapeObjectType |
|
|
$TypeMasks::StaticTSObjectType |
|
|
$TypeMasks::ForceFieldObjectType |
|
|
$TypeMasks::TurretObjectType |
|
|
$TypeMasks::InteriorObjectType |
|
|
$TypeMasks::ItemObjectType);
|
|
%this = containerSearchNext();
|
|
if(%this)
|
|
{
|
|
%retries++;
|
|
continue;
|
|
}
|
|
%primaryRot = %rotation[getRandom(7)];
|
|
|
|
%randomAngle = mDegToRad(getRandom(360));
|
|
%zrot = MatrixCreate("0 0 0", "0 0 1 " @ %randomAngle);
|
|
%orient = MatrixCreate(%position, %primaryRot);
|
|
|
|
|
|
%scale = getRandom(3);
|
|
%evenScale = %scale @ " " @ %scale @ " " @ %scale;
|
|
%newRock = new InteriorInstance() {
|
|
scale = %evenScale;
|
|
interiorFile = %rock @ ".dif";
|
|
showTerrainInside = "0";
|
|
};
|
|
%group.add(%newRock);
|
|
%transfrm = validateVal(MatrixMultiply(%orient, %zrot));
|
|
echo("Transform = *" @ %transfrm @ "*");
|
|
%newRock.setTransform(%transfrm);
|
|
|
|
%orgCount--; //dec number of shapes left to place
|
|
%retries = 0; //reset retry counter
|
|
}
|
|
if (%orgCount > 0)
|
|
{
|
|
error("Unable to place all shapes, area saturated.");
|
|
error("Looking for clear area " @ (%spacing * 2) @ " meters in diameter, with a max slope of " @ %maxSlope);
|
|
}
|
|
echo("Placed " @ %num - %orgCount @ " of " @ %num);
|
|
}
|
|
|
|
|
|
//--------------------------------------------------------------------------
|
|
//-------------------------------------- Organics
|
|
//--------------------------------------------------------------------------
|
|
|
|
|
|
//******************************************************************************
|
|
//* Pulse Sensor - Data Blocks *
|
|
//******************************************************************************
|
|
|
|
datablock DebrisData( StaticShapeDebris )
|
|
{
|
|
explodeOnMaxBounce = false;
|
|
|
|
elasticity = 0.20;
|
|
friction = 0.5;
|
|
|
|
lifetime = 17.0;
|
|
lifetimeVariance = 0.0;
|
|
|
|
minSpinSpeed = 60;
|
|
maxSpinSpeed = 600;
|
|
|
|
numBounces = 10;
|
|
bounceVariance = 0;
|
|
|
|
staticOnMaxBounce = true;
|
|
|
|
useRadiusMass = true;
|
|
baseRadius = 0.4;
|
|
|
|
velocity = 9.0;
|
|
velocityVariance = 4.5;
|
|
};
|
|
|
|
datablock DebrisData( SmallShapeDebris )
|
|
{
|
|
explodeOnMaxBounce = false;
|
|
|
|
elasticity = 0.20;
|
|
friction = 0.5;
|
|
|
|
lifetime = 17.0;
|
|
lifetimeVariance = 0.0;
|
|
|
|
minSpinSpeed = 60;
|
|
maxSpinSpeed = 600;
|
|
|
|
numBounces = 10;
|
|
bounceVariance = 0;
|
|
|
|
staticOnMaxBounce = true;
|
|
|
|
useRadiusMass = true;
|
|
baseRadius = 0.2;
|
|
|
|
velocity = 5.0;
|
|
velocityVariance = 2.5;
|
|
};
|
|
|
|
datablock AudioProfile(SensorHumSound)
|
|
{
|
|
filename = "fx/powered/sensor_hum.wav";
|
|
description = CloseLooping3d;
|
|
preload = true;
|
|
};
|
|
|
|
datablock SensorData(SensorLgPulseObj)
|
|
{
|
|
detects = true;
|
|
detectsUsingLOS = true;
|
|
detectsPassiveJammed = false;
|
|
detectsActiveJammed = false;
|
|
detectsCloaked = false;
|
|
detectionPings = true;
|
|
detectRadius = 300;
|
|
};
|
|
|
|
datablock StaticShapeData(SensorLargePulse) : StaticShapeDamageProfile
|
|
{
|
|
className = Sensor;
|
|
catagory = "Sensors";
|
|
shapeFile = "sensor_pulse_large.dts";
|
|
maxDamage = 1.5;
|
|
destroyedLevel = 1.5;
|
|
disabledLevel = 0.85;
|
|
explosion = ShapeExplosion;
|
|
expDmgRadius = 10.0;
|
|
expDamage = 0.5;
|
|
expImpulse = 2000.0;
|
|
repairRate = 0.5;
|
|
|
|
dynamicType = $TypeMasks::SensorObjectType;
|
|
isShielded = true;
|
|
energyPerDamagePoint = 33;
|
|
maxEnergy = 110;
|
|
rechargeRate = 0.31;
|
|
ambientThreadPowered = true;
|
|
humSound = SensorHumSound;
|
|
|
|
cmdCategory = "Support";
|
|
cmdIcon = CMDSensorIcon;
|
|
cmdMiniIconName = "commander/MiniIcons/com_sensor_grey";
|
|
targetNameTag = 'Large';
|
|
targetTypeTag = 'Sensor';
|
|
sensorData = SensorLgPulseObj;
|
|
sensorRadius = SensorLgPulseObj.detectRadius;
|
|
sensorColor = "255 194 9";
|
|
|
|
debrisShapeName = "debris_generic.dts";
|
|
debris = StaticShapeDebris;
|
|
needsPower = true;
|
|
};
|
|
|
|
datablock SensorData(SensorMedPulseObj)
|
|
{
|
|
detects = true;
|
|
detectsUsingLOS = true;
|
|
detectsPassiveJammed = false;
|
|
detectsActiveJammed = false;
|
|
detectsCloaked = false;
|
|
detectionPings = true;
|
|
detectRadius = 200;
|
|
};
|
|
|
|
datablock StaticShapeData(SensorMediumPulse) : StaticShapeDamageProfile
|
|
{
|
|
className = Sensor;
|
|
catagory = "Sensors";
|
|
shapeFile = "sensor_pulse_medium.dts";
|
|
maxDamage = 1.2;
|
|
destroyedLevel = 1.2;
|
|
disabledLevel = 0.68;
|
|
explosion = ShapeExplosion;
|
|
expDmgRadius = 7.0;
|
|
expDamage = 0.4;
|
|
expImpulse = 1500;
|
|
repairRate = 0.5;
|
|
|
|
dynamicType = $TypeMasks::SensorObjectType;
|
|
isShielded = true;
|
|
energyPerDamagePoint = 33;
|
|
maxEnergy = 90;
|
|
rechargeRate = 0.31;
|
|
ambientThreadPowered = true;
|
|
humSound = SensorHumSound;
|
|
|
|
cmdCategory = "Support";
|
|
cmdIcon = CMDSensorIcon;
|
|
cmdMiniIconName = "commander/MiniIcons/com_sensor_grey";
|
|
targetNameTag = 'Medium';
|
|
targetTypeTag = 'Sensor';
|
|
sensorData = SensorMedPulseObj;
|
|
sensorRadius = SensorMedPulseObj.detectRadius;
|
|
sensorColor = "255 194 9";
|
|
|
|
debrisShapeName = "debris_generic.dts";
|
|
debris = StaticShapeDebris;
|
|
needsPower = true;
|
|
};
|
|
|
|
function Sensor::onGainPowerEnabled(%data, %obj)
|
|
{
|
|
setTargetSensorData(%obj.target, %data.sensorData);
|
|
Parent::onGainPowerEnabled(%data, %obj);
|
|
}
|
|
|
|
function Sensor::onLosePowerDisabled(%data, %obj)
|
|
{
|
|
setTargetSensorData(%obj.target, 0);
|
|
Parent::onLosePowerDisabled(%data, %obj);
|
|
}
|
|
|
|
//******************************************************************************
|
|
//* Generator - Data Blocks *
|
|
//******************************************************************************
|
|
|
|
datablock AudioProfile(GeneratorHumSound)
|
|
{
|
|
filename = "fx/powered/generator_hum.wav";
|
|
description = CloseLooping3d;
|
|
preload = true;
|
|
};
|
|
|
|
|
|
datablock StaticShapeData(GeneratorLarge) : StaticShapeDamageProfile
|
|
{
|
|
className = Generator;
|
|
catagory = "Generators";
|
|
shapeFile = "station_generator_large.dts";
|
|
explosion = ShapeExplosion;
|
|
maxDamage = 1.50;
|
|
destroyedLevel = 1.50;
|
|
disabledLevel = 0.85;
|
|
expDmgRadius = 10.0;
|
|
expDamage = 0.5;
|
|
expImpulse = 1500.0;
|
|
noIndividualDamage = true; //flag to make these invulnerable for certain mission types
|
|
|
|
dynamicType = $TypeMasks::GeneratorObjectType;
|
|
isShielded = true;
|
|
energyPerDamagePoint = 30;
|
|
maxEnergy = 50;
|
|
rechargeRate = 0.05;
|
|
humSound = GeneratorHumSound;
|
|
|
|
cmdCategory = "Support";
|
|
cmdIcon = "CMDGeneratorIcon";
|
|
cmdMiniIconName = "commander/MiniIcons/com_generator";
|
|
targetTypeTag = 'Generator';
|
|
|
|
debrisShapeName = "debris_generic.dts";
|
|
debris = StaticShapeDebris;
|
|
powerRadius = 100;
|
|
};
|
|
|
|
datablock StaticShapeData(SolarPanel) : StaticShapeDamageProfile
|
|
{
|
|
className = Generator;
|
|
catagory = "Generators";
|
|
shapeFile = "solarpanel.dts";
|
|
explosion = ShapeExplosion;
|
|
maxDamage = 1.00;
|
|
destroyedLevel = 1.00;
|
|
disabledLevel = 0.55;
|
|
expDmgRadius = 5.0;
|
|
expDamage = 0.3;
|
|
expImpulse = 1000.0;
|
|
noIndividualDamage = true; //flag to make these invulnerable for certain mission types
|
|
emap = true;
|
|
|
|
isShielded = true;
|
|
energyPerDamagePoint = 30;
|
|
rechargeRate = 0.05;
|
|
|
|
dynamicType = $TypeMasks::GeneratorObjectType;
|
|
maxEnergy = 30;
|
|
humSound = GeneratorHumSound;
|
|
|
|
cmdCategory = "Support";
|
|
cmdIcon = CMDSolarGeneratorIcon;
|
|
cmdMiniIconName = "commander/MiniIcons/com_solargen_grey";
|
|
targetTypeTag = 'Solar Panel';
|
|
|
|
debrisShapeName = "debris_generic.dts";
|
|
debris = StaticShapeDebris;
|
|
powerRadius = 50;
|
|
};
|
|
|
|
function Generator::onDisabled(%data, %obj, %prevState) {
|
|
%obj.decPowerCount();
|
|
Parent::onDisabled(%data, %obj, %prevState);
|
|
}
|
|
|
|
function Generator::onEnabled(%data, %obj, %prevState) {
|
|
%obj.incPowerCount();
|
|
Parent::onEnabled(%data, %obj, %prevState);
|
|
}
|
|
|
|
//******************************************************************************
|
|
//Nexus Effect (Hunters)
|
|
//******************************************************************************
|
|
|
|
datablock StaticShapeData(Nexus_Effect)
|
|
{
|
|
catagory = "Objectives";
|
|
shapefile = "nexus_effect.dts";
|
|
mass = 10;
|
|
elasticity = 0.2;
|
|
friction = 0.6;
|
|
pickupRadius = 2;
|
|
};
|
|
|
|
|
|
datablock StaticShapeData(NexusBase)
|
|
{
|
|
catagory = "Objectives";
|
|
shapefile = "Nexusbase.dts";
|
|
mass = 10;
|
|
elasticity = 0.2;
|
|
friction = 0.6;
|
|
pickupRadius = 2;
|
|
};
|
|
|
|
|
|
datablock StaticShapeData(NexusCap)
|
|
{
|
|
catagory = "Objectives";
|
|
shapefile = "Nexuscap.dts";
|
|
mass = 10;
|
|
elasticity = 0.2;
|
|
friction = 0.6;
|
|
pickupRadius = 2;
|
|
};
|
|
|
|
//******************************************************************************
|
|
//* Static Shape - Functions *
|
|
//******************************************************************************
|
|
|
|
function StaticShapeData::create(%block)
|
|
{
|
|
%obj = new StaticShape()
|
|
{
|
|
dataBlock = %block;
|
|
};
|
|
return(%obj);
|
|
}
|
|
|
|
function ShapeBase::damage(%this, %sourceObject, %position, %amount, %damageType)
|
|
{
|
|
%this.getDataBlock().damageObject(%this, %sourceObject, %position, %amount, %damageType);
|
|
}
|
|
|
|
function ShapeBaseData::damageObject(%data, %targetObject, %position, %sourceObject, %amount, %damageType)
|
|
{
|
|
|
|
}
|
|
|
|
function ShapeBaseData::onDestroyed(%data, %obj, %prevState)
|
|
{
|
|
|
|
}
|
|
|
|
function ShapeBaseData::checkShields(%data, %targetObject, %position, %amount, %damageType)
|
|
{
|
|
%energy = %targetObject.getEnergyLevel();
|
|
%strength = %energy / %data.energyPerDamagePoint;
|
|
%shieldScale = %data.shieldDamageScale[%damageType];
|
|
if(%shieldScale $= "")
|
|
%shieldScale = 1;
|
|
|
|
if (%amount * %shieldScale <= %strength) {
|
|
// Shield absorbs all
|
|
%lost = %amount * %shieldScale * %data.energyPerDamagePoint;
|
|
%energy -= %lost;
|
|
%targetObject.setEnergyLevel(%energy);
|
|
|
|
%normal = "0.0 0.0 1.0";
|
|
%targetObject.playShieldEffect( %normal );
|
|
|
|
return 0;
|
|
}
|
|
// Shield exhausted
|
|
%targetObject.setEnergyLevel(0);
|
|
return %amount - %strength / %shieldScale;
|
|
}
|
|
|
|
function StaticShapeData::damageObject(%data, %targetObject, %sourceObject, %position, %amount, %damageType) {
|
|
if (%targetObject.getType() & $TypeMasks::ForceFieldObjectType)
|
|
%isFF = true;
|
|
if (%targetObject.getType() & $TypeMasks::TurretObjectType)
|
|
%isTurret = true;
|
|
if ($Host::InvincibleDeployables == 1) {
|
|
if (%targetObject.getGroup() == Deployables.getID()
|
|
&& !%data.powerRadius
|
|
&& %data != StationInventory.getID()
|
|
&& !%isFF
|
|
&& !%isTurret)
|
|
return;
|
|
}
|
|
if (isObject(%sourceObject))
|
|
if (%sourceObject.getType() & $TypeMasks::VehicleObjectType)
|
|
if (%sourceObject.getDataBlock() == EscapePodVehicle.getID()) {
|
|
// Reverse damage ;)
|
|
%tmp = %sourceObject;
|
|
%sourceObject = %targetObject;
|
|
%targetObject = %tmp;
|
|
}
|
|
|
|
if (%targetObject.lTarget) {
|
|
if (isObject(%targetObject.lTarget)) {
|
|
return;
|
|
}
|
|
}
|
|
else if (%targetObject.lMain) {
|
|
if (isObject(%targetObject.lMain)) {
|
|
%targetObject = %targetObject.lMain;
|
|
}
|
|
}
|
|
|
|
// if this is a non-team mission type and the object is "protected", don't damage it
|
|
if(%data.noIndividualDamage && Game.allowsProtectedStatics() && !%targetObject.deployed)
|
|
return;
|
|
|
|
// if this is a Siege mission and this object shouldn't take damage (e.g. vehicle stations)
|
|
if(%data.noDamageInSiege && Game.class $= "SiegeGame")
|
|
return;
|
|
|
|
// Don't let deployed turrets damage other deployed items of the same team
|
|
if (isObject(%sourceObject) && isObject(%targetObject)) {
|
|
if ((%targetObject.getDataBlock().deployedObject || %targetObject.deployed)
|
|
&& (%sourceObject.getType() & $TypeMasks::TurretObjectType)
|
|
&& %sourceObject.team == %targetObject.team)
|
|
return;
|
|
}
|
|
|
|
// Switch to not let deployed turrets damage any deployed item of any team
|
|
if (isObject(%sourceObject) && isObject(%targetObject) && $NoTurretDamage == 1) {
|
|
if ((%targetObject.getDataBlock().deployedObject || %targetObject.deployed)
|
|
&& (%sourceObject.getType() & $TypeMasks::TurretObjectType))
|
|
return;
|
|
}
|
|
|
|
if(%sourceObject && %targetObject.isEnabled())
|
|
{
|
|
if(%sourceObject.client)
|
|
{
|
|
%targetObject.lastDamagedBy = %sourceObject.client;
|
|
%targetObject.lastDamagedByTeam = %sourceObject.client.team;
|
|
%targetObject.damageTimeMS = GetSimTime();
|
|
}
|
|
else
|
|
{
|
|
%targetObject.lastDamagedBy = %sourceObject;
|
|
%targetObject.lastDamagedByTeam = %sourceObject.team;
|
|
%targetObject.damageTimeMS = GetSimTime();
|
|
}
|
|
}
|
|
|
|
// Scale damage type & include shield calculations...
|
|
if (%data.isShielded)
|
|
%amount = %data.checkShields(%targetObject, %position, %amount, %damageType);
|
|
|
|
%damageScale = %data.damageScale[%damageType];
|
|
if(%damageScale !$= "")
|
|
%amount *= %damageScale;
|
|
|
|
//if team damage is off, cap the amount of damage so as not to disable the object...
|
|
if (!$TeamDamage && !%targetObject.getDataBlock().deployedObject) {
|
|
// -------------------------------------
|
|
// z0dd - ZOD, 6/24/02. Console spam fix
|
|
if(isObject(%sourceObject)) {
|
|
//see if the object is being shot by a friendly
|
|
if(%sourceObject.getDataBlock().catagory $= "Vehicles")
|
|
%attackerTeam = getVehicleAttackerTeam(%sourceObject);
|
|
else
|
|
%attackerTeam = %sourceObject.team;
|
|
}
|
|
if (((%targetObject.getTarget() != -1) && isTargetFriendly(%targetObject.getTarget(), %attackerTeam)) && !%isFF) {
|
|
%curDamage = %targetObject.getDamageLevel();
|
|
%availableDamage = %targetObject.getDataBlock().disabledLevel - %curDamage - 0.05;
|
|
if (%amount > %availableDamage)
|
|
%amount = %availableDamage;
|
|
}
|
|
}
|
|
|
|
// if there's still damage to apply
|
|
if (%amount > 0) {
|
|
if (%isFF)
|
|
%targetObject.applyDamage(%amount,%sourceObject,%position,%damageType);
|
|
else
|
|
%targetObject.applyDamage(%amount);
|
|
}
|
|
}
|
|
|
|
// little special casing for the above function
|
|
function getVehicleAttackerTeam(%vehicleId)
|
|
{
|
|
%name = %vehicleId.getDataBlock().getName();
|
|
if(%name $= "BomberFlyer" || %name $= "AssaultVehicle")
|
|
%gunner = %vehicleId.getMountNodeObject(1);
|
|
else
|
|
%gunner = %vehicleId.getMountNodeObject(0);
|
|
|
|
if(%gunner)
|
|
return %gunner.team;
|
|
|
|
return %vehicleId.team;
|
|
}
|
|
|
|
function StaticShapeData::onDamage(%this,%obj) {
|
|
// Set damage state based on current damage level
|
|
%damage = %obj.getDamageLevel();
|
|
if(%damage >= %this.destroyedLevel) {
|
|
if(%obj.getDamageState() !$= "Destroyed") {
|
|
%obj.setDamageState(Destroyed);
|
|
// if object has an explosion damage radius associated with it, apply explosion damage
|
|
if(%this.expDmgRadius) {
|
|
RadiusExplosion(%obj, %obj.getWorldBoxCenter(), %this.expDmgRadius, %this.expDamage, %this.expImpulse, %obj, $DamageType::Explosion);
|
|
%obj.hasExploded = true;
|
|
}
|
|
%obj.setDamageLevel(%this.maxDamage);
|
|
}
|
|
}
|
|
else {
|
|
if(%damage >= %this.disabledLevel) {
|
|
if(%obj.getDamageState() !$= "Disabled")
|
|
%obj.setDamageState(Disabled);
|
|
}
|
|
else {
|
|
if(%obj.getDamageState() !$= "Enabled")
|
|
%obj.setDamageState(Enabled);
|
|
}
|
|
}
|
|
}
|
|
|
|
function StaticShapeData::onDestroyed(%data,%obj,%prevState) {
|
|
if(%data.expDmgRadius && !%obj.hasExploded) {
|
|
RadiusExplosion(%obj, %obj.getWorldBoxCenter(), %data.expDmgRadius, %data.expDamage, %data.expImpulse, %obj, $DamageType::Explosion);
|
|
%obj.hasExploded = true;
|
|
}
|
|
Parent::onDestroyed(%data,%obj,%prevState);
|
|
}
|
|
|
|
// --------------------------------------------------------------------
|
|
// Team logos - only the logo projector should be placed in a mission
|
|
|
|
datablock StaticShapeData(BaseLogo) //storm logo
|
|
{
|
|
className = Logo;
|
|
shapeFile = "teamlogo_storm.dts";
|
|
alwaysAmbient = true;
|
|
};
|
|
|
|
datablock StaticShapeData(BaseBLogo) //Inferno Logo
|
|
{
|
|
className = Logo;
|
|
shapeFile = "teamlogo_inf.dts";
|
|
alwaysAmbient = true;
|
|
};
|
|
|
|
datablock StaticShapeData(BiodermLogo)
|
|
{
|
|
className = Logo;
|
|
shapeFile = "teamlogo_bd.dts";
|
|
alwaysAmbient = true;
|
|
};
|
|
|
|
datablock StaticShapeData(BEagleLogo)
|
|
{
|
|
className = Logo;
|
|
shapeFile = "teamlogo_be.dts";
|
|
alwaysAmbient = true;
|
|
};
|
|
|
|
datablock StaticShapeData(DSwordLogo)
|
|
{
|
|
className = Logo;
|
|
shapeFile = "teamlogo_ds.dts";
|
|
alwaysAmbient = true;
|
|
};
|
|
|
|
datablock StaticShapeData(COTPLogo)
|
|
{
|
|
className = Logo;
|
|
shapeFile = "teamlogo_hb.dts";
|
|
alwaysAmbient = true;
|
|
};
|
|
|
|
datablock StaticShapeData(SwolfLogo)
|
|
{
|
|
className = Logo;
|
|
shapeFile = "teamlogo_sw.dts";
|
|
alwaysAmbient = true;
|
|
};
|
|
|
|
datablock StaticShapeData(LogoProjector)
|
|
{
|
|
className = Projector;
|
|
catagory = "Objectives";
|
|
shapeFile = "teamlogo_projector.dts";
|
|
alwaysAmbient = true;
|
|
isInvincible = true;
|
|
};
|
|
|
|
function Projector::onAdd(%data, %obj)
|
|
{
|
|
Parent::onAdd(%data, %obj);
|
|
%obj.holo = 0;
|
|
}
|
|
|
|
////////////////////////////////////////////
|
|
// Tapestries
|
|
///////////////////////////////////////////
|
|
datablock StaticShapeData(Banner_Honor)
|
|
{
|
|
catagory = "Eyecandy";
|
|
shapefile = "banner_honor.dts";
|
|
};
|
|
|
|
datablock StaticShapeData(Banner_Strength)
|
|
{
|
|
catagory = "Eyecandy";
|
|
shapefile = "banner_strength.dts";
|
|
};
|
|
|
|
datablock StaticShapeData(Banner_Unity)
|
|
{
|
|
catagory = "Eyecandy";
|
|
shapefile = "banner_unity.dts";
|
|
};
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
|
|
//--------------------------------------------------------------------------
|
|
// Totally static objects
|
|
// The format of these strings are:
|
|
// 0: Catagory
|
|
// 1: Name
|
|
// 2: File
|
|
// 3: MaxSlope [ only used with the randomOrg function ]
|
|
// 4: ZOffset [ only used with the randomOrg function ]
|
|
// 5: slopeWithTerrain [ only used with the randomOrg function ]
|
|
// 6: minScale [ only used with the randomOrg function ]
|
|
// 7: maxScale [ only used with the randomOrg function ]
|
|
|
|
|
|
$StaticTSObjects[0] = "Organics BiodermPlant3 xorg3.dts";
|
|
$StaticTSObjects[1] = "Organics BiodermPlant4 xorg4.dts";
|
|
$StaticTSObjects[2] = "Organics BiodermPlant5 xorg5.dts";
|
|
$StaticTSObjects[3] = "Organics BiodermPlant20 xorg20.dts";
|
|
$StaticTSObjects[4] = "Organics BiodermPlant21 xorg21.dts";
|
|
$StaticTSObjects[5] = "Organics BiodermPlant22 xorg22.dts";
|
|
|
|
$StaticTSObjects[6] = "Organics BEPlant1 borg1.dts 40 0.35 1 0.5 2";
|
|
$StaticTSObjects[7] = "Organics BEPlant5 borg5.dts 40 0.0 1 1 1.5";
|
|
$StaticTSObjects[8] = "Organics BEPlant6 borg6.dts";
|
|
$StaticTSObjects[9] = "Organics BEPlant7 borg7.dts";
|
|
|
|
$StaticTSObjects[10] = "Organics BEPlant12 borg12.dts";
|
|
$StaticTSObjects[11] = "Organics BEPlant13 borg13.dts";
|
|
$StaticTSObjects[12] = "Organics BELgTree16 borg16.dts 20 -3.0 0 0.8 1.5";
|
|
$StaticTSObjects[13] = "Organics BESmTree17 borg17.dts 20 -3.0 1 0.8 1.5";
|
|
$StaticTSObjects[14] = "Organics BELgTree18 borg18.dts 20 -3.0 0 0.8 1.5";
|
|
$StaticTSObjects[15] = "Organics BELgTree19 borg19.dts 20 -3.0 0 0.8 1.5";
|
|
$StaticTSObjects[16] = "Organics BEPlant20 borg20.dts";
|
|
|
|
$StaticTSObjects[17] = "Organics BEPlant23 borg23.dts";
|
|
$StaticTSObjects[18] = "Organics BEPlant25 borg25.dts";
|
|
|
|
$StaticTSObjects[19] = "Organics BEPlant31 borg31.dts";
|
|
$StaticTSObjects[20] = "Organics BEPlant32 borg32.dts";
|
|
$StaticTSObjects[21] = "Organics BEPlant33 borg33.dts";
|
|
$StaticTSObjects[22] = "Organics BEPlant34 borg34.dts";
|
|
|
|
$StaticTSObjects[23] = "Organics PhoenixPlant1 porg1.dts";
|
|
$StaticTSObjects[24] = "Organics PhoenixPlant2 porg2.dts";
|
|
$StaticTSObjects[25] = "Organics PhoenixPlant3 porg3.dts";
|
|
$StaticTSObjects[26] = "Organics PhoenixPlant5 porg5.dts 25 -0.2 1 0.6 1.0";
|
|
$StaticTSObjects[27] = "Organics PhoenixPlant6 porg6.dts";
|
|
$StaticTSObjects[28] = "Organics PhoenixPlant20 porg20.dts";
|
|
|
|
$StaticTSObjects[29] = "Organics PhoenixPlant22 porg22.dts 25 0.1 1 0.8 1.4";
|
|
$StaticTSObjects[30] = "Organics SWTree20 sorg20.dts";
|
|
$StaticTSObjects[31] = "Organics SWShrub21 sorg21.dts";
|
|
$StaticTSObjects[32] = "Organics SWTree22 sorg22.dts";
|
|
$StaticTSObjects[33] = "Organics SWShrub23 sorg23.dts";
|
|
$StaticTSObjects[34] = "Organics SWShrub24 sorg24.dts";
|
|
$StaticTSObjects[35] = "Stackables Crate1 stackable1l.dts";
|
|
$StaticTSObjects[36] = "Stackables Crate2 stackable1m.dts";
|
|
$StaticTSObjects[37] = "Stackables Crate3 stackable1s.dts";
|
|
$StaticTSObjects[38] = "Stackables Crate4 stackable2l.dts";
|
|
$StaticTSObjects[39] = "Stackables Crate5 stackable2m.dts";
|
|
$StaticTSObjects[40] = "Stackables Crate6 stackable2s.dts";
|
|
$StaticTSObjects[41] = "Stackables Crate7 stackable3l.dts";
|
|
$StaticTSObjects[42] = "Stackables Crate8 stackable3m.dts";
|
|
$StaticTSObjects[43] = "Stackables Crate9 stackable3s.dts";
|
|
$StaticTSObjects[44] = "Stackables Crate10 stackable4l.dts";
|
|
$StaticTSObjects[45] = "Stackables Crate11 stackable4m.dts";
|
|
$StaticTSObjects[46] = "Stackables Crate12 stackable5l.dts";
|
|
$StaticTSObjects[47] = "Debris ScoutWreckageShape vehicle_air_scout_wreck.dts";
|
|
$StaticTSObjects[48] = "Debris TankWreckageShape vehicle_land_assault_wreck.dts";
|
|
$StaticTSObjects[49] = "Organics DSPlant16 dorg16.dts 20 -3.0 0 0.8 1.5";
|
|
$StaticTSObjects[50] = "Organics DSPlant17 dorg17.dts 20 -3.0 1 0.8 1.5";
|
|
$StaticTSObjects[51] = "Organics DSPlant18 dorg18.dts 20 -3.0 0 0.8 1.5";
|
|
$StaticTSObjects[52] = "Organics DSPlant19 dorg19.dts 20 -3.0 0 0.8 1.5";
|
|
|
|
$StaticTSObjects[53] = "PlayerArmors LightMaleHumanArmorImage light_male.dts";
|
|
$StaticTSObjects[54] = "PlayerArmors MediumMaleHumanArmorImage medium_male.dts";
|
|
$StaticTSObjects[55] = "PlayerArmors HeavyMaleHumanArmorImage heavy_male.dts";
|
|
$StaticTSObjects[56] = "PlayerArmors LightFemaleHumanArmorImage light_female.dts";
|
|
$StaticTSObjects[57] = "PlayerArmors MediumFemaleHumanArmorImage medium_female.dts";
|
|
$StaticTSObjects[58] = "PlayerArmors HeavyFemaleHumanArmorImage heavy_male.dts";
|
|
$StaticTSObjects[59] = "PlayerArmors LightMaleBiodermArmorImage bioderm_light.dts";
|
|
$StaticTSObjects[60] = "PlayerArmors MediumMaleBiodermArmorImage bioderm_medium.dts";
|
|
$StaticTSObjects[61] = "PlayerArmors HeavyMaleBiodermArmorImage bioderm_heavy.dts";
|
|
|
|
$StaticTSObjects[62] = "Organics BEGrass1 Borg6.dts";
|
|
|
|
$StaticTSObjects[63] = "Plugs bePlug bmiscf.dts";
|
|
$StaticTSObjects[64] = "Plugs dsPlug dmiscf.dts";
|
|
$StaticTSObjects[65] = "Plugs xPlug xmiscf.dts";
|
|
$StaticTSObjects[66] = "Plugs hPlug pmiscf.dts";
|
|
$StaticTSObjects[67] = "Plugs swPlug smiscf.dts";
|
|
|
|
$StaticTSObjects[68] = "Statues Base statue_base.dts";
|
|
$StaticTSObjects[69] = "Statues HeavyMaleStatue statue_hmale.dts";
|
|
$StaticTSObjects[70] = "Statues LightFemaleStatue statue_lfemale.dts";
|
|
$StaticTSObjects[71] = "Statues LightMaleStatue statue_lmale.dts";
|
|
$StaticTSObjects[72] = "Statues Plaque statue_plaque.dts";
|
|
|
|
$StaticTSObjects[73] = "Debris BomberDebris1 bdb1.dts";
|
|
$StaticTSObjects[74] = "Debris BomberDebris2 bdb2.dts";
|
|
$StaticTSObjects[75] = "Debris BomberDebris3 bdb3.dts";
|
|
$StaticTSObjects[76] = "Debris BomberDebris4 bdb4.dts";
|
|
$StaticTSObjects[77] = "Debris BomberDebris5 bdb5.dts";
|
|
$StaticTSObjects[78] = "Debris HavocDebris1 hdb1.dts";
|
|
$StaticTSObjects[79] = "Debris HavocDebris2 hdb2.dts";
|
|
$StaticTSObjects[80] = "Debris HavocDebris3 hdb3.dts";
|
|
$StaticTSObjects[81] = "Debris IDebris1 idb.dts";
|
|
$StaticTSObjects[82] = "Debris MPBDebris1 mpbdb1.dts";
|
|
$StaticTSObjects[83] = "Debris MPBDebris2 mpbdb2.dts";
|
|
$StaticTSObjects[84] = "Debris MPBDebris3 mpbdb3.dts";
|
|
$StaticTSObjects[85] = "Debris MPBDebris4 mpbdb4.dts";
|
|
$StaticTSObjects[86] = "Debris ScoutDebris1 sdb1.dts";
|
|
$StaticTSObjects[87] = "Debris TankDebris1 tdb1.dts";
|
|
$StaticTSObjects[88] = "Debris TankDebris2 tdb2.dts";
|
|
$StaticTSObjects[89] = "Debris TankDebris3 tdb3.dts";
|
|
$StaticTSObjects[90] = "Debris GraveMarker1 gravemarker1.dts";
|
|
$StaticTSObjects[91] = "Test Test1 test1.dts";
|
|
$StaticTSObjects[92] = "Test Test2 test2.dts";
|
|
$StaticTSObjects[93] = "Test Test3 test3.dts";
|
|
$StaticTSObjects[94] = "Test Test4 test4.dts";
|
|
$StaticTSObjects[95] = "Test Test5 test5.dts";
|
|
|
|
|
|
|
|
$NumStaticTSObjects = 96;
|
|
|
|
function TSStatic::create(%shapeName)
|
|
{
|
|
//echo("Foo:" SPC %shapeName);
|
|
%obj = new TSStatic()
|
|
{
|
|
shapeName = %shapeName;
|
|
};
|
|
return(%obj);
|
|
}
|
|
|
|
function TSStatic::damage(%this)
|
|
{
|
|
// prevent console error spam
|
|
}
|
|
|
|
function stripFields(%this)
|
|
{
|
|
if(%this $= "")
|
|
%this = MissionGroup;
|
|
for (%i = 0; %i < %this.getCount(); %i++){
|
|
%obj = %this.getObject(%i);
|
|
if (%obj.getClassName() $= SimGroup)
|
|
{
|
|
%obj.powerCount = "";
|
|
%obj.team = "";
|
|
stripFields(%obj);
|
|
}
|
|
else
|
|
{
|
|
%obj.threshold = "";
|
|
%obj.team = "";
|
|
%obj.powerCount = "";
|
|
%obj.trigger = "";
|
|
%obj.hidden = "";
|
|
%obj.locked = "true";
|
|
%obj.notReady = "";
|
|
%obj.inUse = "";
|
|
%obj.triggeredBy = "";
|
|
%obj.lastDamagedBy = "";
|
|
%obj.lastDamagedByTeam ="";
|
|
%obj.isHome = "";
|
|
%obj.originalPosition = "";
|
|
%obj.objectiveCompleted = "";
|
|
%obj.number = "";
|
|
%obj.target = "";
|
|
%obj.lockCount = "";
|
|
%obj.homingCount = "";
|
|
%obj.projector = "";
|
|
%obj.holo = "";
|
|
%obj.waypoint = "";
|
|
%obj.scoreValue ="";
|
|
%obj.damageTimeMS = "";
|
|
%obj.station = "";
|
|
%homingCount = "";
|
|
}
|
|
}
|
|
}
|