Initial Commit

This commit is contained in:
IM23a-spirgif
2025-03-28 20:51:41 +01:00
parent e618ae9b19
commit b5e03fc513
8 changed files with 375 additions and 22 deletions
@@ -32,7 +32,9 @@ public class ExecuteKnockedPacket {
private static LivingEntity findNearestKnockedEntity(ServerPlayer executor) {
return KnockedManager.getKnockedUuids().stream()
.map(uuid -> NetworkHandlerHelper.getPlayerByUuid(executor.getServer(), uuid))
.filter(player -> player != null && player.distanceTo(executor) <= (float) PlayerExecutionHandler.EXECUTION_RANGE)
.filter(player -> player != null
&& !player.getUUID().equals(executor.getUUID())
&& player.distanceTo(executor) <= (float) PlayerExecutionHandler.EXECUTION_RANGE)
.findFirst()
.orElse(null);
}
@@ -11,7 +11,7 @@ import net.minecraftforge.network.PacketDistributor;
import java.util.*;
@Mod.EventBusSubscriber
@Mod.EventBusSubscriber(modid = KnockedBack.MOD_ID, bus = Mod.EventBusSubscriber.Bus.FORGE)
public class KnockedManager {
private static final Map<UUID, Integer> knockedEntities = new HashMap<>();
private static final Set<UUID> grippedEntities = new HashSet<>();
@@ -56,8 +56,13 @@ public class KnockedManager {
Map.Entry<UUID, Integer> entry = it.next();
UUID entityId = entry.getKey();
int timeLeft = entry.getValue();
// If the player is not gripped, update the countdown
if (!grippedEntities.contains(entityId)) {
// If the player is gripped, force the timer to 0
if (grippedEntities.contains(entityId)) {
entry.setValue(0);
timeLeft = 0;
} else {
// If not gripped, decrease normally
timeLeft--;
if (timeLeft <= 0) {
it.remove();
@@ -66,23 +71,21 @@ public class KnockedManager {
entry.setValue(timeLeft);
}
}
// 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));
new KnockedTimePacket(timeLeft));
}
}
}
@SubscribeEvent
public static void onLivingHurt(LivingHurtEvent event) {
LivingEntity entity = event.getEntity();
if (!isKnocked(entity)) return;
// Always reset the timer regardless of other conditions
knockedEntities.put(entity.getUUID(), KNOCKED_DURATION);
DamageSource source = event.getSource();
@@ -100,11 +103,9 @@ public class KnockedManager {
if ((damageType.equals("fall") || damageType.equals("explosion") || damageType.equals("explosion.player")) &&
event.getAmount() >= entity.getHealth()) {
entity.setHealth(0.0F);
removeKnockedState(entity);
removeKnockedState(entity);
return;
}
// Still cancel damage for non-lethal hits, but **reset timer**
event.setCanceled(true);
}
}
@@ -3,8 +3,6 @@ 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 {
@@ -22,5 +22,10 @@ public class NetworkHandler {
ExecuteKnockedPacket::encode,
ExecuteKnockedPacket::decode,
ExecuteKnockedPacket::handle);
CHANNEL.registerMessage(id++,
KnockedTimePacket.class,
KnockedTimePacket::encode,
KnockedTimePacket::decode,
KnockedTimePacket::handle);
}
}
@@ -1,14 +1,14 @@
package net.fretux.knockedback.client;
import net.fretux.knockedback.KnockedBack;
import net.fretux.knockedback.client.ClientKnockedState;
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)
@Mod.EventBusSubscriber(modid = KnockedBack.MOD_ID, value = net.minecraftforge.api.distmarker.Dist.CLIENT)
public class KnockedTimeOverlay {
@SubscribeEvent
@@ -23,7 +23,6 @@ public class KnockedTimeOverlay {
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);
}
}
}