‪Black Ops 3 Source Code Explorer  0.1
‪An script explorer for Black Ops 3 by ZeRoY
_zm_score.gsc
Go to the documentation of this file.
1 #using scripts\codescripts\struct;
2 
3 #using scripts\shared\callbacks_shared;
4 #using scripts\shared\clientfield_shared;
5 #using scripts\shared\flagsys_shared;
6 #using scripts\shared\scoreevents_shared;
7 #using scripts\shared\system_shared;
8 #using scripts\shared\util_shared;
9 
10 #insert scripts\shared\shared.gsh;
11 #insert scripts\shared\version.gsh;
12 #insert scripts\zm\_zm_utility.gsh;
13 
14 #using scripts\zm\_zm_bgb;
15 #using scripts\zm\_zm_bgb_token;
16 #using scripts\zm\_zm_pers_upgrades_functions;
17 #using scripts\zm\_zm_stats;
18 #using scripts\zm\_zm_utility;
19 
20 #insert scripts\zm\_zm_bgb.gsh;
21 
22 #namespace zm_score;
23 
24 ‪REGISTER_SYSTEM( "zm_score", &‪__init__, undefined )
25 
26 function ‪__init__()
27 {
29  ‪score_cf_register_info( "death_normal", ‪VERSION_SHIP, 3 );
30  ‪score_cf_register_info( "death_torso", ‪VERSION_SHIP, 3 );
31  ‪score_cf_register_info( "death_neck", ‪VERSION_SHIP, 3 );
32  ‪score_cf_register_info( "death_head", ‪VERSION_SHIP, 3 );
33  ‪score_cf_register_info( "death_melee", ‪VERSION_SHIP, 3 );
34 
35  // clientuimodels are registered client-side in raw/ui/uieditor/clientfieldmodels.lua
36  ‪clientfield::register( "clientuimodel", "hudItems.doublePointsActive", ‪VERSION_SHIP, 1, "int" );
37  ‪clientfield::register( "clientuimodel", "hudItems.showDpadUp", ‪VERSION_SHIP, 1, "int" );
38  ‪clientfield::register( "clientuimodel", "hudItems.showDpadDown", ‪VERSION_SHIP, 1, "int" );
39  ‪clientfield::register( "clientuimodel", "hudItems.showDpadLeft", ‪VERSION_SHIP, 1, "int" );
40  ‪clientfield::register( "clientuimodel", "hudItems.showDpadRight", ‪VERSION_SHIP, 1, "int" );
41 
43 
44  level.score_total = 0; // holds the sum of all score received by any player during the session
45  level.a_func_score_events = []; // use this to customize score events for new ai types
46 }
47 
48 
49 // Registers a function for score event processing
50 function ‪register_score_event( str_event, func_callback )
51 {
52  level.a_func_score_events[ str_event ] = func_callback;
53 }
54 
55 
57 {
58  self notify( "reset_doublexp_timer" );
59  self thread ‪doublexp_timer();
60 }
61 
63 {
64  self notify( "doublexp_timer" );
65  self endon( "doublexp_timer" );
66  self endon( "reset_doublexp_timer" );
67  self endon( "end_game" );
68 
69  level ‪flagsys::wait_till( "start_zombie_round_logic" );
70 
71  if( !level.onlineGame )
72  {
73  return;
74  }
75 
76  wait 60;
77  if( level.onlineGame )
78  {
79  if( !IsDefined( self ) )
80  {
81  return;
82  }
83  self DoubleXPTimerFired();
84  }
85 
86  self thread ‪reset_doublexp_timer();
87 }
88 
90 {
91  ‪util::wait_network_frame(); // Hotjoin fix: Wait one network frame to make sure the clientfields have completed registration.
92 
93  self thread ‪doublexp_timer();
94 
95  if ( IsDefined(self) )
96  {
97  self.ready_for_score_events = true;
98  }
99 }
100 
101 function ‪score_cf_register_info( ‪name, version, max_count )
102 {
103  // clientuimodels are registered client-side in raw/ui/uieditor/clientfieldmodels.lua
104  for ( i = 0; i < ‪MAX_CLIENTS_ZM; i++ )
105  {
106  ‪clientfield::register( "clientuimodel", "PlayerList.client" + i + ".score_cf_" + ‪name, version, GetMinBitCountForNum( max_count ), "counter" );
107  }
108 }
109 
110 
112 {
113  foreach ( player in level.players )
114  {
115  thread ‪wait_score_cf_increment_info( player, "PlayerList.client" + self.entity_num + ".score_cf_" + ‪name );
116  }
117 }
118 
119 function ‪wait_score_cf_increment_info( player, cf )
120 {
121  if ( IsDefined(player) && ‪IS_TRUE(player.ready_for_score_events) )
122  {
124  }
125 }
126 
127 
128 //chris_p - added dogs to the scoring
129 function ‪player_add_points( event, mod, hit_location ,is_dog, zombie_team, damage_weapon )
130 {
131  if( level.intermission )
132  {
133  return;
134  }
135 
136  if( !‪zm_utility::is_player_valid( self ) )
137  {
138  return;
139  }
140 
141  player_points = 0;
142  team_points = 0;
143  multiplier = ‪get_points_multiplier(self);
144 
145  if ( isdefined( level.a_func_score_events[ event ] ) )
146  {
147  player_points = [[ level.a_func_score_events[ event ] ]]( event, mod, hit_location, zombie_team, damage_weapon );
148  }
149  else
150  {
151  switch( event )
152  {
153  //TODO Add support for registering level-specific score events
154  //TEMP adding wasp and raps points for playtest
155  case "death_wasp":
156  case "death_raps":
157  player_points = mod;
158  ‪scoreevents::processScoreEvent( "kill", self, undefined, damage_weapon );
159  break;
160 
161  case "death_spider":
162  //TODO damage location bonus stuff is currently not supported on spiders, so bonus points don't apply yet, and can't currently reuse "death" case below.
163  //scoring is otherwise similar to zombies/dogs "death" case
164  player_points = ‪get_zombie_death_player_points();
165  team_points = ‪get_zombie_death_team_points();
166  ‪scoreevents::processScoreEvent( "kill_spider", self, undefined, damage_weapon );
167  break;
168 
169  case "death_thrasher":
170  //mostly same as regular zombie death event below, except player gets twice as many points for thrashers
171  player_points = ‪get_zombie_death_player_points();
172  team_points = ‪get_zombie_death_team_points();
173  points = self ‪player_add_points_kill_bonus( mod, hit_location, damage_weapon );
174  if( level.zombie_vars[self.team]["zombie_powerup_insta_kill_on"] == 1 && mod == "MOD_UNKNOWN" )
175  {
176  points = points * 2;
177  }
178 
179  // Give bonus points
180  player_points = player_points + points;
181  player_points = player_points * 2; //even more for thrasher
182 
183  // Don't give points if there's no team points involved.
184  if ( team_points > 0 )
185  {
186  team_points = team_points + points;
187  }
188 
189  if (mod == "MOD_GRENADE" || mod == "MOD_GRENADE_SPLASH" )
190  {
191  self ‪zm_stats::increment_client_stat( "grenade_kills" );
192  self ‪zm_stats::increment_player_stat( "grenade_kills" );
193  }
194  ‪scoreevents::processScoreEvent( "kill_thrasher", self, undefined, damage_weapon );
195 
196  break;
197 
198  case "death":
199  player_points = ‪get_zombie_death_player_points();
200  team_points = ‪get_zombie_death_team_points();
201  points = self ‪player_add_points_kill_bonus( mod, hit_location, damage_weapon, player_points );
202  if( level.zombie_vars[self.team]["zombie_powerup_insta_kill_on"] == 1 && mod == "MOD_UNKNOWN" )
203  {
204  points = points * 2;
205  }
206 
207  // Give bonus points
208  player_points = player_points + points;
209  // Don't give points if there's no team points involved.
210  if ( team_points > 0 )
211  {
212  team_points = team_points + points;
213  }
214 
215  if (mod == "MOD_GRENADE" || mod == "MOD_GRENADE_SPLASH" )
216  {
217  self ‪zm_stats::increment_client_stat( "grenade_kills" );
218  self ‪zm_stats::increment_player_stat( "grenade_kills" );
219  }
220 
221  break;
222 
223  case "death_mechz":
224  player_points = mod;
225  ‪scoreevents::processScoreEvent( "kill_mechz", self, undefined, damage_weapon );
226  break;
227 
228  case "ballistic_knife_death":
229  player_points = ‪get_zombie_death_player_points() + level.zombie_vars["zombie_score_bonus_melee"];
230  self ‪score_cf_increment_info( "death_melee" );
231  break;
232 
233  case "damage_light":
234  player_points = level.zombie_vars["zombie_score_damage_light"];
235  self ‪score_cf_increment_info( "damage" );
236  break;
237 
238  case "damage":
239  player_points = level.zombie_vars["zombie_score_damage_normal"];
240  self ‪score_cf_increment_info( "damage" );
241  break;
242 
243  case "damage_ads":
244  player_points = Int( level.zombie_vars["zombie_score_damage_normal"] * 1.25 );
245  self ‪score_cf_increment_info( "damage" );
246  break;
247 
248  case "rebuild_board":
249  case "carpenter_powerup":
250  player_points = mod;
251  break;
252 
253  case "bonus_points_powerup":
254  player_points = mod;
255  break;
256 
257  case "nuke_powerup":
258  player_points = mod;
259  team_points = mod;
260  break;
261 
262  case "jetgun_fling":
263  case "thundergun_fling":
264  case "riotshield_fling":
265  player_points = mod;
266  ‪scoreevents::processScoreEvent( "kill", self, undefined, damage_weapon );
267  break;
268 
269  case "hacker_transfer":
270  player_points = mod;
271  break;
272 
273  case "reviver":
274  player_points = mod;
275  break;
276 
277  case "vulture":
278  player_points = mod;
279  break;
280 
281  case "build_wallbuy":
282  player_points = mod;
283  break;
284 
285  case "ww_webbed":
286  player_points = mod;
287  break;
288 
289 
290  default:
291  assert( 0, "Unknown point event" );
292  break;
293  }
294  }
295 
296  // level specific death points overrides
297  if( isdefined( level.player_score_override ) )
298  {
299  player_points = self [[level.player_score_override]]( damage_weapon, player_points );
300  }
301 
302  if( isdefined( level.team_score_override ) )
303  {
304  team_points = self [[level.team_score_override]]( damage_weapon, team_points );
305  }
306 
307  player_points = multiplier * ‪zm_utility::round_up_score( player_points, 10 );
308  team_points = multiplier * ‪zm_utility::round_up_score( team_points, 10 );
309 
310  if ( isdefined( self.point_split_receiver ) && (event == "death" || event == "ballistic_knife_death") )
311  {
312  split_player_points = player_points - ‪zm_utility::round_up_score( (player_points * self.point_split_keep_percent), 10 );
313  self.point_split_receiver ‪add_to_player_score( split_player_points );
314  player_points = player_points - split_player_points;
315  }
316 
317  // Is the player persistent ability "pistol_points" active?
318  if( ‪IS_TRUE(level.pers_upgrade_pistol_points) )
319  {
320  player_points = self ‪zm_pers_upgrades_functions::pers_upgrade_pistol_points_set_score( player_points, event, mod, damage_weapon );
321  }
322 
323  // Add the points
324  self ‪add_to_player_score( player_points, true, event );
325 
326  //stat tracking
327  self.pers["score"] = self.score;
328 
329  //check for game module point functions ( for greifing, etc )
330  if(isdefined(level._game_module_point_adjustment))
331  {
332  level [[level._game_module_point_adjustment]](self,zombie_team,player_points);
333  }
334 
335 
336 // self thread play_killstreak_vo();
337 }
338 
339 function ‪get_points_multiplier(player)
340 {
341  multiplier = level.zombie_vars[player.team]["zombie_point_scalar"];
342 
343  if(isdefined(level.current_game_module) && level.current_game_module == 2 ) //race
344  {
345 
346  if(isdefined(level._race_team_double_points) && level._race_team_double_points == player._race_team)
347  {
348  return multiplier;
349  }
350  else //non teammates only get normal score
351  {
352  return 1;
353  }
354  }
355 
356 
357  return multiplier;
358 }
359 
360 // Adjust points based on number of players (MikeA)
362 {
363  players = GetPlayers();
364  if( players.size == 1 )
365  {
366  points = level.zombie_vars["zombie_score_kill_1player"];
367  }
368  else if( players.size == 2 )
369  {
370  points = level.zombie_vars["zombie_score_kill_2player"];
371  }
372  else if( players.size == 3 )
373  {
374  points = level.zombie_vars["zombie_score_kill_3player"];
375  }
376  else
377  {
378  points = level.zombie_vars["zombie_score_kill_4player"];
379  }
380  return( points );
381 }
382 
383 
384 // Adjust team points based on number of players (MikeA)
386 {
387  return( 0 );
388 }
389 
390 
391 function ‪player_add_points_kill_bonus( mod, hit_location, weapon, player_points = undefined )
392 {
393  if( mod != "MOD_MELEE" )
394  {
395  if ( "head" == hit_location || "helmet" == hit_location )
396  {
397  ‪scoreevents::processScoreEvent( "headshot", self, undefined, weapon );
398  }
399  else
400  {
401  ‪scoreevents::processScoreEvent( "kill", self, undefined, weapon );
402  }
403  }
404 
405  // level specific death points overrides
406  if( isdefined( level.player_score_override ) )
407  {
408  new_points = self [[level.player_score_override]]( weapon, player_points );
409  if( new_points > 0 && new_points != player_points )
410  {
411  return 0;
412  }
413  }
414 
415  if( mod == "MOD_MELEE" )
416  {
417  self ‪score_cf_increment_info( "death_melee" );
418  ‪scoreevents::processScoreEvent( "melee_kill", self, undefined, weapon );
419  return level.zombie_vars["zombie_score_bonus_melee"];
420  }
421 
422  if( mod == "MOD_BURNED" )
423  {
424  self ‪score_cf_increment_info( "death_torso" );
425  return level.zombie_vars["zombie_score_bonus_burn"];
426  }
427 
428  score = 0;
429 
430  if ( isdefined( hit_location ) )
431  {
432  switch ( hit_location )
433  {
434  case "head":
435  case "helmet":
436  self ‪score_cf_increment_info( "death_head" );
437  score = level.zombie_vars["zombie_score_bonus_head"];
438  break;
439 
440  case "neck":
441  self ‪score_cf_increment_info( "death_neck" );
442  score = level.zombie_vars["zombie_score_bonus_neck"];
443  break;
444 
445  case "torso_upper":
446  case "torso_lower":
447  self ‪score_cf_increment_info( "death_torso" );
448  score = level.zombie_vars["zombie_score_bonus_torso"];
449  break;
450 
451  default:
452  self ‪score_cf_increment_info( "death_normal" );
453  break;
454  }
455  }
456 
457  return score;
458 }
459 
460 function ‪player_reduce_points( event, n_amount )
461 {
462  if( level.intermission )
463  {
464  return;
465  }
466 
467  points = 0;
468 
469  switch( event )
470  {
471  case "take_all":
472  points = self.score;
473  break;
474 
475  case "take_half":
476  points = int( self.score / 2 );
477  break;
478 
479  case "take_specified":
480  points = n_amount;
481  break;
482 
483  case "no_revive_penalty":
484  percent = level.zombie_vars["penalty_no_revive"];
485  points = self.score * percent;
486  break;
487 
488  case "died":
489  percent = level.zombie_vars["penalty_died"];
490  points = self.score * percent;
491  break;
492 
493  case "downed":
494  percent = level.zombie_vars["penalty_downed"];;
495  self notify("I_am_down");
496  points = self.score * percent;
497 
498  self.score_lost_when_downed = ‪zm_utility::round_up_to_ten( int( points ) );
499  break;
500 
501  default:
502  assert( 0, "Unknown point event" );
503  break;
504  }
505 
506  points = self.score - ‪zm_utility::round_up_to_ten( int( points ) );
507 
508  if( points < 0 )
509  {
510  points = 0;
511  }
512 
513  self.score = points;
514 }
515 
516 
517 //
518 // Add points to the player's score
519 // self is a player
520 //
521 function ‪add_to_player_score( points, b_add_to_total = true, str_awarded_by = "" )
522 {
523  if( !isdefined( points ) || level.intermission )
524  {
525  return;
526  }
527 
528  points = ‪zm_utility::round_up_score( points, 10 );
529 
530  // bgb can intercept the points; all the points will be added to score_total regardless
531  n_points_to_add_to_currency = ‪bgb::add_to_player_score_override( points, str_awarded_by );
532 
533  self.score += n_points_to_add_to_currency;
534  self.pers["score"] = self.score;
535  self IncrementPlayerStat("scoreEarned", n_points_to_add_to_currency);
536  level notify( "earned_points", self, points );
537 
538  if( b_add_to_total )
539  {
540  self.score_total += points;
541  level.score_total += points; // also add to all players' running total score
542  }
543 
544 }
545 
546 
547 //
548 // Subtract points from the player's score
549 // self is a player
550 //
551 function ‪minus_to_player_score( points )
552 {
553  if( !isdefined( points ) || level.intermission )
554  {
555  return;
556  }
557 
558  if( self ‪bgb::is_enabled( "zm_bgb_shopping_free" ) )//No charge when this is active
559  {
561  self playsoundtoplayer( "zmb_bgb_shoppingfree_coinreturn", self );
562  return;
563  }
564 
565  self.score -= points;
566  self.pers["score"] = self.score;
567  self IncrementPlayerStat("scoreSpent", points);
568  level notify( "spent_points", self, points );
569 }
570 
571 
572 //
573 // Add points to the team pool
574 // self is a player. We need to derive the team from the player
575 //
576 function ‪add_to_team_score( points )
577 {
578  //MM (3/10/10) Disable team points
579 
580 // if( !isdefined( points ) || points == 0 || level.intermission )
581 // {
582 // return;
583 // }
584 //
585 // // Find out which team pool to adjust
586 // team_pool = level.team_pool[ 0 ];
587 // if ( isdefined( self.team_num ) && self.team_num != 0 )
588 // {
589 // team_pool = level.team_pool[ self.team_num ];
590 // }
591 //
592 // team_pool.score += points;
593 // team_pool.score_total += points;
594 //
595 // // also set the score onscreen
596 // team_pool set_team_score_hud();
597 }
598 
599 
600 //
601 // Subtract points from the team pool
602 // self is a player. We need to derive the team from the player
603 //
604 function ‪minus_to_team_score( points )
605 {
606 /*
607  if( !isdefined( points ) || level.intermission )
608  {
609  return;
610  }
611 
612  team_pool = level.team_pool[ 0 ];
613  if ( isdefined( self.team_num ) && self.team_num != 0 )
614  {
615  team_pool = level.team_pool[ self.team_num ];
616  }
617 
618  team_pool.score -= points;
619 
620  // also set the score onscreen
621  team_pool set_team_score_hud();
622 */
623 }
624 
625 
626 //
627 //
628 //
630 {
631  // Penalize all of the other players
632  players = GetPlayers( self.team );
633  for( i = 0; i < players.size; i++ )
634  {
635  if( players[i] != self && !players[i].‪is_zombie )
636  {
637  players[i] ‪player_reduce_points( "no_revive_penalty" );
638  }
639  }
640 }
641 
642 
643 //
644 //
645 //
647 {
648 /# println( "ZM >> LAST STAND - player_downed_penalty "); #/
649  self ‪player_reduce_points( "downed" );
650 
651 
652 }
653 
654 //check to see if player has enough points to purchase
655 function ‪can_player_purchase( n_cost )//self = player
656 {
657  if( self.score >= n_cost )
658  {
659  return true;
660  }
661 
662  if( self ‪bgb::is_enabled( "zm_bgb_shopping_free" ) )
663  {
664  return true;
665  }
666 
667  return false;
668 }
‪do_one_shot_use
‪function do_one_shot_use(skip_demo_bookmark=false)
Definition: _zm_bgb.gsc:15
‪is_zombie
‪function is_zombie()
Definition: zombie_utility.gsc:1320
‪processScoreEvent
‪function processScoreEvent(event, player, victim, weapon)
Definition: scoreevents_shared.gsc:19
‪pers_upgrade_pistol_points_set_score
‪function pers_upgrade_pistol_points_set_score(score, event, mod, damage_weapon)
Definition: _zm_pers_upgrades_functions.gsc:17
‪increment_client_stat
‪function increment_client_stat(stat_name, include_gametype)
Definition: _zm_stats.gsc:389
‪round_up_to_ten
‪function round_up_to_ten(score)
Definition: _zm_utility.csc:48
‪player_add_points_kill_bonus
‪function player_add_points_kill_bonus(mod, hit_location, weapon, player_points=undefined)
Definition: _zm_score.gsc:391
‪increment_player_stat
‪function increment_player_stat(stat_name)
Definition: _zm_stats.gsc:369
‪player_add_points
‪function player_add_points(event, mod, hit_location, is_dog, zombie_team, damage_weapon)
Definition: _zm_score.gsc:129
‪get_zombie_death_player_points
‪function get_zombie_death_player_points()
Definition: _zm_score.gsc:361
‪score_cf_register_info
‪function score_cf_register_info(name, version, max_count)
Definition: _zm_score.gsc:101
‪player_downed_penalty
‪function player_downed_penalty()
Definition: _zm_score.gsc:646
‪add_to_player_score
‪function add_to_player_score(points, b_add_to_total=true, str_awarded_by="")
Definition: _zm_score.gsc:521
‪VERSION_SHIP
‪#define VERSION_SHIP
Definition: version.gsh:36
‪doublexp_timer
‪function doublexp_timer()
Definition: _zm_score.gsc:62
‪player_on_spawned
‪function player_on_spawned()
Definition: _zm_score.gsc:89
‪IS_TRUE
‪#define IS_TRUE(__a)
Definition: shared.gsh:251
‪player_died_penalty
‪function player_died_penalty()
Definition: _zm_score.gsc:629
‪get_points_multiplier
‪function get_points_multiplier(player)
Definition: _zm_score.gsc:339
‪is_player_valid
‪function is_player_valid(player, checkIgnoreMeFlag, ignore_laststand_players)
Definition: skeleton.gsc:256
‪on_spawned
‪function on_spawned(func, obj)
Definition: callbacks_shared.csc:245
‪add_to_player_score_override
‪function add_to_player_score_override(n_points, str_awarded_by)
Definition: _zm_bgb.gsc:14
‪register_score_event
‪function register_score_event(str_event, func_callback)
Definition: _zm_score.gsc:50
‪minus_to_player_score
‪function minus_to_player_score(points)
Definition: _zm_score.gsc:551
‪can_player_purchase
‪function can_player_purchase(n_cost)
Definition: _zm_score.gsc:655
‪wait_network_frame
‪function wait_network_frame(n_count=1)
Definition: util_shared.gsc:64
‪get_zombie_death_team_points
‪function get_zombie_death_team_points()
Definition: _zm_score.gsc:385
‪round_up_score
‪function round_up_score(score, value)
Definition: _zm_utility.csc:58
‪is_enabled
‪function is_enabled(name)
Definition: _zm_bgb.gsc:4
‪player_reduce_points
‪function player_reduce_points(event, n_amount)
Definition: _zm_score.gsc:460
‪wait_till
‪function wait_till(str_flag)
Definition: flag_shared.csc:189
‪REGISTER_SYSTEM
‪#define REGISTER_SYSTEM(__sys, __func_init_preload, __reqs)
Definition: shared.gsh:204
‪increment_uimodel
‪function increment_uimodel(str_field_name, n_increment_count=1)
Definition: clientfield_shared.gsc:136
‪minus_to_team_score
‪function minus_to_team_score(points)
Definition: _zm_score.gsc:604
‪MAX_CLIENTS_ZM
‪#define MAX_CLIENTS_ZM
Definition: _zm_utility.gsh:18
‪wait_score_cf_increment_info
‪function wait_score_cf_increment_info(player, cf)
Definition: _zm_score.gsc:119
‪score_cf_increment_info
‪function score_cf_increment_info(name)
Definition: _zm_score.gsc:111
‪register
‪function register()
Definition: _ai_tank.gsc:126
‪reset_doublexp_timer
‪function reset_doublexp_timer()
Definition: _zm_score.gsc:56
‪__init__
‪function __init__()
Definition: _zm_score.gsc:26
‪add_to_team_score
‪function add_to_team_score(points)
Definition: _zm_score.gsc:576
‪name
‪class GroundFx name