From 106735a2901b66cc33a277e81a70fc4a1f5f220c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sirger=20T=C3=BCnde-Maria?= <161933192+sirgertunde@users.noreply.github.com> Date: Sun, 30 Nov 2025 01:06:39 +0200 Subject: [PATCH 1/3] Done settings get and set --- scripts/settings/settings_config.dsc | 40 +++++++++++++++++++++++ scripts/settings/settings_tasks.dsc | 49 ++++++++++++++++++++++++++++ 2 files changed, 89 insertions(+) create mode 100644 scripts/settings/settings_config.dsc create mode 100644 scripts/settings/settings_tasks.dsc diff --git a/scripts/settings/settings_config.dsc b/scripts/settings/settings_config.dsc new file mode 100644 index 0000000..2d157f3 --- /dev/null +++ b/scripts/settings/settings_config.dsc @@ -0,0 +1,40 @@ +settings_config: + debug: false + type: data + tabs: + - General + - Miscellaneous + keys: + example1.key: + tab: General + name: example1 setting key + description: example1 description, Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit... + type: boolean + default: true + example2.key: + tab: General + name: example2 setting key + description: example2 description, Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit... + type: number + default: 5 + min: 0 + max: 10 + increment: 0.5 + example3.key: + tab: Miscellaneous + name: example3 setting key + description: example3 description, Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit... + type: list + default: male + values: + - male + - female + - prefer not to say + example4.key: + tab: Miscellaneous + name: example4 setting key + description: example4 description, Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit... + type: text + default: text + max-length: 64 + regex: [a-z] diff --git a/scripts/settings/settings_tasks.dsc b/scripts/settings/settings_tasks.dsc new file mode 100644 index 0000000..89cc173 --- /dev/null +++ b/scripts/settings/settings_tasks.dsc @@ -0,0 +1,49 @@ +settings_set: + debug: false + type: task + definitions: player|key|value + script: + - define keys + - if !<[keys].contains[<[key]>]>: + - determine "Key not found: <[key]>" + - if <[value]> == null: + - determine "Value cannot be null" + - define data <[keys].get[<[key]>]> + - define type <[data].get[type]> + - choose <[type].to_lowercase>: + - case boolean: + - if <[value]> != true && <[value]> != false: + - determine "Value must be true or false" + - case number: + - define min <[data].get[min]> + - define max <[data].get[max]> + - if <[value]> < <[min]> || <[value]> > <[max]>: + - determine "Value must be between <[min]> and <[max]>" + - case list: + - define values <[data].get[values]> + - if !<[values].contains[<[value]>]>: + - determine "Value must be one of the following: <[values].formatted>" + - case text: + - define max_length <[data].get[max-length]> + - define regex <[data].get[regex]> + - if <[value].length> > <[max_length]>: + - determine "Value must be shorter than <[max_length]> characters" + - if !<[value].regex_matches[<[regex]>]>: + - determine "Value should match the regex <[regex]>" + - default: + - determine "Unknown type <[type]>" + - define settings <[player].flag[settings].if_null[]> + - define settings <[settings].with[<[key]>].as[<[value]>]> + - flag <[player]> settings:<[settings]> + +settings_get: + debug: false + type: procedure + definitions: player|key + script: + - define keys + - if !<[keys].contains[<[key]>]>: + - determine null + - define settings <[player].flag[settings].if_null[]> + - define value <[settings].get[<[key]>].if_null[<[keys].get[<[key]>].get[default]>]> + - determine <[value]> From 8f6dfd4398adb8975f01d48206565473729f3254 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sirger=20T=C3=BCnde-Maria?= <161933192+sirgertunde@users.noreply.github.com> Date: Tue, 2 Dec 2025 01:23:58 +0200 Subject: [PATCH 2/3] Added menu gui only --- scripts/settings/settings_config.dsc | 32 +++++++++-- scripts/settings/settings_tasks.dsc | 79 ++++++++++++++++++++++++++++ 2 files changed, 107 insertions(+), 4 deletions(-) diff --git a/scripts/settings/settings_config.dsc b/scripts/settings/settings_config.dsc index 2d157f3..863fc9c 100644 --- a/scripts/settings/settings_config.dsc +++ b/scripts/settings/settings_config.dsc @@ -5,13 +5,13 @@ settings_config: - General - Miscellaneous keys: - example1.key: + example1_key: tab: General name: example1 setting key description: example1 description, Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit... type: boolean default: true - example2.key: + example2_key: tab: General name: example2 setting key description: example2 description, Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit... @@ -20,7 +20,7 @@ settings_config: min: 0 max: 10 increment: 0.5 - example3.key: + example3_key: tab: Miscellaneous name: example3 setting key description: example3 description, Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit... @@ -30,7 +30,7 @@ settings_config: - male - female - prefer not to say - example4.key: + example4_key: tab: Miscellaneous name: example4 setting key description: example4 description, Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit... @@ -38,3 +38,27 @@ settings_config: default: text max-length: 64 regex: [a-z] + example5_key: + tab: Miscellaneous + name: example5 setting key + description: example5 description, Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit... + type: text + default: text + max-length: 64 + regex: [a-z] + example6_key: + tab: Miscellaneous + name: example6 setting key + description: example6 description, Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit... + type: text + default: text + max-length: 64 + regex: [a-z] + example7_key: + tab: Miscellaneous + name: example7 setting key + description: example7 description, Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit... + type: text + default: text + max-length: 64 + regex: [a-z] diff --git a/scripts/settings/settings_tasks.dsc b/scripts/settings/settings_tasks.dsc index 89cc173..ef051dc 100644 --- a/scripts/settings/settings_tasks.dsc +++ b/scripts/settings/settings_tasks.dsc @@ -47,3 +47,82 @@ settings_get: - define settings <[player].flag[settings].if_null[]> - define value <[settings].get[<[key]>].if_null[<[keys].get[<[key]>].get[default]>]> - determine <[value]> + +settings_all_settings_from_tab: + debug: false + type: procedure + definitions: tab + script: + - define keys + - define keys_in_tab <[keys].keys.filter_tag[<[keys].get[<[filter_value]>].get[tab].equals[<[tab]>]>]> + - determine <[keys_in_tab]> + +settings_all_settings_from_page_from_tab: + debug: false + type: procedure + definitions: tab|page + script: + - define keys_in_tab ]> + - define start_index <[page].mul[4].add[1]> + - define end_index <[page].add[1].mul[4]> + - determine <[keys_in_tab].get[<[start_index]>].to[<[end_index]>]> + +settings_menu_is_last_page: + debug: false + type: procedure + definitions: tab|page + script: + - define keys_in_tab ]> + - define end_index <[page].add[1].mul[4]> + - determine <[end_index].is_more_than_or_equal_to[<[keys_in_tab].size>]> + +settings_menu: + debug: false + type: task + definitions: player|tab|page + script: + - define keys + - define tabs + - define tab <[tab].if_null[<[tabs].get[1]>]> + - define page <[page].if_null[0]> + - define contents + - if <[page]> > 0: + - define previous_button <<><<>]]> + - definemap content_entry: + 49: + item: <[previous_button]> + script: settings_menu + definitions: + player: <[player]> + tab: <[tab]> + page: <[page].sub[1]> + - define contents <[contents].include[<[content_entry]>]> + - if !|<[page]>]>: + - define next_button <>><>>]]> + - definemap content_entry: + 51: + item: <[next_button]> + script: settings_menu + definitions: + player: <[player]> + tab: <[tab]> + page: <[page].add[1]> + - define contents <[contents].include[<[content_entry]>]> + - foreach <[tabs]> as:t: + - define tab_button <[t]>]]> + - definemap content_entry_value: + item: <[tab_button]> + script: settings_menu + definitions: + player: <[player]> + tab: <[t]> + page: 0 + - define content_entry ].as[<[content_entry_value]>]> + - define contents <[contents].include[<[content_entry]>]> + - foreach |<[page]>]> as:setting_key: + - define setting_item <[keys].get[<[setting_key]>].get[name]>]]> + - definemap content_entry_value: + item: <[setting_item]> + - define content_entry ].as[<[content_entry_value]>]> + - define contents <[contents].include[<[content_entry]>]> + - run menu_open def.player:<[player]> def.title:Settings def.size:54 def.contents:<[contents]> From 56e1d4452d50c4a7a8087f01d229cb3a05394051 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sirger=20T=C3=BCnde-Maria?= <161933192+sirgertunde@users.noreply.github.com> Date: Fri, 19 Dec 2025 00:34:00 +0200 Subject: [PATCH 3/3] Completed settings feature --- scripts/settings/settings_commands.dsc | 12 ++ scripts/settings/settings_config.dsc | 8 +- scripts/settings/settings_tasks.dsc | 226 ++++++++++++++++++++--- scripts/tabcomplete/tabcomplete_data.dsc | 1 + 4 files changed, 220 insertions(+), 27 deletions(-) create mode 100644 scripts/settings/settings_commands.dsc diff --git a/scripts/settings/settings_commands.dsc b/scripts/settings/settings_commands.dsc new file mode 100644 index 0000000..23c751d --- /dev/null +++ b/scripts/settings/settings_commands.dsc @@ -0,0 +1,12 @@ +settings_command_settings: + debug: false + type: command + name: settings + usage: /settings + description: Opens the settings menu. + permission: settings.command.settings + script: + - if != player: + - narrate "<&c>Please run this command as a player." + - stop + - run settings_menu def.player: \ No newline at end of file diff --git a/scripts/settings/settings_config.dsc b/scripts/settings/settings_config.dsc index 863fc9c..e1fdda6 100644 --- a/scripts/settings/settings_config.dsc +++ b/scripts/settings/settings_config.dsc @@ -37,7 +37,7 @@ settings_config: type: text default: text max-length: 64 - regex: [a-z] + regex: "[a-z]+" example5_key: tab: Miscellaneous name: example5 setting key @@ -45,7 +45,7 @@ settings_config: type: text default: text max-length: 64 - regex: [a-z] + regex: "[a-z]+" example6_key: tab: Miscellaneous name: example6 setting key @@ -53,7 +53,7 @@ settings_config: type: text default: text max-length: 64 - regex: [a-z] + regex: "[a-z]+" example7_key: tab: Miscellaneous name: example7 setting key @@ -61,4 +61,4 @@ settings_config: type: text default: text max-length: 64 - regex: [a-z] + regex: "[a-z]+" diff --git a/scripts/settings/settings_tasks.dsc b/scripts/settings/settings_tasks.dsc index ef051dc..e1be9fb 100644 --- a/scripts/settings/settings_tasks.dsc +++ b/scripts/settings/settings_tasks.dsc @@ -76,6 +76,43 @@ settings_menu_is_last_page: - define end_index <[page].add[1].mul[4]> - determine <[end_index].is_more_than_or_equal_to[<[keys_in_tab].size>]> +settings_menu_set_non_text: + debug: false + type: task + definitions: player|key|value|tab|page + script: + - run settings_set def.player:<[player]> def.key:<[key]> def.value:<[value]> save:result + - define error + - if <[error]> == null: + - run settings_menu def.player:<[player]> def.tab:<[tab]> def.page:<[page]> + - else: + - narrate targets:<[player]> <&c><[error]> + +settings_menu_set_text_callback: + debug: false + type: task + definitions: player|input + script: + - define temp_state <[player].flag[settings_menu_temp_state]> + - run settings_set def.player:<[player]> def.key:<[temp_state].get[key]> def.value:<[input]> save:result + - define error + - if <[error]> != null: + - narrate targets:<[player]> <&c><[error]> + - wait 1t + - run settings_menu def.player:<[player]> def.tab:<[temp_state].get[tab]> def.page:<[temp_state].get[page]> + +settings_menu_set_text_helper: + debug: false + type: task + definitions: player|key|tab|page + script: + - definemap temp_state: + key: <[key]> + tab: <[tab]> + page: <[page]> + - flag <[player]> settings_menu_temp_state:<[temp_state]> + - run anvil_input def.player:<[player]> "def.prompt:New value" def.callback:settings_menu_set_text_callback + settings_menu: debug: false type: task @@ -87,27 +124,47 @@ settings_menu: - define page <[page].if_null[0]> - define contents - if <[page]> > 0: - - define previous_button <<><<>]]> - - definemap content_entry: - 49: - item: <[previous_button]> - script: settings_menu - definitions: - player: <[player]> - tab: <[tab]> - page: <[page].sub[1]> - - define contents <[contents].include[<[content_entry]>]> + - inject settings_menu_previous_page - if !|<[page]>]>: - - define next_button <>><>>]]> - - definemap content_entry: - 51: - item: <[next_button]> - script: settings_menu - definitions: - player: <[player]> - tab: <[tab]> - page: <[page].add[1]> - - define contents <[contents].include[<[content_entry]>]> + - inject settings_menu_next_page + - inject settings_menu_render_tabs + - inject settings_menu_render_settings + - run menu_open def.player:<[player]> def.title:<&f>邑邑邑邑酕<&a><&sp><&b><&sp><&c><&sp> def.size:54 def.contents:<[contents]> + +settings_menu_previous_page: + debug: false + type: task + script: + - define previous_button <<><<>]]> + - definemap content_entry: + 49: + item: <[previous_button]> + script: settings_menu + definitions: + player: <[player]> + tab: <[tab]> + page: <[page].sub[1]> + - define contents <[contents].include[<[content_entry]>]> + +settings_menu_next_page: + debug: false + type: task + script: + - define next_button <>><>>]]> + - definemap content_entry: + 51: + item: <[next_button]> + script: settings_menu + definitions: + player: <[player]> + tab: <[tab]> + page: <[page].add[1]> + - define contents <[contents].include[<[content_entry]>]> + +settings_menu_render_tabs: + debug: false + type: task + script: - foreach <[tabs]> as:t: - define tab_button <[t]>]]> - definemap content_entry_value: @@ -119,10 +176,133 @@ settings_menu: page: 0 - define content_entry ].as[<[content_entry_value]>]> - define contents <[contents].include[<[content_entry]>]> + +settings_menu_render_settings: + debug: false + type: task + script: - foreach |<[page]>]> as:setting_key: - - define setting_item <[keys].get[<[setting_key]>].get[name]>]]> + - define setting_item <[keys].get[<[setting_key]>].get[name]>;lore=<[keys].get[<[setting_key]>].get[description].split_lines_by_width[128].split[<&nl>].parse_tag[<&7><[parse_value]>]>]]> - definemap content_entry_value: item: <[setting_item]> - - define content_entry ].as[<[content_entry_value]>]> + - define position <[loop_index].mul[9].add[1]> + - define content_entry ].as[<[content_entry_value]>]> + - define data <[keys].get[<[setting_key]>]> + - define type <[data].get[type]> + - choose <[type].to_lowercase>: + - case boolean: + - inject settings_menu_render_settings_boolean + - case number: + - inject settings_menu_render_settings_number + - case list: + - inject settings_menu_render_settings_list + - case text: + - inject settings_menu_render_settings_text + - default: + - debug error "Unknown setting type for <[setting_key]>" + - stop - define contents <[contents].include[<[content_entry]>]> - - run menu_open def.player:<[player]> def.title:Settings def.size:54 def.contents:<[contents]> + +settings_menu_render_settings_boolean: + debug: false + type: task + script: + - define value |<[setting_key]>]> + - define boolean_value_button ].pass[On]]>].fail[Off]]>]> + - definemap content_entry_value: + item: <[boolean_value_button]> + script: settings_menu_set_non_text + definitions: + player: <[player]> + key: <[setting_key]> + value: <[value].not> + tab: <[tab]> + page: <[page]> + - define content_entry <[content_entry].with[<[position].add[8]>].as[<[content_entry_value]>]> + +settings_menu_render_settings_number: + debug: false + type: task + script: + - define value |<[setting_key]>]> + - define increment <[data].get[increment]> + - define decrement_button -<[increment]>]]> + - define increment_button +<[increment]>]]> + - define value_item <[value]>]]> + - definemap content_entry_value: + item: <[decrement_button]> + script: settings_menu_set_non_text + definitions: + player: <[player]> + key: <[setting_key]> + value: <[value].sub[<[increment]>]> + tab: <[tab]> + page: <[page]> + - define content_entry <[content_entry].with[<[position].add[6]>].as[<[content_entry_value]>]> + - definemap content_entry_value: + item: <[increment_button]> + script: settings_menu_set_non_text + definitions: + player: <[player]> + key: <[setting_key]> + value: <[value].add[<[increment]>]> + tab: <[tab]> + page: <[page]> + - define content_entry <[content_entry].with[<[position].add[8]>].as[<[content_entry_value]>]> + - definemap content_entry_value: + item: <[value_item]> + - define content_entry <[content_entry].with[<[position].add[7]>].as[<[content_entry_value]>]> + +settings_menu_render_settings_list: + debug: false + type: task + script: + - define value |<[setting_key]>]> + - define values <[data].get[values]> + - define index <[values].find[<[value]>]> + - define previous_button Previous]]> + - define next_button Next]]> + - define value_item <[value]>]]> + - definemap content_entry_value: + item: <[previous_button]> + script: settings_menu_set_non_text + definitions: + player: <[player]> + key: <[setting_key]> + value: ].pass[<[values].get[-1]>].fail[<[values].get[<[index].sub[1]>]>]> + tab: <[tab]> + page: <[page]> + - define content_entry <[content_entry].with[<[position].add[6]>].as[<[content_entry_value]>]> + - definemap content_entry_value: + item: <[next_button]> + script: settings_menu_set_non_text + definitions: + player: <[player]> + key: <[setting_key]> + value: ]>].pass[<[values].get[1]>].fail[<[values].get[<[index].add[1]>]>]> + tab: <[tab]> + page: <[page]> + - define content_entry <[content_entry].with[<[position].add[8]>].as[<[content_entry_value]>]> + - definemap content_entry_value: + item: <[value_item]> + - define content_entry <[content_entry].with[<[position].add[7]>].as[<[content_entry_value]>]> + +settings_menu_render_settings_text: + debug: false + type: task + script: + - define value |<[setting_key]>]> + - define value_item <[value]>]]> + - define change_button Change]]> + - definemap content_entry_value: + item: <[change_button]> + script: settings_menu_set_text_helper + definitions: + player: <[player]> + key: <[setting_key]> + tab: <[tab]> + page: <[page]> + - define content_entry <[content_entry].with[<[position].add[8]>].as[<[content_entry_value]>]> + - definemap content_entry_value: + item: <[value_item]> + - define content_entry <[content_entry].with[<[position].add[7]>].as[<[content_entry_value]>]> \ No newline at end of file diff --git a/scripts/tabcomplete/tabcomplete_data.dsc b/scripts/tabcomplete/tabcomplete_data.dsc index 4fabf9e..2252cd3 100644 --- a/scripts/tabcomplete/tabcomplete_data.dsc +++ b/scripts/tabcomplete/tabcomplete_data.dsc @@ -76,3 +76,4 @@ tabcomplete_config: - chatcolor - spawn - profiles + - settings