‪Black Ops 3 Source Code Explorer  0.1
‪An script explorer for Black Ops 3 by ZeRoY
_globallogic_actor.gsc
Go to the documentation of this file.
1 #using scripts\codescripts\struct;
2 
3 #using scripts\shared\challenges_shared;
4 #using scripts\shared\spawner_shared;
5 #using scripts\shared\ai\systems\destructible_character;
6 #using scripts\shared\ai\systems\gib;
7 #using scripts\zm\_bb;
8 #insert scripts\shared\shared.gsh;
9 
10 #using scripts\zm\gametypes\_damagefeedback;
11 #using scripts\zm\gametypes\_globallogic_player;
12 #using scripts\zm\gametypes\_globallogic_utils;
13 #using scripts\zm\gametypes\_weapons;
14 
15 #using scripts\zm\_challenges;
16 
17 #namespace globallogic_actor;
18 
19 function ‪Callback_ActorSpawned( spawner )
20 {
21  self thread ‪spawner::run_spawn_functions();
22 }
23 
24 function ‪Callback_ActorDamage( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, vPoint, vDir, sHitLoc, vDamageOrigin, psOffsetTime, boneIndex, modelIndex, surfaceType, vSurfaceNormal )
25 {
26  if ( game["state"] == "postgame" )
27  return;
28 
29  if ( self.team == "spectator" )
30  return;
31 
32  if ( isdefined( eAttacker ) && isPlayer( eAttacker ) && isdefined( eAttacker.canDoCombat ) && !eAttacker.canDoCombat )
33  return;
34 
35  self.iDFlags = iDFlags;
36  self.iDFlagsTime = getTime();
37 
38  eAttacker = ‪globallogic_player::figureOutAttacker( eAttacker );
39 
40  // Don't do knockback if the damage direction was not specified
41  if( !isdefined( vDir ) )
42  iDFlags |= level.iDFLAGS_NO_KNOCKBACK;
43 
44  friendly = false;
45 
46  if ( ((self.health == self.maxhealth)) || !isdefined( self.attackers ) )
47  {
48  self.attackers = [];
49  self.attackerData = [];
50  self.attackerDamage = [];
51  }
52 
53  if ( ‪globallogic_utils::isHeadShot( weapon, sHitLoc, sMeansOfDeath, eInflictor ) )
54  sMeansOfDeath = "MOD_HEAD_SHOT";
55 
56  if ( level.onlyHeadShots )
57  {
58  if ( sMeansOfDeath == "MOD_PISTOL_BULLET" || sMeansOfDeath == "MOD_RIFLE_BULLET" )
59  return;
60  else if ( sMeansOfDeath == "MOD_HEAD_SHOT" )
61  iDamage = 150;
62  }
63 
64  // This is the AI system's override damage callback, it must come last!
65  if ( IsDefined( self.aiOverrideDamage ) )
66  {
67  for ( index = 0; index < self.aiOverrideDamage.size; index++ )
68  {
69  damageCallback = self.aiOverrideDamage[index];
70  iDamage = self [[damageCallback]]( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, vPoint, vDir, sHitLoc, psOffsetTime, boneIndex, modelIndex );
71  }
72  if ( iDamage < 1 )
73  return;
74 
75  iDamage = int( iDamage + 0.5 );
76  }
77 
78  // explosive barrel/car detection
79  if ( weapon == level.weaponNone && isdefined( eInflictor ) )
80  {
81  if ( isdefined( eInflictor.targetname ) && eInflictor.targetname == "explodable_barrel" )
82  weapon = GetWeapon( "explodable_barrel" );
83  else if ( isdefined( eInflictor.destructible_type ) && isSubStr( eInflictor.destructible_type, "vehicle_" ) )
84  weapon = GetWeapon( "destructible_car" );
85  }
86 
87  // check for completely getting out of the damage
88  if( !(iDFlags & level.iDFLAGS_NO_PROTECTION) )
89  {
90  if ( isPlayer( eAttacker ) )
91  eAttacker.pers["participation"]++;
92 
93  prevHealthRatio = self.health / self.maxhealth;
94 
95  if ( level.teamBased && isPlayer( eAttacker ) && (self != eAttacker) && (self.team == eAttacker.pers["team"]) )
96  {
97  if ( level.friendlyfire == 0 ) // no one takes damage
98  {
99  return;
100  }
101  else if ( level.friendlyfire == 1 ) // the friendly takes damage
102  {
103  // Make sure at least one point of damage is done
104  if ( iDamage < 1 )
105  iDamage = 1;
106 
107  self.lastDamageWasFromEnemy = false;
108 
109  self ‪globallogic_player::giveAttackerAndInflictorOwnerAssist( eAttacker, eInflictor, iDamage, sMeansOfDeath, weapon );
110 
111  self finishActorDamage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, vPoint, vDir, sHitLoc, vDamageOrigin, psOffsetTime, boneIndex, surfaceType, vSurfaceNormal);
112  }
113  else if ( level.friendlyfire == 2 ) // no one takes damage
114  {
115  return;
116  }
117  else if ( level.friendlyfire == 3 ) // both friendly and attacker take damage
118  {
119  iDamage = int(iDamage * .5);
120 
121  // Make sure at least one point of damage is done
122  if ( iDamage < 1 )
123  iDamage = 1;
124 
125  self.lastDamageWasFromEnemy = false;
126 
127  self ‪globallogic_player::giveAttackerAndInflictorOwnerAssist( eAttacker, eInflictor, iDamage, sMeansOfDeath, weapon );
128 
129  self finishActorDamage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, vPoint, vDir, sHitLoc, vDamageOrigin, psOffsetTime, boneIndex, surfaceType, vSurfaceNormal);
130  }
131 
132  friendly = true;
133  }
134  else
135  {
136  // no damage from the dogs owner unless in hardcore
137  if ( isdefined( eAttacker ) && isdefined( self.script_owner ) && eAttacker == self.script_owner && !level.hardcoreMode )
138  {
139  return;
140  }
141 
142  // dogs with the same owner can not damage each other
143  if ( isdefined( eAttacker ) && isdefined( self.script_owner ) && isdefined( eAttacker.script_owner ) && eAttacker.script_owner == self.script_owner )
144  {
145  return;
146  }
147 
148  // Make sure at least one point of damage is done
149  if(iDamage < 1)
150  iDamage = 1;
151 
152  if ( issubstr( sMeansOfDeath, "MOD_GRENADE" ) && isdefined( eInflictor ) && isdefined( eInflictor.isCooked ) )
153  self.wasCooked = getTime();
154  else
155  self.wasCooked = undefined;
156 
157  self.lastDamageWasFromEnemy = (isdefined( eAttacker ) && (eAttacker != self));
158 
159  self ‪globallogic_player::giveAttackerAndInflictorOwnerAssist( eAttacker, eInflictor, iDamage, sMeansOfDeath, weapon );
160 
161  self finishActorDamage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, vPoint, vDir, sHitLoc, vDamageOrigin, psOffsetTime, boneIndex, surfaceType, vSurfaceNormal);
162 
163  }
164 
165  if ( isdefined(eAttacker) && eAttacker != self )
166  {
167  if ( !isdefined( eInflictor ) || !isai( eInflictor ) )
168  {
169  if ( iDamage > 0 && shitloc !== "riotshield" )
170  eAttacker thread ‪damagefeedback::updateDamageFeedback( sMeansOfDeath, eInflictor);
171  }
172  }
173  }
174 
175  if(1) // self.sessionstate != "dead")
176  {
177  lpselfnum = self getEntityNumber();
178  lpselfteam = self.team;
179  lpattackerteam = "";
180 
181  if(isPlayer(eAttacker))
182  {
183  lpattacknum = eAttacker getEntityNumber();
184  lpattackGuid = eAttacker getGuid();
185  lpattackname = eAttacker.name;
186  lpattackerteam = eAttacker.pers["team"];
187  }
188  else
189  {
190  lpattacknum = -1;
191  lpattackGuid = "";
192  lpattackname = "";
193  lpattackerteam = "world";
194  }
195 
196  logPrint("AD;" + lpselfnum + ";" + lpselfteam + ";" + lpattackGuid + ";" + lpattacknum + ";" + lpattackerteam + ";" + lpattackname + ";" + weapon.name + ";" + iDamage + ";" + sMeansOfDeath + ";" + sHitLoc + "\n");
197  }
198 
199 }
200 
201 
202 function ‪Callback_ActorKilled(eInflictor, attacker, iDamage, sMeansOfDeath, weapon, vDir, sHitLoc, psOffsetTime)
203 {
204  if ( game["state"] == "postgame" )
205  return;
206 
207  if( isai(attacker) && isdefined( attacker.script_owner ) )
208  {
209  // if the person who called the dogs in switched teams make sure they don't
210  // get penalized for the kill
211  if ( attacker.script_owner.team != self.team )
212  attacker = attacker.script_owner;
213  }
214 
215  if( attacker.classname == "script_vehicle" && isdefined( attacker.owner ) )
216  attacker = attacker.owner;
217 
218  if ( isdefined( attacker ) && isplayer( attacker ) )
219  {
220  if ( !level.teamBased || (self.team != attacker.pers["team"]) )
221  {
222  level.globalKillstreaksDestroyed++;
223  attacker AddWeaponStat( GetWeapon( "dogs" ), "destroyed", 1 );
224  }
225  }
226 }
227 
228 function ‪Callback_ActorCloned( original )
229 {
231  ‪GibServerUtils::CopyGibState( original, self );
232 }
‪Callback_ActorKilled
‪function Callback_ActorKilled(eInflictor, attacker, iDamage, sMeansOfDeath, weapon, vDir, sHitLoc, psOffsetTime)
Definition: _globallogic_actor.gsc:233
‪run_spawn_functions
‪function run_spawn_functions()
Definition: spawner_shared.gsc:563
‪figureOutAttacker
‪function figureOutAttacker(eAttacker)
Definition: _globallogic_player.gsc:633
‪giveAttackerAndInflictorOwnerAssist
‪function giveAttackerAndInflictorOwnerAssist(eAttacker, eInflictor, iDamage, sMeansOfDeath, weapon)
Definition: _globallogic_player.gsc:4233
‪isHeadShot
‪function isHeadShot(weapon, sHitLoc, sMeansOfDeath, eInflictor)
Definition: _globallogic_utils.gsc:397
‪Callback_ActorSpawned
‪function Callback_ActorSpawned(spawner)
Definition: _globallogic_actor.gsc:30
‪Callback_ActorCloned
‪function Callback_ActorCloned(original)
Definition: _globallogic_actor.gsc:257
‪CopyDestructState
‪function CopyDestructState(originalEntity, newEntity)
Definition: destructible_character.gsc:12
‪CopyGibState
‪function CopyGibState(originalEntity, newEntity)
Definition: gib.gsc:424
‪updateDamageFeedback
‪function updateDamageFeedback(mod, inflictor, perkFeedback)
Definition: _damagefeedback.gsc:56
‪Callback_ActorDamage
‪function Callback_ActorDamage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, vPoint, vDir, sHitLoc, vDamageOrigin, psOffsetTime, boneIndex, modelIndex, surfaceType, vSurfaceNormal)
Definition: _globallogic_actor.gsc:35