diff --git a/bukkit/loader/src/main/resources/additional-real-blocks.yml b/bukkit/loader/src/main/resources/additional-real-blocks.yml index 91993a87d..4fe5d6d61 100644 --- a/bukkit/loader/src/main/resources/additional-real-blocks.yml +++ b/bukkit/loader/src/main/resources/additional-real-blocks.yml @@ -14,9 +14,7 @@ # Q: When do I need to configure this file? # A: When the number of real block IDs is insufficient, but there are still available appearances. -# By default, the plugin only registers an additional 112 oak leaf block states (for the default configuration needs [>=28 states]). minecraft:oak_leaves: 112 - minecraft:oak_sapling: 1 minecraft:birch_sapling: 1 minecraft:spruce_sapling: 1 @@ -24,5 +22,5 @@ minecraft:jungle_sapling: 1 minecraft:dark_oak_sapling: 1 minecraft:acacia_sapling: 1 minecraft:cherry_sapling: 1 - -minecraft:anvil: 2 \ No newline at end of file +minecraft:anvil: 2 +minecraft:sugarcane: 14 \ No newline at end of file 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 7df2d92c5..e99de8717 100644 --- a/bukkit/loader/src/main/resources/resources/default/configuration/categories.yml +++ b/bukkit/loader/src/main/resources/resources/default/configuration/categories.yml @@ -59,5 +59,6 @@ categories: - default:netherite_anvil - default:fairy_flower - default:reed + - default:flame_cane - 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 c3ad09c0a..dc46c4640 100644 --- a/bukkit/loader/src/main/resources/resources/default/configuration/i18n.yml +++ b/bukkit/loader/src/main/resources/resources/default/configuration/i18n.yml @@ -3,6 +3,7 @@ i18n: item.chinese_lantern: "Chinese Lantern" item.fairy_flower: "Fairy Flower" item.reed: "Reed" + item.flame_cane: "Flame Cane" item.bench: "Bench" item.table_lamp: "Table Lamp" item.wooden_chair: "Wooden Chair" @@ -41,6 +42,7 @@ i18n: item.chinese_lantern: "灯笼" item.fairy_flower: "仙灵花" item.reed: "芦苇" + item.flame_cane: "烈焰甘蔗" item.bench: "长椅" item.table_lamp: "台灯" item.wooden_chair: "木椅" diff --git a/bukkit/loader/src/main/resources/resources/default/configuration/plants.yml b/bukkit/loader/src/main/resources/resources/default/configuration/plants.yml index 8016ddf9c..172600da7 100644 --- a/bukkit/loader/src/main/resources/resources/default/configuration/plants.yml +++ b/bukkit/loader/src/main/resources/resources/default/configuration/plants.yml @@ -23,6 +23,18 @@ items: behavior: type: liquid_collision_block_item block: default:reed + default:flame_cane: + material: paper + custom-model-data: 4002 + data: + item-name: "" + model: + template: default:model/simplified_generated + arguments: + path: "minecraft:item/custom/flame_cane" + behavior: + type: block_item + block: default:flame_cane blocks: default:fairy_flower: settings: @@ -32,6 +44,7 @@ blocks: overrides: item: default:fairy_flower push-reaction: DESTROY + map-color: 19 behavior: type: bush_block bottom-block-tags: @@ -73,6 +86,7 @@ blocks: overrides: item: default:reed push-reaction: DESTROY + map-color: 60 behavior: type: on_liquid_block liquid-type: water @@ -85,6 +99,74 @@ blocks: state: sugar_cane:1 model: path: "minecraft:block/custom/reed" + default:flame_cane: + settings: + template: + - default:hardness/none + - default:sound/grass + overrides: + item: default:flame_cane + push-reaction: DESTROY + map-color: 15 + is-randomly-ticking: true + behavior: + type: sugar_cane_block + max-height: 4 + required-adjacent-liquids: lava + grow-speed: 0.333 + bottom-blocks: + - minecraft:netherrack + - minecraft:soul_sand + - minecraft:soul_soil + - minecraft:magma_block + - minecraft:warped_nylium + - minecraft:crimson_nylium + - minecraft:basalt + loot: + template: "default:loot_table/basic" + arguments: + item: default:flame_cane + states: + properties: + age: + type: int + default: 0 + range: 0~5 + appearances: + default: + state: "sugar_cane:2" + models: + - path: "minecraft:block/custom/flame_cane_1" + weight: 1 + generation: + parent: "minecraft:block/sugar_cane" + textures: + "cross": "minecraft:block/custom/flame_cane_1" + - path: "minecraft:block/custom/flame_cane_2" + weight: 1 + generation: + parent: "minecraft:block/sugar_cane" + textures: + "cross": "minecraft:block/custom/flame_cane_2" + variants: + age=0: + appearance: default + id: 2 + age=1: + appearance: default + id: 3 + age=2: + appearance: default + id: 4 + age=3: + appearance: default + id: 5 + age=4: + appearance: default + id: 6 + age=5: + appearance: default + id: 7 recipes: default:paper_from_reed: type: shaped @@ -94,4 +176,26 @@ recipes: A: "default:reed" result: id: minecraft:paper - count: 3 \ No newline at end of file + count: 3 + default:magma_cream: + type: shaped + pattern: + - " A " + - "ABA" + - " A " + ingredients: + A: "default:flame_cane" + B: "minecraft:slime_ball" + result: + id: minecraft:magma_cream + count: 1 + default:magma_block: + type: shapeless + ingredients: + A1: "minecraft:cobblestone" + A2: "minecraft:cobblestone" + B1: "default:flame_cane" + B2: "default:flame_cane" + result: + id: minecraft:magma_block + count: 2 \ No newline at end of file diff --git a/bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/flame_cane_1.png b/bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/flame_cane_1.png new file mode 100644 index 000000000..98e0e595b Binary files /dev/null and b/bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/flame_cane_1.png differ diff --git a/bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/flame_cane_2.png b/bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/flame_cane_2.png new file mode 100644 index 000000000..ba13d4c71 Binary files /dev/null and b/bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/flame_cane_2.png differ diff --git a/bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/flame_cane.png b/bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/flame_cane.png new file mode 100644 index 000000000..0bf612e67 Binary files /dev/null and b/bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/flame_cane.png differ 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 9cf2a38b6..046911410 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 @@ -14,6 +14,7 @@ public class BukkitBlockBehaviors extends BlockBehaviors { public static final Key ON_LIQUID_BLOCK = Key.from("craftengine:on_liquid_block"); public static final Key WATERLOGGED_BLOCK = Key.from("craftengine:waterlogged_block"); public static final Key CONCRETE_POWDER_BLOCK = Key.from("craftengine:concrete_powder_block"); + public static final Key SUGARCANE_BLOCK = Key.from("craftengine:sugar_cane_block"); public static void init() { register(EMPTY, (block, args) -> EmptyBlockBehavior.INSTANCE); @@ -26,5 +27,6 @@ public class BukkitBlockBehaviors extends BlockBehaviors { register(ON_LIQUID_BLOCK, OnLiquidBlockBehavior.FACTORY); register(WATERLOGGED_BLOCK, WaterLoggedBlockBehavior.FACTORY); register(CONCRETE_POWDER_BLOCK, ConcretePowderBlockBehavior.FACTORY); + register(SUGARCANE_BLOCK, SugarCaneBlockBehavior.FACTORY); } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/SaplingBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/SaplingBlockBehavior.java index 2db55684c..7fb110cac 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/SaplingBlockBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/SaplingBlockBehavior.java @@ -32,12 +32,14 @@ public class SaplingBlockBehavior extends BushBlockBehavior { private final Key feature; private final Property stageProperty; private final double boneMealSuccessChance; + private final float growSpeed; - public SaplingBlockBehavior(Key feature, Property stageProperty, List tagsCanSurviveOn, Set blocksCansSurviveOn, Set customBlocksCansSurviveOn, double boneMealSuccessChance) { + public SaplingBlockBehavior(Key feature, Property stageProperty, List tagsCanSurviveOn, Set blocksCansSurviveOn, Set customBlocksCansSurviveOn, double boneMealSuccessChance, float growSpeed) { super(tagsCanSurviveOn, blocksCansSurviveOn, customBlocksCansSurviveOn); this.feature = feature; this.stageProperty = stageProperty; this.boneMealSuccessChance = boneMealSuccessChance; + this.growSpeed = growSpeed; } public Key treeFeature() { @@ -50,7 +52,7 @@ public class SaplingBlockBehavior extends BushBlockBehavior { Object blockPos = args[2]; Object blockState = args[0]; Object aboveBlockPos = LocationUtils.above(blockPos); - if ((int) Reflections.method$LevelReader$getMaxLocalRawBrightness.invoke(world, aboveBlockPos) >= 9 && (float) Reflections.method$RandomSource$nextFloat.invoke(args[3]) < (1.0f / 7.0f)) { + if ((int) Reflections.method$LevelReader$getMaxLocalRawBrightness.invoke(world, aboveBlockPos) >= 9 && (float) RandomUtils.generateRandomFloat(0, 1) < growSpeed) { increaseStage(world, blockPos, blockState, args[3]); } } @@ -125,7 +127,8 @@ public class SaplingBlockBehavior extends BushBlockBehavior { } double boneMealSuccessChance = MiscUtils.getAsDouble(arguments.getOrDefault("bone-meal-success-chance", 0.45)); Tuple, Set, Set> tuple = readTagsAndState(arguments); - return new SaplingBlockBehavior(Key.of(feature), stageProperty, tuple.left(), tuple.mid(), tuple.right(), boneMealSuccessChance); + return new SaplingBlockBehavior(Key.of(feature), stageProperty, tuple.left(), tuple.mid(), tuple.right(), boneMealSuccessChance, + MiscUtils.getAsFloat(arguments.getOrDefault("grow-speed", 1.0 / 7.0))); } } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/SugarCaneBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/SugarCaneBlockBehavior.java index ff82948d4..04ce54160 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/SugarCaneBlockBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/SugarCaneBlockBehavior.java @@ -1,36 +1,55 @@ package net.momirealms.craftengine.bukkit.block.behavior; +import com.sk89q.worldedit.blocks.Blocks; import net.momirealms.craftengine.bukkit.block.BukkitBlockManager; import net.momirealms.craftengine.bukkit.nms.FastNMS; import net.momirealms.craftengine.bukkit.util.BlockStateUtils; import net.momirealms.craftengine.bukkit.util.LocationUtils; 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.UpdateOption; +import net.momirealms.craftengine.core.block.behavior.BlockBehaviorFactory; import net.momirealms.craftengine.core.block.properties.IntegerProperty; +import net.momirealms.craftengine.core.block.properties.Property; import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.loot.parameter.LootParameters; +import net.momirealms.craftengine.core.util.MiscUtils; +import net.momirealms.craftengine.core.util.RandomUtils; +import net.momirealms.craftengine.core.util.Tuple; +import net.momirealms.craftengine.core.util.VersionHelper; import net.momirealms.craftengine.core.util.context.ContextHolder; +import net.momirealms.craftengine.core.world.BlockPos; import net.momirealms.craftengine.core.world.Vec3d; -import org.bukkit.Material; +import net.momirealms.craftengine.shared.block.BlockBehavior; import java.util.List; +import java.util.Map; import java.util.Set; import java.util.concurrent.Callable; public class SugarCaneBlockBehavior extends BushBlockBehavior { + public static final Factory FACTORY = new Factory(); + private static final List WATER = List.of(Reflections.instance$Fluids$WATER, Reflections.instance$Fluids$FLOWING_WATER); + private static final List LAVA = List.of(Reflections.instance$Fluids$LAVA, Reflections.instance$Fluids$FLOWING_LAVA); + private static final List HORIZON_DIRECTIONS = List.of(Reflections.instance$Direction$NORTH, Reflections.instance$Direction$EAST, Reflections.instance$Direction$SOUTH, Reflections.instance$Direction$WEST); private final int maxHeight; private final boolean nearWater; private final boolean nearLava; - private final IntegerProperty age; + private final IntegerProperty ageProperty; + private final float growSpeed; + private final CustomBlock customBlock; - public SugarCaneBlockBehavior(List tagsCanSurviveOn, Set blocksCansSurviveOn, Set customBlocksCansSurviveOn, IntegerProperty age, int maxHeight, boolean nearWater, boolean nearLava) { + public SugarCaneBlockBehavior(CustomBlock customBlock, List tagsCanSurviveOn, Set blocksCansSurviveOn, Set customBlocksCansSurviveOn, Property ageProperty, + int maxHeight, boolean nearWater, boolean nearLava, float growSpeed) { super(tagsCanSurviveOn, blocksCansSurviveOn, customBlocksCansSurviveOn); this.nearWater = nearWater; this.nearLava = nearLava; this.maxHeight = maxHeight; - this.age = age; + this.ageProperty = (IntegerProperty) ageProperty; + this.growSpeed = growSpeed; + this.customBlock = customBlock; } @Override @@ -38,17 +57,156 @@ public class SugarCaneBlockBehavior extends BushBlockBehavior { Object blockState = args[0]; Object level = args[1]; Object blockPos = args[2]; - ImmutableBlockState currentState = BukkitBlockManager.instance().getImmutableBlockState(BlockStateUtils.blockStateToId(blockState)); - if (currentState != null && !currentState.isEmpty()) { - Reflections.method$Level$removeBlock.invoke(level, blockPos, false); - Vec3d vec3d = Vec3d.atCenterOf(LocationUtils.fromBlockPos(blockPos)); - net.momirealms.craftengine.core.world.World world = new BukkitWorld(FastNMS.INSTANCE.method$Level$getCraftWorld(level)); - ContextHolder.Builder builder = ContextHolder.builder() - .withParameter(LootParameters.LOCATION, vec3d) - .withParameter(LootParameters.WORLD, world); - for (Item item : currentState.getDrops(builder, world)) { - world.dropItemNaturally(vec3d, item); + if (!canSurvive(thisBlock, blockState, level, blockPos)) { + ImmutableBlockState currentState = BukkitBlockManager.instance().getImmutableBlockState(BlockStateUtils.blockStateToId(blockState)); + if (currentState != null && !currentState.isEmpty()) { + // break the sugar cane + Reflections.method$Level$removeBlock.invoke(level, blockPos, false); + Vec3d vec3d = Vec3d.atCenterOf(LocationUtils.fromBlockPos(blockPos)); + net.momirealms.craftengine.core.world.World world = new BukkitWorld(FastNMS.INSTANCE.method$Level$getCraftWorld(level)); + // TODO client side particles? + ContextHolder.Builder builder = ContextHolder.builder() + .withParameter(LootParameters.LOCATION, vec3d) + .withParameter(LootParameters.WORLD, world); + for (Item item : currentState.getDrops(builder, world)) { + world.dropItemNaturally(vec3d, item); + } } } } + + @Override + public Object updateShape(Object thisBlock, Object[] args, Callable superMethod) throws Exception { + Object world; + Object blockPos; + if (VersionHelper.isVersionNewerThan1_21_2()) { + world = args[1]; + blockPos = args[3]; + } else { + world = args[3]; + blockPos = args[4]; + } + Reflections.method$LevelAccessor$scheduleTick.invoke(world, blockPos, thisBlock, 1); + // return state, do not call super. + return superMethod.call(); + } + + @Override + public void randomTick(Object thisBlock, Object[] args, Callable superMethod) throws Exception { + Object blockState = args[0]; + Object level = args[1]; + Object blockPos = args[2]; + // above block is empty + if (FastNMS.INSTANCE.method$BlockGetter$getBlockState(level, LocationUtils.above(blockPos)) == Reflections.instance$Blocks$AIR$defaultState) { + int currentHeight = 1; + BlockPos currentPos = LocationUtils.fromBlockPos(blockPos); + ImmutableBlockState currentState = BukkitBlockManager.instance().getImmutableBlockState(BlockStateUtils.blockStateToId(blockState)); + if (currentState != null && !currentState.isEmpty()) { + while (true) { + Object belowPos = LocationUtils.toBlockPos(currentPos.x(), currentPos.y() - currentHeight, currentPos.z()); + Object belowState = FastNMS.INSTANCE.method$BlockGetter$getBlockState(level, belowPos); + ImmutableBlockState belowImmutableState = BukkitBlockManager.instance().getImmutableBlockState(BlockStateUtils.blockStateToId(belowState)); + if (belowImmutableState != null && !belowImmutableState.isEmpty() && belowImmutableState.owner() == currentState.owner()) { + currentHeight++; + } else { + break; + } + } + } else { + return; + } + + if (currentHeight < this.maxHeight) { + int age = currentState.get(ageProperty); + if (age >= this.ageProperty.max || RandomUtils.generateRandomFloat(0, 1) < this.growSpeed) { + Object abovePos = LocationUtils.above(blockPos); + Reflections.method$CraftEventFactory$handleBlockGrowEvent.invoke(null, level, abovePos, customBlock.defaultState().customBlockState().handle()); + Reflections.method$Level$setBlock.invoke(level, blockPos, currentState.with(this.ageProperty, this.ageProperty.min).customBlockState().handle(), UpdateOption.UPDATE_NONE.flags()); + } else if (RandomUtils.generateRandomFloat(0, 1) < this.growSpeed) { + Reflections.method$Level$setBlock.invoke(level, blockPos, currentState.with(this.ageProperty, age + 1).customBlockState().handle(), UpdateOption.UPDATE_NONE.flags()); + } + } + } + } + + @Override + protected boolean canSurvive(Object thisBlock, Object state, Object world, Object blockPos) throws ReflectiveOperationException { + int y = FastNMS.INSTANCE.field$Vec3i$y(blockPos); + int x = FastNMS.INSTANCE.field$Vec3i$x(blockPos); + int z = FastNMS.INSTANCE.field$Vec3i$z(blockPos); + Object belowPos = FastNMS.INSTANCE.constructor$BlockPos(x, y - 1, z); + Object belowState = FastNMS.INSTANCE.method$BlockGetter$getBlockState(world, belowPos); + int id = BlockStateUtils.blockStateToId(belowState); + // 如果下方是同种方块 + if (!BlockStateUtils.isVanillaBlock(id)) { + ImmutableBlockState immutableBlockState = BukkitBlockManager.instance().getImmutableBlockStateUnsafe(id); + if (immutableBlockState.owner().value() == this.customBlock) { + return true; + } + } + if (!super.mayPlaceOn(belowState, world, belowPos)) { + return false; + } + // 如果不需要依靠流体 + if (!this.nearWater && !this.nearLava) { + return true; + } + // 需要流体 + if (this.nearWater) { + if (hasNearbyLiquid(world, belowPos, true)) { + return true; + } + } + if (this.nearLava) { + if (hasNearbyLiquid(world, belowPos, false)) { + return true; + } + } + return false; + } + + private boolean hasNearbyLiquid(Object world, Object blockPos, boolean waterOrLava) throws ReflectiveOperationException { + for (Object direction : HORIZON_DIRECTIONS) { + Object relativePos = Reflections.method$BlockPos$relative.invoke(blockPos, direction); + if (waterOrLava) { + // water + Object blockState = FastNMS.INSTANCE.method$BlockGetter$getBlockState(world, relativePos); + if (Reflections.method$BlockStateBase$getBlock.invoke(blockState) == Reflections.instance$Blocks$ICE) { + return true; + } + Object fluidState = Reflections.method$Level$getFluidState.invoke(world, relativePos); + Object fluidType = Reflections.method$FluidState$getType.invoke(fluidState); + if (WATER.contains(fluidType)) { + return true; + } + } else { + // lava + Object fluidState = Reflections.method$Level$getFluidState.invoke(world, relativePos); + Object fluidType = Reflections.method$FluidState$getType.invoke(fluidState); + if (LAVA.contains(fluidType)) { + return true; + } + } + } + return false; + } + + public static class Factory implements BlockBehaviorFactory { + + @SuppressWarnings("unchecked") + @Override + public BlockBehavior create(CustomBlock block, Map arguments) { + Tuple, Set, Set> tuple = readTagsAndState(arguments); + Property ageProperty = (Property) block.getProperty("age"); + if (ageProperty == null) { + throw new IllegalArgumentException("age property not set for sugar cane"); + } + int maxHeight = MiscUtils.getAsInt(arguments.getOrDefault("max-height", 3)); + List nearbyLiquids = MiscUtils.getAsStringList(arguments.getOrDefault("required-adjacent-liquids", List.of())); + boolean nearWater = nearbyLiquids.contains("water"); + boolean nearLava = nearbyLiquids.contains("lava"); + return new SugarCaneBlockBehavior(block, tuple.left(), tuple.mid(), tuple.right(), ageProperty, maxHeight, nearWater, nearLava, + MiscUtils.getAsFloat(arguments.getOrDefault("grow-speed", 1))); + } + } } 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 be56d9e0a..181191bbb 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 @@ -5685,4 +5685,10 @@ public class Reflections { clazz$ClientboundDisconnectPacket, clazz$Component ) ); + + public static final Method method$CraftEventFactory$handleBlockGrowEvent = requireNonNull( + ReflectionUtils.getStaticMethod( + clazz$CraftEventFactory, boolean.class, clazz$Level, clazz$BlockPos, clazz$BlockState + ) + ); } 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 6add299f1..60168df84 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 @@ -286,6 +286,8 @@ public abstract class AbstractPackManager implements PackManager { 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"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/block/custom/flame_cane_1.png"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/block/custom/flame_cane_2.png"); // items plugin.saveResource("resources/default/configuration/items.yml"); plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_rod.png"); @@ -300,6 +302,7 @@ public abstract class AbstractPackManager implements PackManager { plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_crossbow_pulling_1.png"); plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_crossbow_pulling_2.png"); plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_crossbow.png"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/item/custom/flame_cane.png"); plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/entity/equipment/humanoid/topaz.png"); plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/entity/equipment/humanoid_leggings/topaz.png"); for (String item : List.of("helmet", "chestplate", "leggings", "boots", "pickaxe", "axe", "sword", "hoe", "shovel")) { diff --git a/gradle.properties b/gradle.properties index 1e9902df2..4d226ad8c 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,7 +2,7 @@ org.gradle.jvmargs=-Xmx1G # Project settings # Rule: [major update].[feature update].[bug fix] -project_version=0.0.39 +project_version=0.0.40 config_version=18 lang_version=3 project_group=net.momirealms