TribesReplay/base/scripts/station.cs
2017-07-17 22:55:25 -04:00

1273 lines
43 KiB
C#

//******************************************************************************
//* Station - Data Blocks *
//******************************************************************************
datablock EffectProfile(StationInventoryActivateEffect)
{
effectname = "powered/inv_pad_on";
minDistance = 5.0;
};
datablock EffectProfile(StationVehicleAcitvateEffect)
{
effectname = "powered/vehicle_screen_on2";
minDistance = 3.0;
};
datablock EffectProfile(StationVehicleDeactivateEffect)
{
effectname = "powered/vehicle_screen_off";
minDistance = 3.0;
};
datablock AudioProfile(StationInventoryActivateSound)
{
filename = "fx/powered/inv_pad_on.wav";
description = AudioClose3d;
preload = true;
effect = StationInventoryActivateEffect;
};
datablock AudioProfile(MobileBaseInventoryActivateSound)
{
filename = "fx/vehicles/mpb_inv_station.wav";
description = AudioClose3d;
preload = true;
};
datablock AudioProfile(DepInvActivateSound)
{
filename = "fx/powered/dep_inv_station.wav";
description = AudioClose3d;
preload = true;
};
datablock AudioProfile(StationVehicleAcitvateSound)
{
filename = "fx/powered/vehicle_screen_on2.wav";
description = AudioClosest3d;
preload = true;
effect = StationVehicleAcitvateEffect;
};
datablock AudioProfile(StationVehicleDeactivateSound)
{
filename = "fx/powered/vehicle_screen_off.wav";
description = AudioClose3d;
preload = true;
effect = StationVehicleDeactivateEffect;
};
datablock AudioProfile(StationAccessDeniedSound)
{
filename = "fx/powered/station_denied.wav";
description = AudioClosest3d;
preload = true;
};
datablock AudioProfile(StationVehicleHumSound)
{
filename = "fx/powered/station_hum.wav";
description = CloseLooping3d;
preload = true;
};
datablock AudioProfile(StationInventoryHumSound)
{
filename = "fx/powered/station_hum.wav";
description = CloseLooping3d;
preload = true;
};
datablock StationFXPersonalData( PersonalInvFX )
{
delay = 0;
fadeDelay = 0.5;
lifetime = 1.2;
height = 2.5;
numArcSegments = 10.0;
numDegrees = 180.0;
trailFadeTime = 0.5;
leftRadius = 1.85;
rightRadius = 1.85;
leftNodeName = "FX1";
rightNodeName = "FX2";
texture[0] = "special/stationLight";
};
datablock DebrisData( StationDebris )
{
explodeOnMaxBounce = false;
elasticity = 0.40;
friction = 0.5;
lifetime = 17.0;
lifetimeVariance = 0.0;
minSpinSpeed = 60;
maxSpinSpeed = 600;
numBounces = 10;
bounceVariance = 0;
staticOnMaxBounce = true;
useRadiusMass = true;
baseRadius = 0.4;
velocity = 9.0;
velocityVariance = 4.5;
};
datablock StaticShapeData(StationInventory) : StaticShapeDamageProfile
{
className = Station;
catagory = "Stations";
shapeFile = "station_inv_human.dts";
maxDamage = 1.00;
destroyedLevel = 1.00;
disabledLevel = 0.70;
explosion = ShapeExplosion;
expDmgRadius = 8.0;
expDamage = 0.4;
expImpulse = 1500.0;
// don't allow this object to be damaged in non-team-based
// mission types (DM, Rabbit, Bounty, Hunters)
noIndividualDamage = true;
dynamicType = $TypeMasks::StationObjectType;
isShielded = true;
energyPerDamagePoint = 75;
maxEnergy = 50;
rechargeRate = 0.35;
doesRepair = true;
humSound = StationInventoryHumSound;
cmdCategory = "Support";
cmdIcon = CMDStationIcon;
cmdMiniIconName = "commander/MiniIcons/com_inventory_grey";
targetNameTag = 'Inventory';
targetTypeTag = 'Station';
debrisShapeName = "debris_generic.dts";
debris = StationDebris;
};
datablock StaticShapeData(StationVehicle) : StaticShapeDamageProfile
{
className = Station;
catagory = "Stations";
shapeFile = "vehicle_pad_station.dts";
maxDamage = 1.20;
destroyedLevel = 1.20;
disabledLevel = 0.84;
explosion = ShapeExplosion;
expDmgRadius = 10.0;
expDamage = 0.4;
expImpulse = 1500.0;
dynamicType = $TypeMasks::StationObjectType;
isShielded = true;
energyPerDamagePoint = 33;
maxEnergy = 250;
rechargeRate = 0.31;
humSound = StationVehicleHumSound;
// don't let these be damaged in Siege missions
noDamageInSiege = true;
cmdCategory = "Support";
cmdIcon = CMDVehicleStationIcon;
cmdMiniIconName = "commander/MiniIcons/com_vehicle_pad_inventory";
targetTypeTag = 'Vehicle Station';
debrisShapeName = "debris_generic.dts";
debris = StationDebris;
};
datablock StaticShapeData(StationVehiclePad)
{
className = Station;
catagory = "Stations";
shapeFile = "vehicle_pad.dts";
isInvincible = true;
dynamicType = $TypeMasks::StaticObjectType;
rechargeRate = 0.05;
};
//datablock StaticShapeData(StationAmmo)
//{
// className = Station;
// catagory = "Stations";
// shapeFile = "station_ammo.dts";
// maxDamage = 1.0;
// disabledLevel = 0.6;
// destroyedLevel = 0.8;
// icon = "CMDStationIcon";
// dynamicType = $TypeMasks::StationObjectType;
//};
datablock StaticShapeData(MobileInvStation)
{
className = Station;
catagory = "Stations";
shapeFile = "station_inv_mpb.dts";
icon = "CMDStationIcon";
// don't allow this object to be damaged in non-team-based
// mission types (DM, Rabbit, Bounty, Hunters)
noIndividualDamage = true;
dynamicType = $TypeMasks::StationObjectType;
rechargeRate = 0.256;
doesRepair = true;
};
//******************************************************************************
//* Station - Functions *
//******************************************************************************
////////////////////////////////////////////////////////////////////////////////
/// -Inventory- ////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/// -Inventory- ////////////////////////////////////////////////////////////////
//Function -- onAdd (%this, %obj)
// %this = Object data block
// %obj = Object being added
//Decription -- Called when the object is added to the mission
////////////////////////////////////////////////////////////////////////////////
function StationInventory::onAdd(%this, %obj)
{
Parent::onAdd(%this, %obj);
%obj.setRechargeRate(%obj.getDatablock().rechargeRate);
%trigger = new Trigger()
{
dataBlock = stationTrigger;
polyhedron = "-0.75 0.75 0.1 1.5 0.0 0.0 0.0 -1.5 0.0 0.0 0.0 2.3";
};
MissionCleanup.add(%trigger);
%trigger.setTransform(%obj.getTransform());
%trigger.station = %obj;
%trigger.mainObj = %obj;
%trigger.disableObj = %obj;
%obj.trigger = %trigger;
}
/// -Inventory- ////////////////////////////////////////////////////////////////
//Function -- stationReady(%data, %obj)
// %data = Station Data Block
// %obj = Station Object
//Decription -- Called when station has been triggered and animation is
// completed
////////////////////////////////////////////////////////////////////////////////
function StationInventory::stationReady(%data, %obj)
{
//Display the Inventory Station GUI here
%obj.notReady = 1;
%obj.inUse = "Down";
%obj.schedule(500,"playThread",$ActivateThread,"activate1");
%player = %obj.triggeredBy;
%energy = %player.getEnergyLevel();
%player.setCloaked(true);
%player.schedule(500, "setCloaked", false);
if (!%player.client.isAIControlled())
buyFavorites(%player.client);
%player.setEnergyLevel(%energy);
%data.schedule( 500, "beginPersonalInvEffect", %obj );
}
function StationInventory::beginPersonalInvEffect( %data, %obj )
{
if (!%obj.isDisabled())
{
%fx = new StationFXPersonal()
{
dataBlock = PersonalInvFX;
stationObject = %obj;
};
}
}
/// -Inventory- ////////////////////////////////////////////////////////////////
//Function -- stationFinished(%data, %obj)
// %data = Station Data Block
// %obj = Station Object
//Decription -- Called when player has left the station
////////////////////////////////////////////////////////////////////////////////
function StationInventory::stationFinished(%data, %obj)
{
//Hide the Inventory Station GUI
}
/// -Inventory- ////////////////////////////////////////////////////////////////
//Function -- getSound(%data, %forward)
// %data = Station Data Block
// %forward = direction the animation is playing
//Decription -- This sound will be played at the same time as the activate
// animation.
////////////////////////////////////////////////////////////////////////////////
function StationInventory::getSound(%data, %forward)
{
if(%forward)
return "StationInventoryActivateSound";
else
return false;
}
/// -Inventory- ////////////////////////////////////////////////////////////////
//Function -- setPlayerPosition(%data, %obj, %trigger, %colObj)
// %data = Station Data Block
// %obj = Station Object
// %trigger = Stations trigger
// %colObj = Object that is at the station
//Decription -- Called when player enters the trigger. Used to set the player
// in the center of the station.
////////////////////////////////////////////////////////////////////////////////
function StationInventory::setPlayersPosition(%data, %obj, %trigger, %colObj)
{
%vel = getWords(%colObj.getVelocity(), 0, 1) @ " 0";
if((VectorLen(%vel) < 22) && (%obj.triggeredBy != %colObj))
{
%pos = %trigger.position;
%colObj.setvelocity("0 0 0");
%rot = getWords(%colObj.getTransform(),3, 6);
%colObj.setTransform(getWord(%pos,0) @ " " @ getWord(%pos,1) @ " " @ getWord(%pos,2) + 0.8 @ " " @ %rot);//center player on object
%colObj.setMoveState(true);
%colObj.schedule(1600,"setMoveState", false);
%colObj.setvelocity("0 0 0");
return true;
}
return false;
}
////////////////////////////////////////////////////////////////////////////////
/// -Vehicle- //////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/// -Vehicle- //////////////////////////////////////////////////////////////////
//Function -- onAdd (%this, %obj)
// %this = Object data block
// %obj = Object being added
//Decription -- Called when the object is added to the mission
////////////////////////////////////////////////////////////////////////////////
function StationVehicle::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;
}
/// -Vehicle- //////////////////////////////////////////////////////////////////
//Function -- stationReady(%data, %obj)
// %data = Station Data Block
// %obj = Station Object
//Decription -- Called when station has been triggered and animation is
// completed
////////////////////////////////////////////////////////////////////////////////
function StationVehicle::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');
}
/// -Vehicle- //////////////////////////////////////////////////////////////////
//Function -- stationFinished(%data, %obj)
// %data = Station Data Block
// %obj = Station Object
//Decription -- Called when player has left the station
////////////////////////////////////////////////////////////////////////////////
function StationVehicle::stationFinished(%data, %obj)
{
//Hide the Vehicle Station GUI
commandToClient(%obj.triggeredBy.client, 'StationVehicleHideHud');
}
/// -Vehicle- //////////////////////////////////////////////////////////////////
//Function -- getSound(%data, %forward)
// %data = Station Data Block
// %forward = direction the animation is playing
//Decription -- This sound will be played at the same time as the activate
// animation.
////////////////////////////////////////////////////////////////////////////////
function StationVehicle::getSound(%data, %forward)
{
if(%forward)
return "StationVehicleAcitvateSound";
else
return "StationVehicleDeactivateSound";
}
/// -Vehicle- //////////////////////////////////////////////////////////////////
//Function -- setPlayerPosition(%data, %obj, %trigger, %colObj)
// %data = Station Data Block
// %obj = Station Object
// %trigger = Stations trigger
// %colObj = Object that is at the station
//Decription -- Called when player enters the trigger. Used to set the player
// in the center of the station.
////////////////////////////////////////////////////////////////////////////////
function StationVehicle::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 StationVehiclePad::onAdd(%this, %obj)
{
Parent::onAdd(%this, %obj);
%obj.ready = true;
%obj.setRechargeRate(%obj.getDatablock().rechargeRate);
%xform = %obj.getSlotTransform(0);
%pos = getWords(%xform, 0, 2);
%rot = getWords(%xform, 3, 5);
%angle = (getWord(%xform, 6) * 180) / 3.14159;
%sv = new StaticShape() {
scale = "1 1 1";
dataBlock = StationVehicle;
lockCount = "0";
homingCount = "0";
team = %obj.team;
position = %pos;
rotation = %rot @ " " @ %angle;
};
MissionCleanup.add(%sv);
%sv.getDataBlock().gainPower(%sv);
%sv.pad = %obj;
%obj.station = %sv;
%sv.trigger.mainObj = %obj;
%sv.trigger.disableObj = %sv;
//Remove unwanted vehicles
if(%obj.scoutVehicle !$= "Removed")
%sv.vehicle[scoutvehicle] = true;
if(%obj.assaultVehicle !$= "Removed")
%sv.vehicle[assaultVehicle] = true;
if(%obj.mobileBaseVehicle !$= "Removed")
{
%sv.vehicle[mobileBasevehicle] = true;
// createTeleporter(%sv.getDataBlock(), %sv);
}
if(%obj.scoutFlyer !$= "Removed")
%sv.vehicle[scoutFlyer] = true;
if(%obj.bomberFlyer !$= "Removed")
%sv.vehicle[bomberFlyer] = true;
if(%obj.hapcFlyer !$= "Removed")
%sv.vehicle[hapcFlyer] = true;
}
function StationVehiclePad::onEndSequence(%data, %obj, %thread)
{
if(%thread == $ActivateThread)
{
%obj.ready = true;
%obj.stopThread($ActivateThread);
}
Parent::onEndSequence(%data, %obj, %thread);
}
////////////////////////////////////////////////////////////////////////////////
/// -Mobile Base Inventory- ////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/// -Mobile Base- //////////////////////////////////////////////////////////////
//Function -- onAdd (%this, %obj)
// %this = Object data block
// %obj = Object being added
//Decription -- Called when the object is added to the mission
////////////////////////////////////////////////////////////////////////////////
function MobileInvStation::onAdd(%this, %obj)
{
}
function MobileInvStation::createTrigger(%this, %obj)
{
Parent::onAdd(%this, %obj);
%obj.setRechargeRate(%obj.getDatablock().rechargeRate);
%trigger = new Trigger()
{
dataBlock = stationTrigger;
polyhedron = "-0.75 0.75 0.1 1.5 0.0 0.0 0.0 -1.5 0.0 0.0 0.0 2.3";
};
MissionCleanup.add(%trigger);
%trigger.setTransform(%obj.vehicle.getSlotTransform(2));
%trigger.station = %obj;
%trigger.mainObj = %obj;
%trigger.disableObj = %obj;
%obj.trigger = %trigger;
// createTarget(%obj, 'Inventory Station', "", "", 'Station', 0, 0);
}
/// -Mobile Base- //////////////////////////////////////////////////////////////
//Function -- stationReady(%data, %obj)
// %data = Station Data Block
// %obj = Station Object
//Decription -- Called when station has been triggered and animation is
// completed
////////////////////////////////////////////////////////////////////////////////
function MobileInvStation::stationReady(%data, %obj)
{
//Display the Inventory Station GUI here
%obj.notReady = 1;
%obj.inUse = "Down";
%obj.schedule(200,"playThread",$ActivateThread,"activate1");
%obj.getObjectMount().playThread($ActivateThread,"Activate");
%player = %obj.triggeredBy;
%energy = %player.getEnergyLevel();
%player.setCloaked(true);
%player.schedule(900, "setCloaked", false);
if (!%player.client.isAIControlled())
buyFavorites(%player.client);
%player.setEnergyLevel(%energy);
}
/// -Mobile Base- //////////////////////////////////////////////////////////////
//Function -- stationFinished(%data, %obj)
// %data = Station Data Block
// %obj = Station Object
//Decription -- Called when player has left the station
////////////////////////////////////////////////////////////////////////////////
function MobileInvStation::stationFinished(%data, %obj)
{
//Hide the Inventory Station GUI
}
/// -Mobile Base- //////////////////////////////////////////////////////////////
//Function -- getSound(%data, %forward)
// %data = Station Data Block
// %forward = direction the animation is playing
//Decription -- This sound will be played at the same time as the activate
// animation.
////////////////////////////////////////////////////////////////////////////////
function MobileInvStation::getSound(%data, %forward)
{
if(%forward)
return "MobileBaseInventoryActivateSound";
else
return false;
}
/// -Mobile Base- //////////////////////////////////////////////////////////////
//Function -- setPlayerPosition(%data, %obj, %trigger, %colObj)
// %data = Station Data Block
// %obj = Station Object
// %trigger = Stations trigger
// %colObj = Object that is at the station
//Decription -- Called when player enters the trigger. Used to set the player
// in the center of the station.
////////////////////////////////////////////////////////////////////////////////
function MobileInvStation::setPlayersPosition(%data, %obj, %trigger, %colObj)
{
%vel = getWords(%colObj.getVelocity(), 0, 1) @ " 0";
if((VectorLen(%vel) < 22) && (%obj.triggeredBy != %colObj))
{
%pos = %trigger.position;
%colObj.setvelocity("0 0 0");
%rot = getWords(%colObj.getTransform(),3, 6);
// %colObj.setTransform(getWord(%pos,0) @ " " @ getWord(%pos,1) - 0.75 @ " " @ getWord(%pos,2)+0.7 @ " " @ %rot);//center player on object
%colObj.setTransform(getWord(%pos,0) @ " " @ getWord(%pos,1) @ " " @ getWord(%pos,2)+0.8 @ " " @ %rot);//center player on object
%colObj.setMoveState(true);
%colObj.schedule(1600,"setMoveState", false);
%colObj.setvelocity("0 0 0");
return true;
}
return false;
}
function MobileInvStation::onDamage()
{
}
function MobileInvStation::damageObject(%data, %targetObject, %sourceObject, %position, %amount, %damageType)
{
//If vehicle station is hit then apply damage to the vehicle
%targetObject.getObjectMount().damage(%sourceObject, %position, %amount, %damageType);
}
////////////////////////////////////////////////////////////////////////////////
/// -Station Trigger- //////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////-Station Trigger-///////////////////////////////////////////////////////////
//Function -- onEnterTrigger (%data, %obj, %colObj)
// %data = Trigger Data Block
// %obj = Trigger Object
// %colObj = Object that collided with the trigger
//Decription -- Called when trigger has been triggered
////////////////////////////////////////////////////////////////////////////////
function stationTrigger::onEnterTrigger(%data, %obj, %colObj)
{
//make sure it's a player object, and that that object is still alive
if(%colObj.getDataBlock().className !$= "Armor" || %colObj.getState() $= "Dead")
return;
%colObj.inStation = true;
commandToClient(%colObj.client,'setStationKeys', true);
if(Game.stationOnEnterTrigger(%data, %obj, %colObj)) {
//verify station.team is team associated and isn't on player's team
if((%obj.mainObj.team != %colObj.client.team) && (%obj.mainObj.team != 0))
{
%obj.station.playAudio(2, StationAccessDeniedSound);
messageClient(%colObj.client, 'msgStationDenied', '\c2Access Denied -- Wrong team.');
}
else if(%obj.disableObj.isDisabled())
{
messageClient(%colObj.client, 'msgStationDisabled', '\c2Station is disabled.');
}
else if(!%obj.mainObj.isPowered())
{
messageClient(%colObj.client, 'msgStationNoPower', '\c2Station is not powered.');
}
else if(%obj.station.notDeployed)
{
messageClient(%colObj.client, 'msgStationNotDeployed', '\c2Station is not deployed.');
}
else if(%obj.station.triggeredBy $= "")
{
if(%obj.station.getDataBlock().setPlayersPosition(%obj.station, %obj, %colObj))
{
messageClient(%colObj.client, 'CloseHud', "", 'inventoryScreen');
commandToClient(%colObj.client, 'TogglePlayHuds', true);
%obj.station.triggeredBy = %colObj;
%obj.station.getDataBlock().stationTriggered(%obj.station, 1);
%colObj.station = %obj.station;
%colObj.lastWeapon = ( %colObj.getMountedImage($WeaponSlot) == 0 ) ? "" : %colObj.getMountedImage($WeaponSlot).getName().item;
%colObj.unmountImage($WeaponSlot);
}
}
}
}
////-Station Trigger-///////////////////////////////////////////////////////////
//Function -- onLeaveTrigger (%data, %obj, %colObj)
// %data = Trigger Data Block
// %obj = Trigger Object
// %colObj = Object that collided with the trigger
//Decription -- Called when trigger has been untriggered
////////////////////////////////////////////////////////////////////////////////
function stationTrigger::onLeaveTrigger(%data, %obj, %colObj)
{
if(%colObj.getDataBlock().className !$= "Armor")
return;
%colObj.inStation = false;
commandToClient(%colObj.client,'setStationKeys', false);
if(%obj.station)
{
if(%obj.station.triggeredBy == %colObj)
{
%obj.station.getDataBlock().stationFinished(%obj.station);
%obj.station.getDataBlock().endRepairing(%obj.station);
%obj.station.triggeredBy = "";
%obj.station.getDataBlock().stationTriggered(%obj.station, 0);
if(!%colObj.teleporting)
%colObj.station = "";
if(%colObj.getMountedImage($WeaponSlot) == 0 && !%colObj.teleporting)
{
if(%colObj.inv[%colObj.lastWeapon])
%colObj.use(%colObj.lastWeapon);
if(%colObj.getMountedImage($WeaponSlot) == 0)
%colObj.selectWeaponSlot( 0 );
}
}
}
}
////-Station Trigger-///////////////////////////////////////////////////////////
//Function -- stationTriggered(%data, %obj, %isTriggered)
// %data = Station Data Block
// %obj = Station Object
// %isTriggered = 1 if triggered; 0 if status changed to
// untriggered
//Decription -- Called when a "station trigger" has been triggered or
// untriggered
////////////////////////////////////////////////////////////////////////////////
function Station::stationTriggered(%data, %obj, %isTriggered)
{
if(%data.teleporter $= "")
{
if(%isTriggered)
{
%obj.setThreadDir($ActivateThread, TRUE);
%obj.playThread($ActivateThread,"activate");
%obj.playAudio($ActivateSound, %data.getSound(true));
%obj.inUse = "Up";
}
else
{
if(%obj.getDataBlock().getName() !$= StationVehicle)
{
%obj.stopThread($ActivateThread);
if(%obj.getObjectMount())
%obj.getObjectMount().stopThread($ActivateThread);
%obj.inUse = "Down";
}
else
{
%obj.setThreadDir($ActivateThread, FALSE);
%obj.playThread($ActivateThread,"activate");
%obj.playAudio($ActivateSound, %data.getSound(false));
%obj.inUse = "Down";
}
}
}
else
%data.tryTeleport(%obj);
}
////-Station-///////////////////////////////////////////////////////////////////
//Function -- onEndSequence(%data, %obj, %thread)
// %data = Station Data Block
// %obj = Station Object
// %thread = Thread number that the animation is associated
// with / running on.
//Decription -- Called when an animation sequence is finished playing
////////////////////////////////////////////////////////////////////////////////
function Station::onEndSequence(%data, %obj, %thread)
{
if(%thread == $ActivateThread)
{
if(%obj.inUse $= "Up")
{
%data.stationReady(%obj);
%player = %obj.triggeredBy;
if(%data.doesRepair && !%player.stationRepairing && %player.getDamageLevel() != 0) {
%oldRate = %player.getRepairRate();
%player.setRepairRate(%oldRate + 0.00625);
%player.stationRepairing = 1;
}
}
else
{
if(%obj.getDataBlock().getName() !$= MobileInvStation)
{
%obj.stopThread($ActivateThread);
%obj.inUse = "Down";
}
}
}
Parent::onEndSequence(%data, %obj, %thread);
}
////-Station-///////////////////////////////////////////////////////////////////
//Function -- onCollision(%data, %obj, %colObj)
// %data = Station Data Block
// %obj = Station Object
// %colObj = Object that collided with the station
//Decription -- Called when an object collides with a station
////////////////////////////////////////////////////////////////////////////////
function Station::onCollision(%data, %obj, %colObj)
{
// Currently Not Needed
}
////-Station-///////////////////////////////////////////////////////////////////
//Function -- endRepairing(%data, %obj)
// %data = Station Data Block
// %obj = Station Object
//Decription -- Called to stop repairing the object
////////////////////////////////////////////////////////////////////////////////
function Station::endRepairing(%data, %obj)
{
if(%obj.triggeredBy.stationRepairing)
{
%oldRate = %obj.triggeredBy.getRepairRate();
%obj.triggeredBy.setRepairRate(%oldRate - 0.00625);
%obj.triggeredBy.stationRepairing = 0;
}
}
////-Station Trigger-///////////////////////////////////////////////////////////
//Function -- onTickTrigger(%data, %obj)
// %data = Trigger Data Block
// %obj = Trigger Object
//Decription -- Called every tick if triggered
////////////////////////////////////////////////////////////////////////////////
function stationTrigger::onTickTrigger(%data, %obj)
{
}
//******************************************************************************
//* Station General - Functions *
//******************************************************************************
//function Station::onGainPowerEnabled(%data, %obj)
function Station::onLosePowerDisabled(%data, %obj)
{
Parent::onLosePowerDisabled(%data, %obj);
// check to see if a player was using this station
%occupied = %obj.triggeredBy;
if(%occupied > 0)
{
if(%data.doesRepair)
%data.endRepairing(%obj);
// if it's a deployed station, stop "flashing panels" thread
if(%data.getName() $= DeployedStationInventory)
%obj.stopThread($ActivateThread);
// reset some attributes
%occupied.station = "";
%occupied.inStation = false;
%obj.triggeredBy = "";
// restore "toggle inventory hud" key
commandToClient(%occupied.client,'setStationKeys', false);
// re-mount last weapon or weapon slot 0
if(%occupied.getMountedImage($WeaponSlot) == 0)
{
if(%occupied.inv[%occupied.lastWeapon])
%occupied.use(%occupied.lastWeapon);
if(%occupied.getMountedImage($WeaponSlot) == 0)
%occupied.selectWeaponSlot( 0 );
}
}
}
function StationVehiclePad::gainPower(%data, %obj)
{
%obj.station.setSelfPowered();
Parent::gainPower(%data, %obj);
}
function StationVehiclePad::losePower(%data, %obj)
{
%obj.station.clearSelfPowered();
Parent::losePower(%data, %obj);
}
//---------------------------------------------------------------------------
// DeployedStationInventory:
//---------------------------------------------------------------------------
function DeployedStationInventory::stationReady(%data, %obj)
{
%obj.notReady = 1;
%player = %obj.triggeredBy;
%obj.playThread($ActivateThread,"activate1");
// function below found in inventoryHud.cs
if (!%player.client.isAIControlled())
buyDeployableFavorites(%player.client);
}
function DeployedStationInventory::stationFinished(%data, %obj)
{
}
function DeployedStationInventory::setPlayersPosition(%data, %obj, %trigger, %colObj)
{
%vel = getWords(%colObj.getVelocity(), 0, 1) @ " 0";
if((VectorLen(%vel) < 22) && (%obj.triggeredBy != %colObj))
{
// build offset for player position
%yrot = getWords(VectorOrthoBasis( getWords( %obj.getTransform(), 3, 6 ) ) ,3 ,5);
%yrot = VectorScale( %yrot, -1.0 );
%statTrans = %obj.getTransform();
%statX = getWord( %statTrans, 0 );
%statY = getWord( %statTrans, 1 );
%statZ = getWord( %statTrans, 2 );
%colObj.setTransform( %statX + getWord( %yRot, 0 ) @ " " @ %statY + getWord( %yRot, 1 ) @ " " @ %statZ + 0.2 @ " " @ getWords( %statTrans, 3, 6 ) );
%colObj.setvelocity("0 0 0");
%colObj.setMoveState(true);
%colObj.schedule(1600,"setMoveState", false);
return true;
}
return false;
}
function DeployedStationInventory::onDestroyed(%data, %obj, %prevState)
{
%obj.trigger.delete();
// decrement team deployed count for this item
$TeamDeployedCount[%obj.team, InventoryDeployable]--;
// when a station is destroyed, we don't need its trigger any more
%obj.schedule(700, "delete");
Parent::onDestroyed(%data, %obj, %prevState);
}
/// -Deployable Inventory- //////////////////////////////////////////////////////////////
//Function -- getSound(%data, %forward)
// %data = Station Data Block
// %forward = direction the animation is playing
//Decription -- This sound will be played at the same time as the activate
// animation.
////////////////////////////////////////////////////////////////////////////////
function DeployedStationInventory::getSound(%data, %forward)
{
if(%forward)
return "DepInvActivateSound";
else
return false;
}
////////////////////////////////////////////////////////////////////////////////
/// -Mobile Base Teleporter DATA- //////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
datablock AudioProfile(StationTeleportAcitvateSound)
{
filename = "fx/powered/vehicle_screen_on2.wav";
description = AudioClosest3d;
preload = true;
effect = StationVehicleAcitvateEffect;
};
datablock AudioProfile(StationTeleportHumSound)
{
filename = "fx/powered/station_hum.wav";
description = CloseLooping3d;
preload = true;
};
datablock AudioProfile(StationTeleportDeactivateSound)
{
filename = "fx/powered/vehicle_screen_off.wav";
description = AudioClose3d;
preload = true;
effect = StationVehicleDeactivateEffect;
};
datablock AudioProfile(TeleportSound)
{
filename = "fx/powered/vehicle_screen_on2.wav";
description = AudioClosest3d;
preload = true;
effect = StationVehicleAcitvateEffect;
};
datablock AudioProfile(UnTeleportSound)
{
filename = "fx/powered/vehicle_screen_off.wav";
description = AudioClose3d;
preload = true;
effect = StationVehicleDeactivateEffect;
};
datablock StaticShapeData(MPBTeleporter) : StaticShapeDamageProfile
{
className = Station;
catagory = "Stations";
shapeFile = "station_teleport.dts";
maxDamage = 1.20;
destroyedLevel = 1.20;
disabledLevel = 0.84;
explosion = ShapeExplosion;
expDmgRadius = 10.0;
expDamage = 0.4;
expImpulse = 1500.0;
dynamicType = $TypeMasks::StationObjectType;
isShielded = true;
energyPerDamagePoint = 33;
maxEnergy = 250;
rechargeRate = 0.31;
humSound = StationTeleportHumSound;
// don't let these be damaged in Siege missions
noDamageInSiege = true;
cmdCategory = "Support";
cmdIcon = CMDVehicleStationIcon;
cmdMiniIconName = "commander/MiniIcons/com_vehicle_pad_inventory";
targetTypeTag = 'Teleport Station';
teleporter = 1;
};
////////////////////////////////////////////////////////////////////////////////
/// -Mobile Base Teleport- /////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/// -Mobile Base- //////////////////////////////////////////////////////////////
//Function -- onAdd (%this, %obj)
// %this = Object data block
// %obj = Object being added
//Decription -- Called when the object is added to the mission
////////////////////////////////////////////////////////////////////////////////
function MPBTeleporter::onAdd(%this, %obj)
{
Parent::onAdd(%this, %obj);
}
function MPBTeleporter::createTrigger(%this, %obj)
{
// createTarget(%obj, 'Inventory Station', "", "", 'Station', 0, 0);
%obj.setRechargeRate(%obj.getDatablock().rechargeRate);
%trigger = new Trigger()
{
dataBlock = stationTrigger;
polyhedron = "-0.75 0.75 0.1 1.5 0.0 0.0 0.0 -1.5 0.0 0.0 0.0 2.3";
};
MissionCleanup.add(%trigger);
%trigger.setTransform(%obj.getTransform());
%trigger.station = %obj;
%trigger.mainObj = %obj.vStation;
%trigger.disableObj = %obj;
%obj.trigger = %trigger;
}
/// -Mobile Base- //////////////////////////////////////////////////////////////
//Function -- stationReady(%data, %obj)
// %data = Station Data Block
// %obj = Station Object
//Decription -- Called when station has been triggered and animation is
// completed
////////////////////////////////////////////////////////////////////////////////
function MPBTeleporter::stationReady(%data, %obj)
{
//Display the Inventory Station GUI here
%obj.notReady = 1;
%obj.inUse = "Down";
%obj.schedule(200,"playThread",$ActivateThread,"activate1");
%obj.getObjectMount().playThread($ActivateThread,"Activate");
%player = %obj.triggeredBy;
%energy = %player.getEnergyLevel();
%player.setCloaked(true);
%player.schedule(900, "setCloaked", false);
if (!%player.client.isAIControlled())
buyFavorites(%player.client);
%player.setEnergyLevel(%energy);
}
/// -Mobile Base- //////////////////////////////////////////////////////////////
//Function -- stationFinished(%data, %obj)
// %data = Station Data Block
// %obj = Station Object
//Decription -- Called when player has left the station
////////////////////////////////////////////////////////////////////////////////
function MPBTeleporter::stationFinished(%data, %obj)
{
//Hide the Inventory Station GUI
}
/// -Mobile Base- //////////////////////////////////////////////////////////////
//Function -- getSound(%data, %forward)
// %data = Station Data Block
// %forward = direction the animation is playing
//Decription -- This sound will be played at the same time as the activate
// animation.
////////////////////////////////////////////////////////////////////////////////
function MPBTeleporter::getSound(%data, %forward)
{
if(%forward)
return "MobileBaseInventoryActivateSound";
else
return false;
}
/// -Mobile Base- //////////////////////////////////////////////////////////////
//Function -- setPlayerPosition(%data, %obj, %trigger, %colObj)
// %data = Station Data Block
// %obj = Station Object
// %trigger = Stations trigger
// %colObj = Object that is at the station
//Decription -- Called when player enters the trigger. Used to set the player
// in the center of the station.
////////////////////////////////////////////////////////////////////////////////
function MPBTeleporter::setPlayersPosition(%data, %obj, %trigger, %colObj)
{
%vel = getWords(%colObj.getVelocity(), 0, 1) @ " 0";
if((VectorLen(%vel) < 22) && (%obj.triggeredBy != %colObj))
{
%pos = %trigger.position;
%colObj.setvelocity("0 0 0");
%rot = getWords(%colObj.getTransform(),3, 6);
%colObj.setTransform(getWord(%pos,0) @ " " @ getWord(%pos,1) @ " " @ getWord(%pos,2)+0.8 @ " " @ %rot);//center player on object
%colObj.setvelocity("0 0 0");
return true;
}
return false;
}
function MPBTeleporter::tryTeleport(%data, %obj)
{
if(isObject(%obj.MPB) && %obj.MPB.fullyDeployed && %obj.triggeredBy !$= "")
{
%trans = %obj.MPB.getTransform();
%vX = getWord(%trans, 0);
%vY = getWord(%trans, 1);
%vZ = getWord(%trans, 2);
%rot= getWords(%trans, 3,6);
%obj.triggeredBy.teleporting = 1;
%obj.triggeredBy.startFade( 1000, 0, true );
%obj.triggeredBy.playAudio($PlaySound, TeleportSound);
%obj.triggeredBy.setMoveState(true);
%data.schedule(4500,"teleportingDone", %obj.triggeredBy);
%data.schedule(2000, "teleportout", %obj, %obj.triggeredBy, %vX @ " " @ %vY @ " " @ %vZ + 3 @ " " @ %rot);
}
else if(%obj.triggeredBy !$= "")
MessageClient(%obj.triggeredBy.client, "", 'MPB is not deployed.');
}
function MPBTeleporter::onEndSequence(%data, %obj, %thread)
{
}
function MPBTeleporter::teleportOut(%data, %obj, %player, %trans)
{
if(isObject(%obj.MPB))
{
%index = -1;
for(%x=0; %x < %obj.MPB.spawnPosCount; %x++)
{
%index = mFloor(getRandom() * %obj.MPB.spawnPosCount);
InitContainerRadiusSearch(%MPB.spawnPos[%index], 2, $TypeMasks::MoveableObjectType);
if(ContainerSearchNext() == 0)
break;
else
%index = -1;
}
if(%index >= 0)
%player.setTransform(%obj.MPB.spawnPos[%index] @ " " @ getWords(%obj.MPB.getTransform(), 3, 6));
else
{
messageClient(%player.client, "", 'No Valid teleporting positions.');
%player.teleporting = 0;
}
}
else
{
messageClient(%player.client, "", 'No Valid teleporting positions because MPB was destroyed');
%player.teleporting = 0;
}
%data.schedule(1000, "teleportIn", %player);
}
function MPBTeleporter::teleportIn(%data, %player, %trans)
{
%player.startFade(1000, 0, false );
%player.playAudio($PlaySound, UnTeleportSound);
}
function MPBTeleporter::teleportingDone(%data, %player)
{
%player.setMoveState(false);
%player.teleporting = 0;
%player.station = "";
if(%player.getMountedImage($WeaponSlot) == 0)
{
if(%player.inv[%player.lastWeapon])
%player.use(%player.lastWeapon);
if(%player.getMountedImage($WeaponSlot) == 0)
%player.selectWeaponSlot( 0 );
}
}
for(%y = -1; %y < 1; %y += 0.25)
{
%xCount=0;
for(%x = -1; %x < 1; %x += 0.25)
{
$MPBSpawnPos[(%yCount * 8) + %xCount] = %x @ " " @ %y;
%xCount++;
}
%yCount++;
}
function checkSpawnPos(%MPB, %radius)
{
%count = -1;
for(%x = 0; %x < 64; %x++)
{
%pPos = getWords(%MPB.getTransform(), 0, 2);
%pPosX = getWord(%pPos, 0);
%pPosY = getWord(%pPos, 1);
%pPosZ = getWord(%pPos, 2);
%posX = %pPosX + ( getWord($MPBSpawnPos[%x],0) * %radius);
%posY = %pPosY + (getWord($MPBSpawnPos[%x],1) * %radius);
%terrHeight = getTerrainHeight(%posX @ " " @ %posY);
if(abs(%terrHeight - %pPosZ) < %radius )
{
%mask = $TypeMasks::VehicleObjectType | $TypeMasks::MoveableObjectType |
$TypeMasks::StaticShapeObjectType | $TypeMasks::StaticTSObjectType |
$TypeMasks::ForceFieldObjectType | $TypeMasks::ItemObjectType |
$TypeMasks::PlayerObjectType | $TypeMasks::TurretObjectType |
$TypeMasks::InteriorObjectType;
InitContainerRadiusSearch(%posX @ " " @ %posY @ " " @ %terrHeight, 2, %mask);
if(ContainerSearchNext() == 0)
%MPB.spawnPos[%count++] = %posX @ " " @ %posY @ " " @ %terrHeight;
}
}
%MPB.spawnPosCount = %count;
}
function createTeleporter(%data, %obj)
{
%Teleporter = new StaticShape() {
scale = "1 1 1";
dataBlock = "MPBTeleporter";
lockCount = "0";
homingCount = "0";
team = %obj.team;
};
%obj.teleporter = %Teleporter;
%Teleporter.vStation = %obj.pad;
MissionCleanup.add(%Teleporter);
%trans = %obj.getTransform();
%vSPos = getWords(%trans,0,2);
%vRot = getWords(%trans,3,5);
%vAngle = getWord(%trans,6);
%matrix = VectorOrthoBasis(%vRot @ " " @ %vAngle + 0.36);
%yRot = getWords(%matrix, 3, 5);
%pos = vectorAdd(%vSPos, vectorScale(%yRot, -31.5));
%Teleporter.setTransform(%pos @ " " @ %vRot @ " " @ %vAngle);
%Teleporter.getDataBlock().createTrigger(%Teleporter);
}