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 { @Shadow public ServerPlayerEntity player; @Inject( method = "handleMessage", 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", shift = At.Shift.BEFORE ) ) 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