Skip to content

Commit 303888e

Browse files
committed
Update to 1.21.7
1 parent 12a3a8f commit 303888e

5 files changed

Lines changed: 159 additions & 23 deletions

File tree

pom.xml

Lines changed: 2 additions & 2 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.7-R0.2</version>
10+
<version>1.21.7-R0.3</version>
1111
</parent>
1212

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

1818
<properties>
19-
<codex.version>1.1.1-R0.3-SNAPSHOT</codex.version>
19+
<codex.version>1.1.1-R0.4-SNAPSHOT</codex.version>
2020
<fabled.version>1.0.4-R0.56-SNAPSHOT</fabled.version>
2121
</properties>
2222

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.3-SNAPSHOT";
10+
public static final String MIN_CORE_VERSION = "1.1.1-R0.4-SNAPSHOT";
1111

1212
public static boolean meetsVersion(String requiredVersion, String providedVersion) {
1313
List<Integer> required = splitVersion(requiredVersion);
Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,32 @@
11
package studio.magemonkey.divinity.nms.engine;
22

3+
import lombok.Getter;
34
import org.jetbrains.annotations.NotNull;
4-
import org.jetbrains.annotations.Nullable;
55
import studio.magemonkey.divinity.Divinity;
66
import studio.magemonkey.divinity.config.EngineCfg;
77
import studio.magemonkey.divinity.nms.packets.PacketManager;
88

99
public class PMSManager {
1010
private final Divinity plugin;
11+
@Getter
1112
private PacketManager packetManager;
1213

1314
public PMSManager(@NotNull Divinity plugin) {
1415
this.plugin = plugin;
1516
}
1617

1718
public void setup() {
18-
if (EngineCfg.PACKETS_ENABLED) {
19-
this.plugin.info("Packets are enabled. Setup packet manager...");
20-
this.packetManager = new PacketManager(this.plugin);
21-
this.packetManager.setup();
22-
}
19+
if (!EngineCfg.PACKETS_ENABLED) return;
20+
21+
this.plugin.info("Packets are enabled. Setup packet manager...");
22+
this.packetManager = new PacketManager(this.plugin);
23+
this.packetManager.setup();
2324
}
2425

2526
public void shutdown() {
26-
if (this.packetManager != null) {
27-
this.packetManager.shutdown();
28-
this.packetManager = null;
29-
}
30-
}
27+
if (this.packetManager == null) return;
3128

32-
@Nullable
33-
public PacketManager getPacketManager() {
34-
return this.packetManager;
29+
this.packetManager.shutdown();
30+
this.packetManager = null;
3531
}
3632
}

src/main/java/studio/magemonkey/divinity/nms/packets/versions/V1_21_R3.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,12 @@
2525
import java.util.UUID;
2626

2727
public class V1_21_R3 extends V1_21_R1 {
28-
private final Class<?> playoutUpdateAttributes = Reflex.getClass(PACKET_LOCATION, "PacketPlayOutUpdateAttributes");
29-
private final Class<?> craftServerClass = Reflex.getCraftClass("CraftServer");
30-
private final Class<?> nmsEntityClass = Reflex.getClass("net.minecraft.world.entity", "Entity");
31-
private final Class<?> worldServerClass = Reflex.getClass("net.minecraft.server.level", "WorldServer");
32-
private final Method getEntity = Reflex.getMethod(worldServerClass, "a", int.class);
33-
private final Method getServer = Reflex.getMethod(craftServerClass, "getServer");
28+
protected final Class<?> playoutUpdateAttributes = 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");
3434

3535
public V1_21_R3(@NotNull Divinity plugin) {super(plugin);}
3636

Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
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_R5 extends V1_21_R3 {
27+
public V1_21_R5(@NotNull Divinity plugin) {
28+
super(plugin);
29+
}
30+
31+
@Override
32+
public void manageEquipmentChanges(@NotNull EnginePlayerPacketEvent e, @NotNull Object packet) {
33+
Bukkit.getScheduler().runTask(plugin, () -> {
34+
Object equip = playoutUpdateAttributes.cast(packet);
35+
36+
Integer entityId = (Integer) Reflex.getFieldValue(equip, "b");
37+
if (entityId == null) return;
38+
39+
Object server = craftServerClass.cast(Bukkit.getServer());
40+
Object nmsEntity = null;
41+
42+
Object dedicatedServer = Reflex.invokeMethod(
43+
getServer,
44+
server
45+
);
46+
47+
Iterable<?> worlds = (Iterable<?>) Reflex.invokeMethod(
48+
Reflex.getMethod(dedicatedServer.getClass(), "L"), // Get worlds (getAllLevels)
49+
dedicatedServer
50+
);
51+
52+
for (Object worldServer : worlds) {
53+
nmsEntity = Reflex.invokeMethod(getEntity, worldServer, entityId.intValue());
54+
if (nmsEntity != null) {
55+
break;
56+
}
57+
}
58+
59+
if (nmsEntity == null) return;
60+
61+
Method getUniqueId = Reflex.getMethod(nmsEntityClass, "cK");
62+
Entity bukkitEntity =
63+
CodexEngine.get().getServer().getEntity((UUID) Reflex.invokeMethod(getUniqueId, nmsEntity));
64+
65+
if (!(bukkitEntity instanceof LivingEntity)) return;
66+
if (EntityManager.isPacketDuplicatorFixed(bukkitEntity)
67+
|| !EntityManager.isEquipmentNew((LivingEntity) bukkitEntity)) return;
68+
69+
EntityEquipmentChangeEvent event = new EntityEquipmentChangeEvent((LivingEntity) bukkitEntity);
70+
plugin.getServer().getPluginManager().callEvent(event);
71+
});
72+
}
73+
74+
@Override
75+
protected void managePlayerHelmet(@NotNull EnginePlayerPacketEvent e, @NotNull Object packet) {
76+
Bukkit.getScheduler().runTask(Divinity.getInstance(), () -> {
77+
Class playOutEntityEquipment = Reflex.getClass(PACKET_LOCATION, "PacketPlayOutEntityEquipment");
78+
Class enumItemSlotClass = Reflex.getClass("net.minecraft.world.entity", "EnumItemSlot");
79+
80+
Object p = playOutEntityEquipment.cast(packet);
81+
82+
@SuppressWarnings("unchecked")
83+
List<Pair<Object, Object>> slots = (List<Pair<Object, Object>>) Reflex.getFieldValue(p, "d");
84+
Pair<Object, Object> helmet = null;
85+
for (Pair<Object, Object> pair : slots) {
86+
Enum head = (Enum) Reflex.invokeMethod(
87+
Reflex.getMethod(enumItemSlotClass, "a", String.class), //fromName
88+
null, "head");
89+
if (pair.getFirst() == head) {
90+
helmet = pair;
91+
break;
92+
}
93+
}
94+
if (slots == null || helmet == null) return;
95+
96+
Integer entityId = (Integer) Reflex.getFieldValue(p, "c");
97+
if (entityId == null) return;
98+
99+
Object server = craftServerClass.cast(Bukkit.getServer());
100+
Object nmsEntity = null;
101+
Object dedicatedServer = Reflex.invokeMethod(
102+
Reflex.getMethod(craftServerClass, "getServer"),
103+
server
104+
);
105+
106+
Iterable<?> worlds = (Iterable<?>) Reflex.invokeMethod(
107+
Reflex.getMethod(dedicatedServer.getClass(), "L"), //Get worlds (getAllLevels)
108+
dedicatedServer
109+
);
110+
111+
Method getEntity = Reflex.getMethod(worldServerClass, "a", int.class);
112+
for (Object worldServer : worlds) {
113+
nmsEntity = Reflex.invokeMethod(getEntity, worldServer, entityId.intValue());
114+
if (nmsEntity != null) {
115+
break;
116+
}
117+
}
118+
119+
if (nmsEntity == null) return;
120+
121+
122+
Method getUniqueId = Reflex.getMethod(nmsEntityClass, "cK");
123+
Entity bukkitEntity =
124+
CodexEngine.get().getServer().getEntity((UUID) Reflex.invokeMethod(getUniqueId, nmsEntity));
125+
126+
if (bukkitEntity == null || Hooks.isNPC(bukkitEntity) || !(bukkitEntity instanceof Player)) return;
127+
128+
Player player = (Player) bukkitEntity;
129+
DivinityUser user = plugin.getUserManager().getOrLoadUser(player);
130+
if (user == null) return;
131+
132+
UserProfile profile = user.getActiveProfile();
133+
if (profile.isHideHelmet()) {
134+
ItemStack air = new ItemStack(Material.AIR);
135+
slots.remove(helmet);
136+
slots.add(new Pair<>(helmet.getFirst(), VersionManager.getNms().getNMSCopy(air)));
137+
}
138+
});
139+
}
140+
}

0 commit comments

Comments
 (0)