2015-08-30 06:30:29 +00: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
}