Skip to content

Commit e07cfd6

Browse files
Cleanup reflection
1 parent 1037f3f commit e07cfd6

3 files changed

Lines changed: 52 additions & 47 deletions

File tree

core/src/main/java/com/nisovin/magicspells/volatilecode/ManagerVolatile.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ public static VolatileCodeHandle constructVolatileCodeHandler() {
6868
} catch (Throwable ignored) {
6969
handle = new VolatileCodeDisabled();
7070
MagicSpells.error("Volatile code handler could not be initialized.");
71+
ignored.printStackTrace();
7172
}
7273

7374
return handle;

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

Lines changed: 25 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,35 @@ 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>) MethodHandles.privateLookupIn(eClass, 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+
MethodHandles.Lookup leLookup = MethodHandles.privateLookupIn(leClass, lookup);
9591

96-
UPDATE_EFFECT_PARTICLES = nmsEntityClass.getDeclaredMethod("updateSynchronizedMobEffectParticles");
97-
UPDATE_EFFECT_PARTICLES.setAccessible(true);
92+
DATA_EFFECT_PARTICLES = (EntityDataAccessor<@NotNull List<ParticleOptions>>) leLookup
93+
.findStaticVarHandle(leClass, "DATA_EFFECT_PARTICLES", EntityDataAccessor.class).get();
9894

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());
95+
DATA_EFFECT_AMBIENCE_ID = (EntityDataAccessor<@NotNull Boolean>) leLookup
96+
.findStaticVarHandle(leClass, "DATA_EFFECT_AMBIENCE_ID", EntityDataAccessor.class).get();
10297

103-
MethodHandles.Lookup privateLookup = MethodHandles.privateLookupIn(EntityScheduler.class, MethodHandles.lookup());
98+
UPDATE_EFFECT_PARTICLES = leLookup.findVirtual(leClass, "updateSynchronizedMobEffectParticles", MethodType.methodType(void.class));
10499

105-
CURRENTLY_EXECUTING_HANDLE = privateLookup.findVarHandle(EntityScheduler.class, "currentlyExecuting", ArrayDeque.class);
106-
ONE_TIME_DELAYED_HANDLE = privateLookup.findVarHandle(EntityScheduler.class, "oneTimeDelayed", Long2ObjectOpenHashMap.class);
100+
GLOBAL_REGION_TASKS = (Long2ObjectOpenHashMap<List<ScheduledTask>>) MethodHandles.privateLookupIn(FoliaGlobalRegionScheduler.class, lookup)
101+
.findVarHandle(FoliaGlobalRegionScheduler.class, "tasksByDeadline", Long2ObjectOpenHashMap.class)
102+
.get(Bukkit.getGlobalRegionScheduler());
107103

108-
Class<?> scheduledTaskClass = privateLookup.findClass("io.papermc.paper.threadedregions.EntityScheduler$ScheduledTask");
109-
RUN_HANDLE = privateLookup.findVarHandle(scheduledTaskClass, "run", Consumer.class);
104+
MethodHandles.Lookup esLookup = MethodHandles.privateLookupIn(EntityScheduler.class, lookup);
105+
106+
CURRENTLY_EXECUTING_HANDLE = esLookup.findVarHandle(EntityScheduler.class, "currentlyExecuting", ArrayDeque.class);
107+
ONE_TIME_DELAYED_HANDLE = esLookup.findVarHandle(EntityScheduler.class, "oneTimeDelayed", Long2ObjectOpenHashMap.class);
108+
109+
Class<?> scheduledTaskClass = esLookup.findClass("io.papermc.paper.threadedregions.EntityScheduler$ScheduledTask");
110+
RUN_HANDLE = esLookup.findVarHandle(scheduledTaskClass, "run", Consumer.class);
110111
}
111112

