////////////////////////////////////////////////////////////////////////////////
//                    Mobile Point Base Teleporter                            //
//                       z0dd - ZOD, 4/24/02                                  //
////////////////////////////////////////////////////////////////////////////////

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 = StationVehicleHumSound;
   // don't let these be damaged in Siege missions
   noDamageInSiege = true;
   cmdCategory = "Support";
   cmdIcon = CMDVehicleStationIcon;
   cmdMiniIconName = "commander/MiniIcons/com_vehicle_pad_inventory";
   targetNameTag = 'MPB';
   targetTypeTag = 'Teleport Station';
   teleporter = 1;
};

datablock ParticleData(mpbteleportparticle)
{
   dragCoefficient = 1.5;
   gravityCoefficient = 0.2;
   inheritedVelFactor = 0.2;
   constantAcceleration = 0.0;
   lifetimeMS = 1000;
   lifetimeVarianceMS = 0;
   textureName = "particleTest";

   colors[0] = "0.06 0.06 0.36 1.0";
   colors[1] = "0.06 0.06 0.36 0.0";
   sizes[0] = 0.65;
   sizes[1] = 0.30;
};

datablock ParticleEmitterData(MPBTeleportEmitter)
{
   ejectionPeriodMS = 5;
   periodVarianceMS = 0;
   ejectionVelocity = 1.1;
   velocityVariance = 1.0;
   ejectionOffset = 2.0;
   thetaMin = 0.0;
   thetaMax = 10.0;
   phiReferenceVel = 0.0;
   phiVariance = 360.0;
   overrideAdvances = false;
   particles = "mpbteleportparticle";
};

function StationVehicle::createTeleporter(%data, %obj, %group)
{
   // %obj = Teleport Object
   // %data = Teleport Datablock
   // %group = Vehicle Pads Mission Group

   %Teleporter = new StaticShape() {
      scale = "1 1 1";
      dataBlock = "MPBTeleporter";
      lockCount = "0";
      homingCount = "0";
      team = %obj.team;
   };
   %obj.teleporter = %Teleporter;
   %Teleporter.vStation = %obj.pad;

   %trans = %obj.pad.getSlotTransform(0);
   %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);

   // Add the teleporter to the v-pads mission group for cleanup and power.
   %group.add(%Teleporter);
   %Teleporter.setPersistent(false); // set the teleporter to not save in the editor.

   // Apparently called to early on mission load done, call it now.
   %Teleporter.getDataBlock().gainPower(%Teleporter);

   // Set the sensor group.
   if(%Teleporter.getTarget() != -1)
      setTargetSensorGroup(%Teleporter.getTarget(), %obj.team);

   // Allow players to use it.
   %Teleporter.disabled = 0;
}

function MPBTeleporter::onCollision(%data, %obj, %col)
{
   if(%col.getDataBlock().className !$= "Armor" || %col.getState() $= "Dead" || %col.teleporting)
      return;

   if(isObject(%col))
   {
      if(%obj.team == %col.client.team)
      {
         if(!%obj.isDisabled())
         {
            if(%obj.isPowered())
            {
               if(isObject(%obj.MPB) && %obj.MPB.fullyDeployed)
               {
                  if(%obj.disabled == 0)
                  {
                     %col.lastWeapon = ( %col.getMountedImage($WeaponSlot) == 0 ) ? "" : %col.getMountedImage($WeaponSlot).getName().item;
                     %col.unmountImage($WeaponSlot);
                     %pos = %obj.position;
                     %col.setvelocity("0 0 0");
                     %col.setMoveState(true);
                     %rot = getWords(%col.getTransform(), 3, 6);
                     %col.setTransform(getWord(%pos,0) @ " " @ getWord(%pos,1) @ " " @ getWord(%pos,2) + 0.6 @ " " @ %rot);
                     %col.teleporting = 1;
                     %col.startFade( 1000, 0, true );
                     %col.playAudio($PlaySound, StationVehicleAcitvateSound);

                     %obj.disabled = 1; // Disable the teleporter to more then one person at a time for a time.
                     %obj.setThreadDir($ActivateThread, TRUE);
                     %obj.playThread($ActivateThread, "activate");

                     %data.sparkEmitter(%obj);
                     %data.schedule(2000, "teleportout", %obj, %col);
                     %data.schedule(4000, "teleportingDone", %obj, %col);
                  }
                  else
                     messageClient(%col.client, 'MsgTeleportRecharging', '\c2Teleporter is recharging please stand by. ~wfx/powered/nexus_deny.wav'); 
               }
               else
                  MessageClient(%col.client, "MsgNoMPB", 'MPB is not deployed.');
            }
            else
               messageClient(%col.client, 'MsgStationNoPower', '\c2Teleporter is not powered.');
         }
         else
            messageClient(%col.client, 'MsgStationDisabled', '\c2Teleporter is disabled.');
      }
      else
         messageClient(%col.client, 'MsgStationDenied', '\c2Access Denied -- Wrong team.~wfx/powered/station_denied.wav');
   }
   else
      return;
}

