11package com .nisovin .magicspells .volatilecode .latest ;
22
33import java .util .*;
4- import java .lang .reflect .Field ;
5- import java .lang .reflect .Method ;
64import java .lang .invoke .VarHandle ;
75import java .util .function .Consumer ;
6+ import java .lang .invoke .MethodType ;
7+ import java .lang .invoke .MethodHandle ;
88import java .lang .invoke .MethodHandles ;
99
1010import 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 );
0 commit comments