9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2025-12-27 02:49:15 +00:00

让全部自定义方块均支持waterlogged

This commit is contained in:
XiaoMoMi
2025-06-19 04:09:00 +08:00
parent 4e1de1c9af
commit cd7d29ea15
10 changed files with 119 additions and 126 deletions

View File

@@ -2,8 +2,6 @@ package net.momirealms.craftengine.core.block;
import com.google.common.collect.ImmutableMap;
import net.momirealms.craftengine.core.block.behavior.AbstractBlockBehavior;
import net.momirealms.craftengine.core.block.behavior.BlockBehaviors;
import net.momirealms.craftengine.core.block.behavior.UnsafeCompositeBlockBehavior;
import net.momirealms.craftengine.core.block.properties.Property;
import net.momirealms.craftengine.core.item.context.BlockPlaceContext;
import net.momirealms.craftengine.core.loot.LootTable;
@@ -53,17 +51,7 @@ public abstract class AbstractCustomBlock implements CustomBlock {
this.events = events;
this.variantProvider = new BlockStateVariantProvider(holder, ImmutableBlockState::new, properties);
this.defaultState = this.variantProvider.getDefaultState();
if (behaviorConfig.isEmpty()) {
this.behavior = new EmptyBlockBehavior();
} else if (behaviorConfig.size() == 1) {
this.behavior = BlockBehaviors.fromMap(this, behaviorConfig.get(0));
} else {
List<AbstractBlockBehavior> behaviors = new ArrayList<>();
for (Map<String, Object> config : behaviorConfig) {
behaviors.add((AbstractBlockBehavior) BlockBehaviors.fromMap(this, config));
}
this.behavior = new UnsafeCompositeBlockBehavior(this, behaviors);
}
this.behavior = setupBehavior(behaviorConfig);
List<BiFunction<BlockPlaceContext, ImmutableBlockState, ImmutableBlockState>> placements = new ArrayList<>(4);
for (Map.Entry<String, Property<?>> propertyEntry : this.properties.entrySet()) {
placements.add(Property.createStateForPlacement(propertyEntry.getKey(), propertyEntry.getValue()));
@@ -98,6 +86,10 @@ public abstract class AbstractCustomBlock implements CustomBlock {
this.applyPlatformSettings();
}
protected BlockBehavior setupBehavior(List<Map<String, Object>> behaviorConfig) {
return EmptyBlockBehavior.INSTANCE;
}
private static BiFunction<BlockPlaceContext, ImmutableBlockState, ImmutableBlockState> composite(List<BiFunction<BlockPlaceContext, ImmutableBlockState, ImmutableBlockState>> placements) {
return switch (placements.size()) {
case 0 -> (c, i) -> i;

View File

@@ -4,9 +4,13 @@ import net.momirealms.craftengine.core.block.BlockBehavior;
import net.momirealms.craftengine.core.block.CustomBlock;
public abstract class AbstractBlockBehavior extends BlockBehavior {
protected CustomBlock customBlock;
protected final CustomBlock customBlock;
public AbstractBlockBehavior(CustomBlock customBlock) {
this.customBlock = customBlock;
}
public CustomBlock block() {
return this.customBlock;
}
}

View File

@@ -17,6 +17,7 @@ import java.util.Map;
public class BlockBehaviors {
public static final Key EMPTY = Key.from("craftengine:empty");
public static final Key UNSAFE_COMBINED = Key.from("craftengine:unsafe_combined");
public static void register(Key key, BlockBehaviorFactory factory) {
Holder.Reference<BlockBehaviorFactory> holder = ((WritableRegistry<BlockBehaviorFactory>) BuiltInRegistries.BLOCK_BEHAVIOR_FACTORY)

View File

@@ -1,167 +0,0 @@
package net.momirealms.craftengine.core.block.behavior;
import net.momirealms.craftengine.core.block.BlockBehavior;
import net.momirealms.craftengine.core.block.CustomBlock;
import net.momirealms.craftengine.core.block.ImmutableBlockState;
import net.momirealms.craftengine.core.entity.player.InteractionResult;
import net.momirealms.craftengine.core.item.context.BlockPlaceContext;
import net.momirealms.craftengine.core.item.context.UseOnContext;
import java.util.List;
import java.util.Optional;
import java.util.concurrent.Callable;
public class UnsafeCompositeBlockBehavior extends AbstractBlockBehavior {
private final AbstractBlockBehavior[] behaviors;
public UnsafeCompositeBlockBehavior(CustomBlock customBlock, List<AbstractBlockBehavior> behaviors) {
super(customBlock);
this.behaviors = behaviors.toArray(new AbstractBlockBehavior[0]);
}
@SuppressWarnings("unchecked")
@Override
public <T extends BlockBehavior> Optional<T> getAs(Class<T> tClass) {
for (AbstractBlockBehavior behavior : this.behaviors) {
if (tClass.isInstance(behavior)) {
return Optional.of((T) behavior);
}
}
return Optional.empty();
}
@Override
public InteractionResult useOnBlock(UseOnContext context, ImmutableBlockState state) {
for (AbstractBlockBehavior behavior : this.behaviors) {
InteractionResult result = behavior.useOnBlock(context, state);
if (result != InteractionResult.PASS) {
return result;
}
}
return super.useOnBlock(context, state);
}
@Override
public ImmutableBlockState updateStateForPlacement(BlockPlaceContext context, ImmutableBlockState state) {
for (AbstractBlockBehavior behavior : this.behaviors) {
state = behavior.updateStateForPlacement(context, state);
if (state == null) return null;
}
return state;
}
@Override
public Object updateShape(Object thisBlock, Object[] args, Callable<Object> superMethod) throws Exception {
Object previous = args[0];
for (AbstractBlockBehavior behavior : this.behaviors) {
Object processed = behavior.updateShape(thisBlock, args, superMethod);
if (processed != previous) {
return processed;
}
}
return previous;
}
@Override
public void tick(Object thisBlock, Object[] args, Callable<Object> superMethod) throws Exception {
for (AbstractBlockBehavior behavior : this.behaviors) {
behavior.tick(thisBlock, args, superMethod);
}
}
@Override
public void randomTick(Object thisBlock, Object[] args, Callable<Object> superMethod) throws Exception {
for (AbstractBlockBehavior behavior : this.behaviors) {
behavior.randomTick(thisBlock, args, superMethod);
}
}
@Override
public Object rotate(Object thisBlock, Object[] args, Callable<Object> superMethod) throws Exception {
Object previous = args[0];
for (AbstractBlockBehavior behavior : this.behaviors) {
Object processed = behavior.rotate(thisBlock, args, superMethod);
if (processed != previous) {
return processed;
}
}
return previous;
}
@Override
public Object mirror(Object thisBlock, Object[] args, Callable<Object> superMethod) throws Exception {
Object previous = args[0];
for (AbstractBlockBehavior behavior : this.behaviors) {
Object processed = behavior.mirror(thisBlock, args, superMethod);
if (processed != previous) {
return processed;
}
}
return previous;
}
@Override
public void performBoneMeal(Object thisBlock, Object[] args) throws Exception {
for (AbstractBlockBehavior behavior : this.behaviors) {
behavior.performBoneMeal(thisBlock, args);
}
}
@Override
public void onPlace(Object thisBlock, Object[] args, Callable<Object> superMethod) throws Exception {
for (AbstractBlockBehavior behavior : this.behaviors) {
behavior.onPlace(thisBlock, args, superMethod);
}
}
@Override
public void onLand(Object thisBlock, Object[] args) throws Exception {
for (AbstractBlockBehavior behavior : this.behaviors) {
behavior.onLand(thisBlock, args);
}
}
@Override
public void onBrokenAfterFall(Object thisBlock, Object[] args) throws Exception {
for (AbstractBlockBehavior behavior : this.behaviors) {
behavior.onBrokenAfterFall(thisBlock, args);
}
}
@Override
public void neighborChanged(Object thisBlock, Object[] args, Callable<Object> superMethod) throws Exception {
for (AbstractBlockBehavior behavior : this.behaviors) {
behavior.neighborChanged(thisBlock, args, superMethod);
}
}
@Override
public boolean isValidBoneMealTarget(Object thisBlock, Object[] args) throws Exception {
for (AbstractBlockBehavior behavior : this.behaviors) {
if (behavior.isValidBoneMealTarget(thisBlock, args)) {
return true;
}
}
return false;
}
@Override
public boolean isBoneMealSuccess(Object thisBlock, Object[] args) throws Exception {
for (AbstractBlockBehavior behavior : this.behaviors) {
if (behavior.isBoneMealSuccess(thisBlock, args)) {
return true;
}
}
return false;
}
@Override
public boolean canSurvive(Object thisBlock, Object[] args, Callable<Object> superMethod) throws Exception {
for (AbstractBlockBehavior behavior : this.behaviors) {
if (!behavior.canSurvive(thisBlock, args, superMethod)) {
return false;
}
}
return true;
}
}