Skip to content
This repository was archived by the owner on Mar 8, 2022. It is now read-only.

Commit 80b30b6

Browse files
committed
quest gui #31
1 parent 6228fc0 commit 80b30b6

File tree

5 files changed

+239
-1
lines changed

5 files changed

+239
-1
lines changed

src/main/java/cat/nyaa/HamsterEcoHelper/quest/QuestListener.java

+13
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@
22

33
import cat.nyaa.HamsterEcoHelper.HamsterEcoHelper;
44
import cat.nyaa.HamsterEcoHelper.I18n;
5+
import cat.nyaa.HamsterEcoHelper.quest.gui.QuestStationGui;
56
import cat.nyaa.HamsterEcoHelper.utils.database.tables.quest.QuestEntry;
67
import cat.nyaa.HamsterEcoHelper.utils.database.tables.quest.QuestStation;
8+
import org.bukkit.Bukkit;
79
import org.bukkit.Location;
810
import org.bukkit.Material;
911
import org.bukkit.block.Block;
@@ -14,7 +16,10 @@
1416
import org.bukkit.event.block.Action;
1517
import org.bukkit.event.block.BlockBreakEvent;
1618
import org.bukkit.event.block.SignChangeEvent;
19+
import org.bukkit.event.inventory.InventoryClickEvent;
1720
import org.bukkit.event.player.PlayerInteractEvent;
21+
import org.bukkit.inventory.Inventory;
22+
import org.bukkit.inventory.InventoryView;
1823

1924
import java.util.List;
2025

@@ -75,6 +80,14 @@ public void onPlayerInteract(PlayerInteractEvent event) {
7580
for (QuestEntry q : quests) {
7681
event.getPlayer().sendMessage("QUEST: " + q.questName);
7782
}
83+
QuestStationGui.getStationGui(station).openFor(event.getPlayer());
84+
}
85+
}
86+
87+
@EventHandler
88+
public void onInventoryClicked(InventoryClickEvent ev) {
89+
if (ev.getClickedInventory().getHolder() instanceof QuestStationGui) {
90+
((QuestStationGui)ev.getClickedInventory().getHolder()).onInventoryClicked(ev);
7891
}
7992
}
8093
}

src/main/java/cat/nyaa/HamsterEcoHelper/quest/QuestWizard.java

