====================\ ForceField Deployable ====================/ Give credit to Hammer. This is a stand alone *.cs file named forecFields.cs, Goes in the packs directory, read the notes. On to the goodies... Code: -------------------------------------------------------------------------------- // Deployable Force Fields // Taken straight from the Hammer mod // ©2001 Hammer Dev Team. All rights reserved. // Goes at the very bottom of deployables.cs // exec("scripts/packs/forceFields.cs"); // this goes in function ShapeBaseImageData::testInvalidDeployConditions(%item, %plyr, %slot) // In deployables.cs if (!%item.deployed.checkDeployPos(%xform)) { // Allow certain things to bypass the check if(%item.item $= "SmallShieldBeaconPack" || %item.item $= "LargeShieldBeaconPack") { %disqualified = $NotDeployableReason::None; } else { %disqualified = $NotDeployableReason::ObjectTooClose; } } $TeamDeployableMax[SmallShieldBeaconPack] = 10; $TeamDeployableMax[LargeShieldBeaconPack] = 8; datablock AudioProfile(ShieldBeaconSound) { filename = "fx/powered/inv_pad_appear.wav"; description = AudioClosest3d; preload = true; }; datablock ShapeBaseImageData(ShieldBeaconDeployableImage) { emap = true; shapeFile = "camera.dts"; mountPoint = 1; rotation = "1 0 0 270"; offset = "0 0 0"; heatSignature = 0; stateName[0] = "Idle"; stateTransitionOnTriggerDown[0] = "Activate"; stateName[1] = "Activate"; stateScript[1] = "onActivate"; stateTransitionOnTriggerUp[1] = "Idle"; isLarge = true; maxDepSlope = 30; deploySound = StationDeploySound; flatMinDeployDis = 1.0; flatMaxDeployDis = 5.0; minDeployDis = 2.5; maxDeployDis = 5.0; }; datablock ShapeBaseImageData(SmallShieldBeaconDeployableImage) : ShieldBeaconDeployableImage { mass = 4; item = SmallShieldBeaconPack; deployed = SmallShieldBeaconDeployedBase; }; datablock ShapeBaseImageData(LargeShieldBeaconDeployableImage) : ShieldBeaconDeployableImage { mass = 8; item = LargeShieldBeaconPack; deployed = LargeShieldBeaconDeployedBase; }; datablock ItemData(ShieldBeaconPack) // stem class not for real use { className = Pack; catagory = "Deployables"; shapeFile = "camera.dts"; mass = 2.0; elasticity = 0.2; friction = 0.6; pickupRadius = 2; rotate = false; heatSignature = 0; emap = true; }; datablock ItemData(SmallShieldBeaconPack) : ShieldBeaconPack { image = "SmallShieldBeaconDeployableImage"; pickUpName = "a small force field beacon"; }; datablock ItemData(LargeShieldBeaconPack) : ShieldBeaconPack { image = "LargeShieldBeaconDeployableImage"; pickUpName = "a large force field beacon"; }; datablock SensorData(ShieldBeaconBaseSensorObj) { detects = false; detectsUsingLOS = true; detectsPassiveJammed = false; detectsActiveJammed = false; detectsCloaked = false; detectionPings = true; detectRadius = 10; }; datablock StaticShapeData(ShieldBeaconDeployedBase) : StaticShapeDamageProfile // stem class { className = "Station"; catagory = "Deployables"; shapefile = "camera.dts"; rechargeRate = 0.31; needsNoPower = true; mass = 2.0; maxDamage = 1.50; destroyedLevel = 1.50; disabledLevel = 1.05; repairRate = 0.004; explosion = SmallTurretExplosion; expDmgRadius = 1.0; expDamage = 0.3; expImpulse = 1000.0; deployedObject = true; energyPerDamagePoint = 50; maxEnergy = 50; humSound = SensorHumSound; heatSignature = 0.05; pausePowerThread = true; debrisShapeName = "debris_generic_small.dts"; debris = DeployableDebris; cmdIcon = CMDSwitchIcon; cmdCategory = "DSupport"; cmdMiniIconName = "commander/MiniIcons/com_switch_grey"; targetNameTag = 'Deployed'; targetTypeTag = 'Force Field Beacon'; sensorData = ShieldBeaconBaseSensorObj; sensorRadius = ShieldBeaconBaseSensorObj.detectRadius; sensorColor = "0 212 45"; firstPersonOnly = true; //lightOnlyStatic = true; lightType = "PulsingLight"; lightColor = "0 1 0 1"; lightTime = 1200; lightRadius = 6; }; datablock StaticShapeData(SmallShieldBeaconDeployedBase) : ShieldBeaconDeployedBase { targetNameTag = 'Small'; }; datablock StaticShapeData(LargeShieldBeaconDeployedBase) : ShieldBeaconDeployedBase { targetNameTag = 'Large'; }; datablock ForceFieldBareData(DeployedTeamSlowFieldAlwaysBlue) : StaticShapeDamageProfile { fadeMS = 1000; baseTranslucency = 0.2; powerOffTranslucency = 0.0; dynamicType = $TypeMasks::DamagableItemObjectType; teamPermiable = true; otherPermiable = false; color = "0.28 0.28 0.99"; powerOffColor = "0.28 0.28 0.99"; cmdIcon = CMDSwitchIcon; cmdCategory = "DSupport"; cmdMiniIconName = "commander/MiniIcons/com_switch_grey"; targetNameTag = 'Deployed'; targetTypeTag = 'Force Field Generator'; 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; damageScale[$DamageType::Sniper] = 0.3; }; function initBeaconShield(%obj, %height, %width, %depth) { %scale = (%width / 2) @ " " @ %depth @ " " @ %height; %rotation = %obj.ownerDirection; %vec = VectorSub("0 0 0", %rotation); // shields deploy east, which way is that from where i was standing? %radian = mAcos(getWord(%vec, 1)); %angle = (%radian / 0.0175); %newrot = "0 0 1 " @ %angle; %obj.playAudio(1, ShieldBeaconSound); %surfacePt = VectorAdd(posFromTransform(%obj.getTransform()), "0 0 0.05"); %obj.shield[1] = new forceFieldBare() { position = %surfacePt; rotation = %newrot; scale = %scale; dataBlock = "DeployedTeamSlowFieldAlwaysBlue"; team = %obj.team; }; MissionCleanup.add(%obj.shield[1]); %newrot = "0 0 1 " @ 180 + %angle; %obj.shield[2] = new forceFieldBare() { position = %surfacePt; rotation = %newrot; scale = %scale; dataBlock = "DeployedTeamSlowFieldAlwaysBlue"; team = %obj.team; }; MissionCleanup.add(%obj.shield[2]); %obj.shield[1].deployBase = %obj; %obj.shield[2].deployBase = %obj; %obj.shield[1].getDatablock().gainPower(%obj.shield[1]); %obj.shield[2].getDatablock().gainPower(%obj.shield[2]); %obj.shield[1].target = createTarget(%obj.shield[1], "Force Field", "", "", "", 0, 0); %obj.shield[2].target = createTarget(%obj.shield[2], "Force Field", "", "", "", 0, 0); setTargetSensorGroup(%obj.shield[1].getTarget(), %obj.team); setTargetSensorGroup(%obj.shield[2].getTarget(), %obj.team); } function SmallShieldBeaconDeployedBase::onDestroyed(%data, %obj, %lastState) { %mineTeam = %obj.sourceObject.team; $TeamDeployedCount[%mineTeam, SmallShieldBeaconPack]--; %obj.playAudio(1, ShieldBeaconSound); Parent::onDestroyed(%data, %obj, %lastState); clearShield(%obj, 1); clearShield(%obj, 2); %obj.schedule(150, "delete"); } function LargeShieldBeaconDeployedBase::onDestroyed(%data, %obj, %lastState) { %mineTeam = %obj.sourceObject.team; $TeamDeployedCount[%mineTeam, LargeShieldBeaconPack]--; %obj.playAudio(1, ShieldBeaconSound); Parent::onDestroyed(%data, %obj, %lastState); clearShield(%obj, 1); clearShield(%obj, 2); %obj.schedule(150, "delete"); } function SmallShieldBeaconDeployableImage::testNoInteriorFound(%item) { return %item.surface.getClassName() !$= InteriorInstance; } function LargeShieldBeaconDeployableImage::testNoInteriorFound(%item) { return %item.surface.getClassName() !$= InteriorInstance; } function SmallShieldBeaconDeployableImage::onDeploy(%item, %plyr, %slot) { %deplObj = Parent::onDeploy(%item, %plyr, %slot); %playerFacingVec = MatrixMulVector("0 0 0 " @ getWords(%plyr.getTransform(), 3, 6), "0 1 0"); %deplObj.ownerDirection = VectorNormalize(%playerFacingVec); %deplObj.playThread($AmbientThread, "ambient"); %deplObj.team = %plyr.team; %deplObj.sourceObject = %plyr; setTargetSensorGroup(%deplObj.getTarget(), %deplObj.team); %deplObj.setSelfPowered(); %height = 5; //peek around for low ceilings.. %mask = $TypeMasks::InteriorObjectType | $TypeMasks::StaticObjectType; %eyeTrans = %deplObj.getTransform(); %eyeEnd = vectorAdd(%eyeTrans, "0 0" SPC %height); %eyePos = VectorAdd(posFromTransform(%eyeTrans), "0 0 1.5"); // a little above it %res = containerRayCast(%eyePos, %eyeEnd, %mask, 0); if(%res) // adjust height for low ceilings { %target = firstWord(%res); %ceiling = (VectorDist(posFromTransform(%deplObj.getTransform()), posFromTransform(%target.getTransform())) / 3.1); } MissionCleanup.add(%deplObj); schedule(1700, %deplObj, "initBeaconShield", %deplObj, %height, 6, 0.02); return %deplObj; } function LargeShieldBeaconDeployableImage::onDeploy(%item, %plyr, %slot) { %deplObj = Parent::onDeploy(%item, %plyr, %slot); %pos = %deplObj.getPosition(); %deplObj.setTransform(VectorAdd(%pos, "0 0 0.05")); %playerFacingVec = MatrixMulVector("0 0 0 " @ getWords(%plyr.getTransform(), 3, 6), "0 1 0"); %deplObj.ownerDirection = VectorNormalize(%playerFacingVec); %deplObj.playThread($AmbientThread, "ambient"); %deplObj.team = %plyr.team; %deplObj.sourceObject = %plyr; setTargetSensorGroup(%deplObj.getTarget(), %deplObj.team); %deplObj.setSelfPowered(); %height = 8; //peek around for low ceilings.. %mask = $TypeMasks::InteriorObjectType | $TypeMasks::StaticObjectType; %eyeTrans = %deplObj.getTransform(); %eyeEnd = vectorAdd(%eyeTrans, "0 0" SPC %height); %eyePos = VectorAdd(posFromTransform(%eyeTrans), "0 0 1.5"); // a little above it %res = containerRayCast(%eyePos, %eyeEnd, %mask, 0); if(%res) // adjust height for low ceilings { %target = firstWord(%res); %ceiling = (VectorDist(posFromTransform(%deplObj.getTransform()), posFromTransform(%target.getTransform())) / 3.1); } MissionCleanup.add(%deplObj); schedule(1700, %deplObj, "initBeaconShield", %deplObj, %height, 11, 0.02); return %deplObj; } function ShieldBeaconPack::onPickup(%this, %obj, %shape, %amount) { // created to prevent console errors } function clearShield(%obj, %index) { %shield = %obj.shield[%index]; if(isObject(%shield)) { %shield.getDatablock().losePower(%shield); %shield.delete(); } } function DeployedTeamSlowFieldAlwaysBlue::damageObject(%data, %targetObject, %sourceObject, %position, %amount, %damageType) { echo("dtsfab::do"); // damageObject on the cap %base = %targetObject.deployBase; %base.getDataBlock().damageObject(%base, %sourceObject, %position, %amount, %damageType); }