//--------------------------------------------------------- // Deployable wall, Code by Parousia //--------------------------------------------------------- datablock StaticShapeData(DeployedWall) : StaticShapeDamageProfile { className = "wall"; shapeFile = "Bmiscf.dts"; // dmiscf.dts, alternate maxDamage = 2; destroyedLevel = 2; disabledLevel = 1.5; isShielded = true; energyPerDamagePoint = 60; maxEnergy = 100; rechargeRate = 0.25; explosion = HandGrenadeExplosion; expDmgRadius = 3.0; expDamage = 0.1; expImpulse = 200.0; dynamicType = $TypeMasks::StaticShapeObjectType; deployedObject = true; cmdCategory = "DSupport"; cmdIcon = CMDSensorIcon; cmdMiniIconName = "commander/MiniIcons/com_deploymotionsensor"; targetNameTag = 'Light Blast Wall'; deployAmbientThread = true; debrisShapeName = "debris_generic_small.dts"; debris = DeployableDebris; heatSignature = 0; needsPower = true; }; datablock ShapeBaseImageData(WallDeployableImage) { mass = 1; emap = true; shapeFile = "stackable1s.dts"; item = WallDeployable; mountPoint = 1; offset = "0 0 0"; deployed = DeployedWall; heatSignature = 0; stateName[0] = "Idle"; stateTransitionOnTriggerDown[0] = "Activate"; stateName[1] = "Activate"; stateScript[1] = "onActivate"; stateTransitionOnTriggerUp[1] = "Idle"; isLarge = false; maxDepSlope = 360; deploySound = ItemPickupSound; minDeployDis = 0; maxDeployDis = 50.0; }; datablock ItemData(WallDeployable) { className = Pack; catagory = "Deployables"; shapeFile = "stackable1s.dts"; mass = 1; elasticity = 0.2; friction = 0.6; pickupRadius = 1; rotate = true; image = "WallDeployableImage"; pickUpName = "a light blast wall pack"; heatSignature = 0; emap = true; }; function WallDeployableImage::testObjectTooClose(%item) { return ""; } function WallDeployableImage::testNoTerrainFound(%item) { // don't check this for non-Landspike turret deployables } function WallDeployable::onPickup(%this, %obj, %shape, %amount) { // created to prevent console errors } function WallDeployableImage::onDeploy(%item, %plyr, %slot) { //Object %className = "StaticShape"; %grounded = 0; if (%item.surface.getClassName() $= TerrainBlock) %grounded = 1; %playerVector = vectorNormalize(-1 * getWord(%plyr.getEyeVector(),1) SPC getWord(%plyr.getEyeVector(),0) SPC "0"); if (%item.surfaceinher == 0) { if (vAbs(floorVec(%item.surfaceNrm,100)) $= "0 0 1") %item.surfaceNrm2 = %playerVector; else %item.surfaceNrm2 = vectorNormalize(vectorCross(%item.surfaceNrm,"0 0 1")); } %scale = "0.5 8 40"; // Search range for total blast wall size. %mCenter = "0 0 -0.5"; %pad = pad(%item.surfacePt SPC %item.surfaceNrm SPC %item.surfaceNrm2,%scale,%mCenter); %scale = getWords(%pad,0,2); %item.surfacePt = getWords(%pad,3,5); %rot = getWords(%pad,6,9); %offset = %plyr.packSet - 1; if (%plyr.packSet == 3) { %double = 1; %offset = 1; } %scale = vectorAdd(%scale,vectorScale("1.01 1.01" SPC %double,mAbs(%offset))); %pup = mCeil(getWord(%scale,0)/4); //4 = Avarage blast wall height. %pside = mCeil(getWord(%scale,1)/4); //4 = Avarage blast wall width. %upiece = getWord(%scale,0)/%pup; %spiece = getWord(%scale,1)/%pside; %scale = vectorMultiply(%scale,1/4 SPC 1/3 SPC 2); %dir = VectorNormalize(vectorSub(%item.surfacePt,%plyr.getposition())); %adjust = vectorNormalize(vectorProject(%dir,vectorCross(%item.surfaceNrm,%item.surfaceNrm2))); // %adjust = vectorNormalize(vectorCross(%item.surfaceNrm,%item.surfaceNrm2)); if (%plyr.packSet == 3) %offset = Lev(vectorCouple(%dir,vectorCross(%item.surfaceNrm,%item.surfaceNrm2))); %adjust = vectorScale(%adjust,-0.5 * %offset); if ($Host::ExpertMode == 1 && %plyr.expertSet == 1) { for (%x = 0;%x < %pup;%x++){ for (%y = 0;%y < %pside;%y++){ %scale = %upiece SPC %spiece SPC 0.5 + %double; %scale = vectorMultiply(%scale,1/4 SPC 1/3 SPC 2); %deplObj = new (%className)() { dataBlock = %item.deployed; scale = %scale; }; %up = vectorScale(%item.surfaceNrm,%upiece * (%x - (%pup / 2) + 0.5)); %side = vectorScale(%item.surfaceNrm2,%spiece * (%y - (%pside / 2) + 0.5)); %tadjust = vectorAdd(%up,vectorAdd(%side,%adjust)); %deplObj.setTransform(vectorAdd(%item.surfacePt,%tadjust) SPC %rot); // [[Settings]]: %deplObj.grounded = %grounded; %deplObj.Needsfit = 1; addDSurface(%item.surface,%deplObj); // [Normal Stuff]]: // if(%deplObj.getDatablock().rechargeRate) // %deplObj.setRechargeRate(%deplObj.getDatablock().rechargeRate); // set team, owner, and handle %deplObj.team = %plyr.client.Team; %deplObj.setOwner(%plyr); // set power frequency %deplObj.powerFreq = %plyr.powerFreq; // 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]++; %deplObj.deploy(); } } } else { %deplObj = new (%className)() { dataBlock = %item.deployed; scale = %scale; }; %deplObj.setTransform(vectorAdd(%item.surfacePt,%adjust) SPC %rot); // [[Settings]]: %deplObj.grounded = %grounded; %deplObj.Needsfit = 1; addDSurface(%item.surface,%deplObj); // [Normal Stuff]]: // if(%deplObj.getDatablock().rechargeRate) // %deplObj.setRechargeRate(%deplObj.getDatablock().rechargeRate); // set team, owner, and handle %deplObj.team = %plyr.client.Team; %deplObj.setOwner(%plyr); // set power frequency %deplObj.powerFreq = %plyr.powerFreq; // 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]++; %deplObj.deploy(); } // Power object checkPowerObject(%deplObj); deployEffect(%deplObj,%item.surfacePt,%item.surfaceNrm,"pad"); return %deplObj; } function DeployedWall::onDestroyed(%this, %obj, %prevState) { if (%obj.isRemoved) return; %obj.isRemoved = true; Parent::onDestroyed(%this, %obj, %prevState); $TeamDeployedCount[%obj.team, WallDeployable]--; remDSurface(%obj); %obj.schedule(500, "delete"); cascade(%obj); fireBallExplode(%obj,1); } function WallDeployableImage::onMount(%data, %obj, %node) { %obj.hasBlast = true; // set for blastcheck %obj.packSet = 0; %obj.expertSet = 0; displayPowerFreq(%obj); } function WallDeployableImage::onUnmount(%data, %obj, %node) { %obj.hasBlast = ""; %obj.packSet = 0; %obj.expertSet = 0; } function doorfunction(%player,%door) { %vec = VectorSub(%door,%player); %dir = VectorNormalize(%vec); %nrm = topVec(VirVec(%door,%dir)); }