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 ;
6- import net .minecraft .server .world .ChunkLevelManager ;
77import net .minecraft .server .world .TicketDistanceLevelPropagator ;
8- import org .objectweb .asm .Opcodes ;
98import org .spongepowered .asm .mixin .Final ;
109import org .spongepowered .asm .mixin .Mixin ;
1110import org .spongepowered .asm .mixin .Overwrite ;
1211import org .spongepowered .asm .mixin .Shadow ;
12+ import org .spongepowered .asm .mixin .Unique ;
1313import org .spongepowered .asm .mixin .injection .At ;
1414import org .spongepowered .asm .mixin .injection .Inject ;
15- import org .spongepowered .asm .mixin .injection .Redirect ;
1615import org .spongepowered .asm .mixin .injection .callback .CallbackInfo ;
1716
1817@ Mixin (TicketDistanceLevelPropagator .class )
19- public class MixinChunkTicketManagerTicketDistanceLevelPropagator {
18+ public class MixinChunkTicketManagerTicketDistanceLevelPropagator implements TicketDistanceLevelPropagatorExtension {
2019
2120 @ Shadow @ Final private static int UNLOADED ;
2221
23- private final Long2IntMap levels = new Long2IntOpenHashMap ();
22+ @ Unique
23+ private Long2IntMap c2me$levels ;
24+
25+ @ Unique
26+ private Long2IntLinkedOpenHashMap c2me$ticketLevelUpdates ;
2427
2528 @ Inject (method = "<init>" , at = @ At ("RETURN" ))
2629 private void postInit (CallbackInfo ci ) {
27- this .levels .defaultReturnValue (UNLOADED + 1 );
30+ this .c2me$levels = new Long2IntOpenHashMap ();
31+ this .c2me$levels .defaultReturnValue (UNLOADED + 1 );
32+ this .c2me$ticketLevelUpdates = new Long2IntLinkedOpenHashMap ();
2833 }
2934
3035 /**
@@ -33,26 +38,26 @@ private void postInit(CallbackInfo ci) {
3338 */
3439 @ Overwrite
3540 public int getLevel (long id ) {
36- return this .levels .get (id );
41+ return this .c2me$ levels .get (id );
3742 }
3843
39- @ Inject (method = "setLevel" , at = @ At ("HEAD" ))
40- private void preSetLevel (long id , int level , CallbackInfo ci ) {
44+ /**
45+ * @author ishland
46+ * @reason use internal levels, plus defer update
47+ */
48+ @ Overwrite
49+ protected void setLevel (long id , int level ) {
4150 if (level >= UNLOADED ) {
42- this .levels .remove (id );
51+ this .c2me$ levels .remove (id );
4352 } else {
44- this .levels .put (id , level );
53+ this .c2me$ levels .put (id , level );
4554 }
55+ this .c2me$ticketLevelUpdates .putAndMoveToLast (id , level );
4656 }
4757
48- @ Redirect (method = "setLevel" , at = @ At (value = "INVOKE" , target = "Lnet/minecraft/server/world/ChunkLevelManager;getChunkHolder(J)Lnet/minecraft/server/world/ChunkHolder;" ))
49- private ChunkHolder fakeLevel (ChunkLevelManager instance , long l ) {
50- return null ;
51- }
52-
53- @ Redirect (method = "setLevel" , at = @ At (value = "FIELD" , target = "Lnet/minecraft/server/world/TicketDistanceLevelPropagator;UNLOADED:I" , opcode = Opcodes .GETSTATIC ))
54- private int fakeLevel () {
55- return Integer .MAX_VALUE ;
58+ @ Override
59+ public Long2IntLinkedOpenHashMap c2me$getTicketLevelUpdates () {
60+ return this .c2me$ticketLevelUpdates ;
5661 }
5762
5863}
0 commit comments