├── .gitignore
├── .travis.yml
├── README.md
├── pom.xml
└── src
├── main
└── java
│ └── pl
│ └── socketbyte
│ └── opengui
│ ├── ColorUtil.java
│ ├── FinalItemJob.java
│ ├── GUI.java
│ ├── GUIElement.java
│ ├── GUIExtender.java
│ ├── GUIExtenderItem.java
│ ├── GUIHolder.java
│ ├── GUISettings.java
│ ├── ItemBuilder.java
│ ├── ItemEnchantment.java
│ ├── ItemPack.java
│ ├── OpenGUI.java
│ ├── Rows.java
│ ├── SimpleGUI.java
│ ├── event
│ ├── ElementResponse.java
│ ├── EnteredItemResponse.java
│ ├── NotEnterableItemResponse.java
│ ├── SerializedElementResponse.java
│ └── WindowResponse.java
│ └── serializable
│ ├── ItemSection.java
│ ├── Serializable.java
│ ├── SerializableGUI.java
│ ├── SerializableItemBuilder.java
│ └── SerializableSimpleGUI.java
└── test
└── java
└── pl
└── socketbyte
└── opengui
├── ColorUtil_ESTest.java
├── ColorUtil_ESTest_scaffolding.java
├── FinalItemJob_ESTest.java
├── FinalItemJob_ESTest_scaffolding.java
├── GUIElement_ESTest.java
├── GUIElement_ESTest_scaffolding.java
├── GUIExtenderItem_ESTest.java
├── GUIExtenderItem_ESTest_scaffolding.java
├── GUIExtender_ESTest.java
├── GUIExtender_ESTest_scaffolding.java
├── GUIHolder_ESTest.java
├── GUIHolder_ESTest_scaffolding.java
├── GUISettings_ESTest.java
├── GUISettings_ESTest_scaffolding.java
├── GUI_ESTest.java
├── GUI_ESTest_scaffolding.java
├── ItemBuilder_ESTest.java
├── ItemBuilder_ESTest_scaffolding.java
├── ItemEnchantment_ESTest.java
├── ItemEnchantment_ESTest_scaffolding.java
├── ItemPack_ESTest.java
├── ItemPack_ESTest_scaffolding.java
├── OpenGUI_ESTest.java
├── OpenGUI_ESTest_scaffolding.java
├── Rows_ESTest.java
├── Rows_ESTest_scaffolding.java
├── SimpleGUI_ESTest.java
└── SimpleGUI_ESTest_scaffolding.java
/.gitignore:
--------------------------------------------------------------------------------
1 | .idea/
2 | .evosuite/
3 | *.iml
4 | *.iws
5 | *.tmp
6 | log/
7 | target/
--------------------------------------------------------------------------------
/.travis.yml:
--------------------------------------------------------------------------------
1 | language: java
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # OpenGUI  [](https://travis-ci.org/SocketByte/OpenGUI)
2 | Simple GUI management solution.
3 |
4 | ## Installation (Maven)
5 | Just use my public repository and set the scope to compile.
6 |
7 | There's no any jar file to install on the server. You just compile it with your plugin.
8 | ```xml
9 |
10 |
11 | opengui
12 | https://repo.socketbyte.pl/repository/nexus-releases/
13 |
14 |
15 | ```
16 | ```xml
17 |
18 |
19 | pl.socketbyte
20 | OpenGUI
21 | 1.2
22 | compile
23 |
24 |
25 | ```
26 | ## Installation (Non-maven)
27 | Download and copy the source-code into your `src` folder.
28 |
29 | Keep in mind that you need following dependencies to get it to work.
30 | - Bukkit or Spigot engine installed on your server. https://yivesmirror.com/downloads/spigot
31 | - JDK/JRE 8 or higher. http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
32 | ## Compatibility
33 | This API should be compatible with all Bukkit or Spigot
34 | versions since `1.0`.
35 | I would recommend running it on a version higher than `1.7.2` though.
36 |
37 | It was tested on Minecraft version `1.12.2`.
38 | ## Usage
39 | It is fairly simple. *OpenGUI* has two possible usages. Object-based or standard.
40 |
41 | Standard, and the simplest usage example:
42 | ```java
43 | public class YourPluginClass extends JavaPlugin {
44 |
45 | public static void showGUI(Player player) {
46 | // Register the listeners.
47 | OpenGUI.INSTANCE.register(instance);
48 |
49 | // Create the GUI inventory using our special wrapper.
50 | GUI gui = new GUI("&cSimple Title", Rows.FIVE);
51 | // Create GUIExtender class and provide the GUI information.
52 | SimpleGUI simpleGUI = new SimpleGUI(gui);
53 |
54 | // Some additional GUI settings like entering/dragging items.
55 | simpleGUI.getGuiSettings().setCanEnterItems(true);
56 | simpleGUI.getGuiSettings().setCanDrag(true);
57 |
58 | // Set specific enterable/draggable items
59 | simpleGUI.getGuiSettings().addEnterableItem(Material.STONE);
60 | simpleGUI.getGuiSettings().addEnterableItem(Material.GOLDEN_APPLE, 1);
61 |
62 | // Set event to occur when user tries to enter non-enterable item
63 | simpleGUI.getGuiSettings().setNotEnterableItemResponse(
64 | inventoryClickEvent ->
65 | inventoryClickEvent.getWhoClicked().sendMessage(
66 | "You can not enter that item!"));
67 |
68 | // Set event to occur when user enters an item successfully
69 | simpleGUI.getGuiSettings().setEnteredItemResponse(
70 | inventoryClickEvent ->
71 | inventoryClickEvent.getWhoClicked().sendMessage(
72 | "Entered an item!"));
73 |
74 | // #1 Set an item to a specified slot and assign an ItemBuilder
75 | simpleGUI.setItem(0, new ItemBuilder(Material.DIRT, 1).setName("&aTest!"));
76 |
77 | // #2 Add an item with assigned ItemBuilder
78 | simpleGUI.addItem(new ItemBuilder(Material.DIAMOND));
79 |
80 | // #3 Add an item with assigned ItemBuilder and ElementResponse event. (onClick)
81 | simpleGUI.addItem(new ItemBuilder(Material.GOLD_AXE), event ->
82 | System.out.println("On click event!"));
83 |
84 | // #4 Set items all together using ItemPack class.
85 | simpleGUI.setItem(
86 | new ItemPack(1, new ItemBuilder(Material.WOOD)),
87 | new ItemPack(2, new ItemBuilder(Material.STONE)),
88 | new ItemPack(3, new ItemBuilder(Material.DIAMOND_ORE)),
89 | new ItemPack(4, new ItemBuilder(Material.EMERALD)));
90 |
91 | // Add an element response to slot 0.
92 | simpleGUI.addElementResponse(0, event ->
93 | System.out.println("On click event at slot 0!"));
94 |
95 | // Add an element response to slot 1 and assign "pullable" value.
96 | // It means that you can pull out that item from the GUI and take it with you.
97 | simpleGUI.addElementResponse(1, true, event ->
98 | System.out.println("On click event at slot 1!"));
99 |
100 | // Add WindowResponse event.
101 | simpleGUI.addWindowResponse(new WindowResponse() {
102 | @Override
103 | public void onOpen(InventoryOpenEvent event) {
104 | System.out.println("Opened!");
105 | }
106 |
107 | @Override
108 | public void onClose(InventoryCloseEvent event) {
109 | System.out.println("Closed!");
110 | }
111 | });
112 |
113 | // Remove an item from slot 0.
114 | simpleGUI.removeItem(0);
115 |
116 | // Open inventory.
117 | // WARNING: This is important that you use our method.
118 | // You can use player.openInventory(inventory)
119 | // only when not using overrided items. (More on that in object-based usage)
120 | simpleGUI.openInventory(player);
121 | }
122 |
123 | }
124 | ```
125 |
126 | Object-based usage. (A little more complicated, this is for advanced users who are familiar with basics of object-oriented programming!)
127 | ### Custom GUI creation
128 | ```java
129 | public class TestGUI extends GUIExtender {
130 |
131 | // Simple custom GUI, here you can add your items and prepare it for show.
132 | // Functionality of this object will be extended in the future.
133 | public TestGUI() {
134 | super(new GUI("&cSuper Title", Rows.THREE));
135 |
136 | getGuiSettings().setCanDrag(true);
137 | getGuiSettings().setCanEnterItems(true);
138 | // Add possible to enter material
139 | getGuiSettings().addEnterableItem(Material.STONE);
140 |
141 | // Here we can set our GUIExtenderItem class extension as a normal item.
142 | setItem(0, new TestItem());
143 |
144 | // Every functionality from standard usage is of course here.
145 | // You can add/set items, add element response or other listeners.
146 | // You can even override all the methods, but I don't see any useful outcomes of this.
147 | }
148 |
149 | @Override
150 | public void onOpen(InventoryOpenEvent e) {
151 | System.out.println("Opened!");
152 | }
153 |
154 | @Override
155 | public void onClose(InventoryCloseEvent e) {
156 | System.out.println("Closed!");
157 | }
158 | }
159 |
160 |
161 | ```
162 | ### Custom Item (Element) creation
163 | ```java
164 | public class TestItem extends GUIExtenderItem {
165 |
166 | public TestItem() {
167 | // We can set here the default ItemBuilder,
168 | // but there's no need for it as we're overriding the getItemBuilder method
169 | super();
170 |
171 | setPullable(false);
172 | }
173 |
174 | // You can change resulting item just before the player opens the inventory.
175 | // The assignment of the item is made in GUIExtender.openInventory(player) method.
176 | @Override
177 | public ItemBuilder getItemBuilder(Player player) {
178 | if (player.getName().equals("pl.socketbyte.opengui.Test"))
179 | return new ItemBuilder(Material.DIAMOND)
180 | .setName("&bDiamond")
181 | .setLore("Very nice", "Diamond");
182 | return new ItemBuilder(Material.GRASS)
183 | .setName("&2Grass")
184 | .setLore("Gross", "Grass");
185 | }
186 |
187 | // ElementResponse implementation.
188 | @Override
189 | public void onClick(InventoryClickEvent event) {
190 | System.out.println("Click!");
191 | }
192 | }
193 |
194 | ```
195 | Now you can show your amazing objects to the player using
196 | ```
197 | TestGUI testGUI = new TestGUI();
198 | testGUI.openInventory(player);
199 | ```
200 | ## Serialization
201 | OpenGUI in `1.2` offers Serializable classes that allow to easily configure your GUI from config.yml file.
202 |
203 | If you want to use it from config, you need to use different objects.
204 |
205 | `SerializableSimpleGUI` instead of `SimpleGUI`
206 |
207 | `SerializableGUI` instead of `GUI`
208 |
209 | `SerializableItemBuilder` instead of `ItemBuilder`
210 |
211 | Congratulations! You can save now your `SerializableSimpleGUI`
212 | using
213 | ```java
214 | configuration.set("gui", yourSimpleGUI)
215 | ```
216 |
217 | Of course you can read GUI from config like this:
218 | ```java
219 | SerializableSimpleGUI gui = (SerializableSimpleGUI) configuration.get("gui")
220 | ```
221 |
222 | Result:
223 | ```yml
224 | gui:
225 | canDrag: true
226 | canEnterItems: true
227 | enterableItems:
228 | - GOLD_PICKAXE
229 | gui:
230 | title: '&2&lDrop'
231 | actions:
232 | # action ID on slot 0 etc.
233 | 0: on_click_action_0
234 | 1: on_click_action_1
235 | 2: on_click_action_2
236 | 3: on_click_action_3
237 | 4: on_click_action_4
238 | 5: on_click_action_5
239 | inventory:
240 | - slot: 0
241 | item:
242 | material: DIAMOND
243 | amount: 1
244 | durability: 0
245 | name: null
246 | lore: null
247 | - slot: 1
248 | item:
249 | material: GOLDEN_APPLE
250 | amount: 1
251 | durability: 1
252 | name: null
253 | lore: null
254 | - slot: 2
255 | item:
256 | material: COAL
257 | amount: 48
258 | durability: 0
259 | name: null
260 | lore: null
261 | - slot: 3
262 | item:
263 | material: CHORUS_FLOWER
264 | amount: 1
265 | durability: 0
266 | name: null
267 | lore:
268 | - Hi!
269 | - Boi!
270 | - slot: 4
271 | item:
272 | material: JACK_O_LANTERN
273 | amount: 1
274 | durability: 0
275 | name: '&6Hello!'
276 | lore: null
277 | - slot: 5
278 | item:
279 | material: LAPIS_BLOCK
280 | amount: 1
281 | durability: 0
282 | name: null
283 | lore: null
284 | ```
285 |
286 | Like you can see, OpenGUI offers additional `action id` parameters.
287 | You can find them in `SerializableSimpleGUI` and use them like this:
288 | ```java
289 | simpleGUI.hasAction(int slot)
290 | simpleGUI.getActionFor(int slot) // returns String
291 | ```
292 | You can use them to append different `ElementResponse` actions for each item.
293 | It allows to create dynamic GUIs right from your configuration file.
294 |
295 | Enchantments are currently not supported. To be added in `1.2b`
296 |
297 | ## JUnit
298 | Project supports JUnit 4.
299 | Test code is generated automatically using [EvoSuite 1.0.5](http://www.evosuite.org).
300 |
301 | ## At the end...
302 | This project is not well written, or amazing in any case. It's usage is heavily inspired by [AmpMenus](https://github.com/Amperial/AmpMenus)
303 | but it's a bit more rich in functionalities and still supported.
304 |
305 | If you have any questions or issues feel free to use github issues forum.
306 | If you want to contribute on the project you of course can.
307 |
308 | ## License and Terms of Use
309 | **No license** basically. You can do everything with the code, but you can't distribute or sell it.
310 |
--------------------------------------------------------------------------------
/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 | 4.0.0
6 |
7 | pl.socketbyte
8 | OpenGUI
9 | 1.2
10 |
11 |
12 |
13 | Spigot Repository
14 | https://hub.spigotmc.org/nexus/content/repositories/snapshots/
15 |
16 |
17 |
18 |
19 |
20 | EvoSuite
21 | EvoSuite Repository
22 | http://www.evosuite.org/m2
23 |
24 |
25 |
26 |
27 |
28 | nexus-releases
29 | http://repo.socketbyte.pl/repository/nexus-releases/
30 |
31 |
32 | nexus-snapshots
33 | http://repo.socketbyte.pl/repository/nexus-snapshots/
34 |
35 |
36 |
37 |
38 |
39 |
40 | maven-deploy-plugin
41 | 2.8.1
42 |
43 |
44 | default-deploy
45 | deploy
46 |
47 | deploy
48 |
49 |
50 |
51 |
52 |
53 | org.apache.maven.plugins
54 | maven-compiler-plugin
55 | 3.5.1
56 |
57 | 1.8
58 | 1.8
59 |
60 |
61 |
62 | org.evosuite.plugins
63 | evosuite-maven-plugin
64 | 1.0.5
65 |
66 |
67 |
68 | prepare
69 |
70 | process-test-classes
71 |
72 |
73 |
74 |
75 | org.apache.maven.plugins
76 | maven-surefire-plugin
77 | 2.17
78 |
79 |
80 |
81 | listener
82 | org.evosuite.runtime.InitializingListener
83 |
84 |
85 |
86 |
87 |
88 | true
89 | org.apache.maven.plugins
90 | maven-enforcer-plugin
91 | 1.3.1
92 |
93 |
94 | enforce-maven-3
95 |
96 | enforce
97 |
98 |
99 |
100 |
101 | 3.1
102 |
103 |
104 | true
105 |
106 |
107 |
108 |
109 |
110 | org.codehaus.mojo
111 | build-helper-maven-plugin
112 | 1.8
113 |
114 |
115 | add-test-source
116 | generate-test-sources
117 |
118 | add-test-source
119 |
120 |
121 |
122 | .evosuite/evosuite-tests
123 |
124 |
125 |
126 |
127 |
128 |
129 |
130 |
131 |
132 |
133 |
134 | org.spigotmc
135 | spigot-api
136 | 1.12.1-R0.1-SNAPSHOT
137 | jar
138 | provided
139 |
140 |
141 | org.evosuite
142 | evosuite-standalone-runtime
143 | 1.0.5
144 | test
145 |
146 |
147 | junit
148 | junit
149 | 4.12
150 |
151 |
152 | org.junit.jupiter
153 | junit-jupiter-api
154 | 5.1.0-M1
155 | test
156 |
157 |
158 |
159 |
--------------------------------------------------------------------------------
/src/main/java/pl/socketbyte/opengui/ColorUtil.java:
--------------------------------------------------------------------------------
1 | package pl.socketbyte.opengui;
2 |
3 | import org.bukkit.ChatColor;
4 |
5 | import java.util.List;
6 | import java.util.stream.Collectors;
7 |
8 | public class ColorUtil {
9 |
10 | public static String fixColor(String str) {
11 | return ChatColor.translateAlternateColorCodes('&', str);
12 | }
13 |
14 | public static List fixColor(List stringList) {
15 | return stringList.stream().map(ColorUtil::fixColor)
16 | .collect(Collectors.toList());
17 | }
18 |
19 | public static String[] fixColor(String[] strings) {
20 | String[] stringArray = new String[strings.length];
21 | for (int i = 0; i < strings.length; i++) {
22 | stringArray[i] = fixColor(strings[i]);
23 | }
24 | return stringArray;
25 | }
26 |
27 | }
28 |
--------------------------------------------------------------------------------
/src/main/java/pl/socketbyte/opengui/FinalItemJob.java:
--------------------------------------------------------------------------------
1 | package pl.socketbyte.opengui;
2 |
3 | public class FinalItemJob {
4 |
5 | private final int slot;
6 | private final GUIExtenderItem guiExtenderItem;
7 |
8 | public FinalItemJob(int slot, GUIExtenderItem guiExtenderItem) {
9 | this.slot = slot;
10 | this.guiExtenderItem = guiExtenderItem;
11 | }
12 |
13 | public FinalItemJob(GUIExtenderItem guiExtenderItem) {
14 | this.slot = -1;
15 | this.guiExtenderItem = guiExtenderItem;
16 | }
17 |
18 | public int getSlot() {
19 | return slot;
20 | }
21 |
22 | public GUIExtenderItem getGuiExtenderItem() {
23 | return guiExtenderItem;
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/src/main/java/pl/socketbyte/opengui/GUI.java:
--------------------------------------------------------------------------------
1 | package pl.socketbyte.opengui;
2 |
3 | import org.bukkit.Bukkit;
4 | import org.bukkit.Material;
5 | import org.bukkit.entity.Player;
6 | import org.bukkit.inventory.Inventory;
7 | import org.bukkit.inventory.InventoryHolder;
8 | import org.bukkit.inventory.ItemStack;
9 |
10 | import java.util.UUID;
11 |
12 | public class GUI {
13 |
14 | private final UUID uniqueId = UUID.randomUUID();
15 | private Inventory inventory;
16 | private final Rows rows;
17 | private final String title;
18 | private InventoryHolder holder;
19 |
20 | public GUI(InventoryHolder holder, String title) {
21 | this.rows = Rows.SIX;
22 | this.holder = holder;
23 | this.title = title;
24 |
25 | this.inventory = createInventory(holder, Rows.SIX, title);
26 | }
27 |
28 | public GUI(InventoryHolder holder, String title, Rows rows) {
29 | this.rows = rows;
30 | this.holder = holder;
31 | this.title = title;
32 |
33 | this.inventory = createInventory(holder, rows, title);
34 | }
35 |
36 | public GUI(String title, Rows rows) {
37 | this.rows = rows;
38 | this.title = title;
39 |
40 | this.inventory = createInventory(
41 | new GUIHolder(this, Bukkit.createInventory(null,
42 | rows.getSlots())),
43 | rows,
44 | title);
45 | }
46 |
47 | public GUI(String title) {
48 | this.rows = Rows.SIX;
49 | this.title = title;
50 |
51 | this.inventory = createInventory(
52 | new GUIHolder(this, Bukkit.createInventory(null, Rows.SIX.getSlots())),
53 | Rows.SIX,
54 | title);
55 | }
56 |
57 | public void openInventory(Player player) {
58 | player.openInventory(this.inventory);
59 | }
60 |
61 | public int addItem(ItemBuilder itemBuilder) {
62 | try {
63 | this.inventory.addItem(itemBuilder.getItem());
64 | } catch (Exception ignored) { }
65 | return getPosition(itemBuilder.getItem().getType(), itemBuilder.getItem().getDurability());
66 | }
67 |
68 | private int getPosition(Material material, int data) {
69 | try {
70 | for (int i = 0; i < this.inventory.getContents().length; i++) {
71 | ItemStack itemStack = this.inventory.getItem(i);
72 |
73 | if (itemStack.getType().equals(material)
74 | && itemStack.getDurability() == data)
75 | return i;
76 | }
77 | } catch (Exception ignored) { }
78 | return -1;
79 | }
80 |
81 | public void setItem(int slot, ItemBuilder itemBuilder) {
82 | try {
83 | this.inventory.setItem(slot, itemBuilder.getItem());
84 | } catch (Exception ignored) { }
85 | }
86 |
87 | public void removeItem(int slot) {
88 | this.inventory.setItem(slot, new ItemStack(Material.AIR));
89 | }
90 |
91 | public static Inventory createInventory(InventoryHolder holder, Rows rows, String title) {
92 | return Bukkit.createInventory(holder,
93 | rows.getSlots(),
94 | ColorUtil.fixColor(title));
95 | }
96 |
97 | public static Inventory createInventory(InventoryHolder holder, int size, String title) {
98 | return Bukkit.createInventory(holder,
99 | size,
100 | ColorUtil.fixColor(title));
101 | }
102 |
103 | public void setInventory(Inventory inventory) {
104 | this.inventory = inventory;
105 | }
106 |
107 | @Override
108 | public String toString() {
109 | return uniqueId.toString();
110 | }
111 |
112 | public UUID getUniqueId() {
113 | return uniqueId;
114 | }
115 |
116 | public Inventory getInventory() {
117 | return inventory;
118 | }
119 |
120 | public Rows getRows() {
121 | return rows;
122 | }
123 |
124 | public String getTitle() {
125 | return title;
126 | }
127 |
128 | public InventoryHolder getHolder() {
129 | return holder;
130 | }
131 | }
132 |
--------------------------------------------------------------------------------
/src/main/java/pl/socketbyte/opengui/GUIElement.java:
--------------------------------------------------------------------------------
1 | package pl.socketbyte.opengui;
2 |
3 | import pl.socketbyte.opengui.event.ElementResponse;
4 |
5 | public class GUIElement {
6 |
7 | private final int slot;
8 | private ElementResponse elementResponse;
9 | private GUIExtenderItem guiExtenderItem;
10 | private boolean pullable;
11 |
12 | public GUIElement(int slot) {
13 | this.slot = slot;
14 | }
15 |
16 | public GUIElement(int slot, boolean pullable) {
17 | this.slot = slot;
18 | this.pullable = pullable;
19 | }
20 |
21 | public void addElementResponse(int slot, ElementResponse elementResponse) {
22 | this.elementResponse = elementResponse;
23 | this.pullable = false;
24 | }
25 |
26 | public void addElementResponse(int slot, boolean pullable, ElementResponse elementResponse) {
27 | this.elementResponse = elementResponse;
28 | this.pullable = pullable;
29 | }
30 |
31 | public void addElementResponse(int slot, GUIExtenderItem guiExtenderItem) {
32 | this.pullable = guiExtenderItem.isPullable();
33 | this.guiExtenderItem = guiExtenderItem;
34 | }
35 |
36 | public int getSlot() {
37 | return slot;
38 | }
39 |
40 | public ElementResponse getElementResponse() {
41 | return elementResponse;
42 | }
43 |
44 | public GUIExtenderItem getGuiExtenderItem() {
45 | return guiExtenderItem;
46 | }
47 |
48 | public boolean isPullable() {
49 | return pullable;
50 | }
51 |
52 | @Override
53 | public String toString() {
54 | return "[" + slot + "] " + elementResponse.hashCode();
55 | }
56 | }
57 |
--------------------------------------------------------------------------------
/src/main/java/pl/socketbyte/opengui/GUIExtender.java:
--------------------------------------------------------------------------------
1 | package pl.socketbyte.opengui;
2 |
3 | import org.bukkit.Bukkit;
4 | import org.bukkit.Material;
5 | import org.bukkit.entity.Player;
6 | import org.bukkit.event.EventHandler;
7 | import org.bukkit.event.Listener;
8 | import org.bukkit.event.inventory.InventoryClickEvent;
9 | import org.bukkit.event.inventory.InventoryCloseEvent;
10 | import org.bukkit.event.inventory.InventoryDragEvent;
11 | import org.bukkit.event.inventory.InventoryOpenEvent;
12 | import org.bukkit.inventory.Inventory;
13 | import org.bukkit.inventory.ItemStack;
14 | import pl.socketbyte.opengui.event.ElementResponse;
15 | import pl.socketbyte.opengui.event.WindowResponse;
16 |
17 | import java.util.ArrayList;
18 | import java.util.HashMap;
19 | import java.util.List;
20 | import java.util.Map;
21 |
22 | public abstract class GUIExtender implements Listener, WindowResponse {
23 |
24 | private final int id;
25 |
26 | private final List jobs = new ArrayList<>();
27 | private final Map elements = new HashMap<>();
28 | private GUISettings guiSettings;
29 | private GUI gui;
30 | private WindowResponse windowResponse;
31 |
32 | public GUIExtender(GUI gui) {
33 | this.gui = gui;
34 | this.id = OpenGUI.INSTANCE.getGUIs().size();
35 | OpenGUI.INSTANCE.getGUIs().put(id, this);
36 |
37 | this.guiSettings = new GUISettings();
38 | this.guiSettings.setCanEnterItems(false);
39 | this.guiSettings.setCanDrag(false);
40 |
41 | Bukkit.getPluginManager().registerEvents(this, OpenGUI.INSTANCE.getInstance());
42 | }
43 |
44 | public void setGUI(GUI gui) {
45 | this.gui = gui;
46 | this.elements.clear();
47 | this.jobs.clear();
48 | }
49 |
50 | public void addEmptyElementResponse(int slot, boolean pullable) {
51 | GUIElement guiElement = new GUIElement(slot, pullable);
52 | elements.put(slot, guiElement);
53 | }
54 |
55 | public void addElementResponse(int slot, ElementResponse elementResponse) {
56 | GUIElement guiElement = new GUIElement(slot);
57 | guiElement.addElementResponse(slot, elementResponse);
58 | elements.put(slot, guiElement);
59 | }
60 |
61 | public void addElementResponse(int slot, boolean pullable, ElementResponse elementResponse) {
62 | GUIElement guiElement = new GUIElement(slot);
63 | guiElement.addElementResponse(slot, pullable, elementResponse);
64 | elements.put(slot, guiElement);
65 | }
66 |
67 | public void addElementResponse(int slot, GUIExtenderItem guiExtenderItem) {
68 | GUIElement guiElement = new GUIElement(slot);
69 | guiElement.addElementResponse(slot, guiExtenderItem.isPullable(), guiExtenderItem);
70 | elements.put(slot, guiElement);
71 | }
72 |
73 | private void addEmptyElementResponse(int slot) {
74 | GUIElement guiElement = new GUIElement(slot);
75 | elements.put(slot, guiElement);
76 | }
77 |
78 | public void addWindowResponse(WindowResponse windowResponse) {
79 | this.windowResponse = windowResponse;
80 | }
81 |
82 |
83 | @EventHandler
84 | public void onInventoryDrag(InventoryDragEvent event) {
85 | if (event.getView().getTopInventory().equals(getBukkitInventory())
86 | && !guiSettings.isCanDrag()) {
87 | event.setCancelled(true);
88 | return;
89 | }
90 | if (guiSettings.isCanDrag() &&
91 | canEnter(event.getCursor())) {
92 | event.setCancelled(false);
93 | }
94 | }
95 |
96 | @EventHandler
97 | public void onInventoryClick(InventoryClickEvent event) {
98 | if (event.getView() == null
99 | || event.getView().getTopInventory() == null
100 | || event.getView().getBottomInventory() == null
101 | || event.getClickedInventory() == null)
102 | return;
103 |
104 | if (guiSettings.isCanEnterItems()) {
105 | if (!event.isShiftClick()) {
106 | if (event.getView().getTopInventory().equals(getBukkitInventory())
107 | && event.getClickedInventory().equals(getBukkitInventory())
108 | && event.getCursor() != null
109 | && canEnter(event.getCursor())) {
110 | if (guiSettings.getEnteredItemResponse() != null)
111 | guiSettings.getEnteredItemResponse().event(event);
112 | event.setCancelled(false);
113 | return;
114 | } else if (event.getView().getTopInventory().equals(getBukkitInventory())
115 | && event.getClickedInventory().equals(getBukkitInventory())
116 | && event.getCursor() != null
117 | && !canEnter(event.getCursor())) {
118 | if (guiSettings.getNotEnterableItemResponse() != null)
119 | guiSettings.getNotEnterableItemResponse().event(event);
120 | event.setCancelled(true);
121 | return;
122 | }
123 | } else {
124 | if (event.getView().getTopInventory().equals(getBukkitInventory())
125 | && !event.getClickedInventory().equals(getBukkitInventory())
126 | && event.getCurrentItem() != null
127 | && canEnter(event.getCurrentItem())) {
128 | if (guiSettings.getEnteredItemResponse() != null)
129 | guiSettings.getEnteredItemResponse().event(event);
130 | event.setCancelled(false);
131 | return;
132 | } else if (event.getView().getTopInventory().equals(getBukkitInventory())
133 | && !event.getClickedInventory().equals(getBukkitInventory())
134 | && event.getCurrentItem() != null
135 | && !canEnter(event.getCurrentItem())) {
136 | if (guiSettings.getNotEnterableItemResponse() != null)
137 | guiSettings.getNotEnterableItemResponse().event(event);
138 | event.setCancelled(true);
139 | return;
140 | }
141 | }
142 | }
143 |
144 | if (event.getView().getTopInventory().equals(getBukkitInventory())
145 | && !guiSettings.isCanEnterItems()) {
146 | if (event.isShiftClick() &&
147 | !event.getClickedInventory().equals(getBukkitInventory())) {
148 | event.setCancelled(true);
149 | return;
150 | }
151 | else if (!event.isShiftClick() &&
152 | event.getClickedInventory().equals(getBukkitInventory())
153 | && (event.getCurrentItem() == null || event.getCurrentItem().getType().equals(Material.AIR))) {
154 | event.setCancelled(true);
155 | return;
156 | }
157 | else if (!event.isShiftClick() &&
158 | event.getClickedInventory().equals(getBukkitInventory())) {
159 | checkElements(event);
160 | return;
161 | }
162 | else if (event.isShiftClick() &&
163 | event.getClickedInventory().equals(getBukkitInventory())) {
164 | checkElements(event);
165 | return;
166 | }
167 | event.setCancelled(false);
168 | return;
169 | }
170 | checkElements(event);
171 | }
172 |
173 | private boolean canEnter(ItemStack itemStack) {
174 | if (guiSettings.isCanEnterItems()) {
175 | List materials = guiSettings.getEnterableItems();
176 |
177 | if (materials.isEmpty())
178 | return true;
179 |
180 | if (itemStack == null || itemStack.getType().equals(Material.AIR))
181 | return true;
182 |
183 | for (ItemStack entry : materials) {
184 | Material material = entry.getType();
185 | short data = entry.getDurability();
186 |
187 | if (itemStack.getType().equals(material)
188 | && itemStack.getDurability() == data)
189 | return true;
190 | }
191 | }
192 | return false;
193 | }
194 |
195 | @EventHandler
196 | public void onInventoryOpen(InventoryOpenEvent e) {
197 | if (e.getView().getTopInventory().equals(getBukkitInventory())) {
198 | if (windowResponse != null)
199 | windowResponse.onOpen(e);
200 | }
201 | }
202 |
203 | @EventHandler
204 | public void onInventoryClose(InventoryCloseEvent e) {
205 | if (e.getView().getTopInventory().equals(getBukkitInventory())) {
206 | if (windowResponse != null)
207 | windowResponse.onClose(e);
208 |
209 | Bukkit.getScheduler().runTaskLater(OpenGUI.INSTANCE.getInstance(), () ->
210 | ((Player) e.getPlayer()).updateInventory(), 5);
211 | // I need to update the inventory because minecraft is weird
212 | // otherwise you can make the item to.. "stay" in your inventory until you do something with it
213 | }
214 | }
215 |
216 | public void setItem(ItemPack... itemPacks) {
217 | for (ItemPack itemPack : itemPacks) {
218 | ItemBuilder itemBuilder = itemPack.getItemBuilder();
219 | int slot = itemPack.getSlot();
220 |
221 | if (itemPack.getElementResponse() != null)
222 | addElementResponse(slot, itemPack.getElementResponse());
223 | else addEmptyElementResponse(slot);
224 |
225 | gui.setItem(slot, itemBuilder);
226 | updateInventory();
227 | }
228 | }
229 |
230 | public void changeItem(int slot, ItemBuilder itemBuilder) {
231 | gui.setItem(slot, itemBuilder);
232 | updateInventory();
233 | }
234 |
235 | public void setItem(int slot, ItemBuilder itemBuilder) {
236 | gui.setItem(slot, itemBuilder);
237 | addEmptyElementResponse(slot);
238 | updateInventory();
239 | }
240 |
241 | public void setItem(int slot, ItemBuilder itemBuilder, ElementResponse elementResponse) {
242 | gui.setItem(slot, itemBuilder);
243 | addElementResponse(slot, elementResponse);
244 | updateInventory();
245 | }
246 |
247 | public void setItem(int slot, GUIExtenderItem guiExtenderItem) {
248 | jobs.add(new FinalItemJob(slot, guiExtenderItem));
249 | }
250 |
251 | public int addItem(ItemBuilder itemBuilder) {
252 | int index = gui.addItem(itemBuilder);
253 | addEmptyElementResponse(index);
254 | updateInventory();
255 | return index;
256 | }
257 |
258 | public int addItem(ItemBuilder itemBuilder, ElementResponse elementResponse) {
259 | int index = gui.addItem(itemBuilder);
260 | addElementResponse(index, elementResponse);
261 | updateInventory();
262 | return index;
263 | }
264 |
265 | public void addItem(GUIExtenderItem guiExtenderItem) {
266 | jobs.add(new FinalItemJob(guiExtenderItem));
267 | }
268 |
269 | public void removeItem(int slot) {
270 | gui.removeItem(slot);
271 | }
272 |
273 | public void openInventory(Player player) {
274 | if (!jobs.isEmpty()) {
275 | for (FinalItemJob finalItemJob : jobs) {
276 | if (finalItemJob.getSlot() == -1) {
277 | addExtenderItem(finalItemJob.getGuiExtenderItem(),
278 | player);
279 | }
280 | else setExtenderItem(finalItemJob.getSlot(),
281 | finalItemJob.getGuiExtenderItem(),
282 | player);
283 | }
284 | jobs.clear();
285 | }
286 |
287 | player.openInventory(getBukkitInventory());
288 | }
289 |
290 | public Inventory getBukkitInventory() {
291 | return gui.getInventory();
292 | }
293 |
294 | public void updateInventory() {
295 | List slots = new ArrayList<>();
296 | int temp = 0;
297 | for (ItemStack itemStack : getBukkitInventory().getContents()) {
298 | temp++;
299 | if (itemStack == null || itemStack.getType().equals(Material.AIR))
300 | continue;
301 |
302 | int current = temp - 1;
303 | slots.add(current);
304 | }
305 |
306 | for (int slot : elements.keySet())
307 | if (slots.contains(slot))
308 | slots.remove((Integer) slot);
309 |
310 | for (int slot : slots)
311 | addEmptyElementResponse(slot);
312 |
313 | getBukkitInventory().getViewers().forEach(viewer -> ((Player)viewer).updateInventory());
314 | }
315 |
316 | private void setExtenderItem(int slot, GUIExtenderItem guiExtenderItem, Player player) {
317 | gui.setItem(slot, guiExtenderItem.getItemBuilder(player));
318 | addElementResponse(slot, guiExtenderItem);
319 | updateInventory();
320 | }
321 |
322 | private void addExtenderItem(GUIExtenderItem guiExtenderItem, Player player) {
323 | int index = gui.addItem(guiExtenderItem.getItemBuilder(player));
324 | addElementResponse(index, guiExtenderItem);
325 | updateInventory();
326 | }
327 |
328 | private void checkElements(InventoryClickEvent event) {
329 | for (GUIElement element : elements.values()) {
330 | int slot = element.getSlot();
331 |
332 | if (slot != event.getSlot())
333 | continue;
334 | if (!event.getClickedInventory().equals(getBukkitInventory()))
335 | continue;
336 | if (!event.getView().getTopInventory().equals(getBukkitInventory()))
337 | continue;
338 |
339 | event.setCancelled(!element.isPullable());
340 | if (element.getElementResponse() != null)
341 | element.getElementResponse().onClick(event);
342 | else if (element.getGuiExtenderItem() != null)
343 | element.getGuiExtenderItem().onClick(event);
344 | }
345 |
346 | }
347 |
348 | public int getId() {
349 | return id;
350 | }
351 |
352 | public List getJobs() {
353 | return jobs;
354 | }
355 |
356 | public Map getElements() {
357 | return elements;
358 | }
359 |
360 | public GUISettings getGuiSettings() {
361 | return guiSettings;
362 | }
363 |
364 | public GUI getGui() {
365 | return gui;
366 | }
367 |
368 | public WindowResponse getWindowResponse() {
369 | return windowResponse;
370 | }
371 | }
372 |
--------------------------------------------------------------------------------
/src/main/java/pl/socketbyte/opengui/GUIExtenderItem.java:
--------------------------------------------------------------------------------
1 | package pl.socketbyte.opengui;
2 |
3 | import org.bukkit.Material;
4 | import org.bukkit.entity.Player;
5 | import pl.socketbyte.opengui.event.ElementResponse;
6 |
7 | public abstract class GUIExtenderItem implements ElementResponse {
8 |
9 | private final ItemBuilder itemBuilder;
10 | private boolean pullable;
11 |
12 | public GUIExtenderItem(ItemBuilder itemBuilder) {
13 | this.itemBuilder = itemBuilder;
14 | }
15 |
16 | public GUIExtenderItem() {
17 | this.itemBuilder = new ItemBuilder(Material.AIR);
18 | }
19 |
20 | // You can override this based on a player for example.
21 | public ItemBuilder getItemBuilder(Player player) {
22 | return itemBuilder;
23 | }
24 |
25 | public boolean isPullable() {
26 | return pullable;
27 | }
28 |
29 | public void setPullable(boolean pullable) {
30 | this.pullable = pullable;
31 | }
32 |
33 | }
--------------------------------------------------------------------------------
/src/main/java/pl/socketbyte/opengui/GUIHolder.java:
--------------------------------------------------------------------------------
1 | package pl.socketbyte.opengui;
2 |
3 | import org.bukkit.inventory.Inventory;
4 | import org.bukkit.inventory.InventoryHolder;
5 |
6 | public class GUIHolder implements InventoryHolder {
7 |
8 | private final Inventory inventory;
9 | private final GUI gui;
10 |
11 | public GUIHolder(GUI gui, Inventory inventory) {
12 | this.inventory = inventory;
13 | this.gui = gui;
14 | }
15 |
16 | @Override
17 | public Inventory getInventory() {
18 | return inventory;
19 | }
20 |
21 | public GUI getGui() {
22 | return gui;
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/src/main/java/pl/socketbyte/opengui/GUISettings.java:
--------------------------------------------------------------------------------
1 | package pl.socketbyte.opengui;
2 |
3 | import org.bukkit.Material;
4 | import org.bukkit.inventory.ItemStack;
5 | import pl.socketbyte.opengui.event.EnteredItemResponse;
6 | import pl.socketbyte.opengui.event.NotEnterableItemResponse;
7 |
8 | import java.util.ArrayList;
9 | import java.util.List;
10 |
11 | public class GUISettings {
12 |
13 | private boolean canEnterItems;
14 | private boolean canDrag;
15 | private final List enterableItems = new ArrayList<>();
16 | private NotEnterableItemResponse notEnterableItemResponse;
17 | private EnteredItemResponse enteredItemResponse;
18 |
19 | public void addEnterableItem(Material material) {
20 | this.enterableItems.add(new ItemStack(material));
21 | }
22 |
23 | public void addEnterableItem(Material material, short data) {
24 | this.enterableItems.add(new ItemStack(material, 1, data));
25 | }
26 |
27 | public void addEnterableItem(Material material, int data) {
28 | this.enterableItems.add(new ItemStack(material, 1, (short) data));
29 | }
30 |
31 | public boolean isCanEnterItems() {
32 | return canEnterItems;
33 | }
34 |
35 | public void setCanEnterItems(boolean canEnterItems) {
36 | this.canEnterItems = canEnterItems;
37 | }
38 |
39 | public boolean isCanDrag() {
40 | return canDrag;
41 | }
42 |
43 | public void setCanDrag(boolean canDrag) {
44 | this.canDrag = canDrag;
45 | }
46 |
47 | public List getEnterableItems() {
48 | return enterableItems;
49 | }
50 |
51 | public NotEnterableItemResponse getNotEnterableItemResponse() {
52 | return notEnterableItemResponse;
53 | }
54 |
55 | public void setNotEnterableItemResponse(NotEnterableItemResponse notEnterableItemResponse) {
56 | this.notEnterableItemResponse = notEnterableItemResponse;
57 | }
58 |
59 | public EnteredItemResponse getEnteredItemResponse() {
60 | return enteredItemResponse;
61 | }
62 |
63 | public void setEnteredItemResponse(EnteredItemResponse enteredItemResponse) {
64 | this.enteredItemResponse = enteredItemResponse;
65 | }
66 | }
67 |
--------------------------------------------------------------------------------
/src/main/java/pl/socketbyte/opengui/ItemBuilder.java:
--------------------------------------------------------------------------------
1 | package pl.socketbyte.opengui;
2 |
3 | import org.bukkit.Material;
4 | import org.bukkit.enchantments.Enchantment;
5 | import org.bukkit.inventory.ItemStack;
6 | import org.bukkit.inventory.meta.ItemMeta;
7 |
8 | import java.util.Arrays;
9 | import java.util.List;
10 | import java.util.Map;
11 |
12 | public class ItemBuilder {
13 |
14 | private ItemStack item;
15 | private ItemMeta meta;
16 |
17 | public ItemBuilder(Material material, int amount) {
18 | setItem(material, amount);
19 | }
20 |
21 | public ItemBuilder(Material material) {
22 | setItem(material, 1);
23 | }
24 |
25 | public ItemBuilder() {
26 | setItem(Material.DIRT, 1);
27 | }
28 |
29 | public ItemBuilder(ItemStack itemStack) {
30 | setItem(itemStack);
31 | }
32 |
33 | public ItemBuilder(Material material, int amount, int data) {
34 | setItem(material, amount, (short)data);
35 | }
36 |
37 | public ItemBuilder(Material material, int amount, short data) {
38 | setItem(material, amount, data);
39 | }
40 |
41 | public ItemBuilder setItem(ItemStack itemStack) {
42 | item = itemStack;
43 | meta = item.getItemMeta();
44 | return this;
45 | }
46 |
47 | public ItemBuilder setItem(Material material, int amount, short data) {
48 | item = new ItemStack(material, amount, data);
49 | meta = item.getItemMeta();
50 | return this;
51 | }
52 |
53 | public ItemBuilder setItem(Material material, int amount) {
54 | item = new ItemStack(material, amount);
55 | meta = item.getItemMeta();
56 | return this;
57 | }
58 |
59 | public ItemBuilder setName(String name) {
60 | meta.setDisplayName(ColorUtil.fixColor(name));
61 | update();
62 | return this;
63 | }
64 |
65 | public ItemBuilder setLore(List lore) {
66 | meta.setLore(ColorUtil.fixColor(lore));
67 | update();
68 | return this;
69 | }
70 |
71 | public ItemBuilder setLore(String... lore) {
72 | meta.setLore(Arrays.asList(ColorUtil.fixColor(lore)));
73 | update();
74 | return this;
75 | }
76 |
77 | public ItemBuilder setEnchantments(List enchantments) {
78 | for (ItemEnchantment enchantment : enchantments)
79 | meta.addEnchant(enchantment.getEnchantment(), enchantment.getLevel(), enchantment.isUnsafe());
80 | update();
81 | return this;
82 | }
83 |
84 | public ItemBuilder setEnchantments(Map enchantments) {
85 | for (Map.Entry entry : enchantments.entrySet())
86 | meta.addEnchant(entry.getKey(), entry.getValue(), true);
87 | update();
88 | return this;
89 | }
90 |
91 | public ItemBuilder update() {
92 | item.setItemMeta(meta);
93 | return this;
94 | }
95 |
96 | public ItemStack getItem() {
97 | return item;
98 | }
99 |
100 | public ItemMeta getMeta() {
101 | return meta;
102 | }
103 |
104 | }
105 |
--------------------------------------------------------------------------------
/src/main/java/pl/socketbyte/opengui/ItemEnchantment.java:
--------------------------------------------------------------------------------
1 | package pl.socketbyte.opengui;
2 |
3 | import org.bukkit.enchantments.Enchantment;
4 |
5 | public class ItemEnchantment {
6 |
7 | private Enchantment enchantment;
8 | private int level;
9 | private boolean unsafe;
10 |
11 | public ItemEnchantment(Enchantment enchantment, int level, boolean unsafe) {
12 | this.enchantment = enchantment;
13 | this.level = level;
14 | this.unsafe = unsafe;
15 | }
16 |
17 | public ItemEnchantment(Enchantment enchantment, int level) {
18 | this.enchantment = enchantment;
19 | this.level = level;
20 | this.unsafe = true;
21 | }
22 |
23 | public Enchantment getEnchantment() {
24 | return enchantment;
25 | }
26 |
27 | public void setEnchantment(Enchantment enchantment) {
28 | this.enchantment = enchantment;
29 | }
30 |
31 | public int getLevel() {
32 | return level;
33 | }
34 |
35 | public void setLevel(int level) {
36 | this.level = level;
37 | }
38 |
39 | public boolean isUnsafe() {
40 | return unsafe;
41 | }
42 |
43 | public void setUnsafe(boolean unsafe) {
44 | this.unsafe = unsafe;
45 | }
46 | }
47 |
--------------------------------------------------------------------------------
/src/main/java/pl/socketbyte/opengui/ItemPack.java:
--------------------------------------------------------------------------------
1 | package pl.socketbyte.opengui;
2 |
3 | import pl.socketbyte.opengui.event.ElementResponse;
4 |
5 | public class ItemPack {
6 |
7 | private int slot;
8 | private ItemBuilder itemBuilder;
9 | private ElementResponse elementResponse;
10 |
11 | public ItemPack(int slot, ItemBuilder itemBuilder) {
12 | this.itemBuilder = itemBuilder;
13 | this.slot = slot;
14 | }
15 |
16 | public ItemPack(int slot, ItemBuilder itemBuilder, ElementResponse elementResponse) {
17 | this.itemBuilder = itemBuilder;
18 | this.slot = slot;
19 | this.elementResponse = elementResponse;
20 | }
21 |
22 | public ItemPack(ItemBuilder itemBuilder) {
23 | this.itemBuilder = itemBuilder;
24 | }
25 |
26 | public ItemPack(ItemBuilder itemBuilder, ElementResponse elementResponse) {
27 | this.itemBuilder = itemBuilder;
28 | this.elementResponse = elementResponse;
29 | }
30 |
31 | public int getSlot() {
32 | return slot;
33 | }
34 |
35 | public void setSlot(int slot) {
36 | this.slot = slot;
37 | }
38 |
39 | public ItemBuilder getItemBuilder() {
40 | return itemBuilder;
41 | }
42 |
43 | public void setItemBuilder(ItemBuilder itemBuilder) {
44 | this.itemBuilder = itemBuilder;
45 | }
46 |
47 | public ElementResponse getElementResponse() {
48 | return elementResponse;
49 | }
50 |
51 | public void setElementResponse(ElementResponse elementResponse) {
52 | this.elementResponse = elementResponse;
53 | }
54 | }
55 |
--------------------------------------------------------------------------------
/src/main/java/pl/socketbyte/opengui/OpenGUI.java:
--------------------------------------------------------------------------------
1 | package pl.socketbyte.opengui;
2 |
3 | import org.bukkit.Bukkit;
4 | import org.bukkit.event.Listener;
5 | import org.bukkit.plugin.Plugin;
6 | import org.bukkit.plugin.PluginManager;
7 | import org.bukkit.plugin.java.JavaPlugin;
8 |
9 | import java.util.HashMap;
10 | import java.util.Map;
11 |
12 | public enum OpenGUI implements Listener {
13 | INSTANCE;
14 |
15 | private Plugin instance;
16 |
17 | private Map guiMap = new HashMap<>();
18 |
19 | public Map getGUIs() {
20 | return guiMap;
21 | }
22 |
23 | public GUIExtender getGUI(int id) {
24 | return guiMap.get(id);
25 | }
26 |
27 | public void register(JavaPlugin instance) {
28 | PluginManager pm = Bukkit.getPluginManager();
29 | Plugin plugin = null;
30 | for (Plugin bukkitPlugin : pm.getPlugins()) {
31 | if (bukkitPlugin.equals(instance)) {
32 | plugin = bukkitPlugin;
33 | break;
34 | }
35 | }
36 | this.instance = plugin;
37 | }
38 |
39 | public Plugin getInstance() {
40 | return instance;
41 | }
42 |
43 | public Map getGuiMap() {
44 | return guiMap;
45 | }
46 |
47 | }
48 |
--------------------------------------------------------------------------------
/src/main/java/pl/socketbyte/opengui/Rows.java:
--------------------------------------------------------------------------------
1 | package pl.socketbyte.opengui;
2 |
3 | public enum Rows {
4 |
5 | ONE(9),
6 | TWO(18),
7 | THREE(27),
8 | FOUR(36),
9 | FIVE(45),
10 | SIX(54);
11 |
12 | private int slots;
13 |
14 | Rows(int slots) {
15 | this.slots = slots;
16 | }
17 |
18 | public int getSlots() {
19 | return slots;
20 | }
21 |
22 | public void setSlots(int slots) {
23 | this.slots = slots;
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/src/main/java/pl/socketbyte/opengui/SimpleGUI.java:
--------------------------------------------------------------------------------
1 | package pl.socketbyte.opengui;
2 |
3 | import org.bukkit.event.inventory.InventoryCloseEvent;
4 | import org.bukkit.event.inventory.InventoryOpenEvent;
5 |
6 | public class SimpleGUI extends GUIExtender {
7 | public SimpleGUI(GUI gui) {
8 | super(gui);
9 | }
10 |
11 | @Override
12 | public void onOpen(InventoryOpenEvent event) {
13 | }
14 |
15 | @Override
16 | public void onClose(InventoryCloseEvent event) {
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/src/main/java/pl/socketbyte/opengui/event/ElementResponse.java:
--------------------------------------------------------------------------------
1 | package pl.socketbyte.opengui.event;
2 |
3 | import org.bukkit.event.inventory.InventoryClickEvent;
4 |
5 | public interface ElementResponse {
6 |
7 | void onClick(InventoryClickEvent event);
8 |
9 | }
10 |
--------------------------------------------------------------------------------
/src/main/java/pl/socketbyte/opengui/event/EnteredItemResponse.java:
--------------------------------------------------------------------------------
1 | package pl.socketbyte.opengui.event;
2 |
3 | import org.bukkit.event.inventory.InventoryClickEvent;
4 |
5 | public interface EnteredItemResponse {
6 |
7 | void event(InventoryClickEvent event);
8 |
9 | }
10 |
--------------------------------------------------------------------------------
/src/main/java/pl/socketbyte/opengui/event/NotEnterableItemResponse.java:
--------------------------------------------------------------------------------
1 | package pl.socketbyte.opengui.event;
2 |
3 | import org.bukkit.event.inventory.InventoryClickEvent;
4 |
5 | public interface NotEnterableItemResponse {
6 |
7 | void event(InventoryClickEvent event);
8 |
9 | }
10 |
--------------------------------------------------------------------------------
/src/main/java/pl/socketbyte/opengui/event/SerializedElementResponse.java:
--------------------------------------------------------------------------------
1 | package pl.socketbyte.opengui.event;
2 |
3 | import org.bukkit.event.inventory.InventoryClickEvent;
4 |
5 | public interface SerializedElementResponse {
6 |
7 | void onClick(InventoryClickEvent event, String action);
8 |
9 | }
10 |
--------------------------------------------------------------------------------
/src/main/java/pl/socketbyte/opengui/event/WindowResponse.java:
--------------------------------------------------------------------------------
1 | package pl.socketbyte.opengui.event;
2 |
3 | import org.bukkit.event.inventory.InventoryCloseEvent;
4 | import org.bukkit.event.inventory.InventoryOpenEvent;
5 |
6 | public interface WindowResponse {
7 |
8 | void onOpen(InventoryOpenEvent event);
9 | void onClose(InventoryCloseEvent event);
10 |
11 | }
--------------------------------------------------------------------------------
/src/main/java/pl/socketbyte/opengui/serializable/ItemSection.java:
--------------------------------------------------------------------------------
1 | package pl.socketbyte.opengui.serializable;
2 |
3 | import org.bukkit.configuration.serialization.ConfigurationSerialization;
4 |
5 | import java.util.LinkedHashMap;
6 | import java.util.Map;
7 |
8 | public class ItemSection implements Serializable {
9 |
10 | private int slot;
11 | private SerializableItemBuilder itemBuilder;
12 |
13 | public ItemSection() {
14 |
15 | }
16 |
17 | public ItemSection(int slot, SerializableItemBuilder builder) {
18 | this.slot = slot;
19 | this.itemBuilder = builder;
20 | }
21 |
22 | public ItemSection(Map data) {
23 | this.slot = (int) data.get("slot");
24 | this.itemBuilder = (SerializableItemBuilder) data.get("item");
25 | }
26 |
27 | @Override
28 | public void register() {
29 | ConfigurationSerialization.registerClass(this.getClass());
30 | }
31 |
32 | @Override
33 | public Map serialize() {
34 | Map data = new LinkedHashMap<>();
35 | data.put("slot", slot);
36 | data.put("item", itemBuilder.serialize());
37 | return data;
38 | }
39 |
40 | public int getSlot() {
41 | return slot;
42 | }
43 |
44 | public SerializableItemBuilder getItemBuilder() {
45 | return itemBuilder;
46 | }
47 | }
48 |
--------------------------------------------------------------------------------
/src/main/java/pl/socketbyte/opengui/serializable/Serializable.java:
--------------------------------------------------------------------------------
1 | package pl.socketbyte.opengui.serializable;
2 |
3 | import org.bukkit.configuration.serialization.ConfigurationSerializable;
4 |
5 | public interface Serializable extends ConfigurationSerializable {
6 |
7 | void register();
8 |
9 | }
10 |
--------------------------------------------------------------------------------
/src/main/java/pl/socketbyte/opengui/serializable/SerializableGUI.java:
--------------------------------------------------------------------------------
1 | package pl.socketbyte.opengui.serializable;
2 |
3 | import org.bukkit.Material;
4 | import org.bukkit.configuration.serialization.ConfigurationSerialization;
5 | import org.bukkit.inventory.ItemStack;
6 | import pl.socketbyte.opengui.GUI;
7 | import pl.socketbyte.opengui.ItemBuilder;
8 |
9 | import java.util.*;
10 |
11 | @SuppressWarnings("unchecked")
12 | public class SerializableGUI extends GUI implements Serializable {
13 |
14 | private final Map actions = new HashMap<>();
15 |
16 | public SerializableGUI(String title) {
17 | super(null, title);
18 | }
19 |
20 | public SerializableGUI(Map data) {
21 | super(null, (String) data.get("title"));
22 |
23 | List itemSections = (List) data.get("inventory");
24 |
25 | for (ItemSection section : itemSections)
26 | setItem(section.getSlot(), section.getItemBuilder());
27 | }
28 |
29 | public String getActionFor(int slot) {
30 | return actions.get(slot);
31 | }
32 |
33 | public boolean hasAction(int slot) {
34 | return actions.containsKey(slot);
35 | }
36 |
37 | public void addAction(int slot, String action) {
38 | this.actions.put(slot, action);
39 | }
40 |
41 | @Override
42 | public void register() {
43 | ConfigurationSerialization.registerClass(this.getClass());
44 | }
45 |
46 | @Override
47 | public Map serialize() {
48 | Map data = new LinkedHashMap<>();
49 | data.put("title", getTitle());
50 | data.put("actions", actions);
51 |
52 | List itemSections = new ArrayList<>();
53 | int slot = 0;
54 | for (ItemStack itemStack : getInventory().getContents()) {
55 | if (itemStack == null || itemStack.getType().equals(Material.AIR))
56 | continue;
57 | itemSections.add(new ItemSection(slot, new SerializableItemBuilder(new ItemBuilder(itemStack))));
58 | slot++;
59 | }
60 | List