11package com .nisovin .magicspells .volatilecode .v1_21_10 ;
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 ;
5858import net .minecraft .core .particles .ColorParticleOption ;
5959import net .minecraft .advancements .critereon .ImpossibleTrigger ;
6060import net .minecraft .world .entity .boss .enderdragon .EnderDragon ;
61+ import org .jetbrains .annotations .NotNull ;
6162
6263public 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