TribesReplay/base/scripts/player.cs
Robert MacGregor 7d0bae2fd4 v23115 (05/30/01):
- (bug fix) Fixed an authentication hole that allowed arbitrary IP connections to a LAN server.  The policy now is: LAN servers will disallow any connections from IP addresses that do not match the Class B network address of the server (or match one of them, in a multihomed server).  So if your server's address is 12.13.14.15, clients from 12.13.*.* will be considered, but clients from 12.12.*.* will be immediately rejected.  In addition, a LAN server will only allow 4 unique Class C ids at any one time.  This should be sufficiently lenient for even the largest LAN parties, but should eliminate the auth hole.

- (bug fix) Fixed a server crash on mission change when the last human player leaves the game in mid cycle.

- (bug fix) Fixed a bug that could reset your Shape Detail setting to max

- (bug fix) Client join message name correction

- (bug fix) All known in-game Chat HUD bugs are fixed (partial lines from paging up/down and resize issues, etc.).

- (bug fix) Infinite missile lock-on sound bug is fixed. Dead. Finito. No more. Pushing up the daisies.

- (bug fix) Stitched up a hole associated with one of the base shapes. Small fry compared to the memory leaks.

- (bug fix) Found a particle crash issue and plugged it up good.

- (bug fix) Fixed a shield impact internal compile error that was crunching frame rate.

- (bug fix) Turns out we tweaked it so inventory stations were counting as turrets for turret placement purposes. D'oh. Fixed.

- (bug fix) A rare crash that occurred with the Radeon VE card has been resolved.

- (bug fix) Fixed a crash that could occur when a flare grenade was released when inside a force field.

- (bug fix) Deployable turrets (spider and spike) and Deployable inv stations now do damage in their explosion when they are destroyed.

- (optimization) The following missions were refined in order to optimize framerate:
	Alcatraz
	Caldera
	Flashpoint
	Gauntlet
	IceBound
	Insalubria
	Overreach
	Respite
	Sirocco

- (optimization) Adjusted the LOD of the logo projectors found in CnH missions.

- (optimization) Changed object shield shapes from the form-fitting forcefields into a less poly-intensive dome effect. Also gave shields a lower memory profile.

- (optimization) Changed the way the clouds' planes are clipped. Sky's the limit, right?

- (optimization) Missile sound script calls moved from script into code for faster processing.

- (memory leak) Fixed a large memory leak. This plus the other leaks mentioned here should finally put the nail in the coffin on the "degrading server performance" issue.

- (memory leak) Fixed a memory leak associated with the pretty lightning effects on maps like Casern Cavite.memory leaks:

- (memory leak) Fixed a memory leak in our fancy text list control and the gui text list.

- (memory leak) Fixed a memory leak involving memory use and resource allocation.

- (improvement) Targeting laser prediction should be better now.

- (improvement) You can specify a server's IP address manually at the join screen

- (improvement) You can now specify "-password <pw>" on the command line to join a server that requires a password.

- (improvement) Heavy armors are tougher against snipers. You now require four headshots or five body shots to kill a Juggernaut with a laser rifle.

- (improvement) Footspeed of all armors increased slightly, as well as a minor boost to jetpack performance. Some improvements made to air resistance for mediums and heavy armors (very subtle).

- (improvement) The jetpack effect was reverted back to the old effect (by popular demand).

- (improvement) A Chat HUD message has been added that is displayed whenever you try to deploy a mine, but your team's maximum number of mines has already been deployed. Previously, the mine would just blow up and not explain why it detonated. Now, it still blows up, but tells you why it happened.

- (improvement) Polished up the health meter on the HUD so when you're still alive, it displays a visible sliver of positive health.

- (improvement) Made framerate and gameplay changes to Caldera. The attackers' base has been moved farther from the defenders, and the switch has been put in one of the upper chambers, while the stations are located separately from the generators. The changes should fix a serious defensive advantage.

- (improvement) After you buy a vehicle, you now fade into the driver's seat if your armor and pack make you an eligible pilot/driver.

- (improvement) Added a "rogue" mine message so that if you are killed by a mine laid by someone who has left the building, the death message is more accurate.

- (improvement) Increased speed of belly turret projectiles so that it is more effective in general (especially for air defense).

- (improvement) Modified name tags of vehicles when you place your reticle over them. Names are now more consistent and descriptive.