function MPBTeleporter::teleportOut(%data, %obj, %player)
{
   if(isObject(%obj.MPB))
   {
      %index = -1;
      for(%x=0; %x < %obj.MPB.spawnPosCount; %x++)
      {
         %index = mFloor(getRandom() * %obj.MPB.spawnPosCount);
         InitContainerRadiusSearch(%obj.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, 'MsgTeleFailed', 'No Valid teleporting positions.');
         %player.teleporting = 0;
      }
   }
   else
   {
      messageClient(%player.client, 'MsgTeleFailed', 'No Valid teleporting positions because MPB was destroyed');
      %player.teleporting = 0;
   }
   %data.schedule(1000, "teleportIn", %player);
}

function MPBTeleporter::teleportIn(%data, %player)
{
   %data.sparkEmitter(%player); // z0dd - ZOD, 4/24/02. teleport sparkles
   %player.startFade(1000, 0, false );
   %player.playAudio($PlaySound, StationVehicleDeactivateSound);
}

function MPBTeleporter::reEnable(%data, %obj)
{
   %obj.disabled = 0;
}

function MPBTeleporter::sparkEmitter(%data, %obj)
{
   if (isObject(%obj.teleportEmitter))
      %obj.teleportEmitter.delete();

   %obj.teleportEmitter = new ParticleEmissionDummy() {
      position = %obj.position;
      rotation = "1 0 0 0";
      scale = "1 1 1";
      dataBlock = defaultEmissionDummy;
      emitter = "MPBTeleportEmitter";
      velocity = "1";
   };
   MissionCleanup.add(%obj.teleportEmitter);
   %obj.teleportEmitter.schedule(800, "delete");

   if (isObject(%obj.teleEmitter))
      %obj.teleEmitter.delete();

   %obj.teleEmitter = new ParticleEmissionDummy() {
      position = %obj.position;
      rotation = "1 0 0 0";
      scale = "1 1 1";
      dataBlock = defaultEmissionDummy;
      emitter = "FlyerJetEmitter";
      velocity = "1";
   };
   MissionCleanup.add(%obj.teleEmitter);
   %obj.teleEmitter.schedule(700, "delete");
}

function MPBTeleporter::teleportingDone(%data, %obj, %player)
{
   %player.setMoveState(false);
   %player.teleporting = 0;
   %player.station = "";
   %data.reEnable(%obj);
   if(%player.getMountedImage($WeaponSlot) == 0)
   {
      if(%player.inv[%player.lastWeapon])
         %player.use(%player.lastWeapon); 
      else
         %player.selectWeaponSlot( 0 );
   }
}

//------------------------------------------------------------------------------------------
// Gets called from function MobileBaseVehicle::vehicleDeploy(%data, %obj, %player, %force).
// Passes this information to the MPBTeleporter::teleportOut function.
//------------------------------------------------------------------------------------------

function checkSpawnPos(%MPB, %radius)
{
   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++;
   }
   %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(mAbs(%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;
}
