Skip to content

Commit 720f0fa

Browse files
committed
Track monsters slain
1 parent a961c90 commit 720f0fa

26 files changed

+252
-46
lines changed

src/main/java/me/unfear/Slayer/PlayerData.java

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
import org.bukkit.configuration.file.YamlConfiguration;
1515
import org.bukkit.entity.Player;
1616

17+
import me.unfear.Slayer.mobtypes.MobType;
18+
1719
public class PlayerData {
1820

1921
public static final Random RANDOM = new Random();
@@ -25,19 +27,33 @@ public class PlayerData {
2527
private int tasksCompleted;
2628
private boolean hasSentMessage = false; // this isn't saved intentionally, incase player forgets about the task
2729
private HashMap<Integer, Integer> shopItemsPurchased; // shop item id, purchases
30+
private HashMap<Integer, Integer> entityKills;
2831

29-
public PlayerData(UUID player, int kills, SlayerTask currentTask, int points, int tasksCompleted, HashMap<Integer, Integer> shopItemsPurchased) {
32+
public PlayerData(UUID player, int kills, SlayerTask currentTask, int points, int tasksCompleted, HashMap<Integer, Integer> shopItemsPurchased, HashMap<Integer, Integer> entityKills) {
3033
super();
3134
this.player = player;
3235
this.kills = kills;
3336
this.currentTask = currentTask;
3437
this.points = points;
3538
this.tasksCompleted = tasksCompleted;
3639
this.shopItemsPurchased = shopItemsPurchased;
40+
this.entityKills = entityKills;
41+
for (MobType type : Slayer.inst.getMobTypeLoader().getMobTypes()) {
42+
this.entityKills.putIfAbsent(type.getId(), 0);
43+
}
3744
}
3845

3946
public PlayerData(UUID player) {
40-
this(player, 0, null, 0, 0, new HashMap<>());
47+
this(player, 0, null, 0, 0, new HashMap<>(), new HashMap<>());
48+
}
49+
50+
public HashMap<Integer, Integer> getEntityKills() {
51+
return this.entityKills;
52+
}
53+
54+
public void incrementEntityKills(int id) {
55+
this.entityKills.putIfAbsent(id, 0);
56+
this.entityKills.put(id, this.entityKills.get(id) + 1);
4157
}
4258

4359
public HashMap<Integer, Integer> getShopItemsPurchased() {
@@ -136,6 +152,10 @@ public void save() {
136152
for (Entry<Integer, Integer> entry : shopItemsPurchased.entrySet()) {
137153
config.set("shop-items-purchased." + entry.getKey(), entry.getValue());
138154
}
155+
156+
for (Entry<Integer, Integer> entry : entityKills.entrySet()) {
157+
config.set("entity-kills." + entry.getKey(), entry.getValue());
158+
}
139159

140160
try {
141161
config.save(file);

src/main/java/me/unfear/Slayer/SlayerLoader.java

Lines changed: 44 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -62,15 +62,17 @@ public SlayerLoader() {
6262
try {
6363
Integer.parseInt(mobTypeString);
6464
} catch (NumberFormatException e) {
65-
Slayer.inst.getLogger().severe("Failed to load a slayer task, mob type id isn't an integer (id=" + id + ", mob type id: " + mobTypeString + ")");
65+
Slayer.inst.getLogger().severe("Failed to load a slayer task, mob type id isn't an integer (id=" + id
66+
+ ", mob type id: " + mobTypeString + ")");
6667
Slayer.inst.getPluginLoader().disablePlugin(Slayer.inst);
6768
return;
6869
}
69-
70+
7071
final MobType mobType = Slayer.inst.getMobTypeLoader().getMobType(Integer.parseInt(mobTypeString));
7172

7273
if (mobType == null) {
73-
Slayer.inst.getLogger().severe("Failed to load a slayer task, mob type not a mob (id=" + id + ", mob type id: " + mobTypeString + ")");
74+
Slayer.inst.getLogger().severe("Failed to load a slayer task, mob type not a mob (id=" + id
75+
+ ", mob type id: " + mobTypeString + ")");
7476
Slayer.inst.getPluginLoader().disablePlugin(Slayer.inst);
7577
return;
7678
}
@@ -104,7 +106,7 @@ public SlayerLoader() {
104106
Slayer.inst.getPluginLoader().disablePlugin(Slayer.inst);
105107
return;
106108
}
107-
109+
108110
key += ".";
109111
String name = shopSection.getString(key + "name");
110112
ArrayList<String> description = (ArrayList<String>) shopSection.getStringList(key + "description");
@@ -113,38 +115,42 @@ public SlayerLoader() {
113115
String materialString = shopSection.getString(key + "material");
114116
Integer itemAmount = shopSection.getInt(key + "itemAmount");
115117
Integer purchases = shopSection.getInt(key + "purchases");
116-
117-
if (name == null || description == null || cost == null || commands == null || materialString == null || itemAmount == null || purchases == null) {
118+
119+
if (name == null || description == null || cost == null || commands == null || materialString == null
120+
|| itemAmount == null || purchases == null) {
118121
Slayer.inst.getLogger().severe("Failed to load a shop item, missing value (id=" + key + ")");
119122
Slayer.inst.getPluginLoader().disablePlugin(Slayer.inst);
120123
return;
121124
}
122-
125+
123126
Material material = Material.valueOf(materialString);
124127
if (material == null) {
125-
Slayer.inst.getLogger().severe("Failed to load a shop item, material is an invalid item (id=" + key + ")");
128+
Slayer.inst.getLogger()
129+
.severe("Failed to load a shop item, material is an invalid item (id=" + key + ")");
126130
Slayer.inst.getPluginLoader().disablePlugin(Slayer.inst);
127131
return;
128132
}
129-
133+
130134
if (itemAmount < 1 || itemAmount > 64) {
131-
Slayer.inst.getLogger().severe("Failed to load a shop item, item amount must be between 1 and 64 (id=" + key + ")");
135+
Slayer.inst.getLogger().severe(
136+
"Failed to load a shop item, item amount must be between 1 and 64 (id=" + key + ")");
132137
Slayer.inst.getPluginLoader().disablePlugin(Slayer.inst);
133138
return;
134139
}
135-
140+
136141
if (purchases != -1 && purchases < 1) {
137-
Slayer.inst.getLogger().severe("Failed to load a shop item, purchases must be >0 or -1 (id=" + key + ")");
142+
Slayer.inst.getLogger()
143+
.severe("Failed to load a shop item, purchases must be >0 or -1 (id=" + key + ")");
138144
Slayer.inst.getPluginLoader().disablePlugin(Slayer.inst);
139145
return;
140146
}
141-
147+
142148
if (cost < 0) {
143149
Slayer.inst.getLogger().severe("Failed to load a shop item, cost must be >= 0 (id=" + key + ")");
144150
Slayer.inst.getPluginLoader().disablePlugin(Slayer.inst);
145151
return;
146152
}
147-
153+
148154
shopItems.add(new ShopItem(id, name, description, cost, commands, material, itemAmount, purchases));
149155
}
150156
}
@@ -187,6 +193,7 @@ public PlayerData getPlayerData(UUID uuid) {
187193
return create(uuid);
188194
}
189195

196+
// shop items
190197
final HashMap<Integer, Integer> shopItemsPurchased = new HashMap<>();
191198
if (dataConfig.isSet("shop-items-purchased")) {
192199
for (String key : dataConfig.getConfigurationSection("shop-items-purchased").getKeys(false)) {
@@ -204,8 +211,27 @@ public PlayerData getPlayerData(UUID uuid) {
204211
}
205212
}
206213

214+
// entity kills
215+
final HashMap<Integer, Integer> entityKills = new HashMap<>();
216+
if (dataConfig.isSet("entity-kills")) {
217+
for (String key : dataConfig.getConfigurationSection("entity-kills").getKeys(false)) {
218+
try {
219+
int id = Integer.parseInt(key);
220+
int amount = dataConfig.getInt("entity-kills." + key);
221+
if (!dataConfig.isSet("entity-kills." + key))
222+
amount = 0;
223+
entityKills.put(id, amount);
224+
} catch (NumberFormatException e) {
225+
Slayer.inst.getLogger().severe("Failed to load player data, mob type id is not a number (uuid="
226+
+ uuid + ", id=" + key + ")");
227+
return create(uuid);
228+
}
229+
}
230+
}
231+
207232
// loaded
208-
final PlayerData data = new PlayerData(uuid, kills, slayerTask, points, tasksCompleted, shopItemsPurchased);
233+
final PlayerData data = new PlayerData(uuid, kills, slayerTask, points, tasksCompleted, shopItemsPurchased,
234+
entityKills);
209235
this.playerData.add(data);
210236
return data;
211237
}
@@ -238,10 +264,11 @@ public void save() {
238264
data.save();
239265
}
240266
}
241-
267+
242268
public ShopItem getShopItem(int id) {
243269
for (ShopItem shopItem : this.shopItems) {
244-
if (shopItem.getId() == id) return shopItem;
270+
if (shopItem.getId() == id)
271+
return shopItem;
245272
}
246273
return null;
247274
}

src/main/java/me/unfear/Slayer/listeners/EntityDeathListener.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import me.unfear.Slayer.PlayerData;
1212
import me.unfear.Slayer.Slayer;
1313
import me.unfear.Slayer.SlayerLoader;
14+
import me.unfear.Slayer.mobtypes.MobType;
1415

1516
public class EntityDeathListener implements Listener {
1617

@@ -28,6 +29,13 @@ void onDeath(EntityDeathEvent e) {
2829
if (fromSpawner && !loader.isAllowSpawners()) return;
2930

3031
final PlayerData data = loader.getPlayerData(player.getUniqueId());
32+
33+
for (MobType mobType : Slayer.inst.getMobTypeLoader().getMobTypes()) {
34+
if (!mobType.isThis(entity)) continue;
35+
data.incrementEntityKills(mobType.getId());
36+
break;
37+
}
38+
3139
if (data.getCurrentTask() == null || !data.getCurrentTask().getMobType().isThis(entity)) return;
3240
data.setKills(data.getKills() + 1);
3341
}

src/main/java/me/unfear/Slayer/menus/SlayerMenu.java

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,13 @@ public static ChestGui create(PlayerData data) {
4545
Arrays.asList(ChatColor.GRAY + "Spend your hard-earned " + ChatColor.DARK_PURPLE + "Slayer Points"));
4646
shop.setItemMeta(shopMeta);
4747

48+
// monsters
49+
final ItemStack monsters = new ItemStack(Material.ZOMBIE_HEAD);
50+
final ItemMeta monstersMeta = monsters.getItemMeta();
51+
monstersMeta.setDisplayName(ChatColor.RED + "Monsters Slain");
52+
monstersMeta.setLore(Arrays.asList(ChatColor.GRAY + "Earn rewards for reaching milestones!"));
53+
monsters.setItemMeta(monstersMeta);
54+
4855
// current slayer task
4956
final ItemStack current = new ItemStack(Material.ROTTEN_FLESH);
5057
final ItemMeta currentMeta = current.getItemMeta();
@@ -55,8 +62,9 @@ public static ChestGui create(PlayerData data) {
5562
for (String line : data.getCurrentTask().getDescription())
5663
lore.add(ChatColor.translateAlternateColorCodes('&', "&f" + line));
5764
lore.add("");
58-
lore.add(ChatColor.translateAlternateColorCodes('&', "&7Progress: &f" + data.getKills() + " &8/ &f"
59-
+ data.getCurrentTask().getKills() + " &7" + data.getCurrentTask().getMobType().getName() + " slain"));
65+
lore.add(ChatColor.translateAlternateColorCodes('&',
66+
"&7Progress: &f" + data.getKills() + " &8/ &f" + data.getCurrentTask().getKills() + " &7"
67+
+ data.getCurrentTask().getMobType().getName() + " slain"));
6068
currentMeta.setLore(lore);
6169
}
6270
currentMeta.addItemFlags(ItemFlag.HIDE_ENCHANTS);
@@ -90,17 +98,18 @@ public static ChestGui create(PlayerData data) {
9098
main.addItem(new GuiItem(shop, event -> {
9199
SlayerShopMenu.create(data, 0).show(event.getWhoClicked());
92100
}), 4, 1);
101+
main.addItem(new GuiItem(monsters, event -> {
102+
SlayerMonstersMenu.create(data, 0).show(event.getWhoClicked());
103+
}), 1, 2);
93104
main.addItem(new GuiItem(receiveTask, event -> {
94105
event.getWhoClicked().closeInventory();
95106
if (data.getCurrentTask() != null) {
96107
event.getWhoClicked().sendMessage(ChatColor.RED + "You already have an active slayer task!");
97108
return;
98109
}
99110
data.receiveTask();
100-
event.getWhoClicked()
101-
.sendMessage(ChatColor.translateAlternateColorCodes('&',
102-
"&c&lSLAYER TASK &7Slay &f" + data.getCurrentTask().getKills() + " &7"
103-
+ data.getCurrentTask().getMobType().getName()));
111+
event.getWhoClicked().sendMessage(ChatColor.translateAlternateColorCodes('&', "&c&lSLAYER TASK &7Slay &f"
112+
+ data.getCurrentTask().getKills() + " &7" + data.getCurrentTask().getMobType().getName()));
104113
}), 7, 1);
105114
if (data.getCurrentTask() != null)
106115
main.addItem(new GuiItem(current), 1, 1);
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
package me.unfear.Slayer.menus;
2+
3+
import java.util.ArrayList;
4+
import java.util.Arrays;
5+
import java.util.Map.Entry;
6+
7+
import org.bukkit.Bukkit;
8+
import org.bukkit.ChatColor;
9+
import org.bukkit.Material;
10+
import org.bukkit.inventory.ItemStack;
11+
import org.bukkit.inventory.meta.ItemMeta;
12+
13+
import com.github.stefvanschie.inventoryframework.gui.GuiItem;
14+
import com.github.stefvanschie.inventoryframework.gui.type.ChestGui;
15+
import com.github.stefvanschie.inventoryframework.pane.OutlinePane;
16+
import com.github.stefvanschie.inventoryframework.pane.PaginatedPane;
17+
import com.github.stefvanschie.inventoryframework.pane.Pane;
18+
import com.github.stefvanschie.inventoryframework.pane.StaticPane;
19+
20+
import me.unfear.Slayer.PlayerData;
21+
import me.unfear.Slayer.Slayer;
22+
import me.unfear.Slayer.mobtypes.MobType;
23+
24+
public class SlayerMonstersMenu {
25+
26+
private static ArrayList<ItemStack> getMonsterItems(PlayerData data) {
27+
ArrayList<ItemStack> items = new ArrayList<>();
28+
for (Entry<Integer, Integer> entry : data.getEntityKills().entrySet()) {
29+
final MobType mobType = Slayer.inst.getMobTypeLoader().getMobType(entry.getKey());
30+
final ItemStack item = new ItemStack(mobType.getMaterial());
31+
final ItemMeta meta = item.getItemMeta();
32+
meta.setDisplayName(ChatColor.translateAlternateColorCodes('&', "&f" + mobType.getName()));
33+
meta.setLore(Arrays.asList(ChatColor.GRAY + "Number Defeated: " + ChatColor.RED + entry.getValue()));
34+
item.setItemMeta(meta);
35+
items.add(item);
36+
}
37+
return items;
38+
}
39+
40+
public static ChestGui create(PlayerData data, int page) {
41+
final ItemStack background = new ItemStack(Material.GRAY_STAINED_GLASS_PANE);
42+
final ItemMeta backgroundMeta = background.getItemMeta();
43+
backgroundMeta.setDisplayName(ChatColor.RED + " ");
44+
background.setItemMeta(backgroundMeta);
45+
46+
final ItemStack prevArrow = new ItemStack(Material.ARROW);
47+
final ItemMeta prevArrowMeta = prevArrow.getItemMeta();
48+
prevArrowMeta.setDisplayName(ChatColor.GRAY + "Previous Page");
49+
prevArrow.setItemMeta(prevArrowMeta);
50+
51+
final ItemStack nextArrow = new ItemStack(Material.ARROW);
52+
final ItemMeta nextArrowMeta = nextArrow.getItemMeta();
53+
nextArrowMeta.setDisplayName(ChatColor.GRAY + "Next Page");
54+
nextArrow.setItemMeta(nextArrowMeta);
55+
56+
final ItemStack slayerMaster = new ItemStack(Material.PLAYER_HEAD);
57+
final ItemMeta slayerMasterMeta = slayerMaster.getItemMeta();
58+
slayerMasterMeta.setDisplayName(ChatColor.GRAY + "Back");
59+
slayerMasterMeta.setLore(Arrays.asList(ChatColor.GRAY + "Go back to the " + ChatColor.WHITE + "Slayer Master"));
60+
slayerMaster.setItemMeta(slayerMasterMeta);
61+
62+
ChestGui gui = new ChestGui(6, "Slayer Master");
63+
64+
gui.setOnGlobalClick(event -> event.setCancelled(true));
65+
66+
PaginatedPane pages = new PaginatedPane(0, 0, 9, 5);
67+
pages.populateWithItemStacks(getMonsterItems(data));
68+
69+
gui.addPane(pages);
70+
71+
OutlinePane backgroundPane = new OutlinePane(0, 5, 9, 1);
72+
backgroundPane.addItem(new GuiItem(background));
73+
backgroundPane.setRepeat(true);
74+
backgroundPane.setPriority(Pane.Priority.LOWEST);
75+
76+
gui.addPane(backgroundPane);
77+
78+
pages.setPage(page);
79+
gui.update();
80+
81+
StaticPane navigation = new StaticPane(0, 5, 9, 1);
82+
if (page > 0) {
83+
navigation.addItem(new GuiItem(prevArrow, event -> {
84+
if (pages.getPage() > 0) {
85+
create(data, page - 1).show(event.getWhoClicked());
86+
}
87+
}), 0, 0);}
88+
89+
if (pages.getPage() < pages.getPages() - 1) {
90+
navigation.addItem(new GuiItem(new ItemStack(nextArrow), event -> {
91+
if (pages.getPage() < pages.getPages() - 1) {
92+
create(data, page + 1).show(event.getWhoClicked());
93+
}
94+
}), 8, 0);}
95+
96+
navigation.addItem(
97+
new GuiItem(slayerMaster, event -> {
98+
Bukkit.getServer().dispatchCommand(Bukkit.getConsoleSender(), "slayer " + event.getWhoClicked().getName() + " -s");
99+
}), 2, 0);
100+
101+
gui.addPane(navigation);
102+
103+
return gui;
104+
}
105+
}

src/main/java/me/unfear/Slayer/mobtypes/MobType.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,17 @@
11
package me.unfear.Slayer.mobtypes;
22

3+
import org.bukkit.Material;
34
import org.bukkit.entity.Entity;
45

56
public abstract class MobType {
67

78
private int id;
89
private String name;
9-
public MobType(int id, String name) {
10+
private Material material;
11+
public MobType(int id, String name, Material material) {
1012
this.id = id;
1113
this.name = name;
14+
this.material = material;
1215
}
1316

1417
public String getName() {
@@ -19,5 +22,9 @@ public int getId() {
1922
return id;
2023
}
2124

25+
public Material getMaterial() {
26+
return this.material;
27+
}
28+
2229
public abstract boolean isThis(Entity entity);
2330
}

0 commit comments

Comments
 (0)