2015-08-30 02:30:29 -04:00
////////////////////////////////////////////////////////////////////////////////////////
// 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
}