From e618ae9b190adaf3629277c5edd062f46e8a6456 Mon Sep 17 00:00:00 2001 From: IM23a-spirgif Date: Wed, 26 Feb 2025 11:56:39 +0100 Subject: [PATCH] Initial Commit --- .../fretux/knockedback/KnockedManager.java | 25 +++++++++++---- .../fretux/knockedback/KnockedTimePacket.java | 32 +++++++++++++++++++ .../client/ClientKnockedState.java | 17 ++++++++++ .../client/KnockedTimeOverlay.java | 29 +++++++++++++++++ 4 files changed, 96 insertions(+), 7 deletions(-) create mode 100644 src/main/java/net/fretux/knockedback/KnockedTimePacket.java create mode 100644 src/main/java/net/fretux/knockedback/client/ClientKnockedState.java create mode 100644 src/main/java/net/fretux/knockedback/client/KnockedTimeOverlay.java diff --git a/src/main/java/net/fretux/knockedback/KnockedManager.java b/src/main/java/net/fretux/knockedback/KnockedManager.java index 4748a89..0a52a0e 100644 --- a/src/main/java/net/fretux/knockedback/KnockedManager.java +++ b/src/main/java/net/fretux/knockedback/KnockedManager.java @@ -1,11 +1,13 @@ package net.fretux.knockedback; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraftforge.event.entity.living.LivingHurtEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.network.PacketDistributor; import java.util.*; @@ -54,18 +56,27 @@ public class KnockedManager { Map.Entry entry = it.next(); UUID entityId = entry.getKey(); int timeLeft = entry.getValue(); - if (grippedEntities.contains(entityId)) { - continue; + // If the player is not gripped, update the countdown + if (!grippedEntities.contains(entityId)) { + timeLeft--; + if (timeLeft <= 0) { + it.remove(); + continue; + } else { + entry.setValue(timeLeft); + } } - int newTime = timeLeft - 1; - if (newTime <= 0) { - it.remove(); - } else { - entry.setValue(newTime); + // Send the updated time to the knocked player + ServerPlayer knockedPlayer = NetworkHandlerHelper.getPlayerByUuid( + net.minecraftforge.server.ServerLifecycleHooks.getCurrentServer(), entityId); + if (knockedPlayer != null) { + NetworkHandler.CHANNEL.send(PacketDistributor.PLAYER.with(() -> knockedPlayer), + new net.fretux.knockedback.KnockedTimePacket(timeLeft)); } } } + @SubscribeEvent public static void onLivingHurt(LivingHurtEvent event) { LivingEntity entity = event.getEntity(); diff --git a/src/main/java/net/fretux/knockedback/KnockedTimePacket.java b/src/main/java/net/fretux/knockedback/KnockedTimePacket.java new file mode 100644 index 0000000..d417147 --- /dev/null +++ b/src/main/java/net/fretux/knockedback/KnockedTimePacket.java @@ -0,0 +1,32 @@ +package net.fretux.knockedback; + +import net.fretux.knockedback.client.ClientKnockedState; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraftforge.network.NetworkEvent; +import net.minecraftforge.network.PacketDistributor; +import net.fretux.knockedback.KnockedBack; +import java.util.function.Supplier; + +public class KnockedTimePacket { + private final int timeLeft; + + public KnockedTimePacket(int timeLeft) { + this.timeLeft = timeLeft; + } + + public static void encode(KnockedTimePacket packet, FriendlyByteBuf buf) { + buf.writeInt(packet.timeLeft); + } + + public static KnockedTimePacket decode(FriendlyByteBuf buf) { + return new KnockedTimePacket(buf.readInt()); + } + + public static void handle(KnockedTimePacket packet, Supplier ctx) { + ctx.get().enqueueWork(() -> { + // Client side: update the client state with the time left. + ClientKnockedState.setTimeLeft(packet.timeLeft); + }); + ctx.get().setPacketHandled(true); + } +} \ No newline at end of file diff --git a/src/main/java/net/fretux/knockedback/client/ClientKnockedState.java b/src/main/java/net/fretux/knockedback/client/ClientKnockedState.java new file mode 100644 index 0000000..403cf6b --- /dev/null +++ b/src/main/java/net/fretux/knockedback/client/ClientKnockedState.java @@ -0,0 +1,17 @@ +package net.fretux.knockedback.client; + +public class ClientKnockedState { + private static int timeLeft = 0; + + public static void setTimeLeft(int ticks) { + timeLeft = ticks; + } + + public static int getTimeLeft() { + return timeLeft; + } + + public static boolean isKnocked() { + return timeLeft > 0; + } +} \ No newline at end of file diff --git a/src/main/java/net/fretux/knockedback/client/KnockedTimeOverlay.java b/src/main/java/net/fretux/knockedback/client/KnockedTimeOverlay.java new file mode 100644 index 0000000..8abab21 --- /dev/null +++ b/src/main/java/net/fretux/knockedback/client/KnockedTimeOverlay.java @@ -0,0 +1,29 @@ +package net.fretux.knockedback.client; + +import net.fretux.knockedback.KnockedBack; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.client.event.RenderGuiOverlayEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; + +@Mod.EventBusSubscriber(modid = KnockedBack.MOD_ID, value = Dist.CLIENT) +public class KnockedTimeOverlay { + + @SubscribeEvent + public static void onRenderOverlay(RenderGuiOverlayEvent.Post event) { + if (!ClientKnockedState.isKnocked()) return; + + Minecraft mc = Minecraft.getInstance(); + GuiGraphics guiGraphics = event.getGuiGraphics(); + String text = "Time until recovery: " + (ClientKnockedState.getTimeLeft() / 20) + " s"; + + int screenWidth = mc.getWindow().getGuiScaledWidth(); + int x = screenWidth / 2 - mc.font.width(text) / 2; + int y = 10; // 10 pixels from the top + + // Draw the text with a drop shadow (true = drop shadow) + guiGraphics.drawString(mc.font, text, x, y, 0xFFFFFF, true); + } +} \ No newline at end of file