This is the default Projectile damage function. When a projectile collides with something, it determines if it should damage it (via minigame checks) then calls this function.
If you wish to change the way that all damage is applied (for things like damage zones or dismemberment), you should overwrite this function.
If you wish to have a special damage effect for a particular weapon (such as a shrink ray), you should copy this function and replace ProjectileData:: with the name of your new projectile datablock.
function ProjectileData::damage(%this,%obj,%col,%fade,%pos,%normal)
{
if(%this.directDamage <= 0)
return;
%damageType = $DamageType::Direct;
if(%this.DirectDamageType)
%damageType = %this.DirectDamageType;
%scale = getWord(%obj.getScale(), 2);
%directDamage = mClampF(%this.directDamage, -100, 100) * %scale;
if(%col.getType() & $TypeMasks::PlayerObjectType)
{
%col.damage(%obj, %pos, %directDamage, %damageType);
}
else
{
%col.damage(%obj, %pos, %directDamage, %damageType);
}
}
Radius damage is applied similarly
function ProjectileData::radiusDamage(%this, %obj, %col, %distanceFactor, %pos, %damageAmt)
{
//validate distance factor
if(%distanceFactor <= 0)
return;
else if(%distanceFactor > 1)
%distanceFactor = 1;
%damageAmt *= %distanceFactor;
if(%damageAmt)
{
//use default damage type if no damage type is given
%damageType = $DamageType::Radius;
if(%this.RadiusDamageType)
%damageType = %this.RadiusDamageType;
%col.damage(%obj, %pos, %damageAmt, %damageType);
//burn the player?
if(%this.explosion.playerBurnTime > 0)
{
if(%col.getType() & ($TypeMasks::PlayerObjectType | $TypeMasks::CorpseObjectType))
{
//check for vehicle protection from burning
%doBurn = true;
if(%col.isMounted())
{
%mountData = %col.getObjectMount().getDataBlock();
if(%mountData.protectPassengersBurn)
%doBurn = false;
}
if(%doBurn)
%col.burn(%this.explosion.playerBurnTime * %distanceFactor);
}
}
}
}