From 1ae6267a8b0f8eb10db384314793e2fe40ec8215 Mon Sep 17 00:00:00 2001 From: NightFish <101402767+dmzz-yyhyy@users.noreply.github.com> Date: Sun, 10 Nov 2024 22:11:32 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=BB=91=E6=A7=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../anvilcraft/blockstates/sliding_rail.json | 14 ++ .../blockstates/sliding_rail_stop.json | 7 + .../assets/anvilcraft/lang/en_ud.json | 2 + .../assets/anvilcraft/lang/en_us.json | 2 + .../anvilcraft/models/item/sliding_rail.json | 3 + .../models/item/sliding_rail_stop.json | 3 + .../recipes/misc/sliding_rail.json | 32 +++ .../recipes/misc/sliding_rail_stop.json | 32 +++ .../loot_table/blocks/sliding_rail.json | 21 ++ .../loot_table/blocks/sliding_rail_stop.json | 21 ++ .../data/anvilcraft/recipe/sliding_rail.json | 21 ++ .../anvilcraft/recipe/sliding_rail_stop.json | 21 ++ .../anvilcraft/block/HollowMagnetBlock.java | 5 - .../anvilcraft/block/SlidingRailBlock.java | 232 ++++++++++++++++++ .../block/SlidingRailStopBlock.java | 58 +++++ .../block/entity/OverseerBlockEntity.java | 2 +- .../dev/dubhe/anvilcraft/init/ModBlocks.java | 69 +++++- .../anvilcraft/mixin/ItemEntityMixin.java | 17 +- .../mixin/PistonBaseBlockMixin.java | 17 +- .../mixin/PistonMovingBlockEntityMixin.java | 52 ++++ .../recipe/transform/MobTransformRecipe.java | 2 +- .../dev/dubhe/anvilcraft/util/DangerUtil.java | 4 + .../anvilcraft/util/ModelProviderUtil.java | 18 +- .../resources/META-INF/accesstransformer.cfg | 3 +- src/main/resources/anvilcraft.mixins.json | 1 + .../anvilcraft/models/block/royal_anvil.json | 1 + 26 files changed, 631 insertions(+), 29 deletions(-) create mode 100644 src/generated/resources/assets/anvilcraft/blockstates/sliding_rail.json create mode 100644 src/generated/resources/assets/anvilcraft/blockstates/sliding_rail_stop.json create mode 100644 src/generated/resources/assets/anvilcraft/models/item/sliding_rail.json create mode 100644 src/generated/resources/assets/anvilcraft/models/item/sliding_rail_stop.json create mode 100644 src/generated/resources/data/anvilcraft/advancement/recipes/misc/sliding_rail.json create mode 100644 src/generated/resources/data/anvilcraft/advancement/recipes/misc/sliding_rail_stop.json create mode 100644 src/generated/resources/data/anvilcraft/loot_table/blocks/sliding_rail.json create mode 100644 src/generated/resources/data/anvilcraft/loot_table/blocks/sliding_rail_stop.json create mode 100644 src/generated/resources/data/anvilcraft/recipe/sliding_rail.json create mode 100644 src/generated/resources/data/anvilcraft/recipe/sliding_rail_stop.json create mode 100644 src/main/java/dev/dubhe/anvilcraft/block/SlidingRailBlock.java create mode 100644 src/main/java/dev/dubhe/anvilcraft/block/SlidingRailStopBlock.java create mode 100644 src/main/java/dev/dubhe/anvilcraft/mixin/PistonMovingBlockEntityMixin.java diff --git a/src/generated/resources/assets/anvilcraft/blockstates/sliding_rail.json b/src/generated/resources/assets/anvilcraft/blockstates/sliding_rail.json new file mode 100644 index 000000000..5fa1b7e9f --- /dev/null +++ b/src/generated/resources/assets/anvilcraft/blockstates/sliding_rail.json @@ -0,0 +1,14 @@ +{ + "variants": { + "axis=x": { + "model": "anvilcraft:block/sliding_rail", + "y": 90 + }, + "axis=y": { + "model": "anvilcraft:block/sliding_rail" + }, + "axis=z": { + "model": "anvilcraft:block/sliding_rail" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/anvilcraft/blockstates/sliding_rail_stop.json b/src/generated/resources/assets/anvilcraft/blockstates/sliding_rail_stop.json new file mode 100644 index 000000000..fa8ad6711 --- /dev/null +++ b/src/generated/resources/assets/anvilcraft/blockstates/sliding_rail_stop.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "anvilcraft:block/sliding_rail_stop" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/anvilcraft/lang/en_ud.json b/src/generated/resources/assets/anvilcraft/lang/en_ud.json index 7a9d84855..8d8fd9e94 100644 --- a/src/generated/resources/assets/anvilcraft/lang/en_ud.json +++ b/src/generated/resources/assets/anvilcraft/lang/en_ud.json @@ -228,6 +228,8 @@ "block.anvilcraft.silver_block": "ʞɔoןᗺ ɹǝʌןıS", "block.anvilcraft.silver_pressure_plate": "ǝʇɐןԀ ǝɹnssǝɹԀ ɹǝʌןıS", "block.anvilcraft.simple_chute": "ǝʇnɥƆ ǝןdɯıS", + "block.anvilcraft.sliding_rail": "ןıɐᴚ buıpıןS", + "block.anvilcraft.sliding_rail_stop": "doʇS ןıɐᴚ buıpıןS", "block.anvilcraft.smooth_royal_steel_block": "ʞɔoןᗺ ןǝǝʇS ןɐʎoᴚ ɥʇooɯS", "block.anvilcraft.space_overcompressor": "ɹossǝɹdɯoɔɹǝʌO ǝɔɐdS", "block.anvilcraft.spectral_anvil": "ןıʌuⱯ ןɐɹʇɔǝdS", diff --git a/src/generated/resources/assets/anvilcraft/lang/en_us.json b/src/generated/resources/assets/anvilcraft/lang/en_us.json index cc30c62e1..5e0b85e70 100644 --- a/src/generated/resources/assets/anvilcraft/lang/en_us.json +++ b/src/generated/resources/assets/anvilcraft/lang/en_us.json @@ -228,6 +228,8 @@ "block.anvilcraft.silver_block": "Silver Block", "block.anvilcraft.silver_pressure_plate": "Silver Pressure Plate", "block.anvilcraft.simple_chute": "Simple Chute", + "block.anvilcraft.sliding_rail": "Sliding Rail", + "block.anvilcraft.sliding_rail_stop": "Sliding Rail Stop", "block.anvilcraft.smooth_royal_steel_block": "Smooth Royal Steel Block", "block.anvilcraft.space_overcompressor": "Space Overcompressor", "block.anvilcraft.spectral_anvil": "Spectral Anvil", diff --git a/src/generated/resources/assets/anvilcraft/models/item/sliding_rail.json b/src/generated/resources/assets/anvilcraft/models/item/sliding_rail.json new file mode 100644 index 000000000..13afb4fc3 --- /dev/null +++ b/src/generated/resources/assets/anvilcraft/models/item/sliding_rail.json @@ -0,0 +1,3 @@ +{ + "parent": "anvilcraft:block/sliding_rail" +} \ No newline at end of file diff --git a/src/generated/resources/assets/anvilcraft/models/item/sliding_rail_stop.json b/src/generated/resources/assets/anvilcraft/models/item/sliding_rail_stop.json new file mode 100644 index 000000000..09d9c20f8 --- /dev/null +++ b/src/generated/resources/assets/anvilcraft/models/item/sliding_rail_stop.json @@ -0,0 +1,3 @@ +{ + "parent": "anvilcraft:block/sliding_rail_stop" +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipes/misc/sliding_rail.json b/src/generated/resources/data/anvilcraft/advancement/recipes/misc/sliding_rail.json new file mode 100644 index 000000000..2f666b860 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipes/misc/sliding_rail.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_blue_ice": { + "conditions": { + "items": [ + { + "items": "minecraft:blue_ice" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:sliding_rail" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_blue_ice" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:sliding_rail" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipes/misc/sliding_rail_stop.json b/src/generated/resources/data/anvilcraft/advancement/recipes/misc/sliding_rail_stop.json new file mode 100644 index 000000000..23afe1792 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipes/misc/sliding_rail_stop.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_blue_ice": { + "conditions": { + "items": [ + { + "items": "minecraft:blue_ice" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:sliding_rail_stop" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_blue_ice" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:sliding_rail_stop" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/loot_table/blocks/sliding_rail.json b/src/generated/resources/data/anvilcraft/loot_table/blocks/sliding_rail.json new file mode 100644 index 000000000..e16d10e23 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/loot_table/blocks/sliding_rail.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "anvilcraft:sliding_rail" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "anvilcraft:blocks/sliding_rail" +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/loot_table/blocks/sliding_rail_stop.json b/src/generated/resources/data/anvilcraft/loot_table/blocks/sliding_rail_stop.json new file mode 100644 index 000000000..9ecc7d30d --- /dev/null +++ b/src/generated/resources/data/anvilcraft/loot_table/blocks/sliding_rail_stop.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "anvilcraft:sliding_rail_stop" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "anvilcraft:blocks/sliding_rail_stop" +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/sliding_rail.json b/src/generated/resources/data/anvilcraft/recipe/sliding_rail.json new file mode 100644 index 000000000..dca397235 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/sliding_rail.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "A": { + "item": "minecraft:blue_ice" + }, + "B": { + "item": "minecraft:iron_ingot" + } + }, + "pattern": [ + "A A", + "BAB", + "BBB" + ], + "result": { + "count": 1, + "id": "anvilcraft:sliding_rail" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/sliding_rail_stop.json b/src/generated/resources/data/anvilcraft/recipe/sliding_rail_stop.json new file mode 100644 index 000000000..f02848157 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/sliding_rail_stop.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "A": { + "item": "minecraft:blue_ice" + }, + "B": { + "item": "minecraft:iron_ingot" + } + }, + "pattern": [ + "A A", + "BAB", + "BBB" + ], + "result": { + "count": 1, + "id": "anvilcraft:sliding_rail_stop" + } +} \ No newline at end of file diff --git a/src/main/java/dev/dubhe/anvilcraft/block/HollowMagnetBlock.java b/src/main/java/dev/dubhe/anvilcraft/block/HollowMagnetBlock.java index 68ef99f66..936b54743 100644 --- a/src/main/java/dev/dubhe/anvilcraft/block/HollowMagnetBlock.java +++ b/src/main/java/dev/dubhe/anvilcraft/block/HollowMagnetBlock.java @@ -19,8 +19,6 @@ import net.minecraft.world.phys.shapes.Shapes; import net.minecraft.world.phys.shapes.VoxelShape; -import org.jetbrains.annotations.NotNull; - import javax.annotation.ParametersAreNonnullByDefault; @ParametersAreNonnullByDefault @@ -52,7 +50,6 @@ public VoxelShape getShape( } @Override - public boolean useShapeForLightOcclusion(BlockState blockState) { return true; } @@ -67,13 +64,11 @@ public BlockState getStateForPlacement(BlockPlaceContext blockPlaceContext) { } @Override - public FluidState getFluidState(BlockState blockState) { return blockState.getValue(WATERLOGGED) ? Fluids.WATER.getSource(false) : super.getFluidState(blockState); } @Override - public BlockState updateShape( BlockState blockState, Direction direction, diff --git a/src/main/java/dev/dubhe/anvilcraft/block/SlidingRailBlock.java b/src/main/java/dev/dubhe/anvilcraft/block/SlidingRailBlock.java new file mode 100644 index 000000000..a049c5380 --- /dev/null +++ b/src/main/java/dev/dubhe/anvilcraft/block/SlidingRailBlock.java @@ -0,0 +1,232 @@ +package dev.dubhe.anvilcraft.block; + +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.server.MinecraftServer; +import net.minecraft.tags.BlockTags; +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.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.piston.MovingPistonBlock; +import net.minecraft.world.level.block.piston.PistonMovingBlockEntity; +import net.minecraft.world.level.block.piston.PistonStructureResolver; +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.level.timers.TimerCallback; +import net.minecraft.world.level.timers.TimerQueue; +import net.minecraft.world.phys.shapes.BooleanOp; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.stream.Stream; + +import static net.minecraft.world.level.block.state.properties.BlockStateProperties.FACING; + +public class SlidingRailBlock extends Block { + public static final VoxelShape OUTSIDE = Block.box(0, 0, 0, 16, 16, 16); + public static final VoxelShape AABB_X = Stream.of( + Block.box(0, 6, 11, 16, 12, 14), + Block.box(0, 0, 0, 16, 6, 16), + Block.box(0, 12, 0, 16, 16, 5), + Block.box(0, 12, 11, 16, 16, 16), + Block.box(0, 6, 2, 16, 12, 5) + ).reduce((v1, v2) -> Shapes.join(v1, v2, BooleanOp.OR)).get(); + public static final VoxelShape AABB_Z = + Stream.of( + Block.box(2, 6, 0, 5, 12, 16), + Block.box(0, 0, 0, 16, 6, 16), + Block.box(11, 12, 0, 16, 16, 16), + Block.box(0, 12, 0, 5, 16, 16), + Block.box(11, 6, 0, 14, 12, 16) + ).reduce((v1, v2) -> Shapes.join(v1, v2, BooleanOp.OR)).get(); + public static final EnumProperty AXIS = BlockStateProperties.AXIS; + public static HashMap movingPistonMap = new HashMap<>(); + + public SlidingRailBlock(Properties properties) { + super(properties); + registerDefaultState(getStateDefinition().any().setValue(AXIS, Direction.Axis.X)); + } + + @Nullable + @Override + public BlockState getStateForPlacement(BlockPlaceContext context) { + return this.defaultBlockState() + .setValue(AXIS, context.getHorizontalDirection().getOpposite().getAxis()); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + builder.add(AXIS); + } + + @Override + protected @NotNull VoxelShape getInteractionShape(@NotNull BlockState state, @NotNull BlockGetter level, @NotNull BlockPos pos) { + return OUTSIDE; + } + + @Override + public @NotNull VoxelShape getShape( + BlockState blockState, + @NotNull BlockGetter blockGetter, + @NotNull BlockPos blockPos, + @NotNull CollisionContext collisionContext + ) { + return switch (blockState.getValue(AXIS)) { + case X: + yield AABB_X; + case Z: + default: + yield AABB_Z; + }; + } + + @Override + public void onNeighborChange( + @NotNull BlockState state, + @NotNull LevelReader level, + @NotNull BlockPos pos, + @NotNull BlockPos neighbor + ) { + if (level.getBlockState(neighbor).is(Blocks.MOVING_PISTON)) { + Optional pistonMovingBlockEntity = level.getBlockEntity(neighbor, BlockEntityType.PISTON); + if (pistonMovingBlockEntity.isEmpty()) return; + movingPistonMap.put(neighbor, pistonMovingBlockEntity.get()); + } + } + + @Override + protected void neighborChanged( + @NotNull BlockState state, + Level level, + @NotNull BlockPos pos, + @NotNull Block block, + @NotNull BlockPos fromPos, + boolean isMoving + ) { + if (level.isClientSide) return; + BlockState blockState = level.getBlockState(fromPos); + System.out.println(blockState.getBlock()); + if (blockState.is(Blocks.MOVING_PISTON)) return; + if (!movingPistonMap.containsKey(fromPos)) return; + System.out.println(movingPistonMap); + pushBlock(fromPos, level, movingPistonMap.get(fromPos).getMovementDirection()); + } + + /** + * 滑轨推动上方方块 + * + * @param pos 推动的方块位置 + * @param level 世界 + * @param direction 推动方向 + */ + public static void pushBlock(@NotNull BlockPos pos, @NotNull Level level, @NotNull Direction direction) { + moveBlocks(level, pos, direction); + } + + private static void moveBlocks(Level level, BlockPos pos, Direction facing) { + PistonStructureResolver pistonstructureresolver = new PistonStructureResolver(level, pos.relative(facing.getOpposite()), facing, true); + if (!pistonstructureresolver.resolve()) return; + Map map = Maps.newHashMap(); + List list = pistonstructureresolver.getToPush(); + List list1 = Lists.newArrayList(); + + for (BlockPos blockPos1 : list) { + BlockState blockstate = level.getBlockState(blockPos1); + list1.add(blockstate); + map.put(blockPos1, blockstate); + } + + List list2 = pistonstructureresolver.getToDestroy(); + BlockState[] ablockstate = new BlockState[list.size() + list2.size()]; + Direction direction = facing.getOpposite(); + int i = 0; + + for (int j = list2.size() - 1; j >= 0; j--) { + BlockPos blockPos2 = list2.get(j); + BlockState blockstate1 = level.getBlockState(blockPos2); + BlockEntity blockentity = blockstate1.hasBlockEntity() ? level.getBlockEntity(blockPos2) : null; + dropResources(blockstate1, level, blockPos2, blockentity); + blockstate1.onDestroyedByPushReaction(level, blockPos2, direction, level.getFluidState(blockPos2)); + if (!blockstate1.is(BlockTags.FIRE)) { + level.addDestroyBlockEffect(blockPos2, blockstate1); + } + + ablockstate[i++] = blockstate1; + } + + for (int k = list.size() - 1; k >= 0; k--) { + BlockPos blockpos3 = list.get(k); + blockpos3 = blockpos3.relative(direction); + map.remove(blockpos3); + BlockState blockstate8 = Blocks.MOVING_PISTON.defaultBlockState().setValue(FACING, facing); + level.setBlock(blockpos3, blockstate8, 68); + level.setBlockEntity( + MovingPistonBlock.newMovingBlockEntity(blockpos3, blockstate8, list1.get(k), facing, false, false) + ); + ablockstate[i++] = level.getBlockState(blockpos3); + } + + BlockState blockState3 = Blocks.AIR.defaultBlockState(); + + for (BlockPos blockpos4 : map.keySet()) { + level.setBlock(blockpos4, blockState3, 82); + } + + for (Map.Entry entry : map.entrySet()) { + BlockPos blockpos5 = entry.getKey(); + BlockState blockstate2 = entry.getValue(); + blockstate2.updateIndirectNeighbourShapes(level, blockpos5, 2); + blockState3.updateNeighbourShapes(level, blockpos5, 2); + blockState3.updateIndirectNeighbourShapes(level, blockpos5, 2); + } + + i = 0; + + for (int l = list2.size() - 1; l >= 0; l--) { + BlockState blockstate7 = ablockstate[i++]; + BlockPos blockpos6 = list2.get(l); + blockstate7.updateIndirectNeighbourShapes(level, blockpos6, 2); + level.updateNeighborsAt(blockpos6, blockstate7.getBlock()); + } + + for (int i1 = list.size() - 1; i1 >= 0; i1--) { + level.updateNeighborsAt(list.get(i1), ablockstate[i++].getBlock()); + } + + } + + public record PushBlockData(BlockPos blockPos, Level level, Direction direction) {} + + public static class PushBlockTimeCallback implements TimerCallback { + private final PushBlockData pushBlockData; + + public PushBlockTimeCallback(PushBlockData pushBlockData) { + this.pushBlockData = pushBlockData; + } + + @Override + public void handle( + @NotNull MinecraftServer obj, + @NotNull TimerQueue manager, + long gameTime + ) { + pushBlock(pushBlockData.blockPos, pushBlockData.level, pushBlockData.direction); + } + } +} diff --git a/src/main/java/dev/dubhe/anvilcraft/block/SlidingRailStopBlock.java b/src/main/java/dev/dubhe/anvilcraft/block/SlidingRailStopBlock.java new file mode 100644 index 000000000..52752c330 --- /dev/null +++ b/src/main/java/dev/dubhe/anvilcraft/block/SlidingRailStopBlock.java @@ -0,0 +1,58 @@ +package dev.dubhe.anvilcraft.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.Vec3; +import net.minecraft.world.phys.shapes.BooleanOp; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; +import org.jetbrains.annotations.NotNull; +import org.joml.Vector3f; + +import java.util.stream.Stream; + +public class SlidingRailStopBlock extends Block { + public static final VoxelShape SHAPE = Stream.of( + Block.box(11, 6, 11, 16, 16, 16), + Block.box(0, 0, 0, 16, 6, 16), + Block.box(11, 6, 0, 16, 16, 5), + Block.box(0, 6, 0, 5, 16, 5), + Block.box(0, 6, 11, 5, 16, 16) + ).reduce((v1, v2) -> Shapes.join(v1, v2, BooleanOp.OR)).get(); + + public SlidingRailStopBlock(Properties properties) { + super(properties); + } + + @Override + protected @NotNull VoxelShape getShape( + @NotNull BlockState state, + @NotNull BlockGetter level, + @NotNull BlockPos pos, + @NotNull CollisionContext context + ) { + return SHAPE; + } + + @Override + public void stepOn( + @NotNull Level level, + @NotNull BlockPos pos, + @NotNull BlockState state, + @NotNull Entity entity + ) { + Vec3 blockPos = pos.getCenter(); + Vec3 entityPos = entity.position(); + Vector3f acceleration = blockPos.toVector3f() + .sub(entityPos.toVector3f()) + .mul(0.45f) + .div(0.98f) + .mul(new Vector3f(1, 0, 1)); + entity.setDeltaMovement(entity.getDeltaMovement().multiply(0.5f, 0.5f, 0.5f).add(new Vec3(acceleration))); + } +} diff --git a/src/main/java/dev/dubhe/anvilcraft/block/entity/OverseerBlockEntity.java b/src/main/java/dev/dubhe/anvilcraft/block/entity/OverseerBlockEntity.java index 129b026d2..782400591 100644 --- a/src/main/java/dev/dubhe/anvilcraft/block/entity/OverseerBlockEntity.java +++ b/src/main/java/dev/dubhe/anvilcraft/block/entity/OverseerBlockEntity.java @@ -50,7 +50,7 @@ public void tick(Level level, @NotNull BlockPos pos, BlockState state) { // 如果底座上方不是监督者,直接破坏底座,结束方法 if (!isBaseValid()) { if (LevelLoadManager.checkRegistered(pos)) { - LevelLoadManager.unregister(pos, (ServerLevel) level); + LevelLoadManager.unregister(pos, level); } return; } diff --git a/src/main/java/dev/dubhe/anvilcraft/init/ModBlocks.java b/src/main/java/dev/dubhe/anvilcraft/init/ModBlocks.java index 21e5d1cc9..5ae2b5e1e 100644 --- a/src/main/java/dev/dubhe/anvilcraft/init/ModBlocks.java +++ b/src/main/java/dev/dubhe/anvilcraft/init/ModBlocks.java @@ -1,7 +1,6 @@ package dev.dubhe.anvilcraft.init; import dev.dubhe.anvilcraft.AnvilCraft; -import dev.dubhe.anvilcraft.api.power.IPowerComponent; import dev.dubhe.anvilcraft.api.power.IPowerComponent.Switch; import dev.dubhe.anvilcraft.block.AbstractMultiplePartBlock; import dev.dubhe.anvilcraft.block.ActiveSilencerBlock; @@ -26,6 +25,8 @@ import dev.dubhe.anvilcraft.block.HeavyIronDoorBlock; import dev.dubhe.anvilcraft.block.HeavyIronTrapdoorBlock; import dev.dubhe.anvilcraft.block.HeavyIronWallBlock; +import dev.dubhe.anvilcraft.block.SlidingRailBlock; +import dev.dubhe.anvilcraft.block.SlidingRailStopBlock; import dev.dubhe.anvilcraft.block.TransparentCraftingTableBlock; import dev.dubhe.anvilcraft.block.DischargerBlock; import dev.dubhe.anvilcraft.block.EmberAnvilBlock; @@ -145,6 +146,7 @@ import net.minecraft.world.level.storage.loot.entries.LootItem; import net.minecraft.world.level.storage.loot.functions.CopyComponentsFunction; import net.minecraft.world.level.storage.loot.providers.number.ConstantValue; +import net.neoforged.neoforge.client.model.generators.ConfiguredModel; import net.neoforged.neoforge.common.Tags; import com.tterrag.registrate.providers.RegistrateRecipeProvider; @@ -439,7 +441,7 @@ public class ModBlocks { .initialProperties(ModBlocks.MAGNET_BLOCK) .properties(properties -> properties.noOcclusion().lightLevel(state -> { if (state.getValue(TransmissionPoleBlock.HALF) != Vertical3PartHalf.TOP) return 0; - if (state.getValue(SWITCH) == IPowerComponent.Switch.OFF) return 0; + if (state.getValue(SWITCH) == Switch.OFF) return 0; if (state.getValue(OVERLOAD)) return 6; return 15; })) @@ -474,7 +476,7 @@ public class ModBlocks { .loot(AbstractMultiplePartBlock::loot) .properties(properties -> properties.noOcclusion().lightLevel(state -> { if (state.getValue(RemoteTransmissionPoleBlock.HALF) != Vertical4PartHalf.TOP) return 0; - if (state.getValue(SWITCH) == IPowerComponent.Switch.OFF) return 0; + if (state.getValue(SWITCH) == Switch.OFF) return 0; if (state.getValue(OVERLOAD)) return 6; return 15; })) @@ -1219,6 +1221,67 @@ public class ModBlocks { .build() .register(); + public static BlockEntry SLIDING_RAIL = REGISTRATE + .block("sliding_rail", SlidingRailBlock::new) + .initialProperties(() -> Blocks.IRON_BLOCK) + .properties(it -> it + .mapColor(MapColor.COLOR_GRAY) + .friction(1.0204082f) + .pushReaction(PushReaction.PUSH_ONLY) + ) + .blockstate((ctx, provider) -> { + provider.getVariantBuilder(ctx.get()).forAllStates(blockState -> switch (blockState.getValue( + SlidingRailBlock.AXIS)) { + case X -> new ConfiguredModel[] { + ConfiguredModel.builder() + .modelFile(DangerUtil.genModModelFile("block/sliding_rail").get()) + .rotationY(90) + .buildLast()}; + case Z, Y -> DangerUtil.genConfiguredModel("block/sliding_rail") + .get(); + }); + }) + .item() + .model((ctx, provider) -> provider.blockItem(ctx)) + .build() + .recipe((ctx, provider) -> { + ShapedRecipeBuilder.shaped(RecipeCategory.MISC, ctx.get(), 1) + .pattern("A A") + .pattern("BAB") + .pattern("BBB") + .define('A', Blocks.BLUE_ICE) + .define('B', Items.IRON_INGOT) + .unlockedBy(AnvilCraftDatagen.hasItem(Blocks.BLUE_ICE), AnvilCraftDatagen.has(Blocks.BLUE_ICE)) + .save(provider); + }) + .register(); + + public static BlockEntry SLIDING_RAIL_STOP = REGISTRATE + .block("sliding_rail_stop", SlidingRailStopBlock::new) + .initialProperties(() -> Blocks.IRON_BLOCK) + .properties(it -> it + .mapColor(MapColor.COLOR_GRAY) + .friction(0.8241758242f) + .pushReaction(PushReaction.PUSH_ONLY) + ) + .blockstate((ctx, provider) -> { + provider.simpleBlock(ctx.get(), DangerUtil.genModModelFile("block/sliding_rail_stop").get()); + }) + .item() + .model((ctx, provider) -> provider.blockItem(ctx)) + .build() + .recipe((ctx, provider) -> { + ShapedRecipeBuilder.shaped(RecipeCategory.MISC, ctx.get(), 1) + .pattern("A A") + .pattern("BAB") + .pattern("BBB") + .define('A', Blocks.BLUE_ICE) + .define('B', Items.IRON_INGOT) + .unlockedBy(AnvilCraftDatagen.hasItem(Blocks.BLUE_ICE), AnvilCraftDatagen.has(Blocks.BLUE_ICE)) + .save(provider); + }) + .register(); + static { REGISTRATE.defaultCreativeTab(ModItemGroups.ANVILCRAFT_BUILD_BLOCK.getKey()); } diff --git a/src/main/java/dev/dubhe/anvilcraft/mixin/ItemEntityMixin.java b/src/main/java/dev/dubhe/anvilcraft/mixin/ItemEntityMixin.java index 32a9b8796..43cadb746 100644 --- a/src/main/java/dev/dubhe/anvilcraft/mixin/ItemEntityMixin.java +++ b/src/main/java/dev/dubhe/anvilcraft/mixin/ItemEntityMixin.java @@ -5,6 +5,7 @@ import dev.dubhe.anvilcraft.init.ModItemTags; import dev.dubhe.anvilcraft.init.ModItems; +import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerPlayer; import net.minecraft.tags.DamageTypeTags; import net.minecraft.world.damagesource.DamageSource; @@ -53,11 +54,13 @@ public ItemEntityMixin(EntityType entityType, Level level) { @Redirect( method = "tick", - at = - @At( + at = @At( value = "INVOKE", target = - "Lnet/minecraft/world/entity/item/ItemEntity;getDeltaMovement()Lnet/minecraft/world/phys/Vec3;")) + "Lnet/minecraft/world/entity/item/ItemEntity;" + + "getDeltaMovement()Lnet/minecraft/world/phys/Vec3;" + ) + ) private @NotNull Vec3 slowDown(ItemEntity instance) { Vec3 vec3 = instance.getDeltaMovement(); double dy = 1; @@ -99,4 +102,12 @@ private void explosionProof(DamageSource source, float amount, CallbackInfoRetur cir.setReturnValue(false); } } + + @Inject(method = "getBlockPosBelowThatAffectsMyMovement", at = @At("HEAD"), cancellable = true) + private void slidingRailProgress(CallbackInfoReturnable cir) { + BlockState blockState = this.level().getBlockState(this.getOnPos(0.1f)); + if (blockState.is(ModBlocks.SLIDING_RAIL) || blockState.is(ModBlocks.SLIDING_RAIL_STOP)) { + cir.setReturnValue(this.getOnPos(0.1f)); + } + } } diff --git a/src/main/java/dev/dubhe/anvilcraft/mixin/PistonBaseBlockMixin.java b/src/main/java/dev/dubhe/anvilcraft/mixin/PistonBaseBlockMixin.java index 1241bb1ef..675c4ae1f 100644 --- a/src/main/java/dev/dubhe/anvilcraft/mixin/PistonBaseBlockMixin.java +++ b/src/main/java/dev/dubhe/anvilcraft/mixin/PistonBaseBlockMixin.java @@ -25,15 +25,14 @@ public boolean change(Player player, BlockPos blockPos, @NotNull Level level, It if (blockState.getValue(PistonBaseBlock.EXTENDED)) { return false; } - BlockState state = - switch (blockState.getValue(DirectionalBlock.FACING)) { - case UP -> blockState.setValue(DirectionalBlock.FACING, Direction.DOWN); - case DOWN -> blockState.setValue(DirectionalBlock.FACING, Direction.NORTH); - case NORTH -> blockState.setValue(DirectionalBlock.FACING, Direction.EAST); - case EAST -> blockState.setValue(DirectionalBlock.FACING, Direction.SOUTH); - case SOUTH -> blockState.setValue(DirectionalBlock.FACING, Direction.WEST); - case WEST -> blockState.setValue(DirectionalBlock.FACING, Direction.UP); - }; + BlockState state = switch (blockState.getValue(DirectionalBlock.FACING)) { + case UP -> blockState.setValue(DirectionalBlock.FACING, Direction.DOWN); + case DOWN -> blockState.setValue(DirectionalBlock.FACING, Direction.NORTH); + case NORTH -> blockState.setValue(DirectionalBlock.FACING, Direction.EAST); + case EAST -> blockState.setValue(DirectionalBlock.FACING, Direction.SOUTH); + case SOUTH -> blockState.setValue(DirectionalBlock.FACING, Direction.WEST); + case WEST -> blockState.setValue(DirectionalBlock.FACING, Direction.UP); + }; level.setBlockAndUpdate(blockPos, state); return true; } diff --git a/src/main/java/dev/dubhe/anvilcraft/mixin/PistonMovingBlockEntityMixin.java b/src/main/java/dev/dubhe/anvilcraft/mixin/PistonMovingBlockEntityMixin.java new file mode 100644 index 000000000..268c685a1 --- /dev/null +++ b/src/main/java/dev/dubhe/anvilcraft/mixin/PistonMovingBlockEntityMixin.java @@ -0,0 +1,52 @@ +package dev.dubhe.anvilcraft.mixin; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.piston.PistonMovingBlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(PistonMovingBlockEntity.class) +abstract class PistonMovingBlockEntityMixin { + + @Shadow private Direction direction; + + @Shadow private int deathTicks; + + @Shadow public abstract Direction getDirection(); + + @Inject( + method = "tick", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/world/level/Level;" + + "neighborChanged(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/Block;" + + "Lnet/minecraft/core/BlockPos;)V", + shift = At.Shift.AFTER + ) + ) + private static void slidingRail(Level level, BlockPos pos, BlockState state, PistonMovingBlockEntity blockEntity, CallbackInfo ci) { + if (level.isClientSide) return; + /* + if (level.getBlockState(pos.below()).is(ModBlocks.SLIDING_RAIL)) { + MinecraftServer server = level.getServer(); + if (server == null) return; + TimerQueue timerqueue = server.getWorldData().overworldData().getScheduledEvents(); + timerqueue.schedule( + String.valueOf(level.getGameTime()), + (level.getGameTime() + 1), + new SlidingRailBlock.PushBlockTimeCallback( + new SlidingRailBlock.PushBlockData( + pos, level, blockEntity.getMovementDirection() + ) + ) + ); + } + */ + } +} diff --git a/src/main/java/dev/dubhe/anvilcraft/recipe/transform/MobTransformRecipe.java b/src/main/java/dev/dubhe/anvilcraft/recipe/transform/MobTransformRecipe.java index af03b3e6e..3298df698 100644 --- a/src/main/java/dev/dubhe/anvilcraft/recipe/transform/MobTransformRecipe.java +++ b/src/main/java/dev/dubhe/anvilcraft/recipe/transform/MobTransformRecipe.java @@ -199,7 +199,7 @@ public static TransformRecipeBuilder from(EntityType type) { public static final class Serializer implements RecipeSerializer { public static final MapCodec MAP_CODEC = - RecordCodecBuilder.mapCodec(ins -> ins.group( + RecordCodecBuilder.mapCodec(ins -> ins.group( CodecUtil.ENTITY_CODEC.fieldOf("input").forGetter(o -> o.input), TransformResult.CODEC .listOf() diff --git a/src/main/java/dev/dubhe/anvilcraft/util/DangerUtil.java b/src/main/java/dev/dubhe/anvilcraft/util/DangerUtil.java index 83f809460..1499def88 100644 --- a/src/main/java/dev/dubhe/anvilcraft/util/DangerUtil.java +++ b/src/main/java/dev/dubhe/anvilcraft/util/DangerUtil.java @@ -19,6 +19,10 @@ public final class DangerUtil { return () -> new ConfiguredModel[] {new ConfiguredModel(new ModelFile.UncheckedModelFile(AnvilCraft.of(path)))}; } + public static @NotNull Supplier genModModelFile(String path) { + return () -> new ModelFile.UncheckedModelFile(AnvilCraft.of(path)); + } + public static @NotNull Supplier genUncheckedModelFile(String path) { return () -> new ModelFile.UncheckedModelFile(ResourceLocation.withDefaultNamespace(path)); } diff --git a/src/main/java/dev/dubhe/anvilcraft/util/ModelProviderUtil.java b/src/main/java/dev/dubhe/anvilcraft/util/ModelProviderUtil.java index 74ae3b033..db1a87041 100644 --- a/src/main/java/dev/dubhe/anvilcraft/util/ModelProviderUtil.java +++ b/src/main/java/dev/dubhe/anvilcraft/util/ModelProviderUtil.java @@ -14,6 +14,9 @@ @NoArgsConstructor(access = AccessLevel.PRIVATE) public class ModelProviderUtil { + /** + * 用于流体的BlockState生成器 + */ public static void liquid(DataGenContext ctx, RegistrateBlockstateProvider provider) { provider.simpleBlock( ctx.get(), @@ -21,14 +24,17 @@ public static void liquid(DataGenContext ctx, RegistrateBloc ); } + /** + * 用于流体的ItemModel生成器 + */ public static void bucket(DataGenContext ctx, RegistrateItemModelProvider provider) { provider.withExistingParent( - ctx.getName(), - ResourceLocation.parse("neoforge:item/bucket_drip")) - .texture("cover", ResourceLocation.parse("neoforge:item/mask/bucket_fluid_cover_drip")) - .customLoader((builder, helper) -> DynamicFluidContainerModelBuilder.begin(builder, helper) - .fluid(ctx.get().content) - .coverIsMask(true) + ctx.getName(), + ResourceLocation.parse("neoforge:item/bucket_drip")) + .texture("cover", ResourceLocation.parse("neoforge:item/mask/bucket_fluid_cover_drip")) + .customLoader((builder, helper) -> DynamicFluidContainerModelBuilder.begin(builder, helper) + .fluid(ctx.get().content) + .coverIsMask(true) ); } } diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index d0dc33e44..1058634f9 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -47,4 +47,5 @@ public net.minecraft.client.renderer.RenderType$CompositeState transparencyState public net.minecraft.client.renderer.RenderStateShard$TextureStateShard texture public net.minecraft.world.level.block.TrapDoorBlock toggle(Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/entity/player/Player;)V # toggle -public net.minecraft.world.level.block.DoorBlock getHinge(Lnet/minecraft/world/item/context/BlockPlaceContext;)Lnet/minecraft/world/level/block/state/properties/DoorHingeSide; # getHinge \ No newline at end of file +public net.minecraft.world.level.block.DoorBlock getHinge(Lnet/minecraft/world/item/context/BlockPlaceContext;)Lnet/minecraft/world/level/block/state/properties/DoorHingeSide; # getHinge +public net.minecraft.world.level.block.piston.PistonBaseBlock moveBlocks(Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;Lnet/minecraft/core/Direction;Z)Z # moveBlocks \ No newline at end of file diff --git a/src/main/resources/anvilcraft.mixins.json b/src/main/resources/anvilcraft.mixins.json index db10db2f9..135137c20 100644 --- a/src/main/resources/anvilcraft.mixins.json +++ b/src/main/resources/anvilcraft.mixins.json @@ -18,6 +18,7 @@ "FlyingHitEntityMixin", "ItemEntityMixin", "PistonBaseBlockMixin", + "PistonMovingBlockEntityMixin", "PistonStructureResolverMixin", "PlayerHitEntityMixin", "RecipeManagerMixin", diff --git a/src/main/resources/assets/anvilcraft/models/block/royal_anvil.json b/src/main/resources/assets/anvilcraft/models/block/royal_anvil.json index 948f7fc6e..8717ad385 100644 --- a/src/main/resources/assets/anvilcraft/models/block/royal_anvil.json +++ b/src/main/resources/assets/anvilcraft/models/block/royal_anvil.json @@ -1,6 +1,7 @@ { "credit": "Made by XeKr with Blockbench", "parent": "minecraft:block/block", + "render_type": "minecraft:cutout", "textures": { "particle": "anvilcraft:block/royal_anvil", "body": "anvilcraft:block/royal_anvil",