‪Black Ops 3 Source Code Explorer  0.1
‪An script explorer for Black Ops 3 by ZeRoY
_zm_powerup_carpenter.gsc
Go to the documentation of this file.
1 #using scripts\codescripts\struct;
2 
3 #using scripts\shared\clientfield_shared;
4 #using scripts\shared\system_shared;
5 #using scripts\shared\util_shared;
6 
7 #insert scripts\shared\shared.gsh;
8 #insert scripts\shared\version.gsh;
9 
10 #using scripts\shared\ai\zombie_death;
11 
12 #using scripts\zm\_zm_blockers;
13 #using scripts\zm\_zm_pers_upgrades;
14 #using scripts\zm\_zm_pers_upgrades_functions;
15 #using scripts\zm\_zm_powerups;
16 #using scripts\zm\_zm_score;
17 #using scripts\zm\_zm_spawner;
18 #using scripts\zm\_zm_utility;
19 
20 #insert scripts\zm\_zm_powerups.gsh;
21 #insert scripts\zm\_zm_utility.gsh;
22 
23 #define BOARD_REPAIR_DISTANCE_SQUARED 750 * 750
24 
25 #precache( "string", "ZOMBIE_POWERUP_MAX_AMMO" );
26 
27 #namespace zm_powerup_carpenter;
28 
29 ‪REGISTER_SYSTEM( "zm_powerup_carpenter", &‪__init__, undefined )
30 
31 //-----------------------------------------------------------------------------------
32 // setup
33 //-----------------------------------------------------------------------------------
34 function ‪__init__()
35 {
37  if( ToLower( GetDvarString( "g_gametype" ) ) != "zcleansed" )
38  {
40  }
41 
42  level.use_new_carpenter_func = &‪start_carpenter_new;
43 }
44 
45 function ‪grab_carpenter( player )
46 {
47  // Check for the carpenter persistent upgrade
49  {
51  }
52  if( isDefined(level.use_new_carpenter_func) )
53  {
54  level thread [[level.use_new_carpenter_func]](self.origin);
55  }
56  else
57  {
58  level thread ‪start_carpenter( self.origin );
59  }
60  player thread ‪zm_powerups::powerup_vo( "carpenter" );
61 }
62 
63 function ‪start_carpenter( origin )
64 {
65  window_boards = ‪struct::get_array( "exterior_goal", "targetname" );
66  total = level.exterior_goals.size;
67 
68  //COLLIN
69  carp_ent = ‪spawn("script_origin", (0,0,0));
70  carp_ent playloopsound( "evt_carpenter" );
71 
72  while(true)
73  {
74  windows = ‪get_closest_window_repair(window_boards, origin);
75  if( !IsDefined( windows ) )
76  {
77  carp_ent stoploopsound( 1 );
78  carp_ent PlaySoundWithNotify( "evt_carpenter_end", "sound_done" );
79  carp_ent waittill( "sound_done" );
80  break;
81  }
82  else
83  {
84  ArrayRemoveValue(window_boards, windows);
85  }
86 
87 
88  while( 1 )
89  {
90  if( ‪zm_utility::all_chunks_intact( windows, windows.barrier_chunks ) )
91  {
92  break;
93  }
94 
95  chunk = ‪zm_utility::get_random_destroyed_chunk( windows, windows.barrier_chunks );
96 
97  if( !IsDefined( chunk ) )
98  {
99  break;
100  }
101 
102  windows thread ‪zm_blockers::replace_chunk( windows, chunk, undefined, ‪zm_powerups::is_carpenter_boards_upgraded(), true );
103 
104  if(isdefined(windows.clip))
105  {
106  windows.clip TriggerEnable( true );
107  windows.clip DisconnectPaths();
108  }
109  else
110  {
111  ‪zm_blockers::blocker_disconnect_paths(windows.neg_start, windows.neg_end);
112  }
115  }
116 
118  }
119 
120  players = GetPlayers();
121  for(i = 0; i < players.size; i++)
122  {
123  players[i] ‪zm_score::player_add_points( "carpenter_powerup", 200 );
124  }
125 
126  carp_ent delete();
127 }
128 
129 function ‪get_closest_window_repair( windows, origin )
130 {
131  current_window = undefined;
132  shortest_distance = undefined;
133  for( i = 0; i < windows.size; i++ )
134  {
135  if( ‪zm_utility::all_chunks_intact(windows, windows[i].barrier_chunks ) )
136  {
137  continue;
138  }
139 
140  if( !IsDefined( current_window ) )
141  {
142  current_window = windows[i];
143  shortest_distance = DistanceSquared( current_window.origin, origin );
144  }
145  else
146  {
147  if( DistanceSquared(windows[i].origin, origin) < shortest_distance )
148  {
149 
150  current_window = windows[i];
151  shortest_distance = DistanceSquared( windows[i].origin, origin );
152  }
153  }
154  }
155 
156  return current_window;
157 }
158 
159 function ‪start_carpenter_new( origin )
160 {
161  level.carpenter_powerup_active = true;
162 
163  window_boards = ‪struct::get_array( "exterior_goal", "targetname" );
164 
165  if(isdefined(level._additional_carpenter_nodes))
166  {
167  window_boards = ArrayCombine(window_boards, level._additional_carpenter_nodes, false, false);
168  }
169 
170  //COLLIN
171  carp_ent = ‪spawn("script_origin", (0,0,0));
172  carp_ent playloopsound( "evt_carpenter" );
173 
174  boards_near_players = ‪get_near_boards(window_boards);
175  boards_far_from_players = ‪get_far_boards(window_boards);
176 
177  //instantly repair all 'far' boards
178  level ‪repair_far_boards( boards_far_from_players, ‪zm_powerups::is_carpenter_boards_upgraded() );
179 
180  for(i=0;i<boards_near_players.size;i++)
181  {
182  window = boards_near_players[i];
183 
184  num_chunks_checked = 0;
185 
186  last_repaired_chunk = undefined;
187 
188  while( 1 )
189  {
190  if( ‪zm_utility::all_chunks_intact( window, window.barrier_chunks ) )
191  {
192  break;
193  }
194 
195  chunk = ‪zm_utility::get_random_destroyed_chunk( window, window.barrier_chunks );
196 
197  if( !IsDefined( chunk ) )
198  break;
199 
200  window thread ‪zm_blockers::replace_chunk( window, chunk, undefined, ‪zm_powerups::is_carpenter_boards_upgraded(), true );
201 
202  last_repaired_chunk = chunk;
203 
204  if(IsDefined(window.clip))
205  {
206  window.clip TriggerEnable( true );
207  window.clip DisconnectPaths();
208  }
209  else
210  {
211  ‪zm_blockers::blocker_disconnect_paths(window.neg_start, window.neg_end);
212  }
213 
215 
216  num_chunks_checked++;
217 
218  if(num_chunks_checked >= 20)
219  {
220  break; // Avoid staying in this while loop forever....
221  }
222  }
223 
224  //wait for the last window board to be repaired
225 
226  if(isdefined(window.zbarrier))
227  {
228  if(isdefined(last_repaired_chunk))
229  {
230  while(window.zbarrier GetZBarrierPieceState(last_repaired_chunk) == "closing")
231  {
233  }
234 
235  if(isdefined(window._post_carpenter_callback))
236  {
237  window [[window._post_carpenter_callback]]();
238  }
239  }
240  }
241  else
242  {
243  while((IsDefined(last_repaired_chunk)) && (last_repaired_chunk.state == "mid_repair"))
244  {
245  wait(.05);
246  }
247  }
248  }
249 
250  carp_ent stoploopsound( 1 );
251  carp_ent PlaySoundWithNotify( "evt_carpenter_end", "sound_done" );
252  carp_ent waittill( "sound_done" );
253 
254  players = GetPlayers();
255  for(i = 0; i < players.size; i++)
256  {
257  players[i] ‪zm_score::player_add_points( "carpenter_powerup", 200 );
258  }
259 
260  carp_ent delete();
261 
262  level notify( "carpenter_finished" );
263  level.carpenter_powerup_active = undefined;
264 }
265 
266 function ‪get_near_boards(windows)
267 {
268  // get all boards that are farther than 500 units away from any player and put them into a list
269  players = GetPlayers();
270  boards_near_players = [];
271 
272  for(j =0;j<windows.size;j++)
273  {
274  ‪close = false;
275  for(i=0;i<players.size;i++)
276  {
277  origin = undefined;
278 
279  if(isdefined(windows[j].zbarrier))
280  {
281  origin = windows[j].zbarrier.origin;
282  }
283  else
284  {
285  origin = windows[j].origin;
286  }
287 
288  if( distancesquared(players[i].origin, origin) <= ‪BOARD_REPAIR_DISTANCE_SQUARED )
289  {
290  ‪close = true;
291  break;
292  }
293  }
294  if(‪close)
295  {
296  boards_near_players[boards_near_players.size] = windows[j];
297  }
298  }
299  return boards_near_players;
300 }
301 
302 function ‪get_far_boards(windows)
303 {
304  // get all boards that are farther than 500 units away from any player and put them into a list
305  players = GetPlayers();
306  boards_far_from_players = [];
307 
308  for(j =0;j<windows.size;j++)
309  {
310  ‪close = false;
311  for(i=0;i<players.size;i++)
312  {
313 
314  origin = undefined;
315 
316  if(isdefined(windows[j].zbarrier))
317  {
318  origin = windows[j].zbarrier.origin;
319  }
320  else
321  {
322  origin = windows[j].origin;
323  }
324 
325  if( distancesquared(players[i].origin, origin) >= ‪BOARD_REPAIR_DISTANCE_SQUARED )
326  {
327  ‪close = true;
328  break;
329  }
330  }
331 
332  if(‪close)
333  {
334  boards_far_from_players[boards_far_from_players.size] = windows[j];
335  }
336  }
337  return boards_far_from_players;
338 }
339 
340 function ‪repair_far_boards( barriers, upgrade )
341 {
342  for(i=0;i<barriers.size;i++)
343  {
344  barrier = barriers[i];
345  if( ‪zm_utility::all_chunks_intact( barrier, barrier.barrier_chunks ) )
346  {
347  continue;
348  }
349 
350  if(isdefined(barrier.zbarrier))
351  {
352  a_pieces = barrier.zbarrier GetZBarrierPieceIndicesInState( "open" );
353  if( IsDefined(a_pieces) )
354  {
355  for( xx=0; xx<a_pieces.size; xx++ )
356  {
357  chunk = a_pieces[ xx ];
358 
359  if(upgrade)
360  {
361  barrier.zbarrier ZBarrierPieceUseUpgradedModel(chunk);
362  barrier.zbarrier.chunk_health[chunk] = barrier.zbarrier GetUpgradedPieceNumLives(chunk);
363  }
364  else
365  {
366  barrier.zbarrier ZBarrierPieceUseDefaultModel(chunk);
367  barrier.zbarrier.chunk_health[chunk] = 0;
368  }
369  }
370  }
371 
372  for(x = 0; x < barrier.zbarrier GetNumZBarrierPieces(); x ++)
373  {
374  barrier.zbarrier SetZBarrierPieceState(x, "closed");
375  barrier.zbarrier ShowZBarrierPiece(x);
376  }
377  }
378 
379  if(IsDefined(barrier.clip))
380  {
381  barrier.clip TriggerEnable( true );
382  barrier.clip DisconnectPaths();
383  }
384  else
385  {
386  ‪zm_blockers::blocker_disconnect_paths(barrier.neg_start, barrier.neg_end);
387  }
388 
389  if((i % 4) == 0)
390  {
392  }
393  }
394 }
395 
397 {
398  if(‪get_num_window_destroyed() < 5 )
399  {
400  return false;
401  }
402  return true;
403 }
404 
406 {
407  num = 0;
408  for( i = 0; i < level.exterior_goals.size; i++ )
409  {
410  /*targets = getentarray(level.exterior_goals[i].target, "targetname");
411 
412  barrier_chunks = [];
413  for( j = 0; j < targets.size; j++ )
414  {
415  if( IsDefined( targets[j].script_noteworthy ) )
416  {
417  if( targets[j].script_noteworthy == "clip" )
418  {
419  continue;
420  }
421  }
422 
423  barrier_chunks[barrier_chunks.size] = targets[j];
424  }*/
425 
426 
427  if( ‪zm_utility::all_chunks_destroyed( level.exterior_goals[i], level.exterior_goals[i].barrier_chunks ) )
428  {
429  num += 1;
430  }
431 
432  }
433 
434  return num;
435 }
‪grab_carpenter
‪function grab_carpenter(player)
Definition: _zm_powerup_carpenter.gsc:45
‪all_chunks_intact
‪function all_chunks_intact(barrier, barrier_chunks)
Definition: _zm_utility.gsc:392
‪persistent_carpenter_ability_check
‪function persistent_carpenter_ability_check()
Definition: _zm_pers_upgrades.gsc:6
‪get_closest_window_repair
‪function get_closest_window_repair(windows, origin)
Definition: _zm_powerup_carpenter.gsc:129
‪replace_chunk
‪function replace_chunk(barrier, chunk, perk, upgrade, via_powerup)
Definition: _zm_blockers.gsc:2811
‪player_add_points
‪function player_add_points(event, mod, hit_location, is_dog, zombie_team, damage_weapon)
Definition: _zm_score.gsc:129
‪is_carpenter_boards_upgraded
‪function is_carpenter_boards_upgraded()
Definition: _zm_powerups.gsc:1625
‪get_array
‪function get_array(kvp_value, kvp_key="targetname")
Definition: struct.csc:34
‪register_powerup
‪function register_powerup(str_powerup, func_grab_powerup, func_setup)
Definition: _zm_powerups.gsc:1956
‪is_Classic
‪function is_Classic()
Definition: _zm_utility.gsc:42
‪spawn
‪function spawn(v_origin=(0, 0, 0), v_angles=(0, 0, 0))
Definition: struct.csc:23
‪func_should_drop_carpenter
‪function func_should_drop_carpenter()
Definition: _zm_powerup_carpenter.gsc:396
‪repair_far_boards
‪function repair_far_boards(barriers, upgrade)
Definition: _zm_powerup_carpenter.gsc:340
‪__init__
‪function __init__()
Definition: _zm_powerup_carpenter.gsc:34
‪start_carpenter
‪function start_carpenter(origin)
Definition: _zm_powerup_carpenter.gsc:63
‪POWERUP_ONLY_AFFECTS_GRABBER
‪#define POWERUP_ONLY_AFFECTS_GRABBER
Definition: _zm_powerups.gsh:31
‪POWERUP_ZOMBIE_GRABBABLE
‪#define POWERUP_ZOMBIE_GRABBABLE
Definition: _zm_powerups.gsh:33
‪get_near_boards
‪function get_near_boards(windows)
Definition: _zm_powerup_carpenter.gsc:266
‪wait_network_frame
‪function wait_network_frame(n_count=1)
Definition: util_shared.gsc:64
‪powerup_vo
‪function powerup_vo(type)
Definition: _zm_powerups.gsc:1216
‪BOARD_REPAIR_DISTANCE_SQUARED
‪#define BOARD_REPAIR_DISTANCE_SQUARED
Definition: _zm_powerup_carpenter.gsc:23
‪get_far_boards
‪function get_far_boards(windows)
Definition: _zm_powerup_carpenter.gsc:302
‪blocker_disconnect_paths
‪function blocker_disconnect_paths(start_node, end_node, two_way)
Definition: _zm_blockers.gsc:1516
‪REGISTER_SYSTEM
‪#define REGISTER_SYSTEM(__sys, __func_init_preload, __reqs)
Definition: shared.gsh:204
‪get_num_window_destroyed
‪function get_num_window_destroyed()
Definition: _zm_powerup_carpenter.gsc:405
‪all_chunks_destroyed
‪function all_chunks_destroyed(barrier, barrier_chunks)
Definition: _zm_utility.gsc:455
‪close
‪function close(localClientNum)
Definition: debug_menu_shared.csc:25
‪start_carpenter_new
‪function start_carpenter_new(origin)
Definition: _zm_powerup_carpenter.gsc:159
‪add_zombie_powerup
‪function add_zombie_powerup(powerup_name, client_field_name, clientfield_version=VERSION_SHIP)
Definition: _zm_powerups.csc:40
‪POWERUP_ANY_TEAM
‪#define POWERUP_ANY_TEAM
Definition: _zm_powerups.gsh:32
‪get_random_destroyed_chunk
‪function get_random_destroyed_chunk(barrier, barrier_chunks)
Definition: _zm_utility.gsc:2438
‪WAIT_SERVER_FRAME
‪#define WAIT_SERVER_FRAME
Definition: shared.gsh:265