//---------------------------------------------------------
// Shockfield
//---------------------------------------------------------

//Inventory Data
addPack("Shock Field", "ForcePack", 6, "hud_new_packinventory", 0, 0, 0, 0, 1, 0, 0, 0);

datablock StaticShapeData(ForcePackDeployed) : StaticShapeDamageProfile
{
   className = Static;
   shapeFile = "deploy_sensor_motion.dts";
   maxDamage = 1.7;
   destroyedLevel = 1.7;
   disabledLevel = 1.7;
   explosion = DeployablesExplosion;
   dynamicType = $TypeMasks::SensorObjectType;
   deployedObject = true;
   cmdCategory = "DSupport";
   cmdIcon = CMDSensorIcon;
   cmdMiniIconName = "commander/MiniIcons/com_deploymotionsensor";
   targetNameTag = 'Shock Field';
   targetTypeTag = 'Beacon';
   deployAmbientThread = true;
   debrisShapeName = "debris_generic_small.dts";
   debris = DeployableDebris;
   heatSignature = 0;
};

datablock ShapeBaseImageData(ForcePackImage)
{
   emap = true;
   shapeFile = "pack_deploy_sensor_motion.dts";
   item = ForcePack;
   mountPoint = 1;
   offset = "0 -0.2 -0.25";
   deployed = ForcePackDeployed;
   heatSignature = 0;

   stateName[0] = "Idle";
   stateTransitionOnTriggerDown[0] = "Activate";

   stateName[1] = "Activate";
   stateScript[1] = "onActivate";
   stateTransitionOnTriggerUp[1] = "Idle";

   isLarge = true;
   maxDepSlope = 360; // 30
   deploySound = ItemPickupSound;

   flatMinDeployDis   = 0.0;
   flatMaxDeployDis   = 5.0;

   minDeployDis = 0.0;
   maxDeployDis = 5.0;
};

datablock ItemData(ForcePack)
{
   className = Pack;
   catagory = "Deployables";
   shapeFile = "Stackable1s.dts";
   mass = 5.0;
   elasticity = 0.2;
   friction = 0.6;
   pickupRadius = 1;
   rotate = true;
   image = "ForcePackImage";
   pickUpName = "a shock field beacon";
   emap = true;
   computeCRC = false;
   maxSensors = 2;
};

datablock ForceFieldBareData(DepField) : StaticShapeDamageProfile
{
  fadeMS = 1000;
  baseTranslucency = 0.3;
  powerOffTranslucency = 0.0;
  dynamicType = $TypeMasks::DamagableItemObjectType;

  teamPermiable = true;
  otherPermiable = true;
  color            = "1.0 0.0 0.0";
  powerOffColor    = "1.0 0.0 0.0";

  cmdIcon = CMDSwitchIcon;
  cmdCategory = "DSupport";
  cmdMiniIconName = "commander/MiniIcons/com_switch_grey";
  targetNameTag = 'Deployed';
  targetTypeTag = 'Forcefield';

  texture[0] = "skins/forcef1";
  texture[1] = "skins/forcef2";
  texture[2] = "skins/forcef3";
  texture[3] = "skins/forcef4";
  texture[4] = "skins/forcef5";

  framesPerSec = 10;
  numFrames = 5;
  scrollSpeed = 15;
  umapping = 1.0;
  vmapping = 0.15;
};

function scanForForcePack(%obj, %range)
{

InitContainerRadiusSearch(posFromTransForm(%obj.getTransform()), %range, $TypeMasks::StaticShapeObjectType);

%found = containerSearchNext();

while(%found)
{

  %foundtype = %found.getDataBlock().getName();
  // echo("found: " @ %foundtype);
  if (%foundtype $= "ForcePackDeployed" && %found != %obj && !%found.connected) //a forcepack, but NOT ME!!!
  {
    %finalfound = %found;
  }

  %found = containerSearchNext();
}


// echo("Returning: " @ %finalfound.getDataBlock.getName());


return %finalfound;
}

