Shield beacons & Shield Generators Tut Compiled by Defender........... Notes: This will cover adding a deployable Shield beacons & Shield Generators from the hammer mod.. But there is a problem with the Beacons object to close.. Step #1 To begin we will copy and past the code in Step #1 to the bottom of the deployables.cs //****************************************************************************************** // shieldgenpack.cs - ShieldGenerator pack :code by team hammer //****************************************************************************************** // shieldbeacon.cs - Shield Beacon Pack // datablock AudioProfile(ShieldBeaconSound) { filename = "fx/powered/inv_pad_appear.wav"; description = AudioClosest3d; preload = true; }; datablock ShapeBaseImageData(ShieldBeaconDeployableImage) // not for resale { emap = true; //shapeFile = "pack_deploy_sensor_motion.dts"; 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; minDeployDis = 0.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; computeCRC = true; 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; }; // shieldgenpack.cs - ShieldGenerator pack // datablock AudioProfile(ShieldGenSound) { filename = "fx/powered/inv_pad_appear.wav"; description = AudioClosest3d; preload = true; }; datablock ShapeBaseImageData(ShieldGeneratorDeployableImage) { mass = 15; emap = true; shapeFile = "pack_deploy_sensor_motion.dts"; item = ShieldGeneratorPack; mountPoint = 1; offset = "0 0 0"; deployed = ShieldGeneratorDeployedBase; heatSignature = 0; stateName[0] = "Idle"; stateTransitionOnTriggerDown[0] = "Activate"; stateName[1] = "Activate"; stateScript[1] = "onActivate"; stateTransitionOnTriggerUp[1] = "Idle"; isLarge = true; maxDepSlope = 30; deploySound = StationDeploySound; minDeployDis = 0.5; maxDeployDis = 5.0; }; datablock ItemData(ShieldGeneratorPack) { className = Pack; catagory = "Deployables"; shapeFile = "pack_deploy_sensor_motion.dts"; mass = 4.0; elasticity = 0.2; friction = 0.6; pickupRadius = 2; rotate = false; image = "ShieldGeneratorDeployableImage"; pickUpName = "a deployable force field generator"; heatSignature = 0; computeCRC = true; emap = true; }; datablock SensorData(ShieldGeneratorBaseSensorObj) { detects = false; detectsUsingLOS = true; detectsPassiveJammed = false; detectsActiveJammed = false; detectsCloaked = false; detectionPings = true; detectRadius = 10; }; datablock StaticShapeData(ShieldGeneratorDeployedBase) : StaticShapeDamageProfile { className = "Station"; catagory = "Deployables"; //shapefile = "solarpanel.dts"; shapefile = "deploy_sensor_motion.dts"; rechargeRate = 0.31; needsNoPower = true; mass = 2.0; maxDamage = 1.60; destroyedLevel = 1.60; disabledLevel = 1.35; repairRate = 0; explosion = SmallTurretExplosion; expDmgRadius = 2.0; expDamage = 0.8; expImpulse = 2000.0; deployedObject = true; energyPerDamagePoint = 50; maxEnergy = 50; humSound = SensorHumSound; heatSignature = 0; pausePowerThread = true; debrisShapeName = "debris_generic_small.dts"; debris = DeployableDebris; cmdIcon = CMDSwitchIcon; cmdCategory = "DSupport"; cmdMiniIconName = "commander/MiniIcons/com_switch_grey"; targetNameTag = 'Force Field'; targetTypeTag = 'Generator'; sensorData = ShieldGeneratorBaseSensorObj; sensorRadius = ShieldGeneratorBaseSensorObj.detectRadius; sensorColor = "0 212 45"; firstPersonOnly = true; damageScale[$DamageType::Sniper] = 0.2; //lightOnlyStatic = true; lightType = "PulsingLight"; lightColor = "0 1 0 1"; lightTime = 1200; lightRadius = 6; }; datablock ForceFieldBareData(DeployedTeamSlowFieldBareGreen): StaticShapeDamageProfile { fadeMS = 1000; baseTranslucency = 0.2; powerOffTranslucency = 0.0; dynamicType = $TypeMasks::DamagableItemObjectType; teamPermiable = true; otherPermiable = false; color = "0.28 0.89 0.31"; powerOffColor = "0.0 0.0 0.0"; cmdCategory = "DSupport"; targetNameTag = 'Force Field'; texture[0] = "skins/forcef1"; texture[1] = "skins/forcef2"; texture[2] = "skins/forcef3"; texture[3] = "skins/forcef4"; texture[4] = "skins/forcef5"; damageScale[$DamageType::Sniper] = 0.2; framesPerSec = 10; numFrames = 5; scrollSpeed = 15; umapping = 1.0; vmapping = 0.15; }; datablock ForceFieldBareData(DeployedShieldBeam) { fadeMS = 1000; baseTranslucency = 0.3; powerOffTranslucency = 0.3; teamPermiable = true; otherPermiable = false; color = "0.28 0.28 0.99"; powerOffColor = "0 0 0"; targetTypeTag = 'Force Field'; 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; }; // testshape.cs // datablock ShapeBaseImageData(TestImage) { mass = 15; emap = true; shapeFile = "stackable1s.dts"; item = TestData; mountPoint = 1; offset = "0 -0.2 0"; deployed = CatapultPadDeployedBase; heatSignature = 0.5; stateName[0] = "Idle"; stateTransitionOnTriggerDown[0] = "Activate"; stateName[1] = "Activate"; stateScript[1] = "onActivate"; stateTransitionOnTriggerUp[1] = "Idle"; isLarge = true; maxDepSlope = 30; deploySound = StationDeploySound; }; datablock ItemData(TestData) { // className = Pack; catagory = "Deployables"; shapeFile = "stackable1s.dts"; mass = 3.0; elasticity = 0.2; friction = 0.6; pickupRadius = 1; rotate = false; image = "TestImage"; pickUpName = "a catapult pad"; heatSignature = 0; computeCRC = true; emap = true; }; function serverCmdMakeObject(%client, %shapeFile) { %search = %shapeFile; %xoff = 0; for( %file = findFirstFile( %search ); %file !$= ""; %file = findNextFile( %search ) ) { %xoff += 5; %name = fileBase( %file ); // get the name %pos = %client.player.getWorldBoxCenter(); echo(%name); %newpos = VectorAdd(%pos, "0" SPC %xoff SPC "1"); %i = new ("StaticShape")() { dataBlock = ShieldGeneratorDeployedBase; }; //%i = new ("StaticShape")() //{ //datablock = ShieldGeneratorDeployedBase; //position = %newpos; //shapeName = %name @ ".dts"; //targetNameTag = %name @ ".dts"; //}; %i.setTransform(%newpos SPC "0 0 1"); %i.target = createTarget(%i, %name @ ".dts", "", "", "", 0, 0); setTargetSensorGroup(%i.getTarget(), %client.player.team); %i.playThread($AmbientThread, "ambient"); } } // shield.cs // function initBeaconShield(%obj, %height, %width, %depth) { %scale = (%width / 2) @ " " @ %depth @ " " @ %height; //%rotation = %obj.ownerDirection; %rotation= rotfromTransform(%obj.GetTransform()); %vec = VectorSub("0 0 0", %rotation); // shields deploy east, which way is that from where i was standing? //%radian = mAcos(getWord(%vec, 1)); %radian = getword(%rotation,3); %angle = (%radian / 0.0175); if(getword(%rotation,2)<0) %angle=360-%angle; %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]); //createTarget(%obj.shield[1], 'Force Field', "", "", 'Noo', 0, 0); %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); //%height = (%height < %ceiling) ? %height : %ceiling; } 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); //%height = (%height < %ceiling) ? %height : %ceiling; } MissionCleanup.add(%deplObj); schedule(1700, %deplObj, "initBeaconShield", %deplObj, %height, 11, 0.02); return %deplObj; } function SmallShieldBeaconDeployedBase::disassemble(%data, %plyr, %hTgt) { clearShield(%hTgt, 1); clearShield(%hTgt, 2); } function LargeShieldBeaconDeployedBase::disassemble(%data, %plyr, %hTgt) { clearShield(%hTgt, 1); clearShield(%hTgt, 2); } function ShieldBeaconPack::onPickup(%this, %obj, %shape, %amount) { // created to prevent console errors } function ShieldGeneratorDeployableImage::testNoTerrainFound(%item) { // lets look up for ceilings, its ok to deploy them on a floor as long as its outside.. // look for 20 meters straight up %searchRange = 20.0; %mask = $TypeMasks::InteriorObjectType | $TypeMasks::StaticObjectType; %eyeVec = "0 0 1"; // up %eyeTrans = %item.surfacePt; %eyePos = VectorAdd(posFromTransform(%eyeTrans), "0 0 1.5"); // a little above it // scale (lengthen) the normalized eye vector according to the search range %scEyeVec = VectorScale(%eyeVec, %searchRange); // add the scaled & normalized eye vector to the position of the generator %eyeEnd = VectorAdd(%eyePos, %scEyeVec); // see if anything gets hit %res = containerRayCast(%eyePos, %eyeEnd, %mask, 0); return %res; } function ShieldGeneratorDeployedBase::onDamage(%this, %obj) { Parent::onDamage(%this, %obj); if(%obj.cap) // hurt my cap %obj.cap.setDamageLevel(%obj.getDamageLevel()); if(%obj.base) // im a cap, hurt my base %obj.base.setDamageLevel(%obj.getDamageLevel()); } function ShieldGeneratorDeployedBase::onDestroyed(%this, %obj, %prevState) { Parent::onDestroyed(%this, %obj, %prevState); for(%x = 0; %x <= 2; %x++) clearShield(%obj, %x); // beam $TeamDeployedCount[%obj.team, ShieldGeneratorPack]--; %obj.schedule(200, "delete"); } function clearShield(%obj, %index) { %shield = %obj.shield[%index]; if(isObject(%shield)) { %shield.getDatablock().losePower(%shield); %shield.delete(); } } function ShieldGeneratorPack::onAdd(%this) { Parent::onAdd(%this); %this.connected[1] = 0; %this.connected[2] = 0; %this.connections = 0; // created to prevent console errors } function ShieldGeneratorPack::onPickup(%this, %obj, %shape, %amount) { // created to prevent console errors } function ShieldGenUpdate(%obj) { // echo("shieldgenupdate"); for(%x = 1; %x <= %obj.connections; %x ++) { if(%obj.connected[%x] && !isObject(%obj.connected[%x])) { clearShield(%obj, %x); %obj.connected[%x] = 0; %obj.connections--; %obj.playAudio(1, TelePadBeamSound); } } %surfacePt = posFromTransform(%obj.getTransform()); %found = closestNotConnected(%obj); if(%found) { %distance_to = %obj.distances[%found]; if(%obj.connections > 1) // we are full { %farthest = farthestConnected(%obj); if(%distance_to < %obj.distances[%farthest]) // there is a non connected one closer then our farthest connection.. { for(%x = 1; %x <= %obj.connections; %x ++) // destroy the one that is far away.. { if(%obj.connected[%x] == %farthest) { clearShield(%obj, %x); %obj.connected[%x] = 0; %obj.connections--; %obj.playAudio(1, TelePadBeamSound); } } } } if(%obj.connections < 2) { %fnd_pos = %found.getPosition(); %target = setWord(%fnd_pos, 2, 0); %src = setWord(%surfacePt, 2, 0); %vec = VectorNormalize(VectorSub(%target, %src)); %mask = $TypeMasks::VehicleObjectType | $TypeMasks::StationObjectType | $TypeMasks::GeneratorObjectType | $TypeMasks::SensorObjectType | $TypeMasks::TurretObjectType | $TypeMasks::PlayerObjectType | $TypeMasks::StaticOjectType | $TypeMasks::TerrainObjectType | $TypeMasks::InteriorObjectType; %res = containerRayCast(VectorAdd(%surfacePt, "0 0 1.5"), VectorAdd(%fnd_pos, "0 0 1.5"), %mask, 0); if(!%res) // no shit between us { %obj.connections++; if(!%obj.shield[1]) %newshieldidx = 1; else %newshieldidx = 2; %radian = mAcos(getWord(%vec, 1)); %angle = (%radian / 0.0175); %newrot = " 0 0 1 " @ (270 - %angle); %height = 6; %src_z = getWord(%surfacePt, 2); %tar_z = getWord(%fnd_pos, 2); if(%src_z > %tar_z) %height -= (%src_z - %tar_z); %obj.playAudio(1, TelePadBeamSound); %obj.shield[%newshieldidx] = new forceFieldBare() { position = vectorAdd(%surfacePt, "0 0 0.3"); rotation = %newrot; scale = %distance_to @ " .05" SPC %height; dataBlock = "DeployedTeamSlowFieldBareGreen"; team = %obj.team; }; %obj.shield[%newshieldidx].deployBase = %obj; %obj.shield[%newshieldidx].getDatablock().gainPower(%obj.shield[%newshieldidx]); %obj.shield[%newshieldidx].target = createTarget(%obj.shield[%newshieldidx], "Force Field", "", "", "", 0, 0); setTargetSensorGroup(%obj.shield[%newshieldidx].getTarget(), %obj.team); //%obj.shield[%obj.connections].getDatablock().gainPower(%obj.shield[%obj.connections]); MissionCleanup.add(%obj.shield[%newshieldidx]); %obj.connected[%newshieldidx] = %found; echo("obj " @ %obj @" found " @ %found); } } } else { //echo("found shit"); } schedule(2000, %obj, "ShieldGenUpdate", %obj); } function closestNotConnected(%obj) { %surfacePt = posFromTransform(%obj.getTransform()); InitContainerRadiusSearch(%surfacePt, 16, $TypeMasks::StaticShapeObjectType); %found = containerSearchNext(); %obj.closest = 0; while(%found) { %nearestDist = 2000; %foundName = %found.getDataBlock().getName(); if(%foundName $= "ShieldGeneratorDeployedBase" && // if it is a potential lover %found != %obj && // and its not me %found.team == %obj.team && // and on the same team %found.FieldBasePoint && // and its not a cap %found.connections < 2 && // and it has the capacity to love %obj.connected[1] != %found && // im not connected to it %obj.connected[2] != %found && // im not connected to it %found.connected[1] != %obj && // and it is not connected to me %found.connected[2] != %obj) // and it is not connected to me { //echo(" foundnb " @%foundName); // we found a nearby generator %obj_pos = %obj.getPosition(); %fnd_pos = %found.getPosition(); %obj_x = getWord(%obj_pos, 0); %obj_y = getWord(%obj_pos, 1); %obj_z = getWord(%obj_pos, 2); %fnd_x = getWord(%fnd_pos, 0); %fnd_y = getWord(%fnd_pos, 1); %fnd_z = getWord(%fnd_pos, 2); %target = setWord(%fnd_pos, 2, 0); %src = setWord(%obj_pos, 2, 0); if((%src > %target) && ((%fnd_z - %obj_z) < 0.3)) { %distance_to = VectorDist(%src, %target); // we're good, add it to the list %obj.distances[%found] = %distance_to; if(%distance_to < %nearestDist) { //echo("dist " @ %distance_to); %nearestDist = %distance_to; %obj.closest = %found; } } else { //echo("z prob " @ (%fnd_z - %obj_z)); } } %found = containerSearchNext(); } return %obj.closest; } function farthestConnected(%obj) { %farthest = -1; for(%x = 1; %x <= %obj.connections; %x ++) { if(%obj.distances[%obj.connected[%x]] > %farthest) { %farthest = %obj.distances[%obj.connected[%x]]; %ff = %obj.connected[%x]; } } return %ff; } function ShieldGeneratorDeployableImage::onDeploy(%item, %plyr, %slot) { %deplObj = Parent::onDeploy(%item, %plyr, %slot); //attach the cap %capObj = new ("StaticShape")() { dataBlock = ShieldGeneratorDeployedBase; }; //mark the base %deplObj.FieldBasePoint = true; %deplObj.cap = %capObj; %capObj.base = %deplObj; //not connected to other gens yet %deplObj.connections = 0; %deplObj.connected[1] = 0; %deplObj.connected[2] = 0; %rot = vectorAdd(%rot, "0 0 1"); %cappoint = vectorAdd(%item.surfacePt, "0 0 6.2"); %capObj.setTransform(%cappoint SPC %rot); setTargetSensorGroup(%capObj.getTarget(), %deplObj.team); %capObj.playThread($AmbientThread, "ambient"); %deplObj.playThread($AmbientThread, "ambient"); %deplObj.shield[0] = new forceFieldBare() { position = %item.surfacePt; rotation = "0 0 0 0"; scale = ".05 .05 6.4"; dataBlock = "DeployedShieldBeam"; team = %deplObj.team; }; %deplObj.shield[0].setSelfPowered(); //%deplObj.shield[0].playThread($PowerThread,"Power"); //%deplObj.shield[0].getDatablock().gainPower(%deplObj.shield[0]); MissionCleanup.add(%deplObj.shield[0]); schedule(1000, %deplObj, "ShieldGenUpdate", %deplObj); return %deplObj; } function ShieldGeneratorDeployedBase::disassemble(%data, %plyr, %hTgt) { if(%hTgt.cap) { // i am a base clearShield(%hTgt, 0); // beam clearShield(%hTgt, 1); clearShield(%hTgt, 2); %hTgt.cap.delete(); } if(%hTgt.base) { //i am a cap %hTgt.base.schedule(400, "delete"); clearShield(%hTgt.base, 0); // beam clearShield(%hTgt.base, 1); clearShield(%hTgt.base, 2); %hTgt.base.delete(); } } // lrg/sm ff's 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); } // ff generators function DeployedTeamSlowFieldBareGreen::damageObject(%data, %targetObject, %sourceObject, %position, %amount, %damageType) { echo("dtsfbg::do"); // damageObject on the cap %base = %targetObject.deployBase; %base.getDataBlock().damageObject(%base, %sourceObject, %position, %amount, %damageType); echo("base " @%base); %otherBase = %base.connected[1]; echo(%otherBase); echo(%otherBase.shield[1]); echo(%otherBase.shield[2]); %otherBase = %base.connected[2]; echo(%otherBase); echo(%otherBase.shield[1]); echo(%otherBase.shield[2]); echo(%targetObject); if (%otherBase == %targetObject) { %other.getDataBlock().damageObject(%other, %sourceObject, %position, %amount, %damageType); } else { %other = %base.connected[2]; %other.getDataBlock().damageObject(%other, %sourceObject, %position, %amount, %damageType); } } ////////////////////////////////////////////////////////////////////////////////////////////// Step #2. in inventoryhud.cs find the $InvPack and $NTInvPack arrays, then add the blast wall to each of them(only add it to $NTInvPack array if you want people to be able to use it on non team games) This is simple to do, but for those of you that dont know what to do here is the code: $InvPack[20] = "Force Field Generator"; $InvPack[21] = "Small Force Field Beacon"; $InvPack[22] = "Large Force Field Beacon"; $NTInvPack[12] = "Force Field Generator"; $NTInvPack[13] = "Small Force Field Beacon"; $NTInvPack[14] = "Large Force Field Beacon"; now those numbers depend on how many packs are already there, so set it to the next availible number for each one. Also in inventoryhud.cs add the Shield Generator to the $NameToInv array, like so: $NameToInv["Force Field Generator"] = "ShieldGeneratorPack"; $NameToInv["Small Force Field Beacon"] = "SmallShieldBeaconPack"; $NameToInv["Large Force Field Beacon"] = "LargeShieldBeaconPack"; Step #3. now open up Hud.cs and find the $BackpackHudData array, then add the Shield Generator to it like so: $BackpackHudData[21, itemDataName] = "ShieldGeneratorPack"; $BackpackHudData[21, bitmapName] = "gui/hud_new_packinventory"; $BackpackHudData[22, itemDataName] = "SmallShieldBeaconPack"; $BackpackHudData[22, bitmapName] = "gui/hud_new_packinventory"; $BackpackHudData[23, itemDataName] = "LargeShieldBeaconPack"; $BackpackHudData[23, bitmapName] = "gui/hud_new_packinventory"; Again, those numbers will vary, also dont forget to increase the.... Step #4. Now we need to set the team count for Shield Generator to 0 every time there is a new game, so open defaultgame.cs and find the clearDeployableMaxes function, then add the Shield Generator like so: $TeamDeployedCount[%i, ShieldGeneratorPack] = 0; $TeamDeployedCount[%i, SmallShieldBeaconPack] = 0; $TeamDeployedCount[%i, LargeShieldBeaconPack] = 0; Step #5. Now open player.cs and add the Shield Generator to the max inventory for each male human armor, for each armor you want to have it use this: max[ShieldGeneratorPack] = 1; max[SmallShieldBeaconPack] = 1; max[LargeShieldBeaconPack] = 1; if you dont want the armor to have it, use this: max[ShieldGeneratorPack] = 0; max[SmallShieldBeaconPack] = 0; max[LargeShieldBeaconPack] = 0; Step #6. now open deployables.cs find the $TeamDeployableMax array and add the Shield Generator to it like so: $TeamDeployableMax[ShieldGeneratorPack] = 22; $TeamDeployableMax[SmallShieldBeaconPack] = 12; $TeamDeployableMax[LargeShieldBeaconPack] = 8; END of the tut................................