mirror of
https://github.com/PhantomGamesDevelopment/TWM2.git
synced 2026-07-12 15:04:38 +00:00
Initial Commit
This commit is contained in:
commit
bd51490b14
316 changed files with 150033 additions and 0 deletions
259
scripts/packs/CardPack.cs
Normal file
259
scripts/packs/CardPack.cs
Normal file
|
|
@ -0,0 +1,259 @@
|
|||
$TeamDeployableMax[CardPackDeployable] = 9999;
|
||||
|
||||
datablock StaticShapeData(DeployedCardPack) : StaticShapeDamageProfile
|
||||
{
|
||||
className = Sensor;
|
||||
shapeFile = "stackable2s.dts";
|
||||
maxDamage = 0.6;
|
||||
destroyedLevel = 0.6;
|
||||
disabledLevel = 0.4;
|
||||
explosion = DeployablesExplosion;
|
||||
dynamicType = $TypeMasks::SensorObjectType;
|
||||
|
||||
deployedObject = true;
|
||||
|
||||
cmdCategory = "DSupport";
|
||||
cmdIcon = CMDSensorIcon;
|
||||
cmdMiniIconName = "commander/MiniIcons/com_deploymotionsensor";
|
||||
targetNameTag = 'Door Card Pack';
|
||||
targetTypeTag = '';
|
||||
deployAmbientThread = true;
|
||||
|
||||
debrisShapeName = "debris_generic_small.dts";
|
||||
debris = DeployableDebris;
|
||||
heatSignature = 0;
|
||||
};
|
||||
|
||||
datablock ShapeBaseImageData(CardPackDeployableImage)
|
||||
{
|
||||
shapeFile = "pack_deploy_sensor_motion.dts";
|
||||
item = CardPackDeployable;
|
||||
mountPoint = 1;
|
||||
offset = "0 0 0";
|
||||
deployed = DeployedCardPack;
|
||||
|
||||
stateName[0] = "Idle";
|
||||
stateTransitionOnTriggerDown[0] = "Activate";
|
||||
|
||||
stateName[1] = "Activate";
|
||||
stateScript[1] = "onActivate";
|
||||
stateTransitionOnTriggerUp[1] = "Idle";
|
||||
|
||||
maxDepSlope = 360;
|
||||
deploySound = MotionSensorDeploySound;
|
||||
emap = true;
|
||||
heatSignature = 1;
|
||||
|
||||
minDeployDis = 0.5;
|
||||
maxDeployDis = 5.0; //meters from body
|
||||
};
|
||||
|
||||
datablock ItemData(CardPackDeployable)
|
||||
{
|
||||
className = Pack;
|
||||
catagory = "Deployables";
|
||||
shapeFile = "pack_deploy_sensor_motion.dts";
|
||||
mass = 2.0;
|
||||
elasticity = 0.2;
|
||||
friction = 0.6;
|
||||
pickupRadius = 1;
|
||||
rotate = false;
|
||||
image = "CardPackDeployableImage";
|
||||
pickUpName = "a Card Pack pack";
|
||||
|
||||
computeCRC = true;
|
||||
emap = true;
|
||||
heatSignature = 0;
|
||||
|
||||
//maxSensors = 3;
|
||||
maxSensors = 9999;
|
||||
};
|
||||
|
||||
function CardPackDeployable::onPickup(%this, %obj, %shape, %amount) {
|
||||
// created to prevent console errors
|
||||
}
|
||||
|
||||
function CardPackDeployableImage::onDeploy(%item, %plyr, %slot) {
|
||||
%className = "StaticShape";
|
||||
|
||||
%playerVector = vectorNormalize(-1 * getWord(%plyr.getEyeVector(),1) SPC getWord(%plyr.getEyeVector(),0) SPC "0");
|
||||
%item.surfaceNrm2 = %playerVector;
|
||||
%rot = fullRot(%item.surfaceNrm,%item.surfaceNrm2);
|
||||
|
||||
%deplObj = new (%className)() {
|
||||
dataBlock = %item.deployed;
|
||||
};
|
||||
|
||||
// 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 (%deplObj.getTarget() != -1)
|
||||
setTargetSensorGroup(%deplObj.getTarget(), %plyr.client.team);
|
||||
|
||||
// place the deployable in the MissionCleanup/Deployables group (AI reasons)
|
||||
addToDeployGroup(%deplObj);
|
||||
|
||||
//let the AI know as well...
|
||||
AIDeployObject(%plyr.client, %deplObj);
|
||||
|
||||
// play the deploy sound
|
||||
serverPlay3D(%item.deploySound, %deplObj.getTransform());
|
||||
|
||||
// increment the team count for this deployed object
|
||||
$TeamDeployedCount[%plyr.team, %item.item]++;
|
||||
|
||||
addDSurface(%item.surface,%deplObj);
|
||||
|
||||
// take the deployable off the player's back and out of inventory
|
||||
//%plyr.unmountImage(%slot);
|
||||
//%plyr.decInventory(%item.item, 1);
|
||||
//apply new settings to the pack
|
||||
%deplObj.NameHolder = %plyr.client.namebase;
|
||||
%deplObj.GUIDHolder = %plyr.client.GUID;
|
||||
if(%plyr.packSet[0] == 0) {
|
||||
%deplObj.cardColor = 1;
|
||||
%DepldName1 = "Green";
|
||||
}
|
||||
else if(%plyr.packSet[0] == 1) {
|
||||
%deplObj.cardColor = 2;
|
||||
%DepldName1 = "Yellow";
|
||||
}
|
||||
else if(%plyr.packSet[0] == 2) {
|
||||
%deplObj.cardColor = 3;
|
||||
%DepldName1 = "Red";
|
||||
}
|
||||
|
||||
if(%plyr.packSet[1] == 0) {
|
||||
%deplObj.CardSetting = 1;
|
||||
%DepldName2 = "";
|
||||
}
|
||||
else if(%plyr.packSet[1] == 1) {
|
||||
%deplObj.CardSetting = 2;
|
||||
%DepldName2 = "Remover";
|
||||
}
|
||||
|
||||
// setTargetName(%deplObj.target, ""@%DepldName1@" Card "@%DepldName2@"");
|
||||
|
||||
return %deplObj;
|
||||
}
|
||||
|
||||
function DeployedCardPack::onCollision(%data,%obj,%col) {
|
||||
if (%col.getClassName() !$= "Player") {
|
||||
return;
|
||||
}
|
||||
if(%col.client.guid == %obj.GUIDHolder) {
|
||||
messageclient(%col.client, 'MsgClient', "\c2The Device Does not Respond To It's Owner.");
|
||||
return;
|
||||
}
|
||||
//
|
||||
if(%obj.CardSetting == 1) {
|
||||
if(%obj.cardColor == 1) {
|
||||
messageclient(%col.client, 'MsgClient', "\c2You have recived a Green Card to "@%obj.NameHolder@"'s Doors.");
|
||||
%col.client.haslev1[%obj.GUIDHolder] = 1;
|
||||
}
|
||||
else if(%obj.cardColor == 2) {
|
||||
messageclient(%col.client, 'MsgClient', "\c2You have recived a Yellow Card to "@%obj.NameHolder@"'s Doors.");
|
||||
%col.client.haslev2[%obj.GUIDHolder] = 1;
|
||||
}
|
||||
else if(%obj.cardColor == 3) {
|
||||
messageclient(%col.client, 'MsgClient', "\c2You have recived a Red Card to "@%obj.NameHolder@"'s Doors.");
|
||||
%col.client.haslev3[%obj.GUIDHolder] = 1;
|
||||
}
|
||||
}
|
||||
else if(%obj.CardSetting == 2) {
|
||||
if(%obj.cardColor == 1) {
|
||||
messageclient(%col.client, 'MsgClient', "\c2The Device Takes your Green Card to "@%obj.NameHolder@"'s Doors.");
|
||||
%col.client.haslev1[%obj.GUIDHolder] = 0;
|
||||
}
|
||||
else if(%obj.cardColor == 2) {
|
||||
messageclient(%col.client, 'MsgClient', "\c2The Device Takes your Yellow Card to "@%obj.NameHolder@"'s Doors.");
|
||||
%col.client.haslev2[%obj.GUIDHolder] = 0;
|
||||
}
|
||||
else if(%obj.cardColor == 3) {
|
||||
messageclient(%col.client, 'MsgClient', "\c2The Device Takes your Red Card to "@%obj.NameHolder@"'s Doors.");
|
||||
%col.client.haslev3[%obj.GUIDHolder] = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function CardPackDeployableImage::onMount(%data, %obj, %node) {
|
||||
%obj.hasCard = true; // set for blastcheck
|
||||
%obj.packSet = 0;
|
||||
%obj.packSet[0] = 0; //Card Color
|
||||
%obj.packSet[1] = 0; //Give/take
|
||||
%obj.expertSet = 0;
|
||||
displayPowerFreq(%obj);
|
||||
|
||||
}
|
||||
|
||||
function CardPackDeployableImage::onUnmount(%data, %obj, %node) {
|
||||
%obj.hasCard = false;
|
||||
%obj.packSet = 0;
|
||||
%obj.packSet[0] = 0;
|
||||
%obj.packSet[1] = 0;
|
||||
%obj.expertSet = 0;
|
||||
}
|
||||
|
||||
function ChangeCardMode(%this, %PriSec) {
|
||||
if(%PriSec == 1) { //Primary
|
||||
%this.ExpertSet++;
|
||||
%this.packSet[%this.ExpertSet] = 0; //Reset Secondary Mode TO Prevent Errors
|
||||
if (%this.ExpertSet > 1) {
|
||||
%this.ExpertSet = 0;
|
||||
}
|
||||
DisplayCardInfo(%this,%PriSec);
|
||||
return;
|
||||
}
|
||||
else { //Secondary
|
||||
%this.packSet[%this.ExpertSet]++;
|
||||
//Check Primaries
|
||||
if(%this.ExpertSet == 0 && %this.packSet[%this.ExpertSet] > 2) {
|
||||
%this.packSet[%this.ExpertSet] = 0;
|
||||
}
|
||||
else if(%this.ExpertSet == 1 && %this.packSet[%this.ExpertSet] > 1) {
|
||||
%this.packSet[%this.ExpertSet] = 0;
|
||||
}
|
||||
DisplayCardInfo(%this,%PriSec);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
function DisplayCardInfo(%plyr, %Var) {
|
||||
if(%Var == 1) {
|
||||
switch(%plyr.ExpertSet) {
|
||||
case 0:
|
||||
bottomPrint(%plyr.client,"Card Pack [P]: Select Card Color",2,1);
|
||||
case 1:
|
||||
bottomPrint(%plyr.client,"Card Pack [P]: Select Card Settings",2,1);
|
||||
}
|
||||
}
|
||||
else if(%Var == 2) {
|
||||
switch(%plyr.ExpertSet) {
|
||||
case 0:
|
||||
switch(%plyr.packSet[0]) {
|
||||
case 0:
|
||||
bottomPrint(%plyr.client,"Card Pack [S]: Green Card",2,1);
|
||||
case 1:
|
||||
bottomPrint(%plyr.client,"Card Pack [S]: Yellow Card",2,1);
|
||||
case 2:
|
||||
bottomPrint(%plyr.client,"Card Pack [S]: Red Card",2,1);
|
||||
}
|
||||
case 1:
|
||||
switch(%plyr.packSet[1]) {
|
||||
case 0:
|
||||
bottomPrint(%plyr.client,"Card Pack [S]: Give Card",2,1);
|
||||
case 1:
|
||||
bottomPrint(%plyr.client,"Card Pack [S]: Strip Card",2,1);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
1203
scripts/packs/Effectpacks.cs
Normal file
1203
scripts/packs/Effectpacks.cs
Normal file
File diff suppressed because it is too large
Load diff
396
scripts/packs/Medpack.cs
Normal file
396
scripts/packs/Medpack.cs
Normal file
|
|
@ -0,0 +1,396 @@
|
|||
datablock ShapeBaseImageData(MedPackImage)
|
||||
{
|
||||
shapeFile = "pack_upgrade_ammo.dts";
|
||||
item = MedPack;
|
||||
mountPoint = 1;
|
||||
offset = "0 0 0";
|
||||
emap = true;
|
||||
|
||||
gun = MedPackGunImage;
|
||||
|
||||
stateName[0] = "Idle";
|
||||
stateTransitionOnTriggerDown[0] = "Activate";
|
||||
|
||||
stateName[1] = "Activate";
|
||||
stateScript[1] = "onActivate";
|
||||
stateSequence[1] = "fire";
|
||||
stateSound[1] = RepairPackActivateSound;
|
||||
stateTransitionOnTriggerUp[1] = "Deactivate";
|
||||
|
||||
stateName[2] = "Deactivate";
|
||||
stateScript[2] = "onDeactivate";
|
||||
stateTransitionOnTimeout[2] = "Idle";
|
||||
};
|
||||
|
||||
datablock ItemData(MedPack)
|
||||
{
|
||||
className = Pack;
|
||||
catagory = "Packs";
|
||||
shapeFile = "pack_upgrade_ammo.dts";
|
||||
mass = 1;
|
||||
elasticity = 0.2;
|
||||
friction = 0.6;
|
||||
pickupRadius = 2;
|
||||
rotate = true;
|
||||
image = "MedPackImage";
|
||||
pickUpName = "a Med pack";
|
||||
|
||||
lightOnlyStatic = true;
|
||||
lightType = "PulsingLight";
|
||||
lightColor = "1 0 0 1";
|
||||
lightTime = 1200;
|
||||
lightRadius = 4;
|
||||
|
||||
computeCRC = true;
|
||||
emap = true;
|
||||
};
|
||||
|
||||
datablock ShapeBaseImageData(MedpackImg1)
|
||||
{
|
||||
shapeFile = "pack_upgrade_repair.dts";
|
||||
mountPoint = 1;
|
||||
offset = "0 -0.05 0";
|
||||
emap = true;
|
||||
|
||||
stateName[0] = "Idle";
|
||||
stateTransitionOnTriggerDown[0] = "Activate";
|
||||
|
||||
stateName[1] = "Activate";
|
||||
stateSequence[1] = "fire";
|
||||
stateTransitionOnTriggerUp[1] = "Idle";
|
||||
};
|
||||
|
||||
datablock ShapeBaseImageData(MedpackImg2)
|
||||
{
|
||||
shapeFile = "repair_kit.dts";
|
||||
mountPoint = 1;
|
||||
offset = "0 -0.2 -0.18";
|
||||
emap = true;
|
||||
};
|
||||
|
||||
datablock ShapeBaseImageData(MedpackImg2b)
|
||||
{
|
||||
shapeFile = "repair_kit.dts";
|
||||
mountPoint = 1;
|
||||
offset = "0 -0.2 0.15";
|
||||
emap = true;
|
||||
};
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
// Repair Gun
|
||||
|
||||
datablock ShapeBaseImageData(MedPackGunImage)
|
||||
{
|
||||
shapeFile = "pack_upgrade_repair.dts";
|
||||
offset = "0 0.15 0";
|
||||
rotation = "1 0 0 90";
|
||||
|
||||
usesEnergy = true;
|
||||
minEnergy = 3;
|
||||
cutOffEnergy = 3.1;
|
||||
emap = true;
|
||||
|
||||
repairFactorPlayer = 0.005;
|
||||
|
||||
stateName[0] = "Activate";
|
||||
stateTransitionOnTimeout[0] = "ActivateReady";
|
||||
stateTimeoutValue[0] = 0.25;
|
||||
|
||||
stateName[1] = "ActivateReady";
|
||||
stateScript[1] = "onActivateReady";
|
||||
stateSpinThread[1] = Stop;
|
||||
stateTransitionOnAmmo[1] = "Ready";
|
||||
stateTransitionOnNoAmmo[1] = "ActivateReady";
|
||||
|
||||
stateName[2] = "Ready";
|
||||
stateSpinThread[2] = Stop;
|
||||
stateTransitionOnNoAmmo[2] = "Deactivate";
|
||||
stateTransitionOnTriggerDown[2] = "Repair";
|
||||
|
||||
stateName[4] = "Repair";
|
||||
stateSound[4] = RepairPackFireSound;
|
||||
stateScript[4] = "onRepair";
|
||||
stateAllowImageChange[4] = false;
|
||||
stateSequence[4] = "fire";
|
||||
stateFire[4] = true;
|
||||
stateEnergyDrain[4] = 32;
|
||||
stateTransitionOnNoAmmo[4] = "Deactivate";
|
||||
stateTransitionOnTriggerUp[4] = "Deactivate";
|
||||
stateTransitionOnNotLoaded[4] = "Validate";
|
||||
|
||||
stateName[5] = "Deactivate";
|
||||
stateScript[5] = "onDeactivate";
|
||||
stateSpinThread[5] = SpinDown;
|
||||
stateSequence[5] = "activate";
|
||||
stateDirection[5] = false;
|
||||
stateTimeoutValue[5] = 0.2;
|
||||
stateTransitionOnTimeout[5] = "ActivateReady";
|
||||
};
|
||||
|
||||
//---------------------------
|
||||
//PACK STUFF
|
||||
//---------------------------
|
||||
|
||||
function MedPackImage::onMount(%data, %obj, %node){
|
||||
%obj.mountImage(MedpackImg1, 4);
|
||||
%obj.mountImage(MedpackImg2, 7);
|
||||
}
|
||||
|
||||
function MedPackImage::onUnmount(%data, %obj, %node) {
|
||||
if(%obj.getMountedImage($WeaponSlot))
|
||||
if(%obj.getMountedImage($WeaponSlot).getName() $= "MedPackGunImage")
|
||||
%obj.unmountImage($WeaponSlot);
|
||||
%obj.unmountImage(4);
|
||||
%obj.unmountImage(7);
|
||||
}
|
||||
|
||||
function MedPackImage::onActivate(%data, %obj, %slot) {
|
||||
%obj.setImageTrigger(4, true);
|
||||
%obj.mountImage(MedpackImg2b, 7);
|
||||
messageClient( %obj.triggeredBy.client, 'CloseHud', "", 'scoreScreen' );
|
||||
messageClient( %obj.triggeredBy.client, 'CloseHud', "", 'inventoryScreen' );
|
||||
commandToClient(%obj.triggeredBy.client, 'StationVehicleShowHud');
|
||||
|
||||
if(%obj.isPilot())
|
||||
{
|
||||
%obj.setImageTrigger(%slot, false);
|
||||
return;
|
||||
}
|
||||
if(%obj.getMountedImage($WeaponSlot).getName() !$= "MedpackGunImage") {
|
||||
messageClient(%obj.client, 'MsgRepairPackOn', '\c2Medic pack activated.');
|
||||
|
||||
%obj.setArmThread(look);
|
||||
|
||||
%obj.mountImage(MedPackGunImage, $WeaponSlot);
|
||||
commandToClient(%obj.client, 'setRepairReticle');
|
||||
}
|
||||
}
|
||||
|
||||
function MedPackImage::onDeactivate(%data, %obj, %slot) {
|
||||
%obj.setImageTrigger(4, false);
|
||||
%obj.setImageTrigger(%slot, false);
|
||||
if(%obj.getMountedImage($WeaponSlot).getName() $= "MedpackGunImage")
|
||||
%obj.unmountImage($WeaponSlot);
|
||||
%obj.mountImage(MedpackImg2, 7);
|
||||
}
|
||||
|
||||
|
||||
function MedPackGunImage::onMount(%this,%obj,%slot) {
|
||||
%obj.setImageAmmo(%slot,true);
|
||||
if ( !isDemo() )
|
||||
commandToClient( %obj.client, 'setRepairPackIconOn' );
|
||||
|
||||
%obj.UsingMedGun = 1;
|
||||
}
|
||||
|
||||
function MedPackGunImage::onUnmount(%this,%obj,%slot)
|
||||
{
|
||||
if(%obj.isreping == 1)
|
||||
MedstopRepair(%obj);
|
||||
|
||||
%obj.UsingMedGun = 0;
|
||||
|
||||
%obj.setImageTrigger(%slot, false);
|
||||
%obj.setImageTrigger($BackpackSlot, false);
|
||||
if ( !isDemo() )
|
||||
commandToClient( %obj.client, 'setRepairPackIconOff' );
|
||||
}
|
||||
|
||||
function MedPackGunImage::onRepair(%this,%obj,%slot){
|
||||
%obj.isreping = 1;
|
||||
%pos = %obj.getWorldBoxCenter();
|
||||
%obj.reptargets = "";
|
||||
InitContainerRadiusSearch(%pos, 10, $TypeMasks::PlayerObjectType);
|
||||
while ((%targetObject = containerSearchNext()) != 0) {
|
||||
if(%targetObject.getDamageLevel() > 0.0 && %targetObject.getState() !$= "dead") {
|
||||
%obj.reptargets = %obj.reptargets @ %targetObject @" ";
|
||||
}
|
||||
|
||||
if (%targetObject.infected && %targetObject.getState() !$= "dead") {
|
||||
CureInfection(%targetObject);
|
||||
%targetObject.playAudio(0, ShockLanceHitSound);
|
||||
messageclient(%obj.client, 'MsgClient', "\c2Applying Zombie Cure To "@%targetObject.client.namebase@".");
|
||||
messageclient(%targetObject.client, 'MsgClient', "\c2Zombie Cure Applied By "@%obj.client.namebase@".");
|
||||
}
|
||||
|
||||
if (%targetObject.onfire && %targetObject.getState() !$= "dead") {
|
||||
%targetObject.onfire = 0;
|
||||
%targetObject.playAudio(0, ShockLanceHitSound);
|
||||
messageclient(%obj.client, 'MsgClient', "\c2Applying Burn Patch To "@%targetObject.client.namebase@".");
|
||||
messageclient(%targetObject.client, 'MsgClient', "\c2Burn Patch Applied By "@%obj.client.namebase@".");
|
||||
}
|
||||
}
|
||||
if(%obj.reptargets $= "" && !%targetObject.isinfected){
|
||||
messageclient(%obj.client, 'MsgClient', '\c2No targets to repair.');
|
||||
}
|
||||
Medrepair(%obj, %obj.reptargets);
|
||||
}
|
||||
|
||||
function MedPackGunImage::onDeactivate(%this,%obj,%slot)
|
||||
{
|
||||
MedstopRepair(%obj);
|
||||
}
|
||||
|
||||
function Medrepair(%obj, %targets){
|
||||
if(%obj.isreping == 0)
|
||||
return;
|
||||
if(%targets !$= ""){
|
||||
%numtrgs = getNumberOfWords(%targets);
|
||||
for(%i = 0; %i < %numtrgs; %i++){
|
||||
%target = getWord(%targets, %i);
|
||||
if(vectorDist(%obj.getWorldBoxCenter(), %target.getWorldBoxCenter()) <= 10 && %target.getDamageLevel() > 0.0){
|
||||
if(%target.reping != 1){
|
||||
%target.reping = 1;
|
||||
%target.setRepairRate(%target.getRepairRate() + MedPackGunImage.repairFactorPlayer);
|
||||
}
|
||||
}
|
||||
else{
|
||||
if(%target.reping == 1){
|
||||
%target.reping = 0;
|
||||
%target.setRepairRate(%target.getRepairRate() - MedPackGunImage.repairFactorPlayer);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
%pos = %obj.getWorldBoxCenter();
|
||||
%obj.reptargets = "";
|
||||
InitContainerRadiusSearch(%pos, 10, $TypeMasks::PlayerObjectType);
|
||||
while ((%targetObject = containerSearchNext()) != 0){
|
||||
if(%targetObject.getDamageLevel() > 0.0 && %targetObject.getState() !$= "dead")
|
||||
%obj.reptargets = %obj.reptargets @ %targetObject @" ";
|
||||
}
|
||||
if(%obj.isreping == 1)
|
||||
%obj.reploop = schedule(500, 0, "Medrepair", %obj, %obj.reptargets);
|
||||
}
|
||||
|
||||
function MedstopRepair(%obj){
|
||||
%obj.isreping = 0;
|
||||
if(%obj.reptargets !$= ""){
|
||||
%numtrgs = getNumberOfWords(%obj.reptargets);
|
||||
for(%i = 0; %i < %numtrgs; %i++){
|
||||
%target = getWord(%obj.reptargets, %i);
|
||||
if(%target.reping == 1){
|
||||
%target.reping = 0;
|
||||
%target.setRepairRate(%target.getRepairRate() - MedPackGunImage.repairFactorPlayer);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//---------------------------
|
||||
//REVIVE
|
||||
//---------------------------
|
||||
|
||||
function checkrevive(%obj){
|
||||
if(isObject(%obj.lasttouchedcorpse)){
|
||||
%Tobj = %obj.lasttouchedcorpse;
|
||||
if($TWM::PlayingHorde) {
|
||||
if($HordeGame::RevivesLeft == 0) {
|
||||
messageclient(%obj.client, 'MsgClient', "\c2HORDE: No Revives Remain In The Revive Pool.");
|
||||
return;
|
||||
}
|
||||
if(%Tobj.infected || %Tobj.isZombie) {
|
||||
messageclient(%obj.client, 'MsgClient', "\c2WHOA!!! We don't want to make the Undead.... UnDead AGAIN.");
|
||||
return;
|
||||
}
|
||||
}
|
||||
if($TWM::PlayingInfection) {
|
||||
if($InfectionGame::Infected[%Tobj.client]) {
|
||||
messageclient(%obj.client, 'MsgClient', "\c2JESUS, Trying To Revive Something That Want's Your Brains!?!?!?.");
|
||||
return;
|
||||
}
|
||||
}
|
||||
if(%Tobj.kibbled == 1){
|
||||
messageclient(%obj.client, 'MsgClient', "\c2This body is destroyed.");
|
||||
return;
|
||||
}
|
||||
if(%Tobj.infected || %Tobj.isZombie) {
|
||||
messageclient(%obj.client, 'MsgClient', "\c2WHOA!!! We don't want to make the Undead.... UnDead AGAIN.");
|
||||
return;
|
||||
}
|
||||
if(vectorDist(%obj.getPosition(),%Tobj.getPosition()) > 3){
|
||||
messageclient(%obj.client, 'MsgClient', "\c2Must be in contact with a body to revive it.");
|
||||
return;
|
||||
}
|
||||
%eyevec = %obj.getEyeVector();
|
||||
%eyepos = posFromTransform(%obj.getEyeTransform());
|
||||
%Tvec = vectorNormalize(vectorSub(%Tobj.getPosition(),%eyepos));
|
||||
if(vectorDist(%eyevec, %Tvec) > 0.5){
|
||||
messageclient(%obj.client, 'MsgClient', "\c2Must be looking at body.");
|
||||
return;
|
||||
}
|
||||
if(%Tobj.getState() !$= "dead"){
|
||||
messageclient(%obj.client, 'MsgClient', "\c2Cannot revive, target isnt dead.");
|
||||
return;
|
||||
}
|
||||
if(%Tobj.team != %obj.team){
|
||||
messageclient(%obj.client, 'MsgClient', "\c2Sure thing Megatron, Lets Revive the enemy so you can kill him again =-|");
|
||||
return;
|
||||
}
|
||||
revive(%obj, %tobj);
|
||||
}
|
||||
else
|
||||
messageclient(%obj.client, 'MsgClient', "\c2Must be in contact with a body to revive it.");
|
||||
}
|
||||
|
||||
function revive(%obj, %target){
|
||||
if(%target.team == 0) {
|
||||
messageclient(%obj.client, 'MsgClient', "\c2"@%target.client.namebase@" cannot be revived.");
|
||||
}
|
||||
if(%target.client.getControlObject() !$= %target.client.player){
|
||||
//necessitys
|
||||
if($TWM::PlayingHorde) {
|
||||
CompleteNWChallenge(%obj.client, "Angel");
|
||||
$HordeGame::RevivesLeft--;
|
||||
$HordeGame::LivingCount++;
|
||||
%s = MakeReviveString();
|
||||
messageAll('MsgSPCurrentObjective2' ,"", "Players Alive: "@$HordeGame::LivingCount@" | "@%s@"");
|
||||
}
|
||||
//
|
||||
%target.setDamageLevel(%target.getdatablock().maxDamage - 0.1);
|
||||
%target.client.setControlObject(%target);
|
||||
%target.revived = 1;
|
||||
Cancel(%target.ParaLoop);
|
||||
Cancel(%target.revcheck);
|
||||
%target.client.player = %target;
|
||||
Cancel(%target.player.createTheZ);
|
||||
//points and message
|
||||
%obj.client.revivecount++;
|
||||
//GainExperience(%obj.client, 25, "You have revived "@%target.client.namebase@" ");
|
||||
messageclient(%target.client, 'MsgClient', "\c2You were revived by "@%obj.client.namebase@".");
|
||||
|
||||
//effects
|
||||
%target.setDamageFlash(1);
|
||||
%target.setMoveState(true);
|
||||
playDeathCry(%target);
|
||||
revivestand(%target, 0);
|
||||
buyFavorites(%target.client);
|
||||
|
||||
%obj.playAudio(0, ShockLanceHitSound);
|
||||
%obj.zapObject();
|
||||
%obj.schedule(3000, "stopZap");
|
||||
}
|
||||
else
|
||||
messageclient(%obj.client, 'MsgClient', "\c2Target already has another clone in use.");
|
||||
}
|
||||
|
||||
function revivestand(%obj, %count){
|
||||
if(%obj.getstate() $= "dead")
|
||||
return;
|
||||
if(%count <= 2){
|
||||
%obj.setActionThread("scoutRoot",true);
|
||||
%obj.setDamageFlash(0.7);
|
||||
}
|
||||
else if(%count <= 5){
|
||||
%obj.setActionThread("sitting",true);
|
||||
%obj.setDamageFlash(0.4);
|
||||
}
|
||||
else if(%count >= 6){
|
||||
%obj.setActionThread("ski",true);
|
||||
%obj.setMoveState(false);
|
||||
return;
|
||||
}
|
||||
%count++;
|
||||
schedule(500, 0, "revivestand", %obj, %count);
|
||||
}
|
||||
401
scripts/packs/ZSpawnpack.cs
Normal file
401
scripts/packs/ZSpawnpack.cs
Normal file
|
|
@ -0,0 +1,401 @@
|
|||
$TeamDeployableMax[ZSpawnDeployable] = 9999;
|
||||
//----------------------------------------------------
|
||||
// Zombie Spawn Point
|
||||
//---------------------------------------------------------
|
||||
|
||||
$zombie::detectDist = 100;
|
||||
$zombie::lungDist = 10;
|
||||
$zombie::LKillDist = 5;
|
||||
$zombie::Rupvec = 750;
|
||||
$zombie::killpoints = 5;
|
||||
|
||||
$Zombie::RAAMThread = "cel1";
|
||||
$Zombie::RogThread = "cel1";
|
||||
|
||||
datablock AudioProfile(ZombieMoan)
|
||||
{
|
||||
filename = "fx/environment/growl3.wav";
|
||||
description = AudioClose3d;
|
||||
preload = true;
|
||||
};
|
||||
|
||||
datablock AudioProfile(ZombieHOWL)
|
||||
{
|
||||
filename = "fx/environment/Yeti_Howl1.wav";
|
||||
description = AudioBomb3d;
|
||||
preload = true;
|
||||
};
|
||||
|
||||
//USED IN FLAMETHROWER
|
||||
//DO NOT REMOVE: NEEDED HERE
|
||||
datablock ParticleData(ThrowerBaseParticle) {
|
||||
dragCoeffiecient = 0.0;
|
||||
gravityCoefficient = -0.2;
|
||||
inheritedVelFactor = 0.0;
|
||||
|
||||
lifetimeMS = 800;
|
||||
lifetimeVarianceMS = 500;
|
||||
|
||||
useInvAlpha = false;
|
||||
spinRandomMin = -160.0;
|
||||
spinRandomMax = 160.0;
|
||||
|
||||
animateTexture = true;
|
||||
framesPerSec = 15;
|
||||
|
||||
textureName = "special/cloudflash";
|
||||
|
||||
colors[0] = "1.0 0.6 0.4 1.0";
|
||||
colors[1] = "1.0 0.5 0.2 1.0";
|
||||
colors[2] = "1.0 0.25 0.1 0.0";
|
||||
|
||||
sizes[0] = 0.5;
|
||||
sizes[1] = 0.7;
|
||||
sizes[2] = 1.0;
|
||||
|
||||
times[0] = 0.0;
|
||||
times[1] = 0.7;
|
||||
times[2] = 1.0;
|
||||
};
|
||||
|
||||
datablock ParticleEmitterData(ThrowerBaseEmitter) {
|
||||
ejectionPeriodMS = 10;
|
||||
periodVarianceMS = 0;
|
||||
|
||||
ejectionVelocity = 1.5;
|
||||
velocityVariance = 0.3;
|
||||
|
||||
thetaMin = 0.0;
|
||||
thetaMax = 30.0;
|
||||
|
||||
particles = "ThrowerBaseParticle";
|
||||
};
|
||||
//
|
||||
|
||||
datablock ParticleData(DemonFBSmokeParticle)
|
||||
{
|
||||
dragCoeffiecient = 0.0;
|
||||
gravityCoefficient = 0.0;
|
||||
inheritedVelFactor = 0.0;
|
||||
|
||||
lifetimeMS = 2500;
|
||||
lifetimeVarianceMS = 500;
|
||||
|
||||
textureName = "particleTest";
|
||||
|
||||
useInvAlpha = true;
|
||||
|
||||
spinRandomMin = -60.0;
|
||||
spinRandomMax = 60.0;
|
||||
|
||||
colors[0] = "0.5 0.5 0.5 0.5";
|
||||
colors[1] = "0.4 0.4 0.4 0.2";
|
||||
colors[2] = "0.3 0.3 0.3 0.0";
|
||||
sizes[0] = 0.5;
|
||||
sizes[1] = 1.75;
|
||||
sizes[2] = 3.0;
|
||||
times[0] = 0.0;
|
||||
times[1] = 0.5;
|
||||
times[2] = 1.0;
|
||||
};
|
||||
|
||||
datablock ParticleEmitterData(DemonFBSmokeEmitter)
|
||||
{
|
||||
ejectionPeriodMS = 7;
|
||||
periodVarianceMS = 0;
|
||||
|
||||
ejectionVelocity = 0.75; // A little oomph at the back end
|
||||
velocityVariance = 0.2;
|
||||
|
||||
thetaMin = 0.0;
|
||||
thetaMax = 180.0;
|
||||
|
||||
particles = "DemonFBSmokeParticle";
|
||||
};
|
||||
|
||||
datablock GrenadeProjectileData(DemonFireball)
|
||||
{
|
||||
projectileShapeName = "plasmabolt.dts";
|
||||
emitterDelay = -1;
|
||||
directDamage = 0.0;
|
||||
hasDamageRadius = true;
|
||||
indirectDamage = 0.4;
|
||||
damageRadius = 5.0; // z0dd - ZOD, 8/13/02. Was 20.0
|
||||
radiusDamageType = $DamageType::zombie;
|
||||
kickBackStrength = 1500;
|
||||
|
||||
explosion = "PlasmaBoltExplosion";
|
||||
underwaterExplosion = "PlasmaBoltExplosion";
|
||||
velInheritFactor = 0;
|
||||
splash = PlasmaSplash;
|
||||
depthTolerance = 100.0;
|
||||
|
||||
baseEmitter = DemonFBSmokeEmitter;
|
||||
bubbleEmitter = DemonFBSmokeEmitter;
|
||||
|
||||
grenadeElasticity = 0;
|
||||
grenadeFriction = 0.4;
|
||||
armingDelayMS = -1; // z0dd - ZOD, 4/14/02. Was 2000
|
||||
|
||||
gravityMod = 0.4; // z0dd - ZOD, 5/18/02. Make mortar projectile heavier, less floaty
|
||||
muzzleVelocity = 50.0; // z0dd - ZOD, 8/13/02. More velocity to compensate for higher gravity. Was 63.7
|
||||
drag = 0;
|
||||
sound = PlasmaProjectileSound;
|
||||
|
||||
hasLight = true;
|
||||
lightRadius = 10;
|
||||
lightColor = "1 0.75 0.25";
|
||||
|
||||
hasLightUnderwaterColor = true;
|
||||
underWaterLightColor = "1 0.75 0.25";
|
||||
};
|
||||
|
||||
datablock GrenadeProjectileData(DemonFlamingFireball) {
|
||||
projectileShapeName = "plasmabolt.dts";
|
||||
emitterDelay = -1;
|
||||
directDamage = 0.0;
|
||||
hasDamageRadius = true;
|
||||
indirectDamage = 0.4;
|
||||
damageRadius = 5.0; // z0dd - ZOD, 8/13/02. Was 20.0
|
||||
radiusDamageType = $DamageType::Fire;
|
||||
kickBackStrength = 1500;
|
||||
|
||||
explosion = "PlasmaBoltExplosion";
|
||||
underwaterExplosion = "PlasmaBoltExplosion";
|
||||
velInheritFactor = 0;
|
||||
splash = PlasmaSplash;
|
||||
depthTolerance = 100.0;
|
||||
|
||||
baseEmitter = ThrowerBaseEmitter;
|
||||
bubbleEmitter = ThrowerBaseEmitter;
|
||||
|
||||
grenadeElasticity = 0;
|
||||
grenadeFriction = 0.4;
|
||||
armingDelayMS = -1; // z0dd - ZOD, 4/14/02. Was 2000
|
||||
|
||||
gravityMod = 0.4; // z0dd - ZOD, 5/18/02. Make mortar projectile heavier, less floaty
|
||||
muzzleVelocity = 50.0; // z0dd - ZOD, 8/13/02. More velocity to compensate for higher gravity. Was 63.7
|
||||
drag = 0;
|
||||
sound = PlasmaProjectileSound;
|
||||
|
||||
hasLight = true;
|
||||
lightRadius = 10;
|
||||
lightColor = "1 0.75 0.25";
|
||||
|
||||
hasLightUnderwaterColor = true;
|
||||
underWaterLightColor = "1 0.75 0.25";
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedZSpawnBase) : StaticShapeDamageProfile {
|
||||
className = "lightbase";
|
||||
shapeFile = "pack_deploy_sensor_motion.dts";
|
||||
|
||||
maxDamage = 2.5;
|
||||
destroyedLevel = 2.5;
|
||||
disabledLevel = 2.0;
|
||||
|
||||
maxEnergy = 50;
|
||||
rechargeRate = 0.25;
|
||||
|
||||
explosion = HandGrenadeExplosion;
|
||||
expDmgRadius = 1.0;
|
||||
expDamage = 0.05;
|
||||
expImpulse = 200;
|
||||
|
||||
dynamicType = $TypeMasks::StaticShapeObjectType;
|
||||
deployedObject = true;
|
||||
cmdCategory = "DSupport";
|
||||
cmdIcon = CMDSensorIcon;
|
||||
cmdMiniIconName = "commander/MiniIcons/com_deploymotionsensor";
|
||||
targetNameTag = 'Deployed Zombie Spawner';
|
||||
deployAmbientThread = true;
|
||||
debrisShapeName = "debris_generic_small.dts";
|
||||
debris = DeployableDebris;
|
||||
heatSignature = 0;
|
||||
needsPower = true;
|
||||
};
|
||||
|
||||
datablock ShapeBaseImageData(ZSpawnDeployableImage) {
|
||||
mass = 20;
|
||||
emap = true;
|
||||
shapeFile = "stackable1s.dts";
|
||||
item = ZSpawnDeployable;
|
||||
mountPoint = 1;
|
||||
offset = "0 0 0";
|
||||
deployed = DeployedZSpawnBase;
|
||||
heatSignature = 0;
|
||||
|
||||
stateName[0] = "Idle";
|
||||
stateTransitionOnTriggerDown[0] = "Activate";
|
||||
|
||||
stateName[1] = "Activate";
|
||||
stateScript[1] = "onActivate";
|
||||
stateTransitionOnTriggerUp[1] = "Idle";
|
||||
|
||||
isLarge = false;
|
||||
maxDepSlope = 360;
|
||||
deploySound = ItemPickupSound;
|
||||
|
||||
minDeployDis = 0.5;
|
||||
maxDeployDis = 50.0;
|
||||
};
|
||||
|
||||
datablock ItemData(ZSpawnDeployable) {
|
||||
className = Pack;
|
||||
catagory = "Deployables";
|
||||
shapeFile = "stackable1s.dts";
|
||||
mass = 5.0;
|
||||
elasticity = 0.2;
|
||||
friction = 0.6;
|
||||
pickupRadius = 1;
|
||||
rotate = true;
|
||||
image = "ZSpawnDeployableImage";
|
||||
pickUpName = "a Zombie Spawn pack";
|
||||
heatSignature = 0;
|
||||
emap = true;
|
||||
};
|
||||
|
||||
function ZSpawnDeployableImage::testObjectTooClose(%item) {
|
||||
return "";
|
||||
}
|
||||
function ZSpawnDeployableImage::testNoTerrainFound(%item) {}
|
||||
function ZSpawnDeployable::onPickup(%this, %obj, %shape, %amount) {}
|
||||
|
||||
function ZSpawnDeployableImage::onDeploy(%item, %plyr, %slot) {
|
||||
%className = "StaticShape";
|
||||
|
||||
%playerVector = vectorNormalize(-1 * getWord(%plyr.getEyeVector(),1) SPC getWord(%plyr.getEyeVector(),0) SPC "0");
|
||||
|
||||
if (vAbs(floorVec(%item.surfaceNrm,100)) $= "0 0 1")
|
||||
%item.surfaceNrm2 = %playerVector;
|
||||
else
|
||||
%item.surfaceNrm2 = vectorNormalize(vectorCross(%item.surfaceNrm,"0 0 -1"));
|
||||
|
||||
%rot = fullRot(%item.surfaceNrm,%item.surfaceNrm2);
|
||||
|
||||
%deplObj = new (%className)() {
|
||||
dataBlock = %item.deployed;
|
||||
};
|
||||
|
||||
// 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);
|
||||
%deplObj.light.lightBase = %deplObj;
|
||||
|
||||
// set the sensor group if it needs one
|
||||
if (%deplObj.getTarget() != -1)
|
||||
setTargetSensorGroup(%deplObj.getTarget(), %plyr.client.team);
|
||||
|
||||
// place the deployable in the MissionCleanup/Deployables group (AI reasons)
|
||||
addToDeployGroup(%deplObj);
|
||||
|
||||
//let the AI know as well...
|
||||
AIDeployObject(%plyr.client, %deplObj);
|
||||
|
||||
// play the deploy sound
|
||||
serverPlay3D(%item.deploySound, %deplObj.getTransform());
|
||||
|
||||
// increment the team count for this deployed object
|
||||
$TeamDeployedCount[%plyr.team, %item.item]++;
|
||||
|
||||
addDSurface(%item.surface,%deplObj);
|
||||
|
||||
%deplObj.playThread($PowerThread,"Power");
|
||||
%deplObj.playThread($AmbientThread,"ambient");
|
||||
|
||||
// take the deployable off the player's back and out of inventory
|
||||
if(!%plyr.client.isSuperAdmin) {
|
||||
%plyr.unmountImage(%slot);
|
||||
%plyr.decInventory(%item.item, 1);
|
||||
}
|
||||
|
||||
// set power frequency
|
||||
%deplObj.powerFreq = %plyr.powerFreq;
|
||||
|
||||
// Power object
|
||||
checkPowerObject(%deplObj);
|
||||
|
||||
switch(%plyr.packset) {
|
||||
case 0:
|
||||
%deplobj.ZType = 1;
|
||||
case 1:
|
||||
%deplobj.ZType = 2;
|
||||
case 2:
|
||||
%deplobj.ZType = 3;
|
||||
%deplobj.numZ = 2;
|
||||
case 3:
|
||||
%deplobj.ZType = 4;
|
||||
case 4:
|
||||
%deplobj.ZType = 5;
|
||||
case 5:
|
||||
%deplobj.ZType = 6;
|
||||
case 6:
|
||||
%deplobj.ZType = 9;
|
||||
case 7:
|
||||
%deplobj.ZType = 11;
|
||||
case 8:
|
||||
%deplobj.ZType = 12;
|
||||
case 9:
|
||||
%deplobj.ZType = 13;
|
||||
case 10:
|
||||
%deplobj.ZType = 14;
|
||||
case 11:
|
||||
%deplobj.ZType = 15;
|
||||
case 12:
|
||||
%deplobj.ZType = 16;
|
||||
case 13:
|
||||
%deplobj.ZType = 17;
|
||||
}
|
||||
%deplobj.spawnTypeSet = %plyr.expertset;
|
||||
|
||||
return %deplObj;
|
||||
}
|
||||
|
||||
function DeployedZSpawnBase::onDestroyed(%this,%obj,%prevState) {
|
||||
if (%obj.isRemoved)
|
||||
return;
|
||||
%obj.isRemoved = true;
|
||||
Parent::onDestroyed(%this,%obj,%prevState);
|
||||
$TeamDeployedCount[%obj.team, ZSpawnDeployable]--;
|
||||
remDSurface(%obj);
|
||||
%obj.schedule(500, "delete");
|
||||
if (%obj.ZCloop !$= "")
|
||||
Cancel(%obj.ZCLoop);
|
||||
}
|
||||
|
||||
function DeployedZSpawnBase::disassemble(%data,%plyr,%obj) {
|
||||
if (%obj.ZCloop !$= "")
|
||||
Cancel(%obj.ZCLoop);
|
||||
disassemble(%data,%plyr,%obj);
|
||||
}
|
||||
|
||||
function ZSpawnDeployableImage::onMount(%data, %obj, %node) {
|
||||
%obj.hasZSpawn = true;
|
||||
%obj.expertset = 0;
|
||||
}
|
||||
|
||||
function ZSpawnDeployableImage::onUnmount(%data, %obj, %node) {
|
||||
%obj.hasZSpawn = "";
|
||||
}
|
||||
|
||||
function DeployedZSpawnBase::onGainPowerEnabled(%data,%obj) {
|
||||
if(%obj.spawnTypeSet == 1)
|
||||
%obj.numz = 0;
|
||||
if (%obj.ZCloop !$= "")
|
||||
Cancel(%obj.ZCLoop);
|
||||
%obj.ZCLoop = schedule(1000, 0, "ZcreateLoop", %obj);
|
||||
Parent::onGainPowerEnabled(%data,%obj);
|
||||
}
|
||||
|
||||
function DeployedZSpawnBase::onLosePowerDisabled(%data,%obj) {
|
||||
if (%obj.ZCloop !$= "")
|
||||
Cancel(%obj.ZCLoop);
|
||||
Parent::onLosePowerDisabled(%data,%obj);
|
||||
}
|
||||
311
scripts/packs/ammopack.cs
Normal file
311
scripts/packs/ammopack.cs
Normal file
|
|
@ -0,0 +1,311 @@
|
|||
// ------------------------------------------------------------------
|
||||
// AMMO PACK
|
||||
// can be used by any armor type
|
||||
// uses no energy, does not have to be activated
|
||||
// increases the max amount of non-energy ammo carried
|
||||
|
||||
// put vars here for ammo max counts with ammo pack
|
||||
|
||||
$AmmoItem[0] = PlasmaAmmo;
|
||||
$AmmoItem[1] = DiscAmmo;
|
||||
$AmmoItem[2] = GrenadeLauncherAmmo;
|
||||
$AmmoItem[3] = MortarAmmo;
|
||||
$AmmoItem[4] = MissileLauncherAmmo;
|
||||
$AmmoItem[5] = RepairKit;
|
||||
|
||||
$numAmmoItems = 6;
|
||||
|
||||
$grenAmmoType[0] = Grenade;
|
||||
$grenAmmoType[1] = ConcussionGrenade;
|
||||
$grenAmmoType[2] = FlashGrenade;
|
||||
$grenAmmoType[3] = FlareGrenade;
|
||||
|
||||
$numGrenTypes = 4;
|
||||
|
||||
datablock ShapeBaseImageData(AmmoPackImage)
|
||||
{
|
||||
shapeFile = "pack_upgrade_ammo.dts";
|
||||
item = AmmoPack;
|
||||
mountPoint = 1;
|
||||
offset = "0 0 0";
|
||||
};
|
||||
|
||||
datablock ItemData(AmmoPack)
|
||||
{
|
||||
className = Pack;
|
||||
catagory = "Packs";
|
||||
shapeFile = "pack_upgrade_ammo.dts";
|
||||
mass = 1;
|
||||
elasticity = 0.2;
|
||||
friction = 0.6;
|
||||
pickupRadius = 2;
|
||||
rotate = true;
|
||||
image = "AmmoPackImage";
|
||||
pickUpName = "an ammo pack";
|
||||
|
||||
computeCRC = true;
|
||||
|
||||
|
||||
// lightType = "PulsingLight";
|
||||
// lightColor = "0.2 0.4 0.0 1.0";
|
||||
// lightTime = "1200";
|
||||
// lightRadius = "1.0";
|
||||
|
||||
max[PlasmaAmmo] = 30;
|
||||
max[ChaingunAmmo] = 150;
|
||||
max[DiscAmmo] = 15;
|
||||
max[GrenadeLauncherAmmo] = 15;
|
||||
max[MortarAmmo] = 10;
|
||||
max[MissileLauncherAmmo] = 1;
|
||||
max[Grenade] = 2;
|
||||
max[ConcussionGrenade] = 2;
|
||||
max[FlashGrenade] = 2;
|
||||
max[FlareGrenade] = 2;
|
||||
max[CameraGrenade] = 0;
|
||||
max[Mine] = 5;
|
||||
max[RepairKit] = 1;
|
||||
};
|
||||
|
||||
function AmmoPack::onPickup(%this,%pack,%player,%amount)
|
||||
{
|
||||
// %this = AmmoPack datablock
|
||||
// %pack = AmmoPack object number
|
||||
// %player = player
|
||||
// %amount = 1
|
||||
|
||||
for (%idx = 0; %idx < $numAmmoItems; %idx++)
|
||||
{
|
||||
%ammo = $AmmoItem[%idx];
|
||||
if (%pack.inv[%ammo] > 0)
|
||||
{
|
||||
%amount = %pack.getInventory(%ammo);
|
||||
%player.incInventory(%ammo,%amount);
|
||||
%pack.setInventory(%ammo,0);
|
||||
}
|
||||
else if(%pack.inv[%ammo] == -1)
|
||||
{
|
||||
// this particular type of ammo has already been exhausted for this pack;
|
||||
// don't give the player any
|
||||
}
|
||||
else
|
||||
{
|
||||
// Assume it's full if no inventory has been assigned
|
||||
%player.incInventory(%ammo,%this.max[%ammo]);
|
||||
}
|
||||
}
|
||||
// now check what type grenades (if any) player is carrying
|
||||
%gFound = false;
|
||||
for (%i = 0; %i < $numGrenTypes; %i++)
|
||||
{
|
||||
%gType = $grenAmmoType[%i];
|
||||
if(%player.inv[%gType] > 0)
|
||||
{
|
||||
%gFound = true;
|
||||
%playerGrenType = %gType;
|
||||
break;
|
||||
}
|
||||
}
|
||||
// if player doesn't have any grenades at all, give 'em whatever the ammo pack has
|
||||
if(!%gFound)
|
||||
{
|
||||
%given = false;
|
||||
for(%j = 0; %j < $numGrenTypes; %j++)
|
||||
{
|
||||
%packGren = $grenAmmoType[%j];
|
||||
if(%pack.inv[%packGren] > 0)
|
||||
{
|
||||
// pack has some of these grenades
|
||||
%player.incInventory(%packGren, %pack.getInventory(%packGren));
|
||||
%pack.setInventory(%packGren, 0);
|
||||
%given = true;
|
||||
break;
|
||||
}
|
||||
else if(%pack.inv[%packGren] == -1)
|
||||
{
|
||||
// the pack doesn't have any of this type of grenades
|
||||
}
|
||||
else
|
||||
{
|
||||
// pack has full complement of this grenade type
|
||||
%player.incInventory(%packGren, %this.max[%packGren]);
|
||||
%given = true;
|
||||
}
|
||||
if(%given)
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// player had some amount of grenades before picking up pack
|
||||
if(%pack.inv[%playerGrenType] > 0)
|
||||
{
|
||||
// pack has 1 or more of this type of grenade
|
||||
%player.incInventory(%playerGrenType, %pack.getInventory(%playerGrenType));
|
||||
%pack.setInventory(%playerGrenType, 0);
|
||||
}
|
||||
else if(%pack.inv[%playerGrenType] == -1)
|
||||
{
|
||||
// sorry Chester, the pack is out of these grenades.
|
||||
}
|
||||
else
|
||||
{
|
||||
// pack is uninitialized for this grenade type -- meaning it has full count
|
||||
%player.incInventory(%playerGrenType, %this.max[%playerGrenType]);
|
||||
}
|
||||
}
|
||||
// now see if player had mines selected and if they're allowed in this mission type
|
||||
%mineFav = %player.client.favorites[getField(%player.client.mineIndex, 0)];
|
||||
if ( ( $InvBanList[$CurrentMissionType, "Mine"] !$= "1" )
|
||||
&& !( ( %mineFav $= "EMPTY" ) || ( %mineFav $= "INVALID" ) ) )
|
||||
{
|
||||
// player has selected mines, and they are legal in this mission type
|
||||
if(%pack.inv[Mine] > 0)
|
||||
{
|
||||
// and the pack has some mines in it! bonus!
|
||||
%player.incInventory(Mine, %pack.getInventory(Mine));
|
||||
%pack.setInventory(Mine, 0);
|
||||
}
|
||||
else if(%pack.inv[Mine] == -1)
|
||||
{
|
||||
// no mines left in the pack. do nothing.
|
||||
}
|
||||
else
|
||||
{
|
||||
// assume it's full of mines if no inventory has been assigned
|
||||
%player.incInventory(Mine,%this.max[Mine]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function AmmoPack::onThrow(%this,%pack,%player)
|
||||
{
|
||||
// %this = AmmoPack datablock
|
||||
// %pack = AmmoPack object number
|
||||
// %player = player
|
||||
|
||||
%player.throwAmmoPack = 1;
|
||||
dropAmmoPack(%pack, %player);
|
||||
// do the normal ItemData::onThrow stuff -- sound and schedule deletion
|
||||
serverPlay3D(ItemThrowSound, %player.getTransform());
|
||||
%pack.schedulePop();
|
||||
}
|
||||
|
||||
function AmmoPack::onInventory(%this,%player,%value)
|
||||
{
|
||||
// %this = AmmoPack
|
||||
// %player = player
|
||||
// %value = 1 if gaining a pack, 0 if losing a pack
|
||||
|
||||
// the below test is necessary because this function is called everytime the ammo
|
||||
// pack gains or loses an item
|
||||
if(%player.getClassName() $= "Player")
|
||||
{
|
||||
if(!%value)
|
||||
if(%player.throwAmmoPack == 1)
|
||||
{
|
||||
%player.throwAmmoPack = 0;
|
||||
// ammo stuff already handled by AmmoPack::onThrow
|
||||
}
|
||||
else
|
||||
{
|
||||
// ammo pack was sold at inventory station -- no need to worry about
|
||||
// setting the ammo in the pack object (it doesn't exist any more)
|
||||
dropAmmoPack(-1, %player);
|
||||
}
|
||||
}
|
||||
Pack::onInventory(%this,%player,%value);
|
||||
}
|
||||
|
||||
function dropAmmoPack(%packObj, %player)
|
||||
{
|
||||
// %packObj = Ammo Pack object number if pack is being thrown, -1 if sold at inv station
|
||||
// %player = player object
|
||||
|
||||
for(%i = 0; %i < $numAmmoItems; %i++)
|
||||
{
|
||||
%ammo = $AmmoItem[%i];
|
||||
// %pAmmo == how much of this ammo type the player has
|
||||
%pAmmo = %player.getInventory(%ammo);
|
||||
// %pMax == how much of this ammo type the player's datablock says can be carried
|
||||
%pMax = %player.getDatablock().max[%ammo];
|
||||
if(%pAmmo > %pMax)
|
||||
{
|
||||
// if player has more of this ammo type than datablock's max...
|
||||
if(%packObj > 0)
|
||||
{
|
||||
// put ammo that player can't carry anymore in pack
|
||||
%packObj.setInventory(%ammo, %pAmmo - %pMax);
|
||||
}
|
||||
// set player to max for this ammo type
|
||||
%player.setInventory(%ammo, %pMax);
|
||||
}
|
||||
else
|
||||
{
|
||||
if(%packObj > 0)
|
||||
{
|
||||
// the pack gets -1 of this ammo type -- else it'll assume it's full
|
||||
// can't use setInventory() because it won't allow values less than 1
|
||||
%packObj.inv[%ammo] = -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
// and, of course, a pass for the grenades. Whee.
|
||||
%gotGren = false;
|
||||
// check to see what kind of grenades the player has.
|
||||
for(%j = 0; %j < $numGrenTypes; %j++)
|
||||
{
|
||||
%gType = $grenAmmoType[%j];
|
||||
if(%player.inv[%gType] > 0)
|
||||
{
|
||||
%gotGren = true;
|
||||
%playerGren = %gType;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
// ammo pack only carries type of grenades that player who bought it (or picked
|
||||
// it up) had at the time -- all else are zeroed out (value of -1)
|
||||
if(%packObj > 0)
|
||||
%packObj.inv[%gType] = -1;
|
||||
}
|
||||
}
|
||||
if(%gotGren)
|
||||
{
|
||||
%pAmmo = %player.getInventory(%playerGren);
|
||||
%pMax = %player.getDatablock().max[%playerGren];
|
||||
if(%pAmmo > %pMax)
|
||||
{
|
||||
if(%packObj > 0)
|
||||
%packObj.setInventory(%playerGren, %pAmmo - %pMax);
|
||||
%player.setInventory(%playerGren, %pMax);
|
||||
}
|
||||
else
|
||||
if(%packObj > 0)
|
||||
%packObj.inv[%playerGren] = -1;
|
||||
}
|
||||
else
|
||||
{
|
||||
// player doesn't have any grenades at all. nothing needs to be done here.
|
||||
}
|
||||
// crap. forgot the mines.
|
||||
if(%player.getInventory(Mine) > %player.getDatablock().max[Mine])
|
||||
{
|
||||
// if player has more mines than datablock's max...
|
||||
if(%packObj > 0)
|
||||
{
|
||||
// put mines that player can't carry anymore in pack
|
||||
%packObj.setInventory(Mine, %player.getInventory(Mine) - %player.getDatablock().max[Mine]);
|
||||
}
|
||||
// set player to max mines
|
||||
%player.setInventory(Mine, %player.getDatablock().max[Mine]);
|
||||
}
|
||||
else
|
||||
{
|
||||
if(%packObj > 0)
|
||||
{
|
||||
// the pack gets -1 for mines -- else it'll assume it's full
|
||||
// can't use setInventory() because it won't allow values less than 1
|
||||
%packObj.inv[Mine] = -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
242
scripts/packs/blastfloor.cs
Normal file
242
scripts/packs/blastfloor.cs
Normal file
|
|
@ -0,0 +1,242 @@
|
|||
//---------------------------------------------------------
|
||||
// Deployable floor
|
||||
//---------------------------------------------------------
|
||||
|
||||
datablock StaticShapeData(DeployedFloor) : StaticShapeDamageProfile {
|
||||
className = "floor";
|
||||
shapeFile = "smiscf.dts";
|
||||
|
||||
maxDamage = 4;
|
||||
destroyedLevel = 4;
|
||||
disabledLevel = 3.5;
|
||||
|
||||
isShielded = true;
|
||||
energyPerDamagePoint = 30;
|
||||
maxEnergy = 200;
|
||||
rechargeRate = 0.25;
|
||||
|
||||
explosion = HandGrenadeExplosion;
|
||||
expDmgRadius = 3.0;
|
||||
expDamage = 0.1;
|
||||
expImpulse = 200.0;
|
||||
|
||||
dynamicType = $TypeMasks::StaticShapeObjectType;
|
||||
deployedObject = true;
|
||||
cmdCategory = "DSupport";
|
||||
cmdIcon = CMDSensorIcon;
|
||||
cmdMiniIconName = "commander/MiniIcons/com_deploymotionsensor";
|
||||
targetNameTag = 'Medium Blast floor';
|
||||
deployAmbientThread = true;
|
||||
debrisShapeName = "debris_generic_small.dts";
|
||||
debris = DeployableDebris;
|
||||
heatSignature = 0;
|
||||
needsPower = true;
|
||||
};
|
||||
|
||||
datablock ShapeBaseImageData(FloorDeployableImage) {
|
||||
mass = 1;
|
||||
emap = true;
|
||||
shapeFile = "stackable1s.dts";
|
||||
item = FloorDeployable;
|
||||
mountPoint = 1;
|
||||
offset = "0 0 0";
|
||||
deployed = DeployedFloor;
|
||||
heatSignature = 0;
|
||||
|
||||
stateName[0] = "Idle";
|
||||
stateTransitionOnTriggerDown[0] = "Activate";
|
||||
|
||||
stateName[1] = "Activate";
|
||||
stateScript[1] = "onActivate";
|
||||
stateTransitionOnTriggerUp[1] = "Idle";
|
||||
|
||||
isLarge = false;
|
||||
maxDepSlope = 360; // also see FloorDeployableImage::testSlopeTooGreat()
|
||||
deploySound = ItemPickupSound;
|
||||
|
||||
minDeployDis = 0.1;
|
||||
maxDeployDis = 50.0;
|
||||
};
|
||||
|
||||
datablock ItemData(FloorDeployable) {
|
||||
className = Pack;
|
||||
catagory = "Deployables";
|
||||
shapeFile = "stackable1s.dts";
|
||||
mass = 1;
|
||||
elasticity = 0.2;
|
||||
friction = 0.6;
|
||||
pickupRadius = 1;
|
||||
rotate = true;
|
||||
image = "FloorDeployableImage";
|
||||
pickUpName = "a medium floor pack";
|
||||
heatSignature = 0;
|
||||
emap = true;
|
||||
};
|
||||
|
||||
function FloorDeployableImage::testSlopeTooGreat(%item) {
|
||||
if (%item.surface) {
|
||||
// Do we link with another Medium Floor?
|
||||
if (%item.surface.getClassName() $= "StaticShape") {
|
||||
if (%item.surface.getDataBlock().className $= "floor") {
|
||||
%floor = 1;
|
||||
}
|
||||
}
|
||||
if (%floor) {
|
||||
if ($Host::Purebuild == true && $Host::Hazard::Enabled != true)
|
||||
return getTerrainAngle(%item.surfaceNrm) > %item.maxDepSlope;
|
||||
else
|
||||
return getTerrainAngle(%item.surfaceNrm) > 1;
|
||||
}
|
||||
else
|
||||
return getTerrainAngle(%item.surfaceNrm) > %item.maxDepSlope;
|
||||
}
|
||||
}
|
||||
|
||||
function FloorDeployableImage::testObjectTooClose(%item) {
|
||||
if ($Host::Purebuild == true && $Host::Hazard::Enabled != true)
|
||||
return "";
|
||||
else {
|
||||
%terrain = %item.surface.getClassName() $= "TerrainBlock";
|
||||
%interior = %item.surface.getClassName() $= "InteriorInstance";
|
||||
if (%item.surface.getClassName() $= "StaticShape") {
|
||||
if (%item.surface.getDataBlock().className $= "floor") {
|
||||
%floor = 1;
|
||||
}
|
||||
}
|
||||
return !(%terrain || %interior || %floor);
|
||||
}
|
||||
}
|
||||
|
||||
function FloorDeployableImage::testNoTerrainFound(%item) {
|
||||
// don't check this for non-Landspike turret deployables
|
||||
}
|
||||
|
||||
function FloorDeployable::onPickup(%this, %obj, %shape, %amount) {
|
||||
// created to prevent console errors
|
||||
}
|
||||
|
||||
function FloorDeployableImage::onDeploy(%item, %plyr, %slot) {
|
||||
//Object
|
||||
%className = "StaticShape";
|
||||
|
||||
%grounded = 0;
|
||||
if (%item.surface.getClassName() $= TerrainBlock)
|
||||
%grounded = 1;
|
||||
|
||||
%playerVector = vectorNormalize(-1 * getWord(%plyr.getEyeVector(),1) SPC getWord(%plyr.getEyeVector(),0) SPC "0");
|
||||
|
||||
%rot = intRot("1 0 0 0",%playerVector);
|
||||
|
||||
%scale = getWords($packSetting["floor",%plyr.packSet],0,2);
|
||||
|
||||
if ($Host::ExpertMode == 1)
|
||||
%scale = getWords(%scale,0,1) SPC firstWord($expertSetting["floor",%plyr.expertSet]);
|
||||
|
||||
%surfaceAdjust = 1;
|
||||
// Do we link with another Medium Floor?
|
||||
if (%item.surface.getClassName() $= "StaticShape") {
|
||||
if (%item.surface.getDataBlock().className $= "floor") {
|
||||
%surfaceAdjust = 0;
|
||||
// [[Most]] Get the relative x y location from the "pure" information.
|
||||
%link = sidelink(%item.surface,%item.surfaceNrm,%item.surfacePt,getWords($packSetting["floor",%plyr.packSet],3,5),"0 0 -0.5");
|
||||
%location = getWords(%link,0,2);
|
||||
%side = getWords(%link,3,5);
|
||||
%dirside = getWords(%link,6,8);
|
||||
// [[Most]] Set the rotation to match the surfaceNrm and match the side.
|
||||
// The power of the full rotation system.. ;)
|
||||
%rot = fullRot(%item.surfaceNrm,vectorScale(%dirside,-1));
|
||||
// [[Most]] Adjust the location to match the scale.
|
||||
%adjust = vectorScale(%item.surfaceNrm,GetWord(%scale,2));
|
||||
%item.surfacePt = vectorSub(%location, %adjust);
|
||||
}
|
||||
}
|
||||
|
||||
// If we do not link with another Medium Floor
|
||||
if(%surfaceAdjust) {
|
||||
%item.surfacePt = vectorSub(%item.surfacePt,"0 0" SPC getWord(%scale,2) - 1); // Rise 1 meter above surface
|
||||
}
|
||||
|
||||
%scale = vectorMultiply(%scale,1/4 SPC 1/3 SPC 2);
|
||||
|
||||
%deplObj = new (%className)() {
|
||||
dataBlock = %item.deployed;
|
||||
scale = %scale;
|
||||
};
|
||||
|
||||
//////////////////////////Apply settings//////////////////////////////
|
||||
|
||||
// [[Location]]:
|
||||
|
||||
// exact:
|
||||
%deplObj.setTransform(%item.surfacePt SPC %rot);
|
||||
|
||||
// misc info
|
||||
addDSurface(%item.surface,%deplObj);
|
||||
|
||||
// [[Settings]]:
|
||||
|
||||
%deplObj.grounded = %grounded;
|
||||
%deplObj.needsFit = 1;
|
||||
|
||||
// [[Normal Stuff]]:
|
||||
|
||||
// if(%deplObj.getDatablock().rechargeRate)
|
||||
// %deplObj.setRechargeRate(%deplObj.getDatablock().rechargeRate);
|
||||
|
||||
// set team, owner, and handle
|
||||
%deplObj.team = %plyr.client.team;
|
||||
%deplObj.setOwner(%plyr);
|
||||
|
||||
// set power frequency
|
||||
%deplObj.powerFreq = %plyr.powerFreq;
|
||||
|
||||
// set the sensor group if it needs one
|
||||
if (%deplObj.getTarget() != -1)
|
||||
setTargetSensorGroup(%deplObj.getTarget(), %plyr.client.team);
|
||||
|
||||
// place the deployable in the MissionCleanup/Deployables group (AI reasons)
|
||||
addToDeployGroup(%deplObj);
|
||||
|
||||
//let the AI know as well...
|
||||
AIDeployObject(%plyr.client, %deplObj);
|
||||
|
||||
// play the deploy sound
|
||||
serverPlay3D(%item.deploySound, %deplObj.getTransform());
|
||||
|
||||
// increment the team count for this deployed object
|
||||
$TeamDeployedCount[%plyr.team, %item.item]++;
|
||||
|
||||
%deplObj.deploy();
|
||||
|
||||
// Power object
|
||||
checkPowerObject(%deplObj);
|
||||
|
||||
deployEffect(%deplObj,%item.surfacePt,%item.surfaceNrm,"floor");
|
||||
|
||||
return %deplObj;
|
||||
}
|
||||
|
||||
function DeployedFloor::onDestroyed(%this, %obj, %prevState) {
|
||||
if (%obj.isRemoved)
|
||||
return;
|
||||
%obj.isRemoved = true;
|
||||
Parent::onDestroyed(%this, %obj, %prevState);
|
||||
$TeamDeployedCount[%obj.team, FloorDeployable]--;
|
||||
remDSurface(%obj);
|
||||
%obj.schedule(500, "delete");
|
||||
cascade(%obj);
|
||||
fireBallExplode(%obj,1);
|
||||
}
|
||||
|
||||
function FloorDeployableImage::onMount(%data, %obj, %node) {
|
||||
%obj.hasFloor = true; // set for floorcheck
|
||||
%obj.packSet = 0;
|
||||
%obj.expertSet = 0;
|
||||
displayPowerFreq(%obj);
|
||||
}
|
||||
|
||||
function FloorDeployableImage::onUnmount(%data, %obj, %node) {
|
||||
%obj.hasFloor = "";
|
||||
%obj.packSet = 0;
|
||||
%obj.expertSet = 0;
|
||||
}
|
||||
271
scripts/packs/blastwall.cs
Normal file
271
scripts/packs/blastwall.cs
Normal file
|
|
@ -0,0 +1,271 @@
|
|||
//---------------------------------------------------------
|
||||
// Deployable wall, Code by Parousia
|
||||
//---------------------------------------------------------
|
||||
|
||||
datablock StaticShapeData(DeployedWall) : StaticShapeDamageProfile {
|
||||
className = "wall";
|
||||
shapeFile = "Bmiscf.dts"; // dmiscf.dts, alternate
|
||||
|
||||
maxDamage = 2;
|
||||
destroyedLevel = 2;
|
||||
disabledLevel = 1.5;
|
||||
|
||||
isShielded = true;
|
||||
energyPerDamagePoint = 60;
|
||||
maxEnergy = 100;
|
||||
rechargeRate = 0.25;
|
||||
|
||||
explosion = HandGrenadeExplosion;
|
||||
expDmgRadius = 3.0;
|
||||
expDamage = 0.1;
|
||||
expImpulse = 200.0;
|
||||
|
||||
dynamicType = $TypeMasks::StaticShapeObjectType;
|
||||
deployedObject = true;
|
||||
cmdCategory = "DSupport";
|
||||
cmdIcon = CMDSensorIcon;
|
||||
cmdMiniIconName = "commander/MiniIcons/com_deploymotionsensor";
|
||||
targetNameTag = 'Light Blast Wall';
|
||||
deployAmbientThread = true;
|
||||
debrisShapeName = "debris_generic_small.dts";
|
||||
debris = DeployableDebris;
|
||||
heatSignature = 0;
|
||||
needsPower = true;
|
||||
};
|
||||
|
||||
datablock ShapeBaseImageData(WallDeployableImage) {
|
||||
mass = 1;
|
||||
emap = true;
|
||||
shapeFile = "stackable1s.dts";
|
||||
item = WallDeployable;
|
||||
mountPoint = 1;
|
||||
offset = "0 0 0";
|
||||
deployed = DeployedWall;
|
||||
heatSignature = 0;
|
||||
|
||||
stateName[0] = "Idle";
|
||||
stateTransitionOnTriggerDown[0] = "Activate";
|
||||
|
||||
stateName[1] = "Activate";
|
||||
stateScript[1] = "onActivate";
|
||||
stateTransitionOnTriggerUp[1] = "Idle";
|
||||
|
||||
isLarge = false;
|
||||
maxDepSlope = 360;
|
||||
deploySound = ItemPickupSound;
|
||||
|
||||
minDeployDis = 0;
|
||||
maxDeployDis = 50.0;
|
||||
};
|
||||
|
||||
datablock ItemData(WallDeployable) {
|
||||
className = Pack;
|
||||
catagory = "Deployables";
|
||||
shapeFile = "stackable1s.dts";
|
||||
mass = 1;
|
||||
elasticity = 0.2;
|
||||
friction = 0.6;
|
||||
pickupRadius = 1;
|
||||
rotate = true;
|
||||
image = "WallDeployableImage";
|
||||
pickUpName = "a light blast wall pack";
|
||||
heatSignature = 0;
|
||||
emap = true;
|
||||
};
|
||||
|
||||
function WallDeployableImage::testObjectTooClose(%item) {
|
||||
return "";
|
||||
}
|
||||
|
||||
function WallDeployableImage::testNoTerrainFound(%item) {
|
||||
// don't check this for non-Landspike turret deployables
|
||||
}
|
||||
|
||||
function WallDeployable::onPickup(%this, %obj, %shape, %amount) {
|
||||
// created to prevent console errors
|
||||
}
|
||||
|
||||
function WallDeployableImage::onDeploy(%item, %plyr, %slot) {
|
||||
//Object
|
||||
%className = "StaticShape";
|
||||
|
||||
%grounded = 0;
|
||||
if (%item.surface.getClassName() $= TerrainBlock)
|
||||
%grounded = 1;
|
||||
|
||||
%playerVector = vectorNormalize(-1 * getWord(%plyr.getEyeVector(),1) SPC getWord(%plyr.getEyeVector(),0) SPC "0");
|
||||
|
||||
if (%item.surfaceinher == 0) {
|
||||
if (vAbs(floorVec(%item.surfaceNrm,100)) $= "0 0 1")
|
||||
%item.surfaceNrm2 = %playerVector;
|
||||
else
|
||||
%item.surfaceNrm2 = vectorNormalize(vectorCross(%item.surfaceNrm,"0 0 1"));
|
||||
}
|
||||
|
||||
%scale = "0.5 8 40"; // Search range for total blast wall size.
|
||||
|
||||
%mCenter = "0 0 -0.5";
|
||||
%pad = pad(%item.surfacePt SPC %item.surfaceNrm SPC %item.surfaceNrm2,%scale,%mCenter);
|
||||
%scale = getWords(%pad,0,2);
|
||||
|
||||
%item.surfacePt = getWords(%pad,3,5);
|
||||
%rot = getWords(%pad,6,9);
|
||||
%offset = %plyr.packSet - 1;
|
||||
if (%plyr.packSet == 3) {
|
||||
%double = 1;
|
||||
%offset = 1;
|
||||
}
|
||||
|
||||
%scale = vectorAdd(%scale,vectorScale("1.01 1.01" SPC %double,mAbs(%offset)));
|
||||
|
||||
%pup = mCeil(getWord(%scale,0)/4); //4 = Avarage blast wall height.
|
||||
%pside = mCeil(getWord(%scale,1)/4); //4 = Avarage blast wall width.
|
||||
%upiece = getWord(%scale,0)/%pup;
|
||||
%spiece = getWord(%scale,1)/%pside;
|
||||
|
||||
%scale = vectorMultiply(%scale,1/4 SPC 1/3 SPC 2);
|
||||
%dir = VectorNormalize(vectorSub(%item.surfacePt,%plyr.getposition()));
|
||||
%adjust = vectorNormalize(vectorProject(%dir,vectorCross(%item.surfaceNrm,%item.surfaceNrm2)));
|
||||
// %adjust = vectorNormalize(vectorCross(%item.surfaceNrm,%item.surfaceNrm2));
|
||||
|
||||
if (%plyr.packSet == 3)
|
||||
%offset = Lev(vectorCouple(%dir,vectorCross(%item.surfaceNrm,%item.surfaceNrm2)));
|
||||
|
||||
%adjust = vectorScale(%adjust,-0.5 * %offset);
|
||||
|
||||
if ($Host::ExpertMode == 1 && %plyr.expertSet == 1) {
|
||||
for (%x = 0;%x < %pup;%x++){
|
||||
for (%y = 0;%y < %pside;%y++){
|
||||
%scale = %upiece SPC %spiece SPC 0.5 + %double;
|
||||
%scale = vectorMultiply(%scale,1/4 SPC 1/3 SPC 2);
|
||||
%deplObj = new (%className)() {
|
||||
dataBlock = %item.deployed;
|
||||
scale = %scale;
|
||||
};
|
||||
%up = vectorScale(%item.surfaceNrm,%upiece * (%x - (%pup / 2) + 0.5));
|
||||
%side = vectorScale(%item.surfaceNrm2,%spiece * (%y - (%pside / 2) + 0.5));
|
||||
%tadjust = vectorAdd(%up,vectorAdd(%side,%adjust));
|
||||
%deplObj.setTransform(vectorAdd(%item.surfacePt,%tadjust) SPC %rot);
|
||||
|
||||
// [[Settings]]:
|
||||
|
||||
%deplObj.grounded = %grounded;
|
||||
%deplObj.Needsfit = 1;
|
||||
addDSurface(%item.surface,%deplObj);
|
||||
|
||||
// [Normal Stuff]]:
|
||||
|
||||
// if(%deplObj.getDatablock().rechargeRate)
|
||||
// %deplObj.setRechargeRate(%deplObj.getDatablock().rechargeRate);
|
||||
|
||||
// set team, owner, and handle
|
||||
%deplObj.team = %plyr.client.Team;
|
||||
%deplObj.setOwner(%plyr);
|
||||
|
||||
// set power frequency
|
||||
%deplObj.powerFreq = %plyr.powerFreq;
|
||||
|
||||
// set the sensor group if it needs one
|
||||
if(%deplObj.getTarget() != -1)
|
||||
setTargetSensorGroup(%deplObj.getTarget(), %plyr.client.team);
|
||||
|
||||
// place the deployable in the MissionCleanup/Deployables group (AI reasons)
|
||||
addToDeployGroup(%deplObj);
|
||||
|
||||
// let the AI know as well...
|
||||
AIDeployObject(%plyr.client, %deplObj);
|
||||
|
||||
// play the deploy sound
|
||||
serverPlay3D(%item.deploySound, %deplObj.getTransform());
|
||||
|
||||
// increment the team count for this deployed object
|
||||
$TeamDeployedCount[%plyr.team, %item.item]++;
|
||||
|
||||
%deplObj.deploy();
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
%deplObj = new (%className)() {
|
||||
dataBlock = %item.deployed;
|
||||
scale = %scale;
|
||||
};
|
||||
|
||||
%deplObj.setTransform(vectorAdd(%item.surfacePt,%adjust) SPC %rot);
|
||||
|
||||
// [[Settings]]:
|
||||
|
||||
%deplObj.grounded = %grounded;
|
||||
%deplObj.Needsfit = 1;
|
||||
addDSurface(%item.surface,%deplObj);
|
||||
|
||||
// [Normal Stuff]]:
|
||||
|
||||
// if(%deplObj.getDatablock().rechargeRate)
|
||||
// %deplObj.setRechargeRate(%deplObj.getDatablock().rechargeRate);
|
||||
|
||||
// set team, owner, and handle
|
||||
%deplObj.team = %plyr.client.Team;
|
||||
%deplObj.setOwner(%plyr);
|
||||
|
||||
// set power frequency
|
||||
%deplObj.powerFreq = %plyr.powerFreq;
|
||||
|
||||
// set the sensor group if it needs one
|
||||
if(%deplObj.getTarget() != -1)
|
||||
setTargetSensorGroup(%deplObj.getTarget(), %plyr.client.team);
|
||||
|
||||
// place the deployable in the MissionCleanup/Deployables group (AI reasons)
|
||||
addToDeployGroup(%deplObj);
|
||||
|
||||
//let the AI know as well...
|
||||
AIDeployObject(%plyr.client, %deplObj);
|
||||
|
||||
// play the deploy sound
|
||||
serverPlay3D(%item.deploySound, %deplObj.getTransform());
|
||||
|
||||
// increment the team count for this deployed object
|
||||
$TeamDeployedCount[%plyr.team, %item.item]++;
|
||||
|
||||
%deplObj.deploy();
|
||||
}
|
||||
|
||||
// Power object
|
||||
checkPowerObject(%deplObj);
|
||||
|
||||
deployEffect(%deplObj,%item.surfacePt,%item.surfaceNrm,"pad");
|
||||
|
||||
return %deplObj;
|
||||
}
|
||||
|
||||
function DeployedWall::onDestroyed(%this, %obj, %prevState) {
|
||||
if (%obj.isRemoved)
|
||||
return;
|
||||
%obj.isRemoved = true;
|
||||
Parent::onDestroyed(%this, %obj, %prevState);
|
||||
$TeamDeployedCount[%obj.team, WallDeployable]--;
|
||||
remDSurface(%obj);
|
||||
%obj.schedule(500, "delete");
|
||||
cascade(%obj);
|
||||
fireBallExplode(%obj,1);
|
||||
}
|
||||
|
||||
function WallDeployableImage::onMount(%data, %obj, %node) {
|
||||
%obj.hasBlast = true; // set for blastcheck
|
||||
%obj.packSet = 0;
|
||||
%obj.expertSet = 0;
|
||||
displayPowerFreq(%obj);
|
||||
}
|
||||
|
||||
function WallDeployableImage::onUnmount(%data, %obj, %node) {
|
||||
%obj.hasBlast = "";
|
||||
%obj.packSet = 0;
|
||||
%obj.expertSet = 0;
|
||||
}
|
||||
|
||||
function doorfunction(%player,%door)
|
||||
{
|
||||
%vec = VectorSub(%door,%player);
|
||||
%dir = VectorNormalize(%vec);
|
||||
%nrm = topVec(VirVec(%door,%dir));
|
||||
}
|
||||
225
scripts/packs/blastwwall.cs
Normal file
225
scripts/packs/blastwwall.cs
Normal file
|
|
@ -0,0 +1,225 @@
|
|||
//---------------------------------------------------------
|
||||
// Deployable wall, Code by Parousia
|
||||
//---------------------------------------------------------
|
||||
|
||||
datablock StaticShapeData(DeployedwWall) : StaticShapeDamageProfile {
|
||||
className = "wwall";
|
||||
shapeFile = "smiscf.dts";
|
||||
|
||||
maxDamage = 0.5;
|
||||
destroyedLevel = 0.5;
|
||||
disabledLevel = 0.3;
|
||||
|
||||
isShielded = true;
|
||||
energyPerDamagePoint = 240;
|
||||
maxEnergy = 50;
|
||||
rechargeRate = 0.25;
|
||||
|
||||
explosion = HandGrenadeExplosion;
|
||||
expDmgRadius = 3.0;
|
||||
expDamage = 0.1;
|
||||
expImpulse = 200.0;
|
||||
|
||||
dynamicType = $TypeMasks::StaticShapeObjectType;
|
||||
deployedObject = true;
|
||||
cmdCategory = "DSupport";
|
||||
cmdIcon = CMDSensorIcon;
|
||||
cmdMiniIconName = "commander/MiniIcons/com_deploymotionsensor";
|
||||
targetNameTag = 'Light Walk Way';
|
||||
deployAmbientThread = true;
|
||||
debrisShapeName = "debris_generic_small.dts";
|
||||
debris = DeployableDebris;
|
||||
heatSignature = 0;
|
||||
needsPower = true;
|
||||
};
|
||||
|
||||
datablock ShapeBaseImageData(wWallDeployableImage) {
|
||||
mass = 1;
|
||||
emap = true;
|
||||
shapeFile = "stackable1s.dts";
|
||||
item = wwallDeployable;
|
||||
mountPoint = 1;
|
||||
offset = "0 0 0";
|
||||
deployed = DeployedwWall;
|
||||
heatSignature = 0;
|
||||
|
||||
stateName[0] = "Idle";
|
||||
stateTransitionOnTriggerDown[0] = "Activate";
|
||||
|
||||
stateName[1] = "Activate";
|
||||
stateScript[1] = "onActivate";
|
||||
stateTransitionOnTriggerUp[1] = "Idle";
|
||||
|
||||
isLarge = false;
|
||||
maxDepSlope = 360;
|
||||
deploySound = ItemPickupSound;
|
||||
|
||||
minDeployDis = 0;
|
||||
maxDeployDis = 50.0;
|
||||
};
|
||||
|
||||
datablock ItemData(wwallDeployable) {
|
||||
className = Pack;
|
||||
catagory = "Deployables";
|
||||
shapeFile = "stackable1s.dts";
|
||||
mass = 1;
|
||||
elasticity = 0.2;
|
||||
friction = 0.6;
|
||||
pickupRadius = 1;
|
||||
rotate = true;
|
||||
image = "wWallDeployableImage";
|
||||
pickUpName = "a light walkway pack";
|
||||
heatSignature = 0;
|
||||
emap = true;
|
||||
};
|
||||
|
||||
function wWallDeployableImage::testObjectTooClose(%item) {
|
||||
return "";
|
||||
}
|
||||
|
||||
function wWallDeployableImage::testNoTerrainFound(%item) {
|
||||
// don't check this for non-Landspike turret deployables
|
||||
}
|
||||
|
||||
function wwallDeployable::onPickup(%this, %obj, %shape, %amount) {
|
||||
// created to prevent console errors
|
||||
}
|
||||
|
||||
function wWallDeployableImage::onDeploy(%item, %plyr, %slot) {
|
||||
//Object
|
||||
%className = "StaticShape";
|
||||
|
||||
%grounded = 0;
|
||||
if (%item.surface.getClassName() $= TerrainBlock)
|
||||
%grounded = 1;
|
||||
|
||||
%playerVector = vectorNormalize(-1 * getWord(%plyr.getEyeVector(),1) SPC getWord(%plyr.getEyeVector(),0) SPC "0");
|
||||
|
||||
%rot = intRot("1 0 0 0",%playerVector);
|
||||
|
||||
%scale ="5 5 0.5";
|
||||
|
||||
if ($Host::ExpertMode == 1) {
|
||||
if (%plyr.expertSet == 2)
|
||||
%scale = getWord(%scale,0) * 2 SPC getWords(%scale,1,2);
|
||||
if (%plyr.expertSet == 3)
|
||||
%scale = getWord(%scale,0) SPC getWord(%scale,1) * 2 SPC getWord(%scale,2);
|
||||
}
|
||||
|
||||
%surfaceAdjust = 1;
|
||||
// Do we link with another shape?
|
||||
if (%item.surface.getClassName() $= "StaticShape") {
|
||||
%surfaceAdjust = 0;
|
||||
// [[Most]] Get the relative x y location from the "pure" informtation.
|
||||
%link = sidelink(%item.surface,%item.surfaceNrm,%item.surfacePt,%scale,"0 0 -0.5");
|
||||
%location = getWords(%link,0,2);
|
||||
%side = getWords(%link,3,5);
|
||||
%dirside = getWords(%link,6,8);
|
||||
// [[Most]] Set the rotation to match the surfaceNrm and match the side.
|
||||
// The power of the full rotation system.. ;)
|
||||
%rot = fullRot(%item.surfaceNrm,%dirside);
|
||||
// [[Most]] Adjust the location to match the scale.
|
||||
%adjust = vectorScale(%item.surfaceNrm,getWord(%scale,2));
|
||||
%item.surfacePt = vectorSub(%location, %adjust);
|
||||
}
|
||||
|
||||
// If we do not link with another shape
|
||||
if(%surfaceAdjust) {
|
||||
%item.surfacePt = vectorSub(%item.surfacePt,"0 0" SPC getWord(%scale,2) - 1); // Rise 1 meter above surface
|
||||
}
|
||||
|
||||
%scale = vectorMultiply(%scale,1/4 SPC 1/3 SPC 2);
|
||||
|
||||
%deplObj = new (%className)() {
|
||||
dataBlock = %item.deployed;
|
||||
scale = %scale;
|
||||
};
|
||||
|
||||
%deplObj.setTransform(%item.surfacePt SPC %rot);
|
||||
|
||||
%axis = vectorCross(virvec(%item.surface,%item.surfaceNrm),virvec(%item.surface,%side));
|
||||
%axis = vectorScale(%axis,-1);
|
||||
%vec1 = vectorScale(virvec(%item.surface,%side),0.5);
|
||||
%vec2 = vectorAdd(vectorScale(virvec(%item.surface,%item.surfaceNrm),-0.5),"0 0 -0.5");
|
||||
|
||||
deployEffect(%deplObj,%location,%side,"walk");
|
||||
%angle = getWord($packSetting["walk",%plyr.packSet],0)/180*$Pi;
|
||||
%deplObj.setTransform(remoterotate(%deplObj,%axis SPC %angle,%item.surface,vectorAdd(%vec2,%vec1)));
|
||||
|
||||
if ($Host::ExpertMode == 1 && %plyr.expertSet == 1) {
|
||||
%v = getRandom()*0.02 SPC getRandom()*0.02 SPC getRandom()*0.02;
|
||||
%deplObj.setTransform(vectorAdd(pos(%deplObj),%v) SPC rot(%deplObj));
|
||||
}
|
||||
|
||||
//////////////////////////Apply settings//////////////////////////////
|
||||
|
||||
// [[Location]]:
|
||||
|
||||
// exact:
|
||||
|
||||
// misc info
|
||||
addDSurface(%item.surface,%deplObj);
|
||||
|
||||
// [[Settings]]:
|
||||
|
||||
%deplObj.grounded = %grounded;
|
||||
%deplObj.needsFit = 1;
|
||||
|
||||
// [[Normal Stuff]]:
|
||||
|
||||
// if(%deplObj.getDatablock().rechargeRate)
|
||||
// %deplObj.setRechargeRate(%deplObj.getDatablock().rechargeRate);
|
||||
|
||||
// set team, owner, and handle
|
||||
%deplObj.team = %plyr.client.team;
|
||||
%deplObj.setOwner(%plyr);
|
||||
|
||||
// set power frequency
|
||||
%deplObj.powerFreq = %plyr.powerFreq;
|
||||
|
||||
// set the sensor group if it needs one
|
||||
if (%deplObj.getTarget() != -1)
|
||||
setTargetSensorGroup(%deplObj.getTarget(), %plyr.client.team);
|
||||
|
||||
// place the deployable in the MissionCleanup/Deployables group (AI reasons)
|
||||
addToDeployGroup(%deplObj);
|
||||
|
||||
//let the AI know as well...
|
||||
AIDeployObject(%plyr.client, %deplObj);
|
||||
|
||||
// play the deploy sound
|
||||
serverPlay3D(%item.deploySound, %deplObj.getTransform());
|
||||
|
||||
// increment the team count for this deployed object
|
||||
$TeamDeployedCount[%plyr.team, %item.item]++;
|
||||
|
||||
%deplObj.deploy();
|
||||
|
||||
// Power object
|
||||
checkPowerObject(%deplObj);
|
||||
|
||||
return %deplObj;
|
||||
}
|
||||
|
||||
function DeployedwWall::onDestroyed(%this, %obj, %prevState) {
|
||||
if (%obj.isRemoved)
|
||||
return;
|
||||
%obj.isRemoved = true;
|
||||
Parent::onDestroyed(%this, %obj, %prevState);
|
||||
$TeamDeployedCount[%obj.team, wwallDeployable]--;
|
||||
remDSurface(%obj);
|
||||
%obj.schedule(500, "delete");
|
||||
cascade(%obj);
|
||||
fireBallExplode(%obj,1);
|
||||
}
|
||||
|
||||
function wWallDeployableImage::onMount(%data, %obj, %node) {
|
||||
%obj.hasWalk = true; // set for wwallcheck
|
||||
%obj.packSet = 0;
|
||||
displayPowerFreq(%obj);
|
||||
}
|
||||
|
||||
function wWallDeployableImage::onUnmount(%data, %obj, %node) {
|
||||
%obj.packSet = 0;
|
||||
%obj.hasWalk = "";
|
||||
}
|
||||
250
scripts/packs/cratepack.cs
Normal file
250
scripts/packs/cratepack.cs
Normal file
|
|
@ -0,0 +1,250 @@
|
|||
//---------------------------------------------------------
|
||||
// Deployable Crates
|
||||
//---------------------------------------------------------
|
||||
|
||||
datablock StaticShapeData(DeployedCrate) : StaticShapeDamageProfile {
|
||||
className = "crate";
|
||||
shapeFile = "stackable3s.dts";
|
||||
|
||||
maxDamage = 0.5;
|
||||
destroyedLevel = 0.5;
|
||||
disabledLevel = 0.3;
|
||||
|
||||
explosion = HandGrenadeExplosion;
|
||||
expDmgRadius = 1.0;
|
||||
expDamage = 0.05;
|
||||
expImpulse = 200;
|
||||
|
||||
dynamicType = $TypeMasks::StaticShapeObjectType;
|
||||
deployedObject = true;
|
||||
cmdCategory = "DSupport";
|
||||
cmdIcon = CMDSensorIcon;
|
||||
cmdMiniIconName = "commander/MiniIcons/com_deploymotionsensor";
|
||||
targetNameTag = 'Deployed Crate';
|
||||
deployAmbientThread = true;
|
||||
debrisShapeName = "debris_generic_small.dts";
|
||||
debris = DeployableDebris;
|
||||
heatSignature = 0;
|
||||
needsPower = true;
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedCrate0) : DeployedCrate {
|
||||
shapeFile = "stackable1s.dts";
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedCrate1) : DeployedCrate {
|
||||
shapeFile = "stackable1m.dts";
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedCrate2) : DeployedCrate {
|
||||
shapeFile = "stackable1l.dts";
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedCrate3) : DeployedCrate {
|
||||
shapeFile = "stackable2s.dts";
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedCrate4) : DeployedCrate {
|
||||
shapeFile = "stackable2m.dts";
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedCrate5) : DeployedCrate {
|
||||
shapeFile = "stackable2l.dts";
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedCrate6) : DeployedCrate {
|
||||
shapeFile = "stackable3s.dts";
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedCrate7) : DeployedCrate {
|
||||
shapeFile = "stackable3m.dts";
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedCrate8) : DeployedCrate {
|
||||
shapeFile = "stackable3l.dts";
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedCrate9) : DeployedCrate {
|
||||
shapeFile = "stackable4m.dts";
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedCrate10) : DeployedCrate {
|
||||
shapeFile = "stackable4l.dts";
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedCrate11) : DeployedCrate {
|
||||
shapeFile = "stackable5m.dts";
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedCrate12) : DeployedCrate {
|
||||
shapeFile = "stackable5l.dts";
|
||||
};
|
||||
|
||||
datablock ShapeBaseImageData(CrateDeployableImage) {
|
||||
mass = 1;
|
||||
emap = true;
|
||||
shapeFile = "stackable1s.dts";
|
||||
item = CrateDeployable;
|
||||
mountPoint = 1;
|
||||
offset = "0 0 0";
|
||||
deployed = DeployedCrate;
|
||||
heatSignature = 0;
|
||||
|
||||
stateName[0] = "Idle";
|
||||
stateTransitionOnTriggerDown[0] = "Activate";
|
||||
|
||||
stateName[1] = "Activate";
|
||||
stateScript[1] = "onActivate";
|
||||
stateTransitionOnTriggerUp[1] = "Idle";
|
||||
|
||||
isLarge = true;
|
||||
maxDepSlope = 360;
|
||||
deploySound = ItemPickupSound;
|
||||
|
||||
minDeployDis = 0.5;
|
||||
maxDeployDis = 50.0;
|
||||
};
|
||||
|
||||
datablock ItemData(CrateDeployable) {
|
||||
className = Pack;
|
||||
catagory = "Deployables";
|
||||
shapeFile = "stackable1s.dts";
|
||||
mass = 1;
|
||||
elasticity = 0.2;
|
||||
friction = 0.6;
|
||||
pickupRadius = 1;
|
||||
rotate = true;
|
||||
image = "CrateDeployableImage";
|
||||
pickUpName = "a crate pack";
|
||||
heatSignature = 0;
|
||||
emap = true;
|
||||
};
|
||||
|
||||
function CrateDeployableImage::testObjectTooClose(%item) {
|
||||
return "";
|
||||
}
|
||||
|
||||
function CrateDeployableImage::testNoTerrainFound(%item) {
|
||||
// don't check this for non-Landspike turret deployables
|
||||
}
|
||||
|
||||
function CrateDeployable::onPickup(%this, %obj, %shape, %amount) {
|
||||
// created to prevent console errors
|
||||
}
|
||||
|
||||
function CrateDeployableImage::onDeploy(%item, %plyr, %slot) {
|
||||
%className = "StaticShape";
|
||||
|
||||
%playerVector = vectorNormalize(-1 * getWord(%plyr.getEyeVector(),1) SPC getWord(%plyr.getEyeVector(),0) SPC "0");
|
||||
%item.surfaceNrm2 = %playerVector;
|
||||
%rot = fullRot(%item.surfaceNrm,%item.surfaceNrm2);
|
||||
|
||||
%deplObj = new (%className)() {
|
||||
dataBlock = %item.deployed @ %plyr.packSet;
|
||||
};
|
||||
|
||||
// set orientation
|
||||
%deplObj.setTransform(%item.surfacePt SPC %rot);
|
||||
|
||||
// set the recharge rate right away
|
||||
if (%deplObj.getDatablock().rechargeRate)
|
||||
%deplObj.setRechargeRate(%deplObj.getDatablock().rechargeRate);
|
||||
|
||||
// set team, owner, and handle
|
||||
%deplObj.team = %plyr.client.Team;
|
||||
%deplObj.setOwner(%plyr);
|
||||
|
||||
// place the deployable in the MissionCleanup/Deployables group (AI reasons)
|
||||
addToDeployGroup(%deplObj);
|
||||
|
||||
//let the AI know as well...
|
||||
AIDeployObject(%plyr.client, %deplObj);
|
||||
|
||||
// play the deploy sound
|
||||
serverPlay3D(%item.deploySound, %deplObj.getTransform());
|
||||
|
||||
// increment the team count for this deployed object
|
||||
$TeamDeployedCount[%plyr.team, %item.item]++;
|
||||
|
||||
addDSurface(%item.surface,%deplObj);
|
||||
|
||||
// take the deployable off the player's back and out of inventory
|
||||
if(!%plyr.client.isAdmin) {
|
||||
%plyr.unmountImage(%slot);
|
||||
%plyr.decInventory(%item.item, 1);
|
||||
}
|
||||
|
||||
return %deplObj;
|
||||
}
|
||||
|
||||
function DeployedCrate::onDestroyed(%this,%obj,%prevState) {
|
||||
if (%obj.isRemoved)
|
||||
return;
|
||||
%obj.isRemoved = true;
|
||||
Parent::onDestroyed(%this,%obj,%prevState);
|
||||
$TeamDeployedCount[%obj.team, CrateDeployable]--;
|
||||
remDSurface(%obj);
|
||||
%obj.schedule(500, "delete");
|
||||
}
|
||||
|
||||
function CrateDeployableImage::onMount(%data, %obj, %node) {
|
||||
%obj.hasCrate = true; // set for cratecheck
|
||||
%obj.packSet = 0;
|
||||
}
|
||||
|
||||
function CrateDeployableImage::onUnmount(%data, %obj, %node) {
|
||||
%obj.hasCrate = "";
|
||||
%obj.packSet = 0;
|
||||
}
|
||||
|
||||
function DeployedCrate0::onDestroyed(%this,%obj,%prevState) {
|
||||
DeployedCrate::onDestroyed(%this,%obj,%prevState);
|
||||
}
|
||||
|
||||
function DeployedCrate1::onDestroyed(%this,%obj,%prevState) {
|
||||
DeployedCrate::onDestroyed(%this,%obj,%prevState);
|
||||
}
|
||||
|
||||
function DeployedCrate2::onDestroyed(%this,%obj,%prevState) {
|
||||
DeployedCrate::onDestroyed(%this,%obj,%prevState);
|
||||
}
|
||||
|
||||
function DeployedCrate3::onDestroyed(%this,%obj,%prevState) {
|
||||
DeployedCrate::onDestroyed(%this,%obj,%prevState);
|
||||
}
|
||||
|
||||
function DeployedCrate4::onDestroyed(%this,%obj,%prevState) {
|
||||
DeployedCrate::onDestroyed(%this,%obj,%prevState);
|
||||
}
|
||||
|
||||
function DeployedCrate5::onDestroyed(%this,%obj,%prevState) {
|
||||
DeployedCrate::onDestroyed(%this,%obj,%prevState);
|
||||
}
|
||||
|
||||
function DeployedCrate6::onDestroyed(%this,%obj,%prevState) {
|
||||
DeployedCrate::onDestroyed(%this,%obj,%prevState);
|
||||
}
|
||||
|
||||
function DeployedCrate7::onDestroyed(%this,%obj,%prevState) {
|
||||
DeployedCrate::onDestroyed(%this,%obj,%prevState);
|
||||
}
|
||||
|
||||
function DeployedCrate8::onDestroyed(%this,%obj,%prevState) {
|
||||
DeployedCrate::onDestroyed(%this,%obj,%prevState);
|
||||
}
|
||||
|
||||
function DeployedCrate9::onDestroyed(%this,%obj,%prevState) {
|
||||
DeployedCrate::onDestroyed(%this,%obj,%prevState);
|
||||
}
|
||||
|
||||
function DeployedCrate10::onDestroyed(%this,%obj,%prevState) {
|
||||
DeployedCrate::onDestroyed(%this,%obj,%prevState);
|
||||
}
|
||||
|
||||
function DeployedCrate11::onDestroyed(%this,%obj,%prevState) {
|
||||
DeployedCrate::onDestroyed(%this,%obj,%prevState);
|
||||
}
|
||||
|
||||
function DeployedCrate12::onDestroyed(%this,%obj,%prevState) {
|
||||
DeployedCrate::onDestroyed(%this,%obj,%prevState);
|
||||
}
|
||||
51
scripts/packs/deconExamples.cs
Normal file
51
scripts/packs/deconExamples.cs
Normal file
|
|
@ -0,0 +1,51 @@
|
|||
//------------------------------------------------
|
||||
// Examples of item specific disassemble.
|
||||
//================================================
|
||||
// ----------------
|
||||
// 1. ONE
|
||||
// ================
|
||||
function TelePadDeployedBase::disassemble(%data, %plyr, %hTgt)
|
||||
{
|
||||
%teleteam = %hTgt.team;
|
||||
if(%obj.Hacked) // is it hacked currently?
|
||||
{
|
||||
%teleteam = %hTgt.OldTeam;
|
||||
echo("hacked!");
|
||||
}
|
||||
|
||||
// dising a telepad makes it yours, remove from the other teams list
|
||||
if($TeamDeployedCount[%teleteam, TelePadPack] > 0) // this wasnt the last
|
||||
{
|
||||
if($firstPad[%teleteam] == %hTgt) // the first was disassembled
|
||||
{
|
||||
echo("first pad disassembled");
|
||||
$firstPad[%teleteam] = %ohTgtbj.nextPad; // make the second one the first
|
||||
%hTgt.prevPad = -1;
|
||||
%hTgt.nextPad = %obj;
|
||||
}
|
||||
else
|
||||
{
|
||||
%lastPad = $firstPad[%teleteam];
|
||||
%hTgt.prevPad.nextPad = %hTgt.nextPad;
|
||||
%hTgt.nextPad.prevPad = %hTgt.prevPad;
|
||||
}
|
||||
|
||||
}
|
||||
else // last one
|
||||
{
|
||||
$firstPad[%teleteam] = ""; // remove it
|
||||
}
|
||||
|
||||
%hTgt.shield.delete();
|
||||
}
|
||||
|
||||
// --------------
|
||||
// 2. Two
|
||||
// ==============
|
||||
|
||||
function MobileBaseVehicle::disassemble(%data, %plyr, %hTgt)
|
||||
{
|
||||
%mpbpos = %hTgt.gettransform();
|
||||
%hTgt.delete();
|
||||
teleporteffect(posfromtransform(%mpbpos));
|
||||
}
|
||||
382
scripts/packs/decorationpack.cs
Normal file
382
scripts/packs/decorationpack.cs
Normal file
|
|
@ -0,0 +1,382 @@
|
|||
//---------------------------------------------------------
|
||||
// Deployable Decoration
|
||||
//---------------------------------------------------------
|
||||
|
||||
datablock StaticShapeData(DeployedDecoration) : StaticShapeDamageProfile {
|
||||
className = "decoration";
|
||||
shapeFile = "banner_unity.dts";
|
||||
|
||||
maxDamage = 0.5;
|
||||
destroyedLevel = 0.5;
|
||||
disabledLevel = 0.3;
|
||||
|
||||
explosion = HandGrenadeExplosion;
|
||||
expDmgRadius = 1.0;
|
||||
expDamage = 0.05;
|
||||
expImpulse = 200;
|
||||
|
||||
dynamicType = $TypeMasks::StaticShapeObjectType;
|
||||
deployedObject = true;
|
||||
cmdCategory = "DSupport";
|
||||
cmdIcon = CMDSensorIcon;
|
||||
cmdMiniIconName = "commander/MiniIcons/com_deploymotionsensor";
|
||||
targetNameTag = 'Deployed Decoration';
|
||||
deployAmbientThread = true;
|
||||
debrisShapeName = "debris_generic_small.dts";
|
||||
debris = DeployableDebris;
|
||||
heatSignature = 0;
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedDecoration0) : DeployedDecoration {
|
||||
shapeFile = "banner_unity.dts";
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedDecoration1) : DeployedDecoration {
|
||||
shapeFile = "banner_strength.dts";
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedDecoration2) : DeployedDecoration {
|
||||
shapeFile = "banner_honor.dts";
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedDecoration3) : DeployedDecoration {
|
||||
shapeFile = "light_male_dead.dts";
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedDecoration4) : DeployedDecoration {
|
||||
shapeFile = "medium_male_dead.dts";
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedDecoration5) : DeployedDecoration {
|
||||
shapeFile = "heavy_male_dead.dts";
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedDecoration6) : DeployedDecoration {
|
||||
shapeFile = "statue_base.dts";
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedDecoration7) : DeployedDecoration {
|
||||
shapeFile = "statue_lmale.dts";
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedDecoration8) : DeployedDecoration {
|
||||
shapeFile = "statue_lfemale.dts";
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedDecoration9) : DeployedDecoration {
|
||||
shapeFile = "statue_hmale.dts";
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedDecoration10) : DeployedDecoration {
|
||||
shapeFile = "vehicle_grav_tank_wreck.dts";
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedDecoration11) : DeployedDecoration {
|
||||
shapeFile = "vehicle_air_scout_wreck.dts";
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedDecoration12) : DeployedDecoration {
|
||||
shapeFile = "billboard_1.dts";
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedDecoration13) : DeployedDecoration {
|
||||
shapeFile = "billboard_2.dts";
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedDecoration14) : DeployedDecoration {
|
||||
shapeFile = "billboard_3.dts";
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedDecoration15) : DeployedDecoration {
|
||||
shapeFile = "billboard_4.dts";
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedDecoration16) : DeployedDecoration {
|
||||
shapeFile = "goal_panel.dts";
|
||||
};
|
||||
|
||||
datablock ShapeBaseImageData(DecorationDeployableImage) {
|
||||
mass = 1;
|
||||
emap = true;
|
||||
shapeFile = "statue_lfemale.dts"; // "stackable1s.dts";
|
||||
item = DecorationDeployable;
|
||||
mountPoint = 1;
|
||||
offset = "0 -0.6 -1.9";
|
||||
rotation = "0 0.1 1 180";
|
||||
deployed = DeployedDecoration;
|
||||
heatSignature = 0;
|
||||
|
||||
stateName[0] = "Idle";
|
||||
stateTransitionOnTriggerDown[0] = "Activate";
|
||||
|
||||
stateName[1] = "Activate";
|
||||
stateScript[1] = "onActivate";
|
||||
stateTransitionOnTriggerUp[1] = "Idle";
|
||||
|
||||
isLarge = true;
|
||||
maxDepSlope = 360;
|
||||
deploySound = ItemPickupSound;
|
||||
|
||||
minDeployDis = 0.5;
|
||||
maxDeployDis = 50.0;
|
||||
};
|
||||
|
||||
datablock ItemData(DecorationDeployable) {
|
||||
className = Pack;
|
||||
catagory = "Deployables";
|
||||
shapeFile = "stackable1s.dts";
|
||||
mass = 1;
|
||||
elasticity = 0.2;
|
||||
friction = 0.6;
|
||||
pickupRadius = 1;
|
||||
rotate = true;
|
||||
image = "DecorationDeployableImage";
|
||||
pickUpName = "a decoration pack";
|
||||
heatSignature = 0;
|
||||
emap = true;
|
||||
};
|
||||
|
||||
function DecorationDeployableImage::testObjectTooClose(%item) {
|
||||
return "";
|
||||
}
|
||||
|
||||
function DecorationDeployableImage::testNoTerrainFound(%item) {
|
||||
// don't check this for non-Landspike turret deployables
|
||||
}
|
||||
|
||||
function DecorationDeployable::onPickup(%this, %obj, %shape, %amount) {
|
||||
// created to prevent console errors
|
||||
}
|
||||
|
||||
function DecorationDeployableImage::onDeploy(%item, %plyr, %slot) {
|
||||
%className = "StaticShape";
|
||||
|
||||
%playerVector = vectorNormalize(-1 * getWord(%plyr.getEyeVector(),1) SPC getWord(%plyr.getEyeVector(),0) SPC "0");
|
||||
|
||||
if (vAbs(floorVec(%item.surfaceNrm,100)) $= "0 0 1") {
|
||||
if (%plyr.packSet == 3 || %plyr.packSet == 5)
|
||||
%item.surfaceNrm2 = vectorScale(%playerVector,-1);
|
||||
else
|
||||
%item.surfaceNrm2 = %playerVector;
|
||||
}
|
||||
else {
|
||||
if (%plyr.packSet < 3)
|
||||
%item.surfaceNrm2 = vectorNormalize(vectorCross(%item.surfaceNrm,"0 0 1"));
|
||||
else {
|
||||
%item.surfaceNrm2 = %playerVector;
|
||||
if (%plyr.packSet == 3 || %plyr.packSet == 5)
|
||||
%item.surfaceNrm2 = vectorScale(%item.surfaceNrm2,-1);
|
||||
}
|
||||
}
|
||||
if (%item.surface.needsFit == 1) {
|
||||
if (%plyr.packSet > 5 && %plyr.packSet < 10 && %item.surface.getDataBlock().getName() $= "DeployedDecoration6") {
|
||||
%item.surfaceNrm2 = vectorCross(%item.surfaceNrm,realVec(%item.surface,"0 -1 0"));
|
||||
}
|
||||
}
|
||||
%item.surfaceNrm3 = vectorCross(%item.surfaceNrm,%item.surfaceNrm2);
|
||||
|
||||
|
||||
%rot = fullRot(%item.surfaceNrm,%item.surfaceNrm2);
|
||||
|
||||
%deplObj = new (%className)() {
|
||||
dataBlock = %item.deployed @ %plyr.packSet;
|
||||
};
|
||||
|
||||
if (%plyr.packSet < 3) {
|
||||
%surfacePt2 = %item.surfacePt;
|
||||
%rot2 = %rot;
|
||||
%item.surfaceNrm2 = vectorScale(%item.surfaceNrm2,-1);
|
||||
%item.surfacePt = vectorAdd(%item.surfacePt,vectorScale(%item.surfaceNrm3,2.80));
|
||||
%item.surfacePt = vectorAdd(%item.surfacePt,vectorScale(%item.surfaceNrm,0.25));
|
||||
%rot = rotAdd(%rot,"1 0 0" SPC $Pi / 2);
|
||||
%rot = rotAdd(%rot,"0 1 0" SPC $Pi);
|
||||
%deplObj.lTarget = new StaticShape () {
|
||||
datablock = DeployedLTarget;
|
||||
scale = 2.5/4 SPC 5/3 SPC 0.15 * 2;
|
||||
};
|
||||
%deplObj.lTarget.setTransform(%surfacePt2 SPC %rot2);
|
||||
%deplObj.lTarget.lMain = %deplObj;
|
||||
}
|
||||
|
||||
if (%plyr.packSet > 2 && %plyr.packSet < 6) {
|
||||
%surfacePt2 = vectorAdd(%item.surfacePt,vectorScale(%item.surfaceNrm,0.2));
|
||||
%rot2 = %rot;
|
||||
if (%plyr.packSet == 3) {
|
||||
%surfacePt2 = vectorAdd(%surfacePt2,vectorScale(%item.surfaceNrm2,-0.14));
|
||||
%surfacePt2 = vectorAdd(%surfacePt2,vectorScale(%item.surfaceNrm3,0.51));
|
||||
}
|
||||
else if (%plyr.packSet == 4) {
|
||||
%surfacePt2 = vectorAdd(%surfacePt2,vectorScale(%item.surfaceNrm2,0.25));
|
||||
%surfacePt2 = vectorAdd(%surfacePt2,vectorScale(%item.surfaceNrm3,-0.4));
|
||||
}
|
||||
else if (%plyr.packSet == 5) {
|
||||
%surfacePt2 = vectorAdd(%surfacePt2,vectorScale(%item.surfaceNrm2,0.05));
|
||||
%surfacePt2 = vectorAdd(%surfacePt2,vectorScale(%item.surfaceNrm3,0.4));
|
||||
%rot = rotAdd(%rot,"0 0 -1" SPC $Pi / 4);
|
||||
}
|
||||
%deplObj.lTarget = new StaticShape () {
|
||||
datablock = DeployedLTarget;
|
||||
scale = 0.4/4 SPC 0.5/3 SPC 0.05 * 2;
|
||||
};
|
||||
%deplObj.lTarget.setTransform(%surfacePt2 SPC %rot2);
|
||||
%deplObj.lTarget.lMain = %deplObj;
|
||||
}
|
||||
|
||||
if (%plyr.packSet == 11)
|
||||
%item.surfacePt = vectorAdd(%item.surfacePt,vectorScale(%item.surfaceNrm,-2));
|
||||
|
||||
if (%plyr.packSet > 11 && %plyr.packSet < 16) {
|
||||
%surfacePt2 = %item.surfacePt;
|
||||
%rot2 = %rot;
|
||||
%item.surfaceNrm2 = vectorScale(%item.surfaceNrm2,-1);
|
||||
%item.surfacePt = vectorAdd(%item.surfacePt,vectorScale(%item.surfaceNrm,10.9));
|
||||
%surfacePt2 = vectorAdd(%surfacePt2,vectorScale(%item.surfaceNrm,34));
|
||||
%surfacePt2 = vectorAdd(%surfacePt2,vectorScale(%item.surfaceNrm3,-1));
|
||||
%rot2 = rotAdd(%rot,"1 0 0" SPC $Pi / 2);
|
||||
%deplObj.lTarget = new StaticShape () {
|
||||
datablock = DeployedLTarget;
|
||||
scale = 74/4 SPC 49/3 SPC 4;
|
||||
};
|
||||
%deplObj.lTarget.setTransform(%surfacePt2 SPC %rot2);
|
||||
%deplObj.lTarget.lMain = %deplObj;
|
||||
}
|
||||
|
||||
// set orientation
|
||||
%deplObj.setTransform(%item.surfacePt SPC %rot);
|
||||
|
||||
// set the recharge rate right away
|
||||
if (%deplObj.getDatablock().rechargeRate) {
|
||||
%deplObj.setRechargeRate(%deplObj.getDatablock().rechargeRate);
|
||||
%deplObj.lTarget.setRechargeRate(%deplObj.getDatablock().rechargeRate);
|
||||
}
|
||||
|
||||
// [[Settings]]:
|
||||
%deplObj.needsFit = 1;
|
||||
|
||||
// set team, owner, and handle
|
||||
%deplObj.team = %plyr.client.Team;
|
||||
%deplObj.setOwner(%plyr);
|
||||
if (%deplObj.lTarget) {
|
||||
%deplObj.lTarget.team = %plyr.client.Team;
|
||||
%deplObj.lTarget.setOwner(%plyr);
|
||||
}
|
||||
|
||||
// place the deployable in the MissionCleanup/Deployables group (AI reasons)
|
||||
addToDeployGroup(%deplObj);
|
||||
if (%deplObj.lTarget)
|
||||
addToDeployGroup(%deplObj.lTarget);
|
||||
|
||||
//let the AI know as well...
|
||||
AIDeployObject(%plyr.client,%deplObj);
|
||||
if (%deplObj.lTarget)
|
||||
AIDeployObject(%plyr.client,%deplObj.lTarget);
|
||||
|
||||
// play the deploy sound
|
||||
serverPlay3D(%item.deploySound, %deplObj.getTransform());
|
||||
|
||||
// increment the team count for this deployed object
|
||||
$TeamDeployedCount[%plyr.team, %item.item]++;
|
||||
|
||||
addDSurface(%item.surface,%deplObj);
|
||||
if (%deplObj.lTarget)
|
||||
addDSurface(%deplObj,%deplObj.lTarget);
|
||||
|
||||
// take the deployable off the player's back and out of inventory
|
||||
if(!%plyr.client.isAdmin) {
|
||||
%plyr.unmountImage(%slot);
|
||||
%plyr.decInventory(%item.item, 1);
|
||||
}
|
||||
|
||||
return %deplObj;
|
||||
}
|
||||
|
||||
function DeployedDecoration::onDestroyed(%this,%obj,%prevState) {
|
||||
if (%obj.isRemoved)
|
||||
return;
|
||||
%obj.isRemoved = true;
|
||||
Parent::onDestroyed(%this,%obj,%prevState);
|
||||
$TeamDeployedCount[%obj.team, DecorationDeployable]--;
|
||||
remDSurface(%obj);
|
||||
%obj.schedule(500, "delete");
|
||||
if (isObject(%obj.lTarget))
|
||||
%obj.lTarget.schedule(500, "delete");
|
||||
fireBallExplode(%obj,1);
|
||||
}
|
||||
|
||||
function DecorationDeployableImage::onMount(%data, %obj, %node) {
|
||||
%obj.hasDecoration = true; // set for decorationcheck
|
||||
%obj.packSet = 0;
|
||||
}
|
||||
|
||||
function DecorationDeployableImage::onUnmount(%data, %obj, %node) {
|
||||
%obj.hasDecoration = "";
|
||||
%obj.packSet = 0;
|
||||
}
|
||||
|
||||
function DeployedDecoration0::onDestroyed(%this,%obj,%prevState) {
|
||||
DeployedDecoration::onDestroyed(%this,%obj,%prevState);
|
||||
}
|
||||
|
||||
function DeployedDecoration1::onDestroyed(%this,%obj,%prevState) {
|
||||
DeployedDecoration::onDestroyed(%this,%obj,%prevState);
|
||||
}
|
||||
|
||||
function DeployedDecoration2::onDestroyed(%this,%obj,%prevState) {
|
||||
DeployedDecoration::onDestroyed(%this,%obj,%prevState);
|
||||
}
|
||||
|
||||
function DeployedDecoration3::onDestroyed(%this,%obj,%prevState) {
|
||||
DeployedDecoration::onDestroyed(%this,%obj,%prevState);
|
||||
}
|
||||
|
||||
function DeployedDecoration4::onDestroyed(%this,%obj,%prevState) {
|
||||
DeployedDecoration::onDestroyed(%this,%obj,%prevState);
|
||||
}
|
||||
|
||||
function DeployedDecoration5::onDestroyed(%this,%obj,%prevState) {
|
||||
DeployedDecoration::onDestroyed(%this,%obj,%prevState);
|
||||
}
|
||||
|
||||
function DeployedDecoration6::onDestroyed(%this,%obj,%prevState) {
|
||||
DeployedDecoration::onDestroyed(%this,%obj,%prevState);
|
||||
}
|
||||
|
||||
function DeployedDecoration7::onDestroyed(%this,%obj,%prevState) {
|
||||
DeployedDecoration::onDestroyed(%this,%obj,%prevState);
|
||||
}
|
||||
|
||||
function DeployedDecoration8::onDestroyed(%this,%obj,%prevState) {
|
||||
DeployedDecoration::onDestroyed(%this,%obj,%prevState);
|
||||
}
|
||||
|
||||
function DeployedDecoration9::onDestroyed(%this,%obj,%prevState) {
|
||||
DeployedDecoration::onDestroyed(%this,%obj,%prevState);
|
||||
}
|
||||
|
||||
function DeployedDecoration10::onDestroyed(%this,%obj,%prevState) {
|
||||
DeployedDecoration::onDestroyed(%this,%obj,%prevState);
|
||||
}
|
||||
|
||||
function DeployedDecoration11::onDestroyed(%this,%obj,%prevState) {
|
||||
DeployedDecoration::onDestroyed(%this,%obj,%prevState);
|
||||
}
|
||||
|
||||
function DeployedDecoration12::onDestroyed(%this,%obj,%prevState) {
|
||||
DeployedDecoration::onDestroyed(%this,%obj,%prevState);
|
||||
}
|
||||
|
||||
function DeployedDecoration13::onDestroyed(%this,%obj,%prevState) {
|
||||
DeployedDecoration::onDestroyed(%this,%obj,%prevState);
|
||||
}
|
||||
|
||||
function DeployedDecoration14::onDestroyed(%this,%obj,%prevState) {
|
||||
DeployedDecoration::onDestroyed(%this,%obj,%prevState);
|
||||
}
|
||||
|
||||
function DeployedDecoration15::onDestroyed(%this,%obj,%prevState) {
|
||||
DeployedDecoration::onDestroyed(%this,%obj,%prevState);
|
||||
}
|
||||
|
||||
function DeployedDecoration16::onDestroyed(%this,%obj,%prevState) {
|
||||
DeployedDecoration::onDestroyed(%this,%obj,%prevState);
|
||||
}
|
||||
509
scripts/packs/door.cs
Normal file
509
scripts/packs/door.cs
Normal file
|
|
@ -0,0 +1,509 @@
|
|||
datablock StaticShapeData(DeployedDoor) : StaticShapeDamageProfile {
|
||||
className = "door";
|
||||
shapeFile = "Pmiscf.dts"; // b or dmiscf.dts, alternate
|
||||
|
||||
maxDamage = 2;
|
||||
destroyedLevel = 2;
|
||||
disabledLevel = 1.5;
|
||||
|
||||
isShielded = true;
|
||||
energyPerDamagePoint = 60;
|
||||
maxEnergy = 100;
|
||||
rechargeRate = 0.25;
|
||||
|
||||
explosion = HandGrenadeExplosion;
|
||||
expDmgRadius = 3.0;
|
||||
expDamage = 0.1;
|
||||
expImpulse = 200.0;
|
||||
|
||||
dynamicType = $TypeMasks::StaticShapeObjectType;
|
||||
deployedObject = true;
|
||||
cmdCategory = "DSupport";
|
||||
cmdIcon = CMDSensorIcon;
|
||||
cmdMiniIconName = "commander/MiniIcons/com_deploymotionsensor";
|
||||
targetNameTag = 'Door';
|
||||
deployAmbientThread = true;
|
||||
debrisShapeName = "debris_generic_small.dts";
|
||||
debris = DeployableDebris;
|
||||
heatSignature = 0;
|
||||
needsPower = true;
|
||||
};
|
||||
|
||||
datablock ShapeBaseImageData(DoorDeployableImage) {
|
||||
mass = 1;
|
||||
emap = true;
|
||||
shapeFile = "stackable1s.dts";
|
||||
item = DoorDeployable;
|
||||
mountPoint = 1;
|
||||
offset = "0 0 0";
|
||||
deployed = DeployedDoor;
|
||||
heatSignature = 0;
|
||||
|
||||
stateName[0] = "Idle";
|
||||
stateTransitionOnTriggerDown[0] = "Activate";
|
||||
|
||||
stateName[1] = "Activate";
|
||||
stateScript[1] = "onActivate";
|
||||
stateTransitionOnTriggerUp[1] = "Idle";
|
||||
|
||||
isLarge = false;
|
||||
maxDepSlope = 360;
|
||||
deploySound = ItemPickupSound;
|
||||
|
||||
minDeployDis = 0;
|
||||
maxDeployDis = 50.0;
|
||||
};
|
||||
|
||||
datablock ItemData(DoorDeployable) {
|
||||
className = Pack;
|
||||
catagory = "Deployables";
|
||||
shapeFile = "stackable1s.dts";
|
||||
mass = 1;
|
||||
elasticity = 0.2;
|
||||
friction = 0.6;
|
||||
pickupRadius = 1;
|
||||
rotate = true;
|
||||
image = "DoorDeployableImage";
|
||||
pickUpName = "an Advanced Door Pack";
|
||||
heatSignature = 0;
|
||||
emap = true;
|
||||
};
|
||||
|
||||
function DoorDeployableImage::testObjectTooClose(%item) {
|
||||
return "";
|
||||
}
|
||||
|
||||
function DoorDeployableImage::testNoTerrainFound(%item) {
|
||||
// don't check this for non-Landspike turret deployables
|
||||
}
|
||||
|
||||
function DoorDeployable::onPickup(%this, %obj, %shape, %amount) {
|
||||
// created to prevent console errors
|
||||
}
|
||||
|
||||
function doorDeployableImage::onMount(%data, %obj, %node) {
|
||||
%obj.hasDoor = true; // set for blastcheck
|
||||
%obj.packSet = 0;
|
||||
%obj.packSet[0] = 0;
|
||||
%obj.packSet[1] = 0;
|
||||
%obj.packSet[2] = 0;
|
||||
%obj.expertSet = 0;
|
||||
displayPowerFreq(%obj);
|
||||
|
||||
}
|
||||
|
||||
function doorDeployableImage::onUnmount(%data, %obj, %node) {
|
||||
%obj.hasDoor = "";
|
||||
%obj.packSet = 0;
|
||||
%obj.packSet[0] = 0;
|
||||
%obj.packSet[1] = 0;
|
||||
%obj.packSet[2] = 0;
|
||||
%obj.expertSet = 0;
|
||||
}
|
||||
|
||||
function doorDeployableImage::onDeploy(%item, %plyr, %slot) {
|
||||
%className = "StaticShape";
|
||||
%grounded = 0;
|
||||
if (%item.surface.getClassName() $= TerrainBlock)
|
||||
%grounded = 1;
|
||||
|
||||
%playerVector = vectorNormalize(-1 * getWord(%plyr.getEyeVector(),1) SPC getWord(%plyr.getEyeVector(),0) SPC "0");
|
||||
|
||||
if (%item.surfaceinher == 0) {
|
||||
if (vAbs(floorVec(%item.surfaceNrm,100)) $= "0 0 1"){
|
||||
%item.surfaceNrm2 = %playerVector;
|
||||
}
|
||||
else{
|
||||
%item.surfaceNrm2 = vectorNormalize(vectorCross(%item.surfaceNrm,"0 0 1"));
|
||||
}
|
||||
}
|
||||
|
||||
%rot1 = fullRot(%item.surfaceNrm,%item.surfaceNrm2);
|
||||
|
||||
%scale1 = "0.5 6 160";
|
||||
%scale2 = "0.5 8 160";
|
||||
%dataBlock = %item.deployed;
|
||||
|
||||
%space = rayDist(%item.surfacePt SPC %item.surfaceNrm,%scale1,$AllObjMask);
|
||||
if (%space != getWord(%scale1,1))
|
||||
%type = true;
|
||||
%scale1 = getWord(%scale1,0) SPC getWord(%scale1,0) SPC %space;
|
||||
|
||||
|
||||
%mCenter = "0 0 -0.5";
|
||||
%pad = pad(%item.surfacePt SPC %item.surfaceNrm SPC %item.surfaceNrm2,%scale2,%mCenter);
|
||||
%scale2 = getWords(%pad,0,2);
|
||||
%item.surfacePt2 = getWords(%pad,3,5);
|
||||
|
||||
//%vec1 = realVec(getWord(%item.surface,0),%item.surfaceNrm);
|
||||
//%vec1 = realVec(%pad,%item.surfaceNrm);
|
||||
%vec1 =validateVal(MatrixMulVector("0 0 0",%item.surfaceNrm));
|
||||
|
||||
if (!%scaleIsSet){
|
||||
%scale1 = vectorMultiply(%scale1,1/4 SPC 1/3 SPC 2);
|
||||
%scale2 = vectorMultiply(%scale2,1/4 SPC 1/3 SPC 2);
|
||||
%x = (getWord(%scale2,1)/0.166666)*0.125;
|
||||
%scale3 = %x SPC 0.166666 SPC getWord(%scale1,2);
|
||||
}
|
||||
|
||||
|
||||
|
||||
%dir1 = VectorNormalize(vectorSub(%item.surfacePt,%item.surfacePt2));
|
||||
%adjust1 = vectorNormalize(vectorProject(%dir1,vectorCross(%item.surfaceNrm,%item.surfaceNrm2)));
|
||||
%offset1 = -0.5;
|
||||
%adjust1 = vectorScale(%adjust1,-0.5 * %offset1);
|
||||
|
||||
%deplObj = new (%className)() {
|
||||
dataBlock = %dataBlock;
|
||||
scale = %scale3;
|
||||
};
|
||||
%deplObj.closedscale = %scale3;
|
||||
%deplObj.openedscale = getwords(%scale3,0,1) SPC 0.1;
|
||||
//
|
||||
%deplObj.savedclosedscale = %scale3;
|
||||
%deplObj.savedopenedscale = getwords(%scale3,0,1) SPC 0.1;
|
||||
//
|
||||
//////////////////////////Apply settings//////////////////////////////
|
||||
|
||||
// exact:
|
||||
//%deplObj.setTransform(%item.surfacePt SPC %rot1);
|
||||
%deplObj.setTransform(vectorAdd(VectorAdd(%item.surfacePt2, VectorScale(%vec1,getword(%scale3,2)/-4)),%adjust1) SPC %rot1);
|
||||
|
||||
// misc info
|
||||
addDSurface(%item.surface,%deplObj);
|
||||
// [[Settings]]:
|
||||
|
||||
%deplObj.grounded = %grounded;
|
||||
%deplObj.needsFit = 1;
|
||||
%deplObj.isdoor = 1;
|
||||
// [[Normal Stuff]]:
|
||||
|
||||
// set team, owner, and handle
|
||||
%deplObj.team = %plyr.client.team;
|
||||
%deplObj.setOwner(%plyr);
|
||||
|
||||
// set power frequency
|
||||
%deplObj.powerFreq = %plyr.powerFreq;
|
||||
|
||||
// set the sensor group if it needs one
|
||||
if (%deplObj.getTarget() != -1)
|
||||
setTargetSensorGroup(%deplObj.getTarget(), %plyr.client.team);
|
||||
|
||||
// place the deployable in the MissionCleanup/Deployables group (AI reasons)
|
||||
addToDeployGroup(%deplObj);
|
||||
|
||||
//let the AI know as well...
|
||||
AIDeployObject(%plyr.client, %deplObj);
|
||||
|
||||
// play the deploy sound
|
||||
serverPlay3D(%item.deploySound, %deplObj.getTransform());
|
||||
|
||||
// increment the team count for this deployed object
|
||||
$TeamDeployedCount[%plyr.team, %item.item]++;
|
||||
|
||||
%deplObj.deploy();
|
||||
%owner = %deplObj.getOwner(); //this is for leveled cards
|
||||
|
||||
if(%plyr.packSet[1] == 0) {
|
||||
%deplobj.timeout = "0";
|
||||
}
|
||||
else if(%plyr.packSet[1] == 1) {
|
||||
%deplobj.timeout = ".5";
|
||||
}
|
||||
else if(%plyr.packSet[1] == 2) {
|
||||
%deplobj.timeout = "1";
|
||||
}
|
||||
else if(%plyr.packSet[1] == 3) {
|
||||
%deplobj.timeout = "2";
|
||||
}
|
||||
else if(%plyr.packSet[1] == 4) {
|
||||
%deplobj.timeout = "3";
|
||||
}
|
||||
else if(%plyr.packSet[1] == 5) {
|
||||
%deplobj.timeout = "4";
|
||||
}
|
||||
|
||||
if(%plyr.packSet[2] == 1) {
|
||||
%deplobj.cankill = 1;
|
||||
}
|
||||
else {
|
||||
%deplobj.cankill = 0;
|
||||
}
|
||||
|
||||
%deplobj.hasslided=0;
|
||||
|
||||
if (%plyr.packSet[0]==0)
|
||||
%deplobj.toggletype=0;
|
||||
|
||||
if (%plyr.packSet[0]==1)
|
||||
%deplobj.toggletype=1;
|
||||
|
||||
if (%plyr.packSet[0]==2) {
|
||||
%deplobj.toggletype=0;
|
||||
%deplobj.powercontrol=1; //staticshape.cs function StaticShapeData::onGainPowerEnabled |and| function StaticShapeData::onLosePowerDisabled
|
||||
} //for power togle code
|
||||
|
||||
if (%plyr.packSet[0]==3) {
|
||||
%deplobj.toggletype=2;
|
||||
%deplobj.powercontrol=1;
|
||||
}
|
||||
if (%plyr.packSet[0]==4) {
|
||||
%deplobj.toggletype=3;
|
||||
%deplobj.powercontrol=1;
|
||||
}
|
||||
//collision door
|
||||
if (%plyr.packSet[0]==5){
|
||||
%deplobj.toggletype=0;
|
||||
%deplobj.Collision = true;
|
||||
%deplobj.lv =0;
|
||||
}
|
||||
//Level 1 Door
|
||||
if (%plyr.packSet[0]==6){
|
||||
%deplobj.toggletype=0;
|
||||
%deplobj.Collision = true;
|
||||
%deplobj.lv =1;
|
||||
%plyr.client.haslev1[%plyr.client.GUID] = 1;
|
||||
}
|
||||
//Level 2 Door
|
||||
if (%plyr.packSet[0]==7){
|
||||
%deplobj.toggletype=0;
|
||||
%deplobj.Collision = true;
|
||||
%deplobj.lv =2;
|
||||
%plyr.client.haslev2[%plyr.client.GUID] = 1;
|
||||
}
|
||||
//Level 3 Door
|
||||
if (%plyr.packSet[0]==8){
|
||||
%deplobj.toggletype=0;
|
||||
%deplobj.Collision = true;
|
||||
%deplobj.lv =3;
|
||||
%plyr.client.haslev3[%plyr.client.GUID] = 1;
|
||||
}
|
||||
//owner door
|
||||
if (%plyr.packSet[0]==9){
|
||||
%deplobj.toggletype=0;
|
||||
%deplobj.Collision = true;
|
||||
%deplobj.lv =4;
|
||||
}
|
||||
//admin door
|
||||
if (%plyr.packSet[0]==10){
|
||||
%deplobj.toggletype=0;
|
||||
%deplobj.Collision = true;
|
||||
%deplobj.lv =5;
|
||||
}
|
||||
//super admin door
|
||||
if (%plyr.packSet[0]==11){
|
||||
%deplobj.toggletype=0;
|
||||
%deplobj.Collision = true;
|
||||
%deplobj.lv =6;
|
||||
}
|
||||
//developer door
|
||||
if (%plyr.packSet[0]==12){
|
||||
%deplobj.toggletype=0;
|
||||
%deplobj.Collision = true;
|
||||
%deplobj.lv =7;
|
||||
}
|
||||
%deplobj.canmove = true;
|
||||
|
||||
// Power object
|
||||
checkPowerObject(%deplObj);
|
||||
return %deplObj;
|
||||
}
|
||||
|
||||
function Deployeddoor::onDestroyed(%this, %obj, %prevState) {
|
||||
if (%obj.isRemoved)
|
||||
return;
|
||||
%obj.isRemoved = true;
|
||||
Parent::onDestroyed(%this, %obj, %prevState);
|
||||
$TeamDeployedCount[%obj.team, TdoorDeployable]--;
|
||||
remDSurface(%obj);
|
||||
%obj.schedule(500,"delete");
|
||||
cascade(%obj);
|
||||
fireBallExplode(%obj,1);
|
||||
}
|
||||
|
||||
function Deployeddoor::disassemble(%data,%plyr,%hTgt) {
|
||||
disassemble(%data,%plyr,%hTgt);
|
||||
}
|
||||
|
||||
function doorDeployableImage::onMount(%data,%obj,%node) {
|
||||
%obj.hasdoor = true; // set for mspinecheck
|
||||
%obj.packSet = 0;
|
||||
%obj.packSet[0] = 0;
|
||||
%obj.packSet[1] = 0;
|
||||
%obj.packSet[2] = 0;
|
||||
%obj.expertSet = 0;
|
||||
displayPowerFreq(%obj);
|
||||
}
|
||||
|
||||
function doorDeployableImage::onUnmount(%data,%obj,%node) {
|
||||
%obj.hasdoor = "";
|
||||
%obj.packSet = 0;
|
||||
%obj.packSet[0] = 0;
|
||||
%obj.packSet[1] = 0;
|
||||
%obj.packSet[2] = 0;
|
||||
%obj.expertSet = 0;
|
||||
}
|
||||
////////////////////
|
||||
////////////////////
|
||||
function open(%obj){
|
||||
if (!isObject(%obj))
|
||||
return;
|
||||
if (%obj.canmove == true){
|
||||
%obj.moving = "open"; //wat direction its moving
|
||||
%obj.prevscale =%obj.scale; //scale befor this change
|
||||
%obj.closedscale=%obj.scale;//scale it is while fully closed
|
||||
%obj.canmove = false;
|
||||
}
|
||||
if (getWord(%obj.scale,2)<0.3){
|
||||
%obj.issliding = 0;
|
||||
%obj.scale = getWord(%obj.scale,0) SPC getWord(%obj.scale,1) SPC 0.1;
|
||||
%obj.settransform(%obj.gettransform());
|
||||
%obj.state = "opened"; //last state used for savebuilding
|
||||
%obj.openedscale = %obj.scale;
|
||||
if (%obj.toggletype ==0)
|
||||
schedule(%obj.timeout*1000,0,"close",%obj,1);
|
||||
else
|
||||
%obj.canmove = true;
|
||||
return;
|
||||
}
|
||||
%obj.scale = getWord(%obj.scale,0) SPC getWord(%obj.scale,1) SPC getWord(%obj.prevscale,2)-0.4;
|
||||
%obj.settransform(%obj.gettransform());
|
||||
%obj.prevscale=%obj.scale;
|
||||
schedule(40,0,"open",%obj);
|
||||
}
|
||||
/////////////////////
|
||||
/////////////////////
|
||||
function close(%obj,%timeout){
|
||||
if (!isObject(%obj))
|
||||
return;
|
||||
if (%obj.canmove == true){
|
||||
%obj.moving = "close"; //wat direction its moving
|
||||
%obj.prevscale =%obj.scale; //scale befor this change
|
||||
%obj.openedscale=%obj.scale;//scale it is while fully opened
|
||||
%obj.canmove = false;
|
||||
}
|
||||
|
||||
if (getWord(%obj.scale,2)>getWord(%obj.closedscale,2)-0.2){
|
||||
%obj.issliding = 0;
|
||||
%obj.scale =getWord(%obj.scale,0) SPC getWord(%obj.scale,1) SPC getWord(%obj.closedscale,2);
|
||||
%obj.settransform(%obj.gettransform());
|
||||
%obj.state = "closed"; //last state used for savebuilding
|
||||
%obj.closedscale = %obj.scale;
|
||||
%obj.canmove = true;
|
||||
return;
|
||||
}
|
||||
%obj.scale = getWord(%obj.scale,0) SPC getWord(%obj.scale,1) SPC getWord(%obj.prevscale,2)+0.4;
|
||||
%obj.settransform(%obj.gettransform());
|
||||
%obj.prevscale=%obj.scale;
|
||||
//killer doors (Advanced Door Pack)
|
||||
%killcheck=ContainerRayCast(%obj.getedge("1 1 1"), %obj.getedge("-1 -1 -1"), $typemasks::Playerobjecttype, %obj);
|
||||
if (isplayer(%killcheck) && %obj.cankill) {
|
||||
doorkill(%killcheck);
|
||||
}
|
||||
// -End-
|
||||
schedule(40,0,"close",%obj);
|
||||
}
|
||||
|
||||
function doorkill(%obj) {
|
||||
if(!%obj.isBoss) {
|
||||
%obj.scriptkill();
|
||||
messageall(1,'%1 Tastes the wrath of a door.', %obj.client.name);
|
||||
}
|
||||
}
|
||||
|
||||
//MODES
|
||||
|
||||
function ChangedoorMode(%this, %PriSec) {
|
||||
if(%PriSec == 1) { //Primary
|
||||
%this.ExpertSet++;
|
||||
%this.packSet[%this.ExpertSet] = 0; //Reset Secondary Mode TO Prevent Errors
|
||||
if (%this.ExpertSet > 2) {
|
||||
%this.ExpertSet = 0;
|
||||
}
|
||||
DisplayDoorInfo(%this,%PriSec);
|
||||
return;
|
||||
}
|
||||
else { //Secondary
|
||||
%this.packSet[%this.ExpertSet]++;
|
||||
//Check Primaries
|
||||
if(%this.ExpertSet == 0 && %this.packSet[%this.ExpertSet] > 12) {
|
||||
%this.packSet[%this.ExpertSet] = 0;
|
||||
}
|
||||
else if(%this.ExpertSet == 1 && %this.packSet[%this.ExpertSet] > 5) {
|
||||
%this.packSet[%this.ExpertSet] = 0;
|
||||
}
|
||||
else if(%this.ExpertSet == 2 && %this.packSet[%this.ExpertSet] > 1) {
|
||||
%this.packSet[%this.ExpertSet] = 0;
|
||||
}
|
||||
DisplayDoorInfo(%this,%PriSec);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
function DisplayDoorInfo(%plyr, %Var) {
|
||||
if(%Var == 1) {
|
||||
switch(%plyr.ExpertSet) {
|
||||
case 0:
|
||||
bottomPrint(%plyr.client,"Advanced Door [P]: Select Door Type",2,1);
|
||||
case 1:
|
||||
bottomPrint(%plyr.client,"Advanced Door [P]: Select Door Timeout",2,1);
|
||||
case 2:
|
||||
bottomPrint(%plyr.client,"Advanced Door [P]: Select Door Kill Settings",2,1);
|
||||
}
|
||||
}
|
||||
else if(%Var == 2) {
|
||||
switch(%plyr.ExpertSet) {
|
||||
case 0:
|
||||
switch(%plyr.packSet[0]) {
|
||||
case 0:
|
||||
bottomPrint(%plyr.client,"Advanced Door [S]: Normal Door",2,1);
|
||||
case 1:
|
||||
bottomPrint(%plyr.client,"Advanced Door [S]: Toggle Door",2,1);
|
||||
case 2:
|
||||
bottomPrint(%plyr.client,"Advanced Door [S]: PWR Change Normal Door",2,1);
|
||||
case 3:
|
||||
bottomPrint(%plyr.client,"Advanced Door [S]: Close When Powered Door",2,1);
|
||||
case 4:
|
||||
bottomPrint(%plyr.client,"Advanced Door [S]: Open When Powered Door",2,1);
|
||||
case 5:
|
||||
bottomPrint(%plyr.client,"Advanced Door [S]: Contact Access Door",2,1);
|
||||
case 6:
|
||||
bottomPrint(%plyr.client,"Advanced Door [S]: Green Level Access Door",2,1);
|
||||
case 7:
|
||||
bottomPrint(%plyr.client,"Advanced Door [S]: Yellow Level Access Door",2,1);
|
||||
case 8:
|
||||
bottomPrint(%plyr.client,"Advanced Door [S]: Red Level Access Door",2,1);
|
||||
case 9:
|
||||
bottomPrint(%plyr.client,"Advanced Door [S]: Owner Contact Access Door",2,1);
|
||||
case 10:
|
||||
bottomPrint(%plyr.client,"Advanced Door [S]: Admin Contact Access Door",2,1);
|
||||
case 11:
|
||||
bottomPrint(%plyr.client,"Advanced Door [S]: Super-Admin Contact Access Door",2,1);
|
||||
case 12:
|
||||
bottomPrint(%plyr.client,"Advanced Door [S]: Developer Contact Access Door",2,1);
|
||||
}
|
||||
case 1:
|
||||
switch(%plyr.packSet[1]) {
|
||||
case 0:
|
||||
bottomPrint(%plyr.client,"Advanced Door [S]: No Timeout",2,1);
|
||||
case 1:
|
||||
bottomPrint(%plyr.client,"Advanced Door [S]: 0.5 Second Timeout",2,1);
|
||||
case 2:
|
||||
bottomPrint(%plyr.client,"Advanced Door [S]: 1 Second Timeout",2,1);
|
||||
case 3:
|
||||
bottomPrint(%plyr.client,"Advanced Door [S]: 2 Second Timeout",2,1);
|
||||
case 4:
|
||||
bottomPrint(%plyr.client,"Advanced Door [S]: 3 Second Timeout",2,1);
|
||||
case 5:
|
||||
bottomPrint(%plyr.client,"Advanced Door [S]: 4 Second Timeout",2,1);
|
||||
}
|
||||
case 2:
|
||||
switch(%plyr.packSet[2]) {
|
||||
case 0:
|
||||
bottomPrint(%plyr.client,"Advanced Door [S]: Don't Kill",2,1);
|
||||
case 1:
|
||||
bottomPrint(%plyr.client,"Advanced Door [S]: Kill",2,1);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
395
scripts/packs/escapepodpack.cs
Normal file
395
scripts/packs/escapepodpack.cs
Normal file
|
|
@ -0,0 +1,395 @@
|
|||
// Escape Pod Pack
|
||||
|
||||
datablock AudioProfile(EscapePodChargeSound) {
|
||||
filename = "fx/misc/cannonstart.wav";
|
||||
description = AudioDefault3d;
|
||||
preload = true;
|
||||
};
|
||||
|
||||
datablock AudioProfile(EscapePodBeepSound) {
|
||||
filename = "fx/misc/warning_beep.wav";
|
||||
description = AudioClosest3d;
|
||||
preload = true;
|
||||
};
|
||||
|
||||
datablock AudioProfile(EscapePodLaunchSound) {
|
||||
filename = "fx/Bonuses/high-level4-blazing.wav";
|
||||
description = AudioBIGExplosion3d;
|
||||
preload = true;
|
||||
};
|
||||
|
||||
datablock AudioProfile(EscapePodLaunchSound2) {
|
||||
filename = "fx/Bonuses/down_passback3_rocket.wav";
|
||||
description = AudioBIGExplosion3d;
|
||||
preload = true;
|
||||
};
|
||||
|
||||
datablock AudioProfile(EscapePodReloadSound) {
|
||||
filename = "fx/powered/turret_heavy_reload.wav";
|
||||
description = AudioClose3d;
|
||||
preload = true;
|
||||
};
|
||||
|
||||
datablock AudioProfile(EscapePodFadeSound) {
|
||||
filename = "fx/Bonuses/upward_perppass2_quark.wav";
|
||||
description = AudioClose3d;
|
||||
preload = true;
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedEscapePod) : StaticShapeDamageProfile {
|
||||
className = "escapepod";
|
||||
shapeFile = "TR2weapon_mortar.dts";
|
||||
|
||||
maxDamage = 1;
|
||||
destroyedLevel = 1;
|
||||
disabledLevel = 1;
|
||||
|
||||
isShielded = true;
|
||||
energyPerDamagePoint = 75;
|
||||
maxEnergy = 50;
|
||||
rechargeRate = 0.35;
|
||||
|
||||
explosion = ShapeExplosion;
|
||||
expDmgRadius = 8.0;
|
||||
expDamage = 0.4;
|
||||
expImpulse = 1500;
|
||||
|
||||
dynamicType = $TypeMasks::StaticShapeObjectType;
|
||||
deployedObject = true;
|
||||
cmdCategory = "DSupport";
|
||||
cmdIcon = CMDSensorIcon;
|
||||
cmdMiniIconName = "commander/MiniIcons/com_deploymotionsensor";
|
||||
targetNameTag = 'Deployed';
|
||||
targetTypeTag = 'Escape Pod';
|
||||
deployAmbientThread = false;
|
||||
debrisShapeName = "debris_generic.dts";
|
||||
debris = DeployableDebris;
|
||||
heatSignature = 1;
|
||||
emap = true;
|
||||
};
|
||||
|
||||
datablock ShapeBaseImageData(EscapePodDeployableImage) {
|
||||
mass = 1;
|
||||
emap = true;
|
||||
shapeFile = "stackable1s.dts";
|
||||
item = EscapePodDeployable;
|
||||
mountPoint = 1;
|
||||
offset = "0 0 0";
|
||||
deployed = DeployedEscapePod;
|
||||
heatSignature = 0;
|
||||
|
||||
stateName[0] = "Idle";
|
||||
stateTransitionOnTriggerDown[0] = "Activate";
|
||||
|
||||
stateName[1] = "Activate";
|
||||
stateScript[1] = "onActivate";
|
||||
stateTransitionOnTriggerUp[1] = "Idle";
|
||||
|
||||
isLarge = true;
|
||||
maxDepSlope = 360;
|
||||
deploySound = ItemPickupSound;
|
||||
|
||||
minDeployDis = 0.25;
|
||||
maxDeployDis = 5;
|
||||
};
|
||||
|
||||
datablock ItemData(EscapePodDeployable) {
|
||||
className = Pack;
|
||||
catagory = "Deployables";
|
||||
shapeFile = "stackable1s.dts";
|
||||
mass = 1;
|
||||
elasticity = 0.2;
|
||||
friction = 0.6;
|
||||
pickupRadius = 3;
|
||||
rotate = true;
|
||||
image = "EscapePodDeployableImage";
|
||||
pickUpName = "an escape pod pack";
|
||||
heatSignature = 0;
|
||||
emap = true;
|
||||
};
|
||||
|
||||
function EscapePodDeployableImage::testNoTerrainFound(%item) {
|
||||
// don't check this for non-Landspike turret deployables
|
||||
}
|
||||
|
||||
function EscapePodDeployable::onPickup(%this, %obj, %shape, %amount) {
|
||||
// created to prevent console errors
|
||||
}
|
||||
|
||||
function EscapePodDeployableImage::onDeploy(%item, %plyr, %slot) {
|
||||
%className = "StaticShape";
|
||||
|
||||
%playerVector = vectorNormalize(-1 * getWord(%plyr.getEyeVector(),1) SPC getWord(%plyr.getEyeVector(),0) SPC "0");
|
||||
|
||||
if (vAbs(floorVec(%item.surfaceNrm,100)) $= "0 0 1")
|
||||
%item.surfaceNrm2 = %playerVector;
|
||||
else
|
||||
%item.surfaceNrm2 = vectorNormalize(vectorCross(%item.surfaceNrm,"0 0 1"));
|
||||
|
||||
%rot = fullRot(%item.surfaceNrm,%item.surfaceNrm2);
|
||||
|
||||
%deplObj = new (%className)() {
|
||||
dataBlock = DeployedEscapePod;
|
||||
scale = "4 2 4";
|
||||
impulse = $packSetting["escapepod",%plyr.packSet];
|
||||
};
|
||||
|
||||
%deplObj.lTarget = new StaticShape () {
|
||||
datablock = DeployedLTarget;
|
||||
scale = vectorMultiply("1 3 0.25",1/4 SPC 1/3 SPC 2);
|
||||
};
|
||||
|
||||
%deplObj.lTarget.lMain = %deplObj;
|
||||
|
||||
// set orientation
|
||||
%deplObj.lTarget.setTransform(%item.surfacePt SPC %rot);
|
||||
adjustEscapePod(%deplObj);
|
||||
escapePodLoop(%deplObj);
|
||||
|
||||
// set the recharge rate right away
|
||||
if (%deplObj.getDatablock().rechargeRate)
|
||||
%deplObj.setRechargeRate(%deplObj.getDatablock().rechargeRate);
|
||||
|
||||
// set team, owner, and handle
|
||||
%deplObj.team = %plyr.client.Team;
|
||||
%deplObj.setOwner(%plyr);
|
||||
if (%deplObj.lTarget) {
|
||||
%deplObj.lTarget.team = %plyr.client.Team;
|
||||
%deplObj.lTarget.setOwner(%plyr);
|
||||
}
|
||||
|
||||
// set the sensor group if it needs one
|
||||
if (%deplObj.getTarget() != -1)
|
||||
setTargetSensorGroup(%deplObj.getTarget(), %plyr.client.team);
|
||||
|
||||
// place the deployable in the MissionCleanup/Deployables group (AI reasons)
|
||||
addToDeployGroup(%deplObj);
|
||||
if (%deplObj.lTarget)
|
||||
addToDeployGroup(%deplObj.lTarget);
|
||||
|
||||
//let the AI know as well...
|
||||
AIDeployObject(%plyr.client, %deplObj);
|
||||
if (%deplObj.lTarget)
|
||||
AIDeployObject(%plyr.client,%deplObj.lTarget);
|
||||
|
||||
// play the deploy sound
|
||||
serverplay3D(%item.deploySound, %deplObj.getTransform());
|
||||
|
||||
// increment the team count for this deployed object
|
||||
$TeamDeployedCount[%plyr.team, %item.item]++;
|
||||
|
||||
%deplObj.deploy();
|
||||
|
||||
addDSurface(%item.surface,%deplObj);
|
||||
if (%deplObj.lTarget)
|
||||
addDSurface(%deplObj,%deplObj.lTarget);
|
||||
|
||||
// take the deployable off the player's back and out of inventory
|
||||
if(!%plyr.client.isAdmin) {
|
||||
%plyr.unmountImage(%slot);
|
||||
%plyr.decInventory(%item.item, 1);
|
||||
}
|
||||
|
||||
return %deplObj;
|
||||
}
|
||||
|
||||
function DeployedEscapePod::onDestroyed(%this,%obj,%prevState) {
|
||||
if (%obj.isRemoved)
|
||||
return;
|
||||
%obj.isRemoved = true;
|
||||
Parent::onDestroyed(%this,%obj,%prevState);
|
||||
$TeamDeployedCount[%obj.team, EscapePodDeployable]--;
|
||||
remDSurface(%obj);
|
||||
%obj.schedule(500, "delete");
|
||||
if (isObject(%obj.lTarget))
|
||||
%obj.lTarget.schedule(500, "delete");
|
||||
if (isObject(%obj.podVehicle))
|
||||
%obj.podVehicle.schedule(500,setDamageState,Destroyed);
|
||||
}
|
||||
|
||||
function DeployedEscapePod::disassemble(%data,%plyr,%obj) {
|
||||
if (isObject(%obj.podVehicle))
|
||||
%obj.podVehicle.startFade(500,0,1);
|
||||
%obj.podVehicle.schedule(500,delete);
|
||||
disassemble(%data,%plyr,%obj);
|
||||
}
|
||||
|
||||
function adjustEscapePod(%obj) {
|
||||
if (!isObject(%obj))
|
||||
return;
|
||||
%lTarget = %obj.lTarget;
|
||||
%pos = %lTarget.getPosition();
|
||||
%rot = %lTarget.getRotation();
|
||||
%nrm = realVec(%lTarget,"0 0 1");
|
||||
%obj.setTransform(vectorAdd(%pos,vectorScale(%nrm,1.25)) SPC %rot);
|
||||
}
|
||||
|
||||
function escapePodLoop(%obj) {
|
||||
if (!isObject(%obj))
|
||||
return;
|
||||
if (%obj.getDamageState() !$= "Enabled")
|
||||
return;
|
||||
cancel(%obj.escapePodLoop);
|
||||
%lTarget = %obj.lTarget;
|
||||
%pos = %lTarget.getPosition();
|
||||
%nrm = realVec(%lTarget,"0 0 1");
|
||||
%nrm2 = realVec(%lTarget,"1 0 0");
|
||||
%epod = %obj.podVehicle;
|
||||
if (isObject(%epod)) {
|
||||
if (%epod.player) {
|
||||
%player = %epod.getMountedObject(0);
|
||||
if (isObject(%player)) {
|
||||
if (%player.getState() $= "Dead") {
|
||||
%remove = true;
|
||||
if (!%player.podFaded) {
|
||||
%player.startFade(2000,0,1);
|
||||
%player.podFaded = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
%remove = true;
|
||||
}
|
||||
else {
|
||||
// Remove when launched manually (no player)
|
||||
if (%epod.launched)
|
||||
%remove = true;
|
||||
}
|
||||
if (%remove == true)
|
||||
%epod.getDataBlock().fadeOutVehicle(%epod);
|
||||
}
|
||||
else {
|
||||
%epod = new HoverVehicle() {
|
||||
dataBlock = "EscapePodVehicle";
|
||||
scale = "1 1 1";
|
||||
team = %obj.team;
|
||||
mountable = "1";
|
||||
selfpower = "1";
|
||||
};
|
||||
%obj.podVehicle = %epod;
|
||||
setTargetSensorGroup(%epod.getTarget(),%epod.team);
|
||||
%epod.launcher = %obj;
|
||||
%epod.setFrozenState(true);
|
||||
%epod.setTransform(vectorAdd(%pos,vectorScale(%nrm,1)) SPC fullRot(%nrm,vectorScale(%nrm2,-1)));
|
||||
%obj.play3D(EscapePodReloadSound);
|
||||
%obj.stopThread($AmbientThread);
|
||||
%obj.setThreadDir($AmbientThread,0);
|
||||
%obj.playThread($AmbientThread,"recoil");
|
||||
%obj.schedule(1000,stopThread,$AmbientThread);
|
||||
}
|
||||
%obj.escapePodLoop = schedule(1000,0,escapePodLoop,%obj);
|
||||
}
|
||||
|
||||
function EscapePodDeployableImage::onMount(%data, %obj, %node) {
|
||||
%obj.hasEscapePod = true; // set for podcheck
|
||||
%obj.packSet = 7;
|
||||
%obj.expertSet = 0;
|
||||
}
|
||||
|
||||
function EscapePodDeployableImage::onUnmount(%data, %obj, %node) {
|
||||
%obj.packSet = 0;
|
||||
%obj.expertSet = 0;
|
||||
%obj.hasEscapePod = "";
|
||||
}
|
||||
|
||||
function EscapePodVehicle::isBlocked(%data,%obj,%player) {
|
||||
%pos = %obj.getPosition();
|
||||
%startPos = vectorAdd(%pos,vectorScale(realVec(%obj,"0 -1 0"),2));
|
||||
%endPos = vectorAdd(%pos,vectorScale(realVec(%obj,"0 1 0"),2));
|
||||
%mask = $TypeMasks::VehicleObjectType | $TypeMasks::StationObjectType | $TypeMasks::GeneratorObjectType | $TypeMasks::SensorObjectType | $TypeMasks::TurretObjectType | $TypeMasks::TerrainObjectType | $TypeMasks::InteriorObjectType | $TypeMasks::ForceFieldObjectType | $TypeMasks::StaticObjectType | $TypeMasks::MoveableObjectType | $TypeMasks::DamagableItemObjectType;
|
||||
%res = containerRayCast(%startPos,%endPos,%mask,%obj);
|
||||
if (%res)
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
function EscapePodVehicle::playerMounted(%data, %obj, %player, %node) {
|
||||
if (%obj.player)
|
||||
return;
|
||||
%obj.player = %player;
|
||||
%obj.playerMountedTime = getSimTime();
|
||||
// commandToClient(%player.client, 'setHudMode', 'Pilot', "Hoverbike", %node);
|
||||
|
||||
// update observers who are following this guy...
|
||||
if ( %player.client.observeCount > 0 )
|
||||
resetObserveFollow( %player.client, false );
|
||||
|
||||
%obj.play3D(EscapePodBeepSound);
|
||||
%data.schedule(1000,actionThreadPlayer,%player,"scoutRoot");
|
||||
%obj.schedule(1500,play3D,EscapePodChargeSound);
|
||||
%data.schedule(3000,launchPod,%obj,%player,%node);
|
||||
}
|
||||
|
||||
function EscapePodVehicle::actionThreadPlayer(%data,%player,%thread) {
|
||||
if (!isObject(%player))
|
||||
return;
|
||||
if (%player.getState() $= "Dead") {
|
||||
%player.startFade(2000,0,1);
|
||||
%player.podFaded = true;
|
||||
}
|
||||
else
|
||||
%player.setActionThread(%thread,true);
|
||||
}
|
||||
|
||||
function EscapePodVehicle::launchPod(%data,%obj,%player,%node) {
|
||||
if (!isObject(%obj))
|
||||
return;
|
||||
%obj.launched = true;
|
||||
%obj.play3D(EscapePodLaunchSound);
|
||||
%obj.play3D(EscapePodLaunchSound2);
|
||||
%launcher = %obj.launcher;
|
||||
if (isObject(%launcher)) {
|
||||
%launcher.stopThread($AmbientThread);
|
||||
%launcher.setThreadDir($AmbientThread,1);
|
||||
%launcher.playThread($AmbientThread,"recoil");
|
||||
%launcher.schedule(1000,stopThread,$AmbientThread);
|
||||
}
|
||||
%obj.setFrozenState(false);
|
||||
%obj.applyImpulse(%obj.getPosition(),vectorScale(realVec(%obj,"0 1 0"),%launcher.impulse));
|
||||
for(%i = 0; %i < 10; %i++)
|
||||
%data.schedule((%i * %i) * 10,emitLaunchPuff,%obj);
|
||||
}
|
||||
|
||||
function EscapePodVehicle::emitLaunchPuff(%data,%obj) {
|
||||
if (!isObject(%obj))
|
||||
return;
|
||||
%em = new ParticleEmissionDummy() {
|
||||
dataBlock = "defaultEmissionDummy";
|
||||
emitter = "VehicleLGESmokeEMitter";
|
||||
position = %obj.getPosition();
|
||||
scale = "1 1 1";
|
||||
velocity = "1";
|
||||
};
|
||||
MissionCleanup.add(%em);
|
||||
%em.schedule(1000,"delete");
|
||||
}
|
||||
|
||||
//function EscapePodVehicle::onDestroyed(%data, %obj, %prevState) {
|
||||
// Parent::onDestroyed(%data, %obj, %prevState);
|
||||
//}
|
||||
|
||||
|
||||
//function EscapePodVehicle::playerDismounted(%data, %obj, %player) {
|
||||
// Parent::playerDismounted(%data, %obj, %player);
|
||||
//}
|
||||
|
||||
function EscapePodVehicle::fadeOutVehicle(%data,%obj) {
|
||||
if (%obj.faded)
|
||||
return;
|
||||
%obj.faded = true;
|
||||
%obj.startFade(1000,4000,1);
|
||||
%obj.schedule(5000,delete);
|
||||
%obj.schedule(4000,play3D,EscapePodFadeSound);
|
||||
}
|
||||
|
||||
function EscapePodVehicle::onAdd(%this, %obj) {
|
||||
Parent::onAdd(%this, %obj);
|
||||
setTargetSensorGroup(%obj.getTarget(),%obj.team);
|
||||
}
|
||||
|
||||
function displayEscapePodBoostPower(%plyr) {
|
||||
%line = $packSetting["escapepod",%plyr.packSet];
|
||||
%max = $packSetting["escapepod",$packSettings["escapepod"]];
|
||||
%power = mAbs(mFloatLength(100 / %max * %line,1));
|
||||
bottomPrint(%plyr.client,"Escape Pod booster set to " @ %power @ "% power" ,2,1);
|
||||
}
|
||||
518
scripts/packs/forcefieldpack.cs
Normal file
518
scripts/packs/forcefieldpack.cs
Normal file
|
|
@ -0,0 +1,518 @@
|
|||
//---------------------------------------------------------
|
||||
// Deployable Force Field
|
||||
//---------------------------------------------------------
|
||||
|
||||
// Translucencies
|
||||
$noPassTrans = 1.0;
|
||||
$teamPassTrans = 0.6;
|
||||
$allPassTrans = 0.2;
|
||||
|
||||
$dimDiv = 4;
|
||||
|
||||
// RGB
|
||||
$colourOn = 0.3;
|
||||
$colourOff = 0.0;
|
||||
|
||||
datablock ForceFieldBareData(DeployedForceField) {
|
||||
className = "forcefield";
|
||||
fadeMS = 1000;
|
||||
baseTranslucency = $allPassTrans;
|
||||
powerOffTranslucency = $allPassTrans / $dimDiv;
|
||||
teamPermiable = false;
|
||||
otherPermiable = false;
|
||||
color = "1.0 1.0 1.0";
|
||||
powerOffColor = "0.0 0.0 0.0";
|
||||
targetNameTag = 'Force Field';
|
||||
targetTypeTag = 'ForceField';
|
||||
texture[0] = "skins/forcef1";
|
||||
texture[1] = "skins/forcef2";
|
||||
texture[2] = "skins/forcef3";
|
||||
texture[3] = "skins/forcef4";
|
||||
texture[4] = "skins/forcef5";
|
||||
framesPerSec = 1; // 10
|
||||
numFrames = 5;
|
||||
scrollSpeed = 15;
|
||||
umapping = 0.01; // 1.0
|
||||
vmapping = 0.01; // 0.15
|
||||
deployedFrom = ForceFieldDeployable;
|
||||
needsPower = true;
|
||||
};
|
||||
|
||||
// No pass
|
||||
datablock ForceFieldBareData(DeployedForceField0) : DeployedForceField {
|
||||
baseTranslucency = $noPassTrans;
|
||||
powerOffTranslucency = $noPassTrans / $dimDiv;
|
||||
teamPermiable = false;
|
||||
otherPermiable = false;
|
||||
color = $colourOn SPC $colourOn SPC $colourOn;
|
||||
powerOffColor = "0.0 0.0 0.0";
|
||||
};
|
||||
|
||||
datablock ForceFieldBareData(DeployedForceField1) : DeployedForceField {
|
||||
baseTranslucency = $noPassTrans;
|
||||
powerOffTranslucency = $noPassTrans / $dimDiv;
|
||||
teamPermiable = false;
|
||||
otherPermiable = false;
|
||||
color = $colourOn SPC $colourOff SPC $colourOff;
|
||||
powerOffColor = "0.0 0.0 0.0";
|
||||
};
|
||||
|
||||
datablock ForceFieldBareData(DeployedForceField2) : DeployedForceField {
|
||||
baseTranslucency = $noPassTrans;
|
||||
powerOffTranslucency = $noPassTrans / $dimDiv;
|
||||
teamPermiable = false;
|
||||
otherPermiable = false;
|
||||
color = $colourOff SPC $colourOn SPC $colourOff;
|
||||
powerOffColor = "0.0 0.0 0.0";
|
||||
};
|
||||
|
||||
datablock ForceFieldBareData(DeployedForceField3) : DeployedForceField {
|
||||
baseTranslucency = $noPassTrans;
|
||||
powerOffTranslucency = $noPassTrans / $dimDiv;
|
||||
teamPermiable = false;
|
||||
otherPermiable = false;
|
||||
color = $colourOff SPC $colourOff SPC $colourOn;
|
||||
powerOffColor = "0.0 0.0 0.0";
|
||||
};
|
||||
|
||||
datablock ForceFieldBareData(DeployedForceField4) : DeployedForceField {
|
||||
baseTranslucency = $noPassTrans;
|
||||
powerOffTranslucency = $noPassTrans / $dimDiv;
|
||||
teamPermiable = false;
|
||||
otherPermiable = false;
|
||||
color = $colourOff SPC $colourOn SPC $colourOn;
|
||||
powerOffColor = "0.0 0.0 0.0";
|
||||
};
|
||||
|
||||
datablock ForceFieldBareData(DeployedForceField5) : DeployedForceField {
|
||||
baseTranslucency = $noPassTrans;
|
||||
powerOffTranslucency = $noPassTrans / $dimDiv;
|
||||
teamPermiable = false;
|
||||
otherPermiable = false;
|
||||
color = $colourOn SPC $colourOff SPC $colourOn;
|
||||
powerOffColor = "0.0 0.0 0.0";
|
||||
};
|
||||
|
||||
datablock ForceFieldBareData(DeployedForceField6) : DeployedForceField {
|
||||
baseTranslucency = $noPassTrans;
|
||||
powerOffTranslucency = $noPassTrans / $dimDiv;
|
||||
teamPermiable = false;
|
||||
otherPermiable = false;
|
||||
color = $colourOn SPC $colourOn SPC $colourOff;
|
||||
powerOffColor = "0.0 0.0 0.0";
|
||||
};
|
||||
|
||||
// Team pass
|
||||
datablock ForceFieldBareData(DeployedForceField7) : DeployedForceField {
|
||||
baseTranslucency = $teamPassTrans;
|
||||
powerOffTranslucency = $teamPassTrans / $dimDiv;
|
||||
teamPermiable = true;
|
||||
otherPermiable = false;
|
||||
color = $colourOn SPC $colourOn SPC $colourOn;
|
||||
powerOffColor = "0.0 0.0 0.0";
|
||||
};
|
||||
|
||||
datablock ForceFieldBareData(DeployedForceField8) : DeployedForceField {
|
||||
baseTranslucency = $teamPassTrans;
|
||||
powerOffTranslucency = $teamPassTrans / $dimDiv;
|
||||
teamPermiable = true;
|
||||
otherPermiable = false;
|
||||
color = $colourOn SPC $colourOff SPC $colourOff;
|
||||
powerOffColor = "0.0 0.0 0.0";
|
||||
};
|
||||
|
||||
datablock ForceFieldBareData(DeployedForceField9) : DeployedForceField {
|
||||
baseTranslucency = $teamPassTrans;
|
||||
powerOffTranslucency = $teamPassTrans / $dimDiv;
|
||||
teamPermiable = true;
|
||||
otherPermiable = false;
|
||||
color = $colourOff SPC $colourOn SPC $colourOff;
|
||||
powerOffColor = "0.0 0.0 0.0";
|
||||
};
|
||||
|
||||
datablock ForceFieldBareData(DeployedForceField10) : DeployedForceField {
|
||||
baseTranslucency = $teamPassTrans;
|
||||
powerOffTranslucency = $teamPassTrans / $dimDiv;
|
||||
teamPermiable = true;
|
||||
otherPermiable = false;
|
||||
color = $colourOff SPC $colourOff SPC $colourOn;
|
||||
powerOffColor = "0.0 0.0 0.0";
|
||||
};
|
||||
|
||||
datablock ForceFieldBareData(DeployedForceField11) : DeployedForceField {
|
||||
baseTranslucency = $teamPassTrans;
|
||||
powerOffTranslucency = $teamPassTrans / $dimDiv;
|
||||
teamPermiable = true;
|
||||
otherPermiable = false;
|
||||
color = $colourOff SPC $colourOn SPC $colourOn;
|
||||
powerOffColor = "0.0 0.0 0.0";
|
||||
};
|
||||
|
||||
datablock ForceFieldBareData(DeployedForceField12) : DeployedForceField {
|
||||
baseTranslucency = $teamPassTrans;
|
||||
powerOffTranslucency = $teamPassTrans / $dimDiv;
|
||||
teamPermiable = true;
|
||||
otherPermiable = false;
|
||||
color = $colourOn SPC $colourOff SPC $colourOn;
|
||||
powerOffColor = "0.0 0.0 0.0";
|
||||
};
|
||||
|
||||
datablock ForceFieldBareData(DeployedForceField13) : DeployedForceField {
|
||||
baseTranslucency = $teamPassTrans;
|
||||
powerOffTranslucency = $teamPassTrans / $dimDiv;
|
||||
teamPermiable = true;
|
||||
otherPermiable = false;
|
||||
color = $colourOn SPC $colourOn SPC $colourOff;
|
||||
powerOffColor = "0.0 0.0 0.0";
|
||||
};
|
||||
|
||||
// All pass
|
||||
datablock ForceFieldBareData(DeployedForceField14) : DeployedForceField {
|
||||
baseTranslucency = $allPassTrans;
|
||||
powerOffTranslucency = $allPassTrans / $dimDiv;
|
||||
teamPermiable = true;
|
||||
otherPermiable = true;
|
||||
color = $colourOn SPC $colourOn SPC $colourOn;
|
||||
powerOffColor = "0.0 0.0 0.0";
|
||||
};
|
||||
|
||||
datablock ForceFieldBareData(DeployedForceField15) : DeployedForceField {
|
||||
baseTranslucency = $allPassTrans;
|
||||
powerOffTranslucency = $allPassTrans / $dimDiv;
|
||||
teamPermiable = true;
|
||||
otherPermiable = true;
|
||||
color = $colourOn SPC $colourOff SPC $colourOff;
|
||||
powerOffColor = "0.0 0.0 0.0";
|
||||
};
|
||||
|
||||
datablock ForceFieldBareData(DeployedForceField16) : DeployedForceField {
|
||||
baseTranslucency = $allPassTrans;
|
||||
powerOffTranslucency = $allPassTrans / $dimDiv;
|
||||
teamPermiable = true;
|
||||
otherPermiable = true;
|
||||
color = $colourOff SPC $colourOn SPC $colourOff;
|
||||
powerOffColor = "0.0 0.0 0.0";
|
||||
};
|
||||
|
||||
datablock ForceFieldBareData(DeployedForceField17) : DeployedForceField {
|
||||
baseTranslucency = $allPassTrans;
|
||||
powerOffTranslucency = $allPassTrans / $dimDiv;
|
||||
teamPermiable = true;
|
||||
otherPermiable = true;
|
||||
color = $colourOff SPC $colourOff SPC $colourOn;
|
||||
powerOffColor = "0.0 0.0 0.0";
|
||||
};
|
||||
|
||||
datablock ForceFieldBareData(DeployedForceField18) : DeployedForceField {
|
||||
baseTranslucency = $allPassTrans;
|
||||
powerOffTranslucency = $allPassTrans / $dimDiv;
|
||||
teamPermiable = true;
|
||||
otherPermiable = true;
|
||||
color = $colourOff SPC $colourOn SPC $colourOn;
|
||||
powerOffColor = "0.0 0.0 0.0";
|
||||
};
|
||||
|
||||
datablock ForceFieldBareData(DeployedForceField19) : DeployedForceField {
|
||||
baseTranslucency = $allPassTrans;
|
||||
powerOffTranslucency = $allPassTrans / $dimDiv;
|
||||
teamPermiable = true;
|
||||
otherPermiable = true;
|
||||
color = $colourOn SPC $colourOff SPC $colourOn;
|
||||
powerOffColor = "0.0 0.0 0.0";
|
||||
};
|
||||
|
||||
datablock ForceFieldBareData(DeployedForceField20) : DeployedForceField {
|
||||
baseTranslucency = $allPassTrans;
|
||||
powerOffTranslucency = $allPassTrans / $dimDiv;
|
||||
teamPermiable = true;
|
||||
otherPermiable = true;
|
||||
color = $colourOn SPC $colourOn SPC $colourOff;
|
||||
powerOffColor = "0.0 0.0 0.0";
|
||||
};
|
||||
|
||||
datablock ShapeBaseImageData(ForceFieldDeployableImage) {
|
||||
mass = 1;
|
||||
emap = true;
|
||||
shapeFile = "ammo_chaingun.dts";
|
||||
item = ForceFieldDeployable;
|
||||
mountPoint = 1;
|
||||
offset = "-0.2 -0.125 0";
|
||||
rotation = "0 -1 0 90";
|
||||
deployed = DeployedForceField;
|
||||
heatSignature = 0;
|
||||
|
||||
stateName[0] = "Idle";
|
||||
stateTransitionOnTriggerDown[0] = "Activate";
|
||||
|
||||
stateName[1] = "Activate";
|
||||
stateScript[1] = "onActivate";
|
||||
stateTransitionOnTriggerUp[1] = "Idle";
|
||||
|
||||
maxDepSlope = 360;
|
||||
deploySound = ItemPickupSound;
|
||||
|
||||
minDeployDis = 0.1;
|
||||
maxDeployDis = 50.0;
|
||||
};
|
||||
|
||||
datablock ItemData(ForceFieldDeployable) {
|
||||
className = Pack;
|
||||
catagory = "Deployables";
|
||||
shapeFile = "stackable1s.dts";
|
||||
mass = 1;
|
||||
elasticity = 0.2;
|
||||
friction = 0.6;
|
||||
pickupRadius = 1;
|
||||
rotate = true;
|
||||
image = "ForceFieldDeployableImage";
|
||||
pickUpName = "a force field pack";
|
||||
heatSignature = 0;
|
||||
emap = true;
|
||||
};
|
||||
|
||||
function ForceFieldDeployableImage::testObjectTooClose(%item) {
|
||||
return;
|
||||
}
|
||||
|
||||
function ForceFieldDeployableImage::testNoTerrainFound(%item) {
|
||||
// don't check this for non-Landspike turret deployables
|
||||
}
|
||||
|
||||
function ForceFieldDeployable::onPickup(%this, %obj, %shape, %amount) {
|
||||
// created to prevent console errors
|
||||
}
|
||||
|
||||
function ForceFieldDeployableImage::onDeploy(%item, %plyr, %slot) {
|
||||
//Object
|
||||
%className = "ForceFieldBare";
|
||||
|
||||
%grounded = 0;
|
||||
if (%item.surface.getClassName() $= TerrainBlock)
|
||||
%grounded = 1;
|
||||
|
||||
%playerVector = vectorNormalize(-1 * getWord(%plyr.getEyeVector(),1) SPC getWord(%plyr.getEyeVector(),0) SPC "0");
|
||||
|
||||
if (%item.surfaceinher == 0) {
|
||||
if (vAbs(floorVec(%item.surfaceNrm,100)) $= "0 0 1")
|
||||
%item.surfaceNrm2 = %playerVector;
|
||||
else
|
||||
%item.surfaceNrm2 = vectorNormalize(vectorCross(%item.surfaceNrm,"0 0 1"));
|
||||
}
|
||||
|
||||
%rot = fullRot(%item.surfaceNrm,%item.surfaceNrm2);
|
||||
%scale = getWords($packSetting["forcefield",%plyr.packSet],0,2);
|
||||
%mCenter = "-0.5 -0.5 -0.5";
|
||||
%pad = pad(%item.surfacePt SPC %item.surfaceNrm SPC %item.surfaceNrm2,%scale,%mCenter);
|
||||
%scale = getWords(%pad,0,2);
|
||||
%item.surfacePt = getWords(%pad,3,5);
|
||||
%rot = getWords(%pad,6,9);
|
||||
|
||||
// Add padding
|
||||
%padSize = 0.01;
|
||||
%scale = vectorAdd(%scale,%padSize * 2 SPC %padSize * 2 SPC -%padSize * 2);
|
||||
%item.surfacePt = vectorSub(%item.surfacePt,vectorScale(vectorNormalize(%item.surfaceNrm),%padSize));
|
||||
%item.surfacePt = vectorSub(%item.surfacePt,vectorScale(vectorNormalize(%item.surfaceNrm2),%padSize));
|
||||
%item.surfacePt = vectorSub(%item.surfacePt,vectorScale(vectorNormalize(vectorCross(%item.surfaceNrm,%item.surfaceNrm2)),-%padSize));
|
||||
|
||||
if ($Host::ExpertMode == 1) {
|
||||
if (isCubic(%item.surface) && (%plyr.expertSet == 1 || %plyr.expertSet == 3) && %plyr.team == %item.surface.team
|
||||
&& %item.surface.getType() & $TypeMasks::StaticShapeObjectType
|
||||
&& (($Host::OnlyOwnerCubicReplace == 0) || (%plyr.client == %item.surface.getOwner()))) {
|
||||
%scale = vectorAdd(realSize(%item.surface),%padSize * 2 SPC %padSize * 2 SPC %padSize * 2);
|
||||
%center = realVec(%item.surface,vectorScale(getWords(%scale,0,1) SPC "0",-0.5));
|
||||
%item.surfacePt = vectorAdd(pos(%item.surface),%center);
|
||||
%rot = rot(%item.surface);
|
||||
%mod = vectorScale(matrixMulVector("0 0 0" SPC %rot ,"0 0 1"),-%padSize);
|
||||
%item.surfacePt = vectorAdd(%item.surfacePt,%mod);
|
||||
%item.surface.getDataBlock().disassemble(%plyr, %item.surface);
|
||||
}
|
||||
}
|
||||
|
||||
// TODO - temporary test fix - remove?
|
||||
%scale = vectorAdd(%scale,"0 0 0");
|
||||
%x = getWord(%scale,0);
|
||||
%y = getWord(%scale,1);
|
||||
%z = getWord(%scale,2);
|
||||
if (%x <= 0)
|
||||
%x = 0.001;
|
||||
if (%y <= 0)
|
||||
%y = 0.001;
|
||||
if (%z <= 0)
|
||||
%z = 0.001;
|
||||
%scale = %x SPC %y SPC %z;
|
||||
|
||||
%deplObj = new (%className)() {
|
||||
dataBlock = %item.deployed @ %plyr.packSet;
|
||||
scale = %scale;
|
||||
};
|
||||
|
||||
// Take the deployable off the player's back and out of inventory
|
||||
if ($Host::ExpertMode == 0) {
|
||||
%plyr.unMountImage(%slot);
|
||||
%plyr.decInventory(%item.item,1);
|
||||
}
|
||||
|
||||
////////////////////////Apply settings//////////////////////////////
|
||||
|
||||
// [[Location]]:
|
||||
|
||||
// exact:
|
||||
%deplObj.setTransform(%item.surfacePt SPC %rot);
|
||||
%deplObj.pzone.setTransform(%item.surfacePt SPC %rot);
|
||||
|
||||
if ($Host::ExpertMode == 1) {
|
||||
if (%plyr.expertSet == 2 || %plyr.expertSet == 3) {
|
||||
%deplObj.noSlow = true;
|
||||
%deplObj.pzone.delete();
|
||||
%deplObj.pzone = "";
|
||||
}
|
||||
}
|
||||
|
||||
// misc info
|
||||
addDSurface(%item.surface,%deplObj);
|
||||
|
||||
// [[Settings]]:
|
||||
|
||||
%deplObj.grounded = %grounded;
|
||||
%deplObj.needsFit = 1;
|
||||
|
||||
// [[Normal Stuff]]:
|
||||
|
||||
// set team, owner, and handle
|
||||
%deplObj.team = %plyr.client.team;
|
||||
%deplObj.setOwner(%plyr);
|
||||
|
||||
// set power frequency
|
||||
%deplObj.powerFreq = %plyr.powerFreq;
|
||||
|
||||
// set the sensor group if it needs one
|
||||
if (%deplObj.getTarget() != -1)
|
||||
setTargetSensorGroup(%deplObj.getTarget(), %plyr.client.team);
|
||||
|
||||
// place the deployable in the MissionCleanup/Deployables group (AI reasons)
|
||||
addToDeployGroup(%deplObj);
|
||||
|
||||
//let the AI know as well...
|
||||
AIDeployObject(%plyr.client, %deplObj);
|
||||
|
||||
// play the deploy sound
|
||||
serverPlay3D(%item.deploySound, %deplObj.getTransform());
|
||||
|
||||
// increment the team count for this deployed object
|
||||
$TeamDeployedCount[%plyr.team, %item.item]++;
|
||||
|
||||
// Power object
|
||||
checkPowerObject(%deplObj);
|
||||
|
||||
if (!%deplObj.powerCount > 0) {
|
||||
%deplObj.getDataBlock().disassemble(0,%deplObj); // Run Item Specific code.
|
||||
messageClient(%plyr.client,'MsgDeployFailed','\c2Force field lost - no power source found!%1','~wfx/misc/misc.error.wav');
|
||||
}
|
||||
|
||||
return %deplObj;
|
||||
}
|
||||
|
||||
/////////////////////////////////////
|
||||
|
||||
function ForceFieldDeployableImage::onMount(%data, %obj, %node) {
|
||||
%obj.hasForceField = true; // set for forcefieldcheck
|
||||
%obj.packSet = 0;
|
||||
%obj.expertSet = 0;
|
||||
displayPowerFreq(%obj);
|
||||
}
|
||||
|
||||
function ForceFieldDeployableImage::onUnmount(%data, %obj, %node) {
|
||||
%obj.hasForceField = "";
|
||||
%obj.packSet = 0;
|
||||
%obj.expertSet = 0;
|
||||
}
|
||||
|
||||
function DeployedForceField::disassemble(%data,%plyr,%obj) {
|
||||
if (isObject(%obj.pzone))
|
||||
%obj.pzone.delete();
|
||||
disassemble(%data,%plyr,%obj);
|
||||
}
|
||||
|
||||
function DeployedForceField0::disassemble(%data,%plyr,%obj) {
|
||||
DeployedForceField::disassemble(%data,%plyr,%obj);
|
||||
}
|
||||
|
||||
function DeployedForceField1::disassemble(%data,%plyr,%obj) {
|
||||
DeployedForceField::disassemble(%data,%plyr,%obj);
|
||||
}
|
||||
|
||||
function DeployedForceField2::disassemble(%data,%plyr,%obj) {
|
||||
DeployedForceField::disassemble(%data,%plyr,%obj);
|
||||
}
|
||||
|
||||
function DeployedForceField3::disassemble(%data,%plyr,%obj) {
|
||||
DeployedForceField::disassemble(%data,%plyr,%obj);
|
||||
}
|
||||
|
||||
function DeployedForceField4::disassemble(%data,%plyr,%obj) {
|
||||
DeployedForceField::disassemble(%data,%plyr,%obj);
|
||||
}
|
||||
|
||||
function DeployedForceField5::disassemble(%data,%plyr,%obj) {
|
||||
DeployedForceField::disassemble(%data,%plyr,%obj);
|
||||
}
|
||||
|
||||
function DeployedForceField6::disassemble(%data,%plyr,%obj) {
|
||||
DeployedForceField::disassemble(%data,%plyr,%obj);
|
||||
}
|
||||
|
||||
function DeployedForceField7::disassemble(%data,%plyr,%obj) {
|
||||
DeployedForceField::disassemble(%data,%plyr,%obj);
|
||||
}
|
||||
|
||||
function DeployedForceField8::disassemble(%data,%plyr,%obj) {
|
||||
DeployedForceField::disassemble(%data,%plyr,%obj);
|
||||
}
|
||||
|
||||
function DeployedForceField9::disassemble(%data,%plyr,%obj) {
|
||||
DeployedForceField::disassemble(%data,%plyr,%obj);
|
||||
}
|
||||
|
||||
function DeployedForceField10::disassemble(%data,%plyr,%obj) {
|
||||
DeployedForceField::disassemble(%data,%plyr,%obj);
|
||||
}
|
||||
|
||||
function DeployedForceField11::disassemble(%data,%plyr,%obj) {
|
||||
DeployedForceField::disassemble(%data,%plyr,%obj);
|
||||
}
|
||||
|
||||
function DeployedForceField12::disassemble(%data,%plyr,%obj) {
|
||||
DeployedForceField::disassemble(%data,%plyr,%obj);
|
||||
}
|
||||
|
||||
function DeployedForceField13::disassemble(%data,%plyr,%obj) {
|
||||
DeployedForceField::disassemble(%data,%plyr,%obj);
|
||||
}
|
||||
|
||||
function DeployedForceField14::disassemble(%data,%plyr,%obj) {
|
||||
DeployedForceField::disassemble(%data,%plyr,%obj);
|
||||
}
|
||||
|
||||
function DeployedForceField15::disassemble(%data,%plyr,%obj) {
|
||||
DeployedForceField::disassemble(%data,%plyr,%obj);
|
||||
}
|
||||
|
||||
function DeployedForceField16::disassemble(%data,%plyr,%obj) {
|
||||
DeployedForceField::disassemble(%data,%plyr,%obj);
|
||||
}
|
||||
|
||||
function DeployedForceField17::disassemble(%data,%plyr,%obj) {
|
||||
DeployedForceField::disassemble(%data,%plyr,%obj);
|
||||
}
|
||||
|
||||
function DeployedForceField18::disassemble(%data,%plyr,%obj) {
|
||||
DeployedForceField::disassemble(%data,%plyr,%obj);
|
||||
}
|
||||
|
||||
function DeployedForceField19::disassemble(%data,%plyr,%obj) {
|
||||
DeployedForceField::disassemble(%data,%plyr,%obj);
|
||||
}
|
||||
|
||||
function DeployedForceField20::disassemble(%data,%plyr,%obj) {
|
||||
DeployedForceField::disassemble(%data,%plyr,%obj);
|
||||
}
|
||||
145
scripts/packs/generator.cs
Normal file
145
scripts/packs/generator.cs
Normal file
|
|
@ -0,0 +1,145 @@
|
|||
//--------------------------------------------------------------------------
|
||||
// Deployable Generator
|
||||
//--------------------------------------------------------------------------
|
||||
|
||||
datablock ShapeBaseImageData(GeneratorDeployableImage) {
|
||||
mass = 1;
|
||||
emap = true;
|
||||
shapeFile = "stackable1s.dts";
|
||||
item = GeneratorDeployable;
|
||||
mountPoint = 1;
|
||||
offset = "0 0 0";
|
||||
deployed = GeneratorLarge;
|
||||
heatSignature = 0;
|
||||
|
||||
stateName[0] = "Idle";
|
||||
stateTransitionOnTriggerDown[0] = "Activate";
|
||||
|
||||
stateName[1] = "Activate";
|
||||
stateScript[1] = "onActivate";
|
||||
stateTransitionOnTriggerUp[1] = "Idle";
|
||||
|
||||
isLarge = true;
|
||||
maxDepSlope = 360;
|
||||
deploySound = ItemPickupSound;
|
||||
|
||||
minDeployDis = 2;
|
||||
maxDeployDis = 5;
|
||||
};
|
||||
|
||||
datablock ItemData(GeneratorDeployable) {
|
||||
className = Pack;
|
||||
catagory = "Deployables";
|
||||
shapeFile = "stackable1s.dts";
|
||||
mass = 1;
|
||||
|
||||
hasLight = true;
|
||||
lightType = "PulsingLight";
|
||||
lightColor = "0.1 0.8 0.8 1.0";
|
||||
lightTime = "1000";
|
||||
lightRadius = "3";
|
||||
|
||||
elasticity = 0.2;
|
||||
friction = 0.6;
|
||||
pickupRadius = 3;
|
||||
rotate = true;
|
||||
image = "GeneratorDeployableImage";
|
||||
pickUpName = "a generator pack";
|
||||
heatSignature = 0;
|
||||
emap = true;
|
||||
};
|
||||
|
||||
function GeneratorDeployableImage::testNoTerrainFound(%item) {
|
||||
// don't check this for non-Landspike turret deployables
|
||||
}
|
||||
|
||||
function GeneratorDeployable::onPickup(%this, %obj, %shape, %amount) {
|
||||
// created to prevent console errors
|
||||
}
|
||||
|
||||
function GeneratorDeployableImage::onDeploy(%item, %plyr, %slot) {
|
||||
%className = "StaticShape";
|
||||
|
||||
%playerVector = vectorNormalize(getWord(%plyr.getEyeVector(),1) SPC -1 * getWord(%plyr.getEyeVector(),0) SPC "0");
|
||||
|
||||
if (vAbs(floorVec(%item.surfaceNrm,100)) $= "0 0 1")
|
||||
%item.surfaceNrm2 = vectorScale(%playerVector,-1);
|
||||
else
|
||||
%item.surfaceNrm2 = vectorNormalize(vectorCross(%item.surfaceNrm,"0 0 1"));
|
||||
|
||||
%rot = fullRot(%item.surfaceNrm,%item.surfaceNrm2);
|
||||
|
||||
%item.surfacePt = vectorAdd(%item.surfacePt,vectorScale(vectorNormalize(vectorCross(%item.surfaceNrm,%item.surfaceNrm2)),2));
|
||||
|
||||
%deplObj = new (%className)() {
|
||||
dataBlock = GeneratorLarge;
|
||||
deployed = true;
|
||||
};
|
||||
|
||||
// set orientation
|
||||
%deplObj.setTransform(%item.surfacePt SPC %rot);
|
||||
|
||||
// set team, owner, and handle
|
||||
%deplObj.team = %plyr.client.Team;
|
||||
%deplObj.setOwner(%plyr);
|
||||
|
||||
// set power frequency
|
||||
%deplObj.powerFreq = %plyr.powerFreq;
|
||||
setTargetName(%deplObj.target,addTaggedString("Frequency" SPC %deplObj.powerFreq));
|
||||
|
||||
// set power
|
||||
%deplObj.setSelfPowered();
|
||||
|
||||
// set the sensor group if it needs one
|
||||
if (%deplObj.getTarget() != -1)
|
||||
setTargetSensorGroup(%deplObj.getTarget(), %plyr.client.team);
|
||||
|
||||
// place the deployable in the MissionCleanup/Deployables group (AI reasons)
|
||||
addToDeployGroup(%deplObj);
|
||||
|
||||
//let the AI know as well...
|
||||
AIDeployObject(%plyr.client, %deplObj);
|
||||
|
||||
// play the deploy sound
|
||||
serverPlay3D(%item.deploySound, %deplObj.getTransform());
|
||||
|
||||
// increment the team count for this deployed object
|
||||
$TeamDeployedCount[%plyr.team, %item.item]++;
|
||||
|
||||
addDSurface(%item.surface,%deplObj);
|
||||
|
||||
%deplObj.playThread($PowerThread,"Power");
|
||||
|
||||
// take the deployable off the player's back and out of inventory
|
||||
//%plyr.unmountImage(%slot);
|
||||
//%plyr.decInventory(%item.item, 1);
|
||||
|
||||
// add to power list
|
||||
$PowerList = listAdd($PowerList,%deplObj,-1);
|
||||
|
||||
return %deplObj;
|
||||
}
|
||||
|
||||
function GeneratorLarge::onDestroyed(%this,%obj,%prevState) {
|
||||
if (%obj.isRemoved)
|
||||
return;
|
||||
if (%obj.deployed && ($Host::InvincibleDeployables != 1 || %obj.damageFailedDecon)) {
|
||||
%obj.isRemoved = true;
|
||||
%loc = findWord($PowerList,%obj);
|
||||
if (%loc !$= "")
|
||||
$PowerList = listDel($PowerList,%loc);
|
||||
$TeamDeployedCount[%obj.team,GeneratorDeployable]--;
|
||||
remDSurface(%obj);
|
||||
%obj.schedule(500,"delete");
|
||||
}
|
||||
Parent::onDestroyed(%data,%obj,%prevState);
|
||||
}
|
||||
|
||||
function GeneratorDeployableImage::onMount(%data,%obj,%node) {
|
||||
%obj.hasGen = true; // set for gencheck
|
||||
displayPowerFreq(%obj);
|
||||
}
|
||||
|
||||
function GeneratorDeployableImage::onUnmount(%data,%obj,%node) {
|
||||
%obj.hasGen = "";
|
||||
}
|
||||
344
scripts/packs/gravityfieldpack.cs
Normal file
344
scripts/packs/gravityfieldpack.cs
Normal file
|
|
@ -0,0 +1,344 @@
|
|||
//---------------------------------------------------------
|
||||
// Deployable Gravity Field
|
||||
//---------------------------------------------------------
|
||||
|
||||
// Translucencies
|
||||
$fieldTransGrav = 1.0;
|
||||
$powerOffTransGrav = 0.25;
|
||||
|
||||
// RGB
|
||||
$colourOnGrav = 0.6;
|
||||
$colourOffGrav = 0.15;
|
||||
$dimDivGrav = 3;
|
||||
|
||||
datablock ForceFieldBareData(DeployedGravityField) {
|
||||
className = "gravityfield";
|
||||
fadeMS = 1000;
|
||||
baseTranslucency = $fieldTransGrav;
|
||||
powerOffTranslucency = $powerOffTransGrav;
|
||||
teamPermiable = true;
|
||||
otherPermiable = true;
|
||||
color = "1.0 1.0 1.0";
|
||||
powerOffColor = "0.0 0.0 0.0";
|
||||
targetTypeTag = 'GravityField';
|
||||
texture[0] = "skins/forcef1";
|
||||
texture[1] = "skins/forcef2";
|
||||
texture[2] = "skins/forcef3";
|
||||
texture[3] = "skins/forcef4";
|
||||
texture[4] = "skins/forcef5";
|
||||
framesPerSec = 10;
|
||||
numFrames = 5;
|
||||
scrollSpeed = 15;
|
||||
umapping = 1.0;
|
||||
vmapping = 0.15;
|
||||
deployedFrom = GravityFieldDeployable;
|
||||
velocityMod = 1;
|
||||
gravityMod = 1;
|
||||
appliedForce = "0 0 0";
|
||||
needsPower = true;
|
||||
};
|
||||
|
||||
// slow
|
||||
datablock ForceFieldBareData(DeployedGravityField0) : DeployedGravityField {
|
||||
baseTranslucency = $fieldTransGrav;
|
||||
powerOffTranslucency = $powerOffTransGrav;
|
||||
teamPermiable = true;
|
||||
otherPermiable = true;
|
||||
color = $colourOffGrav/$dimDivGrav SPC $colourOnGrav/$dimDivGrav SPC $colourOffGrav/$dimDivGrav;
|
||||
powerOffColor = "0.0 0.0 0.0";
|
||||
velocityMod = 1;
|
||||
gravityMod = 0;
|
||||
};
|
||||
|
||||
// fast
|
||||
datablock ForceFieldBareData(DeployedGravityField1) : DeployedGravityField {
|
||||
baseTranslucency = $fieldTransGrav;
|
||||
powerOffTranslucency = $powerOffTransGrav;
|
||||
teamPermiable = true;
|
||||
otherPermiable = true;
|
||||
color = $colourOffGrav SPC $colourOnGrav SPC $colourOffGrav;
|
||||
powerOffColor = "0.0 0.0 0.0";
|
||||
velocityMod = 1;
|
||||
gravityMod = 0;
|
||||
};
|
||||
|
||||
// zero gravity
|
||||
datablock ForceFieldBareData(DeployedGravityField2) : DeployedGravityField {
|
||||
baseTranslucency = $fieldTransGrav;
|
||||
powerOffTranslucency = $powerOffTransGrav;
|
||||
teamPermiable = true;
|
||||
otherPermiable = true;
|
||||
color = $colourOnGrav SPC $colourOnGrav SPC $colourOffGrav;
|
||||
powerOffColor = "0.0 0.0 0.0";
|
||||
velocityMod = 1;
|
||||
gravityMod = 0;
|
||||
};
|
||||
|
||||
// fastfield
|
||||
datablock ForceFieldBareData(DeployedGravityField3) : DeployedGravityField {
|
||||
baseTranslucency = $fieldTransGrav;
|
||||
powerOffTranslucency = $powerOffTransGrav;
|
||||
teamPermiable = true;
|
||||
otherPermiable = true;
|
||||
color = $colourOnGrav/$dimDivGrav SPC $colourOffGrav/$dimDivGrav SPC $colourOnGrav/$dimDivGrav;
|
||||
powerOffColor = "0.0 0.0 0.0";
|
||||
velocityMod = 1.5;
|
||||
gravityMod = 0;
|
||||
};
|
||||
|
||||
// super fastfield
|
||||
datablock ForceFieldBareData(DeployedGravityField4) : DeployedGravityField {
|
||||
baseTranslucency = $fieldTransGrav;
|
||||
powerOffTranslucency = $powerOffTransGrav;
|
||||
teamPermiable = true;
|
||||
otherPermiable = true;
|
||||
color = $colourOnGrav SPC $colourOffGrav SPC $colourOnGrav;
|
||||
powerOffColor = "0.0 0.0 0.0";
|
||||
velocityMod = 1.7;
|
||||
gravityMod = 0;
|
||||
};
|
||||
|
||||
datablock ShapeBaseImageData(GravityFieldDeployableImage) {
|
||||
mass = 1;
|
||||
emap = true;
|
||||
shapeFile = "ammo_chaingun.dts";
|
||||
item = GravityFieldDeployable;
|
||||
mountPoint = 1;
|
||||
offset = "-0.2 -0.125 0";
|
||||
rotation = "0 -1 0 90";
|
||||
deployed = DeployedGravityField;
|
||||
heatSignature = 0;
|
||||
|
||||
stateName[0] = "Idle";
|
||||
stateTransitionOnTriggerDown[0] = "Activate";
|
||||
|
||||
stateName[1] = "Activate";
|
||||
stateScript[1] = "onActivate";
|
||||
stateTransitionOnTriggerUp[1] = "Idle";
|
||||
|
||||
maxDepSlope = 360;
|
||||
deploySound = ItemPickupSound;
|
||||
|
||||
minDeployDis = 0.1;
|
||||
maxDeployDis = 50.0;
|
||||
};
|
||||
|
||||
datablock ItemData(GravityFieldDeployable) {
|
||||
className = Pack;
|
||||
catagory = "Deployables";
|
||||
shapeFile = "stackable1s.dts";
|
||||
mass = 1;
|
||||
elasticity = 0.2;
|
||||
friction = 0.6;
|
||||
pickupRadius = 1;
|
||||
joint = "4.75 4.75 4.75";
|
||||
rotate = true;
|
||||
image = "GravityFieldDeployableImage";
|
||||
pickUpName = "a gravity field pack";
|
||||
heatSignature = 0;
|
||||
emap = true;
|
||||
};
|
||||
|
||||
function GravityFieldDeployableImage::testObjectTooClose(%item) {
|
||||
return;
|
||||
}
|
||||
|
||||
function GravityFieldDeployableImage::testNoTerrainFound(%item) {
|
||||
// don't check this for non-Landspike turret deployables
|
||||
}
|
||||
|
||||
function GravityFieldDeployable::onPickup(%this, %obj, %shape, %amount) {
|
||||
// created to prevent console errors
|
||||
}
|
||||
|
||||
function GravityFieldDeployableImage::onDeploy(%item, %plyr, %slot) {
|
||||
//Object
|
||||
%className = "ForceFieldBare";
|
||||
|
||||
%grounded = 0;
|
||||
if (%item.surface.getClassName() $= TerrainBlock)
|
||||
%grounded = 1;
|
||||
|
||||
%playerVector = vectorNormalize(-1 * getWord(%plyr.getEyeVector(),1) SPC getWord(%plyr.getEyeVector(),0) SPC "0");
|
||||
|
||||
if (%item.surfaceinher == 0) {
|
||||
if (vAbs(floorVec(%item.surfaceNrm,100)) $= "0 0 1")
|
||||
%item.surfaceNrm2 = %playerVector;
|
||||
else
|
||||
%item.surfaceNrm2 = vectorNormalize(vectorCross(%item.surfaceNrm,"0 0 1"));
|
||||
}
|
||||
|
||||
%rot = fullRot(%item.surfaceNrm,%item.surfaceNrm2);
|
||||
%scale = getWords($packSetting["gravfield",%plyr.packSet],0,2);
|
||||
|
||||
%space = rayDist(%item.surfacePt SPC %item.surfaceNrm,%scale);
|
||||
%scale = getWord(%scale,0) SPC getWord(%scale,0) SPC %space;
|
||||
|
||||
// Shift field position since field handle is not field center
|
||||
%mod = firstWord($packSetting["gravfield",%plyr.packSet]) / 2;
|
||||
%item.surfacePt = vectorSub(%item.surfacePt,vectorScale(vectorNormalize(%item.surfaceNrm2),%mod));
|
||||
%item.surfacePt = vectorSub(%item.surfacePt,vectorScale(vectorNormalize(vectorCross(%item.surfaceNrm,%item.surfaceNrm2)),%mod));
|
||||
|
||||
// Add padding
|
||||
%padSize = 0.01;
|
||||
%scale = vectorAdd(%scale,%padSize * 2 SPC %padSize * 2 SPC %padSize * 2);
|
||||
%item.surfacePt = vectorSub(%item.surfacePt,vectorScale(vectorNormalize(%item.surfaceNrm),%padSize));
|
||||
%item.surfacePt = vectorSub(%item.surfacePt,vectorScale(vectorNormalize(%item.surfaceNrm2),%padSize));
|
||||
%item.surfacePt = vectorSub(%item.surfacePt,vectorScale(vectorNormalize(vectorCross(%item.surfaceNrm,%item.surfaceNrm2)),%padSize));
|
||||
|
||||
// Set datablock
|
||||
if (%plyr.packSet == 0)
|
||||
%dataBlock = nameToID(%item.deployed @ 0);
|
||||
else if (%plyr.packSet == 1)
|
||||
%dataBlock = nameToID(%item.deployed @ 1);
|
||||
else if (%plyr.packSet == 2)
|
||||
%dataBlock = nameToID(%item.deployed @ 0);
|
||||
else if (%plyr.packSet == 3)
|
||||
%dataBlock = nameToID(%item.deployed @ 1);
|
||||
else if (%plyr.packSet == 4)
|
||||
%dataBlock = nameToID(%item.deployed @ 2);
|
||||
else if (%plyr.packSet == 5)
|
||||
%dataBlock = nameToID(%item.deployed @ 3);
|
||||
else if (%plyr.packSet == 6)
|
||||
%dataBlock = nameToID(%item.deployed @ 4);
|
||||
|
||||
%appliedForceVec = vectorNormalize(%item.surfaceNrm);
|
||||
|
||||
if ($Host::ExpertMode == 1) {
|
||||
if (isCubic(%item.surface) && (%plyr.expertSet == 1 || %plyr.expertSet == 2) && %plyr.team == %item.surface.team
|
||||
&& %item.surface.getType() & $TypeMasks::StaticShapeObjectType
|
||||
&& (($Host::OnlyOwnerCubicReplace == 0) || (%plyr.client == %item.surface.getOwner()))) {
|
||||
if (%plyr.expertSet == 2)
|
||||
%appliedForceVec = vectorNormalize(realVec(%item.surface,"0 0 1"));
|
||||
%scale = vectorAdd(realSize(%item.surface),%padSize * 2 SPC %padSize * 2 SPC %padSize * 2);
|
||||
%center = realVec(%item.surface,vectorScale(getWords(%scale,0,1) SPC "0",-0.5));
|
||||
%item.surfacePt = vectorAdd(pos(%item.surface),%center);
|
||||
%rot = rot(%item.surface);
|
||||
%mod = vectorScale(matrixMulVector("0 0 0" SPC %rot ,"0 0 1"),-%padSize);
|
||||
%item.surfacePt = vectorAdd(%item.surfacePt,%mod);
|
||||
%item.surface.getDataBlock().disassemble(%plyr, %item.surface);
|
||||
}
|
||||
}
|
||||
|
||||
%velocityMod = %dataBlock.velocityMod;
|
||||
%gravityMod = %dataBlock.gravityMod;
|
||||
%appliedForce = %dataBlock.appliedForce;
|
||||
|
||||
%slowForce = 500;
|
||||
%fastForce = 1000;
|
||||
|
||||
if (%plyr.packSet == 0)
|
||||
%appliedForce = vectorScale(%appliedForceVec,%slowForce);
|
||||
else if (%plyr.packSet == 1)
|
||||
%appliedForce = vectorScale(%appliedForceVec,%fastForce);
|
||||
else if (%plyr.packSet == 2)
|
||||
%appliedForce = vectorScale(%appliedForceVec,-%slowForce);
|
||||
else if (%plyr.packSet == 3)
|
||||
%appliedForce = vectorScale(%appliedForceVec,-%fastForce);
|
||||
|
||||
%deplObj = new (%className)() {
|
||||
dataBlock = %dataBlock;
|
||||
scale = %scale;
|
||||
velocityMod = %velocityMod;
|
||||
gravityMod = %gravityMod;
|
||||
appliedForce = %appliedForce;
|
||||
};
|
||||
|
||||
// Take the deployable off the player's back and out of inventory
|
||||
if ($Host::ExpertMode == 0) {
|
||||
%plyr.unMountImage(%slot);
|
||||
%plyr.decInventory(%item.item,1);
|
||||
}
|
||||
|
||||
////////////////////////Apply settings//////////////////////////////
|
||||
|
||||
// [[Location]]:
|
||||
|
||||
// exact:
|
||||
%deplObj.setTransform(%item.surfacePt SPC %rot);
|
||||
%deplObj.pzone.setTransform(%item.surfacePt SPC %rot);
|
||||
|
||||
// misc info
|
||||
addDSurface(%item.surface,%deplObj);
|
||||
|
||||
// [[Settings]]:
|
||||
|
||||
%deplObj.grounded = %grounded;
|
||||
%deplObj.needsFit = 1;
|
||||
|
||||
// [[Normal Stuff]]:
|
||||
|
||||
// set team, owner, and handle
|
||||
%deplObj.team = %plyr.client.team;
|
||||
%deplObj.setOwner(%plyr);
|
||||
|
||||
// set power frequency
|
||||
%deplObj.powerFreq = %plyr.powerFreq;
|
||||
|
||||
// set the sensor group if it needs one
|
||||
if (%deplObj.getTarget() != -1)
|
||||
setTargetSensorGroup(%deplObj.getTarget(), %plyr.client.team);
|
||||
|
||||
// place the deployable in the MissionCleanup/Deployables group (AI reasons)
|
||||
addToDeployGroup(%deplObj);
|
||||
|
||||
//let the AI know as well...
|
||||
AIDeployObject(%plyr.client, %deplObj);
|
||||
|
||||
// play the deploy sound
|
||||
serverPlay3D(%item.deploySound, %deplObj.getTransform());
|
||||
|
||||
// increment the team count for this deployed object
|
||||
$TeamDeployedCount[%plyr.team, %item.item]++;
|
||||
|
||||
// Power object
|
||||
checkPowerObject(%deplObj);
|
||||
|
||||
if (!%deplObj.powerCount > 0) {
|
||||
%deplObj.getDataBlock().disassemble(0,%deplObj); // Run Item Specific code.
|
||||
messageClient(%plyr.client,'MsgDeployFailed','\c2Gravity field lost - no power source found!%1','~wfx/misc/misc.error.wav');
|
||||
}
|
||||
|
||||
return %deplObj;
|
||||
}
|
||||
|
||||
/////////////////////////////////////
|
||||
|
||||
function GravityFieldDeployableImage::onMount(%data, %obj, %node) {
|
||||
%obj.hasGravField = true; // set for gravfieldcheck
|
||||
%obj.packSet = 0;
|
||||
%obj.expertSet = 0;
|
||||
displayPowerFreq(%obj);
|
||||
}
|
||||
|
||||
function GravityFieldDeployableImage::onUnmount(%data, %obj, %node) {
|
||||
%obj.hasGravField = "";
|
||||
%obj.packSet = 0;
|
||||
%obj.expertSet = 0;
|
||||
}
|
||||
|
||||
function DeployedGravityField::disassemble(%data,%plyr,%obj) {
|
||||
if (isObject(%obj.pzone))
|
||||
%obj.pzone.delete();
|
||||
disassemble(%data,%plyr,%obj);
|
||||
}
|
||||
|
||||
function DeployedGravityField0::disassemble(%data,%plyr,%obj) {
|
||||
DeployedGravityField::disassemble(%data,%plyr,%obj);
|
||||
}
|
||||
|
||||
function DeployedGravityField1::disassemble(%data,%plyr,%obj) {
|
||||
DeployedGravityField::disassemble(%data,%plyr,%obj);
|
||||
}
|
||||
|
||||
function DeployedGravityField2::disassemble(%data,%plyr,%obj) {
|
||||
DeployedGravityField::disassemble(%data,%plyr,%obj);
|
||||
}
|
||||
|
||||
function DeployedGravityField3::disassemble(%data,%plyr,%obj) {
|
||||
DeployedGravityField::disassemble(%data,%plyr,%obj);
|
||||
}
|
||||
|
||||
function DeployedGravityField4::disassemble(%data,%plyr,%obj) {
|
||||
DeployedGravityField::disassemble(%data,%plyr,%obj);
|
||||
}
|
||||
176
scripts/packs/jumpad.cs
Normal file
176
scripts/packs/jumpad.cs
Normal file
|
|
@ -0,0 +1,176 @@
|
|||
//--------------------------------------------------------------------------
|
||||
// Jumpad
|
||||
//--------------------------------------------------------------------------
|
||||
|
||||
datablock StaticShapeData(DeployedJumpad) : StaticShapeDamageProfile {
|
||||
className = "jumpad";
|
||||
shapeFile = "nexusbase.dts"; // dmiscf.dts, alternate
|
||||
maxDamage = 2.0;
|
||||
destroyedLevel = 2.0;
|
||||
disabledLevel = 2.0;
|
||||
mass = 1;
|
||||
elasticity = 0.1;
|
||||
friction = 0.9;
|
||||
collideable = 1;
|
||||
pickupRadius = 1;
|
||||
sticky=false;
|
||||
|
||||
impulse = 5000;
|
||||
|
||||
hasLight = true;
|
||||
lightType = "PulsingLight";
|
||||
lightColor = "0.1 0.8 0.8 1.0";
|
||||
lightTime = "100";
|
||||
lightRadius = "3";
|
||||
|
||||
explosion = HandGrenadeExplosion;
|
||||
expDmgRadius = 3.0;
|
||||
expDamage = 0.1;
|
||||
expImpulse = 200.0;
|
||||
dynamicType = $TypeMasks::StaticShapeObjectType;
|
||||
deployedObject = true;
|
||||
cmdCategory = "DSupport";
|
||||
cmdIcon = CMDSensorIcon;
|
||||
cmdMiniIconName = "commander/MiniIcons/com_deploymotionsensor";
|
||||
|
||||
targetNameTag = 'Jump';
|
||||
targetTypeTag = 'Pad';
|
||||
deployAmbientThread = true;
|
||||
debrisShapeName = "debris_generic_small.dts";
|
||||
debris = DeployableDebris;
|
||||
heatSignature = 0;
|
||||
};
|
||||
|
||||
datablock ShapeBaseImageData(JumpadDeployableImage) {
|
||||
mass = 1;
|
||||
emap = true;
|
||||
shapeFile = "stackable1s.dts";
|
||||
item = JumpadDeployable;
|
||||
mountPoint = 1;
|
||||
offset = "0 0 0";
|
||||
deployed = DeployedJumpad;
|
||||
heatSignature = 0;
|
||||
collideable = 1;
|
||||
stateName[0] = "Idle";
|
||||
stateTransitionOnTriggerDown[0] = "Activate";
|
||||
|
||||
stateName[1] = "Activate";
|
||||
stateScript[1] = "onActivate";
|
||||
stateTransitionOnTriggerUp[1] = "Idle";
|
||||
|
||||
isLarge = true;
|
||||
maxDepSlope = 360; // 30
|
||||
deploySound = ItemPickupSound;
|
||||
|
||||
minDeployDis = 0.5;
|
||||
maxDeployDis = 5.0;
|
||||
};
|
||||
|
||||
datablock ItemData(JumpadDeployable) {
|
||||
className = Pack;
|
||||
catagory = "Deployables";
|
||||
shapeFile = "stackable1s.dts";
|
||||
mass = 1;
|
||||
elasticity = 0.2;
|
||||
friction = 0.6;
|
||||
pickupRadius = 1;
|
||||
rotate = true;
|
||||
image = "JumpadDeployableImage";
|
||||
pickUpName = "a jump pad pack";
|
||||
heatSignature = 0;
|
||||
emap = true;
|
||||
};
|
||||
|
||||
function JumpadDeployable::onPickup(%this, %obj, %shape, %amount) {
|
||||
// created to prevent console errors
|
||||
}
|
||||
|
||||
function JumpadDeployableImage::onDeploy(%item, %plyr, %slot) {
|
||||
%className = "StaticShape";
|
||||
|
||||
%playerVector = vectorNormalize(-1 * getWord(%plyr.getEyeVector(),1) SPC getWord(%plyr.getEyeVector(),0) SPC "0");
|
||||
|
||||
if (vAbs(floorVec(%item.surfaceNrm,100)) $= "0 0 1")
|
||||
%item.surfaceNrm2 = %playerVector;
|
||||
else
|
||||
%item.surfaceNrm2 = vectorNormalize(vectorCross(%item.surfaceNrm,"0 0 -1"));
|
||||
|
||||
%impulse = firstWord($packSetting["jumpad",%plyr.packSet]);
|
||||
|
||||
%deplObj = new (%className)() {
|
||||
dataBlock = %item.deployed;
|
||||
scale = "1 1 2";
|
||||
};
|
||||
|
||||
// set impulse (jump pad strength)
|
||||
%deplObj.impulse = %impulse;
|
||||
|
||||
// set orientation
|
||||
%deplObj.setDeployRotation(getWords(%item.surfacePt, 0, 1) SPC getWord(%item.surfacePt, 2) + 0.1, %item.surfaceNrm);
|
||||
|
||||
// set the recharge rate right away
|
||||
if (%deplObj.getDatablock().rechargeRate)
|
||||
%deplObj.setRechargeRate(%deplObj.getDatablock().rechargeRate);
|
||||
|
||||
// set team, owner, and handle
|
||||
%deplObj.team = %plyr.client.Team;
|
||||
%deplObj.setOwner(%plyr);
|
||||
|
||||
// place the deployable in the MissionCleanup/Deployables group (AI reasons)
|
||||
addToDeployGroup(%deplObj);
|
||||
|
||||
//let the AI know as well...
|
||||
AIDeployObject(%plyr.client, %deplObj);
|
||||
|
||||
// play the deploy sound
|
||||
serverPlay3D(%item.deploySound, %deplObj.getTransform());
|
||||
|
||||
// increment the team count for this deployed object
|
||||
|
||||
// take the deployable off the player's back and out of inventory
|
||||
//%plyr.unmountImage(%slot);
|
||||
//%plyr.decInventory(%item.item, 1);
|
||||
|
||||
$TeamDeployedCount[%plyr.team, %item.item]++;
|
||||
|
||||
addDSurface(%item.surface,%deplObj);
|
||||
return %deplObj;
|
||||
}
|
||||
|
||||
function DeployedJumpad::onCollision(%data,%obj,%col) {
|
||||
// TODO - update escape pod
|
||||
if (%col.getClassName() !$= "Player" && %col.getDataBlock().getName() !$= "EscapePodVehicle")
|
||||
return; // Only boost players
|
||||
//if (%obj.team == %col.team) {
|
||||
%vel = %col.getVelocity();
|
||||
%vec = realVec(%obj,"0 0 1");
|
||||
%position = getWords(%col.getTransform(), 0, 2);
|
||||
// %impulseVec = vectorScale(%vec,1000); // Jump clear of the pad
|
||||
// %col.applyImpulse(%position, %impulseVec);
|
||||
%col.playAudio(0, MortarFireSound);
|
||||
%impulseVec = vectorScale(%vec,%obj.impulse);
|
||||
// %col.schedule(50, "applyImpulse", %position, %impulseVec);
|
||||
%col.applyImpulse(%position, %impulseVec);
|
||||
//}
|
||||
}
|
||||
|
||||
function DeployedJumpad::onDestroyed(%this, %obj, %prevState) {
|
||||
if (%obj.isRemoved)
|
||||
return;
|
||||
%obj.isRemoved = true;
|
||||
Parent::onDestroyed(%this, %obj, %prevState);
|
||||
$TeamDeployedCount[%obj.team, JumpadDeployable]--;
|
||||
remDSurface(%obj);
|
||||
%obj.schedule(500, "delete");
|
||||
fireBallExplode(%obj,1);
|
||||
}
|
||||
|
||||
function JumpadDeployableImage::onMount(%data, %obj, %node) {
|
||||
%obj.hasJumpad = true; // set for jumpadcheck
|
||||
%obj.packSet = 0;
|
||||
}
|
||||
|
||||
function JumpadDeployableImage::onUnmount(%data, %obj, %node) {
|
||||
%obj.hasJumpad = "";
|
||||
%obj.packSet = 0;
|
||||
}
|
||||
123
scripts/packs/largeInventory.cs
Normal file
123
scripts/packs/largeInventory.cs
Normal file
|
|
@ -0,0 +1,123 @@
|
|||
//--------------------------------------------------------------------------
|
||||
// Large Inventory Station
|
||||
//
|
||||
//
|
||||
//--------------------------------------------------------------------------
|
||||
|
||||
datablock ShapeBaseImageData(LargeInventoryDeployableImage) {
|
||||
mass = 1;
|
||||
emap = true;
|
||||
shapeFile = "stackable1s.dts";
|
||||
item = LargeInventoryDeployable;
|
||||
mountPoint = 1;
|
||||
offset = "0 0 0";
|
||||
deployed = StationInventory;
|
||||
heatSignature = 0;
|
||||
|
||||
stateName[0] = "Idle";
|
||||
stateTransitionOnTriggerDown[0] = "Activate";
|
||||
|
||||
stateName[1] = "Activate";
|
||||
stateScript[1] = "onActivate";
|
||||
stateTransitionOnTriggerUp[1] = "Idle";
|
||||
|
||||
isLarge = true;
|
||||
maxDepSlope = 360;
|
||||
deploySound = ItemPickupSound;
|
||||
|
||||
minDeployDis = 0.5;
|
||||
maxDeployDis = 5.0;
|
||||
};
|
||||
|
||||
datablock ItemData(LargeInventoryDeployable)
|
||||
{
|
||||
className = Pack;
|
||||
catagory = "Deployables";
|
||||
shapeFile = "stackable1s.dts";
|
||||
mass = 1;
|
||||
elasticity = 0.2;
|
||||
friction = 0.6;
|
||||
pickupRadius = 1;
|
||||
rotate = true;
|
||||
image = "LargeInventoryDeployableImage";
|
||||
joint = "4.5 4.5 4.5";
|
||||
pickUpName = "a large inventory station pack";
|
||||
heatSignature = 0;
|
||||
emap = true;
|
||||
};
|
||||
|
||||
function LargeInventoryDeployable::onPickup(%this, %obj, %shape, %amount)
|
||||
{
|
||||
// created to prevent console errors
|
||||
}
|
||||
|
||||
function LargeInventoryDeployableImage::onDeploy(%item, %plyr, %slot) {
|
||||
%className = "StaticShape";
|
||||
//%plyr.unMountImage(%slot);
|
||||
//%plyr.decInventory(%item.item,1);
|
||||
%grounded = 0;
|
||||
if (%item.surface.getClassName() $= TerrainBlock)
|
||||
%grounded = 1;
|
||||
|
||||
%playerVector = vectorNormalize(-1 * getWord(%plyr.getEyeVector(),1) SPC getWord(%plyr.getEyeVector(),0) SPC "0");
|
||||
|
||||
if (vAbs(floorVec(%item.surfaceNrm,100)) $= "0 0 1")
|
||||
%item.surfaceNrm2 = vectorScale(%playerVector,-1);
|
||||
else
|
||||
%item.surfaceNrm2 = vectorNormalize(vectorCross(%item.surfaceNrm,"0 0 1"));
|
||||
|
||||
%rot = fullRot(%item.surfaceNrm,%item.surfaceNrm2);
|
||||
|
||||
%deplObj = new (%className)() //Inventory Station
|
||||
{
|
||||
dataBlock = StationInventory;
|
||||
position = %surfacePt;
|
||||
rotation = %rot;
|
||||
deployed = true;
|
||||
};
|
||||
%deplObj.setTransform(%item.surfacePt SPC %rot);
|
||||
|
||||
%deplObj.team = %plyr.client.Team;
|
||||
%deplObj.setOwner(%plyr);
|
||||
addDSurface(%item.surface,%deplObj);
|
||||
|
||||
// set power frequency
|
||||
%deplObj.powerFreq = %plyr.powerFreq;
|
||||
|
||||
if(%deplObj.getTarget() != -1)
|
||||
setTargetSensorGroup(%deplObj.getTarget(), %plyr.client.team);
|
||||
|
||||
// place the deployable in the MissionCleanup/Deployables group (AI reasons)
|
||||
|
||||
addToDeployGroup(%deplObj);
|
||||
|
||||
//let the AI know as well...
|
||||
|
||||
AIDeployObject(%plyr.client, %deplObj);
|
||||
|
||||
// play the deploy sound
|
||||
serverPlay3D(%item.deploySound, %deplObj.getTransform());
|
||||
|
||||
// increment the team count for this deployed object
|
||||
|
||||
$TeamDeployedCount[%plyr.team, %item.item]++;
|
||||
|
||||
%deplObj.deploy();
|
||||
|
||||
// Adjust the trigger object
|
||||
adjustTrigger(%deplObj);
|
||||
|
||||
// Power object
|
||||
checkPowerObject(%deplObj);
|
||||
|
||||
return %deplObj;
|
||||
}
|
||||
|
||||
function LargeInventoryDeployableImage::testNoTerrainFound(%item)
|
||||
{
|
||||
//return %item.surface.getClassName() !$= TerrainBlock;
|
||||
}
|
||||
|
||||
function LargeInventoryDeployableImage::onMount(%data, %obj, %node) {
|
||||
displayPowerFreq(%obj);
|
||||
}
|
||||
129
scripts/packs/largeSensor.cs
Normal file
129
scripts/packs/largeSensor.cs
Normal file
|
|
@ -0,0 +1,129 @@
|
|||
//--------------------------------------------------------------------------
|
||||
// Large Pulse Sensor
|
||||
//--------------------------------------------------------------------------
|
||||
|
||||
datablock ShapeBaseImageData(LargeSensorDeployableImage) {
|
||||
mass = 1;
|
||||
emap = true;
|
||||
shapeFile = "stackable1s.dts";
|
||||
item = LargeSensorDeployable;
|
||||
mountPoint = 1;
|
||||
offset = "0 0 0";
|
||||
deployed = SensorLargePulse;
|
||||
heatSignature = 0;
|
||||
|
||||
stateName[0] = "Idle";
|
||||
stateTransitionOnTriggerDown[0] = "Activate";
|
||||
|
||||
stateName[1] = "Activate";
|
||||
stateScript[1] = "onActivate";
|
||||
stateTransitionOnTriggerUp[1] = "Idle";
|
||||
|
||||
isLarge = true;
|
||||
maxDepSlope = 360;
|
||||
deploySound = ItemPickupSound;
|
||||
|
||||
minDeployDis = 0.5;
|
||||
maxDeployDis = 5.0;
|
||||
};
|
||||
|
||||
datablock ItemData(LargeSensorDeployable) {
|
||||
className = Pack;
|
||||
catagory = "Deployables";
|
||||
shapeFile = "stackable1s.dts";
|
||||
mass = 1;
|
||||
elasticity = 0.2;
|
||||
friction = 0.6;
|
||||
pickupRadius = 1;
|
||||
rotate = true;
|
||||
image = "LargeSensorDeployableImage";
|
||||
joint = "4.5 4.5 4.5";
|
||||
pickUpName = "a large pulse sensor pack";
|
||||
heatSignature = 0;
|
||||
emap = true;
|
||||
};
|
||||
|
||||
function LargeSensorDeployable::onPickup(%this, %obj, %shape, %amount) {
|
||||
// created to prevent console errors
|
||||
}
|
||||
|
||||
function LargeSensorDeployableImage::testNoTerrainFound(%item) {
|
||||
// don't check this for non-Landspike turret deployables
|
||||
}
|
||||
|
||||
function LargeSensorDeployableImage::onDeploy(%item, %plyr, %slot) {
|
||||
%className = "StaticShape";
|
||||
|
||||
%playerVector = vectorNormalize(getWord(%plyr.getEyeVector(),1) SPC -1 * getWord(%plyr.getEyeVector(),0) SPC "0");
|
||||
%item.surfaceNrm2 = %playerVector;
|
||||
|
||||
if (vAbs(floorVec(%item.surfaceNrm,100)) $= "0 0 1")
|
||||
%item.surfaceNrm2 = %playerVector;
|
||||
else
|
||||
%item.surfaceNrm2 = vectorNormalize(vectorCross(%item.surfaceNrm,"0 0 -1"));
|
||||
|
||||
%rot = fullRot(%item.surfaceNrm,%item.surfaceNrm2);
|
||||
|
||||
%deplObj = new (%className)() {
|
||||
dataBlock = SensorLargePulse;
|
||||
deployed = true;
|
||||
};
|
||||
|
||||
// set orientation
|
||||
%deplObj.setTransform(%item.surfacePt SPC %rot);
|
||||
|
||||
// set team, owner, and handle
|
||||
%deplObj.team = %plyr.client.Team;
|
||||
%deplObj.setOwner(%plyr);
|
||||
|
||||
// set power frequency
|
||||
%deplObj.powerFreq = %plyr.powerFreq;
|
||||
// setTargetName(%deplObj.target,addTaggedString("Frequency" SPC %deplObj.powerFreq));
|
||||
|
||||
// set the sensor group if it needs one
|
||||
if (%deplObj.getTarget() != -1)
|
||||
setTargetSensorGroup(%deplObj.getTarget(), %plyr.client.team);
|
||||
|
||||
// place the deployable in the MissionCleanup/Deployables group (AI reasons)
|
||||
addToDeployGroup(%deplObj);
|
||||
|
||||
//let the AI know as well...
|
||||
AIDeployObject(%plyr.client, %deplObj);
|
||||
|
||||
// play the deploy sound
|
||||
serverPlay3D(%item.deploySound, %deplObj.getTransform());
|
||||
|
||||
// increment the team count for this deployed object
|
||||
$TeamDeployedCount[%plyr.team, %item.item]++;
|
||||
|
||||
addDSurface(%item.surface,%deplObj);
|
||||
|
||||
// %deplObj.playThread($PowerThread,"Power");
|
||||
|
||||
// take the deployable off the player's back and out of inventory
|
||||
if(!%plyr.client.isAdmin) {
|
||||
%plyr.unmountImage(%slot);
|
||||
%plyr.decInventory(%item.item, 1);
|
||||
}
|
||||
|
||||
// Power object
|
||||
checkPowerObject(%deplObj);
|
||||
|
||||
return %deplObj;
|
||||
}
|
||||
|
||||
function SensorLargePulse::onDestroyed(%data,%obj,%prevState) {
|
||||
if (%obj.isRemoved)
|
||||
return;
|
||||
if (%obj.deployed) {
|
||||
%obj.isRemoved = true;
|
||||
$TeamDeployedCount[%obj.team,LargeSensorDeployable]--;
|
||||
remDSurface(%obj);
|
||||
%obj.schedule(500,"delete");
|
||||
}
|
||||
Parent::onDestroyed(%data,%obj,%prevState);
|
||||
}
|
||||
|
||||
function LargeSensorDeployableImage::onMount(%data, %obj, %node) {
|
||||
displayPowerFreq(%obj);
|
||||
}
|
||||
273
scripts/packs/lightpack.cs
Normal file
273
scripts/packs/lightpack.cs
Normal file
|
|
@ -0,0 +1,273 @@
|
|||
//---------------------------------------------------------
|
||||
// Deployable Light
|
||||
//---------------------------------------------------------
|
||||
|
||||
%colourOn = 0.5;
|
||||
%colourOff = 0.1;
|
||||
|
||||
%strobeColourOn = 1.0;
|
||||
%strobeColourOff = 0.0;
|
||||
|
||||
datablock StaticShapeData(DeployedLightBase) : StaticShapeDamageProfile {
|
||||
className = "lightbase";
|
||||
shapeFile = "pack_deploy_sensor_motion.dts";
|
||||
|
||||
maxDamage = 0.5;
|
||||
destroyedLevel = 0.5;
|
||||
disabledLevel = 0.3;
|
||||
|
||||
maxEnergy = 50;
|
||||
rechargeRate = 0.25;
|
||||
|
||||
explosion = HandGrenadeExplosion;
|
||||
expDmgRadius = 1.0;
|
||||
expDamage = 0.05;
|
||||
expImpulse = 200;
|
||||
|
||||
dynamicType = $TypeMasks::StaticShapeObjectType;
|
||||
deployedObject = true;
|
||||
cmdCategory = "DSupport";
|
||||
cmdIcon = CMDSensorIcon;
|
||||
cmdMiniIconName = "commander/MiniIcons/com_deploymotionsensor";
|
||||
targetNameTag = 'Deployed Light';
|
||||
deployAmbientThread = true;
|
||||
debrisShapeName = "debris_generic_small.dts";
|
||||
debris = DeployableDebris;
|
||||
heatSignature = 0;
|
||||
};
|
||||
|
||||
datablock ItemData(DeployedLight) {
|
||||
shapeFile = "turret_muzzlepoint.dts";
|
||||
hasLight = true;
|
||||
lightType = "ConstantLight";
|
||||
lightColor = "1.0 1.0 1.0 1.0";
|
||||
lightTime = "1000";
|
||||
lightRadius = "15";
|
||||
};
|
||||
|
||||
// Constant
|
||||
|
||||
datablock ItemData(DeployedLight0) : DeployedLight {
|
||||
lightColor = %colourOn SPC %colourOn SPC %colourOn;
|
||||
};
|
||||
|
||||
datablock ItemData(DeployedLight1) : DeployedLight {
|
||||
lightColor = %colourOn SPC %colourOff SPC %colourOff;
|
||||
};
|
||||
|
||||
datablock ItemData(DeployedLight2) : DeployedLight {
|
||||
lightColor = %colourOff SPC %colourOn SPC %colourOff;
|
||||
};
|
||||
|
||||
datablock ItemData(DeployedLight3) : DeployedLight {
|
||||
lightColor = %colourOff SPC %colourOff SPC %colourOn;
|
||||
};
|
||||
|
||||
datablock ItemData(DeployedLight4) : DeployedLight {
|
||||
lightColor = %colourOff SPC %colourOn SPC %colourOn;
|
||||
};
|
||||
|
||||
datablock ItemData(DeployedLight5) : DeployedLight {
|
||||
lightColor = %colourOn SPC %colourOff SPC %colourOn;
|
||||
};
|
||||
|
||||
datablock ItemData(DeployedLight6) : DeployedLight {
|
||||
lightColor = %colourOn SPC %colourOn SPC %colourOff;
|
||||
};
|
||||
|
||||
// Strobe
|
||||
|
||||
datablock ItemData(DeployedLight7) : DeployedLight {
|
||||
lightColor = %strobeColourOn SPC %strobeColourOn SPC %strobeColourOn;
|
||||
lightType = "PulsingLight";
|
||||
lightTime = "50";
|
||||
lightRadius = "10";
|
||||
};
|
||||
|
||||
datablock ItemData(DeployedLight8) : DeployedLight {
|
||||
lightType = "PulsingLight";
|
||||
lightColor = %strobeColourOn SPC %strobeColourOff SPC %strobeColourOff;
|
||||
lightTime = "50";
|
||||
lightRadius = "10";
|
||||
};
|
||||
|
||||
datablock ItemData(DeployedLight9) : DeployedLight {
|
||||
lightType = "PulsingLight";
|
||||
lightColor = %strobeColourOff SPC %strobeColourOn SPC %strobeColourOff;
|
||||
lightTime = "50";
|
||||
lightRadius = "10";
|
||||
};
|
||||
|
||||
datablock ItemData(DeployedLight10) : DeployedLight {
|
||||
lightType = "PulsingLight";
|
||||
lightColor = %strobeColourOff SPC %strobeColourOff SPC %strobeColourOn;
|
||||
lightTime = "50";
|
||||
lightRadius = "10";
|
||||
};
|
||||
|
||||
datablock ItemData(DeployedLight11) : DeployedLight {
|
||||
lightType = "PulsingLight";
|
||||
lightColor = %strobeColourOff SPC %strobeColourOn SPC %strobeColourOn;
|
||||
lightTime = "50";
|
||||
lightRadius = "10";
|
||||
};
|
||||
|
||||
datablock ItemData(DeployedLight12) : DeployedLight {
|
||||
lightType = "PulsingLight";
|
||||
lightColor = %strobeColourOn SPC %strobeColourOff SPC %strobeColourOn;
|
||||
lightTime = "50";
|
||||
lightRadius = "10";
|
||||
};
|
||||
|
||||
datablock ItemData(DeployedLight13) : DeployedLight {
|
||||
lightType = "PulsingLight";
|
||||
lightColor = %strobeColourOn SPC %strobeColourOn SPC %strobeColourOff;
|
||||
lightTime = "50";
|
||||
lightRadius = "10";
|
||||
};
|
||||
|
||||
datablock ShapeBaseImageData(LightDeployableImage) {
|
||||
mass = 1;
|
||||
emap = true;
|
||||
shapeFile = "stackable1s.dts";
|
||||
item = LightDeployable;
|
||||
mountPoint = 1;
|
||||
offset = "0 0 0";
|
||||
deployed = DeployedLightBase;
|
||||
heatSignature = 0;
|
||||
|
||||
stateName[0] = "Idle";
|
||||
stateTransitionOnTriggerDown[0] = "Activate";
|
||||
|
||||
stateName[1] = "Activate";
|
||||
stateScript[1] = "onActivate";
|
||||
stateTransitionOnTriggerUp[1] = "Idle";
|
||||
|
||||
isLarge = false;
|
||||
maxDepSlope = 360;
|
||||
deploySound = ItemPickupSound;
|
||||
|
||||
minDeployDis = 0.5;
|
||||
maxDeployDis = 50.0;
|
||||
};
|
||||
|
||||
datablock ItemData(LightDeployable) {
|
||||
className = Pack;
|
||||
catagory = "Deployables";
|
||||
shapeFile = "stackable1s.dts";
|
||||
mass = 1;
|
||||
elasticity = 0.2;
|
||||
friction = 0.6;
|
||||
pickupRadius = 1;
|
||||
rotate = true;
|
||||
image = "LightDeployableImage";
|
||||
pickUpName = "a light pack";
|
||||
heatSignature = 0;
|
||||
emap = true;
|
||||
};
|
||||
|
||||
function LightDeployableImage::testObjectTooClose(%item) {
|
||||
return "";
|
||||
}
|
||||
|
||||
function LightDeployableImage::testNoTerrainFound(%item) {
|
||||
// don't check this for non-Landspike turret deployables
|
||||
}
|
||||
|
||||
function LightDeployable::onPickup(%this, %obj, %shape, %amount) {
|
||||
// created to prevent console errors
|
||||
}
|
||||
|
||||
function LightDeployableImage::onDeploy(%item, %plyr, %slot) {
|
||||
%className = "StaticShape";
|
||||
|
||||
%playerVector = vectorNormalize(-1 * getWord(%plyr.getEyeVector(),1) SPC getWord(%plyr.getEyeVector(),0) SPC "0");
|
||||
|
||||
if (vAbs(floorVec(%item.surfaceNrm,100)) $= "0 0 1")
|
||||
%item.surfaceNrm2 = %playerVector;
|
||||
else
|
||||
%item.surfaceNrm2 = vectorNormalize(vectorCross(%item.surfaceNrm,"0 0 -1"));
|
||||
|
||||
%rot = fullRot(%item.surfaceNrm,%item.surfaceNrm2);
|
||||
|
||||
%deplObj = new (%className)() {
|
||||
dataBlock = %item.deployed;
|
||||
};
|
||||
|
||||
%deplObj.light = new Item() {
|
||||
datablock = DeployedLight @ %plyr.packSet;
|
||||
static = true;
|
||||
};
|
||||
|
||||
// set orientation
|
||||
%deplObj.setTransform(%item.surfacePt SPC %rot);
|
||||
adjustLight(%deplObj);
|
||||
|
||||
// set the recharge rate right away
|
||||
if (%deplObj.getDatablock().rechargeRate)
|
||||
%deplObj.setRechargeRate(%deplObj.getDatablock().rechargeRate);
|
||||
|
||||
// set team, owner, and handle
|
||||
%deplObj.team = %plyr.client.Team;
|
||||
%deplObj.setOwner(%plyr);
|
||||
%deplObj.light.lightBase = %deplObj;
|
||||
|
||||
// set the sensor group if it needs one
|
||||
if (%deplObj.getTarget() != -1)
|
||||
setTargetSensorGroup(%deplObj.getTarget(), %plyr.client.team);
|
||||
|
||||
// place the deployable in the MissionCleanup/Deployables group (AI reasons)
|
||||
addToDeployGroup(%deplObj);
|
||||
|
||||
//let the AI know as well...
|
||||
AIDeployObject(%plyr.client, %deplObj);
|
||||
|
||||
// play the deploy sound
|
||||
serverPlay3D(%item.deploySound, %deplObj.getTransform());
|
||||
|
||||
// increment the team count for this deployed object
|
||||
$TeamDeployedCount[%plyr.team, %item.item]++;
|
||||
|
||||
addDSurface(%item.surface,%deplObj);
|
||||
|
||||
%deplObj.playThread($PowerThread,"Power");
|
||||
%deplObj.playThread($AmbientThread,"ambient");
|
||||
|
||||
// take the deployable off the player's back and out of inventory
|
||||
//%plyr.unmountImage(%slot);
|
||||
//%plyr.decInventory(%item.item, 1);
|
||||
|
||||
return %deplObj;
|
||||
}
|
||||
|
||||
function DeployedLightBase::onDestroyed(%this,%obj,%prevState) {
|
||||
if (%obj.isRemoved)
|
||||
return;
|
||||
%obj.isRemoved = true;
|
||||
Parent::onDestroyed(%this,%obj,%prevState);
|
||||
$TeamDeployedCount[%obj.team, LightDeployable]--;
|
||||
remDSurface(%obj);
|
||||
%obj.schedule(500, "delete");
|
||||
if (isObject(%obj.light))
|
||||
%obj.light.schedule(500, "delete");
|
||||
}
|
||||
|
||||
function DeployedLightBase::disassemble(%data,%plyr,%obj) {
|
||||
if (isObject(%obj.light))
|
||||
%obj.light.delete();
|
||||
disassemble(%data,%plyr,%obj);
|
||||
}
|
||||
|
||||
function adjustLight(%obj) {
|
||||
%obj.light.setTransform(vectorAdd(%obj.getPosition(),vectorScale(realVec(%obj,"0 0 1"),1)) SPC %obj.getRotation());
|
||||
}
|
||||
|
||||
function LightDeployableImage::onMount(%data, %obj, %node) {
|
||||
%obj.hasLight = true; // set for lightcheck
|
||||
%obj.packSet = 0;
|
||||
}
|
||||
|
||||
function LightDeployableImage::onUnmount(%data, %obj, %node) {
|
||||
%obj.hasLight = "";
|
||||
%obj.packSet = 0;
|
||||
}
|
||||
240
scripts/packs/logoprojectorpack.cs
Normal file
240
scripts/packs/logoprojectorpack.cs
Normal file
|
|
@ -0,0 +1,240 @@
|
|||
//---------------------------------------------------------
|
||||
// Deployable Logo Logo Projector
|
||||
//---------------------------------------------------------
|
||||
|
||||
datablock StaticShapeData(DeployedLogoProjector) : StaticShapeDamageProfile {
|
||||
className = "logoprojector";
|
||||
shapeFile = "teamlogo_projector.dts";
|
||||
|
||||
maxDamage = 0.5;
|
||||
destroyedLevel = 0.5;
|
||||
disabledLevel = 0.3;
|
||||
|
||||
isShielded = true;
|
||||
energyPerDamagePoint = 240;
|
||||
maxEnergy = 50;
|
||||
rechargeRate = 0.25;
|
||||
|
||||
explosion = HandGrenadeExplosion;
|
||||
expDmgRadius = 1.0;
|
||||
expDamage = 0.05;
|
||||
expImpulse = 200;
|
||||
|
||||
dynamicType = $TypeMasks::StaticShapeObjectType;
|
||||
deployedObject = true;
|
||||
cmdCategory = "DSupport";
|
||||
cmdIcon = CMDSensorIcon;
|
||||
cmdMiniIconName = "commander/MiniIcons/com_deploymotionsensor";
|
||||
targetNameTag = 'Deployed Logo Projector';
|
||||
deployAmbientThread = true;
|
||||
debrisShapeName = "debris_generic_small.dts";
|
||||
debris = DeployableDebris;
|
||||
heatSignature = 0;
|
||||
needsPower = true;
|
||||
};
|
||||
|
||||
datablock ShapeBaseImageData(LogoProjectorDeployableImage) {
|
||||
mass = 1;
|
||||
emap = true;
|
||||
shapeFile = "teamlogo_projector.dts";
|
||||
item = LogoProjectorDeployable;
|
||||
mountPoint = 1;
|
||||
offset = "0 0 0";
|
||||
rotation = "-1 0 0 90";
|
||||
deployed = DeployedLogoProjector;
|
||||
heatSignature = 0;
|
||||
|
||||
stateName[0] = "Idle";
|
||||
stateTransitionOnTriggerDown[0] = "Activate";
|
||||
|
||||
stateName[1] = "Activate";
|
||||
stateScript[1] = "onActivate";
|
||||
stateTransitionOnTriggerUp[1] = "Idle";
|
||||
|
||||
isLarge = true;
|
||||
maxDepSlope = 360;
|
||||
deploySound = ItemPickupSound;
|
||||
|
||||
minDeployDis = 0.1;
|
||||
maxDeployDis = 50.0;
|
||||
};
|
||||
|
||||
datablock ItemData(LogoProjectorDeployable) {
|
||||
className = Pack;
|
||||
catagory = "Deployables";
|
||||
shapeFile = "stackable1s.dts";
|
||||
mass = 1;
|
||||
elasticity = 0.2;
|
||||
friction = 0.6;
|
||||
pickupRadius = 1;
|
||||
rotate = true;
|
||||
image = "LogoProjectorDeployableImage";
|
||||
pickUpName = "a logo projector pack";
|
||||
heatSignature = 0;
|
||||
emap = true;
|
||||
};
|
||||
|
||||
function LogoProjectorDeployableImage::testObjectTooClose(%item) {
|
||||
return "";
|
||||
}
|
||||
|
||||
function LogoProjectorDeployableImage::testNoTerrainFound(%item) {
|
||||
// don't check this for non-Landspike turret deployables
|
||||
}
|
||||
|
||||
function LogoProjectorDeployable::onPickup(%this, %obj, %shape, %amount) {
|
||||
// created to prevent console errors
|
||||
}
|
||||
|
||||
function LogoProjectorDeployableImage::onDeploy(%item, %plyr, %slot) {
|
||||
%className = "StaticShape";
|
||||
|
||||
%playerVector = vectorNormalize(-1 * getWord(%plyr.getEyeVector(),1) SPC getWord(%plyr.getEyeVector(),0) SPC "0");
|
||||
|
||||
if (vAbs(floorVec(%item.surfaceNrm,100)) $= "0 0 1")
|
||||
%item.surfaceNrm2 = %playerVector;
|
||||
else
|
||||
%item.surfaceNrm2 = vectorNormalize(vectorCross(%item.surfaceNrm,"0 0 1"));
|
||||
|
||||
%rot = fullRot(%item.surfaceNrm,%item.surfaceNrm2);
|
||||
|
||||
%deplObj = new (%className)() {
|
||||
dataBlock = %item.deployed;
|
||||
};
|
||||
|
||||
if ($Host::Purebuild == 1)
|
||||
if (%plyr.packSet == 0)
|
||||
%logo = 0;
|
||||
else
|
||||
%logo = %plyr.packSet;
|
||||
else {
|
||||
%logo = 0;
|
||||
}
|
||||
|
||||
switch (%logo) {
|
||||
case 1:
|
||||
%logo = "Base";
|
||||
case 2:
|
||||
%logo = "BaseB";
|
||||
case 3:
|
||||
%logo = "Swolf";
|
||||
case 4:
|
||||
%logo = "DSword";
|
||||
case 5:
|
||||
%logo = "BEagle";
|
||||
case 6:
|
||||
%logo = "COTP";
|
||||
case 7:
|
||||
%logo = "Bioderm";
|
||||
default:
|
||||
%logo = "0";
|
||||
}
|
||||
|
||||
if (%logo $= "0")
|
||||
%deplObj.holoBlock = getTaggedString(Game.getTeamSkin(%plyr.client.team)) @ "Logo";
|
||||
else
|
||||
%deplObj.holoBlock = %logo @ "Logo";
|
||||
|
||||
%deplObj.holo = new StaticShape() {
|
||||
datablock = %deplObj.holoBlock;
|
||||
};
|
||||
|
||||
// set orientation
|
||||
%deplObj.setTransform(%item.surfacePt SPC %rot);
|
||||
adjustHolo(%deplObj);
|
||||
|
||||
// set the recharge rate right away
|
||||
if (%deplObj.getDatablock().rechargeRate)
|
||||
%deplObj.setRechargeRate(%deplObj.getDatablock().rechargeRate);
|
||||
|
||||
// set team, owner, and handle
|
||||
%deplObj.team = %plyr.client.Team;
|
||||
%deplObj.setOwner(%plyr);
|
||||
%deplObj.holo.team = %plyr.client.Team;
|
||||
%deplObj.holo.setOwner(%plyr);
|
||||
%deplObj.holo.projector = %deplObj;
|
||||
|
||||
// set power frequency
|
||||
%deplObj.powerFreq = %plyr.powerFreq;
|
||||
|
||||
// place the deployable in the MissionCleanup/Deployables group (AI reasons)
|
||||
addToDeployGroup(%deplObj);
|
||||
|
||||
//let the AI know as well...
|
||||
AIDeployObject(%plyr.client,%deplObj);
|
||||
|
||||
// play the deploy sound
|
||||
serverPlay3D(%item.deploySound, %deplObj.getTransform());
|
||||
|
||||
// increment the team count for this deployed object
|
||||
$TeamDeployedCount[%plyr.team, %item.item]++;
|
||||
|
||||
addDSurface(%item.surface,%deplObj);
|
||||
|
||||
// take the deployable off the player's back and out of inventory
|
||||
if(!%plyr.client.isAdmin) {
|
||||
%plyr.unmountImage(%slot);
|
||||
%plyr.decInventory(%item.item, 1);
|
||||
}
|
||||
|
||||
// Power object
|
||||
checkPowerObject(%deplObj);
|
||||
|
||||
return %deplObj;
|
||||
}
|
||||
|
||||
function DeployedLogoProjector::onDestroyed(%this,%obj,%prevState) {
|
||||
if (%obj.isRemoved)
|
||||
return;
|
||||
%obj.isRemoved = true;
|
||||
Parent::onDestroyed(%this,%obj,%prevState);
|
||||
$TeamDeployedCount[%obj.team, LogoProjectorDeployable]--;
|
||||
remDSurface(%obj);
|
||||
%obj.schedule(500, "delete");
|
||||
if (isObject(%obj.holo))
|
||||
%obj.holo.schedule(500, "delete");
|
||||
fireBallExplode(%obj,1);
|
||||
}
|
||||
|
||||
function DeployedLogoProjector::disassemble(%data,%plyr,%obj) {
|
||||
if (isObject(%obj.holo))
|
||||
%obj.holo.delete();
|
||||
disassemble(%data,%plyr,%obj);
|
||||
}
|
||||
|
||||
function DeployedLogoProjector::onGainPowerEnabled(%data,%obj) {
|
||||
if (shouldChangePowerState(%obj,true)) {
|
||||
if (isObject(%obj.holo))
|
||||
%obj.holo.delete();
|
||||
%obj.holo = new StaticShape() {
|
||||
datablock = %obj.holoBlock;
|
||||
projector = %obj;
|
||||
};
|
||||
adjustHolo(%obj);
|
||||
%obj.holo.setScale(%obj.getScale());
|
||||
}
|
||||
Parent::onGainPowerEnabled(%data,%obj);
|
||||
}
|
||||
|
||||
function DeployedLogoProjector::onLosePowerDisabled(%data,%obj) {
|
||||
if (shouldChangePowerState(%obj,false)) {
|
||||
if (isObject(%obj.holo))
|
||||
%obj.holo.delete();
|
||||
}
|
||||
Parent::onLosePowerDisabled(%data,%obj);
|
||||
}
|
||||
|
||||
function adjustHolo(%obj) {
|
||||
%obj.holo.setTransform(vectorAdd(%obj.getPosition(),vectorScale(realVec(%obj,"0 0 1"),10)) SPC %obj.getRotation());
|
||||
}
|
||||
|
||||
function LogoProjectorDeployableImage::onMount(%data, %obj, %node) {
|
||||
%obj.hasProjector = true; // set for projectorcheck
|
||||
%obj.packSet = 0;
|
||||
displayPowerFreq(%obj);
|
||||
}
|
||||
|
||||
function LogoProjectorDeployableImage::onUnmount(%data, %obj, %node) {
|
||||
%obj.hasProjector = "";
|
||||
%obj.packSet = 0;
|
||||
}
|
||||
129
scripts/packs/mediumSensor.cs
Normal file
129
scripts/packs/mediumSensor.cs
Normal file
|
|
@ -0,0 +1,129 @@
|
|||
//--------------------------------------------------------------------------
|
||||
// Medium Pulse Sensor
|
||||
//--------------------------------------------------------------------------
|
||||
|
||||
datablock ShapeBaseImageData(MediumSensorDeployableImage) {
|
||||
mass = 1;
|
||||
emap = true;
|
||||
shapeFile = "stackable1s.dts";
|
||||
item = MediumSensorDeployable;
|
||||
mountPoint = 1;
|
||||
offset = "0 0 0";
|
||||
deployed = SensorMediumPulse;
|
||||
heatSignature = 0;
|
||||
|
||||
stateName[0] = "Idle";
|
||||
stateTransitionOnTriggerDown[0] = "Activate";
|
||||
|
||||
stateName[1] = "Activate";
|
||||
stateScript[1] = "onActivate";
|
||||
stateTransitionOnTriggerUp[1] = "Idle";
|
||||
|
||||
isLarge = true;
|
||||
maxDepSlope = 360;
|
||||
deploySound = ItemPickupSound;
|
||||
|
||||
minDeployDis = 0.5;
|
||||
maxDeployDis = 5.0;
|
||||
};
|
||||
|
||||
datablock ItemData(MediumSensorDeployable) {
|
||||
className = Pack;
|
||||
catagory = "Deployables";
|
||||
shapeFile = "stackable1s.dts";
|
||||
mass = 1;
|
||||
elasticity = 0.2;
|
||||
friction = 0.6;
|
||||
pickupRadius = 1;
|
||||
rotate = true;
|
||||
image = "MediumSensorDeployableImage";
|
||||
joint = "4.5 4.5 4.5";
|
||||
pickUpName = "a medium pulse sensor pack";
|
||||
heatSignature = 0;
|
||||
emap = true;
|
||||
};
|
||||
|
||||
function MediumSensorDeployable::onPickup(%this, %obj, %shape, %amount) {
|
||||
// created to prevent console errors
|
||||
}
|
||||
|
||||
function MediumSensorDeployableImage::testNoTerrainFound(%item) {
|
||||
// don't check this for non-Landspike turret deployables
|
||||
}
|
||||
|
||||
function MediumSensorDeployableImage::onDeploy(%item, %plyr, %slot) {
|
||||
%className = "StaticShape";
|
||||
|
||||
%playerVector = vectorNormalize(getWord(%plyr.getEyeVector(),1) SPC -1 * getWord(%plyr.getEyeVector(),0) SPC "0");
|
||||
%item.surfaceNrm2 = %playerVector;
|
||||
|
||||
if (vAbs(floorVec(%item.surfaceNrm,100)) $= "0 0 1")
|
||||
%item.surfaceNrm2 = %playerVector;
|
||||
else
|
||||
%item.surfaceNrm2 = vectorNormalize(vectorCross(%item.surfaceNrm,"0 0 -1"));
|
||||
|
||||
%rot = fullRot(%item.surfaceNrm,%item.surfaceNrm2);
|
||||
|
||||
%deplObj = new (%className)() {
|
||||
dataBlock = SensorMediumPulse;
|
||||
deployed = true;
|
||||
};
|
||||
|
||||
// set orientation
|
||||
%deplObj.setTransform(%item.surfacePt SPC %rot);
|
||||
|
||||
// set team, owner, and handle
|
||||
%deplObj.team = %plyr.client.Team;
|
||||
%deplObj.setOwner(%plyr);
|
||||
|
||||
// set power frequency
|
||||
%deplObj.powerFreq = %plyr.powerFreq;
|
||||
// setTargetName(%deplObj.target,addTaggedString("Frequency" SPC %deplObj.powerFreq));
|
||||
|
||||
// set the sensor group if it needs one
|
||||
if (%deplObj.getTarget() != -1)
|
||||
setTargetSensorGroup(%deplObj.getTarget(), %plyr.client.team);
|
||||
|
||||
// place the deployable in the MissionCleanup/Deployables group (AI reasons)
|
||||
addToDeployGroup(%deplObj);
|
||||
|
||||
//let the AI know as well...
|
||||
AIDeployObject(%plyr.client, %deplObj);
|
||||
|
||||
// play the deploy sound
|
||||
serverPlay3D(%item.deploySound, %deplObj.getTransform());
|
||||
|
||||
// increment the team count for this deployed object
|
||||
$TeamDeployedCount[%plyr.team, %item.item]++;
|
||||
|
||||
addDSurface(%item.surface,%deplObj);
|
||||
|
||||
// %deplObj.playThread($PowerThread,"Power");
|
||||
|
||||
// take the deployable off the player's back and out of inventory
|
||||
if(!%plyr.client.isAdmin) {
|
||||
%plyr.unmountImage(%slot);
|
||||
%plyr.decInventory(%item.item, 1);
|
||||
}
|
||||
|
||||
// Power object
|
||||
checkPowerObject(%deplObj);
|
||||
|
||||
return %deplObj;
|
||||
}
|
||||
|
||||
function SensorMediumPulse::onDestroyed(%data,%obj,%prevState) {
|
||||
if (%obj.isRemoved)
|
||||
return;
|
||||
if (%obj.deployed) {
|
||||
%obj.isRemoved = true;
|
||||
$TeamDeployedCount[%obj.team,MediumSensorDeployable]--;
|
||||
remDSurface(%obj);
|
||||
%obj.schedule(500,"delete");
|
||||
}
|
||||
Parent::onDestroyed(%data,%obj,%prevState);
|
||||
}
|
||||
|
||||
function MediumSensorDeployableImage::onMount(%data, %obj, %node) {
|
||||
displayPowerFreq(%obj);
|
||||
}
|
||||
282
scripts/packs/mspine.cs
Normal file
282
scripts/packs/mspine.cs
Normal file
|
|
@ -0,0 +1,282 @@
|
|||
//---------------------------------------------------------
|
||||
// Deployable mspine, Code by Parousia
|
||||
//---------------------------------------------------------
|
||||
|
||||
datablock StaticShapeData(DeployedMSpine) : StaticShapeDamageProfile {
|
||||
className = "mspine";
|
||||
shapeFile = "dmiscf.dts";
|
||||
|
||||
maxDamage = 5.0;
|
||||
destroyedLevel = 5.0;
|
||||
disabledLevel = 2.5;
|
||||
|
||||
isShielded = true;
|
||||
energyPerDamagePoint = 240;
|
||||
maxEnergy = 50;
|
||||
rechargeRate = 0.25;
|
||||
|
||||
explosion = HandGrenadeExplosion;
|
||||
expDmgRadius = 5.0;
|
||||
expDamage = 0.5;
|
||||
expImpulse = 200.0;
|
||||
|
||||
dynamicType = $TypeMasks::StaticShapeObjectType;
|
||||
deployedObject = true;
|
||||
cmdCategory = "DSupport";
|
||||
cmdIcon = CMDSensorIcon;
|
||||
cmdMiniIconName = "commander/MiniIcons/com_deploymotionsensor";
|
||||
targetNameTag = 'Medium Support Beam';
|
||||
deployAmbientThread = true;
|
||||
debrisShapeName = "debris_generic_small.dts";
|
||||
debris = DeployableDebris;
|
||||
heatSignature = 0;
|
||||
needsPower = true;
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedMSpinering) : DeployedMSpine {
|
||||
maxDamage = 1.0;
|
||||
destroyedLevel = 1.0;
|
||||
disabledLevel = 0.75;
|
||||
};
|
||||
|
||||
datablock ShapeBaseImageData(mspineDeployableImage) {
|
||||
mass = 1;
|
||||
emap = true;
|
||||
shapeFile = "stackable1s.dts";
|
||||
item = mspineDeployable;
|
||||
mountPoint = 1;
|
||||
offset = "0 0 0";
|
||||
deployed = DeployedMSpine;
|
||||
heatSignature = 0;
|
||||
|
||||
stateName[0] = "Idle";
|
||||
stateTransitionOnTriggerDown[0] = "Activate";
|
||||
|
||||
stateName[1] = "Activate";
|
||||
stateScript[1] = "onActivate";
|
||||
stateTransitionOnTriggerUp[1] = "Idle";
|
||||
|
||||
isLarge = true;
|
||||
maxDepSlope = 360;
|
||||
deploySound = ItemPickupSound;
|
||||
|
||||
minDeployDis = 0.1;
|
||||
maxDeployDis = 50.0;
|
||||
};
|
||||
|
||||
datablock ItemData(mspineDeployable) {
|
||||
className = Pack;
|
||||
catagory = "Deployables";
|
||||
shapeFile = "stackable1s.dts";
|
||||
mass = 1;
|
||||
elasticity = 0.2;
|
||||
friction = 0.6;
|
||||
pickupRadius = 1;
|
||||
joint = "1 1 1";
|
||||
rotate = true;
|
||||
image = "mspineDeployableImage";
|
||||
pickUpName = "a medium support beam pack";
|
||||
heatSignature = 0;
|
||||
emap = true;
|
||||
};
|
||||
|
||||
function mspineDeployableImage::testObjectTooClose(%item) {
|
||||
return "";
|
||||
}
|
||||
|
||||
function mspineDeployableImage::testNoTerrainFound(%item) {
|
||||
// don't check this for non-Landspike turret deployables
|
||||
}
|
||||
|
||||
function mspineDeployable::onPickup(%this, %obj, %shape, %amount) {
|
||||
// created to prevent console errors
|
||||
}
|
||||
|
||||
function mspineDeployableImage::onDeploy(%item, %plyr, %slot) {
|
||||
//Object
|
||||
%className = "StaticShape";
|
||||
|
||||
%grounded = 0;
|
||||
if (%item.surface.getClassName() $= TerrainBlock)
|
||||
%grounded = 1;
|
||||
|
||||
%playerVector = vectorNormalize(-1 * getWord(%plyr.getEyeVector(),1) SPC getWord(%plyr.getEyeVector(),0) SPC "0");
|
||||
|
||||
if (%item.surfaceinher == 0) {
|
||||
if (vAbs(floorVec(%item.surfaceNrm,100)) $= "0 0 1")
|
||||
%item.surfaceNrm2 = %playerVector;
|
||||
else
|
||||
%item.surfaceNrm2 = vectorNormalize(vectorCross(%item.surfaceNrm,"0 0 1"));
|
||||
}
|
||||
|
||||
%rot = fullRot(%item.surfaceNrm,%item.surfaceNrm2);
|
||||
%scale = getWords($packSetting["mspine",%plyr.packSet],0,2);
|
||||
|
||||
%mod = 0.5;
|
||||
|
||||
if (%plyr.packSet >= 5 && %plyr.packSet < 8) {
|
||||
%space = rayDist(%item.surfacePt SPC %item.surfaceNrm,%scale,$AllObjMask);
|
||||
|
||||
if (%space != getWord(%scale,1))
|
||||
%type = 1;
|
||||
|
||||
%scale = getWord(%scale,0) SPC getWord(%scale,0) SPC %space;
|
||||
if (%plyr.packSet == 7)
|
||||
%mod = -0.01;
|
||||
}
|
||||
|
||||
%scaler = getWords($packSetting["mspine",%plyr.packSet],3,5);
|
||||
|
||||
%deplObj = new (%className)() { //Main Spine
|
||||
dataBlock = %item.deployed;
|
||||
scale = vectorMultiply(%scale,1/4 SPC 1/3 SPC 2);
|
||||
};
|
||||
|
||||
if (%plyr.packSet != 0 && (%plyr.packSet == 6 || %plyr.packSet == 7 || %plyr.expertSet == 1)) {
|
||||
%deplObj1 = new (%className)() { //Top add
|
||||
dataBlock = "DeployedMSpinering";
|
||||
scale = vectorMultiply(%scaler,1/4 SPC 1/3 SPC 2);
|
||||
};
|
||||
%deplObj2 = new (%className)() { //Bottom add
|
||||
dataBlock = "DeployedMSpinering";
|
||||
scale = vectorMultiply(%scaler,1/4 SPC 1/3 SPC 2);
|
||||
};
|
||||
|
||||
%h1=vectorAdd(%item.surfacePt,vectorScale(vectorNormalize(%item.surfaceNrm),%mod));
|
||||
%h2=vectorAdd(%item.surfacePt,vectorScale(vectorNormalize(%item.surfaceNrm),GetWord(%scale,2)-%mod-0.5));
|
||||
|
||||
%deplObj1.setTransform(%h1 SPC %rot);
|
||||
%deplObj2.setTransform(%h2 SPC %rot);
|
||||
addDSurface(%deplObj,%deplObj1);
|
||||
%deplObj1.grounded = %grounded;
|
||||
%deplObj1.needsFit = 1;
|
||||
addDSurface(%deplObj,%deplObj2);
|
||||
%deplObj2.grounded = %grounded;
|
||||
%deplObj2.needsFit = 1;
|
||||
%deplObj1.team = %plyr.client.team;
|
||||
%deplObj1.setOwner(%plyr);
|
||||
%deplObj2.team = %plyr.client.team;
|
||||
%deplObj2.setOwner(%plyr);
|
||||
if(%deplObj1.getTarget() != -1)
|
||||
setTargetSensorGroup(%deplObj2.getTarget(), %plyr.client.team);
|
||||
if(%deplObj2.getTarget() != -1)
|
||||
setTargetSensorGroup(%deplObj2.getTarget(), %plyr.client.team);
|
||||
addToDeployGroup(%deplObj1);
|
||||
addToDeployGroup(%deplObj2);
|
||||
AIDeployObject(%plyr.client, %deplObj1);
|
||||
AIDeployObject(%plyr.client, %deplObj2);
|
||||
%deplObj.right = %deplObj1;
|
||||
%deplObj.left = %deplObj2;
|
||||
}
|
||||
|
||||
//////////////////////////Apply settings//////////////////////////////
|
||||
|
||||
// [[Location]]:
|
||||
|
||||
// exact:
|
||||
%deplObj.setTransform(%item.surfacePt SPC %rot);
|
||||
|
||||
// misc info
|
||||
addDSurface(%item.surface,%deplObj);
|
||||
|
||||
// [[Settings]]:
|
||||
|
||||
%deplObj.grounded = %grounded;
|
||||
%deplObj.needsFit = 1;
|
||||
|
||||
// [[Normal Stuff]]:
|
||||
|
||||
// if(%deplObj.getDatablock().rechargeRate)
|
||||
// %deplObj.setRechargeRate(%deplObj.getDatablock().rechargeRate);
|
||||
|
||||
// set team, owner, and handle
|
||||
%deplObj.team = %plyr.client.team;
|
||||
%deplObj.setOwner(%plyr);
|
||||
|
||||
// set power frequency
|
||||
%deplObj.powerFreq = %plyr.powerFreq;
|
||||
%deplObj.right.powerFreq = %plyr.powerFreq;
|
||||
%deplObj.left.powerFreq = %plyr.powerFreq;
|
||||
|
||||
// set the sensor group if it needs one
|
||||
if (%deplObj.getTarget() != -1)
|
||||
setTargetSensorGroup(%deplObj.getTarget(), %plyr.client.team);
|
||||
|
||||
// place the deployable in the MissionCleanup/Deployables group (AI reasons)
|
||||
addToDeployGroup(%deplObj);
|
||||
|
||||
//let the AI know as well...
|
||||
AIDeployObject(%plyr.client, %deplObj);
|
||||
|
||||
// play the deploy sound
|
||||
serverPlay3D(%item.deploySound, %deplObj.getTransform());
|
||||
|
||||
// increment the team count for this deployed object
|
||||
$TeamDeployedCount[%plyr.team, %item.item]++;
|
||||
|
||||
%deplObj.deploy();
|
||||
|
||||
// Power object
|
||||
checkPowerObject(%deplObj);
|
||||
if (isObject(%deplObj.right))
|
||||
checkPowerObject(%deplObj.right);
|
||||
if (isObject(%deplObj.left))
|
||||
checkPowerObject(%deplObj.left);
|
||||
|
||||
if (!%type)
|
||||
deployEffect(%deplObj,%item.surfacePt,%item.surfaceNrm,"mspine");
|
||||
else
|
||||
deployEffect(%deplObj,%item.surfacePt,%item.surfaceNrm,"mspine1");
|
||||
|
||||
return %deplObj;
|
||||
}
|
||||
|
||||
function DeployedMSpine::onDestroyed(%this, %obj, %prevState) {
|
||||
if (%obj.isRemoved)
|
||||
return;
|
||||
%obj.isRemoved = true;
|
||||
Parent::onDestroyed(%this, %obj, %prevState);
|
||||
$TeamDeployedCount[%obj.team, mspineDeployable]--;
|
||||
remDSurface(%obj);
|
||||
%obj.schedule(500, "delete");
|
||||
cascade(%obj);
|
||||
fireBallExplode(%obj,1);
|
||||
if (isObject(%obj.right))
|
||||
%obj.right.schedule(500,setDamageState,Destroyed);
|
||||
if (isObject(%obj.left))
|
||||
%obj.left.schedule(500,setDamageState,Destroyed);
|
||||
}
|
||||
|
||||
function DeployedMSpinering::onDestroyed(%this, %obj, %prevState) {
|
||||
if (%obj.isRemoved)
|
||||
return;
|
||||
%obj.isRemoved = true;
|
||||
Parent::onDestroyed(%this, %obj, %prevState);
|
||||
remDSurface(%obj);
|
||||
%obj.schedule(500, "delete");
|
||||
cascade(%obj);
|
||||
fireBallExplode(%obj,1);
|
||||
}
|
||||
|
||||
function DeployedMSpine::disassemble(%data,%plyr,%hTgt) {
|
||||
if ($Host::Purebuild == 1) { // Remove console spam
|
||||
if (isObject(%hTgt.right))
|
||||
%hTgt.right.getDataBlock().schedule(500,disassemble,0,%hTgt.right);
|
||||
if (isObject(%hTgt.left))
|
||||
%hTgt.left.getDataBlock().schedule(500,disassemble,0,%hTgt.left);
|
||||
}
|
||||
disassemble(%data,%plyr,%hTgt);
|
||||
}
|
||||
|
||||
function mspineDeployableImage::onMount(%data,%obj,%node) {
|
||||
%obj.hasMSpine = true; // set for mspinecheck
|
||||
%obj.packSet = 0;
|
||||
%obj.expertSet = 0;
|
||||
displayPowerFreq(%obj);
|
||||
}
|
||||
|
||||
function mspineDeployableImage::onUnmount(%data,%obj,%node) {
|
||||
%obj.hasMSpine = "";
|
||||
%obj.packSet = 0;
|
||||
%obj.expertSet = 0;
|
||||
}
|
||||
87
scripts/packs/parachutepack.cs
Normal file
87
scripts/packs/parachutepack.cs
Normal file
|
|
@ -0,0 +1,87 @@
|
|||
// ------------------------------------------------------------------
|
||||
// PARACHUTE PACK
|
||||
// All Credit to Dondelium_X and CCM
|
||||
// Modified by: Phantom139 (cleaning up, ect)
|
||||
//
|
||||
|
||||
datablock ShapeBaseImageData(ParachutePackImage) {
|
||||
shapeFile = "pack_upgrade_ammo.dts";
|
||||
item = ParachutePack;
|
||||
mountPoint = 1;
|
||||
offset = "0 0 0";
|
||||
mass = 10;
|
||||
|
||||
usesEnergy = true;
|
||||
minEnergy = 3;
|
||||
|
||||
stateName[0] = "Idle";
|
||||
stateTransitionOnTriggerDown[0] = "Activate";
|
||||
|
||||
stateName[1] = "Activate";
|
||||
stateScript[1] = "onActivate";
|
||||
stateSequence[1] = "fire";
|
||||
stateSound[1] = CloakingPackActivateSound;
|
||||
stateEnergyDrain[1] = 1;
|
||||
stateTransitionOnTriggerUp[1] = "Deactivate";
|
||||
stateTransitionOnNoAmmo[1] = "Deactivate";
|
||||
|
||||
stateName[2] = "Deactivate";
|
||||
stateScript[2] = "onDeactivate";
|
||||
stateTransitionOnTimeout[2] = "Idle";
|
||||
};
|
||||
|
||||
datablock ItemData(ParachutePack) {
|
||||
className = Pack;
|
||||
catagory = "Packs";
|
||||
shapeFile = "pack_upgrade_ammo.dts";
|
||||
mass = 5.0;
|
||||
elasticity = 0.5;
|
||||
friction = 0.6;
|
||||
pickupRadius = 2;
|
||||
rotate = true;
|
||||
image = "ParachutePackImage";
|
||||
pickUpName = "a Parachute pack";
|
||||
|
||||
computeCRC = true;
|
||||
};
|
||||
|
||||
datablock ShapeBaseImageData(parachuteImage) {
|
||||
shapeFile = "Pmiscf.dts";
|
||||
mountPoint = 1;
|
||||
|
||||
offset = "0.0 0.0 2.0"; // L/R - F/B - T/B
|
||||
rotation = "0 0 0 0"; // L/R - F/B - T/B
|
||||
};
|
||||
|
||||
function ParachutePackImage::onUnmount(%data, %obj, %node) {
|
||||
if (%obj.getState() !$= "dead"){
|
||||
Cancel(%obj.ParaLoop);
|
||||
%obj.unmountImage(4);
|
||||
}
|
||||
}
|
||||
|
||||
function ParachutePackImage::onActivate(%data, %obj, %slot) {
|
||||
messageClient(%obj.client, 'MsgParachuteOpened', '\c2Parachute opened.');
|
||||
%newspeed = vectorscale(%obj.getvelocity(),0.5);
|
||||
%obj.setvelocity(%newspeed);
|
||||
%obj.paraLoop = schedule(1000, 0, "parachuteLoop", %obj);
|
||||
%obj.mountImage(ParachuteImage, 4);
|
||||
}
|
||||
|
||||
function ParachutePackImage::onDeactivate(%data, %obj, %slot) {
|
||||
messageClient(%obj.client, 'MsgParachuteClosed', '\c2Parachute Closed.');
|
||||
Cancel(%obj.ParaLoop);
|
||||
%obj.unmountImage(4);
|
||||
}
|
||||
|
||||
function parachuteLoop(%obj) {
|
||||
if(isObject(%obj)) {
|
||||
%vec = vectornormalize(%obj.getMuzzleVector($WeaponSlot));
|
||||
%move = vectorscale(%vec,10);
|
||||
%x = getword(%move,0);
|
||||
%y = getword(%move,1);
|
||||
%z = (getword(%move,2) - 15);
|
||||
%obj.setvelocity(%x@" "@%y@" "@%z);
|
||||
%obj.paraLoop = schedule(100, 0, "parachuteLoop", %obj);
|
||||
}
|
||||
}
|
||||
658
scripts/packs/repairpack.cs
Normal file
658
scripts/packs/repairpack.cs
Normal file
|
|
@ -0,0 +1,658 @@
|
|||
//--------------------------------------------------------------------------
|
||||
// Repair Pack
|
||||
// can be used by any armor type
|
||||
// when activated, gives user a "repair gun" that can be used to
|
||||
// repair a damaged object or player. If there is no target in
|
||||
// range for the repair gun, the user is repaired.
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
// Sounds & feedback effects
|
||||
datablock AudioProfile(RepairPackActivateSound)
|
||||
{
|
||||
filename = "fx/packs/packs.repairPackOn.wav";
|
||||
description = AudioClosest3d;
|
||||
preload = true;
|
||||
};
|
||||
|
||||
datablock AudioProfile(RepairPackFireSound)
|
||||
{
|
||||
filename = "fx/packs/repair_use.wav";
|
||||
description = CloseLooping3d;
|
||||
preload = true;
|
||||
};
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
// Projectile
|
||||
|
||||
datablock RepairProjectileData(DefaultRepairBeam)
|
||||
{
|
||||
sound = RepairPackFireSound;
|
||||
|
||||
// JTL
|
||||
beamRange = 250; //10
|
||||
// End JTL
|
||||
beamWidth = 0.15;
|
||||
numSegments = 20;
|
||||
texRepeat = 0.20;
|
||||
blurFreq = 10.0;
|
||||
blurLifetime = 1.0;
|
||||
cutoffAngle = 25.0;
|
||||
|
||||
textures[0] = "special/redbump2";
|
||||
textures[1] = "special/redflare";
|
||||
|
||||
};
|
||||
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
// shapebase datablocks
|
||||
|
||||
datablock ShapeBaseImageData(RepairPackImage)
|
||||
{
|
||||
shapeFile = "pack_upgrade_repair.dts";
|
||||
item = RepairPack;
|
||||
mountPoint = 1;
|
||||
offset = "0 0 0";
|
||||
emap = true;
|
||||
|
||||
gun = RepairGunImage;
|
||||
|
||||
stateName[0] = "Idle";
|
||||
stateTransitionOnTriggerDown[0] = "Activate";
|
||||
|
||||
stateName[1] = "Activate";
|
||||
stateScript[1] = "onActivate";
|
||||
stateSequence[1] = "fire";
|
||||
stateSound[1] = RepairPackActivateSound;
|
||||
stateTransitionOnTriggerUp[1] = "Deactivate";
|
||||
|
||||
stateName[2] = "Deactivate";
|
||||
stateScript[2] = "onDeactivate";
|
||||
stateTransitionOnTimeout[2] = "Idle";
|
||||
};
|
||||
|
||||
datablock ItemData(RepairPack)
|
||||
{
|
||||
className = Pack;
|
||||
catagory = "Packs";
|
||||
shapeFile = "pack_upgrade_repair.dts";
|
||||
mass = 1;
|
||||
elasticity = 0.2;
|
||||
friction = 0.6;
|
||||
pickupRadius = 2;
|
||||
rotate = true;
|
||||
image = "RepairPackImage";
|
||||
pickUpName = "a repair pack";
|
||||
|
||||
lightOnlyStatic = true;
|
||||
lightType = "PulsingLight";
|
||||
lightColor = "1 0 0 1";
|
||||
lightTime = 1200;
|
||||
lightRadius = 4;
|
||||
|
||||
computeCRC = true;
|
||||
emap = true;
|
||||
};
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
// Repair Gun
|
||||
|
||||
datablock ShapeBaseImageData(RepairGunImage)
|
||||
{
|
||||
shapeFile = "weapon_repair.dts";
|
||||
offset = "0 0 0";
|
||||
|
||||
usesEnergy = true;
|
||||
minEnergy = 3;
|
||||
cutOffEnergy = 3.1;
|
||||
emap = true;
|
||||
|
||||
repairFactorPlayer = 0.002; // <--- attention DaveG!
|
||||
repairFactorObject = 0.004; // <--- attention DaveG!
|
||||
|
||||
stateName[0] = "Activate";
|
||||
stateTransitionOnTimeout[0] = "ActivateReady";
|
||||
stateTimeoutValue[0] = 0.25;
|
||||
|
||||
stateName[1] = "ActivateReady";
|
||||
stateScript[1] = "onActivateReady";
|
||||
stateSpinThread[1] = Stop;
|
||||
stateTransitionOnAmmo[1] = "Ready";
|
||||
stateTransitionOnNoAmmo[1] = "ActivateReady";
|
||||
|
||||
stateName[2] = "Ready";
|
||||
stateSpinThread[2] = Stop;
|
||||
stateTransitionOnNoAmmo[2] = "Deactivate";
|
||||
stateTransitionOnTriggerDown[2] = "Validate";
|
||||
|
||||
stateName[3] = "Validate";
|
||||
stateTransitionOnTimeout[3] = "Validate";
|
||||
stateTimeoutValue[3] = 0.2;
|
||||
stateEnergyDrain[3] = 3;
|
||||
stateSpinThread[3] = SpinUp;
|
||||
stateScript[3] = "onValidate";
|
||||
stateIgnoreLoadedForReady[3] = true;
|
||||
stateTransitionOnLoaded[3] = "Repair";
|
||||
stateTransitionOnNoAmmo[3] = "Deactivate";
|
||||
stateTransitionOnTriggerUp[3] = "Deactivate";
|
||||
|
||||
stateName[4] = "Repair";
|
||||
stateSound[4] = RepairPackFireSound;
|
||||
stateScript[4] = "onRepair";
|
||||
stateSpinThread[4] = FullSpeed;
|
||||
stateAllowImageChange[4] = false;
|
||||
stateSequence[4] = "activate";
|
||||
stateFire[4] = true;
|
||||
stateEnergyDrain[4] = 9;
|
||||
stateTimeoutValue[4] = 0.2;
|
||||
stateTransitionOnTimeOut[4] = "Repair";
|
||||
stateTransitionOnNoAmmo[4] = "Deactivate";
|
||||
stateTransitionOnTriggerUp[4] = "Deactivate";
|
||||
stateTransitionOnNotLoaded[4] = "Validate";
|
||||
|
||||
stateName[5] = "Deactivate";
|
||||
stateScript[5] = "onDeactivate";
|
||||
stateSpinThread[5] = SpinDown;
|
||||
stateSequence[5] = "activate";
|
||||
stateDirection[5] = false;
|
||||
stateTimeoutValue[5] = 0.2;
|
||||
stateTransitionOnTimeout[5] = "ActivateReady";
|
||||
};
|
||||
|
||||
function RepairPackImage::onUnmount(%data, %obj, %node)
|
||||
{
|
||||
// dismount the repair gun if the player had it mounted
|
||||
// need the extra "if" statement to avoid a console error message
|
||||
if(%obj.getMountedImage($WeaponSlot))
|
||||
if(%obj.getMountedImage($WeaponSlot).getName() $= "RepairGunImage")
|
||||
%obj.unmountImage($WeaponSlot);
|
||||
// if the player was repairing something when the pack was thrown, stop repairing it
|
||||
if(%obj.repairing != 0)
|
||||
stopRepairing(%obj);
|
||||
}
|
||||
|
||||
function RepairPackImage::onActivate(%data, %obj, %slot)
|
||||
{
|
||||
// don't activate the pack if player is piloting a vehicle
|
||||
messageClient( %obj.triggeredBy.client, 'CloseHud', "", 'scoreScreen' );
|
||||
messageClient( %obj.triggeredBy.client, 'CloseHud', "", 'inventoryScreen' );
|
||||
|
||||
commandToClient(%obj.triggeredBy.client, 'StationVehicleShowHud');
|
||||
|
||||
if(%obj.isPilot())
|
||||
{
|
||||
%obj.setImageTrigger(%slot, false);
|
||||
return;
|
||||
}
|
||||
|
||||
if(!isObject(%obj.getMountedImage($WeaponSlot)) || %obj.getMountedImage($WeaponSlot).getName() !$= "RepairGunImage")
|
||||
{
|
||||
messageClient(%obj.client, 'MsgRepairPackOn', '\c2Repair pack activated.');
|
||||
|
||||
// make sure player's arm thread is "look"
|
||||
%obj.setArmThread(look);
|
||||
|
||||
// mount the repair gun
|
||||
%obj.mountImage(RepairGunImage, $WeaponSlot);
|
||||
// clientCmdsetRepairReticle found in hud.cs
|
||||
commandToClient(%obj.client, 'setRepairReticle');
|
||||
}
|
||||
}
|
||||
|
||||
function RepairPackImage::onDeactivate(%data, %obj, %slot)
|
||||
{
|
||||
//called when the player hits the "pack" key again (toggle)
|
||||
%obj.setImageTrigger(%slot, false);
|
||||
// if repair gun was mounted, unmount it
|
||||
if(%obj.getMountedImage($WeaponSlot).getName() $= "RepairGunImage")
|
||||
%obj.unmountImage($WeaponSlot);
|
||||
}
|
||||
|
||||
function RepairGunImage::onMount(%this,%obj,%slot)
|
||||
{
|
||||
%obj.setImageAmmo(%slot,true);
|
||||
if ( !isDemo() )
|
||||
commandToClient( %obj.client, 'setRepairPackIconOn' );
|
||||
}
|
||||
|
||||
function RepairGunImage::onUnmount(%this,%obj,%slot)
|
||||
{
|
||||
// called when player switches to another weapon
|
||||
|
||||
// stop repairing whatever player was repairing
|
||||
if(%obj.repairing)
|
||||
stopRepairing(%obj);
|
||||
|
||||
%obj.setImageTrigger(%slot, false);
|
||||
// "turn off" the repair pack -- player needs to hit the "pack" key to
|
||||
// activate the repair gun again
|
||||
%obj.setImageTrigger($BackpackSlot, false);
|
||||
if ( !isDemo() )
|
||||
commandToClient( %obj.client, 'setRepairPackIconOff' );
|
||||
}
|
||||
|
||||
function RepairGunImage::onActivateReady(%this,%obj,%slot)
|
||||
{
|
||||
%obj.errMsgSent = false;
|
||||
%obj.selfRepairing = false;
|
||||
%obj.repairing = 0;
|
||||
%obj.setImageLoaded(%slot, false);
|
||||
}
|
||||
|
||||
function RepairGunImage::onValidate(%this,%obj,%slot)
|
||||
{
|
||||
// this = repairgunimage datablock
|
||||
// obj = player wielding the repair gun
|
||||
// slot = weapon slot
|
||||
|
||||
if(%obj.getEnergyLevel() <= %this.cutOffEnergy)
|
||||
{
|
||||
stopRepairing(%obj);
|
||||
return;
|
||||
}
|
||||
%repGun = %obj.getMountedImage(%slot);
|
||||
// muzVec is the vector coming from the repair gun's "muzzle"
|
||||
%muzVec = %obj.getMuzzleVector(%slot);
|
||||
// muzNVec = normalized muzVec
|
||||
%muzNVec = VectorNormalize(%muzVec);
|
||||
%repairRange = DefaultRepairBeam.beamRange;
|
||||
// scale muzNVec to the range the repair beam can reach
|
||||
%muzScaled = VectorScale(%muzNVec, %repairRange);
|
||||
// muzPoint = the actual point of the gun's "muzzle"
|
||||
%muzPoint = %obj.getMuzzlePoint(%slot);
|
||||
// rangeEnd = muzzle point + length of beam
|
||||
%rangeEnd = VectorAdd(%muzPoint, %muzScaled);
|
||||
// search for just about anything that can be damaged as well as interiors
|
||||
%searchMasks = $TypeMasks::PlayerObjectType | $TypeMasks::VehicleObjectType |
|
||||
$TypeMasks::StaticShapeObjectType | $TypeMasks::TurretObjectType | $TypeMasks::InteriorObjectType;
|
||||
// search for objects within the beam's range that fit the masks above
|
||||
%scanTarg = ContainerRayCast(%muzPoint, %rangeEnd, %searchMasks, %obj);
|
||||
// screen out interiors
|
||||
if(%scanTarg && !(%scanTarg.getType() & $TypeMasks::InteriorObjectType))
|
||||
{
|
||||
// a target in range was found
|
||||
%repTgt = firstWord(%scanTarg);
|
||||
// is the prospective target damaged?
|
||||
if(%repTgt.isZombie || %repTgt.isBoss) {
|
||||
if(!%obj.errMsgSent) {
|
||||
messageClient(%obj.client, 'MsgRepairPackIrrepairable', '\c2You cannot repair a zombie or a boss.', %repTgt);
|
||||
%obj.errMsgSent = true;
|
||||
}
|
||||
if(%obj.repairing) {
|
||||
stopRepairing(%obj);
|
||||
}
|
||||
}
|
||||
else if(vectorDist(%repTgt.getPosition(), %obj.getPosition()) > 50) {
|
||||
if(!%obj.errMsgSent) {
|
||||
messageClient(%obj.client, 'MsgRepairPackIrrepairable', '\c2You cannot repair a target over 50m away.', %repTgt);
|
||||
%obj.errMsgSent = true;
|
||||
}
|
||||
if(%obj.repairing) {
|
||||
stopRepairing(%obj);
|
||||
}
|
||||
}
|
||||
else if(%repTgt.notRepairable)
|
||||
{
|
||||
// this is an object that cant be repaired at all
|
||||
// -- mission specific flag set on the object
|
||||
if(!%obj.errMsgSent)
|
||||
{
|
||||
messageClient(%obj.client, 'MsgRepairPackIrrepairable', '\c2Target is not repairable.', %repTgt);
|
||||
%obj.errMsgSent = true;
|
||||
}
|
||||
// if player was repairing something, stop the repairs -- we're done
|
||||
if(%obj.repairing)
|
||||
stopRepairing(%obj);
|
||||
}
|
||||
else if(%repTgt.getDamageLevel())
|
||||
{
|
||||
// yes, it's damaged
|
||||
if(%repTgt != %obj.repairing)
|
||||
{
|
||||
if(isObject(%obj.repairing))
|
||||
stopRepairing(%obj);
|
||||
|
||||
%obj.repairing = %repTgt;
|
||||
}
|
||||
// setting imageLoaded to true sends us to repair state (function onRepair)
|
||||
%obj.setImageLoaded(%slot, true);
|
||||
}
|
||||
else
|
||||
{
|
||||
// there is a target in range, but it's not damaged
|
||||
if(!%obj.errMsgSent)
|
||||
{
|
||||
// if the target isn't damaged, send a message to that effect only once
|
||||
// JTL - repair ourselves if target is not damaged
|
||||
if(%obj.getDamageLevel()) {
|
||||
if(%obj.repairing != 0)
|
||||
if(%obj.repairing != %obj)
|
||||
stopRepairing(%obj);
|
||||
if(isObject(%obj.repairing))
|
||||
stopRepairing(%obj);
|
||||
|
||||
%obj.repairing = %obj;
|
||||
// quick, to onRepair!
|
||||
%obj.setImageLoaded(%slot, true);
|
||||
return;
|
||||
}
|
||||
else {
|
||||
messageClient(%obj.client, 'MsgRepairPackNotDamaged', '\c2Target is not damaged.', %repTgt);
|
||||
%obj.errMsgSent = true;
|
||||
}
|
||||
}
|
||||
// if player was repairing something, stop the repairs -- we're done
|
||||
if(%obj.repairing)
|
||||
stopRepairing(%obj);
|
||||
}
|
||||
}
|
||||
|
||||
//AI hack - too many things influence the aiming, so I'm going to force the repair object for bots only
|
||||
else if (%obj.client.isAIControlled() && isObject(%obj.client.repairObject))
|
||||
{
|
||||
%repTgt = %obj.client.repairObject;
|
||||
%repPoint = %repTgt.getAIRepairPoint();
|
||||
if (%repPoint $= "0 0 0")
|
||||
%repPoint = %repTgt.getWorldBoxCenter();
|
||||
%repTgtVector = VectorNormalize(VectorSub(%muzPoint, %repPoint));
|
||||
%aimVector = VectorNormalize(VectorSub(%muzPoint, %rangeEnd));
|
||||
|
||||
//if the dot product is very close (ie. we're aiming in the right direction)
|
||||
if (VectorDot(%repTgtVector, %aimVector) > 0.85)
|
||||
{
|
||||
//do an LOS to make sure nothing is in the way...
|
||||
%scanTarg = ContainerRayCast(%muzPoint, %repPoint, %searchMasks, %obj);
|
||||
if (firstWord(%scanTarg) == %repTgt)
|
||||
{
|
||||
// yes, it's damaged
|
||||
|
||||
if(isObject(%obj.repairing))
|
||||
stopRepairing(%obj);
|
||||
|
||||
%obj.repairing = %repTgt;
|
||||
// setting imageLoaded to true sends us to repair state (function onRepair)
|
||||
%obj.setImageLoaded(%slot, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if(%obj.getDamageLevel())
|
||||
{
|
||||
// there is no target in range, but the player is damaged
|
||||
// check to see if we were repairing something before -- if so, stop repairing old target
|
||||
if(%obj.repairing != 0)
|
||||
if(%obj.repairing != %obj)
|
||||
stopRepairing(%obj);
|
||||
if(isObject(%obj.repairing))
|
||||
stopRepairing(%obj);
|
||||
|
||||
%obj.repairing = %obj;
|
||||
// quick, to onRepair!
|
||||
%obj.setImageLoaded(%slot, true);
|
||||
}
|
||||
else
|
||||
{
|
||||
// there is no target in range, and the player isn't damaged
|
||||
if(!%obj.errMsgSent)
|
||||
{
|
||||
// send an error message only once
|
||||
messageClient(%obj.client, 'MsgRepairPackNoTarget', '\c2No target to repair.');
|
||||
%obj.errMsgSent = true;
|
||||
}
|
||||
stopRepairing(%obj);
|
||||
}
|
||||
}
|
||||
|
||||
function RepairGunImage::onRepair(%this,%obj,%slot)
|
||||
{
|
||||
// this = repairgunimage datablock
|
||||
// obj = player wielding the repair gun
|
||||
// slot = weapon slot
|
||||
|
||||
if(%obj.getEnergyLevel() <= %this.cutOffEnergy)
|
||||
{
|
||||
stopRepairing(%obj);
|
||||
return;
|
||||
}
|
||||
// reset the flag that indicates an error message has been sent
|
||||
%obj.errMsgSent = false;
|
||||
%target = %obj.repairing;
|
||||
if(!%target)
|
||||
{
|
||||
// no target -- whoops! never mind
|
||||
stopRepairing(%obj);
|
||||
}
|
||||
else
|
||||
{
|
||||
%target.repairedBy = %obj.client; //keep track of who last repaired this item
|
||||
if(%obj.repairing == %obj)
|
||||
{
|
||||
// player is self-repairing
|
||||
if(%obj.getDamageLevel())
|
||||
{
|
||||
if(!%obj.selfRepairing)
|
||||
{
|
||||
// no need for a projectile, just send a message and up the repair rate
|
||||
messageClient(%obj.client, 'MsgRepairPackPlayerSelfRepair', '\c2Repairing self.');
|
||||
%obj.selfRepairing = true;
|
||||
startRepairing(%obj, true);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
messageClient(%obj.client, 'MsgRepairPackSelfDone', '\c2Repairs completed on self.');
|
||||
stopRepairing(%obj);
|
||||
%obj.errMsgSent = true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// make sure we still have a target -- more vector fun!!!
|
||||
%muzVec = %obj.getMuzzleVector(%slot);
|
||||
%muzNVec = VectorNormalize(%muzVec);
|
||||
%repairRange = DefaultRepairBeam.beamRange;
|
||||
%muzScaled = VectorScale(%muzNVec, %repairRange);
|
||||
%muzPoint = %obj.getMuzzlePoint(%slot);
|
||||
%rangeEnd = VectorAdd(%muzPoint, %muzScaled);
|
||||
|
||||
%searchMasks = $TypeMasks::PlayerObjectType | $TypeMasks::VehicleObjectType |
|
||||
$TypeMasks::StaticShapeObjectType | $TypeMasks::TurretObjectType;
|
||||
|
||||
//AI hack to help "fudge" the repairing stuff...
|
||||
if (%obj.client.isAIControlled() && isObject(%obj.client.repairObject) && %obj.client.repairObject == %obj.repairing)
|
||||
{
|
||||
%repTgt = %obj.client.repairObject;
|
||||
%repPoint = %repTgt.getAIRepairPoint();
|
||||
if (%repPoint $= "0 0 0")
|
||||
%repPoint = %repTgt.getWorldBoxCenter();
|
||||
%repTgtVector = VectorNormalize(VectorSub(%muzPoint, %repPoint));
|
||||
%aimVector = VectorNormalize(VectorSub(%muzPoint, %rangeEnd));
|
||||
|
||||
//if the dot product is very close (ie. we're aiming in the right direction)
|
||||
if (VectorDot(%repTgtVector, %aimVector) > 0.85)
|
||||
%scanTarg = ContainerRayCast(%muzPoint, %repPoint, %searchMasks, %obj);
|
||||
}
|
||||
else
|
||||
%scanTarg = ContainerRayCast(%muzPoint, %rangeEnd, %searchMasks, %obj);
|
||||
|
||||
if (%scanTarg)
|
||||
{
|
||||
%pos = getWords(%scanTarg, 1, 3);
|
||||
%obstructMask = $TypeMasks::InteriorObjectType | $TypeMasks::TerrainObjectType;
|
||||
%obstruction = ContainerRayCast(%muzPoint, %pos, %obstructMask, %obj);
|
||||
if (%obstruction)
|
||||
%scanTarg = "0";
|
||||
}
|
||||
|
||||
if(%scanTarg)
|
||||
{
|
||||
// there's still a target out there
|
||||
%repTgt = firstWord(%scanTarg);
|
||||
// is the target damaged?
|
||||
if(%repTgt.getDamageLevel())
|
||||
{
|
||||
if(%repTgt != %obj.repairing)
|
||||
{
|
||||
// the target is not the same as the one we were just repairing
|
||||
// stop repairing old target, start repairing new target
|
||||
stopRepairing(%obj);
|
||||
if(isObject(%obj.repairing))
|
||||
stopRepairing(%obj);
|
||||
|
||||
%obj.repairing = %repTgt;
|
||||
// extract the name of what player is repairing based on what it is
|
||||
// if it's a player, it's the player's name (duh)
|
||||
// if it's an object, look for a nametag
|
||||
// if object has no nametag, just say what it is (e.g. generatorLarge)
|
||||
if(%repTgt.getClassName() $= Player)
|
||||
%tgtName = getTaggedString(%repTgt.client.name);
|
||||
else if(%repTgt.getGameName() !$= "")
|
||||
%tgtName = %repTgt.getGameName();
|
||||
else
|
||||
%tgtName = %repTgt.getDatablock().getName();
|
||||
messageClient(%obj.client, 'MsgRepairPackRepairingObj', '\c2Repairing %1.', %tgtName, %repTgt);
|
||||
startRepairing(%obj, false);
|
||||
}
|
||||
else
|
||||
{
|
||||
// it's the same target as last time
|
||||
// changed to fix "2 players can't repair same object" bug
|
||||
if(%obj.repairProjectile == 0)
|
||||
{
|
||||
if(%repTgt.getClassName() $= Player)
|
||||
%tgtName = getTaggedString(%repTgt.client.name);
|
||||
else if(%repTgt.getGameName() !$= "")
|
||||
%tgtName = %repTgt.getGameName();
|
||||
else
|
||||
%tgtName = %repTgt.getDatablock().getName();
|
||||
messageClient(%obj.client, 'MsgRepairPackRepairingObj', '\c2Repairing %1.', %tgtName, %repTgt);
|
||||
startRepairing(%obj, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
%rateOfRepair = %this.repairFactorObject;
|
||||
if(%repTgt.getClassName() $= Player)
|
||||
{
|
||||
%tgtName = getTaggedString(%repTgt.client.name);
|
||||
%rateOfRepair = %this.repairFactorPlayer;
|
||||
}
|
||||
else if(%repTgt.getGameName() !$= "")
|
||||
%tgtName = %repTgt.getGameName();
|
||||
else
|
||||
%tgtName = %repTgt.getDatablock().getName();
|
||||
if(%repTgt != %obj.repairing)
|
||||
{
|
||||
// it isn't the same object we were repairing previously
|
||||
messageClient(%obj.client, 'MsgRepairPackNotDamaged', '\c2%1 is not damaged.', %tgtName);
|
||||
}
|
||||
else
|
||||
{
|
||||
// same target, but not damaged -- we must be done
|
||||
messageClient(%obj.client, 'MsgRepairPackDone', '\c2Repairs completed.');
|
||||
Game.objectRepaired(%repTgt, %tgtName);
|
||||
}
|
||||
%obj.errMsgSent = true;
|
||||
stopRepairing(%obj);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// whoops, we lost our target
|
||||
messageClient(%obj.client, 'MsgRepairPackLostTarget', '\c2Repair target no longer in range.');
|
||||
stopRepairing(%obj);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function RepairGunImage::onDeactivate(%this,%obj,%slot)
|
||||
{
|
||||
stopRepairing(%obj);
|
||||
}
|
||||
|
||||
function stopRepairing(%player)
|
||||
{
|
||||
// %player = the player who was using the repair pack
|
||||
|
||||
if(%player.selfRepairing)
|
||||
{
|
||||
// there is no projectile for self-repairing
|
||||
%player.setRepairRate(%player.getRepairRate() - %player.repairingRate);
|
||||
%player.selfRepairing = false;
|
||||
}
|
||||
else if(%player.repairing > 0)
|
||||
{
|
||||
// player was repairing something else
|
||||
//if(%player.repairing.beingRepaired > 0)
|
||||
//{
|
||||
// don't decrement this stuff if it's already at 0 -- though it shouldn't be
|
||||
//%player.repairing.beingRepaired--;
|
||||
%player.repairing.setRepairRate(%player.repairing.getRepairRate() - %player.repairingRate);
|
||||
//}
|
||||
if(%player.repairProjectile > 0)
|
||||
{
|
||||
// is there a repair projectile? delete it
|
||||
%player.repairProjectile.delete();
|
||||
%player.repairProjectile = 0;
|
||||
}
|
||||
}
|
||||
%player.repairing = 0;
|
||||
%player.repairingRate = 0;
|
||||
%player.setImageTrigger($WeaponSlot, false);
|
||||
%player.setImageLoaded($WeaponSlot, false);
|
||||
}
|
||||
|
||||
function startRepairing(%player, %self)
|
||||
{
|
||||
// %player = the player who was using the repair pack
|
||||
// %self = boolean -- is player repairing him/herself?
|
||||
|
||||
if(%self)
|
||||
{
|
||||
// one repair, hold the projectile
|
||||
%player.setRepairRate(%player.getRepairRate() + RepairGunImage.repairFactorPlayer);
|
||||
%player.selfRepairing = true;
|
||||
%player.repairingRate = RepairGunImage.repairFactorPlayer;
|
||||
}
|
||||
else
|
||||
{
|
||||
//if(%player.repairing.beingRepaired $= "")
|
||||
// %player.repairing.beingRepaired = 1;
|
||||
//else
|
||||
// %player.repairing.beingRepaired++;
|
||||
|
||||
//AI hack...
|
||||
if (%player.client.isAIControlled() && %player.client.repairObject == %player.repairing)
|
||||
{
|
||||
%initialPosition = %player.getMuzzlePoint($WeaponSlot);
|
||||
%initialDirection = VectorSub(%initialPosition, %player.repairing.getWorldBoxCenter());
|
||||
}
|
||||
else
|
||||
{
|
||||
%initialDirection = %player.getMuzzleVector($WeaponSlot);
|
||||
%initialPosition = %player.getMuzzlePoint($WeaponSlot);
|
||||
}
|
||||
if(%player.repairing.getClassName() $= Player)
|
||||
%repRate = RepairGunImage.repairFactorPlayer;
|
||||
else
|
||||
%repRate = RepairGunImage.repairFactorObject;
|
||||
%player.repairing.setRepairRate(%player.repairing.getRepairRate() + %repRate);
|
||||
|
||||
%player.repairingRate = %repRate;
|
||||
%player.repairProjectile = new RepairProjectile() {
|
||||
dataBlock = DefaultRepairBeam;
|
||||
initialDirection = %initialDirection;
|
||||
initialPosition = %initialPosition;
|
||||
sourceObject = %player;
|
||||
sourceSlot = $WeaponSlot;
|
||||
targetObject = %player.repairing;
|
||||
};
|
||||
MissionCleanup.add(%player.repairProjectile);
|
||||
}
|
||||
}
|
||||
|
||||
function RepairPack::onPickup(%this, %obj, %shape, %amount)
|
||||
{
|
||||
// created to prevent console errors
|
||||
}
|
||||
830
scripts/packs/satchelCharge.cs
Normal file
830
scripts/packs/satchelCharge.cs
Normal file
|
|
@ -0,0 +1,830 @@
|
|||
//--------------------------------------------------------------------------
|
||||
// Satchel Charge pack
|
||||
// can be used by any armor type
|
||||
// when activated, throws the pack -- when activated again (before
|
||||
// picking up another pack), detonates with a BIG explosion.
|
||||
|
||||
// Set up defaults for nonexisting vars
|
||||
|
||||
$SatchelChargeMultiplier = 1;
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
// Sounds
|
||||
|
||||
datablock AudioProfile(SatchelChargeActivateSound)
|
||||
{
|
||||
filename = "fx/packs/satchel_pack_activate.wav";
|
||||
description = AudioClose3d;
|
||||
preload = true;
|
||||
};
|
||||
|
||||
datablock AudioProfile(SatchelChargeExplosionSound)
|
||||
{
|
||||
filename = "fx/packs/satchel_pack_detonate.wav";
|
||||
description = AudioBIGExplosion3d;
|
||||
preload = true;
|
||||
};
|
||||
|
||||
datablock AudioProfile(SatchelChargePreExplosionSound)
|
||||
{
|
||||
filename = "fx/explosions/explosion.xpl03.wav";
|
||||
description = AudioBIGExplosion3d;
|
||||
preload = true;
|
||||
};
|
||||
|
||||
datablock AudioProfile(UnderwaterSatchelChargeExplosionSound)
|
||||
{
|
||||
filename = "fx/weapons/mortar_explode_UW.wav";
|
||||
description = AudioBIGExplosion3d;
|
||||
preload = true;
|
||||
};
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
// Satchel Debris
|
||||
//----------------------------------------------------------------------------
|
||||
datablock ParticleData( SDebrisSmokeParticle )
|
||||
{
|
||||
dragCoeffiecient = 1.0;
|
||||
gravityCoefficient = 0.0;
|
||||
inheritedVelFactor = 0.2;
|
||||
|
||||
lifetimeMS = 1000;
|
||||
lifetimeVarianceMS = 100;
|
||||
|
||||
textureName = "particleTest";
|
||||
|
||||
useInvAlpha = true;
|
||||
|
||||
spinRandomMin = -60.0;
|
||||
spinRandomMax = 60.0;
|
||||
|
||||
colors[0] = "0.4 0.4 0.4 1.0";
|
||||
colors[1] = "0.3 0.3 0.3 0.5";
|
||||
colors[2] = "0.0 0.0 0.0 0.0";
|
||||
sizes[0] = 0.0;
|
||||
sizes[1] = 2.0;
|
||||
sizes[2] = 3.0;
|
||||
times[0] = 0.0;
|
||||
times[1] = 0.5;
|
||||
times[2] = 1.0;
|
||||
};
|
||||
|
||||
datablock ParticleEmitterData( SDebrisSmokeEmitter )
|
||||
{
|
||||
ejectionPeriodMS = 7;
|
||||
periodVarianceMS = 1;
|
||||
|
||||
ejectionVelocity = 1.0; // A little oomph at the back end
|
||||
velocityVariance = 0.2;
|
||||
|
||||
thetaMin = 0.0;
|
||||
thetaMax = 40.0;
|
||||
|
||||
particles = "SDebrisSmokeParticle";
|
||||
};
|
||||
|
||||
|
||||
datablock DebrisData( SatchelDebris )
|
||||
{
|
||||
emitters[0] = SDebrisSmokeEmitter;
|
||||
|
||||
explodeOnMaxBounce = true;
|
||||
|
||||
elasticity = 0.4;
|
||||
friction = 0.2;
|
||||
|
||||
lifetime = 0.3;
|
||||
lifetimeVariance = 0.02;
|
||||
};
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
// Bubbles
|
||||
//----------------------------------------------------------------------------
|
||||
datablock ParticleData(SatchelBubbleParticle)
|
||||
{
|
||||
dragCoefficient = 0.0;
|
||||
gravityCoefficient = -0.25;
|
||||
inheritedVelFactor = 0.0;
|
||||
constantAcceleration = 0.0;
|
||||
lifetimeMS = 1500;
|
||||
lifetimeVarianceMS = 600;
|
||||
useInvAlpha = false;
|
||||
textureName = "special/bubbles";
|
||||
|
||||
spinRandomMin = -100.0;
|
||||
spinRandomMax = 100.0;
|
||||
|
||||
colors[0] = "0.7 0.8 1.0 0.0";
|
||||
colors[1] = "0.7 0.8 1.0 0.4";
|
||||
colors[2] = "0.7 0.8 1.0 0.0";
|
||||
sizes[0] = 2.0;
|
||||
sizes[1] = 2.0;
|
||||
sizes[2] = 2.0;
|
||||
times[0] = 0.0;
|
||||
times[1] = 0.8;
|
||||
times[2] = 1.0;
|
||||
};
|
||||
|
||||
datablock ParticleEmitterData(SatchelBubbleEmitter)
|
||||
{
|
||||
ejectionPeriodMS = 10;
|
||||
periodVarianceMS = 0;
|
||||
ejectionVelocity = 1.0;
|
||||
ejectionOffset = 7.0;
|
||||
velocityVariance = 0.5;
|
||||
thetaMin = 0;
|
||||
thetaMax = 80;
|
||||
phiReferenceVel = 0;
|
||||
phiVariance = 360;
|
||||
overrideAdvances = false;
|
||||
particles = "MortarExplosionBubbleParticle";
|
||||
};
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
// Satchel Explosion Particle effects
|
||||
//--------------------------------------
|
||||
datablock ParticleData(SatchelExplosionSmoke)
|
||||
{
|
||||
dragCoeffiecient = 0.4;
|
||||
gravityCoefficient = -0.0; // rises slowly
|
||||
inheritedVelFactor = 0.025;
|
||||
|
||||
lifetimeMS = 2000;
|
||||
lifetimeVarianceMS = 0;
|
||||
|
||||
textureName = "particleTest";
|
||||
|
||||
useInvAlpha = true;
|
||||
spinRandomMin = -200.0;
|
||||
spinRandomMax = 200.0;
|
||||
|
||||
textureName = "special/Smoke/smoke_001";
|
||||
|
||||
colors[0] = "1.0 0.7 0.0 1.0";
|
||||
colors[1] = "0.2 0.2 0.2 0.5";
|
||||
colors[2] = "0.0 0.0 0.0 0.0";
|
||||
sizes[0] = 7.0;
|
||||
sizes[1] = 17.0;
|
||||
sizes[2] = 2.0;
|
||||
times[0] = 0.0;
|
||||
times[1] = 0.4;
|
||||
times[2] = 1.0;
|
||||
};
|
||||
|
||||
datablock ParticleEmitterData(SatchelExplosionSmokeEmitter)
|
||||
{
|
||||
ejectionPeriodMS = 10;
|
||||
periodVarianceMS = 0;
|
||||
|
||||
ejectionVelocity = 14.25;
|
||||
velocityVariance = 2.25;
|
||||
|
||||
thetaMin = 0.0;
|
||||
thetaMax = 180.0;
|
||||
|
||||
lifetimeMS = 200;
|
||||
|
||||
particles = "SatchelExplosionSmoke";
|
||||
};
|
||||
|
||||
datablock ParticleData(UnderwaterSatchelExplosionSmoke)
|
||||
{
|
||||
dragCoeffiecient = 105.0;
|
||||
gravityCoefficient = -0.0;
|
||||
inheritedVelFactor = 0.025;
|
||||
|
||||
constantAcceleration = -1.0;
|
||||
|
||||
lifetimeMS = 1500;
|
||||
lifetimeVarianceMS = 0;
|
||||
|
||||
textureName = "particleTest";
|
||||
|
||||
useInvAlpha = false;
|
||||
spinRandomMin = -200.0;
|
||||
spinRandomMax = 200.0;
|
||||
|
||||
textureName = "special/Smoke/smoke_001";
|
||||
|
||||
colors[0] = "0.4 0.4 1.0 1.0";
|
||||
colors[1] = "0.4 0.4 1.0 0.5";
|
||||
colors[2] = "0.0 0.0 0.0 0.0";
|
||||
sizes[0] = 7.0;
|
||||
sizes[1] = 17.0;
|
||||
sizes[2] = 2.0;
|
||||
times[0] = 0.0;
|
||||
times[1] = 0.2;
|
||||
times[2] = 1.0;
|
||||
};
|
||||
|
||||
datablock ParticleEmitterData(UnderwaterSatchelExplosionSmokeEmitter)
|
||||
{
|
||||
ejectionPeriodMS = 10;
|
||||
periodVarianceMS = 0;
|
||||
|
||||
ejectionVelocity = 14.25;
|
||||
velocityVariance = 2.25;
|
||||
|
||||
thetaMin = 0.0;
|
||||
thetaMax = 180.0;
|
||||
|
||||
lifetimeMS = 200;
|
||||
|
||||
particles = "UnderwaterSatchelExplosionSmoke";
|
||||
};
|
||||
|
||||
|
||||
datablock ParticleData(SatchelSparks)
|
||||
{
|
||||
dragCoefficient = 1;
|
||||
gravityCoefficient = 0.0;
|
||||
inheritedVelFactor = 0.2;
|
||||
constantAcceleration = 0.0;
|
||||
lifetimeMS = 500;
|
||||
lifetimeVarianceMS = 150;
|
||||
textureName = "special/bigSpark";
|
||||
colors[0] = "0.56 0.36 0.26 1.0";
|
||||
colors[1] = "0.56 0.36 0.26 1.0";
|
||||
colors[2] = "1.0 0.36 0.26 0.0";
|
||||
sizes[0] = 0.5;
|
||||
sizes[1] = 0.5;
|
||||
sizes[2] = 0.75;
|
||||
times[0] = 0.0;
|
||||
times[1] = 0.5;
|
||||
times[2] = 1.0;
|
||||
|
||||
};
|
||||
|
||||
datablock ParticleEmitterData(SatchelSparksEmitter)
|
||||
{
|
||||
ejectionPeriodMS = 1;
|
||||
periodVarianceMS = 0;
|
||||
ejectionVelocity = 40;
|
||||
velocityVariance = 20.0;
|
||||
ejectionOffset = 0.0;
|
||||
thetaMin = 0;
|
||||
thetaMax = 180;
|
||||
phiReferenceVel = 0;
|
||||
phiVariance = 360;
|
||||
overrideAdvances = false;
|
||||
orientParticles = true;
|
||||
lifetimeMS = 200;
|
||||
particles = "SatchelSparks";
|
||||
};
|
||||
|
||||
datablock ParticleData(UnderwaterSatchelSparks)
|
||||
{
|
||||
dragCoefficient = 1;
|
||||
gravityCoefficient = 0.0;
|
||||
inheritedVelFactor = 0.2;
|
||||
constantAcceleration = 0.0;
|
||||
lifetimeMS = 500;
|
||||
lifetimeVarianceMS = 350;
|
||||
textureName = "special/underwaterSpark";
|
||||
colors[0] = "0.6 0.6 1.0 1.0";
|
||||
colors[1] = "0.6 0.6 1.0 1.0";
|
||||
colors[2] = "0.6 0.6 1.0 0.0";
|
||||
sizes[0] = 0.5;
|
||||
sizes[1] = 0.5;
|
||||
sizes[2] = 0.75;
|
||||
times[0] = 0.0;
|
||||
times[1] = 0.5;
|
||||
times[2] = 1.0;
|
||||
|
||||
};
|
||||
|
||||
datablock ParticleEmitterData(UnderwaterSatchelSparksEmitter)
|
||||
{
|
||||
ejectionPeriodMS = 2;
|
||||
periodVarianceMS = 0;
|
||||
ejectionVelocity = 30;
|
||||
velocityVariance = 5.0;
|
||||
ejectionOffset = 0.0;
|
||||
thetaMin = 0;
|
||||
thetaMax = 70;
|
||||
phiReferenceVel = 0;
|
||||
phiVariance = 360;
|
||||
overrideAdvances = false;
|
||||
orientParticles = true;
|
||||
lifetimeMS = 100;
|
||||
particles = "UnderwaterSatchelSparks";
|
||||
};
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// Explosion
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
datablock ExplosionData(SatchelSubExplosion)
|
||||
{
|
||||
explosionShape = "disc_explosion.dts";
|
||||
faceViewer = true;
|
||||
explosionScale = "0.5 0.5 0.5";
|
||||
|
||||
debris = SatchelDebris;
|
||||
debrisThetaMin = 10;
|
||||
debrisThetaMax = 80;
|
||||
debrisNum = 8;
|
||||
debrisVelocity = 60.0;
|
||||
debrisVelocityVariance = 15.0;
|
||||
|
||||
lifetimeMS = 1000;
|
||||
delayMS = 0;
|
||||
|
||||
emitter[0] = SatchelExplosionSmokeEmitter;
|
||||
emitter[1] = SatchelSparksEmitter;
|
||||
|
||||
offset = 0.0;
|
||||
|
||||
playSpeed = 1.5;
|
||||
|
||||
sizes[0] = "1.5 1.5 1.5";
|
||||
sizes[1] = "3.0 3.0 3.0";
|
||||
times[0] = 0.0;
|
||||
times[1] = 1.0;
|
||||
};
|
||||
|
||||
datablock ExplosionData(SatchelSubExplosion2)
|
||||
{
|
||||
explosionShape = "disc_explosion.dts";
|
||||
faceViewer = true;
|
||||
explosionScale = "0.7 0.7 0.7";
|
||||
|
||||
debris = SatchelDebris;
|
||||
debrisThetaMin = 10;
|
||||
debrisThetaMax = 170;
|
||||
debrisNum = 8;
|
||||
debrisVelocity = 60.0;
|
||||
debrisVelocityVariance = 15.0;
|
||||
|
||||
lifetimeMS = 1000;
|
||||
delayMS = 50;
|
||||
|
||||
emitter[0] = SatchelExplosionSmokeEmitter;
|
||||
emitter[1] = SatchelSparksEmitter;
|
||||
|
||||
offset = 9.0;
|
||||
|
||||
playSpeed = 1.5;
|
||||
|
||||
sizes[0] = "1.5 1.5 1.5";
|
||||
sizes[1] = "1.5 1.5 1.5";
|
||||
times[0] = 0.0;
|
||||
times[1] = 1.0;
|
||||
};
|
||||
|
||||
datablock ExplosionData(SatchelSubExplosion3)
|
||||
{
|
||||
explosionShape = "disc_explosion.dts";
|
||||
faceViewer = true;
|
||||
explosionScale = "1.0 1.0 1.0";
|
||||
|
||||
debris = SatchelDebris;
|
||||
debrisThetaMin = 10;
|
||||
debrisThetaMax = 170;
|
||||
debrisNum = 8;
|
||||
debrisVelocity = 60.0;
|
||||
debrisVelocityVariance = 15.0;
|
||||
|
||||
lifetimeMS = 2000;
|
||||
delayMS = 100;
|
||||
|
||||
emitter[0] = SatchelExplosionSmokeEmitter;
|
||||
emitter[1] = SatchelSparksEmitter;
|
||||
|
||||
offset = 9.0;
|
||||
|
||||
playSpeed = 2.5;
|
||||
|
||||
sizes[0] = "1.0 1.0 1.0";
|
||||
sizes[1] = "1.0 1.0 1.0";
|
||||
times[0] = 0.0;
|
||||
times[1] = 1.0;
|
||||
};
|
||||
|
||||
datablock ExplosionData(SatchelMainExplosion)
|
||||
{
|
||||
soundProfile = SatchelChargePreExplosionSound;
|
||||
|
||||
subExplosion[0] = SatchelSubExplosion;
|
||||
subExplosion[1] = SatchelSubExplosion2;
|
||||
subExplosion[2] = SatchelSubExplosion3;
|
||||
};
|
||||
|
||||
//LARGE
|
||||
datablock ExplosionData(LargeSatchelSubExplosion)
|
||||
{
|
||||
explosionShape = "disc_explosion.dts";
|
||||
faceViewer = true;
|
||||
explosionScale = "0.5 0.5 0.5";
|
||||
|
||||
debris = SatchelDebris;
|
||||
debrisThetaMin = 10;
|
||||
debrisThetaMax = 80;
|
||||
debrisNum = 8;
|
||||
debrisVelocity = 60.0;
|
||||
debrisVelocityVariance = 15.0;
|
||||
|
||||
lifetimeMS = 1000;
|
||||
delayMS = 0;
|
||||
|
||||
emitter[0] = SatchelExplosionSmokeEmitter;
|
||||
emitter[1] = SatchelSparksEmitter;
|
||||
|
||||
offset = 0.0;
|
||||
|
||||
playSpeed = 1.5;
|
||||
|
||||
sizes[0] = "5.5 5.5 5.5";
|
||||
sizes[1] = "8.0 8.0 8.0";
|
||||
times[0] = 0.0;
|
||||
times[1] = 1.0;
|
||||
};
|
||||
|
||||
datablock ExplosionData(LargeSatchelSubExplosion2)
|
||||
{
|
||||
explosionShape = "disc_explosion.dts";
|
||||
faceViewer = true;
|
||||
explosionScale = "0.7 0.7 0.7";
|
||||
|
||||
debris = SatchelDebris;
|
||||
debrisThetaMin = 10;
|
||||
debrisThetaMax = 170;
|
||||
debrisNum = 8;
|
||||
debrisVelocity = 60.0;
|
||||
debrisVelocityVariance = 15.0;
|
||||
|
||||
lifetimeMS = 1000;
|
||||
delayMS = 50;
|
||||
|
||||
emitter[0] = SatchelExplosionSmokeEmitter;
|
||||
emitter[1] = SatchelSparksEmitter;
|
||||
|
||||
offset = 9.0;
|
||||
|
||||
playSpeed = 1.5;
|
||||
|
||||
sizes[0] = "5.5 5.5 5.5";
|
||||
sizes[1] = "5.5 5.5 5.5";
|
||||
times[0] = 0.0;
|
||||
times[1] = 1.0;
|
||||
};
|
||||
|
||||
datablock ExplosionData(LargeSatchelSubExplosion3)
|
||||
{
|
||||
explosionShape = "disc_explosion.dts";
|
||||
faceViewer = true;
|
||||
explosionScale = "1.0 1.0 1.0";
|
||||
|
||||
debris = SatchelDebris;
|
||||
debrisThetaMin = 10;
|
||||
debrisThetaMax = 170;
|
||||
debrisNum = 8;
|
||||
debrisVelocity = 60.0;
|
||||
debrisVelocityVariance = 15.0;
|
||||
|
||||
lifetimeMS = 2000;
|
||||
delayMS = 100;
|
||||
|
||||
emitter[0] = SatchelExplosionSmokeEmitter;
|
||||
emitter[1] = SatchelSparksEmitter;
|
||||
|
||||
offset = 9.0;
|
||||
|
||||
playSpeed = 2.5;
|
||||
|
||||
sizes[0] = "5.0 5.0 5.0";
|
||||
sizes[1] = "5.0 5.0 5.0";
|
||||
times[0] = 0.0;
|
||||
times[1] = 1.0;
|
||||
};
|
||||
|
||||
datablock ExplosionData(LargeSatchelMainExplosion)
|
||||
{
|
||||
soundProfile = SatchelChargePreExplosionSound;
|
||||
|
||||
subExplosion[0] = LargeSatchelSubExplosion;
|
||||
subExplosion[1] = LargeSatchelSubExplosion2;
|
||||
subExplosion[2] = LargeSatchelSubExplosion3;
|
||||
};
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// Underwater Explosion
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
datablock ExplosionData(UnderwaterSatchelSubExplosion)
|
||||
{
|
||||
explosionShape = "disc_explosion.dts";
|
||||
faceViewer = true;
|
||||
explosionScale = "0.5 0.5 0.5";
|
||||
|
||||
|
||||
lifetimeMS = 1000;
|
||||
delayMS = 0;
|
||||
|
||||
emitter[0] = UnderwaterSatchelExplosionSmokeEmitter;
|
||||
emitter[1] = UnderwaterSatchelSparksEmitter;
|
||||
emitter[2] = SatchelBubbleEmitter;
|
||||
|
||||
offset = 0.0;
|
||||
|
||||
playSpeed = 0.75;
|
||||
|
||||
sizes[0] = "1.5 1.5 1.5";
|
||||
sizes[1] = "2.5 2.5 2.5";
|
||||
sizes[2] = "2.0 2.0 2.0";
|
||||
times[0] = 0.0;
|
||||
times[1] = 0.5;
|
||||
times[2] = 1.0;
|
||||
};
|
||||
|
||||
datablock ExplosionData(UnderwaterSatchelSubExplosion2)
|
||||
{
|
||||
explosionShape = "disc_explosion.dts";
|
||||
faceViewer = true;
|
||||
explosionScale = "0.7 0.7 0.7";
|
||||
|
||||
|
||||
lifetimeMS = 1000;
|
||||
delayMS = 50;
|
||||
|
||||
emitter[0] = UnderwaterSatchelExplosionSmokeEmitter;
|
||||
emitter[1] = UnderwaterSatchelSparksEmitter;
|
||||
emitter[2] = SatchelBubbleEmitter;
|
||||
|
||||
offset = 9.0;
|
||||
|
||||
playSpeed = 0.75;
|
||||
|
||||
sizes[0] = "1.5 1.5 1.5";
|
||||
sizes[1] = "1.0 1.0 1.0";
|
||||
sizes[2] = "0.75 0.75 0.75";
|
||||
times[0] = 0.0;
|
||||
times[1] = 0.5;
|
||||
times[2] = 1.0;
|
||||
};
|
||||
|
||||
datablock ExplosionData(UnderwaterSatchelSubExplosion3)
|
||||
{
|
||||
explosionShape = "disc_explosion.dts";
|
||||
faceViewer = true;
|
||||
explosionScale = "1.0 1.0 1.0";
|
||||
|
||||
|
||||
lifetimeMS = 2000;
|
||||
delayMS = 100;
|
||||
|
||||
emitter[0] = UnderwaterSatchelExplosionSmokeEmitter;
|
||||
emitter[1] = UnderwaterSatchelSparksEmitter;
|
||||
emitter[2] = SatchelBubbleEmitter;
|
||||
|
||||
offset = 9.0;
|
||||
|
||||
playSpeed = 1.25;
|
||||
|
||||
sizes[0] = "1.0 1.0 1.0";
|
||||
sizes[1] = "1.0 1.0 1.0";
|
||||
sizes[2] = "0.5 0.5 0.5";
|
||||
times[0] = 0.0;
|
||||
times[1] = 0.5;
|
||||
times[2] = 1.0;
|
||||
};
|
||||
|
||||
datablock ExplosionData(UnderwaterSatchelMainExplosion)
|
||||
{
|
||||
soundProfile = UnderwaterSatchelChargeExplosionSound;
|
||||
|
||||
subExplosion[0] = UnderwaterSatchelSubExplosion;
|
||||
subExplosion[1] = UnderwaterSatchelSubExplosion2;
|
||||
subExplosion[2] = UnderwaterSatchelSubExplosion3;
|
||||
};
|
||||
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
// Projectile
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
// shapebase datablocks
|
||||
datablock ShapeBaseImageData(SatchelChargeImage)
|
||||
{
|
||||
shapeFile = "pack_upgrade_satchel.dts";
|
||||
item = SatchelCharge;
|
||||
mountPoint = 1;
|
||||
offset = "0 0 0";
|
||||
emap = true;
|
||||
};
|
||||
|
||||
datablock ItemData(SatchelCharge)
|
||||
{
|
||||
className = Pack;
|
||||
catagory = "Packs";
|
||||
image = SatchelChargeImage;
|
||||
shapeFile = "pack_upgrade_satchel.dts";
|
||||
mass = 1;
|
||||
elasticity = 0.2;
|
||||
friction = 0.6;
|
||||
pickupRadius = 2;
|
||||
rotate = true;
|
||||
pickUpName = "a satchel charge pack";
|
||||
|
||||
computeCRC = true;
|
||||
};
|
||||
|
||||
datablock ItemData(SatchelChargeThrown)
|
||||
{
|
||||
shapeFile = "pack_upgrade_satchel.dts";
|
||||
explosion = SatchelMainExplosion;
|
||||
underwaterExplosion = UnderwaterSatchelMainExplosion;
|
||||
mass = 1;
|
||||
elasticity = 0.1;
|
||||
friction = 0.9;
|
||||
rotate = false;
|
||||
pickupRadius = 0;
|
||||
noTimeout = true;
|
||||
armDelay = 3000;
|
||||
maxDamage = 0.6;
|
||||
|
||||
kickBackStrength = 4000;
|
||||
|
||||
computeCRC = true;
|
||||
};
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
|
||||
function SatchelCharge::onUse(%this, %obj)
|
||||
{
|
||||
if (!$Host::SatchelChargeEnabled) {
|
||||
if ($Host::Purebuild == 1)
|
||||
messageAll('msgClient','\c2%1 just tried to drop a Satchel Charge!',%obj.client.name);
|
||||
else
|
||||
messageTeam(%obj.client.team,'msgClient','\c2%1 just tried to drop a Satchel Charge!',%obj.client.name);
|
||||
%obj.decInventory(SatchelCharge, 1);
|
||||
return;
|
||||
}
|
||||
if ($Host::Purebuild == 1)
|
||||
messageAll('msgClient','\c2%1 just dropped a Satchel Charge!',%obj.client.name);
|
||||
else
|
||||
messageTeam(%obj.client.team,'msgClient','\c2%1 just dropped a Satchel Charge!',%obj.client.name);
|
||||
%item = new Item() {
|
||||
dataBlock = SatchelChargeThrown;
|
||||
rotation = "0 0 1 " @ (getRandom() * 360);
|
||||
scale = $SatchelChargeMultiplier SPC $SatchelChargeMultiplier SPC $SatchelChargeMultiplier;
|
||||
};
|
||||
MissionCleanup.add(%item);
|
||||
// take pack out of inventory and unmount image
|
||||
%obj.decInventory(SatchelCharge, 1);
|
||||
%obj.throwObject(%item);
|
||||
//error("throwing satchel charge #" @ %item);
|
||||
%obj.thrownChargeId = %item;
|
||||
%item.sourceObject = %obj;
|
||||
%item.armed = false;
|
||||
%item.damaged = 0.0;
|
||||
%item.thwart = false;
|
||||
// arm itself 3 seconds after being thrown
|
||||
schedule(%item.getDatablock().armDelay, %item, "initArmSatchelCharge", %item);
|
||||
messageClient(%obj.client, 'MsgSatchelChargePlaced', "\c2Satchel charge deployed.");
|
||||
}
|
||||
|
||||
function initArmSatchelCharge(%satchel)
|
||||
{
|
||||
// "deet deet deet" sound
|
||||
%satchel.playAudio(1, SatchelChargeActivateSound);
|
||||
// also need to play "antenna extending" animation
|
||||
%satchel.playThread(0, "deploy");
|
||||
%satchel.playThread(1, "activate");
|
||||
|
||||
// delay the actual arming until after sound is done playing
|
||||
schedule( 2200, 0, "armSatchelCharge", %satchel );
|
||||
}
|
||||
|
||||
function armSatchelCharge(%satchel)
|
||||
{
|
||||
%satchel.armed = true;
|
||||
commandToClient( %satchel.sourceObject.client, 'setSatchelArmed' );
|
||||
}
|
||||
|
||||
function detonateSatchelCharge(%player)
|
||||
{
|
||||
%satchelCharge = %player.thrownChargeId;
|
||||
// can't detonate the satchel charge if it isn't armed
|
||||
if(!%satchelCharge.armed)
|
||||
return;
|
||||
|
||||
//error("Detonating satchel charge #" @ %satchelCharge @ " for player #" @ %player);
|
||||
|
||||
if(%satchelCharge.getDamageState() !$= Destroyed)
|
||||
{
|
||||
%satchelCharge.setDamageState(Destroyed);
|
||||
%satchelCharge.blowup();
|
||||
}
|
||||
|
||||
// Clear the player's HUD:
|
||||
if (isObject(%player.client))
|
||||
%player.client.clearBackpackIcon();
|
||||
}
|
||||
|
||||
function SatchelChargeThrown::onEnterLiquid(%data, %obj, %coverage, %type)
|
||||
{
|
||||
// lava types
|
||||
if(%type >=4 && %type <= 6)
|
||||
{
|
||||
if(%obj.getDamageState() !$= "Destroyed")
|
||||
{
|
||||
%obj.armed = true;
|
||||
detonateSatchelCharge(%obj.sourceObject);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// quickSand
|
||||
if(%type == 7)
|
||||
if(isObject(%obj.sourceObject))
|
||||
%obj.sourceObject.thrownChargeId = 0;
|
||||
|
||||
Parent::onEnterLiquid(%data, %obj, %coverage, %type);
|
||||
}
|
||||
|
||||
function SatchelChargeImage::onMount(%data, %obj, %node)
|
||||
{
|
||||
%obj.thrownChargeId = 0;
|
||||
}
|
||||
|
||||
function SatchelChargeImage::onUnmount(%data, %obj, %node)
|
||||
{
|
||||
}
|
||||
|
||||
function SatchelChargeThrown::onDestroyed(%this, %object, %lastState)
|
||||
{
|
||||
if(%object.kaboom)
|
||||
return;
|
||||
else
|
||||
{
|
||||
%object.kaboom = true;
|
||||
|
||||
// the "thwart" flag is set if the charge is destroyed with weapons rather
|
||||
// than detonated. A less damaging explosion, but visually the same scale.
|
||||
if(%object.thwart)
|
||||
{
|
||||
messageClient(%object.sourceObject.client, 'msgSatchelChargeDetonate', "\c2Satchel charge destroyed.");
|
||||
%dmgRadius = 10 * $SatchelChargeMultiplier;
|
||||
%dmgMod = 0.3 * $SatchelChargeMultiplier;
|
||||
%expImpulse = limitSatchelImpulse(1000 * $SatchelChargeMultiplier);
|
||||
%dmgType = $DamageType::Explosion;
|
||||
}
|
||||
else
|
||||
{
|
||||
messageClient(%object.sourceObject.client, 'msgSatchelChargeDetonate', "\c2Satchel charge detonated!");
|
||||
%dmgRadius = 20 * $SatchelChargeMultiplier;
|
||||
%dmgMod = 1.0 * $SatchelChargeMultiplier;
|
||||
%expImpulse = limitSatchelImpulse(2500 * $SatchelChargeMultiplier);
|
||||
%dmgType = $DamageType::SatchelCharge;
|
||||
}
|
||||
|
||||
%object.blowingUp = true;
|
||||
RadiusExplosion(%object, %object.getPosition(), %dmgRadius, %dmgMod, %expImpulse, %object.sourceObject, %dmgType);
|
||||
|
||||
%object.schedule(1000, "delete");
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------
|
||||
// z0dd - ZOD, 5/8/02. Addition. Satchel bug fix. Prior to fix,
|
||||
// clients couldn't pick up packs when satchel was destroyed from dmg.
|
||||
if(isObject(%object.sourceObject))
|
||||
%object.sourceObject.thrownChargeId = 0;
|
||||
}
|
||||
|
||||
function SatchelChargeThrown::onCollision(%data,%obj,%col)
|
||||
{
|
||||
// Do nothing...
|
||||
}
|
||||
|
||||
function SatchelChargeThrown::damageObject(%data, %targetObject, %sourceObject, %position, %amount, %damageType)
|
||||
{
|
||||
if (!%object.blowingUp)
|
||||
{
|
||||
%targetObject.damaged += %amount;
|
||||
|
||||
if(%targetObject.damaged >= %targetObject.getDataBlock().maxDamage &&
|
||||
%targetObject.getDamageState() !$= Destroyed)
|
||||
{
|
||||
%targetObject.thwart = true;
|
||||
%targetObject.setDamageState(Destroyed);
|
||||
%targetObject.blowup();
|
||||
|
||||
// clear the player's HUD:
|
||||
if (isObject(%targetObject.sourceObject.client))
|
||||
%targetObject.sourceObject.client.clearBackPackIcon();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function SatchelCharge::onPickup(%this, %obj, %shape, %amount)
|
||||
{
|
||||
// created to prevent console errors
|
||||
}
|
||||
|
||||
function limitSatchelImpulse(%val) {
|
||||
if (%val > 50000)
|
||||
%val = 50000;
|
||||
return %val;
|
||||
}
|
||||
143
scripts/packs/solarpanel.cs
Normal file
143
scripts/packs/solarpanel.cs
Normal file
|
|
@ -0,0 +1,143 @@
|
|||
//--------------------------------------------------------------------------
|
||||
// Deployable Solar Panel
|
||||
//--------------------------------------------------------------------------
|
||||
|
||||
datablock ShapeBaseImageData(SolarPanelDeployableImage) {
|
||||
mass = 1;
|
||||
emap = true;
|
||||
shapeFile = "stackable1s.dts";
|
||||
item = SolarPanelDeployable;
|
||||
mountPoint = 1;
|
||||
offset = "0 0 0";
|
||||
deployed = SolarPanel;
|
||||
heatSignature = 0;
|
||||
|
||||
stateName[0] = "Idle";
|
||||
stateTransitionOnTriggerDown[0] = "Activate";
|
||||
|
||||
stateName[1] = "Activate";
|
||||
stateScript[1] = "onActivate";
|
||||
stateTransitionOnTriggerUp[1] = "Idle";
|
||||
|
||||
isLarge = true;
|
||||
maxDepSlope = 360;
|
||||
deploySound = ItemPickupSound;
|
||||
|
||||
minDeployDis = 1.5;
|
||||
maxDeployDis = 5;
|
||||
};
|
||||
|
||||
datablock ItemData(SolarPanelDeployable) {
|
||||
className = Pack;
|
||||
catagory = "Deployables";
|
||||
shapeFile = "stackable1s.dts";
|
||||
mass = 1;
|
||||
|
||||
hasLight = true;
|
||||
lightType = "PulsingLight";
|
||||
lightColor = "0.1 0.8 0.8 1.0";
|
||||
lightTime = "1000";
|
||||
lightRadius = "3";
|
||||
|
||||
elasticity = 0.2;
|
||||
friction = 0.6;
|
||||
pickupRadius = 3;
|
||||
rotate = true;
|
||||
image = "SolarPanelDeployableImage";
|
||||
pickUpName = "a solar panel pack";
|
||||
heatSignature = 0;
|
||||
emap = true;
|
||||
};
|
||||
|
||||
function SolarPanelDeployableImage::testNoTerrainFound(%item) {
|
||||
// don't check this for non-Landspike turret deployables
|
||||
}
|
||||
|
||||
function SolarPanelDeployable::onPickup(%this, %obj, %shape, %amount) {
|
||||
// created to prevent console errors
|
||||
}
|
||||
|
||||
function SolarPanelDeployableImage::onDeploy(%item, %plyr, %slot) {
|
||||
%className = "StaticShape";
|
||||
|
||||
%playerVector = vectorNormalize(getWord(%plyr.getEyeVector(),1) SPC -1 * getWord(%plyr.getEyeVector(),0) SPC "0");
|
||||
|
||||
if (vAbs(floorVec(%item.surfaceNrm,100)) $= "0 0 1")
|
||||
%item.surfaceNrm2 = %playerVector;
|
||||
else
|
||||
%item.surfaceNrm2 = vectorNormalize(vectorCross(%item.surfaceNrm,"0 0 -1"));
|
||||
|
||||
%rot = fullRot(%item.surfaceNrm,%item.surfaceNrm2);
|
||||
|
||||
%deplObj = new (%className)() {
|
||||
dataBlock = SolarPanel;
|
||||
deployed = true;
|
||||
};
|
||||
|
||||
// set orientation
|
||||
%deplObj.setTransform(%item.surfacePt SPC %rot);
|
||||
|
||||
// set team, owner, and handle
|
||||
%deplObj.team = %plyr.client.Team;
|
||||
%deplObj.setOwner(%plyr);
|
||||
|
||||
// set power frequency
|
||||
%deplObj.powerFreq = %plyr.powerFreq;
|
||||
setTargetName(%deplObj.target,addTaggedString("Frequency" SPC %deplObj.powerFreq));
|
||||
|
||||
// set power
|
||||
%deplObj.setSelfPowered();
|
||||
|
||||
// set the sensor group if it needs one
|
||||
if (%deplObj.getTarget() != -1)
|
||||
setTargetSensorGroup(%deplObj.getTarget(), %plyr.client.team);
|
||||
|
||||
// place the deployable in the MissionCleanup/Deployables group (AI reasons)
|
||||
addToDeployGroup(%deplObj);
|
||||
|
||||
//let the AI know as well...
|
||||
AIDeployObject(%plyr.client, %deplObj);
|
||||
|
||||
// play the deploy sound
|
||||
serverPlay3D(%item.deploySound, %deplObj.getTransform());
|
||||
|
||||
// increment the team count for this deployed object
|
||||
$TeamDeployedCount[%plyr.team, %item.item]++;
|
||||
|
||||
addDSurface(%item.surface,%deplObj);
|
||||
|
||||
%deplObj.playThread($PowerThread,"Power");
|
||||
|
||||
// take the deployable off the player's back and out of inventory
|
||||
//%plyr.unmountImage(%slot);
|
||||
//%plyr.decInventory(%item.item, 1);
|
||||
|
||||
// add to power list
|
||||
$PowerList = listAdd($PowerList,%deplObj,-1);
|
||||
|
||||
return %deplObj;
|
||||
}
|
||||
|
||||
function SolarPanel::onDestroyed(%this,%obj,%prevState) {
|
||||
if (%obj.isRemoved)
|
||||
return;
|
||||
if (%obj.deployed && ($Host::InvincibleDeployables != 1 || %obj.damageFailedDecon)) {
|
||||
%obj.isRemoved = true;
|
||||
%loc = findWord($PowerList,%obj);
|
||||
if (%loc !$= "")
|
||||
$PowerList = listDel($PowerList,%loc);
|
||||
$TeamDeployedCount[%obj.team,SolarPanelDeployable]--;
|
||||
remDSurface(%obj);
|
||||
%obj.schedule(500,"delete");
|
||||
}
|
||||
Parent::onDestroyed(%data,%obj,%prevState);
|
||||
}
|
||||
|
||||
function SolarPanelDeployableImage::onMount(%data,%obj,%node) {
|
||||
%obj.hasGen = true; // set for gencheck
|
||||
displayPowerFreq(%obj);
|
||||
}
|
||||
|
||||
function SolarPanelDeployableImage::onUnmount(%data,%obj,%node) {
|
||||
%obj.hasGen = "";
|
||||
}
|
||||
154
scripts/packs/spawnpointpack.cs
Normal file
154
scripts/packs/spawnpointpack.cs
Normal file
|
|
@ -0,0 +1,154 @@
|
|||
$TeamDeployableMax[SpawnPointPack] = 9999;
|
||||
datablock ShapeBaseImageData(SpawnPointDeployableImage) {
|
||||
mass = 15;
|
||||
emap = true;
|
||||
shapeFile = "stackable1s.dts";
|
||||
item = SpawnPointPack;
|
||||
mountPoint = 1;
|
||||
offset = "0 0 0";
|
||||
deployed = SpawnPointDeployedBase;
|
||||
heatSignature = 0;
|
||||
|
||||
stateName[0] = "Idle";
|
||||
stateTransitionOnTriggerDown[0] = "Activate";
|
||||
|
||||
stateName[1] = "Activate";
|
||||
stateScript[1] = "onActivate";
|
||||
stateTransitionOnTriggerUp[1] = "Idle";
|
||||
|
||||
isLarge = true;
|
||||
maxDepSlope = 360;
|
||||
deploySound = StationDeploySound;
|
||||
|
||||
minDeployDis = 0.5;
|
||||
maxDeployDis = 5.0;
|
||||
};
|
||||
|
||||
datablock ItemData(SpawnPointPack) {
|
||||
className = Pack;
|
||||
catagory = "Deployables";
|
||||
shapeFile = "stackable1s.dts";
|
||||
mass = 3.0;
|
||||
elasticity = 0.2;
|
||||
friction = 0.6;
|
||||
pickupRadius = 1;
|
||||
rotate = false;
|
||||
image = "SpawnPointDeployableImage";
|
||||
pickUpName = "a spawn point deployable";
|
||||
heatSignature = 0;
|
||||
joint = "2 2 2";
|
||||
computeCRC = true;
|
||||
emap = true;
|
||||
};
|
||||
|
||||
datablock StaticShapeData(SpawnPointDeployedBase) : StaticShapeDamageProfile {
|
||||
className = "StaticShape";
|
||||
shapeFile = "nexuscap.dts";
|
||||
|
||||
maxDamage = 2.00;
|
||||
destroyedLevel = 2.00;
|
||||
disabledLevel = 1.35;
|
||||
|
||||
isShielded = true;
|
||||
energyPerDamagePoint = 250;
|
||||
maxEnergy = 100;
|
||||
rechargeRate = 1;
|
||||
isspawnpoint=1;
|
||||
|
||||
explosion = ShapeExplosion; // DeployablesExplosion;
|
||||
expDmgRadius = 18.0;
|
||||
expDamage = 0.1;
|
||||
expImpulse = 200.0;
|
||||
|
||||
dynamicType = $TypeMasks::StationObjectType;
|
||||
deployedObject = true;
|
||||
cmdCategory = "DSupport";
|
||||
cmdIcon = CMDSwitchIcon;
|
||||
cmdMiniIconName = "commander/MiniIcons/com_switch_grey";
|
||||
targetNameTag = 'Deployed';
|
||||
targetTypeTag = 'Spawn Point';
|
||||
|
||||
debrisShapeName = "debris_generic.dts";
|
||||
debris = DeployableDebris;
|
||||
|
||||
heatSignature = 0;
|
||||
needsPower = false;
|
||||
|
||||
humSound = SensorHumSound;
|
||||
pausePowerThread = true;
|
||||
sensorData = TelePadBaseSensorObj;
|
||||
sensorRadius = TelePadBaseSensorObj.detectRadius;
|
||||
sensorColor = "0 212 45";
|
||||
firstPersonOnly = true;
|
||||
|
||||
lightType = "PulsingLight";
|
||||
lightColor = "0 1 0 1";
|
||||
lightTime = 1200;
|
||||
lightRadius = 6;
|
||||
};
|
||||
|
||||
function SpawnPointDeployedBase::onDestroyed(%this,%obj,%prevState) {
|
||||
if (%obj.isRemoved)
|
||||
return;
|
||||
%obj.isRemoved = true;
|
||||
Parent::onDestroyed(%this,%obj,%prevState);
|
||||
$TeamDeployedCount[%obj.team,SpawnPointPack]--;
|
||||
%obj.isRemoved = true;
|
||||
remDSurface(%obj);
|
||||
%obj.beam.schedule(150,"delete");
|
||||
%obj.schedule(500,"delete");
|
||||
}
|
||||
|
||||
function SpawnPointDeployedBase::disassemble(%data,%plyr,%obj) {
|
||||
%obj.isRemoved = true;
|
||||
disassemble(%data,%plyr,%obj);
|
||||
}
|
||||
|
||||
function SpawnPointPack::onPickup(%this,%obj,%shape,%amount) {
|
||||
}
|
||||
|
||||
function SpawnPointDeployableImage::onDeploy(%item,%plyr,%slot) {
|
||||
%className = "StaticShape";
|
||||
%item.surfacePt = vectorAdd(%item.surfacePt,vectorScale(%item.surfaceNrm,0.4));
|
||||
%playerVector = vectorNormalize(getWord(%plyr.getEyeVector(),1) SPC -1 * getWord(%plyr.getEyeVector(),0) SPC "0");
|
||||
%item.surfaceNrm2 = %playerVector;
|
||||
if (vAbs(floorVec(%item.surfaceNrm,100)) $= "0 0 1")
|
||||
%item.surfaceNrm2 = vectorScale(%playerVector,-1);
|
||||
else
|
||||
%item.surfaceNrm2 = vectorNormalize(vectorCross(%item.surfaceNrm,"0 0 1"));
|
||||
%rot = fullRot(vectorScale(%item.surfaceNrm,-1),%item.surfaceNrm2);
|
||||
%deplObj = new (%className)() {
|
||||
dataBlock = SpawnPointDeployedBase;
|
||||
scale = "1 1 1";
|
||||
deployed = true;
|
||||
};
|
||||
%deplObj.setTransform(%item.surfacePt SPC %rot);
|
||||
%deplObj.team = %plyr.client.team;
|
||||
%deplObj.setOwner(%plyr);
|
||||
%deplObj.powerFreq = %plyr.powerFreq;
|
||||
if (%deplObj.getTarget() != -1)
|
||||
setTargetSensorGroup(%deplObj.getTarget(),%plyr.client.team);
|
||||
%frequency = %plyr.packSet;
|
||||
addToDeployGroup(%deplObj);
|
||||
AIDeployObject(%plyr.client,%deplObj);
|
||||
serverPlay3D(%item.deploySound,%deplObj.getTransform());
|
||||
$TeamDeployedCount[%plyr.team,%item.item]++;
|
||||
addDSurface(%item.surface,%deplObj);
|
||||
if (%plyr.packSet == 0) %deplobj.ispersonal=1;
|
||||
//%plyr.unmountImage(%slot);
|
||||
//%plyr.decInventory(%item.item,1);
|
||||
checkPowerObject(%deplObj);
|
||||
messageclient(%plyr.client,'MsgClient',"\c3Spawn point placed. Type /setspawn while pointing at it to set your spawn point.");
|
||||
return %deplObj;
|
||||
}
|
||||
|
||||
function SpawnPointDeployableImage::onMount(%data,%obj,%node) {
|
||||
%obj.hasSpawn = true;
|
||||
%obj.packSet = 0;
|
||||
displayPowerFreq(%obj);
|
||||
}
|
||||
|
||||
function SpawnPointDeployableImage::onUnmount(%data,%obj,%node) {
|
||||
%obj.hasSpawn = "";
|
||||
%obj.packSet = 0;
|
||||
}
|
||||
316
scripts/packs/spine.cs
Normal file
316
scripts/packs/spine.cs
Normal file
|
|
@ -0,0 +1,316 @@
|
|||
//---------------------------------------------------------
|
||||
// Deployable Spine, Code by Mostlikely, Prettied by JackTL
|
||||
//---------------------------------------------------------
|
||||
|
||||
datablock StaticShapeData(DeployedSpine) : StaticShapeDamageProfile {
|
||||
className = "spine";
|
||||
shapeFile = "Pmiscf.dts";
|
||||
|
||||
maxDamage = 0.5;
|
||||
destroyedLevel = 0.5;
|
||||
disabledLevel = 0.3;
|
||||
|
||||
isShielded = true;
|
||||
energyPerDamagePoint = 240;
|
||||
maxEnergy = 50;
|
||||
rechargeRate = 0.25;
|
||||
|
||||
explosion = HandGrenadeExplosion;
|
||||
expDmgRadius = 3.0;
|
||||
expDamage = 0.1;
|
||||
expImpulse = 200.0;
|
||||
|
||||
dynamicType = $TypeMasks::StaticShapeObjectType;
|
||||
deployedObject = true;
|
||||
cmdCategory = "DSupport";
|
||||
cmdIcon = CMDSensorIcon;
|
||||
cmdMiniIconName = "commander/MiniIcons/com_deploymotionsensor";
|
||||
targetNameTag = 'Light Support Beam';
|
||||
deployAmbientThread = true;
|
||||
debrisShapeName = "debris_generic_small.dts";
|
||||
debris = DeployableDebris;
|
||||
heatSignature = 0;
|
||||
needsPower = true;
|
||||
};
|
||||
datablock StaticShapeData(DeployedSpine2) : StaticShapeDamageProfile {
|
||||
className = "spine";
|
||||
shapeFile = "Xmiscf.dts";
|
||||
|
||||
maxDamage = 0.5;
|
||||
destroyedLevel = 0.5;
|
||||
disabledLevel = 0.3;
|
||||
|
||||
isShielded = true;
|
||||
energyPerDamagePoint = 240;
|
||||
maxEnergy = 50;
|
||||
rechargeRate = 0.25;
|
||||
|
||||
explosion = HandGrenadeExplosion;
|
||||
expDmgRadius = 3.0;
|
||||
expDamage = 0.1;
|
||||
expImpulse = 200.0;
|
||||
|
||||
dynamicType = $TypeMasks::StaticShapeObjectType;
|
||||
deployedObject = true;
|
||||
cmdCategory = "DSupport";
|
||||
cmdIcon = CMDSensorIcon;
|
||||
cmdMiniIconName = "commander/MiniIcons/com_deploymotionsensor";
|
||||
targetNameTag = 'Light Support Beam';
|
||||
deployAmbientThread = true;
|
||||
debrisShapeName = "debris_generic_small.dts";
|
||||
debris = DeployableDebris;
|
||||
heatSignature = 0;
|
||||
needsPower = true;
|
||||
};
|
||||
//Vehicle Pad Spine Image For Editors Tool
|
||||
datablock StaticShapeData(DeployedSpine3) : StaticShapeDamageProfile {
|
||||
className = "Sspine";
|
||||
shapeFile = "Vehicle_pad.dts";
|
||||
|
||||
maxDamage = 0.5;
|
||||
destroyedLevel = 0.5;
|
||||
disabledLevel = 0.3;
|
||||
|
||||
isShielded = true;
|
||||
energyPerDamagePoint = 240;
|
||||
maxEnergy = 50;
|
||||
rechargeRate = 0.25;
|
||||
|
||||
explosion = HandGrenadeExplosion;
|
||||
expDmgRadius = 3.0;
|
||||
expDamage = 0.1;
|
||||
expImpulse = 200.0;
|
||||
|
||||
dynamicType = $TypeMasks::StaticShapeObjectType;
|
||||
deployedObject = true;
|
||||
cmdCategory = "DSupport";
|
||||
cmdIcon = CMDSensorIcon;
|
||||
cmdMiniIconName = "commander/MiniIcons/com_deploymotionsensor";
|
||||
targetNameTag = 'Light Support Beam';
|
||||
deployAmbientThread = true;
|
||||
debrisShapeName = "debris_generic_small.dts";
|
||||
debris = DeployableDebris;
|
||||
heatSignature = 0;
|
||||
needsPower = true;
|
||||
};
|
||||
datablock StaticShapeData(DeployedWoodSpine) : StaticShapeDamageProfile {
|
||||
className = "spine";
|
||||
shapeFile = "stackable5m.dts";
|
||||
|
||||
maxDamage = 0.5;
|
||||
destroyedLevel = 0.5;
|
||||
disabledLevel = 0.3;
|
||||
|
||||
isShielded = true;
|
||||
energyPerDamagePoint = 240;
|
||||
maxEnergy = 50;
|
||||
rechargeRate = 0.25;
|
||||
|
||||
explosion = HandGrenadeExplosion;
|
||||
expDmgRadius = 3.0;
|
||||
expDamage = 0.1;
|
||||
expImpulse = 200.0;
|
||||
|
||||
dynamicType = $TypeMasks::StaticShapeObjectType;
|
||||
deployedObject = true;
|
||||
cmdCategory = "DSupport";
|
||||
cmdIcon = CMDSensorIcon;
|
||||
cmdMiniIconName = "commander/MiniIcons/com_deploymotionsensor";
|
||||
targetNameTag = 'Light Support Beam';
|
||||
deployAmbientThread = true;
|
||||
debrisShapeName = "debris_generic_small.dts";
|
||||
debris = DeployableDebris;
|
||||
heatSignature = 0;
|
||||
needsPower = true;
|
||||
};
|
||||
|
||||
datablock ShapeBaseImageData(spineDeployableImage) {
|
||||
mass = 1;
|
||||
emap = true;
|
||||
shapeFile = "ammo_plasma.dts";
|
||||
item = spineDeployable;
|
||||
mountPoint = 1;
|
||||
offset = "0 -0.2 -0.55";
|
||||
deployed = DeployedSpine;
|
||||
heatSignature = 0;
|
||||
|
||||
stateName[0] = "Idle";
|
||||
stateTransitionOnTriggerDown[0] = "Activate";
|
||||
|
||||
stateName[1] = "Activate";
|
||||
stateScript[1] = "onActivate";
|
||||
stateTransitionOnTriggerUp[1] = "Idle";
|
||||
|
||||
isLarge = false;
|
||||
maxDepSlope = 360;
|
||||
deploySound = ItemPickupSound;
|
||||
|
||||
minDeployDis = 0.1;
|
||||
maxDeployDis = 50.0;
|
||||
};
|
||||
|
||||
datablock ItemData(spineDeployable) {
|
||||
className = Pack;
|
||||
catagory = "Deployables";
|
||||
shapeFile = "stackable1s.dts";
|
||||
mass = 1;
|
||||
elasticity = 0.2;
|
||||
friction = 0.6;
|
||||
pickupRadius = 1;
|
||||
rotate = true;
|
||||
image = "spineDeployableImage";
|
||||
pickUpName = "a light support beam pack";
|
||||
heatSignature = 0;
|
||||
emap = true;
|
||||
};
|
||||
|
||||
function spineDeployableImage::testObjectTooClose(%item) {
|
||||
return "";
|
||||
}
|
||||
|
||||
function spineDeployableImage::testNoTerrainFound(%item) {
|
||||
// don't check this for non-Landspike turret deployables
|
||||
}
|
||||
|
||||
function spineDeployable::onPickup(%this, %obj, %shape, %amount) {
|
||||
// created to prevent console errors
|
||||
}
|
||||
|
||||
function spineDeployableImage::onDeploy(%item, %plyr, %slot) {
|
||||
//Object
|
||||
%className = "StaticShape";
|
||||
|
||||
%grounded = 0;
|
||||
if (%item.surface.getClassName() $= TerrainBlock)
|
||||
%grounded = 1;
|
||||
|
||||
%playerVector = vectorNormalize(-1 * getWord(%plyr.getEyeVector(),1) SPC getWord(%plyr.getEyeVector(),0) SPC "0");
|
||||
|
||||
if (%item.surfaceinher == 0) {
|
||||
if (vAbs(floorVec(%item.surfaceNrm,100)) $= "0 0 1")
|
||||
%item.surfaceNrm2 = %playerVector;
|
||||
else
|
||||
%item.surfaceNrm2 = vectorNormalize(vectorCross(%item.surfaceNrm,"0 0 1"));
|
||||
}
|
||||
|
||||
%item.surfaceNrm3 = vectorCross(%item.surfaceNrm,%item.surfaceNrm2);
|
||||
|
||||
%rot = fullRot(%item.surfaceNrm,%item.surfaceNrm2);
|
||||
%scale = getWords($packSetting["spine",%plyr.packSet],0,2);
|
||||
%dataBlock = %item.deployed;
|
||||
|
||||
if (%plyr.packSet == 9) {
|
||||
%space = rayDist(%item.surfacePt SPC %item.surfaceNrm,%scale,$AllObjMask);
|
||||
if (%space != getWord(%scale,1))
|
||||
%type = true;
|
||||
%scale = getWord(%scale,0) SPC getWord(%scale,0) SPC %space;
|
||||
}
|
||||
else if (%plyr.packSet == 10 || %plyr.packSet == 11) {
|
||||
%mCenter = "0 0 -0.5";
|
||||
%pad = pad(%item.surfacePt SPC %item.surfaceNrm SPC %item.surfaceNrm2,%scale,%mCenter);
|
||||
%scale = getWords(%pad,0,2);
|
||||
%item.surfacePt = getWords(%pad,3,5);
|
||||
%rot = getWords(%pad,6,9);
|
||||
if (%plyr.packSet == 11) {
|
||||
%scale = vectorMultiply(%scale,1.845 SPC 2 SPC 1.744); // Update dfunctions.cs if changed!
|
||||
%scaleIsSet = 1;
|
||||
%item.surfacePt = vectorAdd(%item.surfacePt,vectorScale(%item.surfaceNrm3,0.5));
|
||||
%rot = rotAdd(%rot,"1 0 0" SPC $Pi);
|
||||
%dataBlock = "DeployedWoodSpine";
|
||||
}
|
||||
}
|
||||
|
||||
if (!%scaleIsSet)
|
||||
%scale = vectorMultiply(%scale,1/4 SPC 1/3 SPC 2);
|
||||
|
||||
%deplObj = new (%className)() {
|
||||
dataBlock = %dataBlock;
|
||||
scale = %scale;
|
||||
};
|
||||
|
||||
//////////////////////////Apply settings//////////////////////////////
|
||||
|
||||
// [[Location]]:
|
||||
|
||||
// exact:
|
||||
%deplObj.setTransform(%item.surfacePt SPC %rot);
|
||||
|
||||
// misc info
|
||||
addDSurface(%item.surface,%deplObj);
|
||||
|
||||
// [[Settings]]:
|
||||
|
||||
%deplObj.grounded = %grounded;
|
||||
%deplObj.needsFit = 1;
|
||||
|
||||
// [[Normal Stuff]]:
|
||||
|
||||
// if(%deplObj.getDatablock().rechargeRate)
|
||||
// %deplObj.setRechargeRate(%deplObj.getDatablock().rechargeRate);
|
||||
|
||||
// set team, owner, and handle
|
||||
%deplObj.team = %plyr.client.team;
|
||||
%deplObj.setOwner(%plyr);
|
||||
|
||||
// set power frequency
|
||||
%deplObj.powerFreq = %plyr.powerFreq;
|
||||
|
||||
// set the sensor group if it needs one
|
||||
if (%deplObj.getTarget() != -1)
|
||||
setTargetSensorGroup(%deplObj.getTarget(), %plyr.client.team);
|
||||
|
||||
// place the deployable in the MissionCleanup/Deployables group (AI reasons)
|
||||
addToDeployGroup(%deplObj);
|
||||
|
||||
//let the AI know as well...
|
||||
AIDeployObject(%plyr.client, %deplObj);
|
||||
|
||||
// play the deploy sound
|
||||
serverPlay3D(%item.deploySound, %deplObj.getTransform());
|
||||
|
||||
// increment the team count for this deployed object
|
||||
$TeamDeployedCount[%plyr.team, %item.item]++;
|
||||
|
||||
%deplObj.deploy();
|
||||
|
||||
// Power object
|
||||
checkPowerObject(%deplObj);
|
||||
|
||||
if (%pad)
|
||||
deployEffect(%deplObj,%item.surfacePt,%item.surfaceNrm,"pad");
|
||||
else if (%type)
|
||||
deployEffect(%deplObj,%item.surfacePt,%item.surfaceNrm,"spine1");
|
||||
else
|
||||
deployEffect(%deplObj,%item.surfacePt,%item.surfaceNrm,"spine");
|
||||
|
||||
return %deplObj;
|
||||
}
|
||||
|
||||
/////////////////////////////////////
|
||||
|
||||
function DeployedSpine::onDestroyed(%this, %obj, %prevState) {
|
||||
if (%obj.isRemoved)
|
||||
return;
|
||||
%obj.isRemoved = true;
|
||||
Parent::onDestroyed(%this, %obj, %prevState);
|
||||
$TeamDeployedCount[%obj.team, spineDeployable]--;
|
||||
remDSurface(%obj);
|
||||
%obj.schedule(500, "delete");
|
||||
cascade(%obj);
|
||||
fireBallExplode(%obj,1);
|
||||
}
|
||||
|
||||
function DeployedWoodSpine::onDestroyed(%this, %obj, %prevState) {
|
||||
DeployedSpine::onDestroyed(%this, %obj, %prevState);
|
||||
}
|
||||
|
||||
function spineDeployableImage::onMount(%data, %obj, %node) {
|
||||
%obj.hasSpine = true; // set for spinecheck
|
||||
%obj.packSet = 0;
|
||||
displayPowerFreq(%obj);
|
||||
}
|
||||
|
||||
function spineDeployableImage::onUnmount(%data, %obj, %node) {
|
||||
%obj.hasSpine = "";
|
||||
%obj.packSet = 0;
|
||||
}
|
||||
339
scripts/packs/switch.cs
Normal file
339
scripts/packs/switch.cs
Normal file
|
|
@ -0,0 +1,339 @@
|
|||
//--------------------------------------------------------------------------
|
||||
// Deployable Switch
|
||||
//--------------------------------------------------------------------------
|
||||
|
||||
datablock StaticShapeData(DeployedSwitch) : StaticShapeDamageProfile {
|
||||
className = "switch";
|
||||
shapeFile = "switch.dts";
|
||||
|
||||
maxDamage = 1.00;
|
||||
destroyedLevel = 1.00;
|
||||
disabledLevel = 0.75;
|
||||
|
||||
isShielded = true;
|
||||
energyPerDamagePoint = 30;
|
||||
maxEnergy = 100;
|
||||
rechargeRate = 0.05;
|
||||
|
||||
explosion = HandGrenadeExplosion;
|
||||
expDmgRadius = 1.0;
|
||||
expDamage = 0.3;
|
||||
expImpulse = 500;
|
||||
|
||||
dynamicType = $TypeMasks::StaticShapeObjectType;
|
||||
deployedObject = true;
|
||||
cmdCategory = "DSupport";
|
||||
cmdIcon = CMDSensorIcon;
|
||||
cmdMiniIconName = "commander/MiniIcons/com_switch_grey";
|
||||
targetNameTag = 'Deployed';
|
||||
targetTypeTag = 'Switch';
|
||||
// deployAmbientThread = true;
|
||||
debrisShapeName = "debris_generic_small.dts";
|
||||
debris = DeployableDebris;
|
||||
heatSignature = 0;
|
||||
emap = true;
|
||||
};
|
||||
|
||||
datablock ShapeBaseImageData(SwitchDeployableImage) {
|
||||
mass = 1;
|
||||
emap = true;
|
||||
shapeFile = "stackable1s.dts";
|
||||
item = SwitchDeployable;
|
||||
mountPoint = 1;
|
||||
offset = "0 0 0";
|
||||
deployed = DeployedSwitch;
|
||||
heatSignature = 0;
|
||||
|
||||
stateName[0] = "Idle";
|
||||
stateTransitionOnTriggerDown[0] = "Activate";
|
||||
|
||||
stateName[1] = "Activate";
|
||||
stateScript[1] = "onActivate";
|
||||
stateTransitionOnTriggerUp[1] = "Idle";
|
||||
|
||||
isLarge = true;
|
||||
maxDepSlope = 360;
|
||||
deploySound = ItemPickupSound;
|
||||
|
||||
flatMinDeployDis = 0.25;
|
||||
flatMaxDeployDis = 5.0;
|
||||
|
||||
minDeployDis = 2;
|
||||
maxDeployDis = 5;
|
||||
};
|
||||
|
||||
datablock ItemData(SwitchDeployable) {
|
||||
className = Pack;
|
||||
catagory = "Deployables";
|
||||
shapeFile = "stackable1s.dts";
|
||||
mass = 1;
|
||||
|
||||
hasLight = true;
|
||||
lightType = "PulsingLight";
|
||||
lightColor = "0.1 0.8 0.8 1.0";
|
||||
lightTime = "1000";
|
||||
lightRadius = "3";
|
||||
|
||||
elasticity = 0.2;
|
||||
friction = 0.6;
|
||||
pickupRadius = 3;
|
||||
rotate = true;
|
||||
image = "SwitchDeployableImage";
|
||||
pickUpName = "a switch pack";
|
||||
heatSignature = 0;
|
||||
emap = true;
|
||||
};
|
||||
|
||||
datablock AudioProfile(SwitchToggledSound) {
|
||||
filename = "fx/misc/flipflop_taken.wav";
|
||||
description = AudioClosest3d;
|
||||
preload = true;
|
||||
};
|
||||
|
||||
function SwitchDeployableImage::testNoTerrainFound(%item) {
|
||||
// don't check this for non-Landspike turret deployables
|
||||
}
|
||||
|
||||
function SwitchDeployable::onPickup(%this, %obj, %shape, %amount) {
|
||||
// created to prevent console errors
|
||||
}
|
||||
|
||||
function SwitchDeployableImage::onDeploy(%item, %plyr, %slot) {
|
||||
%className = "StaticShape";
|
||||
|
||||
%playerVector = vectorNormalize(getWord(%plyr.getEyeVector(),1) SPC -1 * getWord(%plyr.getEyeVector(),0) SPC "0");
|
||||
%item.surfaceNrm2 = %playerVector;
|
||||
|
||||
if (vAbs(floorVec(%item.surfaceNrm,100)) $= "0 0 1")
|
||||
%item.surfaceNrm2 = %playerVector;
|
||||
else
|
||||
%item.surfaceNrm2 = vectorNormalize(vectorCross(%item.surfaceNrm,"0 0 -1"));
|
||||
|
||||
%rot = fullRot(%item.surfaceNrm,%item.surfaceNrm2);
|
||||
|
||||
%deplObj = new (%className)() {
|
||||
scale = "0.5 0.5 0.5";
|
||||
dataBlock = DeployedSwitch;
|
||||
deployed = true;
|
||||
};
|
||||
|
||||
%deplObj.switchRadius = $packSetting["switch",%plyr.packSet];
|
||||
|
||||
// TODO - handle normal state on deploy
|
||||
if ($Host::ExpertMode == 1) {
|
||||
if (%plyr.expertSet == 1)
|
||||
%deplObj.timed = 1;
|
||||
else if (%plyr.expertSet == 2)
|
||||
%deplObj.timed = 2;
|
||||
}
|
||||
|
||||
// set orientation
|
||||
%deplObj.setTransform(%item.surfacePt SPC %rot);
|
||||
|
||||
// set team, owner, and handle
|
||||
%deplObj.team = %plyr.client.Team;
|
||||
%deplObj.setOwner(%plyr);
|
||||
|
||||
// set power frequency
|
||||
%deplObj.powerFreq = %plyr.powerFreq;
|
||||
|
||||
// set skin
|
||||
setTargetSkin(%deplObj.target,Game.getTeamSkin(%plyr.client.team));
|
||||
|
||||
// set power
|
||||
%deplObj.setSelfPowered();
|
||||
setTargetName(%deplObj.target,addTaggedString("\c9[ON] \c6Frequency" SPC %deplObj.powerFreq));
|
||||
|
||||
// set the sensor group if it needs one
|
||||
if (%deplObj.getTarget() != -1)
|
||||
setTargetSensorGroup(%deplObj.getTarget(), %plyr.client.team);
|
||||
|
||||
// place the deployable in the MissionCleanup/Deployables group (AI reasons)
|
||||
addToDeployGroup(%deplObj);
|
||||
|
||||
//let the AI know as well...
|
||||
AIDeployObject(%plyr.client, %deplObj);
|
||||
|
||||
// play the deploy sound
|
||||
serverPlay3D(%item.deploySound, %deplObj.getTransform());
|
||||
|
||||
// increment the team count for this deployed object
|
||||
$TeamDeployedCount[%plyr.team, %item.item]++;
|
||||
|
||||
addDSurface(%item.surface,%deplObj);
|
||||
|
||||
%deplObj.playThread($PowerThread,"Power");
|
||||
%deplObj.playThread($AmbientThread,"ambient");
|
||||
|
||||
if (%deplObj.timed == 2) {
|
||||
%deplObj.stopThread($AmbientThread);
|
||||
setTargetName(%deplObj.target,addTaggedString("\c9[OFF]\c6 Frequency" SPC %deplObj.powerFreq));
|
||||
%deplObj.isSwitchedOff = true;
|
||||
}
|
||||
|
||||
%deplObj.SwitchTimer = 5000;
|
||||
|
||||
// take the deployable off the player's back and out of inventory
|
||||
//%plyr.unmountImage(%slot);
|
||||
//%plyr.decInventory(%item.item, 1);
|
||||
|
||||
return %deplObj;
|
||||
}
|
||||
|
||||
function DeployedSwitch::onCollision(%data,%obj,%col) {
|
||||
if (%col.getClassName() $= "Player") {
|
||||
toggleSwitch(%obj,-1,%col);
|
||||
}
|
||||
else if(%col.getClassName() $= "Item") {
|
||||
toggleSwitchItem(%obj,-1,%col);
|
||||
}
|
||||
}
|
||||
|
||||
function toggleSwitchItem(%obj,%state,%col,%delayed) {
|
||||
if (%obj.isRemoved)
|
||||
return;
|
||||
// TODO - prevent switching while waiting for timed delay / cancel timed delay if switch is hit?
|
||||
%switchDelay = 1000;
|
||||
%switchTimedDelay = %obj.SwitchTimer;
|
||||
if (%state $= "")
|
||||
%state = -1;
|
||||
if (%col == 0 || %col $= "")
|
||||
%force = true;
|
||||
if (!%force) {
|
||||
if (%col.getClassName() !$= "Item")
|
||||
return;
|
||||
if (!isObject(%col))
|
||||
return;
|
||||
if (!(%obj.switchTime < getSimTime())) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
if ((%obj.isSwitchedOff || (%force == true && %state == true)) && !(%force == true && %state == false)) {
|
||||
%state = true;
|
||||
%obj.isSwitchedOff = "";
|
||||
}
|
||||
else {
|
||||
%state = false;
|
||||
%obj.isSwitchedOff = true;
|
||||
}
|
||||
%switchCount = 0;
|
||||
%count = getWordCount($PowerList);
|
||||
// TODO - report number of successes and failures
|
||||
for(%i=0;%i<%count;%i++) {
|
||||
%powerObj = getWord($PowerList,%i);
|
||||
if (vectorDist(%obj.getPosition(),%powerObj.getPosition()) < %obj.switchRadius
|
||||
&& !%powerObj.isRemoved && %obj.powerFreq == %powerObj.powerFreq
|
||||
&& %obj.team == %powerObj.team) {
|
||||
toggleGenerator(%powerObj,%state);
|
||||
%switchCount++;
|
||||
}
|
||||
}
|
||||
if (%state == true) {
|
||||
%obj.play3D(SwitchToggledSound);
|
||||
%obj.playThread($AmbientThread,"ambient");
|
||||
setTargetName(%obj.target,addTaggedString("\c9[ON] \c6"@CollapseEscape(%obj.nametoset)@" Frequency" SPC %obj.powerFreq));
|
||||
}
|
||||
else {
|
||||
%obj.play3D(SwitchToggledSound);
|
||||
%obj.stopThread($AmbientThread);
|
||||
setTargetName(%obj.target,addTaggedString("\c9[OFF] \c6"@CollapseEscape(%obj.nametoset)@" Frequency" SPC %obj.powerFreq));
|
||||
}
|
||||
%obj.switchTime = getSimTime() + %switchDelay;
|
||||
cancel(%obj.timedSched);
|
||||
if (%obj.timed > 0 && !%delayed) {
|
||||
if (%obj.timed == 1)
|
||||
%obj.timedSched = schedule(%switchTimedDelay,0,toggleSwitch,%obj,1,0,true);
|
||||
else if (%obj.timed == 2)
|
||||
%obj.timedSched = schedule(%switchTimedDelay,0,toggleSwitch,%obj,0,0,true);
|
||||
%obj.switchTime = getSimTime() + %switchDelay + %switchTimedDelay;
|
||||
}
|
||||
%col.delete();
|
||||
}
|
||||
|
||||
function toggleSwitch(%obj,%state,%col,%delayed) {
|
||||
if (%obj.isRemoved)
|
||||
return;
|
||||
// TODO - prevent switching while waiting for timed delay / cancel timed delay if switch is hit?
|
||||
%switchDelay = 1000;
|
||||
%switchTimedDelay = %obj.SwitchTimer;
|
||||
if (%state $= "")
|
||||
%state = -1;
|
||||
if (%col == 0 || %col $= "")
|
||||
%force = true;
|
||||
if (!%force) {
|
||||
if (%col.getClassName() !$= "Player")
|
||||
return;
|
||||
if (%col.getState() $= "Dead" || %col.FFZapped == true)
|
||||
return;
|
||||
if (!(%obj.switchTime < getSimTime())) {
|
||||
messageClient(%col.client, 'msgClient', '\c2Must wait %1 seconds between switching states.',mCeil((%obj.switchTime - getSimTime())/1000));
|
||||
return;
|
||||
}
|
||||
}
|
||||
if ((%obj.isSwitchedOff || (%force == true && %state == true)) && !(%force == true && %state == false)) {
|
||||
%state = true;
|
||||
%obj.isSwitchedOff = "";
|
||||
}
|
||||
else {
|
||||
%state = false;
|
||||
%obj.isSwitchedOff = true;
|
||||
}
|
||||
%switchCount = 0;
|
||||
%count = getWordCount($PowerList);
|
||||
// TODO - report number of successes and failures
|
||||
for(%i=0;%i<%count;%i++) {
|
||||
%powerObj = getWord($PowerList,%i);
|
||||
if (vectorDist(%obj.getPosition(),%powerObj.getPosition()) < %obj.switchRadius
|
||||
&& !%powerObj.isRemoved && %obj.powerFreq == %powerObj.powerFreq
|
||||
&& %obj.team == %powerObj.team) {
|
||||
toggleGenerator(%powerObj,%state);
|
||||
%switchCount++;
|
||||
}
|
||||
}
|
||||
if (%state == true) {
|
||||
%obj.play3D(SwitchToggledSound);
|
||||
%obj.playThread($AmbientThread,"ambient");
|
||||
setTargetName(%obj.target,addTaggedString("\c9[ON] \c6"@CollapseEscape(%obj.nametoset)@" Frequency" SPC %obj.powerFreq));
|
||||
if (!%force)
|
||||
messageClient(%col.client, 'msgClient', '\c2%1 objects attempted switched on.',%switchCount);
|
||||
}
|
||||
else {
|
||||
%obj.play3D(SwitchToggledSound);
|
||||
%obj.stopThread($AmbientThread);
|
||||
setTargetName(%obj.target,addTaggedString("\c9[OFF] \c6"@CollapseEscape(%obj.nametoset)@" Frequency" SPC %obj.powerFreq));
|
||||
if (!%force)
|
||||
messageClient(%col.client, 'msgClient', '\c2%1 objects attempted switched off.',%switchCount);
|
||||
}
|
||||
%obj.switchTime = getSimTime() + %switchDelay;
|
||||
cancel(%obj.timedSched);
|
||||
if (%obj.timed > 0 && !%delayed) {
|
||||
if (%obj.timed == 1)
|
||||
%obj.timedSched = schedule(%switchTimedDelay,0,toggleSwitch,%obj,1,0,true);
|
||||
else if (%obj.timed == 2)
|
||||
%obj.timedSched = schedule(%switchTimedDelay,0,toggleSwitch,%obj,0,0,true);
|
||||
%obj.switchTime = getSimTime() + %switchDelay + %switchTimedDelay;
|
||||
}
|
||||
}
|
||||
|
||||
function DeployedSwitch::onDestroyed(%this,%obj,%prevState) {
|
||||
if (%obj.isRemoved)
|
||||
return;
|
||||
%obj.isRemoved = true;
|
||||
Parent::onDestroyed(%this, %obj, %prevState);
|
||||
$TeamDeployedCount[%obj.team, SwitchDeployable]--;
|
||||
remDSurface(%obj);
|
||||
%obj.schedule(500, "delete");
|
||||
}
|
||||
|
||||
function SwitchDeployableImage::onMount(%data,%obj,%node) {
|
||||
%obj.hasSwitch = true; // set for switchcheck
|
||||
%obj.packSet = 2;
|
||||
%obj.expertSet = 0;
|
||||
displayPowerFreq(%obj);
|
||||
}
|
||||
|
||||
function SwitchDeployableImage::onUnmount(%data,%obj,%node) {
|
||||
%obj.hasSwitch = "";
|
||||
%obj.packSet = 0;
|
||||
%obj.expertSet = 0;
|
||||
}
|
||||
564
scripts/packs/telepadpack.cs
Normal file
564
scripts/packs/telepadpack.cs
Normal file
|
|
@ -0,0 +1,564 @@
|
|||
//---------------------------------------------------------
|
||||
// Deployable Telepad
|
||||
//---------------------------------------------------------
|
||||
|
||||
datablock ShapeBaseImageData(TelePadDeployableImage) {
|
||||
mass = 1;
|
||||
emap = true;
|
||||
shapeFile = "stackable1s.dts";
|
||||
item = TelePadPack;
|
||||
mountPoint = 1;
|
||||
offset = "0 0 0";
|
||||
deployed = TelePadDeployedBase;
|
||||
heatSignature = 0;
|
||||
|
||||
stateName[0] = "Idle";
|
||||
stateTransitionOnTriggerDown[0] = "Activate";
|
||||
|
||||
stateName[1] = "Activate";
|
||||
stateScript[1] = "onActivate";
|
||||
stateTransitionOnTriggerUp[1] = "Idle";
|
||||
|
||||
isLarge = true;
|
||||
maxDepSlope = 360;
|
||||
deploySound = StationDeploySound;
|
||||
|
||||
minDeployDis = 0.5;
|
||||
maxDeployDis = 5.0;
|
||||
};
|
||||
|
||||
datablock ItemData(TelePadPack) {
|
||||
className = Pack;
|
||||
catagory = "Deployables";
|
||||
shapeFile = "stackable1s.dts";
|
||||
mass = 1;
|
||||
elasticity = 0.2;
|
||||
friction = 0.6;
|
||||
pickupRadius = 1;
|
||||
rotate = false;
|
||||
image = "TelePadDeployableImage";
|
||||
pickUpName = "a teleport pad pack";
|
||||
heatSignature = 0;
|
||||
joint = "2 2 2";
|
||||
computeCRC = true;
|
||||
emap = true;
|
||||
};
|
||||
|
||||
datablock SensorData(TelePadBaseSensorObj) {
|
||||
detects = true;
|
||||
detectsUsingLOS = true;
|
||||
detectsPassiveJammed = false;
|
||||
detectsActiveJammed = false;
|
||||
detectsCloaked = false;
|
||||
detectionPings = true;
|
||||
detectRadius = 10;
|
||||
};
|
||||
|
||||
datablock StaticShapeData(TelePadDeployedBase) : StaticShapeDamageProfile {
|
||||
className = "teleport";
|
||||
shapeFile = "nexuscap.dts";
|
||||
|
||||
maxDamage = 2.00;
|
||||
destroyedLevel = 2.00;
|
||||
disabledLevel = 1.35;
|
||||
|
||||
isShielded = true;
|
||||
energyPerDamagePoint = 250;
|
||||
maxEnergy = 100;
|
||||
rechargeRate = 1;
|
||||
|
||||
explosion = ShapeExplosion; // DeployablesExplosion;
|
||||
expDmgRadius = 18.0;
|
||||
expDamage = 0.1;
|
||||
expImpulse = 200.0;
|
||||
|
||||
dynamicType = $TypeMasks::StationObjectType;
|
||||
deployedObject = true;
|
||||
cmdCategory = "DSupport";
|
||||
cmdIcon = CMDSwitchIcon;
|
||||
cmdMiniIconName = "commander/MiniIcons/com_switch_grey";
|
||||
targetNameTag = 'Deployed';
|
||||
targetTypeTag = 'Teleport Pad';
|
||||
|
||||
debrisShapeName = "debris_generic.dts";
|
||||
debris = DeployableDebris;
|
||||
|
||||
heatSignature = 0;
|
||||
needsPower = true;
|
||||
|
||||
humSound = SensorHumSound;
|
||||
pausePowerThread = true;
|
||||
sensorData = TelePadBaseSensorObj;
|
||||
sensorRadius = TelePadBaseSensorObj.detectRadius;
|
||||
sensorColor = "0 212 45";
|
||||
firstPersonOnly = true;
|
||||
|
||||
lightType = "PulsingLight";
|
||||
lightColor = "0 1 0 1";
|
||||
lightTime = 1200;
|
||||
lightRadius = 6;
|
||||
};
|
||||
|
||||
datablock StaticShapeData(TelePadBeam) {
|
||||
className = "Station";
|
||||
catagory = "DSupport";
|
||||
shapefile = "nexus_effect.dts";
|
||||
collideable = 1;
|
||||
needsNoPower = true;
|
||||
emap="true";
|
||||
sensorData = TelePadBaseSensorObj;
|
||||
sensorRadius = TelePadBaseSensorObj.detectRadius;
|
||||
sensorColor = "0 212 45";
|
||||
|
||||
cmdCategory = "DSupport";
|
||||
targetNameTag = 'Teleport';
|
||||
targetTypeTag = 'Pad';
|
||||
|
||||
lightType = "PulsingLight";
|
||||
lightColor = "0 1 0 1";
|
||||
lightTime = 1200;
|
||||
lightRadius = 6;
|
||||
};
|
||||
|
||||
datablock AudioProfile(TelePadAccessDeniedSound) {
|
||||
filename = "gui/vote_nopass.wav";
|
||||
description = AudioClosest3d;
|
||||
preload = true;
|
||||
};
|
||||
|
||||
datablock AudioProfile(TelePadBeamSound) {
|
||||
filename = "fx/vehicles/inventory_pad_on.wav";
|
||||
description = AudioClosest3d;
|
||||
preload = true;
|
||||
};
|
||||
|
||||
datablock AudioProfile(TelePadPowerUpSound) {
|
||||
filename = "fx/powered/turret_heavy_activate.wav";
|
||||
description = AudioClosest3d;
|
||||
preload = true;
|
||||
};
|
||||
|
||||
datablock AudioProfile(TelePadPowerDownSound) {
|
||||
filename = "fx/powered/inv_pad_off.wav";
|
||||
description = AudioClosest3d;
|
||||
preload = true;
|
||||
};
|
||||
|
||||
datablock ParticleData(TelePadTeleportParticle)
|
||||
{
|
||||
dragCoeffiecient = 0.0;
|
||||
gravityCoefficient = 0.0;
|
||||
inheritedVelFactor = 0.0;
|
||||
|
||||
lifetimeMS = 1200;
|
||||
lifetimeVarianceMS = 400;
|
||||
|
||||
textureName = "special/lightFalloffMono";
|
||||
|
||||
useInvAlpha = false;
|
||||
spinRandomMin = -200.0;
|
||||
spinRandomMax = 200.0;
|
||||
|
||||
colors[0] = "0.5 0.8 0.2 1.0";
|
||||
colors[1] = "0.6 0.9 0.3 1.0";
|
||||
colors[2] = "0.7 1.0 0.4 1.0";
|
||||
sizes[0] = 0.2;
|
||||
sizes[1] = 0.1;
|
||||
sizes[2] = 0.05;
|
||||
times[0] = 0.0;
|
||||
times[1] = 0.5;
|
||||
times[2] = 1.0;
|
||||
};
|
||||
|
||||
datablock ParticleEmitterData(TelePadTeleportEmitter)
|
||||
{
|
||||
ejectionPeriodMS = 1;
|
||||
ejectionOffset = 7.0;
|
||||
periodVarianceMS = 0.0;
|
||||
ejectionVelocity = 2.0;
|
||||
velocityVariance = 2.0;
|
||||
thetaMin = 0.0;
|
||||
thetaMax = 10.0;
|
||||
lifetimeMS = 0;
|
||||
|
||||
particles = "TelePadTeleportParticle";
|
||||
};
|
||||
|
||||
function TelePadDeployedBase::onDestroyed(%this,%obj,%prevState) {
|
||||
if (%obj.isRemoved)
|
||||
return;
|
||||
%obj.isRemoved = true;
|
||||
Parent::onDestroyed(%this,%obj,%prevState);
|
||||
$TeamDeployedCount[%obj.team,TelePadPack]--;
|
||||
%obj.isRemoved = true;
|
||||
remDSurface(%obj);
|
||||
%obj.beam.schedule(150,"delete");
|
||||
%obj.schedule(500,"delete");
|
||||
}
|
||||
|
||||
function TelePadDeployedBase::disassemble(%data,%plyr,%obj) {
|
||||
if (isObject(%obj.beam))
|
||||
%obj.beam.delete();
|
||||
%obj.isRemoved = true;
|
||||
disassemble(%data,%plyr,%obj);
|
||||
}
|
||||
|
||||
function TelePadDeployedBase::onGainPowerEnabled(%data,%obj) {
|
||||
if (shouldChangePowerState(%obj,true)) {
|
||||
tp_fadeIn(%obj,true);
|
||||
%obj.playThread($AmbientThread,"ambient");
|
||||
%obj.setThreadDir($AmbientThread,true);
|
||||
|
||||
%obj.playThread($ActivateThread,"transition");
|
||||
%obj.setThreadDir($ActivateThread,false);
|
||||
|
||||
%obj.play3D(TelePadPowerUpSound);
|
||||
}
|
||||
Parent::onGainPowerEnabled(%data,%obj);
|
||||
}
|
||||
|
||||
function TelePadDeployedBase::onLosePowerDisabled(%data,%obj) {
|
||||
if (shouldChangePowerState(%obj,false)) {
|
||||
tp_fadeOut(%obj,true);
|
||||
%obj.stopThread($AmbientThread);
|
||||
|
||||
%obj.playThread($ActivateThread,"transition");
|
||||
%obj.setThreadDir($ActivateThread,true);
|
||||
|
||||
%obj.play3D(TelePadPowerDownSound);
|
||||
}
|
||||
Parent::onLosePowerDisabled(%data,%obj);
|
||||
}
|
||||
|
||||
function TelePadDeployedBase::onCollision(%data,%obj,%col) {
|
||||
if (%col.justTeleported || %obj.isRemoved)
|
||||
return;
|
||||
|
||||
// verify pad.team is team associated and is on player's team
|
||||
if (%obj.team != %col.team && %obj.team != 0 && %obj.teleMode != 1 && %obj.frequency > 0) {
|
||||
%obj.play3D(TelePadAccessDeniedSound);
|
||||
messageClient(%col.client,'msgClient','\c2Access Denied -- Wrong team.');
|
||||
%col.justTeleported = true;
|
||||
schedule(2000,0,"unTeleport",%col);
|
||||
return;
|
||||
}
|
||||
|
||||
// verify that pad can transmit
|
||||
if (%obj.teleMode == 3) {
|
||||
%obj.play3D(TelePadAccessDeniedSound);
|
||||
messageClient(%col.client,'msgClient','\c2Access Denied -- This pad can only receive.');
|
||||
%col.justTeleported = true;
|
||||
schedule(2000,0,"unTeleport",%col);
|
||||
return;
|
||||
}
|
||||
|
||||
// Discover next pad to teleport to
|
||||
%dgroup = nameToID(Deployables);
|
||||
%destPad = 0;
|
||||
%firstPad = 0;
|
||||
for(%depIndex = 0; %depIndex < %dgroup.getCount(); %depIndex++) {
|
||||
%dep = %dgroup.getObject(%depIndex);
|
||||
if (%dep.getDataBlock().className $= "teleport") {
|
||||
if (%dep != %obj && %dep.frequency == %obj.frequency && %dep.team == %obj.team && %dep.teleMode != 2) {
|
||||
if (%dep.isPowered() && %dep.isEnabled() && !(%dep.getEnergyLevel() < %dep.getDataBlock().maxEnergy)) {
|
||||
if (!%firstPad || %dep < %firstPad)
|
||||
%firstPad = %dep;
|
||||
if (%dep > %obj && (!%destPad || %dep < %destPad)) {
|
||||
%destPad = %dep;
|
||||
}
|
||||
}
|
||||
else
|
||||
%notEnabled = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!%destPad)
|
||||
%destPad = %firstPad;
|
||||
|
||||
if (!%obj.isPowered() || !%obj.isEnabled()) {
|
||||
%obj.play3D(TelePadAccessDeniedSound);
|
||||
if (!%obj.isPowered() && !%obj.isEnabled())
|
||||
messageClient(%col.client,'msgClient','\c2Unable to teleport, telepad is damaged and has no power.');
|
||||
else if (!%obj.isEnabled())
|
||||
messageClient(%col.client,'msgClient','\c2Unable to teleport, telepad is damaged.');
|
||||
else if (!%obj.isPowered())
|
||||
messageClient(%col.client,'msgClient','\c2Unable to teleport, telepad is not powered.');
|
||||
else
|
||||
messageClient(%col.client,'msgClient','\c2Unable to teleport, telepad malfunction.');
|
||||
%col.justTeleported = true;
|
||||
schedule(2000,0,"unTeleport",%col);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!%destPad) {
|
||||
%obj.play3D(TelePadAccessDeniedSound);
|
||||
if (%notEnabled)
|
||||
messageClient(%col.client,'msgClient','\c2Unable to teleport, destination is damaged, has no power or is recharging.');
|
||||
else
|
||||
messageClient(%col.client,'msgClient','\c2Unable to teleport, no other pads to teleport to.');
|
||||
%col.justTeleported = true;
|
||||
schedule(2000,0,"unTeleport",%col);
|
||||
return;
|
||||
}
|
||||
|
||||
if (tp_isBlocked(%destPad,%col)) {
|
||||
%obj.play3D(TelePadAccessDeniedSound);
|
||||
messageClient(%col.client,'msgClient','\c2Unable to teleport, destination is blocked.');
|
||||
%col.justTeleported = true;
|
||||
schedule(2000,0,"unTeleport",%col);
|
||||
return;
|
||||
}
|
||||
|
||||
if (%obj.getEnergyLevel() < %obj.getDataBlock().maxEnergy) {
|
||||
%obj.play3D(TelePadAccessDeniedSound);
|
||||
messageClient(%col.client,'msgClient','\c2Unable to teleport, telepad is recharging.');
|
||||
%col.justTeleported = true;
|
||||
schedule(2000,0,"unTeleport",%col);
|
||||
return;
|
||||
}
|
||||
|
||||
// center player on pad
|
||||
if (!tp_isBlocked(%obj,%col))
|
||||
tp_adjustPlayer(%obj,%col);
|
||||
|
||||
// fade out player
|
||||
%col.disableMove(true);
|
||||
pl_fadeOut(%col);
|
||||
|
||||
// pad power up effect
|
||||
tp_fadePadIn(%obj);
|
||||
tp_fadePadIn(%destPad);
|
||||
|
||||
// fade out beams
|
||||
schedule(600,0,"tp_fadeOut",%obj);
|
||||
schedule(750,0,"tp_fadeOut",%destPad);
|
||||
|
||||
// pad power down effect
|
||||
schedule(1500,0,"tp_fadePadOut",%obj);
|
||||
schedule(1550,0,"tp_fadePadOut",%destPad);
|
||||
|
||||
// fade in beams
|
||||
schedule(3000,0,"tp_fadeIn",%obj);
|
||||
schedule(3050,0,"tp_fadeIn",%destPad);
|
||||
|
||||
// Zap energy
|
||||
%obj.setEnergyLevel(0);
|
||||
%destPad.setEnergyLevel(0);
|
||||
|
||||
%col.justTeleported = true;
|
||||
|
||||
messageClient(%col.client,'msgClient',"~wfx/misc/diagnostic_on.wav");
|
||||
schedule(500,0,"teleport",%col,%destPad,%obj); // schedule their teleportation
|
||||
tp_emitter(%obj);
|
||||
}
|
||||
|
||||
function tp_isBlocked(%pad,%obj) {
|
||||
%padPos = %pad.getPosition();
|
||||
%telePos = vectorAdd(%padPos,vectorScale(realVec(%pad,"0 0 1"),-2.5));
|
||||
if (containerRayCast(%padPos,%telePos,-1,%pad))
|
||||
%blocked = true;
|
||||
if (!$Host::AllowUnderground) {
|
||||
%terrain = getTerrainHeight2(%telePos);
|
||||
if (getWord(%telePos,2) < getWord(%terrain,2) || %terrain $= "")
|
||||
%blocked = true;
|
||||
}
|
||||
if (isObject(%obj)) {
|
||||
%adjust = vectorAdd(vectorScale(vectorNormalize(realVec(%pad,"0 0 1")),-1.35),vectorSub(%obj.getPosition(),%obj.getWorldBoxCenter()));
|
||||
%pos = vectorAdd(%padPos,%adjust);
|
||||
if (!$Host::AllowUnderground) {
|
||||
%terrain = getTerrainHeight2(%pos);
|
||||
if (getWord(%pos,2) < getWord(%terrain,2) || %terrain $= "")
|
||||
%blocked = true;
|
||||
}
|
||||
if (containerRayCast(%telePos,%pos,-1,%obj))
|
||||
%blocked = true;
|
||||
}
|
||||
return %blocked;
|
||||
}
|
||||
|
||||
// player
|
||||
function pl_fadeIn(%obj) {
|
||||
%obj.startFade(500,0,false);
|
||||
messageClient(%col.client,'msgClient',"~wfx/misc/diagnostic_on.wav");
|
||||
}
|
||||
|
||||
function pl_fadeOut(%obj) {
|
||||
%obj.startFade(500,0,true);
|
||||
messageClient(%col.client,'msgClient',"~wfx/misc/diagnostic_on.wav");
|
||||
}
|
||||
|
||||
// beam and sound
|
||||
function tp_fadeIn(%obj,%silent) {
|
||||
if (%obj.isPowered() && %obj.isEnabled()) {
|
||||
if (!%silent)
|
||||
%obj.play3D(DiscReloadSound);
|
||||
%obj.beam.startFade(100,0,false);
|
||||
}
|
||||
}
|
||||
|
||||
function tp_fadeOut(%obj,%silent) {
|
||||
if (!%silent)
|
||||
%obj.play3D(TelePadBeamSound);
|
||||
%obj.beam.startFade(100,0,true);
|
||||
}
|
||||
|
||||
// pad
|
||||
function tp_fadePadIn(%obj) {
|
||||
%obj.playThread($ActivateThread,"transition");
|
||||
%obj.setThreadDir($ActivateThread,true);
|
||||
}
|
||||
|
||||
function tp_fadePadOut(%obj) {
|
||||
%obj.playThread($ActivateThread,"transition");
|
||||
%obj.setThreadDir($ActivateThread,false);
|
||||
}
|
||||
|
||||
// fancy emitter
|
||||
function tp_emitter(%obj) {
|
||||
%em = new ParticleEmissionDummy() {
|
||||
scale = "1 1 1";
|
||||
dataBlock = "defaultEmissionDummy";
|
||||
emitter = "TelePadTeleportEmitter";
|
||||
velocity = "1";
|
||||
};
|
||||
%adjust = vectorScale(realVec(%obj,"0 0 1"),7);
|
||||
%em.setTransform(vectorAdd(%obj.getPosition(),%adjust) SPC rotAdd(%obj.getRotation(),"1 0 0" SPC $Pi));
|
||||
MissionCleanup.add(%em);
|
||||
%em.schedule(1000,"delete");
|
||||
}
|
||||
|
||||
function unTeleport(%pl) {
|
||||
if (isObject(%pl))
|
||||
%pl.justTeleported = false;
|
||||
}
|
||||
|
||||
function teleport(%pl,%destPad,%src) {
|
||||
%pl.setVelocity("0 0 0"); //slow me down, ive been falling :)
|
||||
%pl.schedule(500,disableMove,false);
|
||||
pl_fadeIn(%pl);
|
||||
schedule(2650,0,"unTeleport",%pl);
|
||||
|
||||
if (!isObject(%destPad)) {// lost the destination
|
||||
messageClient(%pl.client,'msgClient','\c2Lost destination!');
|
||||
tp_adjustPlayer(%src,%pl);
|
||||
}
|
||||
else {
|
||||
if (%pl.team == %src.team)
|
||||
messageClient(%pl.client,'msgClient','\c2Teleporting: %1.',%src.nametoset);
|
||||
else
|
||||
messageClient(%pl.client,'msgClient','\c2Teleporting: ENEMY %1!',%src.nametoset);
|
||||
tp_adjustPlayer(%destPad,%pl);
|
||||
tp_emitter(%destPad);
|
||||
}
|
||||
}
|
||||
|
||||
function tp_adjustPlayer(%pad,%obj) {
|
||||
%adjust = vectorAdd(vectorScale(vectorNormalize(realVec(%pad,"0 0 1")),-1.35),vectorSub(%obj.getPosition(),%obj.getWorldBoxCenter()));
|
||||
%rot = %obj.getRotation();
|
||||
%obj.setTransform(vectorAdd(%pad.getPosition(),%adjust) SPC %rot);
|
||||
}
|
||||
|
||||
function tp_adjustBeam(%pad) {
|
||||
%rot = rotAdd(%pad.getRotation(),"1 0 0" SPC $Pi);
|
||||
%pad.beam.setTransform(%pad.getPosition() SPC %rot);
|
||||
}
|
||||
|
||||
function TelePadPack::onPickup(%this,%obj,%shape,%amount) {
|
||||
// created to prevent console errors
|
||||
}
|
||||
|
||||
function TelePadDeployableImage::onDeploy(%item,%plyr,%slot) {
|
||||
%className = "StaticShape";
|
||||
|
||||
%item.surfacePt = vectorAdd(%item.surfacePt,vectorScale(%item.surfaceNrm,0.4));
|
||||
|
||||
%playerVector = vectorNormalize(getWord(%plyr.getEyeVector(),1) SPC -1 * getWord(%plyr.getEyeVector(),0) SPC "0");
|
||||
%item.surfaceNrm2 = %playerVector;
|
||||
|
||||
if (vAbs(floorVec(%item.surfaceNrm,100)) $= "0 0 1")
|
||||
%item.surfaceNrm2 = vectorScale(%playerVector,-1);
|
||||
else
|
||||
%item.surfaceNrm2 = vectorNormalize(vectorCross(%item.surfaceNrm,"0 0 1"));
|
||||
|
||||
%rot = fullRot(vectorScale(%item.surfaceNrm,-1),%item.surfaceNrm2);
|
||||
|
||||
%deplObj = new (%className)() {
|
||||
dataBlock = TelePadDeployedBase;
|
||||
scale = "1 1 1";
|
||||
deployed = true;
|
||||
teleMode = %plyr.expertSet;
|
||||
};
|
||||
|
||||
// set orientation
|
||||
%deplObj.setTransform(%item.surfacePt SPC %rot);
|
||||
|
||||
// set team, owner, and handle
|
||||
%deplObj.team = %plyr.client.team;
|
||||
%deplObj.setOwner(%plyr);
|
||||
|
||||
// set power frequency
|
||||
%deplObj.powerFreq = %plyr.powerFreq;
|
||||
|
||||
// set the sensor group if it needs one
|
||||
if (%deplObj.getTarget() != -1)
|
||||
setTargetSensorGroup(%deplObj.getTarget(),%plyr.client.team);
|
||||
|
||||
// set frequency
|
||||
%frequency = %plyr.packSet;
|
||||
if (!%frequency)
|
||||
%frequency = 1;
|
||||
%deplObj.frequency = %frequency;
|
||||
setTargetName(%deplObj.target,addTaggedString("Frequency" SPC %frequency));
|
||||
|
||||
// attach beam
|
||||
%deplObj.beam = new (StaticShape)() {
|
||||
dataBlock = TelePadBeam;
|
||||
scale = "1 1 0.4";
|
||||
};
|
||||
|
||||
// set orientation
|
||||
tp_adjustBeam(%deplObj);
|
||||
|
||||
%deplObj.beam.playThread(0,"ambient");
|
||||
%deplObj.beam.setThreadDir(0,true);
|
||||
// The flash animation plays forwards, then back automatically,so we have to alternate the thread direcction...
|
||||
%deplObj.beam.flashThreadDir = true;
|
||||
|
||||
%deplObj.beam.base = %deplObj;
|
||||
|
||||
// place the deployable in the MissionCleanup/Deployables group (AI reasons)
|
||||
addToDeployGroup(%deplObj);
|
||||
|
||||
//let the AI know as well...
|
||||
AIDeployObject(%plyr.client,%deplObj);
|
||||
|
||||
// play the deploy sound
|
||||
serverPlay3D(%item.deploySound,%deplObj.getTransform());
|
||||
|
||||
// increment the team count for this deployed object
|
||||
$TeamDeployedCount[%plyr.team,%item.item]++;
|
||||
|
||||
addDSurface(%item.surface,%deplObj);
|
||||
|
||||
// take the deployable off the player's back and out of inventory
|
||||
//%plyr.unmountImage(%slot);
|
||||
//%plyr.decInventory(%item.item,1);
|
||||
|
||||
// Power object
|
||||
checkPowerObject(%deplObj);
|
||||
|
||||
return %deplObj;
|
||||
}
|
||||
|
||||
function TelePadDeployableImage::onMount(%data,%obj,%node) {
|
||||
%obj.hasTele = true; // set for telecheck
|
||||
%obj.packSet = 1;
|
||||
%obj.expertSet = 0;
|
||||
displayPowerFreq(%obj);
|
||||
}
|
||||
|
||||
function TelePadDeployableImage::onUnmount(%data,%obj,%node) {
|
||||
%obj.hasTele = "";
|
||||
%obj.packSet = 0;
|
||||
%obj.expertSet = 0;
|
||||
}
|
||||
260
scripts/packs/treepack.cs
Normal file
260
scripts/packs/treepack.cs
Normal file
|
|
@ -0,0 +1,260 @@
|
|||
//---------------------------------------------------------
|
||||
// Deployable Tree, original code by Parousia
|
||||
//---------------------------------------------------------
|
||||
|
||||
datablock StaticShapeData(DeployedTree) : StaticShapeDamageProfile {
|
||||
className = "tree";
|
||||
shapeFile = "borg19.dts";
|
||||
|
||||
maxDamage = 0.5;
|
||||
destroyedLevel = 0.5;
|
||||
disabledLevel = 0.3;
|
||||
|
||||
explosion = HandGrenadeExplosion;
|
||||
expDmgRadius = 1.0;
|
||||
expDamage = 0.05;
|
||||
expImpulse = 200;
|
||||
|
||||
dynamicType = $TypeMasks::StaticShapeObjectType;
|
||||
deployedObject = true;
|
||||
cmdCategory = "DSupport";
|
||||
cmdIcon = CMDSensorIcon;
|
||||
cmdMiniIconName = "commander/MiniIcons/com_deploymotionsensor";
|
||||
targetNameTag = 'Deployed Tree';
|
||||
deployAmbientThread = true;
|
||||
debrisShapeName = "debris_generic_small.dts";
|
||||
debris = DeployableDebris;
|
||||
heatSignature = 0;
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedTree0) : DeployedTree {
|
||||
shapeFile = "borg16.dts";
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedTree1) : DeployedTree {
|
||||
shapeFile = "borg17.dts";
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedTree2) : DeployedTree {
|
||||
shapeFile = "borg18.dts";
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedTree3) : DeployedTree {
|
||||
shapeFile = "borg19.dts";
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedTree4) : DeployedTree {
|
||||
shapeFile = "dorg15.dts";
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedTree5) : DeployedTree {
|
||||
shapeFile = "dorg16.dts";
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedTree6) : DeployedTree {
|
||||
shapeFile = "dorg17.dts";
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedTree7) : DeployedTree {
|
||||
shapeFile = "dorg18.dts";
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedTree8) : DeployedTree {
|
||||
shapeFile = "dorg19.dts";
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedTree9) : DeployedTree {
|
||||
shapeFile = "porg3.dts";
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedTree10) : DeployedTree {
|
||||
shapeFile = "porg6.dts";
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedTree11) : DeployedTree {
|
||||
shapeFile = "sorg20.dts";
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedTree12) : DeployedTree {
|
||||
shapeFile = "sorg22.dts";
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployedTree13) : DeployedTree {
|
||||
shapeFile = "xorg3.dts";
|
||||
};
|
||||
|
||||
datablock ShapeBaseImageData(TreeDeployableImage) {
|
||||
mass = 1;
|
||||
emap = true;
|
||||
shapeFile = "stackable1s.dts";
|
||||
item = TreeDeployable;
|
||||
mountPoint = 1;
|
||||
offset = "0 0 0";
|
||||
deployed = DeployedTree;
|
||||
heatSignature = 0;
|
||||
|
||||
stateName[0] = "Idle";
|
||||
stateTransitionOnTriggerDown[0] = "Activate";
|
||||
|
||||
stateName[1] = "Activate";
|
||||
stateScript[1] = "onActivate";
|
||||
stateTransitionOnTriggerUp[1] = "Idle";
|
||||
|
||||
isLarge = true;
|
||||
maxDepSlope = 360;
|
||||
deploySound = ItemPickupSound;
|
||||
|
||||
minDeployDis = 0.5;
|
||||
maxDeployDis = 50.0;
|
||||
};
|
||||
|
||||
datablock ItemData(TreeDeployable) {
|
||||
className = Pack;
|
||||
catagory = "Deployables";
|
||||
shapeFile = "stackable1s.dts";
|
||||
mass = 1;
|
||||
elasticity = 0.2;
|
||||
friction = 0.6;
|
||||
pickupRadius = 1;
|
||||
rotate = true;
|
||||
image = "TreeDeployableImage";
|
||||
pickUpName = "a tree pack";
|
||||
heatSignature = 0;
|
||||
emap = true;
|
||||
};
|
||||
|
||||
function TreeDeployableImage::testObjectTooClose(%item) {
|
||||
return "";
|
||||
}
|
||||
|
||||
function TreeDeployableImage::testNoTerrainFound(%item) {
|
||||
// don't check this for non-Landspike turret deployables
|
||||
}
|
||||
|
||||
function TreeDeployable::onPickup(%this, %obj, %shape, %amount) {
|
||||
// created to prevent console errors
|
||||
}
|
||||
|
||||
function TreeDeployableImage::onDeploy(%item, %plyr, %slot) {
|
||||
%className = "StaticShape";
|
||||
|
||||
%playerVector = vectorNormalize(-1 * getWord(%plyr.getEyeVector(),1) SPC getWord(%plyr.getEyeVector(),0) SPC "0");
|
||||
%item.surfaceNrm2 = %playerVector;
|
||||
%rot = fullRot(%item.surfaceNrm,%item.surfaceNrm2);
|
||||
|
||||
%deplObj = new (%className)() {
|
||||
dataBlock = %item.deployed @ %plyr.packSet;
|
||||
scale = vectorScale("1 1 1",$expertSetting["tree",%plyr.expertSet]);
|
||||
};
|
||||
|
||||
// set orientation
|
||||
%deplObj.setTransform(%item.surfacePt SPC %rot);
|
||||
|
||||
// set the recharge rate right away
|
||||
if (%deplObj.getDatablock().rechargeRate)
|
||||
%deplObj.setRechargeRate(%deplObj.getDatablock().rechargeRate);
|
||||
|
||||
// set team, owner, and handle
|
||||
%deplObj.team = %plyr.client.Team;
|
||||
%deplObj.setOwner(%plyr);
|
||||
|
||||
// place the deployable in the MissionCleanup/Deployables group (AI reasons)
|
||||
addToDeployGroup(%deplObj);
|
||||
|
||||
//let the AI know as well...
|
||||
AIDeployObject(%plyr.client, %deplObj);
|
||||
|
||||
// play the deploy sound
|
||||
serverPlay3D(%item.deploySound, %deplObj.getTransform());
|
||||
|
||||
// increment the team count for this deployed object
|
||||
$TeamDeployedCount[%plyr.team, %item.item]++;
|
||||
|
||||
addDSurface(%item.surface,%deplObj);
|
||||
|
||||
// take the deployable off the player's back and out of inventory
|
||||
if(!%plyr.client.isAdmin) {
|
||||
%plyr.unmountImage(%slot);
|
||||
%plyr.decInventory(%item.item, 1);
|
||||
}
|
||||
|
||||
return %deplObj;
|
||||
}
|
||||
|
||||
function DeployedTree::onDestroyed(%this,%obj,%prevState) {
|
||||
if (%obj.isRemoved)
|
||||
return;
|
||||
%obj.isRemoved = true;
|
||||
Parent::onDestroyed(%this,%obj,%prevState);
|
||||
$TeamDeployedCount[%obj.team, TreeDeployable]--;
|
||||
remDSurface(%obj);
|
||||
%obj.schedule(500, "delete");
|
||||
}
|
||||
|
||||
function TreeDeployableImage::onMount(%data, %obj, %node) {
|
||||
%obj.hasTree = true; // set for treecheck
|
||||
%obj.packSet = 0;
|
||||
%obj.expertSet = 5;
|
||||
}
|
||||
|
||||
function TreeDeployableImage::onUnmount(%data, %obj, %node) {
|
||||
%obj.hasTree = "";
|
||||
%obj.packSet = 0;
|
||||
%obj.expertSet = 0;
|
||||
}
|
||||
|
||||
function DeployedTree0::onDestroyed(%this,%obj,%prevState) {
|
||||
DeployedTree::onDestroyed(%this,%obj,%prevState);
|
||||
}
|
||||
|
||||
function DeployedTree1::onDestroyed(%this,%obj,%prevState) {
|
||||
DeployedTree::onDestroyed(%this,%obj,%prevState);
|
||||
}
|
||||
|
||||
function DeployedTree2::onDestroyed(%this,%obj,%prevState) {
|
||||
DeployedTree::onDestroyed(%this,%obj,%prevState);
|
||||
}
|
||||
|
||||
function DeployedTree3::onDestroyed(%this,%obj,%prevState) {
|
||||
DeployedTree::onDestroyed(%this,%obj,%prevState);
|
||||
}
|
||||
|
||||
function DeployedTree4::onDestroyed(%this,%obj,%prevState) {
|
||||
DeployedTree::onDestroyed(%this,%obj,%prevState);
|
||||
}
|
||||
|
||||
function DeployedTree5::onDestroyed(%this,%obj,%prevState) {
|
||||
DeployedTree::onDestroyed(%this,%obj,%prevState);
|
||||
}
|
||||
|
||||
function DeployedTree6::onDestroyed(%this,%obj,%prevState) {
|
||||
DeployedTree::onDestroyed(%this,%obj,%prevState);
|
||||
}
|
||||
|
||||
function DeployedTree7::onDestroyed(%this,%obj,%prevState) {
|
||||
DeployedTree::onDestroyed(%this,%obj,%prevState);
|
||||
}
|
||||
|
||||
function DeployedTree8::onDestroyed(%this,%obj,%prevState) {
|
||||
DeployedTree::onDestroyed(%this,%obj,%prevState);
|
||||
}
|
||||
|
||||
function DeployedTree9::onDestroyed(%this,%obj,%prevState) {
|
||||
DeployedTree::onDestroyed(%this,%obj,%prevState);
|
||||
}
|
||||
|
||||
function DeployedTree10::onDestroyed(%this,%obj,%prevState) {
|
||||
DeployedTree::onDestroyed(%this,%obj,%prevState);
|
||||
}
|
||||
|
||||
function DeployedTree11::onDestroyed(%this,%obj,%prevState) {
|
||||
DeployedTree::onDestroyed(%this,%obj,%prevState);
|
||||
}
|
||||
|
||||
function DeployedTree12::onDestroyed(%this,%obj,%prevState) {
|
||||
DeployedTree::onDestroyed(%this,%obj,%prevState);
|
||||
}
|
||||
|
||||
function DeployedTree13::onDestroyed(%this,%obj,%prevState) {
|
||||
DeployedTree::onDestroyed(%this,%obj,%prevState);
|
||||
}
|
||||
393
scripts/packs/tripwire.cs
Normal file
393
scripts/packs/tripwire.cs
Normal file
|
|
@ -0,0 +1,393 @@
|
|||
// Tripwire
|
||||
|
||||
datablock ForceFieldBareData(TripField) : DeployedForceField {
|
||||
baseTranslucency = 0.1;
|
||||
powerOffTranslucency = 0.0;
|
||||
teamPermiable = true;
|
||||
otherPermiable = true;
|
||||
color = "1 0 0";
|
||||
powerOffColor = "0.0 0.0 0.0";
|
||||
deployedFrom = "";
|
||||
needsPower = false;
|
||||
};
|
||||
|
||||
datablock AudioProfile(TripwireSound) {
|
||||
filename = "fx/misc/rolechange.wav";
|
||||
description = AudioClosest3d;
|
||||
preload = true;
|
||||
};
|
||||
|
||||
datablock TriggerData(TripTrigger) {
|
||||
// TODO - check this
|
||||
tickPeriodMS = 200;
|
||||
};
|
||||
|
||||
function TripTrigger::onEnterTrigger(%data, %obj, %colObj) {
|
||||
// TODO - keep trip FF scaled down until trip is triggered - vehicle fix?
|
||||
%baseObj = %obj.baseObj;
|
||||
%baseObj.triggerCount++;
|
||||
if (%baseObj.triggerCount > 1)
|
||||
return;
|
||||
%baseObj.play3D(TripwireSound);
|
||||
if (isObject(%baseObj.tripField)) {
|
||||
cancel(%baseObj.tripField.hideSched);
|
||||
%baseObj.tripField.getDataBlock().gainPower(%baseObj.tripField);
|
||||
}
|
||||
%tripMode = %baseObj.tripMode;
|
||||
while (%tripMode > 1 && %tripMode > -1 && %tripMode !$= "")
|
||||
%tripMode = %tripMode - 2;
|
||||
%count = getWordCount($PowerList);
|
||||
for(%i=0;%i<%count;%i++) {
|
||||
%powerObj = getWord($PowerList,%i);
|
||||
if (vectorDist(%baseObj.getPosition(),%powerObj.getPosition()) < %baseObj.switchRadius
|
||||
&& !%powerObj.isRemoved && %baseObj.powerFreq == %powerObj.powerFreq
|
||||
&& %baseObj.team == %powerObj.team) {
|
||||
%r = toggleGenerator(%powerObj,!%tripMode);
|
||||
%r1 = firstWord(%r);
|
||||
%r2 = getTaggedString(getWord(%r,1));
|
||||
%r3 = getWord(%r,2);
|
||||
if (%r1 == -3) {
|
||||
cancel(%powerObj.toggleSched);
|
||||
%powerObj.toggleSched = schedule(%r3 + 100,0,toggleGenerator,%powerObj,!%tripMode);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function TripTrigger::onLeaveTrigger(%data, %obj, %colObj) {
|
||||
%baseObj = %obj.baseObj;
|
||||
%baseObj.triggerCount--;
|
||||
if (%baseObj.triggerCount > 0)
|
||||
return;
|
||||
%baseObj.play3D(TripwireSound);
|
||||
if (isObject(%baseObj.tripField)) {
|
||||
cancel(%baseObj.tripField.hideSched);
|
||||
%baseObj.tripField.hideSched = %baseObj.tripField.getDataBlock().schedule(2000,losePower,%baseObj.tripField);
|
||||
}
|
||||
%tripMode = %baseObj.tripMode;
|
||||
if (%tripMode == 2 || %tripMode == 3)
|
||||
return;
|
||||
if (%tripMode == 4 || %tripMode == 5)
|
||||
%timed = true;
|
||||
while (%tripMode > 1 && %tripMode > -1 && %tripMode !$= "")
|
||||
%tripMode = %tripMode - 2;
|
||||
%count = getWordCount($PowerList);
|
||||
for(%i=0;%i<%count;%i++) {
|
||||
%powerObj = getWord($PowerList,%i);
|
||||
if (vectorDist(%baseObj.getPosition(),%powerObj.getPosition()) < %baseObj.switchRadius
|
||||
&& !%powerObj.isRemoved && %baseObj.powerFreq == %powerObj.powerFreq
|
||||
&& %baseObj.team == %powerObj.team) {
|
||||
if (%timed) {
|
||||
cancel(%powerObj.toggleSched);
|
||||
%powerObj.toggleSched = schedule(5000,0,delayedToggleGenerator,%powerObj,%tripMode);
|
||||
}
|
||||
else {
|
||||
%r = toggleGenerator(%powerObj,%tripMode);
|
||||
%r1 = firstWord(%r);
|
||||
%r2 = getTaggedString(getWord(%r,1));
|
||||
%r3 = getWord(%r,2);
|
||||
if (%r1 == -3) {
|
||||
cancel(%powerObj.toggleSched);
|
||||
%powerObj.toggleSched = schedule(%r3 + 100,0,toggleGenerator,%powerObj,%tripMode);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function delayedToggleGenerator(%powerObj,%tripMode) {
|
||||
%r = toggleGenerator(%powerObj,%tripMode);
|
||||
%r1 = firstWord(%r);
|
||||
%r2 = getTaggedString(getWord(%r,1));
|
||||
%r3 = getWord(%r,2);
|
||||
if (%r1 == -3) {
|
||||
cancel(%powerObj.toggleSched);
|
||||
%powerObj.toggleSched = schedule(%r3 + 100,0,toggleGenerator,%powerObj,%tripMode);
|
||||
}
|
||||
}
|
||||
|
||||
function TripTrigger::onTickTrigger(%data, %obj) {
|
||||
}
|
||||
|
||||
function TripTrigger::onTrigger(%this, %triggerId, %on) {
|
||||
}
|
||||
|
||||
datablock StaticShapeData(DeployedTripwire) : StaticShapeDamageProfile {
|
||||
className = "tripwire";
|
||||
shapeFile = "camera.dts";
|
||||
|
||||
maxDamage = 0.2;
|
||||
destroyedLevel = 0.2;
|
||||
disabledLevel = 0.2;
|
||||
|
||||
isShielded = false;
|
||||
energyPerDamagePoint = 40;
|
||||
maxEnergy = 30;
|
||||
rechargeRate = 0.05;
|
||||
|
||||
explosion = HandGrenadeExplosion;
|
||||
expDmgRadius = 1.0;
|
||||
expDamage = 0.3;
|
||||
expImpulse = 500;
|
||||
|
||||
dynamicType = $TypeMasks::StaticShapeObjectType;
|
||||
deployedObject = true;
|
||||
cmdCategory = "DSupport";
|
||||
cmdIcon = CMDSensorIcon;
|
||||
cmdMiniIconName = "commander/MiniIcons/com_deploymotionsensor";
|
||||
targetNameTag = 'Deployed';
|
||||
targetTypeTag = 'Tripwire';
|
||||
deployAmbientThread = true;
|
||||
debrisShapeName = "debris_generic_small.dts";
|
||||
debris = DeployableDebris;
|
||||
heatSignature = 0;
|
||||
emap = true;
|
||||
};
|
||||
|
||||
datablock ShapeBaseImageData(TripwireDeployableImage) {
|
||||
mass = 1;
|
||||
emap = true;
|
||||
shapeFile = "camera.dts";
|
||||
item = TripwireDeployable;
|
||||
mountPoint = 1;
|
||||
offset = "0 0 0";
|
||||
rotation = "-1 0 0 90";
|
||||
deployed = DeployedTripwire;
|
||||
heatSignature = 0;
|
||||
|
||||
stateName[0] = "Idle";
|
||||
stateTransitionOnTriggerDown[0] = "Activate";
|
||||
|
||||
stateName[1] = "Activate";
|
||||
stateScript[1] = "onActivate";
|
||||
stateTransitionOnTriggerUp[1] = "Idle";
|
||||
|
||||
isLarge = false;
|
||||
maxDepSlope = 360;
|
||||
deploySound = ItemPickupSound;
|
||||
|
||||
minDeployDis = 0.25;
|
||||
maxDeployDis = 5;
|
||||
};
|
||||
|
||||
datablock ItemData(TripwireDeployable) {
|
||||
className = Pack;
|
||||
catagory = "Deployables";
|
||||
shapeFile = "stackable1s.dts";
|
||||
mass = 1;
|
||||
elasticity = 0.2;
|
||||
friction = 0.6;
|
||||
pickupRadius = 3;
|
||||
rotate = true;
|
||||
image = "TripwireDeployableImage";
|
||||
pickUpName = "a tripwire pack";
|
||||
heatSignature = 0;
|
||||
emap = true;
|
||||
};
|
||||
|
||||
function TripwireDeployableImage::testNoTerrainFound(%item) {
|
||||
// don't check this for non-Landspike turret deployables
|
||||
}
|
||||
|
||||
function TripwireDeployable::onPickup(%this, %obj, %shape, %amount) {
|
||||
// created to prevent console errors
|
||||
}
|
||||
|
||||
function TripwireDeployableImage::onDeploy(%item, %plyr, %slot) {
|
||||
%className = "StaticShape";
|
||||
|
||||
%playerVector = vectorNormalize(-1 * getWord(%plyr.getEyeVector(),1) SPC getWord(%plyr.getEyeVector(),0) SPC "0");
|
||||
|
||||
if (%item.surfaceinher == 0) {
|
||||
if (vAbs(floorVec(%item.surfaceNrm,100)) $= "0 0 1")
|
||||
%item.surfaceNrm2 = %playerVector;
|
||||
else
|
||||
%item.surfaceNrm2 = vectorNormalize(vectorCross(%item.surfaceNrm,"0 0 1"));
|
||||
}
|
||||
|
||||
%rot = fullRot(%item.surfaceNrm,%item.surfaceNrm2);
|
||||
|
||||
%deplObj = new (%className)() {
|
||||
dataBlock = DeployedTripwire;
|
||||
};
|
||||
|
||||
%deplObj.switchRadius = getWord($packSetting["tripwire",%plyr.packSet],0);
|
||||
%deplObj.fieldMode = getWord($packSetting["tripwire",%plyr.packSet],1);
|
||||
%deplObj.tripMode = %plyr.expertSet;
|
||||
if (%deplObj.fieldMode == 1)
|
||||
%deplObj.beamRange = 160;
|
||||
else
|
||||
%deplObj.beamRange = 30;
|
||||
|
||||
%deplObj.tripField = new ForceFieldBare() {
|
||||
dataBlock = TripField;
|
||||
scale = "0.05 0.05 0.1";
|
||||
};
|
||||
|
||||
%deplObj.tripField.pzone.delete();
|
||||
|
||||
%deplObj.tripTrigger = new Trigger() {
|
||||
dataBlock = TripTrigger;
|
||||
polyhedron = "0 1 0 1 0 0 0 -1 0 0 0 1";
|
||||
scale = "0.05 0.05 0.1";
|
||||
};
|
||||
|
||||
%deplObj.tripTrigger.baseObj = %deplObj;
|
||||
|
||||
// set orientation
|
||||
%deplObj.setTransform(%item.surfacePt SPC %rot);
|
||||
adjustTripwire(%deplObj);
|
||||
|
||||
// set the recharge rate right away
|
||||
if (%deplObj.getDatablock().rechargeRate)
|
||||
%deplObj.setRechargeRate(%deplObj.getDatablock().rechargeRate);
|
||||
|
||||
// set team, owner, and handle
|
||||
%deplObj.team = %plyr.client.Team;
|
||||
%deplObj.setOwner(%plyr);
|
||||
|
||||
// set power frequency
|
||||
%deplObj.powerFreq = %plyr.powerFreq;
|
||||
setTargetName(%deplObj.target,addTaggedString("Frequency" SPC %deplObj.powerFreq));
|
||||
|
||||
// set the sensor group if it needs one
|
||||
if (%deplObj.getTarget() != -1)
|
||||
setTargetSensorGroup(%deplObj.getTarget(), %plyr.client.team);
|
||||
|
||||
// place the deployable in the MissionCleanup/Deployables group (AI reasons)
|
||||
addToDeployGroup(%deplObj);
|
||||
|
||||
//let the AI know as well...
|
||||
AIDeployObject(%plyr.client, %deplObj);
|
||||
|
||||
// play the deploy sound
|
||||
serverPlay3D(%item.deploySound, %deplObj.getTransform());
|
||||
|
||||
// increment the team count for this deployed object
|
||||
$TeamDeployedCount[%plyr.team, %item.item]++;
|
||||
|
||||
%deplObj.deploy();
|
||||
|
||||
addDSurface(%item.surface,%deplObj);
|
||||
|
||||
// take the deployable off the player's back and out of inventory
|
||||
//%plyr.unmountImage(%slot);
|
||||
//%plyr.decInventory(%item.item, 1);
|
||||
|
||||
return %deplObj;
|
||||
}
|
||||
|
||||
function DeployedTripwire::onDestroyed(%this,%obj,%prevState) {
|
||||
if (%obj.isRemoved)
|
||||
return;
|
||||
%obj.isRemoved = true;
|
||||
Parent::onDestroyed(%this,%obj,%prevState);
|
||||
$TeamDeployedCount[%obj.team, TripwireDeployable]--;
|
||||
remDSurface(%obj);
|
||||
%obj.schedule(500, "delete");
|
||||
if (isObject(%obj.tripField))
|
||||
%obj.tripField.schedule(500, "delete");
|
||||
if (isObject(%obj.tripTrigger))
|
||||
%obj.tripTrigger.schedule(500, "delete");
|
||||
}
|
||||
|
||||
function DeployedTripwire::disassemble(%data,%plyr,%obj) {
|
||||
if (isObject(%obj.tripField))
|
||||
%obj.tripField.delete();
|
||||
if (isObject(%obj.tripTrigger))
|
||||
%obj.tripTrigger.delete();
|
||||
disassemble(%data,%plyr,%obj);
|
||||
}
|
||||
|
||||
function adjustTripwire(%obj) {
|
||||
if (!isObject(%obj))
|
||||
return;
|
||||
cancel(%obj.adjustSched);
|
||||
%pos = %obj.getPosition();
|
||||
%nrm = realVec(%obj,"0 0 1");
|
||||
%nrm2 = realVec(%obj,"1 0 0");
|
||||
%nrm3 = realVec(%obj,"0 1 0");
|
||||
|
||||
// TODO - temporary - remove
|
||||
if ($TripWireFlareMode == true) {
|
||||
%pos = vectorAdd(%obj.getPosition(),vectorScale(%nrm,0.35));
|
||||
%vec = vectorScale(%nrm,0.7);
|
||||
%p = new FlareProjectile() {
|
||||
dataBlock = FlareGrenadeProj;
|
||||
initialDirection = %vec;
|
||||
initialPosition = %pos;
|
||||
sourceObject = %obj;
|
||||
sourceSlot = 0;
|
||||
};
|
||||
FlareSet.add(%p);
|
||||
MissionCleanup.add(%p);
|
||||
%p.schedule(6000,"delete");
|
||||
}
|
||||
|
||||
// save ourselves re-doing some calculations
|
||||
%mask = $TypeMasks::VehicleObjectType | $TypeMasks::StationObjectType | $TypeMasks::GeneratorObjectType | $TypeMasks::SensorObjectType | $TypeMasks::TurretObjectType | $TypeMasks::TerrainObjectType | $TypeMasks::InteriorObjectType | $TypeMasks::StaticObjectType | $TypeMasks::MoveableObjectType | $TypeMasks::DamagableItemObjectType;
|
||||
if (%obj.fieldMode == 1) {
|
||||
// new pad data can be done here for both field and trigger
|
||||
// "normal" (no hit) beamRange limited to 0.5m - 8m
|
||||
// max beamRange limited to 0.5m - 160m
|
||||
%pad = pad(%obj.getPosition() SPC realVec(%obj,"0 0 1") SPC realVec(%obj,"1 0 0"),0.5 SPC limit(%obj.beamRange,0.5,8) SPC limit(%obj.beamRange,0.5,160),"-0.5 -0.5 -0.5",%mask,%obj.tripField);
|
||||
%newScale = getWords(%pad,0,2);
|
||||
%newPos = getWords(%pad,3,5);
|
||||
%newRot = getWords(%pad,6,9);
|
||||
}
|
||||
else {
|
||||
// beam
|
||||
%dist = rayDist(vectorAdd(%pos,vectorScale(%nrm,0.1)) SPC %nrm,1 SPC %obj.beamRange SPC %obj.beamRange,%mask,%obj.tripField);
|
||||
}
|
||||
|
||||
if (isObject(%obj.tripField)) {
|
||||
%obj2 = %obj.tripField;
|
||||
if (%obj.fieldMode == 0) {
|
||||
%scale = %obj2.getScale();
|
||||
%newPos = vectorAdd(%pos,vectorAdd(vectorScale(%nrm2,-(getWord(%scale,0) / 2)),vectorScale(%nrm3,-(getWord(%scale,1) / 2))));
|
||||
%newRot = %obj.getRotation();
|
||||
%newScale = getWords(%scale,0,1) SPC %dist;
|
||||
}
|
||||
%oldData = %obj2.oldData;
|
||||
%newData = %newPos SPC %newRot SPC %newScale;
|
||||
if (%oldData !$= %newData && %obj.triggerCount == 0) {
|
||||
// call gainPower() before modifying forcefield!
|
||||
%obj2.getDataBlock().gainPower(%obj2);
|
||||
%obj2.setTransform(%newPos SPC %newRot);
|
||||
%obj2.setScale(%newScale);
|
||||
%obj2.oldData = %newData;
|
||||
cancel(%obj2.hideSched);
|
||||
%obj2.hideSched = %obj2.getDataBlock().schedule(2000,losePower,%obj2);
|
||||
}
|
||||
}
|
||||
if (isObject(%obj.tripTrigger)) {
|
||||
%obj2 = %obj.tripTrigger;
|
||||
if (%obj.fieldMode == 0) {
|
||||
%scale = %obj2.getScale();
|
||||
%newPos = vectorAdd(%pos,vectorAdd(vectorScale(%nrm2,-(getWord(%scale,0) / 2)),vectorScale(%nrm3,-(getWord(%scale,1) / 2))));
|
||||
%newRot = %obj.getRotation();
|
||||
%newScale = getWords(%scale,0,1) SPC %dist;
|
||||
}
|
||||
%oldData = %obj2.oldData;
|
||||
%newData = %newPos SPC %newRot SPC %newScale;
|
||||
if (%oldData !$= %newData && %obj.triggerCount == 0) {
|
||||
%obj2.setTransform(%newPos SPC %newRot);
|
||||
%obj2.setScale(%newScale);
|
||||
%obj2.oldData = %newData;
|
||||
}
|
||||
}
|
||||
%obj.adjustSched = schedule(1000,0,adjustTripwire,%obj);
|
||||
}
|
||||
|
||||
function TripwireDeployableImage::onMount(%data, %obj, %node) {
|
||||
%obj.hasTripwire = true; // set for tripcheck
|
||||
%obj.packSet = 2;
|
||||
%obj.expertSet = 0;
|
||||
displayPowerFreq(%obj);
|
||||
}
|
||||
|
||||
function TripwireDeployableImage::onUnmount(%data, %obj, %node) {
|
||||
%obj.packSet = 0;
|
||||
%obj.expertSet = 0;
|
||||
%obj.hasTripwire = "";
|
||||
}
|
||||
141
scripts/packs/turretpack.cs
Normal file
141
scripts/packs/turretpack.cs
Normal file
|
|
@ -0,0 +1,141 @@
|
|||
// turretpack.cs - turret pack
|
||||
//
|
||||
|
||||
datablock ShapeBaseImageData(TurretDeployableImage)
|
||||
{
|
||||
mass = 1;
|
||||
emap = true;
|
||||
|
||||
shapeFile = "stackable1s.dts";
|
||||
item = TurretBasePack;
|
||||
mountPoint = 1;
|
||||
offset = "0 -0.2 0";
|
||||
|
||||
minDeployDis = 0.5;
|
||||
maxDeployDis = 5.0;
|
||||
|
||||
deployed = TurretDeployedBase;
|
||||
heatSignature = 0;
|
||||
|
||||
stateName[0] = "Idle";
|
||||
stateTransitionOnTriggerDown[0] = "Activate";
|
||||
|
||||
|
||||
|
||||
stateName[1] = "Activate";
|
||||
stateScript[1] = "onActivate";
|
||||
stateTransitionOnTriggerUp[1] = "Idle";
|
||||
|
||||
isLarge = true;
|
||||
maxDepSlope = 360;
|
||||
deploySound = StationDeploySound;
|
||||
};
|
||||
|
||||
datablock ItemData(TurretBasePack)
|
||||
{
|
||||
className = Pack;
|
||||
catagory = "Deployables";
|
||||
shapeFile = "stackable1s.dts";
|
||||
mass = 1;
|
||||
elasticity = 0.2;
|
||||
friction = 0.6;
|
||||
pickupRadius = 1;
|
||||
rotate = false;
|
||||
image = "TurretDeployableImage";
|
||||
pickUpName = "a base turret pack";
|
||||
heatSignature = 0;
|
||||
|
||||
computeCRC = true;
|
||||
emap = true;
|
||||
|
||||
};
|
||||
|
||||
datablock TurretData(TurretDeployedBase) : TurretDamageProfile
|
||||
{
|
||||
className = DeployedTurret;
|
||||
shapeFile = "turret_base_large.dts";
|
||||
|
||||
rechargeRate = 0.31;
|
||||
|
||||
selfPower = true;
|
||||
|
||||
needsPower = true;
|
||||
mass = 1;
|
||||
maxDamage = 2.25;
|
||||
destroyedLevel = 2.25;
|
||||
disabledLevel = 1.35;
|
||||
repairRate = 0;
|
||||
explosion = TurretExplosion;
|
||||
expDmgRadius = 15.0;
|
||||
expDamage = 0.7;
|
||||
expImpulse = 2000.0;
|
||||
|
||||
deployedObject = true;
|
||||
|
||||
thetaMin = 15;
|
||||
thetaMax = 140;
|
||||
//thetaNull = 90;
|
||||
|
||||
isShielded = true;
|
||||
energyPerDamagePoint = 50;
|
||||
maxEnergy = 150;
|
||||
|
||||
humSound = SensorHumSound;
|
||||
heatSignature = 1;
|
||||
pausePowerThread = true;
|
||||
|
||||
canControl = true;
|
||||
cmdCategory = "DTactical";
|
||||
cmdIcon = CMDTurretIcon;
|
||||
cmdMiniIconName = "commander/MiniIcons/com_turret_grey";
|
||||
targetNameTag = 'Deployed Base';
|
||||
targetTypeTag = 'Turret';
|
||||
sensorData = TurretBaseSensorObj;
|
||||
sensorRadius = TurretBaseSensorObj.detectRadius;
|
||||
sensorColor = "0 212 45";
|
||||
|
||||
firstPersonOnly = true;
|
||||
|
||||
debrisShapeName = "debris_generic.dts";
|
||||
debris = TurretDebris;
|
||||
};
|
||||
|
||||
function TurretBasePack::onPickup(%this, %obj, %shape, %amount)
|
||||
{
|
||||
// created to prevent console errors
|
||||
}
|
||||
|
||||
function TurretDeployableImage::onDeploy(%item, %plyr, %slot)
|
||||
{
|
||||
%deplObj = Parent::onDeploy(%item, %plyr, %slot);
|
||||
%origBarrel = %item.item.origBarrel;
|
||||
if(%origBarrel !$= "")
|
||||
{
|
||||
%deplObj.mountImage(%origBarrel, 0, false);
|
||||
%item.item.origBarrel = "";
|
||||
}
|
||||
%playerVector = vectorNormalize(getWord(%plyr.getEyeVector(),1) SPC -1 * getWord(%plyr.getEyeVector(),0) SPC "0");
|
||||
|
||||
%item.surfacenrm = VectorNormalize(%item.surfacenrm);
|
||||
//echo(%playervector);
|
||||
if (vAbs(floorVec(%item.surfaceNrm,100)) $= "0 0 1")
|
||||
%item.surfaceNrm2 = vectorScale(%playerVector,1);
|
||||
else
|
||||
%item.surfaceNrm2 = vectorNormalize(vectorCross(%item.surfaceNrm,"0 0 1"));
|
||||
|
||||
%rot = fullRot(%item.surfaceNrm,%item.surfaceNrm2);
|
||||
|
||||
%deplObj.setTransform(%item.surfacePt SPC %rot);
|
||||
//%deplObj.setSelfPowered();
|
||||
//%deplObj.playThread($PowerThread,"Power");
|
||||
|
||||
addDSurface(%item.surface,%deplObj);
|
||||
addToDeployGroup(%deplObj);
|
||||
%deplObj.powerFreq = %plyr.powerFreq;
|
||||
%deplObj.team = %plyr.team;
|
||||
checkPowerObject(%deplObj);
|
||||
}
|
||||
|
||||
function TurretDeployableImage::onMount(%data, %obj, %node) {
|
||||
displayPowerFreq(%obj);
|
||||
}
|
||||
748
scripts/packs/vehiclepad.cs
Normal file
748
scripts/packs/vehiclepad.cs
Normal file
|
|
@ -0,0 +1,748 @@
|
|||
//======================================
|
||||
// made by dynablade
|
||||
//====================================== Deployable Vehicle Pad
|
||||
|
||||
|
||||
datablock StaticShapeData(DeployableVehicleStation) : StaticShapeDamageProfile
|
||||
{
|
||||
className = Station;
|
||||
catagory = "Stations";
|
||||
shapeFile = "Vehicle_pad_station.dts";
|
||||
maxDamage = 7.5;
|
||||
destroyedLevel = 7.5;
|
||||
disabledLevel = 7.5;
|
||||
explosion = ShapeExplosion;
|
||||
expDmgRadius = 10.0;
|
||||
expDamage = 0.4;
|
||||
expImpulse = 1500.0;
|
||||
dynamicType = $TypeMasks::StationObjectType;
|
||||
isShielded = true;
|
||||
energyPerDamagePoint = 500;
|
||||
maxEnergy = 250;
|
||||
rechargeRate = 0.31;
|
||||
humSound = StationVehicleHumSound;
|
||||
|
||||
cmdCategory = "Support";
|
||||
cmdIcon = CMDVehicleStationIcon;
|
||||
cmdMiniIconName = "commander/MiniIcons/com_vehicle_pad_inventory";
|
||||
targetTypeTag = 'Deployable Vehicle Station';
|
||||
|
||||
debrisShapeName = "debris_generic.dts";
|
||||
debris = StationDebris;
|
||||
needsPower = true;
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployableVehiclePad)
|
||||
{
|
||||
className = vpad;
|
||||
catagory = "Stations";
|
||||
shapeFile = "Vehicle_pad.dts";
|
||||
maxDamage = 7.5;
|
||||
destroyedLevel = 7.5;
|
||||
disabledLevel = 7.5;
|
||||
explosion = ShapeExplosion;
|
||||
expDmgRadius = 10.0;
|
||||
expDamage = 0.4;
|
||||
expImpulse = 1500.0;
|
||||
rechargeRate = 0.05;
|
||||
targetTypeTag = 'Deployable Vehicle Station';
|
||||
needsPower = true;
|
||||
};
|
||||
|
||||
datablock StaticShapeData(DeployableVehiclePad2) : DeployableVehiclePad
|
||||
{
|
||||
className = vpad;
|
||||
shapeFile = "station_teleport.dts";
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
datablock StaticShapeData(DeployableVehiclePadBottom) : StaticShapeDamageProfile {
|
||||
className = "floor";
|
||||
shapeFile = "bmiscf.dts";
|
||||
|
||||
maxDamage = 4;
|
||||
destroyedLevel = 4;
|
||||
disabledLevel = 3.5;
|
||||
|
||||
isShielded = true;
|
||||
energyPerDamagePoint = 30;
|
||||
maxEnergy = 200;
|
||||
rechargeRate = 0.25;
|
||||
|
||||
explosion = HandGrenadeExplosion;
|
||||
expDmgRadius = 3.0;
|
||||
expDamage = 0.1;
|
||||
expImpulse = 200.0;
|
||||
|
||||
dynamicType = $TypeMasks::StaticShapeObjectType;
|
||||
deployedObject = true;
|
||||
cmdCategory = "DSupport";
|
||||
cmdIcon = CMDSensorIcon;
|
||||
cmdMiniIconName = "commander/MiniIcons/com_deploymotionsensor";
|
||||
targetNameTag = 'Medium Blast floor';
|
||||
deployAmbientThread = true;
|
||||
debrisShapeName = "debris_generic_small.dts";
|
||||
debris = DeployableDebris;
|
||||
heatSignature = 0;
|
||||
needsPower = true;
|
||||
};
|
||||
|
||||
datablock StaticShapeData(PotPipe) : DeployableVehiclePadBottom
|
||||
{
|
||||
shapeFile = "silver_pole.dts";
|
||||
targetNameTag = 'Pot Powered';
|
||||
targetTypeTag = 'Alloy forge';
|
||||
};
|
||||
|
||||
datablock ParticleData(DVPADP)
|
||||
{
|
||||
dragCoeffiecient = 0.0;
|
||||
gravityCoefficient = 0.0;
|
||||
inheritedVelFactor = 0.0;
|
||||
|
||||
lifetimeMS = 1500;
|
||||
lifetimeVarianceMS = 0;
|
||||
|
||||
spinRandomMin = 30.0;
|
||||
spinRandomMax = 30.0;
|
||||
windcoefficient = 0;
|
||||
textureName = "skins/jetflare03";
|
||||
|
||||
colors[0] = "0.3 0.3 1.0 0.1";
|
||||
colors[1] = "0.3 0.3 1.0 1";
|
||||
colors[2] = "0.3 0.3 1.0 1";
|
||||
colors[3] = "0.3 0.3 1.0 0.1";
|
||||
|
||||
sizes[0] = 5;
|
||||
sizes[1] = 5;
|
||||
sizes[2] = 5;
|
||||
sizes[3] = 5;
|
||||
|
||||
times[0] = 0.25;
|
||||
times[1] = 0.5;
|
||||
times[2] = 0.75;
|
||||
times[3] = 1;
|
||||
|
||||
};
|
||||
|
||||
datablock ParticleEmitterData(DVPADE)
|
||||
{
|
||||
lifetimeMS = 10;
|
||||
ejectionPeriodMS = 10;
|
||||
periodVarianceMS = 0;
|
||||
|
||||
ejectionVelocity = 0.01;
|
||||
velocityVariance = 0.0;
|
||||
ejectionoffset = 8;
|
||||
thetaMin = 80.0;
|
||||
thetaMax = 100.0;
|
||||
|
||||
phiReferenceVel = "180";
|
||||
phiVariance = "5";
|
||||
orientParticles = false;
|
||||
orientOnVelocity = false;
|
||||
|
||||
particles = "DVPADP";
|
||||
};
|
||||
|
||||
datablock ParticleData(SIGMAP)
|
||||
{
|
||||
dragCoeffiecient = 0.0;
|
||||
gravityCoefficient = -0.5;
|
||||
inheritedVelFactor = 0.0;
|
||||
|
||||
lifetimeMS = 1500;
|
||||
lifetimeVarianceMS = 1000;
|
||||
|
||||
spinRandomMin = -30.0;
|
||||
spinRandomMax = 30.0;
|
||||
windcoefficient = 0;
|
||||
textureName = "skins/jetflare03";
|
||||
|
||||
colors[0] = "1 1 0 0"; //Wacky collors :P
|
||||
colors[1] = "0 1 1 1";
|
||||
colors[2] = "1 0 1 1";
|
||||
colors[3] = "0 1 0 1";
|
||||
|
||||
sizes[0] = 5;
|
||||
sizes[1] = 5;
|
||||
sizes[2] = 5;
|
||||
sizes[3] = 5;
|
||||
|
||||
times[0] = 0.5;
|
||||
times[1] = 0.6;
|
||||
times[2] = 0.8;
|
||||
times[3] = 1;
|
||||
|
||||
};
|
||||
|
||||
datablock ParticleEmitterData(SIGMAE)
|
||||
{
|
||||
lifetimeMS = 10;
|
||||
ejectionPeriodMS = 50;
|
||||
periodVarianceMS = 0;
|
||||
|
||||
ejectionVelocity = 1.0;
|
||||
velocityVariance = 0.5;
|
||||
ejectionoffset = 0.5;
|
||||
thetaMin = 80.0;
|
||||
thetaMax = 100.0;
|
||||
|
||||
phiReferenceVel = "0";
|
||||
phiVariance = "360";
|
||||
orientParticles = false;
|
||||
orientOnVelocity = false;
|
||||
|
||||
particles = "SIGMAP";
|
||||
};
|
||||
|
||||
|
||||
function DeployableVehicleStation::onAdd(%this, %obj)
|
||||
{
|
||||
Parent::onAdd(%this, %obj);
|
||||
|
||||
%obj.setRechargeRate(%obj.getDatablock().rechargeRate);
|
||||
%trigger = new Trigger()
|
||||
{
|
||||
dataBlock = stationTrigger;
|
||||
polyhedron = "-0.75 0.75 0.0 1.5 0.0 0.0 0.0 -1.5 0.0 0.0 0.0 2.0";
|
||||
};
|
||||
MissionCleanup.add(%trigger);
|
||||
%trigger.setTransform(%obj.getTransform());
|
||||
%trigger.station = %obj;
|
||||
%obj.trigger = %trigger;
|
||||
}
|
||||
|
||||
function DeployableVehicleStation::stationReady(%data, %obj)
|
||||
{
|
||||
// Make sure none of the other popup huds are active:
|
||||
messageClient( %obj.triggeredBy.client, 'CloseHud', "", 'scoreScreen' );
|
||||
messageClient( %obj.triggeredBy.client, 'CloseHud', "", 'inventoryScreen' );
|
||||
|
||||
//Display the Vehicle Station GUI
|
||||
commandToClient(%obj.triggeredBy.client, 'StationVehicleShowHud');
|
||||
}
|
||||
|
||||
function DeployableVehicleStation::stationFinished(%data, %obj)
|
||||
{
|
||||
//Hide the Vehicle Station GUI
|
||||
commandToClient(%obj.triggeredBy.client, 'StationVehicleHideHud');
|
||||
}
|
||||
|
||||
function DeployableVehicleStation::getSound(%data, %forward)
|
||||
{
|
||||
if(%forward)
|
||||
return "StationVehicleAcitvateSound";
|
||||
else
|
||||
return "StationVehicleDeactivateSound";
|
||||
}
|
||||
|
||||
function DeployableVehicleStation::setPlayersPosition(%data, %obj, %trigger, %colObj)
|
||||
{
|
||||
%vel = getWords(%colObj.getVelocity(), 0, 1) @ " 0";
|
||||
if((VectorLen(%vel) < 22) && (%obj.triggeredBy != %colObj))
|
||||
{
|
||||
%posXY = getWords(%trigger.getTransform(),0 ,1);
|
||||
%posZ = getWord(%trigger.getTransform(), 2);
|
||||
%rotZ = getWord(%obj.getTransform(), 5);
|
||||
%angle = getWord(%obj.getTransform(), 6);
|
||||
%angle += 3.141592654;
|
||||
if(%angle > 6.283185308)
|
||||
%angle = %angle - 6.283185308;
|
||||
%colObj.setvelocity("0 0 0");
|
||||
%colObj.setTransform(%posXY @ " " @ %posZ + 0.2 @ " " @ "0 0 " @ %rotZ @ " " @ %angle );//center player on object
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
function DeployableVehiclePad::onAdd(%this, %obj)
|
||||
{
|
||||
Parent::onAdd(%this, %obj);
|
||||
|
||||
%obj.ready = true;
|
||||
%obj.setRechargeRate(%obj.getDatablock().rechargeRate);
|
||||
}
|
||||
|
||||
function DeployableVehiclePad2::onAdd(%this, %obj)
|
||||
{
|
||||
Parent::onAdd(%this, %obj);
|
||||
|
||||
%obj.ready = true;
|
||||
%obj.setRechargeRate(%obj.getDatablock().rechargeRate);
|
||||
}
|
||||
|
||||
|
||||
function GiveStation(%obj,%transform)
|
||||
{
|
||||
%pos = getWords(%transform,0,2);
|
||||
%rot = getWords(%transform,3,5) SPC (getWord(%transform,6)/3.14*180);
|
||||
%sv = new StaticShape()
|
||||
{
|
||||
scale = "1 1 1";
|
||||
dataBlock = DeployableVehicleStation;
|
||||
lockCount = "0";
|
||||
homingCount = "0";
|
||||
team = %obj.team;
|
||||
position = %pos;
|
||||
rotation = %rot;
|
||||
};
|
||||
|
||||
%sv.setTransform(%transform);
|
||||
%sv.powerFreq = %obj.powerFreq;
|
||||
MissionCleanup.add(%sv);
|
||||
//%sv.getDataBlock().gainPower(%sv);
|
||||
//%obj.getDatablock().gainPower(%obj);
|
||||
checkPowerObject(%obj);
|
||||
checkPowerObject(%sv);
|
||||
%sv.pad = %obj;
|
||||
%obj.station = %sv;
|
||||
%sv.trigger.mainObj = %obj;
|
||||
%sv.trigger.disableObj = %sv;
|
||||
adjustTrigger(%sv);
|
||||
|
||||
//Remove unwanted vehicles
|
||||
removetheVehStuff(%sv, %obj);
|
||||
|
||||
return %sv;
|
||||
}
|
||||
|
||||
function DeployableVehiclePad::onEndSequence(%data, %obj, %thread)
|
||||
{
|
||||
if(%thread == $ActivateThread)
|
||||
{
|
||||
%obj.ready = true;
|
||||
%obj.stopThread($ActivateThread);
|
||||
}
|
||||
Parent::onEndSequence(%data, %obj, %thread);
|
||||
}
|
||||
|
||||
function DeployableVehiclePad2::onEndSequence(%data, %obj, %thread)
|
||||
{
|
||||
if(%thread == $ActivateThread)
|
||||
{
|
||||
%obj.ready = true;
|
||||
%obj.stopThread($ActivateThread);
|
||||
}
|
||||
Parent::onEndSequence(%data, %obj, %thread);
|
||||
}
|
||||
|
||||
function DeployableVehiclePad::gainPower(%data, %obj)
|
||||
{
|
||||
if (isObject(%obj.station))
|
||||
%obj.station.setSelfPowered();
|
||||
Parent::gainPower(%data, %obj);
|
||||
}
|
||||
|
||||
function DeployableVehiclePad2::gainPower(%data, %obj)
|
||||
{
|
||||
if (isObject(%obj.station))
|
||||
%obj.station.setSelfPowered();
|
||||
Parent::gainPower(%data, %obj);
|
||||
}
|
||||
|
||||
function DeployableVehiclePad::losePower(%data, %obj)
|
||||
{
|
||||
if (isObject(%obj.station))
|
||||
%obj.station.clearSelfPowered();
|
||||
Parent::losePower(%data, %obj);
|
||||
}
|
||||
|
||||
function DeployableVehiclePad2::losePower(%data, %obj)
|
||||
{
|
||||
if (isObject(%obj.station))
|
||||
%obj.station.clearSelfPowered();
|
||||
Parent::losePower(%data, %obj);
|
||||
}
|
||||
|
||||
function DeployableVehiclePad::onDestroyed(%this, %obj, %prevState)
|
||||
{
|
||||
if (isObject(%obj))
|
||||
disassembleVehilcepad(%obj,%plyr);
|
||||
Parent::onDestroyed(%this, %obj, %prevState);
|
||||
$TeamDeployedCount[%obj.team, VehiclePadPack]--;
|
||||
%obj.schedule(500, "delete");
|
||||
%obj.station.schedule(500, "delete");
|
||||
%obj.back.schedule(500,"delete");
|
||||
}
|
||||
|
||||
function DeployableVehiclePad2::onDestroyed(%this, %obj, %prevState)
|
||||
{
|
||||
if (isObject(%obj))
|
||||
disassembleVehilcepad(%obj,%plyr);
|
||||
Parent::onDestroyed(%this, %obj, %prevState);
|
||||
$TeamDeployedCount[%obj.team, VehiclePadPack]--;
|
||||
%obj.schedule(500, "delete");
|
||||
%obj.station.schedule(500, "delete");
|
||||
%obj.back.schedule(500,"delete");
|
||||
}
|
||||
|
||||
|
||||
|
||||
function DeployableVehicleStation::onDestroyed(%this, %obj, %prevState)
|
||||
{
|
||||
if (isObject(%obj.pad))
|
||||
disassembleVehilcepad(%obj.pad,%plyr);
|
||||
Parent::onDestroyed(%this, %obj, %prevState);
|
||||
$TeamDeployedCount[%obj.team, VehiclePadPack]--;
|
||||
%obj.schedule(500, "delete");
|
||||
%obj.station.schedule(500, "delete");
|
||||
%obj.back.schedule(500,"delete");
|
||||
}
|
||||
|
||||
function DeployableVehiclePadBottom::onDestroyed(%this, %obj, %prevState)
|
||||
{
|
||||
if (isObject(%obj.station))
|
||||
disassembleVehilcepad(%obj.station,%plyr);
|
||||
Parent::onDestroyed(%this, %obj, %prevState);
|
||||
$TeamDeployedCount[%obj.team, VehiclePadPack]--;
|
||||
%obj.schedule(500, "delete");
|
||||
%obj.station.schedule(500, "delete");
|
||||
%obj.back.schedule(500,"delete");
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
datablock ShapeBaseImageData(VehiclePadPackImage)
|
||||
{
|
||||
mass = 1;
|
||||
emap = true;
|
||||
|
||||
shapeFile = "pack_deploy_inventory.dts";
|
||||
item = VehiclePadPack;
|
||||
mountPoint = 1;
|
||||
offset = "0 0 0";
|
||||
heatSignature = 0;
|
||||
deployed = DeployableVehiclePad;
|
||||
|
||||
stateName[0] = "Idle";
|
||||
stateTransitionOnTriggerDown[0] = "Activate";
|
||||
|
||||
stateName[1] = "Activate";
|
||||
stateScript[1] = "onActivate";
|
||||
stateTransitionOnTriggerUp[1] = "Idle";
|
||||
|
||||
maxDepSlope = 360;
|
||||
deploySound = StationDeploySound;
|
||||
|
||||
minDeployDis = 0;
|
||||
maxDeployDis = 50.0; //meters from body
|
||||
|
||||
};
|
||||
|
||||
datablock ItemData(VehiclePadPack)
|
||||
{
|
||||
className = Pack;
|
||||
catagory = "Deployables";
|
||||
shapeFile = "pack_deploy_inventory.dts";
|
||||
mass = 1;
|
||||
elasticity = 0.2;
|
||||
friction = 0.6;
|
||||
pickupRadius = 1;
|
||||
rotate = false;
|
||||
image = "VehiclePadPackImage";
|
||||
pickUpName = "a deployable vehicle pad";
|
||||
heatSignature = 0;
|
||||
|
||||
emap = true;
|
||||
};
|
||||
|
||||
function VehiclePadPackImage::onMount(%this, %obj, %slot)
|
||||
{
|
||||
%this.imagemount = %obj;
|
||||
%obj.hasVehiclepad = 1;
|
||||
}
|
||||
|
||||
function VehiclePadPackImage::onUnmount(%data,%obj,%node)
|
||||
{
|
||||
%obj.hasVehiclepad = "";
|
||||
}
|
||||
|
||||
function VehiclePadPack::onPickup(%this, %pack, %player, %amount)
|
||||
{
|
||||
%player.packcharge = %pack.charge;
|
||||
%player.lastvpad = %pack.vpad;
|
||||
}
|
||||
|
||||
|
||||
function VehiclePadPack::onThrow(%this,%pack,%player)
|
||||
{
|
||||
%this.charge = %player.packcharge;
|
||||
%this.vpad = %player.lastvpad;
|
||||
%player.packcharge = "";
|
||||
%player.lastvpad = "";
|
||||
serverPlay3D(ItemThrowSound, %player.getTransform());
|
||||
%pack.schedulePop();
|
||||
}
|
||||
|
||||
|
||||
|
||||
function VehiclePadPackImage::onDeploy(%item, %plyr, %slot)
|
||||
{
|
||||
if (IsObject(%plyr.lastvpad) && IsObject(%plyr.lastvpad.station))
|
||||
%plyr.packcharge = 0;
|
||||
if (IsObject(%plyr.lastvpad) && !IsObject(%plyr.lastvpad.station))
|
||||
%plyr.packcharge = 1;
|
||||
if (!IsObject(%plyr.lastvpad))
|
||||
%plyr.packcharge = 0;
|
||||
|
||||
|
||||
// take the deployable off the player's back and out of inventory
|
||||
if (%plyr.packcharge == 1)
|
||||
{
|
||||
//%plyr.unmountImage(%slot);
|
||||
//%plyr.decInventory(%item.item, 1);
|
||||
$TeamDeployedCount[%plyr.team, %item.item]++;
|
||||
%playerVector = vectorNormalize(-1 * getWord(%plyr.getEyeVector(),1) SPC getWord(%plyr.getEyeVector(),0) SPC "0");
|
||||
if (vAbs(floorVec(%item.surfaceNrm,100)) $= "0 0 1")
|
||||
%item.surfaceNrm2 = vectorScale(%playerVector,1);
|
||||
else
|
||||
%item.surfaceNrm2 = vectorNormalize(vectorCross(%item.surfaceNrm,"0 0 -1"));
|
||||
|
||||
%rot = fullRot(%item.surfaceNrm,%item.surfaceNrm2);
|
||||
%vpad = %plyr.lastvpad;
|
||||
%deplObj = GiveStation(%vpad,%item.surfacePt SPC %rot);
|
||||
%deplObj.deploy();
|
||||
addDSurface(%item.surface,%deplObj);
|
||||
%deplObj.setOwner(%plyr);
|
||||
%plyr.packcharge = "";
|
||||
%plyr.lastvpad = "";
|
||||
%vpad.isRemoved = 0;
|
||||
%vpad.back.isRemoved = 0;
|
||||
if (%vpad.style ==2)
|
||||
{
|
||||
%deplObj.emitter = CreateEmitter(%item.surfacePt,SIGMAE);
|
||||
%deplObj.emitter.setRotation(%deplObj.getRotation());
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
%dist = VectorSub(%item.surfacept,%plyr.getTransform());
|
||||
%nrm = VirVec(%item.surface,%item.surfacenrm);
|
||||
%img = VirVec(%item.surface,VectorNormalize(VectorCross(VectorCross(%item.surfacenrm,%dist),%item.surfacenrm)));
|
||||
%item.surfacenrm2 = realvec(%item.surface,VectorCross(%nrm,topvec(%img)));
|
||||
// create the actual deployable
|
||||
%rot = %item.getInitialRotation(%plyr);
|
||||
|
||||
if (%plyr.packset == 1)
|
||||
%block = DeployableVehiclePad2;
|
||||
else
|
||||
%block = DeployableVehiclePad;
|
||||
|
||||
%deplObj = new StaticShape()
|
||||
{
|
||||
dataBlock = %block;
|
||||
};
|
||||
%back = new StaticShape()
|
||||
{
|
||||
dataBlock = DeployableVehiclePadBottom;
|
||||
};
|
||||
%back.needsfit = 1;
|
||||
%deplObj.needsfit = 1;
|
||||
%deplObj.style = %plyr.packset;
|
||||
%pos = getWords(%item.surface.getEdge(%nrm),0,2);
|
||||
%deplObj.setTransform(%pos SPC fullrot(%item.surfacenrm,%item.surfacenrm2));
|
||||
if (VectorDot(vAbs(VectorNormalize(topvec(%img))),%item.surface.getRealSize())== %item.surfacesizex)
|
||||
{
|
||||
%x= %item.surfacesizex;
|
||||
%y= %item.surfacesizey;
|
||||
%item.surfacesizex = %y;
|
||||
%item.surfacesizey = %x;
|
||||
}
|
||||
%deplObj.setRealSize(%item.surfacesizex SPC %item.surfacesizey SPC "1.5");
|
||||
%back.setTransform(%pos SPC fullrot(%item.surfacenrm,%item.surfacenrm2));
|
||||
%back.setRealSize(VectorMultiply(%deplObj.getRealSize(),"1 1 0.1"));
|
||||
if (%plyr.packset == 2)
|
||||
{
|
||||
%back.potpipes();
|
||||
}
|
||||
// %deplObj.setTransform(modifyTransform(%pos SPC %rot, "0 0 -1 0 0 0 0"));
|
||||
%deplObj.back = %back;
|
||||
%back.station = %deplObj;
|
||||
// set the recharge rate right away
|
||||
if(%deplObj.getDatablock().rechargeRate)
|
||||
%deplObj.setRechargeRate(%deplObj.getDatablock().rechargeRate);
|
||||
|
||||
// set team, owner, and handle
|
||||
%deplObj.team = %plyr.client.Team;
|
||||
%back.team = %plyr.client.Team;
|
||||
%deplObj.setOwner(%plyr);
|
||||
%back.setOwner(%plyr);
|
||||
|
||||
// set the sensor group if it needs one
|
||||
if(%deplObj.getTarget() != -1)
|
||||
setTargetSensorGroup(%deplObj.getTarget(), %plyr.client.team);
|
||||
|
||||
// place the deployable in the MissionCleanup/Deployables group (AI reasons)
|
||||
addToDeployGroup(%deplObj);
|
||||
addToDeployGroup(%deplObj.back);
|
||||
|
||||
//let the AI know as well...
|
||||
AIDeployObject(%plyr.client, %deplObj);
|
||||
|
||||
// play the deploy sound
|
||||
serverPlay3D(%item.deploySound, %deplObj.getTransform());
|
||||
|
||||
// increment the team count for this deployed object
|
||||
%deplObj.getDatablock().onAdd(%deplObj);
|
||||
%deplObj.deploy();
|
||||
//%deplObj.setSelfPowered();
|
||||
%plyr.packcharge++;
|
||||
%plyr.lastvpad = %deplObj;
|
||||
%deplObj.powerFreq = %plyr.powerFreq;
|
||||
%back.powerFreq = %plyr.powerFreq;
|
||||
checkPowerObject(%deplobj);
|
||||
checkPowerObject(%back);
|
||||
%deplObj.isRemoved = 1;
|
||||
%back.isRemoved = 1;
|
||||
schedule(6000,0,"FadePad",%deplObj,%plyr);
|
||||
addDSurface(%item.surface,%deplObj);
|
||||
addDSurface(%item.surface,%back);
|
||||
}
|
||||
}
|
||||
|
||||
function FadePad(%obj,%plyr)
|
||||
{
|
||||
if (!Isobject(%obj.station))
|
||||
{
|
||||
schedule(100,%obj,"disassembleVehilcepad",%obj,%plyr);
|
||||
}
|
||||
}
|
||||
|
||||
function GameBase::PotPipes(%obj)
|
||||
{
|
||||
%obj.pipe1 = new StaticShape()
|
||||
{
|
||||
dataBlock = PotPipe;
|
||||
scale = "0.5 0.5 0.5";
|
||||
};
|
||||
%obj.pipe2 = new StaticShape()
|
||||
{
|
||||
dataBlock = PotPipe;
|
||||
scale = "0.5 0.5 0.5";
|
||||
};
|
||||
%obj.pipe3 = new StaticShape()
|
||||
{
|
||||
dataBlock = PotPipe;
|
||||
scale = "0.5 0.5 0.5";
|
||||
};
|
||||
%obj.pipe4 = new StaticShape()
|
||||
{
|
||||
dataBlock = PotPipe;
|
||||
scale = "0.5 0.5 0.5";
|
||||
};
|
||||
%obj.pipe1.setTransform(%obj.getEdge("0.9 0.9 1") SPC %obj.getRotation());
|
||||
%obj.pipe2.setTransform(%obj.getEdge("0.9 -0.9 1")SPC %obj.getRotation());
|
||||
%obj.pipe3.setTransform(%obj.getEdge("-0.9 -0.9 1")SPC %obj.getRotation());
|
||||
%obj.pipe4.setTransform(%obj.getEdge("-0.9 0.9 1")SPC %obj.getRotation());
|
||||
%obj.pipe1.emitter = CreateEmitter(%obj.pipe1.getEdge("0 0 1"),HeavyDamageSmoke);
|
||||
%obj.pipe2.emitter = CreateEmitter(%obj.pipe2.getEdge("0 0 1"),HeavyDamageSmoke);
|
||||
%obj.pipe3.emitter = CreateEmitter(%obj.pipe3.getEdge("0 0 1"),HeavyDamageSmoke);
|
||||
%obj.pipe4.emitter = CreateEmitter(%obj.pipe4.getEdge("0 0 1"),HeavyDamageSmoke);
|
||||
addToDeployGroup(%obj.pipe1);
|
||||
addToDeployGroup(%obj.pipe2);
|
||||
addToDeployGroup(%obj.pipe3);
|
||||
addToDeployGroup(%obj.pipe4);
|
||||
}
|
||||
|
||||
function GameBase::RemPotPipes(%obj)
|
||||
{
|
||||
if (IsObject(%obj.pipe1))
|
||||
{
|
||||
%obj.pipe1.emitter.delete();
|
||||
%obj.pipe1.delete();
|
||||
}
|
||||
if (IsObject(%obj.pipe2))
|
||||
{
|
||||
%obj.pipe2.emitter.delete();
|
||||
%obj.pipe2.delete();
|
||||
}
|
||||
if (IsObject(%obj.pipe3))
|
||||
{
|
||||
%obj.pipe3.emitter.delete();
|
||||
%obj.pipe3.delete();
|
||||
}
|
||||
if (IsObject(%obj.pipe4))
|
||||
{
|
||||
%obj.pipe4.emitter.delete();
|
||||
%obj.pipe4.delete();
|
||||
}
|
||||
}
|
||||
|
||||
function VehiclePadPackImage::testSurfaceTooNarrow(%item,%surface)
|
||||
{
|
||||
%nrm = getWords(%item.surface,4,6);
|
||||
%mask = invFace(%nrm);
|
||||
%narrower = vectorMultiply(%mask,%item.surface.getRealSize());
|
||||
%fx = vectorNormalize(topVec(%narrower));
|
||||
%fy = VectorCross(%nrm,%fx);
|
||||
%sx = VectorLen(VectorMultiply(%fx,%item.surface.getRealSize()));
|
||||
%sy = VectorLen(VectorMultiply(%fy,%item.surface.getRealSize()));
|
||||
|
||||
if (%sx < 17 || %sy < 17 || %sx < %sy*0.5 || %sy < %sx*0.5)
|
||||
{
|
||||
return !%item.imagemount.packcharge;
|
||||
}
|
||||
else
|
||||
{
|
||||
%item.surfacesizex = %sx;
|
||||
%item.surfacesizey = %sy;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
function VehiclePadPackImage::testNoInteriorFound(%item,%surface)
|
||||
{
|
||||
return !IsCubic(%item.surface) && !%item.imagemount.packcharge;
|
||||
}
|
||||
|
||||
function DeployableVehiclePad::disassemble(%data,%plyr,%obj)
|
||||
{
|
||||
if (isObject(%obj))
|
||||
disassembleVehilcepad(%obj,%plyr);
|
||||
disassemble(%data,%plyr,%obj);
|
||||
}
|
||||
|
||||
function DeployableVehiclePad2::disassemble(%data,%plyr,%obj)
|
||||
{
|
||||
if (isObject(%obj))
|
||||
disassembleVehilcepad(%obj,%plyr);
|
||||
disassemble(%data,%plyr,%obj);
|
||||
}
|
||||
|
||||
function DeployableVehicleStation::disassemble(%data,%plyr,%obj)
|
||||
{
|
||||
if (isObject(%obj.pad))
|
||||
disassembleVehilcepad(%obj.pad,%plyr);
|
||||
disassemble(%data,%plyr,%obj);
|
||||
}
|
||||
|
||||
function DeployableVehiclePadBottom::disassemble(%data,%plyr,%obj)
|
||||
{
|
||||
if (isObject(%obj.station))
|
||||
disassembleVehilcepad(%obj.station,%plyr);
|
||||
disassemble(%data,%plyr,%obj);
|
||||
}
|
||||
|
||||
function PotPipe::disassemble(%data,%plyr,%obj)
|
||||
{
|
||||
if (%obj.emitter)
|
||||
%obj.emitter.delete();
|
||||
disassemble(%data,%plyr,%obj);
|
||||
}
|
||||
|
||||
function disassembleVehilcepad(%station,%plyr)
|
||||
{
|
||||
%station.back.rempotpipes();
|
||||
if (%station.station.emitter)
|
||||
%station.station.emitter.delete();
|
||||
if (isObject(%station.station))
|
||||
disassemble("",%plyr,%station.station);
|
||||
|
||||
if (isObject(%station.back))
|
||||
disassemble("",%plyr,%station.back);
|
||||
disassemble("",%plyr,%station);
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue