diff --git a/src/main/java/carpet/mixins/ChunkTicketManager_scarpetMixin.java b/src/main/java/carpet/mixins/ChunkTicketManager_scarpetMixin.java new file mode 100644 index 00000000..2670bda0 --- /dev/null +++ b/src/main/java/carpet/mixins/ChunkTicketManager_scarpetMixin.java @@ -0,0 +1,15 @@ +package carpet.mixins; + +import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap; +import it.unimi.dsi.fastutil.objects.ObjectSortedSet; +import net.minecraft.server.world.ChunkTicket; +import net.minecraft.server.world.ChunkTicketManager; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(ChunkTicketManager.class) +public interface ChunkTicketManager_scarpetMixin +{ + @Accessor + Long2ObjectOpenHashMap>> getTicketsByPosition(); +} diff --git a/src/main/java/carpet/mixins/ServerChunkManager_scarpetMixin.java b/src/main/java/carpet/mixins/ServerChunkManager_scarpetMixin.java new file mode 100644 index 00000000..9cec83e8 --- /dev/null +++ b/src/main/java/carpet/mixins/ServerChunkManager_scarpetMixin.java @@ -0,0 +1,13 @@ +package carpet.mixins; + +import net.minecraft.server.world.ChunkTicketManager; +import net.minecraft.server.world.ServerChunkManager; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(ServerChunkManager.class) +public interface ServerChunkManager_scarpetMixin +{ + @Accessor + ChunkTicketManager getTicketManager(); +} diff --git a/src/main/java/carpet/script/CarpetExpression.java b/src/main/java/carpet/script/CarpetExpression.java index 2d600bee..e8339c0e 100644 --- a/src/main/java/carpet/script/CarpetExpression.java +++ b/src/main/java/carpet/script/CarpetExpression.java @@ -4,6 +4,8 @@ import carpet.CarpetServer; import carpet.fakes.MinecraftServerInterface; import carpet.fakes.BiomeArrayInterface; import carpet.helpers.FeatureGenerator; +import carpet.mixins.ChunkTicketManager_scarpetMixin; +import carpet.mixins.ServerChunkManager_scarpetMixin; import carpet.script.Fluff.TriFunction; import carpet.script.exception.CarpetExpressionException; import carpet.script.exception.ExitStatement; @@ -25,6 +27,8 @@ import carpet.utils.Messenger; import com.google.common.collect.Sets; import com.mojang.brigadier.StringReader; import com.mojang.brigadier.exceptions.CommandSyntaxException; +import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap; +import it.unimi.dsi.fastutil.objects.ObjectSortedSet; import net.minecraft.block.BarrierBlock; import net.minecraft.block.BedrockBlock; import net.minecraft.block.Block; @@ -60,6 +64,7 @@ import net.minecraft.predicate.entity.EntityPredicates; import net.minecraft.server.MinecraftServer; import net.minecraft.server.command.ServerCommandSource; import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.server.world.ChunkTicket; import net.minecraft.server.world.ServerWorld; import net.minecraft.sound.BlockSoundGroup; import net.minecraft.sound.SoundCategory; @@ -90,6 +95,7 @@ import org.apache.commons.lang3.tuple.Pair; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; +import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Locale; @@ -856,6 +862,51 @@ public class CarpetExpression return (c_, t_) -> retval; }); + this.expr.addLazyFunction("chunk_tickets", -1, (c, t, lv) -> + { + ServerWorld world = ((CarpetContext) c).s.getWorld(); + Long2ObjectOpenHashMap>> levelTickets = ( + (ChunkTicketManager_scarpetMixin) ((ServerChunkManager_scarpetMixin) world.method_14178()) + .getTicketManager() + ).getTicketsByPosition(); + List res = new ArrayList<>(); + if (lv.size() == 0) + { + for (long key : levelTickets.keySet()) + { + ChunkPos chpos = new ChunkPos(key); + for (ChunkTicket ticket : levelTickets.get(key)) + { + res.add(ListValue.of( + new StringValue(ticket.getType().toString()), + new NumericValue(33 - ticket.getLevel()), + new NumericValue(chpos.x), + new NumericValue(chpos.z) + )); + } + } + } + else + { + BlockValue.LocatorResult locatorResult = BlockValue.fromParams((CarpetContext) c, lv, 0); + BlockPos pos = locatorResult.block.getPos(); + ObjectSortedSet> tickets = levelTickets.get(new ChunkPos(pos).toLong()); + if (tickets != null) + { + for (ChunkTicket ticket : tickets) + { + res.add(ListValue.of( + new StringValue(ticket.getType().toString()), + new NumericValue(33 - ticket.getLevel()) + )); + } + } + } + res.sort(Comparator.comparing(e -> ((ListValue) e).getItems().get(1)).reversed()); + Value returnValue = ListValue.wrap(res); + return (_c, _t) -> returnValue; + }); + this.expr.addLazyFunction("suffocates", -1, (c, t, lv) -> genericStateTest(c, "suffocates", lv, (s, p, w) -> new NumericValue(s.canSuffocate(w, p)))); diff --git a/src/main/resources/carpet.mixins.json b/src/main/resources/carpet.mixins.json index f69723a8..18145770 100644 --- a/src/main/resources/carpet.mixins.json +++ b/src/main/resources/carpet.mixins.json @@ -132,6 +132,8 @@ "DamageTracker_scarpetEventMixin", "ServerPlayerEntity_scarpetEventMixin", "FallingBlockEntity_scarpetEventsMixin", + "ChunkTicketManager_scarpetMixin", + "ServerChunkManager_scarpetMixin", "PistonBlock_movableTEMixin",