/
AdvancementHelper.java
165 lines (144 loc) · 5.27 KB
/
AdvancementHelper.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
package net.aufdemrand.denizen.utilities;
import java.util.List;
import java.util.UUID;
import net.aufdemrand.denizen.nms.NMSHandler;
import net.aufdemrand.denizen.utilities.debugging.dB;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.NamespacedKey;
import org.bukkit.advancement.Advancement;
import org.bukkit.advancement.AdvancementProgress;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.scheduler.BukkitRunnable;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonObject;
/**
* Manages Advancements.
* TODO: Advancement Script Containers?
*/
public class AdvancementHelper {
private NamespacedKey id;
private String icon;
private String title;
private String description;
private String frame;
private boolean announce;
private boolean toast;
/**
* Initializes advancement variables.
*
* @param title Advancement title
* @param description Advancement description
* @param icon Advancement icon material
* @param frame Defines the type of advancement. Valid types are challenge/goal/task
* @param announce Whether to show the advancement in chat
* @param toast Whether to show the advancement toast
*/
public AdvancementHelper(String title, String description, Material icon, String frame, boolean announce, boolean toast) {
this.id = new NamespacedKey(NMSHandler.getJavaPlugin(), UUID.randomUUID().toString());
this.title = title;
this.description = description;
this.icon = NMSHandler.getInstance().getItemHelper().getVanillaName(new ItemStack(icon));
this.frame = frame;
this.announce = announce;
this.toast = toast;
}
/**
* Shows the advancement to a collection of players.
*
* @param players Players to show the advancement to
*/
public void showTo(final List<Player> players) {
add();
grant(players);
new BukkitRunnable() {
@Override
public void run() {
revoke(players);
remove();
}
}.runTaskLater(NMSHandler.getJavaPlugin(), 20);
}
/**
* Adds the advancement
*/
private void add() {
try {
Bukkit.getUnsafe().loadAdvancement(id, getJson());
}
catch (IllegalArgumentException e) {
dB.echoError("Error registering advancement!");
}
}
/**
* Removes the advancement
*/
private void remove() {
Bukkit.getUnsafe().removeAdvancement(id);
Bukkit.getServer().reloadData();
}
/**
* Grants this advancement by fulfilling its criteria
*
* @param players Players to grant the advancement to
*/
private void grant(List<Player> players) {
Advancement advancement = Bukkit.getAdvancement(id);
AdvancementProgress progress;
for (Player player : players) {
progress = player.getAdvancementProgress(advancement);
if (!progress.isDone()) {
for (String criteria : progress.getRemainingCriteria()) {
progress.awardCriteria(criteria);
}
}
}
}
/**
* Revokes this advancement by revoking its criteria
*
* @param players Players to revoke the advancement from
*/
private void revoke(List<Player> players) {
Advancement advancement = Bukkit.getAdvancement(id);
AdvancementProgress progress;
for (Player player : players) {
progress = player.getAdvancementProgress(advancement);
if (progress.isDone()) {
for (String criteria : progress.getAwardedCriteria()) {
progress.revokeCriteria(criteria);
}
}
}
}
/**
* Constructs a valid Advancement JSON String to be saved to the server's advancements folder.
* See: https://minecraft.gamepedia.com/Advancements#JSON_Format
*
* @return Advancement JSON String
*/
private String getJson() {
JsonObject json = new JsonObject();
JsonObject icon = new JsonObject();
icon.addProperty("item", this.icon);
JsonObject display = new JsonObject();
display.add("icon", icon);
display.addProperty("title", this.title);
display.addProperty("description", this.description);
display.addProperty("background", "minecraft:textures/gui/advancements/backgrounds/adventure.png");
display.addProperty("frame", this.frame);
display.addProperty("announce_to_chat", announce);
display.addProperty("show_toast", toast);
display.addProperty("hidden", true);
JsonObject criteria = new JsonObject();
JsonObject trigger = new JsonObject();
trigger.addProperty("trigger", "minecraft:impossible");
criteria.add("impossible", trigger);
json.add("criteria", criteria);
json.add("display", display);
Gson gson = new GsonBuilder().setPrettyPrinting().create();
return gson.toJson(json);
}
}