TWM2/scripts/packs/door.cs
2014-02-26 13:54:04 -06:00

510 lines
14 KiB
C#

datablock StaticShapeData(DeployedDoor) : StaticShapeDamageProfile {
className = "door";
shapeFile = "Pmiscf.dts"; // b or 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 = 'Door';
deployAmbientThread = true;
debrisShapeName = "debris_generic_small.dts";
debris = DeployableDebris;
heatSignature = 0;
needsPower = true;
};
datablock ShapeBaseImageData(DoorDeployableImage) {
mass = 1;
emap = true;
shapeFile = "stackable1s.dts";
item = DoorDeployable;
mountPoint = 1;
offset = "0 0 0";
deployed = DeployedDoor;
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(DoorDeployable) {
className = Pack;
catagory = "Deployables";
shapeFile = "stackable1s.dts";
mass = 1;
elasticity = 0.2;
friction = 0.6;
pickupRadius = 1;
rotate = true;
image = "DoorDeployableImage";
pickUpName = "an Advanced Door Pack";
heatSignature = 0;
emap = true;
};
function DoorDeployableImage::testObjectTooClose(%item) {
return "";
}
function DoorDeployableImage::testNoTerrainFound(%item) {
// don't check this for non-Landspike turret deployables
}
function DoorDeployable::onPickup(%this, %obj, %shape, %amount) {
// created to prevent console errors
}
function doorDeployableImage::onMount(%data, %obj, %node) {
%obj.hasDoor = true; // set for blastcheck
%obj.packSet = 0;
%obj.packSet[0] = 0;
%obj.packSet[1] = 0;
%obj.packSet[2] = 0;
%obj.expertSet = 0;
displayPowerFreq(%obj);
}
function doorDeployableImage::onUnmount(%data, %obj, %node) {
%obj.hasDoor = "";
%obj.packSet = 0;
%obj.packSet[0] = 0;
%obj.packSet[1] = 0;
%obj.packSet[2] = 0;
%obj.expertSet = 0;
}
function doorDeployableImage::onDeploy(%item, %plyr, %slot) {
%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"));
}
}
%rot1 = fullRot(%item.surfaceNrm,%item.surfaceNrm2);
%scale1 = "0.5 6 160";
%scale2 = "0.5 8 160";
%dataBlock = %item.deployed;
%space = rayDist(%item.surfacePt SPC %item.surfaceNrm,%scale1,$AllObjMask);
if (%space != getWord(%scale1,1))
%type = true;
%scale1 = getWord(%scale1,0) SPC getWord(%scale1,0) SPC %space;
%mCenter = "0 0 -0.5";
%pad = pad(%item.surfacePt SPC %item.surfaceNrm SPC %item.surfaceNrm2,%scale2,%mCenter);
%scale2 = getWords(%pad,0,2);
%item.surfacePt2 = getWords(%pad,3,5);
//%vec1 = realVec(getWord(%item.surface,0),%item.surfaceNrm);
//%vec1 = realVec(%pad,%item.surfaceNrm);
%vec1 =validateVal(MatrixMulVector("0 0 0",%item.surfaceNrm));
if (!%scaleIsSet){
%scale1 = vectorMultiply(%scale1,1/4 SPC 1/3 SPC 2);
%scale2 = vectorMultiply(%scale2,1/4 SPC 1/3 SPC 2);
%x = (getWord(%scale2,1)/0.166666)*0.125;
%scale3 = %x SPC 0.166666 SPC getWord(%scale1,2);
}
%dir1 = VectorNormalize(vectorSub(%item.surfacePt,%item.surfacePt2));
%adjust1 = vectorNormalize(vectorProject(%dir1,vectorCross(%item.surfaceNrm,%item.surfaceNrm2)));
%offset1 = -0.5;
%adjust1 = vectorScale(%adjust1,-0.5 * %offset1);
%deplObj = new (%className)() {
dataBlock = %dataBlock;
scale = %scale3;
};
%deplObj.closedscale = %scale3;
%deplObj.openedscale = getwords(%scale3,0,1) SPC 0.1;
//
%deplObj.savedclosedscale = %scale3;
%deplObj.savedopenedscale = getwords(%scale3,0,1) SPC 0.1;
//
//////////////////////////Apply settings//////////////////////////////
// exact:
//%deplObj.setTransform(%item.surfacePt SPC %rot1);
%deplObj.setTransform(vectorAdd(VectorAdd(%item.surfacePt2, VectorScale(%vec1,getword(%scale3,2)/-4)),%adjust1) SPC %rot1);
// misc info
addDSurface(%item.surface,%deplObj);
// [[Settings]]:
%deplObj.grounded = %grounded;
%deplObj.needsFit = 1;
%deplObj.isdoor = 1;
// [[Normal Stuff]]:
// 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();
%owner = %deplObj.getOwner(); //this is for leveled cards
if(%plyr.packSet[1] == 0) {
%deplobj.timeout = "0";
}
else if(%plyr.packSet[1] == 1) {
%deplobj.timeout = ".5";
}
else if(%plyr.packSet[1] == 2) {
%deplobj.timeout = "1";
}
else if(%plyr.packSet[1] == 3) {
%deplobj.timeout = "2";
}
else if(%plyr.packSet[1] == 4) {
%deplobj.timeout = "3";
}
else if(%plyr.packSet[1] == 5) {
%deplobj.timeout = "4";
}
if(%plyr.packSet[2] == 1) {
%deplobj.cankill = 1;
}
else {
%deplobj.cankill = 0;
}
%deplobj.hasslided=0;
if (%plyr.packSet[0]==0)
%deplobj.toggletype=0;
if (%plyr.packSet[0]==1)
%deplobj.toggletype=1;
if (%plyr.packSet[0]==2) {
%deplobj.toggletype=0;
%deplobj.powercontrol=1; //staticshape.cs function StaticShapeData::onGainPowerEnabled |and| function StaticShapeData::onLosePowerDisabled
} //for power togle code
if (%plyr.packSet[0]==3) {
%deplobj.toggletype=2;
%deplobj.powercontrol=1;
}
if (%plyr.packSet[0]==4) {
%deplobj.toggletype=3;
%deplobj.powercontrol=1;
}
//collision door
if (%plyr.packSet[0]==5){
%deplobj.toggletype=0;
%deplobj.Collision = true;
%deplobj.lv =0;
}
//Level 1 Door
if (%plyr.packSet[0]==6){
%deplobj.toggletype=0;
%deplobj.Collision = true;
%deplobj.lv =1;
%plyr.client.haslev1[%plyr.client.GUID] = 1;
}
//Level 2 Door
if (%plyr.packSet[0]==7){
%deplobj.toggletype=0;
%deplobj.Collision = true;
%deplobj.lv =2;
%plyr.client.haslev2[%plyr.client.GUID] = 1;
}
//Level 3 Door
if (%plyr.packSet[0]==8){
%deplobj.toggletype=0;
%deplobj.Collision = true;
%deplobj.lv =3;
%plyr.client.haslev3[%plyr.client.GUID] = 1;
}
//owner door
if (%plyr.packSet[0]==9){
%deplobj.toggletype=0;
%deplobj.Collision = true;
%deplobj.lv =4;
}
//admin door
if (%plyr.packSet[0]==10){
%deplobj.toggletype=0;
%deplobj.Collision = true;
%deplobj.lv =5;
}
//super admin door
if (%plyr.packSet[0]==11){
%deplobj.toggletype=0;
%deplobj.Collision = true;
%deplobj.lv =6;
}
//developer door
if (%plyr.packSet[0]==12){
%deplobj.toggletype=0;
%deplobj.Collision = true;
%deplobj.lv =7;
}
%deplobj.canmove = true;
// Power object
checkPowerObject(%deplObj);
return %deplObj;
}
function Deployeddoor::onDestroyed(%this, %obj, %prevState) {
if (%obj.isRemoved)
return;
%obj.isRemoved = true;
Parent::onDestroyed(%this, %obj, %prevState);
$TeamDeployedCount[%obj.team, TdoorDeployable]--;
remDSurface(%obj);
%obj.schedule(500,"delete");
cascade(%obj);
fireBallExplode(%obj,1);
}
function Deployeddoor::disassemble(%data,%plyr,%hTgt) {
disassemble(%data,%plyr,%hTgt);
}
function doorDeployableImage::onMount(%data,%obj,%node) {
%obj.hasdoor = true; // set for mspinecheck
%obj.packSet = 0;
%obj.packSet[0] = 0;
%obj.packSet[1] = 0;
%obj.packSet[2] = 0;
%obj.expertSet = 0;
displayPowerFreq(%obj);
}
function doorDeployableImage::onUnmount(%data,%obj,%node) {
%obj.hasdoor = "";
%obj.packSet = 0;
%obj.packSet[0] = 0;
%obj.packSet[1] = 0;
%obj.packSet[2] = 0;
%obj.expertSet = 0;
}
////////////////////
////////////////////
function open(%obj){
if (!isObject(%obj))
return;
if (%obj.canmove == true){
%obj.moving = "open"; //wat direction its moving
%obj.prevscale =%obj.scale; //scale befor this change
%obj.closedscale=%obj.scale;//scale it is while fully closed
%obj.canmove = false;
}
if (getWord(%obj.scale,2)<0.3){
%obj.issliding = 0;
%obj.scale = getWord(%obj.scale,0) SPC getWord(%obj.scale,1) SPC 0.1;
%obj.settransform(%obj.gettransform());
%obj.state = "opened"; //last state used for savebuilding
%obj.openedscale = %obj.scale;
if (%obj.toggletype ==0)
schedule(%obj.timeout*1000,0,"close",%obj,1);
else
%obj.canmove = true;
return;
}
%obj.scale = getWord(%obj.scale,0) SPC getWord(%obj.scale,1) SPC getWord(%obj.prevscale,2)-0.4;
%obj.settransform(%obj.gettransform());
%obj.prevscale=%obj.scale;
schedule(40,0,"open",%obj);
}
/////////////////////
/////////////////////
function close(%obj,%timeout){
if (!isObject(%obj))
return;
if (%obj.canmove == true){
%obj.moving = "close"; //wat direction its moving
%obj.prevscale =%obj.scale; //scale befor this change
%obj.openedscale=%obj.scale;//scale it is while fully opened
%obj.canmove = false;
}
if (getWord(%obj.scale,2)>getWord(%obj.closedscale,2)-0.2){
%obj.issliding = 0;
%obj.scale =getWord(%obj.scale,0) SPC getWord(%obj.scale,1) SPC getWord(%obj.closedscale,2);
%obj.settransform(%obj.gettransform());
%obj.state = "closed"; //last state used for savebuilding
%obj.closedscale = %obj.scale;
%obj.canmove = true;
return;
}
%obj.scale = getWord(%obj.scale,0) SPC getWord(%obj.scale,1) SPC getWord(%obj.prevscale,2)+0.4;
%obj.settransform(%obj.gettransform());
%obj.prevscale=%obj.scale;
//killer doors (Advanced Door Pack)
%killcheck=ContainerRayCast(%obj.getedge("1 1 1"), %obj.getedge("-1 -1 -1"), $typemasks::Playerobjecttype, %obj);
if (isplayer(%killcheck) && %obj.cankill) {
doorkill(%killcheck);
}
// -End-
schedule(40,0,"close",%obj);
}
function doorkill(%obj) {
if(!%obj.isBoss) {
%obj.scriptkill();
messageall(1,'%1 Tastes the wrath of a door.', %obj.client.name);
}
}
//MODES
function ChangedoorMode(%this, %PriSec) {
if(%PriSec == 1) { //Primary
%this.ExpertSet++;
%this.packSet[%this.ExpertSet] = 0; //Reset Secondary Mode TO Prevent Errors
if (%this.ExpertSet > 2) {
%this.ExpertSet = 0;
}
DisplayDoorInfo(%this,%PriSec);
return;
}
else { //Secondary
%this.packSet[%this.ExpertSet]++;
//Check Primaries
if(%this.ExpertSet == 0 && %this.packSet[%this.ExpertSet] > 12) {
%this.packSet[%this.ExpertSet] = 0;
}
else if(%this.ExpertSet == 1 && %this.packSet[%this.ExpertSet] > 5) {
%this.packSet[%this.ExpertSet] = 0;
}
else if(%this.ExpertSet == 2 && %this.packSet[%this.ExpertSet] > 1) {
%this.packSet[%this.ExpertSet] = 0;
}
DisplayDoorInfo(%this,%PriSec);
return;
}
}
function DisplayDoorInfo(%plyr, %Var) {
if(%Var == 1) {
switch(%plyr.ExpertSet) {
case 0:
bottomPrint(%plyr.client,"Advanced Door [P]: Select Door Type",2,1);
case 1:
bottomPrint(%plyr.client,"Advanced Door [P]: Select Door Timeout",2,1);
case 2:
bottomPrint(%plyr.client,"Advanced Door [P]: Select Door Kill Settings",2,1);
}
}
else if(%Var == 2) {
switch(%plyr.ExpertSet) {
case 0:
switch(%plyr.packSet[0]) {
case 0:
bottomPrint(%plyr.client,"Advanced Door [S]: Normal Door",2,1);
case 1:
bottomPrint(%plyr.client,"Advanced Door [S]: Toggle Door",2,1);
case 2:
bottomPrint(%plyr.client,"Advanced Door [S]: PWR Change Normal Door",2,1);
case 3:
bottomPrint(%plyr.client,"Advanced Door [S]: Close When Powered Door",2,1);
case 4:
bottomPrint(%plyr.client,"Advanced Door [S]: Open When Powered Door",2,1);
case 5:
bottomPrint(%plyr.client,"Advanced Door [S]: Contact Access Door",2,1);
case 6:
bottomPrint(%plyr.client,"Advanced Door [S]: Green Level Access Door",2,1);
case 7:
bottomPrint(%plyr.client,"Advanced Door [S]: Yellow Level Access Door",2,1);
case 8:
bottomPrint(%plyr.client,"Advanced Door [S]: Red Level Access Door",2,1);
case 9:
bottomPrint(%plyr.client,"Advanced Door [S]: Owner Contact Access Door",2,1);
case 10:
bottomPrint(%plyr.client,"Advanced Door [S]: Admin Contact Access Door",2,1);
case 11:
bottomPrint(%plyr.client,"Advanced Door [S]: Super-Admin Contact Access Door",2,1);
case 12:
bottomPrint(%plyr.client,"Advanced Door [S]: Developer Contact Access Door",2,1);
}
case 1:
switch(%plyr.packSet[1]) {
case 0:
bottomPrint(%plyr.client,"Advanced Door [S]: No Timeout",2,1);
case 1:
bottomPrint(%plyr.client,"Advanced Door [S]: 0.5 Second Timeout",2,1);
case 2:
bottomPrint(%plyr.client,"Advanced Door [S]: 1 Second Timeout",2,1);
case 3:
bottomPrint(%plyr.client,"Advanced Door [S]: 2 Second Timeout",2,1);
case 4:
bottomPrint(%plyr.client,"Advanced Door [S]: 3 Second Timeout",2,1);
case 5:
bottomPrint(%plyr.client,"Advanced Door [S]: 4 Second Timeout",2,1);
}
case 2:
switch(%plyr.packSet[2]) {
case 0:
bottomPrint(%plyr.client,"Advanced Door [S]: Don't Kill",2,1);
case 1:
bottomPrint(%plyr.client,"Advanced Door [S]: Kill",2,1);
}
}
}
}