From 299852ead3b34c64c9389cbdd8aa24458d3297b7 Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Wed, 26 Mar 2025 21:36:08 +0800 Subject: [PATCH] added concrete powder behavior --- .../default/configuration/blocks.yml | 80 ++++++++++ .../default/configuration/categories.yml | 4 +- .../resources/default/configuration/i18n.yml | 4 + .../textures/block/custom/gunpowder_block.png | Bin 0 -> 681 bytes .../block/custom/solid_gunpowder_block.png | Bin 0 -> 215 bytes .../bukkit/block/BukkitBlockManager.java | 2 +- .../block/behavior/BukkitBlockBehaviors.java | 1 + .../block/behavior/BushBlockBehavior.java | 3 +- .../behavior/ConcretePowderBlockBehavior.java | 150 +++++++++++++++++- .../block/behavior/FallingBlockBehavior.java | 3 +- .../behavior/StrippableBlockBehavior.java | 3 +- .../behavior/WaterLoggedBlockBehavior.java | 3 +- .../worldedit/WorldEditCommandHelper.java | 4 +- .../item/behavior/FurnitureItemBehavior.java | 1 - .../bukkit/plugin/BukkitCraftEngine.java | 1 - .../feature/DebugSpawnFurnitureCommand.java | 1 - .../plugin/injector/BukkitInjector.java | 1 - .../plugin/network/BukkitNetworkManager.java | 1 - .../craftengine/bukkit/util/Reflections.java | 76 +++++++++ .../fabric/CraftEngineFabricMod.java | 2 - .../craftengine/fabric/util/BlockUtils.java | 1 - .../craftengine/core/block/CustomBlock.java | 5 +- .../block/behavior/AbstractBlockBehavior.java | 12 ++ .../core/pack/AbstractPackManager.java | 2 + .../shared/block/BlockBehavior.java | 4 - 25 files changed, 341 insertions(+), 23 deletions(-) create mode 100644 bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/gunpowder_block.png create mode 100644 bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/solid_gunpowder_block.png create mode 100644 core/src/main/java/net/momirealms/craftengine/core/block/behavior/AbstractBlockBehavior.java diff --git a/bukkit/loader/src/main/resources/resources/default/configuration/blocks.yml b/bukkit/loader/src/main/resources/resources/default/configuration/blocks.yml index 4bb73ce97..e22f205dc 100644 --- a/bukkit/loader/src/main/resources/resources/default/configuration/blocks.yml +++ b/bukkit/loader/src/main/resources/resources/default/configuration/blocks.yml @@ -112,6 +112,86 @@ items#misc: facing_clockwise=south: appearance: axisZ id: 3 + default:gunpowder_block: + material: paper + custom-model-data: 3002 + data: + item-name: "" + model: + type: "minecraft:model" + path: "minecraft:item/custom/gunpowder_block" + generation: + parent: "minecraft:block/custom/gunpowder_block" + behavior: + type: block_item + block: + behavior: + type: concrete_powder_block + solid-block: default:solid_gunpowder_block + loot: + template: "default:loot_table/basic" + arguments: + item: default:gunpowder_block + settings: + template: + - default:sound/sand + overrides: + hardness: 0.5 + resistance: 0.5 + replaceable: false + is-redstone-conductor: true + is-suffocating: true + instrument: SNARE + map-color: 45 + item: default:gunpowder_block + state: + id: 16 + state: note_block:16 + model: + path: "minecraft:block/custom/gunpowder_block" + generation: + parent: "minecraft:block/cube_all" + textures: + "all": "minecraft:block/custom/gunpowder_block" + default:solid_gunpowder_block: + material: paper + custom-model-data: 3003 + data: + item-name: "" + model: + type: "minecraft:model" + path: "minecraft:item/custom/solid_gunpowder_block" + generation: + parent: "minecraft:block/custom/solid_gunpowder_block" + behavior: + type: block_item + block: + loot: + template: "default:loot_table/basic" + arguments: + item: default:gunpowder_block + settings: + template: + - default:sound/sand + - default:pickaxe_power/level_1 + overrides: + hardness: 1.8 + resistance: 1.8 + replaceable: false + is-redstone-conductor: true + is-suffocating: true + instrument: BASEDRUM + map-color: 45 + item: default:solid_gunpowder_block + state: + id: 17 + state: note_block:17 + model: + path: "minecraft:block/custom/solid_gunpowder_block" + generation: + parent: "minecraft:block/cube_all" + textures: + "all": "minecraft:block/custom/solid_gunpowder_block" recipes#misc: default:chinese_lantern: type: shaped diff --git a/bukkit/loader/src/main/resources/resources/default/configuration/categories.yml b/bukkit/loader/src/main/resources/resources/default/configuration/categories.yml index da8c4c458..7df2d92c5 100644 --- a/bukkit/loader/src/main/resources/resources/default/configuration/categories.yml +++ b/bukkit/loader/src/main/resources/resources/default/configuration/categories.yml @@ -58,4 +58,6 @@ categories: - default:chinese_lantern - default:netherite_anvil - default:fairy_flower - - default:reed \ No newline at end of file + - default:reed + - default:gunpowder_block + - default:solid_gunpowder_block \ No newline at end of file diff --git a/bukkit/loader/src/main/resources/resources/default/configuration/i18n.yml b/bukkit/loader/src/main/resources/resources/default/configuration/i18n.yml index a4f86bb33..c3ad09c0a 100644 --- a/bukkit/loader/src/main/resources/resources/default/configuration/i18n.yml +++ b/bukkit/loader/src/main/resources/resources/default/configuration/i18n.yml @@ -29,6 +29,8 @@ i18n: item.palm_sapling: "Palm Sapling" item.palm_leaves: "Palm Leaves" item.netherite_anvil: "Netherite Anvil" + item.gunpowder_block: "GunPowder Block" + item.solid_gunpowder_block: "Solid GunPowder Block" category.default.name: "Default Assets" category.default.lore: "Contains the default configuration of CraftEngine" category.palm_tree: "Palm Tree" @@ -65,6 +67,8 @@ i18n: item.palm_sapling: "棕榈树苗" item.palm_leaves: "棕榈树叶" item.netherite_anvil: "下界合金砧" + item.gunpowder_block: "火药粉末" + item.solid_gunpowder_block: "凝固火药块" category.default.name: "默认资产" category.default.lore: "包含了CraftEngine的默认配置" category.palm_tree: "棕榈树" diff --git a/bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/gunpowder_block.png b/bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/gunpowder_block.png new file mode 100644 index 0000000000000000000000000000000000000000..a6705caa5344d8d84b9b2a218ff27e51ddfbecb7 GIT binary patch literal 681 zcmV;a0#^NrP)Px%V@X6oR5*=2le<#$Fc3!1N;0u=5+!&D14SxmcmN)VhvrtAA!*3P9-EABtG~z} ztI?=f&9{5b%IoWEFvbuF9hwWum0g0+^u?@?9ix&|Q2GSW09&vU%@7-I~oinW$F zj`{oh!#T%xyX9~=V2lCa<>iGmO$i}zI2=gR6z@H5KA&?rhr@w5jsbXhcmO~|aL)1h z`AL>#>~=e>wM0=wRaKZg&ne52JkPP#A|kYHi>l(BqpoX;qQF|q@pvRj5}b2{5UA@K zlVurQ*Ku=mGxqJAW4TE@O_nyA*Su7T)Dyn*p?;Pe5sc9OXo}Osi7J#BCXxkPM z0l*kTp68rSCw_i@*zI=b527d<2le&!g|!xIEk#k_oI^wiArL}fy4^BuRpZ zVB$Dt7zUhk9FNBl<9fXwi&d4r@5%EVRUMJf=W~pRFquqn&aqf55D~hrqb$quetv#N zRhi9Z7-MkGp{i%hWm(cR4Iu;orqe0FD3AA^x3@QLZ*PgBXe1Rvz*>v>Zxj3do)7}> z@9#uW#4rqa?*XvZQdJdA)1az6K0YEM^nH)nY&M7p-g`uZ)oR5s3|w7ZjT&E6&$5i7 zDERpJAcSxhX}w-E48w@bS_?qm_jFx1avz3a^xrv0*L6&%Q%ut|7-RVT{iUiZ%Ch9L zAJ^B{Trh_a@ZO`U?Du<;Bw;d{oGFA5SglqhNkW>Y6h*;gGC@`8x{ldwM&I}6o{gcd zYxev7`F&X!Yc1RDmMqIyE|+|Nf1gD$hO#U$y|0nbBRX^D+RGwGx7>@&Gx9(8dRI7W$>mi)Di%!E{<%iTVXxa% z%awlwR=kcCeja;$$z^M2;m_-4E)P+uEO`B-sC=sDE6t_5c1^Zo_{Jc$vr}y;>;APs P$1!-i`njxgN@xNA`W#rJ literal 0 HcmV?d00001 diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BukkitBlockManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BukkitBlockManager.java index 46b5e204e..447816970 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BukkitBlockManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BukkitBlockManager.java @@ -7,8 +7,8 @@ import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import dev.dejvokep.boostedyaml.YamlDocument; -import net.momirealms.craftengine.bukkit.block.worldedit.WorldEditCommandHelper; import net.momirealms.craftengine.bukkit.block.worldedit.WorldEditBlockRegister; +import net.momirealms.craftengine.bukkit.block.worldedit.WorldEditCommandHelper; import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; import net.momirealms.craftengine.bukkit.plugin.injector.BukkitInjector; import net.momirealms.craftengine.bukkit.plugin.network.PacketConsumers; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BukkitBlockBehaviors.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BukkitBlockBehaviors.java index c4ca15763..fc6fd3488 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BukkitBlockBehaviors.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BukkitBlockBehaviors.java @@ -23,5 +23,6 @@ public class BukkitBlockBehaviors extends BlockBehaviors { register(SAPLING_BLOCK, SaplingBlockBehavior.FACTORY); register(ON_LIQUID_BLOCK, OnLiquidBlockBehavior.FACTORY); register(WATERLOGGED_BLOCK, WaterLoggedBlockBehavior.FACTORY); + register(CONCRETE_POWDER_BLOCK, ConcretePowderBlockBehavior.FACTORY); } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BushBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BushBlockBehavior.java index d3013442a..6de0a63b8 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BushBlockBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BushBlockBehavior.java @@ -8,6 +8,7 @@ import net.momirealms.craftengine.bukkit.util.Reflections; import net.momirealms.craftengine.bukkit.world.BukkitWorld; 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.BlockBehaviorFactory; import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.loot.parameter.LootParameters; @@ -24,7 +25,7 @@ import java.util.List; import java.util.Map; import java.util.concurrent.Callable; -public class BushBlockBehavior extends BlockBehavior { +public class BushBlockBehavior extends AbstractBlockBehavior { public static final Factory FACTORY = new Factory(); protected static final Object DIRT_TAG = BlockTags.getOrCreate(Key.of("minecraft", "dirt")); protected static final Object FARMLAND = BlockTags.getOrCreate(Key.of("minecraft", "farmland")); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/ConcretePowderBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/ConcretePowderBlockBehavior.java index 563eac99d..5ebdc11dc 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/ConcretePowderBlockBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/ConcretePowderBlockBehavior.java @@ -1,13 +1,157 @@ package net.momirealms.craftengine.bukkit.block.behavior; -public class ConcretePowderBlockBehavior extends FallingBlockBehavior { +import net.momirealms.craftengine.bukkit.block.BukkitBlockManager; +import net.momirealms.craftengine.bukkit.util.BlockStateUtils; +import net.momirealms.craftengine.bukkit.util.EventUtils; +import net.momirealms.craftengine.bukkit.util.LocationUtils; +import net.momirealms.craftengine.bukkit.util.Reflections; +import net.momirealms.craftengine.core.block.CustomBlock; +import net.momirealms.craftengine.core.block.EmptyBlock; +import net.momirealms.craftengine.core.block.ImmutableBlockState; +import net.momirealms.craftengine.core.block.UpdateOption; +import net.momirealms.craftengine.core.block.behavior.BlockBehaviorFactory; +import net.momirealms.craftengine.core.item.context.BlockPlaceContext; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.util.Direction; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MiscUtils; +import net.momirealms.craftengine.shared.block.BlockBehavior; +import org.bukkit.block.BlockState; +import org.bukkit.event.block.BlockFormEvent; - public ConcretePowderBlockBehavior(float hurtAmount, int maxHurt) { +import java.util.Map; +import java.util.Optional; +import java.util.concurrent.Callable; + +public class ConcretePowderBlockBehavior extends FallingBlockBehavior { + public static final Factory FACTORY = new Factory(); + private final Key targetBlock; + private Object defaultBlockState; + private ImmutableBlockState defaultImmutableBlockState; + + public ConcretePowderBlockBehavior(float hurtAmount, int maxHurt, Key block) { super(hurtAmount, maxHurt); + this.targetBlock = block; + } + + public ImmutableBlockState defaultImmutableBlockState() { + if (this.defaultImmutableBlockState == null) { + this.getDefaultBlockState(); + } + return this.defaultImmutableBlockState; + } + + public Object getDefaultBlockState() { + if (this.defaultBlockState != null) { + return this.defaultBlockState; + } + Optional optionalCustomBlock = BukkitBlockManager.instance().getBlock(this.targetBlock); + if (optionalCustomBlock.isPresent()) { + CustomBlock customBlock = optionalCustomBlock.get(); + this.defaultBlockState = customBlock.defaultState().customBlockState().handle(); + this.defaultImmutableBlockState = customBlock.defaultState(); + } else { + CraftEngine.instance().logger().warn("Failed to create solid block " + this.targetBlock + " in ConcretePowderBlockBehavior"); + this.defaultBlockState = Reflections.instance$Blocks$STONE$defaultState; + this.defaultImmutableBlockState = EmptyBlock.INSTANCE.defaultState(); + } + return this.defaultBlockState; + } + + @Override + public ImmutableBlockState updateStateForPlacement(BlockPlaceContext context, ImmutableBlockState state) { + Object level = context.getLevel().serverWorld(); + Object blockPos = LocationUtils.toBlockPos(context.getClickedPos()); + try { + Object previousState = Reflections.method$BlockGetter$getBlockState.invoke(level, blockPos); + if (!shouldSolidify(level, blockPos, previousState)) { + return super.updateStateForPlacement(context, state); + } else { + BlockState craftBlockState = (BlockState) Reflections.method$CraftBlockStates$getBlockState.invoke(null, level, blockPos); + craftBlockState.setBlockData(BlockStateUtils.fromBlockData(getDefaultBlockState())); + BlockFormEvent event = new BlockFormEvent(craftBlockState.getBlock(), craftBlockState); + if (!EventUtils.fireAndCheckCancel(event)) { + return defaultImmutableBlockState(); + } else { + return super.updateStateForPlacement(context, state); + } + } + } catch (ReflectiveOperationException e) { + CraftEngine.instance().logger().warn("Failed to update state for placement " + context.getClickedPos(), e); + } + return super.updateStateForPlacement(context, state); } @Override public void onLand(Object thisBlock, Object[] args) throws Exception { - super.onLand(thisBlock, args); + Object world = args[0]; + Object blockPos = args[1]; + Object replaceableState = args[3]; + if (shouldSolidify(world, blockPos, replaceableState)) { + Reflections.method$CraftEventFactory$handleBlockFormEvent.invoke(null, world, blockPos, getDefaultBlockState(), UpdateOption.UPDATE_ALL.flags()); + } + } + + @Override + public Object updateShape(Object thisBlock, Object[] args, Callable superMethod) throws Exception { + Object level = args[1]; + Object pos = args[3]; + if (touchesLiquid(level, pos)) { + if (!Reflections.clazz$Level.isInstance(level)) { + return getDefaultBlockState(); + } else { + BlockState craftBlockState = (BlockState) Reflections.method$CraftBlockStates$getBlockState.invoke(null, level, pos); + craftBlockState.setBlockData(BlockStateUtils.fromBlockData(getDefaultBlockState())); + BlockFormEvent event = new BlockFormEvent(craftBlockState.getBlock(), craftBlockState); + if (!EventUtils.fireAndCheckCancel(event)) { + return Reflections.method$CraftBlockState$getHandle.invoke(craftBlockState); + } + } + } + return super.updateShape(thisBlock, args, superMethod); + } + + private static boolean shouldSolidify(Object level, Object blockPos, Object blockState) throws ReflectiveOperationException { + return canSolidify(blockState) || touchesLiquid(level, blockPos); + } + + private static boolean canSolidify(Object state) throws ReflectiveOperationException { + Object fluidState = Reflections.field$BlockStateBase$fluidState.get(state); + if (fluidState == null) return false; + Object fluidType = Reflections.method$FluidState$getType.invoke(fluidState); + return fluidType == Reflections.instance$Fluids$WATER || fluidType == Reflections.instance$Fluids$FLOWING_WATER; + } + + private static boolean touchesLiquid(Object level, Object pos) throws ReflectiveOperationException { + boolean flag = false; + Object mutablePos = Reflections.method$BlockPos$mutable.invoke(pos); + int j = Direction.values().length; + for (int k = 0; k < j; k++) { + Object direction = Reflections.instance$Directions[k]; + Object blockState = Reflections.method$BlockGetter$getBlockState.invoke(level, mutablePos); + if (direction != Reflections.instance$Direction$DOWN || canSolidify(blockState)) { + Reflections.method$MutableBlockPos$setWithOffset.invoke(mutablePos, pos, direction); + blockState = Reflections.method$BlockGetter$getBlockState.invoke(level, mutablePos); + if (canSolidify(blockState) && !(boolean) Reflections.method$BlockStateBase$isFaceSturdy.invoke(blockState, level, pos, Reflections.getOppositeDirection(direction), Reflections.instance$SupportType$FULL)) { + flag = true; + break; + } + } + } + return flag; + } + + public static class Factory implements BlockBehaviorFactory { + + @Override + public BlockBehavior create(CustomBlock block, Map arguments) { + float hurtAmount = MiscUtils.getAsFloat(arguments.getOrDefault("hurt-amount", -1f)); + int hurtMax = MiscUtils.getAsInt(arguments.getOrDefault("max-hurt", -1)); + String solidBlock = (String) arguments.get("solid-block"); + if (solidBlock == null) { + throw new IllegalArgumentException("No `solid-block` specified for concrete powder block behavior"); + } + return new ConcretePowderBlockBehavior(hurtAmount, hurtMax, Key.of(solidBlock)); + } } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/FallingBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/FallingBlockBehavior.java index 30d7c08f2..9517544c6 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/FallingBlockBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/FallingBlockBehavior.java @@ -7,6 +7,7 @@ import net.momirealms.craftengine.bukkit.util.Reflections; import net.momirealms.craftengine.bukkit.world.BukkitWorld; 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.BlockBehaviorFactory; import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.loot.parameter.LootParameters; @@ -20,7 +21,7 @@ import org.bukkit.World; import java.util.Map; import java.util.concurrent.Callable; -public class FallingBlockBehavior extends BlockBehavior { +public class FallingBlockBehavior extends AbstractBlockBehavior { public static final Factory FACTORY = new Factory(); private final float hurtAmount; private final int maxHurt; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/StrippableBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/StrippableBlockBehavior.java index fae1a2f5f..6d0429c37 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/StrippableBlockBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/StrippableBlockBehavior.java @@ -1,13 +1,14 @@ package net.momirealms.craftengine.bukkit.block.behavior; import net.momirealms.craftengine.core.block.CustomBlock; +import net.momirealms.craftengine.core.block.behavior.AbstractBlockBehavior; import net.momirealms.craftengine.core.block.behavior.BlockBehaviorFactory; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.shared.block.BlockBehavior; import java.util.Map; -public class StrippableBlockBehavior extends BlockBehavior { +public class StrippableBlockBehavior extends AbstractBlockBehavior { public static final Factory FACTORY = new Factory(); private final Key stripped; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/WaterLoggedBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/WaterLoggedBlockBehavior.java index 1f77a5a10..2cdc56660 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/WaterLoggedBlockBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/WaterLoggedBlockBehavior.java @@ -1,6 +1,7 @@ package net.momirealms.craftengine.bukkit.block.behavior; import net.momirealms.craftengine.core.block.CustomBlock; +import net.momirealms.craftengine.core.block.behavior.AbstractBlockBehavior; import net.momirealms.craftengine.core.block.behavior.BlockBehaviorFactory; import net.momirealms.craftengine.core.block.properties.Property; import net.momirealms.craftengine.shared.block.BlockBehavior; @@ -8,7 +9,7 @@ import org.jetbrains.annotations.Nullable; import java.util.Map; -public class WaterLoggedBlockBehavior extends BlockBehavior { +public class WaterLoggedBlockBehavior extends AbstractBlockBehavior { public static final Factory FACTORY = new Factory(); @Nullable private final Property waterloggedProperty; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/worldedit/WorldEditCommandHelper.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/worldedit/WorldEditCommandHelper.java index 31d3f331d..cdd32e55d 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/worldedit/WorldEditCommandHelper.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/worldedit/WorldEditCommandHelper.java @@ -12,7 +12,9 @@ import org.bukkit.event.HandlerList; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerCommandPreprocessEvent; -import java.util.*; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; // TODO A better command suggestion system public class WorldEditCommandHelper implements Listener { diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/FurnitureItemBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/FurnitureItemBehavior.java index e7dfd93e0..f0dec7311 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/FurnitureItemBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/FurnitureItemBehavior.java @@ -23,7 +23,6 @@ import net.momirealms.craftengine.core.util.MiscUtils; import net.momirealms.craftengine.core.util.Pair; import net.momirealms.craftengine.core.world.Vec3d; import org.bukkit.Location; -import org.bukkit.SoundCategory; import org.bukkit.World; import java.nio.file.Path; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/BukkitCraftEngine.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/BukkitCraftEngine.java index fc5b6b2a5..da00efaa4 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/BukkitCraftEngine.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/BukkitCraftEngine.java @@ -4,7 +4,6 @@ import net.momirealms.antigrieflib.AntiGriefLib; import net.momirealms.craftengine.bukkit.api.event.CraftEngineReloadEvent; import net.momirealms.craftengine.bukkit.block.BukkitBlockManager; import net.momirealms.craftengine.bukkit.block.behavior.BukkitBlockBehaviors; -import net.momirealms.craftengine.bukkit.block.worldedit.WorldEditCommandHelper; import net.momirealms.craftengine.bukkit.entity.furniture.BukkitFurnitureManager; import net.momirealms.craftengine.bukkit.font.BukkitImageManager; import net.momirealms.craftengine.bukkit.item.BukkitItemManager; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/DebugSpawnFurnitureCommand.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/DebugSpawnFurnitureCommand.java index 612688718..f5bbb5a8f 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/DebugSpawnFurnitureCommand.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/DebugSpawnFurnitureCommand.java @@ -1,6 +1,5 @@ package net.momirealms.craftengine.bukkit.plugin.command.feature; -import net.momirealms.craftengine.bukkit.api.CraftEngineFurniture; import net.momirealms.craftengine.bukkit.entity.furniture.BukkitFurnitureManager; import net.momirealms.craftengine.bukkit.plugin.command.BukkitCommandFeature; import net.momirealms.craftengine.bukkit.util.KeyUtils; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/BukkitInjector.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/BukkitInjector.java index b70bfacc7..69cd69ccf 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/BukkitInjector.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/BukkitInjector.java @@ -49,7 +49,6 @@ import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodType; import java.lang.reflect.Constructor; import java.lang.reflect.Field; -import java.lang.reflect.Method; import java.util.List; import java.util.Objects; import java.util.Optional; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java index d7f9b23f9..1226fb980 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java @@ -26,7 +26,6 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.HandlerList; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.event.player.PlayerLoginEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.event.player.PlayerRegisterChannelEvent; import org.jetbrains.annotations.NotNull; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java index 182629ae5..d7604cfce 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java @@ -1488,18 +1488,37 @@ public class Reflections { public static final Object instance$Direction$DOWN; public static final Object instance$Direction$UP; + public static final Object instance$Direction$NORTH; + public static final Object instance$Direction$SOUTH; + public static final Object instance$Direction$WEST; + public static final Object instance$Direction$EAST; public static final Object[] instance$Directions; + private static final Map oppositeDirections = new HashMap<>(); static { try { instance$Directions = (Object[]) method$Direction$values.invoke(null); instance$Direction$DOWN = instance$Directions[0]; instance$Direction$UP = instance$Directions[1]; + instance$Direction$NORTH = instance$Directions[2]; + instance$Direction$SOUTH = instance$Directions[3]; + instance$Direction$WEST = instance$Directions[4]; + instance$Direction$EAST = instance$Directions[5]; + oppositeDirections.put(instance$Direction$DOWN, instance$Direction$UP); + oppositeDirections.put(instance$Direction$UP, instance$Direction$DOWN); + oppositeDirections.put(instance$Direction$NORTH, instance$Direction$SOUTH); + oppositeDirections.put(instance$Direction$SOUTH, instance$Direction$NORTH); + oppositeDirections.put(instance$Direction$WEST, instance$Direction$EAST); + oppositeDirections.put(instance$Direction$EAST, instance$Direction$WEST); } catch (ReflectiveOperationException e) { throw new RuntimeException(e); } } + public static Object getOppositeDirection(Object direction) { + return oppositeDirections.get(direction); + } + public static final Class clazz$CraftBlock = requireNonNull( ReflectionUtils.getClazz( BukkitReflectionUtils.assembleCBClass("block.CraftBlock") @@ -1536,6 +1555,12 @@ public class Reflections { ) ); + public static final Method method$CraftBlockState$getHandle = requireNonNull( + ReflectionUtils.getMethod( + clazz$CraftBlockState, clazz$BlockState + ) + ); + public static final Class clazz$CraftBlockData = requireNonNull( ReflectionUtils.getClazz( BukkitReflectionUtils.assembleCBClass("block.data.CraftBlockData") @@ -3452,6 +3477,12 @@ public class Reflections { ) ); + public static final Method method$BlockPos$mutable = requireNonNull( + ReflectionUtils.getMethod( + clazz$BlockPos, clazz$MutableBlockPos + ) + ); + public static final Class clazz$LeavesBlock = requireNonNull( ReflectionUtils.getClazz( BukkitReflectionUtils.assembleMCClass("world.level.block.LeavesBlock"), @@ -3944,15 +3975,21 @@ public class Reflections { ); public static final Object instance$Fluids$WATER; + public static final Object instance$Fluids$FLOWING_WATER; public static final Object instance$Fluids$LAVA; + public static final Object instance$Fluids$FLOWING_LAVA; public static final Object instance$Fluids$EMPTY; static { try { Object waterId = method$ResourceLocation$fromNamespaceAndPath.invoke(null, "minecraft", "water"); instance$Fluids$WATER = method$Registry$get.invoke(instance$BuiltInRegistries$FLUID, waterId); + Object flowingWaterId = method$ResourceLocation$fromNamespaceAndPath.invoke(null, "minecraft", "flowing_water"); + instance$Fluids$FLOWING_WATER = method$Registry$get.invoke(instance$BuiltInRegistries$FLUID, flowingWaterId); Object lavaId = method$ResourceLocation$fromNamespaceAndPath.invoke(null, "minecraft", "lava"); instance$Fluids$LAVA = method$Registry$get.invoke(instance$BuiltInRegistries$FLUID, lavaId); + Object flowingLavaId = method$ResourceLocation$fromNamespaceAndPath.invoke(null, "minecraft", "flowing_lava"); + instance$Fluids$FLOWING_LAVA = method$Registry$get.invoke(instance$BuiltInRegistries$FLUID, flowingLavaId); Object emptyId = method$ResourceLocation$fromNamespaceAndPath.invoke(null, "minecraft", "empty"); instance$Fluids$EMPTY = method$Registry$get.invoke(instance$BuiltInRegistries$FLUID, emptyId); } catch (ReflectiveOperationException e) { @@ -5496,4 +5533,43 @@ public class Reflections { clazz$Entity, clazz$SynchedEntityData, 0 ) ); + + public static final Class clazz$SupportType = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.block.SupportType") + ) + ); + + public static final Method method$SupportType$values = requireNonNull( + ReflectionUtils.getStaticMethod( + clazz$SupportType, clazz$SupportType.arrayType() + ) + ); + + public static final Object instance$SupportType$FULL; + public static final Object instance$SupportType$CENTER; + public static final Object instance$SupportType$RIGID; + + static { + try { + Object[] values = (Object[]) method$SupportType$values.invoke(null); + instance$SupportType$FULL = values[0]; + instance$SupportType$CENTER = values[1]; + instance$SupportType$RIGID = values[2]; + } catch (ReflectiveOperationException e) { + throw new RuntimeException(e); + } + } + + public static final Method method$BlockStateBase$isFaceSturdy = requireNonNull( + ReflectionUtils.getMethod( + clazz$BlockStateBase, boolean.class, clazz$BlockGetter, clazz$BlockPos, clazz$Direction, clazz$SupportType + ) + ); + + public static final Method method$CraftEventFactory$handleBlockFormEvent = requireNonNull( + ReflectionUtils.getStaticMethod( + clazz$CraftEventFactory, boolean.class, new String[] { "handleBlockFormEvent" }, clazz$Level, clazz$BlockPos, clazz$BlockState, int.class + ) + ); } diff --git a/client-mod/src/main/java/net/momirealms/craftengine/fabric/CraftEngineFabricMod.java b/client-mod/src/main/java/net/momirealms/craftengine/fabric/CraftEngineFabricMod.java index c83839921..805f23b52 100644 --- a/client-mod/src/main/java/net/momirealms/craftengine/fabric/CraftEngineFabricMod.java +++ b/client-mod/src/main/java/net/momirealms/craftengine/fabric/CraftEngineFabricMod.java @@ -4,8 +4,6 @@ import net.fabricmc.api.ModInitializer; import net.fabricmc.loader.api.FabricLoader; import net.minecraft.block.BlockState; import net.minecraft.util.Identifier; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.shape.VoxelShape; import net.momirealms.craftengine.fabric.client.config.ModConfig; import net.momirealms.craftengine.fabric.util.BlockUtils; import net.momirealms.craftengine.fabric.util.LoggerFilter; diff --git a/client-mod/src/main/java/net/momirealms/craftengine/fabric/util/BlockUtils.java b/client-mod/src/main/java/net/momirealms/craftengine/fabric/util/BlockUtils.java index 70b6ee011..d9c3f36e8 100644 --- a/client-mod/src/main/java/net/momirealms/craftengine/fabric/util/BlockUtils.java +++ b/client-mod/src/main/java/net/momirealms/craftengine/fabric/util/BlockUtils.java @@ -6,7 +6,6 @@ import net.minecraft.block.BlockState; import net.minecraft.util.math.BlockPos; import net.minecraft.util.shape.VoxelShape; import net.minecraft.util.shape.VoxelShapes; -import net.minecraft.world.BlockView; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/CustomBlock.java b/core/src/main/java/net/momirealms/craftengine/core/block/CustomBlock.java index 9a5199a8d..54727da4d 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/block/CustomBlock.java +++ b/core/src/main/java/net/momirealms/craftengine/core/block/CustomBlock.java @@ -1,5 +1,6 @@ package net.momirealms.craftengine.core.block; +import net.momirealms.craftengine.core.block.behavior.AbstractBlockBehavior; import net.momirealms.craftengine.core.block.behavior.BlockBehaviors; import net.momirealms.craftengine.core.block.properties.Property; import net.momirealms.craftengine.core.item.context.BlockPlaceContext; @@ -153,7 +154,9 @@ public abstract class CustomBlock { for (BiFunction placement : this.placements) { state = placement.apply(context, state); } - state = (ImmutableBlockState) this.behavior.updateStateForPlacement(context, state); + if (this.behavior instanceof AbstractBlockBehavior blockBehavior) { + state = blockBehavior.updateStateForPlacement(context, state); + } return state; } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/behavior/AbstractBlockBehavior.java b/core/src/main/java/net/momirealms/craftengine/core/block/behavior/AbstractBlockBehavior.java new file mode 100644 index 000000000..948700454 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/block/behavior/AbstractBlockBehavior.java @@ -0,0 +1,12 @@ +package net.momirealms.craftengine.core.block.behavior; + +import net.momirealms.craftengine.core.block.ImmutableBlockState; +import net.momirealms.craftengine.core.item.context.BlockPlaceContext; +import net.momirealms.craftengine.shared.block.BlockBehavior; + +public abstract class AbstractBlockBehavior extends BlockBehavior { + + public ImmutableBlockState updateStateForPlacement(BlockPlaceContext context, ImmutableBlockState state) { + return state; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java b/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java index b40ec0909..6add299f1 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java @@ -284,6 +284,8 @@ public abstract class AbstractPackManager implements PackManager { plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/block/custom/chinese_lantern_top.png.mcmeta"); plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/block/custom/netherite_anvil.png"); plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/block/custom/netherite_anvil_top.png"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/block/custom/solid_gunpowder_block.png"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/block/custom/gunpowder_block.png"); // items plugin.saveResource("resources/default/configuration/items.yml"); plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_rod.png"); diff --git a/shared/src/main/java/net/momirealms/craftengine/shared/block/BlockBehavior.java b/shared/src/main/java/net/momirealms/craftengine/shared/block/BlockBehavior.java index c96ae499e..957e207d2 100644 --- a/shared/src/main/java/net/momirealms/craftengine/shared/block/BlockBehavior.java +++ b/shared/src/main/java/net/momirealms/craftengine/shared/block/BlockBehavior.java @@ -41,10 +41,6 @@ public abstract class BlockBehavior { public void performBoneMeal(Object thisBlock, Object[] args) throws Exception { } - public Object updateStateForPlacement(Object context, Object state) { - return state; - } - // // public Object getFluidState(Object thisBlock, Object[] args, Callable superMethod) throws Exception { // return superMethod.call();