9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2025-12-25 18:09:27 +00:00

完善sturdy

This commit is contained in:
XiaoMoMi
2025-06-22 04:21:51 +08:00
parent 86dc597c22
commit af7c07e169

View File

@@ -23,13 +23,17 @@ public class SturdyBaseBlockBehavior extends AbstractCanSurviveBlockBehavior {
public static final Factory FACTORY = new Factory();
private final Direction direction;
private final boolean stackable;
private final List<Object> supportTypes;
private final boolean checkFull;
private final boolean checkRigid;
private final boolean checkCenter;
public SturdyBaseBlockBehavior(CustomBlock block, int delay, Direction direction, boolean stackable, List<Object> supportTypes) {
public SturdyBaseBlockBehavior(CustomBlock block, int delay, Direction direction, boolean stackable, boolean checkFull, boolean checkRigid, boolean checkCenter) {
super(block, delay);
this.direction = direction;
this.stackable = stackable;
this.supportTypes = supportTypes;
this.checkFull = checkFull;
this.checkRigid = checkRigid;
this.checkCenter = checkCenter;
}
@Override
@@ -39,13 +43,17 @@ public class SturdyBaseBlockBehavior extends AbstractCanSurviveBlockBehavior {
int z = FastNMS.INSTANCE.field$Vec3i$z(blockPos) + this.direction.stepZ();
Object targetPos = FastNMS.INSTANCE.constructor$BlockPos(x, y, z);
Object blockState = FastNMS.INSTANCE.method$BlockGetter$getBlockState(world, targetPos);
for (Object supportType : this.supportTypes) {
if ((boolean) CoreReflections.method$BlockStateBase$isFaceSturdy.invoke(
blockState, world, targetPos, DirectionUtils.toNMSDirection(this.direction.opposite()),
supportType
)) {
return true;
}
if (this.checkFull && (boolean) CoreReflections.method$BlockStateBase$isFaceSturdy.invoke(
blockState, world, targetPos, DirectionUtils.toNMSDirection(this.direction.opposite()),
CoreReflections.instance$SupportType$FULL
)) {
return true;
}
if (this.checkRigid && FastNMS.INSTANCE.method$Block$canSupportRigidBlock(world, targetPos)) {
return true;
}
if (this.checkCenter && FastNMS.INSTANCE.method$Block$canSupportCenter(world, targetPos, DirectionUtils.toNMSDirection(this.direction.opposite()))) {
return true;
}
if (!this.stackable) {
return false;
@@ -62,22 +70,8 @@ public class SturdyBaseBlockBehavior extends AbstractCanSurviveBlockBehavior {
int delay = ResourceConfigUtils.getAsInt(arguments.getOrDefault("delay", 0), "delay");
Direction direction = Direction.valueOf(arguments.getOrDefault("direction", "down").toString().toUpperCase(Locale.ENGLISH));
boolean stackable = (boolean) arguments.getOrDefault("stackable", false);
List<Object> supportTypes = MiscUtils.getAsStringList(arguments.getOrDefault("support-types", List.of("full")))
.stream()
.map(it -> {
if (it.equalsIgnoreCase("full")) {
return CoreReflections.instance$SupportType$FULL;
} else if (it.equalsIgnoreCase("rigid")) {
return CoreReflections.instance$SupportType$RIGID;
} else if (it.equalsIgnoreCase("center")) {
return CoreReflections.instance$SupportType$CENTER;
} else {
return null;
}
})
.filter(Objects::nonNull)
.toList();
return new SturdyBaseBlockBehavior(block, delay, direction, stackable, supportTypes);
List<String> supportTypes = MiscUtils.getAsStringList(arguments.getOrDefault("support-types", List.of("full")));
return new SturdyBaseBlockBehavior(block, delay, direction, stackable, supportTypes.contains("full"), supportTypes.contains("rigid"), supportTypes.contains("center"));
}
}
}