diff --git a/README.md b/README.md index f7858c89..1894ceab 100644 --- a/README.md +++ b/README.md @@ -300,10 +300,13 @@ * Removed ### Meat +* All zombies go after player holding the meat +* 60% move speed while holding the meat +* Decreased time on ground from 16 seconds to 10 seconds +* Bounces off walls when thrown * Able to drop when players are down * Changed powerup fx color to blue -* Decreased time on ground from 16 seconds to 10 seconds -* Message shows when the meat is on a player +* Message shows when the meat is grabbed and thrown on a player * Meleeing while the meat is moving no longer grabs the meat * Meleeing while the meat is moving throws the meat * Meleeing while the meat is moving activates more consistently @@ -571,8 +574,6 @@ * Gain score by being the team holding the meat * Gain 200 score to win the game * Meat powerup always spawns from the first zombie killed -* All zombies go after the player holding the meat -* Player holding the meat moves at 60% speed * Player holding the meat gains 100 points when their team gains score * Downing while holding the meat drops it as a powerup * Throwing the meat on the ground drops it as a powerup diff --git a/scripts/zm/replaced/zgrief.gsc b/scripts/zm/replaced/zgrief.gsc index 90aa0d5d..c6569da5 100644 --- a/scripts/zm/replaced/zgrief.gsc +++ b/scripts/zm/replaced/zgrief.gsc @@ -18,27 +18,232 @@ game_mode_spawn_player_logic() return 0; } -meat_stink_on_ground(position_to_play) +meat_bounce_override( pos, normal, ent, bounce ) { - if(level.scr_zm_ui_gametype_obj == "zmeat") + if ( isdefined( ent ) && isplayer( ent ) ) + { + if ( is_player_valid(ent) ) + { + level thread meat_stink_player( ent ); + + if ( isdefined( self.owner ) ) + { + maps\mp\_demo::bookmark( "zm_player_meat_stink", gettime(), ent, self.owner, 0, self ); + self.owner maps\mp\zombies\_zm_stats::increment_client_stat( "contaminations_given" ); + } + + self delete(); + + return; + } + } + else + { + players = getplayers(); + closest_player = undefined; + closest_player_dist = 10000.0; + + foreach (player in players) + { + if ( self.owner == player ) + continue; + + if ( !is_player_valid(player) ) + continue; + + distsq = distancesquared( pos, player.origin ); + + if ( distsq < closest_player_dist ) + { + closest_player = player; + closest_player_dist = distsq; + } + } + + if ( isdefined( closest_player ) ) + { + level thread meat_stink_player( closest_player ); + + if ( isdefined( self.owner ) ) + { + maps\mp\_demo::bookmark( "zm_player_meat_stink", gettime(), closest_player, self.owner, 0, self ); + self.owner maps\mp\zombies\_zm_stats::increment_client_stat( "contaminations_given" ); + } + + self delete(); + + return; + } + + playfx( level._effect["meat_impact"], self.origin ); + } + + if (is_true(bounce)) { - if (isDefined(level.meat_powerup)) + landed_on = self getgroundent(); + + if (!isDefined(landed_on) || isAI(landed_on)) { return; } + } - if (is_true(level.meat_on_ground)) + valid_poi = check_point_in_enabled_zone( pos, undefined, undefined ); + + if ( valid_poi ) + { + self hide(); + + if (level.scr_zm_ui_gametype_obj == "zmeat") { - return; + level.meat_powerup = maps\mp\zombies\_zm_powerups::specific_powerup_drop( "meat_stink", self.origin ); + } + else + { + level thread meat_stink_on_ground( self.origin ); + } + } + else + { + level notify("meat_inactive"); + } + + self delete(); +} + +meat_stink( who ) +{ + weapons = who getweaponslist(); + has_meat = 0; + + foreach ( weapon in weapons ) + { + if ( weapon == "item_meat_zm" ) + has_meat = 1; + } + + if ( has_meat ) + return; + + who.pre_meat_weapon = who getcurrentweapon(); + level notify( "meat_grabbed" ); + who notify( "meat_grabbed" ); + who playsound( "zmb_pickup_meat" ); + who increment_is_drinking(); + who giveweapon( "item_meat_zm" ); + who switchtoweapon( "item_meat_zm" ); + who setweaponammoclip( "item_meat_zm", 1 ); + who setMoveSpeedScale(0.6); + level.meat_player = who; + + players = get_players(); + foreach (player in players) + { + player thread maps\mp\gametypes_zm\zgrief::meat_stink_player_cleanup(); + if (player != who) + { + player.ignoreme = 1; } - level.meat_on_ground = 1; - level.meat_powerup = maps\mp\zombies\_zm_powerups::specific_powerup_drop( "meat_stink", position_to_play ); - level.meat_on_ground = undefined; + player print_meat_msg(who, "grabbed"); + if (level.scr_zm_ui_gametype_obj == "zmeat") + { + if (player.team == who.team) + { + player thread scripts\zm\zgrief\zgrief_reimagined::show_grief_hud_msg(&"ZOMBIE_YOUR_TEAM_MEAT"); + } + else + { + player thread scripts\zm\zgrief\zgrief_reimagined::show_grief_hud_msg(&"ZOMBIE_OTHER_TEAM_MEAT"); + } + } + } + + who thread maps\mp\gametypes_zm\zgrief::meat_stink_player_create(); + + if (level.scr_zm_ui_gametype_obj == "zmeat") + { + who thread meat_powerup_drop_on_downed(); + who thread meat_powerup_reset_on_disconnect(); + } +} + +meat_powerup_drop_on_downed() +{ + self endon("disconnect"); + self endon("bled_out"); + self endon("meat_unstink_player"); + + self waittill("player_downed"); + + if (isDefined(level.item_meat)) + { return; } + if (isDefined(level.meat_powerup)) + { + return; + } + + level.meat_player = undefined; + + self setMoveSpeedScale(1); + + players = get_players(); + foreach (player in players) + { + player thread maps\mp\gametypes_zm\zgrief::meat_stink_player_cleanup(); + + if (is_player_valid(player) && !is_true(player.spawn_protection) && !is_true(player.revive_protection)) + { + player.ignoreme = 0; + } + } + + valid_drop = check_point_in_enabled_zone( self.origin, undefined, undefined ); + + if (valid_drop) + { + players = get_players(); + foreach (player in players) + { + player thread scripts\zm\zgrief\zgrief_reimagined::show_grief_hud_msg("Meat dropped!"); + } + + level.meat_powerup = maps\mp\zombies\_zm_powerups::specific_powerup_drop( "meat_stink", self.origin ); + } + else + { + level notify("meat_inactive"); + } +} + +meat_powerup_reset_on_disconnect() +{ + level endon("meat_thrown"); + self endon("player_downed"); + self endon("bled_out"); + + self waittill("disconnect"); + + level.meat_player = undefined; + + players = get_players(); + foreach (player in players) + { + if (is_player_valid(player) && !is_true(player.spawn_protection) && !is_true(player.revive_protection)) + { + player.ignoreme = 0; + } + } + + level notify("meat_inactive"); +} + +meat_stink_on_ground(position_to_play) +{ level.meat_on_ground = 1; attractor_point = spawn( "script_model", position_to_play ); attractor_point setmodel( "tag_origin" ); @@ -62,7 +267,7 @@ meat_stink_player( who ) if(level.scr_zm_ui_gametype_obj == "zmeat") { - level thread maps\mp\gametypes_zm\zgrief::meat_stink(who); + level thread meat_stink(who); return; } @@ -76,7 +281,7 @@ meat_stink_player( who ) player.ignoreme = 1; } - print_meat_msg(player, who); + player print_meat_msg(who, "has"); } who thread maps\mp\gametypes_zm\zgrief::meat_stink_player_create(); who waittill_any_or_timeout( 30, "disconnect", "player_downed", "bled_out" ); @@ -88,10 +293,10 @@ meat_stink_player( who ) } } -print_meat_msg(player, meat_player) +print_meat_msg(meat_player, verb) { color = ""; - if(player.team == meat_player.team) + if(self.team == meat_player.team) { color = "^8"; } @@ -100,5 +305,5 @@ print_meat_msg(player, meat_player) color = "^9"; } - player iprintln(color + meat_player.name + " has the meat"); + self iprintln(color + meat_player.name + " " + verb + " the meat"); } \ No newline at end of file diff --git a/scripts/zm/replaced/zmeat.gsc b/scripts/zm/replaced/zmeat.gsc index 17d72486..0bae777d 100644 --- a/scripts/zm/replaced/zmeat.gsc +++ b/scripts/zm/replaced/zmeat.gsc @@ -150,6 +150,146 @@ spike_the_meat( meat ) } } +create_item_meat_watcher() +{ + wait 0.05; + watcher = self maps\mp\gametypes_zm\_weaponobjects::createuseweaponobjectwatcher( "item_meat", get_gamemode_var( "item_meat_name" ), self.team ); + watcher.pickup = ::item_meat_on_pickup; + watcher.onspawn = ::item_meat_spawned; + watcher.onspawnretrievetriggers = ::play_item_meat_on_spawn_retrieve_trigger; + watcher.headicon = 0; +} + +item_meat_on_spawn_retrieve_trigger( watcher, player, weaponname ) +{ + self endon( "death" ); + add_meat_event( "meat_spawn", self ); + + while ( isdefined( level.splitting_meat ) && level.splitting_meat ) + wait 0.15; + + if ( isdefined( player ) ) + { + self setowner( player ); + self setteam( player.pers["team"] ); + self.owner = player; + self.oldangles = self.angles; + + if ( player hasweapon( weaponname ) ) + { + if ( !( isdefined( self._fake_meat ) && self._fake_meat ) ) + player thread player_wait_take_meat( weaponname ); + else + { + player takeweapon( weaponname ); + player decrement_is_drinking(); + } + } + + if ( !( isdefined( self._fake_meat ) && self._fake_meat ) ) + { + if ( !( isdefined( self._respawned_meat ) && self._respawned_meat ) ) + { + level notify( "meat_thrown", player ); + level._last_person_to_throw_meat = player; + level._last_person_to_throw_meat_time = gettime(); + } + } + } + + level.meat_player = undefined; + + player setMoveSpeedScale(1); + + players = get_players(); + foreach (other_player in players) + { + other_player thread maps\mp\gametypes_zm\zgrief::meat_stink_player_cleanup(); + + if (is_player_valid(other_player) && !is_true(other_player.spawn_protection) && !is_true(other_player.revive_protection)) + { + other_player.ignoreme = 0; + } + + other_player thread scripts\zm\zgrief\zgrief_reimagined::show_grief_hud_msg("Meat thrown!"); + } + + if ( !( isdefined( self._fake_meat ) && self._fake_meat ) ) + { + level._meat_moving = 1; + + if ( isdefined( level.item_meat ) && level.item_meat != self ) + level.item_meat cleanup_meat(); + + level.item_meat = self; + } + + self thread item_meat_watch_stationary(); + self thread item_meat_watch_bounce(); + self.item_meat_pick_up_trigger = spawn( "trigger_radius_use", self.origin, 0, 36, 72 ); + self.item_meat_pick_up_trigger setcursorhint( "HINT_NOICON" ); + self.item_meat_pick_up_trigger sethintstring( &"ZOMBIE_MEAT_PICKUP" ); + self.item_meat_pick_up_trigger enablelinkto(); + self.item_meat_pick_up_trigger linkto( self ); + self.item_meat_pick_up_trigger triggerignoreteam(); + level.item_meat_pick_up_trigger = self.item_meat_pick_up_trigger; + self thread item_meat_watch_shutdown(); + self.meat_id = indexinarray( level._fake_meats, self ); + + if ( !isdefined( self.meat_id ) ) + self.meat_id = 0; + + if ( isdefined( level.dont_allow_meat_interaction ) && level.dont_allow_meat_interaction ) + self.item_meat_pick_up_trigger setinvisibletoall(); + else + { + self thread item_meat_watch_trigger( self.meat_id, self.item_meat_pick_up_trigger, ::item_meat_on_pickup, level.meat_pickupsoundplayer, level.meat_pickupsound ); + self thread kick_meat_monitor(); + self thread last_stand_meat_nudge(); + } + + self._respawned_meat = undefined; +} + +item_meat_watch_bounce() +{ + self endon( "death" ); + self endon( "picked_up" ); + self.meat_is_flying = 1; + + while (1) + { + self waittill( "grenade_bounce", pos, normal, ent ); + + playfxontag( level._effect["meat_marker"], self, "tag_origin" ); + + if ( isdefined( level.meat_bounce_override ) ) + { + self thread [[ level.meat_bounce_override ]]( pos, normal, ent, true ); + } + } + + self.meat_is_flying = 0; +} + +item_meat_watch_stationary() +{ + self endon( "death" ); + self endon( "picked_up" ); + self.meat_is_moving = 1; + + self waittill( "stationary", pos, normal ); + + if ( isdefined( level.meat_bounce_override ) ) + { + self thread [[ level.meat_bounce_override ]]( pos, normal, undefined, false ); + } + + self.meat_is_moving = 0; + + self delete(); +} + kick_meat_monitor() { // no kick diff --git a/scripts/zm/zgrief/zgrief_reimagined.gsc b/scripts/zm/zgrief/zgrief_reimagined.gsc index 31f4c1c8..73cd74de 100644 --- a/scripts/zm/zgrief/zgrief_reimagined.gsc +++ b/scripts/zm/zgrief/zgrief_reimagined.gsc @@ -26,11 +26,14 @@ main() replaceFunc(maps\mp\gametypes_zm\_zm_gametype::onspawnplayer, scripts\zm\replaced\_zm_gametype::onspawnplayer); replaceFunc(maps\mp\gametypes_zm\_zm_gametype::onplayerspawned, scripts\zm\replaced\_zm_gametype::onplayerspawned); replaceFunc(maps\mp\gametypes_zm\_zm_gametype::hide_gump_loading_for_hotjoiners, scripts\zm\replaced\_zm_gametype::hide_gump_loading_for_hotjoiners); + replaceFunc(maps\mp\gametypes_zm\zgrief::meat_stink, scripts\zm\replaced\zgrief::meat_stink); replaceFunc(maps\mp\gametypes_zm\zgrief::meat_stink_on_ground, scripts\zm\replaced\zgrief::meat_stink_on_ground); replaceFunc(maps\mp\gametypes_zm\zgrief::meat_stink_player, scripts\zm\replaced\zgrief::meat_stink_player); replaceFunc(maps\mp\gametypes_zm\zmeat::item_meat_watch_trigger, scripts\zm\replaced\zmeat::item_meat_watch_trigger); replaceFunc(maps\mp\gametypes_zm\zmeat::kick_meat_monitor, scripts\zm\replaced\zmeat::kick_meat_monitor); replaceFunc(maps\mp\gametypes_zm\zmeat::last_stand_meat_nudge, scripts\zm\replaced\zmeat::last_stand_meat_nudge); + replaceFunc(maps\mp\gametypes_zm\zmeat::item_meat_on_spawn_retrieve_trigger, scripts\zm\replaced\zmeat::item_meat_on_spawn_retrieve_trigger); + replaceFunc(maps\mp\gametypes_zm\zmeat::item_meat_watch_bounce, scripts\zm\replaced\zmeat::item_meat_watch_bounce); } init() @@ -70,6 +73,7 @@ init() level.can_revive_game_module = ::can_revive; level._powerup_grab_check = ::powerup_can_player_grab; + level.meat_bounce_override = scripts\zm\replaced\zgrief::meat_bounce_override; level.is_respawn_gamemode_func = ::is_respawn_gamemode; level.round_start_wait_func = ::round_start_wait; @@ -703,9 +707,10 @@ grief_onplayerconnect() self thread on_player_bleedout(); self thread on_player_revived(); self thread team_player_waypoint(); + self thread obj_waypoint(); self thread headstomp_watcher(); self thread smoke_grenade_cluster_watcher(); - self thread maps\mp\gametypes_zm\zmeat::create_item_meat_watcher(); + self thread scripts\zm\replaced\zmeat::create_item_meat_watcher(); self.killsconfirmed = 0; if(level.scr_zm_ui_gametype_obj == "zgrief" || level.scr_zm_ui_gametype_obj == "zcontainment" || level.scr_zm_ui_gametype_obj == "zmeat") @@ -1014,6 +1019,34 @@ team_player_waypoint_origin_think() } } +obj_waypoint() +{ + self.obj_waypoint = []; + self.obj_waypoint = newClientHudElem(self); + self.obj_waypoint.alignx = "center"; + self.obj_waypoint.aligny = "middle"; + self.obj_waypoint.horzalign = "user_center"; + self.obj_waypoint.vertalign = "user_center"; + self.obj_waypoint.alpha = 0; + self.obj_waypoint.hidewheninmenu = 1; + self.obj_waypoint.foreground = 1; + self.obj_waypoint setWaypoint(1, "waypoint_revive"); + + self thread obj_waypoint_destroy_on_end_game(); +} + +obj_waypoint_destroy_on_end_game() +{ + self endon("disconnect"); + + level waittill("end_game"); + + if(isDefined(self.obj_waypoint)) + { + self.obj_waypoint destroy(); + } +} + headstomp_watcher() { level endon("end_game"); @@ -2454,21 +2487,6 @@ containment_init() level thread containment_think(); } -containment_waypoint_init() -{ - hud = []; - hud = newClientHudElem(self); - hud.alignx = "center"; - hud.aligny = "middle"; - hud.horzalign = "user_center"; - hud.vertalign = "user_center"; - hud.alpha = 1; - hud.hidewheninmenu = 1; - hud.foreground = 1; - - return hud; -} - containment_hud_destroy_on_end_game() { level waittill("end_game"); @@ -2476,15 +2494,6 @@ containment_hud_destroy_on_end_game() level.containment_zone_hud setText(""); level.containment_time_hud setText(""); - players = get_players(); - foreach(player in players) - { - if(isDefined(player.obj_waypoint)) - { - player.obj_waypoint destroy(); - } - } - level waittill("intermission"); level.containment_zone_hud destroy(); @@ -2556,11 +2565,6 @@ containment_think() foreach(player in players) { - if(!isDefined(player.obj_waypoint)) - { - player.obj_waypoint = player containment_waypoint_init(); - } - if(player get_current_zone() == zone_name) { if(is_player_valid(player)) @@ -2886,10 +2890,9 @@ meat_init() { level._powerup_timeout_custom_time = ::meat_powerup_custom_time; - level thread meat_hud_destroy_on_end_game(); level thread meat_powerup_drop_think(); + level thread meat_powerup_drop_watcher(); level thread meat_think(); - level thread meat_thrown_hud_msg(); } meat_powerup_drop_think() @@ -2936,104 +2939,40 @@ meat_powerup_drop_think() level.meat_powerup = powerup; - meat_active = true; - while (meat_active) - { - wait 0.05; - - meat_active = false; - - if (!meat_active) - { - if (isDefined(level.item_meat)) - { - meat_active = true; - - if (!isDefined(level.item_meat.obj_waypoint_origin)) - { - level.item_meat.obj_waypoint_origin = spawn( "script_model", level.item_meat.origin ); - level.item_meat.obj_waypoint_origin setmodel( "tag_origin" ); - - level.item_meat thread meat_waypoint_origin_destroy_on_death(); - } - - level.item_meat.obj_waypoint_origin.origin = level.item_meat.origin + (0, 0, 32); - - players = get_players(); - foreach (player in players) - { - if (!isDefined(player.obj_waypoint)) - { - player.obj_waypoint = player meat_waypoint_init(); - } - - player.obj_waypoint.alpha = 1; - player.obj_waypoint.color = (1, 1, 1); - player.obj_waypoint setTargetEnt(level.item_meat.obj_waypoint_origin); - } - } - } - - if (!meat_active) - { - players = get_players(); - foreach(player in players) - { - if(player hasWeapon("item_meat_zm")) - { - meat_active = true; - } - } - } - - if (!meat_active) - { - if (isDefined(level.meat_powerup)) - { - meat_active = true; - - if (!isDefined(level.meat_powerup.obj_waypoint_origin)) - { - level.meat_powerup.obj_waypoint_origin = spawn( "script_model", level.meat_powerup.origin + (0, 0, 32) ); - level.meat_powerup.obj_waypoint_origin setmodel( "tag_origin" ); - - level.meat_powerup thread meat_waypoint_origin_destroy_on_death(); - } - - players = get_players(); - foreach (player in players) - { - if (!isDefined(player.obj_waypoint)) - { - player.obj_waypoint = player meat_waypoint_init(); - } - - player.obj_waypoint.alpha = 1; - player.obj_waypoint.color = (1, 1, 1); - player.obj_waypoint setTargetEnt(level.meat_powerup.obj_waypoint_origin); - } - } - } - - if (!meat_active) - { - if (is_true(level.meat_on_ground)) - { - meat_active = true; - } - } - } + level waittill("meat_inactive"); players = get_players(); foreach (player in players) { player thread show_grief_hud_msg("Meat reset!"); } - - level notify("meat_inactive"); } } +meat_powerup_drop_watcher() +{ + while (1) + { + level waittill( "powerup_dropped", powerup ); + + if (powerup.powerup_name != "meat_stink") + { + continue; + } + + powerup thread meat_powerup_reset_on_timeout(); + } +} + +meat_powerup_reset_on_timeout() +{ + self endon("powerup_grabbed"); + + self waittill("powerup_timedout"); + + level notify("meat_inactive"); +} + meat_waypoint_origin_destroy_on_death() { self waittill("death"); @@ -3055,50 +2994,34 @@ meat_think() while(1) { - if (!isDefined(meat_player)) + if (isDefined(level.meat_player)) { - players = get_players(); + if (!isDefined(held_time)) + { + held_time = getTime(); + + level.meat_player.player_waypoint.alpha = 0; + level.meat_player.obj_waypoint.alpha = 0; + + level.meat_player thread show_player_waypoint_on_meat_drop(); + } + foreach (player in players) { - if (player hasWeapon("item_meat_zm")) + if (player != level.meat_player) { - meat_player = player; - held_time = getTime(); + player.obj_waypoint.alpha = 1; - level thread meat_stink_player(meat_player); - - break; - } - } - } - - if (isDefined(meat_player)) - { - if (!meat_player hasWeapon("item_meat_zm")) - { - level thread meat_unstink_player(meat_player); - - meat_player = undefined; - held_time = undefined; - - players = get_players(); - foreach (player in players) - { - if (!is_true(player.spawn_protection) && !is_true(player.revive_protection)) + if (player.team == level.meat_player.team) { - player.ignoreme = 0; + player.obj_waypoint.color = (0, 1, 0); + } + else + { + player.obj_waypoint.color = (1, 0, 0); } - } - continue; - } - - players = get_players(); - foreach (player in players) - { - if (player != meat_player) - { - player.ignoreme = 1; + player.obj_waypoint setTargetEnt(level.meat_player.player_waypoint_origin); } } @@ -3106,10 +3029,63 @@ meat_think() { held_time = getTime(); - score = 100 * maps\mp\zombies\_zm_score::get_points_multiplier(meat_player); - meat_player maps\mp\zombies\_zm_score::add_to_player_score(score); + score = 100 * maps\mp\zombies\_zm_score::get_points_multiplier(level.meat_player); + level.meat_player maps\mp\zombies\_zm_score::add_to_player_score(score); - increment_score(meat_player.team); + increment_score(level.meat_player.team); + } + } + else + { + held_time = undefined; + + if (isDefined(level.item_meat)) + { + if (!isDefined(level.item_meat.obj_waypoint_origin)) + { + level.item_meat.obj_waypoint_origin = spawn( "script_model", level.item_meat.origin ); + level.item_meat.obj_waypoint_origin setmodel( "tag_origin" ); + + level.item_meat thread meat_waypoint_origin_destroy_on_death(); + } + + level.item_meat.obj_waypoint_origin.origin = level.item_meat.origin + (0, 0, 32); + + players = get_players(); + foreach (player in players) + { + player.obj_waypoint.alpha = 1; + player.obj_waypoint.color = (1, 1, 1); + player.obj_waypoint setTargetEnt(level.item_meat.obj_waypoint_origin); + } + } + else if (isDefined(level.meat_powerup)) + { + meat_active = true; + + if (!isDefined(level.meat_powerup.obj_waypoint_origin)) + { + level.meat_powerup.obj_waypoint_origin = spawn( "script_model", level.meat_powerup.origin + (0, 0, 32) ); + level.meat_powerup.obj_waypoint_origin setmodel( "tag_origin" ); + + level.meat_powerup thread meat_waypoint_origin_destroy_on_death(); + } + + players = get_players(); + foreach (player in players) + { + player.obj_waypoint.alpha = 1; + player.obj_waypoint.color = (1, 1, 1); + player.obj_waypoint setTargetEnt(level.meat_powerup.obj_waypoint_origin); + } + } + else + { + players = get_players(); + foreach (player in players) + { + player.obj_waypoint.alpha = 0; + } } } @@ -3117,166 +3093,14 @@ meat_think() } } -meat_stink_player(meat_player) +show_player_waypoint_on_meat_drop() { - if (!isDefined(meat_player.obj_waypoint_origin)) + while (isDefined(level.meat_player)) { - meat_player.obj_waypoint_origin = spawn( "script_model", meat_player.origin + (0, 0, 72) ); - meat_player.obj_waypoint_origin setmodel( "tag_origin" ); - meat_player.obj_waypoint_origin linkto( meat_player ); + wait 0.05; } - meat_player setMoveSpeedScale(0.6); - - meat_player.player_waypoint.alpha = 0; - - players = get_players(); - foreach (player in players) - { - if (!isDefined(player.obj_waypoint)) - { - player.obj_waypoint = player meat_waypoint_init(); - } - - scripts\zm\replaced\zgrief::print_meat_msg(player, meat_player); - - if (player.team == meat_player.team) - { - player thread show_grief_hud_msg(&"ZOMBIE_YOUR_TEAM_MEAT"); - } - else - { - player thread show_grief_hud_msg(&"ZOMBIE_OTHER_TEAM_MEAT"); - } - - if (player == meat_player) - { - player.obj_waypoint.alpha = 0; - } - else - { - player.obj_waypoint.alpha = 1; - - if (player.team == meat_player.team) - { - player.obj_waypoint.color = (0, 1, 0); - } - else - { - player.obj_waypoint.color = (1, 0, 0); - } - - player.obj_waypoint setTargetEnt(meat_player.obj_waypoint_origin); - } - - player thread meat_stink_player_cleanup(); - } - - meat_player thread meat_stink_player_create(); - - meat_player thread meat_powerup_drop_on_downed(); -} - -meat_unstink_player(meat_player) -{ - if (isDefined(meat_player.obj_waypoint_origin)) - { - meat_player.obj_waypoint_origin unlink(); - meat_player.obj_waypoint_origin delete(); - } - - meat_player setMoveSpeedScale(1); - - if (is_player_valid(meat_player)) - { - meat_player.player_waypoint.alpha = 1; - } - - players = get_players(); - foreach (player in players) - { - if(isDefined(player.obj_waypoint)) - { - player.obj_waypoint.alpha = 0; - } - - player thread meat_stink_player_cleanup(); - } - - meat_player notify("meat_unstink_player"); -} - -meat_stink_player_create() -{ - self maps\mp\zombies\_zm_stats::increment_client_stat( "contaminations_received" ); - self endon( "disconnect" ); - self endon( "death" ); - tagname = "J_SpineLower"; - self.meat_stink_3p = spawn( "script_model", self gettagorigin( tagname ) ); - self.meat_stink_3p setmodel( "tag_origin" ); - self.meat_stink_3p linkto( self, tagname ); - wait 0.5; - playfxontag( level._effect["meat_stink_torso"], self.meat_stink_3p, "tag_origin" ); - self setclientfieldtoplayer( "meat_stink", 1 ); -} - -meat_stink_player_cleanup() -{ - if ( isdefined( self.meat_stink_3p ) ) - { - self.meat_stink_3p unlink(); - self.meat_stink_3p delete(); - } - - self setclientfieldtoplayer( "meat_stink", 0 ); -} - -meat_powerup_drop_on_downed() -{ - self endon("disconnect"); - self endon("bled_out"); - self endon("meat_unstink_player"); - - self waittill("player_downed"); - - if (isDefined(level.item_meat)) - { - return; - } - - if (isDefined(level.meat_powerup)) - { - return; - } - - if (is_true(level.meat_on_ground)) - { - return; - } - - valid_drop = 0; - playable_area = getentarray("player_volume", "script_noteworthy"); - for (i = 0; i < playable_area.size; i++) - { - if (self isTouching(playable_area[i])) - { - valid_drop = 1; - break; - } - } - - if (valid_drop) - { - players = get_players(); - foreach (player in players) - { - player thread show_grief_hud_msg("Meat dropped!"); - } - - level.meat_on_ground = 1; - level.meat_powerup = maps\mp\zombies\_zm_powerups::specific_powerup_drop( "meat_stink", self.origin ); - level.meat_on_ground = undefined; - } + self.player_waypoint.alpha = 0; } meat_powerup_custom_time(powerup) @@ -3289,38 +3113,6 @@ meat_powerup_custom_time(powerup) return 15; } -meat_thrown_hud_msg() -{ - level endon("end_game"); - - while (1) - { - level waittill("meat_thrown", player); - - players = get_players(); - foreach (player in players) - { - player thread show_grief_hud_msg("Meat thrown!"); - } - } -} - -meat_waypoint_init() -{ - hud = []; - hud = newClientHudElem(self); - hud.alignx = "center"; - hud.aligny = "middle"; - hud.horzalign = "user_center"; - hud.vertalign = "user_center"; - hud.alpha = 1; - hud.hidewheninmenu = 1; - hud.foreground = 1; - hud setWaypoint(1, "waypoint_revive"); - - return hud; -} - can_revive(revivee) { if (self hasweapon(get_gamemode_var("item_meat_name"))) @@ -3344,20 +3136,6 @@ powerup_can_player_grab(player) return true; } -meat_hud_destroy_on_end_game() -{ - level waittill("end_game"); - - players = get_players(); - foreach(player in players) - { - if(isDefined(player.obj_waypoint)) - { - player.obj_waypoint destroy(); - } - } -} - increment_score(team) { level endon("end_game");