- (improvement) Missile and AA turrets now have a longer maximum range (you'll still need to deploy sensors to get this added range, but they can fire farther if you do). They also react more quickly to available targets.

- (community) The "compose email", "forum post", and "news submission" windows are now resizable and movable.
2017-07-17 23:20:27 -04:00

3104 lines
87 KiB
C#

//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
$InvincibleTime = 6;
// Load dts shapes and merge animations
exec("shapes/light_male.cs");
exec("shapes/medium_male.cs");
exec("shapes/heavy_male.cs");
exec("shapes/light_female.cs");
exec("shapes/medium_female.cs");
exec("shapes/bioderm_light.cs");
exec("shapes/bioderm_medium.cs");
exec("shapes/bioderm_heavy.cs");
$CorpseTimeoutValue = 22 * 1000;
//Damage Rate for entering Liquid
$DamageLava = 0.0325;
$DamageHotLava = 0.0325;
$DamageCrustyLava = 0.0325;
$PlayerDeathAnim::TorsoFrontFallForward = 1;
$PlayerDeathAnim::TorsoFrontFallBack = 2;
$PlayerDeathAnim::TorsoBackFallForward = 3;
$PlayerDeathAnim::TorsoLeftSpinDeath = 4;
$PlayerDeathAnim::TorsoRightSpinDeath = 5;
$PlayerDeathAnim::LegsLeftGimp = 6;
$PlayerDeathAnim::LegsRightGimp = 7;
$PlayerDeathAnim::TorsoBackFallForward = 8;
$PlayerDeathAnim::HeadFrontDirect = 9;
$PlayerDeathAnim::HeadBackFallForward = 10;
$PlayerDeathAnim::ExplosionBlowBack = 11;
datablock SensorData(PlayerSensor)
{
detects = true;
detectsUsingLOS = true;
detectsPassiveJammed = true;
detectRadius = 2000;
detectionPings = false;
detectsFOVOnly = true;
detectFOVPercent = 1.3;
useObjectFOV = true;
};
//----------------------------------------------------------------------------
datablock EffectProfile(ArmorJetEffect)
{
effectname = "armor/thrust";
minDistance = 5.0;
maxDistance = 10.0;
};
datablock EffectProfile(ImpactSoftEffect)
{
effectname = "armor/light_land_soft";
minDistance = 5.0;
maxDistance = 10.0;
};
datablock EffectProfile(ImpactHardEffect)
{
effectname = "armor/light_land_hard";
minDistance = 5.0;
maxDistance = 10.0;
};
datablock EffectProfile(ImpactMetalEffect)
{
effectname = "armor/light_land_metal";
minDistance = 5.0;
maxDistance = 10.0;
};
datablock EffectProfile(ImpactSnowEffect)
{
effectname = "armor/light_land_snow";
minDistance = 5.0;
maxDistance = 10.0;
};
datablock EffectProfile(CorpseLootingEffect)
{
effectname = "weapons/generic_switch";
minDistance = 2.5;
};
datablock EffectProfile(MountVehicleEffect)
{
effectname = "vehicles/mount_dis";
minDistance = 20;
};
datablock EffectProfile(UnmountVehicleEffect)
{
effectname = "weapons/generic_switch";
minDistance = 20;
};
//----------------------------------------------------------------------------
datablock AudioProfile( DeathCrySound )
{
fileName = "";
description = AudioClose3d;
preload = true;
};
datablock AudioProfile( PainCrySound )
{
fileName = "";
description = AudioClose3d;
preload = true;
};
datablock AudioProfile(ArmorJetSound)
{
filename = "fx/armor/thrust.wav";
description = CloseLooping3d;
preload = true;
effect = ArmorJetEffect;
};
datablock AudioProfile(ArmorWetJetSound)
{
filename = "fx/armor/thrust_uw.wav";
description = CloseLooping3d;
preload = true;
effect = ArmorJetEffect;
};
datablock AudioProfile(MountVehicleSound)
{
filename = "fx/vehicles/mount_dis.wav";
description = AudioClose3d;
preload = true;
effect = MountVehicleEffect;
};
datablock AudioProfile(UnmountVehicleSound)
{
filename = "fx/vehicles/mount.wav";
description = AudioClose3d;
preload = true;
effect = UnmountVehicleEffect;
};
datablock AudioProfile(CorpseLootingSound)
{
fileName = "fx/weapons/generic_switch.wav";
description = AudioClosest3d;
preload = true;
effect = CorpseLootingEffect;
};
datablock AudioProfile(ArmorMoveBubblesSound)
{
filename = "fx/armor/bubbletrail2.wav";
description = CloseLooping3d;
preload = true;
};
datablock AudioProfile(WaterBreathMaleSound)
{
filename = "fx/armor/breath_uw.wav";
description = ClosestLooping3d;
preload = true;
};
datablock AudioProfile(WaterBreathFemaleSound)
{
filename = "fx/armor/breath_fem_uw.wav";
description = ClosestLooping3d;
preload = true;
};
datablock AudioProfile(waterBreathBiodermSound)
{
filename = "fx/armor/breath_bio_uw.wav";
description = ClosestLooping3d;
preload = true;
};
datablock AudioProfile(SkiAllSoftSound)
{
filename = "fx/armor/ski_soft.wav";
description = AudioClose3d;
preload = true;
};
datablock AudioProfile(SkiAllHardSound)
{
filename = "fx/armor/ski_soft.wav";
description = AudioClose3d;
preload = true;
};
datablock AudioProfile(SkiAllMetalSound)
{
filename = "fx/armor/ski_soft.wav";
description = AudioClose3d;
preload = true;
};
datablock AudioProfile(SkiAllSnowSound)
{
filename = "fx/armor/ski_soft.wav";
description = AudioClosest3d;
preload = true;
};
//SOUNDS ----- LIGHT ARMOR--------
datablock AudioProfile(LFootLightSoftSound)
{
filename = "fx/armor/light_LF_soft.wav";
description = AudioClosest3d;
preload = true;
};
datablock AudioProfile(RFootLightSoftSound)
{
filename = "fx/armor/light_RF_soft.wav";
description = AudioClosest3d;
preload = true;
};
datablock AudioProfile(LFootLightHardSound)
{
filename = "fx/armor/light_LF_hard.wav";
description = AudioClose3d;
preload = true;
};
datablock AudioProfile(RFootLightHardSound)
{
filename = "fx/armor/light_RF_hard.wav";
description = AudioClose3d;
preload = true;
};
datablock AudioProfile(LFootLightMetalSound)
{
filename = "fx/armor/light_LF_metal.wav";
description = AudioClose3d;
preload = true;
};
datablock AudioProfile(RFootLightMetalSound)
{
filename = "fx/armor/light_RF_metal.wav";
description = AudioClose3d;
preload = true;
};
datablock AudioProfile(LFootLightSnowSound)
{
filename = "fx/armor/light_LF_snow.wav";
description = AudioClosest3d;
preload = true;
};
datablock AudioProfile(RFootLightSnowSound)
{
filename = "fx/armor/light_RF_snow.wav";
description = AudioClosest3d;
preload = true;
};
datablock AudioProfile(LFootLightShallowSplashSound)
{
filename = "fx/armor/light_LF_water.wav";
description = AudioClose3d;
preload = true;
};
datablock AudioProfile(RFootLightShallowSplashSound)
{
filename = "fx/armor/light_RF_water.wav";
description = AudioClose3d;
preload = true;
};
datablock AudioProfile(LFootLightWadingSound)
{
filename = "fx/armor/light_LF_wade.wav";
description = AudioClose3d;
preload = true;
};
datablock AudioProfile(RFootLightWadingSound)
{
filename = "fx/armor/light_RF_wade.wav";
description = AudioClose3d;
preload = true;
};
datablock AudioProfile(LFootLightUnderwaterSound)
{
filename = "fx/armor/light_LF_uw.wav";
description = AudioClosest3d;
preload = true;
};
datablock AudioProfile(RFootLightUnderwaterSound)
{
filename = "fx/armor/light_RF_uw.wav";
description = AudioClosest3d;
preload = true;
};
datablock AudioProfile(LFootLightBubblesSound)
{
filename = "fx/armor/light_LF_bubbles.wav";
description = AudioClose3d;
preload = true;
};
datablock AudioProfile(RFootLightBubblesSound)
{
filename = "fx/armor/light_RF_bubbles.wav";
description = AudioClose3d;
preload = true;
};
datablock AudioProfile(ImpactLightSoftSound)
{
filename = "fx/armor/light_land_soft.wav";
description = AudioClose3d;
preload = true;
effect = ImpactSoftEffect;
};
datablock AudioProfile(ImpactLightHardSound)
{
filename = "fx/armor/light_land_hard.wav";
description = AudioClose3d;
preload = true;
effect = ImpactHardEffect;
};
datablock AudioProfile(ImpactLightMetalSound)
{
filename = "fx/armor/light_land_metal.wav";
description = AudioClose3d;
preload = true;
effect = ImpactMetalEffect;
};
datablock AudioProfile(ImpactLightSnowSound)
{
filename = "fx/armor/light_land_snow.wav";
description = AudioClosest3d;
preload = true;
effect = ImpactSnowEffect;
};
datablock AudioProfile(ImpactLightWaterEasySound)
{
filename = "fx/armor/general_water_smallsplash2.wav";
description = AudioClose3d;
preload = true;
};
datablock AudioProfile(ImpactLightWaterMediumSound)
{
filename = "fx/armor/general_water_medsplash.wav";
description = AudioClose3d;
preload = true;
};
datablock AudioProfile(ImpactLightWaterHardSound)
{
filename = "fx/armor/general_water_bigsplash.wav";
description = AudioDefault3d;
preload = true;
};
datablock AudioProfile(ExitingWaterLightSound)
{
filename = "fx/armor/general_water_exit2.wav";
description = AudioClose3d;
preload = true;
};
//SOUNDS ----- Medium ARMOR--------
datablock AudioProfile(LFootMediumSoftSound)
{
filename = "fx/armor/med_LF_soft.wav";
description = AudioClosest3d;
preload = true;
};
datablock AudioProfile(RFootMediumSoftSound)
{
filename = "fx/armor/med_RF_soft.wav";
description = AudioClosest3d;
preload = true;
};
datablock AudioProfile(LFootMediumHardSound)
{
filename = "fx/armor/med_LF_hard.wav";
description = AudioClose3d;
preload = true;
};
datablock AudioProfile(RFootMediumHardSound)
{
filename = "fx/armor/med_RF_hard.wav";
description = AudioClose3d;
preload = true;
};
datablock AudioProfile(LFootMediumMetalSound)
{
filename = "fx/armor/med_LF_metal.wav";
description = AudioClose3d;
preload = true;
};
datablock AudioProfile(RFootMediumMetalSound)
{
filename = "fx/armor/med_RF_metal.wav";
description = AudioClose3d;
preload = true;
};
datablock AudioProfile(LFootMediumSnowSound)
{
filename = "fx/armor/med_LF_snow.wav";
description = AudioClosest3d;
preload = true;
};
datablock AudioProfile(RFootMediumSnowSound)
{
filename = "fx/armor/med_RF_snow.wav";
description = AudioClosest3d;
preload = true;
};
datablock AudioProfile(LFootMediumShallowSplashSound)
{
filename = "fx/armor/med_LF_water.wav";
description = AudioClose3d;
preload = true;
};
datablock AudioProfile(RFootMediumShallowSplashSound)
{
filename = "fx/armor/med_RF_water.wav";
description = AudioClose3d;
preload = true;
};
datablock AudioProfile(LFootMediumWadingSound)
{
filename = "fx/armor/med_LF_uw.wav";
description = AudioClose3d;
preload = true;
};
datablock AudioProfile(RFootMediumWadingSound)
{
filename = "fx/armor/med_RF_uw.wav";
description = AudioClose3d;
preload = true;
};
datablock AudioProfile(LFootMediumUnderwaterSound)
{
filename = "fx/armor/med_LF_uw.wav";
description = AudioClosest3d;
preload = true;
};
datablock AudioProfile(RFootMediumUnderwaterSound)
{
filename = "fx/armor/med_RF_uw.wav";
description = AudioClosest3d;
preload = true;
};
datablock AudioProfile(LFootMediumBubblesSound)
{
filename = "fx/armor/light_LF_bubbles.wav";
description = AudioClose3d;
preload = true;
};
datablock AudioProfile(RFootMediumBubblesSound)
{
filename = "fx/armor/light_RF_bubbles.wav";
description = AudioClose3d;
preload = true;
};
datablock AudioProfile(ImpactMediumSoftSound)
{
filename = "fx/armor/med_land_soft.wav";
description = AudioClosest3d;
preload = true;
effect = ImpactSoftEffect;
};
datablock AudioProfile(ImpactMediumHardSound)
{
filename = "fx/armor/med_land_hard.wav";
description = AudioClose3d;
preload = true;
effect = ImpactHardEffect;
};
datablock AudioProfile(ImpactMediumMetalSound)
{
filename = "fx/armor/med_land_metal.wav";
description = AudioClose3d;
preload = true;
effect = ImpactMetalEffect;
};
datablock AudioProfile(ImpactMediumSnowSound)
{
filename = "fx/armor/med_land_snow.wav";
description = AudioClosest3d;
preload = true;
effect = ImpactSnowEffect;
};
datablock AudioProfile(ImpactMediumWaterEasySound)
{
filename = "fx/armor/general_water_smallsplash.wav";
description = AudioClose3d;
preload = true;
};
datablock AudioProfile(ImpactMediumWaterMediumSound)
{
filename = "fx/armor/general_water_medsplash.wav";
description = AudioClose3d;
preload = true;
};
datablock AudioProfile(ImpactMediumWaterHardSound)
{
filename = "fx/armor/general_water_bigsplash.wav";
description = AudioDefault3d;
preload = true;
};
datablock AudioProfile(ExitingWaterMediumSound)
{
filename = "fx/armor/general_water_exit.wav";
description = AudioClose3d;
preload = true;
};
//SOUNDS ----- HEAVY ARMOR--------
datablock AudioProfile(LFootHeavySoftSound)
{
filename = "fx/armor/heavy_LF_soft.wav";
description = AudioClosest3d;
preload = true;
};
datablock AudioProfile(RFootHeavySoftSound)
{
filename = "fx/armor/heavy_RF_soft.wav";
description = AudioClosest3d;
preload = true;
};
datablock AudioProfile(LFootHeavyHardSound)
{
filename = "fx/armor/heavy_LF_hard.wav";
description = AudioClose3d;
preload = true;
};
datablock AudioProfile(RFootHeavyHardSound)
{
filename = "fx/armor/heavy_RF_hard.wav";
description = AudioClose3d;
preload = true;
};
datablock AudioProfile(LFootHeavyMetalSound)
{
filename = "fx/armor/heavy_LF_metal.wav";
description = AudioClose3d;
preload = true;
};
datablock AudioProfile(RFootHeavyMetalSound)
{
filename = "fx/armor/heavy_RF_metal.wav";
description = AudioClose3d;
preload = true;
};
datablock AudioProfile(LFootHeavySnowSound)
{
filename = "fx/armor/heavy_LF_snow.wav";
description = AudioClosest3d;
preload = true;
};
datablock AudioProfile(RFootHeavySnowSound)
{
filename = "fx/armor/heavy_RF_snow.wav";
description = AudioClosest3d;
preload = true;
};
datablock AudioProfile(LFootHeavyShallowSplashSound)
{
filename = "fx/armor/heavy_LF_water.wav";
description = AudioClose3d;
preload = true;
};
datablock AudioProfile(RFootHeavyShallowSplashSound)
{
filename = "fx/armor/heavy_RF_water.wav";
description = AudioClose3d;
preload = true;
};
datablock AudioProfile(LFootHeavyWadingSound)
{
filename = "fx/armor/heavy_LF_uw.wav";
description = AudioClose3d;
preload = true;
};
datablock AudioProfile(RFootHeavyWadingSound)
{
filename = "fx/armor/heavy_RF_uw.wav";
description = AudioClose3d;
preload = true;
};
datablock AudioProfile(LFootHeavyUnderwaterSound)
{
filename = "fx/armor/heavy_LF_uw.wav";
description = AudioClosest3d;
preload = true;
};
datablock AudioProfile(RFootHeavyUnderwaterSound)
{
filename = "fx/armor/heavy_RF_uw.wav";
description = AudioClosest3d;
preload = true;
};
datablock AudioProfile(LFootHeavyBubblesSound)
{
filename = "fx/armor/light_LF_bubbles.wav";
description = AudioClose3d;
preload = true;
};
datablock AudioProfile(RFootHeavyBubblesSound)
{
filename = "fx/armor/light_RF_bubbles.wav";
description = AudioClose3d;
preload = true;
};
datablock AudioProfile(ImpactHeavySoftSound)
{
filename = "fx/armor/heavy_land_soft.wav";
description = AudioClose3d;
preload = true;
effect = ImpactSoftEffect;
};
datablock AudioProfile(ImpactHeavyHardSound)
{
filename = "fx/armor/heavy_land_hard.wav";
description = AudioClose3d;
preload = true;
effect = ImpactHardEffect;
};
datablock AudioProfile(ImpactHeavyMetalSound)
{
filename = "fx/armor/heavy_land_metal.wav";
description = AudioClose3d;
preload = true;
effect = ImpactMetalEffect;
};
datablock AudioProfile(ImpactHeavySnowSound)
{
filename = "fx/armor/heavy_land_snow.wav";
description = AudioClosest3d;
preload = true;
effect = ImpactSnowEffect;
};
datablock AudioProfile(ImpactHeavyWaterEasySound)
{
filename = "fx/armor/general_water_smallsplash.wav";
description = AudioClose3d;
preload = true;
};
datablock AudioProfile(ImpactHeavyWaterMediumSound)
{
filename = "fx/armor/general_water_medsplash.wav";
description = AudioClose3d;
preload = true;
};
datablock AudioProfile(ImpactHeavyWaterHardSound)
{
filename = "fx/armor/general_water_bigsplash.wav";
description = AudioDefault3d;
preload = true;
};
datablock AudioProfile(ExitingWaterHeavySound)
{
filename = "fx/armor/general_water_exit2.wav";
description = AudioClose3d;
preload = true;
};
//----------------------------------------------------------------------------
// Splash
//----------------------------------------------------------------------------
datablock ParticleData(PlayerSplashMist)
{
dragCoefficient = 2.0;
gravityCoefficient = -0.05;
inheritedVelFactor = 0.0;
constantAcceleration = 0.0;
lifetimeMS = 400;
lifetimeVarianceMS = 100;
useInvAlpha = false;
spinRandomMin = -90.0;
spinRandomMax = 500.0;
textureName = "particleTest";
colors[0] = "0.7 0.8 1.0 1.0";
colors[1] = "0.7 0.8 1.0 0.5";
colors[2] = "0.7 0.8 1.0 0.0";
sizes[0] = 0.5;
sizes[1] = 0.5;
sizes[2] = 0.8;
times[0] = 0.0;
times[1] = 0.5;
times[2] = 1.0;
};
datablock ParticleEmitterData(PlayerSplashMistEmitter)
{
ejectionPeriodMS = 5;
periodVarianceMS = 0;
ejectionVelocity = 3.0;
velocityVariance = 2.0;
ejectionOffset = 0.0;
thetaMin = 85;
thetaMax = 85;
phiReferenceVel = 0;
phiVariance = 360;
overrideAdvances = false;
lifetimeMS = 250;
particles = "PlayerSplashMist";
};
datablock ParticleData(PlayerBubbleParticle)
{
dragCoefficient = 0.0;
gravityCoefficient = -0.50;
inheritedVelFactor = 0.0;
constantAcceleration = 0.0;
lifetimeMS = 400;
lifetimeVarianceMS = 100;
useInvAlpha = false;
textureName = "special/bubbles";
colors[0] = "0.7 0.8 1.0 0.4";
colors[1] = "0.7 0.8 1.0 0.4";
colors[2] = "0.7 0.8 1.0 0.0";
sizes[0] = 0.1;
sizes[1] = 0.3;
sizes[2] = 0.3;
times[0] = 0.0;
times[1] = 0.5;
times[2] = 1.0;
};
datablock ParticleEmitterData(PlayerBubbleEmitter)
{
ejectionPeriodMS = 1;
periodVarianceMS = 0;
ejectionVelocity = 2.0;
ejectionOffset = 0.5;
velocityVariance = 0.5;
thetaMin = 0;
thetaMax = 80;
phiReferenceVel = 0;
phiVariance = 360;
overrideAdvances = false;
particles = "PlayerBubbleParticle";
};
datablock ParticleData(PlayerFoamParticle)
{
dragCoefficient = 2.0;
gravityCoefficient = -0.05;
inheritedVelFactor = 0.0;
constantAcceleration = 0.0;
lifetimeMS = 400;
lifetimeVarianceMS = 100;
useInvAlpha = false;
spinRandomMin = -90.0;
spinRandomMax = 500.0;
textureName = "particleTest";
colors[0] = "0.7 0.8 1.0 0.20";
colors[1] = "0.7 0.8 1.0 0.20";
colors[2] = "0.7 0.8 1.0 0.00";
sizes[0] = 0.2;
sizes[1] = 0.4;
sizes[2] = 1.6;
times[0] = 0.0;
times[1] = 0.5;
times[2] = 1.0;
};
datablock ParticleEmitterData(PlayerFoamEmitter)
{
ejectionPeriodMS = 10;
periodVarianceMS = 0;
ejectionVelocity = 3.0;
velocityVariance = 1.0;
ejectionOffset = 0.0;
thetaMin = 85;
thetaMax = 85;
phiReferenceVel = 0;
phiVariance = 360;
overrideAdvances = false;
particles = "PlayerFoamParticle";
};
datablock ParticleData( PlayerFoamDropletsParticle )
{
dragCoefficient = 1;
gravityCoefficient = 0.2;
inheritedVelFactor = 0.2;
constantAcceleration = -0.0;
lifetimeMS = 600;
lifetimeVarianceMS = 0;
textureName = "special/droplet";
colors[0] = "0.7 0.8 1.0 1.0";
colors[1] = "0.7 0.8 1.0 0.5";
colors[2] = "0.7 0.8 1.0 0.0";
sizes[0] = 0.8;
sizes[1] = 0.3;
sizes[2] = 0.0;
times[0] = 0.0;
times[1] = 0.5;
times[2] = 1.0;
};
datablock ParticleEmitterData( PlayerFoamDropletsEmitter )
{
ejectionPeriodMS = 7;
periodVarianceMS = 0;
ejectionVelocity = 2;
velocityVariance = 1.0;
ejectionOffset = 0.0;
thetaMin = 60;
thetaMax = 80;
phiReferenceVel = 0;
phiVariance = 360;
overrideAdvances = false;
orientParticles = true;
particles = "PlayerFoamDropletsParticle";
};
datablock ParticleData( PlayerSplashParticle )
{
dragCoefficient = 1;
gravityCoefficient = 0.2;
inheritedVelFactor = 0.2;
constantAcceleration = -0.0;
lifetimeMS = 600;
lifetimeVarianceMS = 0;
textureName = "special/droplet";
colors[0] = "0.7 0.8 1.0 1.0";
colors[1] = "0.7 0.8 1.0 0.5";
colors[2] = "0.7 0.8 1.0 0.0";
sizes[0] = 0.5;
sizes[1] = 0.5;
sizes[2] = 0.5;
times[0] = 0.0;
times[1] = 0.5;
times[2] = 1.0;
};
datablock ParticleEmitterData( PlayerSplashEmitter )
{
ejectionPeriodMS = 1;
periodVarianceMS = 0;
ejectionVelocity = 3;
velocityVariance = 1.0;
ejectionOffset = 0.0;
thetaMin = 60;
thetaMax = 80;
phiReferenceVel = 0;
phiVariance = 360;
overrideAdvances = false;
orientParticles = true;
lifetimeMS = 100;
particles = "PlayerSplashParticle";
};
datablock SplashData(PlayerSplash)
{
numSegments = 15;
ejectionFreq = 15;
ejectionAngle = 40;
ringLifetime = 0.5;
lifetimeMS = 300;
velocity = 4.0;
startRadius = 0.0;
acceleration = -3.0;
texWrap = 5.0;
texture = "special/water2";
emitter[0] = PlayerSplashEmitter;
emitter[1] = PlayerSplashMistEmitter;
colors[0] = "0.7 0.8 1.0 0.0";
colors[1] = "0.7 0.8 1.0 0.3";
colors[2] = "0.7 0.8 1.0 0.7";
colors[3] = "0.7 0.8 1.0 0.0";
times[0] = 0.0;
times[1] = 0.4;
times[2] = 0.8;
times[3] = 1.0;
};
//----------------------------------------------------------------------------
// Jet data
//----------------------------------------------------------------------------
datablock ParticleData(HumanArmorJetParticle)
{
dragCoefficient = 0.0;
gravityCoefficient = 0;
inheritedVelFactor = 0.2;
constantAcceleration = 0.0;
lifetimeMS = 50;
lifetimeVarianceMS = 0;
textureName = "particleTest";
colors[0] = "0.32 0.47 0.47 1.0";
colors[1] = "0.32 0.47 0.47 0";
sizes[0] = 0.40;
sizes[1] = 0.15;
};
datablock ParticleEmitterData(HumanArmorJetEmitter)
{
ejectionPeriodMS = 3;
periodVarianceMS = 0;
ejectionVelocity = 3;
velocityVariance = 2.9;
ejectionOffset = 0.0;
thetaMin = 0;
thetaMax = 5;
phiReferenceVel = 0;
phiVariance = 360;
overrideAdvances = false;
particles = "HumanArmorJetParticle";
};
datablock JetEffectData(HumanArmorJetEffect)
{
texture = "special/jetExhaust02";
coolColor = "0.0 0.0 1.0 1.0";
hotColor = "0.2 0.4 0.7 1.0";
activateTime = 0.2;
deactivateTime = 0.05;
length = 0.75;
width = 0.2;
speed = -15;
stretch = 2.0;
yOffset = 0.2;
};
datablock JetEffectData(HumanMediumArmorJetEffect)
{
texture = "special/jetExhaust02";
coolColor = "0.0 0.0 1.0 1.0";
hotColor = "0.2 0.4 0.7 1.0";
activateTime = 0.2;
deactivateTime = 0.05;
length = 0.75;
width = 0.2;
speed = -15;
stretch = 2.0;
yOffset = 0.4;
};
datablock JetEffectData(HumanLightFemaleArmorJetEffect)
{
texture = "special/jetExhaust02";
coolColor = "0.0 0.0 1.0 1.0";
hotColor = "0.2 0.4 0.7 1.0";
activateTime = 0.2;
deactivateTime = 0.05;
length = 0.75;
width = 0.2;
speed = -15;
stretch = 2.0;
yOffset = 0.2;
};
datablock JetEffectData(BiodermArmorJetEffect)
{
texture = "special/jetExhaust02";
coolColor = "0.0 0.0 1.0 1.0";
hotColor = "0.8 0.6 0.2 1.0";
activateTime = 0.2;
deactivateTime = 0.05;
length = 0.75;
width = 0.2;
speed = -15;
stretch = 2.0;
yOffset = 0.0;
};
//----------------------------------------------------------------------------
// Foot puffs
//----------------------------------------------------------------------------
datablock ParticleData(LightPuff)
{
dragCoefficient = 2.0;
gravityCoefficient = -0.01;
inheritedVelFactor = 0.0;
constantAcceleration = 0.0;
lifetimeMS = 500;
lifetimeVarianceMS = 100;
useInvAlpha = true;
spinRandomMin = -35.0;
spinRandomMax = 35.0;
textureName = "particleTest";
colors[0] = "0.46 0.36 0.26 0.4";
colors[1] = "0.46 0.46 0.36 0.0";
sizes[0] = 0.4;
sizes[1] = 1.0;
};
datablock ParticleEmitterData(LightPuffEmitter)
{
ejectionPeriodMS = 35;
periodVarianceMS = 10;
ejectionVelocity = 0.1;
velocityVariance = 0.05;
ejectionOffset = 0.0;
thetaMin = 5;
thetaMax = 20;
phiReferenceVel = 0;
phiVariance = 360;
overrideAdvances = false;
useEmitterColors = true;
particles = "LightPuff";
};
//----------------------------------------------------------------------------
// Liftoff dust
//----------------------------------------------------------------------------
datablock ParticleData(LiftoffDust)
{
dragCoefficient = 1.0;
gravityCoefficient = -0.01;
inheritedVelFactor = 0.0;
constantAcceleration = 0.0;
lifetimeMS = 1000;
lifetimeVarianceMS = 100;
useInvAlpha = true;
spinRandomMin = -90.0;
spinRandomMax = 500.0;
textureName = "particleTest";
colors[0] = "0.46 0.36 0.26 0.0";
colors[1] = "0.46 0.46 0.36 0.4";
colors[2] = "0.46 0.46 0.36 0.0";
sizes[0] = 0.2;
sizes[1] = 0.6;
sizes[2] = 1.0;
times[0] = 0.0;
times[1] = 0.5;
times[2] = 1.0;
};
datablock ParticleEmitterData(LiftoffDustEmitter)
{
ejectionPeriodMS = 5;
periodVarianceMS = 0;
ejectionVelocity = 2.0;
velocityVariance = 0.0;
ejectionOffset = 0.0;
thetaMin = 90;
thetaMax = 90;
phiReferenceVel = 0;
phiVariance = 360;
overrideAdvances = false;
useEmitterColors = true;
particles = "LiftoffDust";
};
//----------------------------------------------------------------------------
datablock ParticleData(BiodermArmorJetParticle) : HumanArmorJetParticle
{
colors[0] = "0.50 0.48 0.36 1.0";
colors[1] = "0.50 0.48 0.36 0";
};
datablock ParticleEmitterData(BiodermArmorJetEmitter) : HumanArmorJetEmitter
{
particles = "BiodermArmorJetParticle";
};
//----------------------------------------------------------------------------
datablock DecalData(LightMaleFootprint)
{
sizeX = 0.125;
sizeY = 0.25;
textureName = "special/footprints/L_male";
};
datablock DebrisData( PlayerDebris )
{
explodeOnMaxBounce = false;
elasticity = 0.35;
friction = 0.5;
lifetime = 4.0;
lifetimeVariance = 0.0;
minSpinSpeed = 60;
maxSpinSpeed = 600;
numBounces = 5;
bounceVariance = 0;
staticOnMaxBounce = true;
gravModifier = 1.0;
useRadiusMass = true;
baseRadius = 1;
velocity = 18.0;
velocityVariance = 12.0;
};
datablock PlayerData(LightMaleHumanArmor) : LightPlayerDamageProfile
{
emap = true;
className = Armor;
shapeFile = "light_male.dts";
cameraMaxDist = 3;
computeCRC = true;
canObserve = true;
cmdCategory = "Clients";
cmdIcon = CMDPlayerIcon;
cmdMiniIconName = "commander/MiniIcons/com_player_grey";
hudImageNameFriendly[0] = "gui/hud_playertriangle.png";
hudImageNameEnemy[0] = "gui/hud_playertriangle_enemy.png";
hudRenderModulated[0] = true;
hudImageNameFriendly[1] = "commander/MiniIcons/com_flag_grey";
hudImageNameEnemy[1] = "commander/MiniIcons/com_flag_grey";
hudRenderModulated[1] = true;
hudRenderAlways[1] = true;
hudRenderCenter[1] = true;
hudRenderDistance[1] = true;
hudImageNameFriendly[2] = "commander/MiniIcons/com_flag_grey";
hudImageNameEnemy[2] = "commander/MiniIcons/com_flag_grey";
hudRenderModulated[2] = true;
hudRenderAlways[2] = true;
hudRenderCenter[2] = true;
hudRenderDistance[2] = true;
cameraDefaultFov = 90.0;
cameraMinFov = 5.0;
cameraMaxFov = 120.0;
debrisShapeName = "debris_player.dts";
debris = playerDebris;
aiAvoidThis = true;
minLookAngle = -1.4;
maxLookAngle = 1.4;
maxFreelookAngle = 3.0;
mass = 90;
drag = 0.3;
maxdrag = 0.4;
density = 10;
maxDamage = 0.66;
maxEnergy = 60;
repairRate = 0.0033;
energyPerDamagePoint = 75.0; // shield energy required to block one point of damage
rechargeRate = 0.256;
jetForce = 28.2 * 90;
underwaterJetForce = 26.2 * 90 * 2.0;
underwaterVertJetFactor = 1.5;
jetEnergyDrain = 0.8;
underwaterJetEnergyDrain = 0.5;
minJetEnergy = 1;
maxJetHorizontalPercentage = 0.8;
runForce = 55.20 * 90;
runEnergyDrain = 0;
minRunEnergy = 0;
maxForwardSpeed = 15;
maxBackwardSpeed = 14;
maxSideSpeed = 14;
maxUnderwaterForwardSpeed = 8.4;
maxUnderwaterBackwardSpeed = 7.8;
maxUnderwaterSideSpeed = 7.8;
jumpForce = 8.3 * 90;
jumpEnergyDrain = 0;
minJumpEnergy = 0;
jumpDelay = 0;
recoverDelay = 9;
recoverRunForceScale = 1.2;
minImpactSpeed = 45;
speedDamageScale = 0.004;
jetSound = ArmorJetSound;
wetJetSound = ArmorJetSound;
jetEmitter = HumanArmorJetEmitter;
jetEffect = HumanArmorJetEffect;
boundingBox = "1.2 1.2 2.3";
pickupRadius = 0.75;
// damage location details
boxNormalHeadPercentage = 0.83;
boxNormalTorsoPercentage = 0.49;
boxHeadLeftPercentage = 0;
boxHeadRightPercentage = 1;
boxHeadBackPercentage = 0;
boxHeadFrontPercentage = 1;
//Foot Prints
decalData = LightMaleFootprint;
decalOffset = 0.25;
footPuffEmitter = LightPuffEmitter;
footPuffNumParts = 15;
footPuffRadius = 0.25;
dustEmitter = LiftoffDustEmitter;
splash = PlayerSplash;
splashVelocity = 4.0;
splashAngle = 67.0;
splashFreqMod = 300.0;
splashVelEpsilon = 0.60;
bubbleEmitTime = 0.4;
splashEmitter[0] = PlayerFoamDropletsEmitter;
splashEmitter[1] = PlayerFoamEmitter;
splashEmitter[2] = PlayerBubbleEmitter;
mediumSplashSoundVelocity = 10.0;
hardSplashSoundVelocity = 20.0;
exitSplashSoundVelocity = 5.0;
// Controls over slope of runnable/jumpable surfaces
runSurfaceAngle = 70;
jumpSurfaceAngle = 80;
minJumpSpeed = 20;
maxJumpSpeed = 30;
horizMaxSpeed = 68;
horizResistSpeed = 33;
horizResistFactor = 0.35;
maxJetForwardSpeed = 30;
upMaxSpeed = 80;
upResistSpeed = 25;
upResistFactor = 0.3;
// heat inc'ers and dec'ers
heatDecayPerSec = 1.0 / 3.0; // takes 3 seconds to clear heat sig.
heatIncreasePerSec = 1.0 / 3.0; // takes 3.0 seconds of constant jet to get full heat sig.
footstepSplashHeight = 0.35;
//Footstep Sounds
LFootSoftSound = LFootLightSoftSound;
RFootSoftSound = RFootLightSoftSound;
LFootHardSound = LFootLightHardSound;
RFootHardSound = RFootLightHardSound;
LFootMetalSound = LFootLightMetalSound;
RFootMetalSound = RFootLightMetalSound;
LFootSnowSound = LFootLightSnowSound;
RFootSnowSound = RFootLightSnowSound;
LFootShallowSound = LFootLightShallowSplashSound;
RFootShallowSound = RFootLightShallowSplashSound;
LFootWadingSound = LFootLightWadingSound;
RFootWadingSound = RFootLightWadingSound;
LFootUnderwaterSound = LFootLightUnderwaterSound;
RFootUnderwaterSound = RFootLightUnderwaterSound;
LFootBubblesSound = LFootLightBubblesSound;
RFootBubblesSound = RFootLightBubblesSound;
movingBubblesSound = ArmorMoveBubblesSound;
waterBreathSound = WaterBreathMaleSound;
impactSoftSound = ImpactLightSoftSound;
impactHardSound = ImpactLightHardSound;
impactMetalSound = ImpactLightMetalSound;
impactSnowSound = ImpactLightSnowSound;
skiSoftSound = SkiAllSoftSound;
skiHardSound = SkiAllHardSound;
skiMetalSound = SkiAllMetalSound;
skiSnowSound = SkiAllSnowSound;
impactWaterEasy = ImpactLightWaterEasySound;
impactWaterMedium = ImpactLightWaterMediumSound;
impactWaterHard = ImpactLightWaterHardSound;
groundImpactMinSpeed = 10.0;
groundImpactShakeFreq = "4.0 4.0 4.0";
groundImpactShakeAmp = "1.0 1.0 1.0";
groundImpactShakeDuration = 0.8;
groundImpactShakeFalloff = 10.0;
exitingWater = ExitingWaterLightSound;
maxWeapons = 3; // Max number of different weapons the player can have
maxGrenades = 1; // Max number of different grenades the player can have
maxMines = 1; // Max number of different mines the player can have
// Inventory restrictions
max[RepairKit] = 1;
max[Mine] = 3;
max[Grenade] = 5;
max[Blaster] = 1;
max[Plasma] = 1;
max[PlasmaAmmo] = 20;
max[Disc] = 1;
max[DiscAmmo] = 15;
max[SniperRifle] = 1;
max[GrenadeLauncher] = 1;
max[GrenadeLauncherAmmo]= 10;
max[Mortar] = 0;
max[MortarAmmo] = 0;
max[MissileLauncher] = 0;
max[MissileLauncherAmmo]= 0;
max[Chaingun] = 1;
max[ChaingunAmmo] = 100;
max[RepairGun] = 1;
max[CloakingPack] = 1;
max[SensorJammerPack] = 1;
max[EnergyPack] = 1;
max[RepairPack] = 1;
max[ShieldPack] = 1;
max[AmmoPack] = 1;
//max[ReflectionPack] = 1;
//max[RepulsorPack] = 1;
//max[EnvironmentPack] = 1;
max[SatchelCharge] = 1;
max[MortarBarrelPack] = 0;
max[MissileBarrelPack] = 0;
max[AABarrelPack] = 0;
max[PlasmaBarrelPack] = 0;
max[ELFBarrelPack] = 0;
max[InventoryDeployable]= 0;
//max[AmmoDeployable] = 0;
max[MotionSensorDeployable] = 1;
max[PulseSensorDeployable] = 1;
max[TurretOutdoorDeployable] = 0;
max[TurretIndoorDeployable] = 0;
//max[MineAir] = 3;
//max[MineLand] = 3;
//max[MineSticky] = 3;
max[FlashGrenade] = 5;
max[ConcussionGrenade] = 5;
max[FlareGrenade] = 5;
max[TargetingLaser] = 1;
max[ELFGun] = 1;
max[ShockLance] = 1;
max[CameraGrenade] = 5;
max[Beacon] = 3;
//max[Rock] = 1;
observeParameters = "0.5 4.5 4.5";
shieldEffectScale = "0.7 0.7 1.0";
};
//----------------------------------------------------------------------------
datablock DecalData(MediumMaleFootprint)
{
sizeX = 0.125;
sizeY = 0.25;
textureName = "special/footprints/M_male";
};
datablock PlayerData(MediumMaleHumanArmor) : MediumPlayerDamageProfile
{
emap = true;
className = Armor;
shapeFile = "medium_male.dts";
cameraMaxDist = 3;
computeCRC = true;
debrisShapeName = "debris_player.dts";
debris = playerDebris;
canObserve = true;
cmdCategory = "Clients";
cmdIcon = CMDPlayerIcon;
cmdMiniIconName = "commander/MiniIcons/com_player_grey";
hudImageNameFriendly[0] = "gui/hud_playertriangle.png";
hudImageNameEnemy[0] = "gui/hud_playertriangle_enemy.png";
hudRenderModulated[0] = true;
hudImageNameFriendly[1] = "commander/MiniIcons/com_flag_grey";
hudImageNameEnemy[1] = "commander/MiniIcons/com_flag_grey";
hudRenderModulated[1] = true;
hudRenderAlways[1] = true;
hudRenderCenter[1] = true;
hudRenderDistance[1] = true;
hudImageNameFriendly[2] = "commander/MiniIcons/com_flag_grey";
hudImageNameEnemy[2] = "commander/MiniIcons/com_flag_grey";
hudRenderModulated[2] = true;
hudRenderAlways[2] = true;
hudRenderCenter[2] = true;
hudRenderDistance[2] = true;
aiAvoidThis = true;
minLookAngle = -1.4;
maxLookAngle = 1.4;
maxFreelookAngle = 3.0;
mass = 130;
drag = 0.4;
maxdrag = 0.5;
density = 10;
maxDamage = 1.1;
maxEnergy = 80;
repairRate = 0.0033;
energyPerDamagePoint = 75.0; // shield energy required to block one point of damage
rechargeRate = 0.256;
jetForce = 27.06 * 130;
underwaterJetForce = 24.6 * 130 * 2.0;
underwaterVertJetFactor = 1.5;
jetEnergyDrain = 1.0;
underwaterJetEnergyDrain = 0.5;
minJetEnergy = 1;
maxJetHorizontalPercentage = 0.8;
runForce = 46 * 130;
runEnergyDrain = 0;
minRunEnergy = 0;
maxForwardSpeed = 12;
maxBackwardSpeed = 11;
maxSideSpeed = 11;
maxUnderwaterForwardSpeed = 6.6;
maxUnderwaterBackwardSpeed = 6;
maxUnderwaterSideSpeed = 6;
recoverDelay = 9;
recoverRunForceScale = 1.2;
// heat inc'ers and dec'ers
heatDecayPerSec = 1.0 / 3.0; // takes 3 seconds to clear heat sig.
heatIncreasePerSec = 1.0 / 3.0; // takes 3.0 seconds of constant jet to get full heat sig.
jumpForce = 8.3 * 130;
jumpEnergyDrain = 0;
minJumpEnergy = 0;
jumpSurfaceAngle = 75;
jumpDelay = 0;
// Controls over slope of runnable/jumpable surfaces
runSurfaceAngle = 70;
jumpSurfaceAngle = 80;
minJumpSpeed = 15;
maxJumpSpeed = 25;
horizMaxSpeed = 60;
horizResistSpeed = 28;
horizResistFactor = 0.32;
maxJetForwardSpeed = 22;
upMaxSpeed = 70;
upResistSpeed = 30;
upResistFactor = 0.23;
minImpactSpeed = 45;
speedDamageScale = 0.004;
jetSound = ArmorJetSound;
wetJetSound = ArmorWetJetSound;
jetEmitter = HumanArmorJetEmitter;
jetEffect = HumanMediumArmorJetEffect;
boundingBox = "1.45 1.45 2.4";
pickupRadius = 0.75;
// damage location details
boxNormalHeadPercentage = 0.83;
boxNormalTorsoPercentage = 0.49;
boxHeadLeftPercentage = 0;
boxHeadRightPercentage = 1;
boxHeadBackPercentage = 0;
boxHeadFrontPercentage = 1;
//Foot Prints
decalData = MediumMaleFootprint;
decalOffset = 0.35;
footPuffEmitter = LightPuffEmitter;
footPuffNumParts = 15;
footPuffRadius = 0.25;
dustEmitter = LiftoffDustEmitter;
splash = PlayerSplash;
splashVelocity = 4.0;
splashAngle = 67.0;
splashFreqMod = 300.0;
splashVelEpsilon = 0.60;
bubbleEmitTime = 0.4;
splashEmitter[0] = PlayerFoamDropletsEmitter;
splashEmitter[1] = PlayerFoamEmitter;
splashEmitter[2] = PlayerBubbleEmitter;
mediumSplashSoundVelocity = 10.0;
hardSplashSoundVelocity = 20.0;
exitSplashSoundVelocity = 5.0;
footstepSplashHeight = 0.35;
//Footstep Sounds
LFootSoftSound = LFootMediumSoftSound;
RFootSoftSound = RFootMediumSoftSound;
LFootHardSound = LFootMediumHardSound;
RFootHardSound = RFootMediumHardSound;
LFootMetalSound = LFootMediumMetalSound;
RFootMetalSound = RFootMediumMetalSound;
LFootSnowSound = LFootMediumSnowSound;
RFootSnowSound = RFootMediumSnowSound;
LFootShallowSound = LFootMediumShallowSplashSound;
RFootShallowSound = RFootMediumShallowSplashSound;
LFootWadingSound = LFootMediumWadingSound;
RFootWadingSound = RFootMediumWadingSound;
LFootUnderwaterSound = LFootMediumUnderwaterSound;
RFootUnderwaterSound = RFootMediumUnderwaterSound;
LFootBubblesSound = LFootMediumBubblesSound;
RFootBubblesSound = RFootMediumBubblesSound;
movingBubblesSound = ArmorMoveBubblesSound;
waterBreathSound = WaterBreathMaleSound;
impactSoftSound = ImpactMediumSoftSound;
impactHardSound = ImpactMediumHardSound;
impactMetalSound = ImpactMediumMetalSound;
impactSnowSound = ImpactMediumSnowSound;
skiSoftSound = SkiAllSoftSound;
skiHardSound = SkiAllHardSound;
skiMetalSound = SkiAllMetalSound;
skiSnowSound = SkiAllSnowSound;
impactWaterEasy = ImpactMediumWaterEasySound;
impactWaterMedium = ImpactMediumWaterMediumSound;
impactWaterHard = ImpactMediumWaterHardSound;
groundImpactMinSpeed = 10.0;
groundImpactShakeFreq = "4.0 4.0 4.0";
groundImpactShakeAmp = "1.0 1.0 1.0";
groundImpactShakeDuration = 0.8;
groundImpactShakeFalloff = 10.0;
exitingWater = ExitingWaterMediumSound;
maxWeapons = 4; // Max number of different weapons the player can have
maxGrenades = 1; // Max number of different grenades the player can have
maxMines = 1; // Max number of different mines the player can have
// Inventory restrictions
max[RepairKit] = 1;
max[Mine] = 3;
max[Grenade] = 6;
max[Blaster] = 1;
max[Plasma] = 1;
max[PlasmaAmmo] = 40;
max[Disc] = 1;
max[DiscAmmo] = 15;
max[SniperRifle] = 0;
max[GrenadeLauncher] = 1;
max[GrenadeLauncherAmmo]= 12;
max[Mortar] = 0;
max[MortarAmmo] = 0;
max[MissileLauncher] = 1;
max[MissileLauncherAmmo]= 4;
max[Chaingun] = 1;
max[ChaingunAmmo] = 150;
max[RepairGun] = 1;
max[CloakingPack] = 0;
max[SensorJammerPack] = 1;
max[EnergyPack] = 1;
max[RepairPack] = 1;
max[ShieldPack] = 1;
max[AmmoPack] = 1;
//max[ReflectionPack] = 1;
//max[RepulsorPack] = 1;
//max[EnvironmentPack] = 1;
max[SatchelCharge] = 1;
max[MortarBarrelPack] = 1;
max[MissileBarrelPack] = 1;
max[AABarrelPack] = 1;
max[PlasmaBarrelPack] = 1;
max[ELFBarrelPack] = 1;
max[InventoryDeployable]= 1;
//max[AmmoDeployable] = 1;
max[MotionSensorDeployable] = 1;
max[PulseSensorDeployable] = 1;
max[TurretOutdoorDeployable] = 1;
max[TurretIndoorDeployable] = 1;
//max[MineAir] = 3;
//max[MineLand] = 3;
//max[MineSticky] = 3;
max[FlashGrenade] = 6;
max[ConcussionGrenade] = 6;
max[FlareGrenade] = 6;
max[TargetingLaser] = 1;
max[ELFGun] = 1;
max[ShockLance] = 1;
max[CameraGrenade] = 6;
max[Beacon] = 3;
//max[Rock] = 1;
observeParameters = "0.5 4.5 4.5";
shieldEffectScale = "0.7 0.7 1.0";
};
//----------------------------------------------------------------------------
datablock DecalData(HeavyMaleFootprint)
{
sizeX = 0.25;
sizeY = 0.5;
textureName = "special/footprints/H_male";
};
datablock PlayerData(HeavyMaleHumanArmor) : HeavyPlayerDamageProfile
{
emap = true;
className = Armor;
shapeFile = "heavy_male.dts";
cameraMaxDist = 3;
computeCRC = true;
debrisShapeName = "debris_player.dts";
debris = playerDebris;
canObserve = true;
cmdCategory = "Clients";
cmdIcon = CMDPlayerIcon;
cmdMiniIconName = "commander/MiniIcons/com_player_grey";
hudImageNameFriendly[0] = "gui/hud_playertriangle.png";
hudImageNameEnemy[0] = "gui/hud_playertriangle_enemy.png";
hudRenderModulated[0] = true;
hudImageNameFriendly[1] = "commander/MiniIcons/com_flag_grey";
hudImageNameEnemy[1] = "commander/MiniIcons/com_flag_grey";
hudRenderModulated[1] = true;
hudRenderAlways[1] = true;
hudRenderCenter[1] = true;
hudRenderDistance[1] = true;
hudImageNameFriendly[2] = "commander/MiniIcons/com_flag_grey";
hudImageNameEnemy[2] = "commander/MiniIcons/com_flag_grey";
hudRenderModulated[2] = true;
hudRenderAlways[2] = true;
hudRenderCenter[2] = true;
hudRenderDistance[2] = true;
aiAvoidThis = true;
minLookAngle = -1.4;
maxLookAngle = 1.4;
maxFreelookAngle = 3.0;
mass = 180;
drag = 0.5;
maxdrag = 0.6;
density = 10;
maxDamage = 1.32;
maxEnergy = 110;
repairRate = 0.0033;
energyPerDamagePoint = 75.0; // shield energy required to block one point of damage
rechargeRate = 0.256;
jetForce = 23.54 * 180;
underwaterJetForce = 21.4 * 180 * 2.0;
underwaterVertJetFactor = 1.5;
jetEnergyDrain = 1.1;
underwaterJetEnergyDrain = 0.55;
minJetEnergy = 1;
maxJetHorizontalPercentage = 0.8;
runForce = 40.25 * 180;
runEnergyDrain = 0;
minRunEnergy = 0;
maxForwardSpeed = 7.5;
maxBackwardSpeed = 6;
maxSideSpeed = 6;
maxUnderwaterForwardSpeed = 3.9;
maxUnderwaterBackwardSpeed = 3;
maxUnderwaterSideSpeed = 3;
recoverDelay = 9;
recoverRunForceScale = 1.2;
jumpForce = 8.3 * 180;
jumpEnergyDrain = 0;
minJumpEnergy = 0;
jumpDelay = 0;
// heat inc'ers and dec'ers
heatDecayPerSec = 1.0 / 3.0; // takes 3 seconds to clear heat sig.
heatIncreasePerSec = 1.0 / 3.0; // takes 3.0 seconds of constant jet to get full heat sig.
// Controls over slope of runnable/jumpable surfaces
runSurfaceAngle = 70;
jumpSurfaceAngle = 75;
minJumpSpeed = 20;
maxJumpSpeed = 30;
horizMaxSpeed = 52;
horizResistSpeed = 23;
horizResistFactor = 0.29;
maxJetForwardSpeed = 16;
upMaxSpeed = 60;
upResistSpeed = 35;
upResistFactor = 0.18;
minImpactSpeed = 45;
speedDamageScale = 0.006;
jetSound = ArmorJetSound;
wetJetSound = ArmorJetSound;
jetEmitter = HumanArmorJetEmitter;
boundingBox = "1.63 1.63 2.6";
pickupRadius = 0.75;
// damage location details
boxNormalHeadPercentage = 0.83;
boxNormalTorsoPercentage = 0.49;
boxHeadLeftPercentage = 0;
boxHeadRightPercentage = 1;
boxHeadBackPercentage = 0;
boxHeadFrontPercentage = 1;
//Foot Prints
decalData = HeavyMaleFootprint;
decalOffset = 0.4;
footPuffEmitter = LightPuffEmitter;
footPuffNumParts = 15;
footPuffRadius = 0.25;
dustEmitter = LiftoffDustEmitter;
splash = PlayerSplash;
splashVelocity = 4.0;
splashAngle = 67.0;
splashFreqMod = 300.0;
splashVelEpsilon = 0.60;
bubbleEmitTime = 0.4;
splashEmitter[0] = PlayerFoamDropletsEmitter;
splashEmitter[1] = PlayerFoamEmitter;
splashEmitter[2] = PlayerBubbleEmitter;
mediumSplashSoundVelocity = 10.0;
hardSplashSoundVelocity = 20.0;
exitSplashSoundVelocity = 5.0;
footstepSplashHeight = 0.35;
//Footstep Sounds
LFootSoftSound = LFootHeavySoftSound;
RFootSoftSound = RFootHeavySoftSound;
LFootHardSound = LFootHeavyHardSound;
RFootHardSound = RFootHeavyHardSound;
LFootMetalSound = LFootHeavyMetalSound;
RFootMetalSound = RFootHeavyMetalSound;
LFootSnowSound = LFootHeavySnowSound;
RFootSnowSound = RFootHeavySnowSound;
LFootShallowSound = LFootHeavyShallowSplashSound;
RFootShallowSound = RFootHeavyShallowSplashSound;
LFootWadingSound = LFootHeavyWadingSound;
RFootWadingSound = RFootHeavyWadingSound;
LFootUnderwaterSound = LFootHeavyUnderwaterSound;
RFootUnderwaterSound = RFootHeavyUnderwaterSound;
LFootBubblesSound = LFootHeavyBubblesSound;
RFootBubblesSound = RFootHeavyBubblesSound;
movingBubblesSound = ArmorMoveBubblesSound;
waterBreathSound = WaterBreathMaleSound;
impactSoftSound = ImpactHeavySoftSound;
impactHardSound = ImpactHeavyHardSound;
impactMetalSound = ImpactHeavyMetalSound;
impactSnowSound = ImpactHeavySnowSound;
skiSoftSound = SkiAllSoftSound;
skiHardSound = SkiAllHardSound;
skiMetalSound = SkiAllMetalSound;
skiSnowSound = SkiAllSnowSound;
impactWaterEasy = ImpactHeavyWaterEasySound;
impactWaterMedium = ImpactHeavyWaterMediumSound;
impactWaterHard = ImpactHeavyWaterHardSound;
groundImpactMinSpeed = 10.0;
groundImpactShakeFreq = "4.0 4.0 4.0";
groundImpactShakeAmp = "1.0 1.0 1.0";
groundImpactShakeDuration = 0.8;
groundImpactShakeFalloff = 10.0;
exitingWater = ExitingWaterHeavySound;
maxWeapons = 5; // Max number of different weapons the player can have
maxGrenades = 1; // Max number of different grenades the player can have
maxMines = 1; // Max number of different mines the player can have
// Inventory restrictions
max[RepairKit] = 1;
max[Mine] = 3;
max[Grenade] = 8;
max[Blaster] = 1;
max[Plasma] = 1;
max[PlasmaAmmo] = 50;
max[Disc] = 1;
max[DiscAmmo] = 15;
max[SniperRifle] = 0;
max[GrenadeLauncher] = 1;
max[GrenadeLauncherAmmo]= 15;
max[Mortar] = 1;
max[MortarAmmo] = 10;
max[MissileLauncher] = 1;
max[MissileLauncherAmmo]= 8;
max[Chaingun] = 1;
max[ChaingunAmmo] = 200;
max[RepairGun] = 1;
max[CloakingPack] = 0;
max[SensorJammerPack] = 1;
max[EnergyPack] = 1;
max[RepairPack] = 1;
max[ShieldPack] = 1;
max[AmmoPack] = 1;
//max[ReflectionPack] = 1;
//max[RepulsorPack] = 1;
//max[EnvironmentPack] = 1;
max[SatchelCharge] = 1;
max[MortarBarrelPack] = 1;
max[MissileBarrelPack] = 1;
max[AABarrelPack] = 1;
max[PlasmaBarrelPack] = 1;
max[ELFBarrelPack] = 1;
max[InventoryDeployable]= 1;
//max[AmmoDeployable] = 1;
max[MotionSensorDeployable] = 1;
max[PulseSensorDeployable] = 1;
max[TurretOutdoorDeployable] = 1;
max[TurretIndoorDeployable] = 1;
//max[MineAir] = 3;
//max[MineLand] = 3;
//max[MineSticky] = 3;
max[FlashGrenade] = 8;
max[ConcussionGrenade] = 8;
max[FlareGrenade] = 8;
max[TargetingLaser] = 1;
max[ELFGun] = 1;
max[ShockLance] = 1;
max[CameraGrenade] = 8;
max[Beacon] = 3;
//max[Rock] = 1;
observeParameters = "0.5 4.5 4.5";
shieldEffectScale = "0.7 0.7 1.0";
};
//----------------------------------------------------------------------------
datablock PlayerData(LightFemaleHumanArmor) : LightMaleHumanArmor
{
shapeFile = "light_female.dts";
waterBreathSound = WaterBreathFemaleSound;
jetEffect = HumanMediumArmorJetEffect;
};
//----------------------------------------------------------------------------
datablock PlayerData(MediumFemaleHumanArmor) : MediumMaleHumanArmor
{
shapeFile = "medium_female.dts";
waterBreathSound = WaterBreathFemaleSound;
jetEffect = HumanArmorJetEffect;
};
//----------------------------------------------------------------------------
datablock PlayerData(HeavyFemaleHumanArmor) : HeavyMaleHumanArmor
{
shapeFile = "heavy_male.dts";
waterBreathSound = WaterBreathFemaleSound;
};
//----------------------------------------------------------------------------
datablock DecalData(LightBiodermFootprint)
{
sizeX = 0.25;
sizeY = 0.25;
textureName = "special/footprints/L_bioderm";
};
datablock PlayerData(LightMaleBiodermArmor) : LightMaleHumanArmor
{
shapeFile = "bioderm_light.dts";
jetEmitter = BiodermArmorJetEmitter;
jetEffect = BiodermArmorJetEffect;
debrisShapeName = "bio_player_debris.dts";
//Foot Prints
decalData = LightBiodermFootprint;
decalOffset = 0.3;
waterBreathSound = WaterBreathBiodermSound;
};
//----------------------------------------------------------------------------
datablock DecalData(MediumBiodermFootprint)
{
sizeX = 0.25;
sizeY = 0.25;
textureName = "special/footprints/M_bioderm";
};
datablock PlayerData(MediumMaleBiodermArmor) : MediumMaleHumanArmor
{
shapeFile = "bioderm_medium.dts";
jetEmitter = BiodermArmorJetEmitter;
jetEffect = BiodermArmorJetEffect;
debrisShapeName = "bio_player_debris.dts";
//Foot Prints
decalData = MediumBiodermFootprint;
decalOffset = 0.35;
waterBreathSound = WaterBreathBiodermSound;
};
//----------------------------------------------------------------------------
datablock DecalData(HeavyBiodermFootprint)
{
sizeX = 0.25;
sizeY = 0.5;
textureName = "special/footprints/H_bioderm";
};
datablock PlayerData(HeavyMaleBiodermArmor) : HeavyMaleHumanArmor
{
emap = false;
shapeFile = "bioderm_heavy.dts";
jetEmitter = BiodermArmorJetEmitter;
debrisShapeName = "bio_player_debris.dts";
//Foot Prints
decalData = HeavyBiodermFootprint;
decalOffset = 0.4;
waterBreathSound = WaterBreathBiodermSound;
};
//----------------------------------------------------------------------------
function Armor::onAdd(%data,%obj)
{
Parent::onAdd(%data, %obj);
// Vehicle timeout
%obj.mountVehicle = true;
// Default dynamic armor stats
%obj.setRechargeRate(%data.rechargeRate);
%obj.setRepairRate(0);
%obj.setSelfPowered();
}
function Armor::onRemove(%this, %obj)
{
//Frohny asked me to remove this - all players are deleted now on mission cycle...
//if(%obj.getState() !$= "Dead")
//{
// error("ERROR PLAYER REMOVED WITHOUT DEATH - TRACE:");
// trace(1);
// schedule(0,0,trace,0);
//}
if (%obj.client.player == %obj)
%obj.client.player = 0;
}
function Armor::onNewDataBlock(%this,%obj)
{
}
function Armor::onDisabled(%this,%obj,%state)
{
%fadeTime = 1000;
%obj.startFade( %fadeTime, ($CorpseTimeoutValue) - %fadeTime, true );
%obj.schedule($CorpseTimeoutValue, "delete");
}
function Armor::shouldApplyImpulse(%data, %obj)
{
return true;
}
$wasFirstPerson = true;
function Armor::onMount(%this,%obj,%vehicle,%node)
{
if (%node == 0)
{
// Node 0 is the pilot's pos.
%obj.setTransform("0 0 0 0 0 1 0");
%obj.setActionThread(%vehicle.getDatablock().mountPose[%node],true,true);
%obj.lastWeapon = %obj.getMountedImage($WeaponSlot);
%obj.unmountImage($WeaponSlot);
if(!%obj.client.isAIControlled())
{
%obj.setControlObject(%vehicle);
%obj.client.setObjectActiveImage(%vehicle, 2);
}
//E3 respawn...
if(%obj == %obj.lastVehicle.lastPilot && %obj.lastVehicle != %vehicle)
{
schedule(15000, %obj.lastVehicle,"vehicleAbandonTimeOut", %obj.lastVehicle);
%obj.lastVehicle.lastPilot = "";
}
if(%vehicle.lastPilot !$= "" && %vehicle == %vehicle.lastPilot.lastVehicle)
%vehicle.lastPilot.lastVehicle = "";
%vehicle.abandon = false;
%vehicle.lastPilot = %obj;
%obj.lastVehicle = %vehicle;
// update the vehicle's team
if((%vehicle.getTarget() != -1) && %vehicle.getDatablock().cantTeamSwitch $= "")
setTargetSensorGroup(%vehicle.getTarget(), %obj.client.getSensorGroup());
// Send a message to the client so they can decide if they want to change view or not:
commandToClient( %obj.client, 'VehicleMount' );
}
else
{
// tailgunner/passenger positions
if(%vehicle.getDataBlock().mountPose[%node] !$= "")
%obj.setActionThread(%vehicle.getDatablock().mountPose[%node]);
else
%obj.setActionThread("root", true);
}
// announce to any other passengers that you've boarded
if(%vehicle.getDatablock().numMountPoints > 1)
for(%i = 0; %i < %vehicle.getDatablock().numMountPoints; %i++)
if (%vehicle.getMountNodeObject(%i) > 0)
commandToClient(%pilot.client, 'showPassenger', %node, true);
//make sure they don't have any packs active
// if ( %obj.getImageState( $BackpackSlot ) $= "activate")
// %obj.use("Backpack");
if ( %obj.getImageTrigger( $BackpackSlot ) )
%obj.setImageTrigger( $BackpackSlot, false );
//AI hooks
%obj.client.vehicleMounted = %vehicle;
AIVehicleMounted(%vehicle);
if(%obj.client.isAIControlled())
%this.AIonMount(%obj, %vehicle, %node);
}
function Armor::onUnmount( %this, %obj, %vehicle, %node )
{
if ( %node == 0 )
{
commandToClient( %obj.client, 'VehicleDismount' );
%obj.mountImage(%obj.lastWeapon, $WeaponSlot);
//Inform gunner position when pilot leaves...
//if(%vehicle.getDataBlock().showPilotInfo !$= "")
// if((%gunner = %vehicle.getMountNodeObject(1)) != 0)
// commandToClient(%gunner.client, 'PilotInfo', "PILOT EJECTED", 6, 1);
}
// announce to any other passengers that you've left
if(%vehicle.getDatablock().numMountPoints > 1)
for(%i = 0; %i < %vehicle.getDatablock().numMountPoints; %i++)
if (%vehicle.getMountNodeObject(%i) > 0)
commandToClient(%vehicle.getMountNodeObject(%i).client, 'showPassenger', %node, false);
//AI hooks
%obj.client.vehicleMounted = "";
if(%obj.client.isAIControlled())
%this.AIonUnMount(%obj, %vehicle, %node);
}
$ammoType[0] = "PlasmaAmmo";
$ammoType[1] = "DiscAmmo";
$ammoType[2] = "GrenadeLauncherAmmo";
$ammoType[3] = "MortarAmmo";
$ammoType[4] = "MissileLauncherAmmo";
$ammoType[5] = "ChaingunAmmo";
function Armor::onCollision(%this,%obj,%col,%forceVehicleNode)
{
if (%obj.getState() $= "Dead")
return;
%dataBlock = %col.getDataBlock();
%className = %dataBlock.className;
%client = %obj.client;
// player collided with a vehicle
%node = -1;
if (%forceVehicleNode !$= "" || (%className $= WheeledVehicleData || %className $= FlyingVehicleData || %className $= HoverVehicleData) &&
%obj.mountVehicle && %obj.getState() $= "Move" && %col.mountable) {
//if the player is an AI, he should snap to the mount points in node order,
//to ensure they mount the turret before the passenger seat, regardless of where they collide...
if (%obj.client.isAIControlled())
{
%transform = %col.getTransform();
//either the AI is *required* to pilot, or they'll pick the first available passenger seat
if (%client.pilotVehicle)
{
//make sure the bot is in light armor
if (%client.player.getArmorSize() $= "Light")
{
//make sure the pilot seat is empty
if (!%col.getMountNodeObject(0))
%node = 0;
}
}
else
%node = findAIEmptySeat(%col, %obj);
}
else
%node = findEmptySeat(%col, %obj, %forceVehicleNode);
//now mount the player in the vehicle
if(%node >= 0)
{
// players can't be pilots, bombardiers or turreteers if they have
// "large" packs -- stations, turrets, turret barrels
if(hasLargePack(%obj)) {
// check to see if attempting to enter a "sitting" node
if(nodeIsSitting(%datablock, %node)) {
// send the player a message -- can't sit here with large pack
messageClient(%obj.client, 'MsgCantSitHere', '\c2Pack too large, can\'t occupy this seat.~wfx/misc/misc.error.wav');
return;
}
}
if(%col.noEnemyControl && %obj.team != %col.team)
return;
commandToClient(%obj.client,'SetDefaultVehicleKeys', true);
//If pilot or passenger then bind a few extra keys
if(%node == 0)
commandToClient(%obj.client,'SetPilotVehicleKeys', true);
else
commandToClient(%obj.client,'SetPassengerVehicleKeys', true);
%col.lastWeapon = %col.getMountedImage($WeaponSlot);
%col.mountObject(%obj,%node);
%col.playAudio(0, MountVehicleSound);
%obj.mVehicle = %col;
// if player is repairing something, stop it
if(%obj.repairing)
stopRepairing(%obj);
//this will setup the huds as well...
%dataBlock.playerMounted(%col,%obj, %node);
}
}
else if (%className $= "Armor") {
// player has collided with another player
if(%col.getState() $= "Dead") {
%gotSomething = false;
// it's corpse-looting time!
// weapons -- don't pick up more than you are allowed to carry!
for(%i = 0; ( %obj.weaponCount < %obj.getDatablock().maxWeapons ) && $InvWeapon[%i] !$= ""; %i++)
{
%weap = $NameToInv[$InvWeapon[%i]];
if ( %col.hasInventory( %weap ) )
{
if ( %obj.incInventory(%weap, 1) > 0 )
{
%col.decInventory(%weap, 1);
%gotSomething = true;
messageClient(%obj.client, 'MsgItemPickup', '\c0You picked up %1.', %weap.pickUpName);
}
}
}
// targeting laser:
if ( %col.hasInventory( "TargetingLaser" ) )
{
if ( %obj.incInventory( "TargetingLaser", 1 ) > 0 )
{
%col.decInventory( "TargetingLaser", 1 );
%gotSomething = true;
messageClient( %obj.client, 'MsgItemPickup', '\c0You picked up a targeting laser.' );
}
}
// ammo
for(%j = 0; $ammoType[%j] !$= ""; %j++)
{
%ammoAmt = %col.inv[$ammoType[%j]];
if(%ammoAmt)
{
// incInventory returns the amount of stuff successfully grabbed
%grabAmt = %obj.incInventory($ammoType[%j], %ammoAmt);
if(%grabAmt > 0)
{
%col.decInventory($ammoType[%j], %grabAmt);
%gotSomething = true;
messageClient(%obj.client, 'MsgItemPickup', '\c0You picked up %1.', $ammoType[%j].pickUpName);
%obj.client.setWeaponsHudAmmo($ammoType[%j], %obj.getInventory($ammoType[%j]));
}
}
}
// figure out what type, if any, grenades the (live) player has
%playerGrenType = "None";
for(%x = 0; $InvGrenade[%x] !$= ""; %x++) {
%gren = $NameToInv[$InvGrenade[%x]];
%playerGrenAmt = %obj.inv[%gren];
if(%playerGrenAmt > 0)
{
%playerGrenType = %gren;
break;
}
}
// grenades
for(%k = 0; $InvGrenade[%k] !$= ""; %k++)
{
%gren = $NameToInv[$InvGrenade[%k]];
%corpseGrenAmt = %col.inv[%gren];
// does the corpse hold any of this grenade type?
if(%corpseGrenAmt)
{
// can the player pick up this grenade type?
if((%playerGrenType $= "None") || (%playerGrenType $= %gren))
{
%taken = %obj.incInventory(%gren, %corpseGrenAmt);
if(%taken > 0)
{
%col.decInventory(%gren, %taken);
%gotSomething = true;
messageClient(%obj.client, 'MsgItemPickup', '\c0You picked up %1.', %gren.pickUpName);
%obj.client.setInventoryHudAmount(%gren, %obj.getInventory(%gren));
}
}
break;
}
}
// figure out what type, if any, mines the (live) player has
%playerMineType = "None";
for(%y = 0; $InvMine[%y] !$= ""; %y++)
{
%mType = $NameToInv[$InvMine[%y]];
%playerMineAmt = %obj.inv[%mType];
if(%playerMineAmt > 0)
{
%playerMineType = %mType;
break;
}
}
// mines
for(%l = 0; $InvMine[%l] !$= ""; %l++)
{
%mine = $NameToInv[$InvMine[%l]];
%mineAmt = %col.inv[%mine];
if(%mineAmt) {
if((%playerMineType $= "None") || (%playerMineType $= %mine))
{
%grabbed = %obj.incInventory(%mine, %mineAmt);
if(%grabbed > 0)
{
%col.decInventory(%mine, %grabbed);
%gotSomething = true;
messageClient(%obj.client, 'MsgItemPickup', '\c0You picked up %1.', %mine.pickUpName);
%obj.client.setInventoryHudAmount(%mine, %obj.getInventory(%mine));
}
}
break;
}
}
// beacons
%beacAmt = %col.inv[Beacon];
if(%beacAmt)
{
%bTaken = %obj.incInventory(Beacon, %beacAmt);
if(%bTaken > 0)
{
%col.decInventory(Beacon, %bTaken);
%gotSomething = true;
messageClient(%obj.client, 'MsgItemPickup', '\c0You picked up %1.', Beacon.pickUpName);
%obj.client.setInventoryHudAmount(Beacon, %obj.getInventory(Beacon));
}
}
// repair kit
%rkAmt = %col.inv[RepairKit];
if(%rkAmt)
{
%rkTaken = %obj.incInventory(RepairKit, %rkAmt);
if(%rkTaken > 0)
{
%col.decInventory(RepairKit, %rkTaken);
%gotSomething = true;
messageClient(%obj.client, 'MsgItemPickup', '\c0You picked up %1.', RepairKit.pickUpName);
%obj.client.setInventoryHudAmount(RepairKit, %obj.getInventory(RepairKit));
}
}
}
if(%gotSomething)
%col.playAudio(0, CorpseLootingSound);
}
}
function Player::setInvincible(%this, %val)
{
%this.invincible = %val;
}
function Player::causedRecentDamage(%this, %val)
{
%this.causedRecentDamage = %val;
}
function hasLargePack(%player)
{
%pack = %player.getMountedImage($BackpackSlot);
if(%pack.isLarge)
return true;
else
return false;
}
function nodeIsSitting(%vehDBlock, %node)
{
// pilot == always a "sitting" node
if(%node == 0)
return true;
else {
switch$ (%vehDBlock.getName())
{
// note: for assault tank -- both nodes are sitting
// for any single-user vehicle -- pilot node is sitting
case "BomberFlyer":
// bombardier == sitting; tailgunner == not sitting
if(%node == 1)
return true;
else
return false;
case "HAPCFlyer":
// only the pilot node is sitting
return false;
default:
return true;
}
}
}
//----------------------------------------------------------------------------
function Player::setMountVehicle(%this, %val)
{
%this.mountVehicle = %val;
}
function Armor::doDismount(%this, %obj, %forced)
{
// This function is called by player.cc when the jump trigger
// is true while mounted
if (!%obj.isMounted())
return;
if(isObject(%obj.getObjectMount().shield))
%obj.getObjectMount().shield.delete();
commandToClient(%obj.client,'SetDefaultVehicleKeys', false);
// Position above dismount point
%pos = getWords(%obj.getTransform(), 0, 2);
%oldPos = %pos;
%vec[0] = " 0 0 1";
%vec[1] = " 0 0 1";
%vec[2] = " 0 0 -1";
%vec[3] = " 1 0 0";
%vec[4] = "-1 0 0";
%numAttempts = 5;
%success = -1;
%impulseVec = "0 0 0";
if (%obj.getObjectMount().getDatablock().hasDismountOverrides() == true)
{
%vec[0] = %obj.getObjectMount().getDatablock().getDismountOverride(%obj.getObjectMount(), %obj);
%vec[0] = MatrixMulVector(%obj.getObjectMount().getTransform(), %vec[0]);
}
else
{
%vec[0] = MatrixMulVector( %obj.getTransform(), %vec[0]);
}
%pos = "0 0 0";
for (%i = 0; %i < %numAttempts; %i++)
{
%pos = VectorAdd(%oldPos, VectorScale(%vec[%i], 3));
if (%obj.checkDismountPoint(%oldPos, %pos))
{
%success = %i;
%impulseVec = %vec[%i];
break;
}
}
if (%forced && %success == -1)
{
%pos = %oldPos;
}
// hide the dashboard HUD and delete elements based on node
commandToClient(%obj.client, 'setHudMode', 'Standard', "", 0);
// Unmount and control body
if(%obj.vehicleTurret)
%obj.vehicleTurret.getDataBlock().playerDismount(%obj.vehicleTurret);
%obj.unmount();
if(%obj.mVehicle)
%obj.mVehicle.getDataBlock().playerDismounted(%obj.mVehicle, %obj);
// bots don't change their control objects when in vehicles
if(!%obj.client.isAIControlled())
{
%vehicle = %obj.getControlObject();
%obj.setControlObject(0);
}
%obj.mountVehicle = false;
%obj.schedule(4000, "setMountVehicle", true);
// Position above dismount point
%obj.setTransform(%pos);
%obj.playAudio(0, UnmountVehicleSound);
%obj.applyImpulse(%pos, VectorScale(%impulseVec, %obj.getDataBlock().mass * 3));
%obj.setPilot(false);
%obj.vehicleTurret = "";
}
//----------------------------------------------------------------------------
function Player::scriptKill(%player, %damageType)
{
%player.scriptKilled = 1;
%player.setInvincible(false);
%player.damage(0, %player.getPosition(), 10000, %damageType);
}
function Armor::damageObject(%data, %targetObject, %sourceObject, %position, %amount, %damageType, %momVec)
{
//error("Armor::damageObject( "@%data@", "@%targetObject@", "@%sourceObject@", "@%position@", "@%amount@", "@%damageType@", "@%momVec@" )");
if(%targetObject.invincible || %targetObject.getState() $= "Dead")
return;
if (%targetObject.isMounted() && %targetObject.scriptKilled $= "")
{
%mount = %targetObject.getObjectMount();
if(%mount.team == %targetObject.team)
{
%found = -1;
for (%i = 0; %i < %mount.getDataBlock().numMountPoints; %i++)
{
if (%mount.getMountNodeObject(%i) == %targetObject)
{
%found = %i;
break;
}
}
if (%found != -1)
{
if (%mount.getDataBlock().isProtectedMountPoint[%found])
{
%mount.getDataBlock().damageObject(%mount, %sourceObject, %position, %amount, %damageType);
return;
}
}
}
}
%targetClient = %targetObject.getOwnerClient();
%sourceClient = isObject(%sourceObject) ? %sourceObject.getOwnerClient() : 0;
%targetTeam = %targetClient.team;
//if the source object is a player object, player's don't have sensor groups
// if it's a turret, get the sensor group of the target
// if its a vehicle (of any type) use the sensor group
if (%sourceClient)
%sourceTeam = %sourceClient.getSensorGroup();
else if(%damageType == $DamageType::Suicide)
%sourceTeam = 0;
else if(isObject(%sourceObject) && %sourceObject.getClassName() $= "Turret")
%sourceTeam = getTargetSensorGroup(%sourceObject.getTarget());
else if( isObject(%sourceObject) &&
( %sourceObject.getClassName() $= "FlyingVehicle" || %sourceObject.getClassName() $= "WheeledVehicle" || %sourceObject.getClassName() $= "HoverVehicle"))
%sourceTeam = getTargetSensorGroup(%sourceObject.getTarget());
else
{
if (isObject(%sourceObject) && %sourceObject.getTarget() >= 0 )
{
%sourceTeam = getTargetSensorGroup(%sourceObject.getTarget());
}
else
{
%sourceTeam = -1;
}
}
// if teamdamage is off, and both parties are on the same team
// (but are not the same person), apply no damage
if(!$teamDamage && (%targetClient != %sourceClient) && (%targetTeam == %sourceTeam))
return;
if(%targetObject.isShielded && %damageType != $DamageType::Blaster)
%amount = %data.checkShields(%targetObject, %position, %amount, %damageType);
if(%amount == 0)
return;
// Set the damage flash
%damageScale = %data.damageScale[%damageType];
if(%damageScale !$= "")
%amount *= %damageScale;
%flash = %targetObject.getDamageFlash() + (%amount * 2);
if (%flash > 0.75)
%flash = 0.75;
%previousDamage = %targetObject.getDamagePercent();
%targetObject.setDamageFlash(%flash);
%targetObject.applyDamage(%amount);
Game.onClientDamaged(%targetClient, %sourceClient, %damageType, %sourceObject);
%targetClient.lastDamagedBy = %damagingClient;
%targetClient.lastDamaged = getSimTime();
//now call the "onKilled" function if the client was... you know...
if(%targetObject.getState() $= "Dead")
{
// where did this guy get it?
%damLoc = %targetObject.getDamageLocation(%position);
// should this guy be blown apart?
if( %damageType == $DamageType::Explosion ||
%damageType == $DamageType::TankMortar ||
%damageType == $DamageType::Mortar ||
%damageType == $DamageType::MortarTurret ||
%damageType == $DamageType::BomberBombs ||
%damageType == $DamageType::SatchelCharge ||
%damageType == $DamageType::Missile )
{
if( %previousDamage >= 0.35 ) // only if <= 35 percent damage remaining
{
%targetObject.setMomentumVector(%momVec);
%targetObject.blowup();
}
}
// this should be funny...
if( %damageType == $DamageType::VehicleSpawn )
{
%targetObject.setMomentumVector("0 0 1");
%targetObject.blowup();
}
// If we were killed, max out the flash
%targetObject.setDamageFlash(0.75);
%damLoc = %targetObject.getDamageLocation(%position);
Game.onClientKilled(%targetClient, %sourceClient, %damageType, %sourceObject, %damLoc);
}
else if ( %amount > 0.1 )
{
if( %targetObject.station $= "" && %targetObject.isCloaked() )
{
%targetObject.setCloaked( false );
%targetObject.reCloak = %targetObject.schedule( 500, "setCloaked", true );
}
playPain( %targetObject );
}
}
function Armor::onImpact(%data, %playerObject, %collidedObject, %vec, %vecLen)
{
%data.damageObject(%playerObject, 0, VectorAdd(%playerObject.getPosition(),%vec),
%vecLen * %data.speedDamageScale, $DamageType::Ground);
}
function Armor::applyConcussion( %this, %dist, %radius, %sourceObject, %targetObject )
{
%percentage = 1 - ( %dist / %radius );
%random = getRandom();
if( %sourceObject == %targetObject )
{
%flagChance = 1.0;
%itemChance = 1.0;
}
else
{
%flagChance = 0.7;
%itemChance = 0.7;
}
%probabilityFlag = %flagChance * %percentage;
%probabilityItem = %itemChance * %percentage;
if( %random <= %probabilityFlag )
{
Game.applyConcussion( %targetObject );
}
if( %random <= %probabilityItem )
{
%player = %targetObject;
%numWeapons = 0;
// blaster 0
// plasma 1
// chain 2
// disc 3
// grenade 4
// snipe 5
// elf 6
// mortar 7
//get our inventory
if( %weaps[0] = %player.getInventory("Blaster") > 0 ) %numWeapons++;
if( %weaps[1] = %player.getInventory("Plasma") > 0 ) %numWeapons++;
if( %weaps[2] = %player.getInventory("Chaingun") > 0 ) %numWeapons++;
if( %weaps[3] = %player.getInventory("Disc") > 0 ) %numWeapons++;
if( %weaps[4] = %player.getInventory("GrenadeLauncher") > 0 ) %numWeapons++;
if( %weaps[5] = %player.getInventory("SniperRifle") > 0 ) %numWeapons++;
if( %weaps[6] = %player.getInventory("ELFGun") > 0 ) %numWeapons++;
if( %weaps[7] = %player.getInventory("Mortar") > 0 ) %numWeapons++;
%foundWeapon = false;
%attempts = 0;
if( %numWeapons > 0 )
{
while( !%foundWeapon )
{
%rand = mFloor( getRandom() * 8 );
if( %weaps[ %rand ] )
{
%foundWeapon = true;
switch ( %rand )
{
case 0:
%player.use("Blaster");
case 1:
%player.use("Plasma");
case 2:
%player.use("Chaingun");
case 3:
%player.use("Disc");
case 4:
%player.use("GrenadeLauncher");
case 5:
%player.use("SniperRifle");
case 6:
%player.use("ElfGun");
case 7:
%player.use("Mortar");
}
%image = %player.getMountedImage( $WeaponSlot );
%player.throw( %image.item );
%player.client.setWeaponsHudItem( %image.item, 0, 0 );
%player.throwPack();
}
else
{
%attempts++;
if( %attempts > 10 )
%foundWeapon = true;
}
}
}
else
{
%targetObject.throwPack();
%targetObject.throwWeapon();
}
}
}
//----------------------------------------------------------------------------
$DeathCry[1] = 'avo.deathCry_01';
$DeathCry[2] = 'avo.deathCry_02';
$PainCry[1] = 'avo.grunt';
$PainCry[2] = 'avo.pain';
function playDeathCry( %obj )
{
%client = %obj.client;
%random = getRandom(1) + 1;
%desc = AudioClosest3d;
playTargetAudio( %client.target, $DeathCry[%random], %desc, false );
}
function playPain( %obj )
{
%client = %obj.client;
%random = getRandom(1) + 1;
%desc = AudioClosest3d;
playTargetAudio( %client.target, $PainCry[%random], %desc, false);
}
//----------------------------------------------------------------------------
//$DefaultPlayerArmor = LightMaleHumanArmor;
$DefaultPlayerArmor = Light;
function Player::setArmor(%this,%size)
{
// Takes size as "Light","Medium", "Heavy"
%client = %this.client;
if (%client.race $= "Bioderm")
// Only have male bioderms.
%armor = %size @ "Male" @ %client.race @ Armor;
else
%armor = %size @ %client.sex @ %client.race @ Armor;
//echo("Player::armor: " @ %armor);
%this.setDataBlock(%armor);
%client.armor = %size;
}
function getDamagePercent(%maxDmg, %dmgLvl)
{
return (%dmgLvl / %maxDmg);
}
function Player::getArmorSize(%this)
{
// return size as "Light","Medium", "Heavy"
%dataBlock = %this.getDataBlock().getName();
if (getSubStr(%dataBlock, 0, 5) $= "Light")
return "Light";
else if (getSubStr(%dataBlock, 0, 6) $= "Medium")
return "Medium";
else if (getSubStr(%dataBlock, 0, 5) $= "Heavy")
return "Heavy";
else
return "Unknown";
}
function Player::pickup(%this,%obj,%amount)
{
%data = %obj.getDataBlock();
// Don't pick up a pack if we already have one mounted
if (%data.className $= Pack &&
%this.getMountedImage($BackpackSlot) != 0)
return 0;
// don't pick up a weapon (other than targeting laser) if player's at maxWeapons
else if(%data.className $= Weapon
&& %data.getName() !$= "TargetingLaser" // Special case
&& %this.weaponCount >= %this.getDatablock().maxWeapons)
return 0;
// don't allow players to throw large packs at pilots (thanks Wizard)
else if(%data.className $= Pack && %data.image.isLarge && %this.isPilot())
return 0;
return ShapeBase::pickup(%this,%obj,%amount);
}
function Player::use( %this,%data )
{
// If player is in a station then he can't use any items
if(%this.station !$= "")
return false;
// Convert the word "Backpack" to whatever is in the backpack slot.
if ( %data $= "Backpack" )
{
if ( %this.inStation )
return false;
if ( %this.isPilot() )
{
messageClient( %this.client, 'MsgCantUsePack', '\c2You can\'t use your pack while piloting.~wfx/misc/misc.error.wav' );
return( false );
}
else if ( %this.isWeaponOperator() )
{
messageClient( %this.client, 'MsgCantUsePack', '\c2You can\'t use your pack while in a weaponry position.~wfx/misc/misc.error.wav' );
return( false );
}
%image = %this.getMountedImage( $BackpackSlot );
if ( %image )
%data = %image.item;
}
// Can't use some items when piloting or your a weapon operator
if ( %this.isPilot() || %this.isWeaponOperator() )
if ( %data.getName() !$= "RepairKit" )
return false;
return ShapeBase::use( %this, %data );
}
function Player::maxInventory(%this,%data)
{
%max = ShapeBase::maxInventory(%this,%data);
if (%this.getInventory(AmmoPack))
%max += AmmoPack.max[%data.getName()];
return %max;
}
function Player::isPilot(%this)
{
%vehicle = %this.getObjectMount();
// There are two "if" statements to avoid a script warning.
if (%vehicle)
if (%vehicle.getMountNodeObject(0) == %this)
return true;
return false;
}
function Player::isWeaponOperator(%this)
{
%vehicle = %this.getObjectMount();
if ( %vehicle )
{
%weaponNode = %vehicle.getDatablock().weaponNode;
if ( %weaponNode > 0 && %vehicle.getMountNodeObject( %weaponNode ) == %this )
return( true );
}
return( false );
}
function Player::liquidDamage(%obj, %data, %damageAmount, %damageType)
{
if(%obj.getState() !$= "Dead")
{
%data.damageObject(%obj, 0, "0 0 0", %damageAmount, %damageType);
%obj.lDamageSchedule = %obj.schedule(50, "liquidDamage", %data, %damageAmount, %damageType);
}
else
%obj.lDamageSchedule = "";
}
function Armor::onEnterLiquid(%data, %obj, %coverage, %type)
{
switch(%type)
{
case 0:
//Water
case 1:
//Ocean Water
case 2:
//River Water
case 3:
//Stagnant Water
case 4:
//Lava
%obj.liquidDamage(%data, $DamageLava, $DamageType::Lava);
case 5:
//Hot Lava
%obj.liquidDamage(%data, $DamageHotLava, $DamageType::Lava);
case 6:
//Crusty Lava
%obj.liquidDamage(%data, $DamageCrustyLava, $DamageType::Lava);
case 7:
//Quick Sand
}
}
function Armor::onLeaveLiquid(%data, %obj, %type)
{
switch(%type)
{
case 0:
//Water
case 1:
//Ocean Water
case 2:
//River Water
case 3:
//Stagnant Water
case 4:
//Lava
case 5:
//Hot Lava
case 6:
//Crusty Lava
case 7:
//Quick Sand
}
if(%obj.lDamageSchedule !$= "")
{
cancel(%obj.lDamageSchedule);
%obj.lDamageSchedule = "";
}
}
function Armor::onTrigger(%data, %player, %triggerNum, %val)
{
if (%triggerNum == 4)
{
// Throw grenade
if (%val == 1)
{
%player.grenTimer = 1;
}
else
{
if (%player.grenTimer == 0)
{
// Bad throw for some reason
}
else
{
%player.use(Grenade);
%player.grenTimer = 0;
}
}
}
else if (%triggerNum == 5)
{
// Throw mine
if (%val == 1)
{
%player.mineTimer = 1;
}
else
{
if (%player.mineTimer == 0)
{
// Bad throw for some reason
}
else
{
%player.use(Mine);
%player.mineTimer = 0;
}
}
}
else if (%triggerNum == 3)
{
// val = 1 when jet key (LMB) first pressed down
// val = 0 when jet key released
// MES - do we need this at all any more?
if(%val == 1)
%player.isJetting = true;
else
%player.isJetting = false;
}
}
function Player::setMoveState(%obj, %move)
{
%obj.disableMove(%move);
}
function Armor::onLeaveMissionArea(%data, %obj)
{
Game.leaveMissionArea(%data, %obj);
}
function Armor::onEnterMissionArea(%data, %obj)
{
Game.enterMissionArea(%data, %obj);
}
function Armor::animationDone(%data, %obj)
{
if(%obj.animResetWeapon !$= "")
{
if(%obj.getMountedImage($WeaponSlot) == 0)
if(%obj.inv[%obj.lastWeapon])
%obj.use(%obj.lastWeapon);
%obj.animSetWeapon = "";
}
}
function playDeathAnimation(%player, %damageLocation, %type)
{
%vertPos = firstWord(%damageLocation);
%quadrant = getWord(%damageLocation, 1);
//echo("vert Pos: " @ %vertPos);
//echo("quad: " @ %quadrant);
if( %type == $DamageType::Explosion || %type == $DamageType::Mortar || %type == $DamageType::Grenade)
{
if(%quadrant $= "front_left" || %quadrant $= "front_right")
%curDie = $PlayerDeathAnim::ExplosionBlowBack;
else
%curDie = $PlayerDeathAnim::TorsoBackFallForward;
}
else if(%vertPos $= "head")
{
if(%quadrant $= "front_left" || %quadrant $= "front_right" )
%curDie = $PlayerDeathAnim::HeadFrontDirect;
else
%curDie = $PlayerDeathAnim::HeadBackFallForward;
}
else if(%vertPos $= "torso")
{
if(%quadrant $= "front_left" )
%curDie = $PlayerDeathAnim::TorsoLeftSpinDeath;
else if(%quadrant $= "front_right")
%curDie = $PlayerDeathAnim::TorsoRightSpinDeath;
else if(%quadrant $= "back_left" )
%curDie = $PlayerDeathAnim::TorsoBackFallForward;
else if(%quadrant $= "back_right")
%curDie = $PlayerDeathAnim::TorsoBackFallForward;
}
else if (%vertPos $= "legs")
{
if(%quadrant $= "front_left" || %quadrant $= "back_left")
%curDie = $PlayerDeathAnim::LegsLeftGimp;
if(%quadrant $= "front_right" || %quadrant $= "back_right")
%curDie = $PlayerDeathAnim::LegsRightGimp;
}
if(%curDie $= "" || %curDie < 1 || %curDie > 11)
%curDie = 1;
%player.setActionThread("Death" @ %curDie);
}
function Armor::onDamage(%data, %obj)
{
if(%obj.station !$= "" && %obj.getDamageLevel() == 0)
%obj.station.getDataBlock().endRepairing(%obj.station);
}