Skip to content

Commit 32a8ab5

Browse files
committed
v1.3.0 - Added GUI
1 parent 8eacc17 commit 32a8ab5

File tree

8 files changed

+299
-6
lines changed

8 files changed

+299
-6
lines changed

README.md

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
# XpGet
22

3-
Плагин для Paper 1.21.10, который позволяет конвертировать ваш опыт в бутылочки опыта при наличии пустых стеклянных бутылочек. Поддерживает как фиксированное количество, так и автоматический расчёт максимума через команду `/xpget max`.
3+
Плагин для Paper 1.21.10, который позволяет конвертировать ваш опыт в бутылочки опыта при наличии пустых стеклянных бутылочек.
4+
Поддерживает как фиксированное количество, так и автоматический расчёт максимума.
5+
Для более удобной конвертации есть GUI интерфейс.
46

57
## ⚙️ Команда
68

79
| Команда | Описание |
810
|-----------------------------|-------------------------------------------------------------------|
11+
| `/xpget` | Открыть GUI меню для конвертации опыта |
912
| `/xpget [количество \|max]` | Конвертирует указанное количество опыта или максимально возможное |
1013
| `/xpget reload` | Перезагрузки конфига |
1114

@@ -26,6 +29,53 @@
2629
# XPGet Configuration
2730
exp-per-bottle: 7 # Сколько опыта нужно для заполнения одной бутылочки
2831

32+
# GUI Settings
33+
gui:
34+
title: "<gold>Конвертация опыта</gold>"
35+
36+
close:
37+
material: "BORDER"
38+
name: "<red>Закрыть"
39+
40+
border:
41+
material: "GRAY_STAINED_GLASS_PANE"
42+
name: "<gray>"
43+
44+
item-1:
45+
material: "EXPERIENCE_BOTTLE"
46+
name: "<green>1 бутылочка опыта"
47+
lore:
48+
- "<gray>Нажмите, чтобы конвертировать"
49+
- "<gray>1 бутылочку опыта"
50+
- ""
51+
- "<yellow>Требуется:"
52+
- "<gray>• <white>7 опыта</white>"
53+
- "<gray>• <white>1 пустая бутылочка</white>"
54+
55+
item-64:
56+
material: "EXPERIENCE_BOTTLE"
57+
name: "<yellow>64 бутылочки опыта"
58+
lore:
59+
- "<gray>Нажмите, чтобы конвертировать"
60+
- "<gray>64 бутылочки опыта"
61+
- ""
62+
- "<yellow>Требуется:"
63+
- "<gray>• <white>448 опыта</white>"
64+
- "<gray>• <white>64 пустых бутылочки</white>"
65+
66+
item-max:
67+
material: "ENCHANTED_BOOK"
68+
name: "<gold>Максимум"
69+
lore:
70+
- "<gray>Нажмите, чтобы конвертировать"
71+
- "<gray>максимально возможное"
72+
- "<gray>количество бутылочек"
73+
- ""
74+
- "<yellow>Будет использовано:"
75+
- "<gray>• <white>Весь доступный опыт</white>"
76+
- "<gray>• <white>Все пустые бутылочки</white>"
77+
- "<gray>• <white>Свободное место в инвентаре</white>"
78+
2979
# MiniMessages format supported
3080
messages:
3181
# Общие сообщения

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ plugins {
33
}
44

55
group = 'com.flyaway.xpget'
6-
version = '1.2.1'
6+
version = '1.3.0'
77

88
java {
99
toolchain {

src/main/java/com/flyaway/xpget/XpGetCommand.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
4444
}
4545

4646
if (args.length == 0) {
47-
sendUsage(player);
47+
openXpGetGUI(player);
4848
return true;
4949
}
5050

@@ -118,6 +118,11 @@ private void reloadConfigCommand(Player player) {
118118
}
119119
}
120120

