11package com .ishland .c2me .rewrites .chunksystem .mixin ;
22
3+ import com .ishland .c2me .rewrites .chunksystem .common .ducks .TicketDistanceLevelPropagatorExtension ;
4+ import it .unimi .dsi .fastutil .longs .Long2IntLinkedOpenHashMap ;
35import it .unimi .dsi .fastutil .longs .Long2IntMap ;
46import it .unimi .dsi .fastutil .longs .Long2IntOpenHashMap ;
5- import net .minecraft .server .world .ChunkHolder ;
67import net .minecraft .server .world .ChunkTicketManager ;
7- import org .objectweb .asm .Opcodes ;
88import org .spongepowered .asm .mixin .Final ;
99import org .spongepowered .asm .mixin .Mixin ;
1010import org .spongepowered .asm .mixin .Overwrite ;
1111import org .spongepowered .asm .mixin .Shadow ;
12+ import org .spongepowered .asm .mixin .Unique ;
1213import org .spongepowered .asm .mixin .injection .At ;
1314import org .spongepowered .asm .mixin .injection .Inject ;
14- import org .spongepowered .asm .mixin .injection .Redirect ;
1515import org .spongepowered .asm .mixin .injection .callback .CallbackInfo ;
1616
1717@ Mixin (ChunkTicketManager .TicketDistanceLevelPropagator .class )
18- public class MixinChunkTicketManagerTicketDistanceLevelPropagator {
18+ public class MixinChunkTicketManagerTicketDistanceLevelPropagator implements TicketDistanceLevelPropagatorExtension {
1919
2020 @ Shadow @ Final private static int UNLOADED ;
2121
2222 @ Shadow @ Final private ChunkTicketManager field_18255 ;
23- private final Long2IntMap levels = new Long2IntOpenHashMap ();
23+
24+ @ Unique
25+ private Long2IntMap c2me$levels ;
26+
27+ @ Unique
28+ private Long2IntLinkedOpenHashMap c2me$ticketLevelUpdates ;
2429
2530 @ Inject (method = "<init>" , at = @ At ("RETURN" ))
2631 private void postInit (CallbackInfo ci ) {
27- this .levels .defaultReturnValue (UNLOADED + 1 );
32+ this .c2me$levels = new Long2IntOpenHashMap ();
33+ this .c2me$levels .defaultReturnValue (UNLOADED + 1 );
34+ this .c2me$ticketLevelUpdates = new Long2IntLinkedOpenHashMap ();
2835 }
2936
3037 /**
@@ -33,26 +40,26 @@ private void postInit(CallbackInfo ci) {
3340 */
3441 @ Overwrite
3542 public int getLevel (long id ) {
36- return this .levels .get (id );
43+ return this .c2me$ levels .get (id );
3744 }
3845
39- @ Inject (method = "setLevel" , at = @ At ("HEAD" ))
40- private void preSetLevel (long id , int level , CallbackInfo ci ) {
46+ /**
47+ * @author ishland
48+ * @reason use internal levels, plus defer update
49+ */
50+ @ Overwrite
51+ protected void setLevel (long id , int level ) {
4152 if (level >= UNLOADED ) {
42- this .levels .remove (id );
53+ this .c2me$ levels .remove (id );
4354 } else {
44- this .levels .put (id , level );
55+ this .c2me$ levels .put (id , level );
4556 }
57+ this .c2me$ticketLevelUpdates .putAndMoveToLast (id , level );
4658 }
4759
48- @ Redirect (method = "setLevel" , at = @ At (value = "INVOKE" , target = "Lnet/minecraft/server/world/ChunkTicketManager;getChunkHolder(J)Lnet/minecraft/server/world/ChunkHolder;" ))
49- private ChunkHolder fakeLevel (ChunkTicketManager instance , long l ) {
50- return null ;
51- }
52-
53- @ Redirect (method = "setLevel" , at = @ At (value = "FIELD" , target = "Lnet/minecraft/server/world/ChunkTicketManager$TicketDistanceLevelPropagator;UNLOADED:I" , opcode = Opcodes .GETSTATIC ))
54- private int fakeLevel () {
55- return Integer .MAX_VALUE ;
60+ @ Override
61+ public Long2IntLinkedOpenHashMap c2me$getTicketLevelUpdates () {
62+ return this .c2me$ticketLevelUpdates ;
5663 }
5764
5865}
0 commit comments