//--------------------------------------------------------------------------
// Deployable Generator
//--------------------------------------------------------------------------
$ReverseDeployItem[BatteryGen] = GeneratorDeployable;
function checkForWater(%obj)
{
   %position = %obj.getPosition();
   InitContainerRadiusSearch(%position, 3, $TypeMasks::WaterObjectType); // 1m
   while((%found = containerSearchNext()) != 0)
   {
      if(!isObject(%found))
        return false;
      else
        return true;
    }
}

function checkForLight(%obj)
{
   cancel(%obj.lightCheck);
   if(!isObject(%obj))
      return;
   
      %realsky = strreplace(Sky.materialList,".dml","");   // results of pure boredom
      %realsky = strreplace(%realsky,"_","");

      if(strstr(%realsky,"night") != -1)
         %nightsky = 1;
      else
         %nightsky = 0;

      if((!calcBuildingInWay(%obj.getPosition(), "Sun")) || (%nightsky)) {
       if(!%obj.isSwitchedOff) {
        togglegenerator(%obj,0);
        %obj.solarDisabled = true;
       }
      }
      else {
        if(%obj.isSwitchedOff) {
        %obj.solarDisabled = 0;
        togglegenerator(%obj,1);
        }
   }
  %obj.lightCheck = schedule(3000,0,checkForLight,%obj);
}

datablock ShapeBaseImageData(GeneratorDeployableImage) {
	mass = 20;
	emap = true;
	shapeFile = "stackable1s.dts";
	item = GeneratorDeployable;
	mountPoint = 1;
	offset = "0 0 0";
	deployed = GeneratorLarge;
	heatSignature = 0;

	stateName[0] = "Idle";
	stateTransitionOnTriggerDown[0] = "Activate";

	stateName[1] = "Activate";
	stateScript[1] = "onActivate";
	stateTransitionOnTriggerUp[1] = "Idle";

	isLarge = true;
	maxDepSlope = 360;
	deploySound = ItemPickupSound;

	minDeployDis = 2;
	maxDeployDis = 5;
};

datablock ItemData(GeneratorDeployable) {
	className = Pack;
	catagory = "Deployables";
	shapeFile = "stackable1s.dts";
	mass = 5.0;

	hasLight = true;
	lightType = "PulsingLight";
	lightColor = "0.2 0.0 0.9 0.5";
	lightTime = "1000";
	lightRadius = "2";

	elasticity = 0.2;
	friction = 0.6;
	pickupRadius = 3;
	rotate = true;
	image = "GeneratorDeployableImage";
	pickUpName = "a generator pack";
	heatSignature = 0;
	emap = true;
};

function GeneratorDeployableImage::testNoTerrainFound(%item) {
	// don't check this for non-Landspike turret deployables
}

//function GeneratorDeployable::onPickup(%this, %obj, %shape, %amount) {
//	// created to prevent console errors
//}

