From ef31e6daa81e97749393c488b6b7095ead0014af Mon Sep 17 00:00:00 2001 From: Kosma Moczek Date: Thu, 2 Dec 2021 20:55:43 +0100 Subject: [PATCH 1/6] fabric-1.18: rename BlockEvents.EVENT -> BlockEvents.BLOCK_EVENT --- .../src/main/java/org/dynmap/fabric_1_18/DynmapPlugin.java | 2 +- .../main/java/org/dynmap/fabric_1_18/event/BlockEvents.java | 3 ++- .../java/org/dynmap/fabric_1_18/mixin/WorldChunkMixin.java | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/fabric-1.18/src/main/java/org/dynmap/fabric_1_18/DynmapPlugin.java b/fabric-1.18/src/main/java/org/dynmap/fabric_1_18/DynmapPlugin.java index 9cdc46bf..e5982678 100644 --- a/fabric-1.18/src/main/java/org/dynmap/fabric_1_18/DynmapPlugin.java +++ b/fabric-1.18/src/main/java/org/dynmap/fabric_1_18/DynmapPlugin.java @@ -753,7 +753,7 @@ public class DynmapPlugin { ServerChunkEvents.CHUNK_LOAD.register((world, chunk) -> worldTracker.handleChunkLoad(world, chunk)); ServerChunkEvents.CHUNK_UNLOAD.register((world, chunk) -> worldTracker.handleChunkUnload(world, chunk)); ChunkDataEvents.SAVE.register((world, chunk) -> worldTracker.handleChunkDataSave(world, chunk)); - BlockEvents.EVENT.register((world, pos) -> worldTracker.handleBlockEvent(world, pos)); + BlockEvents.BLOCK_EVENT.register((world, pos) -> worldTracker.handleBlockEvent(world, pos)); } // Prime the known full chunks if (onchunkgenerate && (server.getWorlds() != null)) { diff --git a/fabric-1.18/src/main/java/org/dynmap/fabric_1_18/event/BlockEvents.java b/fabric-1.18/src/main/java/org/dynmap/fabric_1_18/event/BlockEvents.java index f50c1cb9..b64b600b 100644 --- a/fabric-1.18/src/main/java/org/dynmap/fabric_1_18/event/BlockEvents.java +++ b/fabric-1.18/src/main/java/org/dynmap/fabric_1_18/event/BlockEvents.java @@ -9,7 +9,7 @@ public class BlockEvents { private BlockEvents() { } - public static Event EVENT = EventFactory.createArrayBacked(BlockCallback.class, + public static Event BLOCK_EVENT = EventFactory.createArrayBacked(BlockCallback.class, (listeners) -> (world, pos) -> { for (BlockCallback callback : listeners) { callback.onBlockEvent(world, pos); @@ -17,6 +17,7 @@ public class BlockEvents { } ); + @FunctionalInterface public interface BlockCallback { void onBlockEvent(World world, BlockPos pos); } diff --git a/fabric-1.18/src/main/java/org/dynmap/fabric_1_18/mixin/WorldChunkMixin.java b/fabric-1.18/src/main/java/org/dynmap/fabric_1_18/mixin/WorldChunkMixin.java index b59ce04d..56044930 100644 --- a/fabric-1.18/src/main/java/org/dynmap/fabric_1_18/mixin/WorldChunkMixin.java +++ b/fabric-1.18/src/main/java/org/dynmap/fabric_1_18/mixin/WorldChunkMixin.java @@ -19,7 +19,7 @@ public abstract class WorldChunkMixin { @Inject(method = "setBlockState", at = @At("RETURN")) public void setBlockState(BlockPos pos, BlockState state, boolean moved, CallbackInfoReturnable info) { if (info.getReturnValue() != null) { - BlockEvents.EVENT.invoker().onBlockEvent(this.getWorld(), pos); + BlockEvents.BLOCK_EVENT.invoker().onBlockEvent(this.getWorld(), pos); } } } From f03a484b37991e103c0297e013c3b301424dadbb Mon Sep 17 00:00:00 2001 From: Kosma Moczek Date: Thu, 2 Dec 2021 20:56:08 +0100 Subject: [PATCH 2/6] fabric-1.18: add BlockEvents.SIGN_CHANGE_EVENT --- .../dynmap/fabric_1_18/event/BlockEvents.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/fabric-1.18/src/main/java/org/dynmap/fabric_1_18/event/BlockEvents.java b/fabric-1.18/src/main/java/org/dynmap/fabric_1_18/event/BlockEvents.java index b64b600b..c68403d5 100644 --- a/fabric-1.18/src/main/java/org/dynmap/fabric_1_18/event/BlockEvents.java +++ b/fabric-1.18/src/main/java/org/dynmap/fabric_1_18/event/BlockEvents.java @@ -2,6 +2,9 @@ package org.dynmap.fabric_1_18.event; import net.fabricmc.fabric.api.event.Event; import net.fabricmc.fabric.api.event.EventFactory; +import net.minecraft.block.Material; +import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.server.world.ServerWorld; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; @@ -17,8 +20,21 @@ public class BlockEvents { } ); + public static Event SIGN_CHANGE_EVENT = EventFactory.createArrayBacked(SignChangeCallback.class, + (listeners) -> (world, pos, lines, material, player) -> { + for (SignChangeCallback callback : listeners) { + callback.onSignChange(world, pos, lines, material, player); + } + } + ); + @FunctionalInterface public interface BlockCallback { void onBlockEvent(World world, BlockPos pos); } + + @FunctionalInterface + public interface SignChangeCallback { + void onSignChange(ServerWorld world, BlockPos pos, String[] lines, Material material, ServerPlayerEntity player); + } } From 1c06de9b0cdc19a7ccee7ca8a0b758b7519ea54e Mon Sep 17 00:00:00 2001 From: Kosma Moczek Date: Thu, 2 Dec 2021 20:59:44 +0100 Subject: [PATCH 3/6] fabric-1.18: remove some stale code --- .../java/org/dynmap/fabric_1_18/FabricServer.java | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/fabric-1.18/src/main/java/org/dynmap/fabric_1_18/FabricServer.java b/fabric-1.18/src/main/java/org/dynmap/fabric_1_18/FabricServer.java index eb05ecd4..a4f4aadf 100644 --- a/fabric-1.18/src/main/java/org/dynmap/fabric_1_18/FabricServer.java +++ b/fabric-1.18/src/main/java/org/dynmap/fabric_1_18/FabricServer.java @@ -255,19 +255,7 @@ public class FabricServer extends DynmapServerInterface { break; case BLOCK_BREAK: - /*TODO - pm.registerEvents(new Listener() { - @EventHandler(priority=EventPriority.MONITOR) - public void onBlockBreak(BlockBreakEvent evt) { - if(evt.isCancelled()) return; - Block b = evt.getBlock(); - if(b == null) return; - Location l = b.getLocation(); - core.listenerManager.processBlockEvent(EventType.BLOCK_BREAK, b.getType().getId(), - BukkitWorld.normalizeWorldName(l.getWorld().getName()), l.getBlockX(), l.getBlockY(), l.getBlockZ()); - } - }, DynmapPlugin.this); - */ + /* Already handled by BlockEvents logic */ break; case SIGN_CHANGE: From 34a32ad575a25670ff414575aeea3298582016de Mon Sep 17 00:00:00 2001 From: Kosma Moczek Date: Thu, 2 Dec 2021 21:17:07 +0100 Subject: [PATCH 4/6] fabric-1.18: implement FabricServer.isSignAt() --- .../java/org/dynmap/fabric_1_18/FabricServer.java | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/fabric-1.18/src/main/java/org/dynmap/fabric_1_18/FabricServer.java b/fabric-1.18/src/main/java/org/dynmap/fabric_1_18/FabricServer.java index a4f4aadf..2401bc2f 100644 --- a/fabric-1.18/src/main/java/org/dynmap/fabric_1_18/FabricServer.java +++ b/fabric-1.18/src/main/java/org/dynmap/fabric_1_18/FabricServer.java @@ -3,6 +3,7 @@ package org.dynmap.fabric_1_18; import com.mojang.authlib.GameProfile; import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.api.ModContainer; +import net.minecraft.block.AbstractSignBlock; import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.network.MessageType; @@ -17,6 +18,7 @@ import net.minecraft.util.UserCache; import net.minecraft.util.Util; import net.minecraft.util.math.BlockPos; import net.minecraft.util.registry.Registry; +import net.minecraft.world.World; import net.minecraft.world.biome.Biome; import org.dynmap.DynmapChunk; import org.dynmap.DynmapCommonAPIListener; @@ -92,9 +94,17 @@ public class FabricServer extends DynmapServerInterface { return -1; } - @Override + @SuppressWarnings("deprecation") /* Not much I can do... fix this if it breaks. */ + @Override public int isSignAt(String wname, int x, int y, int z) { - return -1; + World world = plugin.getWorldByName(wname).getWorld(); + + BlockPos pos = new BlockPos(x, y, z); + if (!world.isChunkLoaded(pos)) + return -1; + + Block block = world.getBlockState(pos).getBlock(); + return (block instanceof AbstractSignBlock ? 1 : 0); } @Override From b31d7ebe9d1b651b26cc844f307b2baa8700135e Mon Sep 17 00:00:00 2001 From: Kosma Moczek Date: Thu, 2 Dec 2021 21:37:11 +0100 Subject: [PATCH 5/6] fabric-1.18: add SIGN_CHANGE_EVENT -> DynmapCore handler --- .../org/dynmap/fabric_1_18/FabricServer.java | 21 +++++-------------- 1 file changed, 5 insertions(+), 16 deletions(-) diff --git a/fabric-1.18/src/main/java/org/dynmap/fabric_1_18/FabricServer.java b/fabric-1.18/src/main/java/org/dynmap/fabric_1_18/FabricServer.java index 2401bc2f..d2a64ecf 100644 --- a/fabric-1.18/src/main/java/org/dynmap/fabric_1_18/FabricServer.java +++ b/fabric-1.18/src/main/java/org/dynmap/fabric_1_18/FabricServer.java @@ -28,6 +28,7 @@ import org.dynmap.common.BiomeMap; import org.dynmap.common.DynmapListenerManager; import org.dynmap.common.DynmapPlayer; import org.dynmap.common.DynmapServerInterface; +import org.dynmap.fabric_1_18.event.BlockEvents; import org.dynmap.fabric_1_18.event.ServerChatEvents; import org.dynmap.utils.MapChunkCache; import org.dynmap.utils.VisibilityLimit; @@ -269,22 +270,10 @@ public class FabricServer extends DynmapServerInterface { break; case SIGN_CHANGE: - /*TODO - pm.registerEvents(new Listener() { - @EventHandler(priority=EventPriority.MONITOR) - public void onSignChange(SignChangeEvent evt) { - if(evt.isCancelled()) return; - Block b = evt.getBlock(); - Location l = b.getLocation(); - String[] lines = evt.getLines(); - DynmapPlayer dp = null; - Player p = evt.getPlayer(); - if(p != null) dp = new BukkitPlayer(p); - core.listenerManager.processSignChangeEvent(EventType.SIGN_CHANGE, b.getType().getId(), - BukkitWorld.normalizeWorldName(l.getWorld().getName()), l.getBlockX(), l.getBlockY(), l.getBlockZ(), lines, dp); - } - }, DynmapPlugin.this); - */ + BlockEvents.SIGN_CHANGE_EVENT.register((world, pos, lines, material, player) -> { + plugin.core.processSignChange("fabric", FabricWorld.getWorldName(plugin, world), + pos.getX(), pos.getY(), pos.getZ(), lines, player.getName().asString()); + }); break; default: From 588525c81fa98f373ecf73efdfe73ba1976a3cd5 Mon Sep 17 00:00:00 2001 From: Kosma Moczek Date: Thu, 2 Dec 2021 21:37:41 +0100 Subject: [PATCH 6/6] fabric-1.18: add ServerPlayNetworkHandlerMixin.onSignUpdate() --- .../mixin/ServerPlayNetworkHandlerMixin.java | 39 ++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/fabric-1.18/src/main/java/org/dynmap/fabric_1_18/mixin/ServerPlayNetworkHandlerMixin.java b/fabric-1.18/src/main/java/org/dynmap/fabric_1_18/mixin/ServerPlayNetworkHandlerMixin.java index 26b8c79e..20604d34 100644 --- a/fabric-1.18/src/main/java/org/dynmap/fabric_1_18/mixin/ServerPlayNetworkHandlerMixin.java +++ b/fabric-1.18/src/main/java/org/dynmap/fabric_1_18/mixin/ServerPlayNetworkHandlerMixin.java @@ -1,14 +1,26 @@ package org.dynmap.fabric_1_18.mixin; +import net.minecraft.block.BlockState; +import net.minecraft.block.entity.BlockEntity; +import net.minecraft.block.entity.SignBlockEntity; +import net.minecraft.network.packet.c2s.play.UpdateSignC2SPacket; import net.minecraft.server.filter.TextStream; import net.minecraft.server.network.ServerPlayNetworkHandler; import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.text.LiteralText; +import net.minecraft.util.math.BlockPos; + +import java.util.List; + +import org.dynmap.fabric_1_18.event.BlockEvents; import org.dynmap.fabric_1_18.event.ServerChatEvents; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.LocalCapture; @Mixin(ServerPlayNetworkHandler.class) public abstract class ServerPlayNetworkHandlerMixin { @@ -26,4 +38,29 @@ public abstract class ServerPlayNetworkHandlerMixin { public void onGameMessage(TextStream.Message message, CallbackInfo info) { ServerChatEvents.EVENT.invoker().onChatMessage(player, message.getRaw()); } -} + + @Inject( + method = "onSignUpdate", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/block/entity/SignBlockEntity;markDirty()V", + shift = At.Shift.BEFORE + ), + locals = LocalCapture.CAPTURE_FAILHARD + ) + public void onSignUpdate(UpdateSignC2SPacket packet, List signText, CallbackInfo info, + ServerWorld serverWorld, BlockPos blockPos, BlockState blockState, BlockEntity blockEntity, SignBlockEntity signBlockEntity) + { + // Pull the raw text from the input. + String[] rawTexts = new String[4]; + for (int i=0; i