//******************************************************************************
//*   Station  -  Data Blocks                                                  *
//******************************************************************************
datablock EffectProfile(StationInventoryActivateEffect)
{
   effectname = "powered/inv_pad_on";
   minDistance = 5.0;
   maxDistance = 7.5;
};

datablock EffectProfile(StationVehicleAcitvateEffect)
{
   effectname = "powered/vehicle_screen_on2";
   minDistance = 3.0;
   maxDistance = 5.0;
};

datablock EffectProfile(StationVehicleDeactivateEffect)
{
   effectname = "powered/vehicle_screen_off";
   minDistance = 3.0;
   maxDistance = 5.0;
};

//datablock EffectProfile(MobileBaseInventoryActivateEffect)
//{
//   effectname = "misc/diagnostic_on";
//   minDistance = 3.0;
//};

datablock EffectProfile(StationAccessDeniedEffect)
{
   effectname = "powered/station_denied";
   minDistance = 3.0;
   maxDistance = 5.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;
   effect = StationInventoryActivateEffect;
};

datablock AudioProfile(DepInvActivateSound)
{
   filename = 	"fx/powered/dep_inv_station.wav";
   description = AudioClose3d;
   preload = 	 true;
   effect = StationInventoryActivateEffect;
};

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;
   effect = StationAccessDeniedEffect;
};

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;
	needsPower = true;
};

datablock StaticShapeData(StationAmmo) : StaticShapeDamageProfile
{
   className = Station;
   catagory = "Stations";
//   shapeFile = "station_ammo.dts";
   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 = 'Ammo';
   targetTypeTag = 'Station';

   debrisShapeName = "debris_generic.dts";
   debris = StationDebris;
};

datablock StaticShapeData(StationVehicle) : StaticShapeDamageProfile
{
//[[CHANGE]] Added some observer information..
   className = Station;
   catagory = "Stations";
   shapeFile = "vehicle_pad_station.dts";
   maxDamage = 1.20;
   destroyedLevel = 1.20;
   disabledLevel = 0.84;
   explosion      = ShapeExplosion;
   canControl = true;
	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';
   observeParameters = "0 10.0 10.0";

   debrisShapeName = "debris_generic.dts";
   debris = StationDebris;

   minLookAngle = -1.5;
   maxLookAngle = 1.5;
   maxFreelookAngle = 3.0;

   cameraMaxDist = 40;
   cameraOffset = 20;
   cameraLag = 1.5;
	noIndividualDamage = true;
};

datablock StaticShapeData(StationVehiclePad)
{
   className = Station;
   catagory = "Stations";
   shapeFile = "vehicle_pad.dts";
   isInvincible = true;
   dynamicType = $TypeMasks::StaticObjectType;
   rechargeRate = 0.05;

   // ------------------------------------------
   // z0dd - ZOD, 5/8/02. CC bug fix parameter.
   // Part of overall V-Station creation change.
   targetTypeTag = 'Vehicle Pad';
};

//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();
   // -------------------------------------------------
   // z0dd - ZOD, 4/20/02. Addition. Inv energy bug fix
   %max = %player.getDatablock().maxEnergy;

   %player.setCloaked(true);
   %player.schedule(500, "setCloaked", false);
	if (!%player.client.isAIControlled())
	   buyFavorites(%player.client);

   // -------------------------------------------------
   // z0dd - ZOD, 4/20/02. Addition. Inv energy bug fix
   //%player.setEnergyLevel(%energy);
   %player.setEnergyLevel(mFloor(%player.getDatablock().maxEnergy * %energy / %max));

   %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);
	%pos = getWord(%pos,0) @ " " @ getWord(%pos,1) @ " " @ getWord(%pos,2) + 0.8;
	%terrain = getTerrainHeight2(%pos);
	if (!(getWord(%pos,2) < getWord(%terrain,2) || %terrain $= "") || $Host::AllowUnderground)
		//%colObj.setTransform(%pos @ " " @ %rot);//center player on object
      return true;
   }
   return false;
}

