diff --git a/programs/survival/README.md b/programs/survival/README.md index ca1f4169..f5649395 100644 --- a/programs/survival/README.md +++ b/programs/survival/README.md @@ -3,6 +3,12 @@ Various scripts that modify various game elements, often replicating popular mod ## Survival scarpet apps in alphabetical order with creator: +### [afk_display.sc](https://github.com/gnembon/scarpet/blob/master/programs/survival/afk_display.sc): +#### By akaikagaribi + Grays out a player's name if they're not moving for 3 minutes (configurable). + The functionality of this script is identical to that of Vanilla Tweaks' AFK Display datapack, but it saves + what team a player was on before moving them to the AFK team, and puts them back in that team when they return. + ### [angel_block.sc](https://github.com/gnembon/scarpet/blob/master/programs/survival/angel_block.sc): #### By "Pegasus Epsilon" Reimplementation of Angel Blocks from RandomThings mod in scarpet 1.4. @@ -443,4 +449,5 @@ Various scripts that modify various game elements, often replicating popular mod Xendergo ch-yx Crec0 + akaikagaribi (Many more hopefully!) diff --git a/programs/survival/afk_display.sc b/programs/survival/afk_display.sc new file mode 100644 index 00000000..dc25db1b --- /dev/null +++ b/programs/survival/afk_display.sc @@ -0,0 +1,67 @@ +__config() -> { + 'scope' -> 'global', + 'stay_loaded' -> true +}; + +global_teams = {}; + +// Change these values to your liking +global_afk_prefix = ''; +global_afk_suffix = ''; +global_afk_timeout = 180; // seconds +global_afk_color = 'gray'; +global_afk_fake_players = true; // Mark fake players as AFK +global_afk_shadow_players = true; // Mark shadow players as AFK + +if(scoreboard('afkX') == null, scoreboard_add('afkX')); +if(scoreboard('afkY') == null, scoreboard_add('afkY')); +if(scoreboard('afkZ') == null, scoreboard_add('afkZ')); +if(scoreboard('afkScore') == null, scoreboard_add('afkScore')); +if(team_list('afk_players') == null, + team_add('afk_players'); + team_property('afk_players', 'color', global_afk_color); + team_property('afk_players', 'prefix', global_afk_prefix); + team_property('afk_players', 'suffix', global_afk_suffix); +); + +check_afk() -> ( + for(player('*'), + if(and(_~'player_type' == 'fake', !global_afk_fake_players), continue()); + if(and(_~'player_type' == 'shadow', !global_afk_shadow_players), continue()); + if(and( + scoreboard('afkX', _) == scoreboard('afkX', _, _~'pos':0), + scoreboard('afkY', _) == scoreboard('afkY', _, _~'pos':1), + scoreboard('afkZ', _) == scoreboard('afkZ', _, _~'pos':2); + ), + scoreboard('afkScore', _, scoreboard('afkScore', _) + 1), + scoreboard('afkScore', _, 0); + ); + if(scoreboard('afkScore', _) >= global_afk_timeout, + if(_~'team' == 'afk_players', continue()); + delete(global_teams, _); + global_teams:_ = _~'team'; + team_add('afk_players', _), + + if(_~'team' != 'afk_players', continue()); + if(global_teams:_, + team_add(global_teams:_, _), + team_leave(_); + ); + ); + ); + schedule(20, 'check_afk'); +); + +__on_start() -> ( + check_afk(); +); + +__on_player_disconnects(player, reason) -> ( + if(player~'team' == 'afk_players', + scoreboard('afkScore', player, 0); + if(global_teams:player, + team_add(global_teams:player, player), + team_leave(player); + ); + ); +);