Damage resets knocked times now properly
This commit is contained in:
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user