diff --git a/README.md b/README.md index b5ba3d42..0cf375d0 100644 --- a/README.md +++ b/README.md @@ -584,7 +584,9 @@ ### Die Rise * Removed key * Elevators and escape pod can be called without key +* Elevators can be locked at their current floor * Escape pod can be used with any amount of players +* Escape pod can be called up or down * Moved weapon locker to the downstairs fridge * Quick Revive elevator randomizes with Speed Cola and Who's Who elevators * Zombies are no longer killed while spawning in a stationary elevator diff --git a/scripts/zm/replaced/zm_highrise_classic.gsc b/scripts/zm/replaced/zm_highrise_classic.gsc index 4c242e9a..b087fe26 100644 --- a/scripts/zm/replaced/zm_highrise_classic.gsc +++ b/scripts/zm/replaced/zm_highrise_classic.gsc @@ -23,12 +23,12 @@ escape_pod() used_at_least_once = 0; escape_pod setanim( level.escape_elevator_1_state ); escape_pod setclientfield( "clientfield_escape_pod_light_fx", 1 ); + escape_pod thread escape_pod_state_run(); escape_pod_trigger thread escape_pod_walk_on_off( escape_pod ); while ( true ) { escape_pod setanim( level.escape_elevator_idle ); - flag_clear( "escape_pod_needs_reset" ); if ( isdefined( escape_pod_blocker_door ) ) { @@ -41,38 +41,17 @@ escape_pod() if ( is_true( used_at_least_once ) ) wait 3; - escape_pod thread escape_pod_state_run(); + level thread escape_pod_wait_for_players_inside( escape_pod, escape_pod_trigger ); - while ( true ) - { - players_in_escape_pod = escape_pod_trigger escape_pod_get_all_alive_players_inside(); + flag_set( "escape_pod_needs_reset" ); - if ( players_in_escape_pod.size == 0 ) - { - escape_pod.escape_pod_state = 1; - wait 0.05; - continue; - } + level waittill( "reset_escape_pod" ); - players_in_escape_pod = escape_pod_trigger escape_pod_get_all_alive_players_inside(); - - if ( players_in_escape_pod.size > 0 ) - { - escape_pod.escape_pod_state = 2; - - escape_pod thread escape_pod_tell_fx(); - wait 3; - players_in_escape_pod = escape_pod_trigger escape_pod_get_all_alive_players_inside(); - - if ( players_in_escape_pod.size > 0 ) - break; - } - - wait 0.05; - } + flag_clear( "escape_pod_needs_reset" ); level notify( "escape_pod_falling_begin" ); + players_in_escape_pod = escape_pod_trigger escape_pod_get_all_alive_players_inside(); foreach ( player in players_in_escape_pod ) { player.riding_escape_pod = 1; @@ -154,6 +133,42 @@ escape_pod() } } +escape_pod_wait_for_players_inside( escape_pod, escape_pod_trigger ) +{ + level endon( "reset_escape_pod" ); + + while ( true ) + { + players_in_escape_pod = escape_pod_trigger escape_pod_get_all_alive_players_inside(); + + if ( players_in_escape_pod.size == 0 ) + { + escape_pod.escape_pod_state = 1; + wait 0.05; + continue; + } + + players_in_escape_pod = escape_pod_trigger escape_pod_get_all_alive_players_inside(); + + if ( players_in_escape_pod.size > 0 ) + { + escape_pod.escape_pod_state = 2; + + escape_pod thread escape_pod_tell_fx(); + wait 3; + players_in_escape_pod = escape_pod_trigger escape_pod_get_all_alive_players_inside(); + + if ( players_in_escape_pod.size > 0 ) + break; + } + + wait 0.05; + } + + level notify( "reset_escape_pod" ); +} + + escape_pod_get_all_alive_players_inside() { players = get_players(); diff --git a/scripts/zm/replaced/zm_highrise_elevators.gsc b/scripts/zm/replaced/zm_highrise_elevators.gsc index c92b27c8..e47f9b7d 100644 --- a/scripts/zm/replaced/zm_highrise_elevators.gsc +++ b/scripts/zm/replaced/zm_highrise_elevators.gsc @@ -249,6 +249,29 @@ elevator_think( elevator ) } } +elevator_initial_wait( elevator, minwait, maxwait, delaybeforeleaving ) +{ + elevator.body endon( "forcego" ); + elevator.body waittill_any_or_timeout( randomintrange( minwait, maxwait ), "depart_early" ); + + if ( !is_true( elevator.body.lock_doors ) && !is_true( elevator.body.elevator_stop ) ) + elevator.body setanim( level.perk_elevators_anims[elevator.body.perk_type][0] ); + + if ( !is_true( elevator.body.departing_early ) ) + wait( delaybeforeleaving ); + + if ( elevator.body.perk_type == "specialty_weapupgrade" ) + { + while ( flag( "pack_machine_in_use" ) ) + wait 0.5; + + wait( randomintrange( 1, 3 ) ); + } + + while ( isdefined( level.elevators_stop ) && level.elevators_stop || isdefined( elevator.body.elevator_stop ) && elevator.body.elevator_stop ) + wait 0.05; +} + faller_location_logic() { wait 1; diff --git a/scripts/zm/zm_highrise/zm_highrise_reimagined.gsc b/scripts/zm/zm_highrise/zm_highrise_reimagined.gsc index 18fdc94d..4e100202 100644 --- a/scripts/zm/zm_highrise/zm_highrise_reimagined.gsc +++ b/scripts/zm/zm_highrise/zm_highrise_reimagined.gsc @@ -159,37 +159,55 @@ custom_faller_entrance_logic() elevator_call() { trigs = getentarray( "elevator_key_console_trigger", "targetname" ); + + foreach (trig in trigs) + { + elevatorname = trig.script_noteworthy; + + if ( isdefined( elevatorname ) && isdefined( trig.script_parameters ) ) + { + elevator = level.elevators[elevatorname]; + floor = int( trig.script_parameters ); + flevel = elevator maps\mp\zm_highrise_elevators::elevator_level_for_floor( floor ); + trig.elevator = elevator; + trig.floor = flevel; + } + + trig usetriggerrequirelookat(); + trig sethintstring( &"ZOMBIE_NEED_POWER" ); + } + + flag_wait( "power_on" ); + foreach (trig in trigs) { trig thread elevator_call_think(); + trig thread watch_elevator_prompt(); + trig thread watch_elevator_body_prompt(); } } elevator_call_think() { - self sethintstring( &"ZM_HIGHRISE_BUILD_KEYS" ); - self trigger_off(); - - elevatorname = self.script_noteworthy; - - if ( isdefined( elevatorname ) && isdefined( self.script_parameters ) ) - { - elevator = level.elevators[elevatorname]; - floor = int( self.script_parameters ); - flevel = elevator maps\mp\zm_highrise_elevators::elevator_level_for_floor( floor ); - self.elevator = elevator; - self.floor = flevel; - } - - flag_wait( "power_on" ); - - self thread watch_elevator_prompt(); + self notify( "elevator_call_think" ); + self endon( "elevator_call_think" ); while ( 1 ) { - while ( self.elevator maps\mp\zm_highrise_elevators::elevator_is_on_floor( self.floor ) ) + if ( !self.elevator.body.is_moving && self.elevator maps\mp\zm_highrise_elevators::elevator_is_on_floor( self.floor ) ) { - self.elevator waittill( "floor_changed" ); + if ( !is_true( self.elevator.body.elevator_stop ) ) + { + self sethintstring( "Hold ^3[{+activate}]^7 to lock the elevator" ); + } + else + { + self sethintstring( "Hold ^3[{+activate}]^7 to unlock the elevator" ); + } + } + else + { + self sethintstring( &"ZM_HIGHRISE_BUILD_KEYS" ); } self trigger_on(); @@ -201,14 +219,31 @@ elevator_call_think() continue; } + self playsound( "zmb_elevator_ding" ); + + if ( !self.elevator.body.is_moving && self.elevator maps\mp\zm_highrise_elevators::elevator_is_on_floor( self.floor ) ) + { + if ( !is_true( self.elevator.body.elevator_stop ) ) + { + self.elevator.body setanim( level.perk_elevators_anims[self.elevator.body.perk_type][1] ); + self.elevator.body.elevator_stop = 1; + } + else + { + self.elevator.body.elevator_stop = 0; + } + + continue; + } + + self sethintstring( "" ); self trigger_off(); + self.elevator.body.elevator_stop = 0; + self.elevator.body.elevator_force_go = 1; self maps\mp\zm_highrise_buildables::onuseplantobject_elevatorkey( who ); - while ( !self.elevator maps\mp\zm_highrise_elevators::elevator_is_on_floor( self.floor ) ) - { - self.elevator waittill( "floor_changed" ); - } + return; } } @@ -218,13 +253,40 @@ watch_elevator_prompt() { self.elevator waittill( "floor_changed" ); - if ( self.elevator maps\mp\zm_highrise_elevators::elevator_is_on_floor( self.floor ) ) + if ( !is_true( self.elevator.body.elevator_force_go ) ) { - self trigger_off(); + self thread elevator_call_think(); + } + } +} + +watch_elevator_body_prompt() +{ + while ( 1 ) + { + msg = self.elevator.body waittill_any_return( "movedone", "forcego" ); + + if ( msg == "movedone" ) + { + while ( is_true( self.elevator.body.is_moving ) ) + { + wait 0.05; + } + + self.elevator.body.elevator_force_go = 0; + self thread elevator_call_think(); } else { - self trigger_on(); + while ( !is_true( self.elevator.body.is_moving ) ) + { + wait 0.05; + } + + if ( !self.elevator maps\mp\zm_highrise_elevators::elevator_is_on_floor( self.floor ) ) + { + self thread elevator_call_think(); + } } } } @@ -232,14 +294,16 @@ watch_elevator_prompt() escape_pod_call() { trig = getent( "escape_pod_key_console_trigger", "targetname" ); + + trig usetriggerrequirelookat(); + trig sethintstring( &"ZM_HIGHRISE_BUILD_KEYS" ); + trig trigger_off(); + trig thread escape_pod_call_think(); } escape_pod_call_think() { - self sethintstring( &"ZM_HIGHRISE_BUILD_KEYS" ); - self trigger_off(); - while ( 1 ) { flag_wait( "escape_pod_needs_reset" );