T2-BoL/scripts/practice.cs

412 lines
13 KiB
PHP
Raw Normal View History

////////////////////////////////////////////////////////////////////////////////////////
// z0dd - ZOD: PRACTICE HUD SERVER CALLS ///////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////
function serverCMDpracticeHudInitialize(%client, %val)
{
Game.initPracticeHud(%client, %val);
}
function serverCmdpracticeBtnCall(%client, %btn, %val)
{
Game.practiceBtnCmd(%client, %btn, %val);
}
function serverCmdpracticeUpdateSettings(%client, %opt, %val)
{
// USAGE: commandToServer(%opt, %val);
// %opt is the index # of the hud option
// %val is the index # of the option setting
Game.updatePracticeHudSet(%client, %opt, %val);
}
function serverCmdneedPracHudUpdate(%client)
{
Game.sendPracHudUpdate(%client, "");
}
function sendAllPracHudUpdate(%game, %msg)
{
%count = ClientGroup.getCount();
for(%i = 0; %i < %count; %i++)
{
%cl = ClientGroup.getObject(%i);
%game.sendPracHudUpdate(%cl, %msg);
}
}
/////////////////////////////////////////////////////////////////////////////////////////
// Practice Mode projectile and effects datablocks //////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////
//Mortar
datablock ExplosionData(UnderwaterObsMortarExp) : UnderwaterMortarExplosion
{
shakeCamera = false;
};
datablock ExplosionData(ObsMortarExp) : MortarExplosion
{
shakeCamera = false;
};
datablock GrenadeProjectileData(ObsMortarShot) : MortarShot
{
explosion = "ObsMortarExp";
underwaterExplosion = "UnderwaterObsMortarExp";
};
//Tank Mortar
datablock GrenadeProjectileData(ObsAssaultMortar) : AssaultMortar
{
explosion = "ObsMortarExp";
};
//Missile
datablock ExplosionData(ObsMissileExp) : MissileExplosion
{
shakeCamera = false;
};
datablock SeekerProjectileData(ObsShoulderMissile) : ShoulderMissile
{
explosion = "ObsMissileExp";
};
//GrandeLauncher
datablock ExplosionData(UnderwaterObsGrenadeExp) : UnderwaterGrenadeExplosion
{
shakeCamera = false;
};
datablock ExplosionData(ObsGrenadeExp) : GrenadeExplosion
{
shakeCamera = false;
};
datablock GrenadeProjectileData(ObsGrenade) : BasicGrenade
{
explosion = "ObsGrenadeExp";
underwaterExplosion = "UnderwaterObsGrenadeExp";
};
//Disc
datablock ExplosionData(UnderwaterObsDiscExp) : UnderwaterDiscExplosion
{
shakeCamera = false;
};
datablock ExplosionData(ObsDiscExp) : DiscExplosion
{
shakeCamera = false;
};
datablock LinearProjectileData(ObsDiscProjectile) : DiscProjectile
{
explosion = "ObsDiscExp";
underwaterExplosion = "UnderwaterObsDiscExp";
};
/////////////////////////////////////////////////////////////////////////////////////////
// z0dd - ZOD: Practice Mode transfer pad functions and datablocks //////////////////////
/////////////////////////////////////////////////////////////////////////////////////////
datablock ItemData(TransferPad)
{
className = HandInventory;
catagory = "Misc";
shapeFile = "Nexuscap.dts";
mass = 1;
elasticity = 0.2;
friction = 0.8;
pickupRadius = 1;
pickUpName = "a deployable transfer pad";
computeCRC = false;
};
datablock StaticShapeData(DeployedTransferPad) : StaticShapeDamageProfile
{
shapeFile = "Nexuscap.dts";
explosion = DeployablesExplosion;
maxDamage = 100;
disabledLevel = 100;
destroyedLevel = 100;
dynamicType = $TypeMasks::SensorObjectType;
deployedObject = true;
cmdCategory = "DSupport";
cmdIcon = "CMDSwitchIcon";
cmdMiniIconName = "commander/MiniIcons/com_switch_grey";
targetNameTag = 'Deployed';
targetTypeTag = 'transfer pad';
debrisShapeName = "debris_generic_small.dts";
debris = SmallShapeDebris;
};
// Are max telepads deployed?
function maxSpawnPads(%obj)
{
for( %i = 0; %i < $Host::ClassicMaxTelepads; %i++ )
{
if(%obj.client.spawnPad[%i] $="")
return 0;
}
return 1;
}
// Deploy a transfer telepad
function deployTransferPad(%data, %obj)
{
if(%obj.inv[%data.getName()] <= 0)
{
return 0;
}
%eyePos = posFromTransform(%obj.getEyeTransform());
%scEyeVec = VectorScale(VectorNormalize(%obj.getEyeVector()), 4.25);
%eyeEnd = VectorAdd(%eyePos, %scEyeVec);
%mask = $TypeMasks::TerrainObjectType | $TypeMasks::InteriorObjectType;
%searchResult = containerRayCast(%eyePos, %eyeEnd, %mask, 0);
if(!%searchResult)
{
if(%obj.inv[%data.getName()] > 0)
messageClient(%obj.client, 'MsgBeaconNoSurface', '\c2Cannot place pad. Too far from surface.');
return 0;
}
%test = ($TypeMasks::VehicleObjectType | $TypeMasks::MoveableObjectType |
$TypeMasks::StaticShapeObjectType | $TypeMasks::ForceFieldObjectType |
$TypeMasks::ItemObjectType | $TypeMasks::PlayerObjectType |
$TypeMasks::TurretObjectType | $TypeMasks::StaticTSObjectType);
InitContainerRadiusSearch( %eyeEnd, 2.5, %test );
%res = containerSearchNext();
if(%res)
{
messageClient(%obj.client, 'MsgBeaconNoSurface', '\c2You cannot place this item so close to another object.');
return 0;
}
else if(maxSpawnPads(%obj))
{
messageClient(%obj.client, 'MsgDeployFailed', '\c2You do not have a vacant telepad slot.~wfx/misc/misc.error.wav');
return 0;
}
else
{
%terrPt = posFromRaycast(%searchResult);
%terrNrm = normalFromRaycast(%searchResult);
// getTerrainAngle() function found in staticShape.cs
%intAngle = getTerrainAngle(%terrNrm);
if(%intAngle > 30)
{
messageClient(%obj.client, 'MsgDeployFailed', '\c2Surface is too steep for this item.~wfx/misc/misc.error.wav');
return;
}
%rotAxis = vectorNormalize(vectorCross(%terrNrm, "0 0 1"));
if (getWord(%terrNrm, 2) == 1 || getWord(%terrNrm, 2) == -1)
%rotAxis = vectorNormalize(vectorCross(%terrNrm, "0 1 0"));
%rotation = %rotAxis @ " " @ %intAngle;
%obj.decInventory(%data, 1);
%deplObj = new StaticShape() {
dataBlock = "DeployedTransferPad";
position = %terrPt; // VectorAdd(%terrPt, VectorScale(%terrNrm, 0.05));
rotation = %rotation;
};
//%deplObj.playThread($AmbientThread, "ambient");
%deplObj.team = %obj.client.team;
%deplObj.sourceObject = %obj;
%deplObj.owner = %obj.client;
if(%deplObj.getTarget() != -1)
setTargetSensorGroup(%deplObj.getTarget(), %obj.client.team);
MissionCleanup.add(%deplObj);
// Stuff this transfer pad into an array so we can have multi pads.
// Help with this code provided by Founder (founder@mechina.com)
for( %i = 0; %i < $Host::ClassicMaxTelepads; %i++ ) {
if(%obj.client.spawnPad[%i] $= "")
{
%obj.client.spawnPad[%i] = %deplObj;
messageClient(%obj.client, 'MsgPracMode', '\c2Deployed Telepad: %1', %i+1);
break;
}
}
%deplObj.deploy();
return %deplObj;
}
}
function DeployedTransferPad::onDestroyed(%data, %obj, %prevState)
{
for( %i = 0; %i < $Host::ClassicMaxTelepads; %i++ )
{
if(%obj.owner.spawnPad[%i] $= %obj)
{
%obj.owner.spawnPad[%i] = "";
break;
}
}
%obj.schedule(800, delete);
}
// Select telepad
function selectPad(%client)
{
if(%client.transPad $="")
%client.transPad = 1;
else
%client.transPad = (%client.transPad % $Host::ClassicMaxTelepads) + 1;
messageClient( %client, 'MsgPracMode', '\c2Transfer Pad selected: \c3%1', %client.transPad );
}
// Destroy a telepad
function destroyPad(%client)
{
if(isObject(%client.spawnPad[%client.transPad-1]))
%client.spawnPad[%client.transPad-1].setDamageState(Destroyed);
else
messageClient(%client, 'MsgError', '\c2Transfer Pad %1 does not exist!~wfx/misc/misc.error.wav', %client.transPad);
}
// Teleport to pad
function teleportToPad(%client)
{
%player = %client.player;
if(!isObject(%player))
return;
%pad = %client.spawnPad[%client.transPad-1];
if(isObject(%pad))
{
if(%player.holdingFlag)
{
messageClient(%client, 'MsgError', '\c2You cannot teleport with the flag!~wfx/misc/misc.error.wav');
%player.throwObject( %player.holdingFlag );
}
%pos = getWord(%pad.position, 0) @ " " @ getWord(%pad.position, 1) @ " " @ (getWord(%pad.position, 2)+0.5);
%player.setTransform(%pos @ " " @ rotFromTransform(%pad.getTransform()));
%player.teleporting = 0;
%player.setVelocity("0 0 0");
if($PracticeCtf::SpawnFavs)
{
buyFavorites(%client);
}
%player.setDamageLevel(0);
%player.setEnergyLevel(%player.getDataBlock().maxEnergy);
%player.selectWeaponSlot( 0 );
}
else
{
messageClient(%client, 'MsgError', '\c2Transfer Pad %1 does not exist!~wfx/misc/misc.error.wav', %client.transPad);
}
}
// Spawn Vehicle at telepad
function spawnVehAtPad(%client, %blockname)
{
%pad = %client.spawnPad[%client.transPad-1];
%team = %client.getSensorGroup();
if(isObject(%pad))
{
// Check for obstructions above the pad
%pos = getBoxCenter(%pad.getWorldBox());
%height = firstWord(%pos) SPC getWord(%pos, 1) SPC (getWord(%pos, 2)+30);
%mask = $TypeMasks::ShapeBaseObjectType | $TypeMasks::InteriorObjectType;
%obstruction = ContainerRayCast(%pos, %height, %mask);
if(%obstruction)
{
messageClient(%client, 'MsgError', '\c2Cannot spawn vehicle. Area above pad is blocked.');
return;
}
if(%blockName !$="")
{
if(vehicleCheck(%blockName, %team))
{
%pos = posFromTransform(%pad.getTransform());
%rotation = rotFromTransform(%pad.getTransform());
%position = vectorAdd(%pos, %blockName.spawnOffset);
// Check for obstructions
%mask = $TypeMasks::TerrainObjectType | $TypeMasks::InteriorObjectType;
InitContainerRadiusSearch(%position, %blockName.checkRadius, %mask);
while(%found = containerSearchNext() != 0)
{
%position = vectorAdd(%position, %blockName.spawnOffset);
}
%veh = %blockName.create(%team);
if(%veh)
{
%veh.team = %team;
%veh.useCreateHeight(true);
%veh.schedule(4000, "useCreateHeight", false);
%veh.getDataBlock().isMountable(%obj, false);
%veh.getDataBlock().schedule(1000, "isMountable", %obj, true);
vehicleListAdd(%blockName, %veh);
MissionCleanup.add(%veh);
%veh.setTransform(%position @ " " @ %rotation);
if(%client.player.lastVehicle)
{
%client.player.lastVehicle.lastPilot = "";
vehicleAbandonTimeOut(%client.player.lastVehicle);
%client.player.lastVehicle = "";
}
%client.player.lastVehicle = %veh;
%veh.lastPilot = %obj.player;
if(%client.isVehicleTeleportEnabled())
{
if(%client.player.holdingFlag)
{
messageClient(%client, 'MsgError', '\c2You cannot teleport into your vehicle with the flag!~wfx/misc/misc.error.wav');
%client.player.throwObject( %client.player.holdingFlag );
}
%veh.getDataBlock().schedule(3000, "mountDriver", %veh, %client.player);
}
if(%veh.getTarget() != -1)
setTargetSensorGroup(%veh.getTarget(), %client.getSensorGroup());
}
}
else
messageClient(%client, 'MsgError', '\c2Your team\'s control network has reached its capacity for this vehicle.~wfx/misc/misc.error.wav');
}
else
messageClient(%client, 'MsgError', '\c2Unknown vehicle type.~wfx/misc/misc.error.wav');
}
else
messageClient(%client, 'MsgError', '\c2Transfer Pad %1 does not exist!~wfx/misc/misc.error.wav', %client.transPad);
}
/////////////////////////////////////////////////////////////////////////////////////////
// z0dd - ZOD: Practice Mission types Console Spam fixes ////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////
function DefaultGame::initPracticeHud(%game, %client, %val)
{
commandToClient(%client, 'initializePracHud', "Default");
commandToClient(%client, 'practiceHudHead', "CTF Practice Config", "Server Settings", "Player Settings", "Projectile Observation", "Telepad Options", "Spawn Vehicle at Pad");
commandToClient(%client, 'practiceHudPopulate', "Disabled", "Empty");
commandToClient(%client, 'practiceHudDone');
}
function DefaultGame::practiceBtnCmd(%game, %client, %btn, %val)
{
// Do nothing
}
function DefaultGame::updatePracticeHudSet(%game, %client, %opt, %val)
{
// Do nothing
}
function DefaultGame::sendPracHudUpdate(%game, %client)
{
// Do nothing
}