From f02a73bb0db77c8cb53c1cae51ed2d8fb7e8d10f Mon Sep 17 00:00:00 2001 From: Kosma Moczek Date: Sun, 29 May 2022 13:26:51 +0200 Subject: [PATCH] fabric-1.19: do the actual porting work --- .../org/dynmap/fabric_1_19/DynmapPlugin.java | 2 +- .../fabric_1_19/FabricCommandSender.java | 2 +- .../fabric_1_19/FabricMapChunkCache.java | 3 ++- .../org/dynmap/fabric_1_19/FabricPlayer.java | 8 ++++---- .../org/dynmap/fabric_1_19/FabricServer.java | 6 +++--- .../org/dynmap/fabric_1_19/FabricWorld.java | 15 +++++++++++---- .../mixin/ServerPlayNetworkHandlerMixin.java | 19 ++++++++++++------- 7 files changed, 34 insertions(+), 21 deletions(-) diff --git a/fabric-1.19/src/main/java/org/dynmap/fabric_1_19/DynmapPlugin.java b/fabric-1.19/src/main/java/org/dynmap/fabric_1_19/DynmapPlugin.java index fc122cd8..64de3ad3 100644 --- a/fabric-1.19/src/main/java/org/dynmap/fabric_1_19/DynmapPlugin.java +++ b/fabric-1.19/src/main/java/org/dynmap/fabric_1_19/DynmapPlugin.java @@ -268,7 +268,7 @@ public class DynmapPlugin { } // TODO: Consider whether cheats are enabled for integrated server - return server.isSingleplayer() && player.equalsIgnoreCase(server.getSinglePlayerName()); + return server.isSingleplayer() && server.isHost(server.getPlayerManager().getPlayer(player).getGameProfile()); } boolean hasPerm(PlayerEntity psender, String permission) { diff --git a/fabric-1.19/src/main/java/org/dynmap/fabric_1_19/FabricCommandSender.java b/fabric-1.19/src/main/java/org/dynmap/fabric_1_19/FabricCommandSender.java index b73af70c..b2bf4e49 100644 --- a/fabric-1.19/src/main/java/org/dynmap/fabric_1_19/FabricCommandSender.java +++ b/fabric-1.19/src/main/java/org/dynmap/fabric_1_19/FabricCommandSender.java @@ -25,7 +25,7 @@ public class FabricCommandSender implements DynmapCommandSender { @Override public void sendMessage(String msg) { if (sender != null) { - Text ichatcomponent = new LiteralTextContent(msg); + Text ichatcomponent = Text.literal(msg); sender.sendFeedback(ichatcomponent, false); } } diff --git a/fabric-1.19/src/main/java/org/dynmap/fabric_1_19/FabricMapChunkCache.java b/fabric-1.19/src/main/java/org/dynmap/fabric_1_19/FabricMapChunkCache.java index fdea7adc..4e63d359 100644 --- a/fabric-1.19/src/main/java/org/dynmap/fabric_1_19/FabricMapChunkCache.java +++ b/fabric-1.19/src/main/java/org/dynmap/fabric_1_19/FabricMapChunkCache.java @@ -83,7 +83,8 @@ public class FabricMapChunkCache extends GenericMapChunkCache { ThreadedAnvilChunkStorage acl = cps.threadedAnvilChunkStorage; ChunkPos coord = new ChunkPos(x, z); - return acl.getNbt(coord); + // Async chunk reading is synchronized here. Perhaps we can do async and improve performance? + return acl.getNbt(coord).join().orElse(null); } catch (Exception exc) { Log.severe(String.format("Error reading chunk: %s,%d,%d", dw.getName(), x, z), exc); return null; diff --git a/fabric-1.19/src/main/java/org/dynmap/fabric_1_19/FabricPlayer.java b/fabric-1.19/src/main/java/org/dynmap/fabric_1_19/FabricPlayer.java index 0986adfc..83bdf97b 100644 --- a/fabric-1.19/src/main/java/org/dynmap/fabric_1_19/FabricPlayer.java +++ b/fabric-1.19/src/main/java/org/dynmap/fabric_1_19/FabricPlayer.java @@ -188,8 +188,8 @@ public class FabricPlayer extends FabricCommandSender implements DynmapPlayer { @Override public void sendMessage(String msg) { - Text ichatcomponent = new LiteralTextContent(msg); - player.sendSystemMessage(ichatcomponent, Util.NIL_UUID); + Text ichatcomponent = Text.literal(msg); + player.sendMessage(ichatcomponent); } @Override @@ -239,12 +239,12 @@ public class FabricPlayer extends FabricCommandSender implements DynmapPlayer { TitleFadeS2CPacket times = new TitleFadeS2CPacket(fadeInTicks, stayTicks, fadeOutTicks); player.networkHandler.sendPacket(times); if (title != null) { - TitleS2CPacket titlepkt = new TitleS2CPacket(new LiteralTextContent(title)); + TitleS2CPacket titlepkt = new TitleS2CPacket(Text.literal(title)); player.networkHandler.sendPacket(titlepkt); } if (subtitle != null) { - SubtitleS2CPacket subtitlepkt = new SubtitleS2CPacket(new LiteralTextContent(subtitle)); + SubtitleS2CPacket subtitlepkt = new SubtitleS2CPacket(Text.literal(subtitle)); player.networkHandler.sendPacket(subtitlepkt); } } diff --git a/fabric-1.19/src/main/java/org/dynmap/fabric_1_19/FabricServer.java b/fabric-1.19/src/main/java/org/dynmap/fabric_1_19/FabricServer.java index 8e9e5401..f6a84c41 100644 --- a/fabric-1.19/src/main/java/org/dynmap/fabric_1_19/FabricServer.java +++ b/fabric-1.19/src/main/java/org/dynmap/fabric_1_19/FabricServer.java @@ -272,7 +272,7 @@ public class FabricServer extends DynmapServerInterface { case SIGN_CHANGE: 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().getContent()); + pos.getX(), pos.getY(), pos.getZ(), lines, player.getName().getString()); }); break; @@ -292,8 +292,8 @@ public class FabricServer extends DynmapServerInterface { @Override public void broadcastMessage(String msg) { - Text component = new LiteralTextContent(msg); - server.getPlayerManager().broadcast(component, MessageType.SYSTEM, Util.NIL_UUID); + Text component = Text.literal(msg); + server.getPlayerManager().broadcast(component, MessageType.SYSTEM); Log.info(stripChatColor(msg)); } diff --git a/fabric-1.19/src/main/java/org/dynmap/fabric_1_19/FabricWorld.java b/fabric-1.19/src/main/java/org/dynmap/fabric_1_19/FabricWorld.java index 77da953c..500d4cba 100644 --- a/fabric-1.19/src/main/java/org/dynmap/fabric_1_19/FabricWorld.java +++ b/fabric-1.19/src/main/java/org/dynmap/fabric_1_19/FabricWorld.java @@ -1,6 +1,7 @@ package org.dynmap.fabric_1_19; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MathHelper; import net.minecraft.util.registry.RegistryKey; import net.minecraft.world.Heightmap; import net.minecraft.world.LightType; @@ -49,7 +50,7 @@ public class FabricWorld extends DynmapWorld { } public void updateWorld(World w) { - this.updateWorldHeights(w.getHeight(), w.getDimension().getMinimumY(), w.getSeaLevel()); + this.updateWorldHeights(w.getHeight(), w.getBottomY(), w.getSeaLevel()); } public FabricWorld(DynmapPlugin plugin, World w) { @@ -58,7 +59,7 @@ public class FabricWorld extends DynmapWorld { w.getRegistryKey() == World.NETHER, w.getRegistryKey() == World.END, w.getRegistryKey().getValue().getPath(), - w.getDimension().getMinimumY()); + w.getBottomY()); setWorldLoaded(w); } @@ -148,8 +149,14 @@ public class FabricWorld extends DynmapWorld { world = w; this.sealevel = w.getSeaLevel(); // Read actual current sealevel from world // Update lighting table - for (int i = 0; i < 16; i++) { - this.setBrightnessTableEntry(i, w.getDimension().getBrightness(i)); + for (int lightLevel = 0; lightLevel < 16; lightLevel++) { + // Algorithm based on LightmapTextureManager.getBrightness() + // We can't call that method because it's client-only. + // This means the code below can stop being correct if Mojang ever + // updates the curve; in that case we should reflect the changes. + float value = (float) lightLevel / 15.0f; + float brightness = value / (4.0f - 3.0f * value); + this.setBrightnessTableEntry(lightLevel, MathHelper.lerp(w.getDimension().ambientLight(), brightness, 1.0F)); } } diff --git a/fabric-1.19/src/main/java/org/dynmap/fabric_1_19/mixin/ServerPlayNetworkHandlerMixin.java b/fabric-1.19/src/main/java/org/dynmap/fabric_1_19/mixin/ServerPlayNetworkHandlerMixin.java index 19c027a9..fa945b94 100644 --- a/fabric-1.19/src/main/java/org/dynmap/fabric_1_19/mixin/ServerPlayNetworkHandlerMixin.java +++ b/fabric-1.19/src/main/java/org/dynmap/fabric_1_19/mixin/ServerPlayNetworkHandlerMixin.java @@ -3,16 +3,21 @@ package org.dynmap.fabric_1_19.mixin; import net.minecraft.block.BlockState; import net.minecraft.block.entity.BlockEntity; import net.minecraft.block.entity.SignBlockEntity; +import net.minecraft.network.MessageType; +import net.minecraft.network.encryption.SignedChatMessage; import net.minecraft.network.packet.c2s.play.UpdateSignC2SPacket; +import net.minecraft.server.filter.Message; 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.LiteralTextContent; +import net.minecraft.text.Text; import net.minecraft.util.math.BlockPos; import java.util.List; +import net.minecraft.util.registry.RegistryKey; import org.dynmap.fabric_1_19.event.BlockEvents; import org.dynmap.fabric_1_19.event.ServerChatEvents; import org.spongepowered.asm.mixin.Mixin; @@ -28,15 +33,15 @@ public abstract class ServerPlayNetworkHandlerMixin { public ServerPlayerEntity player; @Inject( - method = "handleMessage", + method = "method_44155", at = @At( value = "INVOKE", - target = "Lnet/minecraft/server/PlayerManager;broadcast(Lnet/minecraft/text/Text;Ljava/util/function/Function;Lnet/minecraft/network/MessageType;Ljava/util/UUID;)V", + target = "Lnet/minecraft/server/PlayerManager;broadcast(Lnet/minecraft/server/filter/Message;Lnet/minecraft/server/network/ServerPlayerEntity;Lnet/minecraft/util/registry/RegistryKey;)V", shift = At.Shift.BEFORE ) ) - public void onGameMessage(TextStream.Message message, CallbackInfo info) { - ServerChatEvents.EVENT.invoker().onChatMessage(player, message.getRaw()); + public void onGameMessage(Message message, CallbackInfo ci) { + ServerChatEvents.EVENT.invoker().onChatMessage(player, message.raw().getContent().getString()); } @Inject( @@ -48,19 +53,19 @@ public abstract class ServerPlayNetworkHandlerMixin { ), locals = LocalCapture.CAPTURE_FAILHARD ) - public void onSignUpdate(UpdateSignC2SPacket packet, List signText, CallbackInfo info, + 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