diff --git a/src/main/java/kamkeel/npcs/controllers/data/ability/AbilityController.java b/src/main/java/kamkeel/npcs/controllers/data/ability/AbilityController.java index 43af10b7c..545673e70 100644 --- a/src/main/java/kamkeel/npcs/controllers/data/ability/AbilityController.java +++ b/src/main/java/kamkeel/npcs/controllers/data/ability/AbilityController.java @@ -9,8 +9,11 @@ import noppes.npcs.LogWriter; import noppes.npcs.api.handler.IAbilityHandler; import noppes.npcs.util.NBTJsonUtil; +import net.minecraft.entity.player.EntityPlayer; + import java.io.File; import java.util.*; +import java.util.function.Predicate; import java.util.function.Supplier; public class AbilityController implements IAbilityHandler { @@ -26,6 +29,7 @@ public class AbilityController implements IAbilityHandler { private final Map> externalVariants = new LinkedHashMap<>(); private final List fieldProviders = new ArrayList<>(); private final List extenders = new ArrayList<>(); + private final List> flightCheckers = new ArrayList<>(); // ── Derived State ──────────────────────────────────────────────────────── private final Set builtInTypeIds = new HashSet<>(); @@ -382,6 +386,18 @@ public class AbilityController implements IAbilityHandler { return extenders; } + public void registerFlightChecker(Predicate checker) { + flightCheckers.add(checker); + } + + public boolean isPlayerFlying(EntityPlayer player) { + if (player.capabilities.isFlying) return true; + for (Predicate checker : flightCheckers) { + if (checker.test(player)) return true; + } + return false; + } + /** * Fire onAbilityStart on all extenders. Returns false if ANY extender cancels. */ diff --git a/src/main/java/noppes/npcs/ScriptPlayerEventHandler.java b/src/main/java/noppes/npcs/ScriptPlayerEventHandler.java index 8c9bde6ac..c0405c193 100644 --- a/src/main/java/noppes/npcs/ScriptPlayerEventHandler.java +++ b/src/main/java/noppes/npcs/ScriptPlayerEventHandler.java @@ -9,6 +9,7 @@ import kamkeel.npcs.addon.DBCAddon; import kamkeel.npcs.controllers.AttributeController; import kamkeel.npcs.controllers.SyncController; import kamkeel.npcs.controllers.data.ability.Ability; +import kamkeel.npcs.controllers.data.ability.AbilityController; import kamkeel.npcs.util.AttributeAttackUtil; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; @@ -106,7 +107,9 @@ public class ScriptPlayerEventHandler { Ability current = playerData.abilityData.getCurrentAbility(); if (current == null || !current.hasAbilityMovement()) { player.motionX = 0; - player.motionY = Math.min(player.motionY, 0); // Prevent jumping, allow gravity + if (!AbilityController.Instance.isPlayerFlying(player)) { + player.motionY = Math.min(player.motionY, 0); + } player.motionZ = 0; player.velocityChanged = true; } diff --git a/src/main/java/noppes/npcs/client/ClientTickHandler.java b/src/main/java/noppes/npcs/client/ClientTickHandler.java index d12921756..d993762ee 100644 --- a/src/main/java/noppes/npcs/client/ClientTickHandler.java +++ b/src/main/java/noppes/npcs/client/ClientTickHandler.java @@ -6,6 +6,7 @@ import cpw.mods.fml.common.gameevent.InputEvent; import cpw.mods.fml.common.gameevent.TickEvent; import cpw.mods.fml.common.gameevent.TickEvent.Phase; import kamkeel.npcs.client.renderer.lightning.LightningBolt; +import kamkeel.npcs.controllers.data.ability.AbilityController; import kamkeel.npcs.controllers.data.telegraph.TelegraphManager; import kamkeel.npcs.network.PacketClient; import kamkeel.npcs.network.packets.player.CheckPlayerValue; @@ -133,9 +134,10 @@ public class ClientTickHandler { mc.thePlayer.motionZ = 0; } - // Prevent jumping: clamp upward motion when locked (allow gravity) + // Prevent jumping when locked (allow gravity only if not flying) if ((ClientAbilityState.movementLocked || ClientAbilityState.positionLocked) - && !ClientAbilityState.hasAbilityMovement) { + && !ClientAbilityState.hasAbilityMovement + && !AbilityController.Instance.isPlayerFlying(mc.thePlayer)) { mc.thePlayer.motionY = Math.min(mc.thePlayer.motionY, 0); } }