From 0c4c307c28215143372b082b3ede18d5924fc727 Mon Sep 17 00:00:00 2001 From: Octol1ttle Date: Mon, 6 May 2024 15:12:23 +0500 Subject: [PATCH 1/4] feat: add teammate markers --- build.gradle | 2 +- .../knockdowns/common/KnockdownsClient.java | 6 +- .../knockdowns/common/api/RemotePlayer.java | 5 + .../common/events/KnockdownsClientEvents.java | 132 +++++++++++++++--- .../mixin/client/GameRendererMixin.java | 21 +++ .../common/mixin/client/InGameHudMixin.java | 17 +++ .../common/network/KnockdownsNetwork.java | 10 +- .../position/RemotePlayerS2CPacket.java | 42 ++++++ .../RequestRemotePlayerC2SPacket.java | 39 ++++++ .../RequestStartRevivingC2SPacket.java | 3 +- .../{ => reviving}/StopRevivingC2SPacket.java | 3 +- .../common/util/RendererUtilsCopy.java | 75 ++++++++++ .../util/ScreenSpaceTransformResult.java | 10 ++ .../knockdowns/textures/knocked_icon.png | Bin 0 -> 172 bytes .../resources/knockdowns-common.mixins.json | 4 +- settings.gradle | 2 +- 16 files changed, 337 insertions(+), 34 deletions(-) create mode 100644 common/src/main/java/ru/octol1ttle/knockdowns/common/api/RemotePlayer.java create mode 100644 common/src/main/java/ru/octol1ttle/knockdowns/common/mixin/client/GameRendererMixin.java create mode 100644 common/src/main/java/ru/octol1ttle/knockdowns/common/mixin/client/InGameHudMixin.java create mode 100644 common/src/main/java/ru/octol1ttle/knockdowns/common/network/packets/position/RemotePlayerS2CPacket.java create mode 100644 common/src/main/java/ru/octol1ttle/knockdowns/common/network/packets/position/RequestRemotePlayerC2SPacket.java rename common/src/main/java/ru/octol1ttle/knockdowns/common/network/packets/{ => reviving}/RequestStartRevivingC2SPacket.java (90%) rename common/src/main/java/ru/octol1ttle/knockdowns/common/network/packets/{ => reviving}/StopRevivingC2SPacket.java (91%) create mode 100644 common/src/main/java/ru/octol1ttle/knockdowns/common/util/RendererUtilsCopy.java create mode 100644 common/src/main/java/ru/octol1ttle/knockdowns/common/util/ScreenSpaceTransformResult.java create mode 100644 common/src/main/resources/assets/knockdowns/textures/knocked_icon.png diff --git a/build.gradle b/build.gradle index df015f7..a65723a 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,6 @@ plugins { id "architectury-plugin" version "3.4-SNAPSHOT" - id "dev.architectury.loom" version "1.4-SNAPSHOT" apply false + id "dev.architectury.loom" version "1.5-SNAPSHOT" apply false } architectury { diff --git a/common/src/main/java/ru/octol1ttle/knockdowns/common/KnockdownsClient.java b/common/src/main/java/ru/octol1ttle/knockdowns/common/KnockdownsClient.java index 1b4272f..2fcfc82 100644 --- a/common/src/main/java/ru/octol1ttle/knockdowns/common/KnockdownsClient.java +++ b/common/src/main/java/ru/octol1ttle/knockdowns/common/KnockdownsClient.java @@ -9,10 +9,9 @@ import net.minecraft.util.hit.HitResult; import net.minecraft.util.math.Vec3d; import org.jetbrains.annotations.Nullable; import ru.octol1ttle.knockdowns.common.api.IKnockableDown; -import ru.octol1ttle.knockdowns.common.events.KnockdownsClientEvents; import ru.octol1ttle.knockdowns.common.network.KnockdownsNetwork; -import ru.octol1ttle.knockdowns.common.network.packets.RequestStartRevivingC2SPacket; -import ru.octol1ttle.knockdowns.common.network.packets.StopRevivingC2SPacket; +import ru.octol1ttle.knockdowns.common.network.packets.reviving.RequestStartRevivingC2SPacket; +import ru.octol1ttle.knockdowns.common.network.packets.reviving.StopRevivingC2SPacket; import ru.octol1ttle.knockdowns.common.registries.KnockdownsSoundEvents; import ru.octol1ttle.knockdowns.common.registries.KnockedDownSoundInstance; @@ -21,7 +20,6 @@ public class KnockdownsClient { public static Entity reviving; public static void init() { - KnockdownsClientEvents.registerCallbacks(); } public static void playKnockedDownSound(Vec3d pos) { diff --git a/common/src/main/java/ru/octol1ttle/knockdowns/common/api/RemotePlayer.java b/common/src/main/java/ru/octol1ttle/knockdowns/common/api/RemotePlayer.java new file mode 100644 index 0000000..ee3a056 --- /dev/null +++ b/common/src/main/java/ru/octol1ttle/knockdowns/common/api/RemotePlayer.java @@ -0,0 +1,5 @@ +package ru.octol1ttle.knockdowns.common.api; + +import net.minecraft.util.math.Vec3d; + +public record RemotePlayer(Vec3d eyePosition, boolean knockedDown) { } diff --git a/common/src/main/java/ru/octol1ttle/knockdowns/common/events/KnockdownsClientEvents.java b/common/src/main/java/ru/octol1ttle/knockdowns/common/events/KnockdownsClientEvents.java index 47ec31d..1d36df3 100644 --- a/common/src/main/java/ru/octol1ttle/knockdowns/common/events/KnockdownsClientEvents.java +++ b/common/src/main/java/ru/octol1ttle/knockdowns/common/events/KnockdownsClientEvents.java @@ -1,44 +1,130 @@ package ru.octol1ttle.knockdowns.common.events; -import dev.architectury.event.events.client.ClientGuiEvent; +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; +import java.util.UUID; import net.minecraft.SharedConstants; import net.minecraft.client.MinecraftClient; import net.minecraft.client.font.TextRenderer; +import net.minecraft.client.gui.DrawContext; +import net.minecraft.client.gui.PlayerSkinDrawer; +import net.minecraft.client.network.PlayerListEntry; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.util.Formatting; +import net.minecraft.util.Identifier; +import net.minecraft.util.hit.HitResult; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.RaycastContext; import ru.octol1ttle.knockdowns.common.KnockdownsClient; import ru.octol1ttle.knockdowns.common.api.IKnockableDown; +import ru.octol1ttle.knockdowns.common.api.RemotePlayer; +import ru.octol1ttle.knockdowns.common.network.KnockdownsNetwork; +import ru.octol1ttle.knockdowns.common.network.packets.position.RequestRemotePlayerC2SPacket; +import ru.octol1ttle.knockdowns.common.util.RendererUtilsCopy; +import ru.octol1ttle.knockdowns.common.util.ScreenSpaceTransformResult; public class KnockdownsClientEvents { - public static void registerCallbacks() { - registerOnHudRender(); + public static void onHudRender(DrawContext context) { + renderReviveText(context); + renderPlayerIcons(context); } - private static void registerOnHudRender() { - ClientGuiEvent.RENDER_HUD.register((drawContext, tickDelta) -> { - IKnockableDown reviving = (IKnockableDown) KnockdownsClient.reviving; - MinecraftClient client = MinecraftClient.getInstance(); - if (reviving == null) { - reviving = (IKnockableDown) client.player; - if (reviving == null || reviving.get_ReviverCount() == 0) { - return; + private static void renderReviveText(DrawContext context) { + IKnockableDown reviving = (IKnockableDown) KnockdownsClient.reviving; + MinecraftClient client = MinecraftClient.getInstance(); + if (reviving == null) { + reviving = (IKnockableDown) client.player; + if (reviving == null || reviving.get_ReviverCount() == 0) { + return; + } + } + + TextRenderer renderer = client.textRenderer; + + String timerText = String.format("%.1f", reviving.get_ReviveTimer() / (float) SharedConstants.TICKS_PER_SECOND); + int timerX = (context.getScaledWindowWidth() - renderer.getWidth(timerText)) / 2; + + int reviverCount = reviving.get_ReviverCount(); + Integer color = reviverCount > 1 ? Formatting.GREEN.getColorValue() : Formatting.WHITE.getColorValue(); + + String reviverCountText = "x" + reviverCount; + int reviveCountX = (context.getScaledWindowWidth() - renderer.getWidth(reviverCountText)) / 2; + + if (color != null) { + context.drawTextWithShadow(renderer, timerText, timerX, context.getScaledWindowHeight() / 2 + 5, color); + context.drawTextWithShadow(renderer, reviverCountText, reviveCountX, context.getScaledWindowHeight() / 2 + 14, color); + } + } + + public static final Map> remotePlayers = new HashMap<>(); + private static final Identifier KNOCKED_ICON_ID = new Identifier("knockdowns", "textures/knocked_icon.png"); + @SuppressWarnings("DataFlowIssue") + private static void renderPlayerIcons(DrawContext context) { + MinecraftClient client = MinecraftClient.getInstance(); + + Collection entries = client.player.networkHandler.getListedPlayerListEntries(); + for (PlayerListEntry entry : entries) { + UUID id = entry.getProfile().getId(); + PlayerEntity player = client.world.getPlayerByUuid(id); + if (client.player.equals(player)) { + continue; + } + + Vec3d eyePosition; + boolean knockedDown; + if (player != null) { + remotePlayers.remove(id); + + eyePosition = player.getEyePos(); + knockedDown = ((IKnockableDown) player).is_KnockedDown(); + } else { + Optional remote = remotePlayers.get(id); + if (remote != null) { + if (remote.isEmpty()) { + continue; + } + + eyePosition = remote.get().eyePosition(); + knockedDown = remote.get().knockedDown(); + } else { + remotePlayers.put(id, Optional.empty()); + KnockdownsNetwork.sendToServer(new RequestRemotePlayerC2SPacket(id)); + continue; } } - TextRenderer renderer = client.textRenderer; + ScreenSpaceTransformResult result = RendererUtilsCopy.worldSpaceToScreenSpace(eyePosition); + int size = 16; - String timerText = String.format("%.1f", reviving.get_ReviveTimer() / (float) SharedConstants.TICKS_PER_SECOND); - int timerX = (drawContext.getScaledWindowWidth() - renderer.getWidth(timerText)) / 2; + int width = context.getScaledWindowWidth(); + int x = MathHelper.clamp(MathHelper.floor(result.vec().x - size * 0.5), size + 5, width - size - 5); - int reviverCount = reviving.get_ReviverCount(); - Integer color = reviverCount > 1 ? Formatting.GREEN.getColorValue() : Formatting.WHITE.getColorValue(); + int height = context.getScaledWindowHeight(); + int y = MathHelper.clamp(MathHelper.floor(result.vec().y - size * 0.5), size + 5, height - size - 5); - String reviverCountText = "x" + reviverCount; - int reviveCountX = (drawContext.getScaledWindowWidth() - renderer.getWidth(reviverCountText)) / 2; - - if (color != null) { - drawContext.drawTextWithShadow(renderer, timerText, timerX, drawContext.getScaledWindowHeight() / 2 + 5, color); - drawContext.drawTextWithShadow(renderer, reviverCountText, reviveCountX, drawContext.getScaledWindowHeight() / 2 + 14, color); + if (result.type() != ScreenSpaceTransformResult.ScreenSpaceTransformType.ON_SCREEN + || client.player.getEyePos().distanceTo(eyePosition) > 64.0 + || client.world + .raycast(new RaycastContext( + client.player.getEyePos(), + eyePosition, + RaycastContext.ShapeType.VISUAL, + RaycastContext.FluidHandling.SOURCE_ONLY, + client.player + )).getType() == HitResult.Type.BLOCK) + { + PlayerSkinDrawer.draw(context, entry.getSkinTexture(), x, y, size, true, false); } - }); + + if (knockedDown) { + context.drawTexture(KNOCKED_ICON_ID, x, y, size, size, 0, 0, 18, 18, 18, 18); + } + if (client.player.age % 20 == 0 && remotePlayers.containsKey(id)) { + KnockdownsNetwork.sendToServer(new RequestRemotePlayerC2SPacket(id)); + } + } } } diff --git a/common/src/main/java/ru/octol1ttle/knockdowns/common/mixin/client/GameRendererMixin.java b/common/src/main/java/ru/octol1ttle/knockdowns/common/mixin/client/GameRendererMixin.java new file mode 100644 index 0000000..b47fc94 --- /dev/null +++ b/common/src/main/java/ru/octol1ttle/knockdowns/common/mixin/client/GameRendererMixin.java @@ -0,0 +1,21 @@ +package ru.octol1ttle.knockdowns.common.mixin.client; + +import com.mojang.blaze3d.systems.RenderSystem; +import net.minecraft.client.render.GameRenderer; +import net.minecraft.client.util.math.MatrixStack; +import org.objectweb.asm.Opcodes; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import ru.octol1ttle.knockdowns.common.util.RendererUtilsCopy; + +@Mixin(GameRenderer.class) +public abstract class GameRendererMixin { + @Inject(at = @At(value = "FIELD", target = "Lnet/minecraft/client/render/GameRenderer;renderHand:Z", opcode = Opcodes.GETFIELD, ordinal = 0), method = "renderWorld") + void renderer_postWorldRender(float tickDelta, long limitTime, MatrixStack matrix, CallbackInfo ci) { + RendererUtilsCopy.lastProjMat.set(RenderSystem.getProjectionMatrix()); + RendererUtilsCopy.lastModMat.set(RenderSystem.getModelViewMatrix()); + RendererUtilsCopy.lastWorldSpaceMatrix.set(matrix.peek().getPositionMatrix()); + } +} diff --git a/common/src/main/java/ru/octol1ttle/knockdowns/common/mixin/client/InGameHudMixin.java b/common/src/main/java/ru/octol1ttle/knockdowns/common/mixin/client/InGameHudMixin.java new file mode 100644 index 0000000..a00cf16 --- /dev/null +++ b/common/src/main/java/ru/octol1ttle/knockdowns/common/mixin/client/InGameHudMixin.java @@ -0,0 +1,17 @@ +package ru.octol1ttle.knockdowns.common.mixin.client; + +import net.minecraft.client.gui.DrawContext; +import net.minecraft.client.gui.hud.InGameHud; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import ru.octol1ttle.knockdowns.common.events.KnockdownsClientEvents; + +@Mixin(InGameHud.class) +public abstract class InGameHudMixin { + @Inject(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/ClientPlayerInteractionManager;getCurrentGameMode()Lnet/minecraft/world/GameMode;", ordinal = 0)) + public void render(DrawContext drawContext, float tickDelta, CallbackInfo callbackInfo) { + KnockdownsClientEvents.onHudRender(drawContext); + } +} diff --git a/common/src/main/java/ru/octol1ttle/knockdowns/common/network/KnockdownsNetwork.java b/common/src/main/java/ru/octol1ttle/knockdowns/common/network/KnockdownsNetwork.java index 8544efb..bcc0a08 100644 --- a/common/src/main/java/ru/octol1ttle/knockdowns/common/network/KnockdownsNetwork.java +++ b/common/src/main/java/ru/octol1ttle/knockdowns/common/network/KnockdownsNetwork.java @@ -9,15 +9,21 @@ import net.minecraft.server.world.ServerWorld; import net.minecraft.util.Identifier; import ru.octol1ttle.knockdowns.common.KnockdownsCommon; import ru.octol1ttle.knockdowns.common.network.packets.PlayKnockedDownSoundS2CPacket; -import ru.octol1ttle.knockdowns.common.network.packets.RequestStartRevivingC2SPacket; -import ru.octol1ttle.knockdowns.common.network.packets.StopRevivingC2SPacket; +import ru.octol1ttle.knockdowns.common.network.packets.position.RemotePlayerS2CPacket; +import ru.octol1ttle.knockdowns.common.network.packets.position.RequestRemotePlayerC2SPacket; +import ru.octol1ttle.knockdowns.common.network.packets.reviving.RequestStartRevivingC2SPacket; +import ru.octol1ttle.knockdowns.common.network.packets.reviving.StopRevivingC2SPacket; public class KnockdownsNetwork { private static final NetworkChannel CHANNEL = NetworkChannel.create(new Identifier(KnockdownsCommon.MOD_ID, "main")); public static void registerPackets() { CHANNEL.register(PlayKnockedDownSoundS2CPacket.class, PlayKnockedDownSoundS2CPacket::encode, PlayKnockedDownSoundS2CPacket::new, PlayKnockedDownSoundS2CPacket::apply); + CHANNEL.register(RequestStartRevivingC2SPacket.class, RequestStartRevivingC2SPacket::encode, RequestStartRevivingC2SPacket::new, RequestStartRevivingC2SPacket::apply); CHANNEL.register(StopRevivingC2SPacket.class, StopRevivingC2SPacket::encode, StopRevivingC2SPacket::new, StopRevivingC2SPacket::apply); + + CHANNEL.register(RequestRemotePlayerC2SPacket.class, RequestRemotePlayerC2SPacket::encode, RequestRemotePlayerC2SPacket::new, RequestRemotePlayerC2SPacket::apply); + CHANNEL.register(RemotePlayerS2CPacket.class, RemotePlayerS2CPacket::encode, RemotePlayerS2CPacket::new, RemotePlayerS2CPacket::apply); } public static void sendToServer(T message) { diff --git a/common/src/main/java/ru/octol1ttle/knockdowns/common/network/packets/position/RemotePlayerS2CPacket.java b/common/src/main/java/ru/octol1ttle/knockdowns/common/network/packets/position/RemotePlayerS2CPacket.java new file mode 100644 index 0000000..c4d61fa --- /dev/null +++ b/common/src/main/java/ru/octol1ttle/knockdowns/common/network/packets/position/RemotePlayerS2CPacket.java @@ -0,0 +1,42 @@ +package ru.octol1ttle.knockdowns.common.network.packets.position; + +import dev.architectury.networking.NetworkManager; +import java.util.Optional; +import java.util.UUID; +import java.util.function.Supplier; +import net.minecraft.network.PacketByteBuf; +import net.minecraft.util.math.Vec3d; +import ru.octol1ttle.knockdowns.common.api.RemotePlayer; +import ru.octol1ttle.knockdowns.common.events.KnockdownsClientEvents; +import ru.octol1ttle.knockdowns.common.network.packets.KnockdownsPacket; + +public class RemotePlayerS2CPacket extends KnockdownsPacket { + private final UUID targetUuid; + private final Vec3d eyePosition; + private final boolean knockedDown; + + public RemotePlayerS2CPacket(PacketByteBuf buf) { + this(buf.readUuid(), new Vec3d(buf.readDouble(), buf.readDouble(), buf.readDouble()), buf.readBoolean()); + } + + public RemotePlayerS2CPacket(UUID targetUuid, Vec3d eyePosition, boolean knockedDown) { + this.targetUuid = targetUuid; + this.eyePosition = eyePosition; + this.knockedDown = knockedDown; + } + + @Override + public void encode(PacketByteBuf buf) { + buf.writeUuid(this.targetUuid); + buf.writeDouble(this.eyePosition.x); + buf.writeDouble(this.eyePosition.y); + buf.writeDouble(this.eyePosition.z); + buf.writeBoolean(this.knockedDown); + } + + @Override + public void apply(Supplier contextSupplier) { + NetworkManager.PacketContext context = contextSupplier.get(); + context.queue(() -> KnockdownsClientEvents.remotePlayers.put(targetUuid, Optional.of(new RemotePlayer(this.eyePosition, this.knockedDown)))); + } +} diff --git a/common/src/main/java/ru/octol1ttle/knockdowns/common/network/packets/position/RequestRemotePlayerC2SPacket.java b/common/src/main/java/ru/octol1ttle/knockdowns/common/network/packets/position/RequestRemotePlayerC2SPacket.java new file mode 100644 index 0000000..756a436 --- /dev/null +++ b/common/src/main/java/ru/octol1ttle/knockdowns/common/network/packets/position/RequestRemotePlayerC2SPacket.java @@ -0,0 +1,39 @@ +package ru.octol1ttle.knockdowns.common.network.packets.position; + +import dev.architectury.networking.NetworkManager; +import java.util.UUID; +import java.util.function.Supplier; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.network.PacketByteBuf; +import ru.octol1ttle.knockdowns.common.api.IKnockableDown; +import ru.octol1ttle.knockdowns.common.network.KnockdownsNetwork; +import ru.octol1ttle.knockdowns.common.network.packets.KnockdownsPacket; + +public class RequestRemotePlayerC2SPacket extends KnockdownsPacket { + private final UUID targetUuid; + + public RequestRemotePlayerC2SPacket(PacketByteBuf buf) { + this(buf.readUuid()); + } + + public RequestRemotePlayerC2SPacket(UUID targetUuid) { + this.targetUuid = targetUuid; + } + + @Override + public void encode(PacketByteBuf buf) { + buf.writeUuid(this.targetUuid); + } + + @Override + public void apply(Supplier contextSupplier) { + NetworkManager.PacketContext context = contextSupplier.get(); + context.queue(() -> { + PlayerEntity sender = context.getPlayer(); + PlayerEntity target = sender.getEntityWorld().getPlayerByUuid(targetUuid); + if (target != null) { + KnockdownsNetwork.sendToPlayer(context.getPlayer(), new RemotePlayerS2CPacket(targetUuid, target.getEyePos(), ((IKnockableDown)target).is_KnockedDown())); + } + }); + } +} diff --git a/common/src/main/java/ru/octol1ttle/knockdowns/common/network/packets/RequestStartRevivingC2SPacket.java b/common/src/main/java/ru/octol1ttle/knockdowns/common/network/packets/reviving/RequestStartRevivingC2SPacket.java similarity index 90% rename from common/src/main/java/ru/octol1ttle/knockdowns/common/network/packets/RequestStartRevivingC2SPacket.java rename to common/src/main/java/ru/octol1ttle/knockdowns/common/network/packets/reviving/RequestStartRevivingC2SPacket.java index 31a7de0..1894271 100644 --- a/common/src/main/java/ru/octol1ttle/knockdowns/common/network/packets/RequestStartRevivingC2SPacket.java +++ b/common/src/main/java/ru/octol1ttle/knockdowns/common/network/packets/reviving/RequestStartRevivingC2SPacket.java @@ -1,4 +1,4 @@ -package ru.octol1ttle.knockdowns.common.network.packets; +package ru.octol1ttle.knockdowns.common.network.packets.reviving; import dev.architectury.networking.NetworkManager; import java.util.UUID; @@ -6,6 +6,7 @@ import java.util.function.Supplier; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.network.PacketByteBuf; import ru.octol1ttle.knockdowns.common.api.IKnockableDown; +import ru.octol1ttle.knockdowns.common.network.packets.KnockdownsPacket; public class RequestStartRevivingC2SPacket extends KnockdownsPacket { private final UUID targetUuid; diff --git a/common/src/main/java/ru/octol1ttle/knockdowns/common/network/packets/StopRevivingC2SPacket.java b/common/src/main/java/ru/octol1ttle/knockdowns/common/network/packets/reviving/StopRevivingC2SPacket.java similarity index 91% rename from common/src/main/java/ru/octol1ttle/knockdowns/common/network/packets/StopRevivingC2SPacket.java rename to common/src/main/java/ru/octol1ttle/knockdowns/common/network/packets/reviving/StopRevivingC2SPacket.java index 260cc1e..a890e05 100644 --- a/common/src/main/java/ru/octol1ttle/knockdowns/common/network/packets/StopRevivingC2SPacket.java +++ b/common/src/main/java/ru/octol1ttle/knockdowns/common/network/packets/reviving/StopRevivingC2SPacket.java @@ -1,4 +1,4 @@ -package ru.octol1ttle.knockdowns.common.network.packets; +package ru.octol1ttle.knockdowns.common.network.packets.reviving; import dev.architectury.networking.NetworkManager; import java.util.UUID; @@ -6,6 +6,7 @@ import java.util.function.Supplier; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.network.PacketByteBuf; import ru.octol1ttle.knockdowns.common.api.IKnockableDown; +import ru.octol1ttle.knockdowns.common.network.packets.KnockdownsPacket; public class StopRevivingC2SPacket extends KnockdownsPacket { private final UUID targetUuid; diff --git a/common/src/main/java/ru/octol1ttle/knockdowns/common/util/RendererUtilsCopy.java b/common/src/main/java/ru/octol1ttle/knockdowns/common/util/RendererUtilsCopy.java new file mode 100644 index 0000000..33c25a4 --- /dev/null +++ b/common/src/main/java/ru/octol1ttle/knockdowns/common/util/RendererUtilsCopy.java @@ -0,0 +1,75 @@ +package ru.octol1ttle.knockdowns.common.util; + +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.render.Camera; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.Vec3d; +import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.Contract; +import org.jetbrains.annotations.NotNull; +import org.joml.Matrix4f; +import org.joml.Vector2d; +import org.joml.Vector3f; +import org.joml.Vector4f; +import org.lwjgl.opengl.GL11; + +/** + * @author 0x3C50 + *

Utils for rendering in minecraft

+ */ +public class RendererUtilsCopy { + @ApiStatus.Internal + public static final Matrix4f lastProjMat = new Matrix4f(); + @ApiStatus.Internal + public static final Matrix4f lastModMat = new Matrix4f(); + @ApiStatus.Internal + public static final Matrix4f lastWorldSpaceMatrix = new Matrix4f(); + private static final MinecraftClient client = MinecraftClient.getInstance(); + + @Contract(value = "_ -> new", pure = true) + public static ScreenSpaceTransformResult worldSpaceToScreenSpace(@NotNull Vec3d pos) { + Camera camera = client.getEntityRenderDispatcher().camera; + + double deltaX = pos.x - camera.getPos().x; + double deltaY = pos.y - camera.getPos().y; + double deltaZ = pos.z - camera.getPos().z; + + Vector4f transformedCoordinates = new Vector4f((float) deltaX, (float) deltaY, (float) deltaZ, 1.f).mul( + lastWorldSpaceMatrix); + + Matrix4f matrixProj = new Matrix4f(lastProjMat); + + Vector4f clip = matrixProj.transform(new Vector4f(transformedCoordinates)); + if (clip.z > 0 && Math.abs(clip.x) < Math.abs(clip.w) && Math.abs(clip.y) < Math.abs(clip.w)) { + int[] viewport = new int[4]; + GL11.glGetIntegerv(GL11.GL_VIEWPORT, viewport); + Matrix4f matrixModel = new Matrix4f(lastModMat); + Vector3f target = new Vector3f(); + + matrixProj + .mul(matrixModel) + .project(transformedCoordinates.x(), transformedCoordinates.y(), transformedCoordinates.z(), viewport, target); + + return new ScreenSpaceTransformResult( + new Vector2d( + target.x / client.getWindow().getScaleFactor(), + (client.getWindow().getHeight() - target.y) / client.getWindow().getScaleFactor() + ), + ScreenSpaceTransformResult.ScreenSpaceTransformType.ON_SCREEN + ); + } + + clip.normalize(); + double angle = Math.atan2(clip.y, clip.x); + double width = client.getWindow().getScaledWidth(); + double height = client.getWindow().getScaledHeight(); + + double x = MathHelper.clamp(Math.cos(angle) * width + width / 2, 0.0f, width); + double y = height - (MathHelper.clamp(Math.sin(angle) * height + height / 2, 0.0f, height)); + + return new ScreenSpaceTransformResult( + new Vector2d(x, y), + ScreenSpaceTransformResult.ScreenSpaceTransformType.STUCK_TO_EDGES + ); + } +} \ No newline at end of file diff --git a/common/src/main/java/ru/octol1ttle/knockdowns/common/util/ScreenSpaceTransformResult.java b/common/src/main/java/ru/octol1ttle/knockdowns/common/util/ScreenSpaceTransformResult.java new file mode 100644 index 0000000..a672418 --- /dev/null +++ b/common/src/main/java/ru/octol1ttle/knockdowns/common/util/ScreenSpaceTransformResult.java @@ -0,0 +1,10 @@ +package ru.octol1ttle.knockdowns.common.util; + +import org.joml.Vector2d; + +public record ScreenSpaceTransformResult(Vector2d vec, ScreenSpaceTransformType type) { + public enum ScreenSpaceTransformType { + ON_SCREEN, + STUCK_TO_EDGES + } +} diff --git a/common/src/main/resources/assets/knockdowns/textures/knocked_icon.png b/common/src/main/resources/assets/knockdowns/textures/knocked_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..d61f41cd2ed91db2872f6bce853183f5b313d350 GIT binary patch literal 172 zcmeAS@N?(olHy`uVBq!ia0y~yU=RXfCT0c(2JHoDM;I6wcmjMvT>t<7Z^_J@!_2&g znR%jB*$M^*2F8*gzhDN3XE)Lq7#RFKT^vIy;*t{_n0&Y;OeAMWI7uvH@bpt-XIob9 zJMVtu8`kJ|3@62TSRFon-_L9i$u^Z;xZz0)k0_g(+V0pn4&T22=XEG%l5m-Lwv~zD Zcevok>02bD85kHCJYD@<);T3K0RY+~GU@;T literal 0 HcmV?d00001 diff --git a/common/src/main/resources/knockdowns-common.mixins.json b/common/src/main/resources/knockdowns-common.mixins.json index b157b56..99e53cc 100644 --- a/common/src/main/resources/knockdowns-common.mixins.json +++ b/common/src/main/resources/knockdowns-common.mixins.json @@ -4,7 +4,9 @@ "compatibilityLevel": "JAVA_17", "minVersion": "0.8", "client": [ - "client.ClientPlayerEntityMixin" + "client.ClientPlayerEntityMixin", + "client.GameRendererMixin", + "client.InGameHudMixin" ], "mixins": [ "LivingEntityMixin", diff --git a/settings.gradle b/settings.gradle index 163e9f2..553b0f8 100644 --- a/settings.gradle +++ b/settings.gradle @@ -2,7 +2,7 @@ pluginManagement { repositories { maven { url "https://maven.fabricmc.net/" } maven { url "https://maven.architectury.dev/" } - maven { url "https://maven.minecraftforge.net/" } + maven { url "https://maven.neoforged.net/releases" } gradlePluginPortal() } } From 743e7e3ea186f6fd5c273c1c16cbfbadbaffe5af Mon Sep 17 00:00:00 2001 From: Octol1ttle Date: Mon, 6 May 2024 20:11:54 +0500 Subject: [PATCH 2/4] fix: stuff --- .../common/events/KnockdownsClientEvents.java | 14 ++++++-- .../common/events/KnockdownsEvents.java | 13 ++++++-- .../common/network/KnockdownsNetwork.java | 2 ++ .../RemotePlayerDimensionChangeS2CPacket.java | 32 +++++++++++++++++++ .../common/util/RendererUtilsCopy.java | 4 +-- .../util/ScreenSpaceTransformResult.java | 4 +-- .../knockdowns/forge/KnockdownsForge.java | 10 ++++++ gradle.properties | 7 ++-- 8 files changed, 72 insertions(+), 14 deletions(-) create mode 100644 common/src/main/java/ru/octol1ttle/knockdowns/common/network/packets/position/RemotePlayerDimensionChangeS2CPacket.java diff --git a/common/src/main/java/ru/octol1ttle/knockdowns/common/events/KnockdownsClientEvents.java b/common/src/main/java/ru/octol1ttle/knockdowns/common/events/KnockdownsClientEvents.java index 1d36df3..c8420c4 100644 --- a/common/src/main/java/ru/octol1ttle/knockdowns/common/events/KnockdownsClientEvents.java +++ b/common/src/main/java/ru/octol1ttle/knockdowns/common/events/KnockdownsClientEvents.java @@ -19,6 +19,7 @@ import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3d; import net.minecraft.world.RaycastContext; import ru.octol1ttle.knockdowns.common.KnockdownsClient; +import ru.octol1ttle.knockdowns.common.KnockdownsCommon; import ru.octol1ttle.knockdowns.common.api.IKnockableDown; import ru.octol1ttle.knockdowns.common.api.RemotePlayer; import ru.octol1ttle.knockdowns.common.network.KnockdownsNetwork; @@ -37,7 +38,7 @@ public class KnockdownsClientEvents { MinecraftClient client = MinecraftClient.getInstance(); if (reviving == null) { reviving = (IKnockableDown) client.player; - if (reviving == null || reviving.get_ReviverCount() == 0) { + if (reviving == null || reviving.get_ReviveTimer() == KnockdownsCommon.REVIVE_WAIT_TIME) { return; } } @@ -48,7 +49,14 @@ public class KnockdownsClientEvents { int timerX = (context.getScaledWindowWidth() - renderer.getWidth(timerText)) / 2; int reviverCount = reviving.get_ReviverCount(); - Integer color = reviverCount > 1 ? Formatting.GREEN.getColorValue() : Formatting.WHITE.getColorValue(); + Integer color; + if (reviverCount == 0) { + color = Formatting.RED.getColorValue(); + } else if (reviverCount == 1) { + color = Formatting.WHITE.getColorValue(); + } else { + color = Formatting.GREEN.getColorValue(); + } String reviverCountText = "x" + reviverCount; int reviveCountX = (context.getScaledWindowWidth() - renderer.getWidth(reviverCountText)) / 2; @@ -105,7 +113,7 @@ public class KnockdownsClientEvents { int height = context.getScaledWindowHeight(); int y = MathHelper.clamp(MathHelper.floor(result.vec().y - size * 0.5), size + 5, height - size - 5); - if (result.type() != ScreenSpaceTransformResult.ScreenSpaceTransformType.ON_SCREEN + if (result.type() != ScreenSpaceTransformResult.TransformType.ON_SCREEN || client.player.getEyePos().distanceTo(eyePosition) > 64.0 || client.world .raycast(new RaycastContext( diff --git a/common/src/main/java/ru/octol1ttle/knockdowns/common/events/KnockdownsEvents.java b/common/src/main/java/ru/octol1ttle/knockdowns/common/events/KnockdownsEvents.java index 06748e2..674da07 100644 --- a/common/src/main/java/ru/octol1ttle/knockdowns/common/events/KnockdownsEvents.java +++ b/common/src/main/java/ru/octol1ttle/knockdowns/common/events/KnockdownsEvents.java @@ -21,6 +21,8 @@ import ru.octol1ttle.knockdowns.common.KnockdownsUtils; import ru.octol1ttle.knockdowns.common.api.IKnockableDown; import ru.octol1ttle.knockdowns.common.network.KnockdownsNetwork; import ru.octol1ttle.knockdowns.common.network.packets.PlayKnockedDownSoundS2CPacket; +import ru.octol1ttle.knockdowns.common.network.packets.position.RemotePlayerDimensionChangeS2CPacket; +import ru.octol1ttle.knockdowns.common.network.packets.position.RemotePlayerS2CPacket; public class KnockdownsEvents { private static final float KNOCKED_INVULNERABILITY_TICKS = 3.0f * SharedConstants.TICKS_PER_SECOND; @@ -32,6 +34,7 @@ public class KnockdownsEvents { registerOnPlayerTick(); registerOnPlayerInteractions(); registerOnEntityUse(); + registerOnDimensionChange(); } private static void registerOnLivingDeath() { @@ -51,7 +54,6 @@ public class KnockdownsEvents { entity.clearStatusEffects(); entity.setInvulnerable(true); - entity.setGlowing(true); entity.setHealth(entity.getMaxHealth()); entity.extinguish(); entity.setAir(entity.getMaxAir()); @@ -99,7 +101,6 @@ public class KnockdownsEvents { KnockdownsUtils.resetKnockedState(knockable); player.setInvulnerable(false); - player.setGlowing(false); player.setHealth(player.getMaxHealth() * 0.3f); } return; @@ -115,6 +116,14 @@ public class KnockdownsEvents { }); } + private static void registerOnDimensionChange() { + PlayerEvent.CHANGE_DIMENSION.register((player, oldLevel, newLevel) -> { + //noinspection DataFlowIssue + KnockdownsNetwork.sendToWorld(player.getServer().getWorld(oldLevel), new RemotePlayerDimensionChangeS2CPacket(player.getUuid())); + KnockdownsNetwork.sendToWorld(player.getServerWorld(), new RemotePlayerS2CPacket(player.getUuid(), player.getEyePos(), ((IKnockableDown)player).is_KnockedDown())); + }); + } + private static void registerOnPlayerInteractions() { InteractionEvent.LEFT_CLICK_BLOCK.register((player, hand, pos, direction) -> { if (KnockdownsUtils.isKnockedOrReviving(player)) { diff --git a/common/src/main/java/ru/octol1ttle/knockdowns/common/network/KnockdownsNetwork.java b/common/src/main/java/ru/octol1ttle/knockdowns/common/network/KnockdownsNetwork.java index bcc0a08..7501dcb 100644 --- a/common/src/main/java/ru/octol1ttle/knockdowns/common/network/KnockdownsNetwork.java +++ b/common/src/main/java/ru/octol1ttle/knockdowns/common/network/KnockdownsNetwork.java @@ -9,6 +9,7 @@ import net.minecraft.server.world.ServerWorld; import net.minecraft.util.Identifier; import ru.octol1ttle.knockdowns.common.KnockdownsCommon; import ru.octol1ttle.knockdowns.common.network.packets.PlayKnockedDownSoundS2CPacket; +import ru.octol1ttle.knockdowns.common.network.packets.position.RemotePlayerDimensionChangeS2CPacket; import ru.octol1ttle.knockdowns.common.network.packets.position.RemotePlayerS2CPacket; import ru.octol1ttle.knockdowns.common.network.packets.position.RequestRemotePlayerC2SPacket; import ru.octol1ttle.knockdowns.common.network.packets.reviving.RequestStartRevivingC2SPacket; @@ -24,6 +25,7 @@ public class KnockdownsNetwork { CHANNEL.register(RequestRemotePlayerC2SPacket.class, RequestRemotePlayerC2SPacket::encode, RequestRemotePlayerC2SPacket::new, RequestRemotePlayerC2SPacket::apply); CHANNEL.register(RemotePlayerS2CPacket.class, RemotePlayerS2CPacket::encode, RemotePlayerS2CPacket::new, RemotePlayerS2CPacket::apply); + CHANNEL.register(RemotePlayerDimensionChangeS2CPacket.class, RemotePlayerDimensionChangeS2CPacket::encode, RemotePlayerDimensionChangeS2CPacket::new, RemotePlayerDimensionChangeS2CPacket::apply); } public static void sendToServer(T message) { diff --git a/common/src/main/java/ru/octol1ttle/knockdowns/common/network/packets/position/RemotePlayerDimensionChangeS2CPacket.java b/common/src/main/java/ru/octol1ttle/knockdowns/common/network/packets/position/RemotePlayerDimensionChangeS2CPacket.java new file mode 100644 index 0000000..ecf0d1f --- /dev/null +++ b/common/src/main/java/ru/octol1ttle/knockdowns/common/network/packets/position/RemotePlayerDimensionChangeS2CPacket.java @@ -0,0 +1,32 @@ +package ru.octol1ttle.knockdowns.common.network.packets.position; + +import dev.architectury.networking.NetworkManager; +import java.util.Optional; +import java.util.UUID; +import java.util.function.Supplier; +import net.minecraft.network.PacketByteBuf; +import ru.octol1ttle.knockdowns.common.events.KnockdownsClientEvents; +import ru.octol1ttle.knockdowns.common.network.packets.KnockdownsPacket; + +public class RemotePlayerDimensionChangeS2CPacket extends KnockdownsPacket { + private final UUID targetUuid; + + public RemotePlayerDimensionChangeS2CPacket(PacketByteBuf buf) { + this(buf.readUuid()); + } + + public RemotePlayerDimensionChangeS2CPacket(UUID targetUuid) { + this.targetUuid = targetUuid; + } + + @Override + public void encode(PacketByteBuf buf) { + buf.writeUuid(this.targetUuid); + } + + @Override + public void apply(Supplier contextSupplier) { + NetworkManager.PacketContext context = contextSupplier.get(); + context.queue(() -> KnockdownsClientEvents.remotePlayers.put(targetUuid, Optional.empty())); + } +} diff --git a/common/src/main/java/ru/octol1ttle/knockdowns/common/util/RendererUtilsCopy.java b/common/src/main/java/ru/octol1ttle/knockdowns/common/util/RendererUtilsCopy.java index 33c25a4..d0aa48c 100644 --- a/common/src/main/java/ru/octol1ttle/knockdowns/common/util/RendererUtilsCopy.java +++ b/common/src/main/java/ru/octol1ttle/knockdowns/common/util/RendererUtilsCopy.java @@ -55,7 +55,7 @@ public class RendererUtilsCopy { target.x / client.getWindow().getScaleFactor(), (client.getWindow().getHeight() - target.y) / client.getWindow().getScaleFactor() ), - ScreenSpaceTransformResult.ScreenSpaceTransformType.ON_SCREEN + ScreenSpaceTransformResult.TransformType.ON_SCREEN ); } @@ -69,7 +69,7 @@ public class RendererUtilsCopy { return new ScreenSpaceTransformResult( new Vector2d(x, y), - ScreenSpaceTransformResult.ScreenSpaceTransformType.STUCK_TO_EDGES + ScreenSpaceTransformResult.TransformType.STUCK_TO_EDGES ); } } \ No newline at end of file diff --git a/common/src/main/java/ru/octol1ttle/knockdowns/common/util/ScreenSpaceTransformResult.java b/common/src/main/java/ru/octol1ttle/knockdowns/common/util/ScreenSpaceTransformResult.java index a672418..ac64f62 100644 --- a/common/src/main/java/ru/octol1ttle/knockdowns/common/util/ScreenSpaceTransformResult.java +++ b/common/src/main/java/ru/octol1ttle/knockdowns/common/util/ScreenSpaceTransformResult.java @@ -2,8 +2,8 @@ package ru.octol1ttle.knockdowns.common.util; import org.joml.Vector2d; -public record ScreenSpaceTransformResult(Vector2d vec, ScreenSpaceTransformType type) { - public enum ScreenSpaceTransformType { +public record ScreenSpaceTransformResult(Vector2d vec, TransformType type) { + public enum TransformType { ON_SCREEN, STUCK_TO_EDGES } diff --git a/forge/src/main/java/ru/octol1ttle/knockdowns/forge/KnockdownsForge.java b/forge/src/main/java/ru/octol1ttle/knockdowns/forge/KnockdownsForge.java index 83a53a8..179dcc8 100644 --- a/forge/src/main/java/ru/octol1ttle/knockdowns/forge/KnockdownsForge.java +++ b/forge/src/main/java/ru/octol1ttle/knockdowns/forge/KnockdownsForge.java @@ -1,12 +1,16 @@ package ru.octol1ttle.knockdowns.forge; import dev.architectury.platform.forge.EventBuses; +import net.minecraftforge.client.event.RenderGuiEvent; +import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.eventbus.api.IEventBus; +import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import ru.octol1ttle.knockdowns.common.KnockdownsClient; import ru.octol1ttle.knockdowns.common.KnockdownsCommon; +import ru.octol1ttle.knockdowns.common.events.KnockdownsClientEvents; @SuppressWarnings("unused") @Mod(KnockdownsCommon.MOD_ID) @@ -16,6 +20,7 @@ public class KnockdownsForge { IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus(); EventBuses.registerModEventBus(KnockdownsCommon.MOD_ID, modEventBus); modEventBus.addListener(this::onInitializeClient); + MinecraftForge.EVENT_BUS.register(this); KnockdownsCommon.init(); } @@ -23,4 +28,9 @@ public class KnockdownsForge { public void onInitializeClient(FMLClientSetupEvent event) { KnockdownsClient.init(); } + + @SubscribeEvent + public void onHudRender(RenderGuiEvent.Pre event) { + KnockdownsClientEvents.onHudRender(event.getGuiGraphics()); + } } diff --git a/gradle.properties b/gradle.properties index 822bf00..0e63c4e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,14 +4,11 @@ minecraft_version=1.20.1 enabled_platforms=fabric,forge archives_base_name=knockdowns -mod_version=2.2.2 +mod_version=2.3.1 maven_group=ru.octol1ttle.knockdowns architectury_version=9.1.12 fabric_api_version=0.90.4+1.20.1 fabric_loader_version=0.15.5 -forge_version=1.20.1-47.2.0 - - - +forge_version=1.20.1-47.2.0 \ No newline at end of file From 8dd209899f74b4ff9d2972c2ade261cdf210c73f Mon Sep 17 00:00:00 2001 From: Octol1ttle Date: Mon, 6 May 2024 20:20:59 +0500 Subject: [PATCH 3/4] fix: Forge nonsense --- .../knockdowns/forge/KnockdownsClientForge.java | 9 +++++++++ .../ru/octol1ttle/knockdowns/forge/KnockdownsForge.java | 3 +-- 2 files changed, 10 insertions(+), 2 deletions(-) create mode 100644 forge/src/main/java/ru/octol1ttle/knockdowns/forge/KnockdownsClientForge.java diff --git a/forge/src/main/java/ru/octol1ttle/knockdowns/forge/KnockdownsClientForge.java b/forge/src/main/java/ru/octol1ttle/knockdowns/forge/KnockdownsClientForge.java new file mode 100644 index 0000000..534a7b2 --- /dev/null +++ b/forge/src/main/java/ru/octol1ttle/knockdowns/forge/KnockdownsClientForge.java @@ -0,0 +1,9 @@ +package ru.octol1ttle.knockdowns.forge; + +import net.minecraftforge.client.event.RenderGuiEvent; + +public class KnockdownsClientForge { + public static void onHudRender(RenderGuiEvent.Pre event) { + ru.octol1ttle.knockdowns.common.events.KnockdownsClientEvents.onHudRender(event.getGuiGraphics()); + } +} diff --git a/forge/src/main/java/ru/octol1ttle/knockdowns/forge/KnockdownsForge.java b/forge/src/main/java/ru/octol1ttle/knockdowns/forge/KnockdownsForge.java index 179dcc8..291183e 100644 --- a/forge/src/main/java/ru/octol1ttle/knockdowns/forge/KnockdownsForge.java +++ b/forge/src/main/java/ru/octol1ttle/knockdowns/forge/KnockdownsForge.java @@ -10,7 +10,6 @@ import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import ru.octol1ttle.knockdowns.common.KnockdownsClient; import ru.octol1ttle.knockdowns.common.KnockdownsCommon; -import ru.octol1ttle.knockdowns.common.events.KnockdownsClientEvents; @SuppressWarnings("unused") @Mod(KnockdownsCommon.MOD_ID) @@ -31,6 +30,6 @@ public class KnockdownsForge { @SubscribeEvent public void onHudRender(RenderGuiEvent.Pre event) { - KnockdownsClientEvents.onHudRender(event.getGuiGraphics()); + KnockdownsClientForge.onHudRender(event); } } From d70b2b597415804f45fc5b82611208e171010817 Mon Sep 17 00:00:00 2001 From: Octol1ttle Date: Mon, 6 May 2024 23:23:32 +0500 Subject: [PATCH 4/4] fix: camera and outdated cache --- .../common/events/KnockdownsClientEvents.java | 2 +- .../packets/position/RemotePlayerS2CPacket.java | 10 +++++++++- .../knockdowns/forge/KnockdownsClientForge.java | 13 +++++++++++++ .../knockdowns/forge/KnockdownsForge.java | 16 ---------------- 4 files changed, 23 insertions(+), 18 deletions(-) diff --git a/common/src/main/java/ru/octol1ttle/knockdowns/common/events/KnockdownsClientEvents.java b/common/src/main/java/ru/octol1ttle/knockdowns/common/events/KnockdownsClientEvents.java index c8420c4..207d8ee 100644 --- a/common/src/main/java/ru/octol1ttle/knockdowns/common/events/KnockdownsClientEvents.java +++ b/common/src/main/java/ru/octol1ttle/knockdowns/common/events/KnockdownsClientEvents.java @@ -117,7 +117,7 @@ public class KnockdownsClientEvents { || client.player.getEyePos().distanceTo(eyePosition) > 64.0 || client.world .raycast(new RaycastContext( - client.player.getEyePos(), + client.getEntityRenderDispatcher().camera.getPos(), eyePosition, RaycastContext.ShapeType.VISUAL, RaycastContext.FluidHandling.SOURCE_ONLY, diff --git a/common/src/main/java/ru/octol1ttle/knockdowns/common/network/packets/position/RemotePlayerS2CPacket.java b/common/src/main/java/ru/octol1ttle/knockdowns/common/network/packets/position/RemotePlayerS2CPacket.java index c4d61fa..ccd5ddc 100644 --- a/common/src/main/java/ru/octol1ttle/knockdowns/common/network/packets/position/RemotePlayerS2CPacket.java +++ b/common/src/main/java/ru/octol1ttle/knockdowns/common/network/packets/position/RemotePlayerS2CPacket.java @@ -4,6 +4,7 @@ import dev.architectury.networking.NetworkManager; import java.util.Optional; import java.util.UUID; import java.util.function.Supplier; +import net.minecraft.client.MinecraftClient; import net.minecraft.network.PacketByteBuf; import net.minecraft.util.math.Vec3d; import ru.octol1ttle.knockdowns.common.api.RemotePlayer; @@ -37,6 +38,13 @@ public class RemotePlayerS2CPacket extends KnockdownsPacket { @Override public void apply(Supplier contextSupplier) { NetworkManager.PacketContext context = contextSupplier.get(); - context.queue(() -> KnockdownsClientEvents.remotePlayers.put(targetUuid, Optional.of(new RemotePlayer(this.eyePosition, this.knockedDown)))); + context.queue(() -> { + //noinspection DataFlowIssue + if (MinecraftClient.getInstance().player.getUuid().equals(targetUuid)) { + KnockdownsClientEvents.remotePlayers.clear(); + } else { + KnockdownsClientEvents.remotePlayers.put(targetUuid, Optional.of(new RemotePlayer(this.eyePosition, this.knockedDown))); + } + }); } } diff --git a/forge/src/main/java/ru/octol1ttle/knockdowns/forge/KnockdownsClientForge.java b/forge/src/main/java/ru/octol1ttle/knockdowns/forge/KnockdownsClientForge.java index 534a7b2..5e25e19 100644 --- a/forge/src/main/java/ru/octol1ttle/knockdowns/forge/KnockdownsClientForge.java +++ b/forge/src/main/java/ru/octol1ttle/knockdowns/forge/KnockdownsClientForge.java @@ -1,8 +1,21 @@ package ru.octol1ttle.knockdowns.forge; +import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.client.event.RenderGuiEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; +import ru.octol1ttle.knockdowns.common.KnockdownsClient; +@SuppressWarnings("unused") +@Mod.EventBusSubscriber(modid = "knockdowns", bus = Mod.EventBusSubscriber.Bus.FORGE, value = Dist.CLIENT) public class KnockdownsClientForge { + @SubscribeEvent + public void onInitializeClient(FMLClientSetupEvent event) { + KnockdownsClient.init(); + } + + @SubscribeEvent public static void onHudRender(RenderGuiEvent.Pre event) { ru.octol1ttle.knockdowns.common.events.KnockdownsClientEvents.onHudRender(event.getGuiGraphics()); } diff --git a/forge/src/main/java/ru/octol1ttle/knockdowns/forge/KnockdownsForge.java b/forge/src/main/java/ru/octol1ttle/knockdowns/forge/KnockdownsForge.java index 291183e..0c7454a 100644 --- a/forge/src/main/java/ru/octol1ttle/knockdowns/forge/KnockdownsForge.java +++ b/forge/src/main/java/ru/octol1ttle/knockdowns/forge/KnockdownsForge.java @@ -1,14 +1,9 @@ package ru.octol1ttle.knockdowns.forge; import dev.architectury.platform.forge.EventBuses; -import net.minecraftforge.client.event.RenderGuiEvent; -import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.eventbus.api.IEventBus; -import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; -import ru.octol1ttle.knockdowns.common.KnockdownsClient; import ru.octol1ttle.knockdowns.common.KnockdownsCommon; @SuppressWarnings("unused") @@ -18,18 +13,7 @@ public class KnockdownsForge { // Submit our event bus to let architectury register our content on the right time IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus(); EventBuses.registerModEventBus(KnockdownsCommon.MOD_ID, modEventBus); - modEventBus.addListener(this::onInitializeClient); - MinecraftForge.EVENT_BUS.register(this); KnockdownsCommon.init(); } - - public void onInitializeClient(FMLClientSetupEvent event) { - KnockdownsClient.init(); - } - - @SubscribeEvent - public void onHudRender(RenderGuiEvent.Pre event) { - KnockdownsClientForge.onHudRender(event); - } }