1 #using scripts\codescripts\struct;
3 #using scripts\shared\clientfield_shared;
4 #using scripts\shared\system_shared;
5 #using scripts\shared\util_shared;
7 #insert scripts\shared\shared.gsh;
8 #insert scripts\shared\version.gsh;
10 #using scripts\shared\ai\zombie_death;
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;
20 #insert scripts\zm\_zm_powerups.gsh;
21 #insert scripts\zm\_zm_utility.gsh;
23 #define BOARD_REPAIR_DISTANCE_SQUARED 750 * 750
25 #precache( "string", "ZOMBIE_POWERUP_MAX_AMMO" );
27 #namespace zm_powerup_carpenter;
37 if( ToLower( GetDvarString(
"g_gametype" ) ) !=
"zcleansed" )
52 if( isDefined(level.use_new_carpenter_func) )
54 level thread [[level.use_new_carpenter_func]](
self.origin);
66 total = level.exterior_goals.size;
69 carp_ent =
spawn(
"script_origin", (0,0,0));
70 carp_ent playloopsound(
"evt_carpenter" );
75 if( !IsDefined( windows ) )
77 carp_ent stoploopsound( 1 );
78 carp_ent PlaySoundWithNotify(
"evt_carpenter_end",
"sound_done" );
79 carp_ent waittill(
"sound_done" );
84 ArrayRemoveValue(window_boards, windows);
97 if( !IsDefined( chunk ) )
104 if(isdefined(windows.clip))
106 windows.clip TriggerEnable(
true );
107 windows.clip DisconnectPaths();
120 players = GetPlayers();
121 for(i = 0; i < players.size; i++)
131 current_window = undefined;
132 shortest_distance = undefined;
133 for( i = 0; i < windows.size; i++ )
140 if( !IsDefined( current_window ) )
142 current_window = windows[i];
143 shortest_distance = DistanceSquared( current_window.origin, origin );
147 if( DistanceSquared(windows[i].origin, origin) < shortest_distance )
150 current_window = windows[i];
151 shortest_distance = DistanceSquared( windows[i].origin, origin );
156 return current_window;
161 level.carpenter_powerup_active =
true;
165 if(isdefined(level._additional_carpenter_nodes))
167 window_boards = ArrayCombine(window_boards, level._additional_carpenter_nodes,
false,
false);
171 carp_ent =
spawn(
"script_origin", (0,0,0));
172 carp_ent playloopsound(
"evt_carpenter" );
180 for(i=0;i<boards_near_players.size;i++)
182 window = boards_near_players[i];
184 num_chunks_checked = 0;
186 last_repaired_chunk = undefined;
197 if( !IsDefined( chunk ) )
202 last_repaired_chunk = chunk;
204 if(IsDefined(window.clip))
206 window.clip TriggerEnable(
true );
207 window.clip DisconnectPaths();
216 num_chunks_checked++;
218 if(num_chunks_checked >= 20)
226 if(isdefined(window.zbarrier))
228 if(isdefined(last_repaired_chunk))
230 while(window.zbarrier GetZBarrierPieceState(last_repaired_chunk) ==
"closing")
235 if(isdefined(window._post_carpenter_callback))
237 window [[window._post_carpenter_callback]]();
243 while((IsDefined(last_repaired_chunk)) && (last_repaired_chunk.state ==
"mid_repair"))
250 carp_ent stoploopsound( 1 );
251 carp_ent PlaySoundWithNotify(
"evt_carpenter_end",
"sound_done" );
252 carp_ent waittill(
"sound_done" );
254 players = GetPlayers();
255 for(i = 0; i < players.size; i++)
262 level notify(
"carpenter_finished" );
263 level.carpenter_powerup_active = undefined;
269 players = GetPlayers();
270 boards_near_players = [];
272 for(j =0;j<windows.size;j++)
275 for(i=0;i<players.size;i++)
279 if(isdefined(windows[j].zbarrier))
281 origin = windows[j].zbarrier.origin;
285 origin = windows[j].origin;
296 boards_near_players[boards_near_players.size] = windows[j];
299 return boards_near_players;
305 players = GetPlayers();
306 boards_far_from_players = [];
308 for(j =0;j<windows.size;j++)
311 for(i=0;i<players.size;i++)
316 if(isdefined(windows[j].zbarrier))
318 origin = windows[j].zbarrier.origin;
322 origin = windows[j].origin;
334 boards_far_from_players[boards_far_from_players.size] = windows[j];
337 return boards_far_from_players;
342 for(i=0;i<barriers.size;i++)
344 barrier = barriers[i];
350 if(isdefined(barrier.zbarrier))
352 a_pieces = barrier.zbarrier GetZBarrierPieceIndicesInState(
"open" );
353 if( IsDefined(a_pieces) )
355 for( xx=0; xx<a_pieces.size; xx++ )
357 chunk = a_pieces[ xx ];
361 barrier.zbarrier ZBarrierPieceUseUpgradedModel(chunk);
362 barrier.zbarrier.chunk_health[chunk] = barrier.zbarrier GetUpgradedPieceNumLives(chunk);
366 barrier.zbarrier ZBarrierPieceUseDefaultModel(chunk);
367 barrier.zbarrier.chunk_health[chunk] = 0;
372 for(x = 0; x < barrier.zbarrier GetNumZBarrierPieces(); x ++)
374 barrier.zbarrier SetZBarrierPieceState(x,
"closed");
375 barrier.zbarrier ShowZBarrierPiece(x);
379 if(IsDefined(barrier.clip))
381 barrier.clip TriggerEnable(
true );
382 barrier.clip DisconnectPaths();
408 for( i = 0; i < level.exterior_goals.size; i++ )