From 3a0552c56edb192f76d2a01f8ebc8218c0c00d83 Mon Sep 17 00:00:00 2001 From: Masakitenchi Date: Fri, 28 Aug 2020 17:49:11 +0900 Subject: [PATCH 1/9] Update zh_cn.json (#4653) --- .../appliedenergistics2/lang/zh_cn.json | 264 +++++++++--------- 1 file changed, 132 insertions(+), 132 deletions(-) diff --git a/src/main/resources/assets/appliedenergistics2/lang/zh_cn.json b/src/main/resources/assets/appliedenergistics2/lang/zh_cn.json index ce50ff308..3fe39514d 100644 --- a/src/main/resources/assets/appliedenergistics2/lang/zh_cn.json +++ b/src/main/resources/assets/appliedenergistics2/lang/zh_cn.json @@ -58,7 +58,7 @@ "block.appliedenergistics2.chest": "ME箱子", "block.appliedenergistics2.chiseled_quartz_block": "錾制赛特斯石英块", "block.appliedenergistics2.chiseled_quartz_slab": "錾制赛特斯石英台阶", - "block.appliedenergistics2.chiseled_quartz_stairs": "竖纹赛特斯石英楼梯", + "block.appliedenergistics2.chiseled_quartz_stairs": "錾制赛特斯石英楼梯", "block.appliedenergistics2.condenser": "物质聚合器", "block.appliedenergistics2.controller": "ME控制器", "block.appliedenergistics2.crafting_accelerator": "并行处理单元", @@ -77,7 +77,7 @@ "block.appliedenergistics2.fluid_interface": "ME流体接口", "block.appliedenergistics2.fluix_block": "福鲁伊克斯块", "block.appliedenergistics2.fluix_slab": "福鲁伊克斯台阶", - "block.appliedenergistics2.fluix_stairs": "錾制赛特斯石英楼梯", + "block.appliedenergistics2.fluix_stairs": "福鲁伊克斯楼梯", "block.appliedenergistics2.grindstone": "石英磨具", "block.appliedenergistics2.inscriber": "压印器", "block.appliedenergistics2.interface": "ME接口", @@ -92,11 +92,11 @@ "block.appliedenergistics2.quartz_glass": "石英玻璃", "block.appliedenergistics2.quartz_growth_accelerator": "晶体催生器", "block.appliedenergistics2.quartz_ore": "赛特斯石英矿石", - "block.appliedenergistics2.quartz_pillar": "赛特斯竖纹石英块", + "block.appliedenergistics2.quartz_pillar": "竖纹赛特斯石英块", "block.appliedenergistics2.quartz_pillar_slab": "竖纹赛特斯石英台阶", - "block.appliedenergistics2.quartz_pillar_stairs": "赛特斯石英楼梯", + "block.appliedenergistics2.quartz_pillar_stairs": "竖纹赛特斯石英楼梯", "block.appliedenergistics2.quartz_slab": "赛特斯石英台阶", - "block.appliedenergistics2.quartz_stairs": "福鲁伊克斯楼梯", + "block.appliedenergistics2.quartz_stairs": "赛特斯石英楼梯", "block.appliedenergistics2.quartz_vibrant_glass": "聚能石英玻璃", "block.appliedenergistics2.security_station": "ME安全终端", "block.appliedenergistics2.sky_compass": "陨石罗盘", @@ -408,28 +408,28 @@ "item.appliedenergistics2.annihilation_plane": "ME破坏面板", "item.appliedenergistics2.basic_card": "基础卡", "item.appliedenergistics2.biometric_card": "身份卡", - "item.appliedenergistics2.black_covered_cable": "黑色 ME包层线缆", - "item.appliedenergistics2.black_covered_dense_cable": "黑色 ME致密包层线缆", - "item.appliedenergistics2.black_glass_cable": "黑色 ME玻璃线缆", - "item.appliedenergistics2.black_lumen_paint_ball": "黑色 光通 染色球", - "item.appliedenergistics2.black_paint_ball": "黑色 染色球", - "item.appliedenergistics2.black_smart_cable": "黑色 ME智能线缆", - "item.appliedenergistics2.black_smart_dense_cable": "黑色 ME致密线缆", + "item.appliedenergistics2.black_covered_cable": "ME包层线缆(黑色)", + "item.appliedenergistics2.black_covered_dense_cable": "ME致密包层线缆(黑色)", + "item.appliedenergistics2.black_glass_cable": "ME玻璃线缆(黑色)", + "item.appliedenergistics2.black_lumen_paint_ball": "光通染色球(黑色)", + "item.appliedenergistics2.black_paint_ball": "染色球(黑色)", + "item.appliedenergistics2.black_smart_cable": "ME智能线缆(黑色)", + "item.appliedenergistics2.black_smart_dense_cable": "ME致密线缆(黑色)", "item.appliedenergistics2.blank_pattern": "空白样板", - "item.appliedenergistics2.blue_covered_cable": "蓝色 ME包层线缆", - "item.appliedenergistics2.blue_covered_dense_cable": "蓝色 ME致密包层线缆", - "item.appliedenergistics2.blue_glass_cable": "蓝色 ME玻璃线缆", - "item.appliedenergistics2.blue_lumen_paint_ball": "蓝色 光通 染色球", - "item.appliedenergistics2.blue_paint_ball": "蓝色 染色球", - "item.appliedenergistics2.blue_smart_cable": "蓝色 ME智能线缆", - "item.appliedenergistics2.blue_smart_dense_cable": "蓝色 ME致密线缆", - "item.appliedenergistics2.brown_covered_cable": "棕色 ME包层线缆", - "item.appliedenergistics2.brown_covered_dense_cable": "棕色 ME致密包层线缆", - "item.appliedenergistics2.brown_glass_cable": "棕色 ME玻璃线缆", - "item.appliedenergistics2.brown_lumen_paint_ball": "棕色 光通 染色球", - "item.appliedenergistics2.brown_paint_ball": "棕色 染色球", - "item.appliedenergistics2.brown_smart_cable": "棕色 ME智能线缆", - "item.appliedenergistics2.brown_smart_dense_cable": "棕色 ME致密线缆", + "item.appliedenergistics2.blue_covered_cable": "ME包层线缆(蓝色)", + "item.appliedenergistics2.blue_covered_dense_cable": "ME致密包层线缆(蓝色)", + "item.appliedenergistics2.blue_glass_cable": "ME玻璃线缆(蓝色)", + "item.appliedenergistics2.blue_lumen_paint_ball": "光通染色球(蓝色)", + "item.appliedenergistics2.blue_paint_ball": "染色球(蓝色)", + "item.appliedenergistics2.blue_smart_cable": "ME智能线缆(蓝色)", + "item.appliedenergistics2.blue_smart_dense_cable": "ME致密线缆(蓝色)", + "item.appliedenergistics2.brown_covered_cable": "ME包层线缆(棕色)", + "item.appliedenergistics2.brown_covered_dense_cable": "棕色 ME致密包层线缆(棕色)", + "item.appliedenergistics2.brown_glass_cable": "ME玻璃线缆(棕色)", + "item.appliedenergistics2.brown_lumen_paint_ball": "光通染色球(棕色)", + "item.appliedenergistics2.brown_paint_ball": "染色球(棕色)", + "item.appliedenergistics2.brown_smart_cable": "ME智能线缆(棕色)", + "item.appliedenergistics2.brown_smart_dense_cable": "ME致密线缆(棕色)", "item.appliedenergistics2.cable_anchor": "线缆锚", "item.appliedenergistics2.cable_fluid_interface": "ME流体接口", "item.appliedenergistics2.cable_interface": "ME接口", @@ -459,13 +459,13 @@ "item.appliedenergistics2.crafting_monitor": "ME合成监控器", "item.appliedenergistics2.crafting_terminal": "ME合成终端", "item.appliedenergistics2.creative_storage_cell": "创造型ME存储元件", - "item.appliedenergistics2.cyan_covered_cable": "青色 ME包层线缆", - "item.appliedenergistics2.cyan_covered_dense_cable": "青色 ME致密包层线缆", - "item.appliedenergistics2.cyan_glass_cable": "青色 ME玻璃线缆", - "item.appliedenergistics2.cyan_lumen_paint_ball": "青色 光通 染色球", - "item.appliedenergistics2.cyan_paint_ball": "青色 染色球", - "item.appliedenergistics2.cyan_smart_cable": "青色 ME智能线缆", - "item.appliedenergistics2.cyan_smart_dense_cable": "青色 ME致密线缆", + "item.appliedenergistics2.cyan_covered_cable": "ME包层线缆(青色)", + "item.appliedenergistics2.cyan_covered_dense_cable": "ME致密包层线缆(青色)", + "item.appliedenergistics2.cyan_glass_cable": "ME玻璃线缆(青色)", + "item.appliedenergistics2.cyan_lumen_paint_ball": "光通染色球(青色)", + "item.appliedenergistics2.cyan_paint_ball": "染色球(青色)", + "item.appliedenergistics2.cyan_smart_cable": "ME智能线缆(青色)", + "item.appliedenergistics2.cyan_smart_dense_cable": "ME致密线缆(青色)", "item.appliedenergistics2.dark_monitor": "暗色照明面板", "item.appliedenergistics2.debug_card": "Dev.调试卡", "item.appliedenergistics2.debug_replicator_card": "Dev.复制卡", @@ -478,7 +478,7 @@ "item.appliedenergistics2.entropy_manipulator": "熵变机械臂", "item.appliedenergistics2.export_bus": "ME输出总线", "item.appliedenergistics2.facade": "线缆伪装板", - "item.appliedenergistics2.fe_p2p_tunnel": "FE P2P通道", + "item.appliedenergistics2.fe_p2p_tunnel": "P2P通道-FE", "item.appliedenergistics2.flour": "面粉", "item.appliedenergistics2.fluid_annihilation_plane": "ME流体破坏面板", "item.appliedenergistics2.16k_fluid_cell_component": "16k-ME流体存储组件", @@ -489,43 +489,43 @@ "item.appliedenergistics2.fluid_formation_plane": "ME流体成型面板", "item.appliedenergistics2.fluid_import_bus": "ME流体输入总线", "item.appliedenergistics2.fluid_level_emitter": "ME流体标准发信器", - "item.appliedenergistics2.fluid_p2p_tunnel": "流体 P2P通道", - "item.appliedenergistics2.fluid_storage_bus": "ME流体储存总线", + "item.appliedenergistics2.fluid_p2p_tunnel": "P2P通道-流体", + "item.appliedenergistics2.fluid_storage_bus": "ME流体存储总线", "item.appliedenergistics2.16k_fluid_storage_cell": "16k-ME流体储存元件", "item.appliedenergistics2.1k_fluid_storage_cell": "1k-ME流体储存元件", "item.appliedenergistics2.4k_fluid_storage_cell": "4k-ME流体储存元件", "item.appliedenergistics2.64k_fluid_storage_cell": "64k-ME流体储存元件", "item.appliedenergistics2.fluid_terminal": "ME流体终端", - "item.appliedenergistics2.fluix_covered_cable": "Fluix默认色 ME包层线缆", - "item.appliedenergistics2.fluix_covered_dense_cable": "Fluix默认色 ME致密包层线缆", + "item.appliedenergistics2.fluix_covered_cable": "ME包层线缆(Fluix默认色)", + "item.appliedenergistics2.fluix_covered_dense_cable": "ME致密包层线缆(Fluix默认色)", "item.appliedenergistics2.fluix_crystal": "福鲁伊克斯水晶", "item.appliedenergistics2.fluix_crystal_seed": "福鲁伊克斯种子", "item.appliedenergistics2.fluix_dust": "福鲁伊克斯粉", - "item.appliedenergistics2.fluix_glass_cable": "Fluix默认色 ME玻璃线缆", - "item.appliedenergistics2.fluix_lumen_paint_ball": "Fluix默认色 光通 染色球", - "item.appliedenergistics2.fluix_paint_ball": "Fluix默认色 染色球", + "item.appliedenergistics2.fluix_glass_cable": "ME玻璃线缆(Fluix默认色)", + "item.appliedenergistics2.fluix_lumen_paint_ball": "光通染色球(Fluix默认色)", + "item.appliedenergistics2.fluix_paint_ball": "色球(Fluix默认色)", "item.appliedenergistics2.fluix_pearl": "福鲁伊克斯珍珠", - "item.appliedenergistics2.fluix_smart_cable": "Fluix默认色 ME智能线缆", - "item.appliedenergistics2.fluix_smart_dense_cable": "Fluix默认色 ME致密线缆", + "item.appliedenergistics2.fluix_smart_cable": "ME智能线缆(Fluix默认色)", + "item.appliedenergistics2.fluix_smart_dense_cable": "ME致密线缆(Fluix默认色)", "item.appliedenergistics2.formation_core": "成型核心", "item.appliedenergistics2.formation_plane": "ME成型面板", "item.appliedenergistics2.fuzzy_card": "模糊卡", "item.appliedenergistics2.gold_dust": "金粉", - "item.appliedenergistics2.gray_covered_cable": "灰色 ME包层线缆", - "item.appliedenergistics2.gray_covered_dense_cable": "灰色 ME致密包层线缆", - "item.appliedenergistics2.gray_glass_cable": "灰色 ME玻璃线缆", - "item.appliedenergistics2.gray_lumen_paint_ball": "灰色 光通 染色球", - "item.appliedenergistics2.gray_paint_ball": "灰色 染色球", - "item.appliedenergistics2.gray_smart_cable": "灰色 ME智能线缆", - "item.appliedenergistics2.gray_smart_dense_cable": "灰色 ME致密线缆", - "item.appliedenergistics2.green_covered_cable": "绿色 ME包层线缆", - "item.appliedenergistics2.green_covered_dense_cable": "绿色 ME致密包层线缆", - "item.appliedenergistics2.green_glass_cable": "绿色 ME玻璃线缆", - "item.appliedenergistics2.green_lumen_paint_ball": "绿色 光通 染色球", - "item.appliedenergistics2.green_paint_ball": "绿色 染色球", - "item.appliedenergistics2.green_smart_cable": "绿色 ME智能线缆", - "item.appliedenergistics2.green_smart_dense_cable": "绿色 ME致密线缆", - "item.appliedenergistics2.ic2_p2p_tunnel": "EU P2P通道", + "item.appliedenergistics2.gray_covered_cable": "ME包层线缆(灰色)", + "item.appliedenergistics2.gray_covered_dense_cable": "ME致密包层线缆(灰色)", + "item.appliedenergistics2.gray_glass_cable": "ME玻璃线缆(灰色)", + "item.appliedenergistics2.gray_lumen_paint_ball": "光通染色球(灰色)", + "item.appliedenergistics2.gray_paint_ball": "染色球(灰色)", + "item.appliedenergistics2.gray_smart_cable": "ME智能线缆(灰色)", + "item.appliedenergistics2.gray_smart_dense_cable": "ME致密线缆(灰色)", + "item.appliedenergistics2.green_covered_cable": "ME包层线缆(绿色)", + "item.appliedenergistics2.green_covered_dense_cable": "ME致密包层线缆(绿色)", + "item.appliedenergistics2.green_glass_cable": "ME玻璃线缆(绿色)", + "item.appliedenergistics2.green_lumen_paint_ball": "光通染色球(绿色)", + "item.appliedenergistics2.green_paint_ball": "染色球(绿色)", + "item.appliedenergistics2.green_smart_cable": "ME智能线缆(绿色)", + "item.appliedenergistics2.green_smart_dense_cable": "ME致密线缆(绿色)", + "item.appliedenergistics2.ic2_p2p_tunnel": "P2P通道-EU", "item.appliedenergistics2.identity_annihilation_plane": "ME精准破坏面板", "item.appliedenergistics2.import_bus": "ME输入总线", "item.appliedenergistics2.interface_terminal": "ME接口终端", @@ -533,44 +533,44 @@ "item.appliedenergistics2.inverted_toggle_bus": "ME反相触发总线", "item.appliedenergistics2.inverter_card": "反相卡", "item.appliedenergistics2.iron_dust": "铁粉", - "item.appliedenergistics2.item_p2p_tunnel": "物品 P2P通道", + "item.appliedenergistics2.item_p2p_tunnel": "P2P通道-物品", "item.appliedenergistics2.level_emitter": "ME标准发信器", - "item.appliedenergistics2.light_blue_covered_cable": "浅蓝色 ME包层线缆", - "item.appliedenergistics2.light_blue_covered_dense_cable": "浅蓝色 ME致密包层线缆", - "item.appliedenergistics2.light_blue_glass_cable": "浅蓝色 ME玻璃线缆", - "item.appliedenergistics2.light_blue_lumen_paint_ball": "浅蓝色 光通 染色球", - "item.appliedenergistics2.light_blue_paint_ball": "浅蓝色 染色球", - "item.appliedenergistics2.light_blue_smart_cable": "浅蓝色 ME智能线缆", - "item.appliedenergistics2.light_blue_smart_dense_cable": "浅蓝色 ME致密线缆", - "item.appliedenergistics2.light_gray_covered_cable": "浅灰色 ME包层线缆", - "item.appliedenergistics2.light_gray_covered_dense_cable": "浅灰色 ME致密包层线缆", - "item.appliedenergistics2.light_gray_glass_cable": "浅灰色 ME玻璃线缆", - "item.appliedenergistics2.light_gray_lumen_paint_ball": "浅灰色 光通 染色球", - "item.appliedenergistics2.light_gray_paint_ball": "浅灰色 染色球", - "item.appliedenergistics2.light_gray_smart_cable": "浅灰色 ME智能线缆", - "item.appliedenergistics2.light_gray_smart_dense_cable": "浅灰色 ME致密线缆", - "item.appliedenergistics2.light_p2p_tunnel": "光 P2P通道", - "item.appliedenergistics2.lime_covered_cable": "柠檬色 ME包层线缆", - "item.appliedenergistics2.lime_covered_dense_cable": "柠檬色 ME致密包层线缆", - "item.appliedenergistics2.lime_glass_cable": "柠檬色 ME玻璃线缆", - "item.appliedenergistics2.lime_lumen_paint_ball": "柠檬色 光通 染色球", - "item.appliedenergistics2.lime_paint_ball": "柠檬色 染色球", - "item.appliedenergistics2.lime_smart_cable": "柠檬色 ME智能线缆", - "item.appliedenergistics2.lime_smart_dense_cable": "柠檬色 ME致密线缆", + "item.appliedenergistics2.light_blue_covered_cable": "ME包层线缆(浅蓝色)", + "item.appliedenergistics2.light_blue_covered_dense_cable": "ME致密包层线缆(浅蓝色)", + "item.appliedenergistics2.light_blue_glass_cable": "ME玻璃线缆(浅蓝色)", + "item.appliedenergistics2.light_blue_lumen_paint_ball": "光通染色球(浅蓝色)", + "item.appliedenergistics2.light_blue_paint_ball": "染色球(浅蓝色)", + "item.appliedenergistics2.light_blue_smart_cable": "ME智能线缆(浅蓝色)", + "item.appliedenergistics2.light_blue_smart_dense_cable": "ME致密线缆(浅蓝色)", + "item.appliedenergistics2.light_gray_covered_cable": "ME包层线缆(浅灰色)", + "item.appliedenergistics2.light_gray_covered_dense_cable": "ME致密包层线缆(浅灰色)", + "item.appliedenergistics2.light_gray_glass_cable": "ME玻璃线缆(浅灰色)", + "item.appliedenergistics2.light_gray_lumen_paint_ball": "光通染色球(浅灰色)", + "item.appliedenergistics2.light_gray_paint_ball": "染色球(浅灰色)", + "item.appliedenergistics2.light_gray_smart_cable": "ME智能线缆(浅灰色)", + "item.appliedenergistics2.light_gray_smart_dense_cable": "ME致密线缆(浅灰色)", + "item.appliedenergistics2.light_p2p_tunnel": "P2P通道-光", + "item.appliedenergistics2.lime_covered_cable": "ME包层线缆(柠檬色)", + "item.appliedenergistics2.lime_covered_dense_cable": "ME致密包层线缆(柠檬色)", + "item.appliedenergistics2.lime_glass_cable": "ME玻璃线缆(柠檬色)", + "item.appliedenergistics2.lime_lumen_paint_ball": "光通染色球(柠檬色)", + "item.appliedenergistics2.lime_paint_ball": "染色球(柠檬色)", + "item.appliedenergistics2.lime_smart_cable": "ME智能线缆(柠檬色)", + "item.appliedenergistics2.lime_smart_dense_cable": "ME致密线缆(柠檬色)", "item.appliedenergistics2.logic_processor": "逻辑处理器", "item.appliedenergistics2.logic_processor_asm": "半成品-逻辑处理器", "item.appliedenergistics2.logic_processor_press": "逻辑压印模板", "item.appliedenergistics2.printed_logic_processor": "逻辑电路板", - "item.appliedenergistics2.magenta_covered_cable": "品红色 ME包层线缆", - "item.appliedenergistics2.magenta_covered_dense_cable": "品红色 ME致密包层线缆", - "item.appliedenergistics2.magenta_glass_cable": "品红色 ME玻璃线缆", - "item.appliedenergistics2.magenta_lumen_paint_ball": "品红色 光通 染色球", - "item.appliedenergistics2.magenta_paint_ball": "品红色 染色球", - "item.appliedenergistics2.magenta_smart_cable": "品红色 ME智能线缆", - "item.appliedenergistics2.magenta_smart_dense_cable": "品红色 ME致密线缆", + "item.appliedenergistics2.magenta_covered_cable": "ME包层线缆(品红色)", + "item.appliedenergistics2.magenta_covered_dense_cable": "ME致密包层线缆(品红色)", + "item.appliedenergistics2.magenta_glass_cable": "ME玻璃线缆(品红色)", + "item.appliedenergistics2.magenta_lumen_paint_ball": "光通染色球(品红色)", + "item.appliedenergistics2.magenta_paint_ball": "染色球(品红色)", + "item.appliedenergistics2.magenta_smart_cable": "ME智能线缆(品红色)", + "item.appliedenergistics2.magenta_smart_dense_cable": "ME致密线缆(品红色)", "item.appliedenergistics2.matter_ball": "物质球", "item.appliedenergistics2.matter_cannon": "物质炮", - "item.appliedenergistics2.me_p2p_tunnel": "ME P2P通道", + "item.appliedenergistics2.me_p2p_tunnel": "P2P通道-ME", "item.appliedenergistics2.memory_card": "内存卡", "item.appliedenergistics2.monitor": "亮色照明面板", "item.appliedenergistics2.name_press": "名称压印模板", @@ -584,43 +584,43 @@ "item.appliedenergistics2.nether_quartz_sword": "下界石英剑", "item.appliedenergistics2.nether_quartz_wrench": "下界石英扳手", "item.appliedenergistics2.network_tool": "网络工具", - "item.appliedenergistics2.orange_covered_cable": "橙色 ME包层线缆", - "item.appliedenergistics2.orange_covered_dense_cable": "橙色 ME致密包层线缆", - "item.appliedenergistics2.orange_glass_cable": "橙色 ME玻璃线缆", - "item.appliedenergistics2.orange_lumen_paint_ball": "橙色 光通 染色球", - "item.appliedenergistics2.orange_paint_ball": "橙色 染色球", - "item.appliedenergistics2.orange_smart_cable": "橙色 ME智能线缆", - "item.appliedenergistics2.orange_smart_dense_cable": "橙色 ME致密线缆", + "item.appliedenergistics2.orange_covered_cable": "ME包层线缆(橙色)", + "item.appliedenergistics2.orange_covered_dense_cable": "ME致密包层线缆(橙色)", + "item.appliedenergistics2.orange_glass_cable": "ME玻璃线缆(橙色)", + "item.appliedenergistics2.orange_lumen_paint_ball": "光通染色球(橙色)", + "item.appliedenergistics2.orange_paint_ball": "染色球(橙色)", + "item.appliedenergistics2.orange_smart_cable": "ME智能线缆(橙色)", + "item.appliedenergistics2.orange_smart_dense_cable": "ME致密线缆(橙色)", "item.appliedenergistics2.pattern_terminal": "ME样板终端", - "item.appliedenergistics2.pink_covered_cable": "粉色 ME包层线缆", - "item.appliedenergistics2.pink_covered_dense_cable": "粉色 ME致密包层线缆", - "item.appliedenergistics2.pink_glass_cable": "粉色 ME玻璃线缆", - "item.appliedenergistics2.pink_lumen_paint_ball": "粉色 光通 染色球", - "item.appliedenergistics2.pink_paint_ball": "粉色 染色球", - "item.appliedenergistics2.pink_smart_cable": "粉色 ME智能线缆", - "item.appliedenergistics2.pink_smart_dense_cable": "粉色 ME致密线缆", + "item.appliedenergistics2.pink_covered_cable": "ME包层线缆(粉色)", + "item.appliedenergistics2.pink_covered_dense_cable": "ME致密包层线缆(粉色)", + "item.appliedenergistics2.pink_glass_cable": "ME玻璃线缆(粉色)", + "item.appliedenergistics2.pink_lumen_paint_ball": "光通染色球(粉色)", + "item.appliedenergistics2.pink_paint_ball": "染色球(粉色)", + "item.appliedenergistics2.pink_smart_cable": "ME智能线缆(粉色)", + "item.appliedenergistics2.pink_smart_dense_cable": "ME致密线缆(粉色)", "item.appliedenergistics2.portable_cell": "便携元件", "item.appliedenergistics2.purified_certus_quartz_crystal": "高纯赛特斯石英水晶", "item.appliedenergistics2.purified_fluix_crystal": "高纯福鲁伊克斯水晶", "item.appliedenergistics2.purified_nether_quartz_crystal": "高纯下界石英水晶", - "item.appliedenergistics2.purple_covered_cable": "紫色 ME包层线缆", - "item.appliedenergistics2.purple_covered_dense_cable": "紫色 ME致密包层线缆", - "item.appliedenergistics2.purple_glass_cable": "紫色 ME玻璃线缆", - "item.appliedenergistics2.purple_lumen_paint_ball": "紫色 光通 染色球", - "item.appliedenergistics2.purple_paint_ball": "紫色 染色球", - "item.appliedenergistics2.purple_smart_cable": "紫色 ME智能线缆", - "item.appliedenergistics2.purple_smart_dense_cable": "紫色 ME致密线缆", + "item.appliedenergistics2.purple_covered_cable": "ME包层线缆(紫色)", + "item.appliedenergistics2.purple_covered_dense_cable": "ME致密包层线缆(紫色)", + "item.appliedenergistics2.purple_glass_cable": "ME玻璃线缆(紫色)", + "item.appliedenergistics2.purple_lumen_paint_ball": "光通染色球(紫色)", + "item.appliedenergistics2.purple_paint_ball": "染色球(紫色)", + "item.appliedenergistics2.purple_smart_cable": "ME智能线缆(紫色)", + "item.appliedenergistics2.purple_smart_dense_cable": "ME致密线缆(紫色)", "item.appliedenergistics2.quantum_entangled_singularity": "量子缠绕态奇点", "item.appliedenergistics2.quartz_fiber": "石英纤维", - "item.appliedenergistics2.red_covered_cable": "红色 ME包层线缆", - "item.appliedenergistics2.red_covered_dense_cable": "红色 ME致密包层线缆", - "item.appliedenergistics2.red_glass_cable": "红色 ME玻璃线缆", - "item.appliedenergistics2.red_lumen_paint_ball": "红色 光通 染色球", - "item.appliedenergistics2.red_paint_ball": "红色 染色球", - "item.appliedenergistics2.red_smart_cable": "红色 ME智能线缆", - "item.appliedenergistics2.red_smart_dense_cable": "红色 ME致密线缆", + "item.appliedenergistics2.red_covered_cable": "ME包层线缆(红色)", + "item.appliedenergistics2.red_covered_dense_cable": "ME致密包层线缆(红色)", + "item.appliedenergistics2.red_glass_cable": "ME玻璃线缆(红色)", + "item.appliedenergistics2.red_lumen_paint_ball": "光通染色球(红色)", + "item.appliedenergistics2.red_paint_ball": "染色球(红色)", + "item.appliedenergistics2.red_smart_cable": "ME智能线缆(红色)", + "item.appliedenergistics2.red_smart_dense_cable": "ME致密线缆(红色)", "item.appliedenergistics2.redstone_card": "红石卡", - "item.appliedenergistics2.redstone_p2p_tunnel": "红石 P2P通道", + "item.appliedenergistics2.redstone_p2p_tunnel": "P2P通道-红石", "item.appliedenergistics2.semi_dark_monitor": "照明面板", "item.appliedenergistics2.silicon": "硅", "item.appliedenergistics2.silicon_press": "硅压印模板", @@ -643,24 +643,24 @@ "item.appliedenergistics2.terminal": "ME终端", "item.appliedenergistics2.toggle_bus": "ME触发总线", "item.appliedenergistics2.view_cell": "显示元件", - "item.appliedenergistics2.white_covered_cable": "白色 ME包层线缆", - "item.appliedenergistics2.white_covered_dense_cable": "白色 ME致密包层线缆", - "item.appliedenergistics2.white_glass_cable": "白色 ME玻璃线缆", - "item.appliedenergistics2.white_lumen_paint_ball": "白色 光通 染色球", - "item.appliedenergistics2.white_paint_ball": "白色 染色球", - "item.appliedenergistics2.white_smart_cable": "白色 ME智能线缆", - "item.appliedenergistics2.white_smart_dense_cable": "白色 ME致密线缆", + "item.appliedenergistics2.white_covered_cable": "ME包层线缆(白色)", + "item.appliedenergistics2.white_covered_dense_cable": "ME致密包层线缆(白色)", + "item.appliedenergistics2.white_glass_cable": "ME玻璃线缆(白色)", + "item.appliedenergistics2.white_lumen_paint_ball": "光通染色球(白色)", + "item.appliedenergistics2.white_paint_ball": "染色球(白色)", + "item.appliedenergistics2.white_smart_cable": "ME智能线缆(白色)", + "item.appliedenergistics2.white_smart_dense_cable": "ME致密线缆(白色)", "item.appliedenergistics2.wireless_booster": "无线信号增幅器", "item.appliedenergistics2.wireless_receiver": "无线接收器", "item.appliedenergistics2.wireless_terminal": "无线终端", "item.appliedenergistics2.wooden_gear": "木齿轮", - "item.appliedenergistics2.yellow_covered_cable": "黄色 ME包层线缆", - "item.appliedenergistics2.yellow_covered_dense_cable": "黄色 ME致密包层线缆", - "item.appliedenergistics2.yellow_glass_cable": "黄色 ME玻璃线缆", - "item.appliedenergistics2.yellow_lumen_paint_ball": "黄色 光通 染色球", - "item.appliedenergistics2.yellow_paint_ball": "黄色 染色球", - "item.appliedenergistics2.yellow_smart_cable": "黄色 ME智能线缆", - "item.appliedenergistics2.yellow_smart_dense_cable": "黄色 ME致密线缆", + "item.appliedenergistics2.yellow_covered_cable": "ME包层线缆(黄色)", + "item.appliedenergistics2.yellow_covered_dense_cable": "ME致密包层线缆(黄色)", + "item.appliedenergistics2.yellow_glass_cable": "ME玻璃线缆(黄色)", + "item.appliedenergistics2.yellow_lumen_paint_ball": "光通染色球(黄色)", + "item.appliedenergistics2.yellow_paint_ball": "染色球(黄色)", + "item.appliedenergistics2.yellow_smart_cable": "ME智能线缆(黄色)", + "item.appliedenergistics2.yellow_smart_dense_cable": "ME致密线缆(黄色)", "itemGroup.appliedenergistics2": "应用能源2", "itemGroup.appliedenergistics2.facades": "应用能源2-伪装板", "key.appliedenergistics2.category": "Applied Energistics 2", From db9ec2b07048cdfb99c0a4268d7c4a81dd14a4f8 Mon Sep 17 00:00:00 2001 From: shartte Date: Sat, 29 Aug 2020 21:50:06 +0200 Subject: [PATCH 2/9] Remove the use of SlotItemHandler since we are only faking an inventory-backed slot, (#4654) we might as well use what we had used pre-2017, which is simply extending a normal Slot. This should also fix #4652. --- .../java/appeng/client/gui/Size1Slot.java | 9 +++---- src/main/java/appeng/client/me/FluidRepo.java | 5 ---- .../java/appeng/client/me/SlotFluidME.java | 23 ++++++++-------- src/main/java/appeng/client/me/SlotME.java | 26 +++++++++++-------- 4 files changed, 30 insertions(+), 33 deletions(-) diff --git a/src/main/java/appeng/client/gui/Size1Slot.java b/src/main/java/appeng/client/gui/Size1Slot.java index 47934052d..7210d1f0a 100644 --- a/src/main/java/appeng/client/gui/Size1Slot.java +++ b/src/main/java/appeng/client/gui/Size1Slot.java @@ -8,19 +8,18 @@ import net.minecraft.inventory.container.Slot; import net.minecraft.item.ItemStack; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; -import net.minecraftforge.items.SlotItemHandler; /** * A proxy for a slot that will always return an itemstack with size 1, if there * is an item in the slot. Used to prevent the default item count from * rendering. */ -class Size1Slot extends SlotItemHandler { +class Size1Slot extends Slot { - private final SlotItemHandler delegate; + private final Slot delegate; - public Size1Slot(SlotItemHandler delegate) { - super(delegate.getItemHandler(), delegate.getSlotIndex(), delegate.xPos, delegate.yPos); + public Size1Slot(Slot delegate) { + super(delegate.inventory, delegate.getSlotIndex(), delegate.xPos, delegate.yPos); this.delegate = delegate; } diff --git a/src/main/java/appeng/client/me/FluidRepo.java b/src/main/java/appeng/client/me/FluidRepo.java index 90764a063..e1fce58b2 100644 --- a/src/main/java/appeng/client/me/FluidRepo.java +++ b/src/main/java/appeng/client/me/FluidRepo.java @@ -41,11 +41,6 @@ import appeng.fluids.util.FluidSorters; import appeng.util.Platform; import appeng.util.prioritylist.IPartitionList; -/** - * @author BrockWS - * @version rv6 - 22/05/2018 - * @since rv6 22/05/2018 - */ public class FluidRepo { private final IItemList list = Api.instance().storage().getStorageChannel(IFluidStorageChannel.class) .createList(); diff --git a/src/main/java/appeng/client/me/SlotFluidME.java b/src/main/java/appeng/client/me/SlotFluidME.java index ea271cc87..0b8f28f9a 100644 --- a/src/main/java/appeng/client/me/SlotFluidME.java +++ b/src/main/java/appeng/client/me/SlotFluidME.java @@ -21,23 +21,22 @@ package appeng.client.me; import javax.annotation.Nonnull; import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.Inventory; +import net.minecraft.inventory.container.Slot; import net.minecraft.item.ItemStack; -import net.minecraftforge.items.SlotItemHandler; import appeng.api.storage.data.IAEFluidStack; import appeng.fluids.container.slots.IMEFluidSlot; -/** - * @author BrockWS - * @version rv6 - 22/05/2018 - * @since rv6 22/05/2018 - */ -public class SlotFluidME extends SlotItemHandler implements IMEFluidSlot { +public class SlotFluidME extends Slot implements IMEFluidSlot { - private InternalFluidSlotME slot; + private static final IInventory EMPTY_INVENTORY = new Inventory(0); + + private final InternalFluidSlotME slot; public SlotFluidME(InternalFluidSlotME slot) { - super(null, 0, slot.getxPosition(), slot.getyPosition()); + super(EMPTY_INVENTORY, 0, slot.getxPosition(), slot.getyPosition()); this.slot = slot; } @@ -50,7 +49,7 @@ public class SlotFluidME extends SlotItemHandler implements IMEFluidSlot { } @Override - public boolean isItemValid(final ItemStack par1ItemStack) { + public boolean isItemValid(final ItemStack stack) { return false; } @@ -69,7 +68,7 @@ public class SlotFluidME extends SlotItemHandler implements IMEFluidSlot { } @Override - public void putStack(final ItemStack par1ItemStack) { + public void putStack(final ItemStack stack) { } @@ -85,7 +84,7 @@ public class SlotFluidME extends SlotItemHandler implements IMEFluidSlot { } @Override - public boolean canTakeStack(final PlayerEntity par1PlayerEntity) { + public boolean canTakeStack(final PlayerEntity player) { return false; } } diff --git a/src/main/java/appeng/client/me/SlotME.java b/src/main/java/appeng/client/me/SlotME.java index 43c54c5e6..006c28173 100644 --- a/src/main/java/appeng/client/me/SlotME.java +++ b/src/main/java/appeng/client/me/SlotME.java @@ -19,23 +19,27 @@ package appeng.client.me; import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.Inventory; +import net.minecraft.inventory.container.Slot; import net.minecraft.item.ItemStack; -import net.minecraftforge.items.SlotItemHandler; import appeng.api.storage.data.IAEItemStack; -public class SlotME extends SlotItemHandler { +public class SlotME extends Slot { - private final InternalSlotME mySlot; + private static final IInventory EMPTY_INVENTORY = new Inventory(0); - public SlotME(final InternalSlotME me) { - super(null, 0, me.getxPosition(), me.getyPosition()); - this.mySlot = me; + private final InternalSlotME slot; + + public SlotME(final InternalSlotME slot) { + super(EMPTY_INVENTORY, 0, slot.getxPosition(), slot.getyPosition()); + this.slot = slot; } public IAEItemStack getAEStack() { - if (this.mySlot.hasPower()) { - return this.mySlot.getAEStack(); + if (this.slot.hasPower()) { + return this.slot.getAEStack(); } return null; } @@ -47,15 +51,15 @@ public class SlotME extends SlotItemHandler { @Override public ItemStack getStack() { - if (this.mySlot.hasPower()) { - return this.mySlot.getStack(); + if (this.slot.hasPower()) { + return this.slot.getStack(); } return ItemStack.EMPTY; } @Override public boolean getHasStack() { - if (this.mySlot.hasPower()) { + if (this.slot.hasPower()) { return !this.getStack().isEmpty(); } return false; From 9719c7ffc32981daba10aadce054c1a5dc9a7605 Mon Sep 17 00:00:00 2001 From: Sebastian Hartte Date: Sat, 29 Aug 2020 23:13:29 +0200 Subject: [PATCH 3/9] Bump to Forge 33.0.22 --- gradle.properties | 2 +- .../appeng/datagen/providers/loot/BlockDropProvider.java | 8 +++++--- .../fluids/client/gui/widgets/FluidSlotWidget.java | 3 ++- .../fluids/container/FluidConfigurableContainer.java | 3 ++- src/main/java/appeng/fluids/helper/FluidCellConfig.java | 9 +++++---- src/main/resources/META-INF/mods.toml | 2 +- 6 files changed, 16 insertions(+), 11 deletions(-) diff --git a/gradle.properties b/gradle.properties index 189497ac4..e806dcb53 100644 --- a/gradle.properties +++ b/gradle.properties @@ -11,7 +11,7 @@ artifact_basename=appliedenergistics2 minecraft_release=1.16 minecraft_version=1.16.2 mcp_mappings=20200723-1.16.1 -forge_version=33.0.5 +forge_version=33.0.22 ######################################################### # Provided APIs # diff --git a/src/main/java/appeng/datagen/providers/loot/BlockDropProvider.java b/src/main/java/appeng/datagen/providers/loot/BlockDropProvider.java index 70a89983f..5463c7c47 100644 --- a/src/main/java/appeng/datagen/providers/loot/BlockDropProvider.java +++ b/src/main/java/appeng/datagen/providers/loot/BlockDropProvider.java @@ -28,6 +28,7 @@ import net.minecraft.loot.RandomValueRange; import net.minecraft.loot.conditions.SurvivesExplosion; import net.minecraft.loot.functions.ApplyBonus; import net.minecraft.loot.functions.SetCount; +import net.minecraft.util.RegistryKey; import net.minecraft.util.ResourceLocation; import net.minecraftforge.fml.event.lifecycle.GatherDataEvent; import net.minecraftforge.registries.ForgeRegistries; @@ -62,12 +63,13 @@ public class BlockDropProvider extends BlockLootTables implements IAE2DataProvid @Override public void act(@Nonnull DirectoryCache cache) throws IOException { - for (Map.Entry entry : ForgeRegistries.BLOCKS.getEntries()) { + for (Map.Entry, Block> entry : ForgeRegistries.BLOCKS.getEntries()) { LootTable.Builder builder; - if (entry.getKey().getNamespace().equals(AppEng.MOD_ID)) { + if (entry.getKey().func_240901_a_().getNamespace().equals(AppEng.MOD_ID)) { builder = overrides.getOrDefault(entry.getValue(), this::defaultBuilder).apply(entry.getValue()); - IDataProvider.save(GSON, cache, toJson(builder), getPath(outputFolder, entry.getKey())); + IDataProvider.save(GSON, cache, toJson(builder), + getPath(outputFolder, entry.getKey().func_240901_a_())); } } } diff --git a/src/main/java/appeng/fluids/client/gui/widgets/FluidSlotWidget.java b/src/main/java/appeng/fluids/client/gui/widgets/FluidSlotWidget.java index 86e825b2e..6abc95297 100644 --- a/src/main/java/appeng/fluids/client/gui/widgets/FluidSlotWidget.java +++ b/src/main/java/appeng/fluids/client/gui/widgets/FluidSlotWidget.java @@ -1,6 +1,7 @@ package appeng.fluids.client.gui.widgets; import java.util.Collections; +import java.util.Optional; import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.systems.RenderSystem; @@ -73,7 +74,7 @@ public class FluidSlotWidget extends CustomSlotWidget { if (clickStack.isEmpty() || mouseButton == 1) { this.setFluidStack(null); } else if (mouseButton == 0) { - final LazyOptional fluidOpt = FluidUtil.getFluidContained(clickStack); + final Optional fluidOpt = FluidUtil.getFluidContained(clickStack); fluidOpt.ifPresent(fluid -> { this.setFluidStack(AEFluidStack.fromFluidStack(fluid)); }); diff --git a/src/main/java/appeng/fluids/container/FluidConfigurableContainer.java b/src/main/java/appeng/fluids/container/FluidConfigurableContainer.java index 0204b1267..f607edf9f 100644 --- a/src/main/java/appeng/fluids/container/FluidConfigurableContainer.java +++ b/src/main/java/appeng/fluids/container/FluidConfigurableContainer.java @@ -3,6 +3,7 @@ package appeng.fluids.container; import java.util.Collections; import java.util.Map; +import java.util.Optional; import net.minecraft.entity.player.PlayerInventory; import net.minecraft.inventory.container.ContainerType; @@ -39,7 +40,7 @@ public abstract class FluidConfigurableContainer extends UpgradeableContainer im @Override protected ItemStack transferStackToContainer(ItemStack input) { - LazyOptional fsOpt = FluidUtil.getFluidContained(input); + Optional fsOpt = FluidUtil.getFluidContained(input); if (fsOpt.isPresent()) { final IAEFluidTank t = this.getFluidConfigInventory(); final IAEFluidStack stack = AEFluidStack.fromFluidStack(fsOpt.orElse(null)); diff --git a/src/main/java/appeng/fluids/helper/FluidCellConfig.java b/src/main/java/appeng/fluids/helper/FluidCellConfig.java index 392b29af3..30be647e5 100644 --- a/src/main/java/appeng/fluids/helper/FluidCellConfig.java +++ b/src/main/java/appeng/fluids/helper/FluidCellConfig.java @@ -18,10 +18,11 @@ package appeng.fluids.helper; +import java.util.Optional; + import javax.annotation.Nonnull; import net.minecraft.item.ItemStack; -import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.fluids.FluidAttributes; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidUtil; @@ -46,7 +47,7 @@ public class FluidCellConfig extends CellConfig { if (stack.isEmpty() || stack.getItem() instanceof FluidDummyItem) { super.insertItem(slot, stack, simulate); } - LazyOptional fluidOpt = FluidUtil.getFluidContained(stack); + Optional fluidOpt = FluidUtil.getFluidContained(stack); if (!fluidOpt.isPresent() || !Api.instance().definitions().items().dummyFluidItem().maybeStack(1).isPresent()) { return stack; } @@ -64,7 +65,7 @@ public class FluidCellConfig extends CellConfig { if (stack.isEmpty() || stack.getItem() instanceof FluidDummyItem) { super.setStackInSlot(slot, stack); } - LazyOptional fluidOpt = FluidUtil.getFluidContained(stack); + Optional fluidOpt = FluidUtil.getFluidContained(stack); if (!fluidOpt.isPresent() || !Api.instance().definitions().items().dummyFluidItem().maybeStack(1).isPresent()) { return; } @@ -82,7 +83,7 @@ public class FluidCellConfig extends CellConfig { if (stack.isEmpty() || stack.getItem() instanceof FluidDummyItem) { super.isItemValid(slot, stack); } - LazyOptional fluidOpt = FluidUtil.getFluidContained(stack); + Optional fluidOpt = FluidUtil.getFluidContained(stack); if (!fluidOpt.isPresent() || !Api.instance().definitions().items().dummyFluidItem().maybeStack(1).isPresent()) { return false; } diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml index 7f42b532b..41b0c98d0 100644 --- a/src/main/resources/META-INF/mods.toml +++ b/src/main/resources/META-INF/mods.toml @@ -17,7 +17,7 @@ description="A Mod about Matter, Energy and using them to conquer the world.." [[dependencies.appliedenergistics2]] modId="forge" mandatory=true - versionRange="[33.0.5,34.0.0)" + versionRange="[33.0.22,34.0.0)" ordering="NONE" side="BOTH" From e90dd2f9c6f1cd8b1ce271368f79f1f37df5bdce Mon Sep 17 00:00:00 2001 From: yueh Date: Mon, 31 Aug 2020 23:09:14 +0200 Subject: [PATCH 4/9] Serialize the complete NBT data to avoid mismatches (#4665) This might increase the network traffic a bit, but the amount of mods actually using the share tag seems to be very limited. For now it is worth the risk as it solves the problem. In case we run into actual issues, there might still be other solutions, which will be way more complex and can potentially introduce additional problems. --- src/main/java/appeng/util/item/AEItemStack.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/appeng/util/item/AEItemStack.java b/src/main/java/appeng/util/item/AEItemStack.java index e427cac7b..2ac25585f 100644 --- a/src/main/java/appeng/util/item/AEItemStack.java +++ b/src/main/java/appeng/util/item/AEItemStack.java @@ -125,7 +125,7 @@ public final class AEItemStack extends AEStack implements IAEItemS buffer.writeBoolean(this.isCraftable()); buffer.writeVarLong(this.getStackSize()); buffer.writeVarLong(this.getCountRequestable()); - buffer.writeItemStack(getDefinition()); + buffer.writeItemStack(getDefinition(), false); } @Override From 133ed1f09d3951c32934d92fb32ddc6d7e6fce88 Mon Sep 17 00:00:00 2001 From: yueh Date: Mon, 31 Aug 2020 23:09:28 +0200 Subject: [PATCH 5/9] Remove GZipStreams from packets. (#4664) This should now be handled by the normal network manager (hopefully). Also renamed the `CompressedNBTPacket` to `MEInterfaceUpdatePacket` as that is the only use case. --- .../InterfaceTerminalContainer.java | 4 +- .../appeng/core/sync/BasePacketHandler.java | 4 +- .../packets/MEFluidInventoryUpdatePacket.java | 63 ++----------------- ...cket.java => MEInterfaceUpdatePacket.java} | 50 ++------------- .../sync/packets/MEInventoryUpdatePacket.java | 62 ++---------------- 5 files changed, 20 insertions(+), 163 deletions(-) rename src/main/java/appeng/core/sync/packets/{CompressedNBTPacket.java => MEInterfaceUpdatePacket.java} (57%) diff --git a/src/main/java/appeng/container/implementations/InterfaceTerminalContainer.java b/src/main/java/appeng/container/implementations/InterfaceTerminalContainer.java index cc893c57b..648262f0b 100644 --- a/src/main/java/appeng/container/implementations/InterfaceTerminalContainer.java +++ b/src/main/java/appeng/container/implementations/InterfaceTerminalContainer.java @@ -42,7 +42,7 @@ import appeng.api.networking.security.IActionHost; import appeng.container.AEBaseContainer; import appeng.container.ContainerLocator; import appeng.core.sync.network.NetworkHandler; -import appeng.core.sync.packets.CompressedNBTPacket; +import appeng.core.sync.packets.MEInterfaceUpdatePacket; import appeng.helpers.DualityInterface; import appeng.helpers.IInterfaceHost; import appeng.helpers.InventoryAction; @@ -177,7 +177,7 @@ public final class InterfaceTerminalContainer extends AEBaseContainer { if (!this.data.isEmpty()) { try { - NetworkHandler.instance().sendTo(new CompressedNBTPacket(this.data), + NetworkHandler.instance().sendTo(new MEInterfaceUpdatePacket(this.data), (ServerPlayerEntity) this.getPlayerInv().player); } catch (final IOException e) { // :P diff --git a/src/main/java/appeng/core/sync/BasePacketHandler.java b/src/main/java/appeng/core/sync/BasePacketHandler.java index 82c39a3a0..541712fce 100644 --- a/src/main/java/appeng/core/sync/BasePacketHandler.java +++ b/src/main/java/appeng/core/sync/BasePacketHandler.java @@ -29,7 +29,6 @@ import appeng.core.sync.packets.BlockTransitionEffectPacket; import appeng.core.sync.packets.ClickPacket; import appeng.core.sync.packets.CompassRequestPacket; import appeng.core.sync.packets.CompassResponsePacket; -import appeng.core.sync.packets.CompressedNBTPacket; import appeng.core.sync.packets.ConfigButtonPacket; import appeng.core.sync.packets.ConfigValuePacket; import appeng.core.sync.packets.CraftRequestPacket; @@ -39,6 +38,7 @@ import appeng.core.sync.packets.ItemTransitionEffectPacket; import appeng.core.sync.packets.JEIRecipePacket; import appeng.core.sync.packets.LightningPacket; import appeng.core.sync.packets.MEFluidInventoryUpdatePacket; +import appeng.core.sync.packets.MEInterfaceUpdatePacket; import appeng.core.sync.packets.MEInventoryUpdatePacket; import appeng.core.sync.packets.MatterCannonPacket; import appeng.core.sync.packets.MockExplosionPacket; @@ -101,7 +101,7 @@ public class BasePacketHandler { PACKET_ASSEMBLER_ANIMATION(AssemblerAnimationPacket.class, AssemblerAnimationPacket::new), - PACKET_COMPRESSED_NBT(CompressedNBTPacket.class, CompressedNBTPacket::new), + PACKET_ME_INTERFACE_UPDATE(MEInterfaceUpdatePacket.class, MEInterfaceUpdatePacket::new), PACKET_PAINTED_ENTITY(PaintedEntityPacket.class, PaintedEntityPacket::new), diff --git a/src/main/java/appeng/core/sync/packets/MEFluidInventoryUpdatePacket.java b/src/main/java/appeng/core/sync/packets/MEFluidInventoryUpdatePacket.java index 10caeebd1..1f79b1af4 100644 --- a/src/main/java/appeng/core/sync/packets/MEFluidInventoryUpdatePacket.java +++ b/src/main/java/appeng/core/sync/packets/MEFluidInventoryUpdatePacket.java @@ -19,13 +19,9 @@ package appeng.core.sync.packets; import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; import java.nio.BufferOverflowException; import java.util.LinkedList; import java.util.List; -import java.util.zip.GZIPInputStream; -import java.util.zip.GZIPOutputStream; import javax.annotation.Nullable; @@ -41,7 +37,6 @@ import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.fml.network.NetworkDirection; import appeng.api.storage.data.IAEFluidStack; -import appeng.core.AELog; import appeng.core.sync.BasePacket; import appeng.core.sync.network.INetworkInfo; import appeng.fluids.client.gui.FluidTerminalScreen; @@ -55,8 +50,6 @@ import appeng.fluids.util.AEFluidStack; public class MEFluidInventoryUpdatePacket extends BasePacket { private static final int UNCOMPRESSED_PACKET_BYTE_LIMIT = 16 * 1024 * 1024; private static final int OPERATION_BYTE_LIMIT = 2 * 1024; - private static final int TEMP_BUFFER_SIZE = 1024; - private static final int STREAM_MASK = 0xff; // input. @Nullable @@ -66,47 +59,18 @@ public class MEFluidInventoryUpdatePacket extends BasePacket { @Nullable private final PacketBuffer data; - @Nullable - private final GZIPOutputStream compressFrame; private int writtenBytes = 0; private boolean empty = true; public MEFluidInventoryUpdatePacket(final PacketBuffer stream) { this.data = null; - this.compressFrame = null; this.list = new LinkedList<>(); this.ref = stream.readByte(); - try (final GZIPInputStream gzReader = new GZIPInputStream(new InputStream() { - @Override - public int read() { - if (stream.readableBytes() <= 0) { - return -1; - } - - return stream.readByte() & STREAM_MASK; - } - })) { - - final PacketBuffer uncompressed = new PacketBuffer(Unpooled.buffer(stream.readableBytes())); - final byte[] tmp = new byte[TEMP_BUFFER_SIZE]; - - while (gzReader.available() != 0) { - final int bytes = gzReader.read(tmp); - - if (bytes > 0) { - uncompressed.writeBytes(tmp, 0, bytes); - } - } - - while (uncompressed.readableBytes() > 0) { - this.list.add(AEFluidStack.fromPacket(uncompressed)); - } - } catch (IOException e) { - throw new RuntimeException("Failed to decompress packet.", e); + while (stream.readableBytes() > 0) { + this.list.add(AEFluidStack.fromPacket(stream)); } - this.empty = this.list.isEmpty(); } @@ -121,14 +85,6 @@ public class MEFluidInventoryUpdatePacket extends BasePacket { this.data = new PacketBuffer(Unpooled.buffer(OPERATION_BYTE_LIMIT)); this.data.writeInt(this.getPacketID()); this.data.writeByte(this.ref); - - this.compressFrame = new GZIPOutputStream(new OutputStream() { - @Override - public void write(final int value) { - MEFluidInventoryUpdatePacket.this.data.writeByte(value); - } - }); - this.list = null; } @@ -145,28 +101,19 @@ public class MEFluidInventoryUpdatePacket extends BasePacket { @Nullable @Override public IPacket toPacket(NetworkDirection direction) { - try { - this.compressFrame.close(); - - this.configureWrite(this.data); - return super.toPacket(direction); - } catch (final IOException e) { - AELog.debug(e); - } - - return null; + this.configureWrite(this.data); + return super.toPacket(direction); } public void appendFluid(final IAEFluidStack fs) throws IOException, BufferOverflowException { final PacketBuffer tmp = new PacketBuffer(Unpooled.buffer(OPERATION_BYTE_LIMIT)); fs.writeToPacket(tmp); - this.compressFrame.flush(); if (this.writtenBytes + tmp.readableBytes() > UNCOMPRESSED_PACKET_BYTE_LIMIT) { throw new BufferOverflowException(); } else { this.writtenBytes += tmp.readableBytes(); - this.compressFrame.write(tmp.array(), 0, tmp.readableBytes()); + this.data.writeBytes(tmp.array(), 0, tmp.readableBytes()); this.empty = false; } } diff --git a/src/main/java/appeng/core/sync/packets/CompressedNBTPacket.java b/src/main/java/appeng/core/sync/packets/MEInterfaceUpdatePacket.java similarity index 57% rename from src/main/java/appeng/core/sync/packets/CompressedNBTPacket.java rename to src/main/java/appeng/core/sync/packets/MEInterfaceUpdatePacket.java index 42dedfa75..f15023710 100644 --- a/src/main/java/appeng/core/sync/packets/CompressedNBTPacket.java +++ b/src/main/java/appeng/core/sync/packets/MEInterfaceUpdatePacket.java @@ -18,13 +18,7 @@ package appeng.core.sync.packets; -import java.io.DataInputStream; -import java.io.DataOutputStream; import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.util.zip.GZIPInputStream; -import java.util.zip.GZIPOutputStream; import io.netty.buffer.Unpooled; @@ -32,7 +26,6 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screen.Screen; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.nbt.CompoundNBT; -import net.minecraft.nbt.CompressedStreamTools; import net.minecraft.network.PacketBuffer; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @@ -41,55 +34,24 @@ import appeng.client.gui.implementations.InterfaceTerminalScreen; import appeng.core.sync.BasePacket; import appeng.core.sync.network.INetworkInfo; -//TODO, this is pointless, NBT is already compressed when written to a PacketBuffer. -public class CompressedNBTPacket extends BasePacket { +public class MEInterfaceUpdatePacket extends BasePacket { // input. private final CompoundNBT in; // output... private final PacketBuffer data; - private final GZIPOutputStream compressFrame; - public CompressedNBTPacket(final PacketBuffer stream) { + public MEInterfaceUpdatePacket(final PacketBuffer stream) { this.data = null; - this.compressFrame = null; - - try (DataInputStream inStream = new DataInputStream(new GZIPInputStream(new InputStream() { - - @Override - public int read() { - if (stream.readableBytes() <= 0) { - return -1; - } - - return stream.readByte() & 0xff; - } - }))) { - this.in = CompressedStreamTools.read(inStream); - } catch (IOException e) { - throw new RuntimeException("Failed to decompress packet.", e); - } + this.in = stream.readCompoundTag(); } // api - public CompressedNBTPacket(final CompoundNBT din) throws IOException { - + public MEInterfaceUpdatePacket(final CompoundNBT din) throws IOException { + this.in = null; this.data = new PacketBuffer(Unpooled.buffer(2048)); this.data.writeInt(this.getPacketID()); - - this.in = din; - - this.compressFrame = new GZIPOutputStream(new OutputStream() { - - @Override - public void write(final int value) { - CompressedNBTPacket.this.data.writeByte(value); - } - }); - - CompressedStreamTools.write(din, new DataOutputStream(this.compressFrame)); - this.compressFrame.close(); - + this.data.writeCompoundTag(din); this.configureWrite(this.data); } diff --git a/src/main/java/appeng/core/sync/packets/MEInventoryUpdatePacket.java b/src/main/java/appeng/core/sync/packets/MEInventoryUpdatePacket.java index 7fac77538..4ec3f2289 100644 --- a/src/main/java/appeng/core/sync/packets/MEInventoryUpdatePacket.java +++ b/src/main/java/appeng/core/sync/packets/MEInventoryUpdatePacket.java @@ -19,12 +19,10 @@ package appeng.core.sync.packets; import java.io.IOException; -import java.io.InputStream; import java.io.OutputStream; import java.nio.BufferOverflowException; import java.util.ArrayList; import java.util.List; -import java.util.zip.GZIPInputStream; import java.util.zip.GZIPOutputStream; import javax.annotation.Nullable; @@ -45,7 +43,6 @@ import appeng.client.gui.implementations.CraftConfirmScreen; import appeng.client.gui.implementations.CraftingCPUScreen; import appeng.client.gui.implementations.MEMonitorableScreen; import appeng.client.gui.implementations.NetworkStatusScreen; -import appeng.core.AELog; import appeng.core.sync.BasePacket; import appeng.core.sync.network.INetworkInfo; import appeng.util.item.AEItemStack; @@ -53,8 +50,6 @@ import appeng.util.item.AEItemStack; public class MEInventoryUpdatePacket extends BasePacket { private static final int UNCOMPRESSED_PACKET_BYTE_LIMIT = 16 * 1024 * 1024; private static final int OPERATION_BYTE_LIMIT = 2 * 1024; - private static final int TEMP_BUFFER_SIZE = 1024; - private static final int STREAM_MASK = 0xff; // input. @Nullable @@ -64,48 +59,18 @@ public class MEInventoryUpdatePacket extends BasePacket { @Nullable private final PacketBuffer data; - @Nullable - private final GZIPOutputStream compressFrame; private int writtenBytes = 0; private boolean empty = true; public MEInventoryUpdatePacket(final PacketBuffer stream) { this.data = null; - this.compressFrame = null; this.list = new ArrayList<>(); this.ref = stream.readByte(); - // int originalBytes = stream.readableBytes(); - - try (GZIPInputStream gzReader = new GZIPInputStream(new InputStream() { - @Override - public int read() { - if (stream.readableBytes() <= 0) { - return -1; - } - - return stream.readByte() & STREAM_MASK; - } - })) { - final PacketBuffer uncompressed = new PacketBuffer(Unpooled.buffer(stream.readableBytes())); - final byte[] tmp = new byte[TEMP_BUFFER_SIZE]; - - while (gzReader.available() != 0) { - final int bytes = gzReader.read(tmp); - - if (bytes > 0) { - uncompressed.writeBytes(tmp, 0, bytes); - } - } - - while (uncompressed.readableBytes() > 0) { - this.list.add(AEItemStack.fromPacket(uncompressed)); - } - } catch (IOException e) { - throw new RuntimeException("Failed to decompress packet.", e); + while (stream.readableBytes() > 0) { + this.list.add(AEItemStack.fromPacket(stream)); } - this.empty = this.list.isEmpty(); } @@ -120,14 +85,6 @@ public class MEInventoryUpdatePacket extends BasePacket { this.data = new PacketBuffer(Unpooled.buffer(OPERATION_BYTE_LIMIT)); this.data.writeInt(this.getPacketID()); this.data.writeByte(this.ref); - - this.compressFrame = new GZIPOutputStream(new OutputStream() { - @Override - public void write(final int value) { - MEInventoryUpdatePacket.this.data.writeByte(value); - } - }); - this.list = null; } @@ -156,28 +113,19 @@ public class MEInventoryUpdatePacket extends BasePacket { @Nullable @Override public IPacket toPacket(NetworkDirection direction) { - try { - this.compressFrame.close(); - - this.configureWrite(this.data); - return super.toPacket(direction); - } catch (final IOException e) { - AELog.debug(e); - } - - return null; + this.configureWrite(this.data); + return super.toPacket(direction); } public void appendItem(final IAEItemStack is) throws IOException, BufferOverflowException { final PacketBuffer tmp = new PacketBuffer(Unpooled.buffer(OPERATION_BYTE_LIMIT)); is.writeToPacket(tmp); - this.compressFrame.flush(); if (this.writtenBytes + tmp.readableBytes() > UNCOMPRESSED_PACKET_BYTE_LIMIT) { throw new BufferOverflowException(); } else { this.writtenBytes += tmp.readableBytes(); - this.compressFrame.write(tmp.array(), 0, tmp.readableBytes()); + this.data.writeBytes(tmp.array(), 0, tmp.readableBytes()); this.empty = false; } } From 957bc4c5cc157710acd2523a5b0caa98b4ae3158 Mon Sep 17 00:00:00 2001 From: shartte Date: Mon, 31 Aug 2020 23:10:25 +0200 Subject: [PATCH 6/9] Fixes removal of facades not invalidating the cached server-side collision boxes. (#4663) --- src/main/java/appeng/facade/FacadeContainer.java | 12 +++++++++++- src/main/java/appeng/parts/CableBusContainer.java | 2 +- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/main/java/appeng/facade/FacadeContainer.java b/src/main/java/appeng/facade/FacadeContainer.java index 24e8051bc..b1156dbbe 100644 --- a/src/main/java/appeng/facade/FacadeContainer.java +++ b/src/main/java/appeng/facade/FacadeContainer.java @@ -37,15 +37,18 @@ public class FacadeContainer implements IFacadeContainer { private final int facades = 6; private final CableBusStorage storage; + private final Runnable changeCallback; - public FacadeContainer(final CableBusStorage cbs) { + public FacadeContainer(final CableBusStorage cbs, Runnable changeCallback) { this.storage = cbs; + this.changeCallback = changeCallback; } @Override public boolean addFacade(final IFacadePart a) { if (this.getFacade(a.getSide()) == null) { this.storage.setFacade(a.getSide().ordinal(), a); + this.notifyChange(); return true; } return false; @@ -56,6 +59,7 @@ public class FacadeContainer implements IFacadeContainer { if (side != null && side != AEPartLocation.INTERNAL) { if (this.storage.getFacade(side.ordinal()) != null) { this.storage.setFacade(side.ordinal(), null); + this.notifyChange(); if (host != null) { host.markForUpdate(); } @@ -84,6 +88,7 @@ public class FacadeContainer implements IFacadeContainer { for (int x = 0; x < this.facades; x++) { this.storage.setFacade(x, newFacades[x]); } + this.notifyChange(); } @Override @@ -175,4 +180,9 @@ public class FacadeContainer implements IFacadeContainer { } return true; } + + private void notifyChange() { + this.changeCallback.run(); + } + } diff --git a/src/main/java/appeng/parts/CableBusContainer.java b/src/main/java/appeng/parts/CableBusContainer.java index 963f313d9..b2ddc03fb 100644 --- a/src/main/java/appeng/parts/CableBusContainer.java +++ b/src/main/java/appeng/parts/CableBusContainer.java @@ -125,7 +125,7 @@ public class CableBusContainer extends CableBusStorage implements AEMultiTile, I @Override public IFacadeContainer getFacadeContainer() { - return new FacadeContainer(this); + return new FacadeContainer(this, this::invalidateShapes); } @Override From ab393b0ed1ef9e17ffb97e5de31f4db7a12395ea Mon Sep 17 00:00:00 2001 From: yueh Date: Mon, 31 Aug 2020 23:09:14 +0200 Subject: [PATCH 7/9] Serialize the complete NBT data to avoid mismatches (#4665) This might increase the network traffic a bit, but the amount of mods actually using the share tag seems to be very limited. For now it is worth the risk as it solves the problem. In case we run into actual issues, there might still be other solutions, which will be way more complex and can potentially introduce additional problems. (cherry picked from commit e90dd2f9c6f1cd8b1ce271368f79f1f37df5bdce) --- src/main/java/appeng/util/item/AEItemStack.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/appeng/util/item/AEItemStack.java b/src/main/java/appeng/util/item/AEItemStack.java index e427cac7b..2ac25585f 100644 --- a/src/main/java/appeng/util/item/AEItemStack.java +++ b/src/main/java/appeng/util/item/AEItemStack.java @@ -125,7 +125,7 @@ public final class AEItemStack extends AEStack implements IAEItemS buffer.writeBoolean(this.isCraftable()); buffer.writeVarLong(this.getStackSize()); buffer.writeVarLong(this.getCountRequestable()); - buffer.writeItemStack(getDefinition()); + buffer.writeItemStack(getDefinition(), false); } @Override From 7c99fca7890e3920dd7f642148a7b9a2265e95dc Mon Sep 17 00:00:00 2001 From: shartte Date: Mon, 31 Aug 2020 23:10:25 +0200 Subject: [PATCH 8/9] Fixes removal of facades not invalidating the cached server-side collision boxes. (#4663) (cherry picked from commit 957bc4c5cc157710acd2523a5b0caa98b4ae3158) --- src/main/java/appeng/facade/FacadeContainer.java | 12 +++++++++++- src/main/java/appeng/parts/CableBusContainer.java | 2 +- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/main/java/appeng/facade/FacadeContainer.java b/src/main/java/appeng/facade/FacadeContainer.java index 24e8051bc..b1156dbbe 100644 --- a/src/main/java/appeng/facade/FacadeContainer.java +++ b/src/main/java/appeng/facade/FacadeContainer.java @@ -37,15 +37,18 @@ public class FacadeContainer implements IFacadeContainer { private final int facades = 6; private final CableBusStorage storage; + private final Runnable changeCallback; - public FacadeContainer(final CableBusStorage cbs) { + public FacadeContainer(final CableBusStorage cbs, Runnable changeCallback) { this.storage = cbs; + this.changeCallback = changeCallback; } @Override public boolean addFacade(final IFacadePart a) { if (this.getFacade(a.getSide()) == null) { this.storage.setFacade(a.getSide().ordinal(), a); + this.notifyChange(); return true; } return false; @@ -56,6 +59,7 @@ public class FacadeContainer implements IFacadeContainer { if (side != null && side != AEPartLocation.INTERNAL) { if (this.storage.getFacade(side.ordinal()) != null) { this.storage.setFacade(side.ordinal(), null); + this.notifyChange(); if (host != null) { host.markForUpdate(); } @@ -84,6 +88,7 @@ public class FacadeContainer implements IFacadeContainer { for (int x = 0; x < this.facades; x++) { this.storage.setFacade(x, newFacades[x]); } + this.notifyChange(); } @Override @@ -175,4 +180,9 @@ public class FacadeContainer implements IFacadeContainer { } return true; } + + private void notifyChange() { + this.changeCallback.run(); + } + } diff --git a/src/main/java/appeng/parts/CableBusContainer.java b/src/main/java/appeng/parts/CableBusContainer.java index 963f313d9..b2ddc03fb 100644 --- a/src/main/java/appeng/parts/CableBusContainer.java +++ b/src/main/java/appeng/parts/CableBusContainer.java @@ -125,7 +125,7 @@ public class CableBusContainer extends CableBusStorage implements AEMultiTile, I @Override public IFacadeContainer getFacadeContainer() { - return new FacadeContainer(this); + return new FacadeContainer(this, this::invalidateShapes); } @Override From b756d68be1d75ebffaaa10be7ce9071dfc14e50b Mon Sep 17 00:00:00 2001 From: shartte Date: Tue, 1 Sep 2020 18:20:51 +0200 Subject: [PATCH 9/9] Implemented a cache with maximum quad-count it will cache for the cable bus, (#4670) which also fixes concurrent access to the hashmap. --- .../render/cablebus/CableBusBakedModel.java | 32 ++++++++++++------- .../render/cablebus/CableBusModelLoader.java | 1 - 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/src/main/java/appeng/client/render/cablebus/CableBusBakedModel.java b/src/main/java/appeng/client/render/cablebus/CableBusBakedModel.java index cdde27b7f..06285aef2 100644 --- a/src/main/java/appeng/client/render/cablebus/CableBusBakedModel.java +++ b/src/main/java/appeng/client/render/cablebus/CableBusBakedModel.java @@ -21,7 +21,6 @@ package appeng.client.render.cablebus; import java.util.ArrayList; import java.util.Collections; import java.util.EnumMap; -import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; @@ -30,6 +29,11 @@ import java.util.Random; import javax.annotation.Nullable; +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; +import com.google.common.cache.Weigher; + import net.minecraft.block.BlockState; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.model.BakedQuad; @@ -50,7 +54,10 @@ import appeng.api.util.AEColor; public class CableBusBakedModel implements IBakedModel { - private static final Map> CABLE_MODEL_CACHE = new HashMap<>(); + // The number of quads overall that will be cached + private static final int CACHE_QUAD_COUNT = 5000; + + private final LoadingCache> cableModelCache; private final CableBuilder cableBuilder; @@ -66,6 +73,17 @@ public class CableBusBakedModel implements IBakedModel { this.facadeBuilder = facadeBuilder; this.partModels = partModels; this.particleTexture = particleTexture; + this.cableModelCache = CacheBuilder.newBuilder()// + .maximumWeight(CACHE_QUAD_COUNT)// + .weigher((Weigher>) (key, value) -> value.size())// + .build(new CacheLoader>() { + @Override + public List load(CableBusRenderState renderState) { + final List model = new ArrayList<>(); + addCableQuads(renderState, model); + return model; + } + }); } @Override @@ -92,11 +110,7 @@ public class CableBusBakedModel implements IBakedModel { if (layer == RenderType.getCutout()) { // First, handle the cable at the center of the cable bus - final List cableModel = CABLE_MODEL_CACHE.computeIfAbsent(renderState, k -> { - final List model = new ArrayList<>(); - this.addCableQuads(renderState, model); - return model; - }); + final List cableModel = cableModelCache.getUnchecked(renderState); quads.addAll(cableModel); // Then handle attachments @@ -341,8 +355,4 @@ public class CableBusBakedModel implements IBakedModel { return ItemOverrideList.EMPTY; } - public static void clearCache() { - CABLE_MODEL_CACHE.clear(); - } - } diff --git a/src/main/java/appeng/client/render/cablebus/CableBusModelLoader.java b/src/main/java/appeng/client/render/cablebus/CableBusModelLoader.java index cdf2cd9d2..36a683bde 100644 --- a/src/main/java/appeng/client/render/cablebus/CableBusModelLoader.java +++ b/src/main/java/appeng/client/render/cablebus/CableBusModelLoader.java @@ -18,7 +18,6 @@ public class CableBusModelLoader implements IModelLoader { @Override public void onResourceManagerReload(IResourceManager resourceManager) { - CableBusBakedModel.clearCache(); } @Override