Skip to content

Commit e7272c5

Browse files
committed
Update to 1.21.11
1 parent 84311f5 commit e7272c5

File tree

3 files changed

+188
-4
lines changed

3 files changed

+188
-4
lines changed

pom.xml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
<parent>
88
<groupId>studio.magemonkey</groupId>
99
<artifactId>magemonkey-parent</artifactId>
10-
<version>1.21.10-R1</version>
10+
<version>1.21.11-R1</version>
1111
</parent>
1212

1313
<artifactId>divinity</artifactId>
@@ -16,8 +16,8 @@
1616
<description>Custom items, combat, and more!</description>
1717

1818
<properties>
19-
<codex.version>1.1.1-R0.13-SNAPSHOT</codex.version>
20-
<fabled.version>1.0.4-R0.67-SNAPSHOT</fabled.version>
19+
<codex.version>1.1.1-R0.17-SNAPSHOT</codex.version>
20+
<fabled.version>1.0.4-R0.76-SNAPSHOT</fabled.version>
2121
</properties>
2222

2323
<repositories>

src/main/java/studio/magemonkey/divinity/DependencyRequirement.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
public class DependencyRequirement {
99

10-
public static final String MIN_CORE_VERSION = "1.1.1-R0.13-SNAPSHOT";
10+
public static final String MIN_CORE_VERSION = "1.1.1-R0.17-SNAPSHOT";
1111

1212
public static boolean meetsVersion(String requiredVersion, String providedVersion) {
1313
List<Integer> required = splitVersion(requiredVersion);
Lines changed: 184 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,184 @@
1+
package studio.magemonkey.divinity.nms.packets.versions;
2+
3+
import com.mojang.datafixers.util.Pair;
4+
import org.bukkit.Bukkit;
5+
import org.bukkit.Material;
6+
import org.bukkit.entity.Entity;
7+
import org.bukkit.entity.LivingEntity;
8+
import org.bukkit.entity.Player;
9+
import org.bukkit.inventory.ItemStack;
10+
import org.jetbrains.annotations.NotNull;
11+
import studio.magemonkey.codex.CodexEngine;
12+
import studio.magemonkey.codex.api.events.EnginePlayerPacketEvent;
13+
import studio.magemonkey.codex.compat.VersionManager;
14+
import studio.magemonkey.codex.hooks.Hooks;
15+
import studio.magemonkey.codex.util.Reflex;
16+
import studio.magemonkey.divinity.Divinity;
17+
import studio.magemonkey.divinity.api.event.EntityEquipmentChangeEvent;
18+
import studio.magemonkey.divinity.data.api.DivinityUser;
19+
import studio.magemonkey.divinity.data.api.UserProfile;
20+
import studio.magemonkey.divinity.manager.EntityManager;
21+
22+
import java.lang.reflect.Method;
23+
import java.util.List;
24+
import java.util.UUID;
25+
26+
public class V1_21_R7 extends V1_21_R6 {
27+
protected final Class<?> playoutUpdateAttributes =
28+
Reflex.getClass(PACKET_LOCATION, "PacketPlayOutUpdateAttributes");
29+
protected final Class<?> craftServerClass = Reflex.getCraftClass("CraftServer");
30+
protected final Class<?> nmsEntityClass = Reflex.getClass("net.minecraft.world.entity", "Entity");
31+
protected final Class<?> worldServerClass = Reflex.getClass("net.minecraft.server.level", "WorldServer");
32+
protected final Method getEntity = Reflex.getMethod(worldServerClass, "a", int.class);
33+
protected final Method getServer = Reflex.getMethod(craftServerClass, "getServer");
34+
35+
public V1_21_R7(@NotNull Divinity plugin) {super(plugin);}
36+
37+
@Override
38+
public void manageEquipmentChanges(@NotNull EnginePlayerPacketEvent e, @NotNull Object packet) {
39+
Bukkit.getScheduler().runTask(plugin, () -> {
40+
Object equip = playoutUpdateAttributes.cast(packet);
41+
42+
Integer entityId = (Integer) Reflex.getFieldValue(equip, "b");
43+
if (entityId == null) return;
44+
45+
Object server = craftServerClass.cast(Bukkit.getServer());
46+
Object nmsEntity = null;
47+
48+
Object dedicatedServer = Reflex.invokeMethod(
49+
getServer,
50+
server
51+
);
52+
53+
Iterable<?> worlds = (Iterable<?>) Reflex.invokeMethod(
54+
Reflex.getMethod(dedicatedServer.getClass(), "P"), // Get worlds (getAllLevels)
55+
dedicatedServer
56+
);
57+
58+
for (Object worldServer : worlds) {
59+
nmsEntity = Reflex.invokeMethod(getEntity, worldServer, entityId.intValue());
60+
if (nmsEntity != null) {
61+
break;
62+
}
63+
}
64+
65+
if (nmsEntity == null) return;
66+
67+
Method getUniqueId = Reflex.getMethod(nmsEntityClass, "cY");
68+
Entity bukkitEntity =
69+
CodexEngine.get().getServer().getEntity((UUID) Reflex.invokeMethod(getUniqueId, nmsEntity));
70+
71+
if (!(bukkitEntity instanceof LivingEntity)) return;
72+
if (EntityManager.isPacketDuplicatorFixed(bukkitEntity)
73+
|| !EntityManager.isEquipmentNew((LivingEntity) bukkitEntity)) return;
74+
75+
EntityEquipmentChangeEvent event = new EntityEquipmentChangeEvent((LivingEntity) bukkitEntity);
76+
plugin.getServer().getPluginManager().callEvent(event);
77+
});
78+
}
79+
80+
@Override
81+
protected void managePlayerHelmet(@NotNull EnginePlayerPacketEvent e, @NotNull Object packet) {
82+
Bukkit.getScheduler().runTask(Divinity.getInstance(), () -> {
83+
Class playOutEntityEquipment = Reflex.getClass(PACKET_LOCATION, "PacketPlayOutEntityEquipment");
84+
Class enumItemSlotClass = Reflex.getClass("net.minecraft.world.entity", "EnumItemSlot");
85+
86+
Object p = playOutEntityEquipment.cast(packet);
87+
88+
@SuppressWarnings("unchecked")
89+
List<Pair<Object, Object>> slots = (List<Pair<Object, Object>>) Reflex.getFieldValue(p, "d");
90+
Pair<Object, Object> helmet = null;
91+
for (Pair<Object, Object> pair : slots) {
92+
Enum head = (Enum) Reflex.invokeMethod(
93+
Reflex.getMethod(enumItemSlotClass, "a", String.class), //fromName
94+
null, "head");
95+
if (pair.getFirst() == head) {
96+
helmet = pair;
97+
break;
98+
}
99+
}
100+
if (slots == null || helmet == null) return;
101+
102+
Integer entityId = (Integer) Reflex.getFieldValue(p, "c");
103+
if (entityId == null) return;
104+
Class craftServerClass = Reflex.getCraftClass("CraftServer");
105+
Class nmsEntityClass = Reflex.getClass("net.minecraft.world.entity", "Entity");
106+
Class worldServerClass = Reflex.getClass("net.minecraft.server.level", "WorldServer");
107+
108+
Object server = craftServerClass.cast(Bukkit.getServer());
109+
Object nmsEntity = null;
110+
Object dedicatedServer = Reflex.invokeMethod(
111+
Reflex.getMethod(craftServerClass, "getServer"),
112+
server
113+
);
114+
115+
Iterable<?> worlds = (Iterable<?>) Reflex.invokeMethod(
116+
Reflex.getMethod(dedicatedServer.getClass(), "P"), //Get worlds (getAllLevels)
117+
dedicatedServer
118+
);
119+
120+
Method getEntity = Reflex.getMethod(worldServerClass, "a", int.class);
121+
for (Object worldServer : worlds) {
122+
nmsEntity = Reflex.invokeMethod(getEntity, worldServer, entityId.intValue());
123+
if (nmsEntity != null) {
124+
break;
125+
}
126+
}
127+
128+
if (nmsEntity == null) return;
129+
130+
131+
Method getUniqueId = Reflex.getMethod(nmsEntityClass, "cY");
132+
Entity bukkitEntity =
133+
CodexEngine.get().getServer().getEntity((UUID) Reflex.invokeMethod(getUniqueId, nmsEntity));
134+
135+
if (bukkitEntity == null || Hooks.isNPC(bukkitEntity) || !(bukkitEntity instanceof Player)) return;
136+
137+
Player player = (Player) bukkitEntity;
138+
DivinityUser user = plugin.getUserManager().getOrLoadUser(player);
139+
if (user == null) return;
140+
141+
UserProfile profile = user.getActiveProfile();
142+
if (profile.isHideHelmet()) {
143+
ItemStack air = new ItemStack(Material.AIR);
144+
slots.remove(helmet);
145+
slots.add(new Pair<>(helmet.getFirst(), VersionManager.getNms().getNMSCopy(air)));
146+
}
147+
});
148+
}
149+
150+
@Override
151+
protected void manageDamageParticle(@NotNull EnginePlayerPacketEvent e, @NotNull Object packet) {
152+
Class<?> packetParticlesClass = Reflex.getClass(PACKET_LOCATION, "PacketPlayOutWorldParticles");
153+
Class<?> particleParamClass = Reflex.getClass("net.minecraft.core.particles", "ParticleParam");
154+
155+
Class<?> registries = Reflex.getClass("net.minecraft.core.registries.BuiltInRegistries");
156+
Object particleRegistry = Reflex.getFieldValue(registries, "j");
157+
158+
Object p = packetParticlesClass.cast(packet);
159+
160+
Object particleParam = Reflex.getFieldValue(p, "l");
161+
if (particleParam == null) return;
162+
163+
Method a = Reflex.getMethod(particleParamClass, "a"); //Get the namespace key of the particle being sent
164+
165+
try {
166+
Object particleType = Reflex.invokeMethod(a, particleParam);
167+
Class<?> keyClass = Reflex.getClass("net.minecraft.resources.MinecraftKey");
168+
Object key = Reflex.getConstructor(keyClass,
169+
String.class,
170+
String.class)
171+
.newInstance("minecraft", "damage_indicator");
172+
Object damageIndicator = Reflex.invokeMethod(
173+
Reflex.getMethod(particleRegistry.getClass(), "a", keyClass),
174+
particleRegistry,
175+
key
176+
);
177+
if (particleType.equals(damageIndicator)) {
178+
Reflex.setFieldValue(p, "i", 20); // This is the count
179+
}
180+
} catch (Exception ex) {
181+
ex.printStackTrace();
182+
}
183+
}
184+
}

0 commit comments

Comments
 (0)