/
AdvancementHelper_v1_12_R1.java
123 lines (113 loc) · 6.21 KB
/
AdvancementHelper_v1_12_R1.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
package net.aufdemrand.denizen.nms.helpers;
import net.aufdemrand.denizen.nms.interfaces.AdvancementHelper;
import net.aufdemrand.denizen.nms.util.ReflectionHelper;
import net.minecraft.server.v1_12_R1.*;
import org.bukkit.Bukkit;
import org.bukkit.NamespacedKey;
import org.bukkit.craftbukkit.v1_12_R1.CraftServer;
import org.bukkit.craftbukkit.v1_12_R1.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_12_R1.inventory.CraftItemStack;
import org.bukkit.entity.Player;
import java.util.Collections;
import java.util.Map;
import java.util.Set;
public class AdvancementHelper_v1_12_R1 implements AdvancementHelper {
private static final String IMPOSSIBLE_KEY = "impossible";
private static final Map<String, Criterion> IMPOSSIBLE_CRITERIA = Collections.singletonMap(IMPOSSIBLE_KEY, new Criterion(new CriterionTriggerImpossible.a()));
private static final String[][] IMPOSSIBLE_REQUIREMENTS = new String[][] { { IMPOSSIBLE_KEY } };
@Override
public void register(net.aufdemrand.denizen.nms.util.Advancement advancement) {
if (advancement.temporary || advancement.registered) {
return;
}
Advancement nms = asNMSCopy(advancement);
if (advancement.parent == null) {
Set<Advancement> roots = ReflectionHelper.getFieldValue(Advancements.class, "c", AdvancementDataWorld.REGISTRY);
roots.add(nms);
Advancements.a something = ReflectionHelper.getFieldValue(Advancements.class, "e", AdvancementDataWorld.REGISTRY);
if (something != null) {
something.a(nms);
}
}
else {
Set<Advancement> branches = ReflectionHelper.getFieldValue(Advancements.class, "d", AdvancementDataWorld.REGISTRY);
branches.add(nms);
Advancements.a something = ReflectionHelper.getFieldValue(Advancements.class, "e", AdvancementDataWorld.REGISTRY);
if (something != null) {
something.c(nms);
}
}
AdvancementDataWorld.REGISTRY.advancements.put(nms.getName(), nms);
advancement.registered = true;
if (!advancement.hidden && advancement.parent != null) {
((CraftServer) Bukkit.getServer()).getHandle().sendAll(new PacketPlayOutAdvancements(false,
Collections.singleton(nms), Collections.emptySet(), Collections.emptyMap()));
}
}
@Override
public void unregister(net.aufdemrand.denizen.nms.util.Advancement advancement) {
if (advancement.temporary || !advancement.registered) {
return;
}
Map<MinecraftKey, Advancement> advancements = AdvancementDataWorld.REGISTRY.advancements;
MinecraftKey key = asMinecraftKey(advancement.key);
Advancement nms = advancements.get(key);
if (advancement.parent == null) {
Set<Advancement> roots = ReflectionHelper.getFieldValue(Advancements.class, "c", AdvancementDataWorld.REGISTRY);
roots.remove(nms);
}
else {
Set<Advancement> branches = ReflectionHelper.getFieldValue(Advancements.class, "d", AdvancementDataWorld.REGISTRY);
branches.remove(nms);
}
advancements.remove(key);
advancement.registered = false;
((CraftServer) Bukkit.getServer()).getHandle().sendAll(new PacketPlayOutAdvancements(false,
Collections.emptySet(), Collections.singleton(key), Collections.emptyMap()));
}
@Override
public void grant(net.aufdemrand.denizen.nms.util.Advancement advancement, Player player) {
if (advancement.temporary) {
Advancement nmsAdvancement = asNMSCopy(advancement);
AdvancementProgress progress = new AdvancementProgress();
progress.a(IMPOSSIBLE_CRITERIA, IMPOSSIBLE_REQUIREMENTS);
progress.a(IMPOSSIBLE_KEY); // complete impossible criteria
PacketHelper_v1_12_R1.sendPacket(player, new PacketPlayOutAdvancements(false,
Collections.singleton(nmsAdvancement),
Collections.emptySet(),
Collections.singletonMap(nmsAdvancement.getName(), progress)));
}
else {
Advancement nmsAdvancement = AdvancementDataWorld.REGISTRY.advancements.get(asMinecraftKey(advancement.key));
((CraftPlayer) player).getHandle().getAdvancementData().grantCriteria(nmsAdvancement, IMPOSSIBLE_KEY);
}
}
@Override
public void revoke(net.aufdemrand.denizen.nms.util.Advancement advancement, Player player) {
if (advancement.temporary) {
PacketHelper_v1_12_R1.sendPacket(player, new PacketPlayOutAdvancements(false,
Collections.emptySet(),
Collections.singleton(asMinecraftKey(advancement.key)),
Collections.emptyMap()));
}
else {
Advancement nmsAdvancement = AdvancementDataWorld.REGISTRY.advancements.get(asMinecraftKey(advancement.key));
((CraftPlayer) player).getHandle().getAdvancementData().revokeCritera(nmsAdvancement, IMPOSSIBLE_KEY);
}
}
private static Advancement asNMSCopy(net.aufdemrand.denizen.nms.util.Advancement advancement) {
MinecraftKey key = asMinecraftKey(advancement.key);
Advancement parent = advancement.parent != null
? AdvancementDataWorld.REGISTRY.advancements.get(asMinecraftKey(advancement.parent))
: null;
AdvancementDisplay display = new AdvancementDisplay(CraftItemStack.asNMSCopy(advancement.icon),
new ChatComponentText(advancement.title), new ChatComponentText(advancement.description),
asMinecraftKey(advancement.background), AdvancementFrameType.valueOf(advancement.frame.name()),
advancement.toast, advancement.announceToChat, advancement.hidden);
display.a(advancement.xOffset, advancement.yOffset);
return new Advancement(key, parent, display, AdvancementRewards.a, IMPOSSIBLE_CRITERIA, IMPOSSIBLE_REQUIREMENTS);
}
private static MinecraftKey asMinecraftKey(NamespacedKey key) {
return key != null ? new MinecraftKey(key.getNamespace(), key.getKey()) : null;
}
}