‪Black Ops 3 Source Code Explorer  0.1
‪An script explorer for Black Ops 3 by ZeRoY
_behavior_tracker.gsc
Go to the documentation of this file.
1 #using scripts\shared\math_shared;
2 
3 #define LEARNING_RATE 0.1
4 #define MIN_TRAIT_VALUE 0.0
5 #define MAX_TRAIT_VALUE 1.0
6 #define DEFAULT_TRAIT_VALUE 0.5
7 
8 #namespace behaviorTracker;
9 
13 function ‪SetupTraits()
14 {
15  if ( isDefined( self.behaviorTracker.traits ) )
16  return;
17 
18  self.behaviorTracker.traits = [];
19  // Define the traits with a default value. This default value will be used if we dont have stats.
20  self.behaviorTracker.traits["effectiveCombat"] = ‪DEFAULT_TRAIT_VALUE;
21  self.behaviorTracker.traits["effectiveWallRunCombat"] = ‪DEFAULT_TRAIT_VALUE;
22  self.behaviorTracker.traits["effectiveDoubleJumpCombat"] = ‪DEFAULT_TRAIT_VALUE;
23  self.behaviorTracker.traits["effectiveSlideCombat"] = ‪DEFAULT_TRAIT_VALUE;
24 
25  if ( self.behaviorTracker.version != 0 )
26  {
27  traits = getArrayKeys( self.behaviorTracker.traits );
28 
29  for ( i = 0; i < traits.size; i++ )
30  {
31  trait = traits[i];
32  self.behaviorTracker.traits[trait] = float( self ‪GetTraitStatValue( trait ) );
33  }
34  }
35 }
36 
37 function ‪Initialize()
38 {
39  if ( isdefined( self.pers["isBot"] ) )
40  return;
41 
42  if ( isDefined( self.behaviorTracker ) )
43  return;
44 
45  if ( isdefined( level.disableBehaviorTracker ) && level.disableBehaviorTracker == true )
46  return;
47 
48  self.behaviorTracker = spawnstruct();
49  self.behaviorTracker.version = int( self ‪GetTraitStatValue( "version" ) );
50  self.behaviorTracker.numRecords = int( self ‪GetTraitStatValue( "numRecords" ) ) + 1;
51  self ‪SetupTraits();
52 
53  self.behaviorTracker.valid = true;
54 }
55 
56 function ‪Finalize()
57 {
58  if ( !( self ‪IsAllowed() ) )
59  return;
60 
61  self ‪SetTraitStats();
62 
64 }
65 
69 function ‪IsAllowed()
70 {
71  if ( !isDefined( self ) )
72  return false;
73 
74  if ( !isDefined( self.behaviorTracker ) )
75  return false;
76 
77  if ( !self.behaviorTracker.valid )
78  return false;
79 
80  if ( isdefined( level.disableBehaviorTracker ) && level.disableBehaviorTracker == true )
81  return false;
82 
83  return true;
84 }
85 
87 {
88 
89 }
90 
94 function ‪GetTraitValue( trait )
95 {
96  return self.behaviorTracker.traits[ trait ];
97 }
98 
99 function ‪SetTraitValue( trait, value )
100 {
101  self.behaviorTracker.traits[trait] = value;
102 }
103 
104 function ‪UpdateTrait( trait, percent )
105 {
106  if ( !( self ‪IsAllowed() ) )
107  return;
108 
109  ‪math::clamp( percent, -1.0, 1.0 );
110 
111  currentValue = self ‪GetTraitValue( trait );
112 
113  if ( percent >= 0 )
114  {
115  delta = ( ‪MAX_TRAIT_VALUE - currentValue ) * percent;
116  }
117  else
118  {
119  delta = ( currentValue - ‪MIN_TRAIT_VALUE ) * percent;
120  }
121 
122  weightedDelta = ‪LEARNING_RATE * delta;
123 
124  newValue = currentvalue + weightedDelta;
125  newValue = ‪math::clamp( newValue, ‪MIN_TRAIT_VALUE, ‪MAX_TRAIT_VALUE );
126  self ‪SetTraitValue( trait, newValue );
127 }
128 
132 function ‪UpdatePlayerDamage( attacker, victim, ‪damage )
133 {
134  if ( isDefined( victim ) && victim ‪IsAllowed() )
135  {
136  damageRatio = float( ‪damage ) / float( victim.maxhealth );
137  ‪math::clamp( damageRatio, 0.0, 1.0 );
138 
139  damageRatio = damageRatio * -1.0; // Negative damage percent since this is the victim
140 
141  victim ‪UpdateTrait( "effectiveCombat", damageRatio );
142 
143  if ( victim IsWallRunning() )
144  {
145  victim ‪UpdateTrait( "effectiveWallRunCombat", damageRatio );
146  }
147 
148  if ( victim IsSliding() )
149  {
150  victim ‪UpdateTrait( "effectiveSlideCombat", damageRatio );
151  }
152 
153  if ( victim IsDoubleJumping() )
154  {
155  victim ‪UpdateTrait( "effectiveDoubleJumpCombat", damageRatio );
156  }
157  }
158 
159  if ( isDefined( attacker ) && ( attacker ‪IsAllowed() ) && attacker != victim )
160  {
161  damageRatio = float( ‪damage ) / float( attacker.maxhealth );
162  ‪math::clamp( damageRatio, 0.0, 1.0 );
163 
164  attacker ‪UpdateTrait( "effectiveCombat", damageRatio );
165 
166  if ( attacker IsWallRunning() )
167  {
168  attacker ‪UpdateTrait( "effectiveWallRunCombat", damageRatio );
169  }
170 
171  if ( attacker IsSliding() )
172  {
173  attacker ‪UpdateTrait( "effectiveSlideCombat", damageRatio );
174  }
175 
176  if ( attacker IsDoubleJumping() )
177  {
178  attacker ‪UpdateTrait( "effectiveDoubleJumpCombat", damageRatio );
179  }
180  }
181 }
182 
183 function ‪UpdatePlayerKilled( attacker, victim )
184 {
185  if ( isDefined( victim ) && victim ‪IsAllowed() )
186  {
187  // Passing -1.0 since to denote negative 100%.
188  victim ‪UpdateTrait( "effectiveCombat", -1.0 );
189 
190  if ( victim IsWallRunning() )
191  {
192  victim ‪UpdateTrait( "effectiveWallRunCombat", -1.0 );
193  }
194 
195  if ( victim IsSliding() )
196  {
197  victim ‪UpdateTrait( "effectiveSlideCombat", -1.0 );
198  }
199 
200  if ( victim IsDoubleJumping() )
201  {
202  victim ‪UpdateTrait( "effectiveDoubleJumpCombat", -1.0 );
203  }
204  }
205 
206  if ( isDefined( attacker ) && ( attacker ‪IsAllowed() ) && attacker != victim )
207  {
208  // Passing 1.0 since to denote positive 100%.
209  attacker ‪UpdateTrait( "effectiveCombat", 1.0 );
210 
211  if ( attacker IsWallRunning() )
212  {
213  attacker ‪UpdateTrait( "effectiveWallRunCombat", 1.0 );
214  }
215 
216  if ( attacker IsSliding() )
217  {
218  attacker ‪UpdateTrait( "effectiveSlideCombat", 1.0 );
219  }
220 
221  if ( attacker IsDoubleJumping() )
222  {
223  attacker ‪UpdateTrait( "effectiveDoubleJumpCombat", 1.0 );
224  }
225  }
226 }
227 
228 
232  function ‪SetTraitStats()
233  {
234  if ( self.behaviorTracker.version == 0 )
235  return;
236 
237  self.behaviorTracker.numRecords = self.behaviorTracker.numRecords + 1;
238  self ‪SetTraitStatValue( "numRecords", self.behaviorTracker.numRecords );
239 
240  traits = getArrayKeys( self.behaviorTracker.traits );
241 
242  for ( i = 0; i < traits.size; i++ )
243  {
244  trait = traits[i];
245  value = self.behaviorTracker.traits[trait];
246 
247  self ‪SetTraitStatValue( trait, value );
248  }
249  }
250 
251 function ‪GetTraitStatValue( trait )
252 {
253  return self getDStat( "behaviorTracker", trait );
254 }
255 
256 function ‪SetTraitStatValue( trait, value )
257 {
258  self setDStat( "behaviorTracker", trait, value );
259 }
‪MIN_TRAIT_VALUE
‪#define MIN_TRAIT_VALUE
Definition: _behavior_tracker.gsc:4
‪DEFAULT_TRAIT_VALUE
‪#define DEFAULT_TRAIT_VALUE
Definition: _behavior_tracker.gsc:6
‪MAX_TRAIT_VALUE
‪#define MAX_TRAIT_VALUE
Definition: _behavior_tracker.gsc:5
‪GetTraitValue
‪function GetTraitValue(trait)
Definition: _behavior_tracker.gsc:94
‪GetTraitStatValue
‪function GetTraitStatValue(trait)
Definition: _behavior_tracker.gsc:251
‪LEARNING_RATE
‪#define LEARNING_RATE
Definition: _behavior_tracker.gsc:3
‪UpdateTrait
‪function UpdateTrait(trait, percent)
Definition: _behavior_tracker.gsc:104
‪damage
‪function damage(trap)
Definition: _zm_trap_electric.gsc:116
‪SetupTraits
‪function SetupTraits()
Definition: _behavior_tracker.gsc:13
‪PrintTrackerToBlackBox
‪function PrintTrackerToBlackBox()
Definition: _behavior_tracker.gsc:86
‪UpdatePlayerKilled
‪function UpdatePlayerKilled(attacker, victim)
Definition: _behavior_tracker.gsc:183
‪IsAllowed
‪function IsAllowed()
Definition: _behavior_tracker.gsc:69
‪Finalize
‪function Finalize()
Definition: _behavior_tracker.gsc:56
‪SetTraitValue
‪function SetTraitValue(trait, value)
Definition: _behavior_tracker.gsc:99
‪SetTraitStats
‪function SetTraitStats()
Definition: _behavior_tracker.gsc:232
‪clamp
‪function clamp(val, val_min, val_max)
Definition: math_shared.csc:16
‪UpdatePlayerDamage
‪function UpdatePlayerDamage(attacker, victim, damage)
Definition: _behavior_tracker.gsc:132
‪Initialize
‪function Initialize()
Definition: _behavior_tracker.gsc:37
‪SetTraitStatValue
‪function SetTraitStatValue(trait, value)
Definition: _behavior_tracker.gsc:256