function GeneratorDeployableImage::onDeploy(%item, %plyr, %slot) {
	%className = "StaticShape";

	%playerVector = vectorNormalize(getWord(%plyr.getEyeVector(),1) SPC -1 * getWord(%plyr.getEyeVector(),0) SPC "0");

	if (vAbs(floorVec(%item.surfaceNrm,100)) $= "0 0 1")
		%item.surfaceNrm2 = vectorScale(%playerVector,-1);
	else
		%item.surfaceNrm2 = vectorNormalize(vectorCross(%item.surfaceNrm,"0 0 1"));

	%rot = fullRot(%item.surfaceNrm,%item.surfaceNrm2);
if(%plyr.expertSet == 0
   || %plyr.expertSet == 3)
	   %item.surfacePt = vectorAdd(%item.surfacePt,vectorScale(vectorNormalize(vectorCross(%item.surfaceNrm,%item.surfaceNrm2)),2));

    if ($Host::Purebuild == 1)
		if (%plyr.expertSet == 0)
			%mode = 0;
		else
			%mode = %plyr.expertSet;
	else {
		%mode = 0;
	}

	switch (%mode) {
		case 0:
			%mode = "GeneratorLarge";
               %scale = "1 1 1";
                           %moo = "0";
		case 1:
			%mode = "MiniNuclearPlant";
               %scale = "1 1 1";
                           %moo = "0";
		case 2:
			%mode = "LavaPlant";
             %scale = "1 1 1";
                         %moo = "1";
		case 3:
			%mode = "MiniGen";
            %scale = "0.5 0.5 0.5";
                        %moo = "0";
 		case 4:
			%mode = "BatteryGen";
            %scale = "1 1 1";
            %moo = "0";
 		case 5:
			%mode = "SolarPanel";
            %scale = "1 1 1";
            %moo = "0";
		default:
			%mode = "GeneratorLarge";
           %scale = "1 1 1";
            %moo = "0";
	}


    //%deplObj.type = %mode;

	%deplObj = new (%className)() {
		dataBlock = %mode;
		deployed = true;
        scale = %scale;
	};

	// set orientation
	%deplObj.setTransform(%item.surfacePt SPC %rot);

	// set team, owner, and handle
	%deplObj.team = %plyr.client.Team;
	%deplObj.setOwner(%plyr);

	// set power frequency
	%deplObj.powerFreq = %plyr.powerFreq;
    if(%mode !$= "BatteryGen")
    	setTargetName(%deplObj.target,addTaggedString("Frequency" SPC %deplObj.powerFreq));
    else {
    	setTargetName(%deplObj.target,addTaggedString("|100%| Charged Frequency" SPC %deplObj.powerFreq));
      %deplObj.batteryLife = 100;
    }
	// set power
	%deplObj.setSelfPowered();

	// set the sensor group if it needs one
	if (%deplObj.getTarget() != -1)
		setTargetSensorGroup(%deplObj.getTarget(), %plyr.client.team);

	// place the deployable in the MissionCleanup/Deployables group (AI reasons)
	addToDeployGroup(%deplObj);

	//let the AI know as well...
	AIDeployObject(%plyr.client, %deplObj);

	// play the deploy sound
	serverPlay3D(%item.deploySound, %deplObj.getTransform());

	// increment the team count for this deployed object
	$TeamDeployedCount[%plyr.team, %item.item]++;

	addDSurface(%item.surface,%deplObj);

	%deplObj.playThread($PowerThread,"Power");

	// take the deployable off the player's back and out of inventory
	//%plyr.unmountImage(%slot);
	//%plyr.decInventory(%item.item, 1);
    if(%plyr.expertSet == 5) {
       checkForLight(%deplObj);
  %dir = vectorNormalize(vectorSub(Sun.getPosition(),%deplObj.getPosition()));
   %p = createProj(BasicTargeter,TargetProjectile,%deplObj.getPosition(),%dir);
   schedule(3000,0,killit,%p);
   }

    if(%plyr.expertSet == 2)
       %check = checkForWater(%deplObj);
    else
       %check = 1;   //default 1
       
    if(!%check) {
      %deplObj.clearSelfPowered();
      LavaPlant::onLosePowerDisabled(%deplObj.getDatablock(),%deplObj);
      messageClient(%plyr.client,0,'\c2No water or lava found.');
    }
    else
      $PowerList = listAdd($PowerList,%deplObj,-1);
    
    
	return %deplObj;
}

