From 6fa12180a48851e15707eacd4648d3646fb99ace Mon Sep 17 00:00:00 2001 From: Moxvallix Date: Fri, 21 Oct 2022 19:13:43 +1030 Subject: [PATCH] initial commit --- LICENSE.md | 157 ++++++++++++++++++ README.md | 83 +++++++++ data/gui/functions/api/render.mcfunction | 1 + data/gui/functions/api/reset.mcfunction | 4 + data/gui/functions/api/select.mcfunction | 2 + data/gui/functions/cleanup/reset.mcfunction | 2 + data/gui/functions/common/cleanup.mcfunction | 4 + data/gui/functions/common/setup.mcfunction | 3 + data/gui/functions/init.mcfunction | 1 + data/gui/functions/init/config.mcfunction | 2 + data/gui/functions/load.mcfunction | 4 + data/gui/functions/objectives.mcfunction | 5 + data/gui/functions/render/blank.mcfunction | 1 + data/gui/functions/render/display.mcfunction | 1 + .../display/enderchest/blank.mcfunction | 27 +++ .../render/display/enderchest/item.mcfunction | 27 +++ .../functions/render/entity/kill.mcfunction | 2 + .../functions/render/entity/summon.mcfunction | 2 + data/gui/functions/render/init.mcfunction | 11 ++ data/gui/functions/render/item.mcfunction | 10 ++ data/gui/functions/render/iterate.mcfunction | 12 ++ data/gui/functions/select/get.mcfunction | 1 + .../select/get/enderchest/slot.mcfunction | 29 ++++ data/gui/functions/select/init.mcfunction | 10 ++ data/gui/functions/select/iterate.mcfunction | 9 + data/gui/functions/select/slot.mcfunction | 6 + data/gui/functions/version.mcfunction | 7 + data/gui/functions/warnings/404.mcfunction | 1 + data/gui/item_modifiers/render/item.json | 24 +++ data/gui/loot_tables/config/empty.json | 13 ++ data/gui/loot_tables/empty.json | 23 +++ data/gui/tags/functions/cleanup.json | 5 + data/gui/tags/functions/index.json | 3 + data/gui/tags/functions/render/item.json | 3 + data/gui/tags/functions/render/slot.json | 3 + data/gui/tags/functions/select/slot.json | 3 + data/minecraft/tags/functions/load.json | 5 + data/minecraft/tags/functions/tick.json | 5 + pack.mcmeta | 6 + 39 files changed, 517 insertions(+) create mode 100644 LICENSE.md create mode 100644 README.md create mode 100644 data/gui/functions/api/render.mcfunction create mode 100644 data/gui/functions/api/reset.mcfunction create mode 100644 data/gui/functions/api/select.mcfunction create mode 100644 data/gui/functions/cleanup/reset.mcfunction create mode 100644 data/gui/functions/common/cleanup.mcfunction create mode 100644 data/gui/functions/common/setup.mcfunction create mode 100644 data/gui/functions/init.mcfunction create mode 100644 data/gui/functions/init/config.mcfunction create mode 100644 data/gui/functions/load.mcfunction create mode 100644 data/gui/functions/objectives.mcfunction create mode 100644 data/gui/functions/render/blank.mcfunction create mode 100644 data/gui/functions/render/display.mcfunction create mode 100644 data/gui/functions/render/display/enderchest/blank.mcfunction create mode 100644 data/gui/functions/render/display/enderchest/item.mcfunction create mode 100644 data/gui/functions/render/entity/kill.mcfunction create mode 100644 data/gui/functions/render/entity/summon.mcfunction create mode 100644 data/gui/functions/render/init.mcfunction create mode 100644 data/gui/functions/render/item.mcfunction create mode 100644 data/gui/functions/render/iterate.mcfunction create mode 100644 data/gui/functions/select/get.mcfunction create mode 100644 data/gui/functions/select/get/enderchest/slot.mcfunction create mode 100644 data/gui/functions/select/init.mcfunction create mode 100644 data/gui/functions/select/iterate.mcfunction create mode 100644 data/gui/functions/select/slot.mcfunction create mode 100644 data/gui/functions/version.mcfunction create mode 100644 data/gui/functions/warnings/404.mcfunction create mode 100644 data/gui/item_modifiers/render/item.json create mode 100644 data/gui/loot_tables/config/empty.json create mode 100644 data/gui/loot_tables/empty.json create mode 100644 data/gui/tags/functions/cleanup.json create mode 100644 data/gui/tags/functions/index.json create mode 100644 data/gui/tags/functions/render/item.json create mode 100644 data/gui/tags/functions/render/slot.json create mode 100644 data/gui/tags/functions/select/slot.json create mode 100644 data/minecraft/tags/functions/load.json create mode 100644 data/minecraft/tags/functions/tick.json create mode 100644 pack.mcmeta diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..0927556 --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,157 @@ +### GNU LESSER GENERAL PUBLIC LICENSE + +Version 3, 29 June 2007 + +Copyright (C) 2007 Free Software Foundation, Inc. + + +Everyone is permitted to copy and distribute verbatim copies of this +license document, but changing it is not allowed. + +This version of the GNU Lesser General Public License incorporates the +terms and conditions of version 3 of the GNU General Public License, +supplemented by the additional permissions listed below. + +#### 0. Additional Definitions. + +As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the +GNU General Public License. + +"The Library" refers to a covered work governed by this License, other +than an Application or a Combined Work as defined below. + +An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + +A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + +The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + +The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + +#### 1. Exception to Section 3 of the GNU GPL. + +You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + +#### 2. Conveying Modified Versions. + +If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + +- a) under this License, provided that you make a good faith effort + to ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or +- b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + +#### 3. Object Code Incorporating Material from Library Header Files. + +The object code form of an Application may incorporate material from a +header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + +- a) Give prominent notice with each copy of the object code that + the Library is used in it and that the Library and its use are + covered by this License. +- b) Accompany the object code with a copy of the GNU GPL and this + license document. + +#### 4. Combined Works. + +You may convey a Combined Work under terms of your choice that, taken +together, effectively do not restrict modification of the portions of +the Library contained in the Combined Work and reverse engineering for +debugging such modifications, if you also do each of the following: + +- a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. +- b) Accompany the Combined Work with a copy of the GNU GPL and this + license document. +- c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. +- d) Do one of the following: + - 0) Convey the Minimal Corresponding Source under the terms of + this License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + - 1) Use a suitable shared library mechanism for linking with + the Library. A suitable mechanism is one that (a) uses at run + time a copy of the Library already present on the user's + computer system, and (b) will operate properly with a modified + version of the Library that is interface-compatible with the + Linked Version. +- e) Provide Installation Information, but only if you would + otherwise be required to provide such information under section 6 + of the GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the Application + with a modified version of the Linked Version. (If you use option + 4d0, the Installation Information must accompany the Minimal + Corresponding Source and Corresponding Application Code. If you + use option 4d1, you must provide the Installation Information in + the manner specified by section 6 of the GNU GPL for conveying + Corresponding Source.) + +#### 5. Combined Libraries. + +You may place library facilities that are a work based on the Library +side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + +- a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities, conveyed under the terms of this License. +- b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + +#### 6. Revised Versions of the GNU Lesser General Public License. + +The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +as you received it specifies that a certain numbered version of the +GNU Lesser General Public License "or any later version" applies to +it, you have the option of following the terms and conditions either +of that published version or of any later version published by the +Free Software Foundation. If the Library as you received it does not +specify a version number of the GNU Lesser General Public License, you +may choose any version of the GNU Lesser General Public License ever +published by the Free Software Foundation. + +If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/README.md b/README.md new file mode 100644 index 0000000..b03d5db --- /dev/null +++ b/README.md @@ -0,0 +1,83 @@ +# Moxvallix's GUI Lib +## Making Datapack GUIs easier + +**Moxvallix's GUI Lib relies on [Taglib](https://github.com/HeDeAnTheonlyone/Taglib)** +**Taglib comes packaged in the Releases, but is not kept in the source** + +This datapack automates much of hard parts of GUI development. +It is data driven, meaning it renders the GUI based on a template stored in data storage. + +Currently, it only supports an Enderchest UI. However, plans for other UI types are in the works. + +One benefit of this GUI system, being data driven, means that making generators for GUIs should be fairly easy. +I however have not created one yet. + +### Getting Started +#### Overview +There are two main functions: `gui:api/render` and `gui:api/select`. +Render will draw the gui, based on the page id, and select will run any clicks in the GUI. + +All other functions are to be considered private, and running them yourself is not recommended. + +The select function should be run as the player, on a loop, whenever the GUI should be active. +If you wanted the GUI always active, you could set it to run as @a from your tick function. + +#### Making an Index +For your GUI to work, you will need an index function. +Such a function, when run, will take in `@s` score of `gui.page`, and will set the correct template data for that page. + +It is recommended that you set the template data within a separate function, and that index merely calls said function. + +*An example index function* +``` +execute if score @s gui.page matches 1 run function pack:gui/menu +execute if score @s gui.page matches 2 run function pack:gui/options +execute if score @s gui.page matches 3 run function pack:gui/shop +``` + +You will then need to register your index function to run in the index tag. Add it to the `gui:index` function tag. +``` +{ + "values": [ + "pack:gui/index" + ] +} +``` + +#### Making a Template +Now we can create GUI templates. These will be functions that the index will run. + +*An example template function (pack:gui/menu)* +``` +data modify storage gui:page template set value [{slot:12b,page:2s,item:{id:"minecraft:redstone_dust"}},{slot:14b,page:3s,item:{id:"minecraft:chest"}}] +``` +The above menu template would render two items to the GUI, one in slot 12, the other in slot 14. +Slot 12: + - has page:2s, would render `pack:gui/options` when clicked + - has an item tag, setting the item to `redstone_dust` +Slot 14: + - has page:3s, would render `pack:gui/shop` when clicked + - has an item tag, setting the item to `chest` + +If you want to try it out, make sure to set your `gui.page` score to 1, then run either `gui:api/render`, or +have `gui:api/select` on loop as described above. + +#### Manipulate Slots as they Render +Sometimes, you will want to manipulate slots as they render, such that you can have dynamic menus. +You can add any custom tags you like to the slots in your template data, as long as the `slot` tag is defined. + +Every time a slot is going to be rendered, it first calls the `gui:render/slot` function tag. +You can add a custom function to this tag, in order to manipulate the slot data. + +The current slot data will be available to be manipulated from the data storage `gui:slot current`. + +Render will also call the function tag `gui:render/item`, with @s being a temporary armor stand, +and the current item being rendered in its mainhand. This will allow for item modifiers to be run. + +#### Custom Functionality on Selection +Another key part of a gui is being able to run custom functions when a particular slot is selected. + +Whenever a slot is selected, it calls the `gui:select/slot` function tag, +as the player that selected the slot. + +You will then be able to read the selected slot from the data storage `gui:slot current`. \ No newline at end of file diff --git a/data/gui/functions/api/render.mcfunction b/data/gui/functions/api/render.mcfunction new file mode 100644 index 0000000..ccb933a --- /dev/null +++ b/data/gui/functions/api/render.mcfunction @@ -0,0 +1 @@ +execute unless data storage gui:private {lock:true} run function gui:render/init \ No newline at end of file diff --git a/data/gui/functions/api/reset.mcfunction b/data/gui/functions/api/reset.mcfunction new file mode 100644 index 0000000..ac77e5c --- /dev/null +++ b/data/gui/functions/api/reset.mcfunction @@ -0,0 +1,4 @@ +# Reset data in case of stuck lock + +function gui:cleanup/reset +data remove storage gui:private lock \ No newline at end of file diff --git a/data/gui/functions/api/select.mcfunction b/data/gui/functions/api/select.mcfunction new file mode 100644 index 0000000..8d4f4b5 --- /dev/null +++ b/data/gui/functions/api/select.mcfunction @@ -0,0 +1,2 @@ +execute store success score @s gui.select run clear @s #taglib:all{gui:true} +execute if score @s gui.select matches 1.. unless data storage gui:private {lock:true} run function gui:select/init \ No newline at end of file diff --git a/data/gui/functions/cleanup/reset.mcfunction b/data/gui/functions/cleanup/reset.mcfunction new file mode 100644 index 0000000..ec27436 --- /dev/null +++ b/data/gui/functions/cleanup/reset.mcfunction @@ -0,0 +1,2 @@ +data remove storage gui:page template +data remove storage gui:slot current \ No newline at end of file diff --git a/data/gui/functions/common/cleanup.mcfunction b/data/gui/functions/common/cleanup.mcfunction new file mode 100644 index 0000000..14def62 --- /dev/null +++ b/data/gui/functions/common/cleanup.mcfunction @@ -0,0 +1,4 @@ +# Remove scheduled reset as un-necessary + +schedule clear gui:api/reset +data modify storage gui:private lock set value false \ No newline at end of file diff --git a/data/gui/functions/common/setup.mcfunction b/data/gui/functions/common/setup.mcfunction new file mode 100644 index 0000000..6e6d77b --- /dev/null +++ b/data/gui/functions/common/setup.mcfunction @@ -0,0 +1,3 @@ +# Lock data, and schedule reset in case of function failure +data modify storage gui:private lock set value true +schedule function gui:api/reset 1t \ No newline at end of file diff --git a/data/gui/functions/init.mcfunction b/data/gui/functions/init.mcfunction new file mode 100644 index 0000000..3ecaf01 --- /dev/null +++ b/data/gui/functions/init.mcfunction @@ -0,0 +1 @@ +function gui:init/config \ No newline at end of file diff --git a/data/gui/functions/init/config.mcfunction b/data/gui/functions/init/config.mcfunction new file mode 100644 index 0000000..b7b77c9 --- /dev/null +++ b/data/gui/functions/init/config.mcfunction @@ -0,0 +1,2 @@ +data modify storage gui:config init set value true +data modify storage gui:config default_item set value "minecraft:black_stained_glass_pane" \ No newline at end of file diff --git a/data/gui/functions/load.mcfunction b/data/gui/functions/load.mcfunction new file mode 100644 index 0000000..5299c32 --- /dev/null +++ b/data/gui/functions/load.mcfunction @@ -0,0 +1,4 @@ +execute unless data storage gui:config {init:true} run function gui:init + +function gui:objectives +function gui:version \ No newline at end of file diff --git a/data/gui/functions/objectives.mcfunction b/data/gui/functions/objectives.mcfunction new file mode 100644 index 0000000..dee9fa2 --- /dev/null +++ b/data/gui/functions/objectives.mcfunction @@ -0,0 +1,5 @@ +scoreboard objectives add gui.page dummy +scoreboard objectives add gui.render dummy +scoreboard objectives add gui.slot dummy +scoreboard objectives add gui.select dummy +scoreboard objectives add gui.selection dummy \ No newline at end of file diff --git a/data/gui/functions/render/blank.mcfunction b/data/gui/functions/render/blank.mcfunction new file mode 100644 index 0000000..fe28926 --- /dev/null +++ b/data/gui/functions/render/blank.mcfunction @@ -0,0 +1 @@ +function gui:render/display/enderchest/blank \ No newline at end of file diff --git a/data/gui/functions/render/display.mcfunction b/data/gui/functions/render/display.mcfunction new file mode 100644 index 0000000..b894ecc --- /dev/null +++ b/data/gui/functions/render/display.mcfunction @@ -0,0 +1 @@ +function gui:render/display/enderchest/item \ No newline at end of file diff --git a/data/gui/functions/render/display/enderchest/blank.mcfunction b/data/gui/functions/render/display/enderchest/blank.mcfunction new file mode 100644 index 0000000..421459e --- /dev/null +++ b/data/gui/functions/render/display/enderchest/blank.mcfunction @@ -0,0 +1,27 @@ +loot replace entity @s enderchest.0 loot gui:empty +loot replace entity @s enderchest.1 loot gui:empty +loot replace entity @s enderchest.2 loot gui:empty +loot replace entity @s enderchest.3 loot gui:empty +loot replace entity @s enderchest.4 loot gui:empty +loot replace entity @s enderchest.5 loot gui:empty +loot replace entity @s enderchest.6 loot gui:empty +loot replace entity @s enderchest.7 loot gui:empty +loot replace entity @s enderchest.8 loot gui:empty +loot replace entity @s enderchest.9 loot gui:empty +loot replace entity @s enderchest.10 loot gui:empty +loot replace entity @s enderchest.11 loot gui:empty +loot replace entity @s enderchest.12 loot gui:empty +loot replace entity @s enderchest.13 loot gui:empty +loot replace entity @s enderchest.14 loot gui:empty +loot replace entity @s enderchest.15 loot gui:empty +loot replace entity @s enderchest.16 loot gui:empty +loot replace entity @s enderchest.17 loot gui:empty +loot replace entity @s enderchest.18 loot gui:empty +loot replace entity @s enderchest.19 loot gui:empty +loot replace entity @s enderchest.20 loot gui:empty +loot replace entity @s enderchest.21 loot gui:empty +loot replace entity @s enderchest.22 loot gui:empty +loot replace entity @s enderchest.23 loot gui:empty +loot replace entity @s enderchest.24 loot gui:empty +loot replace entity @s enderchest.25 loot gui:empty +loot replace entity @s enderchest.26 loot gui:empty \ No newline at end of file diff --git a/data/gui/functions/render/display/enderchest/item.mcfunction b/data/gui/functions/render/display/enderchest/item.mcfunction new file mode 100644 index 0000000..aea65c7 --- /dev/null +++ b/data/gui/functions/render/display/enderchest/item.mcfunction @@ -0,0 +1,27 @@ +execute if data storage gui:slot {current:{slot:0b}} run item replace entity @s enderchest.0 from entity 1674b3a8-0135-a32e-02a4-06fb01241978 weapon.mainhand +execute if data storage gui:slot {current:{slot:1b}} run item replace entity @s enderchest.1 from entity 1674b3a8-0135-a32e-02a4-06fb01241978 weapon.mainhand +execute if data storage gui:slot {current:{slot:2b}} run item replace entity @s enderchest.2 from entity 1674b3a8-0135-a32e-02a4-06fb01241978 weapon.mainhand +execute if data storage gui:slot {current:{slot:3b}} run item replace entity @s enderchest.3 from entity 1674b3a8-0135-a32e-02a4-06fb01241978 weapon.mainhand +execute if data storage gui:slot {current:{slot:4b}} run item replace entity @s enderchest.4 from entity 1674b3a8-0135-a32e-02a4-06fb01241978 weapon.mainhand +execute if data storage gui:slot {current:{slot:5b}} run item replace entity @s enderchest.5 from entity 1674b3a8-0135-a32e-02a4-06fb01241978 weapon.mainhand +execute if data storage gui:slot {current:{slot:6b}} run item replace entity @s enderchest.6 from entity 1674b3a8-0135-a32e-02a4-06fb01241978 weapon.mainhand +execute if data storage gui:slot {current:{slot:7b}} run item replace entity @s enderchest.7 from entity 1674b3a8-0135-a32e-02a4-06fb01241978 weapon.mainhand +execute if data storage gui:slot {current:{slot:8b}} run item replace entity @s enderchest.8 from entity 1674b3a8-0135-a32e-02a4-06fb01241978 weapon.mainhand +execute if data storage gui:slot {current:{slot:9b}} run item replace entity @s enderchest.9 from entity 1674b3a8-0135-a32e-02a4-06fb01241978 weapon.mainhand +execute if data storage gui:slot {current:{slot:10b}} run item replace entity @s enderchest.10 from entity 1674b3a8-0135-a32e-02a4-06fb01241978 weapon.mainhand +execute if data storage gui:slot {current:{slot:11b}} run item replace entity @s enderchest.11 from entity 1674b3a8-0135-a32e-02a4-06fb01241978 weapon.mainhand +execute if data storage gui:slot {current:{slot:12b}} run item replace entity @s enderchest.12 from entity 1674b3a8-0135-a32e-02a4-06fb01241978 weapon.mainhand +execute if data storage gui:slot {current:{slot:13b}} run item replace entity @s enderchest.13 from entity 1674b3a8-0135-a32e-02a4-06fb01241978 weapon.mainhand +execute if data storage gui:slot {current:{slot:14b}} run item replace entity @s enderchest.14 from entity 1674b3a8-0135-a32e-02a4-06fb01241978 weapon.mainhand +execute if data storage gui:slot {current:{slot:15b}} run item replace entity @s enderchest.15 from entity 1674b3a8-0135-a32e-02a4-06fb01241978 weapon.mainhand +execute if data storage gui:slot {current:{slot:16b}} run item replace entity @s enderchest.16 from entity 1674b3a8-0135-a32e-02a4-06fb01241978 weapon.mainhand +execute if data storage gui:slot {current:{slot:17b}} run item replace entity @s enderchest.17 from entity 1674b3a8-0135-a32e-02a4-06fb01241978 weapon.mainhand +execute if data storage gui:slot {current:{slot:18b}} run item replace entity @s enderchest.18 from entity 1674b3a8-0135-a32e-02a4-06fb01241978 weapon.mainhand +execute if data storage gui:slot {current:{slot:19b}} run item replace entity @s enderchest.19 from entity 1674b3a8-0135-a32e-02a4-06fb01241978 weapon.mainhand +execute if data storage gui:slot {current:{slot:20b}} run item replace entity @s enderchest.20 from entity 1674b3a8-0135-a32e-02a4-06fb01241978 weapon.mainhand +execute if data storage gui:slot {current:{slot:21b}} run item replace entity @s enderchest.21 from entity 1674b3a8-0135-a32e-02a4-06fb01241978 weapon.mainhand +execute if data storage gui:slot {current:{slot:22b}} run item replace entity @s enderchest.22 from entity 1674b3a8-0135-a32e-02a4-06fb01241978 weapon.mainhand +execute if data storage gui:slot {current:{slot:23b}} run item replace entity @s enderchest.23 from entity 1674b3a8-0135-a32e-02a4-06fb01241978 weapon.mainhand +execute if data storage gui:slot {current:{slot:24b}} run item replace entity @s enderchest.24 from entity 1674b3a8-0135-a32e-02a4-06fb01241978 weapon.mainhand +execute if data storage gui:slot {current:{slot:25b}} run item replace entity @s enderchest.25 from entity 1674b3a8-0135-a32e-02a4-06fb01241978 weapon.mainhand +execute if data storage gui:slot {current:{slot:26b}} run item replace entity @s enderchest.26 from entity 1674b3a8-0135-a32e-02a4-06fb01241978 weapon.mainhand \ No newline at end of file diff --git a/data/gui/functions/render/entity/kill.mcfunction b/data/gui/functions/render/entity/kill.mcfunction new file mode 100644 index 0000000..ccdf523 --- /dev/null +++ b/data/gui/functions/render/entity/kill.mcfunction @@ -0,0 +1,2 @@ +# kill temp armor stand with uuid of: 1674b3a8-0135-a32e-02a4-06fb01241978 +kill 1674b3a8-0135-a32e-02a4-06fb01241978 \ No newline at end of file diff --git a/data/gui/functions/render/entity/summon.mcfunction b/data/gui/functions/render/entity/summon.mcfunction new file mode 100644 index 0000000..cf72e7f --- /dev/null +++ b/data/gui/functions/render/entity/summon.mcfunction @@ -0,0 +1,2 @@ +# summon temp armor stand with uuid of: 1674b3a8-0135-a32e-02a4-06fb01241978 +execute at @s run summon armor_stand ~ ~ ~ {UUID:[I;376746920,20292398,44304123,19143032],Invulnerable:1b,Marker:1b,Invisible:1b} \ No newline at end of file diff --git a/data/gui/functions/render/init.mcfunction b/data/gui/functions/render/init.mcfunction new file mode 100644 index 0000000..fc4de2c --- /dev/null +++ b/data/gui/functions/render/init.mcfunction @@ -0,0 +1,11 @@ +function gui:common/setup + +function #gui:cleanup +function #gui:index + +execute unless data storage gui:page template run function gui:warnings/404 + +function gui:render/blank +function gui:render/iterate + +function gui:common/cleanup \ No newline at end of file diff --git a/data/gui/functions/render/item.mcfunction b/data/gui/functions/render/item.mcfunction new file mode 100644 index 0000000..97655bd --- /dev/null +++ b/data/gui/functions/render/item.mcfunction @@ -0,0 +1,10 @@ +function gui:render/entity/summon + +execute unless data storage gui:slot current.item.Count run data modify storage gui:slot current.item.Count set value 1b +execute unless data storage gui:slot current.item.id run data modify storage gui:slot current.item.id set from storage gui:config default_item + +execute store success score $named gui.slot run data get storage gui:slot current.item.tag.display.Name + +data modify entity 1674b3a8-0135-a32e-02a4-06fb01241978 HandItems[0] set from storage gui:slot current.item +item modify entity 1674b3a8-0135-a32e-02a4-06fb01241978 weapon.mainhand gui:render/item +execute as 1674b3a8-0135-a32e-02a4-06fb01241978 run function #gui:render/item \ No newline at end of file diff --git a/data/gui/functions/render/iterate.mcfunction b/data/gui/functions/render/iterate.mcfunction new file mode 100644 index 0000000..c63d6e1 --- /dev/null +++ b/data/gui/functions/render/iterate.mcfunction @@ -0,0 +1,12 @@ +data modify storage gui:slot current set from storage gui:page template[0] +data remove storage gui:page template[0] + +execute store result score $current gui.slot run data get storage gui:slot current.slot + +function #gui:render/slot +function gui:render/item +function gui:render/display +function gui:render/entity/kill + +execute store result score $size gui.render run data get storage gui:page template +execute if score $size gui.render matches 1.. run function gui:render/iterate \ No newline at end of file diff --git a/data/gui/functions/select/get.mcfunction b/data/gui/functions/select/get.mcfunction new file mode 100644 index 0000000..8d182fe --- /dev/null +++ b/data/gui/functions/select/get.mcfunction @@ -0,0 +1 @@ +function gui:select/get/enderchest/slot \ No newline at end of file diff --git a/data/gui/functions/select/get/enderchest/slot.mcfunction b/data/gui/functions/select/get/enderchest/slot.mcfunction new file mode 100644 index 0000000..e5cf967 --- /dev/null +++ b/data/gui/functions/select/get/enderchest/slot.mcfunction @@ -0,0 +1,29 @@ +scoreboard players set @s gui.selection -1 +execute unless data entity @s EnderItems[{Slot:0b}] unless data storage gui:page template[{slot:0b,empty:true}] run scoreboard players set @s gui.selection 0 +execute unless data entity @s EnderItems[{Slot:1b}] unless data storage gui:page template[{slot:1b,empty:true}] run scoreboard players set @s gui.selection 1 +execute unless data entity @s EnderItems[{Slot:2b}] unless data storage gui:page template[{slot:2b,empty:true}] run scoreboard players set @s gui.selection 2 +execute unless data entity @s EnderItems[{Slot:3b}] unless data storage gui:page template[{slot:3b,empty:true}] run scoreboard players set @s gui.selection 3 +execute unless data entity @s EnderItems[{Slot:4b}] unless data storage gui:page template[{slot:4b,empty:true}] run scoreboard players set @s gui.selection 4 +execute unless data entity @s EnderItems[{Slot:5b}] unless data storage gui:page template[{slot:5b,empty:true}] run scoreboard players set @s gui.selection 5 +execute unless data entity @s EnderItems[{Slot:6b}] unless data storage gui:page template[{slot:6b,empty:true}] run scoreboard players set @s gui.selection 6 +execute unless data entity @s EnderItems[{Slot:7b}] unless data storage gui:page template[{slot:7b,empty:true}] run scoreboard players set @s gui.selection 7 +execute unless data entity @s EnderItems[{Slot:8b}] unless data storage gui:page template[{slot:8b,empty:true}] run scoreboard players set @s gui.selection 8 +execute unless data entity @s EnderItems[{Slot:9b}] unless data storage gui:page template[{slot:9b,empty:true}] run scoreboard players set @s gui.selection 9 +execute unless data entity @s EnderItems[{Slot:10b}] unless data storage gui:page template[{slot:10b,empty:true}] run scoreboard players set @s gui.selection 10 +execute unless data entity @s EnderItems[{Slot:11b}] unless data storage gui:page template[{slot:11b,empty:true}] run scoreboard players set @s gui.selection 11 +execute unless data entity @s EnderItems[{Slot:12b}] unless data storage gui:page template[{slot:12b,empty:true}] run scoreboard players set @s gui.selection 12 +execute unless data entity @s EnderItems[{Slot:13b}] unless data storage gui:page template[{slot:13b,empty:true}] run scoreboard players set @s gui.selection 13 +execute unless data entity @s EnderItems[{Slot:14b}] unless data storage gui:page template[{slot:14b,empty:true}] run scoreboard players set @s gui.selection 14 +execute unless data entity @s EnderItems[{Slot:15b}] unless data storage gui:page template[{slot:15b,empty:true}] run scoreboard players set @s gui.selection 15 +execute unless data entity @s EnderItems[{Slot:16b}] unless data storage gui:page template[{slot:16b,empty:true}] run scoreboard players set @s gui.selection 16 +execute unless data entity @s EnderItems[{Slot:17b}] unless data storage gui:page template[{slot:17b,empty:true}] run scoreboard players set @s gui.selection 17 +execute unless data entity @s EnderItems[{Slot:18b}] unless data storage gui:page template[{slot:18b,empty:true}] run scoreboard players set @s gui.selection 18 +execute unless data entity @s EnderItems[{Slot:19b}] unless data storage gui:page template[{slot:19b,empty:true}] run scoreboard players set @s gui.selection 19 +execute unless data entity @s EnderItems[{Slot:20b}] unless data storage gui:page template[{slot:20b,empty:true}] run scoreboard players set @s gui.selection 20 +execute unless data entity @s EnderItems[{Slot:21b}] unless data storage gui:page template[{slot:21b,empty:true}] run scoreboard players set @s gui.selection 21 +execute unless data entity @s EnderItems[{Slot:22b}] unless data storage gui:page template[{slot:22b,empty:true}] run scoreboard players set @s gui.selection 22 +execute unless data entity @s EnderItems[{Slot:23b}] unless data storage gui:page template[{slot:23b,empty:true}] run scoreboard players set @s gui.selection 23 +execute unless data entity @s EnderItems[{Slot:24b}] unless data storage gui:page template[{slot:24b,empty:true}] run scoreboard players set @s gui.selection 24 +execute unless data entity @s EnderItems[{Slot:25b}] unless data storage gui:page template[{slot:25b,empty:true}] run scoreboard players set @s gui.selection 25 +execute unless data entity @s EnderItems[{Slot:26b}] unless data storage gui:page template[{slot:26b,empty:true}] run scoreboard players set @s gui.selection 26 + diff --git a/data/gui/functions/select/init.mcfunction b/data/gui/functions/select/init.mcfunction new file mode 100644 index 0000000..b4f1f85 --- /dev/null +++ b/data/gui/functions/select/init.mcfunction @@ -0,0 +1,10 @@ +data modify storage gui:private lock set value true + +function #gui:cleanup +function #gui:index + +function gui:select/get +execute if score @s gui.selection matches 0.. run function gui:select/iterate +function gui:render/init + +data modify storage gui:private lock set value false \ No newline at end of file diff --git a/data/gui/functions/select/iterate.mcfunction b/data/gui/functions/select/iterate.mcfunction new file mode 100644 index 0000000..7e91074 --- /dev/null +++ b/data/gui/functions/select/iterate.mcfunction @@ -0,0 +1,9 @@ +data modify storage gui:slot current set from storage gui:page template[0] +data remove storage gui:page template[0] + +execute store result score $slot gui.select run data get storage gui:slot current.slot +execute if score $slot gui.select = @s gui.selection run function gui:select/slot + +execute store result score $size gui.select run data get storage gui:page template + +execute if score $size gui.select matches 1.. run function gui:select/iterate \ No newline at end of file diff --git a/data/gui/functions/select/slot.mcfunction b/data/gui/functions/select/slot.mcfunction new file mode 100644 index 0000000..9805af6 --- /dev/null +++ b/data/gui/functions/select/slot.mcfunction @@ -0,0 +1,6 @@ +scoreboard players set $size gui.select 0 + +execute store result score $current gui.slot run data get storage gui:slot current.slot +function #gui:select/slot + +execute if data storage gui:slot current.page run execute store result score @s gui.page run data get storage gui:slot current.page \ No newline at end of file diff --git a/data/gui/functions/version.mcfunction b/data/gui/functions/version.mcfunction new file mode 100644 index 0000000..7d54497 --- /dev/null +++ b/data/gui/functions/version.mcfunction @@ -0,0 +1,7 @@ +data modify storage gui:version name set value "MoxGUI" + +data modify storage gui:version major set value 0 +data modify storage gui:version minor set value 1 +data modify storage gui:version patch set value 0 + +tellraw @a {"nbt":"name","storage": "gui:version","extra": [{"text": " v","extra":[{"nbt":"major","storage":"gui:version","extra":[{"text":"."},{"nbt":"minor","storage":"gui:version"},{"text":".","extra":[{"nbt":"patch","storage":"gui:version"}]}]}]}]} \ No newline at end of file diff --git a/data/gui/functions/warnings/404.mcfunction b/data/gui/functions/warnings/404.mcfunction new file mode 100644 index 0000000..2564249 --- /dev/null +++ b/data/gui/functions/warnings/404.mcfunction @@ -0,0 +1 @@ +data modify storage gui:page template set value [{slot:0b,item:{id:"minecraft:lime_stained_glass_pane"}},{slot:2b,item:{id:"minecraft:lime_stained_glass_pane"}},{slot:3b,item:{id:"minecraft:blue_stained_glass_pane"}},{slot:4b,item:{id:"minecraft:blue_stained_glass_pane"}},{slot:5b,item:{id:"minecraft:blue_stained_glass_pane"}},{slot:6b,item:{id:"minecraft:lime_stained_glass_pane"}},{slot:8b,item:{id:"minecraft:lime_stained_glass_pane"}},{slot:9b,item:{id:"minecraft:lime_stained_glass_pane"}},{slot:10b,item:{id:"minecraft:lime_stained_glass_pane"}},{slot:11b,item:{id:"minecraft:lime_stained_glass_pane"}},{slot:12b,item:{id:"minecraft:blue_stained_glass_pane"}},{slot:14b,item:{id:"minecraft:blue_stained_glass_pane"}},{slot:15b,item:{id:"minecraft:lime_stained_glass_pane"}},{slot:16b,item:{id:"minecraft:lime_stained_glass_pane"}},{slot:17b,item:{id:"minecraft:lime_stained_glass_pane"}},{slot:20b,item:{id:"minecraft:lime_stained_glass_pane"}},{slot:21b,item:{id:"minecraft:blue_stained_glass_pane"}},{slot:22b,item:{id:"minecraft:blue_stained_glass_pane"}},{slot:23b,item:{id:"minecraft:blue_stained_glass_pane"}},{slot:26b,item:{id:"minecraft:lime_stained_glass_pane"}}] \ No newline at end of file diff --git a/data/gui/item_modifiers/render/item.json b/data/gui/item_modifiers/render/item.json new file mode 100644 index 0000000..5b23b8e --- /dev/null +++ b/data/gui/item_modifiers/render/item.json @@ -0,0 +1,24 @@ +[ + { + "function": "minecraft:set_name", + "name": "", + "conditions": [ + { + "condition": "minecraft:value_check", + "value": { + "type": "minecraft:score", + "target": { + "type": "minecraft:fixed", + "name": "$named" + }, + "score": "gui.slot" + }, + "range": 0 + } + ] + }, + { + "function": "minecraft:set_nbt", + "tag": "{gui:true}" + } +] diff --git a/data/gui/loot_tables/config/empty.json b/data/gui/loot_tables/config/empty.json new file mode 100644 index 0000000..87530ba --- /dev/null +++ b/data/gui/loot_tables/config/empty.json @@ -0,0 +1,13 @@ +{ + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:black_stained_glass_pane" + } + ] + } + ] +} diff --git a/data/gui/loot_tables/empty.json b/data/gui/loot_tables/empty.json new file mode 100644 index 0000000..98aa977 --- /dev/null +++ b/data/gui/loot_tables/empty.json @@ -0,0 +1,23 @@ +{ + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:loot_table", + "name": "gui:config/empty" + } + ], + "functions": [ + { + "function": "minecraft:set_name", + "name": "" + }, + { + "function": "minecraft:set_nbt", + "tag": "{gui:true}" + } + ] + } + ] +} diff --git a/data/gui/tags/functions/cleanup.json b/data/gui/tags/functions/cleanup.json new file mode 100644 index 0000000..baffbc1 --- /dev/null +++ b/data/gui/tags/functions/cleanup.json @@ -0,0 +1,5 @@ +{ + "values": [ + "gui:cleanup/reset" + ] +} diff --git a/data/gui/tags/functions/index.json b/data/gui/tags/functions/index.json new file mode 100644 index 0000000..418862f --- /dev/null +++ b/data/gui/tags/functions/index.json @@ -0,0 +1,3 @@ +{ + "values": [] +} diff --git a/data/gui/tags/functions/render/item.json b/data/gui/tags/functions/render/item.json new file mode 100644 index 0000000..86dde3d --- /dev/null +++ b/data/gui/tags/functions/render/item.json @@ -0,0 +1,3 @@ +{ + "values": [] +} diff --git a/data/gui/tags/functions/render/slot.json b/data/gui/tags/functions/render/slot.json new file mode 100644 index 0000000..418862f --- /dev/null +++ b/data/gui/tags/functions/render/slot.json @@ -0,0 +1,3 @@ +{ + "values": [] +} diff --git a/data/gui/tags/functions/select/slot.json b/data/gui/tags/functions/select/slot.json new file mode 100644 index 0000000..418862f --- /dev/null +++ b/data/gui/tags/functions/select/slot.json @@ -0,0 +1,3 @@ +{ + "values": [] +} diff --git a/data/minecraft/tags/functions/load.json b/data/minecraft/tags/functions/load.json new file mode 100644 index 0000000..e7dfeda --- /dev/null +++ b/data/minecraft/tags/functions/load.json @@ -0,0 +1,5 @@ +{ + "values": [ + "gui:load" + ] +} diff --git a/data/minecraft/tags/functions/tick.json b/data/minecraft/tags/functions/tick.json new file mode 100644 index 0000000..c1b62ff --- /dev/null +++ b/data/minecraft/tags/functions/tick.json @@ -0,0 +1,5 @@ +{ + "values": [ + "gui:tick" + ] +} diff --git a/pack.mcmeta b/pack.mcmeta new file mode 100644 index 0000000..c05f32f --- /dev/null +++ b/pack.mcmeta @@ -0,0 +1,6 @@ +{ + "pack":{ + "pack_format": 10, + "description": "Data Driven GUI System" + } +}