Skip to content

Commit f96a3c2

Browse files
Cleanup reflection
1 parent f45e0ef commit f96a3c2

File tree

2 files changed

+42
-47
lines changed

2 files changed

+42
-47
lines changed

nms/latest/src/main/java/com/nisovin/magicspells/volatilecode/latest/VolatileCodeLatest.java

Lines changed: 21 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
package com.nisovin.magicspells.volatilecode.latest;
22

33
import java.util.*;
4-
import java.lang.reflect.Field;
5-
import java.lang.reflect.Method;
64
import java.lang.invoke.VarHandle;
75
import java.util.function.Consumer;
6+
import java.lang.invoke.MethodType;
7+
import java.lang.invoke.MethodHandle;
88
import java.lang.invoke.MethodHandles;
99

1010
import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap;
@@ -68,7 +68,7 @@ public class VolatileCodeLatest extends VolatileCodeHandle {
6868
private final EntityDataAccessor<@NotNull List<ParticleOptions>> DATA_EFFECT_PARTICLES;
6969
private final EntityDataAccessor<@NotNull Boolean> DATA_EFFECT_AMBIENCE_ID;
7070
private final EntityDataAccessor<@NotNull Byte> DATA_SHARED_FLAGS_ID;
71-
private final Method UPDATE_EFFECT_PARTICLES;
71+
private final MethodHandle UPDATE_EFFECT_PARTICLES;
7272

7373
private final Long2ObjectOpenHashMap<List<ScheduledTask>> GLOBAL_REGION_TASKS;
7474
private final VarHandle CURRENTLY_EXECUTING_HANDLE;
@@ -79,34 +79,31 @@ public class VolatileCodeLatest extends VolatileCodeHandle {
7979
public VolatileCodeLatest(VolatileCodeHelper helper) throws Exception {
8080
super(helper);
8181

82-
Field dataSharedFlagsIdField = net.minecraft.world.entity.Entity.class.getDeclaredField("DATA_SHARED_FLAGS_ID");
83-
dataSharedFlagsIdField.setAccessible(true);
84-
DATA_SHARED_FLAGS_ID = (EntityDataAccessor<@NotNull Byte>) dataSharedFlagsIdField.get(null);
82+
MethodHandles.Lookup lookup = MethodHandles.lookup();
8583

86-
Class<?> nmsEntityClass = net.minecraft.world.entity.LivingEntity.class;
84+
Class<?> leClass = net.minecraft.world.entity.LivingEntity.class;
85+
Class<?> eClass = net.minecraft.world.entity.Entity.class;
8786

88-
Field dataEffectParticlesField = nmsEntityClass.getDeclaredField("DATA_EFFECT_PARTICLES");
89-
dataEffectParticlesField.setAccessible(true);
90-
DATA_EFFECT_PARTICLES = (EntityDataAccessor<@NotNull List<ParticleOptions>>) dataEffectParticlesField.get(null);
87+
DATA_SHARED_FLAGS_ID = (EntityDataAccessor<@NotNull Byte>) lookup
88+
.findStaticVarHandle(eClass, "DATA_SHARED_FLAGS_ID", EntityDataAccessor.class).get();
9189

92-
Field dataEffectAmbienceIdField = nmsEntityClass.getDeclaredField("DATA_EFFECT_AMBIENCE_ID");
93-
dataEffectAmbienceIdField.setAccessible(true);
94-
DATA_EFFECT_AMBIENCE_ID = (EntityDataAccessor<@NotNull Boolean>) dataEffectAmbienceIdField.get(null);
90+
DATA_EFFECT_PARTICLES = (EntityDataAccessor<@NotNull List<ParticleOptions>>) lookup
91+
.findStaticVarHandle(leClass, "DATA_EFFECT_PARTICLES", EntityDataAccessor.class).get();
9592

96-
UPDATE_EFFECT_PARTICLES = nmsEntityClass.getDeclaredMethod("updateSynchronizedMobEffectParticles");
97-
UPDATE_EFFECT_PARTICLES.setAccessible(true);
93+
DATA_EFFECT_AMBIENCE_ID = (EntityDataAccessor<@NotNull Boolean>) lookup
94+
.findStaticVarHandle(leClass, "DATA_EFFECT_AMBIENCE_ID", EntityDataAccessor.class).get();
9895

99-
VarHandle tasksByDeadlineHandle = MethodHandles.privateLookupIn(FoliaGlobalRegionScheduler.class, MethodHandles.lookup())
100-
.findVarHandle(FoliaGlobalRegionScheduler.class, "tasksByDeadline", Long2ObjectOpenHashMap.class);
101-
GLOBAL_REGION_TASKS = (Long2ObjectOpenHashMap<List<ScheduledTask>>) tasksByDeadlineHandle.get(Bukkit.getGlobalRegionScheduler());
96+
UPDATE_EFFECT_PARTICLES = lookup.findVirtual(leClass, "updateSynchronizedMobEffectParticles", MethodType.methodType(void.class));
10297

103-
MethodHandles.Lookup privateLookup = MethodHandles.privateLookupIn(EntityScheduler.class, MethodHandles.lookup());
98+
GLOBAL_REGION_TASKS = (Long2ObjectOpenHashMap<List<ScheduledTask>>) lookup
99+
.findVarHandle(FoliaGlobalRegionScheduler.class, "tasksByDeadline", Long2ObjectOpenHashMap.class)
100+
.get(Bukkit.getGlobalRegionScheduler());
104101

105-
CURRENTLY_EXECUTING_HANDLE = privateLookup.findVarHandle(EntityScheduler.class, "currentlyExecuting", ArrayDeque.class);
106-
ONE_TIME_DELAYED_HANDLE = privateLookup.findVarHandle(EntityScheduler.class, "oneTimeDelayed", Long2ObjectOpenHashMap.class);
102+
CURRENTLY_EXECUTING_HANDLE = lookup.findVarHandle(EntityScheduler.class, "currentlyExecuting", ArrayDeque.class);
103+
ONE_TIME_DELAYED_HANDLE = lookup.findVarHandle(EntityScheduler.class, "oneTimeDelayed", Long2ObjectOpenHashMap.class);
107104

108-
Class<?> scheduledTaskClass = privateLookup.findClass("io.papermc.paper.threadedregions.EntityScheduler$ScheduledTask");
109-
RUN_HANDLE = privateLookup.findVarHandle(scheduledTaskClass, "run", Consumer.class);
105+
Class<?> scheduledTaskClass = lookup.findClass("io.papermc.paper.threadedregions.EntityScheduler$ScheduledTask");
106+
RUN_HANDLE = lookup.findVarHandle(scheduledTaskClass, "run", Consumer.class);
110107
}
111108

112109
@Override
@@ -125,7 +122,7 @@ public void addPotionGraphicalEffect(LivingEntity entity, int color, long durati
125122
helper.scheduleDelayedTask(() -> {
126123
try {
127124
UPDATE_EFFECT_PARTICLES.invoke(nmsEntity);
128-
} catch (Exception e) {
125+
} catch (Throwable e) {
129126
e.printStackTrace();
130127
}
131128
}, duration);

nms/v1_21_10/src/main/java/com/nisovin/magicspells/volatilecode/v1_21_10/VolatileCode_v1_21_10.java

Lines changed: 21 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
package com.nisovin.magicspells.volatilecode.v1_21_10;
22

33
import java.util.*;
4-
import java.lang.reflect.Field;
5-
import java.lang.reflect.Method;
64
import java.lang.invoke.VarHandle;
75
import java.util.function.Consumer;
6+
import java.lang.invoke.MethodType;
7+
import java.lang.invoke.MethodHandle;
88
import java.lang.invoke.MethodHandles;
99

1010
import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap;
@@ -66,7 +66,7 @@ public class VolatileCode_v1_21_10 extends VolatileCodeHandle {
6666
private final EntityDataAccessor<List<ParticleOptions>> DATA_EFFECT_PARTICLES;
6767
private final EntityDataAccessor<Boolean> DATA_EFFECT_AMBIENCE_ID;
6868
private final EntityDataAccessor<Byte> DATA_SHARED_FLAGS_ID;
69-
private final Method UPDATE_EFFECT_PARTICLES;
69+
private final MethodHandle UPDATE_EFFECT_PARTICLES;
7070

7171
private final Long2ObjectOpenHashMap<List<ScheduledTask>> GLOBAL_REGION_TASKS;
7272
private final VarHandle CURRENTLY_EXECUTING_HANDLE;
@@ -77,33 +77,31 @@ public class VolatileCode_v1_21_10 extends VolatileCodeHandle {
7777
public VolatileCode_v1_21_10(VolatileCodeHelper helper) throws Exception {
7878
super(helper);
7979

80-
Field dataSharedFlagsIdField = net.minecraft.world.entity.Entity.class.getDeclaredField("DATA_SHARED_FLAGS_ID");
81-
dataSharedFlagsIdField.setAccessible(true);
82-
DATA_SHARED_FLAGS_ID = (EntityDataAccessor<Byte>) dataSharedFlagsIdField.get(null);
80+
MethodHandles.Lookup lookup = MethodHandles.lookup();
8381

84-
Class<?> nmsEntityClass = net.minecraft.world.entity.LivingEntity.class;
82+
Class<?> leClass = net.minecraft.world.entity.LivingEntity.class;
83+
Class<?> eClass = net.minecraft.world.entity.Entity.class;
8584

86-
Field dataEffectParticlesField = nmsEntityClass.getDeclaredField("DATA_EFFECT_PARTICLES");
87-
dataEffectParticlesField.setAccessible(true);
88-
DATA_EFFECT_PARTICLES = (EntityDataAccessor<List<ParticleOptions>>) dataEffectParticlesField.get(null);
85+
DATA_SHARED_FLAGS_ID = (EntityDataAccessor<Byte>) lookup
86+
.findStaticVarHandle(eClass, "DATA_SHARED_FLAGS_ID", EntityDataAccessor.class).get();
8987

90-
Field dataEffectAmbienceIdField = nmsEntityClass.getDeclaredField("DATA_EFFECT_AMBIENCE_ID");
91-
dataEffectAmbienceIdField.setAccessible(true);
92-
DATA_EFFECT_AMBIENCE_ID = (EntityDataAccessor<Boolean>) dataEffectAmbienceIdField.get(null);
88+
DATA_EFFECT_PARTICLES = (EntityDataAccessor<List<ParticleOptions>>) lookup
89+
.findStaticVarHandle(leClass, "DATA_EFFECT_PARTICLES", EntityDataAccessor.class).get();
9390

94-
UPDATE_EFFECT_PARTICLES = nmsEntityClass.getDeclaredMethod("updateSynchronizedMobEffectParticles");
95-
UPDATE_EFFECT_PARTICLES.setAccessible(true);
91+
DATA_EFFECT_AMBIENCE_ID = (EntityDataAccessor<Boolean>) lookup
92+
.findStaticVarHandle(leClass, "DATA_EFFECT_AMBIENCE_ID", EntityDataAccessor.class).get();
9693

97-
VarHandle tasksByDeadlineHandle = MethodHandles.privateLookupIn(FoliaGlobalRegionScheduler.class, MethodHandles.lookup()).findVarHandle(FoliaGlobalRegionScheduler.class, "tasksByDeadline", Long2ObjectOpenHashMap.class);
98-
GLOBAL_REGION_TASKS = (Long2ObjectOpenHashMap<List<ScheduledTask>>) tasksByDeadlineHandle.get(Bukkit.getGlobalRegionScheduler());
94+
UPDATE_EFFECT_PARTICLES = lookup.findVirtual(leClass, "updateSynchronizedMobEffectParticles", MethodType.methodType(void.class));
9995

100-
MethodHandles.Lookup privateLookup = MethodHandles.privateLookupIn(EntityScheduler.class, MethodHandles.lookup());
96+
GLOBAL_REGION_TASKS = (Long2ObjectOpenHashMap<List<ScheduledTask>>) lookup
97+
.findVarHandle(FoliaGlobalRegionScheduler.class, "tasksByDeadline", Long2ObjectOpenHashMap.class)
98+
.get(Bukkit.getGlobalRegionScheduler());
10199

102-
CURRENTLY_EXECUTING_HANDLE = privateLookup.findVarHandle(EntityScheduler.class, "currentlyExecuting", ArrayDeque.class);
103-
ONE_TIME_DELAYED_HANDLE = privateLookup.findVarHandle(EntityScheduler.class, "oneTimeDelayed", Long2ObjectOpenHashMap.class);
100+
CURRENTLY_EXECUTING_HANDLE = lookup.findVarHandle(EntityScheduler.class, "currentlyExecuting", ArrayDeque.class);
101+
ONE_TIME_DELAYED_HANDLE = lookup.findVarHandle(EntityScheduler.class, "oneTimeDelayed", Long2ObjectOpenHashMap.class);
104102

105-
Class<?> scheduledTaskClass = privateLookup.findClass("io.papermc.paper.threadedregions.EntityScheduler$ScheduledTask");
106-
RUN_HANDLE = privateLookup.findVarHandle(scheduledTaskClass, "run", Consumer.class);
103+
Class<?> scheduledTaskClass = lookup.findClass("io.papermc.paper.threadedregions.EntityScheduler$ScheduledTask");
104+
RUN_HANDLE = lookup.findVarHandle(scheduledTaskClass, "run", Consumer.class);
107105
}
108106

109107
@Override
@@ -122,7 +120,7 @@ public void addPotionGraphicalEffect(LivingEntity entity, int color, long durati
122120
helper.scheduleDelayedTask(() -> {
123121
try {
124122
UPDATE_EFFECT_PARTICLES.invoke(nmsEntity);
125-
} catch (Exception e) {
123+
} catch (Throwable e) {
126124
e.printStackTrace();
127125
}
128126
}, duration);

0 commit comments

Comments
 (0)