/
PlayerEquipsArmorScriptEvent.java
155 lines (137 loc) · 5.25 KB
/
PlayerEquipsArmorScriptEvent.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
package com.denizenscript.denizen.paper.events;
import com.denizenscript.denizen.objects.EntityTag;
import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData;
import com.denizenscript.denizen.events.BukkitScriptEvent;
import com.denizenscript.denizen.objects.ItemTag;
import com.denizenscript.denizen.objects.PlayerTag;
import com.denizenscript.denizencore.objects.ObjectTag;
import com.denizenscript.denizencore.objects.core.ElementTag;
import com.denizenscript.denizencore.scripts.ScriptEntryData;
import com.denizenscript.denizencore.utilities.CoreUtilities;
import com.destroystokyo.paper.event.player.PlayerArmorChangeEvent;
import org.bukkit.Material;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.inventory.ItemStack;
import java.util.HashMap;
public class PlayerEquipsArmorScriptEvent extends BukkitScriptEvent implements Listener {
// <--[event]
// @Events
// player (un)equips armor
// player (un)equips <item>
// player (un)equips [helmet/chestplate/leggings/boots]
//
// @Regex ^on player (un)?equips [^\s]+$
//
// @Plugin Paper
//
// @Group Paper
//
// @Triggers when a player (un)equips armor.
//
// @Warning This event is not reliable, and may miss some types of equipment changes or fire when equipment hasn't actually changed.
//
// @Context
// <context.new_item> returns the ItemTag that is now in the slot.
// <context.old_item> returns the ItemTag that used to be in the slot.
// <context.slot> returns the name of the slot.
//
// @Player Always.
//
// -->
public static HashMap<String, PlayerArmorChangeEvent.SlotType> slotsByName = new HashMap<>();
public static HashMap<PlayerArmorChangeEvent.SlotType, String> namesBySlot = new HashMap<>();
public static void registerSlot(String name, PlayerArmorChangeEvent.SlotType slot) {
slotsByName.put(name, slot);
namesBySlot.put(slot, name);
}
public PlayerEquipsArmorScriptEvent() {
instance = this;
registerSlot("helmet", PlayerArmorChangeEvent.SlotType.HEAD);
registerSlot("chestplate", PlayerArmorChangeEvent.SlotType.CHEST);
registerSlot("leggings", PlayerArmorChangeEvent.SlotType.LEGS);
registerSlot("boots", PlayerArmorChangeEvent.SlotType.FEET);
}
public static PlayerEquipsArmorScriptEvent instance;
public ItemTag oldItem;
public ItemTag newItem;
public PlayerArmorChangeEvent.SlotType slot;
public PlayerTag player;
@Override
public boolean couldMatch(ScriptPath path) {
return path.eventLower.startsWith("player equips ") || path.eventLower.startsWith("player unequips ");
}
@Override
public boolean matches(ScriptPath path) {
String type = path.eventArgLowerAt(1);
String itemCompare = path.eventArgLowerAt(2);
PlayerArmorChangeEvent.SlotType slotType = slotsByName.get(itemCompare);
if (slotType != null && slot != slotType) {
return false;
}
if (type.equals("equips")) {
if (slotType != null) {
if (newItem.getMaterial().getMaterial() == Material.AIR) {
return false;
}
}
else if (!itemCompare.equals("armor") && !tryItem(newItem, itemCompare)) {
return false;
}
}
else { // unequips
if (slotType != null) {
if (oldItem.getMaterial().getMaterial() == Material.AIR) {
return false;
}
}
else if (!itemCompare.equals("armor") && !tryItem(oldItem, itemCompare)) {
return false;
}
}
return super.matches(path);
}
@Override
public String getName() {
return "PlayerEquipsArmor";
}
@Override
public ScriptEntryData getScriptEntryData() {
return new BukkitScriptEntryData(player, null);
}
@Override
public ObjectTag getContext(String name) {
switch (name) {
case "new_item":
return newItem;
case "old_item":
return oldItem;
case "slot":
return new ElementTag(namesBySlot.get(slot));
}
return super.getContext(name);
}
public String simpleComparisonString(ItemStack stack) {
if (stack == null) {
return "null";
}
stack = stack.clone();
stack.setAmount(1);
stack.setDurability((short) 0);
return CoreUtilities.toLowerCase(new ItemTag(stack).identify());
}
@EventHandler
public void armorChangeEvent(PlayerArmorChangeEvent event) {
if (EntityTag.isCitizensNPC(event.getPlayer())) {
return;
}
if (simpleComparisonString(event.getOldItem()).equals(simpleComparisonString(event.getNewItem()))) {
return;
}
newItem = new ItemTag(event.getNewItem());
oldItem = new ItemTag(event.getOldItem());
slot = event.getSlotType();
player = new PlayerTag(event.getPlayer());
fire(event);
}
}