From 2a6595b0d113a46819eefa8963ef27bf8e0e2a90 Mon Sep 17 00:00:00 2001 From: bconlon Date: Sat, 8 Aug 2026 20:13:08 -0700 Subject: [PATCH 01/27] feat: blockstate setup for climbing rope --- .../aether_ii/blockstates/climbing_rope.json | 82 ++++++ .../blockstates/climbing_rope_stake.json | 238 ++++++++++++++++++ .../assets/aether_ii/items/climbing_rope.json | 6 + .../aether_ii/items/climbing_rope_stake.json | 6 + .../loot_table/blocks/climbing_rope.json | 4 + .../blocks/climbing_rope_stake.json | 4 + .../block/AetherIIBlockStateProperties.java | 16 ++ .../aetherii/block/AetherIIBlocks.java | 2 + .../aetherii/block/utility/RopeBlock.java | 30 +++ .../block/utility/RopeStakeBlock.java | 24 ++ .../generators/loot/AetherIIBlockLoot.java | 2 + .../models/AetherIIBlockModels.java | 2 + .../AetherIIBlockModelSubProvider.java | 69 ++++- .../block/climbing_rope_connection_lower.json | 33 +++ .../climbing_rope_connection_spool_floor.json | 33 +++ .../block/climbing_rope_connection_upper.json | 33 +++ .../models/block/climbing_rope_fray.json | 47 ++++ .../models/block/climbing_rope_knot.json | 33 +++ .../block/climbing_rope_spool_floor.json | 33 +++ .../block/climbing_rope_spool_middle.json | 33 +++ .../models/block/climbing_rope_stake.json | 61 +++++ .../block/climbing_rope_stake_short.json | 61 +++++ .../textures/block/climbing_rope.png | Bin 0 -> 519 bytes 23 files changed, 848 insertions(+), 4 deletions(-) create mode 100644 src/generated/resources/assets/aether_ii/blockstates/climbing_rope.json create mode 100644 src/generated/resources/assets/aether_ii/blockstates/climbing_rope_stake.json create mode 100644 src/generated/resources/assets/aether_ii/items/climbing_rope.json create mode 100644 src/generated/resources/assets/aether_ii/items/climbing_rope_stake.json create mode 100644 src/generated/resources/data/aether_ii/loot_table/blocks/climbing_rope.json create mode 100644 src/generated/resources/data/aether_ii/loot_table/blocks/climbing_rope_stake.json create mode 100644 src/main/java/com/aetherteam/aetherii/block/utility/RopeBlock.java create mode 100644 src/main/java/com/aetherteam/aetherii/block/utility/RopeStakeBlock.java create mode 100644 src/main/resources/assets/aether_ii/models/block/climbing_rope_connection_lower.json create mode 100644 src/main/resources/assets/aether_ii/models/block/climbing_rope_connection_spool_floor.json create mode 100644 src/main/resources/assets/aether_ii/models/block/climbing_rope_connection_upper.json create mode 100644 src/main/resources/assets/aether_ii/models/block/climbing_rope_fray.json create mode 100644 src/main/resources/assets/aether_ii/models/block/climbing_rope_knot.json create mode 100644 src/main/resources/assets/aether_ii/models/block/climbing_rope_spool_floor.json create mode 100644 src/main/resources/assets/aether_ii/models/block/climbing_rope_spool_middle.json create mode 100644 src/main/resources/assets/aether_ii/models/block/climbing_rope_stake.json create mode 100644 src/main/resources/assets/aether_ii/models/block/climbing_rope_stake_short.json create mode 100644 src/main/resources/assets/aether_ii/textures/block/climbing_rope.png diff --git a/src/generated/resources/assets/aether_ii/blockstates/climbing_rope.json b/src/generated/resources/assets/aether_ii/blockstates/climbing_rope.json new file mode 100644 index 0000000000..94a1acc824 --- /dev/null +++ b/src/generated/resources/assets/aether_ii/blockstates/climbing_rope.json @@ -0,0 +1,82 @@ +{ + "multipart": [ + { + "apply": { + "model": "aether_ii:block/climbing_rope_knot" + }, + "when": { + "rope_knot": "true" + } + }, + { + "apply": { + "model": "aether_ii:block/climbing_rope_spool_floor" + }, + "when": { + "rope_spool": "true" + } + }, + { + "apply": { + "model": "aether_ii:block/climbing_rope_fray" + }, + "when": { + "rope_end": "true" + } + }, + { + "apply": { + "model": "aether_ii:block/climbing_rope_connection_upper" + }, + "when": { + "up": "true" + } + }, + { + "apply": { + "model": "aether_ii:block/climbing_rope_connection_lower" + }, + "when": { + "down": "true" + } + }, + { + "apply": { + "model": "aether_ii:block/climbing_rope_connection_upper", + "x": 90 + }, + "when": { + "north": "true" + } + }, + { + "apply": { + "model": "aether_ii:block/climbing_rope_connection_upper", + "x": 90, + "y": 90 + }, + "when": { + "east": "true" + } + }, + { + "apply": { + "model": "aether_ii:block/climbing_rope_connection_lower", + "x": 90 + }, + "when": { + "south": "true" + } + }, + { + "apply": { + "model": "aether_ii:block/climbing_rope_connection_lower", + "x": 90, + "y": 90 + }, + "when": { + "west": "true" + } + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/assets/aether_ii/blockstates/climbing_rope_stake.json b/src/generated/resources/assets/aether_ii/blockstates/climbing_rope_stake.json new file mode 100644 index 0000000000..edfda6c543 --- /dev/null +++ b/src/generated/resources/assets/aether_ii/blockstates/climbing_rope_stake.json @@ -0,0 +1,238 @@ +{ + "multipart": [ + { + "apply": { + "model": "aether_ii:block/climbing_rope_stake_short", + "x": 180 + }, + "when": { + "facing": "up" + } + }, + { + "apply": { + "model": "aether_ii:block/climbing_rope_stake" + }, + "when": { + "facing": "down" + } + }, + { + "apply": { + "model": "aether_ii:block/climbing_rope_stake", + "x": 90 + }, + "when": { + "facing": "north" + } + }, + { + "apply": { + "model": "aether_ii:block/climbing_rope_stake", + "x": 90, + "y": 90 + }, + "when": { + "facing": "east" + } + }, + { + "apply": { + "model": "aether_ii:block/climbing_rope_stake", + "x": 90, + "y": 180 + }, + "when": { + "facing": "south" + } + }, + { + "apply": { + "model": "aether_ii:block/climbing_rope_stake", + "x": 90, + "y": 270 + }, + "when": { + "facing": "west" + } + }, + { + "apply": { + "model": "aether_ii:block/climbing_rope_knot" + }, + "when": { + "facing": "up" + } + }, + { + "apply": { + "model": "aether_ii:block/climbing_rope_knot" + }, + "when": { + "facing": "down" + } + }, + { + "apply": { + "model": "aether_ii:block/climbing_rope_knot", + "x": 90 + }, + "when": { + "facing": "north" + } + }, + { + "apply": { + "model": "aether_ii:block/climbing_rope_knot", + "x": 90, + "y": 90 + }, + "when": { + "facing": "east" + } + }, + { + "apply": { + "model": "aether_ii:block/climbing_rope_knot", + "x": 90, + "y": 180 + }, + "when": { + "facing": "south" + } + }, + { + "apply": { + "model": "aether_ii:block/climbing_rope_knot", + "x": 90, + "y": 270 + }, + "when": { + "facing": "west" + } + }, + { + "apply": { + "model": "aether_ii:block/climbing_rope_spool_middle" + }, + "when": { + "facing": "up", + "stake_spool": "center" + } + }, + { + "apply": { + "model": "aether_ii:block/climbing_rope_spool_middle" + }, + "when": { + "facing": "down", + "stake_spool": "center" + } + }, + { + "apply": { + "model": "aether_ii:block/climbing_rope_spool_middle", + "x": 90 + }, + "when": { + "facing": "north", + "stake_spool": "center" + } + }, + { + "apply": { + "model": "aether_ii:block/climbing_rope_spool_middle", + "x": 90, + "y": 90 + }, + "when": { + "facing": "east", + "stake_spool": "center" + } + }, + { + "apply": { + "model": "aether_ii:block/climbing_rope_spool_middle", + "x": 90, + "y": 180 + }, + "when": { + "facing": "south", + "stake_spool": "center" + } + }, + { + "apply": { + "model": "aether_ii:block/climbing_rope_spool_middle", + "x": 90, + "y": 270 + }, + "when": { + "facing": "west", + "stake_spool": "center" + } + }, + { + "apply": { + "model": "aether_ii:block/climbing_rope_connection_lower" + }, + "when": { + "facing": "up", + "stake_spool": "floor|none" + } + }, + { + "apply": { + "model": "aether_ii:block/climbing_rope_connection_spool_floor" + }, + "when": { + "facing": "down", + "stake_spool": "floor" + } + }, + { + "apply": { + "model": "aether_ii:block/climbing_rope_connection_lower" + }, + "when": { + "facing": "north", + "stake_spool": "floor|none" + } + }, + { + "apply": { + "model": "aether_ii:block/climbing_rope_connection_lower" + }, + "when": { + "facing": "east", + "stake_spool": "floor|none" + } + }, + { + "apply": { + "model": "aether_ii:block/climbing_rope_connection_lower" + }, + "when": { + "facing": "south", + "stake_spool": "floor|none" + } + }, + { + "apply": { + "model": "aether_ii:block/climbing_rope_connection_lower" + }, + "when": { + "facing": "west", + "stake_spool": "floor|none" + } + }, + { + "apply": { + "model": "aether_ii:block/climbing_rope_spool_floor" + }, + "when": { + "stake_spool": "floor" + } + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/assets/aether_ii/items/climbing_rope.json b/src/generated/resources/assets/aether_ii/items/climbing_rope.json new file mode 100644 index 0000000000..544803c192 --- /dev/null +++ b/src/generated/resources/assets/aether_ii/items/climbing_rope.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "aether_ii:block/climbing_rope" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/aether_ii/items/climbing_rope_stake.json b/src/generated/resources/assets/aether_ii/items/climbing_rope_stake.json new file mode 100644 index 0000000000..1558fb78b0 --- /dev/null +++ b/src/generated/resources/assets/aether_ii/items/climbing_rope_stake.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "aether_ii:block/climbing_rope_stake" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/aether_ii/loot_table/blocks/climbing_rope.json b/src/generated/resources/data/aether_ii/loot_table/blocks/climbing_rope.json new file mode 100644 index 0000000000..9ad5a6e844 --- /dev/null +++ b/src/generated/resources/data/aether_ii/loot_table/blocks/climbing_rope.json @@ -0,0 +1,4 @@ +{ + "type": "minecraft:block", + "random_sequence": "aether_ii:blocks/climbing_rope" +} \ No newline at end of file diff --git a/src/generated/resources/data/aether_ii/loot_table/blocks/climbing_rope_stake.json b/src/generated/resources/data/aether_ii/loot_table/blocks/climbing_rope_stake.json new file mode 100644 index 0000000000..38a4d07bcb --- /dev/null +++ b/src/generated/resources/data/aether_ii/loot_table/blocks/climbing_rope_stake.json @@ -0,0 +1,4 @@ +{ + "type": "minecraft:block", + "random_sequence": "aether_ii:blocks/climbing_rope_stake" +} \ No newline at end of file diff --git a/src/main/java/com/aetherteam/aetherii/block/AetherIIBlockStateProperties.java b/src/main/java/com/aetherteam/aetherii/block/AetherIIBlockStateProperties.java index 733a1b5e7c..4c272dff9c 100644 --- a/src/main/java/com/aetherteam/aetherii/block/AetherIIBlockStateProperties.java +++ b/src/main/java/com/aetherteam/aetherii/block/AetherIIBlockStateProperties.java @@ -1,6 +1,7 @@ package com.aetherteam.aetherii.block; import com.mojang.serialization.Codec; +import net.minecraft.core.Direction; import net.minecraft.util.StringRepresentable; import net.minecraft.world.level.block.state.properties.BooleanProperty; import net.minecraft.world.level.block.state.properties.EnumProperty; @@ -19,6 +20,10 @@ public class AetherIIBlockStateProperties { public static final BooleanProperty BRETTL_GROWN = BooleanProperty.create("grown"); public static final BooleanProperty EMPTY = BooleanProperty.create("empty"); public static final BooleanProperty IGNITED = BooleanProperty.create("ignited"); + public static final BooleanProperty ROPE_KNOT = BooleanProperty.create("rope_knot"); + public static final BooleanProperty ROPE_SPOOL = BooleanProperty.create("rope_spool"); + public static final BooleanProperty ROPE_END = BooleanProperty.create("rope_end"); + public static final EnumProperty STAKE_SPOOL = EnumProperty.create("stake_spool", StakeSpoolState.class); public enum Mossy implements StringRepresentable { BRYALINN, @@ -56,4 +61,15 @@ public String getSerializedName() { return this.name().toLowerCase(Locale.ROOT); } } + + public enum StakeSpoolState implements StringRepresentable { + NONE, + CENTER, + FLOOR; + + @Override + public String getSerializedName() { + return this.name().toLowerCase(Locale.ROOT); + } + } } \ No newline at end of file diff --git a/src/main/java/com/aetherteam/aetherii/block/AetherIIBlocks.java b/src/main/java/com/aetherteam/aetherii/block/AetherIIBlocks.java index cb7805f813..c19f2cabbf 100644 --- a/src/main/java/com/aetherteam/aetherii/block/AetherIIBlocks.java +++ b/src/main/java/com/aetherteam/aetherii/block/AetherIIBlocks.java @@ -737,6 +737,8 @@ public class AetherIIBlocks extends AetherIIBlockBuilders { public static final DeferredBlock ALKAHEST_PURIFIER = register("alkahest_purifier", AlkahestPurifierBlock::new, () -> Block.Properties.ofFullCopy(AetherIIBlocks.ARKENIUM_BLOCK.get()).noOcclusion()); public static final DeferredBlock MUSIC_BLOCK = register("music_block", MusicBlock::new, () -> Block.Properties.ofFullCopy(AetherIIBlocks.SKYROOT_PLANKS.get())); public static final DeferredBlock AMBROSIUM_CAMPFIRE = register("ambrosium_campfire", (properties) -> new AmbrosiumCampfireBlock(false, 1, properties), () -> Block.Properties.of().mapColor(MapColor.WOOD).instrument(NoteBlockInstrument.BASS).strength(2.0F).sound(SoundType.WOOD).lightLevel((state) -> state.getValue(BlockStateProperties.LIT) ? 15 : 0).noOcclusion().ignitedByLava()); + public static final DeferredBlock CLIMBING_ROPE_STAKE = register("climbing_rope_stake", RopeStakeBlock::new, () -> Block.Properties.of().mapColor(MapColor.COLOR_BROWN).instrument(NoteBlockInstrument.GUITAR).strength(2.0F).sound(SoundType.WOOL).noOcclusion()); + public static final DeferredBlock CLIMBING_ROPE = register("climbing_rope", RopeBlock::new, () -> Block.Properties.of().mapColor(MapColor.COLOR_BROWN).instrument(NoteBlockInstrument.GUITAR).strength(0.5F).sound(SoundType.WOOL).noOcclusion().ignitedByLava()); public static final DeferredBlock SKYROOT_CHEST = register("skyroot_chest", (properties) -> new SkyrootChestBlock(properties, AetherIIBlockEntityTypes.SKYROOT_CHEST::get), () -> Block.Properties.ofFullCopy(Blocks.CHEST)); public static final DeferredBlock SKYROOT_BARREL = register("skyroot_barrel", BarrelBlock::new, () -> Block.Properties.ofFullCopy(Blocks.BARREL)); public static final DeferredBlock SKYROOT_LADDER = register("skyroot_ladder", LadderBlock::new, () -> Block.Properties.ofFullCopy(Blocks.LADDER).strength(0.4F).sound(SoundType.LADDER).noOcclusion()); diff --git a/src/main/java/com/aetherteam/aetherii/block/utility/RopeBlock.java b/src/main/java/com/aetherteam/aetherii/block/utility/RopeBlock.java new file mode 100644 index 0000000000..be5ee6a1be --- /dev/null +++ b/src/main/java/com/aetherteam/aetherii/block/utility/RopeBlock.java @@ -0,0 +1,30 @@ +package com.aetherteam.aetherii.block.utility; + +import com.aetherteam.aetherii.block.AetherIIBlockStateProperties; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.BooleanProperty; + +public class RopeBlock extends Block { + public static final BooleanProperty KNOT = AetherIIBlockStateProperties.ROPE_KNOT; + public static final BooleanProperty SPOOL = AetherIIBlockStateProperties.ROPE_SPOOL; + public static final BooleanProperty END = AetherIIBlockStateProperties.ROPE_END; + public static final BooleanProperty UP = BlockStateProperties.UP; + public static final BooleanProperty DOWN = BlockStateProperties.DOWN; + public static final BooleanProperty NORTH = BlockStateProperties.NORTH; + public static final BooleanProperty EAST = BlockStateProperties.EAST; + public static final BooleanProperty SOUTH = BlockStateProperties.SOUTH; + public static final BooleanProperty WEST = BlockStateProperties.WEST; + + public RopeBlock(Properties properties) { + super(properties); + this.registerDefaultState(this.stateDefinition.any().setValue(KNOT, false).setValue(SPOOL, false).setValue(END, false).setValue(UP, false).setValue(DOWN, false).setValue(NORTH, false).setValue(EAST, false).setValue(SOUTH, false).setValue(WEST, false)); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + builder.add(KNOT, SPOOL, END, UP, DOWN, NORTH, EAST, SOUTH, WEST); + } +} diff --git a/src/main/java/com/aetherteam/aetherii/block/utility/RopeStakeBlock.java b/src/main/java/com/aetherteam/aetherii/block/utility/RopeStakeBlock.java new file mode 100644 index 0000000000..dc4a88807d --- /dev/null +++ b/src/main/java/com/aetherteam/aetherii/block/utility/RopeStakeBlock.java @@ -0,0 +1,24 @@ +package com.aetherteam.aetherii.block.utility; + +import com.aetherteam.aetherii.block.AetherIIBlockStateProperties; +import net.minecraft.core.Direction; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.EnumProperty; + +public class RopeStakeBlock extends Block { + public static final EnumProperty CONNECTION = BlockStateProperties.FACING; + public static final EnumProperty SPOOL = AetherIIBlockStateProperties.STAKE_SPOOL; + + public RopeStakeBlock(Properties properties) { + super(properties); + this.registerDefaultState(this.stateDefinition.any().setValue(CONNECTION, Direction.NORTH).setValue(SPOOL, AetherIIBlockStateProperties.StakeSpoolState.NONE)); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + builder.add(CONNECTION, SPOOL); + } +} diff --git a/src/main/java/com/aetherteam/aetherii/data/generators/loot/AetherIIBlockLoot.java b/src/main/java/com/aetherteam/aetherii/data/generators/loot/AetherIIBlockLoot.java index b92698ca53..d2706171a6 100644 --- a/src/main/java/com/aetherteam/aetherii/data/generators/loot/AetherIIBlockLoot.java +++ b/src/main/java/com/aetherteam/aetherii/data/generators/loot/AetherIIBlockLoot.java @@ -700,6 +700,8 @@ public void generate() { this.dropSelf(AetherIIBlocks.ALKAHEST_PURIFIER.get()); this.dropSelf(AetherIIBlocks.MUSIC_BLOCK.get()); this.add(AetherIIBlocks.AMBROSIUM_CAMPFIRE.get(), (block) -> this.createSilkTouchDispatchTable(block, this.applyExplosionCondition(block, LootItem.lootTableItem(AetherIIItems.AMBROSIUM_SHARD).apply(SetItemCountFunction.setCount(ConstantValue.exactly(1.0F)))))); + this.dropNone(AetherIIBlocks.CLIMBING_ROPE_STAKE.get()); + this.dropNone(AetherIIBlocks.CLIMBING_ROPE.get()); this.dropSelf(AetherIIBlocks.SKYROOT_CHEST.get()); this.dropSelf(AetherIIBlocks.SKYROOT_BARREL.get()); this.dropSelf(AetherIIBlocks.SKYROOT_LADDER.get()); diff --git a/src/main/java/com/aetherteam/aetherii/data/generators/models/AetherIIBlockModels.java b/src/main/java/com/aetherteam/aetherii/data/generators/models/AetherIIBlockModels.java index 756ce64214..9db26f4a62 100644 --- a/src/main/java/com/aetherteam/aetherii/data/generators/models/AetherIIBlockModels.java +++ b/src/main/java/com/aetherteam/aetherii/data/generators/models/AetherIIBlockModels.java @@ -461,6 +461,8 @@ public void run() { this.createAlkahestPurifier(AetherIIBlocks.ALKAHEST_PURIFIER.get(), AetherIIBlocks.ARKENIUM_BLOCK.get()); this.createTrivialCube(AetherIIBlocks.MUSIC_BLOCK.get()); this.createCampfire(AetherIIBlocks.AMBROSIUM_CAMPFIRE.get()); + this.createClimbingRopeStake(AetherIIBlocks.CLIMBING_ROPE_STAKE.get()); + this.createClimbingRope(AetherIIBlocks.CLIMBING_ROPE.get()); this.createChest(AetherIIBlocks.SKYROOT_CHEST.get(), AetherIIBlocks.SKYROOT_PLANKS.get(), Identifier.fromNamespaceAndPath(AetherII.MODID, "skyroot_chest"), true); this.createBarrel(AetherIIBlocks.SKYROOT_BARREL.get()); this.createLadder(AetherIIBlocks.SKYROOT_LADDER.get()); diff --git a/src/main/java/com/aetherteam/aetherii/data/providers/AetherIIBlockModelSubProvider.java b/src/main/java/com/aetherteam/aetherii/data/providers/AetherIIBlockModelSubProvider.java index 2c3b486d7c..38f2f20c52 100644 --- a/src/main/java/com/aetherteam/aetherii/data/providers/AetherIIBlockModelSubProvider.java +++ b/src/main/java/com/aetherteam/aetherii/data/providers/AetherIIBlockModelSubProvider.java @@ -6,10 +6,7 @@ import com.aetherteam.aetherii.block.furniture.OutpostCampfireBlock; import com.aetherteam.aetherii.block.miscellaneous.FacingPillarBlock; import com.aetherteam.aetherii.block.natural.*; -import com.aetherteam.aetherii.block.utility.AmberHourglassBlock; -import com.aetherteam.aetherii.block.utility.AnimalStashBlock; -import com.aetherteam.aetherii.block.utility.ArkeniumForgeBlock; -import com.aetherteam.aetherii.block.utility.BedrollBlock; +import com.aetherteam.aetherii.block.utility.*; import com.aetherteam.aetherii.client.AetherIIColorResolvers; import com.aetherteam.aetherii.client.renderer.block.model.builder.TrunkModelBuilder; import com.aetherteam.aetherii.client.renderer.item.color.AetherGrassColorSource; @@ -1172,6 +1169,70 @@ public void createCampfire(Block block) { this.blockStateOutput.accept(MultiVariantGenerator.dispatch(block).with(createBooleanModelDispatch(BlockStateProperties.LIT, campfire, campfireOff)).with(ROTATION_HORIZONTAL_FACING_ALT)); } + public void createClimbingRopeStake(Block block) { + MultiVariant stake = plainVariant(AetherIIModelTemplates.decorateBlockModelLocation("climbing_rope_stake")); + MultiVariant stakeShort = plainVariant(AetherIIModelTemplates.decorateBlockModelLocation("climbing_rope_stake_short")); + MultiVariant knot = plainVariant(AetherIIModelTemplates.decorateBlockModelLocation("climbing_rope_knot")); + MultiVariant connection = plainVariant(AetherIIModelTemplates.decorateBlockModelLocation("climbing_rope_connection_lower")); + MultiVariant connectionSpoolFloor = plainVariant(AetherIIModelTemplates.decorateBlockModelLocation("climbing_rope_connection_spool_floor")); + MultiVariant spoolMiddle = plainVariant(AetherIIModelTemplates.decorateBlockModelLocation("climbing_rope_spool_middle")); + MultiVariant spoolFloor = plainVariant(AetherIIModelTemplates.decorateBlockModelLocation("climbing_rope_spool_floor")); + + MultiPartGenerator model = MultiPartGenerator.multiPart(block) + .with(condition().term(RopeStakeBlock.CONNECTION, Direction.UP), stakeShort.with(X_ROT_180)) + .with(condition().term(RopeStakeBlock.CONNECTION, Direction.DOWN), stake) + .with(condition().term(RopeStakeBlock.CONNECTION, Direction.NORTH), stake.with(X_ROT_90)) + .with(condition().term(RopeStakeBlock.CONNECTION, Direction.EAST), stake.with(X_ROT_90).with(Y_ROT_90)) + .with(condition().term(RopeStakeBlock.CONNECTION, Direction.SOUTH), stake.with(X_ROT_90).with(Y_ROT_180)) + .with(condition().term(RopeStakeBlock.CONNECTION, Direction.WEST), stake.with(X_ROT_90).with(Y_ROT_270)) + + .with(condition().term(RopeStakeBlock.CONNECTION, Direction.UP), knot) + .with(condition().term(RopeStakeBlock.CONNECTION, Direction.DOWN), knot) + .with(condition().term(RopeStakeBlock.CONNECTION, Direction.NORTH), knot.with(X_ROT_90)) + .with(condition().term(RopeStakeBlock.CONNECTION, Direction.EAST), knot.with(X_ROT_90).with(Y_ROT_90)) + .with(condition().term(RopeStakeBlock.CONNECTION, Direction.SOUTH), knot.with(X_ROT_90).with(Y_ROT_180)) + .with(condition().term(RopeStakeBlock.CONNECTION, Direction.WEST), knot.with(X_ROT_90).with(Y_ROT_270)) + + .with(condition().term(RopeStakeBlock.CONNECTION, Direction.UP).term(RopeStakeBlock.SPOOL, AetherIIBlockStateProperties.StakeSpoolState.CENTER), spoolMiddle) + .with(condition().term(RopeStakeBlock.CONNECTION, Direction.DOWN).term(RopeStakeBlock.SPOOL, AetherIIBlockStateProperties.StakeSpoolState.CENTER), spoolMiddle) + .with(condition().term(RopeStakeBlock.CONNECTION, Direction.NORTH).term(RopeStakeBlock.SPOOL, AetherIIBlockStateProperties.StakeSpoolState.CENTER), spoolMiddle.with(X_ROT_90)) + .with(condition().term(RopeStakeBlock.CONNECTION, Direction.EAST).term(RopeStakeBlock.SPOOL, AetherIIBlockStateProperties.StakeSpoolState.CENTER), spoolMiddle.with(X_ROT_90).with(Y_ROT_90)) + .with(condition().term(RopeStakeBlock.CONNECTION, Direction.SOUTH).term(RopeStakeBlock.SPOOL, AetherIIBlockStateProperties.StakeSpoolState.CENTER), spoolMiddle.with(X_ROT_90).with(Y_ROT_180)) + .with(condition().term(RopeStakeBlock.CONNECTION, Direction.WEST).term(RopeStakeBlock.SPOOL, AetherIIBlockStateProperties.StakeSpoolState.CENTER), spoolMiddle.with(X_ROT_90).with(Y_ROT_270)) + + .with(condition().term(RopeStakeBlock.CONNECTION, Direction.UP).term(RopeStakeBlock.SPOOL, AetherIIBlockStateProperties.StakeSpoolState.FLOOR, AetherIIBlockStateProperties.StakeSpoolState.NONE), connection) + .with(condition().term(RopeStakeBlock.CONNECTION, Direction.DOWN).term(RopeStakeBlock.SPOOL, AetherIIBlockStateProperties.StakeSpoolState.FLOOR), connectionSpoolFloor) + .with(condition().term(RopeStakeBlock.CONNECTION, Direction.NORTH).term(RopeStakeBlock.SPOOL, AetherIIBlockStateProperties.StakeSpoolState.FLOOR, AetherIIBlockStateProperties.StakeSpoolState.NONE), connection) + .with(condition().term(RopeStakeBlock.CONNECTION, Direction.EAST).term(RopeStakeBlock.SPOOL, AetherIIBlockStateProperties.StakeSpoolState.FLOOR, AetherIIBlockStateProperties.StakeSpoolState.NONE), connection) + .with(condition().term(RopeStakeBlock.CONNECTION, Direction.SOUTH).term(RopeStakeBlock.SPOOL, AetherIIBlockStateProperties.StakeSpoolState.FLOOR, AetherIIBlockStateProperties.StakeSpoolState.NONE), connection) + .with(condition().term(RopeStakeBlock.CONNECTION, Direction.WEST).term(RopeStakeBlock.SPOOL, AetherIIBlockStateProperties.StakeSpoolState.FLOOR, AetherIIBlockStateProperties.StakeSpoolState.NONE), connection) + + .with(condition().term(RopeStakeBlock.SPOOL, AetherIIBlockStateProperties.StakeSpoolState.FLOOR), spoolFloor); + + this.blockStateOutput.accept(model); + } + + public void createClimbingRope(Block block) { + MultiVariant connectionLower = plainVariant(AetherIIModelTemplates.decorateBlockModelLocation("climbing_rope_connection_lower")); + MultiVariant connectionUpper = plainVariant(AetherIIModelTemplates.decorateBlockModelLocation("climbing_rope_connection_upper")); + MultiVariant knot = plainVariant(AetherIIModelTemplates.decorateBlockModelLocation("climbing_rope_knot")); + MultiVariant spoolFloor = plainVariant(AetherIIModelTemplates.decorateBlockModelLocation("climbing_rope_spool_floor")); + MultiVariant fray = plainVariant(AetherIIModelTemplates.decorateBlockModelLocation("climbing_rope_fray")); + + MultiPartGenerator model = MultiPartGenerator.multiPart(block) + .with(condition().term(RopeBlock.KNOT, true), knot) + .with(condition().term(RopeBlock.SPOOL, true), spoolFloor) + .with(condition().term(RopeBlock.END, true), fray) + .with(condition().term(RopeBlock.UP, true), connectionUpper) + .with(condition().term(RopeBlock.DOWN, true), connectionLower) + .with(condition().term(RopeBlock.NORTH, true), connectionUpper.with(X_ROT_90)) + .with(condition().term(RopeBlock.EAST, true), connectionUpper.with(X_ROT_90).with(Y_ROT_90)) + .with(condition().term(RopeBlock.SOUTH, true), connectionLower.with(X_ROT_90)) + .with(condition().term(RopeBlock.WEST, true), connectionLower.with(X_ROT_90).with(Y_ROT_90)); + + this.blockStateOutput.accept(model); + } + public void createVase(Block block, Block particle) { this.createParticleOnlyBlock(block, particle); Identifier location = Identifier.fromNamespaceAndPath(AetherII.MODID, "textures/entity/vases/" + block.builtInRegistryHolder().getKey().identifier().getPath() + ".png"); diff --git a/src/main/resources/assets/aether_ii/models/block/climbing_rope_connection_lower.json b/src/main/resources/assets/aether_ii/models/block/climbing_rope_connection_lower.json new file mode 100644 index 0000000000..c2e68b8a74 --- /dev/null +++ b/src/main/resources/assets/aether_ii/models/block/climbing_rope_connection_lower.json @@ -0,0 +1,33 @@ +{ + "format_version": "1.21.11", + "credit": "Made with Blockbench", + "textures": { + "particle": "aether_ii:block/climbing_rope", + "texture": "aether_ii:block/climbing_rope" + }, + "elements": [ + { + "name": "rope_end", + "from": [7, 0, 7], + "to": [9, 8, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 0, 8]}, + "faces": { + "north": {"uv": [14, 0, 16, 8], "texture": "#texture"}, + "east": {"uv": [14, 0, 16, 8], "texture": "#texture"}, + "south": {"uv": [14, 0, 16, 8], "texture": "#texture"}, + "west": {"uv": [14, 0, 16, 8], "texture": "#texture"}, + "up": {"uv": [12, 14, 14, 16], "texture": "#texture"}, + "down": {"uv": [10, 14, 12, 16], "texture": "#texture"} + } + } + ], + "groups": [ + { + "name": "rope_end", + "origin": [8, 0, 8], + "scope": 0, + "color": 0, + "children": [0] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/aether_ii/models/block/climbing_rope_connection_spool_floor.json b/src/main/resources/assets/aether_ii/models/block/climbing_rope_connection_spool_floor.json new file mode 100644 index 0000000000..afa6fdc44a --- /dev/null +++ b/src/main/resources/assets/aether_ii/models/block/climbing_rope_connection_spool_floor.json @@ -0,0 +1,33 @@ +{ + "format_version": "1.21.11", + "credit": "Made with Blockbench", + "textures": { + "texture": "aether_ii:block/climbing_rope", + "particle": "aether_ii:block/climbing_rope" + }, + "elements": [ + { + "name": "rope_to_spool", + "from": [8, 2, 8], + "to": [10, 6, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [14, 12, 16, 16], "texture": "#texture"}, + "east": {"uv": [14, 12, 16, 16], "texture": "#texture"}, + "south": {"uv": [14, 12, 16, 16], "texture": "#texture"}, + "west": {"uv": [14, 12, 16, 16], "texture": "#texture"}, + "up": {"uv": [12, 14, 14, 16], "texture": "#texture"}, + "down": {"uv": [12, 14, 14, 16], "texture": "#texture"} + } + } + ], + "groups": [ + { + "name": "stake_top_unspooled_stopped", + "origin": [8, 8, 8], + "scope": 0, + "color": 0, + "children": [0] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/aether_ii/models/block/climbing_rope_connection_upper.json b/src/main/resources/assets/aether_ii/models/block/climbing_rope_connection_upper.json new file mode 100644 index 0000000000..3515189ccf --- /dev/null +++ b/src/main/resources/assets/aether_ii/models/block/climbing_rope_connection_upper.json @@ -0,0 +1,33 @@ +{ + "format_version": "1.21.11", + "credit": "Made with Blockbench", + "textures": { + "texture": "aether_ii:block/climbing_rope", + "particle": "aether_ii:block/climbing_rope" + }, + "elements": [ + { + "name": "rope_end", + "from": [7, 8, 7], + "to": [9, 16, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [14, 0, 16, 8], "texture": "#texture"}, + "east": {"uv": [14, 0, 16, 8], "texture": "#texture"}, + "south": {"uv": [14, 0, 16, 8], "texture": "#texture"}, + "west": {"uv": [14, 0, 16, 8], "texture": "#texture"}, + "up": {"uv": [12, 14, 14, 16], "texture": "#texture"}, + "down": {"uv": [10, 14, 12, 16], "texture": "#texture"} + } + } + ], + "groups": [ + { + "name": "rope_end", + "origin": [8, 8, 8], + "scope": 0, + "color": 0, + "children": [0] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/aether_ii/models/block/climbing_rope_fray.json b/src/main/resources/assets/aether_ii/models/block/climbing_rope_fray.json new file mode 100644 index 0000000000..d50d6b05c5 --- /dev/null +++ b/src/main/resources/assets/aether_ii/models/block/climbing_rope_fray.json @@ -0,0 +1,47 @@ +{ + "format_version": "1.21.11", + "credit": "Made with Blockbench", + "textures": { + "texture": "aether_ii:block/climbing_rope", + "particle": "aether_ii:block/climbing_rope" + }, + "elements": [ + { + "name": "rope_fray_2", + "from": [8, 5, 5], + "to": [8, 8, 11], + "rotation": {"x": 0, "y": 135, "z": 0, "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [0, 0, 0, 3], "texture": "#texture"}, + "east": {"uv": [7, 10, 13, 13], "texture": "#texture"}, + "south": {"uv": [0, 2, 0, 5], "texture": "#texture"}, + "west": {"uv": [7, 10, 13, 13], "texture": "#texture"}, + "up": {"uv": [0, 0, 0, 8], "texture": "#texture"}, + "down": {"uv": [0, 0, 0, 8], "texture": "#texture"} + } + }, + { + "name": "rope_fray_3", + "from": [8, 5, 5], + "to": [8, 8, 11], + "rotation": {"angle": 45, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [0, 0, 0, 3], "texture": "#texture"}, + "east": {"uv": [7, 10, 13, 13], "texture": "#texture"}, + "south": {"uv": [0, 2, 0, 5], "texture": "#texture"}, + "west": {"uv": [7, 10, 13, 13], "texture": "#texture"}, + "up": {"uv": [0, 0, 0, 8], "texture": "#texture"}, + "down": {"uv": [0, 0, 0, 8], "texture": "#texture"} + } + } + ], + "groups": [ + { + "name": "rope_end", + "origin": [8, 8, 8], + "scope": 0, + "color": 0, + "children": [0, 1] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/aether_ii/models/block/climbing_rope_knot.json b/src/main/resources/assets/aether_ii/models/block/climbing_rope_knot.json new file mode 100644 index 0000000000..9ffa45fec0 --- /dev/null +++ b/src/main/resources/assets/aether_ii/models/block/climbing_rope_knot.json @@ -0,0 +1,33 @@ +{ + "format_version": "1.21.11", + "credit": "Made with Blockbench", + "textures": { + "texture": "aether_ii:block/climbing_rope", + "particle": "aether_ii:block/climbing_rope" + }, + "elements": [ + { + "name": "knot", + "from": [6, 6, 6], + "to": [10, 10, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [2, 4, 6, 8], "texture": "#texture"}, + "east": {"uv": [2, 4, 6, 8], "texture": "#texture"}, + "south": {"uv": [2, 4, 6, 8], "texture": "#texture"}, + "west": {"uv": [2, 4, 6, 8], "texture": "#texture"}, + "up": {"uv": [2, 0, 6, 4], "texture": "#texture"}, + "down": {"uv": [2, 0, 6, 4], "texture": "#texture"} + } + } + ], + "groups": [ + { + "name": "rope_knotted", + "origin": [8, 8, 8], + "scope": 0, + "color": 0, + "children": [0] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/aether_ii/models/block/climbing_rope_spool_floor.json b/src/main/resources/assets/aether_ii/models/block/climbing_rope_spool_floor.json new file mode 100644 index 0000000000..b1eb7c4e82 --- /dev/null +++ b/src/main/resources/assets/aether_ii/models/block/climbing_rope_spool_floor.json @@ -0,0 +1,33 @@ +{ + "format_version": "1.21.11", + "credit": "Made with Blockbench", + "textures": { + "texture": "aether_ii:block/climbing_rope", + "particle": "aether_ii:block/climbing_rope" + }, + "elements": [ + { + "name": "spool", + "from": [4, 0, 4], + "to": [12, 2, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [6, 8, 14, 10], "texture": "#texture"}, + "east": {"uv": [6, 8, 14, 10], "texture": "#texture"}, + "south": {"uv": [6, 8, 14, 10], "texture": "#texture"}, + "west": {"uv": [6, 8, 14, 10], "texture": "#texture"}, + "up": {"uv": [6, 0, 14, 8], "texture": "#texture"}, + "down": {"uv": [6, 0, 14, 8], "texture": "#texture"} + } + } + ], + "groups": [ + { + "name": "rope_stopped", + "origin": [8, 8, 8], + "scope": 0, + "color": 0, + "children": [0] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/aether_ii/models/block/climbing_rope_spool_middle.json b/src/main/resources/assets/aether_ii/models/block/climbing_rope_spool_middle.json new file mode 100644 index 0000000000..ad53fd42be --- /dev/null +++ b/src/main/resources/assets/aether_ii/models/block/climbing_rope_spool_middle.json @@ -0,0 +1,33 @@ +{ + "format_version": "1.21.11", + "credit": "Made with Blockbench", + "textures": { + "texture": "aether_ii:block/climbing_rope", + "particle": "aether_ii:block/climbing_rope" + }, + "elements": [ + { + "name": "spool", + "from": [4, 7, 4], + "to": [12, 9, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [6, 8, 14, 10], "texture": "#texture"}, + "east": {"uv": [6, 8, 14, 10], "texture": "#texture"}, + "south": {"uv": [6, 8, 14, 10], "texture": "#texture"}, + "west": {"uv": [6, 8, 14, 10], "texture": "#texture"}, + "up": {"uv": [6, 0, 14, 8], "texture": "#texture"}, + "down": {"uv": [6, 0, 14, 8], "texture": "#texture"} + } + } + ], + "groups": [ + { + "name": "stake_top_spooled", + "origin": [8, 8, 8], + "scope": 0, + "color": 0, + "children": [0] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/aether_ii/models/block/climbing_rope_stake.json b/src/main/resources/assets/aether_ii/models/block/climbing_rope_stake.json new file mode 100644 index 0000000000..9d14c6b39a --- /dev/null +++ b/src/main/resources/assets/aether_ii/models/block/climbing_rope_stake.json @@ -0,0 +1,61 @@ +{ + "format_version": "1.21.11", + "credit": "Made with Blockbench", + "textures": { + "texture": "aether_ii:block/climbing_rope", + "particle": "aether_ii:block/climbing_rope" + }, + "elements": [ + { + "name": "hook_1", + "from": [8, 8, 4], + "to": [8, 11, 12], + "rotation": {"angle": 45, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [0, 0, 0, 3], "texture": "#texture"}, + "east": {"uv": [0, 13, 8, 16], "texture": "#texture"}, + "south": {"uv": [0, 2, 0, 5], "texture": "#texture"}, + "west": {"uv": [0, 13, 8, 16], "texture": "#texture"}, + "up": {"uv": [0, 0, 0, 8], "texture": "#texture"}, + "down": {"uv": [0, 0, 0, 8], "texture": "#texture"} + } + }, + { + "name": "hook_2", + "from": [8, 8, 4], + "to": [8, 11, 12], + "rotation": {"x": 0, "y": 135, "z": 0, "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [0, 0, 0, 3], "texture": "#texture"}, + "east": {"uv": [0, 13, 8, 16], "texture": "#texture"}, + "south": {"uv": [0, 2, 0, 5], "texture": "#texture"}, + "west": {"uv": [0, 13, 8, 16], "texture": "#texture"}, + "up": {"uv": [0, 0, 0, 8], "texture": "#texture"}, + "down": {"uv": [0, 0, 0, 8], "texture": "#texture"} + } + }, + { + "name": "stake", + "from": [7, 0, 7], + "to": [9, 13, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [0, 0, 2, 13], "texture": "#texture"}, + "east": {"uv": [0, 0, 2, 13], "texture": "#texture"}, + "south": {"uv": [0, 0, 2, 13], "texture": "#texture"}, + "west": {"uv": [0, 0, 2, 13], "texture": "#texture"}, + "up": {"uv": [2, 11, 4, 13], "texture": "#texture"}, + "down": {"uv": [2, 11, 4, 13], "texture": "#texture"} + } + } + ], + "groups": [ + { + "name": "stake_top_spooled", + "origin": [8, 8, 8], + "scope": 0, + "color": 0, + "children": [0, 1, 2] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/aether_ii/models/block/climbing_rope_stake_short.json b/src/main/resources/assets/aether_ii/models/block/climbing_rope_stake_short.json new file mode 100644 index 0000000000..5b8b2e4b44 --- /dev/null +++ b/src/main/resources/assets/aether_ii/models/block/climbing_rope_stake_short.json @@ -0,0 +1,61 @@ +{ + "format_version": "1.21.11", + "credit": "Made with Blockbench", + "textures": { + "texture": "aether_ii:block/climbing_rope", + "particle": "aether_ii:block/climbing_rope" + }, + "elements": [ + { + "name": "hook_2", + "from": [8, 8, 4], + "to": [8, 11, 12], + "rotation": {"x": 0, "y": 45, "z": 0, "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [0, 0, 0, 3], "texture": "#texture"}, + "east": {"uv": [0, 13, 8, 16], "texture": "#texture"}, + "south": {"uv": [0, 2, 0, 5], "texture": "#texture"}, + "west": {"uv": [0, 13, 8, 16], "texture": "#texture"}, + "up": {"uv": [0, 0, 0, 8], "texture": "#texture"}, + "down": {"uv": [0, 0, 0, 8], "texture": "#texture"} + } + }, + { + "name": "hook_3", + "from": [8, 8, 4], + "to": [8, 11, 12], + "rotation": {"x": 180, "y": 45, "z": -180, "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [0, 0, 0, 3], "texture": "#texture"}, + "east": {"uv": [0, 13, 8, 16], "texture": "#texture"}, + "south": {"uv": [0, 2, 0, 5], "texture": "#texture"}, + "west": {"uv": [0, 13, 8, 16], "texture": "#texture"}, + "up": {"uv": [0, 0, 0, 8], "texture": "#texture"}, + "down": {"uv": [0, 0, 0, 8], "texture": "#texture"} + } + }, + { + "name": "stake_short", + "from": [7, 0, 7], + "to": [9, 8, 9], + "rotation": {"angle": 0, "axis": "x", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [0, 5, 2, 13], "texture": "#texture"}, + "east": {"uv": [0, 5, 2, 13], "texture": "#texture"}, + "south": {"uv": [0, 5, 2, 13], "texture": "#texture"}, + "west": {"uv": [0, 5, 2, 13], "texture": "#texture"}, + "up": {"uv": [2, 11, 4, 13], "texture": "#texture"}, + "down": {"uv": [2, 11, 4, 13], "texture": "#texture"} + } + } + ], + "groups": [ + { + "name": "stake_bottom_unspooled", + "origin": [8, 8, 8], + "scope": 0, + "color": 0, + "children": [0, 1, 2] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/aether_ii/textures/block/climbing_rope.png b/src/main/resources/assets/aether_ii/textures/block/climbing_rope.png new file mode 100644 index 0000000000000000000000000000000000000000..4da62b9b98f2fe27de2de5e3a4f51e3fca7fa34a GIT binary patch literal 519 zcmV+i0{H!jP)67^R#a5)} zRKDLS-g~=TS05ys>6YPqpPXIZ2!F)z;}FxiyJ}5Ty4hZs4nRm&@@vanQ^#rb^;Ha89} zK*V#i7oZS`gPGv@Hq#@yTyIM;4$}ZP@e>kb0;U7v_)1Tp zUulGKSR#*-a5^OEI3{H#aF37V^u(3#uTS}C_(p)idp|K=wrIjM{e!a>-vl``LG!mu z?2b(IJ^VBsDHI9;6pO`Rd-n>h&?GX#e>4h@=v9w)VB5C1u4`2)l@^GRLk!%!wmxIN zLNfu$|M2Gdk_h*}<0Qjf=pFn400960SAi=@00006Nkl Date: Sun, 9 Aug 2026 15:18:20 -0700 Subject: [PATCH 02/27] feat: basic iteration of climbing rope --- .../blockstates/climbing_rope_stake.json | 40 +++--- .../aether_ii/items/climbing_rope_stake.json | 2 +- .../assets/aether_ii/lang/en_us.json | 1 + .../models/item/climbing_rope_stake.json | 6 + .../block/AetherIIBlockStateProperties.java | 1 + .../aetherii/block/utility/RopeBlock.java | 125 +++++++++++++++++- .../block/utility/RopeStakeBlock.java | 105 +++++++++++++++ .../data/generators/AetherIILanguageData.java | 1 + .../AetherIIBlockModelSubProvider.java | 36 ++--- .../textures/item/climbing_rope_stake.png | Bin 0 -> 2088 bytes 10 files changed, 277 insertions(+), 40 deletions(-) create mode 100644 src/generated/resources/assets/aether_ii/models/item/climbing_rope_stake.json create mode 100644 src/main/resources/assets/aether_ii/textures/item/climbing_rope_stake.png diff --git a/src/generated/resources/assets/aether_ii/blockstates/climbing_rope_stake.json b/src/generated/resources/assets/aether_ii/blockstates/climbing_rope_stake.json index edfda6c543..7a6405fdc9 100644 --- a/src/generated/resources/assets/aether_ii/blockstates/climbing_rope_stake.json +++ b/src/generated/resources/assets/aether_ii/blockstates/climbing_rope_stake.json @@ -20,7 +20,8 @@ { "apply": { "model": "aether_ii:block/climbing_rope_stake", - "x": 90 + "x": 90, + "y": 180 }, "when": { "facing": "north" @@ -30,7 +31,7 @@ "apply": { "model": "aether_ii:block/climbing_rope_stake", "x": 90, - "y": 90 + "y": 270 }, "when": { "facing": "east" @@ -39,8 +40,7 @@ { "apply": { "model": "aether_ii:block/climbing_rope_stake", - "x": 90, - "y": 180 + "x": 90 }, "when": { "facing": "south" @@ -50,7 +50,7 @@ "apply": { "model": "aether_ii:block/climbing_rope_stake", "x": 90, - "y": 270 + "y": 90 }, "when": { "facing": "west" @@ -75,7 +75,8 @@ { "apply": { "model": "aether_ii:block/climbing_rope_knot", - "x": 90 + "x": 90, + "y": 180 }, "when": { "facing": "north" @@ -85,7 +86,7 @@ "apply": { "model": "aether_ii:block/climbing_rope_knot", "x": 90, - "y": 90 + "y": 270 }, "when": { "facing": "east" @@ -94,8 +95,7 @@ { "apply": { "model": "aether_ii:block/climbing_rope_knot", - "x": 90, - "y": 180 + "x": 90 }, "when": { "facing": "south" @@ -105,7 +105,7 @@ "apply": { "model": "aether_ii:block/climbing_rope_knot", "x": 90, - "y": 270 + "y": 90 }, "when": { "facing": "west" @@ -132,7 +132,8 @@ { "apply": { "model": "aether_ii:block/climbing_rope_spool_middle", - "x": 90 + "x": 90, + "y": 180 }, "when": { "facing": "north", @@ -143,7 +144,7 @@ "apply": { "model": "aether_ii:block/climbing_rope_spool_middle", "x": 90, - "y": 90 + "y": 270 }, "when": { "facing": "east", @@ -153,8 +154,7 @@ { "apply": { "model": "aether_ii:block/climbing_rope_spool_middle", - "x": 90, - "y": 180 + "x": 90 }, "when": { "facing": "south", @@ -165,7 +165,7 @@ "apply": { "model": "aether_ii:block/climbing_rope_spool_middle", "x": 90, - "y": 270 + "y": 90 }, "when": { "facing": "west", @@ -178,7 +178,7 @@ }, "when": { "facing": "up", - "stake_spool": "floor|none" + "stake_spool": "floor|none_connected" } }, { @@ -196,7 +196,7 @@ }, "when": { "facing": "north", - "stake_spool": "floor|none" + "stake_spool": "floor|none_connected" } }, { @@ -205,7 +205,7 @@ }, "when": { "facing": "east", - "stake_spool": "floor|none" + "stake_spool": "floor|none_connected" } }, { @@ -214,7 +214,7 @@ }, "when": { "facing": "south", - "stake_spool": "floor|none" + "stake_spool": "floor|none_connected" } }, { @@ -223,7 +223,7 @@ }, "when": { "facing": "west", - "stake_spool": "floor|none" + "stake_spool": "floor|none_connected" } }, { diff --git a/src/generated/resources/assets/aether_ii/items/climbing_rope_stake.json b/src/generated/resources/assets/aether_ii/items/climbing_rope_stake.json index 1558fb78b0..2fe1c4545d 100644 --- a/src/generated/resources/assets/aether_ii/items/climbing_rope_stake.json +++ b/src/generated/resources/assets/aether_ii/items/climbing_rope_stake.json @@ -1,6 +1,6 @@ { "model": { "type": "minecraft:model", - "model": "aether_ii:block/climbing_rope_stake" + "model": "aether_ii:item/climbing_rope_stake" } } \ No newline at end of file diff --git a/src/generated/resources/assets/aether_ii/lang/en_us.json b/src/generated/resources/assets/aether_ii/lang/en_us.json index f4ad931bcd..d2f570437a 100644 --- a/src/generated/resources/assets/aether_ii/lang/en_us.json +++ b/src/generated/resources/assets/aether_ii/lang/en_us.json @@ -435,6 +435,7 @@ "block.aether_ii.bryalinn_moss_flowers": "Bryalinn Moss Flowers", "block.aether_ii.bryalinn_moss_vines": "Bryalinn Moss Vines", "block.aether_ii.carrion_cutting": "Carrion Cutting", + "block.aether_ii.climbing_rope_stake": "Climbing Rope", "block.aether_ii.cloudwool": "Cloudwool", "block.aether_ii.cloudwool_bedroll": "Cloudwool Bedroll", "block.aether_ii.cloudwool_carpet": "Cloudwool Carpet", diff --git a/src/generated/resources/assets/aether_ii/models/item/climbing_rope_stake.json b/src/generated/resources/assets/aether_ii/models/item/climbing_rope_stake.json new file mode 100644 index 0000000000..5f39c282b8 --- /dev/null +++ b/src/generated/resources/assets/aether_ii/models/item/climbing_rope_stake.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "aether_ii:item/climbing_rope_stake" + } +} \ No newline at end of file diff --git a/src/main/java/com/aetherteam/aetherii/block/AetherIIBlockStateProperties.java b/src/main/java/com/aetherteam/aetherii/block/AetherIIBlockStateProperties.java index 4c272dff9c..135529a344 100644 --- a/src/main/java/com/aetherteam/aetherii/block/AetherIIBlockStateProperties.java +++ b/src/main/java/com/aetherteam/aetherii/block/AetherIIBlockStateProperties.java @@ -64,6 +64,7 @@ public String getSerializedName() { public enum StakeSpoolState implements StringRepresentable { NONE, + NONE_CONNECTED, CENTER, FLOOR; diff --git a/src/main/java/com/aetherteam/aetherii/block/utility/RopeBlock.java b/src/main/java/com/aetherteam/aetherii/block/utility/RopeBlock.java index be5ee6a1be..a728a6e686 100644 --- a/src/main/java/com/aetherteam/aetherii/block/utility/RopeBlock.java +++ b/src/main/java/com/aetherteam/aetherii/block/utility/RopeBlock.java @@ -1,13 +1,39 @@ package com.aetherteam.aetherii.block.utility; +import com.aetherteam.aetherii.AetherII; import com.aetherteam.aetherii.block.AetherIIBlockStateProperties; +import com.aetherteam.aetherii.block.AetherIIBlocks; +import com.aetherteam.aetherii.item.AetherIIItems; +import com.aetherteam.aetherii.loot.AetherIILoot; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.RandomSource; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.InsideBlockEffectApplier; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.ScheduledTickAccess; import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.PipeBlock; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.block.state.properties.BlockStateProperties; import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; +import org.spongepowered.asm.mixin.injection.struct.InjectorGroupInfo; -public class RopeBlock extends Block { +import java.util.Map; + +public class RopeBlock extends Block { //todo merge knot spool and end?. but also have a state for spool+knot public static final BooleanProperty KNOT = AetherIIBlockStateProperties.ROPE_KNOT; public static final BooleanProperty SPOOL = AetherIIBlockStateProperties.ROPE_SPOOL; public static final BooleanProperty END = AetherIIBlockStateProperties.ROPE_END; @@ -17,14 +43,111 @@ public class RopeBlock extends Block { public static final BooleanProperty EAST = BlockStateProperties.EAST; public static final BooleanProperty SOUTH = BlockStateProperties.SOUTH; public static final BooleanProperty WEST = BlockStateProperties.WEST; + public static final int MAX_LENGTH = 16; + public static final int DELAY = 4; public RopeBlock(Properties properties) { super(properties); this.registerDefaultState(this.stateDefinition.any().setValue(KNOT, false).setValue(SPOOL, false).setValue(END, false).setValue(UP, false).setValue(DOWN, false).setValue(NORTH, false).setValue(EAST, false).setValue(SOUTH, false).setValue(WEST, false)); } + @Override + protected void tick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) { + if (level.getBlockState(pos.below()).isAir()) { + if (this.checkForStake(level, pos)) { + level.setBlock(pos, state.setValue(DOWN, true).setValue(END, false), 1 | 2); + level.setBlock(pos.below(), AetherIIBlocks.CLIMBING_ROPE.get().defaultBlockState().setValue(UP, true), 1 | 2); + level.scheduleTick(pos.below(), this, DELAY); + } else { + level.setBlock(pos, state.setValue(END, true), 1 | 2); + } + } else { + level.setBlock(pos, state.setValue(DOWN, true).setValue(END, false).setValue(SPOOL, true), 1 | 2); + } + } + + @Override + protected BlockState updateShape(BlockState state, LevelReader levelReader, ScheduledTickAccess scheduledTickAccess, BlockPos pos, Direction direction, BlockPos neighborPos, BlockState neighborState, RandomSource randomSource) { + if (neighborState.isAir()) { + if (direction == Direction.DOWN) { + if (state.getValue(SPOOL)) { + scheduledTickAccess.scheduleTick(pos, this, DELAY); + state = state.setValue(SPOOL, false); + } else { + state = state.setValue(DOWN, false); + if (!state.getValue(KNOT)) { + state = state.setValue(END, true); + } + } + } else if (direction == Direction.UP) { //todo this should be based on connection direction to allow for placing rope without having it break immediately when breaking smth above it. if it only has one connection? + return Blocks.AIR.defaultBlockState(); + } + } + return state; + } + + @Override + protected InteractionResult useWithoutItem(BlockState state, Level level, BlockPos pos, Player player, BlockHitResult hitResult) { + BlockState newState = state.cycle(KNOT); + level.setBlock(pos, newState, 1 | 2); + return InteractionResult.SUCCESS; + } + + public boolean checkForStake(LevelReader levelReader, BlockPos pos) { + for (int i = 1; i < MAX_LENGTH; ++i) { + BlockPos abovePos = pos.above(i); + BlockState aboveState = levelReader.getBlockState(abovePos); + if (aboveState.is(AetherIIBlocks.CLIMBING_ROPE_STAKE)) { + return true; + } + } + return false; + } + @Override protected void createBlockStateDefinition(StateDefinition.Builder builder) { builder.add(KNOT, SPOOL, END, UP, DOWN, NORTH, EAST, SOUTH, WEST); } + + @Override + protected VoxelShape getShape(BlockState state, BlockGetter level, BlockPos pos, CollisionContext context) { + VoxelShape spool = Block.box(4, 0, 4, 12, 2, 12); + VoxelShape connection = Block.box(6, 6, 0, 10, 10, 8); + Map rotated = Shapes.rotateAll(connection); + VoxelShape finalShape = Shapes.empty(); + for (Map.Entry entry : PipeBlock.PROPERTY_BY_DIRECTION.entrySet()) { + if (state.getValue(entry.getValue())) { + finalShape = Shapes.or(finalShape, rotated.get(entry.getKey())); + } + } + if (state.getValue(SPOOL)) { + finalShape = Shapes.or(finalShape, spool); + } + return finalShape; + } + + @Override + protected VoxelShape getCollisionShape(BlockState state, BlockGetter level, BlockPos pos, CollisionContext context) { + return Shapes.empty(); + } + + @Override + public VoxelShape getVisualShape(BlockState state, BlockGetter level, BlockPos pos, CollisionContext context) { + return Shapes.empty(); + } + + @Override + protected float getShadeBrightness(BlockState state, BlockGetter level, BlockPos pos) { + return 1.0F; + } + + @Override + protected boolean propagatesSkylightDown(BlockState state) { + return true; + } + + @Override + public boolean isLadder(BlockState state, LevelReader level, BlockPos pos, LivingEntity entity) { + return true; + } } diff --git a/src/main/java/com/aetherteam/aetherii/block/utility/RopeStakeBlock.java b/src/main/java/com/aetherteam/aetherii/block/utility/RopeStakeBlock.java index dc4a88807d..554891fccb 100644 --- a/src/main/java/com/aetherteam/aetherii/block/utility/RopeStakeBlock.java +++ b/src/main/java/com/aetherteam/aetherii/block/utility/RopeStakeBlock.java @@ -1,12 +1,32 @@ package com.aetherteam.aetherii.block.utility; +import com.aetherteam.aetherii.AetherII; import com.aetherteam.aetherii.block.AetherIIBlockStateProperties; +import com.aetherteam.aetherii.block.AetherIIBlocks; +import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.RandomSource; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.InsideBlockEffectApplier; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.ScheduledTickAccess; import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.block.state.properties.BlockStateProperties; import net.minecraft.world.level.block.state.properties.EnumProperty; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; public class RopeStakeBlock extends Block { public static final EnumProperty CONNECTION = BlockStateProperties.FACING; @@ -17,8 +37,93 @@ public RopeStakeBlock(Properties properties) { this.registerDefaultState(this.stateDefinition.any().setValue(CONNECTION, Direction.NORTH).setValue(SPOOL, AetherIIBlockStateProperties.StakeSpoolState.NONE)); } + @Override + protected void tick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) { + if (level.getBlockState(pos.below()).isAir()) { + level.setBlock(pos.below(), AetherIIBlocks.CLIMBING_ROPE.get().defaultBlockState().setValue(RopeBlock.UP, true), 1 | 2); + level.scheduleTick(pos.below(), AetherIIBlocks.CLIMBING_ROPE.get(), RopeBlock.DELAY); + } else { + level.setBlock(pos, state.setValue(RopeStakeBlock.SPOOL, AetherIIBlockStateProperties.StakeSpoolState.FLOOR), 1 | 2); + } + } + + @Override + protected BlockState updateShape(BlockState state, LevelReader levelReader, ScheduledTickAccess scheduledTickAccess, BlockPos pos, Direction direction, BlockPos neighborPos, BlockState neighborState, RandomSource randomSource) { + if (neighborState.isAir()) { + if (direction == Direction.DOWN) { + if (state.getValue(SPOOL) == AetherIIBlockStateProperties.StakeSpoolState.NONE_CONNECTED) { + state = state.setValue(SPOOL, AetherIIBlockStateProperties.StakeSpoolState.NONE); + } + } else if (direction == state.getValue(CONNECTION)) { + return Blocks.AIR.defaultBlockState(); + } + } + return state; + } + + @Override + protected InteractionResult useWithoutItem(BlockState state, Level level, BlockPos pos, Player player, BlockHitResult hitResult) { + if (state.getValue(SPOOL) == AetherIIBlockStateProperties.StakeSpoolState.CENTER) { + BlockState newState = state.setValue(SPOOL, AetherIIBlockStateProperties.StakeSpoolState.NONE_CONNECTED); + level.setBlock(pos, newState, 1 | 2); + level.scheduleTick(pos, this, RopeBlock.DELAY); + return InteractionResult.SUCCESS; + } + return InteractionResult.PASS; + } + + @Override + public BlockState getStateForPlacement(BlockPlaceContext context) { + return this.defaultBlockState().setValue(CONNECTION, context.getClickedFace().getOpposite()).setValue(SPOOL, AetherIIBlockStateProperties.StakeSpoolState.CENTER); + } + @Override protected void createBlockStateDefinition(StateDefinition.Builder builder) { builder.add(CONNECTION, SPOOL); } + + @Override + protected VoxelShape getShape(BlockState state, BlockGetter level, BlockPos pos, CollisionContext context) { +// VoxelShape center = Block.box(5, 5, 5, 11, 11, 11); + VoxelShape stake = Block.box(6, 6, 0, 10, 10, 13); + VoxelShape finalShape = Shapes.rotateAll(stake).get(state.getValue(CONNECTION)); + if (state.getValue(SPOOL) == AetherIIBlockStateProperties.StakeSpoolState.NONE_CONNECTED || state.getValue(SPOOL) == AetherIIBlockStateProperties.StakeSpoolState.FLOOR) { + VoxelShape connection = Block.box(6, 0, 6, 10, 6, 10); + finalShape = Shapes.or(finalShape, connection); + } + if (state.getValue(SPOOL) == AetherIIBlockStateProperties.StakeSpoolState.FLOOR) { + VoxelShape spool = Block.box(4, 0, 4, 12, 2, 12); + finalShape = Shapes.or(finalShape, spool); + } else if (state.getValue(SPOOL) == AetherIIBlockStateProperties.StakeSpoolState.CENTER) { + VoxelShape spool = Block.box(4, 4, 7, 12, 12, 9); + finalShape = Shapes.or(finalShape, Shapes.rotateAll(spool).get(state.getValue(CONNECTION))); + + } + return finalShape; + } + + @Override + protected VoxelShape getCollisionShape(BlockState state, BlockGetter level, BlockPos pos, CollisionContext context) { + return Shapes.empty(); + } + + @Override + public VoxelShape getVisualShape(BlockState state, BlockGetter level, BlockPos pos, CollisionContext context) { + return Shapes.empty(); + } + + @Override + protected float getShadeBrightness(BlockState state, BlockGetter level, BlockPos pos) { + return 1.0F; + } + + @Override + protected boolean propagatesSkylightDown(BlockState state) { + return true; + } + + @Override + public boolean isLadder(BlockState state, LevelReader level, BlockPos pos, LivingEntity entity) { + return true; + } } diff --git a/src/main/java/com/aetherteam/aetherii/data/generators/AetherIILanguageData.java b/src/main/java/com/aetherteam/aetherii/data/generators/AetherIILanguageData.java index 04f211e270..d91c982acd 100644 --- a/src/main/java/com/aetherteam/aetherii/data/generators/AetherIILanguageData.java +++ b/src/main/java/com/aetherteam/aetherii/data/generators/AetherIILanguageData.java @@ -747,6 +747,7 @@ private void addBlocks() { this.addBlock(AetherIIBlocks.ARKENIUM_FORGE, "Arkenium Forge"); this.addBlock(AetherIIBlocks.ALKAHEST_PURIFIER, "Alkahest Purifier"); this.addBlock(AetherIIBlocks.AMBROSIUM_CAMPFIRE, "Ambrosium Campfire"); + this.addBlock(AetherIIBlocks.CLIMBING_ROPE_STAKE, "Climbing Rope"); this.addBlock(AetherIIBlocks.SKYROOT_CHEST, "Skyroot Chest"); this.addBlock(AetherIIBlocks.SKYROOT_BARREL, "Skyroot Barrel"); this.addBlock(AetherIIBlocks.SKYROOT_LADDER, "Skyroot Ladder"); diff --git a/src/main/java/com/aetherteam/aetherii/data/providers/AetherIIBlockModelSubProvider.java b/src/main/java/com/aetherteam/aetherii/data/providers/AetherIIBlockModelSubProvider.java index 38f2f20c52..f93abba355 100644 --- a/src/main/java/com/aetherteam/aetherii/data/providers/AetherIIBlockModelSubProvider.java +++ b/src/main/java/com/aetherteam/aetherii/data/providers/AetherIIBlockModelSubProvider.java @@ -1181,34 +1181,34 @@ public void createClimbingRopeStake(Block block) { MultiPartGenerator model = MultiPartGenerator.multiPart(block) .with(condition().term(RopeStakeBlock.CONNECTION, Direction.UP), stakeShort.with(X_ROT_180)) .with(condition().term(RopeStakeBlock.CONNECTION, Direction.DOWN), stake) - .with(condition().term(RopeStakeBlock.CONNECTION, Direction.NORTH), stake.with(X_ROT_90)) - .with(condition().term(RopeStakeBlock.CONNECTION, Direction.EAST), stake.with(X_ROT_90).with(Y_ROT_90)) - .with(condition().term(RopeStakeBlock.CONNECTION, Direction.SOUTH), stake.with(X_ROT_90).with(Y_ROT_180)) - .with(condition().term(RopeStakeBlock.CONNECTION, Direction.WEST), stake.with(X_ROT_90).with(Y_ROT_270)) + .with(condition().term(RopeStakeBlock.CONNECTION, Direction.NORTH), stake.with(X_ROT_90).with(Y_ROT_180)) + .with(condition().term(RopeStakeBlock.CONNECTION, Direction.EAST), stake.with(X_ROT_90).with(Y_ROT_270)) + .with(condition().term(RopeStakeBlock.CONNECTION, Direction.SOUTH), stake.with(X_ROT_90)) + .with(condition().term(RopeStakeBlock.CONNECTION, Direction.WEST), stake.with(X_ROT_90).with(Y_ROT_90)) .with(condition().term(RopeStakeBlock.CONNECTION, Direction.UP), knot) .with(condition().term(RopeStakeBlock.CONNECTION, Direction.DOWN), knot) - .with(condition().term(RopeStakeBlock.CONNECTION, Direction.NORTH), knot.with(X_ROT_90)) - .with(condition().term(RopeStakeBlock.CONNECTION, Direction.EAST), knot.with(X_ROT_90).with(Y_ROT_90)) - .with(condition().term(RopeStakeBlock.CONNECTION, Direction.SOUTH), knot.with(X_ROT_90).with(Y_ROT_180)) - .with(condition().term(RopeStakeBlock.CONNECTION, Direction.WEST), knot.with(X_ROT_90).with(Y_ROT_270)) + .with(condition().term(RopeStakeBlock.CONNECTION, Direction.NORTH), knot.with(X_ROT_90).with(Y_ROT_180)) + .with(condition().term(RopeStakeBlock.CONNECTION, Direction.EAST), knot.with(X_ROT_90).with(Y_ROT_270)) + .with(condition().term(RopeStakeBlock.CONNECTION, Direction.SOUTH), knot.with(X_ROT_90)) + .with(condition().term(RopeStakeBlock.CONNECTION, Direction.WEST), knot.with(X_ROT_90).with(Y_ROT_90)) .with(condition().term(RopeStakeBlock.CONNECTION, Direction.UP).term(RopeStakeBlock.SPOOL, AetherIIBlockStateProperties.StakeSpoolState.CENTER), spoolMiddle) .with(condition().term(RopeStakeBlock.CONNECTION, Direction.DOWN).term(RopeStakeBlock.SPOOL, AetherIIBlockStateProperties.StakeSpoolState.CENTER), spoolMiddle) - .with(condition().term(RopeStakeBlock.CONNECTION, Direction.NORTH).term(RopeStakeBlock.SPOOL, AetherIIBlockStateProperties.StakeSpoolState.CENTER), spoolMiddle.with(X_ROT_90)) - .with(condition().term(RopeStakeBlock.CONNECTION, Direction.EAST).term(RopeStakeBlock.SPOOL, AetherIIBlockStateProperties.StakeSpoolState.CENTER), spoolMiddle.with(X_ROT_90).with(Y_ROT_90)) - .with(condition().term(RopeStakeBlock.CONNECTION, Direction.SOUTH).term(RopeStakeBlock.SPOOL, AetherIIBlockStateProperties.StakeSpoolState.CENTER), spoolMiddle.with(X_ROT_90).with(Y_ROT_180)) - .with(condition().term(RopeStakeBlock.CONNECTION, Direction.WEST).term(RopeStakeBlock.SPOOL, AetherIIBlockStateProperties.StakeSpoolState.CENTER), spoolMiddle.with(X_ROT_90).with(Y_ROT_270)) + .with(condition().term(RopeStakeBlock.CONNECTION, Direction.NORTH).term(RopeStakeBlock.SPOOL, AetherIIBlockStateProperties.StakeSpoolState.CENTER), spoolMiddle.with(X_ROT_90).with(Y_ROT_180)) + .with(condition().term(RopeStakeBlock.CONNECTION, Direction.EAST).term(RopeStakeBlock.SPOOL, AetherIIBlockStateProperties.StakeSpoolState.CENTER), spoolMiddle.with(X_ROT_90).with(Y_ROT_270)) + .with(condition().term(RopeStakeBlock.CONNECTION, Direction.SOUTH).term(RopeStakeBlock.SPOOL, AetherIIBlockStateProperties.StakeSpoolState.CENTER), spoolMiddle.with(X_ROT_90)) + .with(condition().term(RopeStakeBlock.CONNECTION, Direction.WEST).term(RopeStakeBlock.SPOOL, AetherIIBlockStateProperties.StakeSpoolState.CENTER), spoolMiddle.with(X_ROT_90).with(Y_ROT_90)) - .with(condition().term(RopeStakeBlock.CONNECTION, Direction.UP).term(RopeStakeBlock.SPOOL, AetherIIBlockStateProperties.StakeSpoolState.FLOOR, AetherIIBlockStateProperties.StakeSpoolState.NONE), connection) + .with(condition().term(RopeStakeBlock.CONNECTION, Direction.UP).term(RopeStakeBlock.SPOOL, AetherIIBlockStateProperties.StakeSpoolState.FLOOR, AetherIIBlockStateProperties.StakeSpoolState.NONE_CONNECTED), connection) .with(condition().term(RopeStakeBlock.CONNECTION, Direction.DOWN).term(RopeStakeBlock.SPOOL, AetherIIBlockStateProperties.StakeSpoolState.FLOOR), connectionSpoolFloor) - .with(condition().term(RopeStakeBlock.CONNECTION, Direction.NORTH).term(RopeStakeBlock.SPOOL, AetherIIBlockStateProperties.StakeSpoolState.FLOOR, AetherIIBlockStateProperties.StakeSpoolState.NONE), connection) - .with(condition().term(RopeStakeBlock.CONNECTION, Direction.EAST).term(RopeStakeBlock.SPOOL, AetherIIBlockStateProperties.StakeSpoolState.FLOOR, AetherIIBlockStateProperties.StakeSpoolState.NONE), connection) - .with(condition().term(RopeStakeBlock.CONNECTION, Direction.SOUTH).term(RopeStakeBlock.SPOOL, AetherIIBlockStateProperties.StakeSpoolState.FLOOR, AetherIIBlockStateProperties.StakeSpoolState.NONE), connection) - .with(condition().term(RopeStakeBlock.CONNECTION, Direction.WEST).term(RopeStakeBlock.SPOOL, AetherIIBlockStateProperties.StakeSpoolState.FLOOR, AetherIIBlockStateProperties.StakeSpoolState.NONE), connection) + .with(condition().term(RopeStakeBlock.CONNECTION, Direction.NORTH).term(RopeStakeBlock.SPOOL, AetherIIBlockStateProperties.StakeSpoolState.FLOOR, AetherIIBlockStateProperties.StakeSpoolState.NONE_CONNECTED), connection) + .with(condition().term(RopeStakeBlock.CONNECTION, Direction.EAST).term(RopeStakeBlock.SPOOL, AetherIIBlockStateProperties.StakeSpoolState.FLOOR, AetherIIBlockStateProperties.StakeSpoolState.NONE_CONNECTED), connection) + .with(condition().term(RopeStakeBlock.CONNECTION, Direction.SOUTH).term(RopeStakeBlock.SPOOL, AetherIIBlockStateProperties.StakeSpoolState.FLOOR, AetherIIBlockStateProperties.StakeSpoolState.NONE_CONNECTED), connection) + .with(condition().term(RopeStakeBlock.CONNECTION, Direction.WEST).term(RopeStakeBlock.SPOOL, AetherIIBlockStateProperties.StakeSpoolState.FLOOR, AetherIIBlockStateProperties.StakeSpoolState.NONE_CONNECTED), connection) .with(condition().term(RopeStakeBlock.SPOOL, AetherIIBlockStateProperties.StakeSpoolState.FLOOR), spoolFloor); - + this.registerSimpleFlatItemModel(block.asItem()); this.blockStateOutput.accept(model); } diff --git a/src/main/resources/assets/aether_ii/textures/item/climbing_rope_stake.png b/src/main/resources/assets/aether_ii/textures/item/climbing_rope_stake.png new file mode 100644 index 0000000000000000000000000000000000000000..9394715512f62f2c341def34047db57180a4f4ae GIT binary patch literal 2088 zcmah~X;c$e6du3@qbx-P4_X}u1O<|rB$7h{kwy|BLMW?(wv~`fV1#61W*`Bpwy`LJ zSfO%`C}_o25J6PX77-VU3sR{IZq;IyBIp4sTCEoRWWuXEEsbrxApZb^ zR<20KX*dB-Bs4tBS z5>0CbD5}@%S$Zyu)Fq;9KA(?b9F)Uh0tS;x*U)kUQ$x9$BnC9ZIHk}LTACm=ut`&% zK&H|{1OYfaC{7cqVRa2PxO|WZ)P$gH7KXk`#|^}L=qBVXx;BZVNh*od4lUp{7enw{ zh9G_KHZjPx?;^`&|4mn`Ut0!6OVU6h29x?)OfMZ!(dk+ojl?N3Rj0ruX}E@VHD|(< z7lBkQPsBrUO(LBnMA*DHfCYr|&3ThhN~)<6F&YB6<_w#}4r4-u&qLY6P~1BqQ>q2w zgaJ>96%%S)Ljl#HD2Bnf_ke+93aN_%+ZqQ(W?w^f5STF;sRR)B4M-Xo7_K8#L<+#D z$e=l}R1(Nz^LacbhczGriY5TIgeqMurvZzDad=G3mx=MCF-*Ya2-uhx#ui|hS=r16 zXF(~a<^RVw?P%B^Sjc38V1lAaUAlQ{V4FwbO9w^+!xX~2zhT&1Wr18_%DNEI>PTg( z0#}-y1Gxc|B2~0ruERx%puj>zq*4)}KIt%*g|P-QFhtcS;Xvm7i$VuOLQO~QWla9) zTT%O)39p<@U^g%a&OB%y=ur0ngQ5O|Ye3V{f$oC;QB(^-7GDye9&gnFf@b8U=GBE* ziR{-Lb;}mHe&ATM*H>Iw(r7K3l#_*q=eQZG-1!gfANckJ;*t+aAZ&E_wFCZ}a?w)eK(g{jBo4{9DpncMlY)`qpc=Y+hGky=}}g zdS>{OmJ2)Z75jW6?vOc;v|7h*X2ZOa>>V)`?vHBr9xm#oJ*)n?tf+6C(EM{|V_MU_ zM)>py3&))k6^;Q`j4_cY6P+_WNm!vt!R?SmlOvY<>PMBU1a~+}_FLu7XmP`|{T^57)O(OOT1hMk z`2Bi!cau-S6+7M)?yq*W*+L%2`ir)ph}eIv{&v@D(*-Y;go*dei8uZW>Cy%t literal 0 HcmV?d00001 From 63886fbc2d49dea3815a8779b3ffd9dc17d0f923 Mon Sep 17 00:00:00 2001 From: Hugo Date: Mon, 10 Aug 2026 02:46:40 +0100 Subject: [PATCH 03/27] feat: Climbing Rope recipe and Creative Tab assignment. --- .../recipes/misc/climbing_rope_stake.json | 32 +++++++++++++++++++ .../aether_ii/recipe/climbing_rope_stake.json | 17 ++++++++++ .../data/generators/AetherIIRecipeData.java | 9 ++++++ .../aetherii/item/AetherIICreativeTabs.java | 1 + 4 files changed, 59 insertions(+) create mode 100644 src/generated/resources/data/aether_ii/advancement/recipes/misc/climbing_rope_stake.json create mode 100644 src/generated/resources/data/aether_ii/recipe/climbing_rope_stake.json diff --git a/src/generated/resources/data/aether_ii/advancement/recipes/misc/climbing_rope_stake.json b/src/generated/resources/data/aether_ii/advancement/recipes/misc/climbing_rope_stake.json new file mode 100644 index 0000000000..475c375a34 --- /dev/null +++ b/src/generated/resources/data/aether_ii/advancement/recipes/misc/climbing_rope_stake.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_brettl_rope": { + "conditions": { + "items": [ + { + "items": "aether_ii:brettl_rope" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "aether_ii:climbing_rope_stake" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_brettl_rope" + ] + ], + "rewards": { + "recipes": [ + "aether_ii:climbing_rope_stake" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/aether_ii/recipe/climbing_rope_stake.json b/src/generated/resources/data/aether_ii/recipe/climbing_rope_stake.json new file mode 100644 index 0000000000..6f2adef9b9 --- /dev/null +++ b/src/generated/resources/data/aether_ii/recipe/climbing_rope_stake.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "#": "aether_ii:brettl_rope", + "/": "aether_ii:skyroot_stick" + }, + "pattern": [ + "#/", + "# ", + "# " + ], + "result": { + "count": 4, + "id": "aether_ii:climbing_rope_stake" + } +} \ No newline at end of file diff --git a/src/main/java/com/aetherteam/aetherii/data/generators/AetherIIRecipeData.java b/src/main/java/com/aetherteam/aetherii/data/generators/AetherIIRecipeData.java index e18690a33f..d6a779604e 100644 --- a/src/main/java/com/aetherteam/aetherii/data/generators/AetherIIRecipeData.java +++ b/src/main/java/com/aetherteam/aetherii/data/generators/AetherIIRecipeData.java @@ -27,6 +27,7 @@ import net.minecraft.world.item.component.BundleContents; import net.minecraft.world.item.crafting.CookingBookCategory; import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.item.crafting.ShapedRecipe; import net.minecraft.world.level.block.Blocks; import net.neoforged.neoforge.common.Tags; import net.neoforged.neoforge.common.crafting.DataComponentIngredient; @@ -2381,6 +2382,14 @@ protected void buildRecipes() { .pattern("# ") .unlockedBy("has_brettl_rope", has(AetherIIItems.BRETTL_ROPE)) .save(this.output); + ShapedRecipeBuilder.shaped(getter, RecipeCategory.MISC, AetherIIBlocks.CLIMBING_ROPE_STAKE.get(), 4) + .define('#', AetherIIItems.BRETTL_ROPE) + .define('/', AetherIIItems.SKYROOT_STICK) + .pattern("#/") + .pattern("# ") + .pattern("# ") + .unlockedBy("has_brettl_rope", has(AetherIIItems.BRETTL_ROPE)) + .save(this.output); ShapedRecipeBuilder.shaped(getter, RecipeCategory.MISC, AetherIIItems.MOA_SADDLE.get()) .define('#', AetherIIItems.BEAST_PELT) .define('/', AetherIIItems.CLOUDTWINE) diff --git a/src/main/java/com/aetherteam/aetherii/item/AetherIICreativeTabs.java b/src/main/java/com/aetherteam/aetherii/item/AetherIICreativeTabs.java index 35e064904b..d7bb55df36 100644 --- a/src/main/java/com/aetherteam/aetherii/item/AetherIICreativeTabs.java +++ b/src/main/java/com/aetherteam/aetherii/item/AetherIICreativeTabs.java @@ -707,6 +707,7 @@ public class AetherIICreativeTabs { output.accept(AetherIIItems.SHIFTING_GLASS.get()); output.accept(AetherIIItems.AERBUNNY_BELL.get()); output.accept(AetherIIItems.BEAST_PELT_BUNDLE.get()); + output.accept(AetherIIBlocks.CLIMBING_ROPE_STAKE.get()); output.accept(AetherIIItems.BRETTL_LASSO.get()); output.accept(AetherIIItems.MOA_SADDLE.get()); output.accept(AetherIIItems.MOA_SADDLEBAG.get()); From 1208ff5bae5149373a5a4b18e8eddd39eae57507 Mon Sep 17 00:00:00 2001 From: bconlon Date: Mon, 10 Aug 2026 13:46:14 -0700 Subject: [PATCH 04/27] fix: dont render the insides of connected ropes --- .../com/aetherteam/aetherii/block/utility/RopeBlock.java | 7 ++++++- .../aetherteam/aetherii/block/utility/RopeStakeBlock.java | 5 +++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/aetherteam/aetherii/block/utility/RopeBlock.java b/src/main/java/com/aetherteam/aetherii/block/utility/RopeBlock.java index a728a6e686..995a296aca 100644 --- a/src/main/java/com/aetherteam/aetherii/block/utility/RopeBlock.java +++ b/src/main/java/com/aetherteam/aetherii/block/utility/RopeBlock.java @@ -33,7 +33,7 @@ import java.util.Map; -public class RopeBlock extends Block { //todo merge knot spool and end?. but also have a state for spool+knot +public class RopeBlock extends Block { public static final BooleanProperty KNOT = AetherIIBlockStateProperties.ROPE_KNOT; public static final BooleanProperty SPOOL = AetherIIBlockStateProperties.ROPE_SPOOL; public static final BooleanProperty END = AetherIIBlockStateProperties.ROPE_END; @@ -136,6 +136,11 @@ public VoxelShape getVisualShape(BlockState state, BlockGetter level, BlockPos p return Shapes.empty(); } + @Override + protected boolean skipRendering(BlockState state, BlockState neighborState, Direction direction) { + return neighborState.is(this) || neighborState.is(AetherIIBlocks.CLIMBING_ROPE_STAKE) || super.skipRendering(state, neighborState, direction); + } + @Override protected float getShadeBrightness(BlockState state, BlockGetter level, BlockPos pos) { return 1.0F; diff --git a/src/main/java/com/aetherteam/aetherii/block/utility/RopeStakeBlock.java b/src/main/java/com/aetherteam/aetherii/block/utility/RopeStakeBlock.java index 554891fccb..0c0a3b053b 100644 --- a/src/main/java/com/aetherteam/aetherii/block/utility/RopeStakeBlock.java +++ b/src/main/java/com/aetherteam/aetherii/block/utility/RopeStakeBlock.java @@ -112,6 +112,11 @@ public VoxelShape getVisualShape(BlockState state, BlockGetter level, BlockPos p return Shapes.empty(); } + @Override + protected boolean skipRendering(BlockState state, BlockState neighborState, Direction direction) { + return neighborState.is(this) || neighborState.is(AetherIIBlocks.CLIMBING_ROPE) || super.skipRendering(state, neighborState, direction); + } + @Override protected float getShadeBrightness(BlockState state, BlockGetter level, BlockPos pos) { return 1.0F; From 5622c7e16929991e3f2e611cedc52b56ca3f3cb1 Mon Sep 17 00:00:00 2001 From: Hugo Date: Tue, 11 Aug 2026 02:04:34 +0100 Subject: [PATCH 05/27] refactor: New Skyroot Barrel textures featuring ROPE! --- .../textures/block/skyroot_barrel_bottom.png | Bin 497 -> 2353 bytes .../textures/block/skyroot_barrel_side.png | Bin 533 -> 2163 bytes .../textures/block/skyroot_barrel_top.png | Bin 501 -> 2340 bytes .../textures/block/skyroot_barrel_top_open.png | Bin 491 -> 2303 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/src/main/resources/assets/aether_ii/textures/block/skyroot_barrel_bottom.png b/src/main/resources/assets/aether_ii/textures/block/skyroot_barrel_bottom.png index c6c475dc2a5667f4930a9d65ea3d140386812f62..184e3136655f0b3b5212d8d7529562c47aa3f872 100644 GIT binary patch literal 2353 zcmai0dsq`!7Ef&b>N6mPTE#~k{FDmGBvDc`CQwRv#E?`YHpIslhRjVeb&`q6KmyCQ zwyubXVqk4QXj!dATEzldEA}g(et@8E#iCu>BGgBzTD0n-vZCVNB*>%c?jMuPy}#f2 zopaB*=Omk!sN*M&n>vogVog*e$TjfW-}8(a1wXgB&0-d7w2DkhW|CEjn1QzNae__- ze3!)raTZG&<+9<1HGtu!0uyPKAveE0f^bPfhG-*H0+lTWn8}1pJ6M*fPBLV!F-Qm` zDsr6Eg+T!eU~sO>LRlS{ONMxLG5GG;MiH);!mN=Y$*LvX7}^fF5&Q_g0EryOmD&j- zrjf@D7{iqeF*A$}Ls6&G$#>4@({>Xolt?6~K!l1!JjmcVGOP^l;#nOb9tod@95@Vi z(#DXqmFv;OQ|UBDh9D5<4u}(mL2X-_o$@LZ1{6@h0<4S!74n7Xa6WL6L(y0r1L=Z^ zLp=zj3r5fx()b*@2YHHaGt&(1Fw?fdphmbDgr72m>3+6}3%5OstWy1Ny2Uc$7!D>j z9VTv|2qR*8;=qxVVFRcJIOsIH0mP=m?1gv}=gAAUgmeKaSx&;FI$$+qh*10|Q1=`# zhNfuyGI$9AH1gVbGKVQFxCv-Uf-w(j4eciatLe{xCo(F{a}}0bNq82~kXG^#CPO4* zbeJ36GoiscVBY9dGy#K~?-d+^6frSN?6i@jAm-4-zsXg^#)yRyv6v^~`#iv+VbGQ| zX2@{{vP1%rm?v1s6AF_ALTtf8Oe6_|F9LyA*~^B#L*NYl|M;E`;7SPt#*hpJyenTv zL{p4!o<=c9q+?Bnou(OmDsHy}N{V`#hav}bysIZdQgnnD zDU4F3!V*XaL)$ZkIbH_Vj&$tpK`z&OvoPG?DU1xU*=Zup00{4a;SqeOgElfw+zz5m z@KVW;XrqyYCCuQ?=L`70tPfJ1W&mZLpGb808J@%>MW2e=cjRI71KRoa;9PFXR$)vY3`P=dVE@wUR<1A7Ruo$FB8Rk8XNJ{ zK+b${nEK_BrakMyyVVC*Z7<)|&{+Axdu(mjzCd@uSJO6)@9ysDczfl6E7yAN*ZiZm zCo59ca)qr7{gSv7=SLin@Ls*OXmY($-5&hikJkcvdcazNjbi#T36ox z&3p06@QScAXTqgrU#w8O7Q2kH&x>oq&hIHjgcltb*(!c$7XAD8q9ethg!km1SP{CA z^IlOw5__QBhgSy~nivZbMb|s@fm?RA~0? z?_WAJJ=7X}ymvny_}0Hm3BURG}1>K|5Zyzt}SHh1rRrDOdm-qm+CAuCE} z>l(v1y;!p&dgZH_^;q4iKXhQn+4wP*W^KpOe)gSH8BHhA^fJ?pZMk3;{3#o2OVBx3 zEKY;xVQ&xP1j7nFQplr|Lft^4-28I1e}8ImqF+%_gJ6zQ{A>8^oTa)TzlsaTPVKsY z-g1uVuf1Cp;6Hkj^F+3ynP?(J`ApiC_cxy8jQ`i3@pb((mM`yn*maf)i0f&l`|f5> zR@Z-g|G->kwo^QAaBJ)^}0??`X(^-j`}yAAD8F&0!thdXN~s?(ae8UvaZ{o+zEd zc0K&{Q(Nske_`>b7244$ir_aE)KM6Ti#<9kBt>@csfPl`GT?A0{4A+k3Cf# z!y*e_I8)kC{(1{~dZY84UtRsRSplCfF8rj~e@gV?*rk`Sg61l1_vx~T4ULPwyL#uw zrku%&{lBTJC+_ULl`GgVvu+aE-c_dGa=9j}^2MX(+S6^ph6GZR`E}me*{^5TUn1kS z8a|53l1^W(%KPcxJ8q;`|8k@4er8GKmd;y`f|}-@^lv@1X!?<;tGBOzaQhtH7vIFw n{NCPnv&6c&eRI#O{Qj9iyCWX^hnm_w|8x|wYI((*DIfe7Ajx&B literal 497 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFyz&ooa@Ed~xC zhm}E!k(GfF$npYWX($`yJPk%>us9QtZOF*PAPA(RfHjH>b(|~LcU;>)N1XdYjX#r$Gbr~8MfMjnjpEdR5 zcJ6o}v&PfKF+}3BY@Z?DVFdveb2s<;Z40&u@^4_SbV!mb(Aafl3CI6>rwQGf=_U*_ z4w@gE^T>H}Uc@d{(cQ^*#Tte-8$-(86gJG-bF_>xa>hLmgQ+r3mgW-nPG>~dl?N@7 zT2iDt%qv<_Rn2^IP}++vV@?$>Q_aRA3Wlpe?Vle=OTMIkefVR{an^LB{Ts5 DDd&32 diff --git a/src/main/resources/assets/aether_ii/textures/block/skyroot_barrel_side.png b/src/main/resources/assets/aether_ii/textures/block/skyroot_barrel_side.png index 9001d683178e9c0cba672202f943e7436ea36827..f66c5968bfbb3d609c4e1cd1947dac3365489180 100644 GIT binary patch literal 2163 zcmai0Yfuwc6yDf}78R?5FT^%oe8fVs36B)k1Vw@nAyfeyKp5C$H(@2orr8ZiD1)|k zP?1(Zk%|R6VgV~!AB@yWg$@FWT12bWDk`N6BDFrEqE@jt3Gxtae{8b%e&6}dx#!$- zlJ!d?LdH9}IzbRLUK%Qi1mADlo-w1qXHIUi5Q5&2ku@d1CUG$=_m%Nw`XC~i3{5i-QE3s;%Cr=vKMpSla1xnO zAfP1}jBVCxbTn!f!**R1yxX=Bm~E#pDPlNAwv-)283?v7&zHxC1Dx0*1Fk|NC5!uw z!AcA#GmIWZ5R=KoGkNnUgBlU|`}-q&FT~4>3m9D5qGK>KS4X?sBpezNf>s(xJwsAD zwoMaLP)0@!!vJUZi{r`xZN1T;u`A$nZPZvlWVnYC( zKa9?hs#nl$$OyVVnPMn9nbHpgHO$2TJi-v9`{gEPO#d>nO!nV&t#;TkXeKxnB(A>* z!(w{wfR4842_%xBDWgG21gC=Rx!V(G%L}@cG!vQ_2?>%)gKCIjf$#+|_7z|drJ)Q_ z;1UwR$ZliH94ggfYC=xpO!9!%;C?uvQ@;q|@StJ+( zSYCWDA(!vR6$qmF0@TM3_3`!qFMPgT+0F*NgJTT#e|%d9utm5MWk^Ot*jJ8@2-Gl+ zm1C(PZEb*RFr8Wqo4Gil!i*XQ4xm#k28v=56_~+5Xhevuc{F6dj(zo9NQ4aYA_7s$ zWN0W!GnBzH#Bmhy@o>lX9%QraHw(p-w!(;Ey@A4wN&>eZ7#zWY(v*rZVFn^l4K9@! z4pgZ~P(lmao5$xlvOYjHB@;mA)rmxgp5b{+B4k9=jw275AHdGB2j&tOaLB-f1B-zf zN$9{}G=K>>{rLP+2x5Iof;%vx_7KF$HRiT>)MIWZ52!2S?Q9Scff7^*q$D1+ea(*cXeAI)fD$y(*wjU zU92$9Zv5Wj3HW}0?zG$Ur`Cr>T$*v}LiZ%A#3iAqsASwSQ@Z$cQseyU*j;^xR)vIl z?(sN%+EY|k5f@=zVpfUE3u`gkc;cJNicPoX zb++uAb12K4KgxC2ENQNC;jcB(8^glay;HEYEa|~BD)Ii&z18tQotq#-GVipGJ~)%3 zo6*?24|Dmj?(sPJ#g%=(Ps~owI+AcMe(kjjpKs{-Zc5vl6Wr?=k?wIjX2mvmu7ACz zByhzvRQL0d_`hR`lCvRWw8!Lab$zURCoE0PNNSn-W=+%BBvYYuTH#YNcgK@*5}Y^>bBLhS0)%G(A|@${Bb^{Pn|S3PHvp`=0l-#rQ0I~6z}N| z)lJP|&CE=n{$%g!t|jBoRPAXlcXvu(cyMzbUMf1knk$vM-EJuUVjmQZ75tLl7*l+t z9tvNXK7W(zxf?zq^{i)q^xy%m&QNygyaV^1S<8DP;znC9Djsa{x#7D!&=r}p>~h6# o6)|bGc<24esoh4a;tKL;tTa|NrMxPPWBacl4UUlPS(NnIzX#102LJ#7 literal 533 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFPRM#c0UAxxUP|3ko%iq^5Cff1;|NneW#s`3k zISV`@iy0XB4uLSEsD@VqP*AeOHKHUqKdq!Zu_%=xATcwqM9vp_8juYFOhA*Fz$$|* zEr2YjE<*zYkZg0kzD&`D%lCoIDV{ElArhC96GF-g3(E?HQaHS{!_Bn(gHtogH@?Ci z%v_y0rgP5pNS?9Lopbd-Pw46yyb`Xxk`fZkQ+mS;S&Ud#tza{9IVX~;k*WWZ;ZYge q^Q6Z@i_;b-wQX9GIWu);sw=~48RJ5K^0fdkW7++B$LhzBtf(V zDlJf}RJ6;MBCTKOYOB^@saWc%yA(W#tyTmM_)%R>6|H(?!J@D)3Gz{O_m4^Dz2EQt z?tS;Zd#5;79W|5V$AKVdrZQR)2mXCr&$PdQ->qdv5d=+9kqH`Bqk0q5Qf3~mqcRAd z-E0Lo1WCf}R$QA!uy6)pAT3hl_Y(~WOzNaaa;S>0vdRe~8J$ZL@ww^*ZEluUtV6=X zI1)Ps1k41B!*;XD!eDkO;?~8$yK5UoU^j)$k|G*aEG(yJ0uJSc^7u#?2bRz}Jr<`} zIbsY}QpCuzRt!aLHXF|-M+Xby}1#5oW@|GN^zjK*#e5J2@7Og&9c~NF3@y z0G&U9&XW4)&|Sz=bgPkKDaJ@yM}wN+VibPL5TyIrCU)HVEV4@Vzv*W4gkvylWDZE& zND(H)^uz&^;II;C9Klf8w3dj>0oi-Soj6xsuvpSgm^2C!B$WZxkRk%npTLyofO5)2 z(edCC62Qo9Ht`x(_$>inh5vG(-ATg z>sfi0CeqagmRrU{b-bv2KP9MN&Fo(M_M30@>1 zN|g$WCK;BZ9pfCw6K_v+?CwDrcHb-v*SZQLMXWTX%hnP)_kqC?JSaoySsP9hG6T3& zQbeZLlc0nSSjgk^JXs&5+KdE{d43|%@n?7vlLUP#YR{3!%@1Jb*#mP43^;Uj!hyx; zj3g{zFw$TGQkz~ELeQjq65N5OY7ap{W!Yt|%M`2UHiir3*Q4gnm{F?KwEVbb_R`Xd z1)S1*<)`%ju2{ZH|F2somy<^mYvao=4LGl$>;7?YI}&$vN8k}ztE0-Vsj{=KhiT}q zI)AdKAi1d~k54gOz=u~G= zZ_MLsr_rSIE0Z+o>h+>+$?x3xwSG6R;?s&9mlk)ID9fiUdi0?%;%^&s7nIlStbVX> zRZ@A=??Y#IW~9)G71^8x!DYzi$Q2jr6Jp-DponSyG1mIW@bRzqUTnLS^wkX6jY4w+ zyW*FrdGpPK8!p#|dw*~9Hq^xp-4F1pFG&w3Z=X1Kcx>9&OV(5)e9B0`oaawd-TTW)$;llylvx+|3b+P?nQ&5T0x8|tNhn$?6 zhP>%Z{ad#7_MladeP^5IswzKC-+6cYfe_>BET|^o7xtye@5)r<|iAKGr{AZeoFjIbU}_YCkA8bau{j-k>htimXlL?pL1Be9=>|ykzmKZ{?%+ z^OyP6`9W330vxy1tD+rD-=Qw4;?Q}AsATbG{RSJVIMlH5yS>F7T{9Z;zAagDZ|!iv V8Qbwv3Uq-Ae_%DnJX$AlQ literal 501 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFW)+`fJL(4j;AzGgAej@j7(5A%0!04n1w@Q5sC zVBk9l!i+m6X1@grN|v}rlmzFem6RtIr7{F0X6BXX`MHKDnCcno85#*Qx|aYI?MRLA zO!M^AV&DLBSQ(@kSs56CEH5CIhO$A9)L>)=i!%Y)hKx)MfkOkFc zXkY-6ZQE@Sw&e;V$oEyAE{-7*msR@=xehzM_4 z{tCHcd)ulnm#u7R?5>8{_r7f0dt=vmlc>T=PcCAb~i3;yX)RNwozu5 zLLi19YWP`NB4#3*k^PVzPox8xC@CsO(LgEf-G+Rm)*pAf@B8~bzvp?M=Y5_n zKRz~kJZmxwf}rtgl~N17C%T`pqrm5i;tUA{J*6QMQ<+rFY*bHLc$k4q$9YbR4d4(Y z3w7EseHPBJ({U4FmBZaN^)Q<-$l(;RhOe<+oG1{m z;0(rgTFh1&b;@CnE(+e=+X&3|P?#(^oT`auN01cG7W2eBJ{-bg%P4~p)heR~jKN9{ zXE2NnMG%L>!E=asBxOPbQmGW-3lX7^3m9D5Wo0lY*Gf-wOL#SuIIX7$8$*y*wp$ZR zC+&`^x85!{Sha4SP20-gXF&c~g^P&8J0AYCAFh#LWP{s=ll z7@t6QBahH+86-o}8KiA6s1Ys(;YSQXx*u=i#B7fvYc&5&w^&9TgJvSLLE;9AFe0Xh z4(LRe4M(&%P1-3v9+?fYH_ekccV5tV!ik$xl>|sC4XPoB1(JV(x+j1Uq?x1=z$L_i zk;lfJIaF=IOn3@mU@``^hW2OUR@1)$cVuR}`zj<^32+wSkXGstCWoaGWSAS>W1+!1 zpq}V7qyYpc@(2z=>WGMViZl{tfYI9MaJD)!LL!h#BwQiS>j4xE1-69IrNkJ(67q!- zF8@ugK#<56pkgU1esczR;qyJp9yaJ51IA$g$9H!CTV~Ls48fRj&&t~o3Nzzfd6#Cw z-3F)`vzp|vlWV|@nBC04A#|3DB1vX`Iz~~rS%$cq$4m_9cvcUEWXK3FG7zOkgQ^Ic zAt~1|#|ij5BOQBskj?hoEELnb3nPbZ6lt*Qaf9c;;0RunCXI{(qi}@@Tq-%NFd7L^ zLKj=a+%Wjq) zGF~p5xyATHSKUlvchbIu(sO-#e?u00wPO{m-MxBxm7>|Taq{u?t@}Ia`reHv>pDM7 zIlfJ|XLI0gY17A1;rCn4t*^hDpP9LMUhePPE8=2{UN7BS9Vm;fWubc;H}#**d~xMg z*2c^WSklbk3xW&z&(Cr=6Ta1H8eUvlv~+at+wpzpf1bn(Mb}ezk6;n`xrbUg*W&*E z{V0-rGAcQBUhKP)l_`sET&(?qSGKNf^|@Et3e=@zr~Xwa3jg%|oPg5(n?Ac;J}bHO zc=!FEHl^#Rq%u1zAh;M_9vOD3HZd;dlrpaISiJ4tgX+qyXU=vdSB_I$`p8nxgqkrF zMX}I#E$?$<+x3>_ki6>8b~L7>9sJXeX}p`e6xqkkV4awL=UMPm_KZ!Xqan!esQd9* zHN!6uRH#X&Tf-(UocndkjHbDPldi4^m=ZG~_tOO@bHBNLD(k`K4iW3` zig`KLE9Bn<#Eg=c1{HFH8>%*}GJkE*-N1I)MAxufSNBb$X~(*Cy*({|b+o9rR2*j4 zZsN9X*b|lD)7R5ak~YDHB^7G8ZtJi2`mP*V(>&j&Pkcq?6BgqGeIR)0gHr}*^SOz+ z?S9>yEkWXqOXjb9UlUd3x_hsrzp*Flor;^=?Dtn-1HY|yoJw@@_pOIDN!Qy9TX|(r` z3pzPFN*0B_b^gbw=MNfJTC3msB_y>0^MzJ#8#~om*^ZO#X$h4({UQBseQ2TJ;H~XJ zmgECGk-B7U;nf3LZGo))(%nxkkNGXB?g-SvJa_AK_?l&f=?VLq*j#9i`SKp=l%i3u ze|%A;Xoy~u_n@ddvRB%Dr{)(sndhiGv{YSkI=m=aQA20vvdipD~%P*;VZ`aW)+`fJL(4j;AzGgAej@j7(7G|otIx-sS;%*i9 z*8|ma7I;J!GcfQS0%1l`4X*~Epk#?_L`iUdT1k0gQ7S_~VrE{6o}X)of~lUNo}rO2 zqk9QZ(T>yz&ooa@Ed~xChm}E!k(GfF$npYWX($`yS`9{Kus9QtZOF*PAPA(RfHX0a0%@e Date: Tue, 11 Aug 2026 02:19:56 +0100 Subject: [PATCH 06/27] improv: Tweaked Climbing Rope model texture and Skyroot Barrel texture. --- .../textures/block/climbing_rope.png | Bin 519 -> 2342 bytes .../textures/block/skyroot_barrel_top.png | Bin 2340 -> 2372 bytes .../block/skyroot_barrel_top_open.png | Bin 2303 -> 2314 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/src/main/resources/assets/aether_ii/textures/block/climbing_rope.png b/src/main/resources/assets/aether_ii/textures/block/climbing_rope.png index 4da62b9b98f2fe27de2de5e3a4f51e3fca7fa34a..0026bc7d662a384248d60d7dfa6f9be4aed88815 100644 GIT binary patch literal 2342 zcmai0dsGu=79S65#NewXiqfKSTDn?ICJzW@nm{4pkxGCD2;f%BkW7++Bok*QBw$^Y z3JR{v5zz(ZWv%G0E@v%|U*}iNDf~G5@6>9K3%lUY+z~_QHk1zNn=CZykijlq6udi+5t!>zVKQZKiYlHfCn=m8$PeTT;1D)fO6l~dS`j&F z3?vzBWEd-oAa=W*Zx{1P%76%igM$%)2oZ^RK!ZnTTNup2v(T?ODcl?ioYqo=l_5wA z*U5>clQu>M!vN=wk~4&UoZUi?rVk2%I1xn17a&in>$GE`SZ$Qa6^KrY;3nLRTNoPX z3n%E~4&nv$PUIPStC3_#+DKZ*yi5pb41UHCl>7N64$S&IWtHl;)y?J!Y0ykW7AV|k z6DGv;*a4lGZN(8aPLnoDi$`REa=hlMoU@Lo(u^7K7~EoDj51g#c?w7-bWfig`A~E;|T|DN>LD?Pc&d1i((v1eE}#ZO(c~7#sCLK zE?;APKwX%M)B#BR6r_~P<0(>4m;gqrqr$n$2)RTUERpa;d^Zhf8VYO)eYOH)fR;!g zlJEp?@r1%efe;N0L<0ksfER(l#q81sv!lZp?EmRICx9!}X;Fq?Ot?#OPehoBaZ7H| zL^#I)HDMNm40iBzxE`~a7&t_0BFyQ8#qa?|T5&1joE;M}O5>6q^GJ~iPNX16l?sg} zXojS+pYWT2ubSxBHG*8O>tdmp*4bzoY^6w@O^fSX`GO4GC{5}aJ4WGQ25_fjaF||C zfGd&B74rprchSdG?M58Xytt0YlQ}$&Ns2rZwL9e})(5b2pMkXm_8T&`;D9i;B5@1Y zixgOZ?E%XwA!yQi0$hP-S`R^sw%WE{SfY53b1qaY|2B%_<+WLv^6B}amltm?o6Fw( zQ%S4-`?8=t`m;Ar1`$V-jwO`z4%hb~X$KB&ht)@S_#X+okX`B9UVim>KizV#^7E7Z zxykMOQ|mr{2nat?#IM@I{8t zwiisW~z3-AjtNj`Q)>Umi6as=55dP0b;%utyh!akw`I8DTkm@r zzS0F@Yo_hw@78~H>&k_YjSbZYJCawN{&@z|aX&u~ImR=xFZvI?1b)e;TBB2G2=elF zK9iuG<#R!Y?kE*uiEnMmD{kGaevfl@EwaHne-X3dMz!Y&>tY2G<|D5w-oHWf**~^k zk^H@|`caz3qi)8(IgPf`ye0DJw%Z*^Qx|XYIPoJZE=P0V>c_YJX73^CzRJ~I_q*=- z^$!o98X3AXVn|8UJ0%mwj@Nt2g9wa|bd{ zP-)(uYKls&Q#H#frF?O6VewxKwVYdjetnnnv+W*p-t5aCc(8QMg40=(Q}(ZG^O(7= zd$_Rn)mc8dZ5~BgQR=}#PV=j~e_bI}kUpYq}gdFR>#c{mfouR5sOz^QB=38kbll&WHdOI;Luc2H`CkTz z=ET*AmmEG46yUq|U-w#$Oc%E*hU>yVm=QGC)sHN=%V)8wLQZwldvA0uoQ#~?Gv!eE zkiGMC`Q5Abfgs;`UfMJDnp$z+f4XHWvK`608fAWc*9R}1s;a0mZfk0k_QcjN?}0|X zrX`yq_do%@TPhAzR8-x_V|(VcVLuH0(iK;~Tt)hTFq67^R#a5)}RKDLS-g~=TS05ys>3^2te4m_M-Uxrh@Z%8E zxw~pjRJ~r8MhL;AslrU4xR z0U$t$$U^E32}wRF=j0eG4`>4lO{$bF&wq5Qu}B;Q8fAYPCmVEpS7e_!QXW zI8`>&Be`5}OEC`905|ay5@Q0U1LF8fPoQ6EgmG9RkCJdYB000I_L_t&o0F9VGUXEP44*&oF07*qoM6N<$f{<+9hX4Qo diff --git a/src/main/resources/assets/aether_ii/textures/block/skyroot_barrel_top.png b/src/main/resources/assets/aether_ii/textures/block/skyroot_barrel_top.png index 192c30dc543a5420f0707a9c2c6d88a0eb2c04b2..e6aa4ae7ff215ef3c10932d9e838bf9553f04425 100644 GIT binary patch delta 609 zcmV-n0-pV(62ua)xB~|=Ix#akF*%dJ11SeGIx#akF*&pE0}=rTGCDCcIx#tu2nB8g zYRAwYvw8)j0e=DzNkl7`Hf&c&j zI2QmAbKwUZ0K!>VDy(NLhIo`nZvfDBYA_9B#Bw532}yA*T5qX+;@i;V^j0K`0!X$__k zf||PxrMcTk+497MO4tAK6aYp8N0B4|kZftnFn8*$vLr>3q?kwYIR(qvr7U@WJ-$)< zJx6|8CSA?8qzZTH`CiDmsMWWW{TEMSF48_=LVwRrFWjj|DDAYntCW}vLaEB5NKQVL zR;$)&ceSjx|Mao!(qugO;|6}fM*}BQeXue5H4!4YT`cCwd@)ZjM&)uopEu`8;(K8j zMCm%I8BqJZVK@u5tmX&Y&EA#63@L|2mXW`!SokD3HAvFE%mdeHZ v)hbQPHh+E}RyK;2dw1*2?U^6kF6Ms$mx}@{G?F)>00000NkvXXu0mjfb!r!Z delta 577 zcmV-H0>1sk5~LEaxB~|=5XUEX$NnI9+Yr)TNkbGBN!uVvE!0{N`s#ln z{WAprDPMf`NguQgr9uc+;*o@0dZgziac7rAd>A~=eOP8^zWbS(-6>sMyiR6GZKqbL zs(2FL&F&k`dZnrW;Cuf^yL&ht#|HHxTajIQ`|iz$_kSM&An*kj3;={+0001p761%d z09Y)MG;UR~Ec;DrgVy(Dpvs&xwY6o9@jTa{<$}3R$=dbHS4Uo;%7MS+f(gM4+CY`L zkiE-(;EP5x;~v~wXz zTEvrcI*uJ80RXY-NY~PNR%8*yA(BB&;T&A-4Yel!-R#~QMKQHcNsHP3QEfWU7TF5X zwmU87?EIuqD5FnE=b4c5b}%ebs5TF^rq54i34eL_4<7U``@vxN_~}D>rDT>MT7z~v zj@^U(X7qFFIwga4v)=sKtT|`f+ZDCtZ`SKYwpuNzNxN90=YltiCNx`tFYL_t(2k!4cNZqq;*9IrQOKNJyob`t0)yMEpPy?oRD|| z)W<;LeK>ICHMoGp0U=bHC{EoZ_3t{d9S)zegz{+*yQ`Vm`F1|z^73^s3EG{u>pA|& zznRQ>d%LdZ0Qm9!=kdwWcPB?QHX}U%qKHfFKC*U$vStij{5Ik1zVX<=8+#R{-w9zl5SFIXAZ)CyEsT=F^bX zWkaKHr?a9cHGy*zKom#%9RSSroVpaG&ACY+(x$~2y9>i8R&^<^uSTY0b16j_rb&`A z#z;(v8h?PQstm&bR*W%G6Q0)^ob}o1(-Uog{BUkoRRv(pH?+y|(C6c!f6w#=lxkH~ zE868MW4X%opKNkA%Fz6q$;|Xz3qYFY%jJ@^*VeIa1ArlFLI{35IAG6To#$!+V9RkR z-AzA?F~G1byVaDrTF6F&sVt*hh$E#ain1t5>TVkV%>jTYR^y@1=hKi5I{$kekQOBy zOagv=HA>RNwrt|);iJjJzr(kG@Wg!c_GN!?sM6%wi?dF5TL>||op*P49v$v`ZTI)D nQEzXj_wd2s^eBzuRaO20jU(s3{%-pu00000NkvXXu0mjf@%{_! delta 538 zcmV+#0_FXR68{mfxB~|3YTG~%eOj$oE6Z9N6Y7u{A4(5~m|)X}wDi<#|DxnG z3jL{GdhMw_v=~YPJ(M1dEiA{eot12@WLfTEuy8Z%VTO6{@n&bNo16FZ+5F_$Nu#O4 zAiSR~+nuvUQvvw%`)_Y>F`a~|Ng}4=|}-UN&x_XF&Ti=WB{Vr z5Qg6l?~hNShvG>{06|Hd2c5D6o~sr4(9k*6R&pjL1S%02D=G zSr)KojDLxWP^#L$x@5233`zs!hjY6q3IGSbRhpbmLOz{@PfQ;{DfUINrz|xIOHES# z$uZ|Btdf5}TiVS=6~JbbZns;~K3Kp>2qAc{-(_##T~n{F6aZtgV?T^B!1Agd zZC1K2Gf9$~jOw~lQi?p^<@t{02H;h_!vNWI5@Yh!LYIq-VpF!uAT0n$48fk|BvrQ_c`zNyV7-Uhj+cfg-MdtLXSs5yK{DW-ZDw@^ZT!Mr{zfZ^t|=s c+b|5me=}g-H3zO;JOBUy07*qoM6N<$f>(n5ssI20 From 31c7778310e55135d20c1be1b6022166d37c8306 Mon Sep 17 00:00:00 2001 From: bconlon Date: Tue, 11 Aug 2026 11:35:09 -0700 Subject: [PATCH 07/27] feat: progress on another rope iteration --- .../{climbing_rope.json => brettl_rope.json} | 22 +- ...rope_stake.json => brettl_rope_stake.json} | 50 ++-- ...mbing_rope.json => brettl_rope_stake.json} | 2 +- .../aether_ii/items/climbing_rope_stake.json | 6 - .../assets/aether_ii/lang/en_us.json | 4 +- ...rope_stake.json => brettl_rope_stake.json} | 2 +- ...rope_stake.json => brettl_rope_stake.json} | 4 +- .../loot_table/blocks/brettl_rope.json | 4 + .../loot_table/blocks/brettl_rope_stake.json | 4 + .../loot_table/blocks/climbing_rope.json | 4 - .../blocks/climbing_rope_stake.json | 4 - ...rope_stake.json => brettl_rope_stake.json} | 2 +- .../block/AetherIIBlockStateProperties.java | 14 +- .../aetherii/block/AetherIIBlocks.java | 4 +- .../aetherii/block/utility/RopeBlock.java | 214 +++++++++++++----- .../block/utility/RopeStakeBlock.java | 106 +++++---- .../data/generators/AetherIILanguageData.java | 4 +- .../data/generators/AetherIIRecipeData.java | 15 +- .../generators/loot/AetherIIBlockLoot.java | 4 +- .../generators/loot/AetherIIChestLoot.java | 2 +- .../models/AetherIIBlockModels.java | 6 +- .../generators/models/AetherIIItemModels.java | 1 - .../AetherIIBlockModelSubProvider.java | 34 ++- .../aetherii/item/AetherIICreativeTabs.java | 5 +- .../aetherii/item/AetherIIItems.java | 1 - ...json => brettl_rope_connection_lower.json} | 0 ...> brettl_rope_connection_spool_floor.json} | 0 ...json => brettl_rope_connection_upper.json} | 0 ...g_rope_fray.json => brettl_rope_fray.json} | 0 ...g_rope_knot.json => brettl_rope_knot.json} | 0 ...loor.json => brettl_rope_spool_floor.json} | 0 ...dle.json => brettl_rope_spool_middle.json} | 0 ...rope_stake.json => brettl_rope_stake.json} | 0 ...hort.json => brettl_rope_stake_short.json} | 0 ...g_rope_stake.png => brettl_rope_stake.png} | Bin 35 files changed, 313 insertions(+), 205 deletions(-) rename src/generated/resources/assets/aether_ii/blockstates/{climbing_rope.json => brettl_rope.json} (57%) rename src/generated/resources/assets/aether_ii/blockstates/{climbing_rope_stake.json => brettl_rope_stake.json} (67%) rename src/generated/resources/assets/aether_ii/items/{climbing_rope.json => brettl_rope_stake.json} (51%) delete mode 100644 src/generated/resources/assets/aether_ii/items/climbing_rope_stake.json rename src/generated/resources/assets/aether_ii/models/item/{climbing_rope_stake.json => brettl_rope_stake.json} (55%) rename src/generated/resources/data/aether_ii/advancement/recipes/misc/{climbing_rope_stake.json => brettl_rope_stake.json} (85%) create mode 100644 src/generated/resources/data/aether_ii/loot_table/blocks/brettl_rope.json create mode 100644 src/generated/resources/data/aether_ii/loot_table/blocks/brettl_rope_stake.json delete mode 100644 src/generated/resources/data/aether_ii/loot_table/blocks/climbing_rope.json delete mode 100644 src/generated/resources/data/aether_ii/loot_table/blocks/climbing_rope_stake.json rename src/generated/resources/data/aether_ii/recipe/{climbing_rope_stake.json => brettl_rope_stake.json} (84%) rename src/main/resources/assets/aether_ii/models/block/{climbing_rope_connection_lower.json => brettl_rope_connection_lower.json} (100%) rename src/main/resources/assets/aether_ii/models/block/{climbing_rope_connection_spool_floor.json => brettl_rope_connection_spool_floor.json} (100%) rename src/main/resources/assets/aether_ii/models/block/{climbing_rope_connection_upper.json => brettl_rope_connection_upper.json} (100%) rename src/main/resources/assets/aether_ii/models/block/{climbing_rope_fray.json => brettl_rope_fray.json} (100%) rename src/main/resources/assets/aether_ii/models/block/{climbing_rope_knot.json => brettl_rope_knot.json} (100%) rename src/main/resources/assets/aether_ii/models/block/{climbing_rope_spool_floor.json => brettl_rope_spool_floor.json} (100%) rename src/main/resources/assets/aether_ii/models/block/{climbing_rope_spool_middle.json => brettl_rope_spool_middle.json} (100%) rename src/main/resources/assets/aether_ii/models/block/{climbing_rope_stake.json => brettl_rope_stake.json} (100%) rename src/main/resources/assets/aether_ii/models/block/{climbing_rope_stake_short.json => brettl_rope_stake_short.json} (100%) rename src/main/resources/assets/aether_ii/textures/item/{climbing_rope_stake.png => brettl_rope_stake.png} (100%) diff --git a/src/generated/resources/assets/aether_ii/blockstates/climbing_rope.json b/src/generated/resources/assets/aether_ii/blockstates/brettl_rope.json similarity index 57% rename from src/generated/resources/assets/aether_ii/blockstates/climbing_rope.json rename to src/generated/resources/assets/aether_ii/blockstates/brettl_rope.json index 94a1acc824..f6739a7b23 100644 --- a/src/generated/resources/assets/aether_ii/blockstates/climbing_rope.json +++ b/src/generated/resources/assets/aether_ii/blockstates/brettl_rope.json @@ -2,7 +2,7 @@ "multipart": [ { "apply": { - "model": "aether_ii:block/climbing_rope_knot" + "model": "aether_ii:block/brettl_rope_knot" }, "when": { "rope_knot": "true" @@ -10,23 +10,23 @@ }, { "apply": { - "model": "aether_ii:block/climbing_rope_spool_floor" + "model": "aether_ii:block/brettl_rope_spool_floor" }, "when": { - "rope_spool": "true" + "rope_end": "spool" } }, { "apply": { - "model": "aether_ii:block/climbing_rope_fray" + "model": "aether_ii:block/brettl_rope_fray" }, "when": { - "rope_end": "true" + "rope_end": "end" } }, { "apply": { - "model": "aether_ii:block/climbing_rope_connection_upper" + "model": "aether_ii:block/brettl_rope_connection_upper" }, "when": { "up": "true" @@ -34,7 +34,7 @@ }, { "apply": { - "model": "aether_ii:block/climbing_rope_connection_lower" + "model": "aether_ii:block/brettl_rope_connection_lower" }, "when": { "down": "true" @@ -42,7 +42,7 @@ }, { "apply": { - "model": "aether_ii:block/climbing_rope_connection_upper", + "model": "aether_ii:block/brettl_rope_connection_upper", "x": 90 }, "when": { @@ -51,7 +51,7 @@ }, { "apply": { - "model": "aether_ii:block/climbing_rope_connection_upper", + "model": "aether_ii:block/brettl_rope_connection_upper", "x": 90, "y": 90 }, @@ -61,7 +61,7 @@ }, { "apply": { - "model": "aether_ii:block/climbing_rope_connection_lower", + "model": "aether_ii:block/brettl_rope_connection_lower", "x": 90 }, "when": { @@ -70,7 +70,7 @@ }, { "apply": { - "model": "aether_ii:block/climbing_rope_connection_lower", + "model": "aether_ii:block/brettl_rope_connection_lower", "x": 90, "y": 90 }, diff --git a/src/generated/resources/assets/aether_ii/blockstates/climbing_rope_stake.json b/src/generated/resources/assets/aether_ii/blockstates/brettl_rope_stake.json similarity index 67% rename from src/generated/resources/assets/aether_ii/blockstates/climbing_rope_stake.json rename to src/generated/resources/assets/aether_ii/blockstates/brettl_rope_stake.json index 7a6405fdc9..7ec06a0152 100644 --- a/src/generated/resources/assets/aether_ii/blockstates/climbing_rope_stake.json +++ b/src/generated/resources/assets/aether_ii/blockstates/brettl_rope_stake.json @@ -2,7 +2,7 @@ "multipart": [ { "apply": { - "model": "aether_ii:block/climbing_rope_stake_short", + "model": "aether_ii:block/brettl_rope_stake_short", "x": 180 }, "when": { @@ -11,7 +11,7 @@ }, { "apply": { - "model": "aether_ii:block/climbing_rope_stake" + "model": "aether_ii:block/brettl_rope_stake" }, "when": { "facing": "down" @@ -19,7 +19,7 @@ }, { "apply": { - "model": "aether_ii:block/climbing_rope_stake", + "model": "aether_ii:block/brettl_rope_stake", "x": 90, "y": 180 }, @@ -29,7 +29,7 @@ }, { "apply": { - "model": "aether_ii:block/climbing_rope_stake", + "model": "aether_ii:block/brettl_rope_stake", "x": 90, "y": 270 }, @@ -39,7 +39,7 @@ }, { "apply": { - "model": "aether_ii:block/climbing_rope_stake", + "model": "aether_ii:block/brettl_rope_stake", "x": 90 }, "when": { @@ -48,7 +48,7 @@ }, { "apply": { - "model": "aether_ii:block/climbing_rope_stake", + "model": "aether_ii:block/brettl_rope_stake", "x": 90, "y": 90 }, @@ -58,7 +58,7 @@ }, { "apply": { - "model": "aether_ii:block/climbing_rope_knot" + "model": "aether_ii:block/brettl_rope_knot" }, "when": { "facing": "up" @@ -66,7 +66,7 @@ }, { "apply": { - "model": "aether_ii:block/climbing_rope_knot" + "model": "aether_ii:block/brettl_rope_knot" }, "when": { "facing": "down" @@ -74,7 +74,7 @@ }, { "apply": { - "model": "aether_ii:block/climbing_rope_knot", + "model": "aether_ii:block/brettl_rope_knot", "x": 90, "y": 180 }, @@ -84,7 +84,7 @@ }, { "apply": { - "model": "aether_ii:block/climbing_rope_knot", + "model": "aether_ii:block/brettl_rope_knot", "x": 90, "y": 270 }, @@ -94,7 +94,7 @@ }, { "apply": { - "model": "aether_ii:block/climbing_rope_knot", + "model": "aether_ii:block/brettl_rope_knot", "x": 90 }, "when": { @@ -103,7 +103,7 @@ }, { "apply": { - "model": "aether_ii:block/climbing_rope_knot", + "model": "aether_ii:block/brettl_rope_knot", "x": 90, "y": 90 }, @@ -113,7 +113,7 @@ }, { "apply": { - "model": "aether_ii:block/climbing_rope_spool_middle" + "model": "aether_ii:block/brettl_rope_spool_middle" }, "when": { "facing": "up", @@ -122,7 +122,7 @@ }, { "apply": { - "model": "aether_ii:block/climbing_rope_spool_middle" + "model": "aether_ii:block/brettl_rope_spool_middle" }, "when": { "facing": "down", @@ -131,7 +131,7 @@ }, { "apply": { - "model": "aether_ii:block/climbing_rope_spool_middle", + "model": "aether_ii:block/brettl_rope_spool_middle", "x": 90, "y": 180 }, @@ -142,7 +142,7 @@ }, { "apply": { - "model": "aether_ii:block/climbing_rope_spool_middle", + "model": "aether_ii:block/brettl_rope_spool_middle", "x": 90, "y": 270 }, @@ -153,7 +153,7 @@ }, { "apply": { - "model": "aether_ii:block/climbing_rope_spool_middle", + "model": "aether_ii:block/brettl_rope_spool_middle", "x": 90 }, "when": { @@ -163,7 +163,7 @@ }, { "apply": { - "model": "aether_ii:block/climbing_rope_spool_middle", + "model": "aether_ii:block/brettl_rope_spool_middle", "x": 90, "y": 90 }, @@ -174,7 +174,7 @@ }, { "apply": { - "model": "aether_ii:block/climbing_rope_connection_lower" + "model": "aether_ii:block/brettl_rope_connection_lower" }, "when": { "facing": "up", @@ -183,7 +183,7 @@ }, { "apply": { - "model": "aether_ii:block/climbing_rope_connection_spool_floor" + "model": "aether_ii:block/brettl_rope_connection_spool_floor" }, "when": { "facing": "down", @@ -192,7 +192,7 @@ }, { "apply": { - "model": "aether_ii:block/climbing_rope_connection_lower" + "model": "aether_ii:block/brettl_rope_connection_lower" }, "when": { "facing": "north", @@ -201,7 +201,7 @@ }, { "apply": { - "model": "aether_ii:block/climbing_rope_connection_lower" + "model": "aether_ii:block/brettl_rope_connection_lower" }, "when": { "facing": "east", @@ -210,7 +210,7 @@ }, { "apply": { - "model": "aether_ii:block/climbing_rope_connection_lower" + "model": "aether_ii:block/brettl_rope_connection_lower" }, "when": { "facing": "south", @@ -219,7 +219,7 @@ }, { "apply": { - "model": "aether_ii:block/climbing_rope_connection_lower" + "model": "aether_ii:block/brettl_rope_connection_lower" }, "when": { "facing": "west", @@ -228,7 +228,7 @@ }, { "apply": { - "model": "aether_ii:block/climbing_rope_spool_floor" + "model": "aether_ii:block/brettl_rope_spool_floor" }, "when": { "stake_spool": "floor" diff --git a/src/generated/resources/assets/aether_ii/items/climbing_rope.json b/src/generated/resources/assets/aether_ii/items/brettl_rope_stake.json similarity index 51% rename from src/generated/resources/assets/aether_ii/items/climbing_rope.json rename to src/generated/resources/assets/aether_ii/items/brettl_rope_stake.json index 544803c192..049ccd03c2 100644 --- a/src/generated/resources/assets/aether_ii/items/climbing_rope.json +++ b/src/generated/resources/assets/aether_ii/items/brettl_rope_stake.json @@ -1,6 +1,6 @@ { "model": { "type": "minecraft:model", - "model": "aether_ii:block/climbing_rope" + "model": "aether_ii:item/brettl_rope_stake" } } \ No newline at end of file diff --git a/src/generated/resources/assets/aether_ii/items/climbing_rope_stake.json b/src/generated/resources/assets/aether_ii/items/climbing_rope_stake.json deleted file mode 100644 index 2fe1c4545d..0000000000 --- a/src/generated/resources/assets/aether_ii/items/climbing_rope_stake.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "model": { - "type": "minecraft:model", - "model": "aether_ii:item/climbing_rope_stake" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/aether_ii/lang/en_us.json b/src/generated/resources/assets/aether_ii/lang/en_us.json index d2f570437a..a983b11075 100644 --- a/src/generated/resources/assets/aether_ii/lang/en_us.json +++ b/src/generated/resources/assets/aether_ii/lang/en_us.json @@ -425,6 +425,8 @@ "block.aether_ii.brettl_grass_bundle": "Brettl Grass Bundle", "block.aether_ii.brettl_plant": "Brettl Plant", "block.aether_ii.brettl_plant_tip": "Brettl Plant Tip", + "block.aether_ii.brettl_rope": "Brettl Rope", + "block.aether_ii.brettl_rope_stake": "Climbing Rope", "block.aether_ii.brexallen_vase": "Brexallen Vase", "block.aether_ii.brown_arilum_lantern": "Brown Arilum Lantern", "block.aether_ii.brown_cloudwool": "Brown Cloudwool", @@ -435,7 +437,6 @@ "block.aether_ii.bryalinn_moss_flowers": "Bryalinn Moss Flowers", "block.aether_ii.bryalinn_moss_vines": "Bryalinn Moss Vines", "block.aether_ii.carrion_cutting": "Carrion Cutting", - "block.aether_ii.climbing_rope_stake": "Climbing Rope", "block.aether_ii.cloudwool": "Cloudwool", "block.aether_ii.cloudwool_bedroll": "Cloudwool Bedroll", "block.aether_ii.cloudwool_carpet": "Cloudwool Carpet", @@ -1180,7 +1181,6 @@ "item.aether_ii.blueberry_moa_feed": "Blueberry Moa Feed", "item.aether_ii.brettl_cane": "Brettl Cane", "item.aether_ii.brettl_grass": "Brettl Grass", - "item.aether_ii.brettl_rope": "Brettl Rope", "item.aether_ii.broken_item": "Broken Item", "item.aether_ii.broken_item_template": "Broken %s", "item.aether_ii.burrukai_plate": "Burrukai Plate", diff --git a/src/generated/resources/assets/aether_ii/models/item/climbing_rope_stake.json b/src/generated/resources/assets/aether_ii/models/item/brettl_rope_stake.json similarity index 55% rename from src/generated/resources/assets/aether_ii/models/item/climbing_rope_stake.json rename to src/generated/resources/assets/aether_ii/models/item/brettl_rope_stake.json index 5f39c282b8..979e29a848 100644 --- a/src/generated/resources/assets/aether_ii/models/item/climbing_rope_stake.json +++ b/src/generated/resources/assets/aether_ii/models/item/brettl_rope_stake.json @@ -1,6 +1,6 @@ { "parent": "minecraft:item/generated", "textures": { - "layer0": "aether_ii:item/climbing_rope_stake" + "layer0": "aether_ii:item/brettl_rope_stake" } } \ No newline at end of file diff --git a/src/generated/resources/data/aether_ii/advancement/recipes/misc/climbing_rope_stake.json b/src/generated/resources/data/aether_ii/advancement/recipes/misc/brettl_rope_stake.json similarity index 85% rename from src/generated/resources/data/aether_ii/advancement/recipes/misc/climbing_rope_stake.json rename to src/generated/resources/data/aether_ii/advancement/recipes/misc/brettl_rope_stake.json index 475c375a34..3525768471 100644 --- a/src/generated/resources/data/aether_ii/advancement/recipes/misc/climbing_rope_stake.json +++ b/src/generated/resources/data/aether_ii/advancement/recipes/misc/brettl_rope_stake.json @@ -13,7 +13,7 @@ }, "has_the_recipe": { "conditions": { - "recipe": "aether_ii:climbing_rope_stake" + "recipe": "aether_ii:brettl_rope_stake" }, "trigger": "minecraft:recipe_unlocked" } @@ -26,7 +26,7 @@ ], "rewards": { "recipes": [ - "aether_ii:climbing_rope_stake" + "aether_ii:brettl_rope_stake" ] } } \ No newline at end of file diff --git a/src/generated/resources/data/aether_ii/loot_table/blocks/brettl_rope.json b/src/generated/resources/data/aether_ii/loot_table/blocks/brettl_rope.json new file mode 100644 index 0000000000..03ce84e463 --- /dev/null +++ b/src/generated/resources/data/aether_ii/loot_table/blocks/brettl_rope.json @@ -0,0 +1,4 @@ +{ + "type": "minecraft:block", + "random_sequence": "aether_ii:blocks/brettl_rope" +} \ No newline at end of file diff --git a/src/generated/resources/data/aether_ii/loot_table/blocks/brettl_rope_stake.json b/src/generated/resources/data/aether_ii/loot_table/blocks/brettl_rope_stake.json new file mode 100644 index 0000000000..23fdf6ccae --- /dev/null +++ b/src/generated/resources/data/aether_ii/loot_table/blocks/brettl_rope_stake.json @@ -0,0 +1,4 @@ +{ + "type": "minecraft:block", + "random_sequence": "aether_ii:blocks/brettl_rope_stake" +} \ No newline at end of file diff --git a/src/generated/resources/data/aether_ii/loot_table/blocks/climbing_rope.json b/src/generated/resources/data/aether_ii/loot_table/blocks/climbing_rope.json deleted file mode 100644 index 9ad5a6e844..0000000000 --- a/src/generated/resources/data/aether_ii/loot_table/blocks/climbing_rope.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "type": "minecraft:block", - "random_sequence": "aether_ii:blocks/climbing_rope" -} \ No newline at end of file diff --git a/src/generated/resources/data/aether_ii/loot_table/blocks/climbing_rope_stake.json b/src/generated/resources/data/aether_ii/loot_table/blocks/climbing_rope_stake.json deleted file mode 100644 index 38a4d07bcb..0000000000 --- a/src/generated/resources/data/aether_ii/loot_table/blocks/climbing_rope_stake.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "type": "minecraft:block", - "random_sequence": "aether_ii:blocks/climbing_rope_stake" -} \ No newline at end of file diff --git a/src/generated/resources/data/aether_ii/recipe/climbing_rope_stake.json b/src/generated/resources/data/aether_ii/recipe/brettl_rope_stake.json similarity index 84% rename from src/generated/resources/data/aether_ii/recipe/climbing_rope_stake.json rename to src/generated/resources/data/aether_ii/recipe/brettl_rope_stake.json index 6f2adef9b9..92101da022 100644 --- a/src/generated/resources/data/aether_ii/recipe/climbing_rope_stake.json +++ b/src/generated/resources/data/aether_ii/recipe/brettl_rope_stake.json @@ -12,6 +12,6 @@ ], "result": { "count": 4, - "id": "aether_ii:climbing_rope_stake" + "id": "aether_ii:brettl_rope_stake" } } \ No newline at end of file diff --git a/src/main/java/com/aetherteam/aetherii/block/AetherIIBlockStateProperties.java b/src/main/java/com/aetherteam/aetherii/block/AetherIIBlockStateProperties.java index 135529a344..00709587b2 100644 --- a/src/main/java/com/aetherteam/aetherii/block/AetherIIBlockStateProperties.java +++ b/src/main/java/com/aetherteam/aetherii/block/AetherIIBlockStateProperties.java @@ -21,8 +21,7 @@ public class AetherIIBlockStateProperties { public static final BooleanProperty EMPTY = BooleanProperty.create("empty"); public static final BooleanProperty IGNITED = BooleanProperty.create("ignited"); public static final BooleanProperty ROPE_KNOT = BooleanProperty.create("rope_knot"); - public static final BooleanProperty ROPE_SPOOL = BooleanProperty.create("rope_spool"); - public static final BooleanProperty ROPE_END = BooleanProperty.create("rope_end"); + public static final EnumProperty ROPE_END = EnumProperty.create("rope_end", RopeEndState.class); public static final EnumProperty STAKE_SPOOL = EnumProperty.create("stake_spool", StakeSpoolState.class); public enum Mossy implements StringRepresentable { @@ -73,4 +72,15 @@ public String getSerializedName() { return this.name().toLowerCase(Locale.ROOT); } } + + public enum RopeEndState implements StringRepresentable { + NONE, + SPOOL, + END; + + @Override + public String getSerializedName() { + return this.name().toLowerCase(Locale.ROOT); + } + } } \ No newline at end of file diff --git a/src/main/java/com/aetherteam/aetherii/block/AetherIIBlocks.java b/src/main/java/com/aetherteam/aetherii/block/AetherIIBlocks.java index c19f2cabbf..d59e121694 100644 --- a/src/main/java/com/aetherteam/aetherii/block/AetherIIBlocks.java +++ b/src/main/java/com/aetherteam/aetherii/block/AetherIIBlocks.java @@ -737,11 +737,11 @@ public class AetherIIBlocks extends AetherIIBlockBuilders { public static final DeferredBlock ALKAHEST_PURIFIER = register("alkahest_purifier", AlkahestPurifierBlock::new, () -> Block.Properties.ofFullCopy(AetherIIBlocks.ARKENIUM_BLOCK.get()).noOcclusion()); public static final DeferredBlock MUSIC_BLOCK = register("music_block", MusicBlock::new, () -> Block.Properties.ofFullCopy(AetherIIBlocks.SKYROOT_PLANKS.get())); public static final DeferredBlock AMBROSIUM_CAMPFIRE = register("ambrosium_campfire", (properties) -> new AmbrosiumCampfireBlock(false, 1, properties), () -> Block.Properties.of().mapColor(MapColor.WOOD).instrument(NoteBlockInstrument.BASS).strength(2.0F).sound(SoundType.WOOD).lightLevel((state) -> state.getValue(BlockStateProperties.LIT) ? 15 : 0).noOcclusion().ignitedByLava()); - public static final DeferredBlock CLIMBING_ROPE_STAKE = register("climbing_rope_stake", RopeStakeBlock::new, () -> Block.Properties.of().mapColor(MapColor.COLOR_BROWN).instrument(NoteBlockInstrument.GUITAR).strength(2.0F).sound(SoundType.WOOL).noOcclusion()); - public static final DeferredBlock CLIMBING_ROPE = register("climbing_rope", RopeBlock::new, () -> Block.Properties.of().mapColor(MapColor.COLOR_BROWN).instrument(NoteBlockInstrument.GUITAR).strength(0.5F).sound(SoundType.WOOL).noOcclusion().ignitedByLava()); public static final DeferredBlock SKYROOT_CHEST = register("skyroot_chest", (properties) -> new SkyrootChestBlock(properties, AetherIIBlockEntityTypes.SKYROOT_CHEST::get), () -> Block.Properties.ofFullCopy(Blocks.CHEST)); public static final DeferredBlock SKYROOT_BARREL = register("skyroot_barrel", BarrelBlock::new, () -> Block.Properties.ofFullCopy(Blocks.BARREL)); public static final DeferredBlock SKYROOT_LADDER = register("skyroot_ladder", LadderBlock::new, () -> Block.Properties.ofFullCopy(Blocks.LADDER).strength(0.4F).sound(SoundType.LADDER).noOcclusion()); + public static final DeferredBlock BRETTL_ROPE_STAKE = register("brettl_rope_stake", RopeStakeBlock::new, () -> Block.Properties.of().mapColor(MapColor.COLOR_BROWN).instrument(NoteBlockInstrument.GUITAR).strength(2.0F).sound(SoundType.WOOL).noOcclusion()); + public static final DeferredBlock BRETTL_ROPE = register("brettl_rope", RopeBlock::new, () -> Block.Properties.of().mapColor(MapColor.COLOR_BROWN).instrument(NoteBlockInstrument.GUITAR).strength(0.5F).sound(SoundType.WOOL).noOcclusion().ignitedByLava()); public static final DeferredBlock CLOUDWOOL_BEDROLL = register("cloudwool_bedroll", BedrollBlock::new, () -> Block.Properties.of().mapColor(MapColor.WOOL).sound(SoundType.WOOL).strength(0.2F).noOcclusion().ignitedByLava().pushReaction(PushReaction.DESTROY), AetherIIBlocks.bedrollBlockItem()); public static final DeferredBlock SKYROOT_BED = register("skyroot_bed", (properties) -> new SkyrootBedBlock(DyeColor.WHITE, properties), () -> Block.Properties.ofFullCopy(Blocks.WHITE_BED), AetherIIBlocks.bedBlockItem()); diff --git a/src/main/java/com/aetherteam/aetherii/block/utility/RopeBlock.java b/src/main/java/com/aetherteam/aetherii/block/utility/RopeBlock.java index 995a296aca..36ae162a9c 100644 --- a/src/main/java/com/aetherteam/aetherii/block/utility/RopeBlock.java +++ b/src/main/java/com/aetherteam/aetherii/block/utility/RopeBlock.java @@ -1,19 +1,15 @@ package com.aetherteam.aetherii.block.utility; -import com.aetherteam.aetherii.AetherII; import com.aetherteam.aetherii.block.AetherIIBlockStateProperties; import com.aetherteam.aetherii.block.AetherIIBlocks; -import com.aetherteam.aetherii.item.AetherIIItems; -import com.aetherteam.aetherii.loot.AetherIILoot; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; import net.minecraft.util.RandomSource; import net.minecraft.world.InteractionResult; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.InsideBlockEffectApplier; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelReader; @@ -21,114 +17,211 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.PipeBlock; +import net.minecraft.world.level.block.SimpleWaterloggedBlock; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.block.state.properties.BlockStateProperties; import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.block.state.properties.EnumProperty; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.level.material.Fluids; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.Shapes; import net.minecraft.world.phys.shapes.VoxelShape; -import org.spongepowered.asm.mixin.injection.struct.InjectorGroupInfo; +import java.util.ArrayList; +import java.util.List; import java.util.Map; -public class RopeBlock extends Block { +public class RopeBlock extends Block implements SimpleWaterloggedBlock { + public static final EnumProperty END = AetherIIBlockStateProperties.ROPE_END; public static final BooleanProperty KNOT = AetherIIBlockStateProperties.ROPE_KNOT; - public static final BooleanProperty SPOOL = AetherIIBlockStateProperties.ROPE_SPOOL; - public static final BooleanProperty END = AetherIIBlockStateProperties.ROPE_END; public static final BooleanProperty UP = BlockStateProperties.UP; public static final BooleanProperty DOWN = BlockStateProperties.DOWN; public static final BooleanProperty NORTH = BlockStateProperties.NORTH; public static final BooleanProperty EAST = BlockStateProperties.EAST; public static final BooleanProperty SOUTH = BlockStateProperties.SOUTH; public static final BooleanProperty WEST = BlockStateProperties.WEST; + public static final BooleanProperty WATERLOGGED = BlockStateProperties.WATERLOGGED; + public static final Map PROPERTY_BY_DIRECTION = PipeBlock.PROPERTY_BY_DIRECTION; public static final int MAX_LENGTH = 16; public static final int DELAY = 4; public RopeBlock(Properties properties) { super(properties); - this.registerDefaultState(this.stateDefinition.any().setValue(KNOT, false).setValue(SPOOL, false).setValue(END, false).setValue(UP, false).setValue(DOWN, false).setValue(NORTH, false).setValue(EAST, false).setValue(SOUTH, false).setValue(WEST, false)); + this.registerDefaultState(this.stateDefinition.any().setValue(END, AetherIIBlockStateProperties.RopeEndState.NONE).setValue(KNOT, false).setValue(UP, false).setValue(DOWN, false).setValue(NORTH, false).setValue(EAST, false).setValue(SOUTH, false).setValue(WEST, false).setValue(WATERLOGGED, false)); } @Override - protected void tick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) { - if (level.getBlockState(pos.below()).isAir()) { - if (this.checkForStake(level, pos)) { - level.setBlock(pos, state.setValue(DOWN, true).setValue(END, false), 1 | 2); - level.setBlock(pos.below(), AetherIIBlocks.CLIMBING_ROPE.get().defaultBlockState().setValue(UP, true), 1 | 2); - level.scheduleTick(pos.below(), this, DELAY); - } else { - level.setBlock(pos, state.setValue(END, true), 1 | 2); + protected InteractionResult useWithoutItem(BlockState state, Level level, BlockPos pos, Player player, BlockHitResult hitResult) { + boolean canUnknot = false; + List directionStates = this.getDirectionStates(state); + for (Direction entry : directionStates) { + if (directionStates.contains(entry.getOpposite()) && directionStates.size() == 2) { + canUnknot = true; } - } else { - level.setBlock(pos, state.setValue(DOWN, true).setValue(END, false).setValue(SPOOL, true), 1 | 2); } + if (player.getMainHandItem().isEmpty() && player.getOffhandItem().isEmpty()) { + if (state.getValue(KNOT) && canUnknot) { + level.setBlock(pos, state.setValue(KNOT, false), 1 | 2); + return InteractionResult.SUCCESS; + } else if (!state.getValue(KNOT)) { + level.setBlock(pos, state.setValue(KNOT, true), 1 | 2); + return InteractionResult.SUCCESS; + } + } + return super.useWithoutItem(state, level, pos, player, hitResult); + } + + @Override + protected void tick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) { +// if (level.getBlockState(pos.below()).isAir()) { +// if (this.checkForStake(level, pos)) { +// level.setBlock(pos, state.setValue(DOWN, true).setValue(END, false), 1 | 2); +// level.setBlock(pos.below(), AetherIIBlocks.BRETTL_ROPE.get().defaultBlockState().setValue(UP, true), 1 | 2); +// level.scheduleTick(pos.below(), this, DELAY); +// } else { +// level.setBlock(pos, state.setValue(END, true), 1 | 2); +// } +// } else { +// level.setBlock(pos, state.setValue(DOWN, true).setValue(END, false).setValue(SPOOL, true), 1 | 2); +// } + + + + } @Override protected BlockState updateShape(BlockState state, LevelReader levelReader, ScheduledTickAccess scheduledTickAccess, BlockPos pos, Direction direction, BlockPos neighborPos, BlockState neighborState, RandomSource randomSource) { - if (neighborState.isAir()) { - if (direction == Direction.DOWN) { - if (state.getValue(SPOOL)) { - scheduledTickAccess.scheduleTick(pos, this, DELAY); - state = state.setValue(SPOOL, false); - } else { - state = state.setValue(DOWN, false); - if (!state.getValue(KNOT)) { - state = state.setValue(END, true); - } + if (state.getValue(WATERLOGGED)) { + scheduledTickAccess.scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickDelay(levelReader)); + } + if (!state.getValue(KNOT)) { + if (state.getValue(PROPERTY_BY_DIRECTION.get(direction)) && neighborState.isEmpty()) { + if (direction == Direction.UP || (direction.getAxis().getPlane() == Direction.Plane.HORIZONTAL && levelReader.getBlockState(pos.relative(direction.getOpposite())).isEmpty())) { + state = Blocks.AIR.defaultBlockState(); } - } else if (direction == Direction.UP) { //todo this should be based on connection direction to allow for placing rope without having it break immediately when breaking smth above it. if it only has one connection? - return Blocks.AIR.defaultBlockState(); } } + if (!state.isAir()) { + if (state.getValue(KNOT) || this.getExistingConnectionAxis(state) == direction.getAxis()) { + state = state.setValue(PROPERTY_BY_DIRECTION.get(direction), neighborState.isSolid() || neighborState.is(this)); + } + } + + +// if (neighborState.isAir()) { +// if (direction == Direction.DOWN) { +// if (state.getValue(SPOOL)) { +// scheduledTickAccess.scheduleTick(pos, this, DELAY); +// state = state.setValue(SPOOL, false); +// } else { +// state = state.setValue(DOWN, false); +// if (!state.getValue(KNOT)) { +// state = state.setValue(END, true); +// } +// } +// } else if (direction == Direction.UP) { //todo this should be based on connection direction to allow for placing rope without having it break immediately when breaking smth above it. if it only has one connection? +// return Blocks.AIR.defaultBlockState(); +// } +// } return state; } @Override - protected InteractionResult useWithoutItem(BlockState state, Level level, BlockPos pos, Player player, BlockHitResult hitResult) { - BlockState newState = state.cycle(KNOT); - level.setBlock(pos, newState, 1 | 2); - return InteractionResult.SUCCESS; + public BlockState getStateForPlacement(BlockPlaceContext context) { + Level level = context.getLevel(); + BlockPos pos = context.getClickedPos(); + FluidState fluidState = level.getFluidState(pos); + BlockState blockState = this.defaultBlockState().setValue(KNOT, true); + for (Map.Entry entry : PROPERTY_BY_DIRECTION.entrySet()) { + BlockState neighborState = level.getBlockState(pos.relative(entry.getKey())); + blockState = blockState.setValue(entry.getValue(), neighborState.isSolid()); + } + return blockState.setValue(WATERLOGGED, fluidState.is(Fluids.WATER)); } - public boolean checkForStake(LevelReader levelReader, BlockPos pos) { - for (int i = 1; i < MAX_LENGTH; ++i) { - BlockPos abovePos = pos.above(i); - BlockState aboveState = levelReader.getBlockState(abovePos); - if (aboveState.is(AetherIIBlocks.CLIMBING_ROPE_STAKE)) { - return true; - } - } - return false; + @Override + protected FluidState getFluidState(BlockState state) { + return state.getValue(WATERLOGGED) ? Fluids.WATER.getSource(false) : super.getFluidState(state); } @Override protected void createBlockStateDefinition(StateDefinition.Builder builder) { - builder.add(KNOT, SPOOL, END, UP, DOWN, NORTH, EAST, SOUTH, WEST); + builder.add(END, KNOT, UP, DOWN, NORTH, EAST, SOUTH, WEST, WATERLOGGED); } + public Direction.Axis getExistingConnectionAxis(BlockState state) { + Direction.Axis direction = null; + for (Map.Entry entry : PROPERTY_BY_DIRECTION.entrySet()) { + if (state.getValue(entry.getValue())) { + direction = entry.getKey().getAxis(); + break; + } + } + return direction; + } + + public List getDirectionStates(BlockState state) { + List directions = new ArrayList<>(); + for (Map.Entry entry : PROPERTY_BY_DIRECTION.entrySet()) { + if (state.getValue(entry.getValue())) { + directions.add(entry.getKey()); + } + } + return directions; + } + + public boolean checkForStake(LevelReader levelReader, BlockPos pos) { +// for (int i = 1; i < MAX_LENGTH; ++i) { +// BlockPos abovePos = pos.above(i); +// BlockState aboveState = levelReader.getBlockState(abovePos); +// if (aboveState.is(AetherIIBlocks.BRETTL_ROPE_STAKE)) { +// return true; +// } +// } + return false; + } + + public static final Map SHAPE_CONNECTIONS = Shapes.rotateAll(Block.box(6, 6, 0, 10, 10, 8)); + public static final VoxelShape SHAPE_KNOT = Block.box(6, 6, 6, 10, 10, 10); + @Override - protected VoxelShape getShape(BlockState state, BlockGetter level, BlockPos pos, CollisionContext context) { - VoxelShape spool = Block.box(4, 0, 4, 12, 2, 12); - VoxelShape connection = Block.box(6, 6, 0, 10, 10, 8); - Map rotated = Shapes.rotateAll(connection); - VoxelShape finalShape = Shapes.empty(); - for (Map.Entry entry : PipeBlock.PROPERTY_BY_DIRECTION.entrySet()) { + protected VoxelShape getShape(BlockState state, BlockGetter level, BlockPos pos, CollisionContext context) { //todo +// VoxelShape spool = Block.box(4, 0, 4, 12, 2, 12); + VoxelShape shape = Shapes.empty(); + for (Map.Entry entry : PROPERTY_BY_DIRECTION.entrySet()) { if (state.getValue(entry.getValue())) { - finalShape = Shapes.or(finalShape, rotated.get(entry.getKey())); + shape = Shapes.or(shape, SHAPE_CONNECTIONS.get(entry.getKey())); } } - if (state.getValue(SPOOL)) { - finalShape = Shapes.or(finalShape, spool); + if (state.getValue(KNOT)) { + shape = Shapes.or(shape, SHAPE_KNOT); } - return finalShape; +// if (state.getValue(SPOOL)) { +// shape = Shapes.or(shape, spool); +// } + return shape; } @Override protected VoxelShape getCollisionShape(BlockState state, BlockGetter level, BlockPos pos, CollisionContext context) { - return Shapes.empty(); + VoxelShape collisionShape = Shapes.empty(); + for (Map.Entry entry : PROPERTY_BY_DIRECTION.entrySet()) { + if (entry.getKey().getAxis().getPlane() == Direction.Plane.HORIZONTAL && state.getValue(entry.getValue())) { + collisionShape = Shapes.or(collisionShape, SHAPE_CONNECTIONS.get(entry.getKey())); + } + } + if (state.getValue(KNOT)) { + collisionShape = Shapes.or(collisionShape, SHAPE_KNOT); + } + if (context.isAbove(collisionShape, pos, true) && !context.isDescending()) { + return collisionShape; + } else { + return Shapes.empty(); + } } @Override @@ -138,7 +231,7 @@ public VoxelShape getVisualShape(BlockState state, BlockGetter level, BlockPos p @Override protected boolean skipRendering(BlockState state, BlockState neighborState, Direction direction) { - return neighborState.is(this) || neighborState.is(AetherIIBlocks.CLIMBING_ROPE_STAKE) || super.skipRendering(state, neighborState, direction); + return neighborState.is(this) || neighborState.is(AetherIIBlocks.BRETTL_ROPE_STAKE) || super.skipRendering(state, neighborState, direction); //todo also not working for some reason } @Override @@ -155,4 +248,9 @@ protected boolean propagatesSkylightDown(BlockState state) { public boolean isLadder(BlockState state, LevelReader level, BlockPos pos, LivingEntity entity) { return true; } + + @Override + public boolean isScaffolding(BlockState state, LevelReader level, BlockPos pos, LivingEntity entity) { + return true; + } } diff --git a/src/main/java/com/aetherteam/aetherii/block/utility/RopeStakeBlock.java b/src/main/java/com/aetherteam/aetherii/block/utility/RopeStakeBlock.java index 0c0a3b053b..213803cfd0 100644 --- a/src/main/java/com/aetherteam/aetherii/block/utility/RopeStakeBlock.java +++ b/src/main/java/com/aetherteam/aetherii/block/utility/RopeStakeBlock.java @@ -1,6 +1,5 @@ package com.aetherteam.aetherii.block.utility; -import com.aetherteam.aetherii.AetherII; import com.aetherteam.aetherii.block.AetherIIBlockStateProperties; import com.aetherteam.aetherii.block.AetherIIBlocks; import net.minecraft.core.BlockPos; @@ -8,8 +7,6 @@ import net.minecraft.server.level.ServerLevel; import net.minecraft.util.RandomSource; import net.minecraft.world.InteractionResult; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.InsideBlockEffectApplier; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.context.BlockPlaceContext; @@ -19,87 +16,102 @@ import net.minecraft.world.level.ScheduledTickAccess; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.SimpleWaterloggedBlock; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.BooleanProperty; import net.minecraft.world.level.block.state.properties.EnumProperty; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.level.material.Fluids; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.Shapes; import net.minecraft.world.phys.shapes.VoxelShape; -public class RopeStakeBlock extends Block { +public class RopeStakeBlock extends Block implements SimpleWaterloggedBlock { public static final EnumProperty CONNECTION = BlockStateProperties.FACING; public static final EnumProperty SPOOL = AetherIIBlockStateProperties.STAKE_SPOOL; + public static final BooleanProperty WATERLOGGED = BlockStateProperties.WATERLOGGED; public RopeStakeBlock(Properties properties) { super(properties); - this.registerDefaultState(this.stateDefinition.any().setValue(CONNECTION, Direction.NORTH).setValue(SPOOL, AetherIIBlockStateProperties.StakeSpoolState.NONE)); + this.registerDefaultState(this.stateDefinition.any().setValue(CONNECTION, Direction.NORTH).setValue(SPOOL, AetherIIBlockStateProperties.StakeSpoolState.NONE).setValue(WATERLOGGED, false)); + } + + @Override + protected InteractionResult useWithoutItem(BlockState state, Level level, BlockPos pos, Player player, BlockHitResult hitResult) { +// if (state.getValue(SPOOL) == AetherIIBlockStateProperties.StakeSpoolState.CENTER) { +// BlockState newState = state.setValue(SPOOL, AetherIIBlockStateProperties.StakeSpoolState.NONE_CONNECTED); +// level.setBlock(pos, newState, 1 | 2); +// level.scheduleTick(pos, this, RopeBlock.DELAY); +// return InteractionResult.SUCCESS; +// } + return InteractionResult.PASS; } @Override protected void tick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) { - if (level.getBlockState(pos.below()).isAir()) { - level.setBlock(pos.below(), AetherIIBlocks.CLIMBING_ROPE.get().defaultBlockState().setValue(RopeBlock.UP, true), 1 | 2); - level.scheduleTick(pos.below(), AetherIIBlocks.CLIMBING_ROPE.get(), RopeBlock.DELAY); - } else { - level.setBlock(pos, state.setValue(RopeStakeBlock.SPOOL, AetherIIBlockStateProperties.StakeSpoolState.FLOOR), 1 | 2); - } +// if (level.getBlockState(pos.below()).isAir()) { +// level.setBlock(pos.below(), AetherIIBlocks.BRETTL_ROPE.get().defaultBlockState().setValue(RopeBlock.UP, true), 1 | 2); +// level.scheduleTick(pos.below(), AetherIIBlocks.BRETTL_ROPE.get(), RopeBlock.DELAY); +// } else { +// level.setBlock(pos, state.setValue(RopeStakeBlock.SPOOL, AetherIIBlockStateProperties.StakeSpoolState.FLOOR), 1 | 2); +// } } @Override protected BlockState updateShape(BlockState state, LevelReader levelReader, ScheduledTickAccess scheduledTickAccess, BlockPos pos, Direction direction, BlockPos neighborPos, BlockState neighborState, RandomSource randomSource) { - if (neighborState.isAir()) { - if (direction == Direction.DOWN) { - if (state.getValue(SPOOL) == AetherIIBlockStateProperties.StakeSpoolState.NONE_CONNECTED) { - state = state.setValue(SPOOL, AetherIIBlockStateProperties.StakeSpoolState.NONE); - } - } else if (direction == state.getValue(CONNECTION)) { - return Blocks.AIR.defaultBlockState(); - } +// if (neighborState.isAir()) { +// if (direction == Direction.DOWN) { +// if (state.getValue(SPOOL) == AetherIIBlockStateProperties.StakeSpoolState.NONE_CONNECTED) { +// state = state.setValue(SPOOL, AetherIIBlockStateProperties.StakeSpoolState.NONE); +// } +// } else if (direction == state.getValue(CONNECTION)) { +// return Blocks.AIR.defaultBlockState(); +// } +// } + if (state.getValue(WATERLOGGED)) { + scheduledTickAccess.scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickDelay(levelReader)); } return state; } @Override - protected InteractionResult useWithoutItem(BlockState state, Level level, BlockPos pos, Player player, BlockHitResult hitResult) { - if (state.getValue(SPOOL) == AetherIIBlockStateProperties.StakeSpoolState.CENTER) { - BlockState newState = state.setValue(SPOOL, AetherIIBlockStateProperties.StakeSpoolState.NONE_CONNECTED); - level.setBlock(pos, newState, 1 | 2); - level.scheduleTick(pos, this, RopeBlock.DELAY); - return InteractionResult.SUCCESS; - } - return InteractionResult.PASS; + public BlockState getStateForPlacement(BlockPlaceContext context) { + FluidState replacedFluidState = context.getLevel().getFluidState(context.getClickedPos()); + return this.defaultBlockState().setValue(CONNECTION, context.getClickedFace().getOpposite()).setValue(SPOOL, AetherIIBlockStateProperties.StakeSpoolState.CENTER).setValue(WATERLOGGED, replacedFluidState.is(Fluids.WATER)); } @Override - public BlockState getStateForPlacement(BlockPlaceContext context) { - return this.defaultBlockState().setValue(CONNECTION, context.getClickedFace().getOpposite()).setValue(SPOOL, AetherIIBlockStateProperties.StakeSpoolState.CENTER); + protected FluidState getFluidState(BlockState state) { + return state.getValue(WATERLOGGED) ? Fluids.WATER.getSource(false) : super.getFluidState(state); } @Override protected void createBlockStateDefinition(StateDefinition.Builder builder) { - builder.add(CONNECTION, SPOOL); + builder.add(CONNECTION, SPOOL, WATERLOGGED); } @Override protected VoxelShape getShape(BlockState state, BlockGetter level, BlockPos pos, CollisionContext context) { -// VoxelShape center = Block.box(5, 5, 5, 11, 11, 11); - VoxelShape stake = Block.box(6, 6, 0, 10, 10, 13); - VoxelShape finalShape = Shapes.rotateAll(stake).get(state.getValue(CONNECTION)); - if (state.getValue(SPOOL) == AetherIIBlockStateProperties.StakeSpoolState.NONE_CONNECTED || state.getValue(SPOOL) == AetherIIBlockStateProperties.StakeSpoolState.FLOOR) { - VoxelShape connection = Block.box(6, 0, 6, 10, 6, 10); - finalShape = Shapes.or(finalShape, connection); - } - if (state.getValue(SPOOL) == AetherIIBlockStateProperties.StakeSpoolState.FLOOR) { - VoxelShape spool = Block.box(4, 0, 4, 12, 2, 12); - finalShape = Shapes.or(finalShape, spool); - } else if (state.getValue(SPOOL) == AetherIIBlockStateProperties.StakeSpoolState.CENTER) { - VoxelShape spool = Block.box(4, 4, 7, 12, 12, 9); - finalShape = Shapes.or(finalShape, Shapes.rotateAll(spool).get(state.getValue(CONNECTION))); - - } - return finalShape; +//// VoxelShape center = Block.box(5, 5, 5, 11, 11, 11); +// VoxelShape stake = Block.box(6, 6, 0, 10, 10, 13); +// VoxelShape finalShape = Shapes.rotateAll(stake).get(state.getValue(CONNECTION)); +// if (state.getValue(SPOOL) == AetherIIBlockStateProperties.StakeSpoolState.NONE_CONNECTED || state.getValue(SPOOL) == AetherIIBlockStateProperties.StakeSpoolState.FLOOR) { +// VoxelShape connection = Block.box(6, 0, 6, 10, 6, 10); +// finalShape = Shapes.or(finalShape, connection); +// } +// if (state.getValue(SPOOL) == AetherIIBlockStateProperties.StakeSpoolState.FLOOR) { +// VoxelShape spool = Block.box(4, 0, 4, 12, 2, 12); +// finalShape = Shapes.or(finalShape, spool); +// } else if (state.getValue(SPOOL) == AetherIIBlockStateProperties.StakeSpoolState.CENTER) { +// VoxelShape spool = Block.box(4, 4, 7, 12, 12, 9); +// finalShape = Shapes.or(finalShape, Shapes.rotateAll(spool).get(state.getValue(CONNECTION))); +// +// } +// return finalShape; + return Shapes.block(); } @Override @@ -114,7 +126,7 @@ public VoxelShape getVisualShape(BlockState state, BlockGetter level, BlockPos p @Override protected boolean skipRendering(BlockState state, BlockState neighborState, Direction direction) { - return neighborState.is(this) || neighborState.is(AetherIIBlocks.CLIMBING_ROPE) || super.skipRendering(state, neighborState, direction); + return neighborState.is(this) || neighborState.is(AetherIIBlocks.BRETTL_ROPE) || super.skipRendering(state, neighborState, direction); } @Override diff --git a/src/main/java/com/aetherteam/aetherii/data/generators/AetherIILanguageData.java b/src/main/java/com/aetherteam/aetherii/data/generators/AetherIILanguageData.java index d91c982acd..c2d97ce6d3 100644 --- a/src/main/java/com/aetherteam/aetherii/data/generators/AetherIILanguageData.java +++ b/src/main/java/com/aetherteam/aetherii/data/generators/AetherIILanguageData.java @@ -747,10 +747,11 @@ private void addBlocks() { this.addBlock(AetherIIBlocks.ARKENIUM_FORGE, "Arkenium Forge"); this.addBlock(AetherIIBlocks.ALKAHEST_PURIFIER, "Alkahest Purifier"); this.addBlock(AetherIIBlocks.AMBROSIUM_CAMPFIRE, "Ambrosium Campfire"); - this.addBlock(AetherIIBlocks.CLIMBING_ROPE_STAKE, "Climbing Rope"); this.addBlock(AetherIIBlocks.SKYROOT_CHEST, "Skyroot Chest"); this.addBlock(AetherIIBlocks.SKYROOT_BARREL, "Skyroot Barrel"); this.addBlock(AetherIIBlocks.SKYROOT_LADDER, "Skyroot Ladder"); + this.addBlock(AetherIIBlocks.BRETTL_ROPE_STAKE, "Climbing Rope"); + this.addBlock(AetherIIBlocks.BRETTL_ROPE, "Brettl Rope"); this.addBlock(AetherIIBlocks.CLOUDWOOL_BEDROLL, "Cloudwool Bedroll"); this.addBlock(AetherIIBlocks.SKYROOT_BED, "Skyroot Bed"); @@ -1044,7 +1045,6 @@ private void addItems() { this.addItem(AetherIIItems.VALKYRIE_WINGS, "Valkyrie Wings"); this.addItem(AetherIIItems.BRETTL_CANE, "Brettl Cane"); this.addItem(AetherIIItems.BRETTL_GRASS, "Brettl Grass"); - this.addItem(AetherIIItems.BRETTL_ROPE, "Brettl Rope"); this.addItem(AetherIIItems.AECHOR_PETAL, "Aechor Petal"); this.addItem(AetherIIItems.ARILUM_BULBS, "Arilum Bulbs"); this.addItem(AetherIIItems.ARCTIC_SNOWBALL, "Arctic Snowball"); diff --git a/src/main/java/com/aetherteam/aetherii/data/generators/AetherIIRecipeData.java b/src/main/java/com/aetherteam/aetherii/data/generators/AetherIIRecipeData.java index d6a779604e..4d9066f39e 100644 --- a/src/main/java/com/aetherteam/aetherii/data/generators/AetherIIRecipeData.java +++ b/src/main/java/com/aetherteam/aetherii/data/generators/AetherIIRecipeData.java @@ -27,7 +27,6 @@ import net.minecraft.world.item.component.BundleContents; import net.minecraft.world.item.crafting.CookingBookCategory; import net.minecraft.world.item.crafting.Ingredient; -import net.minecraft.world.item.crafting.ShapedRecipe; import net.minecraft.world.level.block.Blocks; import net.neoforged.neoforge.common.Tags; import net.neoforged.neoforge.common.crafting.DataComponentIngredient; @@ -1699,7 +1698,7 @@ protected void buildRecipes() { .pattern("###") .unlockedBy("has_brettl_cane", has(AetherIIItems.BRETTL_CANE)) .save(this.output, this.name("paper_from_brettl_cane")); - ShapedRecipeBuilder.shaped(getter, RecipeCategory.MISC, AetherIIItems.BRETTL_ROPE.get(), 2) + ShapedRecipeBuilder.shaped(getter, RecipeCategory.MISC, AetherIIBlocks.BRETTL_ROPE.get(), 2) .define('#', AetherIIItems.BRETTL_GRASS) .pattern(" #") .pattern(" # ") @@ -2183,7 +2182,7 @@ protected void buildRecipes() { AetherIIItems.SKYROOT_BUCKET, 0.0F).group("misc_tools").save(this.output, this.name("uncraft_skyroot_bucket")); this.hourglassUncraftingItem(RecipeCategory.MISC, Items.AIR, List.of(), - AetherIIItems.BRETTL_ROPE, List.of(this.hourglass(2, 75), this.hourglass(3, 25)), + AetherIIBlocks.BRETTL_ROPE, List.of(this.hourglass(2, 75), this.hourglass(3, 25)), Items.AIR, List.of(), AetherIIItems.BRETTL_LASSO, 0.0F).group("misc_tools").save(this.output, this.name("uncraft_brettl_lasso")); this.hourglassUncraftingItem(RecipeCategory.MISC, @@ -2376,19 +2375,19 @@ protected void buildRecipes() { .unlockedBy("has_cloudtwine", this.has(AetherIIItems.CLOUDTWINE)) .save(this.output); ShapedRecipeBuilder.shaped(getter, RecipeCategory.MISC, AetherIIItems.BRETTL_LASSO.get()) - .define('#', AetherIIItems.BRETTL_ROPE) + .define('#', AetherIIBlocks.BRETTL_ROPE) .pattern(" ##") .pattern(" ##") .pattern("# ") - .unlockedBy("has_brettl_rope", has(AetherIIItems.BRETTL_ROPE)) + .unlockedBy("has_brettl_rope", has(AetherIIBlocks.BRETTL_ROPE)) .save(this.output); - ShapedRecipeBuilder.shaped(getter, RecipeCategory.MISC, AetherIIBlocks.CLIMBING_ROPE_STAKE.get(), 4) - .define('#', AetherIIItems.BRETTL_ROPE) + ShapedRecipeBuilder.shaped(getter, RecipeCategory.MISC, AetherIIBlocks.BRETTL_ROPE_STAKE.get(), 4) + .define('#', AetherIIBlocks.BRETTL_ROPE) .define('/', AetherIIItems.SKYROOT_STICK) .pattern("#/") .pattern("# ") .pattern("# ") - .unlockedBy("has_brettl_rope", has(AetherIIItems.BRETTL_ROPE)) + .unlockedBy("has_brettl_rope", has(AetherIIBlocks.BRETTL_ROPE)) .save(this.output); ShapedRecipeBuilder.shaped(getter, RecipeCategory.MISC, AetherIIItems.MOA_SADDLE.get()) .define('#', AetherIIItems.BEAST_PELT) diff --git a/src/main/java/com/aetherteam/aetherii/data/generators/loot/AetherIIBlockLoot.java b/src/main/java/com/aetherteam/aetherii/data/generators/loot/AetherIIBlockLoot.java index d2706171a6..e3cf9740cd 100644 --- a/src/main/java/com/aetherteam/aetherii/data/generators/loot/AetherIIBlockLoot.java +++ b/src/main/java/com/aetherteam/aetherii/data/generators/loot/AetherIIBlockLoot.java @@ -700,11 +700,11 @@ public void generate() { this.dropSelf(AetherIIBlocks.ALKAHEST_PURIFIER.get()); this.dropSelf(AetherIIBlocks.MUSIC_BLOCK.get()); this.add(AetherIIBlocks.AMBROSIUM_CAMPFIRE.get(), (block) -> this.createSilkTouchDispatchTable(block, this.applyExplosionCondition(block, LootItem.lootTableItem(AetherIIItems.AMBROSIUM_SHARD).apply(SetItemCountFunction.setCount(ConstantValue.exactly(1.0F)))))); - this.dropNone(AetherIIBlocks.CLIMBING_ROPE_STAKE.get()); - this.dropNone(AetherIIBlocks.CLIMBING_ROPE.get()); this.dropSelf(AetherIIBlocks.SKYROOT_CHEST.get()); this.dropSelf(AetherIIBlocks.SKYROOT_BARREL.get()); this.dropSelf(AetherIIBlocks.SKYROOT_LADDER.get()); + this.dropNone(AetherIIBlocks.BRETTL_ROPE_STAKE.get()); + this.dropNone(AetherIIBlocks.BRETTL_ROPE.get()); this.add(AetherIIBlocks.CLOUDWOOL_BEDROLL.get(), (bed) -> this.createSinglePropConditionTable(bed, BedBlock.PART, BedPart.HEAD)); this.add(AetherIIBlocks.SKYROOT_BED.get(), (bed) -> this.createSinglePropConditionTable(bed, BedBlock.PART, BedPart.HEAD)); diff --git a/src/main/java/com/aetherteam/aetherii/data/generators/loot/AetherIIChestLoot.java b/src/main/java/com/aetherteam/aetherii/data/generators/loot/AetherIIChestLoot.java index 4fce3abdb0..75f395b02c 100644 --- a/src/main/java/com/aetherteam/aetherii/data/generators/loot/AetherIIChestLoot.java +++ b/src/main/java/com/aetherteam/aetherii/data/generators/loot/AetherIIChestLoot.java @@ -177,7 +177,7 @@ public void generate(BiConsumer, LootTable.Builder> build ) .withPool(LootPool.lootPool().setRolls(UniformGenerator.between(1.0F, 2.0F)) - .add(LootItem.lootTableItem(AetherIIItems.BRETTL_ROPE).apply(SetItemCountFunction.setCount(UniformGenerator.between(2.0F, 3.0F)))) + .add(LootItem.lootTableItem(AetherIIBlocks.BRETTL_ROPE).apply(SetItemCountFunction.setCount(UniformGenerator.between(2.0F, 3.0F)))) .add(LootItem.lootTableItem(AetherIIItems.CLOUDTWINE).apply(SetItemCountFunction.setCount(UniformGenerator.between(1.0F, 2.0F)))) ) ); diff --git a/src/main/java/com/aetherteam/aetherii/data/generators/models/AetherIIBlockModels.java b/src/main/java/com/aetherteam/aetherii/data/generators/models/AetherIIBlockModels.java index 9db26f4a62..b6ca7fea2d 100644 --- a/src/main/java/com/aetherteam/aetherii/data/generators/models/AetherIIBlockModels.java +++ b/src/main/java/com/aetherteam/aetherii/data/generators/models/AetherIIBlockModels.java @@ -2,13 +2,11 @@ import com.aetherteam.aetherii.AetherII; import com.aetherteam.aetherii.block.AetherIIBlocks; -import com.aetherteam.aetherii.client.renderer.item.model.VaseSpecialRenderer; import com.aetherteam.aetherii.data.providers.AetherIIBlockModelSubProvider; import com.aetherteam.aetherii.data.resources.builders.models.AetherIIBlockFamilies; import com.aetherteam.aetherii.data.resources.builders.models.AetherIIModelTemplates; import com.aetherteam.aetherii.data.resources.builders.models.AetherIITextureMappings; import com.aetherteam.aetherii.data.resources.builders.models.AetherIITexturedModels; -import net.minecraft.client.data.models.BlockModelGenerators; import net.minecraft.client.data.models.ItemModelOutput; import net.minecraft.client.data.models.blockstates.BlockModelDefinitionGenerator; import net.minecraft.client.data.models.model.*; @@ -461,11 +459,11 @@ public void run() { this.createAlkahestPurifier(AetherIIBlocks.ALKAHEST_PURIFIER.get(), AetherIIBlocks.ARKENIUM_BLOCK.get()); this.createTrivialCube(AetherIIBlocks.MUSIC_BLOCK.get()); this.createCampfire(AetherIIBlocks.AMBROSIUM_CAMPFIRE.get()); - this.createClimbingRopeStake(AetherIIBlocks.CLIMBING_ROPE_STAKE.get()); - this.createClimbingRope(AetherIIBlocks.CLIMBING_ROPE.get()); this.createChest(AetherIIBlocks.SKYROOT_CHEST.get(), AetherIIBlocks.SKYROOT_PLANKS.get(), Identifier.fromNamespaceAndPath(AetherII.MODID, "skyroot_chest"), true); this.createBarrel(AetherIIBlocks.SKYROOT_BARREL.get()); this.createLadder(AetherIIBlocks.SKYROOT_LADDER.get()); + this.createClimbingRopeStake(AetherIIBlocks.BRETTL_ROPE_STAKE.get()); + this.createClimbingRope(AetherIIBlocks.BRETTL_ROPE.get()); this.createBedroll(AetherIIBlocks.CLOUDWOOL_BEDROLL.get()); this.createBed(AetherIIBlocks.SKYROOT_BED.get(), AetherIIBlocks.SKYROOT_PLANKS.get(), "undyed"); diff --git a/src/main/java/com/aetherteam/aetherii/data/generators/models/AetherIIItemModels.java b/src/main/java/com/aetherteam/aetherii/data/generators/models/AetherIIItemModels.java index 9b02637b1f..0930298d52 100644 --- a/src/main/java/com/aetherteam/aetherii/data/generators/models/AetherIIItemModels.java +++ b/src/main/java/com/aetherteam/aetherii/data/generators/models/AetherIIItemModels.java @@ -180,7 +180,6 @@ public void run() { this.generateFlatItem(AetherIIItems.VALKYRIE_WINGS.get(), ModelTemplates.FLAT_ITEM); this.generateFlatItem(AetherIIItems.BRETTL_CANE.get(), ModelTemplates.FLAT_ITEM); this.generateFlatItem(AetherIIItems.BRETTL_GRASS.get(), ModelTemplates.FLAT_ITEM); - this.generateFlatItem(AetherIIItems.BRETTL_ROPE.get(), ModelTemplates.FLAT_ITEM); this.generateFlatItem(AetherIIItems.ARILUM_BULBS.get(), ModelTemplates.FLAT_ITEM); this.generateFlatItem(AetherIIItems.AECHOR_PETAL.get(), ModelTemplates.FLAT_ITEM); this.generateFlatItem(AetherIIItems.ARCTIC_SNOWBALL.get(), ModelTemplates.FLAT_ITEM); diff --git a/src/main/java/com/aetherteam/aetherii/data/providers/AetherIIBlockModelSubProvider.java b/src/main/java/com/aetherteam/aetherii/data/providers/AetherIIBlockModelSubProvider.java index f93abba355..934f833bf9 100644 --- a/src/main/java/com/aetherteam/aetherii/data/providers/AetherIIBlockModelSubProvider.java +++ b/src/main/java/com/aetherteam/aetherii/data/providers/AetherIIBlockModelSubProvider.java @@ -1170,13 +1170,13 @@ public void createCampfire(Block block) { } public void createClimbingRopeStake(Block block) { - MultiVariant stake = plainVariant(AetherIIModelTemplates.decorateBlockModelLocation("climbing_rope_stake")); - MultiVariant stakeShort = plainVariant(AetherIIModelTemplates.decorateBlockModelLocation("climbing_rope_stake_short")); - MultiVariant knot = plainVariant(AetherIIModelTemplates.decorateBlockModelLocation("climbing_rope_knot")); - MultiVariant connection = plainVariant(AetherIIModelTemplates.decorateBlockModelLocation("climbing_rope_connection_lower")); - MultiVariant connectionSpoolFloor = plainVariant(AetherIIModelTemplates.decorateBlockModelLocation("climbing_rope_connection_spool_floor")); - MultiVariant spoolMiddle = plainVariant(AetherIIModelTemplates.decorateBlockModelLocation("climbing_rope_spool_middle")); - MultiVariant spoolFloor = plainVariant(AetherIIModelTemplates.decorateBlockModelLocation("climbing_rope_spool_floor")); + MultiVariant stake = plainVariant(AetherIIModelTemplates.decorateBlockModelLocation("brettl_rope_stake")); + MultiVariant stakeShort = plainVariant(AetherIIModelTemplates.decorateBlockModelLocation("brettl_rope_stake_short")); + MultiVariant knot = plainVariant(AetherIIModelTemplates.decorateBlockModelLocation("brettl_rope_knot")); + MultiVariant connection = plainVariant(AetherIIModelTemplates.decorateBlockModelLocation("brettl_rope_connection_lower")); + MultiVariant connectionSpoolFloor = plainVariant(AetherIIModelTemplates.decorateBlockModelLocation("brettl_rope_connection_spool_floor")); + MultiVariant spoolMiddle = plainVariant(AetherIIModelTemplates.decorateBlockModelLocation("brettl_rope_spool_middle")); + MultiVariant spoolFloor = plainVariant(AetherIIModelTemplates.decorateBlockModelLocation("brettl_rope_spool_floor")); MultiPartGenerator model = MultiPartGenerator.multiPart(block) .with(condition().term(RopeStakeBlock.CONNECTION, Direction.UP), stakeShort.with(X_ROT_180)) @@ -1185,44 +1185,41 @@ public void createClimbingRopeStake(Block block) { .with(condition().term(RopeStakeBlock.CONNECTION, Direction.EAST), stake.with(X_ROT_90).with(Y_ROT_270)) .with(condition().term(RopeStakeBlock.CONNECTION, Direction.SOUTH), stake.with(X_ROT_90)) .with(condition().term(RopeStakeBlock.CONNECTION, Direction.WEST), stake.with(X_ROT_90).with(Y_ROT_90)) - .with(condition().term(RopeStakeBlock.CONNECTION, Direction.UP), knot) .with(condition().term(RopeStakeBlock.CONNECTION, Direction.DOWN), knot) .with(condition().term(RopeStakeBlock.CONNECTION, Direction.NORTH), knot.with(X_ROT_90).with(Y_ROT_180)) .with(condition().term(RopeStakeBlock.CONNECTION, Direction.EAST), knot.with(X_ROT_90).with(Y_ROT_270)) .with(condition().term(RopeStakeBlock.CONNECTION, Direction.SOUTH), knot.with(X_ROT_90)) .with(condition().term(RopeStakeBlock.CONNECTION, Direction.WEST), knot.with(X_ROT_90).with(Y_ROT_90)) - .with(condition().term(RopeStakeBlock.CONNECTION, Direction.UP).term(RopeStakeBlock.SPOOL, AetherIIBlockStateProperties.StakeSpoolState.CENTER), spoolMiddle) .with(condition().term(RopeStakeBlock.CONNECTION, Direction.DOWN).term(RopeStakeBlock.SPOOL, AetherIIBlockStateProperties.StakeSpoolState.CENTER), spoolMiddle) .with(condition().term(RopeStakeBlock.CONNECTION, Direction.NORTH).term(RopeStakeBlock.SPOOL, AetherIIBlockStateProperties.StakeSpoolState.CENTER), spoolMiddle.with(X_ROT_90).with(Y_ROT_180)) .with(condition().term(RopeStakeBlock.CONNECTION, Direction.EAST).term(RopeStakeBlock.SPOOL, AetherIIBlockStateProperties.StakeSpoolState.CENTER), spoolMiddle.with(X_ROT_90).with(Y_ROT_270)) .with(condition().term(RopeStakeBlock.CONNECTION, Direction.SOUTH).term(RopeStakeBlock.SPOOL, AetherIIBlockStateProperties.StakeSpoolState.CENTER), spoolMiddle.with(X_ROT_90)) .with(condition().term(RopeStakeBlock.CONNECTION, Direction.WEST).term(RopeStakeBlock.SPOOL, AetherIIBlockStateProperties.StakeSpoolState.CENTER), spoolMiddle.with(X_ROT_90).with(Y_ROT_90)) - .with(condition().term(RopeStakeBlock.CONNECTION, Direction.UP).term(RopeStakeBlock.SPOOL, AetherIIBlockStateProperties.StakeSpoolState.FLOOR, AetherIIBlockStateProperties.StakeSpoolState.NONE_CONNECTED), connection) .with(condition().term(RopeStakeBlock.CONNECTION, Direction.DOWN).term(RopeStakeBlock.SPOOL, AetherIIBlockStateProperties.StakeSpoolState.FLOOR), connectionSpoolFloor) .with(condition().term(RopeStakeBlock.CONNECTION, Direction.NORTH).term(RopeStakeBlock.SPOOL, AetherIIBlockStateProperties.StakeSpoolState.FLOOR, AetherIIBlockStateProperties.StakeSpoolState.NONE_CONNECTED), connection) .with(condition().term(RopeStakeBlock.CONNECTION, Direction.EAST).term(RopeStakeBlock.SPOOL, AetherIIBlockStateProperties.StakeSpoolState.FLOOR, AetherIIBlockStateProperties.StakeSpoolState.NONE_CONNECTED), connection) .with(condition().term(RopeStakeBlock.CONNECTION, Direction.SOUTH).term(RopeStakeBlock.SPOOL, AetherIIBlockStateProperties.StakeSpoolState.FLOOR, AetherIIBlockStateProperties.StakeSpoolState.NONE_CONNECTED), connection) .with(condition().term(RopeStakeBlock.CONNECTION, Direction.WEST).term(RopeStakeBlock.SPOOL, AetherIIBlockStateProperties.StakeSpoolState.FLOOR, AetherIIBlockStateProperties.StakeSpoolState.NONE_CONNECTED), connection) - .with(condition().term(RopeStakeBlock.SPOOL, AetherIIBlockStateProperties.StakeSpoolState.FLOOR), spoolFloor); + this.registerSimpleFlatItemModel(block.asItem()); this.blockStateOutput.accept(model); } public void createClimbingRope(Block block) { - MultiVariant connectionLower = plainVariant(AetherIIModelTemplates.decorateBlockModelLocation("climbing_rope_connection_lower")); - MultiVariant connectionUpper = plainVariant(AetherIIModelTemplates.decorateBlockModelLocation("climbing_rope_connection_upper")); - MultiVariant knot = plainVariant(AetherIIModelTemplates.decorateBlockModelLocation("climbing_rope_knot")); - MultiVariant spoolFloor = plainVariant(AetherIIModelTemplates.decorateBlockModelLocation("climbing_rope_spool_floor")); - MultiVariant fray = plainVariant(AetherIIModelTemplates.decorateBlockModelLocation("climbing_rope_fray")); + MultiVariant connectionLower = plainVariant(AetherIIModelTemplates.decorateBlockModelLocation("brettl_rope_connection_lower")); + MultiVariant connectionUpper = plainVariant(AetherIIModelTemplates.decorateBlockModelLocation("brettl_rope_connection_upper")); + MultiVariant knot = plainVariant(AetherIIModelTemplates.decorateBlockModelLocation("brettl_rope_knot")); + MultiVariant spoolFloor = plainVariant(AetherIIModelTemplates.decorateBlockModelLocation("brettl_rope_spool_floor")); + MultiVariant fray = plainVariant(AetherIIModelTemplates.decorateBlockModelLocation("brettl_rope_fray")); MultiPartGenerator model = MultiPartGenerator.multiPart(block) .with(condition().term(RopeBlock.KNOT, true), knot) - .with(condition().term(RopeBlock.SPOOL, true), spoolFloor) - .with(condition().term(RopeBlock.END, true), fray) + .with(condition().term(RopeBlock.END, AetherIIBlockStateProperties.RopeEndState.SPOOL), spoolFloor) + .with(condition().term(RopeBlock.END, AetherIIBlockStateProperties.RopeEndState.END), fray) .with(condition().term(RopeBlock.UP, true), connectionUpper) .with(condition().term(RopeBlock.DOWN, true), connectionLower) .with(condition().term(RopeBlock.NORTH, true), connectionUpper.with(X_ROT_90)) @@ -1230,6 +1227,7 @@ public void createClimbingRope(Block block) { .with(condition().term(RopeBlock.SOUTH, true), connectionLower.with(X_ROT_90)) .with(condition().term(RopeBlock.WEST, true), connectionLower.with(X_ROT_90).with(Y_ROT_90)); + this.registerSimpleFlatItemModel(block.asItem()); this.blockStateOutput.accept(model); } diff --git a/src/main/java/com/aetherteam/aetherii/item/AetherIICreativeTabs.java b/src/main/java/com/aetherteam/aetherii/item/AetherIICreativeTabs.java index d7bb55df36..b5957d21bb 100644 --- a/src/main/java/com/aetherteam/aetherii/item/AetherIICreativeTabs.java +++ b/src/main/java/com/aetherteam/aetherii/item/AetherIICreativeTabs.java @@ -581,6 +581,7 @@ public class AetherIICreativeTabs { output.accept(AetherIIBlocks.ALKAHEST_PURIFIER.get()); output.accept(AetherIIBlocks.AMBROSIUM_CAMPFIRE.get()); output.accept(AetherIIBlocks.SKYROOT_LADDER.get()); + output.accept(AetherIIBlocks.BRETTL_ROPE_STAKE.get()); output.accept(AetherIIBlocks.SKYROOT_BOOKSHELF.get()); output.accept(AetherIIBlocks.GREATROOT_BOOKSHELF.get()); output.accept(AetherIIBlocks.WISPROOT_BOOKSHELF.get()); @@ -707,7 +708,7 @@ public class AetherIICreativeTabs { output.accept(AetherIIItems.SHIFTING_GLASS.get()); output.accept(AetherIIItems.AERBUNNY_BELL.get()); output.accept(AetherIIItems.BEAST_PELT_BUNDLE.get()); - output.accept(AetherIIBlocks.CLIMBING_ROPE_STAKE.get()); + output.accept(AetherIIBlocks.BRETTL_ROPE_STAKE.get()); output.accept(AetherIIItems.BRETTL_LASSO.get()); output.accept(AetherIIItems.MOA_SADDLE.get()); output.accept(AetherIIItems.MOA_SADDLEBAG.get()); @@ -873,7 +874,7 @@ public class AetherIICreativeTabs { output.accept(AetherIIItems.ARCTIC_SNOWBALL.get()); output.accept(AetherIIItems.VALKYRIE_WINGS.get()); output.accept(AetherIIItems.BRETTL_GRASS.get()); - output.accept(AetherIIItems.BRETTL_ROPE.get()); + output.accept(AetherIIBlocks.BRETTL_ROPE.get()); output.accept(AetherIIItems.CLOUDTWINE.get()); output.accept(AetherIIItems.BEAST_PELT.get()); output.accept(AetherIIItems.BURRUKAI_PLATE.get()); diff --git a/src/main/java/com/aetherteam/aetherii/item/AetherIIItems.java b/src/main/java/com/aetherteam/aetherii/item/AetherIIItems.java index a3020e2642..86aa8ccfe3 100644 --- a/src/main/java/com/aetherteam/aetherii/item/AetherIIItems.java +++ b/src/main/java/com/aetherteam/aetherii/item/AetherIIItems.java @@ -276,7 +276,6 @@ public class AetherIIItems { public static final DeferredItem AECHOR_PETAL = register("aechor_petal"); public static final DeferredItem BRETTL_CANE = register("brettl_cane", (properties) -> new BlockItem(AetherIIBlocks.BRETTL_PLANT_TIP.get(), properties.useItemDescriptionPrefix())); public static final DeferredItem BRETTL_GRASS = register("brettl_grass"); - public static final DeferredItem BRETTL_ROPE = register("brettl_rope"); public static final DeferredItem ARILUM_BULBS = register("arilum_bulbs", (properties) -> new BlockItem(AetherIIBlocks.ARILUM_SHOOT.get(), properties.useItemDescriptionPrefix())); public static final DeferredItem ARCTIC_SNOWBALL = register("arctic_snowball", ArcticSnowballItem::new); public static final DeferredItem SWET_GEL = register("swet_gel", SwetGelItem::new); diff --git a/src/main/resources/assets/aether_ii/models/block/climbing_rope_connection_lower.json b/src/main/resources/assets/aether_ii/models/block/brettl_rope_connection_lower.json similarity index 100% rename from src/main/resources/assets/aether_ii/models/block/climbing_rope_connection_lower.json rename to src/main/resources/assets/aether_ii/models/block/brettl_rope_connection_lower.json diff --git a/src/main/resources/assets/aether_ii/models/block/climbing_rope_connection_spool_floor.json b/src/main/resources/assets/aether_ii/models/block/brettl_rope_connection_spool_floor.json similarity index 100% rename from src/main/resources/assets/aether_ii/models/block/climbing_rope_connection_spool_floor.json rename to src/main/resources/assets/aether_ii/models/block/brettl_rope_connection_spool_floor.json diff --git a/src/main/resources/assets/aether_ii/models/block/climbing_rope_connection_upper.json b/src/main/resources/assets/aether_ii/models/block/brettl_rope_connection_upper.json similarity index 100% rename from src/main/resources/assets/aether_ii/models/block/climbing_rope_connection_upper.json rename to src/main/resources/assets/aether_ii/models/block/brettl_rope_connection_upper.json diff --git a/src/main/resources/assets/aether_ii/models/block/climbing_rope_fray.json b/src/main/resources/assets/aether_ii/models/block/brettl_rope_fray.json similarity index 100% rename from src/main/resources/assets/aether_ii/models/block/climbing_rope_fray.json rename to src/main/resources/assets/aether_ii/models/block/brettl_rope_fray.json diff --git a/src/main/resources/assets/aether_ii/models/block/climbing_rope_knot.json b/src/main/resources/assets/aether_ii/models/block/brettl_rope_knot.json similarity index 100% rename from src/main/resources/assets/aether_ii/models/block/climbing_rope_knot.json rename to src/main/resources/assets/aether_ii/models/block/brettl_rope_knot.json diff --git a/src/main/resources/assets/aether_ii/models/block/climbing_rope_spool_floor.json b/src/main/resources/assets/aether_ii/models/block/brettl_rope_spool_floor.json similarity index 100% rename from src/main/resources/assets/aether_ii/models/block/climbing_rope_spool_floor.json rename to src/main/resources/assets/aether_ii/models/block/brettl_rope_spool_floor.json diff --git a/src/main/resources/assets/aether_ii/models/block/climbing_rope_spool_middle.json b/src/main/resources/assets/aether_ii/models/block/brettl_rope_spool_middle.json similarity index 100% rename from src/main/resources/assets/aether_ii/models/block/climbing_rope_spool_middle.json rename to src/main/resources/assets/aether_ii/models/block/brettl_rope_spool_middle.json diff --git a/src/main/resources/assets/aether_ii/models/block/climbing_rope_stake.json b/src/main/resources/assets/aether_ii/models/block/brettl_rope_stake.json similarity index 100% rename from src/main/resources/assets/aether_ii/models/block/climbing_rope_stake.json rename to src/main/resources/assets/aether_ii/models/block/brettl_rope_stake.json diff --git a/src/main/resources/assets/aether_ii/models/block/climbing_rope_stake_short.json b/src/main/resources/assets/aether_ii/models/block/brettl_rope_stake_short.json similarity index 100% rename from src/main/resources/assets/aether_ii/models/block/climbing_rope_stake_short.json rename to src/main/resources/assets/aether_ii/models/block/brettl_rope_stake_short.json diff --git a/src/main/resources/assets/aether_ii/textures/item/climbing_rope_stake.png b/src/main/resources/assets/aether_ii/textures/item/brettl_rope_stake.png similarity index 100% rename from src/main/resources/assets/aether_ii/textures/item/climbing_rope_stake.png rename to src/main/resources/assets/aether_ii/textures/item/brettl_rope_stake.png From cc9b5144bc1cc76376085ebad5a143e0c68d67c6 Mon Sep 17 00:00:00 2001 From: bconlon Date: Tue, 11 Aug 2026 11:37:08 -0700 Subject: [PATCH 08/27] refactor: reduce breaking time of rope block --- src/main/java/com/aetherteam/aetherii/block/AetherIIBlocks.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/aetherteam/aetherii/block/AetherIIBlocks.java b/src/main/java/com/aetherteam/aetherii/block/AetherIIBlocks.java index d59e121694..60f0278cdd 100644 --- a/src/main/java/com/aetherteam/aetherii/block/AetherIIBlocks.java +++ b/src/main/java/com/aetherteam/aetherii/block/AetherIIBlocks.java @@ -741,7 +741,7 @@ public class AetherIIBlocks extends AetherIIBlockBuilders { public static final DeferredBlock SKYROOT_BARREL = register("skyroot_barrel", BarrelBlock::new, () -> Block.Properties.ofFullCopy(Blocks.BARREL)); public static final DeferredBlock SKYROOT_LADDER = register("skyroot_ladder", LadderBlock::new, () -> Block.Properties.ofFullCopy(Blocks.LADDER).strength(0.4F).sound(SoundType.LADDER).noOcclusion()); public static final DeferredBlock BRETTL_ROPE_STAKE = register("brettl_rope_stake", RopeStakeBlock::new, () -> Block.Properties.of().mapColor(MapColor.COLOR_BROWN).instrument(NoteBlockInstrument.GUITAR).strength(2.0F).sound(SoundType.WOOL).noOcclusion()); - public static final DeferredBlock BRETTL_ROPE = register("brettl_rope", RopeBlock::new, () -> Block.Properties.of().mapColor(MapColor.COLOR_BROWN).instrument(NoteBlockInstrument.GUITAR).strength(0.5F).sound(SoundType.WOOL).noOcclusion().ignitedByLava()); + public static final DeferredBlock BRETTL_ROPE = register("brettl_rope", RopeBlock::new, () -> Block.Properties.of().mapColor(MapColor.COLOR_BROWN).instrument(NoteBlockInstrument.GUITAR).strength(0.2F).sound(SoundType.WOOL).noOcclusion().ignitedByLava()); public static final DeferredBlock CLOUDWOOL_BEDROLL = register("cloudwool_bedroll", BedrollBlock::new, () -> Block.Properties.of().mapColor(MapColor.WOOL).sound(SoundType.WOOL).strength(0.2F).noOcclusion().ignitedByLava().pushReaction(PushReaction.DESTROY), AetherIIBlocks.bedrollBlockItem()); public static final DeferredBlock SKYROOT_BED = register("skyroot_bed", (properties) -> new SkyrootBedBlock(DyeColor.WHITE, properties), () -> Block.Properties.ofFullCopy(Blocks.WHITE_BED), AetherIIBlocks.bedBlockItem()); From 6f3986a7282cb41a947ae97ce2a2e7d440b11c7c Mon Sep 17 00:00:00 2001 From: Hugo Date: Tue, 11 Aug 2026 21:52:52 +0100 Subject: [PATCH 09/27] improv: Some fixes and further barrel and rope texture tweaks. --- .../textures/block/climbing_rope.png | Bin 2342 -> 2264 bytes .../textures/block/skyroot_barrel_bottom.png | Bin 2353 -> 2255 bytes .../textures/block/skyroot_barrel_side.png | Bin 2163 -> 2134 bytes .../textures/block/skyroot_barrel_top.png | Bin 2372 -> 2288 bytes .../block/skyroot_barrel_top_open.png | Bin 2314 -> 2235 bytes 5 files changed, 0 insertions(+), 0 deletions(-) diff --git a/src/main/resources/assets/aether_ii/textures/block/climbing_rope.png b/src/main/resources/assets/aether_ii/textures/block/climbing_rope.png index 0026bc7d662a384248d60d7dfa6f9be4aed88815..d5597fdcf78984c76d25161c3814a3815f519b88 100644 GIT binary patch delta 896 zcmV-`1AqLc64()tBmqOQC6WULGBG+dIFr8vCL~~Vq-BALt!zV@@wY z7W@Tlm9{_nr%0C8ee9>K;gEvQ{h_4$RKY2YfHo zQcnv$LaJt)lhdOL7472=j~j1-Zmr7a{b5$H4Jz?frdF~zJ|JmV$VwZ9N&YoE?;#8yL-?j=NlJ) z0B1vI=C73tZ~y=R32;bRa{vGf6951U69E94oEQLq00FH@L_t(Ijdhd1Yg17a$3G7q zNC+74W(cKIB4iAR&pJqwI{|5($PKD0JEDBjuI%IP(Deapw)q=^CA;Y`E zmENk;b@3cu;`1yA?ma&~=X>sr4i8_1Uq65F=Jf%ybOAs&X|b`Enla4M1)23!O_|Jk z`n`^S-fgTU_WmKx1!n1jMtz@}F-)d&`n?Xbbg@-zW38S^;n+FHcjo{!2w*au(@vTI zT&1^EO_^@eQYtAN@9jmHM-S*GEhf`B0PUp7a<$fA!Iq+#^?wP-nFIo4*0Zrzea#rE zrmS8GBv}N^tOw9w(c&t-)dqzG-J}Je1cKjxsPAhxfaPjUzt_>&{}Qy5rs^Uq%%d+? zYclJJZoYgD{{D`qPkK>akCW4*AnPjfO0Zmg#kp_n+OCMZUI^kw{W1Rj?w6M zI7EZNAON^O&snTesQ@q@kGF{Og)-}jOQjN{(Wo$JI2>wcnOXje{>GxjBHK+C4SoY7 W1x=LrVB#DA0000 delta 955 zcmV;s14R7T5vCH5BmqpZC6WUOFflqcH99pkle_~c2rw}^H8nalG_&ag5CI4W`QG2w|7 zOLurvxLHld7ln_71BP5s_}bAEE z?&G|qE}5H|me?lVib<3RA^eOpLYRJf7?io6p!BCpR+P!_{?4CbS#njGbqW|Pks^&n zK-9ccPfFB8Ps+$paQgqZXs@Q$*XvfV3qj?BZNGFt)dqYPZTo%Swm%QRcMoT|QvUKD z47`e7ENSh#(69z4=Orz%1*hxKa;L|Q__yQ}_i7qEA3=Q#nl7Pc-tF1XK8LrUtjbqi z!1fMw%K3(cFSadc3eY9>5tIG~7=QCgL_t(IjfIlIi&9Y(#(yt_a2_ahUFe_)x^O8( zFF_YWvy!NUR?@VQ**2|;p#NZ21G5g?6u5Pmg)2iy!|uve2`PvJy6^^1dRD93qV63P zqi=KIo_o&u&i5VX`1rp5_45bMpB>Sa0{}{19)M=6N3dFwP9>O3XSjP2Vt>LVn@JKE zg1J(Jf*^wLYr1k^6U|nSm~aVJOP)L~Ggpd|muIdN?T#dyNz#=A7AoL|@B1u$AHa46 zSg3%*0}p`F_=>I^5Ep{O1CMq`Qu6W?yd0tZeFt&tCM7RVv(*Ej;N@s{Byl0=%7LA3 zn59#RYX+>LQZ7>PasZ@L34hCGt`u=00LW&NOs2DI2Bz2uxKIHA!D>m#%Uewhv(fkp zcQ0ZY*ak*govqE1EH}cNsFCX+S27d;hKEBa&rRd8c z1uw^=2d|v^xJpuHyRlWW5Tsot~222(LG&xcvqXaJssfU^3=Ycou6ovySO~n zPPJOq0RG=|Hi$-}05lqnovWRlpXh}O2!+F8>h=20PqkW2Zx>X`MZ4C<9sCaq6%Z4y dEjAkb23oT-hXL3*6bt|W002ovPDHLkV1n!F#F_vA diff --git a/src/main/resources/assets/aether_ii/textures/block/skyroot_barrel_bottom.png b/src/main/resources/assets/aether_ii/textures/block/skyroot_barrel_bottom.png index 184e3136655f0b3b5212d8d7529562c47aa3f872..d3987a3cf7c039c8a608792eb5233d2a75928b60 100644 GIT binary patch delta 887 zcmV--1Bm>w63-E^w*v?=F*-9hIy5wszXK=;GBG+cH##&lv+n~D0SGcNIx{yqG&GY4 z1#SpVT?9k`00DxNegz$WL{SvSKQm~=h+<)3F$pU(`B7qHF%v^!F`n{k^X7SPM$L@Z zdm~M@%65tp8^0F(1#FeIQbbDDvLrU>Id5iaBy(=(p3nW>drtSB3tlCqrS0k-NN2KE zEE*2X&dmpWFVs>`3qC@sW}B1KqY4%6;|`A-Z-Q>E%IE&I`X$|e*1%IMJgk{kR(MQ! zVl8XBye-_KCDkS2Q{iq)E+~BK>hU5!yPPQUm&=wCi-5ODIFR_o@n5VZt+cSboQ`yA zRV&@ceTiSs%uGvc7jMHRMwBoC#u*{P0KE*!JV1~>Lb9SleorBPiWSM#WH!lRu}p#_ zS-M4CmFl`gLv&q#Mv9!<|G#~;jsCu3b$=LYo*d_`6MS3nop+qiL&y0(f~rTj$dvO} z4q)(I^n6+C*oVdqIJ+!s@f|qdgw_XBwbX)CCGIs0cs+rJIcUCyx`krTO8Xq&gR(AP zbp^Y7&?V;^7k>a}Lucl%l?!kH000SaNLh0L01m_e01m`|0hKEb8vpU zl0R<~K@i1Xq?K=$`y*qSY;-{+A{2-=>7b$ID?pd83MGh=#*$sw@|x4-*t_-4UPUqI zB??o`Y3JU&-^`qS`TP+;MtZ)e?9QeffZf@vo9q470*D+WKfAyG^zG~S{8?TWl+g?T z(F~_x9sxvu9{Yj)(cj&@Q}acYs-?87a_Ix0IW){;c9Jl)QFdp`f>iSq%{Bz0RU;eS*@j;v;v?ahm)S}S{HfZzPL0Tf~k$rOHJgU zGSWo8taABNtOM9@ZPH3$S2x${;?n&5@vAI`lj#S4{1<}J54=3LYQMG1W%c6xxd4d! zu62=v7!#zfbn>#5{`E?9rxWXcGOvq_yG@(wbksssYRwRf0)=WC{DNRbA`)fki{G1XmKVF3tOa zBL_7)UsV3+pUhF}BvQ3M`stS5f4G(F-K^Fb>BvDwyjiWEocCt6{tG@>3*k%gMdJVf N002ovPDHLkV1k7~s}BGG delta 986 zcmV<0110>=5wQ}mw*v?;F*-CjIx;zvzXK=;FflqbI65*pv+n~D0SGWLIy5*sGC7k7 z1#Sp$m5;{&00DuMegz$W!(kl9UpAVCrYH^$OXFmksl~-%ViXQDWw>nL{ZiX}`+m2y zT$QV$#Ko@ze*stJtQ3)wvmA*F>+AE~R$H>?>GS!#p7-;7K0VLp0ZS;YWb{T4WU@Ie z81Oq6!%I%v8_n4167xh9U7eku3{iJ{Jd`X4nw%{2kI7mnI1ZL}VP~?2qcyCgw2ZL499Jft zS1R{0U(y=SF3d~p73)DKNB}=hrkP+IA480a_umjzFh8EWuMbW2yMt$ z-N60<^vik2$}e`NXYG)RWg!3n010qNS#tmY4#WTe4#WX}l`9S#0005~Nkltp(`*t(^T==d^@bNt!<+fC({0xq9)Lf;uKI)CY!Yfx zX_EH`z0&)Cvy&i*0Jx5{WCehf72Fn)0iemG83B0w?c3 z6Qvnl{vHWS+O8v+Mw78*Wff;k&p1tnTi20KUpx}^hR58lS8cUh(zXGRQUIiFUtf+` zjius6Que9>fDmP`RwJeV-bAZqyxr{UjXEjixQ^q0I;&-D^k%!=c{Nu&dpY!~96s)cG0UAz20BMo~(4@qxH_tE5hj-KuzQgGu5~oU& zoX8M=89_=#QQ|t1$go%I&Zaem#XHUD^zDg=7fG?^PPYx9-tdYrg&)2VY1`$dUyb9u ze6Iw+XuZzY8)HamQhK$F(+*YBMjZj0NC^C6G^9~GrF{}3o=+W-In07*qo IM6N<$g8ORN$p8QV diff --git a/src/main/resources/assets/aether_ii/textures/block/skyroot_barrel_side.png b/src/main/resources/assets/aether_ii/textures/block/skyroot_barrel_side.png index f66c5968bfbb3d609c4e1cd1947dac3365489180..da8a460df2ecf0d1ab1fb5033a0e7e56303385ab 100644 GIT binary patch delta 765 zcmV5Y`Z|w*v?=F*-9hIx{tszXK=;GBG+cH###lv+n~D0SGcNIx{yqGc}V4 z1#Sq_qfDLv00DxNegz$WL{SvSKQm~=h+<)3F$pU(`B7qHF%v^!F`n{k^X7SPM$L@Z zdm~M@%65tp8^0F(1#FeIQbbDDvLrU>Id5iaBy(=(p3nW>drtSB3tlCqrS0k-NN2KE zEE*2X&dmpWFVs>`3qC@sW}B1KqY4%6;|`A-Z-Q>E%IE&I`X$|e*1%IMJgk{kR(MQ! zVl8XBye-_KCDkS2Q{iq)E+~BK>hU5!yPPQUm&=wCi-5ODIFR_o@n5VZt+cSboQ`yA zRV&@ceTiSs%uGvc7jMHRMwBoC#u*{P0KE*!JV1~>Lb9SleorBPiWSM#WH!lRu}p#_ zS-M4CmFl`gLv&q#Mv9!<|G#~;jsCu3b$=LYo*d_`6MS3nop+qiL&y0(f~rTj$dvO} z4q)(I^n6+C*oVdqIJ+!s@f|qdgw_XBwbX)CCGIs0cs+rJIcUCyx`krTO8Xq&gR(AP zbp^Y7&?V;^7k>a}Lucl%l?!kH000SaNLh0L01m_e01m`|0hKEb8vpgEzTNkB_6-x=-QP0N(?iy4tKS z&j%ro(kXy{kfWR7#limG?D-V{fL}T8v|CK%7Wv?`FInqy>2ufRvfVw>#)zkP(p3^s z>x78_$UNef=;EHw=2|D(7=^DAplv+n~D0SGWLIy5*sG&7S3 z1#So#$vdL}00DuMegz$W!(kl9UpAVCrYH^$OXFmksl~-%ViXQDWw>nL{ZiX}`+m2y zT$QV$#Ko@ze*stJtQ3)wvmA*F>+AE~R$H>?>GS!#p7-;7K0VLp0ZS;YWb{T4WU@Ie z81Oq6!%I%v8_n4167xh9U7eku3{iJ{Jd`X4nw%{2kI7mnI1ZL}VP~?2qcyCgw2ZL499Jft zS1R{0U(y=SF3d~p73)DKNB}=hrkP+IA480a_umjzFh8EWuMbW2yMt$ z-N60<^vik2$}e`NXYG)RWg!3n010qNS#tmY4#WTe4#WX}l`9S#0003$NklQ;H6WTmu{U3>ek;8^mlg1B||rNot9-bdE=te;nDCg zDCnI&^L~Eco66(UgClx*j(Yu5N0evQq-KW!_#EYkk~m>kp4pWn=gMDLt+$)oyDI?W zXu95Ru7?+YlE={$faJ=}{pHc&e*FFc0KlKDI_;(-vWskR-e+ND@#%G!#b>*FtizCV zdS~5$C2C!DL;&*4I#>FY0C08^Ct6o^7zX$@4y+vcVgOt$IRL;HkO3Wrd>Q<(fagjL z(zLG1ry~k{K(>^UWTQN@0VhdG9Pq`Sjj;e!VVBNbmBv_}zQX`aYJ5AB8rAAFN5cXC z;_GBS8V&%AqbalW|MRE!PFe@^*<$vVH0m`~K^iY6QQWB4s91WxWaaf0cIkEVV%{(L Y3rSgK7N@jJC;$Ke07*qoM6N<$f()H_tpET3 diff --git a/src/main/resources/assets/aether_ii/textures/block/skyroot_barrel_top.png b/src/main/resources/assets/aether_ii/textures/block/skyroot_barrel_top.png index e6aa4ae7ff215ef3c10932d9e838bf9553f04425..e827074adc7e1f401cb921bed55d1662d2d4f9f5 100644 GIT binary patch delta 914 zcmV;D18w}o67UhQw*v?=F*-9iIx#hqzXK=;GBG+cI65&kv+n~D0SGcNIx{#rF*TD2 z1#Sq3{>3=}00DxNegz|cXvBzOVPP=|D>L~~Vq-BALt!zV@@wY7W@Tlm9{_nr%0C8ee9>K;gEvQ{h_4$RKY z2YfHoQcnv$LaJt)lhdOL7472=j~j1-Zmr7a{b5$H4Jz?frdF~zJ|JmV$VwZ9N&YoE?;#8yL-?j z=NlJ)0B1vI=C73tZ~y=R32;bRa{vGi!~g&e!~vBn4jTY}00Fy6L_t(2kzJBKkJCU9 zh6l^?&Sq_&Wm#EdibP6xx{l!H0D(kBOF;p@_AY7eE*(0mNJ)_>4puP!xSe%HF}hXY zEmpJInP*d2a|7IsWof8SP22QD zgU+>wQd%0^90bbSoBR6Ipp?tSimkg!l+q_-_~)I9;)<8$`t56;Qgy8U)Lq-rVORQW z-PKf8$0~}|e16G}+orcPxOK8*{3MP0r(TUz+ffuEJ==4E!}U+S&b43eOKv@xO}Fcf oKxxV7T%(lR_2$3z-mW))0p#WUYc4=qQvd(}07*qoM6N<$f-=yqvj6}9 delta 999 zcmV-wYM8QPP_^_waTCS*J>A&rV5^F;bB#OH!R^X;fWPXcX(5{ zSxv_mg^z^;hFnni+R+m(KRTRp`NLsDiH5=3DC|%D;>0gj(?(WUUQT;9lUIN4sGG|LFI#OzjQ#=27DH6`+eWGKM%ln4`;bj{_-9Syoz2d zY3;kvum&gRB`vW9r|Zyir^k)>x8xJ|Y8pHrL46FGE}>@L?b**hhqs`t%2!>$_6~H) z`G$orwk>E1&?WT|00009a7bBm000ie000ie0hKEb8vp=*0uV_=K~yM_Rgz0@(?Ae_ zr;gc2Y;P>rc@Tx3Dpb-4C6ETSg;FF=Jt6hL8TDr%@qajQaDUQMUkYKNAfuZ%h{zYd4D~=QTshdep)77&9iF&@+%AKWhHe*u?^ V0xUF=H=+Ol002ovPDHLkV1l~#*YE%U diff --git a/src/main/resources/assets/aether_ii/textures/block/skyroot_barrel_top_open.png b/src/main/resources/assets/aether_ii/textures/block/skyroot_barrel_top_open.png index e23f07012fe1eed5d57bd2a7e275a52f32f4f921..2d3aeef08a7c42e2ba1551b8df2289777918d62b 100644 GIT binary patch delta 861 zcmV-j1ETzj61x$ww*v?=F*-9iIxsYozXK=;GBG+cI65#iv+n~D0SGcNIx{#rFf@}0 z1#SqgO2LBw00DxNegz|cXvBzOVPP=|D>L~~Vq-BALt!zV@@wY7W@Tlm9{_nr%0C8ee9>K;gEvQ{h_4$RKY z2YfHoQcnv$LaJt)lhdOL7472=j~j1-Zmr7a{b5$H4Jz?frdF~zJ|JmV$VwZ9N&YoE?;#8yL-?j z=NlJ)0B1vI=C73tZ~y=R32;bRa{vGi!~g&e!~vBn4jTY}00D+cL_t(2k!4anZ`&{s zeLfS?(Xti82*AP}5+GaGW^0%Jj`Zg?Te@~LU=InRRCN-4ghxS^J6y^L>4C%X_}=4@ z_a@)3z5z(tE?0SRSHv7ZaaWvOoZsIT0D^eUP0IHA$Ion*0a(mA<%GE{A4&is-S3CT zAYI)EfSa3tUzeAk%yN}SG=Q?K@Lw$ETsM-Bi81t;hUTUZittM{I474!}vCYjxZY5do8ImM!L7mK9q|;=RsAIm}7lANu|f z?@=GTJ^E>10f@64A8V+VPBw@)%T?aKwAn1v(&=fgL(qp|5`N+xgu6<9hFB00000NkvXXu0mjf2+oiw delta 940 zcmV;d15^CF5sDJ9w*v?;GCDCcIx{enzXK=;FfuwZGdeRcv+n~D0SGWMIx#akGcc0~ z1#SrB5y!;<00DuMegz|cL*z#k3k!=$Sk1_f5-E$B7z&H=l)+}^nKz?m#_PQ|X|h$e zQ-wYM8QPP_^_waTCS*J>A&rV5^F;bB#OH!R^X;fWPXcX(5{ zSxv_mg^z^;hFnni+R+m(KRTRp`NLsDiH5=3DC|%D;>0gj(?(WUUQT;9lUIN4sGG|LFI#OzjQ#=27DH6`+eWGKM%ln4`;bj{_-9Syoz2d zY3;kvum&gRB`vW9r|Zyir^k)>x8xJ|Y8pHrL46FGE}>@L?b**hhqs`t%2!>$_6~H) z`G$orwk>E1&?WT|00009a7bBm000ie000ie0hKEb8vp=*0oF-GK~yM_Wm3&<(?A#; zuQ!{Gow$}8rJ)KvRj6vKC>1R&Z~(5Hkaz;r$3WtJIB?}PxPZg~Ayk?uPTeH+?>ey^ z4xh4w@@WsdtC`vPc0S|s@^vr?+MTxRIsVAMnap~7yRPQ|`0@Sc@yXG6=;tbn!i4t5 z`w#Cvef(^HTQ-1JQ`V)BQUCy;)B-@R7E!DKBx%y^Z1b;QzG*aoAPDhawVE=Dm2KIN zFZ#UY*g!y60Pe!SgrX=pH@6%oiWLFo(~#9=L!)n}v!W<9fpZf;6i50U0L=BAx)h|% zxk(_>ro|Y$3&SW@bt$f|My6wPDMc8jNs=`V9#Hj=V}39%W){(O+Sn=z_2a5)s(qf$VP*yETdeABc&*c zvM5S#>Kg#f0e~o0;VZu=wv O0000 Date: Tue, 11 Aug 2026 23:40:28 +0100 Subject: [PATCH 10/27] fix: Included Amberoot Slabs in correct crafting tags (fixes Barrel crafting with Amberoot Slabs). --- .../resources/data/minecraft/tags/block/wooden_slabs.json | 3 ++- .../resources/data/minecraft/tags/item/wooden_slabs.json | 3 ++- .../aetherii/data/providers/AetherIIBlockItemTagProvider.java | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/generated/resources/data/minecraft/tags/block/wooden_slabs.json b/src/generated/resources/data/minecraft/tags/block/wooden_slabs.json index d7c1e27ac6..6f7a2ccc75 100644 --- a/src/generated/resources/data/minecraft/tags/block/wooden_slabs.json +++ b/src/generated/resources/data/minecraft/tags/block/wooden_slabs.json @@ -3,6 +3,7 @@ "aether_ii:skyroot_slab", "aether_ii:greatroot_slab", "aether_ii:wisproot_slab", - "aether_ii:wisproot_slab" + "aether_ii:wisproot_slab", + "aether_ii:amberoot_slab" ] } \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/item/wooden_slabs.json b/src/generated/resources/data/minecraft/tags/item/wooden_slabs.json index d7c1e27ac6..6f7a2ccc75 100644 --- a/src/generated/resources/data/minecraft/tags/item/wooden_slabs.json +++ b/src/generated/resources/data/minecraft/tags/item/wooden_slabs.json @@ -3,6 +3,7 @@ "aether_ii:skyroot_slab", "aether_ii:greatroot_slab", "aether_ii:wisproot_slab", - "aether_ii:wisproot_slab" + "aether_ii:wisproot_slab", + "aether_ii:amberoot_slab" ] } \ No newline at end of file diff --git a/src/main/java/com/aetherteam/aetherii/data/providers/AetherIIBlockItemTagProvider.java b/src/main/java/com/aetherteam/aetherii/data/providers/AetherIIBlockItemTagProvider.java index 31db871a62..415d640ea5 100644 --- a/src/main/java/com/aetherteam/aetherii/data/providers/AetherIIBlockItemTagProvider.java +++ b/src/main/java/com/aetherteam/aetherii/data/providers/AetherIIBlockItemTagProvider.java @@ -497,7 +497,8 @@ public void run() { AetherIIBlocks.SKYROOT_SLAB.get(), AetherIIBlocks.GREATROOT_SLAB.get(), AetherIIBlocks.WISPROOT_SLAB.get(), - AetherIIBlocks.WISPROOT_SLAB.get() + AetherIIBlocks.WISPROOT_SLAB.get(), + AetherIIBlocks.AMBEROOT_SLAB.get() ); this.tag(BlockTags.WOODEN_FENCES, ItemTags.WOODEN_FENCES).add( AetherIIBlocks.SKYROOT_FENCE.get(), From 99f21ac18fa49f7a930ffabc7e5d383803d0cfc6 Mon Sep 17 00:00:00 2001 From: bconlon Date: Tue, 11 Aug 2026 18:19:26 -0700 Subject: [PATCH 11/27] refactor: more rope work --- .../aetherteam/aetherii/block/AetherIIBlocks.java | 4 ++-- .../aetherii/block/utility/RopeBlock.java | 13 ++++--------- .../aetherii/block/utility/RopeStakeBlock.java | 5 +++++ 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/aetherteam/aetherii/block/AetherIIBlocks.java b/src/main/java/com/aetherteam/aetherii/block/AetherIIBlocks.java index 60f0278cdd..8a109014e4 100644 --- a/src/main/java/com/aetherteam/aetherii/block/AetherIIBlocks.java +++ b/src/main/java/com/aetherteam/aetherii/block/AetherIIBlocks.java @@ -740,8 +740,8 @@ public class AetherIIBlocks extends AetherIIBlockBuilders { public static final DeferredBlock SKYROOT_CHEST = register("skyroot_chest", (properties) -> new SkyrootChestBlock(properties, AetherIIBlockEntityTypes.SKYROOT_CHEST::get), () -> Block.Properties.ofFullCopy(Blocks.CHEST)); public static final DeferredBlock SKYROOT_BARREL = register("skyroot_barrel", BarrelBlock::new, () -> Block.Properties.ofFullCopy(Blocks.BARREL)); public static final DeferredBlock SKYROOT_LADDER = register("skyroot_ladder", LadderBlock::new, () -> Block.Properties.ofFullCopy(Blocks.LADDER).strength(0.4F).sound(SoundType.LADDER).noOcclusion()); - public static final DeferredBlock BRETTL_ROPE_STAKE = register("brettl_rope_stake", RopeStakeBlock::new, () -> Block.Properties.of().mapColor(MapColor.COLOR_BROWN).instrument(NoteBlockInstrument.GUITAR).strength(2.0F).sound(SoundType.WOOL).noOcclusion()); - public static final DeferredBlock BRETTL_ROPE = register("brettl_rope", RopeBlock::new, () -> Block.Properties.of().mapColor(MapColor.COLOR_BROWN).instrument(NoteBlockInstrument.GUITAR).strength(0.2F).sound(SoundType.WOOL).noOcclusion().ignitedByLava()); + public static final DeferredBlock BRETTL_ROPE_STAKE = register("brettl_rope_stake", RopeStakeBlock::new, () -> Block.Properties.of().mapColor(MapColor.COLOR_BROWN).instrument(NoteBlockInstrument.GUITAR).strength(2.0F).sound(SoundType.WOOL)); + public static final DeferredBlock BRETTL_ROPE = register("brettl_rope", RopeBlock::new, () -> Block.Properties.of().mapColor(MapColor.COLOR_BROWN).instrument(NoteBlockInstrument.GUITAR).strength(0.2F).sound(SoundType.WOOL).ignitedByLava()); public static final DeferredBlock CLOUDWOOL_BEDROLL = register("cloudwool_bedroll", BedrollBlock::new, () -> Block.Properties.of().mapColor(MapColor.WOOL).sound(SoundType.WOOL).strength(0.2F).noOcclusion().ignitedByLava().pushReaction(PushReaction.DESTROY), AetherIIBlocks.bedrollBlockItem()); public static final DeferredBlock SKYROOT_BED = register("skyroot_bed", (properties) -> new SkyrootBedBlock(DyeColor.WHITE, properties), () -> Block.Properties.ofFullCopy(Blocks.WHITE_BED), AetherIIBlocks.bedBlockItem()); diff --git a/src/main/java/com/aetherteam/aetherii/block/utility/RopeBlock.java b/src/main/java/com/aetherteam/aetherii/block/utility/RopeBlock.java index 36ae162a9c..9ed551bff5 100644 --- a/src/main/java/com/aetherteam/aetherii/block/utility/RopeBlock.java +++ b/src/main/java/com/aetherteam/aetherii/block/utility/RopeBlock.java @@ -1,5 +1,6 @@ package com.aetherteam.aetherii.block.utility; +import com.aetherteam.aetherii.AetherII; import com.aetherteam.aetherii.block.AetherIIBlockStateProperties; import com.aetherteam.aetherii.block.AetherIIBlocks; import net.minecraft.core.BlockPos; @@ -45,6 +46,8 @@ public class RopeBlock extends Block implements SimpleWaterloggedBlock { public static final BooleanProperty WEST = BlockStateProperties.WEST; public static final BooleanProperty WATERLOGGED = BlockStateProperties.WATERLOGGED; public static final Map PROPERTY_BY_DIRECTION = PipeBlock.PROPERTY_BY_DIRECTION; + public static final Map SHAPE_CONNECTIONS = Shapes.rotateAll(Block.box(6, 6, 0, 10, 10, 8)); + public static final VoxelShape SHAPE_KNOT = Block.box(6, 6, 6, 10, 10, 10); public static final int MAX_LENGTH = 16; public static final int DELAY = 4; @@ -107,7 +110,7 @@ protected BlockState updateShape(BlockState state, LevelReader levelReader, Sche } if (!state.isAir()) { if (state.getValue(KNOT) || this.getExistingConnectionAxis(state) == direction.getAxis()) { - state = state.setValue(PROPERTY_BY_DIRECTION.get(direction), neighborState.isSolid() || neighborState.is(this)); + state = state.setValue(PROPERTY_BY_DIRECTION.get(direction), neighborState.isSolid() || neighborState.is(this)); //todo use issturdy check } } @@ -185,9 +188,6 @@ public boolean checkForStake(LevelReader levelReader, BlockPos pos) { return false; } - public static final Map SHAPE_CONNECTIONS = Shapes.rotateAll(Block.box(6, 6, 0, 10, 10, 8)); - public static final VoxelShape SHAPE_KNOT = Block.box(6, 6, 6, 10, 10, 10); - @Override protected VoxelShape getShape(BlockState state, BlockGetter level, BlockPos pos, CollisionContext context) { //todo // VoxelShape spool = Block.box(4, 0, 4, 12, 2, 12); @@ -224,11 +224,6 @@ protected VoxelShape getCollisionShape(BlockState state, BlockGetter level, Bloc } } - @Override - public VoxelShape getVisualShape(BlockState state, BlockGetter level, BlockPos pos, CollisionContext context) { - return Shapes.empty(); - } - @Override protected boolean skipRendering(BlockState state, BlockState neighborState, Direction direction) { return neighborState.is(this) || neighborState.is(AetherIIBlocks.BRETTL_ROPE_STAKE) || super.skipRendering(state, neighborState, direction); //todo also not working for some reason diff --git a/src/main/java/com/aetherteam/aetherii/block/utility/RopeStakeBlock.java b/src/main/java/com/aetherteam/aetherii/block/utility/RopeStakeBlock.java index 213803cfd0..3348fb5722 100644 --- a/src/main/java/com/aetherteam/aetherii/block/utility/RopeStakeBlock.java +++ b/src/main/java/com/aetherteam/aetherii/block/utility/RopeStakeBlock.java @@ -143,4 +143,9 @@ protected boolean propagatesSkylightDown(BlockState state) { public boolean isLadder(BlockState state, LevelReader level, BlockPos pos, LivingEntity entity) { return true; } + + @Override + public boolean isScaffolding(BlockState state, LevelReader level, BlockPos pos, LivingEntity entity) { + return true; + } } From 97f75336b2a6589d2671c32a2eee2300df238208 Mon Sep 17 00:00:00 2001 From: bconlon Date: Tue, 11 Aug 2026 18:41:38 -0700 Subject: [PATCH 12/27] fix: missing cullfaces --- .../aether_ii/models/block/brettl_rope_connection_lower.json | 3 +-- .../aether_ii/models/block/brettl_rope_connection_upper.json | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main/resources/assets/aether_ii/models/block/brettl_rope_connection_lower.json b/src/main/resources/assets/aether_ii/models/block/brettl_rope_connection_lower.json index c2e68b8a74..277f9df3ff 100644 --- a/src/main/resources/assets/aether_ii/models/block/brettl_rope_connection_lower.json +++ b/src/main/resources/assets/aether_ii/models/block/brettl_rope_connection_lower.json @@ -16,8 +16,7 @@ "east": {"uv": [14, 0, 16, 8], "texture": "#texture"}, "south": {"uv": [14, 0, 16, 8], "texture": "#texture"}, "west": {"uv": [14, 0, 16, 8], "texture": "#texture"}, - "up": {"uv": [12, 14, 14, 16], "texture": "#texture"}, - "down": {"uv": [10, 14, 12, 16], "texture": "#texture"} + "down": {"uv": [10, 14, 12, 16], "texture": "#texture", "cullface": "down"} } } ], diff --git a/src/main/resources/assets/aether_ii/models/block/brettl_rope_connection_upper.json b/src/main/resources/assets/aether_ii/models/block/brettl_rope_connection_upper.json index 3515189ccf..800d0f47f0 100644 --- a/src/main/resources/assets/aether_ii/models/block/brettl_rope_connection_upper.json +++ b/src/main/resources/assets/aether_ii/models/block/brettl_rope_connection_upper.json @@ -16,8 +16,7 @@ "east": {"uv": [14, 0, 16, 8], "texture": "#texture"}, "south": {"uv": [14, 0, 16, 8], "texture": "#texture"}, "west": {"uv": [14, 0, 16, 8], "texture": "#texture"}, - "up": {"uv": [12, 14, 14, 16], "texture": "#texture"}, - "down": {"uv": [10, 14, 12, 16], "texture": "#texture"} + "up": {"uv": [12, 14, 14, 16], "texture": "#texture", "cullface": "up"} } } ], From c52049d844f5b74f33c974339c7f20042011a9f1 Mon Sep 17 00:00:00 2001 From: bconlon Date: Tue, 11 Aug 2026 18:55:07 -0700 Subject: [PATCH 13/27] fix: more culling issues --- .../aetherii/block/utility/RopeBlock.java | 31 +++++++++---------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/aetherteam/aetherii/block/utility/RopeBlock.java b/src/main/java/com/aetherteam/aetherii/block/utility/RopeBlock.java index 9ed551bff5..a52d5595ab 100644 --- a/src/main/java/com/aetherteam/aetherii/block/utility/RopeBlock.java +++ b/src/main/java/com/aetherteam/aetherii/block/utility/RopeBlock.java @@ -1,8 +1,6 @@ package com.aetherteam.aetherii.block.utility; -import com.aetherteam.aetherii.AetherII; import com.aetherteam.aetherii.block.AetherIIBlockStateProperties; -import com.aetherteam.aetherii.block.AetherIIBlocks; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; @@ -15,10 +13,7 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelReader; import net.minecraft.world.level.ScheduledTickAccess; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.PipeBlock; -import net.minecraft.world.level.block.SimpleWaterloggedBlock; +import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.block.state.properties.BlockStateProperties; @@ -47,6 +42,7 @@ public class RopeBlock extends Block implements SimpleWaterloggedBlock { public static final BooleanProperty WATERLOGGED = BlockStateProperties.WATERLOGGED; public static final Map PROPERTY_BY_DIRECTION = PipeBlock.PROPERTY_BY_DIRECTION; public static final Map SHAPE_CONNECTIONS = Shapes.rotateAll(Block.box(6, 6, 0, 10, 10, 8)); + public static final Map SHAPE_OCCLUSION_CONNECTIONS = Shapes.rotateAll(Block.box(7, 7, 0, 9, 9, 8)); public static final VoxelShape SHAPE_KNOT = Block.box(6, 6, 6, 10, 10, 10); public static final int MAX_LENGTH = 16; public static final int DELAY = 4; @@ -90,10 +86,6 @@ protected void tick(BlockState state, ServerLevel level, BlockPos pos, RandomSou // } else { // level.setBlock(pos, state.setValue(DOWN, true).setValue(END, false).setValue(SPOOL, true), 1 | 2); // } - - - - } @Override @@ -110,7 +102,7 @@ protected BlockState updateShape(BlockState state, LevelReader levelReader, Sche } if (!state.isAir()) { if (state.getValue(KNOT) || this.getExistingConnectionAxis(state) == direction.getAxis()) { - state = state.setValue(PROPERTY_BY_DIRECTION.get(direction), neighborState.isSolid() || neighborState.is(this)); //todo use issturdy check + state = state.setValue(PROPERTY_BY_DIRECTION.get(direction), neighborState.isFaceSturdy(levelReader, neighborPos, direction.getOpposite(), SupportType.CENTER) || neighborState.is(this)); //todo use issturdy check } } @@ -140,8 +132,9 @@ public BlockState getStateForPlacement(BlockPlaceContext context) { FluidState fluidState = level.getFluidState(pos); BlockState blockState = this.defaultBlockState().setValue(KNOT, true); for (Map.Entry entry : PROPERTY_BY_DIRECTION.entrySet()) { - BlockState neighborState = level.getBlockState(pos.relative(entry.getKey())); - blockState = blockState.setValue(entry.getValue(), neighborState.isSolid()); + BlockPos neighborPos = pos.relative(entry.getKey()); + BlockState neighborState = level.getBlockState(neighborPos); + blockState = blockState.setValue(entry.getValue(), neighborState.isFaceSturdy(level, neighborPos, entry.getKey().getOpposite(), SupportType.CENTER)); } return blockState.setValue(WATERLOGGED, fluidState.is(Fluids.WATER)); } @@ -189,7 +182,7 @@ public boolean checkForStake(LevelReader levelReader, BlockPos pos) { } @Override - protected VoxelShape getShape(BlockState state, BlockGetter level, BlockPos pos, CollisionContext context) { //todo + protected VoxelShape getShape(BlockState state, BlockGetter level, BlockPos pos, CollisionContext context) { //todo cache shapes // VoxelShape spool = Block.box(4, 0, 4, 12, 2, 12); VoxelShape shape = Shapes.empty(); for (Map.Entry entry : PROPERTY_BY_DIRECTION.entrySet()) { @@ -225,8 +218,14 @@ protected VoxelShape getCollisionShape(BlockState state, BlockGetter level, Bloc } @Override - protected boolean skipRendering(BlockState state, BlockState neighborState, Direction direction) { - return neighborState.is(this) || neighborState.is(AetherIIBlocks.BRETTL_ROPE_STAKE) || super.skipRendering(state, neighborState, direction); //todo also not working for some reason + protected VoxelShape getOcclusionShape(BlockState state) { + VoxelShape shape = Shapes.empty(); + for (Map.Entry entry : PROPERTY_BY_DIRECTION.entrySet()) { + if (state.getValue(entry.getValue())) { + shape = Shapes.or(shape, SHAPE_OCCLUSION_CONNECTIONS.get(entry.getKey())); + } + } + return shape; } @Override From 89fe166611a2fdfd5a3f80c1a928c9b75c2e3e2b Mon Sep 17 00:00:00 2001 From: bconlon Date: Tue, 11 Aug 2026 19:01:25 -0700 Subject: [PATCH 14/27] refactor: adjust climbing rope stack size to 16 --- .../java/com/aetherteam/aetherii/block/AetherIIBlocks.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/aetherteam/aetherii/block/AetherIIBlocks.java b/src/main/java/com/aetherteam/aetherii/block/AetherIIBlocks.java index 8a109014e4..3cccd0442d 100644 --- a/src/main/java/com/aetherteam/aetherii/block/AetherIIBlocks.java +++ b/src/main/java/com/aetherteam/aetherii/block/AetherIIBlocks.java @@ -740,7 +740,7 @@ public class AetherIIBlocks extends AetherIIBlockBuilders { public static final DeferredBlock SKYROOT_CHEST = register("skyroot_chest", (properties) -> new SkyrootChestBlock(properties, AetherIIBlockEntityTypes.SKYROOT_CHEST::get), () -> Block.Properties.ofFullCopy(Blocks.CHEST)); public static final DeferredBlock SKYROOT_BARREL = register("skyroot_barrel", BarrelBlock::new, () -> Block.Properties.ofFullCopy(Blocks.BARREL)); public static final DeferredBlock SKYROOT_LADDER = register("skyroot_ladder", LadderBlock::new, () -> Block.Properties.ofFullCopy(Blocks.LADDER).strength(0.4F).sound(SoundType.LADDER).noOcclusion()); - public static final DeferredBlock BRETTL_ROPE_STAKE = register("brettl_rope_stake", RopeStakeBlock::new, () -> Block.Properties.of().mapColor(MapColor.COLOR_BROWN).instrument(NoteBlockInstrument.GUITAR).strength(2.0F).sound(SoundType.WOOL)); + public static final DeferredBlock BRETTL_ROPE_STAKE = register("brettl_rope_stake", RopeStakeBlock::new, () -> Block.Properties.of().mapColor(MapColor.COLOR_BROWN).instrument(NoteBlockInstrument.GUITAR).strength(2.0F).sound(SoundType.WOOL), AetherIIBlocks.brettlRopeStakeItem()); public static final DeferredBlock BRETTL_ROPE = register("brettl_rope", RopeBlock::new, () -> Block.Properties.of().mapColor(MapColor.COLOR_BROWN).instrument(NoteBlockInstrument.GUITAR).strength(0.2F).sound(SoundType.WOOL).ignitedByLava()); public static final DeferredBlock CLOUDWOOL_BEDROLL = register("cloudwool_bedroll", BedrollBlock::new, () -> Block.Properties.of().mapColor(MapColor.WOOL).sound(SoundType.WOOL).strength(0.2F).noOcclusion().ignitedByLava().pushReaction(PushReaction.DESTROY), AetherIIBlocks.bedrollBlockItem()); @@ -927,6 +927,10 @@ private static BiFunction stan return (standingBlock, properties) -> new StandingAndWallBlockItem(standingBlock, Objects.requireNonNull(wallBlock.get().get()), attachmentDirection, properties); } + private static BiFunction brettlRopeStakeItem() { + return (block, properties) -> new BlockItem(block, properties.stacksTo(16)); + } + private static BiFunction bedrollBlockItem() { return (bedrollBlock, properties) -> new BedItem(bedrollBlock, properties.stacksTo(4)); } From 916f118b902cd02aa0d83d851963e964d46723fe Mon Sep 17 00:00:00 2001 From: bconlon Date: Thu, 13 Aug 2026 16:42:11 -0700 Subject: [PATCH 15/27] fix: missing rope ends on non full pieces --- .../aether_ii/blockstates/brettl_rope.json | 64 ++++++++++++++++++- .../block/AetherIIBlockStateProperties.java | 5 +- .../aetherii/block/utility/RopeBlock.java | 53 +++++++-------- .../generators/loot/AetherIIBlockLoot.java | 2 +- .../AetherIIBlockModelSubProvider.java | 16 +++-- .../models/block/brettl_rope_cap_lower.json | 28 ++++++++ .../models/block/brettl_rope_cap_upper.json | 28 ++++++++ 7 files changed, 156 insertions(+), 40 deletions(-) create mode 100644 src/main/resources/assets/aether_ii/models/block/brettl_rope_cap_lower.json create mode 100644 src/main/resources/assets/aether_ii/models/block/brettl_rope_cap_upper.json diff --git a/src/generated/resources/assets/aether_ii/blockstates/brettl_rope.json b/src/generated/resources/assets/aether_ii/blockstates/brettl_rope.json index f6739a7b23..b96c20161e 100644 --- a/src/generated/resources/assets/aether_ii/blockstates/brettl_rope.json +++ b/src/generated/resources/assets/aether_ii/blockstates/brettl_rope.json @@ -13,7 +13,7 @@ "model": "aether_ii:block/brettl_rope_spool_floor" }, "when": { - "rope_end": "spool" + "rope_end": "spooled" } }, { @@ -21,7 +21,7 @@ "model": "aether_ii:block/brettl_rope_fray" }, "when": { - "rope_end": "end" + "rope_end": "frayed" } }, { @@ -32,6 +32,15 @@ "up": "true" } }, + { + "apply": { + "model": "aether_ii:block/brettl_rope_cap_upper" + }, + "when": { + "down": "false", + "up": "true" + } + }, { "apply": { "model": "aether_ii:block/brettl_rope_connection_lower" @@ -40,6 +49,15 @@ "down": "true" } }, + { + "apply": { + "model": "aether_ii:block/brettl_rope_cap_lower" + }, + "when": { + "down": "true", + "up": "false" + } + }, { "apply": { "model": "aether_ii:block/brettl_rope_connection_upper", @@ -49,6 +67,16 @@ "north": "true" } }, + { + "apply": { + "model": "aether_ii:block/brettl_rope_cap_upper", + "x": 90 + }, + "when": { + "north": "true", + "south": "false" + } + }, { "apply": { "model": "aether_ii:block/brettl_rope_connection_upper", @@ -59,6 +87,17 @@ "east": "true" } }, + { + "apply": { + "model": "aether_ii:block/brettl_rope_cap_upper", + "x": 90, + "y": 90 + }, + "when": { + "east": "true", + "west": "false" + } + }, { "apply": { "model": "aether_ii:block/brettl_rope_connection_lower", @@ -68,6 +107,16 @@ "south": "true" } }, + { + "apply": { + "model": "aether_ii:block/brettl_rope_cap_lower", + "x": 90 + }, + "when": { + "north": "false", + "south": "true" + } + }, { "apply": { "model": "aether_ii:block/brettl_rope_connection_lower", @@ -77,6 +126,17 @@ "when": { "west": "true" } + }, + { + "apply": { + "model": "aether_ii:block/brettl_rope_cap_lower", + "x": 90, + "y": 90 + }, + "when": { + "east": "false", + "west": "true" + } } ] } \ No newline at end of file diff --git a/src/main/java/com/aetherteam/aetherii/block/AetherIIBlockStateProperties.java b/src/main/java/com/aetherteam/aetherii/block/AetherIIBlockStateProperties.java index 00709587b2..8af83c6cf0 100644 --- a/src/main/java/com/aetherteam/aetherii/block/AetherIIBlockStateProperties.java +++ b/src/main/java/com/aetherteam/aetherii/block/AetherIIBlockStateProperties.java @@ -1,7 +1,6 @@ package com.aetherteam.aetherii.block; import com.mojang.serialization.Codec; -import net.minecraft.core.Direction; import net.minecraft.util.StringRepresentable; import net.minecraft.world.level.block.state.properties.BooleanProperty; import net.minecraft.world.level.block.state.properties.EnumProperty; @@ -75,8 +74,8 @@ public String getSerializedName() { public enum RopeEndState implements StringRepresentable { NONE, - SPOOL, - END; + SPOOLED, + FRAYED; @Override public String getSerializedName() { diff --git a/src/main/java/com/aetherteam/aetherii/block/utility/RopeBlock.java b/src/main/java/com/aetherteam/aetherii/block/utility/RopeBlock.java index a52d5595ab..cb6dfdfa5b 100644 --- a/src/main/java/com/aetherteam/aetherii/block/utility/RopeBlock.java +++ b/src/main/java/com/aetherteam/aetherii/block/utility/RopeBlock.java @@ -1,6 +1,7 @@ package com.aetherteam.aetherii.block.utility; import com.aetherteam.aetherii.block.AetherIIBlockStateProperties; +import com.aetherteam.aetherii.block.AetherIIBlocks; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; @@ -9,10 +10,7 @@ import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.context.BlockPlaceContext; -import net.minecraft.world.level.BlockGetter; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.LevelReader; -import net.minecraft.world.level.ScheduledTickAccess; +import net.minecraft.world.level.*; import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition; @@ -44,7 +42,6 @@ public class RopeBlock extends Block implements SimpleWaterloggedBlock { public static final Map SHAPE_CONNECTIONS = Shapes.rotateAll(Block.box(6, 6, 0, 10, 10, 8)); public static final Map SHAPE_OCCLUSION_CONNECTIONS = Shapes.rotateAll(Block.box(7, 7, 0, 9, 9, 8)); public static final VoxelShape SHAPE_KNOT = Block.box(6, 6, 6, 10, 10, 10); - public static final int MAX_LENGTH = 16; public static final int DELAY = 4; public RopeBlock(Properties properties) { @@ -66,7 +63,7 @@ protected InteractionResult useWithoutItem(BlockState state, Level level, BlockP level.setBlock(pos, state.setValue(KNOT, false), 1 | 2); return InteractionResult.SUCCESS; } else if (!state.getValue(KNOT)) { - level.setBlock(pos, state.setValue(KNOT, true), 1 | 2); + level.setBlock(pos, state.setValue(KNOT, true).setValue(END, AetherIIBlockStateProperties.RopeEndState.NONE), 1 | 2); return InteractionResult.SUCCESS; } } @@ -88,6 +85,15 @@ protected void tick(BlockState state, ServerLevel level, BlockPos pos, RandomSou // } } + @Override + public void destroy(LevelAccessor level, BlockPos pos, BlockState state) { + BlockPos abovePos = pos.above(); + BlockState aboveState = level.getBlockState(abovePos); + if (aboveState.is(this) && !aboveState.getValue(KNOT)) { + level.setBlock(abovePos, aboveState.setValue(END, AetherIIBlockStateProperties.RopeEndState.FRAYED), 1 | 2); + } + } + @Override protected BlockState updateShape(BlockState state, LevelReader levelReader, ScheduledTickAccess scheduledTickAccess, BlockPos pos, Direction direction, BlockPos neighborPos, BlockState neighborState, RandomSource randomSource) { if (state.getValue(WATERLOGGED)) { @@ -95,15 +101,13 @@ protected BlockState updateShape(BlockState state, LevelReader levelReader, Sche } if (!state.getValue(KNOT)) { if (state.getValue(PROPERTY_BY_DIRECTION.get(direction)) && neighborState.isEmpty()) { - if (direction == Direction.UP || (direction.getAxis().getPlane() == Direction.Plane.HORIZONTAL && levelReader.getBlockState(pos.relative(direction.getOpposite())).isEmpty())) { - state = Blocks.AIR.defaultBlockState(); + if (direction == Direction.UP || (direction.getAxis().getPlane() == Direction.Plane.HORIZONTAL && !neighborState.isFaceSturdy(levelReader, pos.relative(direction.getOpposite()), direction.getOpposite(), SupportType.CENTER))) { + return Blocks.AIR.defaultBlockState(); } } } - if (!state.isAir()) { - if (state.getValue(KNOT) || this.getExistingConnectionAxis(state) == direction.getAxis()) { - state = state.setValue(PROPERTY_BY_DIRECTION.get(direction), neighborState.isFaceSturdy(levelReader, neighborPos, direction.getOpposite(), SupportType.CENTER) || neighborState.is(this)); //todo use issturdy check - } + if (state.getValue(KNOT) || this.getExistingConnectionAxis(state) == direction.getAxis()) { + state = state.setValue(PROPERTY_BY_DIRECTION.get(direction), neighborState.isFaceSturdy(levelReader, neighborPos, direction.getOpposite(), SupportType.CENTER) || neighborState.is(this)).setValue(END, AetherIIBlockStateProperties.RopeEndState.NONE); } @@ -149,7 +153,7 @@ protected void createBlockStateDefinition(StateDefinition.Builder entry : PROPERTY_BY_DIRECTION.entrySet()) { if (state.getValue(entry.getValue())) { @@ -160,7 +164,7 @@ public Direction.Axis getExistingConnectionAxis(BlockState state) { return direction; } - public List getDirectionStates(BlockState state) { + private List getDirectionStates(BlockState state) { List directions = new ArrayList<>(); for (Map.Entry entry : PROPERTY_BY_DIRECTION.entrySet()) { if (state.getValue(entry.getValue())) { @@ -170,17 +174,6 @@ public List getDirectionStates(BlockState state) { return directions; } - public boolean checkForStake(LevelReader levelReader, BlockPos pos) { -// for (int i = 1; i < MAX_LENGTH; ++i) { -// BlockPos abovePos = pos.above(i); -// BlockState aboveState = levelReader.getBlockState(abovePos); -// if (aboveState.is(AetherIIBlocks.BRETTL_ROPE_STAKE)) { -// return true; -// } -// } - return false; - } - @Override protected VoxelShape getShape(BlockState state, BlockGetter level, BlockPos pos, CollisionContext context) { //todo cache shapes // VoxelShape spool = Block.box(4, 0, 4, 12, 2, 12); @@ -201,17 +194,17 @@ protected VoxelShape getShape(BlockState state, BlockGetter level, BlockPos pos, @Override protected VoxelShape getCollisionShape(BlockState state, BlockGetter level, BlockPos pos, CollisionContext context) { - VoxelShape collisionShape = Shapes.empty(); + VoxelShape shape = Shapes.empty(); for (Map.Entry entry : PROPERTY_BY_DIRECTION.entrySet()) { if (entry.getKey().getAxis().getPlane() == Direction.Plane.HORIZONTAL && state.getValue(entry.getValue())) { - collisionShape = Shapes.or(collisionShape, SHAPE_CONNECTIONS.get(entry.getKey())); + shape = Shapes.or(shape, SHAPE_CONNECTIONS.get(entry.getKey())); } } if (state.getValue(KNOT)) { - collisionShape = Shapes.or(collisionShape, SHAPE_KNOT); + shape = Shapes.or(shape, SHAPE_KNOT); } - if (context.isAbove(collisionShape, pos, true) && !context.isDescending()) { - return collisionShape; + if (context.isAbove(shape, pos, true) && !context.isDescending()) { + return shape; } else { return Shapes.empty(); } diff --git a/src/main/java/com/aetherteam/aetherii/data/generators/loot/AetherIIBlockLoot.java b/src/main/java/com/aetherteam/aetherii/data/generators/loot/AetherIIBlockLoot.java index e3cf9740cd..a6a40fe19e 100644 --- a/src/main/java/com/aetherteam/aetherii/data/generators/loot/AetherIIBlockLoot.java +++ b/src/main/java/com/aetherteam/aetherii/data/generators/loot/AetherIIBlockLoot.java @@ -703,7 +703,7 @@ public void generate() { this.dropSelf(AetherIIBlocks.SKYROOT_CHEST.get()); this.dropSelf(AetherIIBlocks.SKYROOT_BARREL.get()); this.dropSelf(AetherIIBlocks.SKYROOT_LADDER.get()); - this.dropNone(AetherIIBlocks.BRETTL_ROPE_STAKE.get()); + this.dropNone(AetherIIBlocks.BRETTL_ROPE_STAKE.get()); //todo allow dropping if not unspooled this.dropNone(AetherIIBlocks.BRETTL_ROPE.get()); this.add(AetherIIBlocks.CLOUDWOOL_BEDROLL.get(), (bed) -> this.createSinglePropConditionTable(bed, BedBlock.PART, BedPart.HEAD)); diff --git a/src/main/java/com/aetherteam/aetherii/data/providers/AetherIIBlockModelSubProvider.java b/src/main/java/com/aetherteam/aetherii/data/providers/AetherIIBlockModelSubProvider.java index 934f833bf9..4a3c5b2291 100644 --- a/src/main/java/com/aetherteam/aetherii/data/providers/AetherIIBlockModelSubProvider.java +++ b/src/main/java/com/aetherteam/aetherii/data/providers/AetherIIBlockModelSubProvider.java @@ -1211,23 +1211,31 @@ public void createClimbingRopeStake(Block block) { public void createClimbingRope(Block block) { MultiVariant connectionLower = plainVariant(AetherIIModelTemplates.decorateBlockModelLocation("brettl_rope_connection_lower")); + MultiVariant capLower = plainVariant(AetherIIModelTemplates.decorateBlockModelLocation("brettl_rope_cap_lower")); MultiVariant connectionUpper = plainVariant(AetherIIModelTemplates.decorateBlockModelLocation("brettl_rope_connection_upper")); + MultiVariant capUpper = plainVariant(AetherIIModelTemplates.decorateBlockModelLocation("brettl_rope_cap_upper")); MultiVariant knot = plainVariant(AetherIIModelTemplates.decorateBlockModelLocation("brettl_rope_knot")); MultiVariant spoolFloor = plainVariant(AetherIIModelTemplates.decorateBlockModelLocation("brettl_rope_spool_floor")); MultiVariant fray = plainVariant(AetherIIModelTemplates.decorateBlockModelLocation("brettl_rope_fray")); MultiPartGenerator model = MultiPartGenerator.multiPart(block) .with(condition().term(RopeBlock.KNOT, true), knot) - .with(condition().term(RopeBlock.END, AetherIIBlockStateProperties.RopeEndState.SPOOL), spoolFloor) - .with(condition().term(RopeBlock.END, AetherIIBlockStateProperties.RopeEndState.END), fray) + .with(condition().term(RopeBlock.END, AetherIIBlockStateProperties.RopeEndState.SPOOLED), spoolFloor) + .with(condition().term(RopeBlock.END, AetherIIBlockStateProperties.RopeEndState.FRAYED), fray) .with(condition().term(RopeBlock.UP, true), connectionUpper) + .with(condition().term(RopeBlock.UP, true).term(RopeBlock.DOWN, false), capUpper) .with(condition().term(RopeBlock.DOWN, true), connectionLower) + .with(condition().term(RopeBlock.DOWN, true).term(RopeBlock.UP, false), capLower) .with(condition().term(RopeBlock.NORTH, true), connectionUpper.with(X_ROT_90)) + .with(condition().term(RopeBlock.NORTH, true).term(RopeBlock.SOUTH, false), capUpper.with(X_ROT_90)) .with(condition().term(RopeBlock.EAST, true), connectionUpper.with(X_ROT_90).with(Y_ROT_90)) + .with(condition().term(RopeBlock.EAST, true).term(RopeBlock.WEST, false), capUpper.with(X_ROT_90).with(Y_ROT_90)) .with(condition().term(RopeBlock.SOUTH, true), connectionLower.with(X_ROT_90)) - .with(condition().term(RopeBlock.WEST, true), connectionLower.with(X_ROT_90).with(Y_ROT_90)); + .with(condition().term(RopeBlock.SOUTH, true).term(RopeBlock.NORTH, false), capLower.with(X_ROT_90)) + .with(condition().term(RopeBlock.WEST, true), connectionLower.with(X_ROT_90).with(Y_ROT_90)) + .with(condition().term(RopeBlock.WEST, true).term(RopeBlock.EAST, false), capLower.with(X_ROT_90).with(Y_ROT_90)); - this.registerSimpleFlatItemModel(block.asItem()); + this.registerSimpleFlatItemModel(block.asItem()); //todo rotate item model 90 degrees in hand this.blockStateOutput.accept(model); } diff --git a/src/main/resources/assets/aether_ii/models/block/brettl_rope_cap_lower.json b/src/main/resources/assets/aether_ii/models/block/brettl_rope_cap_lower.json new file mode 100644 index 0000000000..2d7b8e32cf --- /dev/null +++ b/src/main/resources/assets/aether_ii/models/block/brettl_rope_cap_lower.json @@ -0,0 +1,28 @@ +{ + "format_version": "1.21.11", + "credit": "Made with Blockbench", + "textures": { + "particle": "aether_ii:block/climbing_rope", + "texture": "aether_ii:block/climbing_rope" + }, + "elements": [ + { + "name": "rope_end", + "from": [7, 0, 7], + "to": [9, 8, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 0, 8]}, + "faces": { + "up": {"uv": [12, 14, 14, 16], "texture": "#texture"} + } + } + ], + "groups": [ + { + "name": "rope_end", + "origin": [8, 0, 8], + "scope": 0, + "color": 0, + "children": [0] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/aether_ii/models/block/brettl_rope_cap_upper.json b/src/main/resources/assets/aether_ii/models/block/brettl_rope_cap_upper.json new file mode 100644 index 0000000000..1c755ec01f --- /dev/null +++ b/src/main/resources/assets/aether_ii/models/block/brettl_rope_cap_upper.json @@ -0,0 +1,28 @@ +{ + "format_version": "1.21.11", + "credit": "Made with Blockbench", + "textures": { + "texture": "aether_ii:block/climbing_rope", + "particle": "aether_ii:block/climbing_rope" + }, + "elements": [ + { + "name": "rope_end", + "from": [7, 8, 7], + "to": [9, 16, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "down": {"uv": [10, 14, 12, 16], "texture": "#texture"} + } + } + ], + "groups": [ + { + "name": "rope_end", + "origin": [8, 8, 8], + "scope": 0, + "color": 0, + "children": [0, 1] + } + ] +} \ No newline at end of file From 04de7728bb87ff6f52ce6593a929d9905c63ac73 Mon Sep 17 00:00:00 2001 From: bconlon Date: Sun, 16 Aug 2026 12:52:26 -0700 Subject: [PATCH 16/27] improv: restore rope unspooling on iteration 2 branch --- .../aetherii/block/utility/RopeBlock.java | 146 +++++++++++------- .../block/utility/RopeStakeBlock.java | 126 +++++++++------ 2 files changed, 165 insertions(+), 107 deletions(-) diff --git a/src/main/java/com/aetherteam/aetherii/block/utility/RopeBlock.java b/src/main/java/com/aetherteam/aetherii/block/utility/RopeBlock.java index cb6dfdfa5b..b24169b733 100644 --- a/src/main/java/com/aetherteam/aetherii/block/utility/RopeBlock.java +++ b/src/main/java/com/aetherteam/aetherii/block/utility/RopeBlock.java @@ -5,6 +5,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; +import net.minecraft.tags.FluidTags; import net.minecraft.util.RandomSource; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.LivingEntity; @@ -27,6 +28,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.function.Function; public class RopeBlock extends Block implements SimpleWaterloggedBlock { public static final EnumProperty END = AetherIIBlockStateProperties.ROPE_END; @@ -42,11 +44,63 @@ public class RopeBlock extends Block implements SimpleWaterloggedBlock { public static final Map SHAPE_CONNECTIONS = Shapes.rotateAll(Block.box(6, 6, 0, 10, 10, 8)); public static final Map SHAPE_OCCLUSION_CONNECTIONS = Shapes.rotateAll(Block.box(7, 7, 0, 9, 9, 8)); public static final VoxelShape SHAPE_KNOT = Block.box(6, 6, 6, 10, 10, 10); + public static final VoxelShape SHAPE_FLOOR_SPOOL = Block.box(4, 0, 4, 12, 2, 12); public static final int DELAY = 4; + private final Function shapes; + private final Function collisionShapes; + private final Function occlusionShapes; public RopeBlock(Properties properties) { super(properties); this.registerDefaultState(this.stateDefinition.any().setValue(END, AetherIIBlockStateProperties.RopeEndState.NONE).setValue(KNOT, false).setValue(UP, false).setValue(DOWN, false).setValue(NORTH, false).setValue(EAST, false).setValue(SOUTH, false).setValue(WEST, false).setValue(WATERLOGGED, false)); + this.shapes = this.makeShapes(); + this.collisionShapes = this.makeCollisionShapes(); + this.occlusionShapes = this.makeOcclusionShapes(); + } + + private Function makeShapes() { + return this.getShapeForEachState((state) -> { + VoxelShape shape = Shapes.empty(); + for (Map.Entry entry : PROPERTY_BY_DIRECTION.entrySet()) { + if (state.getValue(entry.getValue())) { + shape = Shapes.or(shape, SHAPE_CONNECTIONS.get(entry.getKey())); + } + } + if (state.getValue(KNOT)) { + shape = Shapes.or(shape, SHAPE_KNOT); + } + if (state.getValue(END) == AetherIIBlockStateProperties.RopeEndState.SPOOLED) { + shape = Shapes.or(shape, SHAPE_FLOOR_SPOOL); + } + return shape; + }, WATERLOGGED); + } + + private Function makeCollisionShapes() { + return this.getShapeForEachState((state) -> { + VoxelShape shape = Shapes.empty(); + for (Map.Entry entry : PROPERTY_BY_DIRECTION.entrySet()) { + if (entry.getKey().getAxis().getPlane() == Direction.Plane.HORIZONTAL && state.getValue(entry.getValue())) { + shape = Shapes.or(shape, SHAPE_CONNECTIONS.get(entry.getKey())); + } + } + if (state.getValue(KNOT)) { + shape = Shapes.or(shape, SHAPE_KNOT); + } + return shape; + }, WATERLOGGED); + } + + private Function makeOcclusionShapes() { + return this.getShapeForEachState((state) -> { + VoxelShape shape = Shapes.empty(); + for (Map.Entry entry : PROPERTY_BY_DIRECTION.entrySet()) { + if (state.getValue(entry.getValue())) { + shape = Shapes.or(shape, SHAPE_OCCLUSION_CONNECTIONS.get(entry.getKey())); + } + } + return shape; + }, WATERLOGGED); } @Override @@ -56,9 +110,10 @@ protected InteractionResult useWithoutItem(BlockState state, Level level, BlockP for (Direction entry : directionStates) { if (directionStates.contains(entry.getOpposite()) && directionStates.size() == 2) { canUnknot = true; + break; } } - if (player.getMainHandItem().isEmpty() && player.getOffhandItem().isEmpty()) { + if (player.getMainHandItem().isEmpty() && player.getOffhandItem().isEmpty()) { //todo set up knot connections too. add or remove if (state.getValue(KNOT) && canUnknot) { level.setBlock(pos, state.setValue(KNOT, false), 1 | 2); return InteractionResult.SUCCESS; @@ -72,17 +127,17 @@ protected InteractionResult useWithoutItem(BlockState state, Level level, BlockP @Override protected void tick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) { -// if (level.getBlockState(pos.below()).isAir()) { -// if (this.checkForStake(level, pos)) { -// level.setBlock(pos, state.setValue(DOWN, true).setValue(END, false), 1 | 2); -// level.setBlock(pos.below(), AetherIIBlocks.BRETTL_ROPE.get().defaultBlockState().setValue(UP, true), 1 | 2); -// level.scheduleTick(pos.below(), this, DELAY); -// } else { -// level.setBlock(pos, state.setValue(END, true), 1 | 2); -// } -// } else { -// level.setBlock(pos, state.setValue(DOWN, true).setValue(END, false).setValue(SPOOL, true), 1 | 2); -// } + BlockPos belowPos = pos.below(); + BlockState belowState = level.getBlockState(belowPos); + if (!belowState.isFaceSturdy(level, belowPos, Direction.UP)) { + if (RopeStakeBlock.checkForStake(level, pos)) { + RopeBlock.placeRope(level, belowPos, AetherIIBlocks.BRETTL_ROPE.get().defaultBlockState().setValue(RopeBlock.UP, true)); + } else { + level.setBlock(pos, state.setValue(END, AetherIIBlockStateProperties.RopeEndState.FRAYED), 1 | 2); + } + } else { + level.setBlock(pos, state.setValue(RopeBlock.DOWN, true).setValue(END, AetherIIBlockStateProperties.RopeEndState.SPOOLED), 1 | 2); + } } @Override @@ -91,6 +146,8 @@ public void destroy(LevelAccessor level, BlockPos pos, BlockState state) { BlockState aboveState = level.getBlockState(abovePos); if (aboveState.is(this) && !aboveState.getValue(KNOT)) { level.setBlock(abovePos, aboveState.setValue(END, AetherIIBlockStateProperties.RopeEndState.FRAYED), 1 | 2); + } else if (aboveState.is(AetherIIBlocks.BRETTL_ROPE_STAKE) && aboveState.getValue(RopeStakeBlock.SPOOL) == AetherIIBlockStateProperties.StakeSpoolState.NONE_CONNECTED) { + level.setBlock(abovePos, aboveState.setValue(RopeStakeBlock.SPOOL, AetherIIBlockStateProperties.StakeSpoolState.NONE), 1 | 2); } } @@ -107,25 +164,11 @@ protected BlockState updateShape(BlockState state, LevelReader levelReader, Sche } } if (state.getValue(KNOT) || this.getExistingConnectionAxis(state) == direction.getAxis()) { + if (state.getValue(END) == AetherIIBlockStateProperties.RopeEndState.SPOOLED) { + scheduledTickAccess.scheduleTick(pos, this, DELAY); + } state = state.setValue(PROPERTY_BY_DIRECTION.get(direction), neighborState.isFaceSturdy(levelReader, neighborPos, direction.getOpposite(), SupportType.CENTER) || neighborState.is(this)).setValue(END, AetherIIBlockStateProperties.RopeEndState.NONE); } - - -// if (neighborState.isAir()) { -// if (direction == Direction.DOWN) { -// if (state.getValue(SPOOL)) { -// scheduledTickAccess.scheduleTick(pos, this, DELAY); -// state = state.setValue(SPOOL, false); -// } else { -// state = state.setValue(DOWN, false); -// if (!state.getValue(KNOT)) { -// state = state.setValue(END, true); -// } -// } -// } else if (direction == Direction.UP) { //todo this should be based on connection direction to allow for placing rope without having it break immediately when breaking smth above it. if it only has one connection? -// return Blocks.AIR.defaultBlockState(); -// } -// } return state; } @@ -175,34 +218,13 @@ private List getDirectionStates(BlockState state) { } @Override - protected VoxelShape getShape(BlockState state, BlockGetter level, BlockPos pos, CollisionContext context) { //todo cache shapes -// VoxelShape spool = Block.box(4, 0, 4, 12, 2, 12); - VoxelShape shape = Shapes.empty(); - for (Map.Entry entry : PROPERTY_BY_DIRECTION.entrySet()) { - if (state.getValue(entry.getValue())) { - shape = Shapes.or(shape, SHAPE_CONNECTIONS.get(entry.getKey())); - } - } - if (state.getValue(KNOT)) { - shape = Shapes.or(shape, SHAPE_KNOT); - } -// if (state.getValue(SPOOL)) { -// shape = Shapes.or(shape, spool); -// } - return shape; + protected VoxelShape getShape(BlockState state, BlockGetter level, BlockPos pos, CollisionContext context) { + return this.shapes.apply(state); } @Override protected VoxelShape getCollisionShape(BlockState state, BlockGetter level, BlockPos pos, CollisionContext context) { - VoxelShape shape = Shapes.empty(); - for (Map.Entry entry : PROPERTY_BY_DIRECTION.entrySet()) { - if (entry.getKey().getAxis().getPlane() == Direction.Plane.HORIZONTAL && state.getValue(entry.getValue())) { - shape = Shapes.or(shape, SHAPE_CONNECTIONS.get(entry.getKey())); - } - } - if (state.getValue(KNOT)) { - shape = Shapes.or(shape, SHAPE_KNOT); - } + VoxelShape shape = this.collisionShapes.apply(state); if (context.isAbove(shape, pos, true) && !context.isDescending()) { return shape; } else { @@ -212,13 +234,7 @@ protected VoxelShape getCollisionShape(BlockState state, BlockGetter level, Bloc @Override protected VoxelShape getOcclusionShape(BlockState state) { - VoxelShape shape = Shapes.empty(); - for (Map.Entry entry : PROPERTY_BY_DIRECTION.entrySet()) { - if (state.getValue(entry.getValue())) { - shape = Shapes.or(shape, SHAPE_OCCLUSION_CONNECTIONS.get(entry.getKey())); - } - } - return shape; + return this.occlusionShapes.apply(state); } @Override @@ -240,4 +256,14 @@ public boolean isLadder(BlockState state, LevelReader level, BlockPos pos, Livin public boolean isScaffolding(BlockState state, LevelReader level, BlockPos pos, LivingEntity entity) { return true; } + + public static void placeRope(Level level, BlockPos pos, BlockState state) { //todo check if the existing block is already rope + BlockState existingBlock = level.getBlockState(pos); + if (existingBlock.getFluidState().is(FluidTags.WATER)) { + state = state.setValue(WATERLOGGED, true); + } + level.destroyBlock(pos, true); + level.setBlock(pos, state, 1 | 2); + level.scheduleTick(pos, state.getBlock(), RopeBlock.DELAY); + } } diff --git a/src/main/java/com/aetherteam/aetherii/block/utility/RopeStakeBlock.java b/src/main/java/com/aetherteam/aetherii/block/utility/RopeStakeBlock.java index 3348fb5722..123356784a 100644 --- a/src/main/java/com/aetherteam/aetherii/block/utility/RopeStakeBlock.java +++ b/src/main/java/com/aetherteam/aetherii/block/utility/RopeStakeBlock.java @@ -17,6 +17,7 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.SimpleWaterloggedBlock; +import net.minecraft.world.level.block.SupportType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.block.state.properties.BlockStateProperties; @@ -29,54 +30,90 @@ import net.minecraft.world.phys.shapes.Shapes; import net.minecraft.world.phys.shapes.VoxelShape; +import java.util.Map; +import java.util.function.Function; + public class RopeStakeBlock extends Block implements SimpleWaterloggedBlock { public static final EnumProperty CONNECTION = BlockStateProperties.FACING; public static final EnumProperty SPOOL = AetherIIBlockStateProperties.STAKE_SPOOL; public static final BooleanProperty WATERLOGGED = BlockStateProperties.WATERLOGGED; + public static final Map SHAPE_STAKES = Shapes.rotateAll(Block.box(6, 6, 0, 10, 10, 13)); + public static final Map SHAPE_OCCLUSION_STAKES = Shapes.rotateAll(Block.box(7, 7, 0, 9, 9, 13)); + public static final Map SHAPE_CENTER_SPOOLS = Shapes.rotateAll(Block.box(4, 4, 7, 12, 12, 9)); + public static final VoxelShape SHAPE_CONNECTION = Block.box(6, 0, 6, 10, 8, 10); + public static final VoxelShape SHAPE_FLOOR_SPOOL = Block.box(4, 0, 4, 12, 2, 12); + public static final int MAX_ROPE_LENGTH = 16; + private final Function shapes; public RopeStakeBlock(Properties properties) { super(properties); this.registerDefaultState(this.stateDefinition.any().setValue(CONNECTION, Direction.NORTH).setValue(SPOOL, AetherIIBlockStateProperties.StakeSpoolState.NONE).setValue(WATERLOGGED, false)); + this.shapes = this.makeShapes(); + } + + private Function makeShapes() { + return this.getShapeForEachState((state) -> { + Direction connection = state.getValue(CONNECTION); + VoxelShape shape = SHAPE_STAKES.get(connection); + if (state.getValue(SPOOL) == AetherIIBlockStateProperties.StakeSpoolState.CENTER) { + shape = Shapes.or(shape, SHAPE_CENTER_SPOOLS.get(connection)); + } else if (state.getValue(SPOOL) == AetherIIBlockStateProperties.StakeSpoolState.FLOOR) { + shape = Shapes.or(shape, SHAPE_FLOOR_SPOOL); + shape = Shapes.or(shape, SHAPE_CONNECTION); + } else if (state.getValue(SPOOL) == AetherIIBlockStateProperties.StakeSpoolState.NONE_CONNECTED) { + shape = Shapes.or(shape, SHAPE_CONNECTION); + } + return shape; + }, WATERLOGGED); } @Override - protected InteractionResult useWithoutItem(BlockState state, Level level, BlockPos pos, Player player, BlockHitResult hitResult) { -// if (state.getValue(SPOOL) == AetherIIBlockStateProperties.StakeSpoolState.CENTER) { -// BlockState newState = state.setValue(SPOOL, AetherIIBlockStateProperties.StakeSpoolState.NONE_CONNECTED); -// level.setBlock(pos, newState, 1 | 2); -// level.scheduleTick(pos, this, RopeBlock.DELAY); -// return InteractionResult.SUCCESS; -// } + protected InteractionResult useWithoutItem(BlockState state, Level level, BlockPos pos, Player player, BlockHitResult hitResult) { //todo respool behavior + if (state.getValue(SPOOL) == AetherIIBlockStateProperties.StakeSpoolState.CENTER) { + BlockState newState = state.setValue(SPOOL, AetherIIBlockStateProperties.StakeSpoolState.NONE_CONNECTED); + level.setBlock(pos, newState, 1 | 2); + level.scheduleTick(pos, this, RopeBlock.DELAY); + return InteractionResult.SUCCESS; + } return InteractionResult.PASS; } @Override protected void tick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) { -// if (level.getBlockState(pos.below()).isAir()) { -// level.setBlock(pos.below(), AetherIIBlocks.BRETTL_ROPE.get().defaultBlockState().setValue(RopeBlock.UP, true), 1 | 2); -// level.scheduleTick(pos.below(), AetherIIBlocks.BRETTL_ROPE.get(), RopeBlock.DELAY); -// } else { -// level.setBlock(pos, state.setValue(RopeStakeBlock.SPOOL, AetherIIBlockStateProperties.StakeSpoolState.FLOOR), 1 | 2); -// } + BlockPos belowPos = pos.below(); + BlockState belowState = level.getBlockState(belowPos); + if (!belowState.isFaceSturdy(level, belowPos, Direction.UP)) { + RopeBlock.placeRope(level, belowPos, AetherIIBlocks.BRETTL_ROPE.get().defaultBlockState().setValue(RopeBlock.UP, true)); + } else { + level.setBlock(pos, state.setValue(RopeStakeBlock.SPOOL, AetherIIBlockStateProperties.StakeSpoolState.FLOOR), 1 | 2); + } } @Override protected BlockState updateShape(BlockState state, LevelReader levelReader, ScheduledTickAccess scheduledTickAccess, BlockPos pos, Direction direction, BlockPos neighborPos, BlockState neighborState, RandomSource randomSource) { -// if (neighborState.isAir()) { -// if (direction == Direction.DOWN) { -// if (state.getValue(SPOOL) == AetherIIBlockStateProperties.StakeSpoolState.NONE_CONNECTED) { -// state = state.setValue(SPOOL, AetherIIBlockStateProperties.StakeSpoolState.NONE); -// } -// } else if (direction == state.getValue(CONNECTION)) { -// return Blocks.AIR.defaultBlockState(); -// } -// } if (state.getValue(WATERLOGGED)) { scheduledTickAccess.scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickDelay(levelReader)); } + if (direction == state.getValue(CONNECTION) && !neighborState.isFaceSturdy(levelReader, pos.relative(direction.getOpposite()), direction.getOpposite(), SupportType.CENTER)) { + return Blocks.AIR.defaultBlockState(); + } + if (direction == Direction.DOWN && neighborState.isAir()) { + if (state.getValue(SPOOL) == AetherIIBlockStateProperties.StakeSpoolState.FLOOR) { + state = state.setValue(SPOOL, AetherIIBlockStateProperties.StakeSpoolState.NONE_CONNECTED); + scheduledTickAccess.scheduleTick(pos, this, RopeBlock.DELAY); + } + } return state; } + @Override + protected boolean canSurvive(BlockState state, LevelReader level, BlockPos pos) { + Direction direction = state.getValue(CONNECTION); + BlockPos relativePos = pos.relative(direction); + BlockState relativeState = level.getBlockState(relativePos); + return relativeState.isFaceSturdy(level, relativePos, direction.getOpposite(), SupportType.CENTER); + } + @Override public BlockState getStateForPlacement(BlockPlaceContext context) { FluidState replacedFluidState = context.getLevel().getFluidState(context.getClickedPos()); @@ -95,38 +132,22 @@ protected void createBlockStateDefinition(StateDefinition.Builder Date: Tue, 25 Aug 2026 13:47:02 -0700 Subject: [PATCH 17/27] fix: some rope connection edge case issues --- .../aetherii/block/utility/RopeBlock.java | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/aetherteam/aetherii/block/utility/RopeBlock.java b/src/main/java/com/aetherteam/aetherii/block/utility/RopeBlock.java index b24169b733..be81fb33de 100644 --- a/src/main/java/com/aetherteam/aetherii/block/utility/RopeBlock.java +++ b/src/main/java/com/aetherteam/aetherii/block/utility/RopeBlock.java @@ -163,7 +163,7 @@ protected BlockState updateShape(BlockState state, LevelReader levelReader, Sche } } } - if (state.getValue(KNOT) || this.getExistingConnectionAxis(state) == direction.getAxis()) { + if ((state.getValue(KNOT) && (neighborState.getValueOrElse(KNOT, true) || this.getExistingConnectionAxis(neighborState) == direction.getAxis())) || this.getExistingConnectionAxis(state) == direction.getAxis()) { if (state.getValue(END) == AetherIIBlockStateProperties.RopeEndState.SPOOLED) { scheduledTickAccess.scheduleTick(pos, this, DELAY); } @@ -197,20 +197,19 @@ protected void createBlockStateDefinition(StateDefinition.Builder entry : PROPERTY_BY_DIRECTION.entrySet()) { - if (state.getValue(entry.getValue())) { - direction = entry.getKey().getAxis(); - break; + if (state.getValueOrElse(entry.getValue(), false)) { + axis = entry.getKey().getAxis(); } } - return direction; + return axis; } private List getDirectionStates(BlockState state) { List directions = new ArrayList<>(); for (Map.Entry entry : PROPERTY_BY_DIRECTION.entrySet()) { - if (state.getValue(entry.getValue())) { + if (state.getValueOrElse(entry.getValue(), false)) { directions.add(entry.getKey()); } } From 0f18ca3b5115d2e7db72d972e25558279623fea0 Mon Sep 17 00:00:00 2001 From: bconlon Date: Tue, 25 Aug 2026 13:50:49 -0700 Subject: [PATCH 18/27] fix: rope spool no longer breaks existing rope --- .../aetherii/block/utility/RopeBlock.java | 14 ++++++++------ .../data/generators/loot/AetherIIBlockLoot.java | 2 +- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/aetherteam/aetherii/block/utility/RopeBlock.java b/src/main/java/com/aetherteam/aetherii/block/utility/RopeBlock.java index be81fb33de..2aed278c89 100644 --- a/src/main/java/com/aetherteam/aetherii/block/utility/RopeBlock.java +++ b/src/main/java/com/aetherteam/aetherii/block/utility/RopeBlock.java @@ -158,7 +158,7 @@ protected BlockState updateShape(BlockState state, LevelReader levelReader, Sche } if (!state.getValue(KNOT)) { if (state.getValue(PROPERTY_BY_DIRECTION.get(direction)) && neighborState.isEmpty()) { - if (direction == Direction.UP || (direction.getAxis().getPlane() == Direction.Plane.HORIZONTAL && !neighborState.isFaceSturdy(levelReader, pos.relative(direction.getOpposite()), direction.getOpposite(), SupportType.CENTER))) { + if (direction == Direction.UP || (direction.getAxis().getPlane() == Direction.Plane.HORIZONTAL && !neighborState.isFaceSturdy(levelReader, pos.relative(direction.getOpposite()), direction.getOpposite(), SupportType.CENTER))) { //todo are those method inputs for isFaceSturdy correct? return Blocks.AIR.defaultBlockState(); } } @@ -256,13 +256,15 @@ public boolean isScaffolding(BlockState state, LevelReader level, BlockPos pos, return true; } - public static void placeRope(Level level, BlockPos pos, BlockState state) { //todo check if the existing block is already rope + public static void placeRope(Level level, BlockPos pos, BlockState state) { BlockState existingBlock = level.getBlockState(pos); - if (existingBlock.getFluidState().is(FluidTags.WATER)) { - state = state.setValue(WATERLOGGED, true); + if (!existingBlock.is(state.getBlock())) { + if (existingBlock.getFluidState().is(FluidTags.WATER)) { + state = state.setValue(WATERLOGGED, true); + } + level.destroyBlock(pos, true); + level.setBlock(pos, state, 1 | 2); } - level.destroyBlock(pos, true); - level.setBlock(pos, state, 1 | 2); level.scheduleTick(pos, state.getBlock(), RopeBlock.DELAY); } } diff --git a/src/main/java/com/aetherteam/aetherii/data/generators/loot/AetherIIBlockLoot.java b/src/main/java/com/aetherteam/aetherii/data/generators/loot/AetherIIBlockLoot.java index a6a40fe19e..f2f06d16ce 100644 --- a/src/main/java/com/aetherteam/aetherii/data/generators/loot/AetherIIBlockLoot.java +++ b/src/main/java/com/aetherteam/aetherii/data/generators/loot/AetherIIBlockLoot.java @@ -704,7 +704,7 @@ public void generate() { this.dropSelf(AetherIIBlocks.SKYROOT_BARREL.get()); this.dropSelf(AetherIIBlocks.SKYROOT_LADDER.get()); this.dropNone(AetherIIBlocks.BRETTL_ROPE_STAKE.get()); //todo allow dropping if not unspooled - this.dropNone(AetherIIBlocks.BRETTL_ROPE.get()); + this.dropNone(AetherIIBlocks.BRETTL_ROPE.get()); //todo figure out drop rules this.add(AetherIIBlocks.CLOUDWOOL_BEDROLL.get(), (bed) -> this.createSinglePropConditionTable(bed, BedBlock.PART, BedPart.HEAD)); this.add(AetherIIBlocks.SKYROOT_BED.get(), (bed) -> this.createSinglePropConditionTable(bed, BedBlock.PART, BedPart.HEAD)); From ac6c521d59fd1ffef22c846d7ed3e2f6d1d9a41e Mon Sep 17 00:00:00 2001 From: bconlon Date: Tue, 25 Aug 2026 13:54:21 -0700 Subject: [PATCH 19/27] fix: incorrect isFaceSturdy parameters --- .../java/com/aetherteam/aetherii/block/utility/RopeBlock.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/aetherteam/aetherii/block/utility/RopeBlock.java b/src/main/java/com/aetherteam/aetherii/block/utility/RopeBlock.java index 2aed278c89..5e69824398 100644 --- a/src/main/java/com/aetherteam/aetherii/block/utility/RopeBlock.java +++ b/src/main/java/com/aetherteam/aetherii/block/utility/RopeBlock.java @@ -158,7 +158,7 @@ protected BlockState updateShape(BlockState state, LevelReader levelReader, Sche } if (!state.getValue(KNOT)) { if (state.getValue(PROPERTY_BY_DIRECTION.get(direction)) && neighborState.isEmpty()) { - if (direction == Direction.UP || (direction.getAxis().getPlane() == Direction.Plane.HORIZONTAL && !neighborState.isFaceSturdy(levelReader, pos.relative(direction.getOpposite()), direction.getOpposite(), SupportType.CENTER))) { //todo are those method inputs for isFaceSturdy correct? + if (direction == Direction.UP || (direction.getAxis().getPlane() == Direction.Plane.HORIZONTAL && !neighborState.isFaceSturdy(levelReader, pos.relative(direction), direction.getOpposite(), SupportType.CENTER))) { return Blocks.AIR.defaultBlockState(); } } From 696d95614727ba591dcbf1fa475321b3a0242ebd Mon Sep 17 00:00:00 2001 From: bconlon Date: Tue, 25 Aug 2026 14:01:13 -0700 Subject: [PATCH 20/27] fix: connect to sturdy faces when right clicking to create knot --- .../aetherteam/aetherii/block/utility/RopeBlock.java | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/aetherteam/aetherii/block/utility/RopeBlock.java b/src/main/java/com/aetherteam/aetherii/block/utility/RopeBlock.java index 5e69824398..5fd4ed050a 100644 --- a/src/main/java/com/aetherteam/aetherii/block/utility/RopeBlock.java +++ b/src/main/java/com/aetherteam/aetherii/block/utility/RopeBlock.java @@ -113,12 +113,20 @@ protected InteractionResult useWithoutItem(BlockState state, Level level, BlockP break; } } - if (player.getMainHandItem().isEmpty() && player.getOffhandItem().isEmpty()) { //todo set up knot connections too. add or remove + if (player.getMainHandItem().isEmpty() && player.getOffhandItem().isEmpty()) { if (state.getValue(KNOT) && canUnknot) { level.setBlock(pos, state.setValue(KNOT, false), 1 | 2); return InteractionResult.SUCCESS; } else if (!state.getValue(KNOT)) { - level.setBlock(pos, state.setValue(KNOT, true).setValue(END, AetherIIBlockStateProperties.RopeEndState.NONE), 1 | 2); + BlockState newState = state.setValue(KNOT, true).setValue(END, AetherIIBlockStateProperties.RopeEndState.NONE); + for (Map.Entry entry : PROPERTY_BY_DIRECTION.entrySet()) { + if (!newState.getValue(entry.getValue())) { + BlockPos neighborPos = pos.relative(entry.getKey()); + BlockState neighborState = level.getBlockState(neighborPos); + newState = newState.setValue(entry.getValue(), neighborState.isFaceSturdy(level, neighborPos, entry.getKey().getOpposite(), SupportType.CENTER)); + } + } + level.setBlock(pos, newState, 1 | 2); return InteractionResult.SUCCESS; } } From 8edef32a495c97d380465302bf9f401950b32eb8 Mon Sep 17 00:00:00 2001 From: bconlon Date: Tue, 25 Aug 2026 14:12:00 -0700 Subject: [PATCH 21/27] refactor: add respooling to unmodified rope spools --- .../aetherii/block/utility/RopeStakeBlock.java | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/aetherteam/aetherii/block/utility/RopeStakeBlock.java b/src/main/java/com/aetherteam/aetherii/block/utility/RopeStakeBlock.java index 123356784a..7bb0c96770 100644 --- a/src/main/java/com/aetherteam/aetherii/block/utility/RopeStakeBlock.java +++ b/src/main/java/com/aetherteam/aetherii/block/utility/RopeStakeBlock.java @@ -68,12 +68,28 @@ private Function makeShapes() { } @Override - protected InteractionResult useWithoutItem(BlockState state, Level level, BlockPos pos, Player player, BlockHitResult hitResult) { //todo respool behavior + protected InteractionResult useWithoutItem(BlockState state, Level level, BlockPos pos, Player player, BlockHitResult hitResult) { if (state.getValue(SPOOL) == AetherIIBlockStateProperties.StakeSpoolState.CENTER) { BlockState newState = state.setValue(SPOOL, AetherIIBlockStateProperties.StakeSpoolState.NONE_CONNECTED); level.setBlock(pos, newState, 1 | 2); level.scheduleTick(pos, this, RopeBlock.DELAY); return InteractionResult.SUCCESS; + } else if (state.getValue(SPOOL) == AetherIIBlockStateProperties.StakeSpoolState.NONE_CONNECTED) { + boolean canRespool = true; + for (int i = 1; i < MAX_ROPE_LENGTH; ++i) { + BlockPos belowPos = pos.below(i); + BlockState belowState = level.getBlockState(belowPos); + if (belowState.getValueOrElse(RopeBlock.KNOT, true)) { + canRespool = false; + break; + } + } + if (canRespool) { + BlockState newState = state.setValue(SPOOL, AetherIIBlockStateProperties.StakeSpoolState.CENTER); + level.setBlock(pos, newState, 1 | 2); + level.destroyBlock(pos.below(), false); + return InteractionResult.SUCCESS; + } } return InteractionResult.PASS; } From 6165a3c1ba5d5f083e556e31ec149897d6e34420 Mon Sep 17 00:00:00 2001 From: bconlon Date: Tue, 25 Aug 2026 14:19:15 -0700 Subject: [PATCH 22/27] improv: loot table for rope stake --- .../loot_table/blocks/brettl_rope_stake.json | 26 +++++++++++++++++++ .../generators/loot/AetherIIBlockLoot.java | 6 +++-- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/src/generated/resources/data/aether_ii/loot_table/blocks/brettl_rope_stake.json b/src/generated/resources/data/aether_ii/loot_table/blocks/brettl_rope_stake.json index 23fdf6ccae..6825903f50 100644 --- a/src/generated/resources/data/aether_ii/loot_table/blocks/brettl_rope_stake.json +++ b/src/generated/resources/data/aether_ii/loot_table/blocks/brettl_rope_stake.json @@ -1,4 +1,30 @@ { "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "aether_ii:brettl_rope_stake", + "condition": "minecraft:block_state_property", + "properties": { + "stake_spool": "center" + } + } + ], + "name": "aether_ii:brettl_rope_stake" + } + ], + "rolls": 1.0 + } + ], "random_sequence": "aether_ii:blocks/brettl_rope_stake" } \ No newline at end of file diff --git a/src/main/java/com/aetherteam/aetherii/data/generators/loot/AetherIIBlockLoot.java b/src/main/java/com/aetherteam/aetherii/data/generators/loot/AetherIIBlockLoot.java index f2f06d16ce..9392111655 100644 --- a/src/main/java/com/aetherteam/aetherii/data/generators/loot/AetherIIBlockLoot.java +++ b/src/main/java/com/aetherteam/aetherii/data/generators/loot/AetherIIBlockLoot.java @@ -1,6 +1,8 @@ package com.aetherteam.aetherii.data.generators.loot; +import com.aetherteam.aetherii.block.AetherIIBlockStateProperties; import com.aetherteam.aetherii.block.AetherIIBlocks; +import com.aetherteam.aetherii.block.utility.RopeStakeBlock; import com.aetherteam.aetherii.data.providers.AetherIIBlockLootSubProvider; import com.aetherteam.aetherii.item.AetherIIItems; import com.aetherteam.aetherii.item.components.AetherIIDataComponents; @@ -703,8 +705,8 @@ public void generate() { this.dropSelf(AetherIIBlocks.SKYROOT_CHEST.get()); this.dropSelf(AetherIIBlocks.SKYROOT_BARREL.get()); this.dropSelf(AetherIIBlocks.SKYROOT_LADDER.get()); - this.dropNone(AetherIIBlocks.BRETTL_ROPE_STAKE.get()); //todo allow dropping if not unspooled - this.dropNone(AetherIIBlocks.BRETTL_ROPE.get()); //todo figure out drop rules + this.add(AetherIIBlocks.BRETTL_ROPE_STAKE.get(), (rope) -> this.createSinglePropConditionTable(rope, RopeStakeBlock.SPOOL, AetherIIBlockStateProperties.StakeSpoolState.CENTER)); + this.dropNone(AetherIIBlocks.BRETTL_ROPE.get()); this.add(AetherIIBlocks.CLOUDWOOL_BEDROLL.get(), (bed) -> this.createSinglePropConditionTable(bed, BedBlock.PART, BedPart.HEAD)); this.add(AetherIIBlocks.SKYROOT_BED.get(), (bed) -> this.createSinglePropConditionTable(bed, BedBlock.PART, BedPart.HEAD)); From 5f7065170c66163c22b740f1b2feb8f7deb4fcfe Mon Sep 17 00:00:00 2001 From: bconlon Date: Tue, 25 Aug 2026 15:54:08 -0700 Subject: [PATCH 23/27] fix: movement slowdown when standing on rope blocks --- .../mixins/common/LivingEntityMixin.java | 23 ++++++++++++++----- 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/aetherteam/aetherii/mixin/mixins/common/LivingEntityMixin.java b/src/main/java/com/aetherteam/aetherii/mixin/mixins/common/LivingEntityMixin.java index 4263ee0aeb..78890e8b59 100644 --- a/src/main/java/com/aetherteam/aetherii/mixin/mixins/common/LivingEntityMixin.java +++ b/src/main/java/com/aetherteam/aetherii/mixin/mixins/common/LivingEntityMixin.java @@ -3,6 +3,7 @@ import com.aetherteam.aetherii.AetherIITags; import com.aetherteam.aetherii.advancement.trigger.AetherIIAdvancementTriggers; import com.aetherteam.aetherii.block.AetherIIBlocks; +import com.llamalad7.mixinextras.injector.wrapmethod.WrapMethod; import com.llamalad7.mixinextras.injector.wrapoperation.Operation; import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; import net.minecraft.core.BlockPos; @@ -10,6 +11,7 @@ import net.minecraft.tags.TagKey; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.level.material.Fluid; +import net.minecraft.world.phys.Vec3; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.ModifyArgs; @@ -27,6 +29,15 @@ private boolean baseTick(LivingEntity livingEntity, TagKey type, Operatio } } + @WrapOperation(method = "causeFallDamage(DFLnet/minecraft/world/damagesource/DamageSource;)Z", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/LivingEntity;calculateFallDamage(DF)I")) + private int causeFallDamage(LivingEntity livingEntity, double fallDistance, float damageModifier, Operation original) { + int damage = original.call(livingEntity, fallDistance, damageModifier); + if (livingEntity instanceof ServerPlayer serverPlayer) { + AetherIIAdvancementTriggers.FALL_ON_GROUND.get().trigger(serverPlayer, fallDistance, damage); + } + return damage; + } + @ModifyArgs(method = "travelInAir(Lnet/minecraft/world/phys/Vec3;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/LivingEntity;setDeltaMovement(DDD)V")) private void travelInAir(Args args) { LivingEntity livingEntity = (LivingEntity) (Object) this; @@ -36,12 +47,12 @@ private void travelInAir(Args args) { } } - @WrapOperation(method = "causeFallDamage(DFLnet/minecraft/world/damagesource/DamageSource;)Z", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/LivingEntity;calculateFallDamage(DF)I")) - private int causeFallDamage(LivingEntity livingEntity, double fallDistance, float damageModifier, Operation original) { - int damage = original.call(livingEntity, fallDistance, damageModifier); - if (livingEntity instanceof ServerPlayer serverPlayer) { - AetherIIAdvancementTriggers.FALL_ON_GROUND.get().trigger(serverPlayer, fallDistance, damage); + @WrapMethod(method = "handleOnClimbable(Lnet/minecraft/world/phys/Vec3;)Lnet/minecraft/world/phys/Vec3;") + private Vec3 handleOnClimbable(Vec3 delta, Operation original) { + LivingEntity livingEntity = (LivingEntity) (Object) this; + if (livingEntity.getInBlockState().is(AetherIIBlocks.BRETTL_ROPE_STAKE) || livingEntity.getInBlockState().is(AetherIIBlocks.BRETTL_ROPE) && livingEntity.verticalCollisionBelow) { + return delta; } - return damage; + return original.call(delta); } } From 6b37331a4d6a7e6624c7d56133f383e01914c791 Mon Sep 17 00:00:00 2001 From: bconlon Date: Wed, 26 Aug 2026 11:04:33 -0700 Subject: [PATCH 24/27] feat: climbing rope bolt --- .../aether_ii/items/brettl_rope_bolt.json | 6 ++ .../assets/aether_ii/lang/en_us.json | 2 + .../models/item/brettl_rope_bolt.json | 6 ++ .../recipes/misc/brettl_rope_bolt.json | 32 +++++++++ .../aether_ii/recipe/brettl_rope_bolt.json | 11 +++ .../tags/entity_type/aether_mobs.json | 1 + .../aether_ii/tags/item/crossbow_ammo.json | 6 ++ .../minecraft/tags/entity_type/arrows.json | 1 + .../com/aetherteam/aetherii/AetherIITags.java | 1 + .../client/renderer/AetherIIRenderers.java | 1 + .../entity/BrettlRopeBoltRenderer.java | 25 +++++++ .../data/generators/AetherIILanguageData.java | 2 + .../data/generators/AetherIIRecipeData.java | 5 ++ .../generators/models/AetherIIItemModels.java | 1 + .../tags/AetherIIEntityTypeTagData.java | 2 + .../generators/tags/AetherIIItemTagData.java | 4 ++ .../registries/AetherIIEntityIds.java | 1 + .../aetherii/entity/AetherIIEntityTypes.java | 2 + .../entity/projectile/BrettlRopeBolt.java | 65 ++++++++++++++++++ .../aetherii/item/AetherIICreativeTabs.java | 1 + .../aetherii/item/AetherIIItems.java | 1 + .../equipment/weapons/BrettlRopeBoltItem.java | 21 ++++++ .../equipment/weapons/TieredCrossbowItem.java | 3 +- .../entity/projectile/brettl_rope_bolt.png | Bin 0 -> 2246 bytes .../textures/item/brettl_rope_bolt.png | Bin 0 -> 2312 bytes 25 files changed, 199 insertions(+), 1 deletion(-) create mode 100644 src/generated/resources/assets/aether_ii/items/brettl_rope_bolt.json create mode 100644 src/generated/resources/assets/aether_ii/models/item/brettl_rope_bolt.json create mode 100644 src/generated/resources/data/aether_ii/advancement/recipes/misc/brettl_rope_bolt.json create mode 100644 src/generated/resources/data/aether_ii/recipe/brettl_rope_bolt.json create mode 100644 src/generated/resources/data/aether_ii/tags/item/crossbow_ammo.json create mode 100644 src/main/java/com/aetherteam/aetherii/client/renderer/entity/BrettlRopeBoltRenderer.java create mode 100644 src/main/java/com/aetherteam/aetherii/entity/projectile/BrettlRopeBolt.java create mode 100644 src/main/java/com/aetherteam/aetherii/item/equipment/weapons/BrettlRopeBoltItem.java create mode 100644 src/main/resources/assets/aether_ii/textures/entity/projectile/brettl_rope_bolt.png create mode 100644 src/main/resources/assets/aether_ii/textures/item/brettl_rope_bolt.png diff --git a/src/generated/resources/assets/aether_ii/items/brettl_rope_bolt.json b/src/generated/resources/assets/aether_ii/items/brettl_rope_bolt.json new file mode 100644 index 0000000000..e0ddaa5abc --- /dev/null +++ b/src/generated/resources/assets/aether_ii/items/brettl_rope_bolt.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "aether_ii:item/brettl_rope_bolt" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/aether_ii/lang/en_us.json b/src/generated/resources/assets/aether_ii/lang/en_us.json index a983b11075..086ff49c1e 100644 --- a/src/generated/resources/assets/aether_ii/lang/en_us.json +++ b/src/generated/resources/assets/aether_ii/lang/en_us.json @@ -999,6 +999,7 @@ "entity.aether_ii.arkenium_taluton": "Arkenium Taluton", "entity.aether_ii.bladeshroom_hunter": "Bladeshroom Hunter", "entity.aether_ii.blue_swet": "Blue Swet", + "entity.aether_ii.brettl_rope_bolt": "Climbing Rope Bolt", "entity.aether_ii.carrion_sprout": "Carrion Sprout", "entity.aether_ii.cockatrice": "Cockatrice", "entity.aether_ii.detonation_projectile": "Detonation Projectile", @@ -1181,6 +1182,7 @@ "item.aether_ii.blueberry_moa_feed": "Blueberry Moa Feed", "item.aether_ii.brettl_cane": "Brettl Cane", "item.aether_ii.brettl_grass": "Brettl Grass", + "item.aether_ii.brettl_rope_bolt": "Climbing Rope Bolt", "item.aether_ii.broken_item": "Broken Item", "item.aether_ii.broken_item_template": "Broken %s", "item.aether_ii.burrukai_plate": "Burrukai Plate", diff --git a/src/generated/resources/assets/aether_ii/models/item/brettl_rope_bolt.json b/src/generated/resources/assets/aether_ii/models/item/brettl_rope_bolt.json new file mode 100644 index 0000000000..7dcbf13d4c --- /dev/null +++ b/src/generated/resources/assets/aether_ii/models/item/brettl_rope_bolt.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "aether_ii:item/brettl_rope_bolt" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/aether_ii/advancement/recipes/misc/brettl_rope_bolt.json b/src/generated/resources/data/aether_ii/advancement/recipes/misc/brettl_rope_bolt.json new file mode 100644 index 0000000000..c80afc9dc7 --- /dev/null +++ b/src/generated/resources/data/aether_ii/advancement/recipes/misc/brettl_rope_bolt.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_brettl_rope_stake": { + "conditions": { + "items": [ + { + "items": "aether_ii:brettl_rope_stake" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "aether_ii:brettl_rope_bolt" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_brettl_rope_stake" + ] + ], + "rewards": { + "recipes": [ + "aether_ii:brettl_rope_bolt" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/aether_ii/recipe/brettl_rope_bolt.json b/src/generated/resources/data/aether_ii/recipe/brettl_rope_bolt.json new file mode 100644 index 0000000000..db8ce666bb --- /dev/null +++ b/src/generated/resources/data/aether_ii/recipe/brettl_rope_bolt.json @@ -0,0 +1,11 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + "aether_ii:scatterglass_bolt", + "aether_ii:brettl_rope_stake" + ], + "result": { + "id": "aether_ii:brettl_rope_bolt" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/aether_ii/tags/entity_type/aether_mobs.json b/src/generated/resources/data/aether_ii/tags/entity_type/aether_mobs.json index c35a97656f..538bc75bd2 100644 --- a/src/generated/resources/data/aether_ii/tags/entity_type/aether_mobs.json +++ b/src/generated/resources/data/aether_ii/tags/entity_type/aether_mobs.json @@ -38,6 +38,7 @@ "aether_ii:prismallard_egg", "aether_ii:lasso_loop", "aether_ii:scatterglass_bolt", + "aether_ii:brettl_rope_bolt", "aether_ii:amber_dart", "aether_ii:toxic_dart", "aether_ii:zephyr_webbing_ball", diff --git a/src/generated/resources/data/aether_ii/tags/item/crossbow_ammo.json b/src/generated/resources/data/aether_ii/tags/item/crossbow_ammo.json new file mode 100644 index 0000000000..e25382eda8 --- /dev/null +++ b/src/generated/resources/data/aether_ii/tags/item/crossbow_ammo.json @@ -0,0 +1,6 @@ +{ + "values": [ + "aether_ii:scatterglass_bolt", + "aether_ii:brettl_rope_bolt" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/entity_type/arrows.json b/src/generated/resources/data/minecraft/tags/entity_type/arrows.json index cebc73966a..fb23131ccd 100644 --- a/src/generated/resources/data/minecraft/tags/entity_type/arrows.json +++ b/src/generated/resources/data/minecraft/tags/entity_type/arrows.json @@ -1,6 +1,7 @@ { "values": [ "aether_ii:scatterglass_bolt", + "aether_ii:brettl_rope_bolt", "aether_ii:amber_dart" ] } \ No newline at end of file diff --git a/src/main/java/com/aetherteam/aetherii/AetherIITags.java b/src/main/java/com/aetherteam/aetherii/AetherIITags.java index ca0b2acc1c..9449391b19 100644 --- a/src/main/java/com/aetherteam/aetherii/AetherIITags.java +++ b/src/main/java/com/aetherteam/aetherii/AetherIITags.java @@ -278,6 +278,7 @@ public static class Items { public static final TagKey IRRADIATED_ITEM = tag("irradiated_item"); public static final TagKey ENGRAVED_DISCS = tag("engraved_discs"); public static final TagKey ALKAHEST_RESISTANT_ITEM = tag("alkahest_resistant_item"); + public static final TagKey CROSSBOW_AMMO = tag("crossbow_ammo"); public static final TagKey PLANT_DAMAGING_ITEMS = tag("plant_damaging_items"); public static final TagKey SLIDER_DAMAGING_ITEMS = tag("slider_damaging_items"); public static final TagKey UNBREAKABLE_LOOT = tag("unbreakable_loot"); diff --git a/src/main/java/com/aetherteam/aetherii/client/renderer/AetherIIRenderers.java b/src/main/java/com/aetherteam/aetherii/client/renderer/AetherIIRenderers.java index 8faca8b37a..9d82c4bcee 100644 --- a/src/main/java/com/aetherteam/aetherii/client/renderer/AetherIIRenderers.java +++ b/src/main/java/com/aetherteam/aetherii/client/renderer/AetherIIRenderers.java @@ -191,6 +191,7 @@ public static void registerEntityRenderers(EntityRenderersEvent.RegisterRenderer event.registerEntityRenderer(AetherIIEntityTypes.PRISMALLARD_EGG.get(), ThrownItemRenderer::new); event.registerEntityRenderer(AetherIIEntityTypes.LASSO_LOOP.get(), LassoLoopRenderer::new); event.registerEntityRenderer(AetherIIEntityTypes.SCATTERGLASS_BOLT.get(), ScatterglassBoltRenderer::new); + event.registerEntityRenderer(AetherIIEntityTypes.BRETTL_ROPE_BOLT.get(), BrettlRopeBoltRenderer::new); event.registerEntityRenderer(AetherIIEntityTypes.AMBER_DART.get(), AmberDartRenderer::new); event.registerEntityRenderer(AetherIIEntityTypes.TOXIC_DART.get(), ToxicDartRenderer::new); event.registerEntityRenderer(AetherIIEntityTypes.VENOMOUS_DART.get(), VenomousDartRenderer::new); diff --git a/src/main/java/com/aetherteam/aetherii/client/renderer/entity/BrettlRopeBoltRenderer.java b/src/main/java/com/aetherteam/aetherii/client/renderer/entity/BrettlRopeBoltRenderer.java new file mode 100644 index 0000000000..13359de0f5 --- /dev/null +++ b/src/main/java/com/aetherteam/aetherii/client/renderer/entity/BrettlRopeBoltRenderer.java @@ -0,0 +1,25 @@ +package com.aetherteam.aetherii.client.renderer.entity; + +import com.aetherteam.aetherii.AetherII; +import com.aetherteam.aetherii.entity.projectile.BrettlRopeBolt; +import net.minecraft.client.renderer.entity.ArrowRenderer; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.entity.state.ArrowRenderState; +import net.minecraft.resources.Identifier; + +public class BrettlRopeBoltRenderer extends ArrowRenderer { + public static final Identifier BRETTL_ROPE_BOLT_TEXTURE = Identifier.fromNamespaceAndPath(AetherII.MODID, "textures/entity/projectile/brettl_rope_bolt.png"); + + public BrettlRopeBoltRenderer(EntityRendererProvider.Context context) { + super(context); + } + + public ArrowRenderState createRenderState() { + return new ArrowRenderState(); + } + + @Override + public Identifier getTextureLocation(ArrowRenderState renderState) { + return BRETTL_ROPE_BOLT_TEXTURE; + } +} diff --git a/src/main/java/com/aetherteam/aetherii/data/generators/AetherIILanguageData.java b/src/main/java/com/aetherteam/aetherii/data/generators/AetherIILanguageData.java index c2d97ce6d3..75a3073895 100644 --- a/src/main/java/com/aetherteam/aetherii/data/generators/AetherIILanguageData.java +++ b/src/main/java/com/aetherteam/aetherii/data/generators/AetherIILanguageData.java @@ -954,6 +954,7 @@ private void addItems() { this.addEffectDarts(AetherIIItems.AMBER_DARTS, "crystallized", "Crystallized Darts"); this.addItem(AetherIIItems.SCATTERGLASS_BOLT, "Scatterglass Bolt"); + this.addItem(AetherIIItems.BRETTL_ROPE_BOLT, "Climbing Rope Bolt"); this.addItem(AetherIIItems.HAMMER_OF_DEMOLITION, "Hammer of Demolition"); @@ -1464,6 +1465,7 @@ private void addEntityTypes() { this.addEntityType(AetherIIEntityTypes.PRISMALLARD_EGG, "Prismallard Egg"); this.addEntityType(AetherIIEntityTypes.LASSO_LOOP, "Lasso Loop"); this.addEntityType(AetherIIEntityTypes.SCATTERGLASS_BOLT, "Scatterglass Bolt"); + this.addEntityType(AetherIIEntityTypes.BRETTL_ROPE_BOLT, "Climbing Rope Bolt"); this.addEntityType(AetherIIEntityTypes.AMBER_DART, "Amber Dart"); this.addEntityType(AetherIIEntityTypes.ZEPHYR_WEBBING_BALL, "Zephyr Webbing Ball"); this.addEntityType(AetherIIEntityTypes.TEMPEST_THUNDERBALL, "Tempest Thunderball"); diff --git a/src/main/java/com/aetherteam/aetherii/data/generators/AetherIIRecipeData.java b/src/main/java/com/aetherteam/aetherii/data/generators/AetherIIRecipeData.java index fd49590979..7f26be6ebf 100644 --- a/src/main/java/com/aetherteam/aetherii/data/generators/AetherIIRecipeData.java +++ b/src/main/java/com/aetherteam/aetherii/data/generators/AetherIIRecipeData.java @@ -1549,6 +1549,11 @@ protected void buildRecipes() { .pattern(" F ") .unlockedBy("has_scatterglass_shard", has(AetherIIItems.SCATTERGLASS_SHARD)) .save(this.output); + ShapelessRecipeBuilder.shapeless(getter, RecipeCategory.MISC, AetherIIItems.BRETTL_ROPE_BOLT.get(), 1) + .requires(AetherIIItems.SCATTERGLASS_BOLT) + .requires(AetherIIBlocks.BRETTL_ROPE_STAKE) + .unlockedBy("has_brettl_rope_stake", has(AetherIIBlocks.BRETTL_ROPE_STAKE)) + .save(this.output); // Armor diff --git a/src/main/java/com/aetherteam/aetherii/data/generators/models/AetherIIItemModels.java b/src/main/java/com/aetherteam/aetherii/data/generators/models/AetherIIItemModels.java index 0930298d52..fb5bc6ba35 100644 --- a/src/main/java/com/aetherteam/aetherii/data/generators/models/AetherIIItemModels.java +++ b/src/main/java/com/aetherteam/aetherii/data/generators/models/AetherIIItemModels.java @@ -83,6 +83,7 @@ public void run() { this.generateDarts(AetherIIItems.AMBER_DARTS.get()); this.generateFlatItem(AetherIIItems.SCATTERGLASS_BOLT.get(), ModelTemplates.FLAT_ITEM); + this.generateFlatItem(AetherIIItems.BRETTL_ROPE_BOLT.get(), ModelTemplates.FLAT_ITEM); this.generateHammerOfDemolition(AetherIIItems.HAMMER_OF_DEMOLITION.get()); this.generateBrokenItem(AetherIIItems.HAMMER_OF_DEMOLITION.get()); diff --git a/src/main/java/com/aetherteam/aetherii/data/generators/tags/AetherIIEntityTypeTagData.java b/src/main/java/com/aetherteam/aetherii/data/generators/tags/AetherIIEntityTypeTagData.java index eea14d93aa..1d54390979 100644 --- a/src/main/java/com/aetherteam/aetherii/data/generators/tags/AetherIIEntityTypeTagData.java +++ b/src/main/java/com/aetherteam/aetherii/data/generators/tags/AetherIIEntityTypeTagData.java @@ -59,6 +59,7 @@ public void addTags(HolderLookup.Provider provider) { AetherIIEntityTypes.PRISMALLARD_EGG.get(), AetherIIEntityTypes.LASSO_LOOP.get(), AetherIIEntityTypes.SCATTERGLASS_BOLT.get(), + AetherIIEntityTypes.BRETTL_ROPE_BOLT.get(), AetherIIEntityTypes.AMBER_DART.get(), AetherIIEntityTypes.TOXIC_DART.get(), AetherIIEntityTypes.ZEPHYR_WEBBING_BALL.get(), @@ -140,6 +141,7 @@ public void addTags(HolderLookup.Provider provider) { // Vanilla this.tag(EntityTypeTags.ARROWS).add( AetherIIEntityTypes.SCATTERGLASS_BOLT.get(), + AetherIIEntityTypes.BRETTL_ROPE_BOLT.get(), AetherIIEntityTypes.AMBER_DART.get() ); this.tag(EntityTypeTags.IMPACT_PROJECTILES).add( diff --git a/src/main/java/com/aetherteam/aetherii/data/generators/tags/AetherIIItemTagData.java b/src/main/java/com/aetherteam/aetherii/data/generators/tags/AetherIIItemTagData.java index cd83213ce1..b8b48c9086 100644 --- a/src/main/java/com/aetherteam/aetherii/data/generators/tags/AetherIIItemTagData.java +++ b/src/main/java/com/aetherteam/aetherii/data/generators/tags/AetherIIItemTagData.java @@ -512,6 +512,10 @@ protected TagAppender tag(TagKey blockKey, TagKey ite AetherIIItems.ARKENIUM_CHIP.get(), AetherIIItems.BROKEN_ITEM.get() ); + this.tag(AetherIITags.Items.CROSSBOW_AMMO).add( + AetherIIItems.SCATTERGLASS_BOLT.get(), + AetherIIItems.BRETTL_ROPE_BOLT.get() + ); this.tag(AetherIITags.Items.PLANT_DAMAGING_ITEMS).addTags( AetherIITags.Items.TOOLS_TROWELS ); diff --git a/src/main/java/com/aetherteam/aetherii/data/resources/registries/AetherIIEntityIds.java b/src/main/java/com/aetherteam/aetherii/data/resources/registries/AetherIIEntityIds.java index a4662e3987..16e1a8b5ff 100644 --- a/src/main/java/com/aetherteam/aetherii/data/resources/registries/AetherIIEntityIds.java +++ b/src/main/java/com/aetherteam/aetherii/data/resources/registries/AetherIIEntityIds.java @@ -65,6 +65,7 @@ public class AetherIIEntityIds { public static final ResourceKey> LASSO_LOOP = createKey("lasso_loop"); public static final ResourceKey> SCATTERGLASS_BOLT = createKey("scatterglass_bolt"); + public static final ResourceKey> BRETTL_ROPE_BOLT = createKey("brettl_rope_bolt"); public static final ResourceKey> AMBER_DART = createKey("amber_dart"); public static final ResourceKey> TOXIC_DART = createKey("toxic_dart"); diff --git a/src/main/java/com/aetherteam/aetherii/entity/AetherIIEntityTypes.java b/src/main/java/com/aetherteam/aetherii/entity/AetherIIEntityTypes.java index 4d4b21f1f0..7a2e35233f 100644 --- a/src/main/java/com/aetherteam/aetherii/entity/AetherIIEntityTypes.java +++ b/src/main/java/com/aetherteam/aetherii/entity/AetherIIEntityTypes.java @@ -139,6 +139,8 @@ public class AetherIIEntityTypes { public static final DeferredHolder, EntityType> SCATTERGLASS_BOLT = ENTITY_TYPES.register("scatterglass_bolt", () -> EntityType.Builder.of(ScatterglassBolt::new, MobCategory.MISC).sized(0.5F, 0.5F).clientTrackingRange(4).updateInterval(20).noLootTable().build(AetherIIEntityIds.SCATTERGLASS_BOLT)); + public static final DeferredHolder, EntityType> BRETTL_ROPE_BOLT = ENTITY_TYPES.register("brettl_rope_bolt", + () -> EntityType.Builder.of(BrettlRopeBolt::new, MobCategory.MISC).sized(0.5F, 0.5F).clientTrackingRange(4).updateInterval(20).noLootTable().build(AetherIIEntityIds.BRETTL_ROPE_BOLT)); public static final DeferredHolder, EntityType> AMBER_DART = ENTITY_TYPES.register("amber_dart", () -> EntityType.Builder.of(AmberDart::new, MobCategory.MISC).sized(0.5F, 0.5F).clientTrackingRange(4).updateInterval(20).noLootTable().build(AetherIIEntityIds.AMBER_DART)); diff --git a/src/main/java/com/aetherteam/aetherii/entity/projectile/BrettlRopeBolt.java b/src/main/java/com/aetherteam/aetherii/entity/projectile/BrettlRopeBolt.java new file mode 100644 index 0000000000..4b74f05538 --- /dev/null +++ b/src/main/java/com/aetherteam/aetherii/entity/projectile/BrettlRopeBolt.java @@ -0,0 +1,65 @@ +package com.aetherteam.aetherii.entity.projectile; + +import com.aetherteam.aetherii.AetherII; +import com.aetherteam.aetherii.block.AetherIIBlockStateProperties; +import com.aetherteam.aetherii.block.AetherIIBlocks; +import com.aetherteam.aetherii.block.utility.RopeBlock; +import com.aetherteam.aetherii.block.utility.RopeStakeBlock; +import com.aetherteam.aetherii.entity.AetherIIEntityTypes; +import com.aetherteam.aetherii.item.AetherIIItems; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.projectile.arrow.AbstractArrow; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.SupportType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.level.material.Fluids; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.EntityHitResult; + +public class BrettlRopeBolt extends AbstractArrow { + private static final ItemStack BRETTL_ROPE_BOLT = new ItemStack(AetherIIItems.BRETTL_ROPE_BOLT.get()); + + public BrettlRopeBolt(EntityType entityType, Level level) { + super(entityType, level); + } + + public BrettlRopeBolt(Level level, double x, double y, double z, ItemStack pickupStack, ItemStack weaponStack) { + super(AetherIIEntityTypes.BRETTL_ROPE_BOLT.get(), x, y, z, level, pickupStack, weaponStack); + } + + public BrettlRopeBolt(Level level, LivingEntity owner, ItemStack pickupStack, ItemStack weaponStack) { + super(AetherIIEntityTypes.BRETTL_ROPE_BOLT.get(), owner, level, pickupStack, weaponStack); + } + + @Override + protected void onHitEntity(EntityHitResult result) { } + + @Override + protected void onHitBlock(BlockHitResult result) { + super.onHitBlock(result); + BlockPos pos = result.getBlockPos(); + Direction direction = result.getDirection(); + BlockPos placementPos = pos.relative(direction); + FluidState replacedFluidState = this.level().getFluidState(placementPos); + BlockState relativeState = this.level().getBlockState(pos); + BlockState blockState = AetherIIBlocks.BRETTL_ROPE_STAKE.get().defaultBlockState().setValue(RopeStakeBlock.CONNECTION, direction.getOpposite()).setValue(RopeStakeBlock.SPOOL, AetherIIBlockStateProperties.StakeSpoolState.NONE_CONNECTED).setValue(RopeStakeBlock.WATERLOGGED, replacedFluidState.is(Fluids.WATER)); + this.discard(); + if (direction != Direction.UP && relativeState.isFaceSturdy(this.level(), pos, direction, SupportType.CENTER)) { + this.level().setBlock(placementPos, blockState, 1 | 2); + this.level().scheduleTick(placementPos, AetherIIBlocks.BRETTL_ROPE_STAKE.get(), RopeBlock.DELAY); + } else if (this.level() instanceof ServerLevel serverLevel) { + this.spawnAtLocation(serverLevel, this.getDefaultPickupItem()); + } + } + + @Override + protected ItemStack getDefaultPickupItem() { + return BRETTL_ROPE_BOLT; + } +} diff --git a/src/main/java/com/aetherteam/aetherii/item/AetherIICreativeTabs.java b/src/main/java/com/aetherteam/aetherii/item/AetherIICreativeTabs.java index 34dd97adab..d3e782fead 100644 --- a/src/main/java/com/aetherteam/aetherii/item/AetherIICreativeTabs.java +++ b/src/main/java/com/aetherteam/aetherii/item/AetherIICreativeTabs.java @@ -761,6 +761,7 @@ public class AetherIICreativeTabs { output.accept(AetherIIItems.ARKENIUM_CROSSBOW.get()); output.accept(AetherIIItems.GRAVITITE_CROSSBOW.get()); output.accept(AetherIIItems.SCATTERGLASS_BOLT.get()); + output.accept(AetherIIItems.BRETTL_ROPE_BOLT.get()); output.accept(AetherIIItems.DART_SHOOTER.get()); output.accept(new ItemStack(AetherIIItems.AMBER_DARTS, 1, DataComponentPatch.builder().set(AetherIIDataComponents.BUILDUP_CONTENTS.get(), new BuildupContents(EffectBuildupPresets.VULNERABILITY)).build())); output.accept(new ItemStack(AetherIIItems.AMBER_DARTS, 1, DataComponentPatch.builder().set(AetherIIDataComponents.BUILDUP_CONTENTS.get(), new BuildupContents(EffectBuildupPresets.TOXIN)).build())); diff --git a/src/main/java/com/aetherteam/aetherii/item/AetherIIItems.java b/src/main/java/com/aetherteam/aetherii/item/AetherIIItems.java index ab7fe1d2ab..c5390aa94a 100644 --- a/src/main/java/com/aetherteam/aetherii/item/AetherIIItems.java +++ b/src/main/java/com/aetherteam/aetherii/item/AetherIIItems.java @@ -184,6 +184,7 @@ public class AetherIIItems { public static final DeferredItem AMBER_DARTS = register("amber_darts", AmberDartsItem::new, () -> new Item.Properties().component(AetherIIDataComponents.BUILDUP_CONTENTS, new BuildupContents(EffectBuildupPresets.VULNERABILITY)).stacksTo(16)); public static final DeferredItem SCATTERGLASS_BOLT = register("scatterglass_bolt", ScatterglassBoltItem::new); + public static final DeferredItem BRETTL_ROPE_BOLT = register("brettl_rope_bolt", BrettlRopeBoltItem::new); public static final DeferredItem HAMMER_OF_DEMOLITION = register("hammer_of_demolition", HammerOfDemolitionItem::new, () -> new Item.Properties().rarity(Rarity.RARE).component(AetherIIDataComponents.CHARMS, new Charms(new Charms.CharmHolder(Charms.Type.WEAPON, Charms.Tier.TWO), new Charms.CharmHolder(Charms.Type.WEAPON, Charms.Tier.TWO)))); diff --git a/src/main/java/com/aetherteam/aetherii/item/equipment/weapons/BrettlRopeBoltItem.java b/src/main/java/com/aetherteam/aetherii/item/equipment/weapons/BrettlRopeBoltItem.java new file mode 100644 index 0000000000..8928f557ca --- /dev/null +++ b/src/main/java/com/aetherteam/aetherii/item/equipment/weapons/BrettlRopeBoltItem.java @@ -0,0 +1,21 @@ +package com.aetherteam.aetherii.item.equipment.weapons; + +import com.aetherteam.aetherii.entity.projectile.BrettlRopeBolt; +import com.aetherteam.aetherii.entity.projectile.ScatterglassBolt; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.projectile.arrow.AbstractArrow; +import net.minecraft.world.item.ArrowItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import org.jetbrains.annotations.Nullable; + +public class BrettlRopeBoltItem extends ArrowItem { + public BrettlRopeBoltItem(Properties properties) { + super(properties); + } + + @Override + public AbstractArrow createArrow(Level level, ItemStack stack, LivingEntity shooter, @Nullable ItemStack weaponStack) { + return new BrettlRopeBolt(level, shooter, stack.copyWithCount(1), weaponStack); + } +} diff --git a/src/main/java/com/aetherteam/aetherii/item/equipment/weapons/TieredCrossbowItem.java b/src/main/java/com/aetherteam/aetherii/item/equipment/weapons/TieredCrossbowItem.java index 13f4bdaf54..92dd3f6063 100644 --- a/src/main/java/com/aetherteam/aetherii/item/equipment/weapons/TieredCrossbowItem.java +++ b/src/main/java/com/aetherteam/aetherii/item/equipment/weapons/TieredCrossbowItem.java @@ -1,5 +1,6 @@ package com.aetherteam.aetherii.item.equipment.weapons; +import com.aetherteam.aetherii.AetherIITags; import com.aetherteam.aetherii.attachment.AetherIIDataAttachments; import com.aetherteam.aetherii.item.AetherIIItems; import net.minecraft.core.Holder; @@ -28,7 +29,7 @@ import java.util.function.Predicate; public class TieredCrossbowItem extends CrossbowItem { - public static final Predicate BOLT_ONLY = stack -> stack.is(AetherIIItems.SCATTERGLASS_BOLT); + public static final Predicate BOLT_ONLY = stack -> stack.is(AetherIITags.Items.CROSSBOW_AMMO); public TieredCrossbowItem(ToolMaterial tier, Properties properties) { super(properties.durability(tier.durability())); diff --git a/src/main/resources/assets/aether_ii/textures/entity/projectile/brettl_rope_bolt.png b/src/main/resources/assets/aether_ii/textures/entity/projectile/brettl_rope_bolt.png new file mode 100644 index 0000000000000000000000000000000000000000..d410d84a4559d736a0b4e8acd7da7e3922e1f334 GIT binary patch literal 2246 zcmai02~ZPf6kfGnC|Gan(OFhusF-ZP0%lF1n213M#ekAnD=yhT$wIOlcQ+;+9+g`uEg}(1XRUx01cCdNo821531lO6QNVbv>HQ6iCF}} zPT;uH>6ALhOIgm0hsfn}To#IlhDxA@gwJ3E(j{T|(ISPHLk)N%N81IOWl)imOl2K{ z62l;lwvr39shyqSTaOPDfr|(pB9-AC)hT0JD0T;D^#np0abN{Dzz96l59y>2T=Z+` zMdT%VyM+~4-oo13ymShw4SvZGru)??f0F;>5S6dwj52j@) z2#xoI(GJC`R0$kwqOB0)byFsxv6EHdA@cBWNvPCI1B*sLTiTSNCIzS!Dhmyl$RDCfB|Z?gofq?mdohiGZD<|?9i)mQ? zm&%SHL2Ddq>VnnN2h~RPc&l=YUNdCv-ZxXv)f`Q&NzkvD-eY4#UBz2r>~9b2HT!3j zC+1yz{PlHwZb@lArrTc-urInUqyC)cxB5Soo1Y$P+H_huRIw&+=Lg_W(T+0HghB38 zF-_Tn>s-ZomtxDd%sTpu+p=^^V@tt++BwdN-+ubEW#Z1EjRigda~k~5%gU;a)dPbK zhZ`gfF=55yd^Y!TuGbaaTe-D%_Cjt#!-E}%O=A>&3p2@-8$)Xs?%VLLgUpcIGSdvF zerl}P7Fbxge#qsqCEb_H{Fgi)W?o8mb%z9HEoT09AIrt=ABwu4NR649e|7HQwE+Xh z96u9qb3e6u`FZu~@8kB}bU$ZPB)hKNHSOs=>B&}GWx47|VD_)pr;SzRm42VQyPQ6o z^Y~2yD>y2cz>(Jg^L}7^$)i8os+It^SVTS>e`+ z%Sw+Ye^`B5DlA)cwK^ib%>4VFets_aBi7rlG4KfDS0g@M@`L?Gzyhs{RYxc3bMBmd zKS-E9toHuhAM*m!&OAPFFOWCvMGsKX#l??y9n9XCvr&I?mflrXRI?;?^we?ZuIg9h zoZ42Oka%~}@S6p`$4^=lEDXWY`-vgkR%T}4#%9B__$Eb@LOBJwSiTFXZjd3X8hf2U z*T;=rtSf%wy|MWN{E>G8n#+2xim&_q)*sdLHdS?7*fMga?arumhXR=kV1aEGvSJm! z^T6$!H#U8I_)b+%VSaL=yYS1E7v|lI==omI+Yy7SK5LrpF8roh(PLn@G=}^r+y9gP z>A>MwU)!_yY~x>kXH(yWi+9Z1jSNs#wqQptFMygmw?|gj)Z{HXdgWx_n9|%W&fNa# zUAdaZ?LHuM_ug^Se(e*1{L&}l_U&f_CmwA1Xq3H7iZB-*ru=-NzQK9@{_}oO*RE(5 zU5t8SR-cb4v8;&ca*Ueoe?7}wm6Cn1CM)_$>sEhpSR>>ES3i5y<4cOuq6y%?Go?5(}-r!lde`(dAC&?PA`1d1r Ma=d!?q`6D}0r#~(5C8xG literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/aether_ii/textures/item/brettl_rope_bolt.png b/src/main/resources/assets/aether_ii/textures/item/brettl_rope_bolt.png new file mode 100644 index 0000000000000000000000000000000000000000..c2bf1c70375b0c4a57ac88059dba73dc27b566c8 GIT binary patch literal 2312 zcmai0dsI_(9KWbgaDt3fK&i%66vXY`@seG3LEO}FV#G@wrpRTx+iu?7J9qEgfI^OG zLfR=G&@po2D*{UcPV=Z!3RE;ee315}gc9>qBx317rQbFL@lk)=ZQtML`~7@hzwh_1 zG%a<3ug_#32!ec*74i)5J>K~|?FBwxx-m#VkY@^&rQ%h}6im$;M1+RTBSlt&5#SIc zO|%*b^$L;~5nFPE7ETS}{Oi zAbCPyHP8%)S#j9Ki-F(HV+0nsRQMG*tWu^4WUPr4#E4= zt<)3foya5fMm@{3oSrofdl?ndF#L!iDEH${tc3A#%1Y&bs~ZfX(%|@ct3cs~nlLJ+ z`wqCQd?SfukQ{3^smXb(KslzmD(9>tmTVw&WD3dXcs&k_V;=$*Q<{g*okXRWSQ=#|X_cG;ec}M?a1tbPq+SzCvHkw$CSxstO`GO4GD937f3t=LYbl^_maFSL_fh&mev?lX+8nggkvhbD~#J!!DI#(w5K0=XD%EnRh%*wK3hRVs^VD zD2Baqvr|#G(4M*Vn_Hj%jO6b7qzuleD-W$rYR~WNP+aN!6W=j#wCBS!cz|@%)|ywz zqm@G7#`KHB3X7RL{ijOd>qir>XKJP` zD*G{a;+9bVX{XPJUaQl*yWwm3yDcfT*ZK$9<-$*Y>eU|bo_l+@p}{UYG5z&l>4EMq z>0`lgnB)u*5A2$mTpOx|Dl zTIV0x_iVf4OFlWhcv<5a5nrUCESJnLr#FEVeVBAbICzvIrwqb$O23TV*9 zWO-6n+&g=>yrQ^31U4rg_#J)kV^!@-)0HV5X_MBb{~R({nQJ>gf4#%%Ep6So&u{w? z`6;9A?Z!6`wP0%}EwZ=C#(I`*Yz@b@m)!NbD;Ufjcltuo-)b(g)ibw72^B=b+r@F!9U3{;wNuN67rf*N+>KCf& zYPME?qw_Cq3qH9jxF~W$SK+nUA6z*7)wP+={`pgGemLn}fuDM-Y3Ijv-~RzgSAVyG z3Cvo?XE#E(?z|XOctdr#*WS~Sv+Ru=#**_saL*ikl`-=r6WOtySeTl9{ul`a1CqOKp7o_E|4 z`=@V9@SykbUQab%ITQr^g>%%>FeKE!VsGnSj|IJgLdRiZd}&+V5z7~U)gPSMT;AUM zT=A8Y7!pPRepU%H}bM*si- literal 0 HcmV?d00001 From fd838fdb9feca5e9764a18fd35b62eb27880a809 Mon Sep 17 00:00:00 2001 From: bconlon Date: Fri, 4 Sep 2026 16:46:32 -0700 Subject: [PATCH 25/27] refactor: allow knotting ropes with item in hand --- .../aetherii/block/utility/RopeBlock.java | 26 +++++++++---------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/aetherteam/aetherii/block/utility/RopeBlock.java b/src/main/java/com/aetherteam/aetherii/block/utility/RopeBlock.java index 5fd4ed050a..926546cbc1 100644 --- a/src/main/java/com/aetherteam/aetherii/block/utility/RopeBlock.java +++ b/src/main/java/com/aetherteam/aetherii/block/utility/RopeBlock.java @@ -113,22 +113,20 @@ protected InteractionResult useWithoutItem(BlockState state, Level level, BlockP break; } } - if (player.getMainHandItem().isEmpty() && player.getOffhandItem().isEmpty()) { - if (state.getValue(KNOT) && canUnknot) { - level.setBlock(pos, state.setValue(KNOT, false), 1 | 2); - return InteractionResult.SUCCESS; - } else if (!state.getValue(KNOT)) { - BlockState newState = state.setValue(KNOT, true).setValue(END, AetherIIBlockStateProperties.RopeEndState.NONE); - for (Map.Entry entry : PROPERTY_BY_DIRECTION.entrySet()) { - if (!newState.getValue(entry.getValue())) { - BlockPos neighborPos = pos.relative(entry.getKey()); - BlockState neighborState = level.getBlockState(neighborPos); - newState = newState.setValue(entry.getValue(), neighborState.isFaceSturdy(level, neighborPos, entry.getKey().getOpposite(), SupportType.CENTER)); - } + if (state.getValue(KNOT) && canUnknot) { + level.setBlock(pos, state.setValue(KNOT, false), 1 | 2); + return InteractionResult.SUCCESS; + } else if (!state.getValue(KNOT)) { + BlockState newState = state.setValue(KNOT, true).setValue(END, AetherIIBlockStateProperties.RopeEndState.NONE); + for (Map.Entry entry : PROPERTY_BY_DIRECTION.entrySet()) { + if (!newState.getValue(entry.getValue())) { + BlockPos neighborPos = pos.relative(entry.getKey()); + BlockState neighborState = level.getBlockState(neighborPos); + newState = newState.setValue(entry.getValue(), neighborState.isFaceSturdy(level, neighborPos, entry.getKey().getOpposite(), SupportType.CENTER)); } - level.setBlock(pos, newState, 1 | 2); - return InteractionResult.SUCCESS; } + level.setBlock(pos, newState, 1 | 2); + return InteractionResult.SUCCESS; } return super.useWithoutItem(state, level, pos, player, hitResult); } From 8e6efc6503b7d9e07b0729ae9febcbba6687bda9 Mon Sep 17 00:00:00 2001 From: bconlon Date: Fri, 4 Sep 2026 16:46:47 -0700 Subject: [PATCH 26/27] fix: ropes shouldnt break full blocks --- .../java/com/aetherteam/aetherii/block/utility/RopeBlock.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/aetherteam/aetherii/block/utility/RopeBlock.java b/src/main/java/com/aetherteam/aetherii/block/utility/RopeBlock.java index 926546cbc1..2b1e517aea 100644 --- a/src/main/java/com/aetherteam/aetherii/block/utility/RopeBlock.java +++ b/src/main/java/com/aetherteam/aetherii/block/utility/RopeBlock.java @@ -135,7 +135,7 @@ protected InteractionResult useWithoutItem(BlockState state, Level level, BlockP protected void tick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) { BlockPos belowPos = pos.below(); BlockState belowState = level.getBlockState(belowPos); - if (!belowState.isFaceSturdy(level, belowPos, Direction.UP)) { + if (!belowState.isFaceSturdy(level, belowPos, Direction.UP) && !belowState.isSolid()) { if (RopeStakeBlock.checkForStake(level, pos)) { RopeBlock.placeRope(level, belowPos, AetherIIBlocks.BRETTL_ROPE.get().defaultBlockState().setValue(RopeBlock.UP, true)); } else { From f025ee609055825e5e83478d23e0594d1af7b74f Mon Sep 17 00:00:00 2001 From: bconlon Date: Fri, 4 Sep 2026 17:14:00 -0700 Subject: [PATCH 27/27] refactor: rotate offhand climbing rope item --- .../aether_ii/models/item/brettl_rope_stake.json | 2 +- .../providers/AetherIIBlockModelSubProvider.java | 2 +- .../builders/models/AetherIIModelTemplates.java | 1 + .../aether_ii/models/item/mirrored_flat_item.json | 15 +++++++++++++++ 4 files changed, 18 insertions(+), 2 deletions(-) create mode 100644 src/main/resources/assets/aether_ii/models/item/mirrored_flat_item.json diff --git a/src/generated/resources/assets/aether_ii/models/item/brettl_rope_stake.json b/src/generated/resources/assets/aether_ii/models/item/brettl_rope_stake.json index 979e29a848..8eab36f721 100644 --- a/src/generated/resources/assets/aether_ii/models/item/brettl_rope_stake.json +++ b/src/generated/resources/assets/aether_ii/models/item/brettl_rope_stake.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:item/generated", + "parent": "aether_ii:item/mirrored_flat_item", "textures": { "layer0": "aether_ii:item/brettl_rope_stake" } diff --git a/src/main/java/com/aetherteam/aetherii/data/providers/AetherIIBlockModelSubProvider.java b/src/main/java/com/aetherteam/aetherii/data/providers/AetherIIBlockModelSubProvider.java index 4a3c5b2291..0b7c7e77e2 100644 --- a/src/main/java/com/aetherteam/aetherii/data/providers/AetherIIBlockModelSubProvider.java +++ b/src/main/java/com/aetherteam/aetherii/data/providers/AetherIIBlockModelSubProvider.java @@ -1205,7 +1205,7 @@ public void createClimbingRopeStake(Block block) { .with(condition().term(RopeStakeBlock.CONNECTION, Direction.WEST).term(RopeStakeBlock.SPOOL, AetherIIBlockStateProperties.StakeSpoolState.FLOOR, AetherIIBlockStateProperties.StakeSpoolState.NONE_CONNECTED), connection) .with(condition().term(RopeStakeBlock.SPOOL, AetherIIBlockStateProperties.StakeSpoolState.FLOOR), spoolFloor); - this.registerSimpleFlatItemModel(block.asItem()); + this.itemModelOutput.accept(block.asItem(), ItemModelUtils.plainModel(AetherIIModelTemplates.MIRRORED_FLAT_ITEM.create(ModelLocationUtils.getModelLocation(block.asItem()), TextureMapping.layer0(block.asItem()), this.modelOutput))); this.blockStateOutput.accept(model); } diff --git a/src/main/java/com/aetherteam/aetherii/data/resources/builders/models/AetherIIModelTemplates.java b/src/main/java/com/aetherteam/aetherii/data/resources/builders/models/AetherIIModelTemplates.java index f47b5f7635..38c1681357 100644 --- a/src/main/java/com/aetherteam/aetherii/data/resources/builders/models/AetherIIModelTemplates.java +++ b/src/main/java/com/aetherteam/aetherii/data/resources/builders/models/AetherIIModelTemplates.java @@ -316,6 +316,7 @@ public class AetherIIModelTemplates { public static final ModelTemplate ANIMAL_STASH = create("template_animal_stash", TextureSlot.TEXTURE, TextureSlot.PARTICLE).extend().build(); public static final ModelTemplate ANIMAL_STASH_OPEN = create("template_animal_stash_open", TextureSlot.TEXTURE, TextureSlot.PARTICLE).extend().build(); + public static final ModelTemplate MIRRORED_FLAT_ITEM = createItem("mirrored_flat_item", TextureSlot.LAYER0); public static final ModelTemplate DART_SHOOTER = createItem("handheld_dart_shooter", TextureSlot.LAYER0); public static final ModelTemplate DART_SHOOTER_TWO_LAYER = createItem("handheld_dart_shooter", TextureSlot.LAYER0, TextureSlot.LAYER1); public static final ModelTemplate USING_DART_SHOOTER_TWO_LAYER = createItem("using_dart_shooter", TextureSlot.LAYER0, TextureSlot.LAYER1); diff --git a/src/main/resources/assets/aether_ii/models/item/mirrored_flat_item.json b/src/main/resources/assets/aether_ii/models/item/mirrored_flat_item.json new file mode 100644 index 0000000000..7a38d6cb1b --- /dev/null +++ b/src/main/resources/assets/aether_ii/models/item/mirrored_flat_item.json @@ -0,0 +1,15 @@ +{ + "parent": "item/generated", + "display": { + "firstperson_righthand": { + "rotation": [ 0, -90, 25 ], + "translation": [ 1.13, 3.2, 1.13 ], + "scale": [ 0.68, 0.68, 0.68 ] + }, + "firstperson_lefthand": { + "rotation": [ 0, 90, -25 ], + "translation": [ 1.13, 3.2, 1.13 ], + "scale": [ 0.68, 0.68, 0.68 ] + } + } +}