1 #using scripts\codescripts\struct;
3 #using scripts\shared\damagefeedback_shared;
4 #using scripts\shared\spawner_shared;
5 #using scripts\shared\vehicle_shared;
6 #using scripts\shared\callbacks_shared;
8 #insert scripts\shared\shared.gsh;
10 #using scripts\zm\gametypes\_damagefeedback;
11 #using scripts\zm\gametypes\_globallogic_player;
12 #using scripts\zm\gametypes\_weapons;
14 #namespace globallogic_vehicle;
18 if ( isdefined( level.vehicle_main_callback ) )
20 if( isdefined( level.vehicle_main_callback[
self.vehicleType ] ) )
22 self thread [[level.vehicle_main_callback[
self.vehicleType ]]]();
24 else if( isdefined(
self.scriptVehicleType ) && isdefined( level.vehicle_main_callback[
self.scriptVehicleType ] ) )
26 self thread [[level.vehicle_main_callback[
self.scriptVehicleType ]]]();
30 if ( IsSentient(
self ) )
36 function Callback_VehicleDamage( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, vPoint, vDir, sHitLoc, vDamageOrigin, psOffsetTime, damageFromUnderneath, modelIndex, partName, vSurfaceNormal )
45 self.iDFlags = iDFlags;
46 self.iDFlagsTime = getTime();
48 if ( game[
"state"] ==
"postgame" )
51 if ( isdefined( eAttacker ) && isPlayer( eAttacker ) && isdefined( eAttacker.canDoCombat ) && !eAttacker.canDoCombat )
56 if( !isdefined( vDir ) )
57 iDFlags |= level.iDFLAGS_NO_KNOCKBACK;
61 if ( ( isdefined(
self.maxhealth ) && (
self.health ==
self.maxhealth)) || !isdefined(
self.attackers ) )
64 self.attackerData = [];
65 self.attackerDamage = [];
69 if ( weapon == level.weaponNone && isdefined( eInflictor ) )
71 if ( isdefined( eInflictor.targetname ) && eInflictor.targetname ==
"explodable_barrel" )
72 weapon = GetWeapon(
"explodable_barrel" );
73 else if ( isdefined( eInflictor.destructible_type ) && isSubStr( eInflictor.destructible_type,
"vehicle_" ) )
74 weapon = GetWeapon(
"destructible_car" );
79 if( !(iDFlags & level.iDFLAGS_NO_PROTECTION) )
81 if (
self IsVehicleImmuneToDamage( iDFlags, sMeansOfDeath, weapon ) )
83 if ( isdefined(
self.overrideVehicleDamage ) )
85 iDamage =
self [[
self.overrideVehicleDamage]]( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, vPoint, vDir, sHitLoc, vDamageOrigin, psOffsetTime, damageFromUnderneath, modelIndex, partName, vSurfaceNormal );
87 else if ( isdefined( level.overrideVehicleDamage ) )
89 iDamage =
self [[level.overrideVehicleDamage]]( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, vPoint, vDir, sHitLoc, vDamageOrigin, psOffsetTime, damageFromUnderneath, modelIndex, partName, vSurfaceNormal );
96 if ( sMeansOfDeath ==
"MOD_PROJECTILE" || sMeansOfDeath ==
"MOD_GRENADE" )
98 iDamage *= weapon.vehicleProjectileDamageScalar;
99 iDamage = int(iDamage);
107 else if ( sMeansOfDeath ==
"MOD_GRENADE_SPLASH" )
110 iDamage = int(iDamage);
118 iDamage *= level.vehicleDamageScalar;
119 iDamage *=
self GetVehDamageMultiplier(sMeansOfDeath);
120 iDamage = int(iDamage);
122 if ( isPlayer( eAttacker ) )
123 eAttacker.pers[
"participation"]++;
125 if( !isdefined(
self.maxhealth ) )
127 self.maxhealth =
self.healthdefault;
130 if ( isdefined(
self.overrideVehicleDamage ) )
132 iDamage =
self [[
self.overrideVehicleDamage]]( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, vPoint, vDir, sHitLoc, vDamageOrigin, psOffsetTime, damageFromUnderneath, modelIndex, partName, vSurfaceNormal );
134 else if ( isdefined( level.overrideVehicleDamage ) )
136 iDamage =
self [[level.overrideVehicleDamage]]( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, vPoint, vDir, sHitLoc, vDamageOrigin, psOffsetTime, damageFromUnderneath, modelIndex, partName, vSurfaceNormal );
139 prevHealthRatio =
self.health /
self.maxhealth;
141 if ( isdefined(
self.owner ) && IsPlayer(
self.owner) )
143 team =
self.owner.pers[
"team"];
147 team =
self vehicle::vehicle_get_occupant_team();
150 if ( level.teamBased && isPlayer( eAttacker ) && (team == eAttacker.pers[
"team"]) )
152 if ( level.friendlyfire == 0 )
161 self.lastDamageWasFromEnemy =
false;
163 self finishVehicleDamage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, vPoint, vDir, sHitLoc, psOffsetTime, damageFromUnderneath, modelIndex, partName,
true);
165 else if ( level.friendlyfire == 1 )
171 self.lastDamageWasFromEnemy =
false;
173 self finishVehicleDamage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, vPoint, vDir, sHitLoc, psOffsetTime, damageFromUnderneath, modelIndex, partName,
false);
175 else if ( level.friendlyfire == 2 )
184 self.lastDamageWasFromEnemy =
false;
186 self finishVehicleDamage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, vPoint, vDir, sHitLoc, psOffsetTime, damageFromUnderneath, modelIndex, partName,
true);
188 else if ( level.friendlyfire == 3 )
190 iDamage = int(iDamage * .5);
196 self.lastDamageWasFromEnemy =
false;
198 self finishVehicleDamage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, vPoint, vDir, sHitLoc, psOffsetTime, damageFromUnderneath, modelIndex, partName,
false);
205 if ( !level.teamBased && isdefined(
self.targetname ) &&
self.targetname ==
"rcbomb" )
209 else if ( isdefined(
self.owner ) && isdefined( eAttacker ) &&
self.owner == eAttacker )
213 if( (iDamage < 1) && !
IS_TRUE(level.bzm_worldPaused) )
216 if ( issubstr( sMeansOfDeath,
"MOD_GRENADE" ) && isdefined( eInflictor ) && isdefined( eInflictor.isCooked ) )
217 self.wasCooked = getTime();
219 self.wasCooked = undefined;
221 attacker_seat = undefined;
222 if ( isdefined( eAttacker ) )
223 attacker_seat =
self GetOccupantSeat( eAttacker );
225 self.lastDamageWasFromEnemy = (isdefined( eAttacker ) && !isdefined(attacker_seat));
227 self finishVehicleDamage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, vPoint, vDir, sHitLoc, psOffsetTime, damageFromUnderneath, modelIndex, partName,
false);
229 if ( level.gameType ==
"hack" && !weapon.isEmp )
235 if ( isdefined(eAttacker) && eAttacker !=
self )
247 lpselfnum =
self getEntityNumber();
251 if(isPlayer(eAttacker))
253 lpattacknum = eAttacker getEntityNumber();
254 lpattackGuid = eAttacker getGuid();
255 lpattackname = eAttacker.name;
256 lpattackerteam = eAttacker.pers[
"team"];
263 lpattackerteam =
"world";
266 logPrint(
"VD;" + lpselfnum +
";" + lpselfteam +
";" + lpattackGuid +
";" + lpattacknum +
";" + lpattackerteam +
";" + lpattackname +
";" + weapon.name +
";" + iDamage +
";" + sMeansOfDeath +
";" + sHitLoc +
"\n");
271 function Callback_VehicleRadiusDamage( eInflictor, eAttacker, iDamage, fInnerDamage, fOuterDamage, iDFlags, sMeansOfDeath, weapon, vPoint, fRadius, fConeAngleCos, vConeDir, psOffsetTime )
273 self.iDFlags = iDFlags;
274 self.iDFlagsTime = getTime();
276 if ( game[
"state"] ==
"postgame" )
279 if ( isdefined( eAttacker ) && isPlayer( eAttacker ) && isdefined( eAttacker.canDoCombat ) && !eAttacker.canDoCombat )
285 if( !(iDFlags & level.iDFLAGS_NO_PROTECTION) )
287 if (
self IsVehicleImmuneToDamage( iDFlags, sMeansOfDeath, weapon ) )
292 if ( isdefined(
self.overrideVehicleRadiusDamage ) )
294 iDamage =
self [[
self.overrideVehicleRadiusDamage]]( eInflictor, eAttacker, iDamage, fInnerDamage, fOuterDamage, iDFlags, sMeansOfDeath, weapon, vPoint, fRadius, fConeAngleCos, vConeDir, psOffsetTime );
296 else if ( isdefined( level.overrideVehicleRadiusDamage ) )
298 iDamage =
self [[level.overrideVehicleRadiusDamage]]( eInflictor, eAttacker, iDamage, fInnerDamage, fOuterDamage, iDFlags, sMeansOfDeath, weapon, vPoint, fRadius, fConeAngleCos, vConeDir, psOffsetTime );
302 if ( sMeansOfDeath ==
"MOD_PROJECTILE_SPLASH" || sMeansOfDeath ==
"MOD_GRENADE_SPLASH" || sMeansOfDeath ==
"MOD_EXPLOSIVE" )
305 scalar = weapon.vehicleProjectileSplashDamageScalar;
306 iDamage = int(iDamage * scalar);
307 fInnerDamage = (fInnerDamage * scalar);
308 fOuterDamage = (fOuterDamage * scalar);
310 if ( fInnerDamage == 0 )
320 occupant_team =
self vehicle::vehicle_get_occupant_team();
322 if ( level.teamBased && isPlayer( eAttacker ) && (occupant_team == eAttacker.pers[
"team"]) )
324 if ( level.friendlyfire == 0 )
333 self.lastDamageWasFromEnemy =
false;
335 self finishVehicleRadiusDamage(eInflictor, eAttacker, iDamage, fInnerDamage, fOuterDamage, iDFlags, sMeansOfDeath, weapon, vPoint, fRadius, fConeAngleCos, vConeDir, psOffsetTime);
337 else if ( level.friendlyfire == 1 )
343 self.lastDamageWasFromEnemy =
false;
345 self finishVehicleRadiusDamage(eInflictor, eAttacker, iDamage, fInnerDamage, fOuterDamage, iDFlags, sMeansOfDeath, weapon, vPoint, fRadius, fConeAngleCos, vConeDir, psOffsetTime);
347 else if ( level.friendlyfire == 2 )
356 self.lastDamageWasFromEnemy =
false;
358 self finishVehicleRadiusDamage(eInflictor, eAttacker, iDamage, fInnerDamage, fOuterDamage, iDFlags, sMeansOfDeath, weapon, vPoint, fRadius, fConeAngleCos, vConeDir, psOffsetTime);
360 else if ( level.friendlyfire == 3 )
362 iDamage = int(iDamage * .5);
368 self.lastDamageWasFromEnemy =
false;
370 self finishVehicleRadiusDamage(eInflictor, eAttacker, iDamage, fInnerDamage, fOuterDamage, iDFlags, sMeansOfDeath, weapon, vPoint, fRadius, fConeAngleCos, vConeDir, psOffsetTime);
381 self finishVehicleRadiusDamage(eInflictor, eAttacker, iDamage, fInnerDamage, fOuterDamage, iDFlags, sMeansOfDeath, weapon, vPoint, fRadius, fConeAngleCos, vConeDir, psOffsetTime);
389 params = SpawnStruct();
390 params.eInflictor = eInflictor;
391 params.eAttacker = eAttacker;
392 params.iDamage = iDamage;
393 params.sMeansOfDeath = sMeansOfDeath;
394 params.weapon = weapon;
396 params.sHitLoc = sHitLoc;
397 params.psOffsetTime = psOffsetTime;
400 self.str_damagemod = sMeansOfDeath;
401 self.w_damage = weapon;
403 if ( game[
"state"] ==
"postgame" )
406 if( IsAI(eAttacker) && isdefined( eAttacker.script_owner ) )
410 if ( eAttacker.script_owner.team !=
self.team )
411 eAttacker = eAttacker.script_owner;
414 if ( isdefined( eAttacker ) && isdefined( eAttacker.onKill ) )
416 eAttacker [[eAttacker.onKill]]( self );
419 if ( isdefined(eInflictor) )
421 self.damageInflictor = eInflictor;
428 if ( isdefined(
self.overrideVehicleKilled ) )
430 self [[
self.overrideVehicleKilled]]( eInflictor, eAttacker, iDamage, sMeansOfDeath, weapon, vDir, sHitLoc, psOffsetTime );
436 self endon(
"disconnect");
438 if(isdefined( level._effect ) && isdefined( level._effect[
"tanksquish"] ) )
440 PlayFX( level._effect[
"tanksquish"],
self.origin + (0, 0, 30));
443 self playsound(
"chr_crunch" );
450 if ( weapon.name ==
"satchel_charge" )
468 if (isdefined(
self.allowFriendlyFireDamageOverride ) )
470 return [[
self.allowFriendlyFireDamageOverride]](eInflictor, eAttacker, sMeansOfDeath, weapon );