+15-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import cat.nyaa.HamsterEcoHelper.HamsterEcoHelper;
44
import cat.nyaa.HamsterEcoHelper.I18n;
5+
import cat.nyaa.HamsterEcoHelper.utils.Utils;
56
import cat.nyaa.HamsterEcoHelper.utils.database.tables.quest.QuestEntry;
67
import org.bukkit.Bukkit;
78
import org.bukkit.Material;
@@ -28,6 +29,8 @@ public class QuestWizard implements Listener {
2829
private State state;
2930
private Timer timer;
3031

32+
private final boolean reallyTakeItem;
33+
3134
private class Timer extends BukkitRunnable {
3235
boolean cancelled = false;
3336

@@ -91,12 +94,19 @@ public QuestWizard(String stationUUID, Player p, int timeoutSeconds) {
9194
p.sendMessage(I18n.format("user.quest.wizard." + state.name().toLowerCase()));
9295
Bukkit.getServer().getPluginManager().registerEvents(this, HamsterEcoHelper.instance);
9396
timer = new Timer(timeout);
97+
this.reallyTakeItem = !p.hasPermission("heh.quest.admin");
9498
}
9599

96100
private void cancelWizard() {
97101
state = CANCEL;
98102
player.sendMessage(I18n.format("user.quest.wizard.cancelled"));
99103
HandlerList.unregisterAll(this);
104+
if (reallyTakeItem) { // give items back
105+
for (ItemStack item : entry.rewardItem) {
106+
Utils.giveItem(player, item);
107+
}
108+
HamsterEcoHelper.instance.eco.deposit(player, entry.rewardMoney);
109+
}
100110
}
101111

102112
@EventHandler(ignoreCancelled = true)
@@ -157,7 +167,7 @@ public void onPlayerChat(PlayerChatEvent ev) {
157167
state = WAITING_TIME_LIMIT;
158168
}
159169
break;
160-
case WAITING_REWARD_ITEM: // TODO remove item from user inventory
170+
case WAITING_REWARD_ITEM:
161171
if ("end".equalsIgnoreCase(input)) {
162172
if (entry.rewardItem == null || entry.rewardItem.size() <= 0) {
163173
player.sendMessage(I18n.format("user.quest.wizard.at_least_one"));
@@ -170,6 +180,9 @@ public void onPlayerChat(PlayerChatEvent ev) {
170180
player.sendMessage(I18n.format("user.quest.wizard.hold_item_plz"));
171181
} else {
172182
entry.rewardItem.add(stack.clone());
183+
if (reallyTakeItem) {
184+
player.getInventory().setItemInMainHand(new ItemStack(Material.AIR));
185+
}
173186
}
174187
}
175188
break;
@@ -178,6 +191,7 @@ public void onPlayerChat(PlayerChatEvent ev) {
178191
double money = Double.parseDouble(input);
179192
entry.rewardMoney = money;
180193
state = WAITING_TIME_LIMIT;
194+
HamsterEcoHelper.instance.eco.withdraw(player, money);
181195
} catch (NumberFormatException ex) {
182196
player.sendMessage(I18n.format("user.quest.wizard.invalid_number"));
183197
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
package cat.nyaa.HamsterEcoHelper.quest.gui;
2+
3+
import org.bukkit.Bukkit;
4+
import org.bukkit.entity.Player;
5+
import org.bukkit.event.inventory.InventoryClickEvent;
6+
import org.bukkit.inventory.Inventory;
7+
import org.bukkit.inventory.InventoryHolder;
8+
import org.bukkit.inventory.ItemStack;
9+
10+
import java.util.HashMap;
11+
import java.util.Map;
12+
import java.util.SortedMap;
13+
import java.util.UUID;
14+
15+
/**
16+
* Every instance of this class should represent it's very own data source.
17+
* No two instance should share single source.
18+
* e.g. You should never make two instances for one sign shop.
19+
* otherwise synchronization issues will occur
20+
*/
21+
public abstract class PaginatedListGui implements InventoryHolder {
22+
23+
protected final Map<UUID, Inventory> openedUI = new HashMap<>();
24+
protected final Map<UUID, Integer> openedUiPages = new HashMap<>();
25+
protected final String basicTitle;
26+
27+
private PairList<String, ItemStack> currentItems;
28+
29+
protected PaginatedListGui(String title) {
30+
basicTitle = title;
31+
}
32+
33+
/**
34+
* Show the player this GUI
35+
*/
36+
public void openFor(Player player) {
37+
openedUiPages.put(player.getUniqueId(), 1);
38+
Inventory inv = Bukkit.createInventory(this, 54, basicTitle + " - Page 1");
39+
currentItems = getFullGuiContent();
40+
ItemStack[] t = currentItems.getValues(0,45).toArray(new ItemStack[0]);
41+
inv.setContents(t);
42+
openedUI.put(player.getUniqueId(), inv);
43+
player.openInventory(inv);
44+
// TODO
45+
}
46+
47+
/**
48+
* This method should never be called because one GUI
49+
* can have multiple inventories.
50+
* The sole purpose is to make the compiler happy.
51+
*
52+
* The InventoryHolder is used to identify which GUI an inventory belongs to
53+
*/
54+
@Override
55+
public final Inventory getInventory() {
56+
throw new UnsupportedOperationException();
57+
}
58+
59+
/**
60+
* event callback.
61+
* plugins are required to register their own listener.
62+
* this may be changed when this API gets merged into NyaaCore.
63+
* @param ev
64+
*/
65+
public void onInventoryClicked(InventoryClickEvent ev) {
66+
// TODO
67+
ev.setCancelled(true);
68+
if (ev.getClickedInventory() == null) return;
69+
if (!(ev.getWhoClicked() instanceof Player)) {
70+
System.err.print("inventory not clicked by player?");
71+
return;
72+
}
73+
if (ev.getClickedInventory() != openedUI.get(ev.getWhoClicked().getUniqueId())) {
74+
System.err.print("user clicked an unknown inventory.");
75+
System.err.print("clicked:"+ev.getInventory());
76+
System.err.print("expected:"+openedUI.get(ev.getWhoClicked().getUniqueId()));
77+
//return;
78+
// TODO it seems bukkit does some magic when opening an inventory
79+
// so we need another way to track inventories (not by "==")
80+
}
81+
Integer page = openedUiPages.get(ev.getWhoClicked().getUniqueId());
82+
if (page == null) {
83+
System.err.print("user clicked an unknown inventory page no.");
84+
return;
85+
}
86+
87+
itemClicked((Player)ev.getWhoClicked(), currentItems.getKey((page-1)*45+ev.getSlot()));
88+
}
89+
90+
/**
91+
* Should be implemented by subclasses.
92+
* @return An ordered map of items to be shown in this GUI
93+
*/
94+
protected abstract PairList<String, ItemStack> getFullGuiContent();
95+
protected abstract void itemClicked(Player player, String itemKey);
96+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package cat.nyaa.HamsterEcoHelper.quest.gui;
2+
3+
import java.util.*;
4+
5+
public class PairList<K, V> implements Iterable<PairList<K, V>.Pair>{
6+
public class Pair {
7+
public Pair(K k, V v) {
8+
key = k;
9+
value = v;
10+
}
11+
12+
public K key;
13+
public V value;
14+
}
15+
16+
private List<Pair> l = new ArrayList<>();
17+
private Map<K, V> m = new HashMap<>();
18+
19+
public void put(K key, V val) {
20+
l.add(new Pair(key, val));
21+
m.put(key, val);
22+
}
23+
24+
public V get(K key) {
25+
return m.get(key);
26+
}
27+
28+
public List<V> getValues(int startIdx, int endIdx) {
29+
int size = endIdx < l.size()? endIdx-startIdx: l.size()-startIdx;
30+
List<V> ret = new ArrayList<>();
31+
for (int i=0;i<size;i++) {
32+
ret.add(l.get(startIdx+i).value);
33+
}
34+
return ret;
35+
}
36+
37+
public K getKey(int index) {
38+
return index>=l.size()? null:l.get(index).key;
39+
}
40+
41+
@Override
42+
public Iterator<Pair> iterator() {
43+
return new Iterator<Pair>() {
44+
private int idx = 0;
45+
@Override
46+
public boolean hasNext() {
47+
return idx < l.size();
48+
}
49+
50+
@Override
51+
public Pair next() {
52+
return l.get(idx++);
53+
}
54+
};
55+
}
56+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package cat.nyaa.HamsterEcoHelper.quest.gui;
2+
3+
import cat.nyaa.HamsterEcoHelper.HamsterEcoHelper;
4+
import cat.nyaa.HamsterEcoHelper.utils.database.tables.quest.QuestEntry;
5+
import cat.nyaa.HamsterEcoHelper.utils.database.tables.quest.QuestStation;
6+
import cat.nyaa.nyaacore.Message;
7+
import org.bukkit.Material;
8+
import org.bukkit.entity.Player;
9+
import org.bukkit.inventory.ItemStack;
10+
import org.bukkit.inventory.meta.ItemMeta;
11+
12+
import java.util.*;
13+
14+
public class QuestStationGui extends PaginatedListGui {
15+
// static methods to make gui unique for each station
16+
private static final Map<String, QuestStationGui> cachedGui = new HashMap<>();
17+
public static QuestStationGui getStationGui(QuestStation station) {
18+
QuestStationGui gui = cachedGui.get(station.id);
19+
if (gui == null) {
20+
gui = new QuestStationGui(station);
21+
cachedGui.put(station.id, gui);
22+
}
23+
return gui;
24+
}
25+
26+
// non-static members
27+
28+
private final String stationId;
29+
private QuestStationGui(QuestStation station) {
30+
super("Quest Station #" + station.id);
31+
stationId = station.id;
32+
}
33+
34+
@Override
35+
protected PairList<String, ItemStack> getFullGuiContent() {
36+
PairList<String, ItemStack> pair = new PairList<>();
37+
List<QuestEntry> quests = HamsterEcoHelper.instance.database.query(QuestEntry.class).whereEq("station_id", stationId).select();
38+
for (QuestEntry e : quests) {
39+
ItemStack i = new ItemStack(Material.BOOK_AND_QUILL);
40+
ItemMeta m = i.getItemMeta();
41+
m.setDisplayName(e.questName);
42+
i.setItemMeta(m);
43+
pair.put(e.id, i);
44+
}
45+
return pair;
46+
}
47+
48+
@Override
49+
protected void itemClicked(Player player, String itemKey) {
50+
QuestEntry e = HamsterEcoHelper.instance.database.query(QuestEntry.class).whereEq("id", itemKey).selectUnique();
51+
player.sendMessage("Quest: " + e.questName);
52+
player.sendMessage(e.questDescription);
53+
if (e.rewardType == QuestEntry.QuestType.ITEM) {
54+
for (ItemStack i : e.rewardItem) {
55+
new Message("").append(i).send(player);
56+
}
57+
}
58+
}
59+
}

0 commit comments

Comments
 (0)