# # Utility for creating menus with click handlers on them. # It also provides a way to make paged menus more easily. # # opens a menu with a title, of size, based on the contents. # the size must be a multiple of 9 # # the contents should be a map pairing the slot to three keys # the 'item' key is the item's display in the menu # the 'script' key is the script to call when clicked # the 'definitions' key is a map pairing definition name to value # if the script is null, then no script is called on interaction # if the definitions are null, the script is called without definitions # at the end, after opening, this task determines the opened inventory. # # the fill argument can be ommitted, or is an item which fills any # slots not specified in the contents map menu_open: debug: false type: task definitions: player|title|size|contents|fill script: - define display_key ].remove[1].parse_tag[<&ss><[parse_value]><&sp>].separated_by[]> - define inventory <[display_key]>;size=<[size]>]]> # fill - foreach <[contents]> key:slot as:data: - define item <[data].get[item].if_null[null]> # bad item - if <[item]> == null: - foreach next # fit other data - define script <[data].get[script].if_null[null]> - define definitions <[data].get[definitions].if_null[null]> # flag item accordingly - if <[script]> != null: - flag <[item]> _menu_script:<[script]> - if <[definitions]> != null: - flag <[item]> _menu_definitions:<[definitions]> # set in inventory - inventory set slot:<[slot]> origin:<[item]> destination:<[inventory]> # has fill attribute? - if <[fill].if_null[null]> != null: - repeat <[size]> as:slot: - if !<[contents].contains[<[slot]>]>: - inventory set slot:<[slot]> origin:<[fill]> destination:<[inventory]> # open inventory and return - inventory open player:<[player]> destination:<[inventory]> - determine <[inventory]> # checks if the passed menu parameter is actually # a menu or not based on its display key menu_is: debug: false type: procedure definitions: inventory script: - if <[inventory].title.length.sub[22]> < 1: - determine false - define display_key <[inventory].title.substring[<[inventory].title.length.sub[22]>].replace[<&sp>].with[].from_secret_colors> - determine <[display_key].equals[menu]> # determines the title of a menu ignoring its display key # this also strips any colors to avoid annoyances # useful for other handlers elsewhere menu_title: debug: false type: procedure definitions: inventory script: - determine <[inventory].title.substring[0,<[inventory].title.length.sub[25]>].strip_color.if_null[Unknown]> # handles basic clicks in menu inventories menu_click_handler: debug: false type: world events: on player clicks item in inventory: # ignore non-gui clicks ## as of 1.20.4 - if != CHEST: - stop # ignore non menus - if !]>: - stop # valid menu, stop all events - determine cancelled passively # ignore out of bounds clicks - if > : - stop # handle click if any - define script - if <[script]> != null: - define definitions - if <[definitions]> == null: # run plain script - run <[script]> - else: # run scripts with definitions - run <[script]> defmap:<[definitions]>