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

Commit 771c838

Browse files
committed
[skip ci]quest db #31
1 parent ac9e440 commit 771c838

File tree

10 files changed

+405
-1
lines changed

10 files changed

+405
-1
lines changed

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

+3
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import cat.nyaa.HamsterEcoHelper.balance.BalanceAPI;
66
import cat.nyaa.HamsterEcoHelper.market.MarketListener;
77
import cat.nyaa.HamsterEcoHelper.market.MarketManager;
8+
import cat.nyaa.HamsterEcoHelper.quest.QuestListener;
89
import cat.nyaa.HamsterEcoHelper.requisition.RequisitionManager;
910
import cat.nyaa.HamsterEcoHelper.signshop.SignShopManager;
1011
import cat.nyaa.HamsterEcoHelper.utils.EconomyUtil;
@@ -33,6 +34,7 @@ public class HamsterEcoHelper extends JavaPlugin {
3334
public MarketListener marketListener;
3435
public AdsManager adsManager;
3536
public Essentials ess = null;
37+
public QuestListener questListener;
3638

3739
@Override
3840
public void onEnable() {
@@ -53,6 +55,7 @@ public void onEnable() {
5355
balanceAPI = new BalanceAPI(this);
5456
signShopManager = new SignShopManager(this);
5557
signShopListener = new SignShopListener(this);
58+
questListener = new QuestListener(this);
5659
adsManager = new AdsManager(this);
5760
if (getServer().getPluginManager().getPlugin("Essentials") != null) {
5861
this.ess = (Essentials) getServer().getPluginManager().getPlugin("Essentials");
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package cat.nyaa.HamsterEcoHelper.quest;
2+
3+
import cat.nyaa.HamsterEcoHelper.HamsterEcoHelper;
4+
import cat.nyaa.HamsterEcoHelper.utils.database.tables.quest.QuestInstance;
5+
import cat.nyaa.HamsterEcoHelper.utils.database.tables.quest.QuestStation;
6+
import org.bukkit.Location;
7+
8+
9+
public class QuestCommon {
10+
public static QuestStation toQuestStation(Location loc) {
11+
try {
12+
return HamsterEcoHelper.instance.database.query(QuestStation.class)
13+
.whereEq("world", loc.getWorld().getName())
14+
.whereEq("x", loc.getBlockX())
15+
.whereEq("y", loc.getBlockY())
16+
.whereEq("z", loc.getBlockZ())
17+
.selectUnique();
18+
} catch (RuntimeException ex) {
19+
return null;
20+
}
21+
}
22+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package cat.nyaa.HamsterEcoHelper.quest;
2+
3+
import cat.nyaa.HamsterEcoHelper.HamsterEcoHelper;
4+
import cat.nyaa.HamsterEcoHelper.I18n;
5+
import cat.nyaa.HamsterEcoHelper.utils.database.tables.quest.QuestStation;
6+
import org.bukkit.block.Block;
7+
import org.bukkit.entity.Player;
8+
import org.bukkit.event.EventHandler;
9+
import org.bukkit.event.EventPriority;
10+
import org.bukkit.event.Listener;
11+
import org.bukkit.event.block.Action;
12+
import org.bukkit.event.block.SignChangeEvent;
13+
import org.bukkit.event.player.PlayerInteractEvent;
14+
15+
public class QuestListener implements Listener {
16+
private final HamsterEcoHelper plugin;
17+
18+
public QuestListener(HamsterEcoHelper plugin) {
19+
this.plugin = plugin;
20+
plugin.getServer().getPluginManager().registerEvents(this, plugin);
21+
}
22+
23+
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
24+
public void onSignChangeEvent(SignChangeEvent event) {
25+
if ("[Quest]".equalsIgnoreCase(event.getLine(0))) {
26+
Player player = event.getPlayer();
27+
if (!player.hasPermission("heh.quest.admin")) return;
28+
Double fee;
29+
try {
30+
fee = Double.parseDouble(event.getLine(3));
31+
} catch (NumberFormatException ex) {
32+
fee = null;
33+
}
34+
if (fee == null) {
35+
event.getPlayer().sendMessage(I18n.format("user.quest.invalid_fee"));
36+
return;
37+
}
38+
plugin.database.query(QuestStation.class).insert(new QuestStation(event.getBlock().getLocation(), fee));
39+
event.getPlayer().sendMessage(I18n.format("user.quest.station_created"));
40+
}
41+
}
42+
43+
@EventHandler
44+
public void onPlayerInteract(PlayerInteractEvent event) {
45+
if (event.getAction() == Action.RIGHT_CLICK_BLOCK) {
46+
Block block = event.getClickedBlock();
47+
QuestStation station = QuestCommon.toQuestStation(block.getLocation());
48+
if (station == null) return;
49+
event.getPlayer().sendMessage("Station clicked");
50+
}
51+
}
52+
}

src/main/java/cat/nyaa/HamsterEcoHelper/utils/Utils.java

+70
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,24 @@
22

33
import cat.nyaa.HamsterEcoHelper.HamsterEcoHelper;
44
import cat.nyaa.nyaacore.utils.InventoryUtils;
5+
import cat.nyaa.nyaacore.utils.ReflectionUtils;
6+
import com.google.common.io.BaseEncoding;
57
import org.bukkit.Bukkit;
68
import org.bukkit.OfflinePlayer;
79
import org.bukkit.entity.Player;
810
import org.bukkit.inventory.ItemStack;
911
import org.librazy.nyaautils_lang_checker.LangKey;
1012
import org.librazy.nyaautils_lang_checker.LangKeyType;
1113

14+
import java.io.ByteArrayOutputStream;
15+
import java.io.IOException;
16+
import java.util.ArrayList;
1217
import java.util.List;
1318
import java.util.Random;
1419
import java.util.function.Function;
20+
import java.util.zip.DataFormatException;
21+
import java.util.zip.Deflater;
22+
import java.util.zip.Inflater;
1523

1624
public class Utils {
1725
public static final Random random = new Random();
@@ -88,4 +96,66 @@ public static String getItemName(ItemStack item) {
8896
}
8997
return itemName;
9098
}
99+
100+
public static String encodeItemStack(ItemStack item) {
101+
byte[] nbt = ReflectionUtils.dumpRawNbt(item);
102+
byte[] compressedNbt = null;
103+
try {
104+
Deflater compresser = new Deflater();
105+
compresser.setInput(nbt);
106+
compresser.finish();
107+
ByteArrayOutputStream bos = new ByteArrayOutputStream();
108+
while (!compresser.finished()) {
109+
byte[] buf = new byte[1024];
110+
int len = compresser.deflate(buf);
111+
bos.write(buf, 0, len);
112+
}
113+
compresser.end();
114+
bos.close();
115+
compressedNbt = bos.toByteArray();
116+
return BaseEncoding.base64().encode(compressedNbt);
117+
} catch (IOException ex) {
118+
throw new RuntimeException(ex);
119+
}
120+
}
121+
122+
public static ItemStack decodeItemStack(String item) {
123+
byte[] nbt;
124+
byte[] compressedNbt = BaseEncoding.base64().decode(item);
125+
126+
try {
127+
Inflater decompresser = new Inflater();
128+
decompresser.setInput(compressedNbt);
129+
ByteArrayOutputStream bos = new ByteArrayOutputStream();
130+
while (!decompresser.finished()) {
131+
byte[] buf = new byte[1024];
132+
int len = decompresser.inflate(buf);
133+
bos.write(buf, 0, len);
134+
}
135+
decompresser.end();
136+
bos.close();
137+
nbt = bos.toByteArray();
138+
return ReflectionUtils.loadItemStackFromNbt(nbt);
139+
} catch (DataFormatException | IOException ex) {
140+
throw new RuntimeException(ex);
141+
}
142+
}
143+
144+
public static String encodeItemStacks(List<ItemStack> items) {
145+
if (items.size() <= 0) return "";
146+
StringBuilder b = new StringBuilder();
147+
b.append(encodeItemStack(items.get(0)));
148+
for (int i=1;i<items.size();i++) {
149+
b.append(",");
150+
b.append(encodeItemStack(items.get(i)));
151+
}
152+
return b.toString();
153+
}
154+
155+
public static List<ItemStack> decodeItemStacks(String items) {
156+
String[] a = items.split(",");
157+
List<ItemStack> r = new ArrayList<>();
158+
for (String str : a) r.add(decodeItemStack(str));
159+
return r;
160+
}
91161
}

src/main/java/cat/nyaa/HamsterEcoHelper/utils/database/Database.java

+7-1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@
55
import cat.nyaa.HamsterEcoHelper.utils.database.tables.ItemLog;
66
import cat.nyaa.HamsterEcoHelper.utils.database.tables.MarketItem;
77
import cat.nyaa.HamsterEcoHelper.utils.database.tables.TempStorageRepo;
8+
import cat.nyaa.HamsterEcoHelper.utils.database.tables.quest.QuestEntry;
9+
import cat.nyaa.HamsterEcoHelper.utils.database.tables.quest.QuestInstance;
10+
import cat.nyaa.HamsterEcoHelper.utils.database.tables.quest.QuestStation;
811
import cat.nyaa.HamsterEcoHelper.utils.database.tables.signshop.LottoStorageLocation;
912
import cat.nyaa.HamsterEcoHelper.utils.database.tables.signshop.ShopStorageLocation;
1013
import cat.nyaa.HamsterEcoHelper.utils.database.tables.signshop.Sign;
@@ -51,7 +54,10 @@ protected Class<?>[] getTables() {
5154
Sign.class,
5255
ShopStorageLocation.class,
5356
SignShop.class,
54-
LottoStorageLocation.class
57+
LottoStorageLocation.class,
58+
QuestStation.class,
59+
QuestEntry.class,
60+
QuestInstance.class
5561
};
5662
}
5763

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
package cat.nyaa.HamsterEcoHelper.utils.database.tables.quest;
2+
3+
import cat.nyaa.HamsterEcoHelper.utils.Utils;
4+
import cat.nyaa.nyaacore.database.DataColumn;
5+
import cat.nyaa.nyaacore.database.DataTable;
6+
import cat.nyaa.nyaacore.database.PrimaryKey;
7+
import org.bukkit.inventory.ItemStack;
8+
9+
import java.time.Duration;
10+
import java.time.ZonedDateTime;
11+
import java.util.List;
12+
13+
@DataTable("quest_entry")
14+
public class QuestEntry {
15+
public enum QuestType {
16+
NONE,
17+
ITEM,
18+
MONEY,
19+
OTHER;
20+
}
21+
22+
@DataColumn
23+
@PrimaryKey
24+
public String id;
25+
@DataColumn
26+
public String station_id; // which station this quest is in
27+
@DataColumn
28+
public String questName;
29+
@DataColumn
30+
public String questDescription;
31+
@DataColumn
32+
public String publisher; // uuid of the player who published the quest
33+
@DataColumn
34+
public Boolean claimable; // if this quest can be claimed by a player
35+
@DataColumn
36+
public Boolean isRecurrentQuest; // if the quest can be claimed by many players. NOTE: the rewards will be created from nowhere (i.e. duplicated)
37+
@DataColumn
38+
public Long singlePlayerClaimLimit; // how many time a single player can claim this quest, valid only if is recurrent quest
39+
40+
public QuestType prerequisiteType; // NONE, ITEM or MONEY
41+
public List<ItemStack> prerequisiteItems;
42+
@DataColumn("prereq_money")
43+
public Double prerequisiteMoney;
44+
45+
public List<ItemStack> earlyRewardItems; // items will be given to player when they claimed the quest
46+
47+
public QuestType targetType; // NONE, ITEM or OTHER
48+
public List<ItemStack> targetItems;
49+
50+
public QuestType rewardType; // NONE, ITEM or MONEY
51+
public List<ItemStack> rewardItem;
52+
@DataColumn("reward_money")
53+
public Double rewardMoney;
54+
55+
public ZonedDateTime questExpire; // when will the quest expire
56+
public Duration questTimeLimit; // the time limit the quest should be finished once it's claimed
57+
58+
@DataColumn("prereq_type")
59+
public String getPrerequisiteType() {
60+
return prerequisiteType.name();
61+
}
62+
63+
public void setPrerequisiteType(String prerequisiteType) {
64+
this.prerequisiteType = QuestType.valueOf(prerequisiteType);
65+
}
66+
67+
@DataColumn("prereq_item")
68+
public String getPrerequisiteItems() {
69+
return Utils.encodeItemStacks(prerequisiteItems);
70+
}
71+
72+
public void setPrerequisiteItems(String prerequisiteItems) {
73+
this.prerequisiteItems = Utils.decodeItemStacks(prerequisiteItems);
74+
}
75+
76+
@DataColumn("early_reward_item")
77+
public String getEarlyRewardItems() {
78+
return Utils.encodeItemStacks(earlyRewardItems);
79+
}
80+
81+
public void setEarlyRewardItems(String earlyRewardItems) {
82+
this.earlyRewardItems = Utils.decodeItemStacks(earlyRewardItems);
83+
}
84+
85+
@DataColumn("target_type")
86+
public String getTargetType() {
87+
return targetType.name();
88+
}
89+
90+
public void setTargetType(String targetType) {
91+
this.targetType = QuestType.valueOf(targetType);
92+
}
93+
94+
@DataColumn("target_item")
95+
public String getTargetItems() {
96+
return Utils.encodeItemStacks(targetItems);
97+
}
98+
99+
public void setTargetItems(String targetItems) {
100+
this.targetItems = Utils.decodeItemStacks(targetItems);
101+
}
102+
103+
@DataColumn("reward_type")
104+
public String getRewardType() {
105+
return rewardType.name();
106+
}
107+
108+
public void setRewardType(String rewardType) {
109+
this.rewardType = QuestType.valueOf(rewardType);
110+
}
111+
112+
@DataColumn("reward_item")
113+
public String getRewardItem() {
114+
return Utils.encodeItemStacks(rewardItem);
115+
}
116+
117+
public void setRewardItem(String rewardItem) {
118+
this.rewardItem = Utils.decodeItemStacks(rewardItem);
119+
}
120+
121+
@DataColumn("expire")
122+
public String getQuestExpire() {
123+
return questExpire.toString();
124+
}
125+
126+
public void setQuestExpire(String questExpire) {
127+
this.questExpire = ZonedDateTime.parse(questExpire);
128+
}
129+
130+
@DataColumn("time_limit")
131+
public String getQuestTimeLimit() {
132+
return questTimeLimit.toString();
133+
}
134+
135+
public void setQuestTimeLimit(String questTimeLimit) {
136+
this.questTimeLimit = Duration.parse(questTimeLimit);
137+
}
138+
}

0 commit comments

Comments
 (0)