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\weapons\_weapons;
8 #insert scripts\shared\shared.gsh;
10 #using scripts\mp\gametypes\_globallogic_player;
11 #using scripts\mp\gametypes\_loadout;
12 #using scripts\mp\killstreaks\_killstreak_bundles;
13 #using scripts\mp\killstreaks\_killstreaks;
15 #using scripts\mp\_vehicle;
17 #namespace globallogic_vehicle;
21 self.health =
self.healthdefault;
23 if ( IsSentient(
self ) )
32 if ( isdefined( level.vehicle_main_callback ) )
34 if( isdefined( level.vehicle_main_callback[
self.vehicleType ] ) )
36 self thread [[level.vehicle_main_callback[
self.vehicleType ]]]();
38 else if( isdefined(
self.scriptVehicleType ) && isdefined( level.vehicle_main_callback[
self.scriptVehicleType ] ) )
40 self thread [[level.vehicle_main_callback[
self.scriptVehicleType ]]]();
45 function Callback_VehicleDamage( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, vPoint, vDir, sHitLoc, vDamageOrigin, psOffsetTime, damageFromUnderneath, modelIndex, partName, vSurfaceNormal )
47 selfEntNum =
self getEntityNumber();
48 eAttackerNotSelf = ( isdefined( eAttacker ) && ( eAttacker != self ) );
49 eAttackerIsNotOwner = ( isdefined( eAttacker ) && isdefined(
self.owner ) && ( eAttacker !=
self.owner ) );
50 tryToDoDamageFeedback = !isdefined(
self.noDamageFeedback ) || !
self.noDamageFeedback;
59 self.iDFlags = iDFlags;
60 self.iDFlagsTime = getTime();
62 if ( game[
"state"] ==
"postgame" )
65 self finishVehicleDamage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, vPoint, vDir, sHitLoc, psOffsetTime, damageFromUnderneath, modelIndex, partName,
false);
69 if ( isdefined( eAttacker ) && isPlayer( eAttacker ) && isdefined( eAttacker.canDoCombat ) && !eAttacker.canDoCombat )
75 if ( isdefined(
self.overrideVehicleDamage ) )
77 iDamage =
self [[
self.overrideVehicleDamage]]( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, vPoint, vDir, sHitLoc, vDamageOrigin, psOffsetTime, damageFromUnderneath, modelIndex, partName, vSurfaceNormal );
79 else if ( isdefined( level.overrideVehicleDamage ) )
81 iDamage =
self [[level.overrideVehicleDamage]]( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, vPoint, vDir, sHitLoc, vDamageOrigin, psOffsetTime, damageFromUnderneath, modelIndex, partName, vSurfaceNormal );
84 assert(isdefined(iDamage),
"You must return a value from a damage override function.");
90 if( !isdefined( vDir ) )
93 if ( ( isdefined(
self.maxhealth ) && (
self.health ==
self.maxhealth)) || !isdefined(
self.attackers ) )
96 self.attackerData = [];
97 self.attackerDamage = [];
101 if ( weapon == level.weaponNone && isdefined( eInflictor ) )
103 if ( isdefined( eInflictor.targetname ) && eInflictor.targetname ==
"explodable_barrel" )
104 weapon = GetWeapon(
"explodable_barrel" );
105 else if ( isdefined( eInflictor.destructible_type ) && isSubStr( eInflictor.destructible_type,
"vehicle_" ) )
106 weapon = GetWeapon(
"destructible_car" );
113 if (
self IsVehicleImmuneToDamage( iDFlags, sMeansOfDeath, weapon ) )
119 if ( sMeansOfDeath ==
"MOD_PROJECTILE" || sMeansOfDeath ==
"MOD_GRENADE" )
121 iDamage *= weapon.vehicleProjectileDamageScalar;
122 iDamage = int(iDamage);
130 else if ( sMeansOfDeath ==
"MOD_GRENADE_SPLASH" )
133 iDamage = int(iDamage);
141 iDamage *= level.vehicleDamageScalar;
142 iDamage = int(iDamage);
144 if ( isPlayer( eAttacker ) )
145 eAttacker.pers[
"participation"]++;
147 if( !IsDefined(
self.maxhealth ) )
149 self.maxhealth =
self.healthdefault;
152 prevHealthRatio =
self.health /
self.maxhealth;
154 if ( isdefined(
self.owner ) && IsPlayer(
self.owner) )
156 team =
self.owner.pers[
"team"];
160 team =
self vehicle::vehicle_get_occupant_team();
163 if ( level.teamBased && isPlayer( eAttacker ) && (team == eAttacker.pers[
"team"]) )
170 self.lastDamageWasFromEnemy =
false;
171 self finishVehicleDamage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, vPoint, vDir, sHitLoc, psOffsetTime, damageFromUnderneath, modelIndex, partName,
false);
173 else if( !level.hardcoreMode && isdefined(
self.owner ) && isdefined( eAttacker ) && isdefined( eAttacker.owner ) && (
self.owner == eAttacker.owner ) && (
self != eAttacker ) )
180 if ( !level.teamBased && isdefined(
self.archetype ) &&
self.archetype ==
"raps" )
184 else if ( !level.teamBased && isdefined(
self.targetname ) &&
self.targetname ==
"rcbomb" )
188 else if ( isdefined(
self.owner ) && isdefined( eAttacker ) &&
self.owner == eAttacker )
197 if ( issubstr( sMeansOfDeath,
"MOD_GRENADE" ) && isdefined( eInflictor ) && isdefined( eInflictor.isCooked ) )
198 self.wasCooked = getTime();
200 self.wasCooked = undefined;
202 attacker_seat = undefined;
203 if ( isdefined( eAttacker ) )
204 attacker_seat =
self GetOccupantSeat( eAttacker );
206 self.lastDamageWasFromEnemy = (isdefined( eAttacker ) && !isdefined(attacker_seat));
210 self finishVehicleDamage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, vPoint, vDir, sHitLoc, psOffsetTime, damageFromUnderneath, modelIndex, partName,
false);
214 if ( level.gameType ==
"hack" && !weapon.isEmp )
220 if ( eAttackerNotSelf && ( eAttackerIsNotOwner || ( isdefined(
self.selfDestruct ) && !
self.selfDestruct ) || (
self.forceDamageFeedback ===
true ) ) )
222 if ( tryToDoDamageFeedback )
225 if( isdefined(
self.damageTaken ) && isdefined(
self.maxhealth ) &&
self.damageTaken >
self.maxhealth )
242 lpselfnum = selfEntNum;
246 if(isPlayer(eAttacker))
248 lpattacknum = eAttacker getEntityNumber();
249 lpattackGuid = eAttacker getGuid();
250 lpattackname = eAttacker.name;
251 lpattackerteam = eAttacker.pers[
"team"];
258 lpattackerteam =
"world";
261 /#logPrint(
"VD;" + lpselfnum +
";" + lpselfteam +
";" + lpattackGuid +
";" + lpattacknum +
";" + lpattackerteam +
";" + lpattackname +
";" + weapon.name +
";" + iDamage +
";" + sMeansOfDeath +
";" + sHitLoc +
"\n");#/
266 function Callback_VehicleRadiusDamage( eInflictor, eAttacker, iDamage, fInnerDamage, fOuterDamage, iDFlags, sMeansOfDeath, weapon, vPoint, fRadius, fConeAngleCos, vConeDir, psOffsetTime )
272 self.iDFlags = iDFlags;
273 self.iDFlagsTime = getTime();
275 if ( game[
"state"] ==
"postgame" )
278 if ( isdefined( eAttacker ) && isPlayer( eAttacker ) && isdefined( eAttacker.canDoCombat ) && !eAttacker.canDoCombat )
281 if ( isdefined(
self.killstreakType ) )
283 maxhealth =
VAL(
self.maxhealth,
self.health );
285 iDamage =
self killstreaks::OnDamagePerWeapon(
self.killstreakType, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, maxhealth, undefined, maxhealth * 0.4, undefined, 0, undefined,
true, 1.0 );
291 if (
self IsVehicleImmuneToDamage( iDFlags, sMeansOfDeath, weapon ) )
297 if ( sMeansOfDeath ==
"MOD_PROJECTILE_SPLASH" || sMeansOfDeath ==
"MOD_GRENADE_SPLASH" || sMeansOfDeath ==
"MOD_EXPLOSIVE" )
299 scalar = weapon.vehicleProjectileSplashDamageScalar;
300 iDamage = int(iDamage * scalar);
301 fInnerDamage = (fInnerDamage * scalar);
302 fOuterDamage = (fOuterDamage * scalar);
304 if ( fInnerDamage == 0 )
314 occupant_team =
self vehicle::vehicle_get_occupant_team();
316 if ( level.teamBased && isPlayer( eAttacker ) && (occupant_team == eAttacker.pers[
"team"]) )
323 self.lastDamageWasFromEnemy =
false;
324 self finishVehicleRadiusDamage(eInflictor, eAttacker, iDamage, fInnerDamage, fOuterDamage, iDFlags, sMeansOfDeath, weapon, vPoint, fRadius, fConeAngleCos, vConeDir, psOffsetTime);
326 else if( !level.hardcoreMode && isdefined(
self.owner ) && isdefined( eAttacker.owner ) &&
self.owner == eAttacker.owner )
336 self finishVehicleRadiusDamage(eInflictor, eAttacker, iDamage, fInnerDamage, fOuterDamage, iDFlags, sMeansOfDeath, weapon, vPoint, fRadius, fConeAngleCos, vConeDir, psOffsetTime);
343 if ( game[
"state"] ==
"postgame" && ( !isdefined(
self.selfDestruct ) || !
self.selfDestruct ) )
345 if( isdefined(
self.overrideVehicleDeathPostGame ) )
347 self [[
self.overrideVehicleDeathPostGame]]( eInflictor, eAttacker, iDamage, sMeansOfDeath, weapon, vDir, sHitLoc, psOffsetTime );
354 if ( isdefined(
self.overrideVehicleKilled ) )
356 self [[
self.overrideVehicleKilled]]( eInflictor, eAttacker, iDamage, sMeansOfDeath, weapon, vDir, sHitLoc, psOffsetTime );
359 if( isdefined(
self.overrideVehicleDeath ) )
361 self [[
self.overrideVehicleDeath]]( eInflictor, eAttacker, iDamage, sMeansOfDeath, weapon, vDir, sHitLoc, psOffsetTime );
367 self endon(
"disconnect");
369 if(isdefined( level._effect ) && isdefined( level._effect[
"tanksquish"] ) )
371 PlayFX( level._effect[
"tanksquish"],
self.origin + (0, 0, 30));
374 self playsound(
"chr_crunch" );
381 if ( isdefined(
self ) && isdefined(
self.ignore_vehicle_underneath_splash_scalar ) )
384 if ( weapon.name ==
"satchel_charge" )
402 if (isdefined(
self.allowFriendlyFireDamageOverride ) )
404 return [[
self.allowFriendlyFireDamageOverride]](eInflictor, eAttacker, sMeansOfDeath, weapon );