From 5692912b11a05c75f524dbd3b91bc614f306b275 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=90=E6=82=A6=E8=A7=A3=E8=AF=B4?= Date: Sun, 12 May 2024 21:04:54 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=94=20Railway=20Sign=20Tianjin=20Double?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/ziyue/tjmetro/BlockEntityTypes.java | 11 + .../main/java/ziyue/tjmetro/BlockList.java | 12 + .../main/java/ziyue/tjmetro/TianjinMetro.java | 23 ++ .../ziyue/tjmetro/TianjinMetroClient.java | 11 + .../block/BlockRailwaySignTianjinDouble.java | 157 ++++++++++ .../block/BlockRailwaySignTianjinPole.java | 2 +- .../ziyue/tjmetro/packet/PacketGuiClient.java | 4 +- .../ziyue/tjmetro/packet/PacketGuiServer.java | 3 + .../RenderRailwaySignTianjinDouble.java | 268 ++++++++++++++++++ ...reen.java => RailwaySignDoubleScreen.java} | 15 +- .../railway_sign_tianjin_double_2_even.json | 19 ++ .../railway_sign_tianjin_double_3_even.json | 19 ++ .../railway_sign_tianjin_double_3_odd.json | 19 ++ .../railway_sign_tianjin_double_4_even.json | 19 ++ .../railway_sign_tianjin_double_4_odd.json | 19 ++ .../railway_sign_tianjin_double_5_even.json | 19 ++ .../railway_sign_tianjin_double_5_odd.json | 19 ++ .../railway_sign_tianjin_double_6_even.json | 19 ++ .../railway_sign_tianjin_double_6_odd.json | 19 ++ .../railway_sign_tianjin_double_7_even.json | 19 ++ .../railway_sign_tianjin_double_7_odd.json | 19 ++ .../railway_sign_tianjin_double_middle.json | 8 + .../resources/assets/tjmetro/lang/en_us.json | 1 + .../railway_sign_tianjin_double_end_full.json | 21 ++ .../railway_sign_tianjin_double_end_half.json | 21 ++ .../railway_sign_tianjin_double_end_one.json | 21 ++ ...ign_tianjin_double_end_one_and_a_half.json | 21 ++ .../railway_sign_tianjin_double_middle.json | 19 ++ .../railway_sign_tianjin_double_2_even.json | 6 + .../railway_sign_tianjin_double_3_even.json | 6 + .../railway_sign_tianjin_double_3_odd.json | 6 + .../railway_sign_tianjin_double_4_even.json | 6 + .../railway_sign_tianjin_double_4_odd.json | 6 + .../railway_sign_tianjin_double_5_even.json | 6 + .../railway_sign_tianjin_double_5_odd.json | 6 + .../railway_sign_tianjin_double_6_even.json | 6 + .../railway_sign_tianjin_double_6_odd.json | 6 + .../railway_sign_tianjin_double_7_even.json | 6 + .../railway_sign_tianjin_double_7_odd.json | 6 + .../railway_sign_tianjin_double_2_even.png | Bin 0 -> 2153 bytes .../railway_sign_tianjin_double_3_even.png | Bin 0 -> 2088 bytes .../railway_sign_tianjin_double_3_odd.png | Bin 0 -> 2072 bytes .../railway_sign_tianjin_double_4_even.png | Bin 0 -> 2085 bytes .../railway_sign_tianjin_double_4_odd.png | Bin 0 -> 2083 bytes .../railway_sign_tianjin_double_5_even.png | Bin 0 -> 2081 bytes .../railway_sign_tianjin_double_5_odd.png | Bin 0 -> 2077 bytes .../railway_sign_tianjin_double_6_even.png | Bin 0 -> 2084 bytes .../railway_sign_tianjin_double_6_odd.png | Bin 0 -> 2078 bytes .../railway_sign_tianjin_double_7_even.png | Bin 0 -> 2082 bytes .../railway_sign_tianjin_double_7_odd.png | Bin 0 -> 2075 bytes 50 files changed, 885 insertions(+), 8 deletions(-) create mode 100644 common/src/main/java/ziyue/tjmetro/block/BlockRailwaySignTianjinDouble.java create mode 100644 common/src/main/java/ziyue/tjmetro/render/RenderRailwaySignTianjinDouble.java rename common/src/main/java/ziyue/tjmetro/screen/{RailwaySignWallDoubleScreen.java => RailwaySignDoubleScreen.java} (96%) create mode 100644 common/src/main/resources/assets/tjmetro/blockstates/railway_sign_tianjin_double_2_even.json create mode 100644 common/src/main/resources/assets/tjmetro/blockstates/railway_sign_tianjin_double_3_even.json create mode 100644 common/src/main/resources/assets/tjmetro/blockstates/railway_sign_tianjin_double_3_odd.json create mode 100644 common/src/main/resources/assets/tjmetro/blockstates/railway_sign_tianjin_double_4_even.json create mode 100644 common/src/main/resources/assets/tjmetro/blockstates/railway_sign_tianjin_double_4_odd.json create mode 100644 common/src/main/resources/assets/tjmetro/blockstates/railway_sign_tianjin_double_5_even.json create mode 100644 common/src/main/resources/assets/tjmetro/blockstates/railway_sign_tianjin_double_5_odd.json create mode 100644 common/src/main/resources/assets/tjmetro/blockstates/railway_sign_tianjin_double_6_even.json create mode 100644 common/src/main/resources/assets/tjmetro/blockstates/railway_sign_tianjin_double_6_odd.json create mode 100644 common/src/main/resources/assets/tjmetro/blockstates/railway_sign_tianjin_double_7_even.json create mode 100644 common/src/main/resources/assets/tjmetro/blockstates/railway_sign_tianjin_double_7_odd.json create mode 100644 common/src/main/resources/assets/tjmetro/blockstates/railway_sign_tianjin_double_middle.json create mode 100644 common/src/main/resources/assets/tjmetro/models/block/railway_sign_tianjin_double_end_full.json create mode 100644 common/src/main/resources/assets/tjmetro/models/block/railway_sign_tianjin_double_end_half.json create mode 100644 common/src/main/resources/assets/tjmetro/models/block/railway_sign_tianjin_double_end_one.json create mode 100644 common/src/main/resources/assets/tjmetro/models/block/railway_sign_tianjin_double_end_one_and_a_half.json create mode 100644 common/src/main/resources/assets/tjmetro/models/block/railway_sign_tianjin_double_middle.json create mode 100644 common/src/main/resources/assets/tjmetro/models/item/railway_sign_tianjin_double_2_even.json create mode 100644 common/src/main/resources/assets/tjmetro/models/item/railway_sign_tianjin_double_3_even.json create mode 100644 common/src/main/resources/assets/tjmetro/models/item/railway_sign_tianjin_double_3_odd.json create mode 100644 common/src/main/resources/assets/tjmetro/models/item/railway_sign_tianjin_double_4_even.json create mode 100644 common/src/main/resources/assets/tjmetro/models/item/railway_sign_tianjin_double_4_odd.json create mode 100644 common/src/main/resources/assets/tjmetro/models/item/railway_sign_tianjin_double_5_even.json create mode 100644 common/src/main/resources/assets/tjmetro/models/item/railway_sign_tianjin_double_5_odd.json create mode 100644 common/src/main/resources/assets/tjmetro/models/item/railway_sign_tianjin_double_6_even.json create mode 100644 common/src/main/resources/assets/tjmetro/models/item/railway_sign_tianjin_double_6_odd.json create mode 100644 common/src/main/resources/assets/tjmetro/models/item/railway_sign_tianjin_double_7_even.json create mode 100644 common/src/main/resources/assets/tjmetro/models/item/railway_sign_tianjin_double_7_odd.json create mode 100644 common/src/main/resources/assets/tjmetro/textures/item/railway_sign_tianjin_double_2_even.png create mode 100644 common/src/main/resources/assets/tjmetro/textures/item/railway_sign_tianjin_double_3_even.png create mode 100644 common/src/main/resources/assets/tjmetro/textures/item/railway_sign_tianjin_double_3_odd.png create mode 100644 common/src/main/resources/assets/tjmetro/textures/item/railway_sign_tianjin_double_4_even.png create mode 100644 common/src/main/resources/assets/tjmetro/textures/item/railway_sign_tianjin_double_4_odd.png create mode 100644 common/src/main/resources/assets/tjmetro/textures/item/railway_sign_tianjin_double_5_even.png create mode 100644 common/src/main/resources/assets/tjmetro/textures/item/railway_sign_tianjin_double_5_odd.png create mode 100644 common/src/main/resources/assets/tjmetro/textures/item/railway_sign_tianjin_double_6_even.png create mode 100644 common/src/main/resources/assets/tjmetro/textures/item/railway_sign_tianjin_double_6_odd.png create mode 100644 common/src/main/resources/assets/tjmetro/textures/item/railway_sign_tianjin_double_7_even.png create mode 100644 common/src/main/resources/assets/tjmetro/textures/item/railway_sign_tianjin_double_7_odd.png diff --git a/common/src/main/java/ziyue/tjmetro/BlockEntityTypes.java b/common/src/main/java/ziyue/tjmetro/BlockEntityTypes.java index 0a324fd..343e324 100644 --- a/common/src/main/java/ziyue/tjmetro/BlockEntityTypes.java +++ b/common/src/main/java/ziyue/tjmetro/BlockEntityTypes.java @@ -49,6 +49,17 @@ public interface BlockEntityTypes RegistryObject> RAILWAY_SIGN_TIANJIN_5_ODD_TILE_ENTITY = new RegistryObject<>(() -> RegistryUtilities.getBlockEntityType((pos, state) -> new BlockRailwaySignTianjin.TileEntityRailwaySignTianjin(5, true, pos, state), BlockList.RAILWAY_SIGN_TIANJIN_5_ODD.get())); RegistryObject> RAILWAY_SIGN_TIANJIN_6_ODD_TILE_ENTITY = new RegistryObject<>(() -> RegistryUtilities.getBlockEntityType((pos, state) -> new BlockRailwaySignTianjin.TileEntityRailwaySignTianjin(6, true, pos, state), BlockList.RAILWAY_SIGN_TIANJIN_6_ODD.get())); RegistryObject> RAILWAY_SIGN_TIANJIN_7_ODD_TILE_ENTITY = new RegistryObject<>(() -> RegistryUtilities.getBlockEntityType((pos, state) -> new BlockRailwaySignTianjin.TileEntityRailwaySignTianjin(7, true, pos, state), BlockList.RAILWAY_SIGN_TIANJIN_7_ODD.get())); + RegistryObject> RAILWAY_SIGN_TIANJIN_DOUBLE_2_EVEN_TILE_ENTITY = new RegistryObject<>(() -> RegistryUtilities.getBlockEntityType((pos, state) -> new BlockRailwaySignTianjinDouble.TileEntityRailwaySignTianjinDouble(2, false, pos, state), BlockList.RAILWAY_SIGN_TIANJIN_DOUBLE_2_EVEN.get())); + RegistryObject> RAILWAY_SIGN_TIANJIN_DOUBLE_3_EVEN_TILE_ENTITY = new RegistryObject<>(() -> RegistryUtilities.getBlockEntityType((pos, state) -> new BlockRailwaySignTianjinDouble.TileEntityRailwaySignTianjinDouble(3, false, pos, state), BlockList.RAILWAY_SIGN_TIANJIN_DOUBLE_3_EVEN.get())); + RegistryObject> RAILWAY_SIGN_TIANJIN_DOUBLE_4_EVEN_TILE_ENTITY = new RegistryObject<>(() -> RegistryUtilities.getBlockEntityType((pos, state) -> new BlockRailwaySignTianjinDouble.TileEntityRailwaySignTianjinDouble(4, false, pos, state), BlockList.RAILWAY_SIGN_TIANJIN_DOUBLE_4_EVEN.get())); + RegistryObject> RAILWAY_SIGN_TIANJIN_DOUBLE_5_EVEN_TILE_ENTITY = new RegistryObject<>(() -> RegistryUtilities.getBlockEntityType((pos, state) -> new BlockRailwaySignTianjinDouble.TileEntityRailwaySignTianjinDouble(5, false, pos, state), BlockList.RAILWAY_SIGN_TIANJIN_DOUBLE_5_EVEN.get())); + RegistryObject> RAILWAY_SIGN_TIANJIN_DOUBLE_6_EVEN_TILE_ENTITY = new RegistryObject<>(() -> RegistryUtilities.getBlockEntityType((pos, state) -> new BlockRailwaySignTianjinDouble.TileEntityRailwaySignTianjinDouble(6, false, pos, state), BlockList.RAILWAY_SIGN_TIANJIN_DOUBLE_6_EVEN.get())); + RegistryObject> RAILWAY_SIGN_TIANJIN_DOUBLE_7_EVEN_TILE_ENTITY = new RegistryObject<>(() -> RegistryUtilities.getBlockEntityType((pos, state) -> new BlockRailwaySignTianjinDouble.TileEntityRailwaySignTianjinDouble(7, false, pos, state), BlockList.RAILWAY_SIGN_TIANJIN_DOUBLE_7_EVEN.get())); + RegistryObject> RAILWAY_SIGN_TIANJIN_DOUBLE_3_ODD_TILE_ENTITY = new RegistryObject<>(() -> RegistryUtilities.getBlockEntityType((pos, state) -> new BlockRailwaySignTianjinDouble.TileEntityRailwaySignTianjinDouble(3, true, pos, state), BlockList.RAILWAY_SIGN_TIANJIN_DOUBLE_3_ODD.get())); + RegistryObject> RAILWAY_SIGN_TIANJIN_DOUBLE_4_ODD_TILE_ENTITY = new RegistryObject<>(() -> RegistryUtilities.getBlockEntityType((pos, state) -> new BlockRailwaySignTianjinDouble.TileEntityRailwaySignTianjinDouble(4, true, pos, state), BlockList.RAILWAY_SIGN_TIANJIN_DOUBLE_4_ODD.get())); + RegistryObject> RAILWAY_SIGN_TIANJIN_DOUBLE_5_ODD_TILE_ENTITY = new RegistryObject<>(() -> RegistryUtilities.getBlockEntityType((pos, state) -> new BlockRailwaySignTianjinDouble.TileEntityRailwaySignTianjinDouble(5, true, pos, state), BlockList.RAILWAY_SIGN_TIANJIN_DOUBLE_5_ODD.get())); + RegistryObject> RAILWAY_SIGN_TIANJIN_DOUBLE_6_ODD_TILE_ENTITY = new RegistryObject<>(() -> RegistryUtilities.getBlockEntityType((pos, state) -> new BlockRailwaySignTianjinDouble.TileEntityRailwaySignTianjinDouble(6, true, pos, state), BlockList.RAILWAY_SIGN_TIANJIN_DOUBLE_6_ODD.get())); + RegistryObject> RAILWAY_SIGN_TIANJIN_DOUBLE_7_ODD_TILE_ENTITY = new RegistryObject<>(() -> RegistryUtilities.getBlockEntityType((pos, state) -> new BlockRailwaySignTianjinDouble.TileEntityRailwaySignTianjinDouble(7, true, pos, state), BlockList.RAILWAY_SIGN_TIANJIN_DOUBLE_7_ODD.get())); RegistryObject> METAL_DETECTION_DOOR_TILE_ENTITY = new RegistryObject<>(() -> RegistryUtilities.getBlockEntityType(BlockMetalDetectionDoor.TileEntityMetalDetectionDoor::new, BlockList.METAL_DETECTION_DOOR.get())); RegistryObject> BENCH_TILE_ENTITY = new RegistryObject<>(() -> RegistryUtilities.getBlockEntityType(BlockBench.TileEntityBench::new, BlockList.BENCH.get())); RegistryObject> SERVICE_CORRIDOR_SIGN_TILE_ENTITY = new RegistryObject<>(() -> RegistryUtilities.getBlockEntityType(BlockServiceCorridorSign.TileEntityServiceCorridorSign::new, BlockList.SERVICE_CORRIDOR_SIGN.get())); diff --git a/common/src/main/java/ziyue/tjmetro/BlockList.java b/common/src/main/java/ziyue/tjmetro/BlockList.java index 54f61ee..e6195ac 100644 --- a/common/src/main/java/ziyue/tjmetro/BlockList.java +++ b/common/src/main/java/ziyue/tjmetro/BlockList.java @@ -81,6 +81,18 @@ public interface BlockList RegistryObject RAILWAY_SIGN_TIANJIN_6_EVEN = new RegistryObject<>(() -> new BlockRailwaySignTianjin(6, false)); RegistryObject RAILWAY_SIGN_TIANJIN_7_EVEN = new RegistryObject<>(() -> new BlockRailwaySignTianjin(7, false)); RegistryObject RAILWAY_SIGN_TIANJIN_MIDDLE = new RegistryObject<>(() -> new BlockRailwaySignTianjin(0, false)); + RegistryObject RAILWAY_SIGN_TIANJIN_DOUBLE_3_ODD = new RegistryObject<>(() -> new BlockRailwaySignTianjinDouble(3, true)); + RegistryObject RAILWAY_SIGN_TIANJIN_DOUBLE_4_ODD = new RegistryObject<>(() -> new BlockRailwaySignTianjinDouble(4, true)); + RegistryObject RAILWAY_SIGN_TIANJIN_DOUBLE_5_ODD = new RegistryObject<>(() -> new BlockRailwaySignTianjinDouble(5, true)); + RegistryObject RAILWAY_SIGN_TIANJIN_DOUBLE_6_ODD = new RegistryObject<>(() -> new BlockRailwaySignTianjinDouble(6, true)); + RegistryObject RAILWAY_SIGN_TIANJIN_DOUBLE_7_ODD = new RegistryObject<>(() -> new BlockRailwaySignTianjinDouble(7, true)); + RegistryObject RAILWAY_SIGN_TIANJIN_DOUBLE_2_EVEN = new RegistryObject<>(() -> new BlockRailwaySignTianjinDouble(2, false)); + RegistryObject RAILWAY_SIGN_TIANJIN_DOUBLE_3_EVEN = new RegistryObject<>(() -> new BlockRailwaySignTianjinDouble(3, false)); + RegistryObject RAILWAY_SIGN_TIANJIN_DOUBLE_4_EVEN = new RegistryObject<>(() -> new BlockRailwaySignTianjinDouble(4, false)); + RegistryObject RAILWAY_SIGN_TIANJIN_DOUBLE_5_EVEN = new RegistryObject<>(() -> new BlockRailwaySignTianjinDouble(5, false)); + RegistryObject RAILWAY_SIGN_TIANJIN_DOUBLE_6_EVEN = new RegistryObject<>(() -> new BlockRailwaySignTianjinDouble(6, false)); + RegistryObject RAILWAY_SIGN_TIANJIN_DOUBLE_7_EVEN = new RegistryObject<>(() -> new BlockRailwaySignTianjinDouble(7, false)); + RegistryObject RAILWAY_SIGN_TIANJIN_DOUBLE_MIDDLE = new RegistryObject<>(() -> new BlockRailwaySignTianjinDouble(0, false)); RegistryObject RAILWAY_SIGN_TIANJIN_POLE = new RegistryObject<>(BlockRailwaySignTianjinPole::new); RegistryObject METAL_DETECTION_DOOR = new RegistryObject<>(BlockMetalDetectionDoor::new); RegistryObject SERVICE_CORRIDOR_SIGN = new RegistryObject<>(BlockServiceCorridorSign::new); diff --git a/common/src/main/java/ziyue/tjmetro/TianjinMetro.java b/common/src/main/java/ziyue/tjmetro/TianjinMetro.java index a430765..5ab1125 100644 --- a/common/src/main/java/ziyue/tjmetro/TianjinMetro.java +++ b/common/src/main/java/ziyue/tjmetro/TianjinMetro.java @@ -114,12 +114,24 @@ public static void init( registerBlockItem.accept("railway_sign_tianjin_5_even", BlockList.RAILWAY_SIGN_TIANJIN_5_EVEN, RAILWAY_SIGNS); registerBlockItem.accept("railway_sign_tianjin_6_even", BlockList.RAILWAY_SIGN_TIANJIN_6_EVEN, RAILWAY_SIGNS); registerBlockItem.accept("railway_sign_tianjin_7_even", BlockList.RAILWAY_SIGN_TIANJIN_7_EVEN, RAILWAY_SIGNS); + registerBlockItem.accept("railway_sign_tianjin_double_3_odd", BlockList.RAILWAY_SIGN_TIANJIN_DOUBLE_3_ODD, RAILWAY_SIGNS); + registerBlockItem.accept("railway_sign_tianjin_double_4_odd", BlockList.RAILWAY_SIGN_TIANJIN_DOUBLE_4_ODD, RAILWAY_SIGNS); + registerBlockItem.accept("railway_sign_tianjin_double_5_odd", BlockList.RAILWAY_SIGN_TIANJIN_DOUBLE_5_ODD, RAILWAY_SIGNS); + registerBlockItem.accept("railway_sign_tianjin_double_6_odd", BlockList.RAILWAY_SIGN_TIANJIN_DOUBLE_6_ODD, RAILWAY_SIGNS); + registerBlockItem.accept("railway_sign_tianjin_double_7_odd", BlockList.RAILWAY_SIGN_TIANJIN_DOUBLE_7_ODD, RAILWAY_SIGNS); + registerBlockItem.accept("railway_sign_tianjin_double_2_even", BlockList.RAILWAY_SIGN_TIANJIN_DOUBLE_2_EVEN, RAILWAY_SIGNS); + registerBlockItem.accept("railway_sign_tianjin_double_3_even", BlockList.RAILWAY_SIGN_TIANJIN_DOUBLE_3_EVEN, RAILWAY_SIGNS); + registerBlockItem.accept("railway_sign_tianjin_double_4_even", BlockList.RAILWAY_SIGN_TIANJIN_DOUBLE_4_EVEN, RAILWAY_SIGNS); + registerBlockItem.accept("railway_sign_tianjin_double_5_even", BlockList.RAILWAY_SIGN_TIANJIN_DOUBLE_5_EVEN, RAILWAY_SIGNS); + registerBlockItem.accept("railway_sign_tianjin_double_6_even", BlockList.RAILWAY_SIGN_TIANJIN_DOUBLE_6_EVEN, RAILWAY_SIGNS); + registerBlockItem.accept("railway_sign_tianjin_double_7_even", BlockList.RAILWAY_SIGN_TIANJIN_DOUBLE_7_EVEN, RAILWAY_SIGNS); registerBlockItem.accept("railway_sign_tianjin_pole", BlockList.RAILWAY_SIGN_TIANJIN_POLE, RAILWAY_SIGNS); registerBlock.accept("railway_sign_wall_middle", BlockList.RAILWAY_SIGN_WALL_MIDDLE); registerBlock.accept("railway_sign_wall_big_middle", BlockList.RAILWAY_SIGN_WALL_BIG_MIDDLE); registerBlock.accept("railway_sign_wall_double_middle", BlockList.RAILWAY_SIGN_WALL_DOUBLE_MIDDLE); registerBlock.accept("railway_sign_tianjin_middle", BlockList.RAILWAY_SIGN_TIANJIN_MIDDLE); + registerBlock.accept("railway_sign_tianjin_double_middle", BlockList.RAILWAY_SIGN_TIANJIN_DOUBLE_MIDDLE); registerBlock.accept("psd_door_tianjin", BlockList.PSD_DOOR_TIANJIN); registerBlock.accept("psd_glass_tianjin", BlockList.PSD_GLASS_TIANJIN); registerBlock.accept("psd_glass_end_tianjin", BlockList.PSD_GLASS_END_TIANJIN); @@ -163,6 +175,17 @@ public static void init( registerBlockEntityType.accept("railway_sign_tianjin_5_even", BlockEntityTypes.RAILWAY_SIGN_TIANJIN_5_EVEN_TILE_ENTITY); registerBlockEntityType.accept("railway_sign_tianjin_6_even", BlockEntityTypes.RAILWAY_SIGN_TIANJIN_6_EVEN_TILE_ENTITY); registerBlockEntityType.accept("railway_sign_tianjin_7_even", BlockEntityTypes.RAILWAY_SIGN_TIANJIN_7_EVEN_TILE_ENTITY); + registerBlockEntityType.accept("railway_sign_tianjin_double_3_odd", BlockEntityTypes.RAILWAY_SIGN_TIANJIN_DOUBLE_3_ODD_TILE_ENTITY); + registerBlockEntityType.accept("railway_sign_tianjin_double_4_odd", BlockEntityTypes.RAILWAY_SIGN_TIANJIN_DOUBLE_4_ODD_TILE_ENTITY); + registerBlockEntityType.accept("railway_sign_tianjin_double_5_odd", BlockEntityTypes.RAILWAY_SIGN_TIANJIN_DOUBLE_5_ODD_TILE_ENTITY); + registerBlockEntityType.accept("railway_sign_tianjin_double_6_odd", BlockEntityTypes.RAILWAY_SIGN_TIANJIN_DOUBLE_6_ODD_TILE_ENTITY); + registerBlockEntityType.accept("railway_sign_tianjin_double_7_odd", BlockEntityTypes.RAILWAY_SIGN_TIANJIN_DOUBLE_7_ODD_TILE_ENTITY); + registerBlockEntityType.accept("railway_sign_tianjin_double_2_even", BlockEntityTypes.RAILWAY_SIGN_TIANJIN_DOUBLE_2_EVEN_TILE_ENTITY); + registerBlockEntityType.accept("railway_sign_tianjin_double_3_even", BlockEntityTypes.RAILWAY_SIGN_TIANJIN_DOUBLE_3_EVEN_TILE_ENTITY); + registerBlockEntityType.accept("railway_sign_tianjin_double_4_even", BlockEntityTypes.RAILWAY_SIGN_TIANJIN_DOUBLE_4_EVEN_TILE_ENTITY); + registerBlockEntityType.accept("railway_sign_tianjin_double_5_even", BlockEntityTypes.RAILWAY_SIGN_TIANJIN_DOUBLE_5_EVEN_TILE_ENTITY); + registerBlockEntityType.accept("railway_sign_tianjin_double_6_even", BlockEntityTypes.RAILWAY_SIGN_TIANJIN_DOUBLE_6_EVEN_TILE_ENTITY); + registerBlockEntityType.accept("railway_sign_tianjin_double_7_even", BlockEntityTypes.RAILWAY_SIGN_TIANJIN_DOUBLE_7_EVEN_TILE_ENTITY); registerBlockEntityType.accept("metal_detection_door", BlockEntityTypes.METAL_DETECTION_DOOR_TILE_ENTITY); registerBlockEntityType.accept("bench", BlockEntityTypes.BENCH_TILE_ENTITY); registerBlockEntityType.accept("service_corridor_sign", BlockEntityTypes.SERVICE_CORRIDOR_SIGN_TILE_ENTITY); diff --git a/common/src/main/java/ziyue/tjmetro/TianjinMetroClient.java b/common/src/main/java/ziyue/tjmetro/TianjinMetroClient.java index 21ea9f2..34901f7 100644 --- a/common/src/main/java/ziyue/tjmetro/TianjinMetroClient.java +++ b/common/src/main/java/ziyue/tjmetro/TianjinMetroClient.java @@ -77,6 +77,17 @@ public static void init() { RegistryClient.registerTileEntityRenderer(BlockEntityTypes.RAILWAY_SIGN_TIANJIN_5_ODD_TILE_ENTITY.get(), RenderRailwaySignTianjin::new); RegistryClient.registerTileEntityRenderer(BlockEntityTypes.RAILWAY_SIGN_TIANJIN_6_ODD_TILE_ENTITY.get(), RenderRailwaySignTianjin::new); RegistryClient.registerTileEntityRenderer(BlockEntityTypes.RAILWAY_SIGN_TIANJIN_7_ODD_TILE_ENTITY.get(), RenderRailwaySignTianjin::new); + RegistryClient.registerTileEntityRenderer(BlockEntityTypes.RAILWAY_SIGN_TIANJIN_DOUBLE_2_EVEN_TILE_ENTITY.get(), RenderRailwaySignTianjinDouble::new); + RegistryClient.registerTileEntityRenderer(BlockEntityTypes.RAILWAY_SIGN_TIANJIN_DOUBLE_3_EVEN_TILE_ENTITY.get(), RenderRailwaySignTianjinDouble::new); + RegistryClient.registerTileEntityRenderer(BlockEntityTypes.RAILWAY_SIGN_TIANJIN_DOUBLE_4_EVEN_TILE_ENTITY.get(), RenderRailwaySignTianjinDouble::new); + RegistryClient.registerTileEntityRenderer(BlockEntityTypes.RAILWAY_SIGN_TIANJIN_DOUBLE_5_EVEN_TILE_ENTITY.get(), RenderRailwaySignTianjinDouble::new); + RegistryClient.registerTileEntityRenderer(BlockEntityTypes.RAILWAY_SIGN_TIANJIN_DOUBLE_6_EVEN_TILE_ENTITY.get(), RenderRailwaySignTianjinDouble::new); + RegistryClient.registerTileEntityRenderer(BlockEntityTypes.RAILWAY_SIGN_TIANJIN_DOUBLE_7_EVEN_TILE_ENTITY.get(), RenderRailwaySignTianjinDouble::new); + RegistryClient.registerTileEntityRenderer(BlockEntityTypes.RAILWAY_SIGN_TIANJIN_DOUBLE_3_ODD_TILE_ENTITY.get(), RenderRailwaySignTianjinDouble::new); + RegistryClient.registerTileEntityRenderer(BlockEntityTypes.RAILWAY_SIGN_TIANJIN_DOUBLE_4_ODD_TILE_ENTITY.get(), RenderRailwaySignTianjinDouble::new); + RegistryClient.registerTileEntityRenderer(BlockEntityTypes.RAILWAY_SIGN_TIANJIN_DOUBLE_5_ODD_TILE_ENTITY.get(), RenderRailwaySignTianjinDouble::new); + RegistryClient.registerTileEntityRenderer(BlockEntityTypes.RAILWAY_SIGN_TIANJIN_DOUBLE_6_ODD_TILE_ENTITY.get(), RenderRailwaySignTianjinDouble::new); + RegistryClient.registerTileEntityRenderer(BlockEntityTypes.RAILWAY_SIGN_TIANJIN_DOUBLE_7_ODD_TILE_ENTITY.get(), RenderRailwaySignTianjinDouble::new); RegistryClient.registerTileEntityRenderer(BlockEntityTypes.SERVICE_CORRIDOR_SIGN_TILE_ENTITY.get(), RenderServiceCorridorSign::new); RegistryClient.registerTileEntityRenderer(BlockEntityTypes.PSD_DOOR_TIANJIN_TILE_ENTITY.get(), dispatcher -> new RenderPSDAPGDoor<>(dispatcher, 0)); RegistryClient.registerTileEntityRenderer(BlockEntityTypes.PSD_TOP_TIANJIN_TILE_ENTITY.get(), RenderPSDTopTianjin::new); diff --git a/common/src/main/java/ziyue/tjmetro/block/BlockRailwaySignTianjinDouble.java b/common/src/main/java/ziyue/tjmetro/block/BlockRailwaySignTianjinDouble.java new file mode 100644 index 0000000..5e24c2e --- /dev/null +++ b/common/src/main/java/ziyue/tjmetro/block/BlockRailwaySignTianjinDouble.java @@ -0,0 +1,157 @@ +package ziyue.tjmetro.block; + +import mtr.block.IBlock; +import mtr.mappings.BlockEntityClientSerializableMapper; +import mtr.mappings.BlockEntityMapper; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; +import ziyue.tjmetro.BlockEntityTypes; +import ziyue.tjmetro.BlockList; +import ziyue.tjmetro.IBlockExtends; +import ziyue.tjmetro.block.base.IRailwaySign; +import ziyue.tjmetro.packet.PacketGuiServer; + +import java.util.*; + +public class BlockRailwaySignTianjinDouble extends BlockRailwaySignTianjin +{ + public BlockRailwaySignTianjinDouble(int length, boolean isOdd) { + super(length, isOdd); + } + + @Override + public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand interactionHand, BlockHitResult hit) { + final Direction facing = IBlock.getStatePropertySafe(state, FACING); + final BlockPos checkPos = findEndWithDirection(world, pos, facing, false); + return IBlockExtends.checkHoldingBrushOrWrench(world, player, () -> { + if (checkPos != null) { + PacketGuiServer.openRailwaySignDoubleScreenS2C((ServerPlayer) player, checkPos); + } + }); + } + + @Override + public BlockState updateShape(BlockState state, Direction direction, BlockState newState, LevelAccessor world, BlockPos pos, BlockPos posFrom) { + return IRailwaySign.updateShape(state, direction, newState, BlockList.RAILWAY_SIGN_TIANJIN_DOUBLE_MIDDLE.get()); + } + + @Override + public void setPlacedBy(Level world, BlockPos pos, BlockState state, LivingEntity placer, ItemStack itemStack) { + IRailwaySign.setPlacedBy(world, pos, state, BlockList.RAILWAY_SIGN_TIANJIN_DOUBLE_MIDDLE.get(), getMiddleLength()); + } + + @Override + public VoxelShape getShape(BlockState state, BlockGetter blockGetter, BlockPos pos, CollisionContext collisionContext) { + final Direction facing = IBlock.getStatePropertySafe(state, FACING); + if (state.is(BlockList.RAILWAY_SIGN_TIANJIN_DOUBLE_MIDDLE.get())) + return IBlock.getVoxelShapeByDirection(0, 0, 7, 16, 16, 9, facing); + else + return IBlock.getVoxelShapeByDirection(getXStart() - 0.5, 0, 7, 16, 16, 9, facing); + } + + @Override + protected BlockPos findEndWithDirection(Level world, BlockPos startPos, Direction direction, boolean allowOpposite) { + return IRailwaySign.findEndWithDirection(world, startPos, direction, allowOpposite, BlockList.RAILWAY_SIGN_TIANJIN_DOUBLE_MIDDLE.get()); + } + + @Override + public String getDescriptionId() { + return "block.tjmetro.railway_sign_tianjin_double"; + } + + @Override + public BlockEntityMapper createBlockEntity(BlockPos pos, BlockState state) { + if (this == BlockList.RAILWAY_SIGN_TIANJIN_DOUBLE_MIDDLE.get()) + return null; + else + return new TileEntityRailwaySignTianjinDouble(length, isOdd, pos, state); + } + + public static class TileEntityRailwaySignTianjinDouble extends BlockEntityClientSerializableMapper + { + protected final List> selectedIds; + protected final String[][] signIds; + protected static final String KEY_SELECTED_IDS = "selected_ids"; + protected static final String KEY_SIGN_LENGTH = "sign_length"; + + public TileEntityRailwaySignTianjinDouble(int length, boolean isOdd, BlockPos pos, BlockState state) { + super(getType(length, isOdd), pos, state); + signIds = new String[2][length]; + selectedIds = new ArrayList<>(); + selectedIds.add(new HashSet<>()); + selectedIds.add(new HashSet<>()); + } + + @Override + public void readCompoundTag(CompoundTag compoundTag) { + selectedIds.forEach(Set::clear); + for (int i = 0; i < 2; i++) { + Arrays.stream(compoundTag.getLongArray(KEY_SELECTED_IDS + i)).forEach(selectedIds.get(i)::add); + for (int j = 0; j < signIds[i].length; j++) { + final String signId = compoundTag.getString(KEY_SIGN_LENGTH + i + j); + signIds[i][j] = signId.isEmpty() ? null : signId; + } + } + } + + @Override + public void writeCompoundTag(CompoundTag compoundTag) { + for (int i = 0; i < 2; i++) { + compoundTag.putLongArray(KEY_SELECTED_IDS + i, new ArrayList<>(selectedIds.get(i))); + for (int j = 0; j < signIds[i].length; j++) { + compoundTag.putString(KEY_SIGN_LENGTH + i + j, signIds[i][j] == null ? "" : signIds[i][j]); + } + } + } + + public void setData(List> selectedIds, String[][] signTypes) { + this.selectedIds.clear(); + this.selectedIds.addAll(selectedIds); + if (signIds[0].length == signTypes[0].length) { // Both lines have the same length + System.arraycopy(signTypes, 0, signIds, 0, signTypes.length); + } + setChanged(); + syncData(); + } + + public List> getSelectedIds() { + return selectedIds; + } + + public String[][] getSignIds() { + return signIds; + } + + public static BlockEntityType getType(int length, boolean isOdd) { + return switch (length) { + case 2 -> isOdd ? null : BlockEntityTypes.RAILWAY_SIGN_TIANJIN_DOUBLE_2_EVEN_TILE_ENTITY.get(); + case 3 -> + isOdd ? BlockEntityTypes.RAILWAY_SIGN_TIANJIN_DOUBLE_3_ODD_TILE_ENTITY.get() : BlockEntityTypes.RAILWAY_SIGN_TIANJIN_DOUBLE_3_EVEN_TILE_ENTITY.get(); + case 4 -> + isOdd ? BlockEntityTypes.RAILWAY_SIGN_TIANJIN_DOUBLE_4_ODD_TILE_ENTITY.get() : BlockEntityTypes.RAILWAY_SIGN_TIANJIN_DOUBLE_4_EVEN_TILE_ENTITY.get(); + case 5 -> + isOdd ? BlockEntityTypes.RAILWAY_SIGN_TIANJIN_DOUBLE_5_ODD_TILE_ENTITY.get() : BlockEntityTypes.RAILWAY_SIGN_TIANJIN_DOUBLE_5_EVEN_TILE_ENTITY.get(); + case 6 -> + isOdd ? BlockEntityTypes.RAILWAY_SIGN_TIANJIN_DOUBLE_6_ODD_TILE_ENTITY.get() : BlockEntityTypes.RAILWAY_SIGN_TIANJIN_DOUBLE_6_EVEN_TILE_ENTITY.get(); + case 7 -> + isOdd ? BlockEntityTypes.RAILWAY_SIGN_TIANJIN_DOUBLE_7_ODD_TILE_ENTITY.get() : BlockEntityTypes.RAILWAY_SIGN_TIANJIN_DOUBLE_7_EVEN_TILE_ENTITY.get(); + default -> null; + }; + } + } +} diff --git a/common/src/main/java/ziyue/tjmetro/block/BlockRailwaySignTianjinPole.java b/common/src/main/java/ziyue/tjmetro/block/BlockRailwaySignTianjinPole.java index 78a02f4..4110b7b 100644 --- a/common/src/main/java/ziyue/tjmetro/block/BlockRailwaySignTianjinPole.java +++ b/common/src/main/java/ziyue/tjmetro/block/BlockRailwaySignTianjinPole.java @@ -56,6 +56,6 @@ protected BlockState placeWithState(BlockState stateBelow) { @Override protected boolean isBlock(Block block) { - return (block instanceof BlockRailwaySignTianjin && ((BlockRailwaySignTianjin) block).length > 0) || block instanceof BlockRailwaySignTianjinPole; + return (block instanceof BlockRailwaySignTianjin && ((BlockRailwaySignTianjin) block).length > 0) || block instanceof BlockRailwaySignTianjinPole || block instanceof BlockRailwaySignTianjinDouble; } } diff --git a/common/src/main/java/ziyue/tjmetro/packet/PacketGuiClient.java b/common/src/main/java/ziyue/tjmetro/packet/PacketGuiClient.java index 1c0a488..506eee7 100644 --- a/common/src/main/java/ziyue/tjmetro/packet/PacketGuiClient.java +++ b/common/src/main/java/ziyue/tjmetro/packet/PacketGuiClient.java @@ -11,8 +11,8 @@ import ziyue.tjmetro.block.base.BlockCustomContentBlockBase; import ziyue.tjmetro.screen.ColorPickerScreen; import ziyue.tjmetro.screen.CustomContentScreen; +import ziyue.tjmetro.screen.RailwaySignDoubleScreen; import ziyue.tjmetro.screen.RailwaySignScreen; -import ziyue.tjmetro.screen.RailwaySignWallDoubleScreen; import static ziyue.tjmetro.packet.IPacket.*; @@ -74,7 +74,7 @@ public static void openRailwaySignDoubleScreenS2C(Minecraft minecraftClient, Fri final BlockPos pos = packet.readBlockPos(); minecraftClient.execute(() -> { if (!(minecraftClient.screen instanceof RailwaySignScreen)) { - UtilitiesClient.setScreen(minecraftClient, new RailwaySignWallDoubleScreen(pos)); + UtilitiesClient.setScreen(minecraftClient, new RailwaySignDoubleScreen(pos)); } }); } diff --git a/common/src/main/java/ziyue/tjmetro/packet/PacketGuiServer.java b/common/src/main/java/ziyue/tjmetro/packet/PacketGuiServer.java index 1c905c4..7986b64 100644 --- a/common/src/main/java/ziyue/tjmetro/packet/PacketGuiServer.java +++ b/common/src/main/java/ziyue/tjmetro/packet/PacketGuiServer.java @@ -14,6 +14,7 @@ import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.level.block.entity.BlockEntity; +import ziyue.tjmetro.block.BlockRailwaySignTianjinDouble; import ziyue.tjmetro.block.BlockRailwaySignWallDouble; import ziyue.tjmetro.block.BlockStationNameEntranceTianjin; import ziyue.tjmetro.block.base.BlockCustomColorBase; @@ -165,6 +166,8 @@ public static void receiveSignIdsDoubleC2S(MinecraftServer minecraftServer, Serv final BlockEntity entity = player.level.getBlockEntity(signPos); if (entity instanceof BlockRailwaySignWallDouble.TileEntityRailwaySignWallDouble sign) { setTileEntityDataAndWriteUpdate(player, entity2 -> entity2.setData(selectedIds, signIds), sign); + } else if (entity instanceof BlockRailwaySignTianjinDouble.TileEntityRailwaySignTianjinDouble sign1) { + setTileEntityDataAndWriteUpdate(player, entity2 -> entity2.setData(selectedIds, signIds), sign1); } }); } diff --git a/common/src/main/java/ziyue/tjmetro/render/RenderRailwaySignTianjinDouble.java b/common/src/main/java/ziyue/tjmetro/render/RenderRailwaySignTianjinDouble.java new file mode 100644 index 0000000..c6f6b40 --- /dev/null +++ b/common/src/main/java/ziyue/tjmetro/render/RenderRailwaySignTianjinDouble.java @@ -0,0 +1,268 @@ +package ziyue.tjmetro.render; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.Tesselator; +import mtr.MTR; +import mtr.block.BlockRailwaySign; +import mtr.block.BlockStationNameBase; +import mtr.block.IBlock; +import mtr.client.ClientData; +import mtr.client.CustomResources; +import mtr.client.IDrawing; +import mtr.data.IGui; +import mtr.data.Platform; +import mtr.data.RailwayData; +import mtr.data.Station; +import mtr.mappings.BlockEntityRendererMapper; +import mtr.mappings.UtilitiesClient; +import mtr.render.RenderRailwaySign; +import mtr.render.RenderTrains; +import mtr.render.StoredMatrixTransformations; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.Font; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.blockentity.BlockEntityRenderDispatcher; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.block.state.BlockState; +import ziyue.tjmetro.block.BlockRailwaySignTianjinDouble; +import ziyue.tjmetro.block.BlockRailwaySignWallDouble; +import ziyue.tjmetro.client.ClientCache; + +import java.util.*; +import java.util.stream.Collectors; + +import static mtr.render.RenderRailwaySign.getMaxWidth; +import static mtr.render.RenderRailwaySign.getSign; + +/** + * @author ZiYueCommentary + * @see RenderRailwaySign + * @since beta-1 + */ + +public class RenderRailwaySignTianjinDouble extends BlockEntityRendererMapper implements IBlock, IGui, IDrawing +{ + public RenderRailwaySignTianjinDouble(BlockEntityRenderDispatcher dispatcher) { + super(dispatcher); + } + + @Override + public void render(T entity, float tickDelta, PoseStack matrices, MultiBufferSource vertexConsumers, int light, int overlay) { + final BlockGetter world = entity.getLevel(); + if (world == null) return; + + final BlockPos pos = entity.getBlockPos(); + final BlockState state = world.getBlockState(pos); + if (!(state.getBlock() instanceof BlockRailwaySignTianjinDouble block)) return; + + if (entity.getSignIds()[0].length != block.length) return; + + final Direction facing = IBlock.getStatePropertySafe(state, BlockStationNameBase.FACING); + final String[][] signIds = entity.getSignIds(); + + int[] backgroundColor = { 0x0B0B0B, 0x0B0B0B }; + for (int i = 0; i < 2; i++) { + for (final String signId : signIds[i]) { + if (signId != null) { + final CustomResources.CustomSign sign = getSign(signId); + if (sign != null) { + if (sign.backgroundColor != 0) { + backgroundColor[i] = sign.backgroundColor; + break; + } + } + } + } + } + + final StoredMatrixTransformations storedMatrixTransformations = new StoredMatrixTransformations(); + storedMatrixTransformations.add(matricesNew -> { + matricesNew.translate(0.5 + entity.getBlockPos().getX(), 0.5 + entity.getBlockPos().getY(), 0.5 + entity.getBlockPos().getZ()); + UtilitiesClient.rotateYDegrees(matricesNew, -facing.toYRot()); + UtilitiesClient.rotateZDegrees(matricesNew, 180); + matricesNew.translate(block.getXStart() / 16F - 0.5, -0.5, -0.0625 - SMALL_OFFSET * 2); + }); + + matrices.pushPose(); + matrices.translate(0.5, 0, 0.5); + UtilitiesClient.rotateYDegrees(matrices, -facing.toYRot()); + UtilitiesClient.rotateZDegrees(matrices, 180); + matrices.translate(block.getXStart() / 16F - 0.5, 0.5, -0.0625 - SMALL_OFFSET * 2); + + final int[] newBackgroundColor = {backgroundColor[0] | ARGB_BLACK, backgroundColor[1] | ARGB_BLACK}; + RenderTrains.scheduleRender(new ResourceLocation(MTR.MOD_ID, "textures/block/white.png"), false, RenderTrains.QueuedRenderLayer.LIGHT, (matricesNew, vertexConsumer) -> { + storedMatrixTransformations.transform(matricesNew); + IDrawing.drawTexture(matricesNew, vertexConsumer, 0, 0, SMALL_OFFSET, 0.5F * (signIds[0].length), 0.5F, SMALL_OFFSET, facing, newBackgroundColor[0], MAX_LIGHT_GLOWING); + IDrawing.drawTexture(matricesNew, vertexConsumer, 0, 0.5F, SMALL_OFFSET, 0.5F * (signIds[1].length), 1F, SMALL_OFFSET, facing, newBackgroundColor[1], MAX_LIGHT_GLOWING); + matricesNew.popPose(); + }); + for (int i = 0; i < 2; i++) { + for (int j = 0; j < signIds[i].length; j++) { + if (signIds[i][j] != null) { + drawSign(matrices, vertexConsumers, storedMatrixTransformations, Minecraft.getInstance().font, pos, signIds[i][j], 0.5F * j, 0.5F * i, 0.5F, getMaxWidth(signIds[i], j, false), getMaxWidth(signIds[i], j, true), entity.getSelectedIds().get(i), facing, backgroundColor[i] | ARGB_BLACK, (textureId, x, y, size, flipTexture) -> RenderTrains.scheduleRender(new ResourceLocation(textureId.toString()), true, RenderTrains.QueuedRenderLayer.LIGHT_TRANSLUCENT, (matricesNew, vertexConsumer) -> { + storedMatrixTransformations.transform(matricesNew); + IDrawing.drawTexture(matricesNew, vertexConsumer, x, y, size, size, flipTexture ? 1 : 0, 0, flipTexture ? 0 : 1, 1, facing, -1, MAX_LIGHT_GLOWING); + matricesNew.popPose(); + })); + } + } + } + + matrices.popPose(); + } + + @Override + public boolean shouldRenderOffScreen(T blockEntity) { + return true; + } + + public static void drawSign(PoseStack matrices, MultiBufferSource vertexConsumers, StoredMatrixTransformations storedMatrixTransformations, Font textRenderer, BlockPos pos, String signId, float x, float y, float size, float maxWidthLeft, float maxWidthRight, Set selectedIds, Direction facing, int backgroundColor, RenderRailwaySign.DrawTexture drawTexture) { + if (RenderTrains.shouldNotRender(pos, RenderTrains.maxTrainRenderDistance, facing)) return; + + final CustomResources.CustomSign sign = getSign(signId); + if (sign == null) return; + + final float signSize = (sign.small ? BlockRailwaySign.SMALL_SIGN_PERCENTAGE : 1) * size; + final float margin = (size - signSize) / 2; + + final boolean hasCustomText = sign.hasCustomText(); + final boolean flipCustomText = sign.flipCustomText; + final boolean flipTexture = sign.flipTexture; + final boolean isExit = signId.equals(BlockRailwaySign.SignType.EXIT_LETTER.toString()) || signId.equals(BlockRailwaySign.SignType.EXIT_LETTER_FLIPPED.toString()); + final boolean isLine = signId.equals(BlockRailwaySign.SignType.LINE.toString()) || signId.equals(BlockRailwaySign.SignType.LINE_FLIPPED.toString()); + final boolean isPlatform = signId.equals(BlockRailwaySign.SignType.PLATFORM.toString()) || signId.equals(BlockRailwaySign.SignType.PLATFORM_FLIPPED.toString()); + final boolean isStation = signId.equals(BlockRailwaySign.SignType.STATION.toString()) || signId.equals(BlockRailwaySign.SignType.STATION_FLIPPED.toString()); + + final MultiBufferSource.BufferSource immediate = RenderTrains.shouldNotRender(pos, RenderTrains.maxTrainRenderDistance / 2, null) ? null : MultiBufferSource.immediate(Tesselator.getInstance().getBuilder()); + + if (vertexConsumers != null && isExit) { + final Station station = RailwayData.getStation(ClientData.STATIONS, ClientData.DATA_CACHE, pos); + if (station == null) return; + + final Map> exits = station.getGeneratedExits(); + final List selectedExitsSorted = selectedIds.stream().map(Station::deserializeExit).filter(exits::containsKey).sorted(String::compareTo).toList(); + + matrices.pushPose(); + matrices.translate(x + margin + (flipCustomText ? signSize : 0), y + margin, 0); + final float maxWidth = ((flipCustomText ? maxWidthLeft : maxWidthRight) + 1) * size - margin * 2; + final float exitWidth = signSize * selectedExitsSorted.size(); + matrices.scale(Math.min(1, maxWidth / exitWidth), 1, 1); + + for (int i = 0; i < selectedExitsSorted.size(); i++) { + final String selectedExit = selectedExitsSorted.get(flipCustomText ? selectedExitsSorted.size() - i - 1 : i); + final float offset = (flipCustomText ? -1 : 1) * signSize * i - (flipCustomText ? signSize : 0); + + RenderTrains.scheduleRender(ClientCache.DATA_CACHE.getExitSignLetter(selectedExit.substring(0, 1), selectedExit.substring(1), backgroundColor).resourceLocation, true, RenderTrains.QueuedRenderLayer.LIGHT_TRANSLUCENT, (matricesNew, vertexConsumer) -> { + storedMatrixTransformations.transform(matricesNew); + matricesNew.translate(x + margin + (flipCustomText ? signSize : 0), y + margin, 0); + matricesNew.scale(Math.min(1, maxWidth / exitWidth), 1, 1); + IDrawing.drawTexture(matricesNew, vertexConsumer, offset, 0, signSize, signSize, facing, MAX_LIGHT_GLOWING); + matricesNew.popPose(); + }); + + if (maxWidth > exitWidth && selectedExitsSorted.size() == 1 && !exits.get(selectedExit).isEmpty()) { + renderCustomText(exits.get(selectedExit).get(0), storedMatrixTransformations, facing, size, flipCustomText ? x : x + size, y, flipCustomText, maxWidth - exitWidth - margin * 2, backgroundColor); + } + } + + matrices.popPose(); + } else if (vertexConsumers != null && isLine) { + final Station station = RailwayData.getStation(ClientData.STATIONS, ClientData.DATA_CACHE, pos); + if (station == null) return; + + final Map routesInStation = ClientData.DATA_CACHE.getAllRoutesIncludingConnectingStations(station); + final List selectedIdsSorted = selectedIds.stream().filter(selectedId -> RailwayData.isBetween(selectedId, Integer.MIN_VALUE, Integer.MAX_VALUE)).map(Math::toIntExact).filter(routesInStation::containsKey).map(routesInStation::get).sorted(Comparator.comparingInt(route -> route.color)).collect(Collectors.toList()); + + final float maxWidth = Math.max(0, ((flipCustomText ? maxWidthLeft : maxWidthRight) + 1) * size - margin * 2); + final float height = size - margin * 2; + final List resourceLocationDataList = new ArrayList<>(); + float totalTextWidth = 0; + for (final mtr.client.ClientCache.ColorNameTuple route : selectedIdsSorted) { + final ClientCache.DynamicResource resourceLocationData = ClientCache.DATA_CACHE.getRouteSquare(route.color, route.name, flipCustomText ? HorizontalAlignment.RIGHT : HorizontalAlignment.LEFT); + resourceLocationDataList.add(resourceLocationData); + totalTextWidth += height * resourceLocationData.width / resourceLocationData.height + margin / 2F; + } + + final StoredMatrixTransformations storedMatrixTransformations2 = storedMatrixTransformations.copy(); + storedMatrixTransformations2.add(matricesNew -> matricesNew.translate(flipCustomText ? x + size - margin : x + margin, 0, 0)); + + if (totalTextWidth > margin / 2F) { + totalTextWidth -= margin / 2F; + } + if (totalTextWidth > maxWidth) { + final float finalTotalTextWidth = totalTextWidth; + storedMatrixTransformations2.add(matricesNew -> matricesNew.scale(maxWidth / finalTotalTextWidth, 1, 1)); + } + + float xOffset = 0; + for (final ClientCache.DynamicResource resourceLocationData : resourceLocationDataList) { + final float width = height * resourceLocationData.width / resourceLocationData.height; + final float finalXOffset = xOffset; + RenderTrains.scheduleRender(resourceLocationData.resourceLocation, true, RenderTrains.QueuedRenderLayer.LIGHT, (matricesNew, vertexConsumer) -> { + storedMatrixTransformations2.transform(matricesNew); + IDrawing.drawTexture(matricesNew, vertexConsumer, flipCustomText ? -finalXOffset - width : finalXOffset, margin, width, height, Direction.UP, MAX_LIGHT_GLOWING); + matricesNew.popPose(); + }); + xOffset += width + margin / 2F; + } + } else if (vertexConsumers != null && isPlatform) { + final Station station = RailwayData.getStation(ClientData.STATIONS, ClientData.DATA_CACHE, pos); + if (station == null) return; + + final Map platformPositions = ClientData.DATA_CACHE.requestStationIdToPlatforms(station.id); + if (platformPositions != null) { + final List selectedIdsSorted = selectedIds.stream().filter(platformPositions::containsKey).sorted(Comparator.comparing(platformPositions::get)).toList(); + final int selectedCount = selectedIdsSorted.size(); + + final float extraMargin = margin - margin / selectedCount; + final float height = (size - extraMargin * 2) / selectedCount; + for (int i = 0; i < selectedIdsSorted.size(); i++) { + final float topOffset = i * height + extraMargin; + final float bottomOffset = (i + 1) * height + extraMargin; + final float left = flipCustomText ? x - maxWidthLeft * size : x + margin; + final float right = flipCustomText ? x + size - margin : x + (maxWidthRight + 1) * size; + RenderTrains.scheduleRender(ClientCache.DATA_CACHE.getDirectionArrow(selectedIdsSorted.get(i), false, false, flipCustomText ? HorizontalAlignment.RIGHT : HorizontalAlignment.LEFT, false, margin / size, (right - left) / (bottomOffset - topOffset), backgroundColor, ARGB_WHITE, backgroundColor).resourceLocation, true, RenderTrains.QueuedRenderLayer.LIGHT_TRANSLUCENT, (matricesNew, vertexConsumer) -> { + storedMatrixTransformations.transform(matricesNew); + IDrawing.drawTexture(matricesNew, vertexConsumer, left, topOffset, 0, right, bottomOffset, 0, 0, 0, 1, 1, facing, -1, MAX_LIGHT_GLOWING); + matricesNew.popPose(); + }); + } + } + } else { + drawTexture.drawTexture(sign.textureId, x + margin, y + margin, signSize, flipTexture); + + if (hasCustomText) { + final float fixedMargin = size * (1 - BlockRailwaySign.SMALL_SIGN_PERCENTAGE) / 2; + final boolean isSmall = sign.small; + final float maxWidth = Math.max(0, (flipCustomText ? maxWidthLeft : maxWidthRight) * size - fixedMargin * (isSmall ? 1 : 2)); + final float start = flipCustomText ? x - (isSmall ? 0 : fixedMargin) : x + size + (isSmall ? 0 : fixedMargin); + if (vertexConsumers == null) { + IDrawing.drawStringWithFont(matrices, textRenderer, immediate, isExit || isLine ? "..." : sign.customText, flipCustomText ? HorizontalAlignment.RIGHT : HorizontalAlignment.LEFT, VerticalAlignment.TOP, start, y + fixedMargin, maxWidth, size - fixedMargin * 2, 0.01F, ARGB_WHITE, false, MAX_LIGHT_GLOWING, null); + } else { + final String signText; + if (isStation) { + signText = IGui.mergeStations(selectedIds.stream().filter(ClientData.DATA_CACHE.stationIdMap::containsKey).sorted(Long::compareTo).map(stationId -> IGui.insertTranslation("gui.mtr.station_cjk", "gui.mtr.station", 1, ClientData.DATA_CACHE.stationIdMap.get(stationId).name)).collect(Collectors.toList())); + } else { + signText = sign.customText; + } + renderCustomText(signText, storedMatrixTransformations, facing, size, start, y, flipCustomText, maxWidth, backgroundColor); + } + } + } + + if (immediate != null) immediate.endBatch(); + } + + public static void renderCustomText(String signText, StoredMatrixTransformations storedMatrixTransformations, Direction facing, float size, float start, float offset, boolean flipCustomText, float maxWidth, int backgroundColor) { + final ClientCache.DynamicResource dynamicResource = ClientCache.DATA_CACHE.getSignText(signText, flipCustomText ? IGui.HorizontalAlignment.RIGHT : IGui.HorizontalAlignment.LEFT, (1 - BlockRailwaySign.SMALL_SIGN_PERCENTAGE) / 2, backgroundColor, ARGB_WHITE); + final float width = Math.min(size * dynamicResource.width / dynamicResource.height, maxWidth); + RenderTrains.scheduleRender(dynamicResource.resourceLocation, true, RenderTrains.QueuedRenderLayer.LIGHT_TRANSLUCENT, (matricesNew, vertexConsumer) -> { + storedMatrixTransformations.transform(matricesNew); + IDrawing.drawTexture(matricesNew, vertexConsumer, start - (flipCustomText ? width : 0), offset, 0, start + (flipCustomText ? 0 : width), size + offset, 0, 0, 0, 1, 1, facing, -1, MAX_LIGHT_GLOWING); + matricesNew.popPose(); + }); + } +} diff --git a/common/src/main/java/ziyue/tjmetro/screen/RailwaySignWallDoubleScreen.java b/common/src/main/java/ziyue/tjmetro/screen/RailwaySignDoubleScreen.java similarity index 96% rename from common/src/main/java/ziyue/tjmetro/screen/RailwaySignWallDoubleScreen.java rename to common/src/main/java/ziyue/tjmetro/screen/RailwaySignDoubleScreen.java index b8d6214..dd175ba 100644 --- a/common/src/main/java/ziyue/tjmetro/screen/RailwaySignWallDoubleScreen.java +++ b/common/src/main/java/ziyue/tjmetro/screen/RailwaySignDoubleScreen.java @@ -24,6 +24,7 @@ import net.minecraft.util.Mth; import net.minecraft.world.level.block.entity.BlockEntity; import ziyue.tjmetro.TianjinMetro; +import ziyue.tjmetro.block.BlockRailwaySignTianjinDouble; import ziyue.tjmetro.block.BlockRailwaySignWallDouble; import ziyue.tjmetro.block.base.BlockRailwaySignBase; import ziyue.tjmetro.packet.PacketGuiServer; @@ -38,7 +39,7 @@ * @since beta-1 */ -public class RailwaySignWallDoubleScreen extends ScreenMapper implements IGui +public class RailwaySignDoubleScreen extends ScreenMapper implements IGui { protected int line; protected int editingIndex; @@ -67,7 +68,7 @@ public class RailwaySignWallDoubleScreen extends ScreenMapper implements IGui protected static final int SIGN_BUTTON_SIZE = 16; protected static final int BUTTON_Y_START = (SQUARE_SIZE + SIGN_SIZE) * 2 + SIGN_BUTTON_SIZE / 2; - public RailwaySignWallDoubleScreen(BlockPos signPos) { + public RailwaySignDoubleScreen(BlockPos signPos) { super(Text.literal("")); editingIndex = -1; this.signPos = signPos; @@ -111,6 +112,10 @@ public RailwaySignWallDoubleScreen(BlockPos signPos) { signIds = entityRailwaySign.getSignIds(); selectedIds = entityRailwaySign.getSelectedIds(); isRailwaySign = true; + } else if (entity instanceof BlockRailwaySignTianjinDouble.TileEntityRailwaySignTianjinDouble entityRailwaySign) { + signIds = entityRailwaySign.getSignIds(); + selectedIds = entityRailwaySign.getSelectedIds(); + isRailwaySign = true; } else { signIds = new String[0][0]; selectedIds = new ArrayList<>(); @@ -120,6 +125,8 @@ public RailwaySignWallDoubleScreen(BlockPos signPos) { } if (world.getBlockState(signPos).getBlock() instanceof BlockRailwaySignWallDouble block) { length = block.length; + } else if (world.getBlockState(signPos).getBlock() instanceof BlockRailwaySignTianjinDouble block) { + length = block.length; } else { length = 0; } @@ -200,9 +207,7 @@ public void render(PoseStack matrices, int mouseX, int mouseY, float delta) { try { renderBackground(matrices); super.render(matrices, mouseX, mouseY, delta); - if (minecraft == null) { - return; - } + if (minecraft == null) return; for (int i = 0; i < 2; i++) { for (int j = 0; j < signIds[i].length; j++) { diff --git a/common/src/main/resources/assets/tjmetro/blockstates/railway_sign_tianjin_double_2_even.json b/common/src/main/resources/assets/tjmetro/blockstates/railway_sign_tianjin_double_2_even.json new file mode 100644 index 0000000..0ca594f --- /dev/null +++ b/common/src/main/resources/assets/tjmetro/blockstates/railway_sign_tianjin_double_2_even.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=north": { + "model": "tjmetro:block/railway_sign_tianjin_double_end_one" + }, + "facing=east": { + "model": "tjmetro:block/railway_sign_tianjin_double_end_one", + "y": 90 + }, + "facing=south": { + "model": "tjmetro:block/railway_sign_tianjin_double_end_one", + "y": 180 + }, + "facing=west": { + "model": "tjmetro:block/railway_sign_tianjin_double_end_one", + "y": 270 + } + } +} diff --git a/common/src/main/resources/assets/tjmetro/blockstates/railway_sign_tianjin_double_3_even.json b/common/src/main/resources/assets/tjmetro/blockstates/railway_sign_tianjin_double_3_even.json new file mode 100644 index 0000000..af41abb --- /dev/null +++ b/common/src/main/resources/assets/tjmetro/blockstates/railway_sign_tianjin_double_3_even.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=north": { + "model": "tjmetro:block/railway_sign_tianjin_double_end_one_and_a_half" + }, + "facing=east": { + "model": "tjmetro:block/railway_sign_tianjin_double_end_one_and_a_half", + "y": 90 + }, + "facing=south": { + "model": "tjmetro:block/railway_sign_tianjin_double_end_one_and_a_half", + "y": 180 + }, + "facing=west": { + "model": "tjmetro:block/railway_sign_tianjin_double_end_one_and_a_half", + "y": 270 + } + } +} diff --git a/common/src/main/resources/assets/tjmetro/blockstates/railway_sign_tianjin_double_3_odd.json b/common/src/main/resources/assets/tjmetro/blockstates/railway_sign_tianjin_double_3_odd.json new file mode 100644 index 0000000..75a396b --- /dev/null +++ b/common/src/main/resources/assets/tjmetro/blockstates/railway_sign_tianjin_double_3_odd.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=north": { + "model": "tjmetro:block/railway_sign_tianjin_double_end_half" + }, + "facing=east": { + "model": "tjmetro:block/railway_sign_tianjin_double_end_half", + "y": 90 + }, + "facing=south": { + "model": "tjmetro:block/railway_sign_tianjin_double_end_half", + "y": 180 + }, + "facing=west": { + "model": "tjmetro:block/railway_sign_tianjin_double_end_half", + "y": 270 + } + } +} diff --git a/common/src/main/resources/assets/tjmetro/blockstates/railway_sign_tianjin_double_4_even.json b/common/src/main/resources/assets/tjmetro/blockstates/railway_sign_tianjin_double_4_even.json new file mode 100644 index 0000000..cfbfc38 --- /dev/null +++ b/common/src/main/resources/assets/tjmetro/blockstates/railway_sign_tianjin_double_4_even.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=north": { + "model": "tjmetro:block/railway_sign_tianjin_double_end_full" + }, + "facing=east": { + "model": "tjmetro:block/railway_sign_tianjin_double_end_full", + "y": 90 + }, + "facing=south": { + "model": "tjmetro:block/railway_sign_tianjin_double_end_full", + "y": 180 + }, + "facing=west": { + "model": "tjmetro:block/railway_sign_tianjin_double_end_full", + "y": 270 + } + } +} diff --git a/common/src/main/resources/assets/tjmetro/blockstates/railway_sign_tianjin_double_4_odd.json b/common/src/main/resources/assets/tjmetro/blockstates/railway_sign_tianjin_double_4_odd.json new file mode 100644 index 0000000..0ca594f --- /dev/null +++ b/common/src/main/resources/assets/tjmetro/blockstates/railway_sign_tianjin_double_4_odd.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=north": { + "model": "tjmetro:block/railway_sign_tianjin_double_end_one" + }, + "facing=east": { + "model": "tjmetro:block/railway_sign_tianjin_double_end_one", + "y": 90 + }, + "facing=south": { + "model": "tjmetro:block/railway_sign_tianjin_double_end_one", + "y": 180 + }, + "facing=west": { + "model": "tjmetro:block/railway_sign_tianjin_double_end_one", + "y": 270 + } + } +} diff --git a/common/src/main/resources/assets/tjmetro/blockstates/railway_sign_tianjin_double_5_even.json b/common/src/main/resources/assets/tjmetro/blockstates/railway_sign_tianjin_double_5_even.json new file mode 100644 index 0000000..75a396b --- /dev/null +++ b/common/src/main/resources/assets/tjmetro/blockstates/railway_sign_tianjin_double_5_even.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=north": { + "model": "tjmetro:block/railway_sign_tianjin_double_end_half" + }, + "facing=east": { + "model": "tjmetro:block/railway_sign_tianjin_double_end_half", + "y": 90 + }, + "facing=south": { + "model": "tjmetro:block/railway_sign_tianjin_double_end_half", + "y": 180 + }, + "facing=west": { + "model": "tjmetro:block/railway_sign_tianjin_double_end_half", + "y": 270 + } + } +} diff --git a/common/src/main/resources/assets/tjmetro/blockstates/railway_sign_tianjin_double_5_odd.json b/common/src/main/resources/assets/tjmetro/blockstates/railway_sign_tianjin_double_5_odd.json new file mode 100644 index 0000000..af41abb --- /dev/null +++ b/common/src/main/resources/assets/tjmetro/blockstates/railway_sign_tianjin_double_5_odd.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=north": { + "model": "tjmetro:block/railway_sign_tianjin_double_end_one_and_a_half" + }, + "facing=east": { + "model": "tjmetro:block/railway_sign_tianjin_double_end_one_and_a_half", + "y": 90 + }, + "facing=south": { + "model": "tjmetro:block/railway_sign_tianjin_double_end_one_and_a_half", + "y": 180 + }, + "facing=west": { + "model": "tjmetro:block/railway_sign_tianjin_double_end_one_and_a_half", + "y": 270 + } + } +} diff --git a/common/src/main/resources/assets/tjmetro/blockstates/railway_sign_tianjin_double_6_even.json b/common/src/main/resources/assets/tjmetro/blockstates/railway_sign_tianjin_double_6_even.json new file mode 100644 index 0000000..0ca594f --- /dev/null +++ b/common/src/main/resources/assets/tjmetro/blockstates/railway_sign_tianjin_double_6_even.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=north": { + "model": "tjmetro:block/railway_sign_tianjin_double_end_one" + }, + "facing=east": { + "model": "tjmetro:block/railway_sign_tianjin_double_end_one", + "y": 90 + }, + "facing=south": { + "model": "tjmetro:block/railway_sign_tianjin_double_end_one", + "y": 180 + }, + "facing=west": { + "model": "tjmetro:block/railway_sign_tianjin_double_end_one", + "y": 270 + } + } +} diff --git a/common/src/main/resources/assets/tjmetro/blockstates/railway_sign_tianjin_double_6_odd.json b/common/src/main/resources/assets/tjmetro/blockstates/railway_sign_tianjin_double_6_odd.json new file mode 100644 index 0000000..cfbfc38 --- /dev/null +++ b/common/src/main/resources/assets/tjmetro/blockstates/railway_sign_tianjin_double_6_odd.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=north": { + "model": "tjmetro:block/railway_sign_tianjin_double_end_full" + }, + "facing=east": { + "model": "tjmetro:block/railway_sign_tianjin_double_end_full", + "y": 90 + }, + "facing=south": { + "model": "tjmetro:block/railway_sign_tianjin_double_end_full", + "y": 180 + }, + "facing=west": { + "model": "tjmetro:block/railway_sign_tianjin_double_end_full", + "y": 270 + } + } +} diff --git a/common/src/main/resources/assets/tjmetro/blockstates/railway_sign_tianjin_double_7_even.json b/common/src/main/resources/assets/tjmetro/blockstates/railway_sign_tianjin_double_7_even.json new file mode 100644 index 0000000..af41abb --- /dev/null +++ b/common/src/main/resources/assets/tjmetro/blockstates/railway_sign_tianjin_double_7_even.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=north": { + "model": "tjmetro:block/railway_sign_tianjin_double_end_one_and_a_half" + }, + "facing=east": { + "model": "tjmetro:block/railway_sign_tianjin_double_end_one_and_a_half", + "y": 90 + }, + "facing=south": { + "model": "tjmetro:block/railway_sign_tianjin_double_end_one_and_a_half", + "y": 180 + }, + "facing=west": { + "model": "tjmetro:block/railway_sign_tianjin_double_end_one_and_a_half", + "y": 270 + } + } +} diff --git a/common/src/main/resources/assets/tjmetro/blockstates/railway_sign_tianjin_double_7_odd.json b/common/src/main/resources/assets/tjmetro/blockstates/railway_sign_tianjin_double_7_odd.json new file mode 100644 index 0000000..75a396b --- /dev/null +++ b/common/src/main/resources/assets/tjmetro/blockstates/railway_sign_tianjin_double_7_odd.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=north": { + "model": "tjmetro:block/railway_sign_tianjin_double_end_half" + }, + "facing=east": { + "model": "tjmetro:block/railway_sign_tianjin_double_end_half", + "y": 90 + }, + "facing=south": { + "model": "tjmetro:block/railway_sign_tianjin_double_end_half", + "y": 180 + }, + "facing=west": { + "model": "tjmetro:block/railway_sign_tianjin_double_end_half", + "y": 270 + } + } +} diff --git a/common/src/main/resources/assets/tjmetro/blockstates/railway_sign_tianjin_double_middle.json b/common/src/main/resources/assets/tjmetro/blockstates/railway_sign_tianjin_double_middle.json new file mode 100644 index 0000000..ef63016 --- /dev/null +++ b/common/src/main/resources/assets/tjmetro/blockstates/railway_sign_tianjin_double_middle.json @@ -0,0 +1,8 @@ +{ + "variants": { + "facing=north": { "model": "tjmetro:block/railway_sign_tianjin_double_middle" }, + "facing=east": { "model": "tjmetro:block/railway_sign_tianjin_double_middle", "y": 90 }, + "facing=south": { "model": "tjmetro:block/railway_sign_tianjin_double_middle", "y": 180 }, + "facing=west": { "model": "tjmetro:block/railway_sign_tianjin_double_middle", "y": 270 } + } +} \ No newline at end of file diff --git a/common/src/main/resources/assets/tjmetro/lang/en_us.json b/common/src/main/resources/assets/tjmetro/lang/en_us.json index ee1dd6e..ca0c7cc 100644 --- a/common/src/main/resources/assets/tjmetro/lang/en_us.json +++ b/common/src/main/resources/assets/tjmetro/lang/en_us.json @@ -11,6 +11,7 @@ "block.tjmetro.station_name_sign_1": "Station Name Sign", "block.tjmetro.station_name_sign_2": "Station Name Sign", "block.tjmetro.railway_sign_tianjin": "Railway Sign (Tianjin)", + "block.tjmetro.railway_sign_tianjin_double": "Railway Sign (Tianjin, Double)", "block.tjmetro.railway_sign_tianjin_pole": "Railway Sign Pole (Tianjin)", "block.tjmetro.railway_sign_wall": "Railway Sign (Wall)", "block.tjmetro.railway_sign_wall_big": "Railway Sign (Wall, Big)", diff --git a/common/src/main/resources/assets/tjmetro/models/block/railway_sign_tianjin_double_end_full.json b/common/src/main/resources/assets/tjmetro/models/block/railway_sign_tianjin_double_end_full.json new file mode 100644 index 0000000..bc7f481 --- /dev/null +++ b/common/src/main/resources/assets/tjmetro/models/block/railway_sign_tianjin_double_end_full.json @@ -0,0 +1,21 @@ +{ + "credit": "Made by ZiYueCommentary, made with Blockbench.", + "parent": "block/block", + "textures": { + "particle": "tjmetro:block/black" + }, + "elements": [ + { + "from": [-0.5, 0, 7], + "to": [16, 16, 9], + "faces": { + "north": {"uv": [0, 7, 8.5, 16], "texture": "#particle"}, + "east": {"uv": [0, 0, 1, 1], "texture": "#particle"}, + "south": {"uv": [7.5, 7, 16, 16], "texture": "#particle"}, + "west": {"uv": [0, 4, 1, 5], "texture": "#particle"}, + "up": {"uv": [7.5, 7, 16, 9], "texture": "#particle"}, + "down": {"uv": [7.5, 7, 16, 9], "texture": "#particle", "cullface": "down"} + } + } + ] +} \ No newline at end of file diff --git a/common/src/main/resources/assets/tjmetro/models/block/railway_sign_tianjin_double_end_half.json b/common/src/main/resources/assets/tjmetro/models/block/railway_sign_tianjin_double_end_half.json new file mode 100644 index 0000000..51397de --- /dev/null +++ b/common/src/main/resources/assets/tjmetro/models/block/railway_sign_tianjin_double_end_half.json @@ -0,0 +1,21 @@ +{ + "credit": "Made by ZiYueCommentary, made with Blockbench.", + "parent": "block/block", + "textures": { + "particle": "tjmetro:block/black" + }, + "elements": [ + { + "from": [11.5, 0, 7], + "to": [16, 16, 9], + "faces": { + "north": {"uv": [0, 7, 4.5, 16], "texture": "#particle"}, + "east": {"uv": [0, 0, 1, 7], "texture": "#particle"}, + "south": {"uv": [11.5, 7, 16, 16], "texture": "#particle"}, + "west": {"uv": [0, 0, 1, 7], "texture": "#particle"}, + "up": {"uv": [11.5, 7, 16, 9], "texture": "#particle"}, + "down": {"uv": [11.5, 7, 16, 9], "texture": "#particle", "cullface": "down"} + } + } + ] +} \ No newline at end of file diff --git a/common/src/main/resources/assets/tjmetro/models/block/railway_sign_tianjin_double_end_one.json b/common/src/main/resources/assets/tjmetro/models/block/railway_sign_tianjin_double_end_one.json new file mode 100644 index 0000000..1761a86 --- /dev/null +++ b/common/src/main/resources/assets/tjmetro/models/block/railway_sign_tianjin_double_end_one.json @@ -0,0 +1,21 @@ +{ + "credit": "Made by ZiYueCommentary, made with Blockbench.", + "parent": "block/block", + "textures": { + "particle": "tjmetro:block/black" + }, + "elements": [ + { + "from": [7.5, 0, 7], + "to": [16, 16, 9], + "faces": { + "north": {"uv": [0, 7, 8.5, 16], "texture": "#particle"}, + "east": {"uv": [0, 0, 1, 1], "texture": "#particle"}, + "south": {"uv": [7.5, 7, 16, 16], "texture": "#particle"}, + "west": {"uv": [0, 4, 1, 5], "texture": "#particle"}, + "up": {"uv": [7.5, 7, 16, 9], "texture": "#particle"}, + "down": {"uv": [7.5, 7, 16, 9], "texture": "#particle", "cullface": "down"} + } + } + ] +} \ No newline at end of file diff --git a/common/src/main/resources/assets/tjmetro/models/block/railway_sign_tianjin_double_end_one_and_a_half.json b/common/src/main/resources/assets/tjmetro/models/block/railway_sign_tianjin_double_end_one_and_a_half.json new file mode 100644 index 0000000..767c189 --- /dev/null +++ b/common/src/main/resources/assets/tjmetro/models/block/railway_sign_tianjin_double_end_one_and_a_half.json @@ -0,0 +1,21 @@ +{ + "credit": "Made by ZiYueCommentary, made with Blockbench.", + "parent": "block/block", + "textures": { + "particle": "tjmetro:block/black" + }, + "elements": [ + { + "from": [3.5, 0, 7], + "to": [16, 16, 9], + "faces": { + "north": {"uv": [0, 7, 12.5, 16], "texture": "#particle"}, + "east": {"uv": [0, 7, 12.5, 126], "texture": "#particle"}, + "south": {"uv": [3.5, 7, 16, 16], "texture": "#particle"}, + "west": {"uv": [0, 0, 3, 8], "texture": "#particle"}, + "up": {"uv": [3.5, 7, 16, 9], "texture": "#particle"}, + "down": {"uv": [3.5, 7, 16, 9], "texture": "#particle", "cullface": "down"} + } + } + ] +} \ No newline at end of file diff --git a/common/src/main/resources/assets/tjmetro/models/block/railway_sign_tianjin_double_middle.json b/common/src/main/resources/assets/tjmetro/models/block/railway_sign_tianjin_double_middle.json new file mode 100644 index 0000000..8550d8a --- /dev/null +++ b/common/src/main/resources/assets/tjmetro/models/block/railway_sign_tianjin_double_middle.json @@ -0,0 +1,19 @@ +{ + "credit": "Made by ZiYueCommentary, made with Blockbench.", + "parent": "block/block", + "textures": { + "particle": "tjmetro:block/black" + }, + "elements": [ + { + "from": [0, 0, 7], + "to": [16, 16, 9], + "faces": { + "north": {"uv": [0, 7, 16, 16], "texture": "#particle"}, + "south": {"uv": [0, 7, 16, 16], "texture": "#particle"}, + "up": {"uv": [0, 7, 16, 9], "texture": "#particle"}, + "down": {"uv": [0, 7, 16, 9], "texture": "#particle", "cullface": "down"} + } + } + ] +} \ No newline at end of file diff --git a/common/src/main/resources/assets/tjmetro/models/item/railway_sign_tianjin_double_2_even.json b/common/src/main/resources/assets/tjmetro/models/item/railway_sign_tianjin_double_2_even.json new file mode 100644 index 0000000..bd705ce --- /dev/null +++ b/common/src/main/resources/assets/tjmetro/models/item/railway_sign_tianjin_double_2_even.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "tjmetro:item/railway_sign_tianjin_double_2_even" + } +} diff --git a/common/src/main/resources/assets/tjmetro/models/item/railway_sign_tianjin_double_3_even.json b/common/src/main/resources/assets/tjmetro/models/item/railway_sign_tianjin_double_3_even.json new file mode 100644 index 0000000..88e3299 --- /dev/null +++ b/common/src/main/resources/assets/tjmetro/models/item/railway_sign_tianjin_double_3_even.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "tjmetro:item/railway_sign_tianjin_double_3_even" + } +} diff --git a/common/src/main/resources/assets/tjmetro/models/item/railway_sign_tianjin_double_3_odd.json b/common/src/main/resources/assets/tjmetro/models/item/railway_sign_tianjin_double_3_odd.json new file mode 100644 index 0000000..9a4933d --- /dev/null +++ b/common/src/main/resources/assets/tjmetro/models/item/railway_sign_tianjin_double_3_odd.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "tjmetro:item/railway_sign_tianjin_double_3_odd" + } +} diff --git a/common/src/main/resources/assets/tjmetro/models/item/railway_sign_tianjin_double_4_even.json b/common/src/main/resources/assets/tjmetro/models/item/railway_sign_tianjin_double_4_even.json new file mode 100644 index 0000000..3592ae0 --- /dev/null +++ b/common/src/main/resources/assets/tjmetro/models/item/railway_sign_tianjin_double_4_even.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "tjmetro:item/railway_sign_tianjin_double_4_even" + } +} diff --git a/common/src/main/resources/assets/tjmetro/models/item/railway_sign_tianjin_double_4_odd.json b/common/src/main/resources/assets/tjmetro/models/item/railway_sign_tianjin_double_4_odd.json new file mode 100644 index 0000000..357627b --- /dev/null +++ b/common/src/main/resources/assets/tjmetro/models/item/railway_sign_tianjin_double_4_odd.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "tjmetro:item/railway_sign_tianjin_double_4_odd" + } +} diff --git a/common/src/main/resources/assets/tjmetro/models/item/railway_sign_tianjin_double_5_even.json b/common/src/main/resources/assets/tjmetro/models/item/railway_sign_tianjin_double_5_even.json new file mode 100644 index 0000000..763f750 --- /dev/null +++ b/common/src/main/resources/assets/tjmetro/models/item/railway_sign_tianjin_double_5_even.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "tjmetro:item/railway_sign_tianjin_double_5_even" + } +} diff --git a/common/src/main/resources/assets/tjmetro/models/item/railway_sign_tianjin_double_5_odd.json b/common/src/main/resources/assets/tjmetro/models/item/railway_sign_tianjin_double_5_odd.json new file mode 100644 index 0000000..8c0af45 --- /dev/null +++ b/common/src/main/resources/assets/tjmetro/models/item/railway_sign_tianjin_double_5_odd.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "tjmetro:item/railway_sign_tianjin_double_5_odd" + } +} diff --git a/common/src/main/resources/assets/tjmetro/models/item/railway_sign_tianjin_double_6_even.json b/common/src/main/resources/assets/tjmetro/models/item/railway_sign_tianjin_double_6_even.json new file mode 100644 index 0000000..f1e8061 --- /dev/null +++ b/common/src/main/resources/assets/tjmetro/models/item/railway_sign_tianjin_double_6_even.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "tjmetro:item/railway_sign_tianjin_double_6_even" + } +} diff --git a/common/src/main/resources/assets/tjmetro/models/item/railway_sign_tianjin_double_6_odd.json b/common/src/main/resources/assets/tjmetro/models/item/railway_sign_tianjin_double_6_odd.json new file mode 100644 index 0000000..4830b57 --- /dev/null +++ b/common/src/main/resources/assets/tjmetro/models/item/railway_sign_tianjin_double_6_odd.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "tjmetro:item/railway_sign_tianjin_double_6_odd" + } +} diff --git a/common/src/main/resources/assets/tjmetro/models/item/railway_sign_tianjin_double_7_even.json b/common/src/main/resources/assets/tjmetro/models/item/railway_sign_tianjin_double_7_even.json new file mode 100644 index 0000000..5821928 --- /dev/null +++ b/common/src/main/resources/assets/tjmetro/models/item/railway_sign_tianjin_double_7_even.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "tjmetro:item/railway_sign_tianjin_double_7_even" + } +} diff --git a/common/src/main/resources/assets/tjmetro/models/item/railway_sign_tianjin_double_7_odd.json b/common/src/main/resources/assets/tjmetro/models/item/railway_sign_tianjin_double_7_odd.json new file mode 100644 index 0000000..0b84ed1 --- /dev/null +++ b/common/src/main/resources/assets/tjmetro/models/item/railway_sign_tianjin_double_7_odd.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "tjmetro:item/railway_sign_tianjin_double_7_odd" + } +} diff --git a/common/src/main/resources/assets/tjmetro/textures/item/railway_sign_tianjin_double_2_even.png b/common/src/main/resources/assets/tjmetro/textures/item/railway_sign_tianjin_double_2_even.png new file mode 100644 index 0000000000000000000000000000000000000000..f90c3c4900f6636131a197bdd7f0a2cf410f21dd GIT binary patch literal 2153 zcmb_dOKjXk7?RyqasmkfM~*#k;4OqAE)}!~4yaOZ9DqWKgpjzPN*v&V5Wn}~Zcv(*3d>&4jQ{`p zzyG!W>$U1L6XR3kf*?#REtZ$z{Z#rKJ_NrXxMz0Ybx*i>Iu?ZSuhM7C@wUDZgu9tr zUrkmk&ssF_a)bpo&vm^Jqy=I2L^mXKjVGeb8?IlHu3xw)i7qQiD@FxZ!g=0w7dIn* zYO`9Wn`_i$(uw2ZY}Wz+k0(UzdM!V;x+STHYr#4_mL;(#lB|`axzwPzTB(WiLBz#E zPC*o7EEdchDHb%vHlGkxtST}#;YJu+TEWta;^30NT*Mq}x%~9N80<`0Bst6=dyx}LLi~RW55TVRt8o6QO2ELdg5<6%oB?+kZeel8z){h5q zf{4jo63R*rr#|%r8O`LvcGT(_XH@1b?r}efK~~9R!)A~KaWl9HboP0d0f=p-lG)gk zi|1t~;$&eR+!zF8PwBY65psE%$3Z)yd|@4E9!tFmt@((PB#7!k&>Ci{Hl!@7S`Ldd zE3VIiPW;%20xy$13Rt9qEfMz{5T;#1n`daxMJ_ZNX^o<$tQa6tg)*l|8B#QzAVzfsSaAdCCROuT#9@>I8;xlQ7j%qB-k=EQ zRjL}4*gB>o+C7{;4S9dQKo7FC=%)NP26j*JGZ_Q1SK$_+Y3G(CnwBhQ(%{(LBfGa1 z$ANyQ$pLhqQtn%i11IT_h|e{k5^mWl^3BM{WPN|?7^`^&n>Nx&ks#C2^T@;oN4i2y z$8i)J>UQY*UeuN1NEhA-^+8x@llTn|b3m5v+?m_!vOde*&g}6&@&7r~E6sj|$^S0C z-nWrS0g3D#!T3p++2DgsHafWvaf)Ctw%5MM!%+QjsXSNje*fFmC&w>|_X)Mm^|L$M zNAE?4tooHn_5JhrUp)WupVN))*Jd7GxpqVlu8sX&1+{l3#g~>p|KYvqbEn51nE3LS zw=TmRTYpCVAkW;dTnK!*QO+bU7~cQCI=*DXU4l$)*i=p zvYQ|zRK%f$101+>L_MHL+-MO+>VXsVz=cNvap8pM1%(4j`MnP}L1|igVCA*P_V<6^ z_y6;c=kikRrHS!VYuK()k_SHp- zg^p1WaZ}YC2MBak*AXC4vK6MJi^AmekfFj88v9Y|i%`xONkeR;Wd*GEa|oiGHcSR} zf{LkK5~*4NXF2tNjOMs#BX0M^8C7|k2Ruv@z-l=*YKc@NEpZ>}{Ph6=sBN{HYaHq& z2y%%eo!^8s1_e13oz%A?t}gRLY{Zn$Z-UL!SvHY77ju$|xGqF{I8#eQ%d&11uzcpC zA2QKN&h87~6_WC@0<&f!Y{602v5QUD!Y|;Gi*X-X70max4nj3OgIbzv83&-yGmNC< zfnY{mPs9O%g#Catxf+E{Mb69U&WW~&K^WW_Jr~ugyBH=Z2`OK!loiOi;QP$AEUJ6h zYanLx2C|B#jvUL@kjaQ)6uIu{P99$obR(PDEWY36Oi0L6C+ZzD8faZ>J}vp6Vt4l z?8nq#msZ0#N4#KXb4((7nLda|d#- zM_od*wO3YX)^waHgU9|M^Yc)Z7{qs497vC7#=d$YytG4NKGTG`d|RbwiY${;!?Y=ki^J3pT0dlQJc{)}S!j!dO%7jjReAJe9&VlV zUH*^B^qREaVd}q|ulH`>w|>~kuz_U5eCvXneDmWW)G3Co?XN$T8f=RnFIHyi-S2<@ z;mh%N?e5*(t$ogy%v-R literal 0 HcmV?d00001 diff --git a/common/src/main/resources/assets/tjmetro/textures/item/railway_sign_tianjin_double_3_odd.png b/common/src/main/resources/assets/tjmetro/textures/item/railway_sign_tianjin_double_3_odd.png new file mode 100644 index 0000000000000000000000000000000000000000..33e409bb9e46b44a12a8ce2e6a0523fdf9999f1e GIT binary patch literal 2072 zcmcgtPl()99L|8->f%=Ev515eibXSdFaHyETBkd!JK(I#cA(pXFfT7}X2MSL(j>bx zvzOf#dJshFLGY{>ZBaalD2o@bf`@{lP>M$vt9ViHpufyyrn|D;)*c)($xHIR@B4m# zUf!E4%dgJOo|+W|VXnSZTZQY(`TxmdaK0H_xdWG{;-$-}Ak2Q9|4Z%g+HFBNekN$H zWowPsT*|{T@wvy!gD?iPAk3d1#DuQ1O!QbMh$_;rUw$QtfnSj>84c8k7g#q~+Dh2P zt>q@&TBnXLoj)he4_qJ!Sw_S`*o#tkP?1KwE{yZXiX@I8*?L8)=7Qo{V?|ux2@|a{ zmMKC=w45@rEe(6lOQMQYtRM#t86j7*T+J4Xp9FG=-*#7PuM}c%SCP6|7Q2el@Au1n zt;~~-f*l74R7F)~K*;GZ%E&;D($f=$8cS&s#96>2F=r$m-^eNwSRKa@##7oTE%F2z zQwAhfa2e$>jetI#;^K{@Hxl=$!g?%ZQI-N0PqA^AXFTol2T)I69}s}tHX2inL%oFI zR3gn5HzAB7A%~*V<}hZ;DogoBLfPUb*gTy_6T1ruBNn z&->}weG^!XWUL}V)pQvda5PoqBHcC6i^z5n8bcf058A_nP^{)qLv>Z{02F%0CmDGt z*r#rrCn14=gOGHX5=R|LoTkxT;60vzFu2o3E*cHD9;F$HD67{h62x2%0^hY6#u(|A zj0qz$wR9vCjcBrFBg?Wp19`}p%&&2}kykdKKkjm$Q{cF-su`AU=!PaUMySkm;B{PaNN+!D?#c&7!_+lu`kt(rsx4EdtKf3KKb zSDvs`A-)s}nHH<%0_hZ^UU2Te(9bLR(tt_gcr+$bj#dN#$n#Q=I~W$a7ul7m198-& zE}{9_t4K6&I_68ocWE&A|`9{D^0F z(9<*D-rN0q_`%yJ-v6+*w|%{L`FHWG9PaIYck1JtKY6!yOTur@-QAlJgdJS^xwZT5 zGp**%t?PHbIgb8%_K6$EV)M4pEeW4hh3#Icb2StGD2?{s)`^|(M}s3zCxw&SZ{2&o dF9Q-|#hbkp+5SQB(4+Js)RX$X`IGL-c3XRJ$Rsbx@B96J z-}ke+=Vt4RaGm1+$M?he^WfC4aCsu0J((g@`hoxV`Qhnn2o+xp zn#YAm6G zRaPVyV=P#9nN%!IY1yv`DpnO4+i*x2JDTNa6=C!fK`!xpXR-e3NDS_(VkgUDN0xiN zUb&~0S<;pj+XezvR#gcQQo0^xq%TG3;W0yKJGm;it&8i|;9p(_mIc=1V z>I4;&`y`f?GUhoAfS#M<;?<-(5cgb}c4gbgnQ0N(t zWaNQh&vks3gai@}Lei#k9JNIuFQZdqU6z0_xYGtM8VzSIN;49~fE}z;RDi@mrQcEK^cAhwka7 zWLugoDT=Oh8BI03v70xN02UhQZfE7LJnqWUeci;GXrtl?~#Ya!( z;nvB}<^Pz>ph<@vCjYzn2Jg0g>&Kl88welfTNm8qn;(s!P6=#nXD5C>58L9ox%zao zf8+O?S4x}00km-EufOkJbS4g5c yVYK;9;cR0t+UxX5Vd}>hKK<;cLkL~lzlA<5ZIQQsyZ$r}nVXrfUp)Tq>3;y$tBKYC literal 0 HcmV?d00001 diff --git a/common/src/main/resources/assets/tjmetro/textures/item/railway_sign_tianjin_double_4_odd.png b/common/src/main/resources/assets/tjmetro/textures/item/railway_sign_tianjin_double_4_odd.png new file mode 100644 index 0000000000000000000000000000000000000000..551c5953ccbc5189126ba6bcaf3fe83affd76c43 GIT binary patch literal 2083 zcmcgu%WoS+93B@DO4Js5;Q*?%Y()fu^^W&p?=EpmY6lVthmcxIDkQ{sX4YQCyR+Hd z#7?-NazcoQ_zRE_QdOiL$`J{Q)B}P@2IMd=MGOkJc$rGJU>@og8MV+d2j-*=e@Nb;dXyGcP2(?@^X3>T>tD9gzlU2 znk&gl<9UY)zet#9@nYW(0gce~$$m)aDo>;qZ+k&i9(?kdEP1RdFPjbA2y49K&22^e z^wvU?Zmm+A$tO=p(|rdBe4Y@g?{|aP=~v|;uLI-sYgLwpkYu$g&!mFVN@G!~iHJ*; zVo9MGW2s^niB-`{E&C}+!&*tjHXI7Zj$UzeOUgbn$VJR`mg>)DV(?UzJ4q5cs@m)I ziaot3qPAMHZ6MH8O;Z4&#G64v`brQVA2ZZ>Od~H$JP}AKBWa2Cq$-2eQ4D^V(*|*t zC&-xEC!ty@;xwiqkkK3$u1DRWIHM}>a-RoD4A@eR4Lc$caYx*OI{$f>0OYpO$Tjx# z;`_NooXl=O7+FI0M90m|kgH2P7V8n^vm0RZcp6RU)FMt25jBPAjw`h|wk&CS5lfFR zdjS)@_=z18c%3A?Dnr!_1)Fd*HSA!+G4Yewaxfl28-jW6=5A<7OQELjXxc6)^b8{j zxhP%MoY1^a#^X^hRt}3n3}1L=hp>YPb-_wA9Xns6gY0GVuHEG^ooKl7dQ+< zS6Y};#o(G=)=XV9%ek8uA`ccC>F#7rT`^#!jJbNr#tL`Ai@^=5v?^Lz;bm+xZtAv1 zc-qZ3mB%bI5MK<1jI-5pinOy)*E{iF=%>|mX}~0DG#U}9`zwL~@4*b4bkt$$zngFP+m3hrxRYT6Nr(B?1rPb=#{{d%Qx)(LMTN@ttdrAT%g^dIaWe z7apv!-K9JEa`qp@D~e?R literal 0 HcmV?d00001 diff --git a/common/src/main/resources/assets/tjmetro/textures/item/railway_sign_tianjin_double_5_even.png b/common/src/main/resources/assets/tjmetro/textures/item/railway_sign_tianjin_double_5_even.png new file mode 100644 index 0000000000000000000000000000000000000000..bf59f3d2087a276972d27ee606b75c26f5c37607 GIT binary patch literal 2081 zcmcgtOKjXk7U_+Fy)W9j@nencbwa2l& z*-d&`+7sfy1@*uw2yv+>T)1&SR2(=X#9KX-69?dc1U;a_?|n5vXIz(E^Z$`Y;e0LFxCxh|@xrUABu##v|0n$L@>h~{_}QSo znyuDecBu#pgb9xqx?v2~k~Dp`8xy+DGuh*fASx@ree$Uy2du1Iv}(8(&+%rku$}M= z+e>x2y-ppboSl)UyDk8PJR@>9Y(=TtEh~Lo7uNY>RgwE9*?L*2nS?sE6r_(8P zjDkoSs^&NVpsTu$zyhUPQAWBbN>7atsywAh5NCmiW*e-4-tv)%UDsSpcXJ+gfeRv9Fde z98;v({3e7kOvt|0X?-i^>IzRqJE44j6J(ysqlw+Qgp*7pbs<`#N-d8h%eqm(@^cr1 zh>1@6{4NJxB^fU(P&E@_3y!*uU2M7*egT(Uj0dJQ!2*A4uc@Zzrk3HF#vW7X8AdX4 zUt>mHUnC)cfP;`UxEedWbEh`XnAqbdj`HWk- z<{*ZNha75}h){zeujJ^KO*PN<2T_23RnT@`+1!87?eh6^o{g z9D@^NXg=Yl?v;F>kJP-91Tbi%wHq~8#Q?GBFw?XsN0vbuV%%iN;l(0y>=Ge9FY2aE z@@~G%JVL2Jd?^$%9Zt(R(ipBq1lx!X> z-S??!Gs8d(3Xe?7B*@c>4suGiu5s*h+k@5|Xxb}%pW%2I=|gPVBvFIImt0jIK9~oa zlm9)Kev=M5O#OHB_22FK){i-S2<- zL3^wxAD3n~@BDr9+Iv@yezEiZ`7f^@dunIu^{+3zWxQ5>`_1)Vr=(uH_t9Z+yYt8s zSAGg-dS|2)FLh5pGy4a^?>xTtjea{ja`op!lJxD#wVjQLW$)MrS3mpsI+p&N$oF7L tescD^{^G#XX{r8~wteZx328R$9lCYncICv4<96<{IKNc=@Z8$ve*h~Sis=9V literal 0 HcmV?d00001 diff --git a/common/src/main/resources/assets/tjmetro/textures/item/railway_sign_tianjin_double_5_odd.png b/common/src/main/resources/assets/tjmetro/textures/item/railway_sign_tianjin_double_5_odd.png new file mode 100644 index 0000000000000000000000000000000000000000..22b48213dd2a4d171ebb62b907bb2bfbf12d2f69 GIT binary patch literal 2077 zcmcgtO^Do79FNqkcD3xq!=e;JT12s#ynIZ)*tBkEw(h92uG@i*C;Rf=%S_x!UYcZf zX7?ggFWx+Q@gzOiicl#iRIvv=c=sSJl!73F*!3<{|Cz~5cV)Y+3Wj{Vy!`*a-|zqN z^4?!vdHL|{)3bsg9BwSv*Wme5aXo$z?w7*zx8QLoS$;DUgxPP4>yaS3@Pi;c_FUL% z=k4ZeF5yuHQ|`0MFiOB$5Ef1j6HL}wF8Zt!#-6l&?Hfr9sVAMSHc>OFv2M7$m9jHi zD=o6MP8=$oJRvR&T>yw!j>Tcri!*oVNh4er#>KQEi6fJI-IEpzLb2Uk6>B_YqE%64 zf)Eldr-E%uSAFNWs3A>NkOQZTkgHp+Zj0q10bNQ1cddT9B!f3k>gIXkD#~Cms0{Q9 zPdke0H~^q2nkIvVoNdNA9?Efcbb?T48A-z=4|yyWh}h@-+>=1+IEE;h!p2#dC&-vG z#EGI-P!ZF}kdmog(ocIMa!M4|V-bt<3~be@ZPMjA&$|3R(9_Sm2q3r3=9FVkEm1V3 z$nvEP2%}8Mp4M4wGhxaa%XmK}Y-s~z9xb9t+*-y-B53Cz3@?uORXHvtdm6 zAbVkl1FPelc@k93kWm%RmWEtpxK;EbvR#D6rcF-6U~{*rsuiYH!&U8FrqDAK=lFrf zl(+#;BMbqD5$-T0i93=wO`}`mJ)QzFsMAL(noYM6XE}}uYt%gnVy=WCb#>%0!?Xig z_p6%h6T_5k!l>*}%`q9WNMNcH|2ilAqOyhmxXURgfN_u24|IdtmMJq7s4`|oAp4rC z$yJA$Ce?jH19O7*dK$t)!@ZrTg(?b&lo%+`kS$}ZG8q{Lm9d5_*|M3YVrCOcw4$5u zF;7qyA-)U>nU$;M6z-IxUU=f4z%MAp(f}uMJQ@Qj`!fOo=_U80Z!Rs2Wt7iW>@YfKEoUPOV>4O z8oH^Cs(BZ5X?iZld;PG zF_=-4jyp{Gd-ILH?fBPEIvF;QVmRHp;AOh`u^94{!q#^8;D-&^7C&m#7hA&{zui=4 zuZvI4tPZx{xpno(wWluDF8?{Bee&+ycjAq$?S63i(wATT4EyeI?)N^p-F{1`&VT%q z@aZhN^4_z5%w0Xue)|dG$0O%9zCR!c;;-|Me(?EB@aoOz6)fC=891)530Dq{M*H24 k3CHfvf9>4?kY{cSU!4BsjrPjL^x$Ytv@CS=gX@S#2Y_T%hBbNn$qkcx`8s z>;bBBpgnTn!nGAh6@TJ_P!AlaIC0eJ*j#F?!n2-U_s_!plDBak9uI^|uf&p6xRPEoZU5|dlC=Mb z*IG-~oD((`evvTY^5W1B0WC>$$A%%H>pYQN-tmH(^4sMv71?7o<&^1QCtToNZ)q#y zC%2YcbZebfnR4u?JU6s~z~>2(hkh@J?O{zB^V%>@U#p5dh9v7XWj=K%uQ@C7f{3_m z6*WXL#vJ?jqKLnt3aTux{d&W;!%*0AqwKdQ-%hQY2<~8CjvQTB(CTuH3g(jV(`P9Hi)x4 zLB`Y}3019#)0oCUMsr-)k9uS0jHnv5iZ%iJ!$48{-Mo5zK3kc0x5hg_;1hc0i$K7)i(- z!Hn8%5%~lH_I%ReY8Z4BIZva#AbKJK$Dqy_t8g5<8N>+*C~r1u3dCIWJZ59da!rjG z2r7^v%Pmz9p)N-i%Bx!0=;`1F?%R3gkdOPtk+1y(? z*DQ+?LJ?zT88HKjp@J;~5w~1zTbL8Q3Jo&Rv{U*n&2cZ%Gj7@?L5IViTvhHpn7iwf z|2>#-kxnX1{de(=zis>1Pb(QVkaU=DT`B&wc_Wryo_QE`|9E%*r-iy8*WS4Amzk|Mw*Ywc@C^iTm3mLnk$%zFHOkZqG@Q63I#-8_^ zE7?l@oK2&kLfptUW3tI`h zu(i~rTdUM^g;OW_>7ES)0m}&A3p!zH_o_ml*M@f9Eed=elC4&S*<6rcsW5_pMX7@GnEF7M7Pxpl>GZ{2DzXj>SeT`Nl?rU!jLKE&45^Z5s2WkRB^Tps5naz`HXlEzayO#DaZlB9RnuUaf^*@d(0uJx1)3KfbA@5If57}aP$q`syKM%fM-<~gJ&nAqOA4

c1Xx+vc|aTK!||R*9R@cP7uib7EWh{rj6acyWHI_W9{IF8u>VV}^PF literal 0 HcmV?d00001 diff --git a/common/src/main/resources/assets/tjmetro/textures/item/railway_sign_tianjin_double_7_even.png b/common/src/main/resources/assets/tjmetro/textures/item/railway_sign_tianjin_double_7_even.png new file mode 100644 index 0000000000000000000000000000000000000000..ed007305dc4fd070f707f6329ee14569d68a14d2 GIT binary patch literal 2082 zcmcgtU5ngQ7|v?DwyP^x1dI3)Qjjj1$;rn|CSlV$-C5lcXWecGx}w;goO3c0c9N4O z*`3+BaV>}+D5yU`L?~!MX+gZOQg3=^1uuFbir#p=UGKaQsc&X7(_PtaYcCu!$w~6Q z&-1)rIqxjYKR-F~=!75$leM|(B3z%%{`J-jXO9(0?3<*^j#SAA#ija!IKyKm zngvxR2qDq53b<_Qs%t$XYDiNRWWgaLWb3A_m&N=i0bNWzd$IalP6l_5)JoIHR+LVs zQ|Rag9yb-$vH(C+G))EzIav!++?B)R&=8@@5)%7S>hn;{5V6ZwQbz)*gBXHn1RExK zo*-jN7e|U(Kv_(ELrO+=(MsIzlT)IwHVasoCSa?MY@-%WdD7yyfF8ZxMgY03*GC*X zY6*f7MUu|0LKt~McC=0!YY|fxS;ALh!e&=N=AkT_$exKAPI=tmygjVc!celP=>;Sn zKIw;)cao_s4y=k(=15RALq%@lfu z;uPQ3m=fFLaeyIUKfq0#S4C?g0ihA9yg-MD-!fI7Vf|v`wPi+%1 z&p@;&vm!HPof%lhh-k7$iEChHc~o_W{#8y^vdU)ugD$6>0LD#LSErs)GE`Z`B_?|Y ztSr|gvZ1rGXAxwYv@}F}DfVH|aC<9iriuchi>S^JHDr?_m=fJ6%a#UUuB&-vRl{yc z)3R>9$vi}PASPg)b-5G%Z@;v8f3f6Mo6YR`L zf!Oa+8ACq7DAq4*xD|>b*=~7;-|H0rP2L) zarE$-L&0q77__B(Ke{dZ71V#Vm9`;wzJ9Z z0Y$wbA&#gL9E!Lg4i$n62%#2)=pAu@QhEb%L2ZRZIRVd!hQ_Q_d};|?_HwPm=T$j^Nb!T4ct<{Dfcj_a?c95?%Qem>xbXTRgPnL|Nq zC0lV{atI46*kf&48HO=fbKKnVVT{Qd&Gb>*o#tUSQW;&4$Sk%lE9BmvbCx(pA+&cZj)bN3FXa- zEE0qeZ`u`XnX25jpXU{%$P%*Q5D{`z(@`zH_z6Ilc)qh-d!ZnMyQ$h1Pd|Uh%!7Bqx9eup+-}Z1aTIyh|dvmoAtA*08%G0gmDQQrA3|~ zW6}`El3YP~Ok+cjly-4H>5a)fBGDcVX_Td4E0?x$mt`#NvO7SRueT9EZe6$J*ilOu zmK15WxDH_y3E9y)ZEeISQJ%=m@p^2%>yujbsZYnFesctxmvCR}}#={xD ztFcEMpCuuNfP)Zss1!#XfiKhOEU+F+fEd)NV->FJG@>-a5uuG*Re+c)LEt%<7=}!Y zwrHEaC;F;piWad9(U!4IDKczq+Ef1;BmI13bN@+|dyD|aZB_-f+p4OzMdX{Bs8bDz zwk4Y)^^l_Lgd*Lrrf4rG0c=A_qUe+oMb$I{r8&{GUHT52<9?(U*rbc24uvndB;0>6_qI>| z_h80FI;k+}-^Dk6x8++utz>8*`Lt|Za8ouv8bO{CXl-Hr?Vq46zSF49w}w}K`|-=! z5x<{nUjOUwTNj+o!|$K}<=W~qk6%5y|IzS^Ti<`OSo>`5H3n^T=1&LQZb+kZZ~oBd zKHl?gZ}`N;qfejs1^J#^O@#!pYUM{{YN7hqM3y literal 0 HcmV?d00001