///////////////////////////////////////////////////////////////////////////////
/// -Ammo- ////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////

function StationAmmo::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;
}

//-------------------------------------------------------------------------------
function StationAmmo::stationReady(%data, %obj)
{
    //error("StationAmmo::stationReady");
    %obj.notReady = 1;
    %obj.inUse = "Down";
    %obj.setThreadDir($ActivateThread, true);
    %obj.schedule(100, "playThread", $ActivateThread, "activate1");
    %player = %obj.triggeredBy;
    %energy = %player.getEnergyLevel();
    //%player.setCloaked(true);
    //%player.schedule(500, "setCloaked", false);


    if (!%player.client.isAIControlled())
        getAmmoStationLovin(%player.client);
    //%data.schedule( 500, "beginPersonalInvEffect", %obj );
}

//-------------------------------------------------------------------------------
function StationAmmo::onEndSequence(%data, %obj, %thread)
{
    if(%thread == $ActivateThread)
    {
        %obj.setThreadDir($ActivateThread, false);
        %obj.playThread( $ActivateThread, "activate1");
        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;
            }
        }
    }
   //Parent::onEndSequence(%data, %obj, %thread);
}

//-------------------------------------------------------------------------------
function StationAmmo::stationFinished(%data, %obj)
{
   //Hide the Inventory Station GUI
}

//-------------------------------------------------------------------------------
function StationAmmo::getSound(%data, %forward)
{
   if(%forward)
      return "StationInventoryActivateSound";
   else
      return false;
}

//-------------------------------------------------------------------------------
function StationAmmo::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);
	%pos = getWord(%pos,0) @ " " @ getWord(%pos,1) @ " " @ getWord(%pos,2) + 0.8;
	%terrain = getTerrainHeight2(%pos);
	if (!(getWord(%pos,2) < getWord(%terrain,2) || %terrain $= "") || $Host::AllowUnderground)
		//%colObj.setTransform(%pos @ " " @ %rot);//center player on object
      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
////////////////////////////////////////////////////////////////////////////////

// -----------------------------------------------------------------------------
// z0dd - ZOD - Founder(founder@mechina.com), 5/8/02. Totall re-write of Vehicle 
// station creation. More stable, addresses some power related bugs.

// Do not need this anymore.
//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;
//}

// This now creates the vehicle station trigger.
function StationVehicle::createTrigger(%this, %obj)
{
   %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;
}
// End z0dd - ZOD - Founder
// -----------------------------------------------------------------------------

/// -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' );

   //[[CHANGE]] Make sure the player teleports...
   %obj.triggeredby.client.telebuy = "";

   //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
   if(!%obj.triggeredBy.isMounted())
      commandToClient(%obj.triggeredBy.client, 'StationVehicleHideHud');
   else
      commandToClient(%obj.triggeredBy.client, 'StationVehicleHideJustHud');

}

/// -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");
	%pos = %posXY @ " " @ %posZ + 0.2;
	%terrain = getTerrainHeight2(%pos);
	if (!(getWord(%pos,2) < getWord(%terrain,2) || %terrain $= "") || $Host::AllowUnderground)
		%colObj.setTransform(%pos @ " " @ "0 0 "  @ %rotZ @ " " @ %angle );//center player on object
      return true;
   }
   return false;
}
// -----------------------------------------------------------------------------
// z0dd - ZOD - Founder(founder@mechina.com), 5/8/02. Totall re-write of Vehicle 
// station creation. More stable, addresses some power related bugs.

