From f0006e7249d6e62bff81d76f55b25696a3d55290 Mon Sep 17 00:00:00 2001 From: Manwe Date: Fri, 10 Jan 2025 01:01:03 +0100 Subject: [PATCH 1/3] Add FancyCableBlock --- .../sfm/datagen/SFMBlockStatesAndModels.java | 76 +++++++- .../teamdman/sfm/datagen/SFMItemModels.java | 1 + .../assets/sfm/blockstates/fancy_cable.json | 62 ++++++ .../models/block/fancy_cable_connection.json | 79 ++++++++ .../sfm/models/block/fancy_cable_core.json | 78 ++++++++ .../sfm/common/block/FancyCableBlock.java | 176 ++++++++++++++++++ .../teamdman/sfm/common/block/ShapeCache.java | 19 ++ .../sfm/common/registry/SFMBlocks.java | 1 + .../sfm/common/registry/SFMItems.java | 1 + .../assets/sfm/textures/block/fancy_cable.png | Bin 0 -> 342 bytes 10 files changed, 492 insertions(+), 1 deletion(-) create mode 100644 src/generated/resources/assets/sfm/blockstates/fancy_cable.json create mode 100644 src/generated/resources/assets/sfm/models/block/fancy_cable_connection.json create mode 100644 src/generated/resources/assets/sfm/models/block/fancy_cable_core.json create mode 100644 src/main/java/ca/teamdman/sfm/common/block/FancyCableBlock.java create mode 100644 src/main/java/ca/teamdman/sfm/common/block/ShapeCache.java create mode 100644 src/main/resources/assets/sfm/textures/block/fancy_cable.png diff --git a/src/datagen/java/ca/teamdman/sfm/datagen/SFMBlockStatesAndModels.java b/src/datagen/java/ca/teamdman/sfm/datagen/SFMBlockStatesAndModels.java index fe939cc38..d8b2a51ea 100644 --- a/src/datagen/java/ca/teamdman/sfm/datagen/SFMBlockStatesAndModels.java +++ b/src/datagen/java/ca/teamdman/sfm/datagen/SFMBlockStatesAndModels.java @@ -1,6 +1,7 @@ package ca.teamdman.sfm.datagen; import ca.teamdman.sfm.SFM; +import ca.teamdman.sfm.common.block.FancyCableBlock; import ca.teamdman.sfm.common.block.WaterTankBlock; import ca.teamdman.sfm.common.registry.SFMBlocks; import net.minecraft.core.Direction; @@ -8,6 +9,7 @@ import net.minecraft.world.level.block.state.properties.BlockStateProperties; import net.minecraftforge.client.model.generators.BlockStateProvider; import net.minecraftforge.client.model.generators.ConfiguredModel; +import net.minecraftforge.client.model.generators.ModelBuilder; import net.minecraftforge.client.model.generators.ModelFile; import net.minecraftforge.data.event.GatherDataEvent; @@ -27,7 +29,7 @@ protected void registerStatesAndModels() { simpleBlock(SFMBlocks.CABLE_BLOCK.get()); simpleBlock(SFMBlocks.PRINTING_PRESS_BLOCK.get(), models().getExistingFile(modLoc("block/printing_press"))); - + registerFancyCableBlock(); ModelFile waterIntakeModelActive = models() .cubeAll( @@ -95,4 +97,76 @@ protected void registerStatesAndModels() { }); } } + + private void registerFancyCableBlock() { + var coreModel = models().withExistingParent(modLoc("block/fancy_cable_core").getPath(), "block/block") + .element() + .from(4, 4, 4) + .to(12, 12, 12) + .shade(false) + .allFaces((direction, faceBuilder) -> faceBuilder.uvs(8, 0, 16, 8).texture("#cable")) + .end() + .texture("cable", modLoc("block/fancy_cable")) + .texture("particle", modLoc("block/fancy_cable")); + var connectionModel = models().withExistingParent(modLoc("block/fancy_cable_connection").getPath(), "block/block") + .element() + .from(5, 5, 0) + .to(11, 11, 5) + .shade(false) + .allFaces((direction, faceBuilder) -> { + switch (direction) { + case NORTH: + case SOUTH: { + faceBuilder.uvs(9, 1, 15, 7); + break; + } + case EAST: + case WEST: { + faceBuilder.uvs(0, 0, 5, 6); + break; + } + case UP: + case DOWN: { + faceBuilder.uvs(0, 0, 5, 6) + .rotation(ModelBuilder.FaceRotation.CLOCKWISE_90); + break; + } + } + + faceBuilder.texture("#cable"); + }) + .end() + .texture("cable", modLoc("block/fancy_cable")); + + var multipartBuilder1 = getMultipartBuilder(SFMBlocks.FANCY_CABLE_BLOCK.get()); + + // Core + multipartBuilder1.part() + .modelFile(coreModel) + .addModel() + .end(); + + // Parts (connections) + for (Direction direction: Direction.values()) { + var rotX = 0; + var rotY = 0; + + switch (direction) { + case SOUTH -> rotY = 180; + case EAST -> rotY = 90; + case WEST -> rotY = 270; + case UP -> rotX = 270; + case DOWN -> rotX = 90; + } + + multipartBuilder1.part() + .modelFile(connectionModel) + .rotationX(rotX) + .rotationY(rotY) + .uvLock(false) + .addModel() + .condition(FancyCableBlock.DIRECTION_PROPERTIES.get(direction), true) + .end(); + } + } } diff --git a/src/datagen/java/ca/teamdman/sfm/datagen/SFMItemModels.java b/src/datagen/java/ca/teamdman/sfm/datagen/SFMItemModels.java index 849151719..e05da194b 100644 --- a/src/datagen/java/ca/teamdman/sfm/datagen/SFMItemModels.java +++ b/src/datagen/java/ca/teamdman/sfm/datagen/SFMItemModels.java @@ -24,6 +24,7 @@ public SFMItemModels( protected void registerModels() { justParent(SFMItems.MANAGER_ITEM, SFMBlocks.MANAGER_BLOCK); justParent(SFMItems.CABLE_ITEM, SFMBlocks.CABLE_BLOCK); + justParent(SFMItems.FANCY_CABLE_ITEM, SFMBlocks.FANCY_CABLE_BLOCK); justParent(SFMItems.PRINTING_PRESS_ITEM, SFMBlocks.PRINTING_PRESS_BLOCK); justParent(SFMItems.WATER_TANK_ITEM, SFMBlocks.WATER_TANK_BLOCK, "_active"); basicItem(SFMItems.DISK_ITEM); diff --git a/src/generated/resources/assets/sfm/blockstates/fancy_cable.json b/src/generated/resources/assets/sfm/blockstates/fancy_cable.json new file mode 100644 index 000000000..5f63fd099 --- /dev/null +++ b/src/generated/resources/assets/sfm/blockstates/fancy_cable.json @@ -0,0 +1,62 @@ +{ + "multipart": [ + { + "apply": { + "model": "sfm:block/fancy_cable_core" + } + }, + { + "apply": { + "model": "sfm:block/fancy_cable_connection", + "x": 90 + }, + "when": { + "down": "true" + } + }, + { + "apply": { + "model": "sfm:block/fancy_cable_connection", + "x": 270 + }, + "when": { + "up": "true" + } + }, + { + "apply": { + "model": "sfm:block/fancy_cable_connection" + }, + "when": { + "north": "true" + } + }, + { + "apply": { + "model": "sfm:block/fancy_cable_connection", + "y": 180 + }, + "when": { + "south": "true" + } + }, + { + "apply": { + "model": "sfm:block/fancy_cable_connection", + "y": 270 + }, + "when": { + "west": "true" + } + }, + { + "apply": { + "model": "sfm:block/fancy_cable_connection", + "y": 90 + }, + "when": { + "east": "true" + } + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/assets/sfm/models/block/fancy_cable_connection.json b/src/generated/resources/assets/sfm/models/block/fancy_cable_connection.json new file mode 100644 index 000000000..95d1e9118 --- /dev/null +++ b/src/generated/resources/assets/sfm/models/block/fancy_cable_connection.json @@ -0,0 +1,79 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "rotation": 90, + "texture": "#cable", + "uv": [ + 0.0, + 0.0, + 5.0, + 6.0 + ] + }, + "east": { + "texture": "#cable", + "uv": [ + 0.0, + 0.0, + 5.0, + 6.0 + ] + }, + "north": { + "texture": "#cable", + "uv": [ + 9.0, + 1.0, + 15.0, + 7.0 + ] + }, + "south": { + "texture": "#cable", + "uv": [ + 9.0, + 1.0, + 15.0, + 7.0 + ] + }, + "up": { + "rotation": 90, + "texture": "#cable", + "uv": [ + 0.0, + 0.0, + 5.0, + 6.0 + ] + }, + "west": { + "texture": "#cable", + "uv": [ + 0.0, + 0.0, + 5.0, + 6.0 + ] + } + }, + "from": [ + 5, + 5, + 0 + ], + "shade": false, + "to": [ + 11, + 11, + 5 + ] + } + ], + "textures": { + "cable": "sfm:block/fancy_cable" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/sfm/models/block/fancy_cable_core.json b/src/generated/resources/assets/sfm/models/block/fancy_cable_core.json new file mode 100644 index 000000000..b25f782cf --- /dev/null +++ b/src/generated/resources/assets/sfm/models/block/fancy_cable_core.json @@ -0,0 +1,78 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "texture": "#cable", + "uv": [ + 8.0, + 0.0, + 16.0, + 8.0 + ] + }, + "east": { + "texture": "#cable", + "uv": [ + 8.0, + 0.0, + 16.0, + 8.0 + ] + }, + "north": { + "texture": "#cable", + "uv": [ + 8.0, + 0.0, + 16.0, + 8.0 + ] + }, + "south": { + "texture": "#cable", + "uv": [ + 8.0, + 0.0, + 16.0, + 8.0 + ] + }, + "up": { + "texture": "#cable", + "uv": [ + 8.0, + 0.0, + 16.0, + 8.0 + ] + }, + "west": { + "texture": "#cable", + "uv": [ + 8.0, + 0.0, + 16.0, + 8.0 + ] + } + }, + "from": [ + 4, + 4, + 4 + ], + "shade": false, + "to": [ + 12, + 12, + 12 + ] + } + ], + "textures": { + "cable": "sfm:block/fancy_cable", + "particle": "sfm:block/fancy_cable" + } +} \ No newline at end of file diff --git a/src/main/java/ca/teamdman/sfm/common/block/FancyCableBlock.java b/src/main/java/ca/teamdman/sfm/common/block/FancyCableBlock.java new file mode 100644 index 000000000..73d0664bd --- /dev/null +++ b/src/main/java/ca/teamdman/sfm/common/block/FancyCableBlock.java @@ -0,0 +1,176 @@ +package ca.teamdman.sfm.common.block; + +import ca.teamdman.sfm.common.cablenetwork.ICableBlock; +import ca.teamdman.sfm.common.registry.SFMResourceTypes; +import com.google.common.collect.ImmutableMap; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; +import net.minecraftforge.common.capabilities.ForgeCapabilities; +import org.jetbrains.annotations.Nullable; + +import java.util.Map; +import java.util.function.Supplier; + +public class FancyCableBlock extends CableBlock { + public static final BooleanProperty NORTH = BooleanProperty.create("north"); + public static final BooleanProperty SOUTH = BooleanProperty.create("south"); + public static final BooleanProperty EAST = BooleanProperty.create("east"); + public static final BooleanProperty WEST = BooleanProperty.create("west"); + public static final BooleanProperty UP = BooleanProperty.create("up"); + + + public static final BooleanProperty DOWN = BooleanProperty.create("down"); + + public static final VoxelShape SHAPE_CORE = Block.box(4, 4, 4, 12, 12, 12); + public static final VoxelShape SHAPE_NORTH = Block.box(5, 5, 0, 11, 11, 5); + public static final VoxelShape SHAPE_SOUTH = Block.box(5, 5, 11, 11, 11, 16); + public static final VoxelShape SHAPE_EAST = Block.box(11, 5, 5, 16, 11, 11); + public static final VoxelShape SHAPE_WEST = Block.box(0, 5, 5, 5, 11, 11); + public static final VoxelShape SHAPE_UP = Block.box(5, 11, 5, 11, 16, 11); + public static final VoxelShape SHAPE_DOWN = Block.box(5, 0, 5, 11, 5, 11); + + public static final Map DIRECTION_PROPERTIES = ImmutableMap.of( + Direction.NORTH, NORTH, + Direction.SOUTH, SOUTH, + Direction.EAST, EAST, + Direction.WEST, WEST, + Direction.UP, UP, + Direction.DOWN, DOWN + ); + + public FancyCableBlock() { + super(); + registerDefaultState( + defaultBlockState() + .setValue(NORTH, false) + .setValue(SOUTH, false) + .setValue(EAST, false) + .setValue(WEST, false) + .setValue(UP, false) + .setValue(DOWN, false) + ); + } + + @Override + public @Nullable BlockState getStateForPlacement(BlockPlaceContext ctx) { + return getState(defaultBlockState(), ctx.getLevel(), ctx.getClickedPos()); + } + + @SuppressWarnings("deprecation") + @Override + public void neighborChanged( + BlockState state, + Level level, + BlockPos pos, + Block block, + BlockPos fromPos, + boolean isMoving + ) { + super.neighborChanged(state, level, pos, block, fromPos, isMoving); + + level.setBlockAndUpdate(pos, getState(level.getBlockState(pos), level, pos)); + } + + @SuppressWarnings("deprecation") + @Override + public VoxelShape getShape( + BlockState state, + BlockGetter world, + BlockPos pos, + CollisionContext ctx + ) { + return ShapeCache.getOrCompute(state, FancyCableBlock::getShape); + } + + @Override + @SuppressWarnings("deprecation") + public BlockState updateShape( + BlockState state, + Direction dir, + BlockState facingState, + LevelAccessor world, + BlockPos pos, + BlockPos facingPos + ) { + return getState(state, world, pos); + } + + protected static VoxelShape getShape(BlockState state) { + var shape = SHAPE_CORE; + + shape = combineShapes(shape, SHAPE_NORTH, () -> state.getValue(NORTH)); + shape = combineShapes(shape, SHAPE_SOUTH, () -> state.getValue(SOUTH)); + shape = combineShapes(shape, SHAPE_EAST, () -> state.getValue(EAST)); + shape = combineShapes(shape, SHAPE_WEST, () -> state.getValue(WEST)); + shape = combineShapes(shape, SHAPE_UP, () -> state.getValue(UP)); + shape = combineShapes(shape, SHAPE_DOWN, () -> state.getValue(DOWN)); + + return shape; + } + + protected static VoxelShape combineShapes( + VoxelShape shape1, + VoxelShape shape2, + Supplier condition + ) { + return condition.get() ? Shapes.or(shape1, shape2) : shape1; + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + super.createBlockStateDefinition(builder); + builder.add(NORTH, SOUTH, EAST, WEST, UP, DOWN); + } + + protected BlockState getState( + BlockState currentState, + LevelAccessor level, + BlockPos pos + ) { + boolean north = hasConnection(level, pos, Direction.NORTH); + boolean south = hasConnection(level, pos, Direction.SOUTH); + boolean east = hasConnection(level, pos, Direction.EAST); + boolean west = hasConnection(level, pos, Direction.WEST); + boolean up = hasConnection(level, pos, Direction.UP); + boolean down = hasConnection(level, pos, Direction.DOWN); + + return currentState + .setValue(NORTH, north) + .setValue(SOUTH, south) + .setValue(EAST, east) + .setValue(WEST, west) + .setValue(UP, up) + .setValue(DOWN, down); + } + + protected boolean hasConnection( + LevelAccessor level, + BlockPos pos, + Direction direction + ) { + // Directly connect to other cables + BlockPos relative = pos.relative(direction); + if (level.getBlockState(relative).getBlock() instanceof ICableBlock) { + return true; + } + + BlockEntity blockEntity = level.getBlockEntity(relative); + if (blockEntity == null) { + return false; + } + + return blockEntity.getCapability(ForgeCapabilities.ITEM_HANDLER, direction.getOpposite()).isPresent(); + } +} diff --git a/src/main/java/ca/teamdman/sfm/common/block/ShapeCache.java b/src/main/java/ca/teamdman/sfm/common/block/ShapeCache.java new file mode 100644 index 000000000..3ba371159 --- /dev/null +++ b/src/main/java/ca/teamdman/sfm/common/block/ShapeCache.java @@ -0,0 +1,19 @@ +package ca.teamdman.sfm.common.block; + +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.shapes.VoxelShape; + +import java.util.HashMap; +import java.util.Map; +import java.util.function.Function; + +public final class ShapeCache { + private static final Map STORAGE = new HashMap<>(); + + private ShapeCache() { + } + + public static VoxelShape getOrCompute(BlockState state, Function computeFunction) { + return STORAGE.computeIfAbsent(state, computeFunction); + } +} diff --git a/src/main/java/ca/teamdman/sfm/common/registry/SFMBlocks.java b/src/main/java/ca/teamdman/sfm/common/registry/SFMBlocks.java index 318b6d8cf..fbc9682b4 100644 --- a/src/main/java/ca/teamdman/sfm/common/registry/SFMBlocks.java +++ b/src/main/java/ca/teamdman/sfm/common/registry/SFMBlocks.java @@ -18,6 +18,7 @@ public class SFMBlocks { ); public static final RegistryObject WATER_TANK_BLOCK = BLOCKS.register("water_tank", WaterTankBlock::new); public static final RegistryObject CABLE_BLOCK = BLOCKS.register("cable", CableBlock::new); + public static final RegistryObject FANCY_CABLE_BLOCK = BLOCKS.register("fancy_cable", FancyCableBlock::new); public static final RegistryObject BATTERY_BLOCK = BLOCKS.register("battery", BatteryBlock::new); diff --git a/src/main/java/ca/teamdman/sfm/common/registry/SFMItems.java b/src/main/java/ca/teamdman/sfm/common/registry/SFMItems.java index 74cc06a97..f2b7a963f 100644 --- a/src/main/java/ca/teamdman/sfm/common/registry/SFMItems.java +++ b/src/main/java/ca/teamdman/sfm/common/registry/SFMItems.java @@ -19,6 +19,7 @@ public class SFMItems { private static final DeferredRegister ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, SFM.MOD_ID); public static final RegistryObject MANAGER_ITEM = register("manager", SFMBlocks.MANAGER_BLOCK); public static final RegistryObject CABLE_ITEM = register("cable", SFMBlocks.CABLE_BLOCK); + public static final RegistryObject FANCY_CABLE_ITEM = register("fancy_cable", SFMBlocks.FANCY_CABLE_BLOCK); // public static final RegistryObject BATTERY_ITEM = register("battery", SFMBlocks.BATTERY_BLOCK); public static final RegistryObject WATER_TANK_ITEM = register("water_tank", SFMBlocks.WATER_TANK_BLOCK); public static final RegistryObject DISK_ITEM = ITEMS.register("disk", DiskItem::new); diff --git a/src/main/resources/assets/sfm/textures/block/fancy_cable.png b/src/main/resources/assets/sfm/textures/block/fancy_cable.png new file mode 100644 index 0000000000000000000000000000000000000000..65806a20041c41145d2927137944516598d26e9e GIT binary patch literal 342 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%Lh(0G|+7DM=LxaV059B_%~&9W4tr6(bd8JqyxgeoxS96XH#9?`a565AN*rmdsuj1?$z5iKr0zMUHx3vIVCg! E0JZ#e4*&oF literal 0 HcmV?d00001 From c18f074211e0539b20741c624596bc19da5ae82e Mon Sep 17 00:00:00 2001 From: Manwe Date: Fri, 10 Jan 2025 04:22:09 +0100 Subject: [PATCH 2/3] Fix item texture --- src/datagen/java/ca/teamdman/sfm/datagen/SFMItemModels.java | 4 +--- src/generated/resources/assets/sfm/lang/en_us.json | 1 + .../resources/assets/sfm/models/item/fancy_cable.json | 3 +++ .../teamdman/sfm/common/localization/LocalizationKeys.java | 6 ++++++ 4 files changed, 11 insertions(+), 3 deletions(-) create mode 100644 src/generated/resources/assets/sfm/models/item/fancy_cable.json diff --git a/src/datagen/java/ca/teamdman/sfm/datagen/SFMItemModels.java b/src/datagen/java/ca/teamdman/sfm/datagen/SFMItemModels.java index e05da194b..5ee6c5f7a 100644 --- a/src/datagen/java/ca/teamdman/sfm/datagen/SFMItemModels.java +++ b/src/datagen/java/ca/teamdman/sfm/datagen/SFMItemModels.java @@ -4,8 +4,6 @@ import ca.teamdman.sfm.common.registry.SFMBlocks; import ca.teamdman.sfm.common.registry.SFMItems; import net.minecraft.client.renderer.block.model.BlockModel; -import net.minecraft.data.DataGenerator; -import net.minecraft.data.PackOutput; import net.minecraft.world.item.Item; import net.minecraft.world.level.block.Block; import net.minecraftforge.client.model.generators.ItemModelProvider; @@ -24,7 +22,7 @@ public SFMItemModels( protected void registerModels() { justParent(SFMItems.MANAGER_ITEM, SFMBlocks.MANAGER_BLOCK); justParent(SFMItems.CABLE_ITEM, SFMBlocks.CABLE_BLOCK); - justParent(SFMItems.FANCY_CABLE_ITEM, SFMBlocks.FANCY_CABLE_BLOCK); + justParent(SFMItems.FANCY_CABLE_ITEM, SFMBlocks.FANCY_CABLE_BLOCK, "_core"); justParent(SFMItems.PRINTING_PRESS_ITEM, SFMBlocks.PRINTING_PRESS_BLOCK); justParent(SFMItems.WATER_TANK_ITEM, SFMBlocks.WATER_TANK_BLOCK, "_active"); basicItem(SFMItems.DISK_ITEM); diff --git a/src/generated/resources/assets/sfm/lang/en_us.json b/src/generated/resources/assets/sfm/lang/en_us.json index 874634b77..ee5d84273 100644 --- a/src/generated/resources/assets/sfm/lang/en_us.json +++ b/src/generated/resources/assets/sfm/lang/en_us.json @@ -1,6 +1,7 @@ { "block.sfm.battery": "Battery (WIP)", "block.sfm.cable": "Inventory Cable", + "block.sfm.fancy_cable": "Fancy Inventory Cable", "block.sfm.manager": "Factory Manager", "block.sfm.printing_press": "Printing Press", "block.sfm.printing_press.tooltip": "Place with an air gap below a downward facing piston. Extend the piston to use.", diff --git a/src/generated/resources/assets/sfm/models/item/fancy_cable.json b/src/generated/resources/assets/sfm/models/item/fancy_cable.json new file mode 100644 index 000000000..dfcc423fe --- /dev/null +++ b/src/generated/resources/assets/sfm/models/item/fancy_cable.json @@ -0,0 +1,3 @@ +{ + "parent": "sfm:block/fancy_cable_core" +} \ No newline at end of file diff --git a/src/main/java/ca/teamdman/sfm/common/localization/LocalizationKeys.java b/src/main/java/ca/teamdman/sfm/common/localization/LocalizationKeys.java index d3434a25b..e67501ee2 100644 --- a/src/main/java/ca/teamdman/sfm/common/localization/LocalizationKeys.java +++ b/src/main/java/ca/teamdman/sfm/common/localization/LocalizationKeys.java @@ -96,6 +96,12 @@ public final class LocalizationKeys { () -> "Inventory Cable" ); + @SuppressWarnings("unused") // used by minecraft without us having to directly reference + public static LocalizationEntry FANCY_CABLE_BLOCK = new LocalizationEntry( + () -> SFMBlocks.FANCY_CABLE_BLOCK.get().getDescriptionId(), + () -> "Fancy Inventory Cable" + ); + @SuppressWarnings("unused") // used by minecraft without us having to directly reference public static LocalizationEntry MANAGER_BLOCK = new LocalizationEntry( () -> SFMBlocks.MANAGER_BLOCK.get().getDescriptionId(), From fb6d497af27e886fe313cdfd8cd6fda0c6bf12c4 Mon Sep 17 00:00:00 2001 From: Manwe Date: Sat, 11 Jan 2025 05:10:33 +0100 Subject: [PATCH 3/3] Fancy Stuff -Label Gun 3D model -Factory Manager, Disk textures -Fancy Cable textures --- .../sfm/datagen/SFMBlockStatesAndModels.java | 92 ++++- .../teamdman/sfm/datagen/SFMItemModels.java | 2 +- .../59eb3dbb5f86130e09b3c62d89b9525ee01cf52d | 2 +- .../726a4eaaa226cb50028c5f3f85d691417b67903b | 4 +- .../9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e | 2 +- .../bf0ffec7956ce36aba0a993095f41e47d655813b | 8 +- .../c622617f6fabf890a00b9275cd5f643584a8a2c8 | 4 +- .../f4efe97b9c0e18af8c4c973c0a85409bb5676e69 | 2 +- .../assets/sfm/blockstates/fancy_cable.json | 77 ++++- .../assets/sfm/blockstates/manager.json | 29 +- ...json => fancy_cable_cable_connection.json} | 42 +-- .../sfm/models/block/fancy_cable_core.json | 24 +- .../block/fancy_cable_inv_connection.json | 150 +++++++++ .../assets/sfm/models/item/labelgun.json | 6 - .../sfm/common/block/FancyCableBlock.java | 91 +++-- .../sfm/common/block/ManagerBlock.java | 12 +- .../sfm/models/block/fancy_cable_example.json | 48 +++ .../assets/sfm/models/item/labelgun.json | 12 + .../assets/sfm/models/item/labelgun2d.json | 6 + .../assets/sfm/models/item/labelgun3d.json | 317 ++++++++++++++++++ .../assets/sfm/textures/block/fancy_cable.png | Bin 342 -> 628 bytes .../sfm/textures/block/fancy_cable.png.mcmeta | 16 + .../assets/sfm/textures/block/manager_bot.png | Bin 727 -> 2021 bytes .../sfm/textures/block/manager_bot.png.mcmeta | 20 ++ .../sfm/textures/block/manager_side.png | Bin 781 -> 2021 bytes .../textures/block/manager_side.png.mcmeta | 20 ++ .../assets/sfm/textures/block/manager_top.png | Bin 750 -> 201 bytes .../sfm/textures/block/manager_top.png.mcmeta | 10 + .../assets/sfm/textures/item/disk.png | Bin 5067 -> 626 bytes .../assets/sfm/textures/item/labelgun.png | Bin 5551 -> 0 bytes .../assets/sfm/textures/item/labelgun2d.png | Bin 0 -> 771 bytes .../assets/sfm/textures/item/labelgun3d.png | Bin 0 -> 809 bytes 32 files changed, 892 insertions(+), 104 deletions(-) rename src/generated/resources/assets/sfm/models/block/{fancy_cable_connection.json => fancy_cable_cable_connection.json} (77%) create mode 100644 src/generated/resources/assets/sfm/models/block/fancy_cable_inv_connection.json delete mode 100644 src/generated/resources/assets/sfm/models/item/labelgun.json create mode 100644 src/main/resources/assets/sfm/models/block/fancy_cable_example.json create mode 100644 src/main/resources/assets/sfm/models/item/labelgun.json create mode 100644 src/main/resources/assets/sfm/models/item/labelgun2d.json create mode 100644 src/main/resources/assets/sfm/models/item/labelgun3d.json create mode 100644 src/main/resources/assets/sfm/textures/block/fancy_cable.png.mcmeta create mode 100644 src/main/resources/assets/sfm/textures/block/manager_bot.png.mcmeta create mode 100644 src/main/resources/assets/sfm/textures/block/manager_side.png.mcmeta create mode 100644 src/main/resources/assets/sfm/textures/block/manager_top.png.mcmeta delete mode 100644 src/main/resources/assets/sfm/textures/item/labelgun.png create mode 100644 src/main/resources/assets/sfm/textures/item/labelgun2d.png create mode 100644 src/main/resources/assets/sfm/textures/item/labelgun3d.png diff --git a/src/datagen/java/ca/teamdman/sfm/datagen/SFMBlockStatesAndModels.java b/src/datagen/java/ca/teamdman/sfm/datagen/SFMBlockStatesAndModels.java index d8b2a51ea..bdb09ae70 100644 --- a/src/datagen/java/ca/teamdman/sfm/datagen/SFMBlockStatesAndModels.java +++ b/src/datagen/java/ca/teamdman/sfm/datagen/SFMBlockStatesAndModels.java @@ -5,7 +5,6 @@ import ca.teamdman.sfm.common.block.WaterTankBlock; import ca.teamdman.sfm.common.registry.SFMBlocks; import net.minecraft.core.Direction; -import net.minecraft.data.PackOutput; import net.minecraft.world.level.block.state.properties.BlockStateProperties; import net.minecraftforge.client.model.generators.BlockStateProvider; import net.minecraftforge.client.model.generators.ConfiguredModel; @@ -20,12 +19,21 @@ public SFMBlockStatesAndModels(GatherDataEvent event) { @Override protected void registerStatesAndModels() { + /* simpleBlock(SFMBlocks.MANAGER_BLOCK.get(), models().cubeBottomTop( SFMBlocks.MANAGER_BLOCK.getId().getPath(), modLoc("block/manager_side"), modLoc("block/manager_bot"), modLoc("block/manager_top") ).texture("particle", "#top")); + */ + + horizontalBlock(SFMBlocks.MANAGER_BLOCK.get(), models().cubeBottomTop( + SFMBlocks.MANAGER_BLOCK.getId().getPath(), + modLoc("block/manager_side"), + modLoc("block/manager_bot"), + modLoc("block/manager_top") + ).texture("particle","#top")); simpleBlock(SFMBlocks.CABLE_BLOCK.get()); simpleBlock(SFMBlocks.PRINTING_PRESS_BLOCK.get(), models().getExistingFile(modLoc("block/printing_press"))); @@ -104,35 +112,90 @@ private void registerFancyCableBlock() { .from(4, 4, 4) .to(12, 12, 12) .shade(false) - .allFaces((direction, faceBuilder) -> faceBuilder.uvs(8, 0, 16, 8).texture("#cable")) + .allFaces((direction, faceBuilder) -> faceBuilder.uvs(5, 0, 13, 8).texture("#cable")) .end() .texture("cable", modLoc("block/fancy_cable")) .texture("particle", modLoc("block/fancy_cable")); - var connectionModel = models().withExistingParent(modLoc("block/fancy_cable_connection").getPath(), "block/block") + var innerConnectionModel = models().withExistingParent(modLoc("block/fancy_cable_cable_connection").getPath(), "block/block") .element() - .from(5, 5, 0) - .to(11, 11, 5) + .from(4, 4, 0) + .to(12, 12, 4) .shade(false) .allFaces((direction, faceBuilder) -> { switch (direction) { case NORTH: case SOUTH: { - faceBuilder.uvs(9, 1, 15, 7); + faceBuilder.uvs(5, 0, 13, 8); break; } case EAST: case WEST: { - faceBuilder.uvs(0, 0, 5, 6); + faceBuilder.uvs(0, 0, 4, 8); break; } case UP: case DOWN: { - faceBuilder.uvs(0, 0, 5, 6) + faceBuilder.uvs(0, 0, 4, 8) .rotation(ModelBuilder.FaceRotation.CLOCKWISE_90); break; } } + faceBuilder.texture("#cable"); + }) + .end() + .texture("cable", modLoc("block/fancy_cable")); + var outerConnectionModel = models().withExistingParent(modLoc("block/fancy_cable_inv_connection").getPath(), "block/block") + .element() + .from(4, 4, 1) + .to(12, 12, 4) + .shade(false) + .allFaces((direction, faceBuilder) -> { + switch (direction) { + case NORTH: + case SOUTH: { + faceBuilder.uvs(5, 0, 13, 8); + break; + } + case EAST: + case WEST: { + faceBuilder.uvs(0, 0, 3, 8); + break; + } + case UP: + case DOWN: { + faceBuilder.uvs(0, 0, 3, 8) + .rotation(ModelBuilder.FaceRotation.CLOCKWISE_90); + break; + } + } + faceBuilder.texture("#cable"); + }) + .end() + .element() + .from(11,11,0) + .to(5,5,1) + .shade(false) + .allFaces((direction, faceBuilder) -> { + switch (direction) { + case NORTH, SOUTH: + faceBuilder.uvs(6,10,11,15); + break; + case EAST: + faceBuilder.uvs(0, 10, 1, 15); + break; + case WEST: + faceBuilder.uvs(1, 10, 2, 15); + break; + case UP: + faceBuilder.uvs(2, 10, 3, 15) + .rotation(ModelBuilder.FaceRotation.CLOCKWISE_90); + break; + case DOWN: + faceBuilder.uvs(3, 10, 4, 15) + .rotation(ModelBuilder.FaceRotation.CLOCKWISE_90); + break; + } faceBuilder.texture("#cable"); }) .end() @@ -160,12 +223,21 @@ private void registerFancyCableBlock() { } multipartBuilder1.part() - .modelFile(connectionModel) + .modelFile(innerConnectionModel) + .rotationX(rotX) + .rotationY(rotY) + .uvLock(false) + .addModel() + .condition(FancyCableBlock.DIRECTION_PROPERTIES.get(direction), FancyCableBlock.CABLE_CONNECTION_TYPE.CABLE) + .end(); + + multipartBuilder1.part() + .modelFile(outerConnectionModel) .rotationX(rotX) .rotationY(rotY) .uvLock(false) .addModel() - .condition(FancyCableBlock.DIRECTION_PROPERTIES.get(direction), true) + .condition(FancyCableBlock.DIRECTION_PROPERTIES.get(direction), FancyCableBlock.CABLE_CONNECTION_TYPE.INV) .end(); } } diff --git a/src/datagen/java/ca/teamdman/sfm/datagen/SFMItemModels.java b/src/datagen/java/ca/teamdman/sfm/datagen/SFMItemModels.java index 5ee6c5f7a..6f82fb9a0 100644 --- a/src/datagen/java/ca/teamdman/sfm/datagen/SFMItemModels.java +++ b/src/datagen/java/ca/teamdman/sfm/datagen/SFMItemModels.java @@ -26,7 +26,7 @@ protected void registerModels() { justParent(SFMItems.PRINTING_PRESS_ITEM, SFMBlocks.PRINTING_PRESS_BLOCK); justParent(SFMItems.WATER_TANK_ITEM, SFMBlocks.WATER_TANK_BLOCK, "_active"); basicItem(SFMItems.DISK_ITEM); - basicItem(SFMItems.LABEL_GUN_ITEM); + //basicItem(SFMItems.LABEL_GUN_ITEM); Using custom 3D texture basicItem(SFMItems.EXPERIENCE_GOOP_ITEM); basicItem(SFMItems.EXPERIENCE_SHARD_ITEM); basicItem(SFMItems.NETWORK_TOOL_ITEM); diff --git a/src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d b/src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d index c9b5a9160..637f1b02e 100644 --- a/src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d +++ b/src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d @@ -1,4 +1,4 @@ -// 1.20.1 2023-10-27T20:13:47.6813886 Loot Tables +// 1.20.1 2025-01-10T16:04:27.8304554 Loot Tables dc0c30a0ed7751f530455b82cf95c8c24a8e62cb data/sfm/loot_tables/blocks/cable.json 200ad3ab7d9eeaa149bddb76b7e9aee0de5e8951 data/sfm/loot_tables/blocks/manager.json 169fff021b621f8267af0ff10757b8abffd5087f data/sfm/loot_tables/blocks/printing_press.json diff --git a/src/generated/resources/.cache/726a4eaaa226cb50028c5f3f85d691417b67903b b/src/generated/resources/.cache/726a4eaaa226cb50028c5f3f85d691417b67903b index fe034da7f..4470352b2 100644 --- a/src/generated/resources/.cache/726a4eaaa226cb50028c5f3f85d691417b67903b +++ b/src/generated/resources/.cache/726a4eaaa226cb50028c5f3f85d691417b67903b @@ -1,9 +1,9 @@ -// 1.20.1 2023-11-08T14:25:16.9491105 Item Models: sfm +// 1.20.1 2025-01-10T16:04:27.8314603 Item Models: sfm 8518af52bb22ef1d984719f3534ff29e08cca857 assets/sfm/models/item/cable.json bee75adb2bb431a6b671015aa9bac0d68a98f5fb assets/sfm/models/item/disk.json +3b5be3966b540f1e99a3d6fd8836ad39bf937e96 assets/sfm/models/item/fancy_cable.json 2c8c32d785bfc59bf23083eff8838054ee580570 assets/sfm/models/item/form.json a74b029bcf88d674c6a4c4eaece9426cfd9c4533 assets/sfm/models/item/form_base.json -a70b1032681b30f1066fdfb8b28870e87e51c261 assets/sfm/models/item/labelgun.json e945e739059a159bb1d4de5af118d412b50aae6c assets/sfm/models/item/manager.json d35a3dbb1180878d85e94f3f00812e5f34a4b2da assets/sfm/models/item/network_tool.json cd81e93f92577f247bb4bd12e01494d83e0733ce assets/sfm/models/item/printing_press.json diff --git a/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e b/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e index 6dd5ba7cb..4f3d6a018 100644 --- a/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e +++ b/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e @@ -1,4 +1,4 @@ -// 1.20.1 2024-06-25T00:20:02.132182 Recipes +// 1.20.1 2025-01-10T16:04:27.8304554 Recipes 21ddf44d8958739f46e499c9445d01a6b7965013 data/minecraft/recipes/disk_reset.json 69ef243b9636e55ed67ae7ed4ec0cad1015864c2 data/sfm/advancements/recipes/misc/printing_press.json 05c1f9108d84b90c935b8dd532ded8690e533957 data/sfm/advancements/recipes/misc/xp_goop.json diff --git a/src/generated/resources/.cache/bf0ffec7956ce36aba0a993095f41e47d655813b b/src/generated/resources/.cache/bf0ffec7956ce36aba0a993095f41e47d655813b index a24c121a4..bb1596e12 100644 --- a/src/generated/resources/.cache/bf0ffec7956ce36aba0a993095f41e47d655813b +++ b/src/generated/resources/.cache/bf0ffec7956ce36aba0a993095f41e47d655813b @@ -1,10 +1,14 @@ -// 1.20.1 2023-10-27T20:13:47.6794382 Block States: sfm +// 1.20.1 2025-01-11T04:43:39.3793221 Block States: sfm f303dc233cde263e111cfdb2e2cbc48b93521724 assets/sfm/blockstates/cable.json -01e9d7d54169b7f6bbd287f4b896629f66f25305 assets/sfm/blockstates/manager.json +88f55b076e7631ab6387348c3b35fa18f40f27f3 assets/sfm/blockstates/fancy_cable.json +9740ff64e9b3387980b393367d97c509bb6da3fd assets/sfm/blockstates/manager.json a351025a2054b6ce2ddc21dc14734cc8b5b635bc assets/sfm/blockstates/printing_press.json 9be344941a18ad0d8dccbcd6536d52bf7295c1c8 assets/sfm/blockstates/test_barrel.json f3c25839c6554e631061f91277bc687aebc38fd7 assets/sfm/blockstates/water_tank.json a76567fd4e65d191d69cf166b98776786d47a8e2 assets/sfm/models/block/cable.json +1d0fd8fecf2a046a04c54891a11ca0c1f8577068 assets/sfm/models/block/fancy_cable_cable_connection.json +93f1a088e6274b2a1dd04c889830cd074d04fc16 assets/sfm/models/block/fancy_cable_core.json +b7ee664dec7c158cb7e09b33f1a163c1d2ec265e assets/sfm/models/block/fancy_cable_inv_connection.json 953313d31931040aa2bd9a8742d4a54a2c632b8d assets/sfm/models/block/manager.json 220cea2f958589873eff05d62905d9e088c08951 assets/sfm/models/block/water_tank_active.json 5c39779ee6f051e682c82c8534c2fae85779747d assets/sfm/models/block/water_tank_inactive.json diff --git a/src/generated/resources/.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8 b/src/generated/resources/.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8 index 9cf687d3f..35bb0b1b7 100644 --- a/src/generated/resources/.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8 +++ b/src/generated/resources/.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8 @@ -1,2 +1,2 @@ -// 1.20.1 2024-07-31T15:48:00.2975938 Languages: en_us -2ef5800dd8e0ea4d5c661969042e283cacd19197 assets/sfm/lang/en_us.json +// 1.20.1 2025-01-10T16:04:27.8314603 Languages: en_us +dd8835e768e2b995c50bd11ab5e703fe6d452990 assets/sfm/lang/en_us.json diff --git a/src/generated/resources/.cache/f4efe97b9c0e18af8c4c973c0a85409bb5676e69 b/src/generated/resources/.cache/f4efe97b9c0e18af8c4c973c0a85409bb5676e69 index 3a76f4101..9cc0fd5c3 100644 --- a/src/generated/resources/.cache/f4efe97b9c0e18af8c4c973c0a85409bb5676e69 +++ b/src/generated/resources/.cache/f4efe97b9c0e18af8c4c973c0a85409bb5676e69 @@ -1,3 +1,3 @@ -// 1.20.1 2023-10-27T20:13:47.6804141 SuperFactoryManager Tags +// 1.20.1 2025-01-10T16:04:27.8289514 SuperFactoryManager Tags 22c0d1933af00895b3b1fad66a738923e2f3b362 data/minecraft/tags/blocks/mineable/axe.json 6a266217a8ee3eb78aa4f2a383432144a0c97c14 data/minecraft/tags/blocks/mineable/pickaxe.json diff --git a/src/generated/resources/assets/sfm/blockstates/fancy_cable.json b/src/generated/resources/assets/sfm/blockstates/fancy_cable.json index 5f63fd099..41a25141e 100644 --- a/src/generated/resources/assets/sfm/blockstates/fancy_cable.json +++ b/src/generated/resources/assets/sfm/blockstates/fancy_cable.json @@ -7,55 +7,108 @@ }, { "apply": { - "model": "sfm:block/fancy_cable_connection", + "model": "sfm:block/fancy_cable_cable_connection", "x": 90 }, "when": { - "down": "true" + "down": "cable" } }, { "apply": { - "model": "sfm:block/fancy_cable_connection", + "model": "sfm:block/fancy_cable_inv_connection", + "x": 90 + }, + "when": { + "down": "inv" + } + }, + { + "apply": { + "model": "sfm:block/fancy_cable_cable_connection", "x": 270 }, "when": { - "up": "true" + "up": "cable" } }, { "apply": { - "model": "sfm:block/fancy_cable_connection" + "model": "sfm:block/fancy_cable_inv_connection", + "x": 270 }, "when": { - "north": "true" + "up": "inv" } }, { "apply": { - "model": "sfm:block/fancy_cable_connection", + "model": "sfm:block/fancy_cable_cable_connection" + }, + "when": { + "north": "cable" + } + }, + { + "apply": { + "model": "sfm:block/fancy_cable_inv_connection" + }, + "when": { + "north": "inv" + } + }, + { + "apply": { + "model": "sfm:block/fancy_cable_cable_connection", "y": 180 }, "when": { - "south": "true" + "south": "cable" } }, { "apply": { - "model": "sfm:block/fancy_cable_connection", + "model": "sfm:block/fancy_cable_inv_connection", + "y": 180 + }, + "when": { + "south": "inv" + } + }, + { + "apply": { + "model": "sfm:block/fancy_cable_cable_connection", + "y": 270 + }, + "when": { + "west": "cable" + } + }, + { + "apply": { + "model": "sfm:block/fancy_cable_inv_connection", "y": 270 }, "when": { - "west": "true" + "west": "inv" + } + }, + { + "apply": { + "model": "sfm:block/fancy_cable_cable_connection", + "y": 90 + }, + "when": { + "east": "cable" } }, { "apply": { - "model": "sfm:block/fancy_cable_connection", + "model": "sfm:block/fancy_cable_inv_connection", "y": 90 }, "when": { - "east": "true" + "east": "inv" } } ] diff --git a/src/generated/resources/assets/sfm/blockstates/manager.json b/src/generated/resources/assets/sfm/blockstates/manager.json index f571e3fb0..f4f0d7ed0 100644 --- a/src/generated/resources/assets/sfm/blockstates/manager.json +++ b/src/generated/resources/assets/sfm/blockstates/manager.json @@ -1,7 +1,34 @@ { "variants": { - "": { + "facing=east,triggered=false": { + "model": "sfm:block/manager", + "y": 90 + }, + "facing=east,triggered=true": { + "model": "sfm:block/manager", + "y": 90 + }, + "facing=north,triggered=false": { "model": "sfm:block/manager" + }, + "facing=north,triggered=true": { + "model": "sfm:block/manager" + }, + "facing=south,triggered=false": { + "model": "sfm:block/manager", + "y": 180 + }, + "facing=south,triggered=true": { + "model": "sfm:block/manager", + "y": 180 + }, + "facing=west,triggered=false": { + "model": "sfm:block/manager", + "y": 270 + }, + "facing=west,triggered=true": { + "model": "sfm:block/manager", + "y": 270 } } } \ No newline at end of file diff --git a/src/generated/resources/assets/sfm/models/block/fancy_cable_connection.json b/src/generated/resources/assets/sfm/models/block/fancy_cable_cable_connection.json similarity index 77% rename from src/generated/resources/assets/sfm/models/block/fancy_cable_connection.json rename to src/generated/resources/assets/sfm/models/block/fancy_cable_cable_connection.json index 95d1e9118..e9dfba892 100644 --- a/src/generated/resources/assets/sfm/models/block/fancy_cable_connection.json +++ b/src/generated/resources/assets/sfm/models/block/fancy_cable_cable_connection.json @@ -9,8 +9,8 @@ "uv": [ 0.0, 0.0, - 5.0, - 6.0 + 4.0, + 8.0 ] }, "east": { @@ -18,26 +18,26 @@ "uv": [ 0.0, 0.0, - 5.0, - 6.0 + 4.0, + 8.0 ] }, "north": { "texture": "#cable", "uv": [ - 9.0, - 1.0, - 15.0, - 7.0 + 5.0, + 0.0, + 13.0, + 8.0 ] }, "south": { "texture": "#cable", "uv": [ - 9.0, - 1.0, - 15.0, - 7.0 + 5.0, + 0.0, + 13.0, + 8.0 ] }, "up": { @@ -46,8 +46,8 @@ "uv": [ 0.0, 0.0, - 5.0, - 6.0 + 4.0, + 8.0 ] }, "west": { @@ -55,21 +55,21 @@ "uv": [ 0.0, 0.0, - 5.0, - 6.0 + 4.0, + 8.0 ] } }, "from": [ - 5, - 5, + 4, + 4, 0 ], "shade": false, "to": [ - 11, - 11, - 5 + 12, + 12, + 4 ] } ], diff --git a/src/generated/resources/assets/sfm/models/block/fancy_cable_core.json b/src/generated/resources/assets/sfm/models/block/fancy_cable_core.json index b25f782cf..dae5d6a38 100644 --- a/src/generated/resources/assets/sfm/models/block/fancy_cable_core.json +++ b/src/generated/resources/assets/sfm/models/block/fancy_cable_core.json @@ -6,54 +6,54 @@ "down": { "texture": "#cable", "uv": [ - 8.0, + 5.0, 0.0, - 16.0, + 13.0, 8.0 ] }, "east": { "texture": "#cable", "uv": [ - 8.0, + 5.0, 0.0, - 16.0, + 13.0, 8.0 ] }, "north": { "texture": "#cable", "uv": [ - 8.0, + 5.0, 0.0, - 16.0, + 13.0, 8.0 ] }, "south": { "texture": "#cable", "uv": [ - 8.0, + 5.0, 0.0, - 16.0, + 13.0, 8.0 ] }, "up": { "texture": "#cable", "uv": [ - 8.0, + 5.0, 0.0, - 16.0, + 13.0, 8.0 ] }, "west": { "texture": "#cable", "uv": [ - 8.0, + 5.0, 0.0, - 16.0, + 13.0, 8.0 ] } diff --git a/src/generated/resources/assets/sfm/models/block/fancy_cable_inv_connection.json b/src/generated/resources/assets/sfm/models/block/fancy_cable_inv_connection.json new file mode 100644 index 000000000..1b9cfb4e4 --- /dev/null +++ b/src/generated/resources/assets/sfm/models/block/fancy_cable_inv_connection.json @@ -0,0 +1,150 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "rotation": 90, + "texture": "#cable", + "uv": [ + 0.0, + 0.0, + 3.0, + 8.0 + ] + }, + "east": { + "texture": "#cable", + "uv": [ + 0.0, + 0.0, + 3.0, + 8.0 + ] + }, + "north": { + "texture": "#cable", + "uv": [ + 5.0, + 0.0, + 13.0, + 8.0 + ] + }, + "south": { + "texture": "#cable", + "uv": [ + 5.0, + 0.0, + 13.0, + 8.0 + ] + }, + "up": { + "rotation": 90, + "texture": "#cable", + "uv": [ + 0.0, + 0.0, + 3.0, + 8.0 + ] + }, + "west": { + "texture": "#cable", + "uv": [ + 0.0, + 0.0, + 3.0, + 8.0 + ] + } + }, + "from": [ + 4, + 4, + 1 + ], + "shade": false, + "to": [ + 12, + 12, + 4 + ] + }, + { + "faces": { + "down": { + "rotation": 90, + "texture": "#cable", + "uv": [ + 3.0, + 10.0, + 4.0, + 15.0 + ] + }, + "east": { + "texture": "#cable", + "uv": [ + 0.0, + 10.0, + 1.0, + 15.0 + ] + }, + "north": { + "texture": "#cable", + "uv": [ + 6.0, + 10.0, + 11.0, + 15.0 + ] + }, + "south": { + "texture": "#cable", + "uv": [ + 6.0, + 10.0, + 11.0, + 15.0 + ] + }, + "up": { + "rotation": 90, + "texture": "#cable", + "uv": [ + 2.0, + 10.0, + 3.0, + 15.0 + ] + }, + "west": { + "texture": "#cable", + "uv": [ + 1.0, + 10.0, + 2.0, + 15.0 + ] + } + }, + "from": [ + 11, + 11, + 0 + ], + "shade": false, + "to": [ + 5, + 5, + 1 + ] + } + ], + "textures": { + "cable": "sfm:block/fancy_cable" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/sfm/models/item/labelgun.json b/src/generated/resources/assets/sfm/models/item/labelgun.json deleted file mode 100644 index 83c9f7da3..000000000 --- a/src/generated/resources/assets/sfm/models/item/labelgun.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "sfm:item/labelgun" - } -} \ No newline at end of file diff --git a/src/main/java/ca/teamdman/sfm/common/block/FancyCableBlock.java b/src/main/java/ca/teamdman/sfm/common/block/FancyCableBlock.java index 73d0664bd..398661ce2 100644 --- a/src/main/java/ca/teamdman/sfm/common/block/FancyCableBlock.java +++ b/src/main/java/ca/teamdman/sfm/common/block/FancyCableBlock.java @@ -1,10 +1,10 @@ package ca.teamdman.sfm.common.block; import ca.teamdman.sfm.common.cablenetwork.ICableBlock; -import ca.teamdman.sfm.common.registry.SFMResourceTypes; import com.google.common.collect.ImmutableMap; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.util.StringRepresentable; import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; @@ -13,7 +13,7 @@ import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition; -import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.block.state.properties.EnumProperty; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.Shapes; import net.minecraft.world.phys.shapes.VoxelShape; @@ -24,16 +24,14 @@ import java.util.function.Supplier; public class FancyCableBlock extends CableBlock { - public static final BooleanProperty NORTH = BooleanProperty.create("north"); - public static final BooleanProperty SOUTH = BooleanProperty.create("south"); - public static final BooleanProperty EAST = BooleanProperty.create("east"); - public static final BooleanProperty WEST = BooleanProperty.create("west"); - public static final BooleanProperty UP = BooleanProperty.create("up"); - - - public static final BooleanProperty DOWN = BooleanProperty.create("down"); - - public static final VoxelShape SHAPE_CORE = Block.box(4, 4, 4, 12, 12, 12); + public static final EnumProperty NORTH = EnumProperty.create("north",CABLE_CONNECTION_TYPE.class); + public static final EnumProperty SOUTH = EnumProperty.create("south",CABLE_CONNECTION_TYPE.class); + public static final EnumProperty EAST = EnumProperty.create("east",CABLE_CONNECTION_TYPE.class); + public static final EnumProperty WEST = EnumProperty.create("west",CABLE_CONNECTION_TYPE.class); + public static final EnumProperty UP = EnumProperty.create("up",CABLE_CONNECTION_TYPE.class); + public static final EnumProperty DOWN = EnumProperty.create("down",CABLE_CONNECTION_TYPE.class); + + public static final VoxelShape SHAPE_CORE = Block.box(5, 5, 5, 11, 11, 11); public static final VoxelShape SHAPE_NORTH = Block.box(5, 5, 0, 11, 11, 5); public static final VoxelShape SHAPE_SOUTH = Block.box(5, 5, 11, 11, 11, 16); public static final VoxelShape SHAPE_EAST = Block.box(11, 5, 5, 16, 11, 11); @@ -41,7 +39,7 @@ public class FancyCableBlock extends CableBlock { public static final VoxelShape SHAPE_UP = Block.box(5, 11, 5, 11, 16, 11); public static final VoxelShape SHAPE_DOWN = Block.box(5, 0, 5, 11, 5, 11); - public static final Map DIRECTION_PROPERTIES = ImmutableMap.of( + public static final Map> DIRECTION_PROPERTIES = ImmutableMap.of( Direction.NORTH, NORTH, Direction.SOUTH, SOUTH, Direction.EAST, EAST, @@ -54,12 +52,12 @@ public FancyCableBlock() { super(); registerDefaultState( defaultBlockState() - .setValue(NORTH, false) - .setValue(SOUTH, false) - .setValue(EAST, false) - .setValue(WEST, false) - .setValue(UP, false) - .setValue(DOWN, false) + .setValue(NORTH, CABLE_CONNECTION_TYPE.AIR) + .setValue(SOUTH, CABLE_CONNECTION_TYPE.AIR) + .setValue(EAST, CABLE_CONNECTION_TYPE.AIR) + .setValue(WEST, CABLE_CONNECTION_TYPE.AIR) + .setValue(UP, CABLE_CONNECTION_TYPE.AIR) + .setValue(DOWN, CABLE_CONNECTION_TYPE.AIR) ); } @@ -110,12 +108,12 @@ public BlockState updateShape( protected static VoxelShape getShape(BlockState state) { var shape = SHAPE_CORE; - shape = combineShapes(shape, SHAPE_NORTH, () -> state.getValue(NORTH)); - shape = combineShapes(shape, SHAPE_SOUTH, () -> state.getValue(SOUTH)); - shape = combineShapes(shape, SHAPE_EAST, () -> state.getValue(EAST)); - shape = combineShapes(shape, SHAPE_WEST, () -> state.getValue(WEST)); - shape = combineShapes(shape, SHAPE_UP, () -> state.getValue(UP)); - shape = combineShapes(shape, SHAPE_DOWN, () -> state.getValue(DOWN)); + shape = combineShapes(shape, SHAPE_NORTH, () -> state.getValue(NORTH) != CABLE_CONNECTION_TYPE.AIR); + shape = combineShapes(shape, SHAPE_SOUTH, () -> state.getValue(SOUTH) != CABLE_CONNECTION_TYPE.AIR); + shape = combineShapes(shape, SHAPE_EAST, () -> state.getValue(EAST) != CABLE_CONNECTION_TYPE.AIR); + shape = combineShapes(shape, SHAPE_WEST, () -> state.getValue(WEST) != CABLE_CONNECTION_TYPE.AIR); + shape = combineShapes(shape, SHAPE_UP, () -> state.getValue(UP) != CABLE_CONNECTION_TYPE.AIR); + shape = combineShapes(shape, SHAPE_DOWN, () -> state.getValue(DOWN) != CABLE_CONNECTION_TYPE.AIR); return shape; } @@ -139,12 +137,12 @@ protected BlockState getState( LevelAccessor level, BlockPos pos ) { - boolean north = hasConnection(level, pos, Direction.NORTH); - boolean south = hasConnection(level, pos, Direction.SOUTH); - boolean east = hasConnection(level, pos, Direction.EAST); - boolean west = hasConnection(level, pos, Direction.WEST); - boolean up = hasConnection(level, pos, Direction.UP); - boolean down = hasConnection(level, pos, Direction.DOWN); + CABLE_CONNECTION_TYPE north = getConnection(level, pos, Direction.NORTH); + CABLE_CONNECTION_TYPE south = getConnection(level, pos, Direction.SOUTH); + CABLE_CONNECTION_TYPE east = getConnection(level, pos, Direction.EAST); + CABLE_CONNECTION_TYPE west = getConnection(level, pos, Direction.WEST); + CABLE_CONNECTION_TYPE up = getConnection(level, pos, Direction.UP); + CABLE_CONNECTION_TYPE down = getConnection(level, pos, Direction.DOWN); return currentState .setValue(NORTH, north) @@ -173,4 +171,35 @@ protected boolean hasConnection( return blockEntity.getCapability(ForgeCapabilities.ITEM_HANDLER, direction.getOpposite()).isPresent(); } + + protected CABLE_CONNECTION_TYPE getConnection( + LevelAccessor level, + BlockPos pos, + Direction direction + ) { + // Directly connect to other cables + BlockPos relative = pos.relative(direction); + if (level.getBlockState(relative).getBlock() instanceof CableBlock) { + return CABLE_CONNECTION_TYPE.CABLE; + } + + BlockEntity blockEntity = level.getBlockEntity(relative); + if (blockEntity == null) { + return CABLE_CONNECTION_TYPE.AIR; + } else if (blockEntity.getCapability(ForgeCapabilities.ITEM_HANDLER, direction.getOpposite()).isPresent()){ + return CABLE_CONNECTION_TYPE.INV; + } + return CABLE_CONNECTION_TYPE.AIR; + } + + public enum CABLE_CONNECTION_TYPE implements StringRepresentable{ + AIR, + CABLE, + INV; + + @Override + public String getSerializedName() { + return this.name().toLowerCase(); + } + } } diff --git a/src/main/java/ca/teamdman/sfm/common/block/ManagerBlock.java b/src/main/java/ca/teamdman/sfm/common/block/ManagerBlock.java index 0bc548f93..5d0d5126c 100644 --- a/src/main/java/ca/teamdman/sfm/common/block/ManagerBlock.java +++ b/src/main/java/ca/teamdman/sfm/common/block/ManagerBlock.java @@ -9,6 +9,7 @@ import ca.teamdman.sfm.common.program.ProgramLinter; import ca.teamdman.sfm.common.registry.SFMBlockEntities; import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.Container; @@ -16,6 +17,7 @@ import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.entity.BlockEntity; @@ -26,6 +28,7 @@ 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.DirectionProperty; import net.minecraft.world.phys.BlockHitResult; import net.minecraftforge.network.NetworkHooks; @@ -33,17 +36,19 @@ public class ManagerBlock extends BaseEntityBlock implements EntityBlock, ICableBlock { public static final BooleanProperty TRIGGERED = BlockStateProperties.TRIGGERED; + public static final DirectionProperty FACING = BlockStateProperties.HORIZONTAL_FACING; //Rotation Property (cosmetics only) public ManagerBlock() { super(BlockBehaviour.Properties.of() .destroyTime(2) .sound(SoundType.METAL)); - registerDefaultState(getStateDefinition().any().setValue(TRIGGERED, false)); + registerDefaultState(getStateDefinition().any().setValue(TRIGGERED, false).setValue(FACING,Direction.NORTH)); } @Override protected void createBlockStateDefinition(StateDefinition.Builder builder) { builder.add(TRIGGERED); + builder.add(FACING); } @SuppressWarnings("deprecation") @@ -51,6 +56,11 @@ public RenderShape getRenderShape(BlockState state) { return RenderShape.MODEL; } + @org.jetbrains.annotations.Nullable + @Override + public BlockState getStateForPlacement(BlockPlaceContext pContext) { + return this.defaultBlockState().setValue(FACING,pContext.getHorizontalDirection()); + } @Override @SuppressWarnings("deprecation") diff --git a/src/main/resources/assets/sfm/models/block/fancy_cable_example.json b/src/main/resources/assets/sfm/models/block/fancy_cable_example.json new file mode 100644 index 000000000..fd8ab00b0 --- /dev/null +++ b/src/main/resources/assets/sfm/models/block/fancy_cable_example.json @@ -0,0 +1,48 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "0": "sfm:block/fancy_cable", + "particle": "sfm:block/fancy_cable" + }, + "elements": [ + { + "from": [6, 6, 6], + "to": [10, 10, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [7, 7, 7]}, + "faces": { + "north": {"uv": [12, 0, 16, 4], "texture": "#0"}, + "east": {"uv": [12, 0, 16, 4], "texture": "#0"}, + "south": {"uv": [12, 0, 16, 4], "texture": "#0"}, + "west": {"uv": [12, 0, 16, 4], "texture": "#0"}, + "up": {"uv": [12, 0, 16, 4], "texture": "#0"}, + "down": {"uv": [12, 0, 16, 4], "texture": "#0"} + } + }, + { + "from": [6, 6, 1], + "to": [10, 10, 6], + "rotation": {"angle": 0, "axis": "y", "origin": [9, 7, 4]}, + "faces": { + "north": {"uv": [5, 0, 9, 4], "texture": "#0"}, + "east": {"uv": [0, 0, 5, 4], "texture": "#0"}, + "south": {"uv": [5, 0, 9, 4], "texture": "#0"}, + "west": {"uv": [0, 0, 5, 4], "texture": "#0"}, + "up": {"uv": [0, 0, 5, 4], "rotation": 90, "texture": "#0"}, + "down": {"uv": [0, 0, 5, 4], "rotation": 270, "texture": "#0"} + } + }, + { + "from": [5, 5, 0], + "to": [11, 11, 1], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 0]}, + "faces": { + "north": {"uv": [0, 10, 6, 16], "texture": "#0"}, + "east": {"uv": [8, 10, 9, 16], "texture": "#0"}, + "south": {"uv": [10, 10, 16, 16], "texture": "#0"}, + "west": {"uv": [6, 10, 7, 16], "texture": "#0"}, + "up": {"uv": [9, 10, 10, 16], "rotation": 90, "texture": "#0"}, + "down": {"uv": [7, 10, 8, 16], "rotation": 270, "texture": "#0"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/sfm/models/item/labelgun.json b/src/main/resources/assets/sfm/models/item/labelgun.json new file mode 100644 index 000000000..8cd2d72e9 --- /dev/null +++ b/src/main/resources/assets/sfm/models/item/labelgun.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:item/handheld", + "loader": "forge:separate_transforms", + "base": { + "parent": "sfm:item/labelgun3d" + }, + "perspectives": { + "gui": { + "parent": "sfm:item/labelgun2d" + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/sfm/models/item/labelgun2d.json b/src/main/resources/assets/sfm/models/item/labelgun2d.json new file mode 100644 index 000000000..bcf6403b3 --- /dev/null +++ b/src/main/resources/assets/sfm/models/item/labelgun2d.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "sfm:item/labelgun2d" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/sfm/models/item/labelgun3d.json b/src/main/resources/assets/sfm/models/item/labelgun3d.json new file mode 100644 index 000000000..f220c8743 --- /dev/null +++ b/src/main/resources/assets/sfm/models/item/labelgun3d.json @@ -0,0 +1,317 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "0": "sfm:item/labelgun3d", + "particle": "sfm:item/labelgun3d" + }, + "elements": [ + { + "from": [6, 8, 4], + "to": [10, 9, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [6, 6, 3]}, + "faces": { + "north": {"uv": [0, 6, 2, 7.5], "texture": "#0"}, + "east": {"uv": [5, 10, 9, 10.5], "texture": "#0"}, + "south": {"uv": [0, 4.5, 2, 6], "texture": "#0"}, + "west": {"uv": [12, 10, 16, 10.5], "texture": "#0"}, + "up": {"uv": [11.5, 9.5, 9.5, 5.5], "texture": "#0"}, + "down": {"uv": [7, 12, 5, 16], "texture": "#0"} + } + }, + { + "from": [6.125, 7, 4], + "to": [9.875, 8, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [5, 5, 3]}, + "faces": { + "north": {"uv": [6, 4, 10, 5], "texture": "#0"}, + "east": {"uv": [5, 10.5, 9, 11], "texture": "#0"}, + "south": {"uv": [6, 4, 10, 5], "texture": "#0"}, + "west": {"uv": [12, 10.5, 16, 11], "texture": "#0"}, + "up": {"uv": [4, 4, 2, 0], "texture": "#0"}, + "down": {"uv": [8, 0, 6, 4], "texture": "#0"} + } + }, + { + "from": [6, 6, 4], + "to": [10, 7, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [6, 4, 3]}, + "faces": { + "north": {"uv": [0, 6, 2, 7.5], "texture": "#0"}, + "east": {"uv": [5, 11, 9, 11.5], "texture": "#0"}, + "south": {"uv": [0, 4, 2, 4.5], "texture": "#0"}, + "west": {"uv": [12, 11, 16, 11.5], "texture": "#0"}, + "up": {"uv": [5, 16, 3, 12], "texture": "#0"}, + "down": {"uv": [9, 5, 9.5, 6], "texture": "#0"} + } + }, + { + "from": [6, 5, 4], + "to": [10, 6, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [6, 5, 4]}, + "faces": { + "north": {"uv": [9.5, 11.5, 11.5, 12], "texture": "#0"}, + "east": {"uv": [5, 11.5, 9, 12], "texture": "#0"}, + "south": {"uv": [9.5, 5, 11.5, 5.5], "texture": "#0"}, + "west": {"uv": [12, 11.5, 16, 12], "texture": "#0"}, + "up": {"uv": [4, 0, 6, 4], "texture": "#0"}, + "down": {"uv": [9.5, 12, 11.5, 16], "texture": "#0"} + } + }, + { + "from": [5.5, 8, 10], + "to": [10.5, 10, 11], + "rotation": {"angle": 0, "axis": "y", "origin": [5.5, 8, 10]}, + "faces": { + "north": {"uv": [13, 2, 15.5, 3], "texture": "#0"}, + "east": {"uv": [12.5, 3, 13, 4], "texture": "#0"}, + "south": {"uv": [4, 9, 7, 10], "texture": "#0"}, + "west": {"uv": [11, 1, 11.5, 2], "texture": "#0"}, + "up": {"uv": [13, 1.5, 15.5, 2], "texture": "#0"}, + "down": {"uv": [13, 3, 15.5, 3.5], "texture": "#0"} + } + }, + { + "from": [5.5, 8, 13], + "to": [10.5, 10, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [5.5, 8, 13]}, + "faces": { + "north": {"uv": [4, 8, 7, 9], "texture": "#0"}, + "east": {"uv": [11, 3, 11.5, 4], "texture": "#0"}, + "south": {"uv": [13, 6, 15.5, 7], "texture": "#0"}, + "west": {"uv": [12.5, 1, 13, 2], "texture": "#0"}, + "up": {"uv": [13, 7, 15.5, 7.5], "texture": "#0"}, + "down": {"uv": [13, 5.5, 15.5, 6], "texture": "#0"} + } + }, + { + "from": [5.5, 10, 11], + "to": [10.5, 11, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [5.5, 10, 11]}, + "faces": { + "north": {"uv": [13, 1, 15.5, 1.5], "texture": "#0"}, + "east": {"uv": [11.5, 2.5, 12.5, 3], "texture": "#0"}, + "south": {"uv": [13, 7.5, 15.5, 8], "texture": "#0"}, + "west": {"uv": [11.5, 0.5, 12.5, 1], "texture": "#0"}, + "up": {"uv": [13, 0, 15.5, 1], "texture": "#0"}, + "down": {"uv": [4, 7, 7, 8], "texture": "#0"} + } + }, + { + "from": [5.5, 7, 11], + "to": [10.5, 8, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [5.5, 7, 11]}, + "faces": { + "north": {"uv": [13, 3.5, 15.5, 4], "texture": "#0"}, + "east": {"uv": [11.5, 4, 12.5, 4.5], "texture": "#0"}, + "south": {"uv": [13, 5, 15.5, 5.5], "texture": "#0"}, + "west": {"uv": [11.5, 2, 12.5, 2.5], "texture": "#0"}, + "up": {"uv": [4, 6, 7, 7], "texture": "#0"}, + "down": {"uv": [13, 4, 15.5, 5], "texture": "#0"} + } + }, + { + "from": [7, 1, 4], + "to": [9, 5, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [7, 3, 4]}, + "faces": { + "north": {"uv": [0, 11.5, 1, 13.5], "texture": "#0"}, + "east": {"uv": [2.5, 11.5, 3, 13.5], "texture": "#0"}, + "south": {"uv": [1.5, 11.5, 2.5, 13.5], "texture": "#0"}, + "west": {"uv": [1, 11.5, 1.5, 13.5], "texture": "#0"}, + "up": {"uv": [7.5, 7, 8.5, 6.5], "texture": "#0"}, + "down": {"uv": [3, 10.5, 4, 11], "texture": "#0"} + } + }, + { + "from": [7, 0, 5], + "to": [9, 1.414, 5], + "rotation": {"angle": -45, "axis": "x", "origin": [8, 0, 5]}, + "faces": { + "north": {"uv": [0, 13.5, 1, 14], "texture": "#0"}, + "east": {"uv": [2.5, 11.5, 3, 13.5], "texture": "#0"}, + "south": {"uv": [1.5, 13.5, 2.5, 14], "texture": "#0"}, + "west": {"uv": [1, 11.5, 1.5, 13.5], "texture": "#0"}, + "up": {"uv": [7.5, 7, 8.5, 6.5], "texture": "#0"}, + "down": {"uv": [3, 10.5, 4, 11], "texture": "#0"} + } + }, + { + "from": [7, 0, 5], + "to": [9, 0, 8], + "rotation": {"angle": 0, "axis": "y", "origin": [7, 1, 7]}, + "faces": { + "north": {"uv": [3, 10, 4, 10.5], "rotation": 180, "texture": "#0"}, + "east": {"uv": [2.5, 10, 3, 11.5], "rotation": 270, "texture": "#0"}, + "south": {"uv": [7.5, 7, 8.5, 6.5], "texture": "#0"}, + "west": {"uv": [1, 10, 1.5, 11.5], "rotation": 90, "texture": "#0"}, + "up": {"uv": [0, 10, 1, 11.5], "rotation": 180, "texture": "#0"}, + "down": {"uv": [1.5, 10, 2.5, 11.5], "texture": "#0"} + } + }, + { + "from": [7, 0, 8], + "to": [9, 0, 9.1], + "rotation": {"angle": -22.5, "axis": "x", "origin": [8, 0, 8]}, + "faces": { + "north": {"uv": [3, 10, 4, 10.5], "rotation": 180, "texture": "#0"}, + "east": {"uv": [2.5, 10, 3, 11.5], "rotation": 270, "texture": "#0"}, + "south": {"uv": [7.5, 7, 8.5, 6.5], "texture": "#0"}, + "west": {"uv": [1, 10, 1.5, 11.5], "rotation": 90, "texture": "#0"}, + "up": {"uv": [0, 14, 1, 14.5], "rotation": 180, "texture": "#0"}, + "down": {"uv": [1.5, 14, 2.5, 14.5], "texture": "#0"} + } + }, + { + "from": [7, 0, 9], + "to": [9, 5, 11], + "rotation": {"angle": 0, "axis": "y", "origin": [7, 3, 8]}, + "faces": { + "north": {"uv": [12, 12.5, 13, 15], "texture": "#0"}, + "east": {"uv": [15, 12.5, 16, 15], "texture": "#0"}, + "south": {"uv": [14, 12.5, 15, 15], "texture": "#0"}, + "west": {"uv": [13, 12.5, 14, 15], "texture": "#0"}, + "up": {"uv": [14, 16, 13, 15], "texture": "#0"}, + "down": {"uv": [13, 15, 12, 16], "texture": "#0"} + } + }, + { + "from": [7, 9.5, 6], + "to": [9, 9.5, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [7, 7.5, 6]}, + "faces": { + "north": {"uv": [0, 8, 1, 8.5], "texture": "#0"}, + "east": {"uv": [0, 7.5, 2, 8], "texture": "#0"}, + "south": {"uv": [1, 8, 2, 8.5], "texture": "#0"}, + "west": {"uv": [0, 8.5, 2, 9], "texture": "#0"}, + "up": {"uv": [8.5, 7, 9.5, 9], "texture": "#0"}, + "down": {"uv": [7.5, 7, 8.5, 9], "texture": "#0"} + } + }, + { + "from": [7, 9.5, 4.5], + "to": [9, 9.5, 6], + "rotation": {"angle": -22.5, "axis": "x", "origin": [8, 9.5, 6]}, + "faces": { + "north": {"uv": [0, 8, 1, 8.5], "texture": "#0"}, + "east": {"uv": [0, 7.5, 2, 8], "texture": "#0"}, + "south": {"uv": [1, 8, 2, 8.5], "texture": "#0"}, + "west": {"uv": [0, 8.5, 2, 9], "texture": "#0"}, + "up": {"uv": [8.5, 9, 9.5, 9.5], "texture": "#0"}, + "down": {"uv": [7.5, 9, 8.5, 9.5], "texture": "#0"} + } + }, + { + "from": [5.75, 8, 11], + "to": [10.25, 10, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [7, 8, 11]}, + "faces": { + "north": {"uv": [8.5, 0, 10.75, 1], "texture": "#0"}, + "east": {"uv": [11.5, 3, 12.5, 4], "texture": "#0"}, + "south": {"uv": [8.5, 1, 10.75, 2], "texture": "#0"}, + "west": {"uv": [11.5, 1, 12.5, 2], "texture": "#0"}, + "up": {"uv": [8.5, 0, 10.75, 1], "texture": "#0"}, + "down": {"uv": [8.5, 1, 10.75, 2], "texture": "#0"} + } + }, + { + "from": [6.0001, 8.5, 2.919], + "to": [9.9991, 9, 3.999], + "rotation": {"angle": -22.5, "axis": "x", "origin": [8, 9, 4]}, + "faces": { + "north": {"uv": [0, 0, 1.9995, 0.25], "texture": "#0"}, + "east": {"uv": [9, 9.7375, 9.5, 9.5], "texture": "#0"}, + "south": {"uv": [0, 0, 1.9995, 0.25], "texture": "#0"}, + "west": {"uv": [11.5, 9.5, 12, 9.75], "texture": "#0"}, + "up": {"uv": [9.5, 9.5, 11.4995, 10], "texture": "#0"}, + "down": {"uv": [9.5, 9.5, 11.4995, 10.04], "texture": "#0"} + } + }, + { + "from": [7.0001, 4.3, 9], + "to": [8.9991, 5.3, 10], + "rotation": {"angle": -45, "axis": "x", "origin": [8, 4.3, 9]}, + "faces": { + "north": {"uv": [7.5, 12, 8.4995, 12.5], "texture": "#0"}, + "east": {"uv": [7, 12, 7.5, 12.5], "texture": "#0"}, + "south": {"uv": [7.5, 13, 8.4995, 12.5], "texture": "#0"}, + "west": {"uv": [8.5, 12, 9, 12.5], "texture": "#0"}, + "up": {"uv": [0, 0, 0.9995, 0.5], "texture": "#0"}, + "down": {"uv": [0, 0, 0.9995, 0.5], "texture": "#0"} + } + }, + { + "from": [6, 6, 3], + "to": [10, 7, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [6, 5, 2]}, + "faces": { + "north": {"uv": [9.5, 11, 11.5, 11.5], "texture": "#0"}, + "east": {"uv": [9, 11, 9.5, 11.5], "texture": "#0"}, + "south": {"uv": [0, 3, 2, 3.5], "texture": "#0"}, + "west": {"uv": [11.5, 11, 12, 11.5], "texture": "#0"}, + "up": {"uv": [7, 15.5, 9, 16], "texture": "#0"}, + "down": {"uv": [4, 5.5, 6, 6], "texture": "#0"} + } + }, + { + "from": [6.125, 7, 3.125], + "to": [9.875, 8, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [6, 6, 2]}, + "faces": { + "north": {"uv": [9.5, 10.5, 11.5, 11], "texture": "#0"}, + "east": {"uv": [9, 10.5, 9.5, 11], "texture": "#0"}, + "south": {"uv": [4, 5, 5.875, 5.5], "texture": "#0"}, + "west": {"uv": [11.5, 10.5, 12, 11], "texture": "#0"}, + "up": {"uv": [4, 4, 5.875, 4.4375], "texture": "#0"}, + "down": {"uv": [4, 4.5, 5.875, 4.9375], "texture": "#0"} + } + }, + { + "from": [6, 8, 3], + "to": [10, 8.585, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [6, 7, 2]}, + "faces": { + "north": {"uv": [9.5, 10, 11.5, 10.2925], "texture": "#0"}, + "east": {"uv": [9, 10, 9.5, 10.2925], "texture": "#0"}, + "south": {"uv": [0, 0, 2, 0.2925], "texture": "#0"}, + "west": {"uv": [11.5, 10, 12, 10.2925], "texture": "#0"}, + "up": {"uv": [0, 3.5, 2, 4], "texture": "#0"}, + "down": {"uv": [7, 15, 9, 15.5], "texture": "#0"} + } + } + ], + "display": { + "thirdperson_righthand": { + "translation": [0, 3.25, 0] + }, + "thirdperson_lefthand": { + "translation": [0, 3.25, 0] + }, + "firstperson_righthand": { + "rotation": [0, 5, 0], + "translation": [-0.25, 4.25, 0] + }, + "firstperson_lefthand": { + "rotation": [0, 5, 0], + "translation": [-0.25, 4.25, 0] + }, + "ground": { + "rotation": [0, -39.5, 90], + "translation": [-1.25, -1.25, -1.5] + }, + "gui": { + "rotation": [180, -61.75, 178], + "translation": [0.5, 3.25, 0], + "scale": [1.3, 1.3, 1.3] + }, + "head": { + "rotation": [0, 0, 90], + "translation": [-3, 10.5, 0.25], + "scale": [2, 2, 2] + }, + "fixed": { + "rotation": [0, 90, 0], + "translation": [0, 3.5, 1], + "scale": [1.5, 1.5, 1.5] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/sfm/textures/block/fancy_cable.png b/src/main/resources/assets/sfm/textures/block/fancy_cable.png index 65806a20041c41145d2927137944516598d26e9e..0592101eb5b93e32e7a138338d19e0905dd46e68 100644 GIT binary patch delta 616 zcmV-u0+;>P0`vrs7k_{V1^@s60+s0^00001b5ch_0Itp)=>Px%E=fc|RA_Zr zKoEz2zx6uKHBlmQP`iOwAk7s#0MfOz4v`!HU{Zrcl3+O* z)5Ysf9G9QRbTWop%WV#mWoWe{s6fG_2Aw#@bTTgDb*ml08Ven2WLX9PAUOrF7wCYX zfQrb{6uPCM!*FFoMG|2Yf{M^u0{{dv*P&h-lOfO=5P(Vn0G=P8{*)7F_rYWtUSG8! z2wuLn)`BENXn(MVvep#ADtOt2VAmKM0f03YN-2bL;-$AnU; zf{!nh+ISy$A2b4I!;!e-ynl9z-k@K7K5#DBWnQi=lut0B)W-Y3`=Akce{vzfTO(Dz zKd9pZz+nre5xft)4;q2@Cl}&+pnHA{lGW#fT9#{0ngpbH}3`PJQS_Xi*QcK`i_Qk%cKMonD2&W8yA0000NS%Lh(0G|+7DM=LxaV059B_%~&9W4tr6(bd8JqyxgeoxS96XH#9?`a565AN*rmdsuj1?$z5iKr0zMUHx3vIVCg! E0JZ#e4*&oF diff --git a/src/main/resources/assets/sfm/textures/block/fancy_cable.png.mcmeta b/src/main/resources/assets/sfm/textures/block/fancy_cable.png.mcmeta new file mode 100644 index 000000000..5b0125970 --- /dev/null +++ b/src/main/resources/assets/sfm/textures/block/fancy_cable.png.mcmeta @@ -0,0 +1,16 @@ +{ + "animation": { + "frametime": 16, + "interpolate": true, + "frames": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7 + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/sfm/textures/block/manager_bot.png b/src/main/resources/assets/sfm/textures/block/manager_bot.png index b513059164d4ca2f21b12699d7940b39378ef80d..3d367b067b189cfefd8ab1500e869f43e1de1172 100644 GIT binary patch delta 2020 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 AApigX diff --git a/src/main/resources/assets/sfm/textures/block/manager_side.png.mcmeta b/src/main/resources/assets/sfm/textures/block/manager_side.png.mcmeta new file mode 100644 index 000000000..f2d051654 --- /dev/null +++ b/src/main/resources/assets/sfm/textures/block/manager_side.png.mcmeta @@ -0,0 +1,20 @@ +{ + "animation": { + "frametime": 2, + "interpolate": false, + "frames": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11 + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/sfm/textures/block/manager_top.png b/src/main/resources/assets/sfm/textures/block/manager_top.png index c710ffa9c68aadfaddc5e7e152114efc6276fdd0..7a8e75eca0e42ba6fa37ee9d66b3e5dbcec55633 100644 GIT binary patch delta 186 zcmaFIdXjO1c)bD#8v_G_bmxyVK#H+A$lZxy-8q?;Ku)u#i(`mKXL86Vp1siX^5f}A{Eva|VeoYIb6Mw<&;$Soq(pK6 delta 739 zcmV<90v!Fx0qzBm7k>~41^@s6AM^iV00009a7bBm000ic000ic0Tn1pfB*mh1ZP1_ zK>z@;j(q!3lK=n!AY({UO#lFTB>(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ;WJyFpRCwAP$w3YPKm-KASp;A8{~Hn;j$QpCVyX(Nihs<6h=7Q&#?0t$xcj~J zZ8N(+Gx!2HGH**mWQVgcC*0=<2G3@|p#CXfw`jErD52!LD!qYDd*!0G@3h~?kE ze_%n7W^ZqAuzyoQw*CO(KR{>x{reXphQxmS_%V?G3#<W`_y7L= z2S?E#pnq*3@&7EX>4Tx04R~OH3W14e;4@K=l}o!s!2pa zR5*=eV4x5%!We8q(*Kbqe!Y9jh|Gt{ql>d3bG(vM7#J8B7`Dxw!|<~;25ummfjt9z zYy*Q=atgz?xpV#_8^T1Ylf9BtP+ZG`OCfLXek9(040#C&iT^KNykNv?0L&}I0Fu2x zbptTGux;)fyc*EGM~5{Gluor{)qKyalCTSKDaK_eP6Kdhpt=ii<^@7Pi0v-}N<#Ye j?kS^$gak>3Pz3-0nL{=pdADUB00000NkvXXu0mjf+#6r7 literal 5067 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 diff --git a/src/main/resources/assets/sfm/textures/item/labelgun2d.png b/src/main/resources/assets/sfm/textures/item/labelgun2d.png new file mode 100644 index 0000000000000000000000000000000000000000..3d94362c4da52d46e2dc0438983cbd538d5f637d GIT binary patch literal 771 zcmV+e1N{7nP)EX>4Tx04R}tkv&MmKpe$iQ>9WW9qb_D5TrU;5EXHhDi*;)X)CnqU~=gfG-*gu zTpR`0f`cE6RRe3JS*_Mt`=0!Tp@O!O;X2J>B(Q`eQV=1djtZ)<5TjKi#YCF+;~xGY$DbmXOs)zT zITlcZ3d!+<|H1EW&EnLgn-q!zy)U-?F$x5BfmXw|zmILZbprUGfh(=!uQh?$PtqG5 zEqVlmw}Ff6jwbH`mpj1VlP(#OBl&3x#Uk*2M&FbN25y1in%i4@AEysMmbzNL0S*p< zu@Yskd%U}^ySIPOwEO!3LmqOJ`00vD0003xNklOY)w z{&W6w;J+b$Q&haJncjGPIpsIUr3eKa$1wn76O#jl4v&u6+DLO=DAVp}a@hi~+Fi1b59wBqu{6C8HqRKx>Us{l9SVyaIr2#o3`T*n-V+fT4CnNv>002ovPDHLkV1iM! BSPx%<4Ht8R9J<*SIutIKoI`MvE9f9)D{(?Kug8X4FrNidIFvx6@3mrK${EV;wSL4 zaLfTDWJ{NpNNj>A&d3tHj{0D7Lzf9~z08-{QkhmTKA(d$P*7^2sYaC~x_ zF987Ph9L~o1OQySdIbPrnkK+etml>j&+};g{yp4UTZQL&ba>DJ0EEK`NIlmGluD(9 zZdn!}qcB8n1YFnU5AWW?Fip6w%OCw9@%>@F4&>bhhH0W3h7;H5<#L%-Ll6Ws59ift zm0Z_lDQ{IaSqK5kvJiIK^Kfx7Y*jW{#a3mLG4C3f6wT7wD#A`1=0Xud2$a@Vk%_?5 zhmR94-TnOOQYreiw~t;wf~n}pQiONzuEVg4@uyra^Q&R_E&{pZv_97^kbRz(CDb!O zVk&_j-@cEv9n~9rRByzEMRb-ORmN}>_xe#n&qN?A!cH5^XPHrD0P*3I)~6CE-7ZbF z$?Bd2&-2K(Z6YGFZJRvLqf7)Yf^^ukU}_s0%E2+tW-b)t6v*PsN@k`AEUqkLab+0* z@chNg*e;!?2h%7}r`=+6p$H