Paste #55841: Magic Sidebar

Date: 2019/07/21 01:19:24 UTC-07:00
Type: Denizen Script

View Raw Paste Download This Paste
Copy Link


# +-------------------------
# |
# | M a g i c   S i d e b a r
# |
# | Provides a working live-updating per-player sidebar!
#
# @author mcmonkey
# @date 2019/03/01
# @denizen-build DEV-670
# @script-version 1.0
#
# Installation:
# 1. Put the script in your scripts folder.
# 2. Edit the config script below to your liking.
# 3. Reload
#
# Usage:
# Type "/sidebar" in-game to toggle the sidebar on or off.
#
# ---------------------------- END HEADER ----------------------------

# ------------------------- Begin configuration -------------------------
magic_sidebar_config:
    type: yaml data
    # How many updates per second (acceptable values: 1, 2, 4, 5, 10)
    per_second: 5
    # Set this to your sidebar title.
    title: <&b><&l>Player Info
    # Set this to the list of sidebar lines you want to display.
    # Start a line with "[scroll:#/#]" to make it automatically scroll
    # with a specified width and scroll speed (characters shifted per second).
    # Note that width must always be less than the line's actual length.
    # There should also be at least one normal line that's as wide as the width, to prevent the sidebar resizing constantly.
    lines:
    - "[scroll:20/5]<&a>Welcome to <&6>my server<&a>, <&b><player.name><&a>!"
    - "<&8>-----------------------"
    - "Ping: <&b><player.ping>"
    - "Location: <&b><player.location.simple.before_last[,].replace[,].with[<&f>,<&b>]>"
    - "Online Players: <&b><server.list_online_players.size><&f>/<&b><server.max_players>"
# ------------------------- End of configuration -------------------------

magic_sidebar_world:
    type: world
    debug: false
    events:
        on delta time secondly:
        - define per_second <script[magic_sidebar_config].yaml_key[per_second]>
        - define wait_time <el@1.div[<def[per_second]>]>s
        - define players <server.list_online_players.filter[has_flag[sidebar_disabled].not]>
        - define title <script[magic_sidebar_config].yaml_key[title]>
        - repeat <def[per_second]>:
            - sidebar title:<parse:<def[title]>> values:<proc[magic_sidebar_lines_proc]> players:<def[players]> per_player
            - wait <def[wait_time]>

magic_sidebar_lines_proc:
    type: procedure
    debug: false
    script:
    - define list <script[magic_sidebar_config].yaml_key[lines]>
    - foreach <def[list]> as:line:
        - define list_index <def[loop_index]>
        - define line <parse:<def[line]>>
        - if <def[line].starts_with[<&lb>scroll<&co>]>:
            - define width <def[line].after[<&co>].before[/]>
            - define rate <def[line].after[/].before[<&rb>]>
            - define line <def[line].after[<&rb>]>
            - define index <server.current_time_millis.div[1000].mul[<def[rate]>].round.mod[<def[line].strip_color.length>].add[1]>
            - define end <def[index].add[<def[width]>]>
            - repeat <def[line].length> as:charpos:
                - if <def[line].char_at[<def[charpos]>]> == <&ss>:
                    - define index <def[index].add[2]>
                - if <def[index]> <= <def[charpos]>:
                    - repeat stop
            - define start_color <def[line].substring[0,<def[index]>].last_color>
            - if <def[end]> > <def[line].strip_color.length>:
                - define end <def[end].sub[<def[line].strip_color.length>]>
                - repeat <def[line].length> as:charpos:
                    - if <def[line].char_at[<def[charpos]>]> == <&ss>:
                        - define end <def[end].add[2]>
                    - if <def[end]> < <def[charpos]>:
                        - repeat stop
                - define line "<def[start_color]><def[line].substring[<def[index]>]> <&f><def[line].substring[0,<def[end]>]>"
            - else:
                - repeat <def[line].length> as:charpos:
                    - if <def[line].char_at[<def[charpos]>]> == <&ss>:
                        - define end <def[end].add[2]>
                    - if <def[end]> < <def[charpos]>:
                        - repeat stop
                - define line "<def[start_color]><def[line].substring[<def[index]>,<def[end]>]>"
        - define list <def[list].set[<def[line]>].at[<def[list_index]>]>
    - determine <def[list]>

magic_sidebar_command:
    type: command
    debug: false
    name: sidebar
    usage: /sidebar
    description: Toggles your sidebar on or off.
    script:
    - if <player.has_flag[sidebar_disabled]>:
        - flag player sidebar_disabled:!
        - narrate "<&b>Sidebar enabled."
    - else:
        - flag player sidebar_disabled
        - narrate "<&b>Sidebar disabled."
        - wait 1
        - sidebar remove players:<player>