function StationVehiclePad::onAdd(%this, %obj)
{
   Parent::onAdd(%this, %obj);

	%obj.ready = true;
   %obj.setRechargeRate(%obj.getDatablock().rechargeRate);

   //-------------------------------------------------------------
   // All of this moved to StationVehiclePad::createStationVehicle
   //%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;
   //}
   //if(%obj.scoutFlyer !$= "Removed")
   //   %sv.vehicle[scoutFlyer] = true;
   //if(%obj.bomberFlyer !$= "Removed")
   //   %sv.vehicle[bomberFlyer] = true;
   //if(%obj.hapcFlyer !$= "Removed")
   //   %sv.vehicle[hapcFlyer] = true;

   // z0dd - ZOD - Founder. Schedule the vehicle station creation.
   // Don't create the station if the pad is hidden by the current mission type.
   //error("CURRENT MISSION TYPE: " @ $CurrentMissionType @ ", ALLOWED TYPE: " @ %obj.missionTypesList);
   if($CurrentMissionType $= %obj.missionTypesList || %obj.missionTypesList $="")
      %this.schedule(0, "createStationVehicle", %obj);
}

function StationVehiclePad::createStationVehicle(%data, %obj)
{
   // This code used to be called from StationVehiclePad::onAdd
   // This was changed so we can add the station to the mission group
   // so it gets powered properly and auto cleaned up at mission end.

   // Get the v-pads mission group so we can place the station in it.
   %group = %obj.getGroup();

   // Set the default transform based on the vehicle pads slot
   %xform = %obj.getSlotTransform(0);
   %position = getWords(%xform, 0, 2);
   %rotation = getWords(%xform, 3, 5);
   %angle = (getWord(%xform, 6) * 180) / 3.14159;

   // Place these parameter's in the v-pad datablock located in mis file.
   // If the mapper doesn't move the station, use the default location.
   if(%obj.stationPos $= "" || %obj.stationRot $= "")
   {
      %pos = %position;
      %rot = %rotation @ " " @ %angle;
   }
   else
   {
      %pos = %obj.stationPos;
      %rot = %obj.stationRot;
   }

   %sv = new StaticShape() {
	scale = "1 1 1";
      dataBlock = "StationVehicle";
	lockCount = "0";
	homingCount = "0";
	team = %obj.team;
      position = %pos;
      rotation = %rot;
   };

   // Add the station to the v-pads mission group for cleanup and power.
   %group.add(%sv);
   %sv.setPersistent(false); // set the station to not save.

   // Apparently called to early on mission load done, call it now.
   %sv.getDataBlock().gainPower(%sv);

   // Create the trigger
   %sv.getDataBlock().createTrigger(%sv);
   %sv.pad = %obj;
   %obj.station = %sv;
   %sv.trigger.mainObj = %obj;
   %sv.trigger.disableObj = %sv;

   // Set the sensor group.
   if(%sv.getTarget() != -1)
      setTargetSensorGroup(%sv.getTarget(), %obj.team);

   //Remove unwanted vehicles
   if(%obj.scoutVehicle !$= "Removed")
	%sv.vehicle[scoutvehicle] = true;
   if(%obj.SuperScoutVehicle !$= "Removed")
	%sv.vehicle[SuperScoutVehicle] = true;
   if(%obj.assaultVehicle !$= "Removed")
	%sv.vehicle[assaultVehicle] = true;
   if(%obj.mobileBaseVehicle !$= "Removed")
	%sv.vehicle[mobileBasevehicle] = true;
   if(%obj.scoutFlyer !$= "Removed")
	%sv.vehicle[scoutFlyer] = true;
   if(%obj.bomberFlyer !$= "Removed")
	%sv.vehicle[bomberFlyer] = true;
   if(%obj.hapcFlyer !$= "Removed")
	%sv.vehicle[hapcFlyer] = true;
   if(%obj.SuperHAPCFlyer !$= "Removed")
	%sv.vehicle[SuperHAPCFlyer] = true;
   if(%obj.Artillery !$= "Removed")
	%sv.vehicle[Artillery] = true;
}
// End z0dd - ZOD - Founder
// -----------------------------------------------------------------------------

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);
	%pos = getWord(%pos,0) @ " " @ getWord(%pos,1) @ " " @ getWord(%pos,2)+0.8;
	%terrain = getTerrainHeight2(%pos);
	if (!(getWord(%pos,2) < getWord(%terrain,2) || %terrain $= "") || $Host::AllowUnderground)
		//%colObj.setTransform(%pos @ " " @ %rot);//center player on object
      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.~wfx/powered/station_denied.wav');
      }
      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(%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";
      }
   }
}