function GeneratorLarge::onDestroyed(%this,%obj,%prevState) {
	if (%obj.isRemoved)
		return;
	if (%obj.deployed && ($Host::InvincibleDeployables != 1 || %obj.damageFailedDecon)) {
		%obj.isRemoved = true;
        if($Quantium::ExtraSparks) {
          for(%i=0;%i<mFloor(getRandom(2,4));%i++) {
        	%x = (getRandom() * 0.4) - 0.2;
		    %y = (getRandom() * 0.4) - 0.2;
		    %z = getRandom() / 2;
		    %vec = %x SPC %y SPC %z;
            createProj(DeployableSparks,GrenadeProjectile,%obj.getWorldBoxCenter(),%vec);
          }
        }
		%loc = findWord($PowerList,%obj);
		if (%loc !$= "")
			$PowerList = listDel($PowerList,%loc);
		$TeamDeployedCount[%obj.team,GeneratorDeployable]--;
		remDSurface(%obj);
		%obj.schedule(500,"delete");
	}
	Parent::onDestroyed(%data,%obj,%prevState);
}
function MiniNuclearPlant::onDestroyed(%this,%obj,%prevState) {
	if (%obj.isRemoved)
		return;
	if (%obj.deployed && ($Host::InvincibleDeployables != 1 || %obj.damageFailedDecon)) {
		%obj.isRemoved = true;
          if($Quantium::ExtraSparks) {
       for(%i=0;%i<mFloor(getRandom(3,6));%i++) {
        	%x = (getRandom() * 0.4) - 0.2;
		    %y = (getRandom() * 0.4) - 0.2;
		    %z = getRandom() / 2;
		    %vec = %x SPC %y SPC %z;
            createProj(DeployableSparks,GrenadeProjectile,%obj.getWorldBoxCenter(),%vec);
          }
        }
		%loc = findWord($PowerList,%obj);
		if (%loc !$= "")
			$PowerList = listDel($PowerList,%loc);
		$TeamDeployedCount[%obj.team,GeneratorDeployable]--;
		remDSurface(%obj);
		%obj.schedule(500,"delete");
	}
	Parent::onDestroyed(%data,%obj,%prevState);
}
function LavaPlant::onDestroyed(%this,%obj,%prevState) {
	if (%obj.isRemoved)
		return;
	if (%obj.deployed && ($Host::InvincibleDeployables != 1 || %obj.damageFailedDecon)) {
		%obj.isRemoved = true;
            if($Quantium::ExtraSparks) {
          for(%i=0;%i<mFloor(getRandom(1,4));%i++) {
        	%x = (getRandom() * 0.4) - 0.2;
		    %y = (getRandom() * 0.4) - 0.2;
		    %z = getRandom() / 2;
		    %vec = %x SPC %y SPC %z;
            createProj(DeployableSparks,GrenadeProjectile,%obj.getWorldBoxCenter(),%vec);
          }
        }
		%loc = findWord($PowerList,%obj);
		if (%loc !$= "")
			$PowerList = listDel($PowerList,%loc);
		$TeamDeployedCount[%obj.team,GeneratorDeployable]--;
		remDSurface(%obj);
		%obj.schedule(500,"delete");
	}
	Parent::onDestroyed(%data,%obj,%prevState);
}
function MiniGen::onDestroyed(%this,%obj,%prevState) {
	if (%obj.isRemoved)
		return;
	if (%obj.deployed && ($Host::InvincibleDeployables != 1 || %obj.damageFailedDecon)) {
		%obj.isRemoved = true;
        if($Quantium::ExtraSparks) {
          for(%i=0;%i<mFloor(getRandom(1,3));%i++) {
        	%x = (getRandom() * 0.4) - 0.2;
		    %y = (getRandom() * 0.4) - 0.2;
		    %z = getRandom() / 2;
		    %vec = %x SPC %y SPC %z;
            createProj(DeployableSparks,GrenadeProjectile,%obj.getWorldBoxCenter(),%vec);
          }
        }
  
		%loc = findWord($PowerList,%obj);
		if (%loc !$= "")
			$PowerList = listDel($PowerList,%loc);
		$TeamDeployedCount[%obj.team,GeneratorDeployable]--;
		remDSurface(%obj);
		%obj.schedule(500,"delete");
	}
	Parent::onDestroyed(%data,%obj,%prevState);
}
function BatteryGen::onDestroyed(%this,%obj,%prevState) {
	if (%obj.isRemoved)
		return;
	if (%obj.deployed && ($Host::InvincibleDeployables != 1 || %obj.damageFailedDecon)) {
		%obj.isRemoved = true;
        if($Quantium::ExtraSparks) {
          for(%i=0;%i<mFloor(getRandom(1,4));%i++) {
        	%x = (getRandom() * 0.4) - 0.2;
		    %y = (getRandom() * 0.4) - 0.2;
		    %z = getRandom() / 2;
		    %vec = %x SPC %y SPC %z;
            createProj(DeployableSparks,GrenadeProjectile,%obj.getWorldBoxCenter(),%vec);
          }
        }
  
%obj.batteryLife = 0;
		%loc = findWord($PowerList,%obj);
		if (%loc !$= "")
			$PowerList = listDel($PowerList,%loc);
		$TeamDeployedCount[%obj.team,GeneratorDeployable]--;
		remDSurface(%obj);
		%obj.schedule(500,"delete");
	}
	Parent::onDestroyed(%data,%obj,%prevState);
}
function GeneratorDeployableImage::onMount(%data,%obj,%node) {
	%obj.hasGen = true; // set for gencheck
	%obj.hasGenerator = true; // set for gencheck
	displayPowerFreq(%obj);
}