121+
private void openXpGetGUI(Player player) {
122+
XpGetGUI gui = new XpGetGUI(player, plugin, this);
123+
gui.open();
124+
}
125+
121126
private void sendUsage(Player player) {
122127
sendMessage(player, "messages.usage");
123128
}
Lines changed: 157 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,157 @@
1+
package com.flyaway.xpget;
2+
3+
import org.bukkit.Bukkit;
4+
import org.bukkit.Material;
5+
import org.bukkit.entity.Player;
6+
import org.bukkit.event.inventory.InventoryClickEvent;
7+
import org.bukkit.inventory.Inventory;
8+
import org.bukkit.inventory.InventoryHolder;
9+
import org.bukkit.inventory.ItemStack;
10+
import org.bukkit.inventory.meta.ItemMeta;
11+
import net.kyori.adventure.text.Component;
12+
import net.kyori.adventure.text.minimessage.MiniMessage;
13+
import org.bukkit.plugin.java.JavaPlugin;
14+
import org.jetbrains.annotations.NotNull;
15+
16+
import java.util.List;
17+
18+
public class XpGetGUI implements InventoryHolder {
19+
20+
private final Inventory inventory;
21+
private final Player player;
22+
private final JavaPlugin plugin;
23+
private final XpGetCommand xpGetCommand;
24+
private final MiniMessage miniMessage = MiniMessage.miniMessage();
25+
26+
public XpGetGUI(Player player, JavaPlugin plugin, XpGetCommand xpGetCommand) {
27+
this.player = player;
28+
this.plugin = plugin;
29+
this.xpGetCommand = xpGetCommand;
30+
this.inventory = Bukkit.createInventory(this, 27, getTitle());
31+
initializeItems();
32+
}
33+
34+
private Component getTitle() {
35+
String title = plugin.getConfig().getString("gui.title", "<gold>Конвертация опыта");
36+
return miniMessage.deserialize(title);
37+
}
38+
39+
private void initializeItems() {
40+
ItemStack item1 = createGuiItem(
41+
"gui.item-1.material",
42+
"gui.item-1.name",
43+
"gui.item-1.lore",
44+
"gui.item-1.amount"
45+
);
46+
inventory.setItem(11, item1);
47+
48+
ItemStack item64 = createGuiItem(
49+
"gui.item-64.material",
50+
"gui.item-64.name",
51+
"gui.item-64.lore",
52+
"gui.item-64.amount"
53+
);
54+
inventory.setItem(13, item64);
55+
56+
ItemStack itemMax = createGuiItem(
57+
"gui.item-max.material",
58+
"gui.item-max.name",
59+
"gui.item-max.lore",
60+
"gui.item-max.amount"
61+
);
62+
inventory.setItem(15, itemMax);
63+
64+
ItemStack close = createGuiItem(
65+
"gui.close.material",
66+
"gui.close.name",
67+
"gui.close.lore",
68+
"gui.close.amount"
69+
);
70+
inventory.setItem(22, close);
71+
72+
ItemStack border = createGuiItem(
73+
"gui.border.material",
74+
"gui.border.name",
75+
"gui.border.lore",
76+
"gui.border.amount"
77+
);
78+
79+
for (int i = 0; i < inventory.getSize(); i++) {
80+
if (inventory.getItem(i) == null) {
81+
inventory.setItem(i, border);
82+
}
83+
}
84+
}
85+
86+
private ItemStack createGuiItem(String materialPath, String namePath, String lorePath, String amountPath) {
87+
Material defaultMaterial = Material.STONE;
88+
String materialName = plugin.getConfig().getString(materialPath, defaultMaterial.name());
89+
Material material;
90+
try {
91+
material = Material.valueOf(materialName.toUpperCase());
92+
} catch (IllegalArgumentException e) {
93+
material = defaultMaterial;
94+
plugin.getLogger().warning("Invalid material in config: " + materialName + ", using default: " + defaultMaterial);
95+
}
96+
97+
ItemStack item = new ItemStack(material, 1);
98+
ItemMeta meta = item.getItemMeta();
99+
100+
String displayName = plugin.getConfig().getString(namePath, "");
101+
if (!displayName.isEmpty()) {
102+
meta.displayName(miniMessage.deserialize(displayName));
103+
}
104+
105+
List<String> loreConfig = plugin.getConfig().getStringList(lorePath);
106+
if (!loreConfig.isEmpty()) {
107+
List<Component> lore = loreConfig.stream()
108+
.map(miniMessage::deserialize)
109+
.toList();
110+
meta.lore(lore);
111+
}
112+
113+
int amount = plugin.getConfig().getInt(amountPath, 1);
114+
if (amount > 1 & amount <= 64) {
115+
item.setAmount(amount);
116+
}
117+
118+
item.setItemMeta(meta);
119+
return item;
120+
}
121+
122+
public void open() {
123+
player.openInventory(inventory);
124+
}
125+
126+
public void handleClick(InventoryClickEvent event) {
127+
event.setCancelled(true);
128+
129+
if (event.getCurrentItem() == null || event.getCurrentItem().getType() == Material.AIR) {
130+
return;
131+
}
132+
133+
int slot = event.getSlot();
134+
135+
Bukkit.getScheduler().runTask(plugin, () -> {
136+
switch (slot) {
137+
case 11:
138+
xpGetCommand.onCommand(player, null, "xpget", new String[]{"1"});
139+
break;
140+
case 13:
141+
xpGetCommand.onCommand(player, null, "xpget", new String[]{"64"});
142+
break;
143+
case 15:
144+
xpGetCommand.onCommand(player, null, "xpget", new String[]{"max"});
145+
break;
146+
case 22:
147+
player.closeInventory();
148+
break;
149+
}
150+
});
151+
}
152+
153+
@Override
154+
public @NotNull Inventory getInventory() {
155+
return inventory;
156+
}
157+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package com.flyaway.xpget;
2+
3+
import org.bukkit.event.EventHandler;
4+
import org.bukkit.event.Listener;
5+
import org.bukkit.event.inventory.InventoryClickEvent;
6+
import org.bukkit.event.inventory.InventoryDragEvent;
7+
import org.bukkit.inventory.InventoryHolder;
8+
9+
public class XpGetListener implements Listener {
10+
11+
public XpGetListener() {
12+
}
13+
14+
@EventHandler
15+
public void onInventoryClick(InventoryClickEvent event) {
16+
InventoryHolder holder = event.getInventory().getHolder();
17+
18+
if (holder instanceof XpGetGUI xpGetGUI) {
19+
xpGetGUI.handleClick(event);
20+
}
21+
}
22+
23+
@EventHandler
24+
public void onInventoryDrag(InventoryDragEvent event) {
25+
InventoryHolder holder = event.getInventory().getHolder();
26+
27+
if (holder instanceof XpGetGUI) {
28+
event.setCancelled(true);
29+
}
30+
}
31+
}

src/main/java/com/flyaway/xpget/XpGetPlugin.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,10 @@ public class XpGetPlugin extends JavaPlugin {
66

77
@Override
88
public void onEnable() {
9-
XpGetCommand xpGetCommand = new XpGetCommand(this);
109
saveDefaultConfig();
10+
XpGetCommand xpGetCommand = new XpGetCommand(this);
11+
12+
getServer().getPluginManager().registerEvents(new XpGetListener(), this);
1113

1214
getCommand("xpget").setExecutor(xpGetCommand);
1315
getCommand("xpget").setTabCompleter(xpGetCommand);

src/main/resources/config.yml

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,54 @@
11
# XPGet Configuration
22
exp-per-bottle: 7 # Сколько опыта нужно для заполнения одной бутылочки
33

4+
# GUI Settings
5+
gui:
6+
title: "<gold>Конвертация опыта</gold>"
7+
8+
close:
9+
material: "BARRIER"
10+
name: "<red>Закрыть"
11+
12+
border:
13+
material: "GRAY_STAINED_GLASS_PANE"
14+
name: "<gray>"
15+
16+
item-1:
17+
material: "EXPERIENCE_BOTTLE"
18+
name: "<green>1 бутылочка опыта"
19+
lore:
20+
- "<gray>Нажмите, чтобы конвертировать"
21+
- "<gray>1 бутылочку опыта"
22+
- ""
23+
- "<yellow>Требуется:"
24+
- "<gray>• <white>7 опыта</white>"
25+
- "<gray>• <white>1 пустая бутылочка</white>"
26+
27+
item-64:
28+
material: "EXPERIENCE_BOTTLE"
29+
amount: 64
30+
name: "<yellow>64 бутылочки опыта"
31+
lore:
32+
- "<gray>Нажмите, чтобы конвертировать"
33+
- "<gray>64 бутылочки опыта"
34+
- ""
35+
- "<yellow>Требуется:"
36+
- "<gray>• <white>448 опыта</white>"
37+
- "<gray>• <white>64 пустых бутылочки</white>"
38+
39+
item-max:
40+
material: "ENCHANTED_BOOK"
41+
name: "<gold>Максимум"
42+
lore:
43+
- "<gray>Нажмите, чтобы конвертировать"
44+
- "<gray>максимально возможное"
45+
- "<gray>количество бутылочек"
46+
- ""
47+
- "<yellow>Будет использовано:"
48+
- "<gray>• <white>Весь доступный опыт</white>"
49+
- "<gray>• <white>Все пустые бутылочки</white>"
50+
- "<gray>• <white>Свободное место в инвентаре</white>"
51+
452
# MiniMessages format supported
553
messages:
654
# Общие сообщения

src/main/resources/plugin.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
name: XpGet
2-
version: 1.2.1
2+
version: 1.3.0
33
main: com.flyaway.xpget.XpGetPlugin
44
api-version: 1.21
55
author: FlyAwayMaking
@@ -9,7 +9,7 @@ description: Конвертация опыта в бутылочки опыта
99
commands:
1010
xpget:
1111
description: Конвертировать опыт в бутылочки опыта
12-
usage: /xpget [amount/max/reload]
12+
usage: /<command> [amount/max/reload]
1313
permission-message: "<red>У вас нет прав для использования этой команды!"
1414

1515
permissions:

0 commit comments

Comments
 (0)