////-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) {
	if (shouldChangePowerState(%obj,false)) {
		// 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.setCloaked(false);
			%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) {
         // ----------------------------------------------
         // z0dd - ZOD, 5/8/02. Optimized.
         //if(%occupied.inv[%occupied.lastWeapon])
         //   %occupied.use(%occupied.lastWeapon);
         //if(%occupied.getMountedImage($WeaponSlot) == 0) 
         //   %occupied.selectWeaponSlot( 0 );
         if(%occupied.inv[%occupied.lastWeapon])
            %occupied.use(%occupied.lastWeapon);
         else 
            %occupied.selectWeaponSlot( 0 );
         // End z0dd - ZOD
         // ----------------------------------------------
			}
		}
	}
	Parent::onLosePowerDisabled(%data, %obj);
}

// -----------------------------------------------------------------------------
// z0dd - ZOD - Founder(founder@mechina.com), 5/8/02. Totall re-write of Vehicle 
// station creation. More stable, addresses some power related bugs.

// These are not needed anymore.
//function StationVehiclePad::gainPower(%data, %obj)
//{
//   %obj.station.setSelfPowered();
//   Parent::gainPower(%data, %obj);
//}

//function StationVehiclePad::losePower(%data, %obj)
//{
//   %obj.station.clearSelfPowered();
//   Parent::losePower(%data, %obj);
//}
// End z0dd - ZOD - Founder
// -----------------------------------------------------------------------------

//---------------------------------------------------------------------------
// 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
      %rot = getWords(%obj.getTransform(), 3, 6);
	%pos = getWords(%colObj.getTransform(),0,2);
	%terrain = getTerrainHeight2(%pos);
	if (!(getWord(%pos,2) < getWord(%terrain,2) || %terrain $= "") || $Host::AllowUnderground)
		//%colObj.setTransform( %pos @ " " @ %rot );
      return true;
   }
   return false;
}

function DeployedStationInventory::onDestroyed(%data, %obj, %prevState)
{
	if (%obj.isRemoved)
		return;
	%obj.isRemoved = true;
   %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
	remDSurface(%obj);
   %obj.schedule(700, "delete");
   Parent::onDestroyed(%data, %obj, %prevState);
}

function StationInventory::onDestroyed(%data,%obj,%prevState) {
	if (%obj.isRemoved)
		return;
	if (%obj.deployed && ($Host::InvincibleDeployables != 1 || %obj.damageFailedDecon)) {
		%obj.isRemoved = true;
		%obj.trigger.delete();
		$TeamDeployedCount[%obj.team,LargeInventoryDeployable]--;
		remDSurface(%obj);
		%obj.schedule(500,"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;
}

function StationInventory::disassemble(%data,%plyr,%obj) {
	%pl = %obj.triggeredBy;
	%cl = %pl.client;
	if (isObject(%cl)) {
		serverCmdResetControlObject(%cl);
		if (isObject(%pl)) {
			%pl.inStation = "";
			if (!%pl.getMountedImage($WeaponSlot)) {
				if (%pl.inv[%pl.lastWeapon])
					%pl.use(%pl.lastWeapon);
				if (%pl.getMountedImage($WeaponSlot) == 0)
					%pl.selectWeaponSlot(0);
			}
		}
	}
	disassemble(%data,%plyr,%obj);
}

function DeployedStationInventory::disassemble(%data,%plyr,%obj) {
	// Use same code as Large Inventory Station
	StationInventory::disassemble(%data,%plyr,%obj);
}