function GeneratorDeployableImage::onUnmount(%data,%obj,%node) {
	%obj.hasGen = "";
	%obj.hasGenerator = "";
}
datablock StaticShapeData(MiniNuclearPlant) : StaticShapeDamageProfile
{
   className      = Generator;
   catagory       = "Generators";
   shapeFile      = "stackable3l.dts";
   explosion      = VehicleBombExplosion;
   maxDamage      = 4.2;
   destroyedLevel = 4.2;
   disabledLevel  = 4.0;
   expDmgRadius = 15.0;
   expDamage = 1.0;
   expImpulse = 3000.0;
   noIndividualDamage = true; //flag to make these invulnerable for certain mission types

   dynamicType = $TypeMasks::GeneratorObjectType;
   isShielded = true;
   energyPerDamagePoint = 30;
   maxEnergy = 50;
   rechargeRate = 0.05;
   humSound = GeneratorHumSound;

   cmdCategory = "Support";
   cmdIcon = "CMDGeneratorIcon";
   cmdMiniIconName = "commander/MiniIcons/com_generator";
   targetTypeTag = 'Mini Nuclear Reactor';

   debrisShapeName = "debris_generic.dts";
   debris = StaticShapeDebris;
	powerRadius = 200;
};
datablock StaticShapeData(MiniGen) : StaticShapeDamageProfile
{
   className      = Generator;
   catagory       = "Generators";
   shapeFile      = "station_generator_large.dts";
   explosion      = ShapeExplosion;
   maxDamage      = 0.50;
   destroyedLevel = 0.50;
   disabledLevel  = 0.20;
   expDmgRadius = 10.0;
   expDamage = 0.5;
   expImpulse = 1500.0;
   noIndividualDamage = true; //flag to make these invulnerable for certain mission types

   dynamicType = $TypeMasks::GeneratorObjectType;
   isShielded = true;
   energyPerDamagePoint = 30;
   maxEnergy = 50;
   rechargeRate = 0.05;
   humSound = "";

   cmdCategory = "Support";
   cmdIcon = "CMDGeneratorIcon";
   cmdMiniIconName = "commander/MiniIcons/com_generator";
   targetTypeTag = 'Mini Toggle Generator';

   debrisShapeName = "debris_generic.dts";
   debris = StaticShapeDebris;
	powerRadius = 60;
};
datablock StaticShapeData(LavaPlant) : StaticShapeDamageProfile
{
   className      = Generator;
   catagory       = "Generators";
   shapeFile      = "stackable5l.dts";
   explosion      = ShapeExplosion;
   maxDamage      = 0.40;
   destroyedLevel = 0.40;
   disabledLevel  = 0.15;
   expDmgRadius = 10.0;
   expDamage = 0.5;
   expImpulse = 1500.0;
   noIndividualDamage = true; //flag to make these invulnerable for certain mission types

   dynamicType = $TypeMasks::GeneratorObjectType;
   isShielded = true;
   energyPerDamagePoint = 30;
   maxEnergy = 50;
   rechargeRate = 0.05;
   humSound = GeneratorHumSound;

   cmdCategory = "Support";
   cmdIcon = "CMDGeneratorIcon";
   cmdMiniIconName = "commander/MiniIcons/com_generator";
   targetTypeTag = 'Water & Lava Power Converter';

   debrisShapeName = "debris_generic.dts";
   debris = StaticShapeDebris;
	powerRadius = 110;
};
datablock StaticShapeData(BatteryGen) : StaticShapeDamageProfile
{
   className      = Generator;
   catagory       = "Generators";
   shapeFile      = "stackable1l.dts";
   explosion      = ShapeExplosion;
   maxDamage      = 0.20;
   destroyedLevel = 0.20;
   disabledLevel  = 0.15;
   expDmgRadius = 10.0;
   expDamage = 0.5;
   expImpulse = 1500.0;
   noIndividualDamage = true; //flag to make these invulnerable for certain mission types

   dynamicType = $TypeMasks::GeneratorObjectType;
   isShielded = true;
   energyPerDamagePoint = 30;
   maxEnergy = 50;
   rechargeRate = 0.05;
   humSound = "";

   cmdCategory = "Support";
   cmdIcon = "CMDGeneratorIcon";
   cmdMiniIconName = "commander/MiniIcons/com_generator";
   targetTypeTag = 'Battery';

   debrisShapeName = "debris_generic.dts";
   debris = StaticShapeDebris;
	powerRadius = 120;
};
//  function StaticShapeData::onEnterLiquid(%data, %obj, %coverage, %type)
//{
//   %obj.isWet = true;
//   switch(%type)
//   {
//      case 0:
//         //Water
//         %obj.isWet = true;
//      case 1:
//         //Ocean Water
//         %obj.isWet = true;
//      case 2:
//         //River Water
//         %obj.isWet = true;
//      case 3:
//         //Stagnant Water
//         %obj.isWet = true;
//      case 4:
//         //Lava
//         %obj.isInLava = true;
//         %obj.isWet = false;
//      case 5:
//         //Hot Lava
//       //  %obj.liquidDamage(%data, $VehicleDamageHotLava, $DamageType::Lava);
//          %obj.isInLava = true;
//          %obj.isWet = false;
//      case 6:
//         //Crusty Lava
//         //%obj.liquidDamage(%data, $VehicleDamageCrustyLava, $DamageType::Lava);
//         %obj.isInLava = true;
//         %obj.isWet = false;
//      case 7:
//         //Quick Sand
//   }
//}
//function StaticShapeData::onLeaveLiquid(%data, %obj, %coverage, %type)
//{
//   %obj.isWet = false;
//   switch(%type)
//   {
//      case 0:
//         //Water
//         %obj.isWet = false;
//      case 1:
//         //Ocean Water
//         %obj.isWet = false;
//      case 2:
//         //River Water
//         %obj.isWet = false;
//      case 3:
//         //Stagnant Water
//         %obj.isWet = false;
//      case 4:
//         //Lava
//         %obj.isInLava = false;
//         %obj.isWet = false;
//      case 5:
//         //Hot Lava
//       //  %obj.liquidDamage(%data, $VehicleDamageHotLava, $DamageType::Lava);
//          %obj.isInLava = false;
//          %obj.isWet = false;
//      case 6:
//         //Crusty Lava
//         //%obj.liquidDamage(%data, $VehicleDamageCrustyLava, $DamageType::Lava);
//         %obj.isInLava = false;
//         %obj.isWet = false;
//      case 7:
//         //Quick Sand
//   }
//}
