Initial Commit

This commit is contained in:
Robert Fritzen 2014-02-26 13:54:04 -06:00
commit bd51490b14
316 changed files with 150033 additions and 0 deletions

259
scripts/packs/CardPack.cs Normal file
View 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

File diff suppressed because it is too large Load diff

396
scripts/packs/Medpack.cs Normal file
View 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
View 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
View 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
View 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
View 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
View 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
View 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);
}

View 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));
}

View 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
View 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);
}
}
}
}

View 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);
}

View 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
View 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 = "";
}

View 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
View 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;
}

View 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);
}

View 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
View 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;
}

View 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;
}

View 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
View 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;
}

View 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
View 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
}

View 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
View 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 = "";
}

View 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
View 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
View 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;
}

View 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
View 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
View 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
View 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
View 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);
}