function ForcePackImage::onDeploy(%item, %plyr, %slot)
{


%deplObj = Parent::onDeploy(%item, %plyr, %slot);

%loc = posFromTransform(%deplObj.getTransform());
%position = VectorAdd(%loc, "0 0 0.3 ");

%facevec = rotFromTransform(%plyr.getTransform());
%deployedangle = rotFromTransform(%deplObj.getTransform());



%partner = scanForForcePack(%deplObj, 10); //10m max forcefield length

if (%partner)
{

  %deplObj.partner = %partner;
  %partner.partner = %deplObj;

  %deplobj.connected = true;

  %partner.connected = true;

  %partnerpos = posFromTransform(%partner.getTransform());

  //////////////////////////////
  //Vector Stuff, get the proper rotation so the field goes between beacons!
  /////////////////////////////

  %src = setWord(%position, 2, 0);
  %dest = setWord(%partnerpos, 2, 0);

  %difference = VectorSub(%dest, %src);
  %distance = VectorLen(%difference);

  %dirvec = VectorNormalize(%difference);

  %radian = mAcos(getWord(%dirvec, 1));
  %angle = mRadtoDeg(%radian);//(%radian / 0.0175);
  //%rotation = " 0 0 1 " @ (270 - %angle);

  if(%src < %dest)
    %rotation = " 0 0 1 " @ (- (270 - %angle) + 180);
  else
    %rotation = " 0 0 1 " @ (270 - %angle ) ;

  if(%src < %dest)
    %rots = " 0 0 1 " @ -%angle;
  else
    %rots = " 0 0 1 " @ %angle;


  %mod = VectorScale(RotateVecNinety(%dirvec), 1);

  //Make the field

  %deplObj.field = new ForceFieldBare()
  {
    position = %position;
    rotation = %rotation;
    scale = %distance @ " 0.02 4.5 ";
    dataBlock = "DepField";
    owner[1] = %deplObj;
    owner[2] = %partner;
    team = %deplObj.team;
  };
  //Now some final intialisation, make each part "aware" of other parts.
  //Power them up, and make them useable

  %deplObj.field.active = true;


  %deplObj.field.getDatablock().gainPower(%deplObj.field);
  %partner.field = %deplObj.field;
  MissionCleanup.add(%deplObj.field);
  %deplObj.trigger = new Trigger()
  {
     dataBlock = ShockfieldTrigger;
     polyhedron = "0.000000 1.0000000 0.0000000 1.0000000 0.0000000 0.0000000 0.0000000 -1.0000000 0.0000000 0.0000000 0.0000000 1.0000000";
     position = %deplObj.field.position;
     rotation = %deplObj.field.rotation;
     scale    = %deplObj.field.scale;
  };
   MissionCleanUp.add(%deplObj.trigger);

  return %deplObj;

}
}

function ForcePackImage::getInitialRotation(%item, %plyr)
{
   %rotAxis = vectorNormalize(vectorCross(%item.surfaceNrm, "0 0 1"));
   if (getWord(%item.surfaceNrm, 2) == 1 || getWord(%item.surfaceNrm, 2) == -1)
      %rotAxis = vectorNormalize(vectorCross(%item.surfaceNrm, "0 1 0"));
   return %rotAxis SPC mACos(vectorDot(%item.surfaceNrm, "0 0 1"));
}

function ForcePackDeployed::onDestroyed(%this, %obj, %prevState)
{
  %removecount = 0;
  if(!%obj.iskilled)
  {
    %obj.iskilled = true;
    if(isObject(%obj.partner) && !%obj.partner.iskilled)
    {
      %obj.trigger.schedule(20, "delete");
      %obj.partner.schedule(20, "delete");
      $TeamDeployedCount[%obj.team, ForcePack]--;
      %obj.partner.iskilled = true;
    }
    %obj.schedule(20, "delete");
    $TeamDeployedCount[%obj.team, ForcePack]--;
    %obj.field.getDataBlock().losepower(%obj.field);
    %obj.field.schedule(20, "delete");
  }
}