112113
@Override
@@ -125,7 +126,7 @@ public void addPotionGraphicalEffect(LivingEntity entity, int color, long durati
125126
helper.scheduleDelayedTask(() -> {
126127
try {
127128
UPDATE_EFFECT_PARTICLES.invoke(nmsEntity);
128-
} catch (Exception e) {
129+
} catch (Throwable e) {
129130
e.printStackTrace();
130131
}
131132
}, duration);

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

Lines changed: 26 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;
@@ -58,6 +58,7 @@
5858
import net.minecraft.core.particles.ColorParticleOption;
5959
import net.minecraft.advancements.critereon.ImpossibleTrigger;
6060
import net.minecraft.world.entity.boss.enderdragon.EnderDragon;
61+
import org.jetbrains.annotations.NotNull;
6162

6263
public class VolatileCode_v1_21_10 extends VolatileCodeHandle {
6364

@@ -66,7 +67,7 @@ public class VolatileCode_v1_21_10 extends VolatileCodeHandle {
6667
private final EntityDataAccessor<List<ParticleOptions>> DATA_EFFECT_PARTICLES;
6768
private final EntityDataAccessor<Boolean> DATA_EFFECT_AMBIENCE_ID;
6869
private final EntityDataAccessor<Byte> DATA_SHARED_FLAGS_ID;
69-
private final Method UPDATE_EFFECT_PARTICLES;
70+
private final MethodHandle UPDATE_EFFECT_PARTICLES;
7071

7172
private final Long2ObjectOpenHashMap<List<ScheduledTask>> GLOBAL_REGION_TASKS;
7273
private final VarHandle CURRENTLY_EXECUTING_HANDLE;
@@ -77,33 +78,35 @@ public class VolatileCode_v1_21_10 extends VolatileCodeHandle {
7778
public VolatileCode_v1_21_10(VolatileCodeHelper helper) throws Exception {
7879
super(helper);
7980

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);
81+
MethodHandles.Lookup lookup = MethodHandles.lookup();
8382

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

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

90-
Field dataEffectAmbienceIdField = nmsEntityClass.getDeclaredField("DATA_EFFECT_AMBIENCE_ID");
91-
dataEffectAmbienceIdField.setAccessible(true);
92-
DATA_EFFECT_AMBIENCE_ID = (EntityDataAccessor<Boolean>) dataEffectAmbienceIdField.get(null);
89+
MethodHandles.Lookup leLookup = MethodHandles.privateLookupIn(leClass, lookup);
9390

94-
UPDATE_EFFECT_PARTICLES = nmsEntityClass.getDeclaredMethod("updateSynchronizedMobEffectParticles");
95-
UPDATE_EFFECT_PARTICLES.setAccessible(true);
91+
DATA_EFFECT_PARTICLES = (EntityDataAccessor<@NotNull List<ParticleOptions>>) leLookup
92+
.findStaticVarHandle(leClass, "DATA_EFFECT_PARTICLES", 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+
DATA_EFFECT_AMBIENCE_ID = (EntityDataAccessor<@NotNull Boolean>) leLookup
95+
.findStaticVarHandle(leClass, "DATA_EFFECT_AMBIENCE_ID", EntityDataAccessor.class).get();
9996

100-
MethodHandles.Lookup privateLookup = MethodHandles.privateLookupIn(EntityScheduler.class, MethodHandles.lookup());
97+
UPDATE_EFFECT_PARTICLES = leLookup.findVirtual(leClass, "updateSynchronizedMobEffectParticles", MethodType.methodType(void.class));
10198

102-
CURRENTLY_EXECUTING_HANDLE = privateLookup.findVarHandle(EntityScheduler.class, "currentlyExecuting", ArrayDeque.class);
103-
ONE_TIME_DELAYED_HANDLE = privateLookup.findVarHandle(EntityScheduler.class, "oneTimeDelayed", Long2ObjectOpenHashMap.class);
99+
GLOBAL_REGION_TASKS = (Long2ObjectOpenHashMap<List<ScheduledTask>>) MethodHandles.privateLookupIn(FoliaGlobalRegionScheduler.class, lookup)
100+
.findVarHandle(FoliaGlobalRegionScheduler.class, "tasksByDeadline", Long2ObjectOpenHashMap.class)
101+
.get(Bukkit.getGlobalRegionScheduler());
104102

105-
Class<?> scheduledTaskClass = privateLookup.findClass("io.papermc.paper.threadedregions.EntityScheduler$ScheduledTask");
106-
RUN_HANDLE = privateLookup.findVarHandle(scheduledTaskClass, "run", Consumer.class);
103+
MethodHandles.Lookup esLookup = MethodHandles.privateLookupIn(EntityScheduler.class, lookup);
104+
105+
CURRENTLY_EXECUTING_HANDLE = esLookup.findVarHandle(EntityScheduler.class, "currentlyExecuting", ArrayDeque.class);
106+
ONE_TIME_DELAYED_HANDLE = esLookup.findVarHandle(EntityScheduler.class, "oneTimeDelayed", Long2ObjectOpenHashMap.class);
107+
108+
Class<?> scheduledTaskClass = esLookup.findClass("io.papermc.paper.threadedregions.EntityScheduler$ScheduledTask");
109+
RUN_HANDLE = esLookup.findVarHandle(scheduledTaskClass, "run", Consumer.class);
107110
}
108111

109112
@Override
@@ -122,7 +125,7 @@ public void addPotionGraphicalEffect(LivingEntity entity, int color, long durati
122125
helper.scheduleDelayedTask(() -> {
123126
try {
124127
UPDATE_EFFECT_PARTICLES.invoke(nmsEntity);
125-
} catch (Exception e) {
128+
} catch (Throwable e) {
126129
e.printStackTrace();
127130
}
128131
}, duration);

0 commit comments

Comments
 (0)