Damage resets knocked times now properly

This commit is contained in:
IM23a-spirgif
2025-04-01 17:22:55 +02:00
parent b5e03fc513
commit 3d3ee83336
6 changed files with 17 additions and 33 deletions
@@ -51,8 +51,6 @@ public class Config
logDirtBlock = LOG_DIRT_BLOCK.get(); logDirtBlock = LOG_DIRT_BLOCK.get();
magicNumber = MAGIC_NUMBER.get(); magicNumber = MAGIC_NUMBER.get();
magicNumberIntroduction = MAGIC_NUMBER_INTRODUCTION.get(); magicNumberIntroduction = MAGIC_NUMBER_INTRODUCTION.get();
// convert the list of strings into a set of items
items = ITEM_STRINGS.get().stream() items = ITEM_STRINGS.get().stream()
.map(itemName -> ForgeRegistries.ITEMS.getValue(new ResourceLocation(itemName))) .map(itemName -> ForgeRegistries.ITEMS.getValue(new ResourceLocation(itemName)))
.collect(Collectors.toSet()); .collect(Collectors.toSet());
@@ -41,20 +41,6 @@ public class KnockedBack {
LOGGER.info("KnockedBack mod server starting"); LOGGER.info("KnockedBack mod server starting");
} }
@SubscribeEvent
public void onLivingHurt(LivingHurtEvent event) {
DamageSource source = event.getSource();
String damageType = source.getMsgId();
if (event.getEntity() instanceof Player player && player.getHealth() - event.getAmount() <= 0) {
if (!(damageType.equals("fall") || damageType.equals("explosion") || damageType.equals("explosion.player") ||
damageType.equals("fire") || damageType.equals("lava") || damageType.equals("onFire") ||
damageType.equals("fireball"))) {
event.setCanceled(true);
KnockedManager.applyKnockedState(player);
}
}
}
@SubscribeEvent @SubscribeEvent
public void onLivingDeath(LivingDeathEvent event) { public void onLivingDeath(LivingDeathEvent event) {
if (KnockedManager.isKnocked(event.getEntity())) { if (KnockedManager.isKnocked(event.getEntity())) {
@@ -56,13 +56,10 @@ public class KnockedManager {
Map.Entry<UUID, Integer> entry = it.next(); Map.Entry<UUID, Integer> entry = it.next();
UUID entityId = entry.getKey(); UUID entityId = entry.getKey();
int timeLeft = entry.getValue(); int timeLeft = entry.getValue();
// If the player is gripped, force the timer to 0
if (grippedEntities.contains(entityId)) { if (grippedEntities.contains(entityId)) {
entry.setValue(0); entry.setValue(0);
timeLeft = 0; timeLeft = 0;
} else { } else {
// If not gripped, decrease normally
timeLeft--; timeLeft--;
if (timeLeft <= 0) { if (timeLeft <= 0) {
it.remove(); it.remove();
@@ -71,8 +68,6 @@ public class KnockedManager {
entry.setValue(timeLeft); entry.setValue(timeLeft);
} }
} }
// Send the updated time to the knocked player
ServerPlayer knockedPlayer = NetworkHandlerHelper.getPlayerByUuid( ServerPlayer knockedPlayer = NetworkHandlerHelper.getPlayerByUuid(
net.minecraftforge.server.ServerLifecycleHooks.getCurrentServer(), entityId); net.minecraftforge.server.ServerLifecycleHooks.getCurrentServer(), entityId);
if (knockedPlayer != null) { if (knockedPlayer != null) {
@@ -85,13 +80,23 @@ public class KnockedManager {
@SubscribeEvent @SubscribeEvent
public static void onLivingHurt(LivingHurtEvent event) { public static void onLivingHurt(LivingHurtEvent event) {
LivingEntity entity = event.getEntity(); LivingEntity entity = event.getEntity();
if (!isKnocked(entity)) return;
knockedEntities.put(entity.getUUID(), KNOCKED_DURATION);
DamageSource source = event.getSource(); DamageSource source = event.getSource();
String damageType = source.getMsgId(); String damageType = source.getMsgId();
// Handle lethal damage cases (fire, explosions, etc.) boolean isFatal = entity.getHealth() - event.getAmount() <= 0;
if (!isKnocked(entity)) {
if (entity instanceof Player player && isFatal) {
if (!(damageType.equals("fall") || damageType.equals("explosion") || damageType.equals("explosion.player") ||
damageType.equals("fire") || damageType.equals("lava") || damageType.equals("onFire") ||
damageType.equals("fireball"))) {
event.setCanceled(true);
applyKnockedState(player);
}
}
return;
}
knockedEntities.put(entity.getUUID(), KNOCKED_DURATION);
if (damageType.equals("fire") || damageType.equals("lava") || damageType.equals("onFire") || if (damageType.equals("fire") || damageType.equals("lava") || damageType.equals("onFire") ||
damageType.equals("explosion") || damageType.equals("explosion.player") || damageType.equals("fireball")) { damageType.equals("explosion") || damageType.equals("explosion.player") || damageType.equals("fireball")) {
entity.setHealth(0.0F); entity.setHealth(0.0F);
@@ -99,13 +104,13 @@ public class KnockedManager {
return; return;
} }
// Handle falling or lethal explosion
if ((damageType.equals("fall") || damageType.equals("explosion") || damageType.equals("explosion.player")) && if ((damageType.equals("fall") || damageType.equals("explosion") || damageType.equals("explosion.player")) &&
event.getAmount() >= entity.getHealth()) { event.getAmount() >= entity.getHealth()) {
entity.setHealth(0.0F); entity.setHealth(0.0F);
removeKnockedState(entity); removeKnockedState(entity);
return; return;
} }
event.setCanceled(true); event.setCanceled(true);
} }
} }
@@ -7,22 +7,17 @@ import java.util.function.Supplier;
public class KnockedTimePacket { public class KnockedTimePacket {
private final int timeLeft; private final int timeLeft;
public KnockedTimePacket(int timeLeft) { public KnockedTimePacket(int timeLeft) {
this.timeLeft = timeLeft; this.timeLeft = timeLeft;
} }
public static void encode(KnockedTimePacket packet, FriendlyByteBuf buf) { public static void encode(KnockedTimePacket packet, FriendlyByteBuf buf) {
buf.writeInt(packet.timeLeft); buf.writeInt(packet.timeLeft);
} }
public static KnockedTimePacket decode(FriendlyByteBuf buf) { public static KnockedTimePacket decode(FriendlyByteBuf buf) {
return new KnockedTimePacket(buf.readInt()); return new KnockedTimePacket(buf.readInt());
} }
public static void handle(KnockedTimePacket packet, Supplier<NetworkEvent.Context> ctx) { public static void handle(KnockedTimePacket packet, Supplier<NetworkEvent.Context> ctx) {
ctx.get().enqueueWork(() -> { ctx.get().enqueueWork(() -> {
// Client side: update the client state with the time left.
ClientKnockedState.setTimeLeft(packet.timeLeft); ClientKnockedState.setTimeLeft(packet.timeLeft);
}); });
ctx.get().setPacketHandled(true); ctx.get().setPacketHandled(true);
@@ -11,7 +11,6 @@ import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent;
@Mod.EventBusSubscriber(modid = "knockedback", bus = Mod.EventBusSubscriber.Bus.MOD) @Mod.EventBusSubscriber(modid = "knockedback", bus = Mod.EventBusSubscriber.Bus.MOD)
public class PlayerExecutionHandler { public class PlayerExecutionHandler {
public static final double EXECUTION_RANGE = 2.0; public static final double EXECUTION_RANGE = 2.0;
public static void register() { public static void register() {
MinecraftForge.EVENT_BUS.register(new PlayerExecutionHandler()); MinecraftForge.EVENT_BUS.register(new PlayerExecutionHandler());
} }
@@ -19,6 +19,7 @@ public class KnockedEffect {
player.setDeltaMovement(0, 0, 0); player.setDeltaMovement(0, 0, 0);
player.setSprinting(false); player.setSprinting(false);
player.hurtMarked = true; player.hurtMarked = true;
player.setNoGravity(false);
} }
} }