From df9bf5f568f64f268526180ce298fa79a2e53dfb Mon Sep 17 00:00:00 2001 From: IM23a-spirgif Date: Sat, 26 Apr 2025 13:07:05 +0200 Subject: [PATCH] Some bug fixes --- .../net/fretux/knockedback/CarryManager.java | 105 ++++++++---------- .../fretux/knockedback/NetworkHandler.java | 2 - .../knockedback/PlayerExecutionHandler.java | 5 +- .../client/KnockedTimeOverlay.java | 5 +- 4 files changed, 54 insertions(+), 63 deletions(-) diff --git a/src/main/java/net/fretux/knockedback/CarryManager.java b/src/main/java/net/fretux/knockedback/CarryManager.java index 0ba2ecc..b930e56 100644 --- a/src/main/java/net/fretux/knockedback/CarryManager.java +++ b/src/main/java/net/fretux/knockedback/CarryManager.java @@ -1,15 +1,15 @@ package net.fretux.knockedback; import net.minecraft.network.chat.Component; -import net.minecraft.network.protocol.game.ClientboundSetPassengersPacket; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.player.Player; import net.minecraft.world.phys.AABB; import net.minecraftforge.event.TickEvent; -import net.minecraftforge.event.entity.EntityMountEvent; import net.minecraftforge.event.entity.living.LivingHurtEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.event.entity.EntityMountEvent; +import net.minecraft.network.protocol.game.ClientboundSetPassengersPacket; import java.util.*; @@ -19,101 +19,94 @@ public class CarryManager { private static final double CARRY_RANGE = 2.0; public static void toggleCarry(ServerPlayer carrier) { - // 1) If they’re already carrying someone, drop them—and quit immediately - carrier.getPassengers().stream() + if (KnockedManager.isKnocked(carrier)) { + carrier.sendSystemMessage(Component.literal("You cannot carry others while you are knocked!")); + return; + } + Optional existing = carrier.getPassengers().stream() .filter(p -> p instanceof Player) .map(p -> (Player)p) - .findFirst() - .ifPresent(p -> { - stopCarry((Player)p, carrier); - }); - if (carrier.getPassengers().size() > 0) return; - - // 2) Otherwise look for a knocked player to pick up - ServerPlayer near = findNearestKnocked(carrier); - if (near != null) { - startCarry(carrier, near); + .findFirst(); + if (existing.isPresent()) { + stopCarry(existing.get(), carrier); + return; } + Player near = findNearestKnocked(carrier); + if (near != null) startCarry(carrier, near); } - private static ServerPlayer findNearestKnocked(ServerPlayer carrier) { + private static Player findNearestKnocked(ServerPlayer carrier) { AABB box = carrier.getBoundingBox().inflate(CARRY_RANGE); - return carrier.getCommandSenderWorld() - .getEntitiesOfClass(ServerPlayer.class, box).stream() + return carrier + .getCommandSenderWorld() + .getEntitiesOfClass(Player.class, box).stream() .filter(p -> KnockedManager.isKnocked(p) && !p.getUUID().equals(carrier.getUUID())) .findFirst() .orElse(null); } - private static void startCarry(ServerPlayer carrier, ServerPlayer knocked) { - // mount once + private static void startCarry(ServerPlayer carrier, Player knocked) { knocked.startRiding(carrier, true); carrying.put(knocked.getUUID(), carrier.getUUID()); - - // tell both clients - ClientboundSetPassengersPacket pkt = new ClientboundSetPassengersPacket(carrier); - carrier.connection.send(pkt); - knocked.connection.send(pkt); - + ClientboundSetPassengersPacket mountPacket = new ClientboundSetPassengersPacket(carrier); + carrier.connection.send(mountPacket); + if (knocked instanceof ServerPlayer spKnocked) { + spKnocked.connection.send(mountPacket); + } carrier.sendSystemMessage(Component.literal("Picked up " + knocked.getName().getString())); knocked.sendSystemMessage(Component.literal("You are being carried by " + carrier.getName().getString())); } + private static void stopCarry(Player knocked, ServerPlayer carrier) { knocked.stopRiding(); carrying.remove(knocked.getUUID()); - - // same packet to both sides - ClientboundSetPassengersPacket pkt = new ClientboundSetPassengersPacket(carrier); - carrier.connection.send(pkt); - if (knocked instanceof ServerPlayer sp) { - sp.connection.send(pkt); + ClientboundSetPassengersPacket dismountPacket = new ClientboundSetPassengersPacket(carrier); + carrier.connection.send(dismountPacket); + if (knocked instanceof ServerPlayer spKnocked) { + spKnocked.connection.send(dismountPacket); } - carrier.sendSystemMessage(Component.literal("Dropped " + knocked.getName().getString())); knocked.sendSystemMessage(Component.literal("You have been dropped")); } - /** 2) auto-drop if out of range or no longer knocked */ @SubscribeEvent public static void onServerTick(TickEvent.ServerTickEvent ev) { if (ev.phase != TickEvent.Phase.END || !ev.side.isServer()) return; var server = net.minecraftforge.server.ServerLifecycleHooks.getCurrentServer(); - List toDrop = new ArrayList<>(); for (var entry : carrying.entrySet()) { - UUID k = entry.getKey(); - UUID c = entry.getValue(); - ServerPlayer carrier = NetworkHandlerHelper.getPlayerByUuid(server, c); - ServerPlayer knocked = NetworkHandlerHelper.getPlayerByUuid(server, k); + UUID knockedId = entry.getKey(); + UUID carrierId = entry.getValue(); + ServerPlayer carrier = NetworkHandlerHelper.getPlayerByUuid(server, carrierId); + ServerPlayer knocked = NetworkHandlerHelper.getPlayerByUuid(server, knockedId); if (carrier == null || knocked == null || !KnockedManager.isKnocked(knocked) || carrier.distanceTo(knocked) > CARRY_RANGE) { - toDrop.add(k); + toDrop.add(knockedId); } } - toDrop.forEach(k -> { + for (UUID kid : toDrop) { + UUID cid = carrying.get(kid); ServerPlayer carrier = NetworkHandlerHelper.getPlayerByUuid( - net.minecraftforge.server.ServerLifecycleHooks.getCurrentServer(), - carrying.get(k)); + net.minecraftforge.server.ServerLifecycleHooks.getCurrentServer(), cid); ServerPlayer knocked = NetworkHandlerHelper.getPlayerByUuid( - net.minecraftforge.server.ServerLifecycleHooks.getCurrentServer(), k); + net.minecraftforge.server.ServerLifecycleHooks.getCurrentServer(), kid); if (carrier != null && knocked != null) stopCarry(knocked, carrier); - }); - } - - /** 2b) prevent sneak-dismount */ - @SubscribeEvent - public static void onEntityMount(EntityMountEvent evt) { - if (!evt.isMounting() - && evt.getEntityMounting() instanceof Player knocked - && carrying.containsKey(knocked.getUUID())) { - evt.setCanceled(true); } } - /** 3) auto-drop if carrier is hurt */ + @SubscribeEvent + public static void onEntityMount(EntityMountEvent evt) { + if (!evt.isMounting()) { + if (evt.getEntityMounting() instanceof Player knocked + && carrying.containsKey(knocked.getUUID())) { + evt.setCanceled(true); + } + } + } + @SubscribeEvent public static void onCarrierHurt(LivingHurtEvent ev) { if (!(ev.getEntity() instanceof ServerPlayer carrier)) return; @@ -121,9 +114,9 @@ public class CarryManager { .filter(e -> e.getValue().equals(carrier.getUUID())) .map(Map.Entry::getKey) .findFirst() - .ifPresent(k -> { + .ifPresent(knockedId -> { ServerPlayer knocked = NetworkHandlerHelper.getPlayerByUuid( - net.minecraftforge.server.ServerLifecycleHooks.getCurrentServer(), k); + net.minecraftforge.server.ServerLifecycleHooks.getCurrentServer(), knockedId); if (knocked != null) stopCarry(knocked, carrier); }); } diff --git a/src/main/java/net/fretux/knockedback/NetworkHandler.java b/src/main/java/net/fretux/knockedback/NetworkHandler.java index 081efa1..f67c437 100644 --- a/src/main/java/net/fretux/knockedback/NetworkHandler.java +++ b/src/main/java/net/fretux/knockedback/NetworkHandler.java @@ -7,10 +7,8 @@ import net.minecraftforge.network.simple.SimpleChannel; public class NetworkHandler { public static final String PROTOCOL_VERSION = "1"; public static SimpleChannel CHANNEL; - public static void register() { CHANNEL = NetworkRegistry.newSimpleChannel(new ResourceLocation(KnockedBack.MOD_ID, "main"), () -> PROTOCOL_VERSION, PROTOCOL_VERSION::equals, PROTOCOL_VERSION::equals); - int id = 0; CHANNEL.registerMessage(id++, ExecuteKnockedPacket.class, ExecuteKnockedPacket::encode, ExecuteKnockedPacket::decode, ExecuteKnockedPacket::handle); CHANNEL.registerMessage(id++, KnockedTimePacket.class, KnockedTimePacket::encode, KnockedTimePacket::decode, KnockedTimePacket::handle); diff --git a/src/main/java/net/fretux/knockedback/PlayerExecutionHandler.java b/src/main/java/net/fretux/knockedback/PlayerExecutionHandler.java index a8d1e6e..e0bab06 100644 --- a/src/main/java/net/fretux/knockedback/PlayerExecutionHandler.java +++ b/src/main/java/net/fretux/knockedback/PlayerExecutionHandler.java @@ -57,12 +57,15 @@ public class PlayerExecutionHandler { } } - public static void register() { MinecraftForge.EVENT_BUS.register(new PlayerExecutionHandler()); } public static void startExecution(ServerPlayer executor, Player target) { + if (KnockedManager.isKnocked(executor)) { + executor.sendSystemMessage(Component.literal("You cannot execute others while you are knocked!")); + return; + } UUID knockedId = target.getUUID(); if (!KnockedManager.isKnocked(target)) return; if (CarryManager.isBeingCarried(target.getUUID())) { diff --git a/src/main/java/net/fretux/knockedback/client/KnockedTimeOverlay.java b/src/main/java/net/fretux/knockedback/client/KnockedTimeOverlay.java index 9a0100c..0046234 100644 --- a/src/main/java/net/fretux/knockedback/client/KnockedTimeOverlay.java +++ b/src/main/java/net/fretux/knockedback/client/KnockedTimeOverlay.java @@ -14,15 +14,12 @@ 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 - + int y = 10; guiGraphics.drawString(mc.font, text, x, y, 0xFFFFFF, true); } }