mirror of
https://github.com/Xiao-MoMi/craft-engine.git
synced 2025-12-29 20:09:13 +00:00
完善摔落伤害机制处理等
This commit is contained in:
@@ -6,6 +6,7 @@ import net.momirealms.craftengine.bukkit.util.LocationUtils;
|
||||
import net.momirealms.craftengine.core.block.BlockBehavior;
|
||||
import net.momirealms.craftengine.core.block.CustomBlock;
|
||||
import net.momirealms.craftengine.core.block.behavior.BlockBehaviorFactory;
|
||||
import net.momirealms.craftengine.core.block.behavior.special.TriggerOnceBlockBehavior;
|
||||
import net.momirealms.craftengine.core.util.ResourceConfigUtils;
|
||||
import net.momirealms.craftengine.core.util.VersionHelper;
|
||||
import net.momirealms.craftengine.core.world.Vec3d;
|
||||
@@ -13,19 +14,22 @@ import net.momirealms.craftengine.core.world.Vec3d;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.Callable;
|
||||
|
||||
public class BouncingBlockBehavior extends BukkitBlockBehavior {
|
||||
public class BouncingBlockBehavior extends BukkitBlockBehavior implements TriggerOnceBlockBehavior {
|
||||
public static final Factory FACTORY = new Factory();
|
||||
private final double bounceHeight;
|
||||
private final boolean syncPlayerSelf;
|
||||
private final boolean fallDamage;
|
||||
|
||||
public BouncingBlockBehavior(CustomBlock customBlock, double bounceHeight, boolean syncPlayerSelf) {
|
||||
public BouncingBlockBehavior(CustomBlock customBlock, double bounceHeight, boolean fallDamage) {
|
||||
super(customBlock);
|
||||
this.bounceHeight = bounceHeight;
|
||||
this.syncPlayerSelf = syncPlayerSelf;
|
||||
this.fallDamage = fallDamage;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void fallOn(Object thisBlock, Object[] args, Callable<Object> superMethod) {
|
||||
if (!this.fallDamage) {
|
||||
return;
|
||||
}
|
||||
Object entity = args[3];
|
||||
Object finalFallDistance = VersionHelper.isOrAbove1_21_5() ? (double) args[4] * 0.5 : (float) args[4] * 0.5F;
|
||||
FastNMS.INSTANCE.method$Entity$causeFallDamage(
|
||||
@@ -50,7 +54,8 @@ public class BouncingBlockBehavior extends BukkitBlockBehavior {
|
||||
double d = CoreReflections.clazz$LivingEntity.isInstance(entity) ? 1.0 : 0.8;
|
||||
double y = -deltaMovement.y * this.bounceHeight * d;
|
||||
FastNMS.INSTANCE.method$Entity$setDeltaMovement(entity, deltaMovement.x, y, deltaMovement.z);
|
||||
if (CoreReflections.clazz$Player.isInstance(entity) && this.syncPlayerSelf && y > 0.032) { // 防抖
|
||||
if (CoreReflections.clazz$Player.isInstance(entity) && y > 0.032) {
|
||||
// 防抖
|
||||
FastNMS.INSTANCE.field$Entity$hurtMarked(entity, true);
|
||||
}
|
||||
}
|
||||
@@ -61,8 +66,8 @@ public class BouncingBlockBehavior extends BukkitBlockBehavior {
|
||||
@Override
|
||||
public BlockBehavior create(CustomBlock block, Map<String, Object> arguments) {
|
||||
double bounceHeight = ResourceConfigUtils.getAsDouble(arguments.getOrDefault("bounce-height", 0.66), "bounce-height");
|
||||
boolean syncPlayerSelf = ResourceConfigUtils.getAsBoolean(arguments.getOrDefault("sync-player-self", true), "sync-player-self");
|
||||
return new BouncingBlockBehavior(block, bounceHeight, syncPlayerSelf);
|
||||
boolean fallDamage = ResourceConfigUtils.getAsBoolean(arguments.getOrDefault("fall-damage", false), "fall-damage");
|
||||
return new BouncingBlockBehavior(block, bounceHeight, fallDamage);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@ import net.momirealms.craftengine.core.block.CustomBlock;
|
||||
import net.momirealms.craftengine.core.block.ImmutableBlockState;
|
||||
import net.momirealms.craftengine.core.block.behavior.AbstractBlockBehavior;
|
||||
import net.momirealms.craftengine.core.block.behavior.EntityBlockBehavior;
|
||||
import net.momirealms.craftengine.core.block.behavior.special.TriggerOnceBlockBehavior;
|
||||
import net.momirealms.craftengine.core.entity.player.InteractionResult;
|
||||
import net.momirealms.craftengine.core.item.context.BlockPlaceContext;
|
||||
import net.momirealms.craftengine.core.item.context.UseOnContext;
|
||||
@@ -14,7 +15,7 @@ import java.util.List;
|
||||
import java.util.Optional;
|
||||
import java.util.concurrent.Callable;
|
||||
|
||||
public class UnsafeCompositeBlockBehavior extends BukkitBlockBehavior {
|
||||
public class UnsafeCompositeBlockBehavior extends BukkitBlockBehavior implements TriggerOnceBlockBehavior {
|
||||
private final AbstractBlockBehavior[] behaviors;
|
||||
|
||||
public UnsafeCompositeBlockBehavior(CustomBlock customBlock, List<AbstractBlockBehavior> behaviors) {
|
||||
@@ -340,18 +341,22 @@ public class UnsafeCompositeBlockBehavior extends BukkitBlockBehavior {
|
||||
@Override
|
||||
public void fallOn(Object thisBlock, Object[] args, Callable<Object> superMethod) throws Exception {
|
||||
for (AbstractBlockBehavior behavior : this.behaviors) {
|
||||
behavior.fallOn(thisBlock, args, superMethod);
|
||||
if (behavior instanceof TriggerOnceBlockBehavior f) {
|
||||
f.fallOn(thisBlock, args, superMethod);
|
||||
return;
|
||||
}
|
||||
}
|
||||
TriggerOnceBlockBehavior.super.fallOn(thisBlock, args, superMethod);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateEntityMovementAfterFallOn(Object thisBlock, Object[] args, Callable<Object> superMethod) throws Exception {
|
||||
for (AbstractBlockBehavior behavior : this.behaviors) {
|
||||
if (behavior instanceof BouncingBlockBehavior bouncingBlockBehavior) {
|
||||
bouncingBlockBehavior.updateEntityMovementAfterFallOn(thisBlock, args, superMethod);
|
||||
if (behavior instanceof TriggerOnceBlockBehavior f) {
|
||||
f.updateEntityMovementAfterFallOn(thisBlock, args, superMethod);
|
||||
return;
|
||||
}
|
||||
}
|
||||
super.updateEntityMovementAfterFallOn(thisBlock, args, superMethod);
|
||||
TriggerOnceBlockBehavior.super.updateEntityMovementAfterFallOn(thisBlock, args, superMethod);
|
||||
}
|
||||
}
|
||||
@@ -23,6 +23,7 @@ import net.momirealms.craftengine.core.block.BlockKeys;
|
||||
import net.momirealms.craftengine.core.block.BlockShape;
|
||||
import net.momirealms.craftengine.core.block.DelegatingBlock;
|
||||
import net.momirealms.craftengine.core.block.behavior.EmptyBlockBehavior;
|
||||
import net.momirealms.craftengine.core.block.behavior.special.TriggerOnceBlockBehavior;
|
||||
import net.momirealms.craftengine.core.plugin.CraftEngine;
|
||||
import net.momirealms.craftengine.core.plugin.config.Config;
|
||||
import net.momirealms.craftengine.core.util.Key;
|
||||
@@ -538,7 +539,7 @@ public final class BlockGenerator {
|
||||
public void intercept(@This Object thisObj, @AllArguments Object[] args, @SuperCall Callable<Object> superMethod) {
|
||||
ObjectHolder<BlockBehavior> holder = ((DelegatingBlock) thisObj).behaviorDelegate();
|
||||
try {
|
||||
holder.value().onExplosionHit(thisObj, args, superMethod);
|
||||
holder.value().onExplosionHit(thisObj, args, () -> null);
|
||||
superMethod.call();
|
||||
} catch (Exception e) {
|
||||
CraftEngine.instance().logger().severe("Failed to run onExplosionHit", e);
|
||||
@@ -714,7 +715,11 @@ public final class BlockGenerator {
|
||||
public void intercept(@This Object thisObj, @AllArguments Object[] args, @SuperCall Callable<Object> superMethod) {
|
||||
ObjectHolder<BlockBehavior> holder = ((DelegatingBlock) thisObj).behaviorDelegate();
|
||||
try {
|
||||
holder.value().fallOn(thisObj, args, superMethod);
|
||||
if (holder.value() instanceof TriggerOnceBlockBehavior behavior) {
|
||||
behavior.fallOn(thisObj, args, superMethod);
|
||||
} else {
|
||||
superMethod.call();
|
||||
}
|
||||
} catch (Exception e) {
|
||||
CraftEngine.instance().logger().severe("Failed to run fallOn", e);
|
||||
}
|
||||
@@ -728,7 +733,11 @@ public final class BlockGenerator {
|
||||
public void intercept(@This Object thisObj, @AllArguments Object[] args, @SuperCall Callable<Object> superMethod) {
|
||||
ObjectHolder<BlockBehavior> holder = ((DelegatingBlock) thisObj).behaviorDelegate();
|
||||
try {
|
||||
holder.value().updateEntityMovementAfterFallOn(thisObj, args, superMethod);
|
||||
if (holder.value() instanceof TriggerOnceBlockBehavior behavior) {
|
||||
behavior.updateEntityMovementAfterFallOn(thisObj, args, superMethod);
|
||||
} else {
|
||||
superMethod.call();
|
||||
}
|
||||
} catch (Exception e) {
|
||||
CraftEngine.instance().logger().severe("Failed to run updateEntityMovementAfterFallOn", e);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user