From bb6b347cfe9a36d30fae674e0ab2eb617817e6df Mon Sep 17 00:00:00 2001 From: TUsama <1716976420@qq.com> Date: Sun, 18 Apr 2021 12:47:44 +0800 Subject: [PATCH 01/18] update Co-Authored-By: BigDaleAHA <56267928+BigDaleAHA@users.noreply.github.com> --- .../resources/assets/create/lang/zh_cn.json | 994 +++++++++++++++--- 1 file changed, 862 insertions(+), 132 deletions(-) diff --git a/src/main/resources/assets/create/lang/zh_cn.json b/src/main/resources/assets/create/lang/zh_cn.json index 0a65fb940..6de9d19a5 100644 --- a/src/main/resources/assets/create/lang/zh_cn.json +++ b/src/main/resources/assets/create/lang/zh_cn.json @@ -1,5 +1,6 @@ { + "_": "->------------------------] Game Elements [------------------------<-", "block.create.acacia_window": "金合欢窗户", @@ -8,7 +9,7 @@ "block.create.adjustable_crate": "可调节板条箱", "block.create.adjustable_pulse_repeater": "可调节脉冲中继器", "block.create.adjustable_repeater": "可调节中继器", - "block.create.analog_lever": "可调节拉杆", + "block.create.analog_lever": "模拟拉杆", "block.create.andesite_belt_funnel": "安山岩传送带漏斗", "block.create.andesite_bricks": "安山岩砖", "block.create.andesite_bricks_slab": "安山岩砖台阶", @@ -66,8 +67,8 @@ "block.create.creative_crate": "创造板条箱", "block.create.creative_fluid_tank": "创造流体储罐", "block.create.creative_motor": "创造马达", - "block.create.crimson_window": "赤红窗户", - "block.create.crimson_window_pane": "赤红窗户板", + "block.create.crimson_window": "绯红窗户", + "block.create.crimson_window_pane": "绯红窗户板", "block.create.crushing_wheel": "粉碎轮", "block.create.crushing_wheel_controller": "粉碎轮控制器", "block.create.cuckoo_clock": "布谷鸟闹钟", @@ -152,7 +153,7 @@ "block.create.flywheel": "飞轮", "block.create.framed_glass": "边框玻璃", "block.create.framed_glass_pane": "边框玻璃板", - "block.create.furnace_engine": "熔炼引擎", + "block.create.furnace_engine": "熔炉引擎", "block.create.gabbro": "辉长岩", "block.create.gabbro_bricks": "辉长岩砖", "block.create.gabbro_bricks_slab": "辉长岩砖台阶", @@ -163,6 +164,8 @@ "block.create.gabbro_cobblestone_stairs": "辉长岩圆石楼梯", "block.create.gabbro_cobblestone_wall": "辉长岩圆石墙", "block.create.gabbro_pillar": "竖纹辉长岩", + "block.create.gantry_pinion": "起重机传动齿轮", + "block.create.gantry_shaft": "起重机杆", "block.create.gearbox": "十字齿轮箱", "block.create.gearshift": "反转齿轮箱", "block.create.glass_fluid_pipe": "玻璃流体管道", @@ -335,7 +338,7 @@ "block.create.portable_fluid_interface": "移动式流体接口", "block.create.portable_storage_interface": "移动式存储接口", "block.create.powered_latch": "锁存器", - "block.create.powered_toggle_latch": "T触发器", + "block.create.powered_toggle_latch": "转换锁存器", "block.create.pulley_magnet": "滑轮磁铁", "block.create.pulse_repeater": "脉冲中继器", "block.create.purple_sail": "紫色风帆", @@ -346,7 +349,7 @@ "block.create.red_seat": "红色坐垫", "block.create.red_valve_handle": "红色阀门手轮", "block.create.redstone_contact": "接触式红石信号发生器", - "block.create.redstone_link": "无限红石信号终端", + "block.create.redstone_link": "无线红石信号终端", "block.create.refined_radiance_casing": "光辉机壳", "block.create.reinforced_rail": "强化铁轨", "block.create.rope": "绳索", @@ -375,6 +378,7 @@ "block.create.spout": "注液器", "block.create.spruce_window": "云杉窗户", "block.create.spruce_window_pane": "云杉窗户板", + "block.create.sticker": "黏着器", "block.create.sticky_mechanical_piston": "黏性动力活塞", "block.create.stockpile_switch": "存量转换器", "block.create.stressometer": "应力表", @@ -396,6 +400,7 @@ "block.create.weathered_limestone_cobblestone_stairs": "风化石灰岩圆石楼梯", "block.create.weathered_limestone_cobblestone_wall": "风化石灰岩圆石墙", "block.create.weathered_limestone_pillar": "竖纹风化石灰岩", + "block.create.weighted_ejector": "弹射置物台", "block.create.white_sail": "白色风帆", "block.create.white_seat": "白色坐垫", "block.create.white_valve_handle": "白色阀门手轮", @@ -407,9 +412,10 @@ "block.create.zinc_block": "锌块", "block.create.zinc_ore": "锌矿石", - "entity.create.contraption": "结构", + "entity.create.contraption": "装置", + "entity.create.gantry_contraption": "起重机装置", "entity.create.seat": "坐垫", - "entity.create.stationary_contraption": "固定结构", + "entity.create.stationary_contraption": "固定装置", "entity.create.super_glue": "强力胶", "fluid.create.chocolate": "巧克力", @@ -422,8 +428,8 @@ "item.create.attribute_filter": "属性过滤器", "item.create.bar_of_chocolate": "巧克力棒", "item.create.belt_connector": "传送带", - "item.create.blaze_cake": "熔岩蛋糕", - "item.create.blaze_cake_base": "熔岩蛋糕胚", + "item.create.blaze_cake": "烈焰蛋糕", + "item.create.blaze_cake_base": "烈焰蛋糕胚", "item.create.brass_hand": "黄铜手部零件", "item.create.brass_ingot": "黄铜锭", "item.create.brass_nugget": "黄铜粒", @@ -431,6 +437,7 @@ "item.create.builders_tea": "建造工茶饮", "item.create.chest_minecart_contraption": "装配过的动力矿车", "item.create.chocolate_bucket": "巧克力桶", + "item.create.chocolate_glazed_berries": "巧克力包层浆果", "item.create.chromatic_compound": "异彩化合物", "item.create.cinder_flour": "下界面粉", "item.create.copper_ingot": "铜锭", @@ -464,6 +471,7 @@ "item.create.handheld_blockzapper": "手持式方块放置器", "item.create.handheld_worldshaper": "手持式环境塑形器", "item.create.honey_bucket": "蜂蜜桶", + "item.create.honeyed_apple": "蜜渍苹果", "item.create.integrated_circuit": "集成电路板", "item.create.iron_sheet": "铁板", "item.create.lapis_sheet": "青金石板", @@ -480,6 +488,7 @@ "item.create.schematic_and_quill": "蓝图与笔", "item.create.shadow_steel": "暗影钢", "item.create.super_glue": "强力胶", + "item.create.sweet_roll": "甜甜卷", "item.create.tree_fertilizer": "树木肥料", "item.create.vertical_gearbox": "竖直十字齿轮箱", "item.create.wand_of_symmetry": "对称之杖", @@ -494,7 +503,7 @@ "advancement.create.root": "欢迎来到机械动力", "advancement.create.root.desc": "是时候来制作一些超赞的机械结构了!", - "advancement.create.andesite_alloy": "头韵狂魔", + "advancement.create.andesite_alloy": "头韵狂魔(Alliterations Aplenty)", "advancement.create.andesite_alloy.desc": "机械动力的材料名字都很古怪,安山合金(Andesite Alloy)就是其中之一。", "advancement.create.its_alive": "鲜活的机械生命", "advancement.create.its_alive.desc": "首次激活齿轮结构的旋转。", @@ -505,7 +514,7 @@ "advancement.create.belt": "海带传动", "advancement.create.belt.desc": "用传送带连接两个传动杆", "advancement.create.tunnel": "找掩护!", - "advancement.create.tunnel.desc": "用隧道修饰传送带。", + "advancement.create.tunnel.desc": "用隧道装饰传送带。", "advancement.create.splitter_tunnel": "分而治之", "advancement.create.splitter_tunnel.desc": "用黄铜隧道设计一个分流器。", "advancement.create.chute": "轰然倒塌", @@ -534,14 +543,14 @@ "advancement.create.stressometer.desc": "放置一个应力表,并且带上工程师护目镜来读取应力数据", "advancement.create.aesthetics": "美观,即是一切!", "advancement.create.aesthetics.desc": "将支架放在传动杆,管道和齿轮上。", - "advancement.create.reinforced": "Boom~加强!", + "advancement.create.reinforced": "Boom~ 加强!", "advancement.create.reinforced.desc": "在传动杆,管道和传送带上使用机壳加固。", "advancement.create.water_wheel": "治水", "advancement.create.water_wheel.desc": "放置一个水车并且让它开始旋转", "advancement.create.chocolate_wheel": "味美动力", "advancement.create.chocolate_wheel.desc": "用熔融巧克力驱动水车。", "advancement.create.lava_wheel": "风火轮", - "advancement.create.lava_wheel.desc": "它本不应该起作用的...", + "advancement.create.lava_wheel.desc": "它本不应该起作用的......", "advancement.create.cuckoo": "到点了吗?", "advancement.create.cuckoo.desc": "目睹布谷鸟钟宣布就寝时间。", "advancement.create.millstone": "便携式粉碎机", @@ -558,7 +567,7 @@ "advancement.create.press.desc": "使用辊压机来辊压一些板子", "advancement.create.polished_rose_quartz": "粉色钻石", "advancement.create.polished_rose_quartz.desc": "用砂纸将玫瑰石英打磨至透明", - "advancement.create.electron_tube": "哔~~哔~~", + "advancement.create.electron_tube": "哔~~ 哔~~", "advancement.create.electron_tube.desc": "制作一个可用于合成高级机器的电子管", "advancement.create.mechanical_saw": "一刀两断", "advancement.create.mechanical_saw.desc": "放置一个动力锯并且为其供能", @@ -667,7 +676,7 @@ "death.attack.create.cuckoo_clock_explosion": "%1$s被布谷鸟钟炸得粉身碎骨", "create.block.deployer.damage_source_name": "二五仔机械手", - "create.block.cart_assembler.invalid": "将您的矿车装备器放在铁轨上", + "create.block.cart_assembler.invalid": "请将矿车装配器放置在铁轨上", "create.recipe.crushing": "粉碎", "create.recipe.milling": "研磨", @@ -687,6 +696,7 @@ "create.recipe.mechanical_crafting": "自动合成", "create.recipe.automatic_shaped": "自动合成", "create.recipe.block_cutting": "方块切割", + "create.recipe.wood_cutting": "木材切割", "create.recipe.blockzapper_upgrade": "手持式方块放置器", "create.recipe.sandpaper_polishing": "砂纸打磨", "create.recipe.mystery_conversion": "神秘转化", @@ -774,7 +784,7 @@ "create.gui.terrainzapper.tool.overlay": "覆盖", "create.gui.terrainzapper.tool.flatten": "平整", - "create.terrainzapper.shiftRightClickToSet": "Shift+鼠标右键以设置塑形类型", + "create.terrainzapper.shiftRightClickToSet": "Shift+鼠标右击以设置塑形类型", "create.blockzapper.usingBlock": "使用:%1$s", "create.blockzapper.componentUpgrades": "组件升级:", @@ -796,16 +806,16 @@ "create.minecart_coupling.too_far": "矿车距离你太远了", "create.contraptions.movement_mode": "运动模式", - "create.contraptions.movement_mode.move_place": "停止时总是实体化方块", - "create.contraptions.movement_mode.move_place_returned": "停止时只在初始位置实体化方块", - "create.contraptions.movement_mode.move_never_place": "只有在动力方块摧毁后才实体化方块", - "create.contraptions.movement_mode.rotate_place": "停止时总是实体化方块", - "create.contraptions.movement_mode.rotate_place_returned": "停止时只在接近初始角度实体化方块", - "create.contraptions.movement_mode.rotate_never_place": "只有在旋转轴摧毁后才实体化方块", + "create.contraptions.movement_mode.move_place": "停止时总是将装置方块化", + "create.contraptions.movement_mode.move_place_returned": "停止时只在初始位置才将装置方块化", + "create.contraptions.movement_mode.move_never_place": "只有在动力方块摧毁后才将装置方块化", + "create.contraptions.movement_mode.rotate_place": "停止时总是将装置方块化", + "create.contraptions.movement_mode.rotate_place_returned": "停止时只在接近初始角度才将装置方块化", + "create.contraptions.movement_mode.rotate_never_place": "只有在旋转轴摧毁后才将装置方块化", "create.contraptions.cart_movement_mode": "矿车运动模式", - "create.contraptions.cart_movement_mode.rotate": "结构与矿车保持相同方向", + "create.contraptions.cart_movement_mode.rotate": "装置与矿车保持相同方向", "create.contraptions.cart_movement_mode.rotate_paused": "矿车转向时机器停止工作", - "create.contraptions.cart_movement_mode.rotation_locked": "结构方向保持不变", + "create.contraptions.cart_movement_mode.rotation_locked": "装置方向保持不变", "create.contraptions.windmill.rotation_direction": "旋转方向", "create.contraptions.clockwork.clock_hands": "钟表指针", "create.contraptions.clockwork.hour_first": "时针优先", @@ -817,14 +827,23 @@ "create.logistics.fluid_filter": "流体过滤器", "create.logistics.firstFrequency": "频道. #1", "create.logistics.secondFrequency": "频道. #2", - "create.logistics.filter.apply": "已将过滤器应用于%1$s。", - "create.logistics.filter.apply_click_again": "已将过滤器应用于%1$s,再次点击可将手持物品数量复制到过滤器上。", + "create.logistics.filter.apply": "已将过滤应用于%1$s。", + "create.logistics.filter.apply_click_again": "已将过滤应用于%1$s,再次点击可将手持物品数量复制到过滤器上。", "create.logistics.filter.apply_count": "已将提取数量应用至过滤器。", "create.gui.goggles.generator_stats": "应力发生器状态:", "create.gui.goggles.kinetic_stats": "动力学状态:", "create.gui.goggles.at_current_speed": "当前速度应力值", "create.gui.goggles.pole_length": "活塞杆长度:", + "create.gui.goggles.fluid_container": "流体容器信息:", + "create.gui.goggles.fluid_container.capacity": "容量:", + "create.gui.assembly.exception": "无法组装该结构:", + "create.gui.assembly.exception.unmovableBlock": "无法移动的方块:(%4$s)位于 [%1$s,%2$s,%3$s]", + "create.gui.assembly.exception.chunkNotLoaded": "位于 [%1$s,%2$s,%3$s] 的方块未处于加载区块", + "create.gui.assembly.exception.structureTooLarge": "结构中的方块数量过多。\n配置中的最大数量限制为:%1$s", + "create.gui.assembly.exception.tooManyPistonPoles": "活塞加装的活塞杆数量过多。\n配置中的最大数量限制为:%1$s", + "create.gui.assembly.exception.noPistonPoles": "活塞缺失部分活塞杆", + "create.gui.assembly.exception.not_enough_sails": "相接的结构所包含的类风帆方块的数量不足。%1$s\n最低需要 %2$s 个方块", "create.gui.goggles.base_value": "应力基础值", "create.gui.gauge.info_header": "仪表信息:", "create.gui.speedometer.title": "旋转速度", @@ -842,13 +861,21 @@ "create.gui.stockpile_switch.move_to_upper_at": "移至上线%1$s%%", "create.gui.sequenced_gearshift.title": "可编程齿轮箱", "create.gui.sequenced_gearshift.instruction": "指令", + "create.gui.sequenced_gearshift.instruction.turn_angle.descriptive": "以特定的角度进行旋转", "create.gui.sequenced_gearshift.instruction.turn_angle": "旋转", "create.gui.sequenced_gearshift.instruction.turn_angle.angle": "角度", + "create.gui.sequenced_gearshift.instruction.turn_distance.descriptive": "开始驱动活塞/软管滑轮/起重机", "create.gui.sequenced_gearshift.instruction.turn_distance": "驱动活塞", "create.gui.sequenced_gearshift.instruction.turn_distance.distance": "距离", + "create.gui.sequenced_gearshift.instruction.delay.descriptive": "时间延迟", + "create.gui.sequenced_gearshift.instruction.delay": "延迟", + "create.gui.sequenced_gearshift.instruction.delay.duration": "时长", + "create.gui.sequenced_gearshift.instruction.end.descriptive": "结束", "create.gui.sequenced_gearshift.instruction.wait": "等待", "create.gui.sequenced_gearshift.instruction.wait.duration": "间隔", "create.gui.sequenced_gearshift.instruction.end": "停止", + "create.gui.sequenced_gearshift.instruction.await.descriptive": "等待新的红石脉冲", + "create.gui.sequenced_gearshift.instruction.await": "等待", "create.gui.sequenced_gearshift.speed": "速度,速度方向", "create.gui.sequenced_gearshift.speed.forward": "一倍速,正向", "create.gui.sequenced_gearshift.speed.forward_fast": "两倍速,正向", @@ -883,7 +910,7 @@ "create.schematic.tool.print": "打印", "create.schematic.tool.flip": "翻转", "create.schematic.tool.deploy.description.0": "将结构移到某个位置。", - "create.schematic.tool.deploy.description.1": "在地面上单击鼠标右键以放置。", + "create.schematic.tool.deploy.description.1": "在地面上单击鼠标右击以放置。", "create.schematic.tool.deploy.description.2": "按住Ctrl以固定距离选择。", "create.schematic.tool.deploy.description.3": "按住Ctrl鼠标滚动更改距离。", "create.schematic.tool.move.description.0": "水平移动蓝图", @@ -899,7 +926,7 @@ "create.schematic.tool.rotate.description.2":"", "create.schematic.tool.rotate.description.3":"", "create.schematic.tool.print.description.0": "立即将结构放置在世界上", - "create.schematic.tool.print.description.1": "右键单机确认当前位置。", + "create.schematic.tool.print.description.1": "右击确认当前位置。", "create.schematic.tool.print.description.2": "该工具仅适用于创造模式。", "create.schematic.tool.print.description.3":"", "create.schematic.tool.flip.description.0": "沿你选择的面翻转蓝图。", @@ -996,8 +1023,8 @@ "create.item_attributes.not_stackable.inverted": "可堆叠", "create.item_attributes.equipable": "可装备", "create.item_attributes.equipable.inverted": "不可装备", - "create.item_attributes.furnace_fuel": "是燃料", - "create.item_attributes.furnace_fuel.inverted": "不是燃料", + "create.item_attributes.furnace_fuel": "可作为燃料", + "create.item_attributes.furnace_fuel.inverted": "不可作为燃料", "create.item_attributes.in_tag": "标签是%1$s", "create.item_attributes.in_tag.inverted": "标签不是%1$s", "create.item_attributes.in_item_group": "属于%1$s", @@ -1006,28 +1033,32 @@ "create.item_attributes.added_by.inverted": "不是由%1$s添加", "create.item_attributes.has_enchant": "有附魔效果%1$s", "create.item_attributes.has_enchant.inverted": "没有附魔效果%1$s", + "create.item_attributes.color": "染色为%1$s", + "create.item_attributes.color.inverted": "未被染成%1$s", + "create.item_attributes.max_enchanted": "已达到最高附魔等", + "create.item_attributes.max_enchanted.inverted": "并未达到最高附魔等级", "create.item_attributes.has_fluid": "包含%1$s", "create.item_attributes.has_fluid.inverted": "不包含%1$s", "create.item_attributes.has_name": "有自定义名称%1$s", "create.item_attributes.has_name.inverted": "没有自定义名称%1$s", "create.item_attributes.book_author": "由%1$s编写", - "create.item_attributes.book_author.inverted": "未由%1$s编写", - "create.item_attributes.book_copy_original": "是原创的", - "create.item_attributes.book_copy_original.inverted": "不是原创的", + "create.item_attributes.book_author.inverted": "不是由%1$s编写", + "create.item_attributes.book_copy_original": "是初版", + "create.item_attributes.book_copy_original.inverted": "不是初版", "create.item_attributes.book_copy_first": "是第一代拷贝", "create.item_attributes.book_copy_first.inverted": "不是第一代拷贝", "create.item_attributes.book_copy_second": "是第二代拷贝", "create.item_attributes.book_copy_second.inverted": "不是第二代拷贝", - "create.item_attributes.book_copy_tattered": "是一片狼藉", - "create.item_attributes.book_copy_tattered.inverted": "不是一片狼藉", - "create.item_attributes.astralsorcery_crystal": "具有晶体属性%1$s", - "create.item_attributes.astralsorcery_crystal.inverted": "不具有晶体属性%1$s", - "create.item_attributes.astralsorcery_constellation": "与%1$s调谐", - "create.item_attributes.astralsorcery_constellation.inverted": "未与%1$s调谐", - "create.item_attributes.astralsorcery_perk_gem": "具有特殊属性%1$s", - "create.item_attributes.astralsorcery_perk_gem.inverted": "不具有特殊属性%1$s", - "create.item_attributes.astralsorcery_amulet": "提升%1$s", - "create.item_attributes.astralsorcery_amulet.inverted": "不提升%1$s", + "create.item_attributes.book_copy_tattered": "拷贝次数已不可查", + "create.item_attributes.book_copy_tattered.inverted": "不是拷贝次数已不可查", + "create.item_attributes.astralsorcery_crystal": "有水晶石属性%1$s", + "create.item_attributes.astralsorcery_crystal.inverted": "没有水晶石属性%1$s", + "create.item_attributes.astralsorcery_constellation": "与%1$s共鸣", + "create.item_attributes.astralsorcery_constellation.inverted": "不与%1$s共鸣", + "create.item_attributes.astralsorcery_perk_gem": "带有有星能力属性%1$s", + "create.item_attributes.astralsorcery_perk_gem.inverted": "不带有星能力属性%1$s", + "create.item_attributes.astralsorcery_amulet": "璀璨棱镜增强%1$s", + "create.item_attributes.astralsorcery_amulet.inverted": "璀璨棱镜未增强%1$s", "create.gui.attribute_filter.no_selected_attributes": "没有标记任何属性", "create.gui.attribute_filter.selected_attributes": "已选择的属性:", @@ -1041,6 +1072,8 @@ "create.gui.attribute_filter.deny_list.description": "只要没有上述属性,就可以通过", "create.gui.attribute_filter.add_reference_item": "添加参考物品", + "create.tooltip.holdForDescription": "按住 [%1$s] 可查看概要", + "create.tooltip.holdForControls": "按住 [%1$s] 可查看控制方法", "create.tooltip.holdKey": "按住 [%1$s]", "create.tooltip.holdKeyOrKey": "按住 [%1$s] 或 [%2$s]", "create.tooltip.keyShift": "Shift", @@ -1064,17 +1097,23 @@ "create.mechanical_arm.extract_from": "从%1$s中拿取物品", "create.mechanical_arm.deposit_to": "向%1$s存储物品", - "create.mechanical_arm.summary": "动力臂的输入为%1$s,输出为%2$s。", + "create.mechanical_arm.summary": "动力臂当前有%1$s个输入,%2$s个输出。", "create.mechanical_arm.points_outside_range":"由于距离限制,选定的交互点%1$s已被移除。", + "create.weighted_ejector.target_set": "目标已选取", + "create.weighted_ejector.target_not_valid": "弹射至临近方块(目标无效)", + "create.weighted_ejector.no_target": "弹射至临近方块(未选择目标)", + "create.weighted_ejector.targeting": "弹射至[%1$s,%2$s,%3$s]", + "create.weighted_ejector.stack_size": "弹射物品堆数量", + "create.logistics.when_multiple_outputs_available": "当多个输出可用时", "create.mechanical_arm.selection_mode.round_robin": "轮询调度", "create.mechanical_arm.selection_mode.forced_round_robin": "强制轮询调度", "create.mechanical_arm.selection_mode.prefer_first": "第一目标优先", - "create.tunnel.selection_mode.split": "分摊", - "create.tunnel.selection_mode.forced_split": "强制分摊", + "create.tunnel.selection_mode.split": "分流", + "create.tunnel.selection_mode.forced_split": "强制分流", "create.tunnel.selection_mode.round_robin": "轮询调度", "create.tunnel.selection_mode.forced_round_robin": "强制轮询调度", "create.tunnel.selection_mode.prefer_nearest": "最近优先", @@ -1094,13 +1133,13 @@ "create.hint.hose_pulley.title": "无限供应", "create.hint.hose_pulley": "目标液体对象被视为无限量的。", "create.hint.mechanical_arm_no_targets.title": "没有目标", - "create.hint.mechanical_arm_no_targets": "看起来这个_动力臂_没有被分配给任何_目标_。在手持机械臂的同时,右键选取传送带、置物台、漏斗或其他设备来设置目标。", + "create.hint.mechanical_arm_no_targets": "看起来这个_动力臂_没有被分配给任何_目标_。在手持机械臂的同时,右击选取传送带、置物台、漏斗或其他设备来设置目标。", "create.hint.horizontal_funnel.title": "水平漏斗", "create.hint.horizontal_funnel": "无法_直接_在两个物品栏间移动物品。请使用传送带或者置物台来从物品栏中提取物品。", "create.hint.upward_funnel.title": "漏斗向上", "create.hint.upward_funnel": "只可以传送由_动力臂_,鼓风机驱动的_溜槽_或者被投掷的物品。请试着做一些溜槽来垂直运输物品。", "create.hint.empty_bearing.title": "更新轴承", - "create.hint.empty_bearing": "_空手右键_轴承来_激活_你新建造的结构。", + "create.hint.empty_bearing": "_空手右击_轴承来_激活_你新建造的结构。", "create.hint.full_deployer.title": "机械手物品溢出", "create.hint.full_deployer": "_机械手_包含_过剩的物品,_需要被_提取。你需要_使用_料斗,__漏斗_或其他方法将溢出释放出来。", @@ -1121,8 +1160,10 @@ "create.command.killTPSCommand.status.usage.1": "[Create]: 用 /killtps start 来手动降低服务器TPS速度", "create.command.killTPSCommand.argument.tickTime": "tickTime", + "create.contraption.minecart_contraption_too_big": "这一矿车装置似乎太大了,无法变为拾捡状态", + "create.subtitle.schematicannon_launch_block": "蓝图加农炮:发射", - "create.subtitle.schematicannon_finish": "蓝图加农炮:完成任务", + "create.subtitle.schematicannon_finish": "蓝图加农炮:叮", "create.subtitle.slime_added": "粘液:挤碎声", "create.subtitle.mechanical_press_activation": "辊压机:工作中", "create.subtitle.mechanical_press_item_break": "金属碰撞", @@ -1130,7 +1171,7 @@ "create.subtitle.blockzapper_confirm": "选择方块", "create.subtitle.blockzapper_deny": "放置失败", "create.subtitle.block_funnel_eat": "漏斗:吞食", - "create.subtitle.blaze_munch": "烈焰人:开心地咀嚼着", + "create.subtitle.blaze_munch": "烈焰人:咀嚼", "_": "->------------------------] Item Descriptions [------------------------<-", @@ -1145,16 +1186,16 @@ "item.create.example_item.tooltip.action1": "These controls are displayed.", "block.create.andesite_encased_shaft.tooltip": "安山传动杆箱", - "block.create.andesite_encased_shaft.tooltip.summary": "_创造模式_物品。用安山机壳包裹世界中的传动杆,机壳不会被消耗。", + "block.create.andesite_encased_shaft.tooltip.summary": "_创造模式_才可获得这一物品。用_安山机壳_包裹放置在_世界中_的传动杆即可获得,机壳不会被消耗。", "block.create.brass_encased_shaft.tooltip": "黄铜传动杆箱", - "block.create.brass_encased_shaft.tooltip.summary": "_创造模式_物品。用黄铜机壳包裹世界中的传动杆,机壳不会被消耗。", + "block.create.brass_encased_shaft.tooltip.summary": "_创造模式_才可获得这一物品。用_黄铜机壳_包裹放置在_世界中_的传动杆即可获得,机壳不会被消耗。", "block.create.wooden_bracket.tooltip": "木质支架", - "block.create.wooden_bracket.tooltip.summary": "用这种给人温馨感的木质支架,来_装饰_你的_传动杆_,_齿轮_和_管道_吧。", + "block.create.wooden_bracket.tooltip.summary": "用这种给人温馨感的木质支架_装饰_你的_传动杆_,_齿轮_和_管道_吧。", "block.create.metal_bracket.tooltip": "金属支架", - "block.create.metal_bracket.tooltip.summary": "用这种工业风格的金属支架,来_装饰_你的_传动杆_,_齿轮_和_管道_吧。", + "block.create.metal_bracket.tooltip.summary": "用这种工业风格的金属支架_装饰_你的_传动杆_,_齿轮_和_管道_吧。", "block.create.andesite_casing.tooltip": "安山机壳", "block.create.andesite_casing.tooltip.summary": "具有多种用途的简单机壳,可用于加固并装饰_传动杆_,_传送带_", @@ -1170,11 +1211,11 @@ "block.create.andesite_tunnel.tooltip": "安山隧道", "block.create.andesite_tunnel.tooltip.summary": "这种美观大方且兼具保护能力的遮掩物专为_传送带_而设计。_安山隧道_可以从主传送带上的一堆物品中抽取出一个物品,并将该物品放置到侧面的传送带或者置物台上。", - "block.create.andesite_tunnel.tooltip.control1": "扳手右键侧面时", + "block.create.andesite_tunnel.tooltip.control1": "扳手右击侧面时", "block.create.andesite_tunnel.tooltip.action1": "如果传送带隧道串联的数量达到三个或以上,可在位于中间的隧道侧面上开启关闭百叶窗。", "block.create.brass_funnel.tooltip": "黄铜漏斗", - "block.create.brass_funnel.tooltip.summary": "一种常用的传输设备,配合各种物流结构传输物品,可由_红石信号_控制,并附带·过滤槽·。", + "block.create.brass_funnel.tooltip.summary": "一种常用的传输设备,配合各种物流结构传输物品,可由_红石信号_控制,并附带_过滤槽_。", "block.create.brass_funnel.tooltip.condition1": "一般行为", "block.create.brass_funnel.tooltip.behaviour1": "开口的面会吸收面前一格内的_掉落物_,并_传输_到它与吸收位置的方向相反的_容器_里。", "block.create.brass_funnel.tooltip.condition2": "当装配在传送带、置物台等类似的组件上时", @@ -1184,16 +1225,16 @@ "block.create.brass_tunnel.tooltip": "黄铜隧道", "block.create.brass_tunnel.tooltip.summary": "这种美观大方且兼具保护能力的遮掩物专为_传送带_而设计。不仅如此,_黄铜隧道_还带有物品_过滤_以及_分流_的配置选项。", - "block.create.brass_tunnel.tooltip.condition1": "当它们_并排放置_时", + "block.create.brass_tunnel.tooltip.condition1": "当它们并排放置时", "block.create.brass_tunnel.tooltip.behaviour1": "紧挨着的_黄铜隧道_可以让传送带路线上穿过的物品_重定向_到与其并排的传送带路线上。", "block.create.brass_tunnel.tooltip.condition2": "过滤", "block.create.brass_tunnel.tooltip.behaviour2": "_黄铜隧道_的_输入_方向和_输出_方向都带有过滤插槽。如果进入的物品不满足隧道输出端的过滤条件,则该物品会从并排的其他隧道出口传出。", - "block.create.brass_tunnel.tooltip.condition3": "分流", - "block.create.brass_tunnel.tooltip.behaviour3": "_黄铜隧道_可以为并排的传送带路线提供多个物品分流的方案。", - "block.create.brass_tunnel.tooltip.control1": "扳手右键侧面时", + "block.create.brass_tunnel.tooltip.condition3": "分配", + "block.create.brass_tunnel.tooltip.behaviour3": "_黄铜隧道_可以为并排的传送带路线提供多个物品分配的方案。", + "block.create.brass_tunnel.tooltip.control1": "扳手右击侧面时", "block.create.brass_tunnel.tooltip.action1": "如果传送带隧道串联的数量达到三个或以上,可在位于中间的隧道侧面上开启关闭百叶窗。", "block.create.brass_tunnel.tooltip.control2": "手持扳手在隧道顶部滚动鼠标滚轮", - "block.create.brass_tunnel.tooltip.action2": "更改_隧道_的分流模式。", + "block.create.brass_tunnel.tooltip.action2": "更改_隧道_的分配模式。", "block.create.copper_casing.tooltip": "铜机壳", "block.create.copper_casing.tooltip.summary": "具有多种用途的坚固机壳,可用于装饰。", @@ -1205,25 +1246,25 @@ "block.create.copper_valve_handle.tooltip": "铜阀门手轮", "block.create.copper_valve_handle.tooltip.summary": "精确的动力来源,需要玩家手动操作。注意不要让自己太累!", - "block.create.copper_valve_handle.tooltip.condition1": "右键使用时", + "block.create.copper_valve_handle.tooltip.condition1": "右击使用时", "block.create.copper_valve_handle.tooltip.behaviour1": "为连接的设备提供动力。潜行状态下反向旋转。", "block.create.seat.tooltip": "坐垫", "block.create.seat.tooltip.summary": "坐下来享受旅程吧!坐垫将会把玩家固定在一个移动装置上。也可以用来作为居家装饰,毕竟他有许多颜色。", - "block.create.seat.tooltip.condition1": "右键坐垫", + "block.create.seat.tooltip.condition1": "右击坐垫", "block.create.seat.tooltip.behaviour1": "会使得玩家坐在_坐垫_上,L-Shift可离开_坐垫_。", "block.create.chute.tooltip": "溜槽", - "block.create.chute.tooltip.summary": "用于_收集_并_垂直_或_对角_运输_物品。可以从_容器_中抽取也可向_容器_输入。它的侧面可以被_漏斗_、_侧装漏斗_等传输设备交互", + "block.create.chute.tooltip.summary": "用于_收集_并_垂直_或_对角_进行物品_传输_。可以从_容器_中抽取也可向_容器_输入。它的侧面可以被_漏斗_、_侧装漏斗_等传输设备交互", "block.create.chute.tooltip.condition1": "当被上方的鼓风机通风时", "block.create.chute.tooltip.behaviour1": "由_鼓风机_驱动的_溜槽_可由下向上传输_物品_,可以从_置物台_或者_传送带_上吸取物品。", "block.create.depot.tooltip": "置物台", "block.create.depot.tooltip.summary": "一个方便的放置物品的地方。它为多台机器提供了一个交互点", - "block.create.depot.tooltip.condition1": "右键置物台", + "block.create.depot.tooltip.condition1": "右击置物台", "block.create.depot.tooltip.behaviour1": "可以在_置物台_放置或取出物品。可以与_传送带_交互的方块或装置也可以与_置物台_交互。", - "item.create.blaze_cake.tooltip": "熔岩蛋糕", + "item.create.blaze_cake.tooltip": "烈焰蛋糕", "item.create.blaze_cake.tooltip.summary": "为辛勤劳作的_烈焰人_精心准备的美味。让他们兴奋起来吧!", "item.create.empty_blaze_burner.tooltip": "空的烈焰人燃烧室", @@ -1235,7 +1276,7 @@ "block.create.fluid_pipe.tooltip.summary": "用于传输_流体_。需要一个_动力泵_来提供压强。", "block.create.fluid_pipe.tooltip.condition1": "转移流体", "block.create.fluid_pipe.tooltip.behaviour1": "可以与_流体容器_如_储罐_或_工作盆_相连_。裸露的_管道_末端也可以排放或抽取流体。注意别漏水了!", - "block.create.fluid_pipe.tooltip.control1": "使用扳手右键", + "block.create.fluid_pipe.tooltip.control1": "使用扳手右击", "block.create.fluid_pipe.tooltip.action1": "如果可能的话,在管道侧面开启/关闭窗口。", "block.create.hose_pulley.tooltip": "软管滑轮", @@ -1249,14 +1290,14 @@ "block.create.fluid_tank.tooltip": "流体储罐", "block.create.fluid_tank.tooltip.summary": "_存储_任意_流体_,根据整体结构的宽和高决定其储存容量", - "block.create.fluid_tank.tooltip.condition1": "使用扳手右键", + "block.create.fluid_tank.tooltip.condition1": "使用扳手右击", "block.create.fluid_tank.tooltip.behaviour1": "打开或关闭窗户", "block.create.creative_fluid_tank.tooltip": "创造流体储罐", "block.create.creative_fluid_tank.tooltip.summary": "此流体储罐能够_无限的复制_任何流体,根据整体结构的宽和高决定其储存容量", "block.create.creative_fluid_tank.tooltip.condition1": "罐中装有流体时", - "block.create.creative_fluid_tank.tooltip.behaviour1": "任意的_流体提取设备_能够从中提取无穷无尽的指定流体,流体的导入功能同时也会无效。", - "block.create.creative_fluid_tank.tooltip.condition2": "使用扳手右键", + "block.create.creative_fluid_tank.tooltip.behaviour1": "任意的_流体提取设备_能够从中提取无穷无尽的指定流体,流体的导入功能同时也会无效。", + "block.create.creative_fluid_tank.tooltip.condition2": "使用扳手右击", "block.create.creative_fluid_tank.tooltip.behaviour2": "打开或关闭窗户", "block.create.fluid_valve.tooltip": "流体阀门", @@ -1268,14 +1309,14 @@ "block.create.mechanical_pump.tooltip.summary": "_接入动力_,能迫使流体_沿管道指定方向移动_。在两个方向上都有_最大的作用范围_。(默认为16个方块距离)", "block.create.mechanical_pump.tooltip.condition1": "流体流向", "block.create.mechanical_pump.tooltip.behaviour1": "_接入动力_后会产生压力,迫使流体通过管道。_反转动力_的方向以切换流体_流向_。", - "block.create.mechanical_pump.tooltip.control1": "扳手右键时", + "block.create.mechanical_pump.tooltip.control1": "扳手右击时", "block.create.mechanical_pump.tooltip.action1": "反转泵的方向,从而改变默认的流体流向", "block.create.smart_fluid_pipe.tooltip": "智能流体管道", "block.create.smart_fluid_pipe.tooltip.summary": "带有过滤器的_流体管道_。可以指定其只流通特定的_流体_。", "block.create.smart_fluid_pipe.tooltip.condition1": "当流体进入时", "block.create.smart_fluid_pipe.tooltip.behaviour1": "进入的流体与_过滤器_不匹配时,智能管道将_阻止_其通过。", - "block.create.smart_fluid_pipe.tooltip.condition2": "与_流体容器相邻_时", + "block.create.smart_fluid_pipe.tooltip.condition2": "与流体容器相邻时", "block.create.smart_fluid_pipe.tooltip.behaviour2": "_智能管道_会开始从_相邻的任何容器_中抽取与其过滤器匹配的流体。", "block.create.spout.tooltip": "注液器", @@ -1295,7 +1336,7 @@ "block.create.mechanical_arm.tooltip.condition1": "转移物品", "block.create.mechanical_arm.tooltip.behaviour1": "可以从任意_可够到的设备_中拿取或放置物品,比如说_传送带_,_置物台_,_漏斗_以及_动力合成器_。", "block.create.mechanical_arm.tooltip.control1": "手持时", - "block.create.mechanical_arm.tooltip.action1": "右键单击一个_可使用的容器_来将其设置为_动力臂_的_输入端_。右键双击将其设置为_动力臂_的_输出端_。", + "block.create.mechanical_arm.tooltip.action1": "右击一个_可使用的容器_来将其设置为_动力臂_的_输入端_。右键双击将其设置为_动力臂_的_输出端_。", "block.create.mechanical_arm.tooltip.control2": "手持扳手滚动滚轮", "block.create.mechanical_arm.tooltip.action2": "调整_动力臂_输出物品时的调度模式。", @@ -1303,11 +1344,11 @@ "item.create.wand_of_symmetry.tooltip.summary": "完美地镜面复制工作区域内的方块到另一边", "item.create.wand_of_symmetry.tooltip.condition1": "当在快捷栏时", "item.create.wand_of_symmetry.tooltip.behaviour1": "持续进行镜面复制。", - "item.create.wand_of_symmetry.tooltip.control1": "当右键地面时", + "item.create.wand_of_symmetry.tooltip.control1": "当右击地面时", "item.create.wand_of_symmetry.tooltip.action1": "_创建_或_移动_镜面。", - "item.create.wand_of_symmetry.tooltip.control2": "当右键空气时", + "item.create.wand_of_symmetry.tooltip.control2": "当右击空气时", "item.create.wand_of_symmetry.tooltip.action2": "_删除_镜面。", - "item.create.wand_of_symmetry.tooltip.control3": "当潜行右键时", + "item.create.wand_of_symmetry.tooltip.control3": "当潜行右击时", "item.create.wand_of_symmetry.tooltip.action3": "打开_配置界面_。", "item.create.handheld_blockzapper.tooltip": "手持式方块放置器", @@ -1342,17 +1383,17 @@ "item.create.extendo_grip.tooltip.behaviour1": "增加_主手_所使用物品的_接触距离_。", "item.create.filter.tooltip": "过滤器", - "item.create.filter.tooltip.summary": "可用于_精确_控制物流设备的_输出_以及_输入_,使得通过的物品流与_一组_物品或者数个 _相嵌套的过滤器_相匹配。", + "item.create.filter.tooltip.summary": "可用于_精确_控制物流设备的_输出_以及_输入_,使得通过的物品流与_一组_物品或者数个_相嵌套的过滤器_相匹配。", "item.create.filter.tooltip.condition1": "放置于过滤插槽中时", "item.create.filter.tooltip.behaviour1": "根据_过滤器_的配置,来_决定_物品流是否能够通过。", - "item.create.filter.tooltip.condition2": "当右键时", + "item.create.filter.tooltip.condition2": "当右击时", "item.create.filter.tooltip.behaviour2": "打开_配置面板_。", "item.create.attribute_filter.tooltip": "属性过滤器", "item.create.attribute_filter.tooltip.summary": "可用于_精确_控制物流设备的_输出_以及_输入_,使得通过的物品流与_一组_物品_属性_以及_分类_相匹配。", "item.create.attribute_filter.tooltip.condition1": "放置于过滤插槽中时", "item.create.attribute_filter.tooltip.behaviour1": "根据_过滤器_的配置,来_决定_物品流是否能够通过。", - "item.create.attribute_filter.tooltip.condition2": "当右键时", + "item.create.attribute_filter.tooltip.condition2": "当右击时", "item.create.attribute_filter.tooltip.behaviour2": "打开_配置面板_。", "item.create.empty_schematic.tooltip": "空白蓝图", @@ -1362,16 +1403,16 @@ "item.create.schematic.tooltip.summary": "可将结构部署并放置到世界中,将蓝图全息影像部署完毕后,使用_蓝图加农炮_进行结构建造。", "item.create.schematic.tooltip.condition1": "当手持蓝图时", "item.create.schematic.tooltip.behaviour1": "可以使用屏幕上的工具调整位置", - "item.create.schematic.tooltip.control1": "当潜行右键时", + "item.create.schematic.tooltip.control1": "当潜行右击时", "item.create.schematic.tooltip.action1": "打开一个用于输入_精确坐标_的界面。", "item.create.schematic_and_quill.tooltip": "蓝图与笔", "item.create.schematic_and_quill.tooltip.summary": "用于将世界中的结构保存到 .nbt 文件。", "item.create.schematic_and_quill.tooltip.condition1": "第一步", - "item.create.schematic_and_quill.tooltip.behaviour1": "手持蓝图与笔右键选择两个对角点", + "item.create.schematic_and_quill.tooltip.behaviour1": "手持蓝图与笔右击选择两个对角点", "item.create.schematic_and_quill.tooltip.condition2": "第二步", - "item.create.schematic_and_quill.tooltip.behaviour2": "对准选定区域,按住 Ctrl 键并滑动鼠标滚轮,可以调整选区的大小,右键保存。", - "item.create.schematic_and_quill.tooltip.control1": "右键", + "item.create.schematic_and_quill.tooltip.behaviour2": "对准选定区域,按住 Ctrl 键并滑动鼠标滚轮,可以调整选区的大小,右击保存。", + "item.create.schematic_and_quill.tooltip.control1": "右击", "item.create.schematic_and_quill.tooltip.action1": "选取一个对角点/确认保存。", "item.create.schematic_and_quill.tooltip.control2": "按住 Ctrl ", "item.create.schematic_and_quill.tooltip.action2": "可在_空中_选择点,_滑动滚轮_可调整距离。", @@ -1380,7 +1421,7 @@ "block.create.schematicannon.tooltip": "蓝图加农炮", "block.create.schematicannon.tooltip.summary": "发射方块,重新构建已在世界中部署的_蓝图_,会使用相邻箱子中的物品进行填充,_火药_作为燃料。", - "block.create.schematicannon.tooltip.control1": "当右键时", + "block.create.schematicannon.tooltip.control1": "当右击时", "block.create.schematicannon.tooltip.action1": "打开_界面_", "block.create.schematic_table.tooltip": "蓝图桌", @@ -1392,7 +1433,7 @@ "block.create.shaft.tooltip.summary": "将_旋转_进行直线传递。", "block.create.cogwheel.tooltip": "齿轮", - "block.create.cogwheel.tooltip.summary": "将_旋转_进行直线传递,或者传递旋转到邻近的_齿轮_上", + "block.create.cogwheel.tooltip.summary": "将_旋转_进行直线传递,或者传递旋转到临近的_齿轮_上", "block.create.large_cogwheel.tooltip": "大齿轮", "block.create.large_cogwheel.tooltip.summary": "大号齿轮传动结构,连接到_齿轮_时改变其_转速_。", @@ -1411,7 +1452,7 @@ "block.create.clutch.tooltip": "离合器", "block.create.clutch.tooltip.summary": "可用于控制与其相连的传动杆的转动/停转。", "block.create.clutch.tooltip.condition1": "当提供红石信号时", - "block.create.clutch.tooltip.behaviour1": " _停止_ 另一侧的旋转。", + "block.create.clutch.tooltip.behaviour1": "_停止_另一侧的旋转。", "block.create.encased_chain_drive.tooltip": "链式传动箱", "block.create.encased_chain_drive.tooltip.summary": "将动能_传递_给直线上或侧面相贴的_链式传动箱_,相邻的链式传动箱会结合在一起,前提是接触面没有传动杆. 它们的朝向不必一致。", @@ -1425,9 +1466,9 @@ "item.create.belt_connector.tooltip": "传送带", "item.create.belt_connector.tooltip.summary": "用_传送带_连接两个或多个_传动杆_,连接的传动杆将具有完全相同的转速和方向。传送带可以_传输实体_和_物品_。", - "item.create.belt_connector.tooltip.control1": "当右键传动杆时", + "item.create.belt_connector.tooltip.control1": "当右击传动杆时", "item.create.belt_connector.tooltip.action1": "选择传动杆作为传送带的传输点,选定的两个传动杆都必须相互_垂直_,_水平_或_对角平齐_。", - "item.create.belt_connector.tooltip.control2": "当潜行右键时", + "item.create.belt_connector.tooltip.control2": "当潜行右击时", "item.create.belt_connector.tooltip.action2": "_重置_传送带的第一个选定位置", "item.create.goggles.tooltip": "工程师护目镜", @@ -1436,12 +1477,14 @@ "item.create.goggles.tooltip.behaviour1": "根据对应动力组件的_转速等级_,显示它的_颜色指示器_,也会显示这个组件的_应力影响_以及_应力量_。", "item.create.goggles.tooltip.condition2": "当看向仪表时", "item.create.goggles.tooltip.behaviour2": "将会显示与仪表相连的网络的_转速_、_应力_等详细信息。", + "item.create.goggles.tooltip.condition3": "当看向流体容器时", + "item.create.goggles.tooltip.behaviour3": "显示出方块的_容量_细节,以及其中包含的所有_流体_。", "item.create.wrench.tooltip": "扳手", "item.create.wrench.tooltip.summary": "操控动力组件的使用工具。可用于_旋转_,_拆除_以及_配置_组件。", - "item.create.wrench.tooltip.control1": "当右键点击_动力方块_时", + "item.create.wrench.tooltip.control1": "当右击_动力方块_时", "item.create.wrench.tooltip.action1": "以点击的面为轴心_旋转_点击的方块", - "item.create.wrench.tooltip.control2": "当潜行右键时", + "item.create.wrench.tooltip.control2": "当潜行右击时", "item.create.wrench.tooltip.action2": "会_拆除动力组件_并将其移动到你的背包中。", "block.create.creative_motor.tooltip": "创造马达", @@ -1465,7 +1508,7 @@ "block.create.hand_crank.tooltip": "手摇曲柄", "block.create.hand_crank.tooltip.summary": "一种简单的动力源,需要_人工转动_,注意不要让自己太累!", "block.create.hand_crank.tooltip.condition1": "当使用时", - "block.create.hand_crank.tooltip.behaviour1": "向依附的结构提供_动力_,_潜行_时将会提供_反向_的旋转动力", + "block.create.hand_crank.tooltip.behaviour1": "向依附的结构提供_动力_,_潜行_时将会提供_反向_的旋转力", "block.create.cuckoo_clock.tooltip": "布谷鸟闹钟", "block.create.cuckoo_clock.tooltip.summary": "精致的工艺品,能够记录时间", @@ -1473,13 +1516,13 @@ "block.create.cuckoo_clock.tooltip.behaviour1": "显示_当前时间_并且一天会咕咕两次。_中午_咕咕一次,_黄昏可以睡觉_的时候咕咕一次 ", "block.create.turntable.tooltip": "转盘", - "block.create.turntable.tooltip.summary": "让旋转动力给你带来一场刺激的旋转风车体验。", + "block.create.turntable.tooltip.summary": "让旋转力给你带来一场刺激的旋转风车体验。", "block.create.millstone.tooltip": "石磨", "block.create.millstone.tooltip.summary": "一个能_研磨物品_的动能装置,可以被临近的_齿轮_供能,或者可以在底部用传动杆供能,成品必须被提取出石磨", "block.create.millstone.tooltip.condition1": "当接入动力时", "block.create.millstone.tooltip.behaviour1": "开始根据_研磨配方_来处理被放入的物品,物品可以从侧面和上面放入。", - "block.create.millstone.tooltip.condition2": "当右键时", + "block.create.millstone.tooltip.condition2": "当右击时", "block.create.millstone.tooltip.behaviour2": "手动取出研磨后的产物。", "block.create.crushing_wheel.tooltip": "粉碎轮", @@ -1489,11 +1532,11 @@ "block.create.mechanical_press.tooltip": "动力辊压机", "block.create.mechanical_press.tooltip.summary": "一个强力的活塞式机器,用于压制其下方的物品。", - "block.create.mechanical_press.tooltip.condition1": "当提供_红石信号_时", + "block.create.mechanical_press.tooltip.condition1": "当提供红石信号时", "block.create.mechanical_press.tooltip.behaviour1": "_压制_其下方的物品。", "block.create.mechanical_press.tooltip.condition2": "在传送带上方时", "block.create.mechanical_press.tooltip.behaviour2": "_自动压缩_经过传送带的物品。", - "block.create.mechanical_press.tooltip.condition3": "在_工作盆_上方时", + "block.create.mechanical_press.tooltip.condition3": "在工作盆上方时", "block.create.mechanical_press.tooltip.behaviour3": "开始_压缩_配方中允许压缩的物品。", "block.create.basin.tooltip": "工作盆", @@ -1506,7 +1549,7 @@ "block.create.blaze_burner.tooltip.condition1": "放置于工作盆下方时", "block.create.blaze_burner.tooltip.behaviour1": "为工作盆配方_提供热量_。", "block.create.blaze_burner.tooltip.condition2": "对烈焰人燃烧室使用可燃物时", - "block.create.blaze_burner.tooltip.behaviour2": "_消耗_可燃物,并根据该物品在_熔炉中的燃烧时间_来延长_烈焰加热器的燃烧时间_,使用_熔岩蛋糕_投喂将提供_更高的温度_。", + "block.create.blaze_burner.tooltip.behaviour2": "_消耗_可燃物,并根据该物品在_熔炉中的燃烧时间_来延长_烈焰加热器的燃烧时间_,使用_烈焰蛋糕_投喂将提供_更高的温度_。", "block.create.reinforced_rail.tooltip": "强化铁轨", "block.create.reinforced_rail.tooltip.summary": "牢固稳定的铁轨,下方不需要_方块支撑_。", @@ -1538,16 +1581,16 @@ "block.create.flywheel.tooltip.behaviour1": "将会提供相应的_旋转动能_。", "block.create.portable_storage_interface.tooltip": "移动存储接口", - "block.create.portable_storage_interface.tooltip.summary": "为动力活塞、装配矿车、旋转轴承、滑轮_等移动结构_设计的_物流接口_,_移动结构_和_固定结构_之间的物品交换站,两个接口会面时将_自动对接_,且必须彼此隔开1-2个方块。", - "block.create.portable_storage_interface.tooltip.condition1": "装配在移动结构上时", - "block.create.portable_storage_interface.tooltip.behaviour1": "移动到能够满足与_固定结构_上的_移动式存储接口_对接的条件后,移动结构会_短暂地停下_,开始对接,并直接与_移动结构上的_存储容器_交互,进行物品的_输入输出_。", + "block.create.portable_storage_interface.tooltip.summary": "为动力活塞、装配矿车、旋转轴承、滑轮_等运动结构_设计的_物流接口_,_运动结构_和_固定结构_之间的物品交换站,两个接口会面时将_自动对接_,且必须彼此隔开 1-2 个方块。", + "block.create.portable_storage_interface.tooltip.condition1": "装配在运动结构上时", + "block.create.portable_storage_interface.tooltip.behaviour1": "移动到能够满足与_固定结构_上的_移动式存储接口_对接的条件后,运动结构会_短暂地停下_,开始对接,并直接与_运动结构上的_存储容器_交互,进行物品的_输入输出_。", "block.create.portable_storage_interface.tooltip.condition2": "通入红石信号时时", "block.create.portable_storage_interface.tooltip.behaviour2": "立即断开任何处于激活状态的连接。", "block.create.portable_fluid_interface.tooltip": "移动流体接口", - "block.create.portable_fluid_interface.tooltip.summary": "为动力活塞、装配矿车、旋转轴承、滑轮_等移动结构_设计的_流体接口_,_移动结构_和_固定结构_之间的流体交换站,两个接口会面时将_自动对接_,且必须彼此隔开1-2个方块。", - "block.create.portable_fluid_interface.tooltip.condition1": "装配在移动结构上时", - "block.create.portable_fluid_interface.tooltip.behaviour1": "移动到能够满足与_固定结构_上的_移动式流体接口_对接的条件后,移动结构会_短暂地停下_,开始对接,并直接与_移动结构上的_流体储罐_交互,进行流体的_导入导出_。", + "block.create.portable_fluid_interface.tooltip.summary": "为动力活塞、装配矿车、旋转轴承、滑轮_等运动结构_设计的_流体接口_,_运动结构_和_固定结构_之间的流体交换站,两个接口会面时将_自动对接_,且必须彼此隔开 1-2 个方块。", + "block.create.portable_fluid_interface.tooltip.condition1": "装配在运动结构上时", + "block.create.portable_fluid_interface.tooltip.behaviour1": "移动到能够满足与_固定结构_上的_移动式流体接口_对接的条件后,运动结构会_短暂地停下_,开始对接,并直接与_运动结构_上的_流体储罐_交互,进行流体的_导入导出_。", "block.create.portable_fluid_interface.tooltip.condition2": "通入红石信号时时", "block.create.portable_fluid_interface.tooltip.behaviour2": "立即断开任何处于激活状态的连接。", @@ -1567,13 +1610,13 @@ "block.create.piston_extension_pole.tooltip.behaviour1": "活塞的移动范围将扩大", "block.create.mechanical_bearing.tooltip": "动力轴承", - "block.create.mechanical_bearing.tooltip.summary": "使用旋转力旋转_大型结构_ 。", + "block.create.mechanical_bearing.tooltip.summary": "使用旋转力旋转_大型结构_。", "block.create.mechanical_bearing.tooltip.condition1": "接入动力时", "block.create.mechanical_bearing.tooltip.behaviour1": "开始使相接的方块旋转。使用_机壳底盘_,_粘液球_或者_强力胶_将方块连接在一起,可以使得动力轴承带动更多的方块。", "block.create.windmill_bearing.tooltip": "风车轴承", "block.create.windmill_bearing.tooltip.summary": "借助_风的力量_创造_动力_。设计你的独特风车,让其肆意旋转吧!", - "block.create.windmill_bearing.tooltip.condition1": "右键时", + "block.create.windmill_bearing.tooltip.condition1": "右击时", "block.create.windmill_bearing.tooltip.behaviour1": "启动轴承,提供由其_附加结构_的旋转产生的动力。结构必须包括合适的_风帆_或_羊毛_。使用_机壳底盘_,_粘液块_或_强力胶_可以带动更多方块旋转。", "block.create.sail_frame.tooltip": "风帆框架", @@ -1581,7 +1624,7 @@ "block.create.white_sail.tooltip": "风帆", "block.create.white_sail.tooltip.summary": "可用于_组装风车_的结构方块,不俗的动力来源,有多种颜色。", - "block.create.white_sail.tooltip.condition1": "使用染料右键时", + "block.create.white_sail.tooltip.condition1": "使用染料右击时", "block.create.white_sail.tooltip.behaviour1": "改变颜色。", "block.create.clockwork_bearing.tooltip": "时钟轴承", @@ -1590,18 +1633,18 @@ "block.create.clockwork_bearing.tooltip.behaviour1": "旋转第一个连接的结构作为时针,第二个连接的结构作为分针", "block.create.sequenced_gearshift.tooltip": "可编程齿轮箱", - "block.create.sequenced_gearshift.tooltip.summary": "一种可编程的组件,可以根据内部的指令设计旋转的_方向_,_速度_,以及_距离_。此组件可以有效配合活塞和轴承等使用。最高可让其按_顺序_执行_5条指令_。在高转速时工作精度可能会下降。", + "block.create.sequenced_gearshift.tooltip.summary": "一种可编程的组件,可以根据内部的指令设计旋转的_方向_,_速度_,以及_距离_。此组件可以有效配合活塞和轴承等使用。最高可让其按_顺序_执行_ 5 条指令_。在高转速时工作精度可能会下降。", "block.create.sequenced_gearshift.tooltip.condition1": "当通入红石信号时", "block.create.sequenced_gearshift.tooltip.behaviour1": "在接入动能的情况下,执行指令。", - "block.create.sequenced_gearshift.tooltip.condition2": "当右键时", + "block.create.sequenced_gearshift.tooltip.condition2": "当右击时", "block.create.sequenced_gearshift.tooltip.behaviour2": "将打开_配置界面_", "block.create.cart_assembler.tooltip": "矿车装配站", - "block.create.cart_assembler.tooltip.summary": "当放置于铁轨上时,将会_装配_或者_卸载_穿越它的矿车移动结构。按下 [Ctrl] 可以查阅它在不同轨道上的行为。", + "block.create.cart_assembler.tooltip.summary": "当放置于铁轨上时,将会_装配_或者_卸载_穿越它的矿车运动结构。按下 [Ctrl] 可以查阅它在不同轨道上的行为。", "block.create.cart_assembler.tooltip.condition1": "单个矿车结构", - "block.create.cart_assembler.tooltip.behaviour1": "只有_单个_矿车装配结构,整个结构在旋转时会以这_单个_矿车为基点。使用_扳手_可以指定结构的_旋转行为_。", - "block.create.cart_assembler.tooltip.condition2": "连续矿车结构", - "block.create.cart_assembler.tooltip.behaviour2": "由_一整个结构所相连_的两个矿车装配结构,这_两个矿车_会被这_架设于它们之间的结构连接起来。这一结构的行为类似于_矿车联轴器_。", + "block.create.cart_assembler.tooltip.behaviour1": "只有_单个_矿车装置,整个结构在旋转时会以这_单个_矿车为基点。使用_扳手_可以指定结构的_旋转行为_。", + "block.create.cart_assembler.tooltip.condition2": "连接矿车结构", + "block.create.cart_assembler.tooltip.behaviour2": "由_一整个结构所相连_的两个矿车装置,这_两个矿车_会被这_架设于它们之间的结构连接起来。这一结构的行为类似于_矿车联轴器_。", "block.create.cart_assembler.tooltip.control1": "放置于轨道上时", "block.create.cart_assembler.tooltip.action1": "通入红石信号时_装配_经过的矿车,未激活时_卸载_经过的矿车。", "block.create.cart_assembler.tooltip.control2": "放置于充能铁轨上时", @@ -1617,24 +1660,24 @@ "block.create.rope_pulley.tooltip.behaviour1": "根据输入的转速的大小以及方向,移动链接的结构。", "block.create.linear_chassis.tooltip": "机壳底盘", - "block.create.linear_chassis.tooltip.summary": "一种可配置的基础方块,用于连接移动结构。", + "block.create.linear_chassis.tooltip.summary": "一种可配置的基础方块,用于连接运动结构。", "block.create.linear_chassis.tooltip.condition1": "被移动时", - "block.create.linear_chassis.tooltip.behaviour1": "_带动_所有_相接的底盘_,以及上方一定范围内的柱形方块进行同方向移动。上方的方块想要被_带动_,底盘上面的面必须是_有黏性的_。(详参 Ctrl )", + "block.create.linear_chassis.tooltip.behaviour1": "_带动_所有_相接的底盘_,以及上方一定范围内的柱形方块进行同方向移动。上方的方块想要被_带动_,底盘上面的面必须是_有黏性的_。(详参 Ctrl)", "block.create.linear_chassis.tooltip.condition2": "手持扳手查看时", - "block.create.linear_chassis.tooltip.behaviour2": "配置可连接方块的_范围_。按住_Ctrl_可以同时配置相连的其他底盘。", - "block.create.linear_chassis.tooltip.control1": "当用粘液球右键时", + "block.create.linear_chassis.tooltip.behaviour2": "配置可连接方块的_范围_。按住 _Ctrl_ 可以同时配置相连的其他底盘。", + "block.create.linear_chassis.tooltip.control1": "当用粘液球右击时", "block.create.linear_chassis.tooltip.action1": "使得被使用面具有_黏性_。当移动时,无论具体的移动方向如何,底盘都会_带动_与该面相接的方块。", "block.create.secondary_linear_chassis.tooltip": "机壳底盘2号", "block.create.secondary_linear_chassis.tooltip.summary": "第二种_机壳底盘_,不会与第一种机壳底盘互相连接。", "block.create.radial_chassis.tooltip": "旋转底盘", - "block.create.radial_chassis.tooltip.summary": "一种可配置的基础方块,用于连接移动结构。", + "block.create.radial_chassis.tooltip.summary": "一种可配置的基础方块,用于连接运动结构。", "block.create.radial_chassis.tooltip.condition1": "当被旋转时", "block.create.radial_chassis.tooltip.behaviour1": "_带动_所有_附着于它_的,位于_其上方成柱形_的方块。侧面所附着的方块必需在一定的范围内且附着的面必须是有黏性的,方可被带动。(详参 Ctrl)", "block.create.radial_chassis.tooltip.condition2": "手持扳手查看时", "block.create.radial_chassis.tooltip.behaviour2": "配置可连接方块的_范围_。按住_Ctrl_可以同时配置相连的其他底盘。", - "block.create.radial_chassis.tooltip.control1": "当用粘液球右键时", + "block.create.radial_chassis.tooltip.control1": "当用粘液球右击时", "block.create.radial_chassis.tooltip.action1": "使旋转底盘的这一面_具有黏性_。所有该方向上与其相连的方块会与其_一同移动_。", "block.create.mechanical_drill.tooltip": "动力钻头", @@ -1665,7 +1708,7 @@ "block.create.stockpile_switch.tooltip": "存量转换器", "block.create.stockpile_switch.tooltip.summary": "根据连接的容器中_储存物品_的数量切换红石信号强度。自带有过滤槽,与_比较器_不同的是,你可以配置_存量转换器_信号反转的_阈值_。", - "block.create.stockpile_switch.tooltip.condition1": "当右键时", + "block.create.stockpile_switch.tooltip.condition1": "当右击时", "block.create.stockpile_switch.tooltip.behaviour1": "打开_配置界面_。", "block.create.content_observer.tooltip": "物品侦测器", @@ -1675,9 +1718,9 @@ "block.create.redstone_link.tooltip.summary": "无线红石信号终端,可以使用_任何物品_编辑终端_频道_。虽然距离挺远,但是终归是有限的。", "block.create.redstone_link.tooltip.condition1": "当启用时", "block.create.redstone_link.tooltip.behaviour1": "接收相同_频道_提供的_红石信号_。", - "block.create.redstone_link.tooltip.control1": "当手持方块右键方块时", + "block.create.redstone_link.tooltip.control1": "当手持方块右击方块时", "block.create.redstone_link.tooltip.action1": "手持_任意物品_为其设置_频道_,可以使用两种物品组合设置_频道_。", - "block.create.redstone_link.tooltip.control2": "当潜行右键时", + "block.create.redstone_link.tooltip.control2": "当潜行右击时", "block.create.redstone_link.tooltip.action2": "在_发射模式_和_接收模式_之间切换。", "block.create.nixie_tube.tooltip": "辉光管", @@ -1689,34 +1732,34 @@ "block.create.redstone_contact.tooltip": "接触式红石信号发生器", "block.create.redstone_contact.tooltip.summary": "一种用于高级红石装置的设备。只能两两工作。可以被_动力活塞_和_动力轴承_等控制类机器带动。", - "block.create.redstone_contact.tooltip.condition1": "当正对面放置也放置_相互朝向_的接触信号发生器时", + "block.create.redstone_contact.tooltip.condition1": "当正对面放置也放置相互朝向的接触信号发生器时", "block.create.redstone_contact.tooltip.behaviour1": "发出_红石信号_。", "block.create.redstone_contact.tooltip.condition2": "当移动时", "block.create.redstone_contact.tooltip.behaviour2": "会使所有与其接触的发生器发出红石信号。", "block.create.adjustable_crate.tooltip": "可调节板条箱", "block.create.adjustable_crate.tooltip.summary": "该箱子支持玩家对其容量进行调整,最大可以容纳_16组_物品。支持_红石比较器_。", - "block.create.adjustable_crate.tooltip.control1": "当右键时", + "block.create.adjustable_crate.tooltip.control1": "当右击时", "block.create.adjustable_crate.tooltip.action1": "打开箱子", "block.create.creative_crate.tooltip": "创造板条箱", "block.create.creative_crate.tooltip.summary": "这种_储存容器_可以无限地复制任何物品。它还可以移除附近的_蓝图加农炮_的材料需求。", "block.create.creative_crate.tooltip.condition1": "当标记了物品时", - "block.create.creative_crate.tooltip.behaviour1": "任何从容器中_提取_的物品都是_无限量的_ ,而任何_放置_到容器中的物品都会被_送入虚空_", + "block.create.creative_crate.tooltip.behaviour1": "任何从容器中_提取_的物品都是_无限量的_,而任何_放置_到容器中的物品都会被_送入虚空_", "block.create.deployer.tooltip": "机械手", - "block.create.deployer.tooltip.summary": "_攻击_,_使用_,以及 _激活_。这个机器会竭尽所能地_模仿_一个_玩家_的行为。它可以将物品从其自身的_物品栏_中_拿取_出来,或者将物品_存入_其中。Held items have to be _inserted_ and _extracted_ from the block directly.", + "block.create.deployer.tooltip.summary": "_攻击_,_使用_,以及_激活_。这个机器会竭尽所能地_模仿_一个_玩家_的行为。它可以将物品从其自身的_物品栏_中_拿取_出来,或者将物品_存入_其中。", "block.create.deployer.tooltip.condition1": "接入动能时", "block.create.deployer.tooltip.behaviour1": "机械手可伸长_两个方块_的距离,取出_缓存区_的物品并使用。", - "block.create.deployer.tooltip.condition2": "当使用扳手右键时", + "block.create.deployer.tooltip.condition2": "当使用扳手右击时", "block.create.deployer.tooltip.behaviour2": "启用拳头模式,在拳头模式之下,机械手将会试图使用手中的物品_破坏方块_,或者_攻击实体_。", - "block.create.deployer.tooltip.condition3": "配有_过滤器_时", + "block.create.deployer.tooltip.condition3": "配有过滤器时", "block.create.deployer.tooltip.behaviour3": "只有在机械手手持的物品与_过滤器_物品相_匹配_时才会激活。不匹配的物品无法被其持有;匹配且持有在机械手上的物品无法被提取。", "block.create.brass_casing.tooltip": "黄铜机壳", "block.create.brass_casing.tooltip.summary": "一种坚固的机壳,有多种用途。可以用来包装_传动杆_以及_传送带_。", - "block.create.pulse_repeater.tooltip": "可调节脉冲中继器", + "block.create.pulse_repeater.tooltip": "脉冲中继器", "block.create.pulse_repeater.tooltip.summary": "一个简单的电路元件,将通过的红石信号变为 1 tick。", "block.create.adjustable_repeater.tooltip": "可调节中继器", @@ -1725,11 +1768,11 @@ "block.create.adjustable_pulse_repeater.tooltip": "可调节脉冲中继器", "block.create.adjustable_pulse_repeater.tooltip.summary": "一种单次 1 tick 的红石脉冲器,可以调节延时至30 min。", - "block.create.analog_lever.tooltip": "可调节拉杆", + "block.create.analog_lever.tooltip": "模拟拉杆", "block.create.analog_lever.tooltip.summary": "一种可以调节任意信号强度的推杆。", - "block.create.powered_toggle_latch.tooltip": "T触发器", - "block.create.powered_toggle_latch.tooltip.summary": "一种拉杆,在红石电路中可以用作t触发器。", + "block.create.powered_toggle_latch.tooltip": "转换锁存器", + "block.create.powered_toggle_latch.tooltip.summary": "一种拉杆,在红石电路中可以用作转换锁存器。", "block.create.powered_latch.tooltip": "锁存器", "block.create.powered_latch.tooltip.summary": "一种拉杆,在红石电路中用作锁存器,从后方输入将会启用这个拉杆,从侧边输入将会重置这个拉杆。", @@ -1756,7 +1799,7 @@ "item.create.super_glue.tooltip": "强力胶", "item.create.super_glue.tooltip.summary": "让两个方块互相_粘在一起_,他们将再也无法分开了。", - "item.create.super_glue.tooltip.condition1": "右键使用时", + "item.create.super_glue.tooltip.condition1": "右击使用时", "item.create.super_glue.tooltip.behaviour1": "有强力胶的方块的_那一面_会变得有黏性。和此面相邻的方块在被_动力活塞_或者_动力轴承_等方块驱动的时候会被一同带动", "item.create.super_glue.tooltip.condition2": "在副手上时", "item.create.super_glue.tooltip.behaviour2": "主手放置的方块会被_直接_粘在所放置的方块上", @@ -1790,6 +1833,693 @@ "create.tooltip.randomWipDescription7": "这玩意不是给你用的,换个吧", "create.tooltip.randomWipDescription8": "试试就逝世。", + + "_": "->------------------------] Ponder Content [------------------------<-", + + "create.ponder.hold_to_ponder": "按住 [%1$s] 开始思索", + "create.ponder.subject": "情景主题", + "create.ponder.pondering": "思索...", + "create.ponder.identify_mode": "名称显示模式开,[%1$s]来继续思索", + "create.ponder.associated": "关联词条", + "create.ponder.close": "思索结束", + "create.ponder.identify": "显示方块名称", + "create.ponder.next": "下一情景", + "create.ponder.previous": "前一情景", + "create.ponder.replay": "重放", + "create.ponder.think_back": "回想", + "create.ponder.slow_text": "舒适阅读", + "create.ponder.shared.movement_anchors": "有了底盘和强力胶,移动起大型结构轻轻松松。", + "create.ponder.shared.rpm32": "32 RPM", + "create.ponder.shared.sneak_and": "潜行 +", + "create.ponder.shared.storage_on_contraption": "与装置相接的存储空间,会自动将装置遇到的掉落物拾取到空间内。", + "create.ponder.shared.behaviour_modify_wrench": "可以用扳手调整它的行为。", + "create.ponder.shared.rpm8": "8 RPM", + "create.ponder.shared.ctrl_and": "Ctrl +", + "create.ponder.shared.rpm16_source": "动力源:16 R", + "create.ponder.shared.rpm16": "16 RPM", + "create.ponder.tag.kinetic_sources": "动力源", + "create.ponder.tag.kinetic_sources.description": "能够发生动力的组件。", + "create.ponder.tag.contraption_actor": "装置执行组件", + "create.ponder.tag.contraption_actor.description": "能在移动的装置上执行特殊功能的组件", + "create.ponder.tag.arm_targets": "机械臂的工作目标", + "create.ponder.tag.arm_targets.description": "该组件可做为机械臂的输入或者输出点。", + "create.ponder.tag.logistics": "物品运输", + "create.ponder.tag.logistics.description": "该组件可以协助物品运输", + "create.ponder.tag.movement_anchor": "运动源泉", + "create.ponder.tag.movement_anchor.description": "有了它,运动装置才得以可能,它可以以数种方式使相接的结构运动起来。", + "create.ponder.tag.creative": "创造模式", + "create.ponder.tag.creative.description": "总有些东西是生存模式得不到的。", + "create.ponder.tag.kinetic_relays": "动力方块", + "create.ponder.tag.kinetic_relays.description": "用于传递旋转力的组件。", + "create.ponder.tag.windmill_sails": "风车轴承的帆", + "create.ponder.tag.windmill_sails.description": "在进行风车组装时会被算入风车旋转力的方块,这些方块的效能都是一样的。", + "create.ponder.tag.contraption_assembly": "方块连接物件", + "create.ponder.tag.contraption_assembly.description": "将各个组件连接以便同时运动的物件", + "create.ponder.tag.decoration": "装饰", + "create.ponder.tag.decoration.description": "装饰是这些组件的常见用法。", + "create.ponder.tag.kinetic_appliances": "动力设备", + "create.ponder.tag.kinetic_appliances.description": "这些组件可以利用旋转力进行工作。", + "create.ponder.tag.redstone": "逻辑组件", + "create.ponder.tag.redstone.description": "这些组件会在红石工程中发挥大用处。", + "create.ponder.tag.fluids": "流体操纵器械", + "create.ponder.tag.fluids.description": "这些组件可以用于传递流体,以及利用流体进行工作。", + + "create.ponder.adjustable_pulse_repeater.header": "使用可调节脉冲中继器控制信号发送", + "create.ponder.adjustable_pulse_repeater.text_1": "可调节脉冲中继器在一段延时之后会发出一道短时脉冲", + "create.ponder.adjustable_pulse_repeater.text_2": "滑动滚轮即可更改延时时间", + "create.ponder.adjustable_pulse_repeater.text_3": "延时配置范围的上限为 30 分钟", + + "create.ponder.adjustable_repeater.header": "使用可调节中继器控制信号发送", + "create.ponder.adjustable_repeater.text_1": "可调节中继器与常规的中继器的行为较为相似", + "create.ponder.adjustable_repeater.text_2": "它们会进行一段时间的充能,时长为设定的时间...", + "create.ponder.adjustable_repeater.text_3": "...然后以同样的时长逐渐退出充能状态", + "create.ponder.adjustable_repeater.text_4": "滑动滚轮即可更改充能时间", + "create.ponder.adjustable_repeater.text_5": "延时配置范围的上限为 30 分钟", + + "create.ponder.analog_lever.header": "使用模拟拉杆控制信号发送", + "create.ponder.analog_lever.text_1": "要想使得红石信号源信号强度精确且占地面积小,模拟拉杆不可少。", + "create.ponder.analog_lever.text_2": "右击可以提升输出模拟信号的强度", + "create.ponder.analog_lever.text_3": "潜行右击将会减少输出模拟信号的强度", + + "create.ponder.andesite_tunnel.header": "安山隧道用法", + "create.ponder.andesite_tunnel.text_1": "安山隧道可用于遮掩传送带", + "create.ponder.andesite_tunnel.text_2": "只要在漏斗的侧边加装上安山隧道...", + "create.ponder.andesite_tunnel.text_3": "...路过的所有物品堆都会被精准地拣出一个物品", + "create.ponder.andesite_tunnel.text_4": "剩下的物品则不受影响,继续前进", + + "create.ponder.basin.header": "工作盆内物品处理", + "create.ponder.basin.text_1": "一个可以对放入的物品以及流体进行处理的盆", + "create.ponder.basin.text_2": "处理完毕后,工作盆会尝试从它的底面进行产物输出", + "create.ponder.basin.text_3": "若在正确的位置上放置了有效的组件,工作盆会显示出一个输出龙头", + "create.ponder.basin.text_4": "有多种设备可以引发工作盆的这一行为", + "create.ponder.basin.text_5": "产物会被输出到盆下方的存储空间内", + "create.ponder.basin.text_6": "如果没有显示出输出龙头,那么盆内的产物将会一直留存在盆内", + "create.ponder.basin.text_7": "这在产物需要作为新一轮处理的原料时相当有用", + "create.ponder.basin.text_8": "需要输出的产物仍需从盆内取出", + "create.ponder.basin.text_9": "若是加装过滤,那么你便无需担心会将未被处理的物品抽取出来了", + + "create.ponder.bearing_modes.header": "动力轴承的运动模式", + "create.ponder.bearing_modes.text_1": "当结构停止时,轴承会控制结构以特定的角度停在最近的与格相对齐之处", + "create.ponder.bearing_modes.text_2": "你可以调整整个结构永不方块化,或者仅在结构的起始位置方块化", + + "create.ponder.belt_casing.header": "带机壳的传送带", + "create.ponder.belt_casing.text_1": "你可以用黄铜或者安山机壳装饰你的传送带", + "create.ponder.belt_casing.text_2": "使用扳手即可移除机壳", + + "create.ponder.belt_connector.header": "传送带用法", + "create.ponder.belt_connector.text_1": "手持传送带右击两根传动杆,可以将两根杆连接起来。", + "create.ponder.belt_connector.text_2": "如果不小心选错了,潜行右击即可取消选择", + "create.ponder.belt_connector.text_3": "你也可以在传送带的中间加装额外的传动杆", + "create.ponder.belt_connector.text_4": "通过传送带相连的传动杆,会以相同的转速以及方向进行旋转", + "create.ponder.belt_connector.text_5": "加装的传动杆可以用扳手拆下来", + "create.ponder.belt_connector.text_6": "传送带亦可染色", + + "create.ponder.belt_directions.header": "传送带的有效连接方向", + "create.ponder.belt_directions.text_1": "传送带的连接方向并不是任意的", + "create.ponder.belt_directions.text_2": "1. 可以水平连接", + "create.ponder.belt_directions.text_3": "2. 可以对角连接", + "create.ponder.belt_directions.text_4": "3. 可以垂直连接", + "create.ponder.belt_directions.text_5": "4. 还可以水平连接竖直放置的传动杆", + "create.ponder.belt_directions.text_6": "以上为所有可能的连接方向。传送带的连接范围为 2 到 20 格", + + "create.ponder.belt_transport.header": "在物流中使用传送带", + "create.ponder.belt_transport.text_1": "运动的传送带可以运输物品以及其他实体", + "create.ponder.belt_transport.text_2": "空手右击传送带,即可将其上的物品拿下来。", + + "create.ponder.blaze_burner.header": "烈焰人燃烧室补喂", + "create.ponder.blaze_burner.text_1": "烈焰人燃烧室可以为工作盆的物品处理提供热量", + "create.ponder.blaze_burner.text_2": "因而,你需要喂给室内的烈焰人一些可燃物品", + "create.ponder.blaze_burner.text_3": "如果喂给了它烈焰蛋糕,它还能达到更强的热力等级", + "create.ponder.blaze_burner.text_4": "你可以用机械手或者机械臂进行自动化补喂", + + "create.ponder.brass_funnel.header": "黄铜漏斗", + "create.ponder.brass_funnel.text_1": "安山岩漏斗一次只能提取出一个物品。", + "create.ponder.brass_funnel.text_2": "黄铜漏斗可以一次提取一组物品。", + "create.ponder.brass_funnel.text_3": "对着过滤槽滑动滚轮,还可以精确调节黄铜漏斗的提取数量。", + "create.ponder.brass_funnel.text_4": "对着过滤槽使用某个物品,可以限制漏斗的行为,使其只传输匹配的物品。", + + "create.ponder.brass_tunnel.header": "黄铜隧道用法", + "create.ponder.brass_tunnel.text_1": "黄铜隧道可以遮掩住你的传送带", + "create.ponder.brass_tunnel.text_2": "隧道的每一个开口面都有过滤槽", + "create.ponder.brass_tunnel.text_3": "在输入处的过滤槽仅会阻挡住不匹配的物品", + "create.ponder.brass_tunnel.text_4": "输出处的过滤槽可用于以种类为依据的物品整理", + "create.ponder.brass_tunnel.text_5": "如果有数种匹配的物品通过,那么隧道的分配模式将会决定这些物品何去何从", + "create.ponder.brass_tunnel.text_6": "连接了平行传送带的黄铜隧道,会将隧道、传送带组成一个组", + "create.ponder.brass_tunnel.text_7": "输入组内的物品会被分配到所有组内连接的对象中", + "create.ponder.brass_tunnel.text_8": "在这一情况下,你仍可以将物品直接输入到隧道方块中", + + "create.ponder.brass_tunnel_modes.header": "黄铜隧道的分配模式", + "create.ponder.brass_tunnel_modes.text_1": "使用扳手即可调节隧道的分配模式", + "create.ponder.brass_tunnel_modes.text_10": "“同步输入”是黄铜隧道的一种特殊设定", + "create.ponder.brass_tunnel_modes.text_11": "只有在组内全部的隧道都有一个等待通过的物品时,物品才能通过此隧道", + "create.ponder.brass_tunnel_modes.text_12": "这确保了所有受影响的传送带能够以相同的速率进行物品补给", + "create.ponder.brass_tunnel_modes.text_2": "“分流”会尝试将物品堆分流传输到可用的输出端", + "create.ponder.brass_tunnel_modes.text_3": "如果某个输出端无法容纳更多的物品,那么此出口不纳入分流的运算中", + "create.ponder.brass_tunnel_modes.text_4": "“强制分流”不会跳过某个输出端,而是一直等待着此输出端能够容纳更多物品,才会继续物品传输", + "create.ponder.brass_tunnel_modes.text_5": "“轮询调度”会保持物品堆完整,循环检索各个输出口,满足条件后将物品堆全部送入 ", + "create.ponder.brass_tunnel_modes.text_6": "与分流类似,如果输出口无法容纳更多物品,那它会被跳过", + "create.ponder.brass_tunnel_modes.text_7": "“强制轮询调度”不会跳过输出口", + "create.ponder.brass_tunnel_modes.text_8": "“最近优先”会将物品优先送入距离输入口更近的输出口", + "create.ponder.brass_tunnel_modes.text_9": "“随机”会随机选择一个输出口,一次性送入所有物品", + + "create.ponder.cart_assembler.header": "使用矿车装配站组装运动结构", + "create.ponder.cart_assembler.text_1": "矿车装配站会将它所连接的结构安装到矿车上", + "create.ponder.cart_assembler.text_2": "若没有通入红石信号,它会将矿车装置解散为方块的形式", + "create.ponder.cart_assembler.text_3": "对着矿车使用你的扳手,装置会变为可搬运的形式", + + "create.ponder.cart_assembler_dual.header": "组装连接结构", + "create.ponder.cart_assembler_dual.text_1": "若两个装配矿车分享了同一个结构", + "create.ponder.cart_assembler_dual.text_2": "给其中的任意一方的矿车装配站通入红石信号,都会创建出连接装置", + "create.ponder.cart_assembler_dual.text_3": "两辆矿车的此时行为与用矿车连轴器连接在一起时十分相似", + + "create.ponder.cart_assembler_modes.header": "矿车装置的方向设定", + "create.ponder.cart_assembler_modes.text_1": "矿车装置会随着矿车的运动而发生转向", + "create.ponder.cart_assembler_modes.text_2": "如果装配结构的方向锁定了,那么结构的方向将不再改变", + + "create.ponder.cart_assembler_rails.header": "另外几种矿车以及铁轨", + "create.ponder.cart_assembler_rails.text_1": "放置在普通轨道上的矿车装配站并不会影响路过矿车装置的运动", + "create.ponder.cart_assembler_rails.text_2": "如果放置在充能或控制铁轨上且没有通入红石信号,那么路过的矿车将会停在此处", + "create.ponder.cart_assembler_rails.text_3": "另外的几种矿车可以当作锚来使用", + "create.ponder.cart_assembler_rails.text_4": "熔炉矿车会试图始终保持燃烧状态,并试图从路过的存储空间内抽取燃料", + + "create.ponder.chain_drive.header": "使用链式传动箱传动旋转力", + "create.ponder.chain_drive.text_1": "同一行上的链式传动箱会相互间传递旋转", + "create.ponder.chain_drive.text_2": "所有以此种方式连接的传动杆都会以相同的方向进行旋转", + "create.ponder.chain_drive.text_3": "同一行的传动箱内的任意一个传动箱,旋转 90 度之后仍可以正常工作", + + "create.ponder.chain_gearshift.header": "利用可调节链式传动箱进行转速调节", + "create.ponder.chain_gearshift.text_1": "未充能的可调节链式传动箱与普通链式传动箱无异", + "create.ponder.chain_gearshift.text_2": "当被充能时,它将会把旋转力以双倍转速传动至其他链式传动箱", + "create.ponder.chain_gearshift.text_3": "若被充能的可调节传动箱并不是动力输入端,则它会减半转速", + "create.ponder.chain_gearshift.text_4": "在这两种情况中,同一组的其他链式传动箱的转速都为被充能的可调节链式传动箱的两倍", + "create.ponder.chain_gearshift.text_5": "转速的倍率可在 x1 和 x2 间根据红石信号的强弱来精确调整", + "create.ponder.chain_gearshift.text_6": "12 RPM", + + "create.ponder.chute.header": "使用溜槽向下运输物品", + "create.ponder.chute.text_1": "溜槽可在两个存储空间之间垂直传送物品", + "create.ponder.chute.text_2": "使用扳手右击可以在溜槽上设置观察窗", + "create.ponder.chute.text_3": "对着另一个溜槽的侧面放置另一个溜槽,将会放置下一个呈对角状的溜槽", + + "create.ponder.chute_upward.header": "使用溜槽向上运输物品", + "create.ponder.chute_upward.text_1": "在溜槽上或下方使用鼓风机时,物品会根据风的方向向上或下移动", + "create.ponder.chute_upward.text_2": "佩戴工程师护目镜时,你可以看见物品的移动方向", + "create.ponder.chute_upward.text_3": "在溜槽“被挡住的”底端,物品只能从侧边进行提取或输入", + + "create.ponder.clockwork_bearing.header": "使用时钟轴承来移动结构", + "create.ponder.clockwork_bearing.text_1": "时钟轴承黏附其正前方的方块", + "create.ponder.clockwork_bearing.text_2": "当接受旋转力时,其附着结构会根据游戏内时间来进行旋转", + "create.ponder.clockwork_bearing.text_3": "3:00", + "create.ponder.clockwork_bearing.text_4": "4:00", + "create.ponder.clockwork_bearing.text_5": "右击可以来激活/停止结构运动", + "create.ponder.clockwork_bearing.text_6": "在时针前方可添加第二个结构", + "create.ponder.clockwork_bearing.text_7": "请确保这两个结构没有互相被例如强力胶等方式黏附", + "create.ponder.clockwork_bearing.text_8": "第二个结构将会作为分针进行旋转", + + "create.ponder.clutch.header": "使用离合器控制旋转力", + "create.ponder.clutch.text_1": "离合器能将旋转力直线传递", + "create.ponder.clutch.text_2": "当被红石充能,离合器会断开动力传递", + + "create.ponder.cog_speedup.header": "使用齿轮来换挡变速", + "create.ponder.cog_speedup.text_1": "大齿轮与小齿轮可以斜向传递动力", + "create.ponder.cog_speedup.text_2": "从大齿轮传递动力至小齿轮时,转速翻倍", + "create.ponder.cog_speedup.text_3": "从小齿轮传递动力至大齿轮时,转速减半", + + "create.ponder.cogwheel.header": "使用齿轮来传递旋转力", + "create.ponder.cogwheel.text_1": "齿轮会将动力传递至临近的齿轮", + "create.ponder.cogwheel.text_2": "以此方式连接的齿轮,旋转方向相反", + + "create.ponder.creative_motor.header": "使用创造马达发生旋转", + "create.ponder.creative_motor.text_1": "创造马达不仅能够手动调配输出旋转力,而且体积相当小巧", + "create.ponder.creative_motor.text_2": "对其背侧面板滚动滑轮,可以改变马达的输出旋转转速", + + "create.ponder.crushing_wheels.header": "使用粉碎轮处理物品", + "create.ponder.crushing_wheels.text_1": "一对粉碎轮,磨物快又准", + "create.ponder.crushing_wheels.text_2": "接入的旋转必须使得这两个轮子从上到下啮合转动", + "create.ponder.crushing_wheels.text_3": "扔入或者放入的物品都会被粉碎处理", + "create.ponder.crushing_wheels.text_4": "你也可以使用自动化方案进行物品的输入以及拾取", + + "create.ponder.deployer.header": "使用机械手", + "create.ponder.deployer.text_1": "接入旋转力,机械手便可以模仿玩家的交互行为", + "create.ponder.deployer.text_10": "对着机械手的前部右击,即可将手上的物品给予它使用", + "create.ponder.deployer.text_11": "物品也可以自动化输入到机械手内", + "create.ponder.deployer.text_12": "机械手附带一个过滤槽", + "create.ponder.deployer.text_13": "当设定了过滤后,只有当它的手中物品与过滤相匹配时,它才会工作", + "create.ponder.deployer.text_14": "只有与过滤匹配的物品才可输入...", + "create.ponder.deployer.text_15": "...只有不匹配的物品方可被抽取出来", + "create.ponder.deployer.text_2": "它只会与它正前方两格处的位置进行交互", + "create.ponder.deployer.text_3": "放在在它面前的方块不会阻拦它的工作", + "create.ponder.deployer.text_4": "机械手可以:", + "create.ponder.deployer.text_5": "放置方块", + "create.ponder.deployer.text_6": "使用物品", + "create.ponder.deployer.text_7": "激活方块", + "create.ponder.deployer.text_8": "采收方块", + "create.ponder.deployer.text_9": "以及攻击生物", + + "create.ponder.deployer_contraption.header": "在装置上使用机械手", + "create.ponder.deployer_contraption.text_1": "当机械手在移动的结构上时...", + "create.ponder.deployer_contraption.text_2": "机械手会对每一个经过的方块使用装置中任意容器内的物品", + "create.ponder.deployer_contraption.text_3": "可以通过过滤槽来指定其从存储空间中抽取的物品", + + "create.ponder.deployer_modes.header": "机械手的模式", + "create.ponder.deployer_modes.text_1": "在默认情况下,机械手模仿玩家的右击交互", + "create.ponder.deployer_modes.text_2": "使用扳手可以将模式调整为模仿玩家的左击交互", + + "create.ponder.deployer_redstone.header": "使用红石控制机械手", + "create.ponder.deployer_redstone.text_1": "当被红石充能时,机械手会停止工作", + "create.ponder.deployer_redstone.text_2": "在停止工作前,机械手会完成当前正在进行的工作周期", + "create.ponder.deployer_redstone.text_3": "因此,通入单次负红石脉冲可以精确控制机械手,使其每次只进行单个周期的工作", + + "create.ponder.depot.header": "使用置物台", + "create.ponder.depot.text_1": "置物台可以被当成一个“静止的”传送带原件使用", + "create.ponder.depot.text_2": "右击可以手动放置或取下物品", + "create.ponder.depot.text_3": "与传送带一样,它也可以将其内的物品转送到其他设备中进行加工...", + "create.ponder.depot.text_4": "...同时物品也可以被机械手存取", + + "create.ponder.empty_blaze_burner.header": "使用空的烈焰人燃烧室", + "create.ponder.empty_blaze_burner.text_1": "手持空的烈焰人燃烧室右击烈焰人来抓取烈焰人", + "create.ponder.empty_blaze_burner.text_2": "或者,也可以通过右击烈焰人刷怪笼来填充激活烈焰人燃烧室", + "create.ponder.empty_blaze_burner.text_3": "这样,你便有了一个可供部分机器加工的热源", + "create.ponder.empty_blaze_burner.text_4": "如果是为了美观,空的烈焰人燃烧室也可以被打火石点燃", + "create.ponder.empty_blaze_burner.text_5": "但是,这样的热源不足以给机器提加工供足够的热量", + + "create.ponder.fan_direction.header": "鼓风机的气流", + "create.ponder.fan_direction.text_1": "鼓风机使用旋转力来制造气流", + "create.ponder.fan_direction.text_2": "流速以及方向由所接收旋转力的强弱以及方向而定", + + "create.ponder.fan_processing.header": "使用鼓风机加工物品", + "create.ponder.fan_processing.text_1": "当气流吹过熔岩时,气流会被加热", + "create.ponder.fan_processing.text_2": "热气流中的物品会被冶炼", + "create.ponder.fan_processing.text_3": "但在气流中的食物会被直接烧成灰", + "create.ponder.fan_processing.text_4": "而想要烹饪食物,必须要通过吹过火焰的气流来烟熏食物", + "create.ponder.fan_processing.text_5": "当气流吹过水后,便可用于洗涤物品", + "create.ponder.fan_processing.text_6": "这种加工方法可以做到不少有趣的事情", + "create.ponder.fan_processing.text_7": "鼓风机的转速对加工的速度没有影响,只影响气流的吹拂距离", + "create.ponder.fan_processing.text_8": "而那些放置在置物台或者传送带上的物品,鼓风机也是可以处理的", + + "create.ponder.fan_source.header": "使用鼓风机来产生旋转力", + "create.ponder.fan_source.text_1": "如鼓风机的扇叶向下朝着热源放置,鼓风机可以借此产生旋转力", + "create.ponder.fan_source.text_2": "当鼓风机接受红石信号后,它便会向外供给旋转力", + + "create.ponder.flywheel.header": "使用飞轮来产生旋转力", + "create.ponder.flywheel.text_1": "飞轮和熔炉引擎必须配套使用,方可产生旋转力", + "create.ponder.flywheel.text_2": "如此产生的旋转力具有非常大的应力值", + "create.ponder.flywheel.text_3": "使用高炉会使得引擎的效率翻倍", + + "create.ponder.funnel_compat.header": "漏斗的兼容性", + "create.ponder.funnel_compat.text_1": "漏斗可以与一些其他组件互动", + "create.ponder.funnel_compat.text_2": "动力锯", + "create.ponder.funnel_compat.text_3": "置物台", + "create.ponder.funnel_compat.text_4": "分液池", + + "create.ponder.funnel_direction.header": "物流方向", + "create.ponder.funnel_direction.text_1": "直接放置时,漏斗会将物品从容器中取出", + "create.ponder.funnel_direction.text_2": "潜行时放置时,漏斗会将物品置入容器中", + "create.ponder.funnel_direction.text_3": "使用扳手可以改变漏斗的存/取模式", + "create.ponder.funnel_direction.text_4": "对大多数朝向放置的漏斗都具有此特性", + "create.ponder.funnel_direction.text_5": "在传送带末端放置的漏斗会根据传送带的传动方向存/取物品", + + "create.ponder.funnel_intro.header": "使用漏斗", + "create.ponder.funnel_intro.text_1": "用漏斗来存取物品栏内的物品,可谓又快又好", + + "create.ponder.funnel_redstone.header": "红石信号控制", + "create.ponder.funnel_redstone.text_1": "红石信号会使漏斗停止工作", + + "create.ponder.funnel_transfer.header": "直接运输", + "create.ponder.funnel_transfer.text_1": "漏斗无法将物品传输到非开放式的物品栏中", + "create.ponder.funnel_transfer.text_2": "溜槽和智能溜槽更适用于这样的场景", + "create.ponder.funnel_transfer.text_3": "水平传输也是如此,也许传送带更方便快捷", + + "create.ponder.furnace_engine.header": "使用熔炉引擎生产旋转力", + "create.ponder.furnace_engine.text_1": "熔炉引擎会在与其相连熔炉工作时生产旋转力", + "create.ponder.furnace_engine.text_2": "如此产生的旋转力具有非常大的应力值", + "create.ponder.furnace_engine.text_3": "使用高炉会使得引擎的效率翻倍", + + "create.ponder.gantry_carriage.header": "使用起重机取物器", + "create.ponder.gantry_carriage.text_1": "起重机取物器可以被放置在起重机杆上,并且可以沿着起重机杆运动", + "create.ponder.gantry_carriage.text_2": "起重机可以移动其黏附的方块", + + "create.ponder.gantry_cascaded.header": "串联起重机", + "create.ponder.gantry_cascaded.text_1": "无需强力胶,取物器便可与起重机杆相连", + "create.ponder.gantry_cascaded.text_2": "即使是在移动的起重机杆上也是如此", + "create.ponder.gantry_cascaded.text_3": "因此,起重机系统可以串联起来,如此可以影响到多轴向的运动", + + "create.ponder.gantry_direction.header": "起重机移动方向", + "create.ponder.gantry_direction.text_1": "起重机杆可以有相反的方向", + "create.ponder.gantry_direction.text_2": "取物器的移动方向取决于起重机杆的方向", + "create.ponder.gantry_direction.text_3": "......以及起重机杆的旋转方向", + "create.ponder.gantry_direction.text_4": "在旋转传递中,此规则同样适用", + + "create.ponder.gantry_redstone.header": "起重机的力传递", + "create.ponder.gantry_redstone.text_1": "被红石信号激活的起重机,将不会移动其上的取物器", + "create.ponder.gantry_redstone.text_2": "作为替代,杆上的旋转力会传递到取物器的输出杆上", + + "create.ponder.gantry_shaft.header": "使用起重机杆", + "create.ponder.gantry_shaft.text_1": "起重机杆组成了起重机结构的基础。与其相接的载物器可以沿着杆进行移动。", + "create.ponder.gantry_shaft.text_2": "起重机结构可以移动与其相接的方块。", + + "create.ponder.gearbox.header": "使用十字齿轮箱传递旋转力", + "create.ponder.gearbox.text_1": "更改旋转轴,很容易使得整个旋转体系变得臃肿不堪", + "create.ponder.gearbox.text_2": "十字齿轮箱则是替代方案,它的体积更为小巧紧", + "create.ponder.gearbox.text_3": "侧边连接的传动杆,旋转方向与输入端一致", + "create.ponder.gearbox.text_4": "直线连接的传动杆,旋转方向会被反转", + + "create.ponder.gearshift.header": "使用反转齿轮箱控制旋转力", + "create.ponder.gearshift.text_1": "反转齿轮箱可以直线传输旋转", + "create.ponder.gearshift.text_2": "通入红石信号后,输出端的旋转方向会被反转", + + "create.ponder.hand_crank.header": "使用手摇曲柄产生旋转力", + "create.ponder.hand_crank.text_1": "玩家可以使用手摇曲柄来手动产生旋转力", + "create.ponder.hand_crank.text_2": "按住右键可以逆时针旋转它", + "create.ponder.hand_crank.text_3": "它产生的转速相对较高", + "create.ponder.hand_crank.text_4": "潜行长按右键可以顺时针旋转它", + + "create.ponder.large_cogwheel.header": "使用大齿轮传递旋转力", + "create.ponder.large_cogwheel.text_1": "大齿轮可以以特定的角度相互连接", + "create.ponder.large_cogwheel.text_2": "可以利用大齿轮变更旋转轴向", + + "create.ponder.linear_chassis_attachment.header": "使用机壳底盘黏合方块", + "create.ponder.linear_chassis_attachment.text_1": "它的开放面可以变为黏性面", + "create.ponder.linear_chassis_attachment.text_2": "再次点击黏性面,可以将它的相反面也变得具有黏性", + "create.ponder.linear_chassis_attachment.text_3": "空手潜行右击可以移除此面的黏性物", + "create.ponder.linear_chassis_attachment.text_4": "黏性面可以将此面前方的一长条方块黏住", + "create.ponder.linear_chassis_attachment.text_5": "使用扳手可以精确控制底盘的影响范围", + "create.ponder.linear_chassis_attachment.text_6": "按住 Ctrl 滑动滚轮,你可以一次性调节所有底盘的影响范围", + "create.ponder.linear_chassis_attachment.text_7": "若想让底盘的其他面也能粘方块,你需要用到强力胶", + "create.ponder.linear_chassis_attachment.text_8": "利用这些机制,任何形状的机制都可以像装置那样移动", + + "create.ponder.linear_chassis_group.header": "成组移动机壳底盘", + "create.ponder.linear_chassis_group.text_1": "相邻的机壳底盘可以相互连接在一起", + "create.ponder.linear_chassis_group.text_2": "其中的一个底盘若被移动,其余的底盘也会跟着移动", + "create.ponder.linear_chassis_group.text_3": "不同种类的底盘,或者是朝向不一致的底盘,将不会相连", + + "create.ponder.mechanical_arm.header": "配置动力臂", + "create.ponder.mechanical_arm.text_1": "你得在放置动力臂之前就配置好它的输入以及输出端", + "create.ponder.mechanical_arm.text_2": "手持动力臂右击某个存储空间,可以将其指定为目标", + "create.ponder.mechanical_arm.text_3": "再次右击可以将其在输入端(蓝色)以及输出端(橙色)之间切换", + "create.ponder.mechanical_arm.text_4": "左击此组件可以移除选择", + "create.ponder.mechanical_arm.text_5": "将动力臂放下来后,它会将此前选择的方块作为目标", + "create.ponder.mechanical_arm.text_6": "在有效范围内,机械臂可以有任意数量的输出以及输入端", + "create.ponder.mechanical_arm.text_7": "然而,并不是所有的存储空间可以被直接交互", + "create.ponder.mechanical_arm.text_8": "在此情况下,漏斗和置物台可以解决此问题", + + "create.ponder.mechanical_arm_filtering.header": "过滤动力臂的输出端", + "create.ponder.mechanical_arm_filtering.text_1": "输入", + "create.ponder.mechanical_arm_filtering.text_2": "输出", + "create.ponder.mechanical_arm_filtering.text_3": "有时,你会想着利用某种过滤限制动力臂的目标", + "create.ponder.mechanical_arm_filtering.text_4": "动力臂自身并不提供任何过滤选项", + "create.ponder.mechanical_arm_filtering.text_5": "然而,若将黄铜漏斗作为目标,则漏斗的过滤槽则可以应用至动力臂上", + "create.ponder.mechanical_arm_filtering.text_6": "动力臂足够智能,它不会去拿取那些它无法分配的物品", + + "create.ponder.mechanical_arm_modes.header": "动力臂的分配模式", + "create.ponder.mechanical_arm_modes.text_1": "输入", + "create.ponder.mechanical_arm_modes.text_2": "输出", + "create.ponder.mechanical_arm_modes.text_3": "若动力臂必须在数个有效的输出端之间作出选择...", + "create.ponder.mechanical_arm_modes.text_4": "...它会依照自己的设定选择特定的行为", + "create.ponder.mechanical_arm_modes.text_5": "手持扳手对其滑动滚轮,可以改变其配置", + "create.ponder.mechanical_arm_modes.text_6": "轮询调度模式很好理解,即循环输出至所有有效的输出端", + "create.ponder.mechanical_arm_modes.text_7": "如果某个输出端无法容纳更多物品,则它会被跳过", + "create.ponder.mechanical_arm_modes.text_8": "强制轮询调度不会跳过任何输出端,动力臂会一直等待,直到输出端有空位容纳物品输入", + "create.ponder.mechanical_arm_modes.text_9": "最近优先模式会使得动力臂先将物品输出至更早被选择的输出端", + + "create.ponder.mechanical_arm_redstone.header": "利用红石信号控制动力臂", + "create.ponder.mechanical_arm_redstone.text_1": "通入红石信号后,动力臂会停止工作", + "create.ponder.mechanical_arm_redstone.text_2": "在停止工作前,它会完成当前正在进行的工作周期", + "create.ponder.mechanical_arm_redstone.text_3": "因此,通入单次负红石脉冲可以精确控制动力臂,使其每次只进行单个周期的工作", + + "create.ponder.mechanical_bearing.header": "使用动力轴承移动结构", + "create.ponder.mechanical_bearing.text_1": "动力轴承会与其前方的方块黏合在一起", + "create.ponder.mechanical_bearing.text_2": "接收到旋转力后,它会将这一黏合结构组装为旋转装置", + + "create.ponder.mechanical_crafter.header": "设置动力合成器", + "create.ponder.mechanical_crafter.text_1": "动力合成器阵列可用于自动化任何合成配方的制作", + "create.ponder.mechanical_crafter.text_2": "使用扳手可以调控合成器的合成通路", + "create.ponder.mechanical_crafter.text_3": "所有的合成通路必须汇集到任意一侧的一个出口,整套合成器方可算是设置正确", + "create.ponder.mechanical_crafter.text_4": "输出产物会被放入位于出口的存储空间中", + "create.ponder.mechanical_crafter.text_5": "动力合成器的运转需要旋转力的供应", + "create.ponder.mechanical_crafter.text_6": "右击合成器正面,可以手动放入物品", + "create.ponder.mechanical_crafter.text_7": "一旦合成通路上的所有合成槽位都有了物品,合成就会开始", + "create.ponder.mechanical_crafter.text_8": "而对于那些没有完全占满所有合成器槽位的配方,你可以通入红石信号强制开启合成", + + "create.ponder.mechanical_crafter_connect.header": "为合成器连接物品栏", + "create.ponder.mechanical_crafter_connect.text_1": "合成器可以自动接受向其输入的物品", + "create.ponder.mechanical_crafter_connect.text_2": "对其背面使用扳手,可以连接合成器", + "create.ponder.mechanical_crafter_connect.text_3": "所有相连的合成器可以访问同一个位置的输入", + + "create.ponder.mechanical_crafter_covers.header": "盖住动力合成器的合成槽", + "create.ponder.mechanical_crafter_covers.text_1": "有些配方需要额外的合成器,来补足合成通路上的间隙", + "create.ponder.mechanical_crafter_covers.text_2": "使用合成槽盖板,合成器会在合成进行时的行为就如同一个空的合成槽位", + "create.ponder.mechanical_crafter_covers.text_3": "被盖住的合成器并不会阻断共享输入端的影响", + + "create.ponder.mechanical_drill.header": "使用动力钻头破坏方块", + "create.ponder.mechanical_drill.text_1": "当向其通入旋转力后,动力钻头会破坏它面前的方块", + "create.ponder.mechanical_drill.text_2": "它的挖掘速度取决于通入的旋转力转速", + + "create.ponder.mechanical_drill_contraption.header": "在装置中使用动力钻头", + "create.ponder.mechanical_drill_contraption.text_1": "在运动装置中使用动力钻头时...", + "create.ponder.mechanical_drill_contraption.text_2": "...它会破坏掉它撞上的方块", + + "create.ponder.mechanical_harvester.header": "在装置中使用动力收割机", + "create.ponder.mechanical_harvester.text_1": "在运动装置中使用动力收割机时...", + "create.ponder.mechanical_harvester.text_2": "它会采收其路径上的作物,并重置这些作物的生长进度", + + "create.ponder.mechanical_mixer.header": "使用动力搅拌器处理物品", + "create.ponder.mechanical_mixer.text_1": "使用搅拌器和工作盆,你可以自动化某些合成配方", + "create.ponder.mechanical_mixer.text_2": "有效配方包括各种无序合成配方,以及一些额外的配方", + "create.ponder.mechanical_mixer.text_3": "一些配方可能需要使用烈焰人燃烧室提供热量", + "create.ponder.mechanical_mixer.text_4": "过滤槽可用于解决两个配方相互冲突的情况", + + "create.ponder.mechanical_piston.header": "使用动力活塞移动结构", + "create.ponder.mechanical_piston.text_1": "动力活塞可以移动它前方的方块", + "create.ponder.mechanical_piston.text_2": "移动速度和方向取决于通入活塞的旋转力", + "create.ponder.mechanical_piston.text_3": "黏性动力活塞可以将相接的方块拉回来", + + "create.ponder.mechanical_piston_modes.header": "动力活塞的移动模式", + "create.ponder.mechanical_piston_modes.text_1": "一旦活塞停下,被移动的结构就会回退到方块状态", + "create.ponder.mechanical_piston_modes.text_2": "你也可以将其配置为从不方块化,或者只在起始位置方块化", + + "create.ponder.mechanical_plough.header": "在装置中使用动力犁", + "create.ponder.mechanical_plough.text_1": "在运动装置中使用动力犁时...", + "create.ponder.mechanical_plough.text_2": "...它会破坏掉那些不具有固体碰撞箱的方块", + "create.ponder.mechanical_plough.text_3": "此外,动力犁可以耕地", + "create.ponder.mechanical_plough.text_4": "...它也可以在不伤害实体的情况下推动它们", + + "create.ponder.mechanical_press.header": "使用动力辊轧机处理物品", + "create.ponder.mechanical_press.text_1": "动力辊轧机可以处理位于其下方的物品", + "create.ponder.mechanical_press.text_2": "在其下方丢入物品,或者将物品放在置物台上,都算作有效的物品输入", + "create.ponder.mechanical_press.text_3": "若物品被输入时正位于传送带上...", + "create.ponder.mechanical_press.text_4": "辊轧机会使物品停下,然后自动处理这一物品", + + "create.ponder.mechanical_press_compacting.header": "使用动力辊轧机压缩物品", + "create.ponder.mechanical_press_compacting.text_1": "对放置于工作盆内的物品进行辊轧,可以将这些物品压缩在一起", + "create.ponder.mechanical_press_compacting.text_2": "压缩意指任何同种物品填满了 2x2 或者 3x3 网格的配方,以及一些额外的配方", + "create.ponder.mechanical_press_compacting.text_3": "一些配方可能需要烈焰人燃烧室提供热量", + "create.ponder.mechanical_press_compacting.text_4": "过滤槽可用于解决两个配方相互冲突的情况", + + "create.ponder.mechanical_saw_breaker.header": "使用动力锯伐木", + "create.ponder.mechanical_saw_breaker.text_1": "向其通入旋转力后,动力锯可以直接砍伐掉它面前的树木", + "create.ponder.mechanical_saw_breaker.text_2": "想要一次性砍掉整棵树,锯子必须破坏掉树与地面连接的最后一个方块", + + "create.ponder.mechanical_saw_contraption.header": "在装置中使用动力锯", + "create.ponder.mechanical_saw_contraption.text_1": "若在运动装置中使用动力锯...", + "create.ponder.mechanical_saw_contraption.text_2": "...它会将撞到它的树木破坏掉", + + "create.ponder.mechanical_saw_processing.header": "使用动力锯处理物品", + "create.ponder.mechanical_saw_processing.text_1": "面向朝上的动力锯可以将物品处理为其变种", + "create.ponder.mechanical_saw_processing.text_2": "处理过后的物品的弹出方向始终与通入锯中的旋转转向相反", + "create.ponder.mechanical_saw_processing.text_3": "锯子可以", + "create.ponder.mechanical_saw_processing.text_4": "若输入原料有多种可能产物,你可以用动力锯上的过滤槽指定只产出某种产物", + "create.ponder.mechanical_saw_processing.text_5": "若没有使用过滤槽,动力锯会在各产物中按顺序循环输出", + + "create.ponder.millstone.header": "使用石磨处理物品", + "create.ponder.millstone.text_1": "石磨会对输入的物品进行磨制", + "create.ponder.millstone.text_2": "在其侧边使用齿轮与其相耦合,方可为其通入动力", + "create.ponder.millstone.text_3": "顶部可以丢入或者塞入物品", + "create.ponder.millstone.text_4": "一段时间过后,右击石磨可以拿出其中的产物", + "create.ponder.millstone.text_5": "产物的提取也是可以自动化的", + + "create.ponder.nixie_tube.header": "使用辉光管", + "create.ponder.nixie_tube.text_1": "通入红石信号后,辉光管会显示出红石信号的强度", + "create.ponder.nixie_tube.text_2": "使用命名牌在铁砧上为其命名,可以自定义它的显示文本", + + "create.ponder.piston_pole.header": "活塞延长杆", + "create.ponder.piston_pole.text_1": "若无相接的延长杆,动力活塞无法移动其他方块", + "create.ponder.piston_pole.text_2": "在其背面安装的延长杆长度,决定了活塞的推动范围", + + "create.ponder.portable_storage_interface.header": "装置存储交换", + "create.ponder.portable_storage_interface.text_1": "玩家无法与运动装置内的存储空间进行交互", + "create.ponder.portable_storage_interface.text_2": "这一组件可以在不停止装置的情况下与装置内的存储空间进行交互", + "create.ponder.portable_storage_interface.text_3": "放置第二个接口时,记得要与装置接口相隔 1 格或者 2 格的距离", + "create.ponder.portable_storage_interface.text_4": "当它们彼此经过时,它们会连接在一起", + "create.ponder.portable_storage_interface.text_5": "连接状态下,固定侧接口便会作为整个装置的存储空间代理", + "create.ponder.portable_storage_interface.text_6": "物品会被输入到装置内...", + "create.ponder.portable_storage_interface.text_7": "...或是从装置中提取出来", + "create.ponder.portable_storage_interface.text_8": "物品交换完毕后,装置仍然会停留在原地一小会,然后才会继续前行", + + "create.ponder.portable_storage_interface_redstone.header": "红石控制", + "create.ponder.portable_storage_interface_redstone.text_1": "通入红石信号可以阻止固定侧接口的连接行为", + + "create.ponder.powered_latch.header": "使用锁存器控制信号", + "create.ponder.powered_latch.text_1": "锁存器是一种可以用红石信号控制的拉杆", + "create.ponder.powered_latch.text_2": "后方输入的信号会将其设为开启状态", + "create.ponder.powered_latch.text_3": "侧边输入的信号会将其设为关闭状态", + "create.ponder.powered_latch.text_4": "你也可以手动切换其状态", + + "create.ponder.powered_toggle_latch.header": "使用转换锁存器控制信号", + "create.ponder.powered_toggle_latch.text_1": "转换锁存器是一种可以用红石信号控制的拉杆", + "create.ponder.powered_toggle_latch.text_2": "后方信号输入可以改变它的状态", + "create.ponder.powered_toggle_latch.text_3": "...开启或者是关闭", + "create.ponder.powered_toggle_latch.text_4": "你也可以手动切换其状态", + + "create.ponder.pulse_repeater.header": "使用脉冲中继器控制信号", + "create.ponder.pulse_repeater.text_1": "脉冲中继器会将所有通入的红石信号缩减为一次脉冲", + + "create.ponder.radial_chassis.header": "使用旋转底盘黏着方块", + "create.ponder.radial_chassis.text_1": "同一行上的旋转底盘会相互连接在一起", + "create.ponder.radial_chassis.text_2": "当其中的一个底盘被装置带动时,其余的底盘也会被带动", + "create.ponder.radial_chassis.text_3": "底盘的侧边可以变为黏性面", + "create.ponder.radial_chassis.text_4": "再次点击黏性面,可以让其所有面都变得带黏性", + "create.ponder.radial_chassis.text_5": "空手潜行右击可以移除其上的黏性物", + "create.ponder.radial_chassis.text_6": "若有物品与底盘的黏性面相接触...", + "create.ponder.radial_chassis.text_7": "...底盘便会与同层且位于半径内的所有可及方块黏着在一起", + "create.ponder.radial_chassis.text_8": "使用扳手可以精确指定底盘的影响范围", + "create.ponder.radial_chassis.text_9": "黏性面一侧的不可及方块不会被黏着", + + "create.ponder.redstone_contact.header": "接触式红石信号发生器", + "create.ponder.redstone_contact.text_1": "当两个接触式红石信号发生器面对面时,它们会发出红石信号", + "create.ponder.redstone_contact.text_2": "并且,若有一方位于运动装置上,此特性也能正常生效", + + "create.ponder.redstone_link.header": "使用无线红石信号终端", + "create.ponder.redstone_link.text_1": "无线红石信号终端可以无线传输红石信号", + "create.ponder.redstone_link.text_2": "潜行右击可以改变其接收模式", + "create.ponder.redstone_link.text_3": "手持扳手右击也可以", + "create.ponder.redstone_link.text_4": "接收端会发出由传输端发来的信号,有效距离为 128 格", + "create.ponder.redstone_link.text_5": "在它们所带的槽位中放上物品,可以为它们指定频道", + "create.ponder.redstone_link.text_6": "只有频道相互匹配的终端方可互通", + + "create.ponder.rope_pulley.header": "使用绳索滑轮移动结构", + "create.ponder.rope_pulley.text_1": "绳索滑轮在接受旋转力时可以垂直移动方块结构", + "create.ponder.rope_pulley.text_2": "移动的方向及速度取决于提供的转速", + + "create.ponder.rope_pulley_attachment.header": "绳索滑轮与装置一同运动", + "create.ponder.rope_pulley_attachment.text_1": "当绳索滑轮本身在装置中被带动时...", + "create.ponder.rope_pulley_attachment.text_2": "...它附着在滑轮上的结构会被滑轮拉着一同移动", + "create.ponder.rope_pulley_attachment.text_3": "注意,只有绳索滑轮停止工作时才能被移动", + + "create.ponder.rope_pulley_modes.header": "绳索滑轮的运动模式", + "create.ponder.rope_pulley_modes.text_1": "当绳索滑轮停止运动时,它所附属的移动结构便会方块化", + "create.ponder.rope_pulley_modes.text_2": "你可以调整整个结构永不方块化,或者仅在结构的初始位置方块化", + + "create.ponder.rotation_speed_controller.header": "使用转速控制器", + "create.ponder.rotation_speed_controller.text_1": "转速控制器将旋转力从其转轴传递至它上方的大齿轮", + "create.ponder.rotation_speed_controller.text_2": "在其侧面滚动鼠标滚轮,可以调节输出转速", + + "create.ponder.sail.header": "使用风帆来组装风车", + "create.ponder.sail.text_1": "风帆是制作风车的趁手材料", + "create.ponder.sail.text_2": "无需强力胶等黏附手段,它们便可自行互相连结", + "create.ponder.sail.text_3": "手持染料右击可对其染色", + "create.ponder.sail.text_4": "手持剪刀右击可剪除帆布,使其变回风帆框架", + + "create.ponder.sail_frame.header": "使用风帆框架来组装风车", + "create.ponder.sail_frame.text_1": "风帆框架是制作风车的趁手材料", + "create.ponder.sail_frame.text_2": "无需强力胶等黏附手段,它们便可自行互相连结", + + "create.ponder.sequenced_gearshift.header": "使用可编程齿轮箱来控制转速", + "create.ponder.sequenced_gearshift.text_1": "可编程齿轮箱能够根据玩家设置的预设时序表来传递旋转", + "create.ponder.sequenced_gearshift.text_2": "对其右击可以打开设置面板", + "create.ponder.sequenced_gearshift.text_3": "接受红石信号时,它会开始执行其内部已配置好的时序指令表", + "create.ponder.sequenced_gearshift.text_4": "当完成时序指令表后,它会进入待机状态,再次接受红石信号后,它才会再次执行时序指令表内容", + "create.ponder.sequenced_gearshift.text_5": "红石比较器可以读取当前时序指令表完成进度", + + "create.ponder.shaft.header": "使用传动杆传递旋转力", + "create.ponder.shaft.text_1": "传动杆能直线传递旋转力", + + "create.ponder.shaft_casing.header": "传动杆箱", + "create.ponder.shaft_casing.text_1": "安山或黄铜机壳,装饰传动杆的好伙伴", + + "create.ponder.smart_chute.header": "使用智能溜槽过滤物品", + "create.ponder.smart_chute.text_1": "智能溜槽是垂直溜槽的升级控制版", + "create.ponder.smart_chute.text_2": "当在其过滤槽内指定了物品后,溜槽只会传输这一指定标记的物品", + "create.ponder.smart_chute.text_3": "使用鼠标滚轮可以指定被过滤的物品数量", + "create.ponder.smart_chute.text_4": "通入红石信号,智能溜槽将会完全暂停工作", + + "create.ponder.speedometer.header": "使用速度表来监测转速", + "create.ponder.speedometer.text_1": "速度表能显示相接组件的转速", + "create.ponder.speedometer.text_2": "当佩戴工程师护目镜时,可以看到仪表所显示的更详细的数据", + "create.ponder.speedometer.text_3": "红石比较器可以根据速度表的数值输出不同强弱的红石信号", + + "create.ponder.stabilized_bearings.header": "装置固定朝向", + "create.ponder.stabilized_bearings.text_1": "当动力轴承在结构被带动时...", + "create.ponder.stabilized_bearings.text_2": "...它会确保它转盘的垂直朝向不变", + "create.ponder.stabilized_bearings.text_3": "跟默认的一样,动力轴承会黏着它前方的方块", + "create.ponder.stabilized_bearings.text_4": "这种情况下,它所黏着的子结构的垂直朝向也不会改变", + + "create.ponder.sticker.header": "使用黏着器来黏附方块", + "create.ponder.sticker.text_1": "你可以用红石信号来控制黏着器的行为", + "create.ponder.sticker.text_2": "当接受红石信号时,黏着器会黏着前方的方块", + "create.ponder.sticker.text_3": "如果黏着器以装置的形式移动,那么被黏着的方块也会一同移动", + "create.ponder.sticker.text_4": "再次接受红石信号时,它会断开与方块的黏连", + + "create.ponder.stressometer.header": "使用应力表来监测应力", + "create.ponder.stressometer.text_1": "应力表能显示当前动能网络内的应力信息", + "create.ponder.stressometer.text_2": "当佩戴工程师护目镜时,可以看到仪表所显示的更详细的数据", + "create.ponder.stressometer.text_3": "红石比较器可以根据应力表的数值输出不同强弱的红石信号", + + "create.ponder.super_glue.header": "使用强力胶来黏附方块", + "create.ponder.super_glue.text_1": "强力胶可以在任意两个方块间使用", + "create.ponder.super_glue.text_2": "当被粘合的方块被组装为装置时,他们会一起运动", + "create.ponder.super_glue.text_3": "当强力胶在副手时...", + "create.ponder.super_glue.text_4": "...新放置的方块会自动被黏附在所放置方块的面上", + "create.ponder.super_glue.text_5": "左击可以清除强力胶", + + "create.ponder.valve_handle.header": "使用阀门手轮产生旋转力", + "create.ponder.valve_handle.text_1": "玩家可以手动使用阀门手轮来产生旋转力", + "create.ponder.valve_handle.text_2": "右击可使它逆时针旋转", + "create.ponder.valve_handle.text_3": "它的转速慢而精确", + "create.ponder.valve_handle.text_4": "潜行右击可使它顺时针旋转", + "create.ponder.valve_handle.text_5": "可以通过染色来美化阀门手轮", + + "create.ponder.water_wheel.header": "使用水车产生旋转力", + "create.ponder.water_wheel.text_1": "水车利用临近的水流来进行应力发生", + "create.ponder.water_wheel.text_2": "水车接触水流的面越多,它的转速越高", + "create.ponder.water_wheel.text_3": "水车叶片应逆着水流方向摆放", + "create.ponder.water_wheel.text_4": "如果顺着水流摆放,它的效率则会降低", + + "create.ponder.weighted_ejector.header": "使用弹射置物台", + "create.ponder.weighted_ejector.text_1": "手持弹射置物台时,潜行时右击可以设置弹射目标位置", + "create.ponder.weighted_ejector.text_10": "现在,只有等被放置的物品数量等于所设定数量时,弹射置物台才会弹射物品", + "create.ponder.weighted_ejector.text_11": "当其他实体站在弹射置物台上时会被直接弹射", + "create.ponder.weighted_ejector.text_2": "现在,放置下的弹射置物台会将物品弹射至目标位置", + "create.ponder.weighted_ejector.text_3": "限制范围内的任意距离和高度均可作为有效目标地点", + "create.ponder.weighted_ejector.text_4": "但是,目标位置与置物台的连线,必须垂直于置物台的侧面", + "create.ponder.weighted_ejector.text_5": "如果没有设置有效目标位置,弹射置物台会直接将其前方一格设为默认目标位置", + "create.ponder.weighted_ejector.text_6": "提供旋转力可为其蓄力", + "create.ponder.weighted_ejector.text_7": "蓄力完毕后,放置在它上方的物品会被立刻弹射出去", + "create.ponder.weighted_ejector.text_8": "如果目标为容器,则弹射置物台会等待容器有位置后再弹射物品", + "create.ponder.weighted_ejector.text_9": "使用扳手可以调整弹射所要求的物品数量", + + "create.ponder.weighted_ejector_redstone.header": "使用红石控制弹射置物台", + "create.ponder.weighted_ejector_redstone.text_1": "当被红石充能时,弹射置物台停止工作", + "create.ponder.weighted_ejector_redstone.text_2": "此外,置物台弹射的瞬间可以被侦测器侦测", + + "create.ponder.weighted_ejector_tunnel.header": "使用弹射置物台来分流物品", + "create.ponder.weighted_ejector_tunnel.text_1": "与黄铜隧道搭配使用时,弹射置物台可以将物品以特定数量进行分流", + "create.ponder.weighted_ejector_tunnel.text_2": "首先,将黄铜隧道调整为“最近优先”模式,从而让它优先侧面输出", + "create.ponder.weighted_ejector_tunnel.text_3": "置物台上所设置的物品数量则为被分流出去的物品数量", + "create.ponder.weighted_ejector_tunnel.text_4": "当所设置的物品数量被分流出去后...", + "create.ponder.weighted_ejector_tunnel.text_5": "...剩余的物品则会继续前进", + + "create.ponder.windmill_source.header": "使用风车轴承产生旋转力", + "create.ponder.windmill_source.text_1": "在风车轴承会黏附它前方的方块", + "create.ponder.windmill_source.text_2": "如果有足够多的风帆方块黏附于其上,那么整体结构便可被视为风车", + "create.ponder.windmill_source.text_3": "右击启动后,风车轴承会开始产生旋转力", + "create.ponder.windmill_source.text_4": "产生的转速取决于风帆方块的数量", + "create.ponder.windmill_source.text_5": "使用扳手可以调整风车的旋转方向", + "create.ponder.windmill_source.text_6": "任何时候右击轴承,都可以将其停止,这样方便于你修改风车的结构", + + "create.ponder.windmill_structure.header": "风车装置", + "create.ponder.windmill_structure.text_1": "任何有至少 8 个风帆方块的结构,都被视为一个有效的风车", + + "_": "Thank you for translating Create!" } From 6374f9f1ada57a3d8aa7ea97ae82e3f6d57f9004 Mon Sep 17 00:00:00 2001 From: Chubz <69413529+Chubzik1@users.noreply.github.com> Date: Mon, 19 Apr 2021 12:40:20 +0400 Subject: [PATCH 02/18] Small fix for advancements Yep, it is. --- src/main/resources/assets/create/lang/ru_ru.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/create/lang/ru_ru.json b/src/main/resources/assets/create/lang/ru_ru.json index 6b5b72130..d88a93c3d 100644 --- a/src/main/resources/assets/create/lang/ru_ru.json +++ b/src/main/resources/assets/create/lang/ru_ru.json @@ -506,7 +506,7 @@ "advancement.create.shifting_gears": "Механизм переключения", "advancement.create.shifting_gears.desc": "Подсоедините большую шестерню к шестерне, что позволит изменить скорость вращения.", "advancement.create.overstressed": "Перегрузка", - "advancement.create.overstressed.desc": "Испытайте предельную перегрузку из первых рук.", + "advancement.create.overstressed.desc": "Столкнитесь с предельной перегрузкой лицом к лицу.", "advancement.create.belt": "Передайте за проезд!", "advancement.create.belt.desc": "Соедините два вала с помощью механического ремня.", "advancement.create.tunnel": "В укрытие!", @@ -654,7 +654,7 @@ "advancement.create.extendo_grip": "Кипение!", "advancement.create.extendo_grip.desc": "Возьмите в руки удлинённую руку", "advancement.create.dual_extendo_grip": "Окончательное выкипание", - "advancement.create.dual_extendo_grip.desc": "Две удлинённой руки для сверхчеловеческого охвата.", + "advancement.create.dual_extendo_grip.desc": "Две удлинённых руки для сверхчеловеческого охвата.", "advancement.create.eob": "Конец бета-версии", "advancement.create.eob.desc": "Ожидайте больше контента здесь в будущем. <3", From b1e0057aade28f0bb014e8e52ab68f975ca48243 Mon Sep 17 00:00:00 2001 From: joker876 <42680429+joker876@users.noreply.github.com> Date: Wed, 21 Apr 2021 15:19:56 +0200 Subject: [PATCH 03/18] Add 100% completed translation for Polish language --- .../resources/assets/create/lang/pl_pl.json | 2119 +++++++++++++++++ 1 file changed, 2119 insertions(+) create mode 100644 src/main/resources/assets/create/lang/pl_pl.json diff --git a/src/main/resources/assets/create/lang/pl_pl.json b/src/main/resources/assets/create/lang/pl_pl.json new file mode 100644 index 000000000..696c20a8d --- /dev/null +++ b/src/main/resources/assets/create/lang/pl_pl.json @@ -0,0 +1,2119 @@ +{ + + "_": "->------------------------] Elementy Gry [------------------------<-", + + "block.​create.​acacia_window": "Akacjowe okno", + "block.​create.​acacia_window_pane": "Akacjowa szyba okienna", + "block.​create.​adjustable_chain_gearshift": "Regulowany przekładnik łańcuchowy", + "block.​create.​adjustable_crate": "Regulowana skrzynka", + "block.​create.​adjustable_pulse_repeater": "Regulowany przekaźnik pulsu", + "block.​create.​adjustable_repeater": "Regulowany przekaźnik", + "block.​create.​analog_lever": "Dźwignia analogowa", + "block.​create.​andesite_belt_funnel": "Andezytowy lejek taśmowy", + "block.​create.​andesite_bricks": "Andezytowe cegły", + "block.​create.​andesite_bricks_slab": "Andezytowa ceglana płyta", + "block.​create.​andesite_bricks_stairs": "Andezytowe ceglane schody", + "block.​create.​andesite_bricks_wall": "Andezytowy ceglany murek", + "block.​create.​andesite_casing": "Andezytowa obudowa", + "block.​create.​andesite_cobblestone": "Andezytowy bruk", + "block.​create.​andesite_cobblestone_slab": "Andezytowa brukowa płyta", + "block.​create.​andesite_cobblestone_stairs": "Andezytowe brukowe schody", + "block.​create.​andesite_cobblestone_wall": "Andezytowy brukowy murek", + "block.​create.​andesite_encased_shaft": "Andezytowy izolowany wał", + "block.​create.​andesite_funnel": "Andezytowy lejek", + "block.​create.​andesite_pillar": "Andezytowy filar", + "block.​create.​andesite_tunnel": "Andezytowy tunel", + "block.​create.​basin": "Tygiel", + "block.​create.​belt": "Taśma", + "block.​create.​birch_window": "Brzozowe okno", + "block.​create.​birch_window_pane": "Brzozowa szyba okienna", + "block.​create.​black_sail": "Czarny żagiel", + "block.​create.​black_seat": "Czarne siedzenie", + "block.​create.​black_valve_handle": "Czarne pokrętło", + "block.​create.​blaze_burner": "Płomienny palnik", + "block.​create.​blue_sail": "Niebieski żagiel", + "block.​create.​blue_seat": "Niebieskie siedzenie", + "block.​create.​blue_valve_handle": "Niebieskie pokrętło", + "block.​create.​brass_belt_funnel": "Mosiężny lejek taśmowy", + "block.​create.​brass_block": "Blok mosiądzu", + "block.​create.​brass_casing": "Mosiężna obudowa", + "block.​create.​brass_encased_shaft": "Mosiężny izolowany wał", + "block.​create.​brass_funnel": "Mosiężny lejek", + "block.​create.​brass_tunnel": "Mosiężny tunel", + "block.​create.​brown_sail": "Brązowy żagiel", + "block.​create.​brown_seat": "Brązowe siedzenie", + "block.​create.​brown_valve_handle": "Brązowe pokrętło", + "block.​create.​cart_assembler": "Monter wagoników", + "block.​create.​chiseled_dark_scoria": "Rzeźbiony ciemny żużel", + "block.​create.​chiseled_dolomite": "Rzeźbiony dolomit", + "block.​create.​chiseled_gabbro": "Rzeźbione gabro", + "block.​create.​chiseled_limestone": "Rzeźbiony wapień", + "block.​create.​chiseled_scoria": "Rzeźbiony żużel", + "block.​create.​chiseled_weathered_limestone": "Rzeźbiony zwietrzały wapień", + "block.​create.​chocolate": "Czekolada", + "block.​create.​chute": "Zsyp", + "block.​create.​clockwork_bearing": "Mechanizm zegarowy", + "block.​create.​clutch": "Sprzęgło", + "block.​create.​cogwheel": "Koło zębate", + "block.​create.​content_observer": "Detektor zawartości", + "block.​create.​controller_rail": "Tory sterujące", + "block.​create.​copper_block": "Blok miedzi", + "block.​create.​copper_casing": "Miedziana Obudowa", + "block.​create.​copper_ore": "Ruda miedzi", + "block.​create.​copper_shingles": "Miedziane dachówki", + "block.​create.​copper_tiles": "Miedziane kafelki", + "block.​create.​copper_valve_handle": "Miedziane pokrętło", + "block.​create.​creative_crate": "Kreatywna skrzynka", + "block.​create.​creative_fluid_tank": "Kreatywny zbiornik", + "block.​create.​creative_motor": "Kreatywny silnik", + "block.​create.​crimson_window": "Szkarłatne okno", + "block.​create.​crimson_window_pane": "Szkarłatna szyba okienna", + "block.​create.​crushing_wheel": "Koło kruszące", + "block.​create.​crushing_wheel_controller": "Sterownik koła kruszącego", + "block.​create.​cuckoo_clock": "Zegar z kukułką", + "block.​create.​cyan_sail": "Błękitny żagiel", + "block.​create.​cyan_seat": "Błękitne siedzenie", + "block.​create.​cyan_valve_handle": "Błękitne pokrętło", + "block.​create.​dark_oak_window": "Ciemnodębowe okno", + "block.​create.​dark_oak_window_pane": "Ciemnodębowa szyba okienna", + "block.​create.​dark_scoria": "Ciemny żużel", + "block.​create.​dark_scoria_bricks": "Ciemne żużlowe cegły", + "block.​create.​dark_scoria_bricks_slab": "Ciemna żużlowa ceglana płyta", + "block.​create.​dark_scoria_bricks_stairs": "Ciemne żużlowe ceglane schody", + "block.​create.​dark_scoria_bricks_wall": "Ciemny żużlowy ceglany murek", + "block.​create.​dark_scoria_cobblestone": "Ciemny żużlowy bruk", + "block.​create.​dark_scoria_cobblestone_slab": "Ciemna żużlowa płyta", + "block.​create.​dark_scoria_cobblestone_stairs": "Ciemne żużlowe schody", + "block.​create.​dark_scoria_cobblestone_wall": "Ciemny żużlowy murek", + "block.​create.​dark_scoria_pillar": "Ciemny żużlowy filar", + "block.​create.​deployer": "Aplikator", + "block.​create.​depot": "Składnica", + "block.​create.​diorite_bricks": "Diorytowe cegły", + "block.​create.​diorite_bricks_slab": "Diorytowa ceglana płyta", + "block.​create.​diorite_bricks_stairs": "Diorytowe ceglane schody", + "block.​create.​diorite_bricks_wall": "Diorytowy ceglany murek", + "block.​create.​diorite_cobblestone": "Diorytowy bruk", + "block.​create.​diorite_cobblestone_slab": "Diorytowa brukowa płyta", + "block.​create.​diorite_cobblestone_stairs": "Diorytowe brukowe schody", + "block.​create.​diorite_cobblestone_wall": "Diorytowy brukowy murek", + "block.​create.​diorite_pillar": "Diorytowy filar", + "block.​create.​dolomite": "Dolomit", + "block.​create.​dolomite_bricks": "Dolomitowe cegły", + "block.​create.​dolomite_bricks_slab": "Dolomitowa ceglana płyta", + "block.​create.​dolomite_bricks_stairs": "Dolomitowe ceglane schody", + "block.​create.​dolomite_bricks_wall": "Dolomitowy ceglany murek", + "block.​create.​dolomite_cobblestone": "Dolomitowy bruk", + "block.​create.​dolomite_cobblestone_slab": "Dolomitowa brukowa płyta", + "block.​create.​dolomite_cobblestone_stairs": "Dolomitowe brukowe schody", + "block.​create.​dolomite_cobblestone_wall": "Dolomitowy brukowy murek", + "block.​create.​dolomite_pillar": "Dolomitowy filar", + "block.​create.​encased_chain_drive": "Izolowany przekaźnik łańcuchowy", + "block.​create.​encased_fan": "Izolowany wiatrak", + "block.​create.​encased_fluid_pipe": "Izolowana rura", + "block.​create.​fancy_andesite_bricks": "Eleganckie andezytowe cegły", + "block.​create.​fancy_andesite_bricks_slab": "Elegancka andezytowa ceglana płyta", + "block.​create.​fancy_andesite_bricks_stairs": "Eleganckie andezytowe ceglane schody", + "block.​create.​fancy_andesite_bricks_wall": "Elegancki andezytowy ceglany murek", + "block.​create.​fancy_dark_scoria_bricks": "Eleganckie ciemnożużlowe cegły", + "block.​create.​fancy_dark_scoria_bricks_slab": "Elegancka ciemnożużlowa ceglana płyta", + "block.​create.​fancy_dark_scoria_bricks_stairs": "Eleganckie ciemnożużlowe ceglane schody", + "block.​create.​fancy_dark_scoria_bricks_wall": "Elegancki ciemnożużlowy ceglany murek", + "block.​create.​fancy_diorite_bricks": "Eleganckie diorytowe cegły", + "block.​create.​fancy_diorite_bricks_slab": "Elegancka diorytowa ceglana płyta", + "block.​create.​fancy_diorite_bricks_stairs": "Eleganckie diorytowe ceglane schody", + "block.​create.​fancy_diorite_bricks_wall": "Elegancki diorytowy ceglany murek", + "block.​create.​fancy_dolomite_bricks": "Eleganckie dolomitowe cegły", + "block.​create.​fancy_dolomite_bricks_slab": "Elegancka dolomitowa ceglana płyta", + "block.​create.​fancy_dolomite_bricks_stairs": "Eleganckie dolomitowe ceglane schody", + "block.​create.​fancy_dolomite_bricks_wall": "Elegancki dolomitowy ceglany murek", + "block.​create.​fancy_gabbro_bricks": "Eleganckie gabrowe cegły", + "block.​create.​fancy_gabbro_bricks_slab": "Elegancka gabrowa ceglana płyta", + "block.​create.​fancy_gabbro_bricks_stairs": "Eleganckie gabrowe ceglane schody", + "block.​create.​fancy_gabbro_bricks_wall": "Elegancki gabrowy ceglany murek", + "block.​create.​fancy_granite_bricks": "Eleganckie granitowe cegły", + "block.​create.​fancy_granite_bricks_slab": "Elegancka granitowa ceglana płyta", + "block.​create.​fancy_granite_bricks_stairs": "Eleganckie granitowe ceglane schody", + "block.​create.​fancy_granite_bricks_wall": "Elegancki granitowy ceglany murek", + "block.​create.​fancy_limestone_bricks": "Eleganckie wapienne cegły", + "block.​create.​fancy_limestone_bricks_slab": "Elegancka wapienna ceglana płyta", + "block.​create.​fancy_limestone_bricks_stairs": "Eleganckie wapienne ceglane schody", + "block.​create.​fancy_limestone_bricks_wall": "Elegancki wapienny ceglany murek", + "block.​create.​fancy_scoria_bricks": "Eleganckie żużlowe cegły", + "block.​create.​fancy_scoria_bricks_slab": "Elegancka żużlowa ceglana płyta", + "block.​create.​fancy_scoria_bricks_stairs": "Eleganckie żużlowe ceglane schody", + "block.​create.​fancy_scoria_bricks_wall": "Elegancki żużlowy ceglany murek", + "block.​create.​fancy_weathered_limestone_bricks": "Eleganckie zwietrzałe wapienne cegły", + "block.​create.​fancy_weathered_limestone_bricks_slab": "Elegancka zwietrzała wapienna ceglana płyta", + "block.​create.​fancy_weathered_limestone_bricks_stairs": "Eleganckie zwietrzałe wapienne ceglane schody", + "block.​create.​fancy_weathered_limestone_bricks_wall": "Elegancki zwietrzały wapienny ceglany murek", + "block.​create.​fluid_pipe": "Rura", + "block.​create.​fluid_tank": "Zbiornik", + "block.​create.​fluid_valve": "Zawór", + "block.​create.​flywheel": "Koło zamachowe", + "block.​create.​framed_glass": "Oprawione okno", + "block.​create.​framed_glass_pane": "Oprawiona szyba", + "block.​create.​furnace_engine": "Silnik spalinowy", + "block.​create.​gabbro": "Gabro", + "block.​create.​gabbro_bricks": "Gabrowe cegły", + "block.​create.​gabbro_bricks_slab": "Gabrowa ceglana płyta", + "block.​create.​gabbro_bricks_stairs": "Gabrowe ceglane schody", + "block.​create.​gabbro_bricks_wall": "Gabrowy ceglany murek", + "block.​create.​gabbro_cobblestone": "Gabrowy bruk", + "block.​create.​gabbro_cobblestone_slab": "Gabrowa brukowa płyta", + "block.​create.​gabbro_cobblestone_stairs": "Gabrowe brukowe schody", + "block.​create.​gabbro_cobblestone_wall": "Gabrowy brukowy murek", + "block.​create.​gabbro_pillar": "Gabrowy filar", + "block.​create.​gantry_carriage": "Przenośnik suwnicowy", + "block.​create.​gantry_shaft": "Suwnica", + "block.​create.​gearbox": "Przekładnia", + "block.​create.​gearshift": "Przekładnik", + "block.​create.​glass_fluid_pipe": "Szklana rura", + "block.​create.​granite_bricks": "Granitowe cegły", + "block.​create.​granite_bricks_slab": "Granitowa ceglana płyta", + "block.​create.​granite_bricks_stairs": "Granitowe ceglane schody", + "block.​create.​granite_bricks_wall": "Granitowy ceglany murek", + "block.​create.​granite_cobblestone": "Granitowy bruk", + "block.​create.​granite_cobblestone_slab": "Granitowa brukowa płyta", + "block.​create.​granite_cobblestone_stairs": "Granitowe brukowe schody", + "block.​create.​granite_cobblestone_wall": "Granitowy brukowy murek", + "block.​create.​granite_pillar": "Granitowy filar", + "block.​create.​gray_sail": "Szary żagiel", + "block.​create.​gray_seat": "Szare siedzenie", + "block.​create.​gray_valve_handle": "Szare pokrętło", + "block.​create.​green_sail": "Zielony żagiel", + "block.​create.​green_seat": "Zielone siedzenie", + "block.​create.​green_valve_handle": "Zielone pokrętło", + "block.​create.​hand_crank": "Ręczna korba", + "block.​create.​honey": "Miód", + "block.​create.​horizontal_framed_glass": "Poziome oprawione szkło", + "block.​create.​horizontal_framed_glass_pane": "Pozioma oprawiona szyba", + "block.​create.​hose_pulley": "Krążek z wężem", + "block.​create.​item_drain": "Odpływ", + "block.​create.​jungle_window": "Dżunglowe okno", + "block.​create.​jungle_window_pane": "Dżunglowa szyba okienna", + "block.​create.​large_cogwheel": "Duże koło zębate", + "block.​create.​layered_andesite": "Warstwowy andezyt", + "block.​create.​layered_dark_scoria": "Warstwowy ciemny żużel", + "block.​create.​layered_diorite": "Warstwowy dioryt", + "block.​create.​layered_dolomite": "Warstwowy dolomit", + "block.​create.​layered_gabbro": "Warstwowe gabro", + "block.​create.​layered_granite": "Warstwowy granit", + "block.​create.​layered_limestone": "Warstwowy wapień", + "block.​create.​layered_scoria": "Warstwowy żużel", + "block.​create.​layered_weathered_limestone": "Warstwowy zwietrzały wapień", + "block.​create.​light_blue_sail": "Jasnoniebieski żagiel", + "block.​create.​light_blue_seat": "Jasnoniebieskie siedzenie", + "block.​create.​light_blue_valve_handle": "Jasnoniebieskie pokrętło", + "block.​create.​light_gray_sail": "Jasnoszary żagiel", + "block.​create.​light_gray_seat": "Jasnoszare siedzenie", + "block.​create.​light_gray_valve_handle": "Jasnoszare pokrętło", + "block.​create.​lime_sail": "Jasnozielony żagiel", + "block.​create.​lime_seat": "Jasnozielone siedzenie", + "block.​create.​lime_valve_handle": "Jasnozielone pokrętło", + "block.​create.​limesand": "Piasek wapienny", + "block.​create.​limestone": "Wapień", + "block.​create.​limestone_bricks": "Wapienne cegły", + "block.​create.​limestone_bricks_slab": "Wapienna ceglana płyta", + "block.​create.​limestone_bricks_stairs": "Wapienne ceglane schody", + "block.​create.​limestone_bricks_wall": "Wapienny ceglany murek", + "block.​create.​limestone_cobblestone": "Wapienny bruk", + "block.​create.​limestone_cobblestone_slab": "Wapienna brukowa płyta", + "block.​create.​limestone_cobblestone_stairs": "Wapienne brukowe schody", + "block.​create.​limestone_cobblestone_wall": "Wapienny brukowy murek", + "block.​create.​limestone_pillar": "Wapienny filar", + "block.​create.​linear_chassis": "Stelaż liniowy", + "block.​create.​lit_blaze_burner": "Zapalony płomienny palnik", + "block.​create.​magenta_sail": "Karmazynowy żagiel", + "block.​create.​magenta_seat": "Karmazynowe siedzenie", + "block.​create.​magenta_valve_handle": "Karmazynowe pokrętło", + "block.​create.​mechanical_arm": "Ramie mechaniczne", + "block.​create.​mechanical_bearing": "Mechaniczne łożysko", + "block.​create.​mechanical_crafter": "Mechaniczny stół rzemieślniczy", + "block.​create.​mechanical_drill": "Mechaniczne wiertło", + "block.​create.​mechanical_harvester": "Mechaniczna żniwiarka", + "block.​create.​mechanical_mixer": "Mechaniczny mikser", + "block.​create.​mechanical_piston": "Mechaniczny tłok", + "block.​create.​mechanical_piston_head": "Głowica mechanicznego tłoka", + "block.​create.​mechanical_plough": "Mechaniczny pług", + "block.​create.​mechanical_press": "Mechaniczna prasa", + "block.​create.​mechanical_pump": "Mechaniczna pompa", + "block.​create.​mechanical_saw": "Mechaniczna piła", + "block.​create.​metal_bracket": "Metalowy wspornik", + "block.​create.​millstone": "Młynek", + "block.​create.​minecart_anchor": "Kotwica wagonikowa", + "block.​create.​mossy_andesite": "Omszony andezyt", + "block.​create.​mossy_dark_scoria": "Zamszony ciemny żużel", + "block.​create.​mossy_diorite": "Zamszony dioryt", + "block.​create.​mossy_dolomite": "Zamszony dolomit", + "block.​create.​mossy_gabbro": "Zamszone gabro", + "block.​create.​mossy_granite": "Zamszony granit", + "block.​create.​mossy_limestone": "Zamszony wapień", + "block.​create.​mossy_scoria": "Zamszony żużel", + "block.​create.​mossy_weathered_limestone": "Zamszony zwietrzały wapień", + "block.​create.​mysterious_cuckoo_clock": "Zegar z kukułką", + "block.​create.​natural_scoria": "Naturalny żużel", + "block.​create.​nixie_tube": "Lampa cyfrowa", + "block.​create.​nozzle": "Dysza", + "block.​create.​oak_window": "Dębowe okno", + "block.​create.​oak_window_pane": "Dębowa szyba okienna", + "block.​create.​orange_sail": "Pomarańczowy żagiel", + "block.​create.​orange_seat": "Pomarańczowe siedzenie", + "block.​create.​orange_valve_handle": "Pomarańczowe pokrętło", + "block.​create.​ornate_iron_window": "Ozdobne żelazne okno", + "block.​create.​ornate_iron_window_pane": "Ozdobna żelazne szyba okienna", + "block.​create.​overgrown_andesite": "Zarośnięty andezyt", + "block.​create.​overgrown_dark_scoria": "Zarośnięty ciemny żużel", + "block.​create.​overgrown_diorite": "Zarośnięty dioryt", + "block.​create.​overgrown_dolomite": "Zarośnięty dolomit", + "block.​create.​overgrown_gabbro": "Zarośnięte gabro", + "block.​create.​overgrown_granite": "Zarośnięty granit", + "block.​create.​overgrown_limestone": "Zarośnięty wapień", + "block.​create.​overgrown_scoria": "Zarośnięty żużel", + "block.​create.​overgrown_weathered_limestone": "Zarośnięty zwietrzały wapień", + "block.​create.​paved_andesite": "Wygładzony andezyt", + "block.​create.​paved_andesite_slab": "Wygładzona andezytowa płyta", + "block.​create.​paved_andesite_stairs": "Wygładzone andezytowe schody", + "block.​create.​paved_andesite_wall": "Wygładzony andezytowy murek", + "block.​create.​paved_dark_scoria": "Wygładzony ciemny żużel", + "block.​create.​paved_dark_scoria_slab": "Wygładzona ciemnożużlowa płyta", + "block.​create.​paved_dark_scoria_stairs": "Wygładzone ciemnożużlowe schody", + "block.​create.​paved_dark_scoria_wall": "Wygładzony ciemnożużlowy murek", + "block.​create.​paved_diorite": "Wygładzony dioryt", + "block.​create.​paved_diorite_slab": "Wygładzona diorytowa płyta", + "block.​create.​paved_diorite_stairs": "Wygładzone diorytowe schody", + "block.​create.​paved_diorite_wall": "Wygładzony diorytowy murek", + "block.​create.​paved_dolomite": "Wygładzony dolomit", + "block.​create.​paved_dolomite_slab": "Wygładzona dolomitowa płyta", + "block.​create.​paved_dolomite_stairs": "Wygładzone dolomitowe schody", + "block.​create.​paved_dolomite_wall": "Wygładzony dolomitowy murek", + "block.​create.​paved_gabbro": "Wygładzone gabro", + "block.​create.​paved_gabbro_slab": "Wygładzona gabrowa płyta", + "block.​create.​paved_gabbro_stairs": "Wygładzone gabrowe schody", + "block.​create.​paved_gabbro_wall": "Wygładzony gabrowy murek", + "block.​create.​paved_granite": "Wygładzony granit", + "block.​create.​paved_granite_slab": "Wygładzona granitowa płyta", + "block.​create.​paved_granite_stairs": "Wygładzone granitowe schody", + "block.​create.​paved_granite_wall": "Wygładzony granitowy murek", + "block.​create.​paved_limestone": "Wygładzony wapień", + "block.​create.​paved_limestone_slab": "Wygładzona wapienna płyta", + "block.​create.​paved_limestone_stairs": "Wygładzone wapienne schody", + "block.​create.​paved_limestone_wall": "Wygładzony wapienny murek", + "block.​create.​paved_scoria": "Wygładzony żużel", + "block.​create.​paved_scoria_slab": "Wygładzona żużlowa płyta", + "block.​create.​paved_scoria_stairs": "Wygładzone żużlowe schody", + "block.​create.​paved_scoria_wall": "Wygładzony żużlowy murek", + "block.​create.​paved_weathered_limestone": "Wygładzony zwietrzały wapień", + "block.​create.​paved_weathered_limestone_slab": "Wygładzona zwietrzała wapienna płyta", + "block.​create.​paved_weathered_limestone_stairs": "Wygładzone zwietrzałe wapienne schody", + "block.​create.​paved_weathered_limestone_wall": "Wygładzony zwietrzały wapienny murek", + "block.​create.​pink_sail": "Różowy żagiel", + "block.​create.​pink_seat": "Różowe siedzenie", + "block.​create.​pink_valve_handle": "Różowe pokrętło", + "block.​create.​piston_extension_pole": "Przedłużenie tłoka", + "block.​create.​polished_dark_scoria": "Wypolerowany ciemny żużel", + "block.​create.​polished_dark_scoria_slab": "Wypolerowana ciemnożużlowa płyta", + "block.​create.​polished_dark_scoria_stairs": "Wypolerowane ciemnożużlowe schody", + "block.​create.​polished_dark_scoria_wall": "Wypolerowany ciemnożużlowy murek", + "block.​create.​polished_dolomite": "Wypolerowany dolomit", + "block.​create.​polished_dolomite_slab": "Wypolerowana dolomitowa płyta", + "block.​create.​polished_dolomite_stairs": "Wypolerowane dolomitowe schody", + "block.​create.​polished_dolomite_wall": "Wypolerowany dolomitowy murek", + "block.​create.​polished_gabbro": "Wypolerowane gabro", + "block.​create.​polished_gabbro_slab": "Wypolerowana gabrowa płyta", + "block.​create.​polished_gabbro_stairs": "Wypolerowane gabrowe schody", + "block.​create.​polished_gabbro_wall": "Wypolerowany gabrowy murek", + "block.​create.​polished_limestone": "Wypolerowany wapień", + "block.​create.​polished_limestone_slab": "Wypolerowana wapienna płyta", + "block.​create.​polished_limestone_stairs": "Wypolerowane wapienne schody", + "block.​create.​polished_limestone_wall": "Wypolerowany wapienny murek", + "block.​create.​polished_scoria": "Wypolerowany żużel", + "block.​create.​polished_scoria_slab": "Wypolerowana żużlowa płyta", + "block.​create.​polished_scoria_stairs": "Wypolerowane żużlowe schody", + "block.​create.​polished_scoria_wall": "Wypolerowany żużlowy murek", + "block.​create.​polished_weathered_limestone": "Wypolerowany zwietrzały wapień", + "block.​create.​polished_weathered_limestone_slab": "Wypolerowana zwietrzała wapienna płyta", + "block.​create.​polished_weathered_limestone_stairs": "Wypolerowane zwietrzałe wapienne schody", + "block.​create.​polished_weathered_limestone_wall": "Wypolerowany zwietrzały wapienny murek", + "block.​create.​portable_fluid_interface": "Przenośny interfejs płynów", + "block.​create.​portable_storage_interface": "Przenośny interfejs magazynu", + "block.​create.​powered_latch": "Zaawansowany zasilany przełącznik", + "block.​create.​powered_toggle_latch": "Zasilany przełącznik", + "block.​create.​pulley_magnet": "Krążek z magnesem", + "block.​create.​pulse_repeater": "Przekaźnik pulsowy", + "block.​create.​purple_sail": "Fioletowy żagiel", + "block.​create.​purple_seat": "Fioletowe siedzenie", + "block.​create.​purple_valve_handle": "Fioletowe pokrętło", + "block.​create.​radial_chassis": "Stelaż promienisty", + "block.​create.​red_sail": "Czerwony żagiel", + "block.​create.​red_seat": "Czerwone siedzenie", + "block.​create.​red_valve_handle": "Czerwone pokrętło", + "block.​create.​redstone_contact": "Przełącznik kontaktowy", + "block.​create.​redstone_link": "Emiter sygnału", + "block.​create.​refined_radiance_casing": "Świetlista obudowa", + "block.​create.​reinforced_rail": "Wzmocnione tory", + "block.​create.​rope": "Lina", + "block.​create.​rope_pulley": "Krążek z liną", + "block.​create.​rotation_speed_controller": "Sterownik prędkości obrotu", + "block.​create.​sail_frame": "Rama żagla", + "block.​create.​schematic_table": "Stół do planowania", + "block.​create.​schematicannon": "Schematoarmata", + "block.​create.​scoria": "Żużel", + "block.​create.​scoria_bricks": "Żużlowe cegły", + "block.​create.​scoria_bricks_slab": "Żużlowa ceglana płyta", + "block.​create.​scoria_bricks_stairs": "Żużlowe ceglane schody", + "block.​create.​scoria_bricks_wall": "Żużlowy ceglany murek", + "block.​create.​scoria_cobblestone": "Żużlowy bruk", + "block.​create.​scoria_cobblestone_slab": "Żużlowa brukowa płyta", + "block.​create.​scoria_cobblestone_stairs": "Żużlowe brukowe schody", + "block.​create.​scoria_cobblestone_wall": "Żużlowy brukowy murek", + "block.​create.​scoria_pillar": "Żużlowy filar", + "block.​create.​secondary_linear_chassis": "Drugorzędny liniowy stelaż", + "block.​create.​sequenced_gearshift": "Przekładnik sekwencjonalny", + "block.​create.​shadow_steel_casing": "Mroczna obudowa", + "block.​create.​shaft": "Wał", + "block.​create.​smart_chute": "Inteligentny Zsyp", + "block.​create.​smart_fluid_pipe": "Inteligentna rura", + "block.​create.​speedometer": "Prędkościomierz", + "block.​create.​spout": "Kanister", + "block.​create.​spruce_window": "Świerkowe okno", + "block.​create.​spruce_window_pane": "Świerkowa szyba okienna", + "block.​create.​sticker": "Przyklejacz", + "block.​create.​sticky_mechanical_piston": "Lepki mechaniczny tłok", + "block.​create.​stockpile_switch": "Przełącznik zawartościowy", + "block.​create.​stressometer": "Miernik obciążenia", + "block.​create.​tiled_glass": "Kafelkowane szkło", + "block.​create.​tiled_glass_pane": "Kafelkowana szyba", + "block.​create.​turntable": "Talerz obrotowy", + "block.​create.​vertical_framed_glass": "Pionowe oprawione szkło", + "block.​create.​vertical_framed_glass_pane": "Pionowa oprawiona szyba", + "block.​create.​warped_window": "Spaczone okno", + "block.​create.​warped_window_pane": "Spaczona szyba okienna", + "block.​create.​water_wheel": "Koło wodne", + "block.​create.​weathered_limestone": "Zwietrzały wapień", + "block.​create.​weathered_limestone_bricks": "Zwietrzałe wapienne cegły", + "block.​create.​weathered_limestone_bricks_slab": "Zwietrzała wapienna ceglana płyta", + "block.​create.​weathered_limestone_bricks_stairs": "Zwietrzałe wapienne ceglane schody", + "block.​create.​weathered_limestone_bricks_wall": "Zwietrzały wapienny ceglany murek", + "block.​create.​weathered_limestone_cobblestone": "Zwietrzały wapienny bruk", + "block.​create.​weathered_limestone_cobblestone_slab": "Zwietrzała wapienna brukowa płyta", + "block.​create.​weathered_limestone_cobblestone_stairs": "Zwietrzałe wapienne brukowe schody", + "block.​create.​weathered_limestone_cobblestone_wall": "Zwietrzały wapienny brukowy murek", + "block.​create.​weathered_limestone_pillar": "Zwietrzały wapienny filar", + "block.​create.​weighted_ejector": "Wyrzutnia odważnikowa", + "block.​create.​white_sail": "Biały żagiel", + "block.​create.​white_seat": "Białe siedzenie", + "block.​create.​white_valve_handle": "Białe pokrętło", + "block.​create.​windmill_bearing": "Łożysko wiatraka", + "block.​create.​wooden_bracket": "Drewniany wspornik", + "block.​create.​yellow_sail": "Żółty żagiel", + "block.​create.​yellow_seat": "Żółte siedzenie", + "block.​create.​yellow_valve_handle": "Żółte pokrętło", + "block.​create.​zinc_block": "Blok cynku", + "block.​create.​zinc_ore": "Ruda cynku", + + "entity.​create.​contraption": "Maszyna", + "entity.​create.​gantry_contraption": "Maszyna suwnicowa", + "entity.​create.​seat": "Siedzenie", + "entity.​create.​stationary_contraption": "Maszyna stacjonarna", + "entity.​create.​super_glue": "Super Glue", + + "fluid.​create.​milk": "Mleko", + "fluid.​create.​potion": "Mikstura", + "fluid.​create.​tea": "Herbatka Budowniczego", + + "item.​create.​andesite_alloy": "Stop andezytu", + "item.​create.​attribute_filter": "Filtr atrybutowy", + "item.​create.​bar_of_chocolate": "Tabliczka czekolady", + "item.​create.​belt_connector": "Taśma", + "item.​create.​blaze_cake": "Płomienne ciasto", + "item.​create.​blaze_cake_base": "Baza płomiennego ciasta", + "item.​create.​brass_hand": "Mosiężna dłoń", + "item.​create.​brass_ingot": "Sztabka mosiądzu", + "item.​create.​brass_nugget": "Bryłka mosiądzu", + "item.​create.​brass_sheet": "Arkusz mosiądzu", + "item.​create.​builders_tea": "Herbatka Budowniczego", + "item.​create.​chest_minecart_contraption": "Maszyna w wagoniku ze skrzynią", + "item.​create.​chocolate_bucket": "Wiadro czekolady", + "item.​create.​chocolate_glazed_berries": "Jagody w czekoladzie", + "item.​create.​chromatic_compound": "Związek chromatyczny", + "item.​create.​cinder_flour": "Rozżarzona mąka", + "item.​create.​copper_ingot": "Sztabka miedzi", + "item.​create.​copper_nugget": "Bryłka miedzi", + "item.​create.​copper_sheet": "Arkusz miedzi", + "item.​create.​crafter_slot_cover": "Przykrywka na slot stołu rzemieślniczego", + "item.​create.​crushed_aluminum_ore": "Rozkruszona ruda żelaza", + "item.​create.​crushed_brass": "Rozkruszony mosiądz", + "item.​create.​crushed_copper_ore": "Rozkruszona ruda miedzi", + "item.​create.​crushed_gold_ore": "Rozkruszona ruda złota", + "item.​create.​crushed_iron_ore": "Rozkruszona ruda żelaza", + "item.​create.​crushed_lead_ore": "Rozkruszona ruda ołowiu", + "item.​create.​crushed_nickel_ore": "Rozkruszona ruda niklu", + "item.​create.​crushed_osmium_ore": "Rozkruszona ruda osmu", + "item.​create.​crushed_platinum_ore": "Rozkruszona ruda platyny", + "item.​create.​crushed_quicksilver_ore": "Rozkruszona ruda rtęci", + "item.​create.​crushed_silver_ore": "Rozkruszona ruda srebra", + "item.​create.​crushed_tin_ore": "Rozkruszona ruda cyny", + "item.​create.​crushed_uranium_ore": "Rozkruszona ruda uranu", + "item.​create.​crushed_zinc_ore": "Rozkruszona ruda cynku", + "item.​create.​deforester": "Wylesiacz", + "item.​create.​dough": "Ciasto", + "item.​create.​electron_tube": "Lampa elektronowa", + "item.​create.​empty_blaze_burner": "Pusty płomienny palnik", + "item.​create.​empty_schematic": "Pusty schemat", + "item.​create.​extendo_grip": "Wydłużony Chwytak", + "item.​create.​filter": "Filtr", + "item.​create.​furnace_minecart_contraption": "Maszyna w wagoniku z piecem", + "item.​create.​goggles": "Gogle inżyniera", + "item.​create.​golden_sheet": "Arkusz złota", + "item.​create.​handheld_blockzapper": "Ręczny odkładacz", + "item.​create.​handheld_worldshaper": "Ręczny kształter", + "item.​create.​honey_bucket": "Wiadro miodu", + "item.​create.​honeyed_apple": "Jabłko w miodzie", + "item.​create.​integrated_circuit": "Układ scalony", + "item.​create.​iron_sheet": "Arkusz żelaza", + "item.​create.​lapis_sheet": "Arkusz lazurytu", + "item.​create.​minecart_contraption": "Maszyna w wagoniku", + "item.​create.​minecart_coupling": "Łącznik wagoników", + "item.​create.​polished_rose_quartz": "Wypolerowany kwarc różowy", + "item.​create.​powdered_obsidian": "Sproszkowany obsydian", + "item.​create.​propeller": "Śmigło", + "item.​create.​red_sand_paper": "Czerwony papier ścierny", + "item.​create.​refined_radiance": "Świetlisty materiał", + "item.​create.​rose_quartz": "Kwarc różowy", + "item.​create.​sand_paper": "Papier ścierny", + "item.​create.​schematic": "Schemat", + "item.​create.​schematic_and_quill": "Schemat z piórem", + "item.​create.​shadow_steel": "Mroczna stal", + "item.​create.​super_glue": "Super Glue", + "item.​create.​sweet_roll": "Słodka bułka", + "item.​create.​tree_fertilizer": "Nawóz do drzew", + "item.​create.​vertical_gearbox": "Pionowa przekładnia", + "item.​create.​wand_of_symmetry": "Różdżka symetrii", + "item.​create.​wheat_flour": "Mąka pszenna", + "item.​create.​whisk": "Trzepaczka", + "item.​create.​wrench": "Klucz", + "item.​create.​zinc_ingot": "Sztabka cynku", + "item.​create.​zinc_nugget": "Bryłka cynku", + + + "_": "->------------------------] Postępy [------------------------<-", + + "advancement.​create.​root": "Witaj w Create", + "advancement.​create.​root.​desc": "Czas, aby zacząć tworzyć wspaniałe Maszyny!", + "advancement.​create.​andesite_alloy": "Słynne stopy", + "advancement.​create.​andesite_alloy.​desc": "Materiały z Create mają czasami dziwne nazwy, stop andezytu jest jednym z nich.", + "advancement.​create.​its_alive": "To żyje!", + "advancement.​create.​its_alive.​desc": "Patrz, jak Twój pierwszy ruchomy komponent się obraca.", + "advancement.​create.​shifting_gears": "Przekładnia", + "advancement.​create.​shifting_gears.​desc": "Połącz duże koło zębate i małe koło zębate, co pozwoli zmienić prędkość obrotu Twojej maszyny.", + "advancement.​create.​overstressed": "Przeciążenie", + "advancement.​create.​overstressed.​desc": "Doświadcz limitów obciążenia z pierwszej ręki.", + "advancement.​create.​belt": "Taśma produkcyjna", + "advancement.​create.​belt.​desc": "Połącz dwa wały tworząc taśmociąg.", + "advancement.​create.​tunnel": "Światełko w tunelu", + "advancement.​create.​tunnel.​desc": "Ulepsz swój taśmociąg dodając tunel.", + "advancement.​create.​splitter_tunnel": "Dziel i rządź", + "advancement.​create.​splitter_tunnel.​desc": "Stwórz rozdzielacz przy pomocy kilku mosiężnych tuneli.", + "advancement.​create.​chute": "Czarna dziura", + "advancement.​create.​chute.​desc": "Postaw zsyp - pionową część taśmociągu.", + "advancement.​create.​upward_chute": "Powietrzne porwanie", + "advancement.​create.​upward_chute.​desc": "Wrzuć przedmiot do zsypu z wiatrakiem.", + "advancement.​create.​belt_funnel": "Sprzęt produkcyjny", + "advancement.​create.​belt_funnel.​desc": "Postaw lejek lub składnicę na taśmociągu, aby dodać dodatkowe funkcje.", + "advancement.​create.​belt_funnel_kiss": "Zakochana para", + "advancement.​create.​belt_funnel_kiss.​desc": "Spraw, aby dwa lejki na taśmociągu się pocałowały", + "advancement.​create.​fan": "Wisząc w powietrzu", + "advancement.​create.​fan.​desc": "Unieś się w powietrze na izolowanym wiatraku.", + "advancement.​create.​fan_lava": "Ogrzewanie geotermalne", + "advancement.​create.​fan_lava.​desc": "Wpadnij w strumień powietrza zdolnego do topienia metali.", + "advancement.​create.​fan_water": "Myjnia automatyczna", + "advancement.​create.​fan_water.​desc": "Wpadnij w strumień powietrza przenoszącego krople wody.", + "advancement.​create.​fan_smoke": "Wędzarnia", + "advancement.​create.​fan_smoke.​desc": "Wpadnij w strumień powietrza z dymem.", + "advancement.​create.​wrench": "Poręczna konfiguracja", + "advancement.​create.​wrench.​desc": "Wytwórz klucz pomocny w pracy z maszynami.", + "advancement.​create.​goggles": "Stress-O-Vision", + "advancement.​create.​goggles.​desc": "Wytwórz gogle inżyniera, które pomogą Ci w zdobyciu większej ilości informacji o ruchomych komponentach.", + "advancement.​create.​speedometer": "Ale że jak szybko?", + "advancement.​create.​speedometer.​desc": "Połóż i wpraw w ruch prędkościomierz. Popatrz na niego przez Twoje gogle, aby poznać dokładną wartość.", + "advancement.​create.​stressometer": "Ale że jakie obciążenie?", + "advancement.​create.​stressometer.​desc": "Połóż i wpraw w ruch miernik obciążenia. Popatrz na niego przez Twoje gogle, aby poznać dokładną wartość.", + "advancement.​create.​aesthetics": "Estetyka!", + "advancement.​create.​aesthetics.​desc": "Postaw wsporniki przy wale, rurze i kole zębatym.", + "advancement.​create.​reinforced": "Wzmocnienie!", + "advancement.​create.​reinforced.​desc": "Użyj pasujących obudów na wale, rurze i kole zębatym.", + "advancement.​create.​water_wheel": "Energia odnawialna", + "advancement.​create.​water_wheel.​desc": "Postaw koło wodne i spraw, aby zaczęło się kręcić!", + "advancement.​create.​chocolate_wheel": "Smakowita energia", + "advancement.​create.​chocolate_wheel.​desc": "Wpraw w ruch koło wodne przy pomocy gorącej czekolady.", + "advancement.​create.​lava_wheel": "Koło magmowe", + "advancement.​create.​lava_wheel.​desc": "To nigdy nie powinno było zadziałać.", + "advancement.​create.​cuckoo": "To już czas?", + "advancement.​create.​cuckoo.​desc": "Bądź świadkiem tego, jak zegar z kukułką ogłasza porę snu.", + "advancement.​create.​millstone": "Kieszonkowy rozgniatacz", + "advancement.​create.​millstone.​desc": "Postaw i wpraw w ruch młynek.", + "advancement.​create.​windmill": "Łagodna bryza", + "advancement.​create.​windmill.​desc": "Skonstruuj działający wiatrak.", + "advancement.​create.​maxed_windmill": "Silna bryza", + "advancement.​create.​maxed_windmill.​desc": "Skonstruuj wiatrak o maksymalnej sile.", + "advancement.​create.​andesite_casing": "Epoka andezytu łupanego", + "advancement.​create.​andesite_casing.​desc": "Użyj stopu andezytu, aby wytworzyć podstawową obudowę.", + "advancement.​create.​mechanical_drill": "Wiertło stacjonarne", + "advancement.​create.​mechanical_drill.​desc": "Postaw i wpraw w ruch mechaniczne wiertło.", + "advancement.​create.​press": "Prasa nie do końca drukarska", + "advancement.​create.​press.​desc": "Wpraw w ruch prasę i wytłocz kilka metalowych arkuszy.", + "advancement.​create.​polished_rose_quartz": "Różowe diamenty", + "advancement.​create.​polished_rose_quartz.​desc": "Poleruj różowy kwarc papierem ściernym tak długo, aż będzie przezroczysty.", + "advancement.​create.​electron_tube": "Beep Boop", + "advancement.​create.​electron_tube.​desc": "Wytwórz kilka lamp elektronowych, przydatnych do konstrukcji mniej prymitywnych maszyn.", + "advancement.​create.​mechanical_saw": "Siekiera stacjonarna", + "advancement.​create.​mechanical_saw.​desc": "Postaw i wpraw w ruch mechaniczną piłę.", + "advancement.​create.​basin": "Tygiel kulturowy", + "advancement.​create.​basin.​desc": "Postaw tygiel i wrzuć do niego kilka przedmiotów.", + "advancement.​create.​mixer": "Pomieszanie z poplątaniem", + "advancement.​create.​mixer.​desc": "Postaw nad tyglem mechaniczny mikser i użyj go do zmieszania przedmiotów na jednolitą masę.", + "advancement.​create.​blaze_burner": "Żywy ogień", + "advancement.​create.​blaze_burner.​desc": "Zdobądź płomienny palnik.", + "advancement.​create.​compact": "Zautomatyzowane prasowanie", + "advancement.​create.​compact.​desc": "Użyj prasy i tygla do sprasowania przedmiotów.", + "advancement.​create.​brass": "Prawdziwe stopy", + "advancement.​create.​brass.​desc": "Zmieszaj sproszkowaną miedź i sproszkowany cynk, tworząc mosiądz.", + "advancement.​create.​brass_casing": "Epoka brązu", + "advancement.​create.​brass_casing.​desc": "Użyj nowo poznany mosiądz i odrobiny drewna, aby wytworzyć ulepszoną obudowę.", + "advancement.​create.​copper_casing": "Epoka miedzi", + "advancement.​create.​copper_casing.​desc": "Użyj arkuszy miedzi i odrobiny drewna, aby wytworzyć miedzianą obudowę.", + "advancement.​create.​spout": "Plum", + "advancement.​create.​spout.​desc": "Patrz jak przedmiot napełnia się płynem przy użyciu kanistra.", + "advancement.​create.​spout_potion": "Globalny browar", + "advancement.​create.​spout_potion.​desc": "Patrz jak butelka napełnia się miksturą.", + "advancement.​create.​chocolate": "Świat wyobraźni", + "advancement.​create.​chocolate.​desc": "Zdobądź wiadro płynnej czekolady.", + "advancement.​create.​item_drain": "Szybki odpływ", + "advancement.​create.​item_drain.​desc": "Patrz jak przedmiot jest opróżniany przy użyciu odpływu.", + "advancement.​create.​chained_item_drain": "Niech się dzieje!", + "advancement.​create.​chained_item_drain.​desc": "Patrz jak przedmiot toczy się przez wiele połączonych odpływów.", + "advancement.​create.​glass_pipe": "Płynny podglądacz", + "advancement.​create.​glass_pipe.​desc": "Patrz jak ciecz płynie przez rurę z okienkiem. Użyj klucza na prostej rurze, aby dodać do niej okno.", + "advancement.​create.​pipe_collision": "Nigdy nie krzyżuj strumieni!", + "advancement.​create.​pipe_collision.​desc": "Patrz jak dwie ciecze spotykają się w Twoim systemie rur.", + "advancement.​create.​pipe_spill": "Mamy wyciek!", + "advancement.​create.​pipe_spill.​desc": "Patrz jak otwarta część rury stawia lub pochłania ciecze.", + "advancement.​create.​hose_pulley": "Wyciek przemysłowy", + "advancement.​create.​hose_pulley.​desc": "Obniż krążek z wężem, aby osuszyć lub wypełnić płynem jakiś obszar.", + "advancement.​create.​infinite_water": "Osuszanie oceanu", + "advancement.​create.​infinite_water.​desc": "Wypompuj trochę wody z miejsca, które jest wystarczająco duże, że może być uznane za Nieskończone.", + "advancement.​create.​infinite_lava": "Prosto z jądra Ziemi", + "advancement.​create.​infinite_lava.​desc": "Wypompuj trochę lawy z miejsca, które jest wystarczająco duże, że może być uznane za Nieskończone.", + "advancement.​create.​infinite_chocolate": "Tonę we własnej wyobraźni", + "advancement.​create.​infinite_chocolate.​desc": "Wypompuj trochę czekolady z miejsca, które jest wystarczająco duże, że może być uznane za Nieskończone.", + "advancement.​create.​crafter": "Linia produkcyjna", + "advancement.​create.​crafter.​desc": "Postaw i wpraw w ruch mechaniczny stół rzemieślniczy.", + "advancement.​create.​clockwork_bearing": "Jaką mamy godzinę?", + "advancement.​create.​clockwork_bearing.​desc": "Skonstruuj strukturę obracającą się na mechanizmie zegarowym.", + "advancement.​create.​nixie_tube": "Oznaka stylu", + "advancement.​create.​nixie_tube.​desc": "Wytwórz i postaw parę lamp cyfrowych.", + "advancement.​create.​deployer": "Postaw i zniszcz", + "advancement.​create.​deployer.​desc": "Postaw i wpraw w ruch aplikator, Twoje idealne odbicie.", + "advancement.​create.​speed_controller": "Inżynierowie go nienawidzą!", + "advancement.​create.​speed_controller.​desc": "Postaw sterownik prędkości obrotu, najlepsze narzędzie do zmiany przekładni.", + "advancement.​create.​flywheel": "Serce Fabryki", + "advancement.​create.​flywheel.​desc": "Skutecznie podłącz silnik do koła zamachowego.", + "advancement.​create.​overstress_flywheel": "Wysoki poziom obciążenia", + "advancement.​create.​overstress_flywheel.​desc": "Przeładuj silnik spalinowy.", + "advancement.​create.​integrated_circuit": "Skomplikowane obliczenia", + "advancement.​create.​integrated_circuit.​desc": "Złóż układ scalony.", + "advancement.​create.​mechanical_arm": "Ręce pełne roboty", + "advancement.​create.​mechanical_arm.​desc": "Wytwórz ramię mechaniczne, wybierz miejsca wejścia i wyjścia, postaw je i wpraw w ruch. Patrz jak robi wszystko za Ciebie.", + "advancement.​create.​musical_arm": "Zagraj coś dla mnie!", + "advancement.​create.​musical_arm.​desc": "Patrz jak mechaniczne ramię obsługuje szafę grającą.", + "advancement.​create.​arm_many_targets": "Organizer", + "advancement.​create.​arm_many_targets.​desc": "Zaprogramuj ramię mechaniczne z przynajmniej dziesięcioma miejscami wyjścia.", + "advancement.​create.​arm_blaze_burner": "Automatyczny wlot paliwowy", + "advancement.​create.​arm_blaze_burner.​desc": "Poinstruuj ramię mechaniczne, jak napełniać płomienny palnik.", + "advancement.​create.​fist_bump": "Żółwik!", + "advancement.​create.​fist_bump.​desc": "Spraw, aby dwa aplikatory stuknęły się pięścią.", + "advancement.​create.​crushing_wheel": "Nierozłączna para", + "advancement.​create.​crushing_wheel.​desc": "Wytwórz parę kół kruszących, aby kruszyły więcej materiałów w krótszym czasie.", + "advancement.​create.​blaze_cake": "Przypływ energii", + "advancement.​create.​blaze_cake.​desc": "Upiecz dla swojego palnika pyszne ciasto.", + "advancement.​create.​chromatic_compound": "Minerały dwubiegunowe", + "advancement.​create.​chromatic_compound.​desc": "Wytwórz sztabkę związku chromatycznego.", + "advancement.​create.​shadow_steel": "Dar otchłani", + "advancement.​create.​shadow_steel.​desc": "Uzyskaj mroczną stal, sztabkę pełną nicości.", + "advancement.​create.​refined_radiance": "Czysty blask", + "advancement.​create.​refined_radiance.​desc": "Uzyskaj świetlisty materiał, silną substancję chromatyczną.", + "advancement.​create.​chromatic_age": "Epoka kolorów", + "advancement.​create.​chromatic_age.​desc": "Wytwórz jasną i mroczną obudowę.", + "advancement.​create.​zapper": "Magiczne budowanie", + "advancement.​create.​zapper.​desc": "Wytwórz ręczny odkładacz - promień pomocny na budowie.", + "advancement.​create.​upgraded_zapper": "Napromieniowanie", + "advancement.​create.​upgraded_zapper.​desc": "Wytwórz i uruchom maksymalnie ulepszony ręczny odkładacz.", + "advancement.​create.​wand_of_symmetry": "Symetria.", + "advancement.​create.​wand_of_symmetry.​desc": "Zdobądź różdżkę symetrii.", + "advancement.​create.​deforester": "Deforestacja", + "advancement.​create.​deforester.​desc": "Wytwórz wylesiacz i pogłęb światowe problemy klimatyczne.", + "advancement.​create.​extendo_grip": "Dalej dalej ręce Gadżeta!", + "advancement.​create.​extendo_grip.​desc": "Złap w ręce Wydłużony Chwytak.", + "advancement.​create.​dual_extendo_grip": "Bioniczne modyfikacje", + "advancement.​create.​dual_extendo_grip.​desc": "Użyj dwóch Wydłużonych Chwytaków, aby posiąść nadludzki zasięg.", + "advancement.​create.​eob": "Koniec Bety", + "advancement.​create.​eob.​desc": "Bądź gotowy na więcej treści w przyszłości. <3", + + + "_": "->------------------------] Interfejs & Komunikaty [------------------------<-", + + "itemGroup.​create.​base": "Create", + "itemGroup.​create.​palettes": "Palety Create", + + "death.​attack.​create.​crush": "Gracz %1$s został zgnieciony przez koło kruszące", + "death.​attack.​create.​fan_fire": "Gracz %1$s poparzył się gorącym powietrzem", + "death.​attack.​create.​fan_lava": "Gracz %1$s poparzył się kroplami lawy", + "death.​attack.​create.​mechanical_drill": "Gracz %1$s nabił się na mechaniczne wiertło", + "death.​attack.​create.​mechanical_saw": "Gracz %1$s został przecięty na pół przez mechaniczną piłę", + "death.​attack.​create.​cuckoo_clock_explosion": "Gracz %1$s został wysadzony w powietrze przez uszkodzony zegar z kukułką", + + "create.​block.​deployer.​damage_source_name": "zbuntowany aplikator", + "create.​block.​cart_assembler.​invalid": "Postaw monter wagoników na torze", + + "create.​recipe.​crushing": "Kruszenie", + "create.​recipe.​milling": "Mielenie", + "create.​recipe.​fan_washing": "Hurtowe płukanie", + "create.​recipe.​fan_washing.​fan": "Wiatrak za płynącą wodą", + "create.​recipe.​fan_smoking": "Hurtowe wędzenie", + "create.​recipe.​fan_smoking.​fan": "Wiatrak za ogniem", + "create.​recipe.​fan_blasting": "Hurtowe topienie", + "create.​recipe.​fan_blasting.​fan": "Wiatrak za lawą", + "create.​recipe.​pressing": "Tłoczenie", + "create.​recipe.​mixing": "Mieszanie", + "create.​recipe.​automatic_shapeless": "Zautomatyzowanie nieokreślone konstruowanie", + "create.​recipe.​automatic_brewing": "Zautomatyzowane warzenie", + "create.​recipe.​packing": "Prasowanie", + "create.​recipe.​automatic_packing": "Zautomatyzowane pakowanie", + "create.​recipe.​sawing": "Cięcie", + "create.​recipe.​mechanical_crafting": "Mechaniczne konstruowanie", + "create.​recipe.​automatic_shaped": "Zautomatyzowane określone konstruowanie", + "create.​recipe.​block_cutting": "Cięcie bloków", + "create.​recipe.​wood_cutting": "Cięcie drewna", + "create.​recipe.​blockzapper_upgrade": "Ręczny odkładacz", + "create.​recipe.​sandpaper_polishing": "Polerowanie papierem ściernym", + "create.​recipe.​mystery_conversion": "Tajemnicza przemiana", + "create.​recipe.​spout_filling": "Wypełnianie", + "create.​recipe.​draining": "Osuszanie", + "create.​recipe.​processing.​chance": "%1$s%% szans", + "create.​recipe.​heat_requirement.​none": "Nie wymaga podgrzewania", + "create.​recipe.​heat_requirement.​heated": "Podrzewane", + "create.​recipe.​heat_requirement.​superheated": "Silnie podgrzewane", + + "create.​generic.​range": "Zasięg", + "create.​generic.​radius": "Promień", + "create.​generic.​width": "Szerokość", + "create.​generic.​height": "Wysokość", + "create.​generic.​length": "Długość", + "create.​generic.​speed": "Prędkość", + "create.​generic.​delay": "Opóźnienie", + "create.​generic.​unit.​ticks": "Tiki", + "create.​generic.​unit.​seconds": "Sekundy", + "create.​generic.​unit.​minutes": "Minuty", + "create.​generic.​unit.​rpm": "Ob/min", + "create.​generic.​unit.​stress": "JO", + "create.​generic.​unit.​degrees": "°", + "create.​generic.​unit.​millibuckets": "%1$smW", + "create.​generic.​clockwise": "Zgodnie ze wskazówkami zegara", + "create.​generic.​counter_clockwise": "Przeciwnie do wskazówek zegara", + + "create.​action.​scroll": "Przewiń", + "create.​action.​confirm": "Potwierdź", + "create.​action.​abort": "Przerwij", + "create.​action.​saveToFile": "Zapisz", + "create.​action.​discard": "Odrzuć", + + "create.​keyinfo.​toolmenu": "Menu narzędzi", + "create.​keyinfo.​scrollup": "Symuluj przewijanie w górę (w świecie)", + "create.​keyinfo.​scrolldown": "Symuluj przewijanie w dół (w świecie)", + + "create.​gui.​scrollInput.​defaultTitle": "Wybierz opcję:", + "create.​gui.​scrollInput.​scrollToModify": "Przewiń, aby zmodyfikować", + "create.​gui.​scrollInput.​scrollToAdjustAmount": "Przewiń, aby dostosować ilość", + "create.​gui.​scrollInput.​scrollToSelect": "Przewiń, aby wybrać", + "create.​gui.​scrollInput.​shiftScrollsFaster": "Naciśnij Shift, aby przewijać szybciej", + "create.​gui.​toolmenu.​focusKey": "Przytrzymaj [%1$s], aby skupić", + "create.​gui.​toolmenu.​cycle": "[SCROLL] przewijać", + "create.​gui.​symmetryWand.​mirrorType": "Odbicie lustrzane", + "create.​gui.​symmetryWand.​orientation": "Orientacja", + + "create.​symmetry.​mirror.​plane": "Odbij lustrzanie raz", + "create.​symmetry.​mirror.​doublePlane": "Prostokątnie", + "create.​symmetry.​mirror.​triplePlane": "Ośmiokątnie", + + "create.​orientation.​orthogonal": "ortogonalnie", + "create.​orientation.​diagonal": "ukośnie", + "create.​orientation.​horizontal": "poziomo", + "create.​orientation.​alongZ": "Wzdłuż Z", + "create.​orientation.​alongX": "Wzdłuż X", + + "create.​gui.​blockzapper.​title": "Ręczny odkładacz", + "create.​gui.​blockzapper.​replaceMode": "Tryb zamiany", + "create.​gui.​blockzapper.​searchDiagonal": "Wzdłuż linii ukośnych", + "create.​gui.​blockzapper.​searchFuzzy": "Ignoruj krawędzie materiałów", + "create.​gui.​blockzapper.​range": "Rozpiętość", + "create.​gui.​blockzapper.​needsUpgradedAmplifier": "Wymaga ulepszonego wzmacniacza", + "create.​gui.​blockzapper.​patternSection": "Wzór", + "create.​gui.​blockzapper.​pattern.​solid": "Ciągły", + "create.​gui.​blockzapper.​pattern.​checkered": "Szachownica", + "create.​gui.​blockzapper.​pattern.​inversecheckered": "Odwrócona Szachownica", + "create.​gui.​blockzapper.​pattern.​chance25": "Obrót o 25%", + "create.​gui.​blockzapper.​pattern.​chance50": "Obrót o 50%", + "create.​gui.​blockzapper.​pattern.​chance75": "Obrót o 75%", + "create.​gui.​terrainzapper.​title": "Ręczny kształter", + "create.​gui.​terrainzapper.​placement": "Położenie", + "create.​gui.​terrainzapper.​placement.​merged": "Połączony", + "create.​gui.​terrainzapper.​placement.​attached": "Przyłączony", + "create.​gui.​terrainzapper.​placement.​inserted": "Wstawiony", + "create.​gui.​terrainzapper.​brush": "Pędzel", + "create.​gui.​terrainzapper.​brush.​cuboid": "Prostopadłościan", + "create.​gui.​terrainzapper.​brush.​sphere": "Kula", + "create.​gui.​terrainzapper.​brush.​cylinder": "Walec", + "create.​gui.​terrainzapper.​tool": "Narzędzie", + "create.​gui.​terrainzapper.​tool.​fill": "Wypełnianie", + "create.​gui.​terrainzapper.​tool.​place": "Stawianie", + "create.​gui.​terrainzapper.​tool.​replace": "Zamiana", + "create.​gui.​terrainzapper.​tool.​clear": "Czyszczenie", + "create.​gui.​terrainzapper.​tool.​overlay": "Pokrywanie", + "create.​gui.​terrainzapper.​tool.​flatten": "Wypłaszczanie", + + "create.​terrainzapper.​shiftRightClickToSet": "Shift+Prawe kliknięcie, aby wybrać kształt", + + "create.​blockzapper.​usingBlock": "Używając: %1$s", + "create.​blockzapper.​componentUpgrades": "Ulepszenia komponentów:", + "create.​blockzapper.​component.​body": "Ciało", + "create.​blockzapper.​component.​amplifier": "Wzmacniacz", + "create.​blockzapper.​component.​accelerator": "Akcelerator", + "create.​blockzapper.​component.​retriever": "Odbieracz", + "create.​blockzapper.​component.​scope": "Teleskop", + "create.​blockzapper.​componentTier.​none": "Brak", + "create.​blockzapper.​componentTier.​brass": "Mosiężny", + "create.​blockzapper.​componentTier.​chromatic": "Chromatyczny", + "create.​blockzapper.​leftClickToSet": "Kliknij PPM na blok, aby przypisać!", + "create.​blockzapper.​empty": "Koniec bloków!", + + "create.​minecart_coupling.​two_couplings_max": "Wagoniki nie mogą mieć więcej niż dwa łączniki każdy", + "create.​minecart_coupling.​unloaded": "Część twojego pociągu wydaje się być w niezaładowanych Chunkach.", + "create.​minecart_coupling.​no_loops": "Łączniki nie mogą tworzyć pętli", + "create.​minecart_coupling.​removed": "Usunięto z wagonika wszystkie łączniki", + "create.​minecart_coupling.​too_far": "Wagoniki są zbyt daleko od siebie", + + "create.​contraptions.​movement_mode": "Tryb poruszania", + "create.​contraptions.​movement_mode.​move_place": "Zawsze stawiaj przy zatrzymaniu", + "create.​contraptions.​movement_mode.​move_place_returned": "Stawiaj jedynie w pozycji startu", + "create.​contraptions.​movement_mode.​move_never_place": "Stawiaj jedynie, gdy kotwica jest zniszczona", + "create.​contraptions.​movement_mode.​rotate_place": "Zawsze stawiaj przy zatrzymaniu", + "create.​contraptions.​movement_mode.​rotate_place_returned": "Stawiaj jedynie blisko kąta początkowego", + "create.​contraptions.​movement_mode.​rotate_never_place": "Stawiaj jedynie, gdy kotwica jest zniszczona\n", + "create.​contraptions.​cart_movement_mode": "Tryb poruszania wagonika", + "create.​contraptions.​cart_movement_mode.​rotate": "Zawsze kieruj w stronę ruchu", + "create.​contraptions.​cart_movement_mode.​rotate_paused": "Zatrzymaj komponenty podczas obrotu", + "create.​contraptions.​cart_movement_mode.​rotation_locked": "Zablokuj obrót", + "create.​contraptions.​windmill.​rotation_direction": "Kierunek obrotu", + "create.​contraptions.​clockwork.​clock_hands": "Wskazówki zegara", + "create.​contraptions.​clockwork.​hour_first": "Najpierw wskazówka godzinowa", + "create.​contraptions.​clockwork.​minute_first": "Najpierw wskazówka minutowa", + "create.​contraptions.​clockwork.​hour_first_24": "Najpierw wskazówka 24-godzinna", + + "create.​logistics.​filter": "Filtr", + "create.​logistics.​recipe_filter": "Filtr receptur", + "create.​logistics.​fluid_filter": "Filtr płynów", + "create.​logistics.​firstFrequency": "Częst. #1", + "create.​logistics.​secondFrequency": "Częst. #2", + "create.​logistics.​filter.​apply": "Zastosowano filtr na %1$s.", + "create.​logistics.​filter.​apply_click_again": "Zastosowano filtr na %1$s; kliknij ponownie, aby skopiować ilość.", + "create.​logistics.​filter.​apply_count": "Zastosowano limit wyciągania do filtra.", + + "create.​gui.​goggles.​generator_stats": "Właściwości generatora:", + "create.​gui.​goggles.​kinetic_stats": "Właściwości kinetyczne:", + "create.​gui.​goggles.​at_current_speed": "przy obecnej prędkości", + "create.​gui.​goggles.​pole_length": "Długość przedłużenia:", + "create.​gui.​goggles.​fluid_container": "Informacje o zbiorniku:", + "create.​gui.​goggles.​fluid_container.​capacity": "Pojemność:", + "create.​gui.​assembly.​exception": "Nie udało się zmontować maszyny:", + "create.​gui.​assembly.​exception.​unmovableBlock": "Nieprzesuwalny bloki (%4$s) na [%1$s,%2$s,%3$s]", + "create.​gui.​assembly.​exception.​chunkNotLoaded": "Blok na [%1$s,%2$s,%3$s] nie był w załadowanym Chunku", + "create.​gui.​assembly.​exception.​structureTooLarge": "Zbyt dużo bloków w maszynie. Ustawione maksimum to: %1$s", + "create.​gui.​assembly.​exception.​tooManyPistonPoles": "Zbyt dużo przedłużeń tłoka. Ustawione maksimum to: %1$s", + "create.​gui.​assembly.​exception.​noPistonPoles": "Brakuje kilku przedłużeń tłoka", + "create.​gui.​assembly.​exception.​not_enough_sails": "Przyczepiona struktura nie zawiera wystarczająco żaglo-podobnych bloków: %1$s Wymagane minimum to %2$s", + "create.​gui.​gauge.​info_header": "Informacje miernika:", + "create.​gui.​speedometer.​title": "Prędkość obrotu", + "create.​gui.​stressometer.​title": "Obciążenie systemu", + "create.​gui.​stressometer.​capacity": "Pozostała pojemność", + "create.​gui.​stressometer.​overstressed": "Przeciążenie", + "create.​gui.​stressometer.​no_rotation": "Brak obrotu", + "create.​gui.​contraptions.​not_fast_enough": "Wygląda na to, że %1$s_nie_ obraca się z _wystarczającą_ _prędkością_.", + "create.​gui.​contraptions.​network_overstressed": "Wygląda na to, że ta maszyna jest _przeciążona_. Dodaj więcej źródeł lub _spowolnij_ komponenty z wysoką _wartością_ _obciążenia_.", + "create.​gui.​adjustable_crate.​title": "Regulowana skrzynka", + "create.​gui.​adjustable_crate.​storageSpace": "Pojemność", + "create.​gui.​stockpile_switch.​title": "Przełącznik zawartościowy", + "create.​gui.​stockpile_switch.​invert_signal": "Odwróć sygnał", + "create.​gui.​stockpile_switch.​move_to_lower_at": "Zmień na niższą wartość przy %1$s%%", + "create.​gui.​stockpile_switch.​move_to_upper_at": "Zmień na wyższą wartość przy %1$s%%", + "create.​gui.​sequenced_gearshift.​title": "Przekładnik sekwencjonalny", + "create.​gui.​sequenced_gearshift.​instruction": "Instrukcja", + "create.​gui.​sequenced_gearshift.​instruction.​turn_angle.​descriptive": "Obróć o kąt", + "create.​gui.​sequenced_gearshift.​instruction.​turn_angle": "Obróć", + "create.​gui.​sequenced_gearshift.​instruction.​turn_angle.​angle": "Kąt", + "create.​gui.​sequenced_gearshift.​instruction.​turn_distance.​descriptive": "Obróć, aby przesunąć tłok/krążek/przenośnik suwnicowy", + "create.​gui.​sequenced_gearshift.​instruction.​turn_distance": "Tłok", + "create.​gui.​sequenced_gearshift.​instruction.​turn_distance.​distance": "Dystans", + "create.​gui.​sequenced_gearshift.​instruction.​delay.​descriptive": "Opóźnienie czasowe", + "create.​gui.​sequenced_gearshift.​instruction.​delay": "Opóźn.", + "create.​gui.​sequenced_gearshift.​instruction.​delay.​duration": "Czas trwania", + "create.​gui.​sequenced_gearshift.​instruction.​end.​descriptive": "Koniec", + "create.​gui.​sequenced_gearshift.​instruction.​end": "Koniec", + "create.​gui.​sequenced_gearshift.​instruction.​await.​descriptive": "Czekaj na kolejny puls", + "create.​gui.​sequenced_gearshift.​instruction.​await": "Czekaj", + "create.​gui.​sequenced_gearshift.​speed": "Prędkość, kierunek", + "create.​gui.​sequenced_gearshift.​speed.​forward": "Prędkość wejściowa, do przodu", + "create.​gui.​sequenced_gearshift.​speed.​forward_fast": "Podwójna prędkość, do przodu", + "create.​gui.​sequenced_gearshift.​speed.​back": "Prędkość wejściowa, odwrotnie", + "create.​gui.​sequenced_gearshift.​speed.​back_fast": "Podwójna prędkość, odwrotnie", + + "create.​schematicAndQuill.​dimensions": "Wielkość schematu: %1$sx%2$sx%3$s", + "create.​schematicAndQuill.​firstPos": "Ustawiono pierwszą pozycję.", + "create.​schematicAndQuill.​secondPos": "Ustawiono drugą pozycję.", + "create.​schematicAndQuill.​noTarget": "Trzymaj [Ctrl], aby zaznaczyć bloki powietrza.", + "create.​schematicAndQuill.​abort": "Usunięto zaznaczenie.", + "create.​schematicAndQuill.​title": "Nazwa schematu:", + "create.​schematicAndQuill.​convert": "Zapisz i wyślij natychmiastowo", + "create.​schematicAndQuill.​fallbackName": "Nowy schemat", + "create.​schematicAndQuill.​saved": "Zapisano jako %1$s", + + "create.​schematic.​invalid": "[!] Nieprawidłowy przedmiot - użyj stołu do planowania", + "create.​schematic.​position": "Pozycja", + "create.​schematic.​rotation": "Obrót", + "create.​schematic.​rotation.​none": "Brak", + "create.​schematic.​rotation.​cw90": "Zgodnie z zegarem 90", + "create.​schematic.​rotation.​cw180": "Zgodnie z zegarem 180", + "create.​schematic.​rotation.​cw270": "Zgodnie z zegarem 270", + "create.​schematic.​mirror": "Odbij", + "create.​schematic.​mirror.​none": "Brak", + "create.​schematic.​mirror.​frontBack": "Przód-tył", + "create.​schematic.​mirror.​leftRight": "Prawo-lewo", + "create.​schematic.​tool.​deploy": "Pozycja", + "create.​schematic.​tool.​move": "Przesuń XZ", + "create.​schematic.​tool.​movey": "Przesuń Y", + "create.​schematic.​tool.​rotate": "Obróć", + "create.​schematic.​tool.​print": "Drukuj", + "create.​schematic.​tool.​flip": "Odbij", + "create.​schematic.​tool.​deploy.​description.​0": "Przesuwa strukturę na pozycję.", + "create.​schematic.​tool.​deploy.​description.​1": "Kliknij PPM na ziemię, aby postawić.", + "create.​schematic.​tool.​deploy.​description.​2": "Trzymaj [Ctrl], aby zaznaczyć w określonej odległości.", + "create.​schematic.​tool.​deploy.​description.​3": "[Ctrl]+Przewijanie, aby zmienić dystans", + "create.​schematic.​tool.​move.​description.​0": "Przesuwa schemat poziomo.", + "create.​schematic.​tool.​move.​description.​1": "Wskaż na schemat i [Ctrl]+Przewijaj, aby popchnąć.", + "create.​schematic.​tool.​move.​description.​2": "", + "create.​schematic.​tool.​move.​description.​3": "", + "create.​schematic.​tool.​movey.​description.​0": "Przesuwa schemat pionowo.", + "create.​schematic.​tool.​movey.​description.​1": "[Ctrl]+Przewijanie, aby przesunąć w górę/dół.", + "create.​schematic.​tool.​movey.​description.​2": "", + "create.​schematic.​tool.​movey.​description.​3": "", + "create.​schematic.​tool.​rotate.​description.​0": "Obraca schemat wokół jego środka.", + "create.​schematic.​tool.​rotate.​description.​1": "[Ctrl]+Przewijanie, aby obrócić o 90 stopni.", + "create.​schematic.​tool.​rotate.​description.​2": "", + "create.​schematic.​tool.​rotate.​description.​3": "", + "create.​schematic.​tool.​print.​description.​0": "Natychmiastowo stawia strukturę w świecie.", + "create.​schematic.​tool.​print.​description.​1": "Kliknij PPM, aby potwierdzić ustawienie w obecnej pozycji.", + "create.​schematic.​tool.​print.​description.​2": "Ta funkcja jest tylko dla trybu kreatywnego.", + "create.​schematic.​tool.​print.​description.​3": "", + "create.​schematic.​tool.​flip.​description.​0": "Odbija schemat w stronę, w jakiej wskazałeś.", + "create.​schematic.​tool.​flip.​description.​1": "Wskaż na schemat [Ctrl]+Przewijaj, aby odbić", + "create.​schematic.​tool.​flip.​description.​2": "", + "create.​schematic.​tool.​flip.​description.​3": "", + + "create.​schematics.​synchronizing": "Synchronizacja...", + "create.​schematics.​uploadTooLarge": "Twój schemat przekracza limity ustanowione przez serwer.", + "create.​schematics.​maxAllowedSize": "Maksymalna wielkość schematu to:", + + "create.​gui.​schematicTable.​refresh": "Odśwież pliki", + "create.​gui.​schematicTable.​open_folder": "Otwórz folder", + "create.​gui.​schematicTable.​title": "Stół do planowania", + "create.​gui.​schematicTable.​availableSchematics": "Dostępne schematy", + "create.​gui.​schematicTable.​noSchematics": "Brak zapisanych schematów", + "create.​gui.​schematicTable.​uploading": "Wysyłanie...", + "create.​gui.​schematicTable.​finished": "Wysyłanie zakończone!", + "create.​gui.​schematicannon.​title": "Schematoarmata", + "create.​gui.​schematicannon.​listPrinter": "Drukowanie listy", + "create.​gui.​schematicannon.​gunpowderLevel": "Ilość prochu: %1$s%%", + "create.​gui.​schematicannon.​shotsRemaining": "Pozostałe wystrzały: %1$s", + "create.​gui.​schematicannon.​shotsRemainingWithBackup": "Wliczając zapas: %1$s", + "create.​gui.​schematicannon.​optionEnabled": "Obecnie włączone", + "create.​gui.​schematicannon.​optionDisabled": "Obecnie wyłączone\n", + "create.​gui.​schematicannon.​showOptions": "Pokaż ustawienia drukowania", + "create.​gui.​schematicannon.​option.​dontReplaceSolid": "Nie zastępuj stałych bloków", + "create.​gui.​schematicannon.​option.​replaceWithSolid": "Zastępuj stałe stałymi", + "create.​gui.​schematicannon.​option.​replaceWithAny": "Zastępuj stałe dowolnymi", + "create.​gui.​schematicannon.​option.​replaceWithEmpty": "Zastępuj stałe pustymi", + "create.​gui.​schematicannon.​option.​skipMissing": "Pomijaj brakujące bloki", + "create.​gui.​schematicannon.​option.​skipTileEntities": "Chroń byty bloków", + "create.​gui.​schematicannon.​slot.​gunpowder": "Dodaj prochu, aby załadować armatę", + "create.​gui.​schematicannon.​slot.​listPrinter": "Daj tu książki, aby wydrukować listę", + "create.​gui.​schematicannon.​slot.​schematic": "Daj tu swój schemat. Upewnij się, że jest postawiony w odpowiednim miejscu.", + "create.​gui.​schematicannon.​option.​skipMissing.​description": "Jeśli armata nie znajdzie wymaganego bloku, przejdzie w następne miejsce", + "create.​gui.​schematicannon.​option.​skipTileEntities.​description": "Armata będzie unikać zastępowania bloków przechowujących dane, takich jak skrzynie.", + "create.​gui.​schematicannon.​option.​dontReplaceSolid.​description": "Armata nigdy nie będzie zastępować jakichkolwiek stałych bloków, jedynie nie-stałe i powietrze.", + "create.​gui.​schematicannon.​option.​replaceWithSolid.​description": "Armata będzie zastępować stałe bloki jedynie, jeśli schemat zawiera stały blok w tym miejscu.", + "create.​gui.​schematicannon.​option.​replaceWithAny.​description": "Armata będzie zastępować stałe bloki jedynie, jeśli schemat zawiera dowolny blok w tym miejscu.", + "create.​gui.​schematicannon.​option.​replaceWithEmpty.​description": "Armata usunie wszystkie bloki, wliczając te zastępowane przez powietrze.", + + "create.​schematicannon.​status.​idle": "Niepracująca", + "create.​schematicannon.​status.​ready": "Gotowa", + "create.​schematicannon.​status.​running": "Działająca", + "create.​schematicannon.​status.​finished": "Ukończone", + "create.​schematicannon.​status.​paused": "Wstrzymana", + "create.​schematicannon.​status.​stopped": "Zatrzymana", + "create.​schematicannon.​status.​noGunpowder": "Koniec prochu", + "create.​schematicannon.​status.​targetNotLoaded": "Cel nie jest załadowany", + "create.​schematicannon.​status.​targetOutsideRange": "Cel jest za daleko", + "create.​schematicannon.​status.​searching": "Szukanie", + "create.​schematicannon.​status.​skipping": "Pomijanie", + "create.​schematicannon.​status.​missingBlock": "Brakujący przedmiot:", + "create.​schematicannon.​status.​placing": "Stawianie", + "create.​schematicannon.​status.​clearing": "Usuwanie bloków", + "create.​schematicannon.​status.​schematicInvalid": "Nieprawidłowy schemat", + "create.​schematicannon.​status.​schematicNotPlaced": "Schemat nieustawiony", + "create.​schematicannon.​status.​schematicExpired": "Schemat wygasł", + + "create.​materialChecklist": "Lista materiałów", + "create.​materialChecklist.​blocksNotLoaded": "* Zastrzeżenie *\\n\\n Lista materiałów może być  niedokładna, bo znaczące Chunki nie są załadowane.", + + "create.​gui.​filter.​deny_list": "Lista zabroniona", + "create.​gui.​filter.​deny_list.​description": "Przedmioty są przepuszczane, jeśli NIE pasują do żadnego z powyższych. Pusta lista przepuszcza wszystko.", + "create.​gui.​filter.​allow_list": "Lista dozwolona", + "create.​gui.​filter.​allow_list.​description": "Przedmioty są przepuszczane, jeśli pasują do któregoś z powyższych. Pusta lista odrzuca wszystko", + "create.​gui.​filter.​respect_data": "Bierz dane pod uwagę", + "create.​gui.​filter.​respect_data.​description": "Przedmioty pasują jedynie, jeśli ich wytrzymałość, zaklęcia i inne właściwości również pasują.", + "create.​gui.​filter.​ignore_data": "Ignoruj dane", + "create.​gui.​filter.​ignore_data.​description": "Przedmioty pasują  pomimo ich właściwości.", + + "create.​item_attributes.​placeable": "jest stawialny", + "create.​item_attributes.​placeable.​inverted": "nie jest stawialny", + "create.​item_attributes.​consumable": "jadalny", + "create.​item_attributes.​consumable.​inverted": "niejadalny", + "create.​item_attributes.​smeltable": "może zostać przepalony", + "create.​item_attributes.​smeltable.​inverted": "nie może zostać przepalony", + "create.​item_attributes.​washable": "może zostać opłukany", + "create.​item_attributes.​washable.​inverted": "nie może zostać opłukany", + "create.​item_attributes.​smokable": "może być wędzony", + "create.​item_attributes.​smokable.​inverted": "nie może być wędzony", + "create.​item_attributes.​crushable": "może być rozkruszony", + "create.​item_attributes.​crushable.​inverted": "nie może być rozkruszony", + "create.​item_attributes.​blastable": "może być stopiony w piecu hutniczym", + "create.​item_attributes.​blastable.​inverted": "nie może być stopiony w piecu hutniczym", + "create.​item_attributes.​enchanted": "jest zaklęty", + "create.​item_attributes.​enchanted.​inverted": "nie jest zaklęty", + "create.​item_attributes.​damaged": "jest uszkodzony", + "create.​item_attributes.​damaged.​inverted": "nie jest uszkodzony", + "create.​item_attributes.​badly_damaged": "jest silnie uszkodzony", + "create.​item_attributes.​badly_damaged.​inverted": "nie jest silnie uszkodzony", + "create.​item_attributes.​not_stackable": "nie może być grupowany", + "create.​item_attributes.​not_stackable.​inverted": "może być grupowany", + "create.​item_attributes.​equipable": "może zostać założony", + "create.​item_attributes.​equipable.​inverted": "nie może zostać założony", + "create.​item_attributes.​furnace_fuel": "jest paliwem dla pieca", + "create.​item_attributes.​furnace_fuel.​inverted": "nie jest paliwem dla pieca", + "create.​item_attributes.​in_tag": "posiada znacznik %1$s", + "create.​item_attributes.​in_tag.​inverted": "nie posiada znacznika %1$s", + "create.​item_attributes.​in_item_group": "jest w grupie \"%1$s\"", + "create.​item_attributes.​in_item_group.​inverted": "nie jest w grupie \"%1$s\"", + "create.​item_attributes.​added_by": "dodany przez %1$s", + "create.​item_attributes.​added_by.​inverted": "niedodany przez %1$s", + "create.​item_attributes.​has_enchant": "posiada zaklęcie %1$s", + "create.​item_attributes.​has_enchant.​inverted": "nie posiada zaklęcia %1$s", + "create.​item_attributes.​color": "jest zafarbowane, kolor %1$s", + "create.​item_attributes.​color.​inverted": "nie jest zafarbowane, kolor %1$s", + "create.​item_attributes.​max_enchanted": "jest zaklęte na maksymalny poziom", + "create.​item_attributes.​max_enchanted.​inverted": "nie jest zaklęte na maksymalny poziom", + "create.​item_attributes.​has_fluid": "zawiera %1$s", + "create.​item_attributes.​has_fluid.​inverted": "nie zawiera %1$s", + "create.​item_attributes.​has_name": "posiada nazwę %1$s", + "create.​item_attributes.​has_name.​inverted": "nie posiada nazwy %1$s", + "create.​item_attributes.​book_author": "autorem jest %1$s", + "create.​item_attributes.​book_author.​inverted": "autorem nie jest %1$s", + "create.​item_attributes.​book_copy_original": "jest oryginałem", + "create.​item_attributes.​book_copy_original.​inverted": "nie jest oryginałem", + "create.​item_attributes.​book_copy_first": "jest kopią oryginału", + "create.​item_attributes.​book_copy_first.​inverted": "nie jest kopią oryginału", + "create.​item_attributes.​book_copy_second": "jest kopią kopii", + "create.​item_attributes.​book_copy_second.​inverted": "nie jest kopią kopii", + "create.​item_attributes.​book_copy_tattered": "jest postrzępiona", + "create.​item_attributes.​book_copy_tattered.​inverted": "nie jest postrzępiona", + "create.​item_attributes.​astralsorcery_crystal": "posiada właściwości kryształu %1$s", + "create.​item_attributes.​astralsorcery_crystal.​inverted": "nie posiada właściwości kryształu %1$s", + "create.​item_attributes.​astralsorcery_constellation": "jest dopasowany do %1$s", + "create.​item_attributes.​astralsorcery_constellation.​inverted": "nie jest dopasowany do %1$s", + "create.​item_attributes.​astralsorcery_perk_gem": "posiada dodatkową właściwość %1$s", + "create.​item_attributes.​astralsorcery_perk_gem.​inverted": "nie posiada dodatkowej właściwości %1$s", + "create.​item_attributes.​astralsorcery_amulet": "ulepsza %1$s", + "create.​item_attributes.​astralsorcery_amulet.​inverted": "nie ulepsza %1$s", + + "create.​gui.​attribute_filter.​no_selected_attributes": "Brak wybranych właściwości", + "create.​gui.​attribute_filter.​selected_attributes": "Wybrane właściwości:", + "create.​gui.​attribute_filter.​add_attribute": "Dodaj właściwość do listy ", + "create.​gui.​attribute_filter.​add_inverted_attribute": "Dodaj przeciwną właściwość do listy", + "create.​gui.​attribute_filter.​allow_list_disjunctive": "Lista dozwolona (dowolny)", + "create.​gui.​attribute_filter.​allow_list_disjunctive.​description": "Przedmioty są przepuszczane jedynie, jeśli posiada dowolny z wybranych właściwości.", + "create.​gui.​attribute_filter.​allow_list_conjunctive": "Lista dozwolona (wszystkie)", + "create.​gui.​attribute_filter.​allow_list_conjunctive.​description": "Przedmioty są przepuszczane jedynie, jeśli posiada WSZYSTKIE z wybranych właściwości.", + "create.​gui.​attribute_filter.​deny_list": "Lista zabroniona", + "create.​gui.​attribute_filter.​deny_list.​description": "Przedmioty są przepuszczane jedynie, jeśli nie posiadają ŻADNEGO z wybranych właściwości.", + "create.​gui.​attribute_filter.​add_reference_item": "Dodaj przedmiot źródłowy", + + "create.​tooltip.​holdForDescription": "Przytrzymaj [%1$s], aby zobaczyć podsumowanie", + "create.​tooltip.​holdForControls": "Przytrzymaj [%1$s], aby zobaczyć sterowanie", + "create.​tooltip.​keyShift": "Shift", + "create.​tooltip.​keyCtrl": "Ctrl", + "create.​tooltip.​speedRequirement": "Wymagana prędkość: %1$s", + "create.​tooltip.​speedRequirement.​none": "Brak", + "create.​tooltip.​speedRequirement.​medium": "Umiarkowana", + "create.​tooltip.​speedRequirement.​high": "Wysoka", + "create.​tooltip.​stressImpact": "Wpływ na obciążenie: %1$s", + "create.​tooltip.​stressImpact.​low": "Niski", + "create.​tooltip.​stressImpact.​medium": "Umiarkowany\n", + "create.​tooltip.​stressImpact.​high": "Wysoki", + "create.​tooltip.​stressImpact.​overstressed": "Przeciążenie", + "create.​tooltip.​capacityProvided": "Odporność na obciążenie: %1$s", + "create.​tooltip.​capacityProvided.​low": "Niska", + "create.​tooltip.​capacityProvided.​medium": "Średnia", + "create.​tooltip.​capacityProvided.​high": "Wysoka", + "create.​tooltip.​generationSpeed": "Wytwarza %1$s %2$s", + "create.​tooltip.​analogStrength": "Siła analogowa: %1$s/15", + + "create.​mechanical_arm.​extract_from": "Wyciągaj przedmioty z %1$s", + "create.​mechanical_arm.​deposit_to": "Wkładaj przedmioty do %1$s", + "create.​mechanical_arm.​summary": "Mechaniczne ramię ma %1$s wejść i %2$s wyjść.", + "create.​mechanical_arm.​points_outside_range": "Usunięto %1$s wybranych punktów interakcji z powodu limitów zasięgu", + + "create.​weighted_ejector.​target_set": "Wybrano cel", + "create.​weighted_ejector.​target_not_valid": "Wyrzuca do  przylegających bloków (cel był nieprawidłowy)", + "create.​weighted_ejector.​no_target": "Wyrzuca do  przylegających bloków (nie wybrano celu)", + "create.​weighted_ejector.​targeting": "Wyrzuca do [%1$s,%2$s,%3$s]", + "create.​weighted_ejector.​stack_size": "Wielkość wyrzucanego stosu", + + "create.​logistics.​when_multiple_outputs_available": "Kiedy wybrano wiele wyjść", + + "create.​mechanical_arm.​selection_mode.​round_robin": "Dookoła", + "create.​mechanical_arm.​selection_mode.​forced_round_robin": "Dookoła (wymuszone)", + "create.​mechanical_arm.​selection_mode.​prefer_first": "Preferuj pierwszy cel", + + "create.​tunnel.​selection_mode.​split": "Podziel", + "create.​tunnel.​selection_mode.​forced_split": "Wymuś podział", + "create.​tunnel.​selection_mode.​round_robin": "Dookoła", + "create.​tunnel.​selection_mode.​forced_round_robin": "Dookoła (wymuszone)", + "create.​tunnel.​selection_mode.​prefer_nearest": "Preferuj najbliższe", + "create.​tunnel.​selection_mode.​randomize": "Losowo", + "create.​tunnel.​selection_mode.​synchronize": "Synchronizuj wejścia", + + "create.​tooltip.​chute.​header": "Informacja o zsypie", + "create.​tooltip.​chute.​items_move_down": "Przedmioty w dół", + "create.​tooltip.​chute.​items_move_up": "Przedmioty w górę", + "create.​tooltip.​chute.​no_fans_attached": "Brak przyłączonych wiatraków", + "create.​tooltip.​chute.​fans_push_up": "Wiatraki pchają od dołu", + "create.​tooltip.​chute.​fans_push_down": "Wiatraki pchają od góry", + "create.​tooltip.​chute.​fans_pull_up": "Wiatraki ciągną od góry", + "create.​tooltip.​chute.​fans_pull_down": "Wiatraki ciągną od dołu", + "create.​tooltip.​chute.​contains": "Zawiera: %1$s x%2$s", + + "create.​hint.​hose_pulley.​title": "Niewyczerpany zapas", + "create.​hint.​hose_pulley": "Wybrane zbiornik cieczy jest uznany za nieskończony", + "create.​hint.​mechanical_arm_no_targets.​title": "Brak celi", + "create.​hint.​mechanical_arm_no_targets": "Wygląda na to, że żadne _cele_ nie zostały przypisane do tego _mechanicznego_ _ramienia_. Wybierz taśmociągi, składnice, lejki i inne bloki _klikając_ na nie _PPM_, trzymając w _ręce_ _mechaniczne_ _ramię_", + "create.​hint.​empty_bearing.​title": "Aktualizuj łożysko", + "create.​hint.​empty_bearing": "_Kliknij_ na łożysko _PPM_ pustą ręką, aby _przyczepić_ do niego strukturę zbudowaną z przodu.", + "create.​hint.​full_deployer.​title": "Nadmiar przedmiotów w aplikatorze", + "create.​hint.​full_deployer": "Wygląda na to, że ten _aplikator_ zawiera _nadmiar_ _przedmiotów_, które muszą zostać _wyciągnięte_. Użyj _leji_, _lejków_ lub innych sposobów, aby uwolnić od przepełnienia.", + + "create.​gui.​config.​overlay1": "Cześć :)", + "create.​gui.​config.​overlay2": "To jest przykładowa nakładka", + "create.​gui.​config.​overlay3": "Kliknij lub przeciągnij myszką", + "create.​gui.​config.​overlay4": "aby przesunąć ten podgląd", + "create.​gui.​config.​overlay5": "Naciśnij ESC, aby opuścić ten ekran", + "create.​gui.​config.​overlay6": "i zapisać nową pozycję", + "create.​gui.​config.​overlay7": "Uruchom \"/create overlay reset\"", + "create.​gui.​config.​overlay8": "aby zresetować pozycję", + + "create.​command.​killTPSCommand": "killtps", + "create.​command.​killTPSCommand.​status.​slowed_by.​0": "[Create]: Obecne opóźnienie serwera to %s ms :o", + "create.​command.​killTPSCommand.​status.​slowed_by.​1": "[Create]: Serwer jest teraz opóźniony o %s >:)", + "create.​command.​killTPSCommand.​status.​slowed_by.​2": "[Create]: Serwer wrócił do standardowej prędkości :D", + "create.​command.​killTPSCommand.​status.​usage.​0": "[Create]: Użyj \"/killtps stop\", aby przywrócić serwer do standardowej prędkości", + "create.​command.​killTPSCommand.​status.​usage.​1": "[Create]: Użyj \"/killtps start\", aby sztucznie spowolnić serwer\n", + "create.​command.​killTPSCommand.​argument.​tickTime": "tickTime", + + "create.​subtitle.​schematicannon_launch_block": "Schematoarmata strzela", + "create.​subtitle.​schematicannon_finish": "Schematoarmata skończyła", + "create.​subtitle.​slime_added": "Szlam plaska", + "create.​subtitle.​mechanical_press_activation": "Mechaniczna prasa się uruchamia", + "create.​subtitle.​mechanical_press_item_break": "Metal brzęczy", + "create.​subtitle.​blockzapper_place": "Bloki lecą na miejsce", + "create.​subtitle.​blockzapper_confirm": "Potwierdzający sygnał", + "create.​subtitle.​blockzapper_deny": "Odrzucający sygnał", + "create.​subtitle.​block_funnel_eat": "Lejek zjada", + "create.​subtitle.​blaze_munch": "Płomyk szczęśliwie przeżuwa", + + + "_": "->------------------------] Opisy Przedmiotów [------------------------<-", + + "item.​create.​example_item.​tooltip": "PRZYKŁADOWY PRZEDMIOT (jedynie znacznik, że ten dymek istnieje)", + "item.​create.​example_item.​tooltip.​summary": "Krótki opis przedmiotu. _Podkreślenia_, ha, podkreślają termin.", + "item.​create.​example_item.​tooltip.​condition1": "Kiedy to", + "item.​create.​example_item.​tooltip.​behaviour1": "Wtedy ten przedmiot to robi (zachowania pokazują się przy Shifcie)", + "item.​create.​example_item.​tooltip.​condition2": "A kiedy to", + "item.​create.​example_item.​tooltip.​behaviour2": "Możesz dodać tak wiele zachowań jak chcesz", + "item.​create.​example_item.​tooltip.​control1": "Kiedy przyciśnięto Ctrl", + "item.​create.​example_item.​tooltip.​action1": "Wyświetla się sterowanie.", + + "block.​create.​wooden_bracket.​tooltip": "DREWNIANY WSPORNIK", + "block.​create.​wooden_bracket.​tooltip.​summary": "_Udekoruj_ swoje _wały_, _koła zębate_ i _rury_ drewnianą i przytulną podporą.", + + "block.​create.​metal_bracket.​tooltip": "METALOWY WSPORNIK", + "block.​create.​metal_bracket.​tooltip.​summary": "_Udekoruj_ swoje _wały_, _koła zębate_ i _rury_ wytrzymałą, przemysłową podporą.", + + "block.​create.​copper_casing.​tooltip": "MIEDZIANA OBUDOWA", + "block.​create.​copper_casing.​tooltip.​summary": "Solidna obudowa dla maszyn, z wieloma zastosowaniami. Przydatna w dekoracji.", + "block.​create.​copper_casing.​tooltip.​condition1": "Kiedy użyta na rurze", + "block.​create.​copper_casing.​tooltip.​behaviour1": "_Przykrywa_ rurę _miedzianą obudową_.  Połączenia izolowanych rur zostaną _unieruchomione_ i nie będą reagować na zmiany w ich otoczeniu.", + + "block.​create.​encased_fluid_pipe.​tooltip": "IZOLOWANA RURA", + "block.​create.​encased_fluid_pipe.​tooltip.​summary": "Rura _przykryta_ miedzianą obudową.", + + "block.​create.​seat.​tooltip": "SIEDZENIE", + "block.​create.​seat.​tooltip.​summary": "Usiądź i ciesz się jazdą! Przyczepi gracza do _ruchomej maszyny_.  Również świetne do tworzenia stojących mebli! Dostępne w wielu kolorach.", + "block.​create.​seat.​tooltip.​condition1": "Kliknięcie PPM na siedzenie", + "block.​create.​seat.​tooltip.​behaviour1": "Sadza gracza na _siedzeniu_. Naciśnij lewy Shift, aby opuścić _siedzenie_.", + + "item.​create.​blaze_cake.​tooltip": "PŁOMIENNE CIASTO", + "item.​create.​blaze_cake.​tooltip.​summary": "Pyszna przekąska dla Twoich cięzko pracujących _płomiennych palników_. Rozpala je wszystkie!", + + "block.​create.​fluid_pipe.​tooltip": "RURA", + "block.​create.​fluid_pipe.​tooltip.​summary": "Używana do transportu _płynów_. _Mechaniczna pompa_ jest potrzebna, aby wprawić płyny w ruch.", + "block.​create.​fluid_pipe.​tooltip.​condition1": "Transport płynów", + "block.​create.​fluid_pipe.​tooltip.​behaviour1": "Może połączyć się ze pojemnikami, takimi jak _tygle_ czy _zbiorniki_. Odsłonięte zakończenia rur mogą osuszać lub wypełniać płynami. Uważaj na przecieki!", + "block.​create.​fluid_pipe.​tooltip.​condition2": "Kliknięcie PPM z użyciem klucza", + "block.​create.​fluid_pipe.​tooltip.​behaviour2": "Tworzy w rurze _okno_, jeśli jest to możliwe.", + + "block.​create.​hose_pulley.​tooltip": "KRĄŻEK Z WĘŻEM", + "block.​create.​hose_pulley.​tooltip.​summary": "Używane do _osuszania_ lub _wypełniania_ płynami.", + "block.​create.​hose_pulley.​tooltip.​condition1": "Kiedy zasilone siłą obrotową", + "block.​create.​hose_pulley.​tooltip.​behaviour1": "_Podnosi_ lub _opuszcza_ wąż; pozycja węża określa, do jakiej _wysokości_ będzie on działał.", + "block.​create.​hose_pulley.​tooltip.​condition2": "Kiedy płyny wyciągane są z węża", + "block.​create.​hose_pulley.​tooltip.​behaviour2": "Rozpoczyna _osuszanie_ bloków ze zbiornika, do którego opuszczono wąż. Bardzo duże zbiorniki będą uznawane za _nieskończone_.", + "block.​create.​hose_pulley.​tooltip.​condition3": "Kiedy płyny pompowane są do węża\n", + "block.​create.​hose_pulley.​tooltip.​behaviour3": "Rozpoczyna _wypełnianie_ bloków płynem, aż do wysokości węża.", + + "block.​create.​fluid_tank.​tooltip": "ZBIORNIK", + "block.​create.​fluid_tank.​tooltip.​summary": "_Składuje_ wszystkie Twoje ulubione _płyny_. Zmienia rozmiar wraz z wysokością i szerokością.", + "block.​create.​fluid_tank.​tooltip.​condition1": "Kliknięcie PPM kluczem", + "block.​create.​fluid_tank.​tooltip.​behaviour1": "Tworzy w zbiorniku _okno_, jeśli jest to możliwe.", + + "block.​create.​creative_fluid_tank.​tooltip": "KREATYWNY ZBIORNIK", + "block.​create.​creative_fluid_tank.​tooltip.​summary": "Ten _zbiornik_ pozwala na nieskończone powielanie każdego płynu. Zmienia rozmiar wraz z wysokością i szerokością.", + "block.​create.​creative_fluid_tank.​tooltip.​condition1": "Kiedy w zbiorniku", + "block.​create.​creative_fluid_tank.​tooltip.​behaviour1": "Wszystko, co _wyciąga_ z tego zbiornika będzie dostarczać _nieskończoną ilość_ wybranego płynu. Płyny wpompowane do tego zbiornika będą niszczone.", + "block.​create.​creative_fluid_tank.​tooltip.​condition2": "Kliknięcie PPM kluczem", + "block.​create.​creative_fluid_tank.​tooltip.​behaviour2": "Tworzy w zbiorniku _okno_, jeśli jest to możliwe.", + + "block.​create.​fluid_valve.​tooltip": "ZAWÓR", + "block.​create.​fluid_valve.​tooltip.​summary": "Zatrzymuje przepływ płynu przez rurę", + "block.​create.​fluid_valve.​tooltip.​condition1": "Kontrola nad przepływem", + "block.​create.​fluid_valve.​tooltip.​behaviour1": "Zastosowanie _siły obrotu_ zamknie _zawór_, zatrzymując przepływ płynu. Odwróć kierunek siły obrotu, aby _otworzyć_ zawór.", + + "block.​create.​mechanical_pump.​tooltip": "MECHANICZNA POMPA", + "block.​create.​mechanical_pump.​tooltip.​summary": "Pobiera _siłę obrotu_ i używa jej, aby pompować płyn przez _rurę_. Posiada maksymalny zasięg w obie strony. (domyślnie 16 bloków)", + "block.​create.​mechanical_pump.​tooltip.​condition1": "Przepływ", + "block.​create.​mechanical_pump.​tooltip.​behaviour1": "Zastosowanie _siły obrotu_ wytwarza ciśnienie, które przepycha _płyn_ przez system _rur_. Odwróć kierunek siły obrotu, aby odwrócić kierunek przepływu.", + "block.​create.​mechanical_pump.​tooltip.​control1": "Kliknięcie PPM kluczem", + "block.​create.​mechanical_pump.​tooltip.​action1": "Odwraca kierunek _pompowania_.", + + "block.​create.​smart_fluid_pipe.​tooltip": "INTELIGENTA RURA", + "block.​create.​smart_fluid_pipe.​tooltip.​summary": "Rura z _filtrem_. Może wybrać, jakie płyny mogą zostać przepuszczone.", + "block.​create.​smart_fluid_pipe.​tooltip.​condition1": "Kiedy płyny są wepchnięte", + "block.​create.​smart_fluid_pipe.​tooltip.​behaviour1": "Inteligentne rury otrzymujące płyn, który nie pasuje do filtra, zablokują przepływ.", + "block.​create.​smart_fluid_pipe.​tooltip.​condition2": "Kiedy przylegający do zbiornika", + "block.​create.​smart_fluid_pipe.​tooltip.​behaviour2": "Inteligentne rury _rozpoczynające_ przepływ z dowolnego zbiornika będą wyciągać jedynie te płyny, które _pasują_ do _filtra_.", + + "block.​create.​spout.​tooltip": "KANISTER", + "block.​create.​spout.​tooltip.​summary": "Przydatny do _napełniania_ płynami.", + "block.​create.​spout.​tooltip.​condition1": "Transport płynów", + "block.​create.​spout.​tooltip.​behaviour1": "Kiedy _pojemnik_, taki jak _wiaderko_ lub _butelka_ jest położona pod spodem, kanister spróbuje napełnić go przechowywanym wewnątrz _płynem_.", + "block.​create.​spout.​tooltip.​condition2": "Automatyzacja płynów", + "block.​create.​spout.​tooltip.​behaviour2": "Kanister postawiony nad _taśmociągiem_ lub _składnicą_ automatycznie zareaguje na _pojemniki_ przechodzące pod spodem.", + + "block.​create.​item_drain.​tooltip": "ODPŁYW", + "block.​create.​item_drain.​tooltip.​summary": "Metalowa kratka do opróżniania _pojemników_ z _płynami_.", + "block.​create.​item_drain.​tooltip.​condition1": "Transport płynów", + "block.​create.​item_drain.​tooltip.​behaviour1": "Kiedy _pojemnik_, taki jak _wiaderko_ lub _butelka_ jest wsadzony od boku, odpływ spróbuje opróżnić go do własnego zbiornika. Przedmiot będzie następnie wyrzucony drugą stroną.", + + "item.​create.​wand_of_symmetry.​tooltip": "RÓŻDŻKA SYMETRII", + "item.​create.​wand_of_symmetry.​tooltip.​summary": "Idealnie odbija lustrzanie bloki wzdłuż wybranych płaszczyzn.", + "item.​create.​wand_of_symmetry.​tooltip.​condition1": "Kiedy w pasku szybkiego wyboru", + "item.​create.​wand_of_symmetry.​tooltip.​behaviour1": "Pozostaje aktywna", + "item.​create.​wand_of_symmetry.​tooltip.​control1": "Kliknięcie PPM na ziemię", + "item.​create.​wand_of_symmetry.​tooltip.​action1": "_Tworzy_ lub _przenosi_ lustro", + "item.​create.​wand_of_symmetry.​tooltip.​control2": "Kliknięcie PPM w powietrzu", + "item.​create.​wand_of_symmetry.​tooltip.​action2": "_Usuwa_ aktywne lustro", + "item.​create.​wand_of_symmetry.​tooltip.​control3": "Kliknięcie PPM w czasie skradania", + "item.​create.​wand_of_symmetry.​tooltip.​action3": "Otwiera _ustawienia_.", + + "item.​create.​handheld_blockzapper.​tooltip": "RĘCZNY ODKŁADACZ", + "item.​create.​handheld_blockzapper.​tooltip.​summary": "Nowatorski gadżet umożliwiający stawianie lub zamianę bloków na odległość.", + "item.​create.​handheld_blockzapper.​tooltip.​control1": "Kliknięcie LPM na blok", + "item.​create.​handheld_blockzapper.​tooltip.​action1": "Przypisuje do narzędzia wybrany blok.", + "item.​create.​handheld_blockzapper.​tooltip.​control2": "Kliknięcie PPM na blok", + "item.​create.​handheld_blockzapper.​tooltip.​action2": "_Stawia_ lub _zamienia_ docelowy blok.", + "item.​create.​handheld_blockzapper.​tooltip.​control3": "Kliknięcie PPM w czasie skradania\n", + "item.​create.​handheld_blockzapper.​tooltip.​action3": "Otwiera _ustawienia_.", + + "item.​create.​handheld_worldshaper.​tooltip": "RĘCZNY KSZTAŁTOWACZ", + "item.​create.​handheld_worldshaper.​tooltip.​summary": "Poręczne narzędzie do tworzenia _krajobrazów_ i _cech terenu_.", + "item.​create.​handheld_worldshaper.​tooltip.​control1": "Kliknięcie LPM na blok", + "item.​create.​handheld_worldshaper.​tooltip.​action1": "Przypisuje do narzędzia wybrany blok.", + "item.​create.​handheld_worldshaper.​tooltip.​control2": "Kliknięcie PPM na blok", + "item.​create.​handheld_worldshaper.​tooltip.​action2": "Stosuje obecnie wybrany _pędzel_ i _narzędzie_ w docelowej lokalizacji.", + "item.​create.​handheld_worldshaper.​tooltip.​control3": "Kliknięcie PPM w czasie skradania", + "item.​create.​handheld_worldshaper.​tooltip.​action3": "Otwiera _ustawienia_.", + + "item.​create.​tree_fertilizer.​tooltip": "NAWÓZ DO DRZEW", + "item.​create.​tree_fertilizer.​tooltip.​summary": "Silna kombinacja minerałów odpowiednich do nawożenia pospolitych gatunków drzew", + "item.​create.​tree_fertilizer.​tooltip.​condition1": "Kiedy użyto na sadzonce", + "item.​create.​tree_fertilizer.​tooltip.​behaviour1": "Przyspiesza wzrost drzew, _pomimo dostępnej przestrzeni_.", + + "item.​create.​deforester.​tooltip": "WYLESIACZ", + "item.​create.​deforester.​tooltip.​summary": "_Radioaktywna siekiera_ pozwalająca na ścinanie drzew w ułamku sekundy.", + + "item.​create.​extendo_grip.​tooltip": "WYDŁUŻONY CHWYTAK", + "item.​create.​extendo_grip.​tooltip.​summary": "Mocno _wydłuża zasięg_ rąk posiadacza.", + "item.​create.​extendo_grip.​tooltip.​condition1": "Kiedy w drugiej ręce", + "item.​create.​extendo_grip.​tooltip.​behaviour1": "_Wydłuża zasięg_ głównej ręki.", + + "item.​create.​filter.​tooltip": "FILTR", + "item.​create.​filter.​tooltip.​summary": "_Kontroluje_ wejścia i wyjścia urządzeń logistycznych z _większą precyzją_, przypasowując przedmioty do listy przedmiotów zawartej w filtrze lub wielu filtrach schowanych jeden w drugi.", + "item.​create.​filter.​tooltip.​condition1": "Kiedy w slocie na filtr", + "item.​create.​filter.​tooltip.​behaviour1": "_Kontroluje_ przepływ przedmiotów według jego _konfiguracji_.", + "item.​create.​filter.​tooltip.​condition2": "Kliknięcie PPM", + "item.​create.​filter.​tooltip.​behaviour2": "Otwiera _ustawienia_.", + + "item.​create.​attribute_filter.​tooltip": "FILTR ATRYBUTOWY", + "item.​create.​attribute_filter.​tooltip.​summary": "_Kontroluje_ wejścia i wyjścia urządzeń logistycznych z _większą precyzją_, przypasowując przedmioty do listy właściwości przedmiotów zawartej w filtrze.", + "item.​create.​attribute_filter.​tooltip.​condition1": "Kiedy w slocie na filtr", + "item.​create.​attribute_filter.​tooltip.​behaviour1": "_Kontroluje_ przepływ przedmiotów według jego _konfiguracji_.", + "item.​create.​attribute_filter.​tooltip.​condition2": "Kliknięcie PPM", + "item.​create.​attribute_filter.​tooltip.​behaviour2": "Otwiera _ustawienia_.", + + "item.​create.​empty_schematic.​tooltip": "PUSTY SCHEMAT", + "item.​create.​empty_schematic.​tooltip.​summary": "Używany, jako składnik do receptur i do pisania w _stole do planowania_.", + + "item.​create.​schematic.​tooltip": "SCHEMAT", + "item.​create.​schematic.​tooltip.​summary": "Przechowuje strukturę do postawienia w świecie. Ustaw hologram według uznania i użyj _Schematoarmaty_, aby ją zbudować.", + "item.​create.​schematic.​tooltip.​condition1": "Kiedy w ręce", + "item.​create.​schematic.​tooltip.​behaviour1": "Może zostać _ustawiona_ z użyciem narzędzi wyświetlonych na ekranie.", + "item.​create.​schematic.​tooltip.​control1": "Kliknięcie PPM w czasie skradania", + "item.​create.​schematic.​tooltip.​action1": "Otwiera _ustawienia_.", + + "item.​create.​schematic_and_quill.​tooltip": "SCHEMAT Z PIÓREM", + "item.​create.​schematic_and_quill.​tooltip.​summary": "Używany do zapisania struktury z Twojego świata do pliku .nbt", + "item.​create.​schematic_and_quill.​tooltip.​condition1": "Krok 1", + "item.​create.​schematic_and_quill.​tooltip.​behaviour1": "Zaznacz dwa rogi prawym przyciskiem myszy.", + "item.​create.​schematic_and_quill.​tooltip.​condition2": "Krok 2", + "item.​create.​schematic_and_quill.​tooltip.​behaviour2": "_[Ctrl]+Przewijaj_ patrząc się na ściany, aby dostosować rozmiar. Kliknij znowu PPM, aby zapisać.", + "item.​create.​schematic_and_quill.​tooltip.​control1": "Kliknięcie PPM", + "item.​create.​schematic_and_quill.​tooltip.​action1": "Wybierz róg/potwierdź zapisanie.", + "item.​create.​schematic_and_quill.​tooltip.​control2": "Trzymane w ręce + Ctrl", + "item.​create.​schematic_and_quill.​tooltip.​action2": "Zaznacz rogi _w powietrzu_. _Przewijaj_, aby dostosować dystans.", + "item.​create.​schematic_and_quill.​tooltip.​control3": "Kliknięcie PPM w czasie skradania", + "item.​create.​schematic_and_quill.​tooltip.​action3": "_Resetuje_ i usuwa zaznaczenie.", + + "block.​create.​schematicannon.​tooltip": "SCHEMATOARMATA", + "block.​create.​schematicannon.​tooltip.​summary": "Strzela blokami, aby odtworzyć wybrany schemat w świecie. Zużywa przedmioty z sąsiadujących bloków, potrzebuje _prochu_ jako paliwo.", + "block.​create.​schematicannon.​tooltip.​condition1": "Kliknięcie PPM", + "block.​create.​schematicannon.​tooltip.​behaviour1": "Otwiera _interfejs_.", + + "block.​create.​schematic_table.​tooltip": "STÓŁ DO PLANOWANIA", + "block.​create.​schematic_table.​tooltip.​summary": "Przypisuje zapisane schematy do _pustego schematu_.", + "block.​create.​schematic_table.​tooltip.​condition1": "Kiedy włożono pusty schemat", + "block.​create.​schematic_table.​tooltip.​behaviour1": "Pobiera wybrany plik z Twojego folderu ze schematami", + + "item.​create.​goggles.​tooltip": "GOGLE", + "item.​create.​goggles.​tooltip.​summary": "Para okularów służąca do rozszerzania Twojej wizji o _przydatne informacje_.", + "item.​create.​goggles.​tooltip.​condition1": "Kiedy założone", + "item.​create.​goggles.​tooltip.​behaviour1": "Pokazuje _kolorowe wskazówki_ odpowiadające _prędkości obrotu_ komponentu, jak i również ich _wpływ_ oraz _odporność na obciążenie_.", + "item.​create.​goggles.​tooltip.​condition2": "Patrząc na miernik", + "item.​create.​goggles.​tooltip.​behaviour2": "Pokazuje szczegółowe informacje na temat _prędkości_ lub _obciążenia_ systemu, do którego miernik jest podłączony.", + "item.​create.​goggles.​tooltip.​condition3": "Patrząc na zbiorniki", + "item.​create.​goggles.​tooltip.​behaviour3": "Pokazuje szczegółowe informacje na temat _pojemności_ zbiornika i wszelkich _płynów_ przechowywanych wewnątrz.", + + "item.​create.​wrench.​tooltip": "KLUCZ", + "item.​create.​wrench.​tooltip.​summary": "Przydatne narzędzie do pracy z maszynami. Może być użyty do _obracania_, _rozbiórki_ i _konfiguracji_ komponentów.", + "item.​create.​wrench.​tooltip.​control1": "Kliknięcie PPM na ruchomy blok", + "item.​create.​wrench.​tooltip.​action1": "_Obraca_ komponenty do- lub od- strony, na którą kliknięto.", + "item.​create.​wrench.​tooltip.​control2": "Kliknięcie PPM w czasie skradania", + "item.​create.​wrench.​tooltip.​action2": "_Rozmontowuje_ komponenty i wkłada je z powrotem do _Twojego ekwipunku_.", + + "block.​create.​nozzle.​tooltip": "DYSZA", + "block.​create.​nozzle.​tooltip.​summary": "Przyczep do przedniej części _izolowanego wiatraka_, aby rozprowadzić jego efekt na _wszystkie strony_.", + + "block.​create.​cuckoo_clock.​tooltip": "ZEGAR Z KUKUŁKĄ", + "block.​create.​cuckoo_clock.​tooltip.​summary": "Kunsztowny wytwór do _dekoracji_ przestrzeni mieszkalnej i _mierzenia czasu_.", + "block.​create.​cuckoo_clock.​tooltip.​condition1": "Kiedy zasilony siłą obrotową", + "block.​create.​cuckoo_clock.​tooltip.​behaviour1": "Pokazuje _obecny czas_ i gra melodyjkę dwa razy dziennie. Aktywuje się raz w _południe_ i raz o zmierzchu, jak tylko _możliwy jest sen_.", + + "block.​create.​turntable.​tooltip": "TALERZ OBROTOWY", + "block.​create.​turntable.​tooltip.​summary": "Zamienia _siłę obrotu_ na _chorobę lokomocyjną_.", + + "block.​create.​portable_fluid_interface.​tooltip": "PRZENOŚNY INTERFEJS PŁYNÓW", + "block.​create.​portable_fluid_interface.​tooltip.​summary": "Przenośne miejsce wymiany służące do _transportu płynów_ z- i do _struktury_ przesuwanej przez tłok, łożysko, wagonik, lub krążek. Dwa interfejsy muszą być _skierowane w swoją stronę_ i być _od 1 do 2 bloków_ od siebie.", + "block.​create.​portable_fluid_interface.​tooltip.​condition1": "W czasie poruszania", + "block.​create.​portable_fluid_interface.​tooltip.​behaviour1": "Współpracuje ze stojącymi _przenośnymi interfejsami magazynu_, aby przetransportować płyn z- lub do maszyny. Rury wpychające lub wyciągające ze _stojącego interfejsu_ będą działać na zbiorniki _bezpośrednio w maszynie_. Maszyna na chwile stanie, aby wymienić płyny.", + "block.​create.​portable_fluid_interface.​tooltip.​condition2": "Kiedy zasilony przez Redstone", + "block.​create.​portable_fluid_interface.​tooltip.​behaviour2": "Natychmiastowo _ucina_ jakiekolwiek aktywne połączenia.", + + "block.​create.​stockpile_switch.​tooltip": "PRZEŁĄCZNIK ZAWARTOŚCIOWY", + "block.​create.​stockpile_switch.​tooltip.​summary": "Przełącza sygnał Redstone bazując na _ilości przedmiotów_ przechowywanych w sąsiadującym bloku. Może posiadać filtr. W odróżnieniu od _komparatora_, przełącznik zawartościowy pozwala na konfigurację _progów_, przy których sygnały są odwrotne.", + "block.​create.​stockpile_switch.​tooltip.​condition1": "Kliknięcie PPM", + "block.​create.​stockpile_switch.​tooltip.​behaviour1": "Otwiera _ustawienia_.", + + "block.​create.​content_observer.​tooltip": "DETEKTOR ZAWARTOŚCI", + "block.​create.​content_observer.​tooltip.​summary": "_Wykrywa przedmioty_ zawarte w sąsiadującym _bloku_ lub _taśmociągu_, które pasują do ustalonego filtra. Kiedy obserwowany blok _zawiera_ ten przedmiot, detektor wyśle _sygnał Redstone_.", + + "block.​create.​adjustable_crate.​tooltip": "REGULOWANA SKRZYNKA", + "block.​create.​adjustable_crate.​tooltip.​summary": "Ta skrzynia pozwala na _ręczną kontrolę_ jej pojemności. Może pomieścić do _16 stosów_ dowolnego przedmiotu. Działa z _komparatorami_.", + "block.​create.​adjustable_crate.​tooltip.​condition1": "Kliknięcie PPM", + "block.​create.​adjustable_crate.​tooltip.​behaviour1": "Otwiera _interfejs_.", + + "block.​create.​creative_crate.​tooltip": "SKRZYNKA BEZ DNA", + "block.​create.​creative_crate.​tooltip.​summary": "Ta skrzynia pozwala na _nieskończone powielanie_ dowolnego przedmiotu. Postaw obok _Schematoarmaty_, aby usunąć wszelkie wymagania dotyczące materiałów.", + "block.​create.​creative_crate.​tooltip.​condition1": "Kiedy przedmiot jest w slocie na filtr", + "block.​create.​creative_crate.​tooltip.​behaviour1": "Bloki _wyciągające_ przedmioty z tego bloku będą miały _nieskończony zapas_ wybranego przedmiotu. Przedmioty włożone do tej skrzynki będą _usuwane_.", + + "block.​create.​controller_rail.​tooltip": "TORY STERUJĄCE", + "block.​create.​controller_rail.​tooltip.​summary": "_Wielokierunkowy_ zasilany tor pozwalający na _dokładną kontrolę_ nad _prędkością wagonika_.", + "block.​create.​controller_rail.​tooltip.​condition1": "Kiedy zasilone przez Redstone", + "block.​create.​controller_rail.​tooltip.​behaviour1": "_Przyspiesza_ lub _spowalnia_ przejeżdżające _wagoniki_, bazując na sile sygnału. Przekazuje sygnał do sąsiadujących torów. Zasilenie dwóch połączonych torów innymi siłami sygnału spowoduje, że tory pomiędzy nimi będą miały stopniowo zmieniającą się siłę sygnału.", + + "item.​create.​sand_paper.​tooltip": "PAPIER ŚCIERNY", + "item.​create.​sand_paper.​tooltip.​summary": "Szorstki papier używany do _polerowania_ materiałów. Może być automatycznie wykorzystywany z użyciem _aplikatora_.", + "item.​create.​sand_paper.​tooltip.​condition1": "Kiedy użyto", + "item.​create.​sand_paper.​tooltip.​behaviour1": "_Poleruje_ przedmioty trzymane w _drugiej ręce_ lub _leżące na ziemi_ w linii wzroku.", + + "item.​create.​builders_tea.​tooltip": "HERBATKA BUDOWNICZEGO", + "item.​create.​builders_tea.​tooltip.​summary": "Idealny napój na początek dnia - _sycący_ i _motywujący_", + + "item.​create.​refined_radiance.​tooltip": "ŚWIETLISTY MATERIAŁ", + "item.​create.​refined_radiance.​tooltip.​summary": "Chromatyczny materiał powstały z _absorbcji światła_.", + + "item.​create.​shadow_steel.​tooltip": "MROCZNA STAL", + "item.​create.​shadow_steel.​tooltip.​summary": "Chromatyczny materiał powstały w _otchłani_.", + + "item.​create.​minecart_coupling.​tooltip": "ŁĄCZNIK WAGONIKÓW", + "item.​create.​minecart_coupling.​tooltip.​summary": "_Łączy_ wszystkie Twoje _wagoniki_ lub _maszyny torowe_, tworząc majestatyczny pociąg.", + "item.​create.​minecart_coupling.​tooltip.​condition1": "Kiedy użyto na wagoniku", + "item.​create.​minecart_coupling.​tooltip.​behaviour1": "_Łączy_ dwa wagoniki, próbując utrzymać je w stałej odległości od siebie.", + + "create.​tooltip.​wip": "WIP", + "create.​tooltip.​workInProgress": "Praca w toku!", + "create.​tooltip.​randomWipDescription0": "Trzymać z dala od dzieci.", + "create.​tooltip.​randomWipDescription1": "Mała panda ginie za każdym razem, kiedy patrzysz na ten przedmiot. Za. Każdym. Razem.", + "create.​tooltip.​randomWipDescription2": "Używaj na własną odpowiedzialność.", + "create.​tooltip.​randomWipDescription3": "To nie ten przedmiot, którego szukasz, proszę się rozejść.", + "create.​tooltip.​randomWipDescription4": "Ten przedmiot ulegnie autodestrukcji za 10 sekund. 10, 9, 8...", + "create.​tooltip.​randomWipDescription5": "Uwierz mi, jest bezużyteczny.", + "create.​tooltip.​randomWipDescription6": "Używając tego przedmiotu, zgadzasz się na warunki umowy.", + "create.​tooltip.​randomWipDescription7": "Ten przedmiot chyba nie jest dla Ciebie. A może ten?", + "create.​tooltip.​randomWipDescription8": "Użyj tego i natychmiast będziesz tego żałował.", + + + "_": "->------------------------] Analizowanie [------------------------<-", + + "create.​ponder.​hold_to_ponder": "Przytrzymaj [%1$s], aby przeanalizować", + "create.​ponder.​subject": "Temat tej sceny", + "create.​ponder.​pondering": "Temat analizy:", + "create.​ponder.​identify_mode": "Tryb identyfikacji aktywny. Naciśnij [%1$s], aby wyłączyć", + "create.​ponder.​associated": "Powiązane hasła", + "create.​ponder.​close": "Zamknij", + "create.​ponder.​identify": "Identyfikacja", + "create.​ponder.​next": "Następna scena", + "create.​ponder.​previous": "Poprzednia scena", + "create.​ponder.​replay": "Powtórka", + "create.​ponder.​think_back": "Powrót", + "create.​ponder.​slow_text": "Komfortowe czytanie", + "create.​ponder.​shared.​movement_anchors": "Z pomocą stelaży lub Super Glue, większe struktury mogą być przesuwane.", + "create.​ponder.​shared.​rpm32": "32 Ob/min", + "create.​ponder.​shared.​sneak_and": "Skradanie +", + "create.​ponder.​shared.​storage_on_contraption": "Pojemniki przyłączone do maszyny będą podnosiły przedmioty automatycznie", + "create.​ponder.​shared.​behaviour_modify_wrench": "To zachowanie może być zmodyfikowane przy pomocy klucza", + "create.​ponder.​shared.​rpm8": "8 Ob/min", + "create.​ponder.​shared.​ctrl_and": "Ctrl +", + "create.​ponder.​shared.​rpm16_source": "Źródło: 16 Ob/min", + "create.​ponder.​shared.​rpm16": "16 Ob/min", + "create.​ponder.​tag.​kinetic_sources": "Źródła siły obrotowej", + "create.​ponder.​tag.​kinetic_sources.​description": "Komponenty, które generują siłę obrotu", + "create.​ponder.​tag.​contraption_actor": "Komponenty aktywne maszyn", + "create.​ponder.​tag.​contraption_actor.​description": "Komponenty, które posiadają specjalne zachowanie będąc podłączonymi do maszyny", + "create.​ponder.​tag.​arm_targets": "Cele dla mechanicznego ramienia", + "create.​ponder.​tag.​arm_targets.​description": "Komponenty, które mogą być wybrane, jako wejście lub wyjście dla mechanicznego ramienia", + "create.​ponder.​tag.​logistics": "Transport przedmiotów", + "create.​ponder.​tag.​logistics.​description": "Komponenty, które pomagają w transporcie przedmiotów", + "create.​ponder.​tag.​movement_anchor": "Komponenty ruchome", + "create.​ponder.​tag.​movement_anchor.​description": "Komponenty, które pozwalają na tworzenie ruchomych maszyn, poruszając ją na wiele różnych sposobów.", + "create.​ponder.​tag.​creative": "Tryb kreatywny", + "create.​ponder.​tag.​creative.​description": "Komponenty niedostępne na trybie przetrwania", + "create.​ponder.​tag.​kinetic_relays": "Bloki obrotowe", + "create.​ponder.​tag.​kinetic_relays.​description": "Komponenty, które pomagają w przekazywaniu siły obrotowej w inne miejsca", + "create.​ponder.​tag.​windmill_sails": "Bloki żaglo-podobne", + "create.​ponder.​tag.​windmill_sails.​description": "Bloki, które dokładają się do siły, z jaką obracają się łopaty maszyny wiatrakowej.", + "create.​ponder.​tag.​contraption_assembly": "Bloki do tworzenia maszyn", + "create.​ponder.​tag.​contraption_assembly.​description": "Narzędzia i komponenty używane do konstrukcji ruchomych maszyn", + "create.​ponder.​tag.​decoration": "Dekoracje", + "create.​ponder.​tag.​decoration.​description": "Komponenty używane głównie do celów estetycznych", + "create.​ponder.​tag.​kinetic_appliances": "Urządzenia obrotowe", + "create.​ponder.​tag.​kinetic_appliances.​description": "Komponenty używające siły obrotowej", + "create.​ponder.​tag.​redstone": "Komponenty logiczne", + "create.​ponder.​tag.​redstone.​description": "Komponenty przydatne w Redstonie", + "create.​ponder.​tag.​fluids": "Manipulator płynów", + "create.​ponder.​tag.​fluids.​description": "Komponenty przydatne przy pracy z płynami", + + "create.​ponder.​adjustable_pulse_repeater.​header": "Kontrola sygnałów z wykorzystaniem regulowanych przekaźników pulsu", + "create.​ponder.​adjustable_pulse_repeater.​text_1": "Regulowane przekaźniki pulsu emitują krótki puls po opóźnieniu", + "create.​ponder.​adjustable_pulse_repeater.​text_2": "Używając rolki w myszce można modyfikować opóźnienie", + "create.​ponder.​adjustable_pulse_repeater.​text_3": "Opóźnienia mogą mieć nawet do 30 minut", + + "create.​ponder.​adjustable_repeater.​header": "Kontrola sygnałów z wykorzystaniem regulowanych przekaźników\n", + "create.​ponder.​adjustable_repeater.​text_1": "Regulowane przekaźniki zachowują się podobnie do zwykłych przekaźników", + "create.​ponder.​adjustable_repeater.​text_2": "Ładują się przez określony czas...", + "create.​ponder.​adjustable_repeater.​text_3": "...i stygną przez ten sam czas", + "create.​ponder.​adjustable_repeater.​text_4": "Używając rolki w myszce można modyfikować czas ładowania", + "create.​ponder.​adjustable_repeater.​text_5": "Czasy ładowania mogą mieć nawet do 30 minut", + + "create.​ponder.​analog_lever.​header": "Kontrola sygnałów z wykorzystaniem dźwigni analogowej", + "create.​ponder.​analog_lever.​text_1": "Dźwignie analogowe są kompaktowymi i dokładnymi źródłami sygnału Redstone", + "create.​ponder.​analog_lever.​text_2": "Kliknij PPM, aby zwiększyć wysyłaną przez nie siłę sygnału ", + "create.​ponder.​analog_lever.​text_3": "Kliknij PPM skradając się, aby zmniejszyć wysyłaną przez nie siłę sygnału ", + + "create.​ponder.​andesite_tunnel.​header": "Używanie andezytowych tuneli", + "create.​ponder.​andesite_tunnel.​text_1": "Andezytowe tunele mogą być użyte do przykrycia Twoich taśmociągów", + "create.​ponder.​andesite_tunnel.​text_2": "Kiedy andezytowy tunel ma połączenie z jego boku...", + "create.​ponder.​andesite_tunnel.​text_3": "...będzie oddzielał dokładnie jeden przedmiot na każde wyjście", + "create.​ponder.​andesite_tunnel.​text_4": "Reszta przedmiotów będzie kontynuowało swoją podróż", + + "create.​ponder.​basin.​header": "Przetwarzanie przedmiotów w tyglu", + "create.​ponder.​basin.​text_1": "Tygiel może przechowywać przedmioty i płyny do późniejszej obróbki", + "create.​ponder.​basin.​text_2": "Po obróbce, tygle spróbują wyrzucić gotowy przedmiot z boku, jeden blok pod spodem", + "create.​ponder.​basin.​text_3": "Jeśli stoi tam odpowiedni komponent, z boku tygla pojawi się wylot", + "create.​ponder.​basin.​text_4": "Jest tu wiele opcji", + "create.​ponder.​basin.​text_5": "Produkty będą pobrane przez poniższy pojemnik", + "create.​ponder.​basin.​text_6": "Bez wylotu, tygiel zachowa produkty przez niego wytworzone", + "create.​ponder.​basin.​text_7": "Może to być przydatne, jeśli przedmioty te muszą być ponownie użyte jako składniki", + "create.​ponder.​basin.​text_8": "Gotowe przedmioty muszą być wyciągnięte z tygla", + "create.​ponder.​basin.​text_9": "Filtr może być przydatny, aby zapobiec wyciąganiu nieprzerobionych przedmiotów", + + "create.​ponder.​bearing_modes.​header": "Tryby ruchu dla mechanicznego łożyska", + "create.​ponder.​bearing_modes.​text_1": "Kiedy zatrzymane, mechaniczne łożysko umieści strukturę w najbliższej możliwej przestrzeni", + "create.​ponder.​bearing_modes.​text_2": "Może zostać ustawiony, aby nigdy nie powracał do stałych bloków, lub tylko blisko kąta, z jakiego zaczął", + + "create.​ponder.​belt_casing.​header": "Przykrywanie taśmociągów", + "create.​ponder.​belt_casing.​text_1": "Mosiężne lub andezytowe obudowy mogą być użyte do dekoracji taśmociągów", + "create.​ponder.​belt_casing.​text_2": "Klucz może zostać użyty do usunięcia obudowy", + + "create.​ponder.​belt_connector.​header": "Używanie taśmociągów", + "create.​ponder.​belt_connector.​text_1": "Kliknięcie PPM na dwa wały połączy je taśmociągiem", + "create.​ponder.​belt_connector.​text_2": "Przypadkowe wybory mogą być anulowane klikając na nie PPM skradając się", + "create.​ponder.​belt_connector.​text_3": "Dodatkowe wały mogą zostać dodane w środku taśmociągu", + "create.​ponder.​belt_connector.​text_4": "Wały połączone taśmociągiem będą się obracały z taką samą prędkością i kierunkiem", + "create.​ponder.​belt_connector.​text_5": "Dodatkowe wały mogą zostać usunięte przy pomocy klucza", + "create.​ponder.​belt_connector.​text_6": "Taśmociągi mogą zostać zabarwione w celach estetycznych", + + "create.​ponder.​belt_directions.​header": "Prawidłowe orientacje taśmociągów", + "create.​ponder.​belt_directions.​text_1": "Taśmociągi nie mogą się łączyć w losowych kierunkach", + "create.​ponder.​belt_directions.​text_2": "1. Mogą się łączyć poziomo", + "create.​ponder.​belt_directions.​text_3": "2. Mogą się łączyć ukośnie", + "create.​ponder.​belt_directions.​text_4": "3. Mogą się łączyć pionowo", + "create.​ponder.​belt_directions.​text_5": "4. I mogą łączyć pionowe wały poziomo", + "create.​ponder.​belt_directions.​text_6": "To są wszystkie możliwe kierunki połączeń. Taśmociągi mogą mieć dowolną długość od 2 do 20 bloków", + + "create.​ponder.​belt_transport.​header": "Używanie taśmociągów w celach logistycznych", + "create.​ponder.​belt_transport.​text_1": "Ruchome taśmociągi będą przesuwały przedmioty lub inne byty", + "create.​ponder.​belt_transport.​text_2": "Kliknij PPM pustą ręką, aby zabrać przedmiot z taśmociągu", + + "create.​ponder.​blaze_burner.​header": "Napełnianie płomiennych palników", + "create.​ponder.​blaze_burner.​text_1": "Płomienne palniki dają ciepło potrzebne do obróbki niektórych przedmiotów w tyglu", + "create.​ponder.​blaze_burner.​text_2": "Aby uzyskać ciepło, płomyk uwięziony wewnątrz musi dostać jakieś łatwopalne przedmioty", + "create.​ponder.​blaze_burner.​text_3": "Z użyciem płomiennego ciasta, palnik może uzyskać szczególnie wysoką temperaturę", + "create.​ponder.​blaze_burner.​text_4": "Dostarczanie płomykowi przedmiotów może zostać zautomatyzowane z użyciem aplikatorów lub mechanicznych ramion", + + "create.​ponder.​brass_funnel.​header": "Mosiężny lejek", + "create.​ponder.​brass_funnel.​text_1": "Andezytowe lejki mogą pobierać jedynie pojedyncze przedmioty", + "create.​ponder.​brass_funnel.​text_2": "Mosiężne lejki mogą pobierać nawet pełne stosy", + "create.​ponder.​brass_funnel.​text_3": "Przewijanie na slocie filtrującym pozwala na precyzyjną kontrolę nad maksymalną wielkością stosu", + "create.​ponder.​brass_funnel.​text_4": "Użycie przedmiotów patrząc na slot filtrujący spowoduje, że lejek będzie przesyłał tylko pasujące przedmioty", + + "create.​ponder.​brass_tunnel.​header": "Używanie mosiężnych tuneli", + "create.​ponder.​brass_tunnel.​text_1": "Mosiężne tunele mogą być użyte do przykrycia Twoich taśmociągów", + "create.​ponder.​brass_tunnel.​text_2": "Mosiężne tunele posiadają slot filtrujący na każdej otwartej stronie", + "create.​ponder.​brass_tunnel.​text_3": "Filtry przy wejściach zwyczajnie nie przepuszczają niepasujących przedmiotów", + "create.​ponder.​brass_tunnel.​text_4": "Filtry przy wyjściach mogą być użyte do sortowania przedmiotów", + "create.​ponder.​brass_tunnel.​text_5": "Jeśli przedmiot ma wiele możliwych wyjść, tryb dystrybucji zdecyduje jak mają się zachować", + "create.​ponder.​brass_tunnel.​text_6": "Tunele na przylegających taśmociągach stworzą połączenie", + "create.​ponder.​brass_tunnel.​text_7": "Przybyłe przedmioty będą dystrybuowane na wszystkie połączone wyjścia", + "create.​ponder.​brass_tunnel.​text_8": "Przedmioty mogą być również wrzucone prosto do tunelu", + + "create.​ponder.​brass_tunnel_modes.​header": "Tryby dystrybucji mosiężnego tunelu", + "create.​ponder.​brass_tunnel_modes.​text_1": "Tryb dystrybucji mosiężnego tunelu może zostać wybrany z użyciem klucza", + "create.​ponder.​brass_tunnel_modes.​text_10": "'Synchronizuj wejścia' jest trybem unikalnym dla mosiężnych tuneli", + "create.​ponder.​brass_tunnel_modes.​text_11": "Przedmioty są przepuszczane jedynie, kiedy przed każdym połączonym tunelem czeka przedmiot", + "create.​ponder.​brass_tunnel_modes.​text_12": "Dzięki temu mamy pewność, że każdy taśmociąg przesyła przedmioty z taką samą szybkością", + "create.​ponder.​brass_tunnel_modes.​text_2": "Tryb 'Podziel' będzie starał się rozdzielić przedmioty do każdego wyjścia po równo", + "create.​ponder.​brass_tunnel_modes.​text_3": "Jeśli wyjście nie może już przyjąć więcej przedmiotów, zostanie pominięte", + "create.​ponder.​brass_tunnel_modes.​text_4": "Tryb 'Wymuś podział' nigdy nie pominie żadnego wyjścia, a zamiast tego będzie czekał, aż wszystkie będą wolne", + "create.​ponder.​brass_tunnel_modes.​text_5": "Tryb 'Dookoła' zachowuje wielkość stosu, i rozprowadza je do każdego wyjścia po kolei", + "create.​ponder.​brass_tunnel_modes.​text_6": "Znowu: jeśli wyjście nie może już przyjąć więcej przedmiotów, zostanie pominięte", + "create.​ponder.​brass_tunnel_modes.​text_7": "Tryb 'Dookoła (wymuszony)' nigdy nie pominie żadnego wyjścia", + "create.​ponder.​brass_tunnel_modes.​text_8": "Tryb 'Preferuj najbliższe' priorytetyzuje najbliższe wyjście od wejścia, z którego przybył przedmiot", + "create.​ponder.​brass_tunnel_modes.​text_9": "Tryb 'Losowo' rozdystrybuuje całe stosy do losowych wyjść", + + "create.​ponder.​cart_assembler.​header": "Przesuwanie maszyn z użyciem montera wagoników", + "create.​ponder.​cart_assembler.​text_1": "Zasilony monter wagoników przyczepia dołączone struktury do przejeżdżających wagoników", + "create.​ponder.​cart_assembler.​text_2": "Niezasilony, odczepia struktury on przejeżdżających wagoników", + "create.​ponder.​cart_assembler.​text_3": "Klucz pomoże Ci przenieść gotowy wagonik w inne miejsce", + + "create.​ponder.​cart_assembler_dual.​header": "Konstruowanie wielowagonikowych struktur", + "create.​ponder.​cart_assembler_dual.​text_1": "Jeśli dwa montery wagoników dzielą ze sobą jedną strukturę...", + "create.​ponder.​cart_assembler_dual.​text_2": "...zasilenie dowolnego z nich przyczepi konstrukcję do obu wagoników", + "create.​ponder.​cart_assembler_dual.​text_3": "Wagoniki będą się zachowywać jak te połączone łącznikiem", + + "create.​ponder.​cart_assembler_modes.​header": "Dostosowywanie orientacji maszyn w wagoniku", + "create.​ponder.​cart_assembler_modes.​text_1": "Maszyny w wagoniku obracają się wraz z wagonikiem", + "create.​ponder.​cart_assembler_modes.​text_2": "Jeśli monter jest ustawiony na tryb 'Zablokuj obrót', maszyna nigdy nie zmieni swojej orientacji", + + "create.​ponder.​cart_assembler_rails.​header": "Inne typy wagoników i torów", + "create.​ponder.​cart_assembler_rails.​text_1": "Montery wagoników stojące na zwykłych torach nie zmienią prędkości przejeżdżającego wagonika", + "create.​ponder.​cart_assembler_rails.​text_2": "Jeśli stoi na zasilanych lub sterujących torach, wagonik będzie stał w miejscu tak długo, aż nie zostaną tory zasilone", + "create.​ponder.​cart_assembler_rails.​text_3": "Inne typy wagoników mogą być użyte jako baza dla maszyny", + "create.​ponder.​cart_assembler_rails.​text_4": "Wagoniki z piecem będą ciągle zasilane, pobierając paliwo z doczepionych pojemników", + + "create.​ponder.​chain_drive.​header": "Przekazywanie siły obrotowej z użyciem przekaźników łańcuchowych", + "create.​ponder.​chain_drive.​text_1": "Przekaźniki łańcuchowe przekazują obroty do wszystkich połączonych przekaźników", + "create.​ponder.​chain_drive.​text_2": "Wszystkie wały połączone w ten sposób będą obracać się w tą samą stronę", + "create.​ponder.​chain_drive.​text_3": "Dowolna część w rzędzie może być obrócona o 90 stopni", + + "create.​ponder.​chain_gearshift.​header": "Kontrolowanie prędkości obrotu z użyciem przekładników łańcuchowych", + "create.​ponder.​chain_gearshift.​text_1": "Niezasilone przekładniki łańcuchowe zachowują się dokładnie tak samo jak przekaźniki łańcuchowe", + "create.​ponder.​chain_gearshift.​text_2": "Kiedy zasilone, prędkość przekazywana do pozostałych przekładników jest podwojona", + "create.​ponder.​chain_gearshift.​text_3": "Jeśli zasilony przekładnik nie jest źródłem obrotów, jego prędkość będzie zmniejszona dwukrotnie", + "create.​ponder.​chain_gearshift.​text_4": "W oby przypadkach, pozostałe przekładniki będą pracować z dwukrotnie większą prędkością niż ten, który jest zasilony", + "create.​ponder.​chain_gearshift.​text_5": "Z użyciem sygnałów analogowych, ta różnica może być dostosowana z większą dokładnością - pomiędzy 1 a 2x", + "create.​ponder.​chain_gearshift.​text_6": "12 Ob/min", + + "create.​ponder.​chute.​header": "Transport przedmiotów w dół z użyciem zsypów", + "create.​ponder.​chute.​text_1": "Zsypy mogą transportować przedmioty pionowo z- i do pojemników", + "create.​ponder.​chute.​text_2": "Używając klucza można stworzyć okno", + "create.​ponder.​chute.​text_3": "Stawiając zsyp na bocznej stronie innego zsypu, będzie on skośny", + + "create.​ponder.​chute_upward.​header": "Transport przedmiotów w górę przez zsypy", + "create.​ponder.​chute_upward.​text_1": "Używając izolowanych wiatraków pod zsypem możliwy jest transport przedmiotów w górę zsypu", + "create.​ponder.​chute_upward.​text_2": "Patrzenie na zsyp przez Gogle Inżyniera pokazuje informacje o kierunku funkcjonowania zsypu", + "create.​ponder.​chute_upward.​text_3": "Od 'zablokowanej' strony przedmioty muszą być wkładane/wyciągane od boku", + + "create.​ponder.​clockwork_bearing.​header": "Używanie mechanizmu zegarowego", + "create.​ponder.​clockwork_bearing.​text_1": "Mechanizmy zegarowe przyczepiają do siebie bloki, które mają z przodu", + "create.​ponder.​clockwork_bearing.​text_2": "Po dostarczeniu siły obrotowej, struktura obróci się, pokazując obecną godzinę", + "create.​ponder.​clockwork_bearing.​text_3": "3:00", + "create.​ponder.​clockwork_bearing.​text_4": "4:00", + "create.​ponder.​clockwork_bearing.​text_5": "Kliknij PPM na mechanizm, aby zatrzymać lub rozpocząć obrót struktury", + "create.​ponder.​clockwork_bearing.​text_6": "Przed wskazówką godzinową, można dodać kolejną strukturę", + "create.​ponder.​clockwork_bearing.​text_7": "Upewnij się, że obie struktury nie są ze sobą połączone", + "create.​ponder.​clockwork_bearing.​text_8": "Druga struktura będzie działać jak wskazówka minutowa", + + "create.​ponder.​clutch.​header": "Kontrolowanie obrotu z użyciem sprzęgła", + "create.​ponder.​clutch.​text_1": "Sprzęgło przekazuje obrót w linii prostej", + "create.​ponder.​clutch.​text_2": "Zasilony, przerywa połączenie", + + "create.​ponder.​cog_speedup.​header": "Przekładnia z kół zębatych", + "create.​ponder.​cog_speedup.​text_1": "Duże i małe koła zębate mogą być połączone po ukosie", + "create.​ponder.​cog_speedup.​text_2": "Przekazując z dużego koła na małe, prędkość wzrośnie dwukrotnie", + "create.​ponder.​cog_speedup.​text_3": "Przekazując na odwrót, prędkość spadnie dwukrotnie", + + "create.​ponder.​cogwheel.​header": "Przekazywanie obrotu z użyciem kół zębatych", + "create.​ponder.​cogwheel.​text_1": "Koła zębate przekazują obrót do sąsiadujących kół", + "create.​ponder.​cogwheel.​text_2": "Koła połączone w ten sposób będą obracać się w przeciwnych kierunkach", + + "create.​ponder.​creative_motor.​header": "Generowanie siły obrotowej z użyciem kreatywnego silnika", + "create.​ponder.​creative_motor.​text_1": "Kreatywny silnik to kompaktowe i regulowane źródło siły obrotowej", + "create.​ponder.​creative_motor.​text_2": "Przewijanie patrząc na tylny panel zmienia prędkość obrotu", + + "create.​ponder.​crushing_wheels.​header": "Kruszenie przedmiotów", + "create.​ponder.​crushing_wheels.​text_1": "Para kół kruszących kruszy przedmioty niezwykle efektywnie", + "create.​ponder.​crushing_wheels.​text_2": "Powinny się one kręcić w przeciwnych kierunkach", + "create.​ponder.​crushing_wheels.​text_3": "Przedmioty wrzucone od góry będą kruszone", + "create.​ponder.​crushing_wheels.​text_4": "Przedmioty mogą zostać wrzucone i odebrane automatycznie", + + "create.​ponder.​deployer.​header": "Używanie aplikatora", + "create.​ponder.​deployer.​text_1": "Aplikator może imitować niektóre zachowania gracza, z użyciem siły obrotowej", + "create.​ponder.​deployer.​text_10": "Kliknij PPM jego przód, aby dać mu przedmiot", + "create.​ponder.​deployer.​text_11": "Przedmioty mogą też zostać dostarczone automatycznie", + "create.​ponder.​deployer.​text_12": "Aplikatory posiadają slot filtrujący", + "create.​ponder.​deployer.​text_13": "Kiedy filtr jest skonfigurowany, aplikator użyje tylko pasujących przedmiotów", + "create.​ponder.​deployer.​text_14": "Od teraz jedynie pasujące przedmioty mogą być włożone...", + "create.​ponder.​deployer.​text_15": "...i jedynie niepasujące przedmioty mogą być wyciągnięte", + "create.​ponder.​deployer.​text_2": "Aplikator może używać przedmiotów jedynie 2 bloki przed nim", + "create.​ponder.​deployer.​text_3": "Bloki bezpośrednio przed nim nie ograniczają go", + "create.​ponder.​deployer.​text_4": "Aplikatory mogą:", + "create.​ponder.​deployer.​text_5": "Stawiać bloki,", + "create.​ponder.​deployer.​text_6": "Używać przedmiotów,", + "create.​ponder.​deployer.​text_7": "Aktywować bloki,", + "create.​ponder.​deployer.​text_8": "Kopać bloki", + "create.​ponder.​deployer.​text_9": "i atakować moby", + + "create.​ponder.​deployer_contraption.​header": "Używanie aplikatorów w maszynach", + "create.​ponder.​deployer_contraption.​text_1": "Kiedy aplikatory są przesuwane, jako część ruchomej maszyny...", + "create.​ponder.​deployer_contraption.​text_2": "...aktywują się przy każdym odwiedzonym bloku, pobierając przedmioty z pojemników przyczepionych do maszyny", + "create.​ponder.​deployer_contraption.​text_3": "Slot filtrujący może być użyty do sprecyzowania, jakich przedmiotów używać", + + "create.​ponder.​deployer_modes.​header": "Tryby aplikatora", + "create.​ponder.​deployer_modes.​text_1": "Domyślnie, aplikator imituje prawe kliknięcie", + "create.​ponder.​deployer_modes.​text_2": "Może być przestawiony na lewe kliknięcie używając klucza", + + "create.​ponder.​deployer_redstone.​header": "Kontrolowanie aplikatorów z użyciem Redstone'a", + "create.​ponder.​deployer_redstone.​text_1": "Zasilone przez Redstone, aplikatory nie aktywują się", + "create.​ponder.​deployer_redstone.​text_2": "Przed zatrzymaniem, aplikatory dokończą już zaczętą czynność", + "create.​ponder.​deployer_redstone.​text_3": "Chwilowe wyłączenie sygnału aktywuje więc aplikator dokładnie raz", + + "create.​ponder.​depot.​header": "Używanie składnic", + "create.​ponder.​depot.​text_1": "Składnice działają jak nieruchome elementy taśmociągu", + "create.​ponder.​depot.​text_2": "Kliknij PPM, aby ręcznie położyć lub podnieść z niej przedmiot", + "create.​ponder.​depot.​text_3": "Podobnie jak taśmociągi, składnica może dostarczać przedmioty do obróbki...", + "create.​ponder.​depot.​text_4": "…jak i również dla mechanicznych ramion", + + "create.​ponder.​empty_blaze_burner.​header": "Używanie pustych płomiennych palników", + "create.​ponder.​empty_blaze_burner.​text_1": "Kliknij PPM na Płomyka trzymają w ręce pusty palnik, aby uwięzić go w środku", + "create.​ponder.​empty_blaze_burner.​text_2": "Ewentualnie, Płomyk może być zabrany prosto z jego Spawnera", + "create.​ponder.​empty_blaze_burner.​text_3": "Masz teraz idealne źródło ciepła dla przeróżnych maszyn", + "create.​ponder.​empty_blaze_burner.​text_4": "Dla celów dekoracyjnych, puste palniki można też zapalić krzesiwem", + "create.​ponder.​empty_blaze_burner.​text_5": "Nie będzie on dawał jednak ciepła", + + "create.​ponder.​fan_direction.​header": "Przepływ powietrza przez izolowane wiatraki", + "create.​ponder.​fan_direction.​text_1": "Izolowane wiatraki używają siły obrotowej, aby wytworzyć przepływ powietrza", + "create.​ponder.​fan_direction.​text_2": "Siła i kierunek przepływu zależy od właściwości siły obrotu", + + "create.​ponder.​fan_processing.​header": "Obróbka przedmiotów z użyciem izolowanych wiatraków", + "create.​ponder.​fan_processing.​text_1": "Przepływając przez lawę, powietrze staje się gorące", + "create.​ponder.​fan_processing.​text_2": "Przedmioty, które wpadną na jego drogę będą wytopione", + "create.​ponder.​fan_processing.​text_3": "Wrzucone jedzenie będzie spalone na popiół", + "create.​ponder.​fan_processing.​text_4": "Zamiast lawy można użyć ognia, aby wędzić surowe jedzenie", + "create.​ponder.​fan_processing.​text_5": "Powietrze przepływające przez wodę będzie płukało przedmioty", + "create.​ponder.​fan_processing.​text_6": "W ten sposób z niepozornych przedmiotów można otrzymać przedmioty znacznie bardziej interesujące...", + "create.​ponder.​fan_processing.​text_7": "Prędkość wiatraka nie wpływa na szybkość obróbki, a jedynie na jego zasięg!", + "create.​ponder.​fan_processing.​text_8": "Przepływ powietrza działa również na przedmioty na taśmociągach lub składnicach", + + "create.​ponder.​fan_source.​header": "Generowanie siły obrotowej z użyciem izolowanych wiatraków", + "create.​ponder.​fan_source.​text_1": "Wiatraki skierowane w stronę źródła ciepła generują siłę obrotową", + "create.​ponder.​fan_source.​text_2": "Po zasileniu, wiatraki zaczną przesyłać siłę do przylegających komponentów", + + "create.​ponder.​flywheel.​header": "Generowanie siły obrotowej z użyciem koła zamachowego", + "create.​ponder.​flywheel.​text_1": "Koła zamachowe są wymagane, aby generować siłę obrotową przy pomocy silnika spalinowego", + "create.​ponder.​flywheel.​text_2": "Wyprodukowana w ten sposób siła ma bardzo dużą odporność na obciążenie", + "create.​ponder.​flywheel.​text_3": "Używając pieca hutniczego efektywność silnika spalinowego wzrośnie dwukrotnie", + + "create.​ponder.​funnel_compat.​header": "Kompatybilność lejków", + "create.​ponder.​funnel_compat.​text_1": "Lejki działają też z wieloma innymi komponentami", + "create.​ponder.​funnel_compat.​text_2": "Pionowe piły", + "create.​ponder.​funnel_compat.​text_3": "Składnice", + "create.​ponder.​funnel_compat.​text_4": "Odpływy", + + "create.​ponder.​funnel_direction.​header": "Kierunek transportu", + "create.​ponder.​funnel_direction.​text_1": "Postawiony normalnie, wyciąga przedmioty z pojemnika", + "create.​ponder.​funnel_direction.​text_2": "Postawiony w czasie skradania, wkłada przedmioty do pojemnika", + "create.​ponder.​funnel_direction.​text_3": "Używając klucza, lejek może być odwrócony już po postawieniu", + "create.​ponder.​funnel_direction.​text_4": "Takie same zasady stosują się do większości orientacji", + "create.​ponder.​funnel_direction.​text_5": "Lejki na taśmociągach będą wyciągały/wkładały, bazując na ich kierunku poruszania się", + + "create.​ponder.​funnel_intro.​header": "Używanie lejków", + "create.​ponder.​funnel_intro.​text_1": "Lejki są idealne to transportu przedmiotów z- i do pojemników", + + "create.​ponder.​funnel_redstone.​header": "Kontrola Redstonem", + "create.​ponder.​funnel_redstone.​text_1": "Zasilenie spowoduje, że lejek przestanie działać", + + "create.​ponder.​funnel_transfer.​header": "Bezpośredni transport", + "create.​ponder.​funnel_transfer.​text_1": "Lejki nie mogą bezpośrednio transportować pomiędzy zamkniętymi pojemnikami", + "create.​ponder.​funnel_transfer.​text_2": "Zsypy lub inteligentne zsypy mogą bardziej się do tego nadawać", + "create.​ponder.​funnel_transfer.​text_3": "To samo tyczy się transportu poziomego. Taśmociąg może tutaj pomóc", + + "create.​ponder.​furnace_engine.​header": "Generowanie siły obrotowej z użyciem silnika spalinowego", + "create.​ponder.​furnace_engine.​text_1": "Silniki spalinowe generują siłę obrotową, gdy podłączonym do niego piec jest aktywny", + "create.​ponder.​furnace_engine.​text_2": "Wyprodukowana w ten sposób siła ma bardzo dużą odporność na obciążenie", + "create.​ponder.​furnace_engine.​text_3": "Używając pieca hutniczego efektywność silnika spalinowego wzrośnie dwukrotnie", + + "create.​ponder.​gantry_carriage.​header": "Używanie przenośników suwnicowych", + "create.​ponder.​gantry_carriage.​text_1": "Przenośnik suwnicowy może być zamontowany i przesuwany po suwnicy", + "create.​ponder.​gantry_carriage.​text_2": "Może on przenosić dołączone bloki", + "create.​ponder.​gantry_cascaded.​header": "Kaskadowe suwnice", + + "create.​ponder.​gantry_cascaded.​text_1": "Suwnice można dołączyć do przenośnika suwnicowego bez użycia Super Glue", + "create.​ponder.​gantry_cascaded.​text_2": "To samo tyczy się przenośników zamontowanych na przesuwanej suwnicy", + "create.​ponder.​gantry_cascaded.​text_3": "Dlatego więc system suwnic może posiadać wiele osi ruchu", + + "create.​ponder.​gantry_direction.​header": "Kierunek ruchu przenośnika", + "create.​ponder.​gantry_direction.​text_1": "Suwnice mogą mieć odwrotne orientacje", + "create.​ponder.​gantry_direction.​text_2": "Kierunek ruchu przenośnika zależy od orientacji jego suwnicy", + "create.​ponder.​gantry_direction.​text_3": "…jak i kierunku obrotu suwnicy", + "create.​ponder.​gantry_direction.​text_4": "Te same zasady stosują się do obrotu dołączonych elementów", + + "create.​ponder.​gantry_redstone.​header": "Przenoszenie obrotu przez przenośniki", + "create.​ponder.​gantry_redstone.​text_1": "Zasilone suwnice zatrzymują swoje przenośniki", + "create.​ponder.​gantry_redstone.​text_2": "Zamiast tego, jej obrót przekazywany jest do wyjściowego wała przenośnika", + + "create.​ponder.​gantry_shaft.​header": "Używanie suwnic", + "create.​ponder.​gantry_shaft.​text_1": "Suwnice są podstawą całego mechanizmu suwnicowego. Dołączone przenośniki będą poruszać się wzdłuż suwnic", + "create.​ponder.​gantry_shaft.​text_2": "Mechanizmy suwnicowe mogą przesuwać dołączone bloki", + + "create.​ponder.​gearbox.​header": "Przenoszenie siły obrotowej z użyciem przekładni", + "create.​ponder.​gearbox.​text_1": "Zmiany osi obrotu mogą bardzo szybko stać się bardzo duże", + "create.​ponder.​gearbox.​text_2": "Przekładnia jest bardziej kompaktową wersją tego mechanizmu", + "create.​ponder.​gearbox.​text_3": "Wały dookoła rogów obracają się w lustrzanych kierunkach", + "create.​ponder.​gearbox.​text_4": "Proste połączenie będzie odwrócone", + + "create.​ponder.​gearshift.​header": "Przenoszenie siły obrotowej z użyciem przekładnika", + "create.​ponder.​gearshift.​text_1": "Przekładniki przenoszą obrót w linii prostej", + "create.​ponder.​gearshift.​text_2": "Kiedy zasilone, kierunek obrotu odwraca się", + + "create.​ponder.​hand_crank.​header": "Generowanie siły obrotowej z użyciem ręcznej korby", + "create.​ponder.​hand_crank.​text_1": "Korby mogą być użyte przez gracza, aby ręcznie wprawić komponent w ruch", + "create.​ponder.​hand_crank.​text_2": "Trzymaj PPM, aby obrócić ją odwrotnie niż wskazówki zegara", + "create.​ponder.​hand_crank.​text_3": "Wytwarzana prędkość jest dosyć duża!", + "create.​ponder.​hand_crank.​text_4": "Trzymaj PPM skradając się, aby obrócić ją zgodnie ze wskazówkami zegara", + + "create.​ponder.​large_cogwheel.​header": "Przekazywanie siły obrotowej z użyciem dużych kół zębatych", + "create.​ponder.​large_cogwheel.​text_1": "Duże koła zębate mogą się łączyć ze sobą pod kątem prostym", + "create.​ponder.​large_cogwheel.​text_2": "Pomogą one w przekazywaniu siły obrotowej na inne osie obrotu", + + "create.​ponder.​linear_chassis_attachment.​header": "Dołączanie bloków do stelaża liniowego", + "create.​ponder.​linear_chassis_attachment.​text_1": "Odkryte strony stelaża mogą być oblepione szlamem", + "create.​ponder.​linear_chassis_attachment.​text_2": "Kliknij ponownie, aby oblepić również drugą stronę", + "create.​ponder.​linear_chassis_attachment.​text_3": "Kliknij PPM skradając się, aby usunąć szlam", + "create.​ponder.​linear_chassis_attachment.​text_4": "Lepkie strony zabiorą ze sobą linie bloków przed sobą", + "create.​ponder.​linear_chassis_attachment.​text_5": "Użyj klucza, aby ustawić maksymalny zasięg działania stelaża", + "create.​ponder.​linear_chassis_attachment.​text_6": "Trzymając CTRL i przewijając dostosujesz maksymalny zasięg wszystkich połączonych stelaży", + "create.​ponder.​linear_chassis_attachment.​text_7": "Przyłączanie bloków do innej strony wymaga użycia Super Glue", + "create.​ponder.​linear_chassis_attachment.​text_8": "Z wykorzystaniem tych mechanik, struktury w każdym kształcie mogą tworzyć maszyną", + + "create.​ponder.​linear_chassis_group.​header": "Przesuwanie liniowych stelaży w grupach", + "create.​ponder.​linear_chassis_group.​text_1": "Liniowe stelaże łączą się z identycznymi stelażami obok nich", + "create.​ponder.​linear_chassis_group.​text_2": "Kiedy jeden z nich jest przesunięty, wszystkie inne są ciągnięte za nim", + "create.​ponder.​linear_chassis_group.​text_3": "Stelaże innego typu lub postawione w innym kierunku nie zostaną połączone", + + "create.​ponder.​mechanical_arm.​header": "Ustawianie mechanicznych ramion", + "create.​ponder.​mechanical_arm.​text_1": "Wejścia i wyjścia muszą zostać przypisane do ramienia, zanim będzie można je postawić", + "create.​ponder.​mechanical_arm.​text_2": "Kliknij PPM na blok trzymając ramię, aby przypisać do niego cel", + "create.​ponder.​mechanical_arm.​text_3": "Kliknij ponownie, aby przełączyć pomiędzy wejściem (niebieski) i wyjściem (pomarańczowy)", + "create.​ponder.​mechanical_arm.​text_4": "Kliknij LPM, aby usunąć zaznaczenie", + "create.​ponder.​mechanical_arm.​text_5": "Po postawieniu, mechaniczne ramię będzie operować pomiędzy wybranymi blokami", + "create.​ponder.​mechanical_arm.​text_6": "Mogą one mieć dowolną ilość wejść i wyjść w ich zasięgu", + "create.​ponder.​mechanical_arm.​text_7": "Nie z każdym blokiem zawierającym przedmioty może ono jednak bezpośrednio pracować", + "create.​ponder.​mechanical_arm.​text_8": "Lejki i składnice mogą zapełnić tą lukę", + + "create.​ponder.​mechanical_arm_filtering.​header": "Filtrowanie wyjść z mechanicznego ramienia", + "create.​ponder.​mechanical_arm_filtering.​text_1": "Wejścia", + "create.​ponder.​mechanical_arm_filtering.​text_2": "Wyjścia", + "create.​ponder.​mechanical_arm_filtering.​text_3": "Czasami potrzebne jest ograniczenie celów ramienia przy pomocy filtra", + "create.​ponder.​mechanical_arm_filtering.​text_4": "Mechaniczne ramiona nie posiadają żadnych opcji filtrowanie same w sobie", + "create.​ponder.​mechanical_arm_filtering.​text_5": "Mosiężne lejki ustawione jako cele komunikują ramieniu informacje o swoim filtrze", + "create.​ponder.​mechanical_arm_filtering.​text_6": "Ramię jest wystarczająco mądre, aby nie podnosić przedmiotów, których nie mogłoby odstawić", + + "create.​ponder.​mechanical_arm_modes.​header": "Tryby dystrybucji mechanicznego ramienia", + "create.​ponder.​mechanical_arm_modes.​text_1": "Wejście", + "create.​ponder.​mechanical_arm_modes.​text_2": "Wyjście", + "create.​ponder.​mechanical_arm_modes.​text_3": "Kiedykolwiek ramię musi wybrać pomiędzy wieloma możliwymi wyjściami...", + "create.​ponder.​mechanical_arm_modes.​text_4": "…będzie działać zgodnie z jego ustawieniami", + "create.​ponder.​mechanical_arm_modes.​text_5": "Przewijanie trzymając klucz pozwoli ci na konfigurację", + "create.​ponder.​mechanical_arm_modes.​text_6": "Tryb 'Dookoła' zwyczajnie pozwala na cykl pomiędzy wszystkimi dostępnymi wyjściami", + "create.​ponder.​mechanical_arm_modes.​text_7": "Jeśli wyjście nie może przyjąć więcej przedmiotów, będzie ono pominięte", + "create.​ponder.​mechanical_arm_modes.​text_8": "Tryb 'Dookoła (wymuszony)' nigdy nie pominie żadnego wyjścia i poczeka, aż będzie ono wolne", + "create.​ponder.​mechanical_arm_modes.​text_9": "Tryb 'Preferuj pierwszy cel' priorytetyzuje cele ustawione przed postawieniem jako pierwsze", + + "create.​ponder.​mechanical_arm_redstone.​header": "Kontrolowanie mechanicznych ramion z użyciem Redstone'a", + "create.​ponder.​mechanical_arm_redstone.​text_1": "Kiedy zasilone, mechaniczne ramię przestanie działać", + "create.​ponder.​mechanical_arm_redstone.​text_2": "Przed zatrzymaniem, ramiona dokończą zaczętą już czynność", + "create.​ponder.​mechanical_arm_redstone.​text_3": "Chwilowe wyłączenie sygnału aktywuje więc ramię dokładnie raz", + + "create.​ponder.​mechanical_bearing.​header": "Przesuwanie struktur z użyciem mechanicznego łożyska", + "create.​ponder.​mechanical_bearing.​text_1": "Mechaniczne łożysko przyczepia do siebie blok, który jest przed nim", + "create.​ponder.​mechanical_bearing.​text_2": "W momencie otrzymania siły obrotowej, stworzy on obracającą się maszynę", + + "create.​ponder.​mechanical_crafter.​header": "Ustawianie mechanicznych stołów rzemieślniczych", + "create.​ponder.​mechanical_crafter.​text_1": "Grupa mechanicznych stołów rzemieślniczych może być użyta, aby zautomatyzować każdą recepturę", + "create.​ponder.​mechanical_crafter.​text_2": "Używając klucza, ścieżki stołów mogą zostać ułożone", + "create.​ponder.​mechanical_crafter.​text_3": "Aby układ był poprawny, wszystkie ścieżki muszą prowadzić do jednego wyjścia po dowolnej stronie", + "create.​ponder.​mechanical_crafter.​text_4": "Produkty będą umieszczone w bloku przy wyjściu", + "create.​ponder.​mechanical_crafter.​text_5": "Mechaniczne stoły rzemieślnicze wymagają siły obrotowej, aby pracować", + "create.​ponder.​mechanical_crafter.​text_6": "Kliknij PPM na ich przody, aby ręcznie włożyć tam przedmioty", + "create.​ponder.​mechanical_crafter.​text_7": "Kiedy każdy slot zawiera przedmiot, rozpocznie się proces konstruowania", + "create.​ponder.​mechanical_crafter.​text_8": "Dla receptur, które nie zajmują wszystkich slotów, start konstruowania można rozpocząć zasilając dowolny z nich", + + "create.​ponder.​mechanical_crafter_connect.​header": "Łączenie ekwipunków mechanicznych stołów rzemieślniczych", + "create.​ponder.​mechanical_crafter_connect.​text_1": "Przedmioty mogą być włożone do stołów automatycznie", + "create.​ponder.​mechanical_crafter_connect.​text_2": "Klikając na ich tył kluczem, mechaniczne stoły rzemieślnicze może połączyć ze sobą", + "create.​ponder.​mechanical_crafter_connect.​text_3": "Wszystkie połączone stoły mogą przyjmować teraz przedmioty z jednego miejsca", + + "create.​ponder.​mechanical_crafter_covers.​header": "Przykrywanie slotów mechanicznych stołów rzemieślniczych", + "create.​ponder.​mechanical_crafter_covers.​text_1": "Niektóre receptury wymagają zapełnienia dziury pomiędzy poszczególnymi stołami", + "create.​ponder.​mechanical_crafter_covers.​text_2": "Używając przykrywek na slot, można wyłączyć jeden stół z użytku. Nie będzie on przyjmował przedmiotów, ale będzie łączył sąsiadujące sloty w jedną całość", + "create.​ponder.​mechanical_crafter_covers.​text_3": "Połączone stoły również działają w przypadku przykrycia jednego ze slotów", + + "create.​ponder.​mechanical_drill.​header": "Niszczenie bloków mechanicznym wiertłem", + "create.​ponder.​mechanical_drill.​text_1": "Po otrzymaniu siły obrotowej, mechaniczne wiertło będzie niszczyć bloki bezpośrednio przed nim", + "create.​ponder.​mechanical_drill.​text_2": "Jego prędkość niszczenia zależy od prędkości siły obrotowej", + + "create.​ponder.​mechanical_drill_contraption.​header": "Używanie mechanicznych wierteł w maszynach", + "create.​ponder.​mechanical_drill_contraption.​text_1": "Kiedy wiertła są przesuwane razem z maszyną...", + "create.​ponder.​mechanical_drill_contraption.​text_2": "…zniszczą one bloki na ich drodze", + + "create.​ponder.​mechanical_harvester.​header": "Używanie mechanicznych żniwiarek w maszynach", + "create.​ponder.​mechanical_harvester.​text_1": "Kiedy żniwiarki są przesuwane razem z maszyną...", + "create.​ponder.​mechanical_harvester.​text_2": "…zbiorą one dojrzałe plony na ich drodze", + + "create.​ponder.​mechanical_mixer.​header": "Obróbka przedmiotów z użyciem mechanicznego miksera", + "create.​ponder.​mechanical_mixer.​text_1": "Używając miksera i tygla, niektóre receptury mogą być zautomatyzowane", + "create.​ponder.​mechanical_mixer.​text_2": "Dostępne są wszystkie receptury nieokreślone, plus kilka innych", + "create.​ponder.​mechanical_mixer.​text_3": "Niektóre z nich mogą wymagać użycia płomiennego palnika", + "create.​ponder.​mechanical_mixer.​text_4": "Slot filtrujący może być użyty w przypadku dwóch konfliktujących receptur", + + "create.​ponder.​mechanical_piston.​header": "Przesuwanie struktur z użyciem mechanicznego tłoka", + "create.​ponder.​mechanical_piston.​text_1": "Mechaniczny tłok może przesuwać znajdujące się przed nim bloki", + "create.​ponder.​mechanical_piston.​text_2": "Prędkość i kierunek ruchu zależy od dostarczonej siły obrotowej", + "create.​ponder.​mechanical_piston.​text_3": "Lepkie mechaniczne tłoki mogą przyciągać doczepione bloki", + + "create.​ponder.​mechanical_piston_modes.​header": "Tryby ruchu mechanicznych tłoków", + "create.​ponder.​mechanical_piston_modes.​text_1": "Kiedy tłok zatrzyma się, przesuwana struktura znów stanie się zwyczajnymi blokami", + "create.​ponder.​mechanical_piston_modes.​text_2": "Można go skonfigurować, aby bloki nigdy nie stawały się stałymi, lub tylko w pozycji początkowej", + + "create.​ponder.​mechanical_plough.​header": "Używanie mechanicznych pługów w maszynach", + "create.​ponder.​mechanical_plough.​text_1": "Kiedy pługi są przesuwane razem z maszyną...", + "create.​ponder.​mechanical_plough.​text_2": "…zniszczą one niesolidne bloki na ich drodze", + "create.​ponder.​mechanical_plough.​text_3": "Dodatkowo, pługi mogą orać pola", + "create.​ponder.​mechanical_plough.​text_4": "…mogą też odrzucać moby bez ranienia ich", + + "create.​ponder.​mechanical_press.​header": "Obróbka przedmiotów z użyciem mechanicznej prasy", + "create.​ponder.​mechanical_press.​text_1": "Mechaniczna prasa może przetwarzać przedmioty znajdujące się pod nią", + "create.​ponder.​mechanical_press.​text_2": "Przedmioty wejściowe mogą być rzucone pod prasę lub położone na składnicy", + "create.​ponder.​mechanical_press.​text_3": "Kiedy przedmioty znajdują się na taśmociągu...", + "create.​ponder.​mechanical_press.​text_4": "…prasa zatrzyma je i przetworzy - wszystko automatycznie", + + "create.​ponder.​mechanical_press_compacting.​header": "Zbijanie przedmiotów z użyciem mechanicznej prasy", + "create.​ponder.​mechanical_press_compacting.​text_1": "Prasowanie przedmiotów znajdujących się w tyglu sprawi, że staną się zbite", + "create.​ponder.​mechanical_press_compacting.​text_2": "Można w ten sposób przetworzyć każdą recepturę, która wypełnia jednym przedmiotem kwadrat 2x2 lub 3x3", + "create.​ponder.​mechanical_press_compacting.​text_3": "Niektóre z nich mogą wymagać użycia płomiennego palnika", + "create.​ponder.​mechanical_press_compacting.​text_4": "Slot filtrujący może być użyty w przypadku dwóch konfliktujących receptur", + + "create.​ponder.​mechanical_saw_breaker.​header": "Ścinanie drzew z użyciem mechanicznej piły", + "create.​ponder.​mechanical_saw_breaker.​text_1": "Po otrzymaniu siły obrotowej, mechaniczna piła zetnie każde znajdujące się przed nią drzewo", + "create.​ponder.​mechanical_saw_breaker.​text_2": "Aby całkowicie ściąć drzewo, piła musi zniszczyć każdy blok łączący je z ziemią", + + "create.​ponder.​mechanical_saw_contraption.​header": "Używanie mechanicznych pił w maszynach", + "create.​ponder.​mechanical_saw_contraption.​text_1": "Kiedy piły są przesuwane razem z maszyną...", + "create.​ponder.​mechanical_saw_contraption.​text_2": "…zetną one drzewa na ich drodze", + + "create.​ponder.​mechanical_saw_processing.​header": "Obróbka przedmiotów z użyciem mechanicznej piły", + "create.​ponder.​mechanical_saw_processing.​text_1": "Skierowana w górę mechaniczna piła może przetwarzać wiele różnych przedmiotów", + "create.​ponder.​mechanical_saw_processing.​text_2": "Przerabiany przedmiot zawsze przesuwa się przeciwnie do kierunku obrotu piły", + "create.​ponder.​mechanical_saw_processing.​text_3": "Piły mogą współpracować z taśmociągami", + "create.​ponder.​mechanical_saw_processing.​text_4": "Slot filtrujący może być użyty w przypadku dwóch konfliktujących receptur", + "create.​ponder.​mechanical_saw_processing.​text_5": "Bez ustawionego filtra, piła przejdzie przez wszystkie receptury po kolei", + + "create.​ponder.​millstone.​header": "Obróbka przedmiotów w młynku", + "create.​ponder.​millstone.​text_1": "Młynek przetwarza przedmioty mieląc je", + "create.​ponder.​millstone.​text_2": "Może być wprawiony w ruch od boku z użyciem kół zębatych", + "create.​ponder.​millstone.​text_3": "Wrzuć lub włóż przedmiot od góry", + "create.​ponder.​millstone.​text_4": "Po jakimś czasie, produkty mogą być zabrane prawym kliknięciem", + "create.​ponder.​millstone.​text_5": "…lub w zautomatyzowany sposób", + + "create.​ponder.​nixie_tube.​header": "Używanie lamp cyfrowych", + "create.​ponder.​nixie_tube.​text_1": "Kiedy zasilone, lampy cyfrowe wyświetlą siłę sygnału Redstone, jaki otrzymują", + "create.​ponder.​nixie_tube.​text_2": "Używając znaczników i kowadła można wyświetlić własny tekst", + + "create.​ponder.​piston_pole.​header": "Przedłużenia tłoka", + "create.​ponder.​piston_pole.​text_1": "Bez przyłączonych przedłużeń, mechaniczny tłok nie może się wysunąć", + "create.​ponder.​piston_pole.​text_2": "Długość przedłużenia z tyłu ustala maksymalny zasięg tłoka", + + "create.​ponder.​portable_storage_interface.​header": "Używanie przenośnych interfejsów magazynu", + "create.​ponder.​portable_storage_interface.​text_1": "Pojemniki na ruchomych maszynach nie mogą być otwarte przez gracza", + "create.​ponder.​portable_storage_interface.​text_2": "Ten komponent może współpracować z zawartością maszyny bez potrzeby jej zatrzymywania", + "create.​ponder.​portable_storage_interface.​text_3": "Postaw drugi w odstępie od 1 do 2 bloków", + "create.​ponder.​portable_storage_interface.​text_4": "Kiedy będą blisko siebie połączą się", + "create.​ponder.​portable_storage_interface.​text_5": "Kiedy są połączone, stojący interfejs będzie reprezentował wszystkie pojemniki znajdujące się na maszynie", + "create.​ponder.​portable_storage_interface.​text_6": "Przedmioty mogą być wsadzone...", + "create.​ponder.​portable_storage_interface.​text_7": "…lub wyciągnięte z maszyny", + "create.​ponder.​portable_storage_interface.​text_8": "W momencie, kiedy przed dłuższy czas żadne przedmioty nie będą wymieniane, maszyna zostanie odłączone i będzie kontynuowała swoją pracę", + + "create.​ponder.​portable_storage_interface_redstone.​header": "Kontrola Redstonem", + "create.​ponder.​portable_storage_interface_redstone.​text_1": "Zasilenie Redstonem zapobiegnie połączeniu się interfejsów", + + "create.​ponder.​powered_latch.​header": "Kontrola sygnału z użyciem zaawansowanego zasilanego przełącznika", + "create.​ponder.​powered_latch.​text_1": "Zaawansowane zasilane przełączniki to dźwignie, które można kontrolować przez Redstone", + "create.​ponder.​powered_latch.​text_2": "Sygnały otrzymane z tyłu włączają je...", + "create.​ponder.​powered_latch.​text_3": "...a sygnały od boku wyłączają", + "create.​ponder.​powered_latch.​text_4": "Zaawansowane zasilane przełączniki mogą też być przełączone ręcznie", + + "create.​ponder.​powered_toggle_latch.​header": "Kontrola sygnału z użyciem zasilanego przełącznika", + "create.​ponder.​powered_toggle_latch.​text_1": "Zasilane przełączniki to dźwignie, które można kontrolować przez Redstone", + "create.​ponder.​powered_toggle_latch.​text_2": "Sygnały otrzymane z tyłu przełączają je", + "create.​ponder.​powered_toggle_latch.​text_3": "włączone... wyłączone...", + "create.​ponder.​powered_toggle_latch.​text_4": "Zasilane przełączniki mogą też być przełączone ręcznie", + + "create.​ponder.​pulse_repeater.​header": "Kontrola sygnału z użyciem przekaźników pulsowych", + "create.​ponder.​pulse_repeater.​text_1": "Przekaźniki pulsowe skrócą dowolny sygnał do pojedynczego pulsu", + + "create.​ponder.​radial_chassis.​header": "Przyłączanie bloków z użyciem stelaża promienistego", + "create.​ponder.​radial_chassis.​text_1": "Stelaże promieniste łączą się z identycznymi stelażami w jednym rzędzie", + "create.​ponder.​radial_chassis.​text_2": "Kiedy jeden z nich jest przesunięty, wszystkie inne również się przesuwają", + "create.​ponder.​radial_chassis.​text_3": "Boczne ściany stelaży promienistych mogą zostać oblepione szlamem", + "create.​ponder.​radial_chassis.​text_4": "Kliknij ponownie, aby oblepić wszystkie strony", + "create.​ponder.​radial_chassis.​text_5": "Kliknij PPM skradając się, aby usunąć szlam", + "create.​ponder.​radial_chassis.​text_6": "Lepkie strony zabiorą ze sobą przyczepione bloki...", + "create.​ponder.​radial_chassis.​text_7": "...w określonym zasięgu", + "create.​ponder.​radial_chassis.​text_8": "Użyj klucza, aby ustawić maksymalny zasięg działania stelaża", + "create.​ponder.​radial_chassis.​text_9": "Bloki, które nie są w żaden sposób połączone z lepką stroną stelaża nie będą przesuwane", + + "create.​ponder.​redstone_contact.​header": "Przełącznik kontaktowy", + "create.​ponder.​redstone_contact.​text_1": "Przełączniki kontaktowe skierowane w swoją stronę będą emitować sygnał Redstone", + "create.​ponder.​redstone_contact.​text_2": "Działa to też w momencie, kiedy jeden z nich jest częścią ruchomej maszyny", + + "create.​ponder.​redstone_link.​header": "Używanie emiterów sygnału", + "create.​ponder.​redstone_link.​text_1": "Emitery sygnału mogą przesyłać sygnał Redstone bezprzewodowo", + "create.​ponder.​redstone_link.​text_2": "Kliknij PPM skradając się, aby przełączyć na tryb odbierania", + "create.​ponder.​redstone_link.​text_3": "Prawe kliknięcie kluczek robi dokładnie to samo", + "create.​ponder.​redstone_link.​text_4": "Odbiorniki emitują sygnał Redstone nadajników w zasięgu 128 bloków", + "create.​ponder.​redstone_link.​text_5": "Wkładając przedmioty do dwóch slotów można sprecyzować częstotliwość", + "create.​ponder.​redstone_link.​text_6": "Jedynie emitery z pasującymi częstotliwościami będą się ze sobą komunikować", + + "create.​ponder.​rope_pulley.​header": "Przesuwanie struktur z użyciem krążków z liną", + "create.​ponder.​rope_pulley.​text_1": "Krążki z liną mogę przesuwać pionowo bloki z wykorzystaniem siły obrotowej", + "create.​ponder.​rope_pulley.​text_2": "Prędkość i kierunek ruchu zależą od dostarczonej siły obrotowej", + + "create.​ponder.​rope_pulley_attachment.​header": "Przesuwanie krążków jako część maszyny", + "create.​ponder.​rope_pulley_attachment.​text_1": "Kiedy krążek jest częścią ruchomej maszyny...", + "create.​ponder.​rope_pulley_attachment.​text_2": "...przyczepiona do niego struktura również się przesunie", + "create.​ponder.​rope_pulley_attachment.​text_3": "Pamiętaj, że krążki mogą pracować jedynie, jeśli same się nie poruszają", + + "create.​ponder.​rope_pulley_modes.​header": "Tryby ruchu krążków z liną", + "create.​ponder.​rope_pulley_modes.​text_1": "Kiedy krążek przestaje się obracać, przyczepiona do niego struktura staje się z powrotem blokami", + "create.​ponder.​rope_pulley_modes.​text_2": "Można go skonfigurować, aby bloki nigdy nie stawały się stałymi, lub tylko w pozycji początkowej", + + "create.​ponder.​rotation_speed_controller.​header": "Używanie sterownika prędkości obrotu", + "create.​ponder.​rotation_speed_controller.​text_1": "Sterownik prędkości obrotu może przekazywać siłę obrotową z jego osi do dużego koła zębatego ponad nim", + "create.​ponder.​rotation_speed_controller.​text_2": "Patrząc się na jego bok i przewijając można dostosować wyjściową prędkość", + + "create.​ponder.​sail.​header": "Konstruowanie wiatraków z użyciem żagli", + "create.​ponder.​sail.​text_1": "Żagle to bloki przydatne do konstrukcji wiatraków", + "create.​ponder.​sail.​text_2": "Przyłączą się one do innych bloków i żagli, bez potrzeby użycia Super Glue lub stelaży", + "create.​ponder.​sail.​text_3": "Kliknij PPM trzymając barwnik, aby je pomalować", + "create.​ponder.​sail.​text_4": "Kliknij PPM trzymając nożyce, aby usunąć żagiel i zostawić samą ramę", + + "create.​ponder.​sail_frame.​header": "Konstrukcja wiatraków z użyciem ram żagla", + "create.​ponder.​sail_frame.​text_1": "Ramy żagla to bloki przydatne do konstrukcji wiatraków", + "create.​ponder.​sail_frame.​text_2": "Przyłączą się one do innych bloków i ram, bez potrzeby użycia Super Glue lub stelaży", + + "create.​ponder.​sequenced_gearshift.​header": "Kontrolowanie prędkości obrotu z użyciem przekładników sekwencjonalnych", + "create.​ponder.​sequenced_gearshift.​text_1": "Przekładniki sekwencjonalne przekazują obrót poprzez wyznaczoną listę instrukcji", + "create.​ponder.​sequenced_gearshift.​text_2": "Kliknij PPM, aby otworzyć interfejs", + "create.​ponder.​sequenced_gearshift.​text_3": "Kiedy zostanie zasilony Redstonem, rozpocznie wykonywać swoją ustaloną sekwencję", + "create.​ponder.​sequenced_gearshift.​text_4": "Po zakończeniu, czeka na następny sygnał i zaczyna od nowa", + "create.​ponder.​sequenced_gearshift.​text_5": "Komparator może być użyty do odczytania obecnego postępu", + + "create.​ponder.​shaft.​header": "Przekazywanie siły obrotowej z użyciem wałów", + "create.​ponder.​shaft.​text_1": "Wały przekazują siłę obrotową w linii prostej", + + "create.​ponder.​shaft_casing.​header": "Izolowanie wałów", + "create.​ponder.​shaft_casing.​text_1": "Mosiężna lub andezytowa obudowa może być użyta do udekorowania wałów", + + "create.​ponder.​smart_chute.​header": "Sortowanie przedmiotów z użyciem inteligentnych zsypów", + "create.​ponder.​smart_chute.​text_1": "Inteligentny zsyp to pionowy zsyp z dodatkową kontrolą", + "create.​ponder.​smart_chute.​text_2": "Poprzez slot filtrujący można zdecydować, które przedmioty mogą być transportowane", + "create.​ponder.​smart_chute.​text_3": "Użyj rolki w myszce, aby sprecyzować maksymalną wielkość stosu", + "create.​ponder.​smart_chute.​text_4": "Sygnał Redstone zatrzyma działanie inteligentnych zsypów", + + "create.​ponder.​speedometer.​header": "Monitorowanie prędkości obrotu z użyciem prędkościomierza", + "create.​ponder.​speedometer.​text_1": "Prędkościomierz wyświetla obecną prędkość przyłączonych komponentów", + "create.​ponder.​speedometer.​text_2": "Mając na sobie gogle inżyniera, gracz może pozyskać dodatkowe informacje z miernika", + "create.​ponder.​speedometer.​text_3": "Komparatory mogą emitować sygnał Redstone bazując na pomiarach prędkościomierza", + + "create.​ponder.​stabilized_bearings.​header": "Stabilizowanie maszyn", + "create.​ponder.​stabilized_bearings.​text_1": "Kiedy łożyska mechaniczne są częścią ruchomej maszyny...", + "create.​ponder.​stabilized_bearings.​text_2": "...będą utrzymywać swoją obrotową część w pozycji wyjściowej", + "create.​ponder.​stabilized_bearings.​text_3": "Znowu, łożysko przyłączy do siebie bloki znajdujące się przed nim", + "create.​ponder.​stabilized_bearings.​text_4": "Rezultatem tego będzie to, że pod-maszyna będzie utrzymywała się w tej samej pozycji", + + "create.​ponder.​sticker.​header": "Przyczepianie bloków z użyciem przyklejacza", + "create.​ponder.​sticker.​text_1": "Przyklejacze są idealne do kontrolowanego przez Redstone przyczepiania bloków", + "create.​ponder.​sticker.​text_2": "Po otrzymaniu sygnału, zmieni on swoje ułożenie", + "create.​ponder.​sticker.​text_3": "Jeśli jest przesunięty razem z maszyną, przyklejony blok również się przesunie", + "create.​ponder.​sticker.​text_4": "Po ponownym zasileniu blok zostanie odczepiony", + + "create.​ponder.​stressometer.​header": "Monitorowanie obciążenia z użyciem miernika obciążenia", + "create.​ponder.​stressometer.​text_1": "Miernik obciążenia wyświetla odporność na obciążenie systemu, do którego jest podłączony", + "create.​ponder.​stressometer.​text_2": "Mając na sobie gogle inżyniera, gracz może pozyskać dodatkowe informacje z miernika", + "create.​ponder.​stressometer.​text_3": "Komparatory mogą emitować sygnał Redstone bazując na pomiarach miernika", + + "create.​ponder.​super_glue.​header": "Przyklejanie bloków z użycie Super Glue", + "create.​ponder.​super_glue.​text_1": "Super Glue może zostać użyty pomiędzy dwoma blokami", + "create.​ponder.​super_glue.​text_2": "Przyklejone bloki będą przesuwane razem ze strukturą, do której są przyklejone", + "create.​ponder.​super_glue.​text_3": "Kiedy Super Glue jest trzymany w drugiej ręce...", + "create.​ponder.​super_glue.​text_4": "...stawiane bloki będą automatycznie przyklejane", + "create.​ponder.​super_glue.​text_5": "Super Glue może zostać usunięty lewym kliknięciem", + + "create.​ponder.​valve_handle.​header": "Generowanie siły obrotowej z użyciem pokręteł", + "create.​ponder.​valve_handle.​text_1": "Pokrętła mogą być użyte, aby ręcznie wytworzyć siłę obrotową bezpośrednio w miejscu postawienia", + "create.​ponder.​valve_handle.​text_2": "Trzymaj PPM, aby obrócić ją odwrotnie niż wskazówki zegara", + "create.​ponder.​valve_handle.​text_3": "Wytwarzana prędkość jest niewielka, ale pozwala na dokładny obrót", + "create.​ponder.​valve_handle.​text_4": "Trzymaj PPM skradając się, aby obrócić ją zgodnie ze wskazówkami zegara", + "create.​ponder.​valve_handle.​text_5": "Pokrętła mogą być zabarwione dla celów dekoracyjnych", + + "create.​ponder.​water_wheel.​header": "Generowanie siły obrotowej z użyciem kół wodnych", + "create.​ponder.​water_wheel.​text_1": "Koła wodne pobierają energię z prądów wodnych", + "create.​ponder.​water_wheel.​text_2": "Im więcej stron ma dostęp do wody, tym szybciej koło się będzie obracać", + "create.​ponder.​water_wheel.​text_3": "Łopaty koła wodnego powinny być zorientowane przeciwnie do prądu", + "create.​ponder.​water_wheel.​text_4": "Będąc zorientowane z prądem nie będą zbyt efektywne", + + "create.​ponder.​weighted_ejector.​header": "Używanie wyrzutni odważnikowych", + "create.​ponder.​weighted_ejector.​text_1": "Kliknij PPM skradając się i mając w ręce wyrzutnię, aby wybrać jego cel", + "create.​ponder.​weighted_ejector.​text_10": "Od teraz aktywuje się tylko w momencie, jeśli wystarczająca ilość przedmiotów znajdzie się na jego wierzchu", + "create.​ponder.​weighted_ejector.​text_11": "Inne moby zawsze zostaną wyrzucone", + "create.​ponder.​weighted_ejector.​text_2": "Postawiona wyrzutnia będzie strzelała przedmiotami w wybrane miejsce", + "create.​ponder.​weighted_ejector.​text_3": "Cel może być na dowolnej wysokości i odległości w zasięgu wyrzutni", + "create.​ponder.​weighted_ejector.​text_4": "Nie mogą być jednak przesunięte w bok", + "create.​ponder.​weighted_ejector.​text_5": "Jeśli nie wybrano żadnego celu, wyrzuci ona przedmioty na blok bezpośrednio przed sobą", + "create.​ponder.​weighted_ejector.​text_6": "Dostarcz siłę obrotową, aby ją załadować", + "create.​ponder.​weighted_ejector.​text_7": "Przedmioty znajdujące się na jej wierzchu aktywują ją", + "create.​ponder.​weighted_ejector.​text_8": "Jeśli celem jest blok mogący przechowywać przedmioty, wyrzutnia poczeka aż będzie tam miejsce", + "create.​ponder.​weighted_ejector.​text_9": "Używając klucza można wybrać wielkość stosu, jaki ma być wyrzucony", + + "create.​ponder.​weighted_ejector_redstone.​header": "Kontrolowanie wyrzutni odważnikowych z użyciem Redstone'a", + "create.​ponder.​weighted_ejector_redstone.​text_1": "Zasilona Redstonem, wyrzutnia nie aktywuje się", + "create.​ponder.​weighted_ejector_redstone.​text_2": "Ponad to, detektory mogą wykrywać, kiedy wyrzutnia się aktywuje", + + "create.​ponder.​weighted_ejector_tunnel.​header": "Rozdzielanie stosów z użyciem wyrzutni odważnikowych", + "create.​ponder.​weighted_ejector_tunnel.​text_1": "W połączeniu z mosiężnymi tunelami, wyrzutnie mogą", + "create.​ponder.​weighted_ejector_tunnel.​text_2": "Po pierwsze, ustaw tunel na tryb 'Preferuj najbliższy', aby zpriorytetyzować boczne wyjście", + "create.​ponder.​weighted_ejector_tunnel.​text_3": "Wielkość stosu ustawiona na wyrzutni ustala ilość, jaka ma być oddzielona", + "create.​ponder.​weighted_ejector_tunnel.​text_4": "W momencie, kiedy stos o określonym rozmiarze opuści tunel...", + "create.​ponder.​weighted_ejector_tunnel.​text_5": "...pozostała część będzie kontynuować swoją podróż", + + "create.​ponder.​windmill_source.​header": "Generowanie siły obrotowej z użyciem łożysk wiatraka", + "create.​ponder.​windmill_source.​text_1": "Łożysko wiatraka przyczepia do siebie bloki, które znajdują się przed nimi", + "create.​ponder.​windmill_source.​text_2": "Jeśli wystarczająco żaglo-podobnych bloków jest przyłączonych do niego, może działać jak wiatrak", + "create.​ponder.​windmill_source.​text_3": "Po aktywacji prawym kliknięciem, łożysko wiatraka zacznie generować siłę obrotową", + "create.​ponder.​windmill_source.​text_4": "Ilość żagli ustala prędkość obrotu", + "create.​ponder.​windmill_source.​text_5": "Użyj klucza, aby dostosować kierunek obrotu", + "create.​ponder.​windmill_source.​text_6": "Kliknij PPM na łożysko, aby zatrzymać obrót i zmodyfikować dołączoną strukturę", + + "create.​ponder.​windmill_structure.​header": "Wiatraki", + "create.​ponder.​windmill_structure.​text_1": "Każda struktura jest uznawana za wiatrak w momencie, kiedy ma w sobie co najmniej 8 żaglo-podobnych bloków", + + "_": "Thank you for translating Create!" + +} \ No newline at end of file From caafd3baabbdeaf31a482d1328bd45408266160f Mon Sep 17 00:00:00 2001 From: TUsama <1716976420@qq.com> Date: Wed, 28 Apr 2021 23:33:46 +0800 Subject: [PATCH 04/18] forgot it --- src/main/resources/assets/create/lang/zh_cn.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/assets/create/lang/zh_cn.json b/src/main/resources/assets/create/lang/zh_cn.json index 6de9d19a5..342ee9146 100644 --- a/src/main/resources/assets/create/lang/zh_cn.json +++ b/src/main/resources/assets/create/lang/zh_cn.json @@ -164,7 +164,7 @@ "block.create.gabbro_cobblestone_stairs": "辉长岩圆石楼梯", "block.create.gabbro_cobblestone_wall": "辉长岩圆石墙", "block.create.gabbro_pillar": "竖纹辉长岩", - "block.create.gantry_pinion": "起重机传动齿轮", + "block.create.gantry_carriage": "起重机取物器", "block.create.gantry_shaft": "起重机杆", "block.create.gearbox": "十字齿轮箱", "block.create.gearshift": "反转齿轮箱", From ab6b18e42da218f60f86dcaa6acb1b91ed24f295 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Wed, 28 Apr 2021 17:55:05 +0200 Subject: [PATCH 05/18] SoundScapes, Part III - Increased minimum sound threshold for ambient noise - Sounds for contraption (dis-)assembly - Sounds for more wrench interactions - Hand crank clicks less furiously - Block breakers now make block breaking noises - Crafting noises --- src/generated/resources/.cache/cache | 28 +++---- .../resources/assets/create/lang/en_us.json | 6 ++ .../assets/create/lang/unfinished/de_de.json | 8 +- .../assets/create/lang/unfinished/es_es.json | 8 +- .../assets/create/lang/unfinished/es_mx.json | 8 +- .../assets/create/lang/unfinished/fr_fr.json | 8 +- .../assets/create/lang/unfinished/it_it.json | 8 +- .../assets/create/lang/unfinished/ja_jp.json | 8 +- .../assets/create/lang/unfinished/ko_kr.json | 8 +- .../assets/create/lang/unfinished/nl_nl.json | 8 +- .../assets/create/lang/unfinished/pt_br.json | 8 +- .../assets/create/lang/unfinished/ru_ru.json | 8 +- .../assets/create/lang/unfinished/zh_cn.json | 8 +- .../assets/create/lang/unfinished/zh_tw.json | 8 +- .../resources/assets/create/sounds.json | 78 +++++++++++++++++++ .../com/simibubi/create/AllSoundEvents.java | 35 ++++++++- .../contraptions/base/KineticTileEntity.java | 2 +- .../BlockBreakingKineticTileEntity.java | 2 + .../BlockBreakingMovementBehaviour.java | 4 +- .../crafter/MechanicalCrafterTileEntity.java | 30 ++++++- .../components/crank/HandCrankTileEntity.java | 4 +- .../components/deployer/DeployerHandler.java | 1 + .../bearing/MechanicalBearingTileEntity.java | 7 +- .../piston/MechanicalPistonTileEntity.java | 4 + .../contraptions/wrench/IWrenchable.java | 16 ++++ .../create/foundation/sound/SoundScape.java | 2 +- 26 files changed, 278 insertions(+), 37 deletions(-) diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index 5fff6584f..448cb418c 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -407,19 +407,19 @@ a3a11524cd3515fc01d905767b4b7ea782adaf03 assets/create/blockstates/yellow_seat.j 7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json 97e9ee471ea650f6b7f3d3f39f00201cd5ad752d assets/create/lang/en_ud.json -514ab1f6fa3d24dc575a5dcaaaa96a8009da7414 assets/create/lang/en_us.json -7e45e9a69fb4d21d199174673f2ea6fe35ee6859 assets/create/lang/unfinished/de_de.json -2af0dd8cd0776b8ed5110990405f3cd515abe8e8 assets/create/lang/unfinished/es_es.json -90fc3a9475b957eebf10380a960416b072987541 assets/create/lang/unfinished/es_mx.json -997cc00c6a9afbb142e25c5a1840908363afad41 assets/create/lang/unfinished/fr_fr.json -6a9c89ff7a7c2df5f78a6a739a204744a4a5607a assets/create/lang/unfinished/it_it.json -e21697e70444e3c8fb367b7a4fe867726157390d assets/create/lang/unfinished/ja_jp.json -9f2d7b6fc84f6257837b4c517489f6ef31a4e1a5 assets/create/lang/unfinished/ko_kr.json -5bcfe026f3bb3f0aa0ea415e54dedad4195bb70a assets/create/lang/unfinished/nl_nl.json -bc60cb08266e8d13523d086cdb85aa12da78a47b assets/create/lang/unfinished/pt_br.json -288e3e76a1aa090a676415aeb9f5383b3386e40d assets/create/lang/unfinished/ru_ru.json -0b6852ca1cea71d24cfdee7004ab37fa7810a0fe assets/create/lang/unfinished/zh_cn.json -619d82eba592f4ae88ddbc2c9dfae02627876300 assets/create/lang/unfinished/zh_tw.json +de5b848a5bb52bb1c85a9123b3f3fbc084e315b8 assets/create/lang/en_us.json +77fc60d2271fe111ccd165ab936da031555a5987 assets/create/lang/unfinished/de_de.json +413556ffe8e3459b75930681f5b6923d9d90c0b6 assets/create/lang/unfinished/es_es.json +b2e5909fc6169fa68968e74d4592834f5e72ae24 assets/create/lang/unfinished/es_mx.json +aa79feefc0d9fd7006079aba9eaab882127478c3 assets/create/lang/unfinished/fr_fr.json +3eded7242f2a47068bf2298ae68dbe645ef405aa assets/create/lang/unfinished/it_it.json +88f3ced413786eea34a1344a4df8b530854f6c39 assets/create/lang/unfinished/ja_jp.json +e3f82fb1de5c4e08a3b7ea2fbecaa43183762e54 assets/create/lang/unfinished/ko_kr.json +c39e821107cced812df201720542f96bcafc3338 assets/create/lang/unfinished/nl_nl.json +0598ab0e3f20a17d8ffec9874b5165b6c40c654c assets/create/lang/unfinished/pt_br.json +bb1e3d00fc19e93813e7437a2c2cea2b0b8c2af1 assets/create/lang/unfinished/ru_ru.json +a8e0dfc2ba5b41cee05636b16b4661e96d5e8b5a assets/create/lang/unfinished/zh_cn.json +74c50139e2274be160a1bd0068f411cc6ec845d5 assets/create/lang/unfinished/zh_tw.json 487a511a01b2a4531fb672f917922312db78f958 assets/create/models/block/acacia_window.json b48060cba1a382f373a05bf0039054053eccf076 assets/create/models/block/acacia_window_pane_noside.json 3066db1bf03cffa1a9c7fbacf47ae586632f4eb3 assets/create/models/block/acacia_window_pane_noside_alt.json @@ -1648,7 +1648,7 @@ d080b1b25e5bc8baf5aee68691b08c7f12ece3b0 assets/create/models/item/windmill_bear 866fbb0ce2878a73e0440d1caf6534c8bd7c384f assets/create/models/item/zinc_ingot.json a80fb25a0b655e76be986b5b49fcb0f03461a1ab assets/create/models/item/zinc_nugget.json b1689617190c05ef34bd18456b0c7ae09bb3210f assets/create/models/item/zinc_ore.json -71739e613693c476e481dfcf38628a4f52f0f570 assets/create/sounds.json +a3214d60696bcbca721ad4b3ebbdd84ff6f6b32d assets/create/sounds.json 5d0cc4c0255dc241e61c173b31ddca70c88d08e4 data/create/advancements/aesthetics.json 187921fa131b06721bfaf63f2623a28c141aae9a data/create/advancements/andesite_alloy.json 0ea2db7173b5be28b289ea7c9a6a0cf5805c60c7 data/create/advancements/andesite_casing.json diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index 04ab46cf4..dde4ec38e 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -1154,6 +1154,8 @@ "create.subtitle.cogs": "Cogwheels rumble", "create.subtitle.slime_added": "Slime squishes", + "create.subtitle.contraption_disassemble": "Contraption stops", + "create.subtitle.wrench_rotate": "Wrench used", "create.subtitle.mixing": "Mixing Noises", "create.subtitle.mechanical_press_activation_belt": "Mechanical Press bonks", "create.subtitle.blockzapper_confirm": "Affirmative ding", @@ -1165,8 +1167,12 @@ "create.subtitle.schematicannon_finish": "Schematicannon dings", "create.subtitle.scroll_value": "Scroll-input clicks", "create.subtitle.mechanical_press_activation": "Mechanical Press clangs", + "create.subtitle.contraption_assemble": "Contraption moves", + "create.subtitle.crafter_craft": "Crafter crafts", "create.subtitle.blockzapper_deny": "Declining boop", "create.subtitle.cranking": "Hand Crank turns", + "create.subtitle.crafter_click": "Crafter clicks", + "create.subtitle.wrench_remove": "Component breaks", "create.subtitle.depot_plop": "Item lands", diff --git a/src/generated/resources/assets/create/lang/unfinished/de_de.json b/src/generated/resources/assets/create/lang/unfinished/de_de.json index cf3ae191f..1d4498a2c 100644 --- a/src/generated/resources/assets/create/lang/unfinished/de_de.json +++ b/src/generated/resources/assets/create/lang/unfinished/de_de.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 921", + "_": "Missing Localizations: 927", "_": "->------------------------] Game Elements [------------------------<-", @@ -1155,6 +1155,8 @@ "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", "create.subtitle.slime_added": "Schleim matscht", + "create.subtitle.contraption_disassemble": "UNLOCALIZED: Contraption stops", + "create.subtitle.wrench_rotate": "UNLOCALIZED: Wrench used", "create.subtitle.mixing": "UNLOCALIZED: Mixing Noises", "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", "create.subtitle.blockzapper_confirm": "Bestätigendes Ding", @@ -1166,8 +1168,12 @@ "create.subtitle.schematicannon_finish": "Bauplankanone endet", "create.subtitle.scroll_value": "UNLOCALIZED: Scroll-input clicks", "create.subtitle.mechanical_press_activation": "Mechanische Presse wird aktiviert", + "create.subtitle.contraption_assemble": "UNLOCALIZED: Contraption moves", + "create.subtitle.crafter_craft": "UNLOCALIZED: Crafter crafts", "create.subtitle.blockzapper_deny": "Ablehnendes Boop", "create.subtitle.cranking": "UNLOCALIZED: Hand Crank turns", + "create.subtitle.crafter_click": "UNLOCALIZED: Crafter clicks", + "create.subtitle.wrench_remove": "UNLOCALIZED: Component breaks", "create.subtitle.depot_plop": "UNLOCALIZED: Item lands", diff --git a/src/generated/resources/assets/create/lang/unfinished/es_es.json b/src/generated/resources/assets/create/lang/unfinished/es_es.json index 6b9899146..012220dfa 100644 --- a/src/generated/resources/assets/create/lang/unfinished/es_es.json +++ b/src/generated/resources/assets/create/lang/unfinished/es_es.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 614", + "_": "Missing Localizations: 620", "_": "->------------------------] Game Elements [------------------------<-", @@ -1155,6 +1155,8 @@ "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", "create.subtitle.slime_added": "Slime aplastado", + "create.subtitle.contraption_disassemble": "UNLOCALIZED: Contraption stops", + "create.subtitle.wrench_rotate": "UNLOCALIZED: Wrench used", "create.subtitle.mixing": "UNLOCALIZED: Mixing Noises", "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", "create.subtitle.blockzapper_confirm": "Ding afirmativo", @@ -1166,8 +1168,12 @@ "create.subtitle.schematicannon_finish": "Acabados de Schematicannon", "create.subtitle.scroll_value": "UNLOCALIZED: Scroll-input clicks", "create.subtitle.mechanical_press_activation": "La Prensa Mecánica se activa", + "create.subtitle.contraption_assemble": "UNLOCALIZED: Contraption moves", + "create.subtitle.crafter_craft": "UNLOCALIZED: Crafter crafts", "create.subtitle.blockzapper_deny": "Boop declinante", "create.subtitle.cranking": "UNLOCALIZED: Hand Crank turns", + "create.subtitle.crafter_click": "UNLOCALIZED: Crafter clicks", + "create.subtitle.wrench_remove": "UNLOCALIZED: Component breaks", "create.subtitle.depot_plop": "UNLOCALIZED: Item lands", diff --git a/src/generated/resources/assets/create/lang/unfinished/es_mx.json b/src/generated/resources/assets/create/lang/unfinished/es_mx.json index 76705092c..4fd59a9f5 100644 --- a/src/generated/resources/assets/create/lang/unfinished/es_mx.json +++ b/src/generated/resources/assets/create/lang/unfinished/es_mx.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1272", + "_": "Missing Localizations: 1278", "_": "->------------------------] Game Elements [------------------------<-", @@ -1155,6 +1155,8 @@ "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", "create.subtitle.slime_added": "UNLOCALIZED: Slime squishes", + "create.subtitle.contraption_disassemble": "UNLOCALIZED: Contraption stops", + "create.subtitle.wrench_rotate": "UNLOCALIZED: Wrench used", "create.subtitle.mixing": "UNLOCALIZED: Mixing Noises", "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", "create.subtitle.blockzapper_confirm": "UNLOCALIZED: Affirmative ding", @@ -1166,8 +1168,12 @@ "create.subtitle.schematicannon_finish": "UNLOCALIZED: Schematicannon dings", "create.subtitle.scroll_value": "UNLOCALIZED: Scroll-input clicks", "create.subtitle.mechanical_press_activation": "UNLOCALIZED: Mechanical Press clangs", + "create.subtitle.contraption_assemble": "UNLOCALIZED: Contraption moves", + "create.subtitle.crafter_craft": "UNLOCALIZED: Crafter crafts", "create.subtitle.blockzapper_deny": "UNLOCALIZED: Declining boop", "create.subtitle.cranking": "UNLOCALIZED: Hand Crank turns", + "create.subtitle.crafter_click": "UNLOCALIZED: Crafter clicks", + "create.subtitle.wrench_remove": "UNLOCALIZED: Component breaks", "create.subtitle.depot_plop": "UNLOCALIZED: Item lands", diff --git a/src/generated/resources/assets/create/lang/unfinished/fr_fr.json b/src/generated/resources/assets/create/lang/unfinished/fr_fr.json index 7de31748c..b59bbd5f4 100644 --- a/src/generated/resources/assets/create/lang/unfinished/fr_fr.json +++ b/src/generated/resources/assets/create/lang/unfinished/fr_fr.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1171", + "_": "Missing Localizations: 1177", "_": "->------------------------] Game Elements [------------------------<-", @@ -1155,6 +1155,8 @@ "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", "create.subtitle.slime_added": "Bruit de slime", + "create.subtitle.contraption_disassemble": "UNLOCALIZED: Contraption stops", + "create.subtitle.wrench_rotate": "UNLOCALIZED: Wrench used", "create.subtitle.mixing": "UNLOCALIZED: Mixing Noises", "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", "create.subtitle.blockzapper_confirm": "Ding d'affirmation", @@ -1166,8 +1168,12 @@ "create.subtitle.schematicannon_finish": "Fin de schémacanon", "create.subtitle.scroll_value": "UNLOCALIZED: Scroll-input clicks", "create.subtitle.mechanical_press_activation": "Activation de la presse mechanique", + "create.subtitle.contraption_assemble": "UNLOCALIZED: Contraption moves", + "create.subtitle.crafter_craft": "UNLOCALIZED: Crafter crafts", "create.subtitle.blockzapper_deny": "Boop de déclin", "create.subtitle.cranking": "UNLOCALIZED: Hand Crank turns", + "create.subtitle.crafter_click": "UNLOCALIZED: Crafter clicks", + "create.subtitle.wrench_remove": "UNLOCALIZED: Component breaks", "create.subtitle.depot_plop": "UNLOCALIZED: Item lands", diff --git a/src/generated/resources/assets/create/lang/unfinished/it_it.json b/src/generated/resources/assets/create/lang/unfinished/it_it.json index c306ac7a8..eef42803f 100644 --- a/src/generated/resources/assets/create/lang/unfinished/it_it.json +++ b/src/generated/resources/assets/create/lang/unfinished/it_it.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 631", + "_": "Missing Localizations: 637", "_": "->------------------------] Game Elements [------------------------<-", @@ -1155,6 +1155,8 @@ "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", "create.subtitle.slime_added": "Slime schiacciato", + "create.subtitle.contraption_disassemble": "UNLOCALIZED: Contraption stops", + "create.subtitle.wrench_rotate": "UNLOCALIZED: Wrench used", "create.subtitle.mixing": "UNLOCALIZED: Mixing Noises", "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", "create.subtitle.blockzapper_confirm": "Ding affermativo", @@ -1166,8 +1168,12 @@ "create.subtitle.schematicannon_finish": "Finiture cannoneschematico", "create.subtitle.scroll_value": "UNLOCALIZED: Scroll-input clicks", "create.subtitle.mechanical_press_activation": "Pressa meccanica attiva", + "create.subtitle.contraption_assemble": "UNLOCALIZED: Contraption moves", + "create.subtitle.crafter_craft": "UNLOCALIZED: Crafter crafts", "create.subtitle.blockzapper_deny": "Boop in calo", "create.subtitle.cranking": "UNLOCALIZED: Hand Crank turns", + "create.subtitle.crafter_click": "UNLOCALIZED: Crafter clicks", + "create.subtitle.wrench_remove": "UNLOCALIZED: Component breaks", "create.subtitle.depot_plop": "UNLOCALIZED: Item lands", diff --git a/src/generated/resources/assets/create/lang/unfinished/ja_jp.json b/src/generated/resources/assets/create/lang/unfinished/ja_jp.json index 1847cbfab..dd556f5a6 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ja_jp.json +++ b/src/generated/resources/assets/create/lang/unfinished/ja_jp.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 613", + "_": "Missing Localizations: 619", "_": "->------------------------] Game Elements [------------------------<-", @@ -1155,6 +1155,8 @@ "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", "create.subtitle.slime_added": "スライムがぐしゃっとつぶれる", + "create.subtitle.contraption_disassemble": "UNLOCALIZED: Contraption stops", + "create.subtitle.wrench_rotate": "UNLOCALIZED: Wrench used", "create.subtitle.mixing": "UNLOCALIZED: Mixing Noises", "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", "create.subtitle.blockzapper_confirm": "成功音", @@ -1166,8 +1168,12 @@ "create.subtitle.schematicannon_finish": "概略図砲が作業を終える", "create.subtitle.scroll_value": "UNLOCALIZED: Scroll-input clicks", "create.subtitle.mechanical_press_activation": "メカニカルプレスが作動する", + "create.subtitle.contraption_assemble": "UNLOCALIZED: Contraption moves", + "create.subtitle.crafter_craft": "UNLOCALIZED: Crafter crafts", "create.subtitle.blockzapper_deny": "失敗音", "create.subtitle.cranking": "UNLOCALIZED: Hand Crank turns", + "create.subtitle.crafter_click": "UNLOCALIZED: Crafter clicks", + "create.subtitle.wrench_remove": "UNLOCALIZED: Component breaks", "create.subtitle.depot_plop": "UNLOCALIZED: Item lands", diff --git a/src/generated/resources/assets/create/lang/unfinished/ko_kr.json b/src/generated/resources/assets/create/lang/unfinished/ko_kr.json index 560628b7e..0191967b5 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ko_kr.json +++ b/src/generated/resources/assets/create/lang/unfinished/ko_kr.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 684", + "_": "Missing Localizations: 690", "_": "->------------------------] Game Elements [------------------------<-", @@ -1155,6 +1155,8 @@ "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", "create.subtitle.slime_added": "슬라임이 철퍽거림", + "create.subtitle.contraption_disassemble": "UNLOCALIZED: Contraption stops", + "create.subtitle.wrench_rotate": "UNLOCALIZED: Wrench used", "create.subtitle.mixing": "UNLOCALIZED: Mixing Noises", "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", "create.subtitle.blockzapper_confirm": "확인 효과음", @@ -1166,8 +1168,12 @@ "create.subtitle.schematicannon_finish": "청사진 대포가 끝남", "create.subtitle.scroll_value": "UNLOCALIZED: Scroll-input clicks", "create.subtitle.mechanical_press_activation": "압착기가 가동됨", + "create.subtitle.contraption_assemble": "UNLOCALIZED: Contraption moves", + "create.subtitle.crafter_craft": "UNLOCALIZED: Crafter crafts", "create.subtitle.blockzapper_deny": "취소 효과음", "create.subtitle.cranking": "UNLOCALIZED: Hand Crank turns", + "create.subtitle.crafter_click": "UNLOCALIZED: Crafter clicks", + "create.subtitle.wrench_remove": "UNLOCALIZED: Component breaks", "create.subtitle.depot_plop": "UNLOCALIZED: Item lands", diff --git a/src/generated/resources/assets/create/lang/unfinished/nl_nl.json b/src/generated/resources/assets/create/lang/unfinished/nl_nl.json index fd213b6f6..91eca1428 100644 --- a/src/generated/resources/assets/create/lang/unfinished/nl_nl.json +++ b/src/generated/resources/assets/create/lang/unfinished/nl_nl.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1561", + "_": "Missing Localizations: 1567", "_": "->------------------------] Game Elements [------------------------<-", @@ -1155,6 +1155,8 @@ "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", "create.subtitle.slime_added": "UNLOCALIZED: Slime squishes", + "create.subtitle.contraption_disassemble": "UNLOCALIZED: Contraption stops", + "create.subtitle.wrench_rotate": "UNLOCALIZED: Wrench used", "create.subtitle.mixing": "UNLOCALIZED: Mixing Noises", "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", "create.subtitle.blockzapper_confirm": "UNLOCALIZED: Affirmative ding", @@ -1166,8 +1168,12 @@ "create.subtitle.schematicannon_finish": "UNLOCALIZED: Schematicannon dings", "create.subtitle.scroll_value": "UNLOCALIZED: Scroll-input clicks", "create.subtitle.mechanical_press_activation": "UNLOCALIZED: Mechanical Press clangs", + "create.subtitle.contraption_assemble": "UNLOCALIZED: Contraption moves", + "create.subtitle.crafter_craft": "UNLOCALIZED: Crafter crafts", "create.subtitle.blockzapper_deny": "UNLOCALIZED: Declining boop", "create.subtitle.cranking": "UNLOCALIZED: Hand Crank turns", + "create.subtitle.crafter_click": "UNLOCALIZED: Crafter clicks", + "create.subtitle.wrench_remove": "UNLOCALIZED: Component breaks", "create.subtitle.depot_plop": "UNLOCALIZED: Item lands", diff --git a/src/generated/resources/assets/create/lang/unfinished/pt_br.json b/src/generated/resources/assets/create/lang/unfinished/pt_br.json index d29401108..36899f42b 100644 --- a/src/generated/resources/assets/create/lang/unfinished/pt_br.json +++ b/src/generated/resources/assets/create/lang/unfinished/pt_br.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1615", + "_": "Missing Localizations: 1621", "_": "->------------------------] Game Elements [------------------------<-", @@ -1155,6 +1155,8 @@ "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", "create.subtitle.slime_added": "UNLOCALIZED: Slime squishes", + "create.subtitle.contraption_disassemble": "UNLOCALIZED: Contraption stops", + "create.subtitle.wrench_rotate": "UNLOCALIZED: Wrench used", "create.subtitle.mixing": "UNLOCALIZED: Mixing Noises", "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", "create.subtitle.blockzapper_confirm": "UNLOCALIZED: Affirmative ding", @@ -1166,8 +1168,12 @@ "create.subtitle.schematicannon_finish": "UNLOCALIZED: Schematicannon dings", "create.subtitle.scroll_value": "UNLOCALIZED: Scroll-input clicks", "create.subtitle.mechanical_press_activation": "UNLOCALIZED: Mechanical Press clangs", + "create.subtitle.contraption_assemble": "UNLOCALIZED: Contraption moves", + "create.subtitle.crafter_craft": "UNLOCALIZED: Crafter crafts", "create.subtitle.blockzapper_deny": "UNLOCALIZED: Declining boop", "create.subtitle.cranking": "UNLOCALIZED: Hand Crank turns", + "create.subtitle.crafter_click": "UNLOCALIZED: Crafter clicks", + "create.subtitle.wrench_remove": "UNLOCALIZED: Component breaks", "create.subtitle.depot_plop": "UNLOCALIZED: Item lands", diff --git a/src/generated/resources/assets/create/lang/unfinished/ru_ru.json b/src/generated/resources/assets/create/lang/unfinished/ru_ru.json index 4e61e7a7c..89c218e6d 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ru_ru.json +++ b/src/generated/resources/assets/create/lang/unfinished/ru_ru.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 528", + "_": "Missing Localizations: 534", "_": "->------------------------] Game Elements [------------------------<-", @@ -1155,6 +1155,8 @@ "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", "create.subtitle.slime_added": "Намазывание слизи", + "create.subtitle.contraption_disassemble": "UNLOCALIZED: Contraption stops", + "create.subtitle.wrench_rotate": "UNLOCALIZED: Wrench used", "create.subtitle.mixing": "UNLOCALIZED: Mixing Noises", "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", "create.subtitle.blockzapper_confirm": "Утвердительный динь", @@ -1166,8 +1168,12 @@ "create.subtitle.schematicannon_finish": "Схематичная пушка закончила работу", "create.subtitle.scroll_value": "UNLOCALIZED: Scroll-input clicks", "create.subtitle.mechanical_press_activation": "Механический пресс активирован", + "create.subtitle.contraption_assemble": "UNLOCALIZED: Contraption moves", + "create.subtitle.crafter_craft": "UNLOCALIZED: Crafter crafts", "create.subtitle.blockzapper_deny": "Тихий буп", "create.subtitle.cranking": "UNLOCALIZED: Hand Crank turns", + "create.subtitle.crafter_click": "UNLOCALIZED: Crafter clicks", + "create.subtitle.wrench_remove": "UNLOCALIZED: Component breaks", "create.subtitle.depot_plop": "UNLOCALIZED: Item lands", diff --git a/src/generated/resources/assets/create/lang/unfinished/zh_cn.json b/src/generated/resources/assets/create/lang/unfinished/zh_cn.json index ef0da1165..e557f4c8b 100644 --- a/src/generated/resources/assets/create/lang/unfinished/zh_cn.json +++ b/src/generated/resources/assets/create/lang/unfinished/zh_cn.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 628", + "_": "Missing Localizations: 634", "_": "->------------------------] Game Elements [------------------------<-", @@ -1155,6 +1155,8 @@ "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", "create.subtitle.slime_added": "粘液:挤碎声", + "create.subtitle.contraption_disassemble": "UNLOCALIZED: Contraption stops", + "create.subtitle.wrench_rotate": "UNLOCALIZED: Wrench used", "create.subtitle.mixing": "UNLOCALIZED: Mixing Noises", "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", "create.subtitle.blockzapper_confirm": "选择方块", @@ -1166,8 +1168,12 @@ "create.subtitle.schematicannon_finish": "蓝图加农炮:完成任务", "create.subtitle.scroll_value": "UNLOCALIZED: Scroll-input clicks", "create.subtitle.mechanical_press_activation": "辊压机:工作中", + "create.subtitle.contraption_assemble": "UNLOCALIZED: Contraption moves", + "create.subtitle.crafter_craft": "UNLOCALIZED: Crafter crafts", "create.subtitle.blockzapper_deny": "放置失败", "create.subtitle.cranking": "UNLOCALIZED: Hand Crank turns", + "create.subtitle.crafter_click": "UNLOCALIZED: Crafter clicks", + "create.subtitle.wrench_remove": "UNLOCALIZED: Component breaks", "create.subtitle.depot_plop": "UNLOCALIZED: Item lands", diff --git a/src/generated/resources/assets/create/lang/unfinished/zh_tw.json b/src/generated/resources/assets/create/lang/unfinished/zh_tw.json index e7fb6b633..a6cca6523 100644 --- a/src/generated/resources/assets/create/lang/unfinished/zh_tw.json +++ b/src/generated/resources/assets/create/lang/unfinished/zh_tw.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 633", + "_": "Missing Localizations: 639", "_": "->------------------------] Game Elements [------------------------<-", @@ -1155,6 +1155,8 @@ "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", "create.subtitle.slime_added": "黏液擠壓", + "create.subtitle.contraption_disassemble": "UNLOCALIZED: Contraption stops", + "create.subtitle.wrench_rotate": "UNLOCALIZED: Wrench used", "create.subtitle.mixing": "UNLOCALIZED: Mixing Noises", "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", "create.subtitle.blockzapper_confirm": "選擇方塊", @@ -1166,8 +1168,12 @@ "create.subtitle.schematicannon_finish": "藍圖大炮完成任務", "create.subtitle.scroll_value": "UNLOCALIZED: Scroll-input clicks", "create.subtitle.mechanical_press_activation": "液壓機工作", + "create.subtitle.contraption_assemble": "UNLOCALIZED: Contraption moves", + "create.subtitle.crafter_craft": "UNLOCALIZED: Crafter crafts", "create.subtitle.blockzapper_deny": "放置失敗", "create.subtitle.cranking": "UNLOCALIZED: Hand Crank turns", + "create.subtitle.crafter_click": "UNLOCALIZED: Crafter clicks", + "create.subtitle.wrench_remove": "UNLOCALIZED: Component breaks", "create.subtitle.depot_plop": "UNLOCALIZED: Item lands", diff --git a/src/generated/resources/assets/create/sounds.json b/src/generated/resources/assets/create/sounds.json index 9ce292b97..aea8a9701 100644 --- a/src/generated/resources/assets/create/sounds.json +++ b/src/generated/resources/assets/create/sounds.json @@ -41,6 +41,58 @@ ], "subtitle": "create.subtitle.cogs" }, + "contraption_assemble": { + "sounds": [ + { + "name": "minecraft:block.wooden_trapdoor.open", + "type": "event" + } + ], + "subtitle": "create.subtitle.contraption_assemble" + }, + "contraption_assemble_compounded_1": { + "sounds": [ + { + "name": "minecraft:block.chest.open", + "type": "event" + } + ] + }, + "contraption_disassemble": { + "sounds": [ + { + "name": "minecraft:block.iron_trapdoor.close", + "type": "event" + } + ], + "subtitle": "create.subtitle.contraption_disassemble" + }, + "crafter_click": { + "sounds": [ + { + "name": "minecraft:block.netherite_block.hit", + "type": "event" + } + ], + "subtitle": "create.subtitle.crafter_click" + }, + "crafter_click_compounded_1": { + "sounds": [ + { + "name": "minecraft:block.wooden_trapdoor.open", + "type": "event" + } + ] + }, + "crafter_craft": { + "sounds": [ + { + "name": "minecraft:entity.item.break", + "type": "event" + } + ], + "subtitle": "create.subtitle.crafter_craft" + }, "cranking": { "sounds": [ { @@ -179,5 +231,31 @@ } ], "subtitle": "create.subtitle.slime_added" + }, + "wrench_remove": { + "sounds": [ + { + "name": "minecraft:entity.item.pickup", + "type": "event" + } + ], + "subtitle": "create.subtitle.wrench_remove" + }, + "wrench_remove_compounded_1": { + "sounds": [ + { + "name": "minecraft:block.netherite_block.hit", + "type": "event" + } + ] + }, + "wrench_rotate": { + "sounds": [ + { + "name": "minecraft:block.wooden_trapdoor.close", + "type": "event" + } + ], + "subtitle": "create.subtitle.wrench_rotate" } } \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/AllSoundEvents.java b/src/main/java/com/simibubi/create/AllSoundEvents.java index d6af82c45..51f00ef71 100644 --- a/src/main/java/com/simibubi/create/AllSoundEvents.java +++ b/src/main/java/com/simibubi/create/AllSoundEvents.java @@ -95,7 +95,7 @@ public class AllSoundEvents { .playExisting(SoundEvents.BLOCK_NOTE_BLOCK_BASEDRUM) .category(SoundCategory.PLAYERS) .build(), - + SCROLL_VALUE = create("scroll_value").subtitle("Scroll-input clicks") .playExisting(SoundEvents.BLOCK_NOTE_BLOCK_HAT, .124f, 1f) .category(SoundCategory.PLAYERS) @@ -115,6 +115,39 @@ public class AllSoundEvents { .category(SoundCategory.BLOCKS) .build(), + CONTRAPTION_ASSEMBLE = create("contraption_assemble").subtitle("Contraption moves") + .playExisting(SoundEvents.BLOCK_WOODEN_TRAPDOOR_OPEN, .5f, .5f) + .playExisting(SoundEvents.BLOCK_CHEST_OPEN, .045f, .74f) + .category(SoundCategory.BLOCKS) + .build(), + + CONTRAPTION_DISASSEMBLE = create("contraption_disassemble").subtitle("Contraption stops") + .playExisting(SoundEvents.BLOCK_IRON_TRAPDOOR_CLOSE, .35f, .75f) + .category(SoundCategory.BLOCKS) + .build(), + + WRENCH_ROTATE = create("wrench_rotate").subtitle("Wrench used") + .playExisting(SoundEvents.BLOCK_WOODEN_TRAPDOOR_CLOSE, .25f, 1.25f) + .category(SoundCategory.BLOCKS) + .build(), + + WRENCH_REMOVE = create("wrench_remove").subtitle("Component breaks") + .playExisting(SoundEvents.ENTITY_ITEM_PICKUP, .25f, .75f) + .playExisting(SoundEvents.BLOCK_NETHERITE_BLOCK_HIT, .25f, .75f) + .category(SoundCategory.BLOCKS) + .build(), + + CRAFTER_CLICK = create("crafter_click").subtitle("Crafter clicks") + .playExisting(SoundEvents.BLOCK_NETHERITE_BLOCK_HIT, .25f, 1) + .playExisting(SoundEvents.BLOCK_WOODEN_TRAPDOOR_OPEN, .125f, 1) + .category(SoundCategory.BLOCKS) + .build(), + + CRAFTER_CRAFT = create("crafter_craft").subtitle("Crafter crafts") + .playExisting(SoundEvents.ENTITY_ITEM_BREAK, .125f, .75f) + .category(SoundCategory.BLOCKS) + .build(), + BLAZE_MUNCH = create("blaze_munch").subtitle("Blaze Burner munches") .playExisting(SoundEvents.ENTITY_GENERIC_EAT, .5f, 1f) .category(SoundCategory.BLOCKS) diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java index d6dfbbdeb..93058fb64 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java @@ -581,7 +581,7 @@ public abstract class KineticTileEntity extends SmartTileEntity SoundScapes.playGeneralKineticAmbience(pos, pitch); Block block = getBlockState().getBlock(); - if (ICogWheel.isSmallCog(block) || ICogWheel.isSmallCog(block) || block instanceof GearboxBlock) + if (ICogWheel.isSmallCog(block) || ICogWheel.isLargeCog(block) || block instanceof GearboxBlock) SoundScapes.playCogwheelAmbience(pos, pitch); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/BlockBreakingKineticTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/BlockBreakingKineticTileEntity.java index 35af25c77..a74d1a200 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/BlockBreakingKineticTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/BlockBreakingKineticTileEntity.java @@ -15,6 +15,7 @@ import net.minecraft.nbt.CompoundNBT; import net.minecraft.nbt.NBTUtil; import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntityType; +import net.minecraft.util.SoundCategory; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.vector.Vector3d; @@ -113,6 +114,7 @@ public abstract class BlockBreakingKineticTileEntity extends KineticTileEntity { float breakSpeed = getBreakSpeed(); destroyProgress += MathHelper.clamp((int) (breakSpeed / blockHardness), 1, 10 - destroyProgress); + world.playSound(null, pos, stateToBreak.getSoundType().getHitSound(), SoundCategory.NEUTRAL, .25f, 1); if (destroyProgress >= 10) { onBlockBroken(stateToBreak); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/BlockBreakingMovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/BlockBreakingMovementBehaviour.java index 8ce6019aa..14c090563 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/BlockBreakingMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/BlockBreakingMovementBehaviour.java @@ -14,6 +14,7 @@ import net.minecraft.entity.player.PlayerEntity; import net.minecraft.nbt.CompoundNBT; import net.minecraft.nbt.NBTUtil; import net.minecraft.util.DamageSource; +import net.minecraft.util.SoundCategory; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; @@ -164,7 +165,8 @@ public class BlockBreakingMovementBehaviour extends MovementBehaviour { float breakSpeed = MathHelper.clamp(Math.abs(context.getAnimationSpeed()) / 500f, 1 / 128f, 16f); destroyProgress += MathHelper.clamp((int) (breakSpeed / blockHardness), 1, 10 - destroyProgress); - + world.playSound(null, breakingPos, stateToBreak.getSoundType().getHitSound(), SoundCategory.NEUTRAL, .25f, 1); + if (destroyProgress >= 10) { world.sendBlockBreakProgress(id, breakingPos, -1); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterTileEntity.java index 27b54f003..1f64d7ac3 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterTileEntity.java @@ -11,6 +11,7 @@ import org.apache.commons.lang3.tuple.Pair; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllItems; +import com.simibubi.create.AllSoundEvents; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.components.crafter.ConnectedInputHandler.ConnectedInput; import com.simibubi.create.content.contraptions.components.crafter.RecipeGridHandler.GroupedItems; @@ -31,6 +32,8 @@ import net.minecraft.particles.ItemParticleData; import net.minecraft.particles.ParticleTypes; import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.Direction; +import net.minecraft.util.SoundCategory; +import net.minecraft.util.SoundEvents; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.vector.Vector3d; @@ -67,7 +70,12 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity { return stack; if (te.covered) return stack; - return super.insertItem(slot, stack, simulate); + ItemStack insertItem = super.insertItem(slot, stack, simulate); + if (insertItem.getCount() != stack.getCount() && !simulate) + te.getWorld() + .playSound(null, te.getPos(), SoundEvents.ENTITY_ITEM_FRAME_ADD_ITEM, SoundCategory.BLOCKS, .25f, + .5f); + return insertItem; } } @@ -173,10 +181,12 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity { groupedItemsBeforeCraft = before; if (phaseBefore == Phase.EXPORTING && phase == Phase.WAITING) { Direction facing = getBlockState().get(MechanicalCrafterBlock.HORIZONTAL_FACING); - Vector3d vec = Vector3d.of(facing.getDirectionVec()).scale(.75) + Vector3d vec = Vector3d.of(facing.getDirectionVec()) + .scale(.75) .add(VecHelper.getCenterOf(pos)); Direction targetDirection = MechanicalCrafterBlock.getTargetDirection(getBlockState()); - vec = vec.add(Vector3d.of(targetDirection.getDirectionVec()).scale(1)); + vec = vec.add(Vector3d.of(targetDirection.getDirectionVec()) + .scale(1)); world.addParticle(ParticleTypes.CRIT, vec.x, vec.y, vec.z, 0, 0, 0); } } @@ -275,6 +285,10 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity { Pointing pointing = getBlockState().get(MechanicalCrafterBlock.POINTING); groupedItems.mergeOnto(targetingCrafter.groupedItems, pointing); groupedItems = new GroupedItems(); + + float pitch = targetingCrafter.groupedItems.grid.size() * 1/16f + .5f; + AllSoundEvents.CRAFTER_CLICK.playOnServer(world, pos, 1, pitch); + phase = Phase.WAITING; countDown = 0; sendData(); @@ -319,7 +333,14 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity { } } + int prev = countDown; countDown -= getCountDownSpeed(); + + if (countDown < 1000 && prev >= 1000) { + AllSoundEvents.CRAFTER_CLICK.playOnServer(world, pos, 1, 2); + AllSoundEvents.CRAFTER_CRAFT.playOnServer(world, pos); + } + if (countDown < 0) { countDown = 0; if (!runLogic) @@ -391,7 +412,8 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity { BlockState blockState = getBlockState(); boolean present = AllBlocks.MECHANICAL_CRAFTER.has(blockState); Vector3d vec = present ? Vector3d.of(blockState.get(HORIZONTAL_FACING) - .getDirectionVec()).scale(.75f) : Vector3d.ZERO; + .getDirectionVec()) + .scale(.75f) : Vector3d.ZERO; Vector3d ejectPos = VecHelper.getCenterOf(pos) .add(vec); groupedItems.grid.forEach((pair, stack) -> dropItem(ejectPos, stack)); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankTileEntity.java index 568030a94..a058b740c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankTileEntity.java @@ -84,10 +84,10 @@ public class HandCrankTileEntity extends GeneratingKineticTileEntity { @Override public void tickAudio() { super.tickAudio(); - if (inUse > 0 && AnimationTickHolder.getTicks() % 2 == 0) { + if (inUse > 0 && AnimationTickHolder.getTicks() % 10 == 0) { if (!AllBlocks.HAND_CRANK.has(getBlockState())) return; - AllSoundEvents.CRANKING.playAt(world, pos, (inUse) / 5f, .65f + (10 - inUse) / 10f, true); + AllSoundEvents.CRANKING.playAt(world, pos, (inUse) / 2.5f, .65f + (10 - inUse) / 10f, true); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerHandler.java b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerHandler.java index 2c6f55d18..9500a1ea5 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerHandler.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerHandler.java @@ -215,6 +215,7 @@ public class DeployerHandler { if (blockBreakingProgress != null) before = blockBreakingProgress.getValue(); progress += before; + world.playSound(null, clickedPos, clickedState.getSoundType().getHitSound(), SoundCategory.NEUTRAL, .25f, 1); if (progress >= 1) { tryHarvestBlock(player.interactionManager, clickedPos); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/MechanicalBearingTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/MechanicalBearingTileEntity.java index 239880bc0..d7ed6958b 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/MechanicalBearingTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/MechanicalBearingTileEntity.java @@ -4,6 +4,7 @@ import static net.minecraft.state.properties.BlockStateProperties.FACING; import java.util.List; +import com.simibubi.create.AllSoundEvents; import com.simibubi.create.content.contraptions.base.GeneratingKineticTileEntity; import com.simibubi.create.content.contraptions.components.structureMovement.AbstractContraptionEntity; import com.simibubi.create.content.contraptions.components.structureMovement.AssemblyException; @@ -168,6 +169,8 @@ public class MechanicalBearingTileEntity extends GeneratingKineticTileEntity movedContraption.setPosition(anchor.getX(), anchor.getY(), anchor.getZ()); movedContraption.setRotationAxis(direction.getAxis()); world.addEntity(movedContraption); + + AllSoundEvents.CONTRAPTION_ASSEMBLE.playOnServer(world, pos); running = true; angle = 0; @@ -181,8 +184,10 @@ public class MechanicalBearingTileEntity extends GeneratingKineticTileEntity angle = 0; if (isWindmill()) applyRotation(); - if (movedContraption != null) + if (movedContraption != null) { movedContraption.disassemble(); + AllSoundEvents.CONTRAPTION_DISASSEMBLE.playOnServer(world, pos); + } movedContraption = null; running = false; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/MechanicalPistonTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/MechanicalPistonTileEntity.java index bad6186c7..bad9651ef 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/MechanicalPistonTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/MechanicalPistonTileEntity.java @@ -1,6 +1,7 @@ package com.simibubi.create.content.contraptions.components.structureMovement.piston; import com.simibubi.create.AllBlocks; +import com.simibubi.create.AllSoundEvents; import com.simibubi.create.content.contraptions.base.IRotate; import com.simibubi.create.content.contraptions.components.structureMovement.AssemblyException; import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionCollider; @@ -83,6 +84,8 @@ public class MechanicalPistonTileEntity extends LinearActuatorTileEntity { applyContraptionPosition(); forceMove = true; world.addEntity(movedContraption); + + AllSoundEvents.CONTRAPTION_ASSEMBLE.playOnServer(world, pos); } @Override @@ -95,6 +98,7 @@ public class MechanicalPistonTileEntity extends LinearActuatorTileEntity { if (movedContraption != null) { applyContraptionPosition(); movedContraption.disassemble(); + AllSoundEvents.CONTRAPTION_DISASSEMBLE.playOnServer(world, pos); } running = false; movedContraption = null; diff --git a/src/main/java/com/simibubi/create/content/contraptions/wrench/IWrenchable.java b/src/main/java/com/simibubi/create/content/contraptions/wrench/IWrenchable.java index 5c28aef5a..8d1b30216 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/wrench/IWrenchable.java +++ b/src/main/java/com/simibubi/create/content/contraptions/wrench/IWrenchable.java @@ -1,5 +1,7 @@ package com.simibubi.create.content.contraptions.wrench; +import com.simibubi.create.AllSoundEvents; +import com.simibubi.create.Create; import com.simibubi.create.content.contraptions.base.DirectionalAxisKineticBlock; import com.simibubi.create.content.contraptions.base.DirectionalKineticBlock; import com.simibubi.create.content.contraptions.base.GeneratingKineticTileEntity; @@ -18,6 +20,8 @@ import net.minecraft.item.ItemUseContext; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ActionResultType; import net.minecraft.util.Direction; +import net.minecraft.util.SoundCategory; +import net.minecraft.util.SoundEvents; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraft.world.server.ServerWorld; @@ -40,6 +44,9 @@ public interface IWrenchable { ((GeneratingKineticTileEntity) te).reActivateSource = true; } + if (world.getBlockState(context.getPos()) != state) + playRotateSound(world, context.getPos()); + return ActionResultType.SUCCESS; } @@ -60,10 +67,19 @@ public interface IWrenchable { }); state.spawnAdditionalDrops((ServerWorld) world, pos, ItemStack.EMPTY); world.destroyBlock(pos, false); + playRemoveSound(world, pos); } return ActionResultType.SUCCESS; } + default void playRemoveSound(World world, BlockPos pos) { + AllSoundEvents.WRENCH_REMOVE.playOnServer(world, pos, 1, Create.random.nextFloat() * .5f + .5f); + } + + default void playRotateSound(World world, BlockPos pos) { + AllSoundEvents.WRENCH_ROTATE.playOnServer(world, pos, 1, Create.random.nextFloat() + .5f); + } + default BlockState getRotatedBlockState(BlockState originalState, Direction targetedFace) { BlockState newState = originalState; diff --git a/src/main/java/com/simibubi/create/foundation/sound/SoundScape.java b/src/main/java/com/simibubi/create/foundation/sound/SoundScape.java index d674a9205..6fc31afe0 100644 --- a/src/main/java/com/simibubi/create/foundation/sound/SoundScape.java +++ b/src/main/java/com/simibubi/create/foundation/sound/SoundScape.java @@ -82,7 +82,7 @@ class SoundScape { public float getVolume() { int soundCount = SoundScapes.getSoundCount(group, pitchGroup); float argMax = (float) SoundScapes.SOUND_VOLUME_ARG_MAX; - return MathHelper.clamp(soundCount / (argMax * 10f), 0, .05f); + return MathHelper.clamp(soundCount / (argMax * 10f), 0.075f, .15f); } } \ No newline at end of file From 61f2a35a61922a4cd4666a1094890db4f8e3bfa0 Mon Sep 17 00:00:00 2001 From: PepperBell <44146161+PepperCode1@users.noreply.github.com> Date: Wed, 28 Apr 2021 13:37:21 -0700 Subject: [PATCH 06/18] Add ISimpleReloadListener ISimpleReloadListener is a reload listener functional interface meant to be used when preparation is not needed. All current reload listeners have been moved to this interface, which allows them to be lambdas and not have to create a new Object for every reload. --- .../fluids/recipe/FluidTransferRecipes.java | 22 ++++--------- .../recipe/PotionMixingRecipeManager.java | 32 +++++++------------ .../foundation/ResourceReloadHandler.java | 11 ++----- .../utility/ISimpleReloadListener.java | 23 +++++++++++++ .../utility/recipe/RecipeFinder.java | 17 ++-------- 5 files changed, 46 insertions(+), 59 deletions(-) create mode 100644 src/main/java/com/simibubi/create/foundation/utility/ISimpleReloadListener.java diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/recipe/FluidTransferRecipes.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/recipe/FluidTransferRecipes.java index 9102302d9..66d157a88 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/recipe/FluidTransferRecipes.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/recipe/FluidTransferRecipes.java @@ -3,7 +3,8 @@ package com.simibubi.create.content.contraptions.fluids.recipe; import java.util.ArrayList; import java.util.List; -import net.minecraft.client.resources.ReloadListener; +import com.simibubi.create.foundation.utility.ISimpleReloadListener; + import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.profiler.IProfiler; @@ -14,20 +15,9 @@ public class FluidTransferRecipes { public static List POTION_ITEMS = new ArrayList<>(); public static List FILLED_BUCKETS = new ArrayList<>(); - - - public static final ReloadListener LISTENER = new ReloadListener() { - - @Override - protected Object prepare(IResourceManager p_212854_1_, IProfiler p_212854_2_) { - return new Object(); - } - - @Override - protected void apply(Object p_212853_1_, IResourceManager p_212853_2_, IProfiler p_212853_3_) { - POTION_ITEMS.clear(); - FILLED_BUCKETS.clear(); - } - + public static final ISimpleReloadListener LISTENER = (IResourceManager resourceManager, IProfiler profiler) -> { + POTION_ITEMS.clear(); + FILLED_BUCKETS.clear(); }; + } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/recipe/PotionMixingRecipeManager.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/recipe/PotionMixingRecipeManager.java index 7639a06ed..1a424c82b 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/recipe/PotionMixingRecipeManager.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/recipe/PotionMixingRecipeManager.java @@ -15,8 +15,8 @@ import com.simibubi.create.content.contraptions.fluids.potion.PotionFluidHandler import com.simibubi.create.content.contraptions.processing.HeatCondition; import com.simibubi.create.content.contraptions.processing.ProcessingRecipeBuilder; import com.simibubi.create.foundation.fluid.FluidIngredient; +import com.simibubi.create.foundation.utility.ISimpleReloadListener; -import net.minecraft.client.resources.ReloadListener; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.Ingredient; @@ -133,27 +133,17 @@ public class PotionMixingRecipeManager { .collect(Collectors.toList()); } - public static final ReloadListener LISTENER = new ReloadListener() { - - @Override - protected Object prepare(IResourceManager p_212854_1_, IProfiler p_212854_2_) { - return new Object(); - } - - @Override - protected void apply(Object p_212853_1_, IResourceManager p_212853_2_, IProfiler p_212853_3_) { - ALL.clear(); - getAllBrewingRecipes().forEach(recipe -> { - for (Ingredient ingredient : recipe.getIngredients()) { - for (ItemStack itemStack : ingredient.getMatchingStacks()) { - ALL.computeIfAbsent(itemStack.getItem(), t -> new ArrayList<>()) - .add(recipe); - return; - } + public static final ISimpleReloadListener LISTENER = (IResourceManager resourceManager, IProfiler profiler) -> { + ALL.clear(); + getAllBrewingRecipes().forEach(recipe -> { + for (Ingredient ingredient : recipe.getIngredients()) { + for (ItemStack itemStack : ingredient.getMatchingStacks()) { + ALL.computeIfAbsent(itemStack.getItem(), t -> new ArrayList<>()) + .add(recipe); + return; } - }); - } - + } + }); }; } diff --git a/src/main/java/com/simibubi/create/foundation/ResourceReloadHandler.java b/src/main/java/com/simibubi/create/foundation/ResourceReloadHandler.java index 3203fa4d4..30cdb88eb 100644 --- a/src/main/java/com/simibubi/create/foundation/ResourceReloadHandler.java +++ b/src/main/java/com/simibubi/create/foundation/ResourceReloadHandler.java @@ -3,20 +3,15 @@ package com.simibubi.create.foundation; import com.simibubi.create.CreateClient; import com.simibubi.create.content.contraptions.goggles.IHaveGoggleInformation; import com.simibubi.create.foundation.block.render.SpriteShifter; +import com.simibubi.create.foundation.utility.ISimpleReloadListener; -import net.minecraft.client.resources.ReloadListener; import net.minecraft.profiler.IProfiler; import net.minecraft.resources.IResourceManager; -public class ResourceReloadHandler extends ReloadListener { +public class ResourceReloadHandler implements ISimpleReloadListener { @Override - protected Object prepare(IResourceManager resourceManagerIn, IProfiler profilerIn) { - return new Object(); - } - - @Override - protected void apply(Object $, IResourceManager resourceManagerIn, IProfiler profilerIn) { + public void onReload(IResourceManager resourceManagerIn, IProfiler profilerIn) { SpriteShifter.reloadUVs(); CreateClient.invalidateRenderers(); IHaveGoggleInformation.numberFormat.update(); diff --git a/src/main/java/com/simibubi/create/foundation/utility/ISimpleReloadListener.java b/src/main/java/com/simibubi/create/foundation/utility/ISimpleReloadListener.java new file mode 100644 index 000000000..1b361b789 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/utility/ISimpleReloadListener.java @@ -0,0 +1,23 @@ +package com.simibubi.create.foundation.utility; + +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.Executor; + +import net.minecraft.profiler.IProfiler; +import net.minecraft.resources.IFutureReloadListener; +import net.minecraft.resources.IResourceManager; +import net.minecraft.util.Unit; + +@FunctionalInterface +public interface ISimpleReloadListener extends IFutureReloadListener { + + @Override + default CompletableFuture reload(IFutureReloadListener.IStage stage, IResourceManager resourceManager, IProfiler prepareProfiler, IProfiler applyProfiler, Executor prepareExecutor, Executor applyExecutor) { + return stage.markCompleteAwaitingOthers(Unit.INSTANCE).thenRunAsync(() -> { + onReload(resourceManager, applyProfiler); + }, applyExecutor); + } + + void onReload(IResourceManager resourceManager, IProfiler profiler); + +} diff --git a/src/main/java/com/simibubi/create/foundation/utility/recipe/RecipeFinder.java b/src/main/java/com/simibubi/create/foundation/utility/recipe/RecipeFinder.java index 96e1ba2b6..f36318ae2 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/recipe/RecipeFinder.java +++ b/src/main/java/com/simibubi/create/foundation/utility/recipe/RecipeFinder.java @@ -10,8 +10,8 @@ import javax.annotation.Nullable; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; +import com.simibubi.create.foundation.utility.ISimpleReloadListener; -import net.minecraft.client.resources.ReloadListener; import net.minecraft.item.crafting.IRecipe; import net.minecraft.profiler.IProfiler; import net.minecraft.resources.IResourceManager; @@ -58,19 +58,8 @@ public class RecipeFinder { return list; } - - public static final ReloadListener LISTENER = new ReloadListener() { - - @Override - protected Object prepare(IResourceManager p_212854_1_, IProfiler p_212854_2_) { - return new Object(); - } - - @Override - protected void apply(Object p_212853_1_, IResourceManager p_212853_2_, IProfiler p_212853_3_) { - cachedSearches.invalidateAll(); - } - + public static final ISimpleReloadListener LISTENER = (IResourceManager resourceManager, IProfiler profiler) -> { + cachedSearches.invalidateAll(); }; } From 80921ebd6b1d07c5ff4be76a6d104f2f0a6bf9ed Mon Sep 17 00:00:00 2001 From: PepperBell <44146161+PepperCode1@users.noreply.github.com> Date: Wed, 28 Apr 2021 21:25:06 -0700 Subject: [PATCH 07/18] Remove ISimpleReloadListener lambda types --- .../contraptions/fluids/recipe/FluidTransferRecipes.java | 4 +--- .../contraptions/fluids/recipe/PotionMixingRecipeManager.java | 4 +--- .../create/foundation/utility/recipe/RecipeFinder.java | 4 +--- 3 files changed, 3 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/recipe/FluidTransferRecipes.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/recipe/FluidTransferRecipes.java index 66d157a88..d77dd5520 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/recipe/FluidTransferRecipes.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/recipe/FluidTransferRecipes.java @@ -7,15 +7,13 @@ import com.simibubi.create.foundation.utility.ISimpleReloadListener; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import net.minecraft.profiler.IProfiler; -import net.minecraft.resources.IResourceManager; public class FluidTransferRecipes { public static List POTION_ITEMS = new ArrayList<>(); public static List FILLED_BUCKETS = new ArrayList<>(); - public static final ISimpleReloadListener LISTENER = (IResourceManager resourceManager, IProfiler profiler) -> { + public static final ISimpleReloadListener LISTENER = (resourceManager, profiler) -> { POTION_ITEMS.clear(); FILLED_BUCKETS.clear(); }; diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/recipe/PotionMixingRecipeManager.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/recipe/PotionMixingRecipeManager.java index 1a424c82b..1219f058a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/recipe/PotionMixingRecipeManager.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/recipe/PotionMixingRecipeManager.java @@ -24,8 +24,6 @@ import net.minecraft.potion.Potion; import net.minecraft.potion.PotionBrewing; import net.minecraft.potion.PotionUtils; import net.minecraft.potion.Potions; -import net.minecraft.profiler.IProfiler; -import net.minecraft.resources.IResourceManager; import net.minecraftforge.common.brewing.BrewingRecipeRegistry; import net.minecraftforge.common.brewing.IBrewingRecipe; import net.minecraftforge.common.brewing.VanillaBrewingRecipe; @@ -133,7 +131,7 @@ public class PotionMixingRecipeManager { .collect(Collectors.toList()); } - public static final ISimpleReloadListener LISTENER = (IResourceManager resourceManager, IProfiler profiler) -> { + public static final ISimpleReloadListener LISTENER = (resourceManager, profiler) -> { ALL.clear(); getAllBrewingRecipes().forEach(recipe -> { for (Ingredient ingredient : recipe.getIngredients()) { diff --git a/src/main/java/com/simibubi/create/foundation/utility/recipe/RecipeFinder.java b/src/main/java/com/simibubi/create/foundation/utility/recipe/RecipeFinder.java index f36318ae2..b6a098d44 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/recipe/RecipeFinder.java +++ b/src/main/java/com/simibubi/create/foundation/utility/recipe/RecipeFinder.java @@ -13,8 +13,6 @@ import com.google.common.cache.CacheBuilder; import com.simibubi.create.foundation.utility.ISimpleReloadListener; import net.minecraft.item.crafting.IRecipe; -import net.minecraft.profiler.IProfiler; -import net.minecraft.resources.IResourceManager; import net.minecraft.world.World; /** @@ -58,7 +56,7 @@ public class RecipeFinder { return list; } - public static final ISimpleReloadListener LISTENER = (IResourceManager resourceManager, IProfiler profiler) -> { + public static final ISimpleReloadListener LISTENER = (resourceManager, profiler) -> { cachedSearches.invalidateAll(); }; From 81b0cf77e191f02b10f440476949940b0bf7db2a Mon Sep 17 00:00:00 2001 From: JozsefA Date: Wed, 28 Apr 2021 22:08:45 -0700 Subject: [PATCH 08/18] Contraption renderer checks for flywheel worlds - Should fix an issue with smaller units --- .../render/ContraptionRenderDispatcher.java | 281 +++++++++--------- 1 file changed, 137 insertions(+), 144 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionRenderDispatcher.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionRenderDispatcher.java index 2674f778a..83c39757f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionRenderDispatcher.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionRenderDispatcher.java @@ -44,7 +44,6 @@ import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.vector.Matrix4f; -import net.minecraft.world.IBlockDisplayReader; import net.minecraft.world.LightType; import net.minecraft.world.World; import net.minecraft.world.gen.feature.template.Template; @@ -52,57 +51,27 @@ import net.minecraftforge.client.ForgeHooksClient; import net.minecraftforge.client.model.data.EmptyModelData; public class ContraptionRenderDispatcher { - public static final Int2ObjectMap renderers = new Int2ObjectOpenHashMap<>(); - public static final Compartment> CONTRAPTION = new Compartment<>(); - protected static PlacementSimulationWorld renderWorld; + public static final Int2ObjectMap renderers = new Int2ObjectOpenHashMap<>(); + public static final Compartment> CONTRAPTION = new Compartment<>(); + protected static PlacementSimulationWorld renderWorld; - public static void notifyLightPacket(IBlockDisplayReader world, int chunkX, int chunkZ) { - for (RenderedContraption renderer : renderers.values()) { - renderer.getLighter().lightVolume.notifyLightPacket(world, chunkX, chunkZ); - } - } + public static void tick() { + if (Minecraft.getInstance().isGamePaused()) return; - public static void renderTileEntities(World world, Contraption c, MatrixStack ms, MatrixStack msLocal, - IRenderTypeBuffer buffer) { - PlacementSimulationWorld renderWorld = null; - if (Backend.canUseVBOs()) { - RenderedContraption renderer = getRenderer(world, c); + for (RenderedContraption contraption : renderers.values()) { + contraption.getLighter().tick(contraption); - renderWorld = renderer.renderWorld; - } - TileEntityRenderHelper.renderTileEntities(world, renderWorld, c.specialRenderedTileEntities, ms, msLocal, buffer); + contraption.kinetics.tick(); + } + } - } + public static void beginFrame(ActiveRenderInfo info, double camX, double camY, double camZ) { + for (RenderedContraption renderer : renderers.values()) { + renderer.beginFrame(info, camX, camY, camZ); + } + } - public static void tick() { - if (Minecraft.getInstance().isGamePaused()) return; - - for (RenderedContraption contraption : renderers.values()) { - contraption.getLighter().tick(contraption); - - contraption.kinetics.tick(); - } - } - - private static RenderedContraption getRenderer(World world, Contraption c) { - int entityId = c.entity.getEntityId(); - RenderedContraption contraption = renderers.get(entityId); - - if (contraption == null) { - contraption = new RenderedContraption(world, c); - renderers.put(entityId, contraption); - } - - return contraption; - } - - public static void beginFrame(ActiveRenderInfo info, double camX, double camY, double camZ) { - for (RenderedContraption renderer : renderers.values()) { - renderer.beginFrame(info, camX, camY, camZ); - } - } - - public static void renderLayer(RenderType layer, Matrix4f viewProjection, double camX, double camY, double camZ) { + public static void renderLayer(RenderType layer, Matrix4f viewProjection, double camX, double camY, double camZ) { removeDeadContraptions(); if (renderers.isEmpty()) return; @@ -121,79 +90,110 @@ public class ContraptionRenderDispatcher { if (Backend.canUseInstancing()) { for (RenderedContraption renderer : renderers.values()) { - renderer.kinetics.render(layer, viewProjection, camX, camY, camZ, renderer::setup); - renderer.teardown(); - } - } + renderer.kinetics.render(layer, viewProjection, camX, camY, camZ, renderer::setup); + renderer.teardown(); + } + } - layer.endDrawing(); - GL11.glDisable(GL13.GL_TEXTURE_3D); - GL13.glActiveTexture(GL40.GL_TEXTURE0); - } + layer.endDrawing(); + GL11.glDisable(GL13.GL_TEXTURE_3D); + GL13.glActiveTexture(GL40.GL_TEXTURE0); + } - public static void removeDeadContraptions() { - renderers.values().removeIf(renderer -> { - if (renderer.isDead()) { - renderer.invalidate(); - return true; - } - return false; - }); - } + private static RenderedContraption getRenderer(World world, Contraption c) { + int entityId = c.entity.getEntityId(); + RenderedContraption contraption = renderers.get(entityId); - public static void invalidateAll() { - for (RenderedContraption renderer : renderers.values()) { - renderer.invalidate(); - } + if (contraption == null) { + contraption = new RenderedContraption(world, c); + renderers.put(entityId, contraption); + } - renderers.clear(); - } + return contraption; + } - public static void render(AbstractContraptionEntity entity, MatrixStack ms, IRenderTypeBuffer buffers, - MatrixStack msLocal, Contraption contraption) { - if (Backend.canUseVBOs()) { - ContraptionRenderDispatcher.renderDynamic(entity.world, contraption, ms, msLocal, buffers); - } else { - ContraptionRenderDispatcher.renderDynamic(entity.world, contraption, ms, msLocal, buffers); - ContraptionRenderDispatcher.renderStructure(entity.world, contraption, ms, msLocal, buffers); - } - } + public static void render(AbstractContraptionEntity entity, MatrixStack ms, IRenderTypeBuffer buffers, + MatrixStack msLocal, Contraption contraption) { + if (Backend.canUseVBOs() && Backend.isFlywheelWorld(entity.world)) { + ContraptionRenderDispatcher.renderDynamic(entity.world, contraption, ms, msLocal, buffers); + } else { + ContraptionRenderDispatcher.renderDynamic(entity.world, contraption, ms, msLocal, buffers); + ContraptionRenderDispatcher.renderStructure(entity.world, contraption, ms, msLocal, buffers); + } + } - public static void renderDynamic(World world, Contraption c, MatrixStack ms, MatrixStack msLocal, - IRenderTypeBuffer buffer) { - renderTileEntities(world, c, ms, msLocal, buffer); - if (buffer instanceof IRenderTypeBuffer.Impl) - ((IRenderTypeBuffer.Impl) buffer).draw(); - renderActors(world, c, ms, msLocal, buffer); - } + public static void renderStructure(World world, Contraption c, MatrixStack ms, MatrixStack msLocal, + IRenderTypeBuffer buffer) { + SuperByteBufferCache bufferCache = CreateClient.bufferCache; + List blockLayers = RenderType.getBlockLayers(); - public static void renderStructure(World world, Contraption c, MatrixStack ms, MatrixStack msLocal, - IRenderTypeBuffer buffer) { - SuperByteBufferCache bufferCache = CreateClient.bufferCache; - List blockLayers = RenderType.getBlockLayers(); + buffer.getBuffer(RenderType.getSolid()); + for (int i = 0; i < blockLayers.size(); i++) { + RenderType layer = blockLayers.get(i); + Pair key = Pair.of(c, i); + SuperByteBuffer contraptionBuffer = bufferCache.get(CONTRAPTION, key, () -> buildStructureBuffer(c, layer)); + if (contraptionBuffer.isEmpty()) + continue; + Matrix4f model = msLocal.peek() + .getModel(); + contraptionBuffer.light(model) + .renderInto(ms, buffer.getBuffer(layer)); + } + } - buffer.getBuffer(RenderType.getSolid()); - for (int i = 0; i < blockLayers.size(); i++) { - RenderType layer = blockLayers.get(i); - Pair key = Pair.of(c, i); - SuperByteBuffer contraptionBuffer = bufferCache.get(CONTRAPTION, key, () -> buildStructureBuffer(c, layer)); - if (contraptionBuffer.isEmpty()) - continue; - Matrix4f model = msLocal.peek() - .getModel(); - contraptionBuffer.light(model) - .renderInto(ms, buffer.getBuffer(layer)); - } - } + public static void renderDynamic(World world, Contraption c, MatrixStack ms, MatrixStack msLocal, + IRenderTypeBuffer buffer) { + renderTileEntities(world, c, ms, msLocal, buffer); + if (buffer instanceof IRenderTypeBuffer.Impl) + ((IRenderTypeBuffer.Impl) buffer).draw(); + renderActors(world, c, ms, msLocal, buffer); + } - private static SuperByteBuffer buildStructureBuffer(Contraption c, RenderType layer) { - BufferBuilder builder = buildStructure(c, layer); - return new SuperByteBuffer(builder); - } + public static void renderTileEntities(World world, Contraption c, MatrixStack ms, MatrixStack msLocal, + IRenderTypeBuffer buffer) { + PlacementSimulationWorld renderWorld = null; + if (Backend.canUseVBOs() && Backend.isFlywheelWorld(world)) { + RenderedContraption renderer = getRenderer(world, c); - public static BufferBuilder buildStructure(Contraption c, RenderType layer) { - if (renderWorld == null || renderWorld.getWorld() != Minecraft.getInstance().world) - renderWorld = new PlacementSimulationWorld(Minecraft.getInstance().world); + renderWorld = renderer.renderWorld; + } + TileEntityRenderHelper.renderTileEntities(world, renderWorld, c.specialRenderedTileEntities, ms, msLocal, buffer); + + } + + protected static void renderActors(World world, Contraption c, MatrixStack ms, MatrixStack msLocal, + IRenderTypeBuffer buffer) { + MatrixStack[] matrixStacks = new MatrixStack[]{ms, msLocal}; + for (Pair actor : c.getActors()) { + MovementContext context = actor.getRight(); + if (context == null) + continue; + if (context.world == null) + context.world = world; + Template.BlockInfo blockInfo = actor.getLeft(); + for (MatrixStack m : matrixStacks) { + m.push(); + MatrixStacker.of(m) + .translate(blockInfo.pos); + } + + MovementBehaviour movementBehaviour = AllMovementBehaviours.of(blockInfo.state); + if (movementBehaviour != null) + movementBehaviour.renderInContraption(context, ms, msLocal, buffer); + + for (MatrixStack m : matrixStacks) + m.pop(); + } + } + + private static SuperByteBuffer buildStructureBuffer(Contraption c, RenderType layer) { + BufferBuilder builder = buildStructure(c, layer); + return new SuperByteBuffer(builder); + } + + public static BufferBuilder buildStructure(Contraption c, RenderType layer) { + if (renderWorld == null || renderWorld.getWorld() != Minecraft.getInstance().world) + renderWorld = new PlacementSimulationWorld(Minecraft.getInstance().world); ForgeHooksClient.setRenderLayer(layer); MatrixStack ms = new MatrixStack(); @@ -232,31 +232,6 @@ public class ContraptionRenderDispatcher { return builder; } - protected static void renderActors(World world, Contraption c, MatrixStack ms, MatrixStack msLocal, - IRenderTypeBuffer buffer) { - MatrixStack[] matrixStacks = new MatrixStack[] { ms, msLocal }; - for (Pair actor : c.getActors()) { - MovementContext context = actor.getRight(); - if (context == null) - continue; - if (context.world == null) - context.world = world; - Template.BlockInfo blockInfo = actor.getLeft(); - for (MatrixStack m : matrixStacks) { - m.push(); - MatrixStacker.of(m) - .translate(blockInfo.pos); - } - - MovementBehaviour movementBehaviour = AllMovementBehaviours.of(blockInfo.state); - if (movementBehaviour != null) - movementBehaviour.renderInContraption(context, ms, msLocal, buffer); - - for (MatrixStack m : matrixStacks) - m.pop(); - } - } - public static int getLight(World world, float lx, float ly, float lz) { BlockPos.Mutable pos = new BlockPos.Mutable(); float sky = 0, block = 0; @@ -292,14 +267,32 @@ public class ContraptionRenderDispatcher { return packedLight; } - public static int getLightOnContraption(MovementContext context) { - int entityId = context.contraption.entity.getEntityId(); + public static int getLightOnContraption(MovementContext context) { + int entityId = context.contraption.entity.getEntityId(); - RenderedContraption renderedContraption = renderers.get(entityId); - if (renderedContraption != null) { - return renderedContraption.renderWorld.getLightLevel(LightType.BLOCK, context.localPos); - } else { - return -1; - } - } + RenderedContraption renderedContraption = renderers.get(entityId); + if (renderedContraption != null) { + return renderedContraption.renderWorld.getLightLevel(LightType.BLOCK, context.localPos); + } else { + return -1; + } + } + + public static void invalidateAll() { + for (RenderedContraption renderer : renderers.values()) { + renderer.invalidate(); + } + + renderers.clear(); + } + + public static void removeDeadContraptions() { + renderers.values().removeIf(renderer -> { + if (renderer.isDead()) { + renderer.invalidate(); + return true; + } + return false; + }); + } } From e33ab160ac50f705eff9e6153a71bff9b6a6a2df Mon Sep 17 00:00:00 2001 From: JozsefA Date: Wed, 28 Apr 2021 22:47:51 -0700 Subject: [PATCH 09/18] Start to cleanup the AllBlockPartials methods --- .../com/simibubi/create/AllBlockPartials.java | 66 ------------------ .../contraptions/base/HalfShaftInstance.java | 6 +- .../components/actors/DrillInstance.java | 4 +- .../components/actors/DrillRenderer.java | 19 +++--- .../components/actors/HarvesterRenderer.java | 15 ++-- .../PortableStorageInterfaceRenderer.java | 13 ++-- .../components/clock/CuckooClockRenderer.java | 25 +++---- .../crafter/MechanicalCrafterRenderer.java | 9 +-- .../components/crank/HandCrankInstance.java | 25 +++---- .../components/crank/HandCrankRenderer.java | 5 +- .../components/deployer/DeployerRenderer.java | 16 ++--- .../components/fan/EncasedFanRenderer.java | 11 +-- .../components/fan/FanInstance.java | 16 ++--- .../components/flywheel/FlyWheelInstance.java | 27 ++++---- .../components/flywheel/FlywheelRenderer.java | 30 ++++---- .../flywheel/engine/EngineRenderer.java | 13 ++-- .../mixer/MechanicalMixerRenderer.java | 17 ++--- .../motor/CreativeMotorRenderer.java | 3 +- .../press/MechanicalPressRenderer.java | 7 +- .../components/saw/SawInstance.java | 4 +- .../components/saw/SawRenderer.java | 21 +++--- .../bearing/BearingRenderer.java | 17 ++--- .../StabilizedBearingMovementBehaviour.java | 3 +- .../chassis/StickerRenderer.java | 9 +-- .../gantry/GantryCarriageRenderer.java | 19 +++--- .../pulley/AbstractPulleyRenderer.java | 12 ++-- .../pulley/HosePulleyInstance.java | 2 +- .../pulley/RopePulleyInstance.java | 2 +- .../train/CouplingRenderer.java | 27 ++++---- .../contraptions/fluids/PumpCogInstance.java | 8 ++- .../contraptions/fluids/PumpRenderer.java | 21 +++--- .../fluids/actors/HosePulleyRenderer.java | 5 +- .../fluids/actors/SpoutRenderer.java | 7 +- .../fluids/pipes/FluidValveRenderer.java | 3 +- .../burner/BlazeBurnerRenderer.java | 5 +- .../advanced/SpeedControllerRenderer.java | 5 +- .../relays/belt/BeltRenderer.java | 30 ++++---- .../relays/encased/SplitShaftInstance.java | 8 +-- .../relays/encased/SplitShaftRenderer.java | 3 +- .../relays/gauge/GaugeRenderer.java | 13 ++-- .../relays/gearbox/GearboxInstance.java | 22 +++--- .../relays/gearbox/GearboxRenderer.java | 3 +- .../belts/tunnel/BeltTunnelRenderer.java | 3 +- .../block/depot/EjectorRenderer.java | 5 +- .../diodes/AdjustableRepeaterRenderer.java | 3 +- .../block/funnel/FunnelRenderer.java | 10 +-- .../block/mechanicalArm/ArmRenderer.java | 23 ++++--- .../block/redstone/AnalogLeverRenderer.java | 15 ++-- .../block/SchematicannonRenderer.java | 7 +- .../foundation/render/PartialBufferer.java | 68 +++++++++++++++++++ .../render/SuperByteBufferCache.java | 8 +-- .../backend/instancing/RenderMaterial.java | 30 +++++--- 52 files changed, 403 insertions(+), 345 deletions(-) create mode 100644 src/main/java/com/simibubi/create/foundation/render/PartialBufferer.java diff --git a/src/main/java/com/simibubi/create/AllBlockPartials.java b/src/main/java/com/simibubi/create/AllBlockPartials.java index d6a27e9d0..d32c28e3d 100644 --- a/src/main/java/com/simibubi/create/AllBlockPartials.java +++ b/src/main/java/com/simibubi/create/AllBlockPartials.java @@ -1,26 +1,15 @@ package com.simibubi.create; -import static net.minecraft.state.properties.BlockStateProperties.FACING; -import static net.minecraft.state.properties.BlockStateProperties.HORIZONTAL_FACING; - import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.function.Supplier; -import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.content.contraptions.fluids.FluidTransportBehaviour.AttachmentTypes; import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock.HeatLevel; -import com.simibubi.create.foundation.render.SuperByteBuffer; -import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; -import com.simibubi.create.foundation.render.backend.instancing.RenderMaterial; -import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.Lang; -import com.simibubi.create.foundation.utility.MatrixStacker; -import net.minecraft.block.BlockState; import net.minecraft.client.renderer.model.IBakedModel; import net.minecraft.util.Direction; import net.minecraft.util.ResourceLocation; @@ -188,59 +177,4 @@ public class AllBlockPartials { return bakedModel; } - public SuperByteBuffer renderOn(BlockState referenceState) { - return CreateClient.bufferCache.renderPartial(this, referenceState); - } - - public SuperByteBuffer renderOnDirectionalSouth(BlockState referenceState) { - Direction facing = referenceState.get(FACING); - return renderOnDirectionalSouth(referenceState, facing); - } - - public SuperByteBuffer renderOnDirectional(BlockState referenceState) { - Direction facing = referenceState.get(FACING); - return renderOnDirectional(referenceState, facing); - } - - public SuperByteBuffer renderOnHorizontal(BlockState referenceState) { - Direction facing = referenceState.get(HORIZONTAL_FACING); - return renderOnDirectionalSouth(referenceState, facing); - } - - public SuperByteBuffer renderOnDirectionalSouth(BlockState referenceState, Direction facing) { - MatrixStack ms = new MatrixStack(); - // TODO 1.15 find a way to cache this model matrix computation - MatrixStacker.of(ms) - .centre() - .rotateY(AngleHelper.horizontalAngle(facing)) - .rotateX(AngleHelper.verticalAngle(facing)) - .unCentre(); - return CreateClient.bufferCache.renderDirectionalPartial(this, referenceState, facing, ms); - } - - public SuperByteBuffer renderOnDirectional(BlockState referenceState, Direction facing) { - MatrixStack ms = new MatrixStack(); - // TODO 1.15 find a way to cache this model matrix computation - MatrixStacker.of(ms) - .centre() - .rotateY(AngleHelper.horizontalAngle(facing)) - .rotateX(facing == Direction.UP ? 0 : facing == Direction.DOWN ? 180 : 90) - .unCentre(); - return CreateClient.bufferCache.renderDirectionalPartial(this, referenceState, facing, ms); - } - - public > M getModel(RenderMaterial mat, BlockState referenceState, - Direction facing) { - Supplier ms = () -> { - MatrixStack stack = new MatrixStack(); - MatrixStacker.of(stack) - .centre() - .rotateY(AngleHelper.horizontalAngle(facing)) - .rotateX(AngleHelper.verticalAngle(facing)) - .unCentre(); - return stack; - }; - return mat.getModel(this, referenceState, facing, ms); - } - } diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/HalfShaftInstance.java b/src/main/java/com/simibubi/create/content/contraptions/base/HalfShaftInstance.java index 4b834f520..6d3664988 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/HalfShaftInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/HalfShaftInstance.java @@ -14,9 +14,9 @@ public class HalfShaftInstance extends SingleRotatingInstance { @Override protected InstancedModel getModel() { - Direction dir = getShaftDirection(); - return AllBlockPartials.SHAFT_HALF.getModel(getRotatingMaterial(), blockState, dir); - } + Direction dir = getShaftDirection(); + return getRotatingMaterial().getModel(AllBlockPartials.SHAFT_HALF, blockState, dir); + } protected Direction getShaftDirection() { return blockState.get(BlockStateProperties.FACING); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillInstance.java index ad6b2ce47..7d1bdd735 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillInstance.java @@ -10,6 +10,7 @@ import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; import net.minecraft.block.BlockState; +import net.minecraft.util.Direction; public class DrillInstance extends SingleRotatingInstance { @@ -20,6 +21,7 @@ public class DrillInstance extends SingleRotatingInstance { @Override protected InstancedModel getModel() { BlockState referenceState = tile.getBlockState(); - return AllBlockPartials.DRILL_HEAD.getModel(getRotatingMaterial(), referenceState, referenceState.get(FACING)); + Direction facing = referenceState.get(FACING); + return getRotatingMaterial().getModel(AllBlockPartials.DRILL_HEAD, referenceState, facing); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillRenderer.java index 38f940dab..288451551 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillRenderer.java @@ -5,6 +5,7 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; +import com.simibubi.create.foundation.render.PartialBufferer; import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.AnimationTickHolder; @@ -25,22 +26,18 @@ public class DrillRenderer extends KineticTileEntityRenderer { @Override protected SuperByteBuffer getRotatedModel(KineticTileEntity te) { - return AllBlockPartials.DRILL_HEAD.renderOnDirectionalSouth(te.getBlockState()); - } - - protected static SuperByteBuffer getRotatingModel(BlockState state) { - return AllBlockPartials.DRILL_HEAD.renderOnDirectionalSouth(state); + return PartialBufferer.getDirectionalSouth(AllBlockPartials.DRILL_HEAD, te.getBlockState()); } public static void renderInContraption(MovementContext context, MatrixStack ms, MatrixStack msLocal, IRenderTypeBuffer buffer) { - MatrixStack[] matrixStacks = new MatrixStack[] { ms, msLocal }; + MatrixStack[] matrixStacks = new MatrixStack[]{ms, msLocal}; BlockState state = context.state; - SuperByteBuffer superBuffer = AllBlockPartials.DRILL_HEAD.renderOn(state); + SuperByteBuffer superBuffer = PartialBufferer.get(AllBlockPartials.DRILL_HEAD, state); Direction facing = state.get(DrillBlock.FACING); - + float speed = (float) (context.contraption.stalled - || !VecHelper.isVecPointingTowards(context.relativeMotion, facing + || !VecHelper.isVecPointingTowards(context.relativeMotion, facing .getOpposite()) ? context.getAnimationSpeed() : 0); float time = AnimationTickHolder.getRenderTime() / 20; float angle = (float) (((time * speed) % 360)); @@ -52,11 +49,11 @@ public class DrillRenderer extends KineticTileEntityRenderer { .rotateX(AngleHelper.verticalAngle(facing)) .rotateZ(angle) .unCentre(); - + superBuffer .light(msLocal.peek() .getModel()) .renderInto(ms, buffer.getBuffer(RenderType.getSolid())); } -} \ No newline at end of file +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterRenderer.java index 5b50202e3..44cf29765 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterRenderer.java @@ -6,6 +6,7 @@ import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionRenderDispatcher; +import com.simibubi.create.foundation.render.PartialBufferer; import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; import com.simibubi.create.foundation.utility.AngleHelper; @@ -31,28 +32,28 @@ public class HarvesterRenderer extends SafeTileEntityRenderer modelManager, HandCrankTileEntity tile) { super(modelManager, tile); - this.tile = tile; + this.tile = tile; - Block block = blockState.getBlock(); - AllBlockPartials renderedHandle = null; - if (block instanceof HandCrankBlock) - renderedHandle = ((HandCrankBlock) block).getRenderedHandle(); - if (renderedHandle == null) - return; + Block block = blockState.getBlock(); + AllBlockPartials renderedHandle = null; + if (block instanceof HandCrankBlock) + renderedHandle = ((HandCrankBlock) block).getRenderedHandle(); + if (renderedHandle == null) + return; - facing = blockState.get(BlockStateProperties.FACING); - InstancedModel model = renderedHandle.getModel(getTransformMaterial(), blockState, facing.getOpposite()); - crank = model.createInstance(); + facing = blockState.get(BlockStateProperties.FACING); + Direction opposite = facing.getOpposite(); + InstancedModel model = getTransformMaterial().getModel(renderedHandle, blockState, opposite); + crank = model.createInstance(); - rotateCrank(); - } + rotateCrank(); + } @Override public void beginFrame() { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankRenderer.java index 11442df9e..bbf3ec4f6 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankRenderer.java @@ -6,6 +6,7 @@ import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; +import com.simibubi.create.foundation.render.PartialBufferer; import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; @@ -38,10 +39,10 @@ public class HandCrankRenderer extends KineticTileEntityRenderer { return; Direction facing = state.get(FACING); - SuperByteBuffer handle = renderedHandle.renderOnDirectionalSouth(state, facing.getOpposite()); + SuperByteBuffer handle = PartialBufferer.getDirectionalSouth(renderedHandle, state, facing.getOpposite()); HandCrankTileEntity crank = (HandCrankTileEntity) te; kineticRotationTransform(handle, te, facing.getAxis(), - (crank.independentAngle + partialTicks * crank.chasingVelocity) / 360, light); + (crank.independentAngle + partialTicks * crank.chasingVelocity) / 360, light); handle.renderInto(ms, buffer.getBuffer(RenderType.getSolid())); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerRenderer.java index d9dd683c6..84eccae4c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerRenderer.java @@ -11,6 +11,7 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.contraptions.components.deployer.DeployerTileEntity.Mode; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionRenderDispatcher; +import com.simibubi.create.foundation.render.PartialBufferer; import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringRenderer; @@ -117,14 +118,13 @@ public class DeployerRenderer extends SafeTileEntityRenderer BlockPos pos = te.getPos(); Vector3d offset = getHandOffset(te, partialTicks, blockState); - SuperByteBuffer pole = AllBlockPartials.DEPLOYER_POLE.renderOn(blockState); - SuperByteBuffer hand = te.getHandPose() - .renderOn(blockState); + SuperByteBuffer pole = PartialBufferer.get(AllBlockPartials.DEPLOYER_POLE, blockState); + SuperByteBuffer hand = PartialBufferer.get(te.getHandPose(), blockState); transform(te.getWorld(), pole.translate(offset.x, offset.y, offset.z), blockState, pos, true).renderInto(ms, - vb); + vb); transform(te.getWorld(), hand.translate(offset.x, offset.y, offset.z), blockState, pos, false).renderInto(ms, - vb); + vb); } protected Vector3d getHandOffset(DeployerTileEntity te, float partialTicks, BlockState blockState) { @@ -155,7 +155,7 @@ public class DeployerRenderer extends SafeTileEntityRenderer public static void renderInContraption(MovementContext context, MatrixStack ms, MatrixStack msLocal, IRenderTypeBuffer buffer) { - MatrixStack[] matrixStacks = new MatrixStack[] { ms, msLocal }; + MatrixStack[] matrixStacks = new MatrixStack[]{ms, msLocal}; IVertexBuilder builder = buffer.getBuffer(RenderType.getSolid()); BlockState blockState = context.state; BlockPos pos = BlockPos.ZERO; @@ -163,8 +163,8 @@ public class DeployerRenderer extends SafeTileEntityRenderer World world = context.world; AllBlockPartials handPose = getHandPose(mode); - SuperByteBuffer pole = AllBlockPartials.DEPLOYER_POLE.renderOn(blockState); - SuperByteBuffer hand = handPose.renderOn(blockState); + SuperByteBuffer pole = PartialBufferer.get(AllBlockPartials.DEPLOYER_POLE, blockState); + SuperByteBuffer hand = PartialBufferer.get(handPose, blockState); pole = transform(world, pole, blockState, pos, true); hand = transform(world, hand, blockState, pos, false); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanRenderer.java index cb469d615..0cf853af1 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanRenderer.java @@ -7,6 +7,7 @@ import com.mojang.blaze3d.vertex.IVertexBuilder; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; +import com.simibubi.create.foundation.render.PartialBufferer; import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import com.simibubi.create.foundation.utility.AnimationTickHolder; @@ -30,17 +31,17 @@ public class EncasedFanRenderer extends KineticTileEntityRenderer { if (FastRenderDispatcher.available(te.getWorld())) return; Direction direction = te.getBlockState() - .get(FACING); + .get(FACING); IVertexBuilder vb = buffer.getBuffer(RenderType.getCutoutMipped()); int lightBehind = WorldRenderer.getLightmapCoordinates(te.getWorld(), te.getPos().offset(direction.getOpposite())); int lightInFront = WorldRenderer.getLightmapCoordinates(te.getWorld(), te.getPos().offset(direction)); - + SuperByteBuffer shaftHalf = - AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouth(te.getBlockState(), direction.getOpposite()); + PartialBufferer.getDirectionalSouth(AllBlockPartials.SHAFT_HALF, te.getBlockState(), direction.getOpposite()); SuperByteBuffer fanInner = - AllBlockPartials.ENCASED_FAN_INNER.renderOnDirectionalSouth(te.getBlockState(), direction.getOpposite()); - + PartialBufferer.getDirectionalSouth(AllBlockPartials.ENCASED_FAN_INNER, te.getBlockState(), direction.getOpposite()); + float time = AnimationTickHolder.getRenderTime(te.getWorld()); float speed = te.getSpeed() * 5; if (speed > 0) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/fan/FanInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/fan/FanInstance.java index 05e921f0a..2feec9410 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/fan/FanInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/fan/FanInstance.java @@ -19,17 +19,17 @@ public class FanInstance extends KineticTileInstance { private final Direction opposite; public FanInstance(InstancedTileRenderer modelManager, EncasedFanTileEntity tile) { - super(modelManager, tile); + super(modelManager, tile); - direction = blockState.get(FACING); + direction = blockState.get(FACING); - opposite = direction.getOpposite(); - shaft = AllBlockPartials.SHAFT_HALF.getModel(getRotatingMaterial(), blockState, opposite).createInstance(); - fan = AllBlockPartials.ENCASED_FAN_INNER.getModel(getRotatingMaterial(), blockState, opposite).createInstance(); + opposite = direction.getOpposite(); + shaft = getRotatingMaterial().getModel(AllBlockPartials.SHAFT_HALF, blockState, opposite).createInstance(); + fan = getRotatingMaterial().getModel(AllBlockPartials.ENCASED_FAN_INNER, blockState, opposite).createInstance(); - setup(shaft); - setup(fan, getFanSpeed()); - } + setup(shaft); + setup(fan, getFanSpeed()); + } private float getFanSpeed() { float speed = tile.getSpeed() * 5; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlyWheelInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlyWheelInstance.java index d01c2633f..c4a1f2385 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlyWheelInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlyWheelInstance.java @@ -46,24 +46,24 @@ public class FlyWheelInstance extends KineticTileInstance im protected float lastAngle = Float.NaN; public FlyWheelInstance(InstancedTileRenderer modelManager, FlywheelTileEntity tile) { - super(modelManager, tile); + super(modelManager, tile); - facing = blockState.get(HORIZONTAL_FACING); + facing = blockState.get(HORIZONTAL_FACING); - shaft = setup(shaftModel().createInstance()); + shaft = setup(shaftModel().createInstance()); - BlockState referenceState = blockState.rotate(Rotation.CLOCKWISE_90); - wheel = AllBlockPartials.FLYWHEEL.getModel(getTransformMaterial(), referenceState, referenceState.get(HORIZONTAL_FACING)).createInstance(); + BlockState referenceState = blockState.rotate(Rotation.CLOCKWISE_90); + wheel = getTransformMaterial().getModel(AllBlockPartials.FLYWHEEL, referenceState, facing).createInstance(); - connection = FlywheelBlock.getConnection(blockState); - if (connection != null) { - connectedLeft = blockState.get(FlywheelBlock.CONNECTION) == FlywheelBlock.ConnectionState.LEFT; + connection = FlywheelBlock.getConnection(blockState); + if (connection != null) { + connectedLeft = blockState.get(FlywheelBlock.CONNECTION) == FlywheelBlock.ConnectionState.LEFT; - boolean flipAngle = connection.getAxis() == Direction.Axis.X ^ connection.getAxisDirection() == Direction.AxisDirection.NEGATIVE; + boolean flipAngle = connection.getAxis() == Direction.Axis.X ^ connection.getAxisDirection() == Direction.AxisDirection.NEGATIVE; - connectorAngleMult = flipAngle ? -1 : 1; + connectorAngleMult = flipAngle ? -1 : 1; - RenderMaterial> mat = getTransformMaterial(); + RenderMaterial> mat = getTransformMaterial(); upperRotating = mat.getModel(AllBlockPartials.FLYWHEEL_UPPER_ROTATING, blockState).createInstance(); lowerRotating = mat.getModel(AllBlockPartials.FLYWHEEL_LOWER_ROTATING, blockState).createInstance(); @@ -159,8 +159,9 @@ public class FlyWheelInstance extends KineticTileInstance im } protected InstancedModel shaftModel() { - return AllBlockPartials.SHAFT_HALF.getModel(getRotatingMaterial(), blockState, facing.getOpposite()); - } + Direction opposite = facing.getOpposite(); + return getRotatingMaterial().getModel(AllBlockPartials.SHAFT_HALF, blockState, opposite); + } protected void transformConnector(MatrixStacker ms, boolean upper, boolean rotating, float angle, boolean flip) { float shift = upper ? 1 / 4f : -1 / 8f; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelRenderer.java index 03434b9e9..f219c4ec4 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelRenderer.java @@ -8,6 +8,7 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.contraptions.components.flywheel.FlywheelBlock.ConnectionState; +import com.simibubi.create.foundation.render.PartialBufferer; import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import com.simibubi.create.foundation.utility.AngleHelper; @@ -17,6 +18,7 @@ import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.WorldRenderer; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; +import net.minecraft.state.properties.BlockStateProperties; import net.minecraft.util.Direction; import net.minecraft.util.Direction.Axis; import net.minecraft.util.Direction.AxisDirection; @@ -54,33 +56,33 @@ public class FlywheelRenderer extends KineticTileEntityRenderer { boolean flip = blockState.get(FlywheelBlock.CONNECTION) == ConnectionState.LEFT; transformConnector( - rotateToFacing(AllBlockPartials.FLYWHEEL_UPPER_ROTATING.renderOn(blockState), connection), true, true, - rotation, flip).light(light) + rotateToFacing(PartialBufferer.get(AllBlockPartials.FLYWHEEL_UPPER_ROTATING, blockState), connection), true, true, + rotation, flip).light(light) .renderInto(ms, vb); transformConnector( - rotateToFacing(AllBlockPartials.FLYWHEEL_LOWER_ROTATING.renderOn(blockState), connection), false, true, - rotation, flip).light(light) + rotateToFacing(PartialBufferer.get(AllBlockPartials.FLYWHEEL_LOWER_ROTATING, blockState), connection), false, true, + rotation, flip).light(light) .renderInto(ms, vb); - - transformConnector(rotateToFacing(AllBlockPartials.FLYWHEEL_UPPER_SLIDING.renderOn(blockState), connection), - true, false, rotation, flip).light(light) + + transformConnector(rotateToFacing(PartialBufferer.get(AllBlockPartials.FLYWHEEL_UPPER_SLIDING, blockState), connection), + true, false, rotation, flip).light(light) .renderInto(ms, vb); - transformConnector(rotateToFacing(AllBlockPartials.FLYWHEEL_LOWER_SLIDING.renderOn(blockState), connection), - false, false, rotation, flip).light(light) + transformConnector(rotateToFacing(PartialBufferer.get(AllBlockPartials.FLYWHEEL_LOWER_SLIDING, blockState), connection), + false, false, rotation, flip).light(light) .renderInto(ms, vb); } - SuperByteBuffer wheel = AllBlockPartials.FLYWHEEL.renderOnHorizontal(blockState.rotate(Rotation.CLOCKWISE_90)); + SuperByteBuffer wheel = PartialBufferer.getHorizontal(AllBlockPartials.FLYWHEEL, blockState.rotate(Rotation.CLOCKWISE_90)); kineticRotationTransform(wheel, te, blockState.get(HORIZONTAL_FACING) - .getAxis(), AngleHelper.rad(angle), light); + .getAxis(), AngleHelper.rad(angle), light); wheel.renderInto(ms, vb); } @Override protected SuperByteBuffer getRotatedModel(KineticTileEntity te) { - return AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouth(te.getBlockState(), te.getBlockState() - .get(HORIZONTAL_FACING) - .getOpposite()); + return PartialBufferer.getDirectionalSouth(AllBlockPartials.SHAFT_HALF, te.getBlockState(), te.getBlockState() + .get(BlockStateProperties.HORIZONTAL_FACING) + .getOpposite()); } protected SuperByteBuffer transformConnector(SuperByteBuffer buffer, boolean upper, boolean rotating, float angle, diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/engine/EngineRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/engine/EngineRenderer.java index 597895c48..c96459be9 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/engine/EngineRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/engine/EngineRenderer.java @@ -2,6 +2,7 @@ package com.simibubi.create.content.contraptions.components.flywheel.engine; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.foundation.render.PartialBufferer; import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; import com.simibubi.create.foundation.utility.AngleHelper; @@ -32,13 +33,13 @@ public class EngineRenderer extends SafeTileEntityRe AllBlockPartials frame = engineBlock.getFrameModel(); if (frame != null) { Direction facing = te.getBlockState() - .get(EngineBlock.HORIZONTAL_FACING); + .get(EngineBlock.HORIZONTAL_FACING); float angle = AngleHelper.rad(AngleHelper.horizontalAngle(facing)); - frame.renderOn(te.getBlockState()) - .rotateCentered(Direction.UP, angle) - .translate(0, 0, -1) - .light(WorldRenderer.getLightmapCoordinates(te.getWorld(), te.getBlockState(), te.getPos())) - .renderInto(ms, buffer.getBuffer(RenderType.getSolid())); + PartialBufferer.get(frame, te.getBlockState()) + .rotateCentered(Direction.UP, angle) + .translate(0, 0, -1) + .light(WorldRenderer.getLightmapCoordinates(te.getWorld(), te.getBlockState(), te.getPos())) + .renderInto(ms, buffer.getBuffer(RenderType.getSolid())); } } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerRenderer.java index 41635cb02..cf0cfe81a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerRenderer.java @@ -5,6 +5,7 @@ import com.mojang.blaze3d.vertex.IVertexBuilder; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; +import com.simibubi.create.foundation.render.PartialBufferer; import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import com.simibubi.create.foundation.utility.AnimationTickHolder; @@ -40,7 +41,7 @@ public class MechanicalMixerRenderer extends KineticTileEntityRenderer { IVertexBuilder vb = buffer.getBuffer(RenderType.getSolid()); - SuperByteBuffer superBuffer = AllBlockPartials.SHAFTLESS_COGWHEEL.renderOn(blockState); + SuperByteBuffer superBuffer = PartialBufferer.get(AllBlockPartials.SHAFTLESS_COGWHEEL, blockState); standardKineticRotationTransform(superBuffer, te, light).renderInto(ms, vb); int packedLightmapCoords = WorldRenderer.getLightmapCoordinates(te.getWorld(), blockState, pos); @@ -49,16 +50,16 @@ public class MechanicalMixerRenderer extends KineticTileEntityRenderer { float time = AnimationTickHolder.getRenderTime(te.getWorld()); float angle = ((time * speed * 6 / 10f) % 360) / 180 * (float) Math.PI; - SuperByteBuffer poleRender = AllBlockPartials.MECHANICAL_MIXER_POLE.renderOn(blockState); + SuperByteBuffer poleRender = PartialBufferer.get(AllBlockPartials.MECHANICAL_MIXER_POLE, blockState); poleRender.translate(0, -renderedHeadOffset, 0) - .light(packedLightmapCoords) - .renderInto(ms, vb); + .light(packedLightmapCoords) + .renderInto(ms, vb); - SuperByteBuffer headRender = AllBlockPartials.MECHANICAL_MIXER_HEAD.renderOn(blockState); + SuperByteBuffer headRender = PartialBufferer.get(AllBlockPartials.MECHANICAL_MIXER_HEAD, blockState); headRender.rotateCentered(Direction.UP, angle) - .translate(0, -renderedHeadOffset, 0) - .light(packedLightmapCoords) - .renderInto(ms, vb); + .translate(0, -renderedHeadOffset, 0) + .light(packedLightmapCoords) + .renderInto(ms, vb); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/motor/CreativeMotorRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/motor/CreativeMotorRenderer.java index 215cf1b57..e8651ecd3 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/motor/CreativeMotorRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/motor/CreativeMotorRenderer.java @@ -3,6 +3,7 @@ package com.simibubi.create.content.contraptions.components.motor; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; +import com.simibubi.create.foundation.render.PartialBufferer; import com.simibubi.create.foundation.render.SuperByteBuffer; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; @@ -15,7 +16,7 @@ public class CreativeMotorRenderer extends KineticTileEntityRenderer { @Override protected SuperByteBuffer getRotatedModel(KineticTileEntity te) { - return AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouth(te.getBlockState()); + return PartialBufferer.getDirectionalSouth(AllBlockPartials.SHAFT_HALF, te.getBlockState()); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressRenderer.java index e2aa898ad..045d4c7a3 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressRenderer.java @@ -4,6 +4,7 @@ import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; +import com.simibubi.create.foundation.render.PartialBufferer; import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; @@ -37,10 +38,10 @@ public class MechanicalPressRenderer extends KineticTileEntityRenderer { int packedLightmapCoords = WorldRenderer.getLightmapCoordinates(te.getWorld(), blockState, pos); float renderedHeadOffset = ((MechanicalPressTileEntity) te).getRenderedHeadOffset(partialTicks); - SuperByteBuffer headRender = AllBlockPartials.MECHANICAL_PRESS_HEAD.renderOnHorizontal(blockState); + SuperByteBuffer headRender = PartialBufferer.getHorizontal(AllBlockPartials.MECHANICAL_PRESS_HEAD, blockState); headRender.translate(0, -renderedHeadOffset, 0) - .light(packedLightmapCoords) - .renderInto(ms, buffer.getBuffer(RenderType.getSolid())); + .light(packedLightmapCoords) + .renderInto(ms, buffer.getBuffer(RenderType.getSolid())); } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawInstance.java index fc9494feb..a3471f32a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawInstance.java @@ -10,6 +10,7 @@ import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; import net.minecraft.block.BlockState; +import net.minecraft.util.Direction; import net.minecraft.util.Rotation; public class SawInstance extends SingleRotatingInstance { @@ -22,7 +23,8 @@ public class SawInstance extends SingleRotatingInstance { protected InstancedModel getModel() { if (blockState.get(FACING).getAxis().isHorizontal()) { BlockState referenceState = blockState.rotate(tile.getWorld(), tile.getPos(), Rotation.CLOCKWISE_180); - return AllBlockPartials.SHAFT_HALF.getModel(getRotatingMaterial(), referenceState, referenceState.get(FACING)); + Direction facing = referenceState.get(FACING); + return getRotatingMaterial().getModel(AllBlockPartials.SHAFT_HALF, referenceState, facing); } else { return getRotatingMaterial().getModel(shaft()); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java index 473879dba..99c691fdb 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java @@ -9,6 +9,7 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionRenderDispatcher; +import com.simibubi.create.foundation.render.PartialBufferer; import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringRenderer; @@ -77,13 +78,13 @@ public class SawRenderer extends SafeTileEntityRenderer { if (!blockState.get(SawBlock.AXIS_ALONG_FIRST_COORDINATE)) MatrixStacker.of(ms) - .centre() - .rotateY(90) - .unCentre(); + .centre() + .rotateY(90) + .unCentre(); } - superBuffer = partial.renderOnDirectionalSouth(blockState); + superBuffer = PartialBufferer.getDirectionalSouth(partial, blockState); superBuffer.light(light) - .renderInto(ms, buffer.getBuffer(RenderType.getCutoutMipped())); + .renderInto(ms, buffer.getBuffer(RenderType.getCutoutMipped())); ms.pop(); } @@ -140,7 +141,7 @@ public class SawRenderer extends SafeTileEntityRenderer { protected SuperByteBuffer getRotatedModel(KineticTileEntity te) { BlockState state = te.getBlockState(); if (state.get(FACING).getAxis().isHorizontal()) - return AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouth(state.rotate(te.getWorld(), te.getPos(), Rotation.CLOCKWISE_180)); + return PartialBufferer.getDirectionalSouth(AllBlockPartials.SHAFT_HALF, state.rotate(te.getWorld(), te.getPos(), Rotation.CLOCKWISE_180)); return CreateClient.bufferCache.renderBlockIn(KineticTileEntityRenderer.KINETIC_TILE, getRenderedBlockState(te)); } @@ -171,14 +172,14 @@ public class SawRenderer extends SafeTileEntityRenderer { if (SawBlock.isHorizontal(state)) { if (shouldAnimate) - superBuffer = AllBlockPartials.SAW_BLADE_HORIZONTAL_ACTIVE.renderOn(state); + superBuffer = PartialBufferer.get(AllBlockPartials.SAW_BLADE_HORIZONTAL_ACTIVE, state); else - superBuffer = AllBlockPartials.SAW_BLADE_HORIZONTAL_INACTIVE.renderOn(state); + superBuffer = PartialBufferer.get(AllBlockPartials.SAW_BLADE_HORIZONTAL_INACTIVE, state); } else { if (shouldAnimate) - superBuffer = AllBlockPartials.SAW_BLADE_VERTICAL_ACTIVE.renderOn(state); + superBuffer = PartialBufferer.get(AllBlockPartials.SAW_BLADE_VERTICAL_ACTIVE, state); else - superBuffer = AllBlockPartials.SAW_BLADE_VERTICAL_INACTIVE.renderOn(state); + superBuffer = PartialBufferer.get(AllBlockPartials.SAW_BLADE_VERTICAL_INACTIVE, state); } for (MatrixStack m : matrixStacks) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingRenderer.java index 6a81320bd..d176eccbb 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingRenderer.java @@ -4,6 +4,7 @@ import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; +import com.simibubi.create.foundation.render.PartialBufferer; import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import com.simibubi.create.foundation.utility.AngleHelper; @@ -30,27 +31,27 @@ public class BearingRenderer extends KineticTileEntityRenderer { IBearingTileEntity bearingTe = (IBearingTileEntity) te; final Direction facing = te.getBlockState() - .get(BlockStateProperties.FACING); + .get(BlockStateProperties.FACING); AllBlockPartials top = - bearingTe.isWoodenTop() ? AllBlockPartials.BEARING_TOP_WOODEN : AllBlockPartials.BEARING_TOP; - SuperByteBuffer superBuffer = top.renderOn(te.getBlockState()); + bearingTe.isWoodenTop() ? AllBlockPartials.BEARING_TOP_WOODEN : AllBlockPartials.BEARING_TOP; + SuperByteBuffer superBuffer = PartialBufferer.get(top, te.getBlockState()); float interpolatedAngle = bearingTe.getInterpolatedAngle(partialTicks - 1); kineticRotationTransform(superBuffer, te, facing.getAxis(), (float) (interpolatedAngle / 180 * Math.PI), light); if (facing.getAxis() - .isHorizontal()) + .isHorizontal()) superBuffer.rotateCentered(Direction.UP, - AngleHelper.rad(AngleHelper.horizontalAngle(facing.getOpposite()))); + AngleHelper.rad(AngleHelper.horizontalAngle(facing.getOpposite()))); superBuffer.rotateCentered(Direction.EAST, AngleHelper.rad(-90 - AngleHelper.verticalAngle(facing))); superBuffer.renderInto(ms, buffer.getBuffer(RenderType.getSolid())); } @Override protected SuperByteBuffer getRotatedModel(KineticTileEntity te) { - return AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouth(te.getBlockState(), te.getBlockState() - .get(BearingBlock.FACING) - .getOpposite()); + return PartialBufferer.getDirectionalSouth(AllBlockPartials.SHAFT_HALF, te.getBlockState(), te.getBlockState() + .get(BearingBlock.FACING) + .getOpposite()); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedBearingMovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedBearingMovementBehaviour.java index 4db44925a..4cab614ba 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedBearingMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedBearingMovementBehaviour.java @@ -12,6 +12,7 @@ import com.simibubi.create.content.contraptions.components.structureMovement.Ori import com.simibubi.create.content.contraptions.components.structureMovement.render.ActorInstance; import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionKineticRenderer; import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionRenderDispatcher; +import com.simibubi.create.foundation.render.PartialBufferer; import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import com.simibubi.create.foundation.utility.AnimationTickHolder; @@ -35,7 +36,7 @@ public class StabilizedBearingMovementBehaviour extends MovementBehaviour { Direction facing = context.state.get(BlockStateProperties.FACING); AllBlockPartials top = AllBlockPartials.BEARING_TOP; - SuperByteBuffer superBuffer = top.renderOn(context.state); + SuperByteBuffer superBuffer = PartialBufferer.get(top, context.state); float renderPartialTicks = AnimationTickHolder.getPartialTicks(); // rotate to match blockstate diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerRenderer.java index 83679ee68..1abccec33 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerRenderer.java @@ -2,6 +2,7 @@ package com.simibubi.create.content.contraptions.components.structureMovement.ch import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.foundation.render.PartialBufferer; import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; @@ -28,7 +29,7 @@ public class StickerRenderer extends SafeTileEntityRenderer { if (FastRenderDispatcher.available(te.getWorld())) return; BlockState state = te.getBlockState(); - SuperByteBuffer head = AllBlockPartials.STICKER_HEAD.renderOn(state); + SuperByteBuffer head = PartialBufferer.get(AllBlockPartials.STICKER_HEAD, state); float offset = te.piston.getValue(AnimationTickHolder.getPartialTicks(te.getWorld())); if (te.getWorld() != Minecraft.getInstance().world && !te.isVirtual()) @@ -36,9 +37,9 @@ public class StickerRenderer extends SafeTileEntityRenderer { Direction facing = state.get(StickerBlock.FACING); head.matrixStacker() - .nudge(te.hashCode()) - .centre() - .rotateY(AngleHelper.horizontalAngle(facing)) + .nudge(te.hashCode()) + .centre() + .rotateY(AngleHelper.horizontalAngle(facing)) .rotateX(AngleHelper.verticalAngle(facing) + 90) .unCentre() .translate(0, (offset * offset) * 4 / 16f, 0); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryCarriageRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryCarriageRenderer.java index 8faa4f599..72152ff04 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryCarriageRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryCarriageRenderer.java @@ -4,6 +4,7 @@ import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; +import com.simibubi.create.foundation.render.PartialBufferer; import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import com.simibubi.create.foundation.utility.AngleHelper; @@ -54,16 +55,16 @@ public class GantryCarriageRenderer extends KineticTileEntityRenderer { if (facing == Direction.NORTH || facing == Direction.EAST) angleForTe *= -1; - SuperByteBuffer cogs = AllBlockPartials.GANTRY_COGS.renderOn(state); + SuperByteBuffer cogs = PartialBufferer.get(AllBlockPartials.GANTRY_COGS, state); cogs.matrixStacker() - .centre() - .rotateY(AngleHelper.horizontalAngle(facing)) - .rotateX(facing == Direction.UP ? 0 : facing == Direction.DOWN ? 180 : 90) - .rotateY(alongFirst ^ facing.getAxis() == Axis.Z ? 90 : 0) - .translate(0, -9 / 16f, 0) - .multiply(Vector3f.POSITIVE_X.getRadialQuaternion(-angleForTe)) - .translate(0, 9 / 16f, 0) - .unCentre(); + .centre() + .rotateY(AngleHelper.horizontalAngle(facing)) + .rotateX(facing == Direction.UP ? 0 : facing == Direction.DOWN ? 180 : 90) + .rotateY(alongFirst ^ facing.getAxis() == Axis.Z ? 90 : 0) + .translate(0, -9 / 16f, 0) + .multiply(Vector3f.POSITIVE_X.getRadialQuaternion(-angleForTe)) + .translate(0, 9 / 16f, 0) + .unCentre(); cogs.light(light) .renderInto(ms, buffer.getBuffer(RenderType.getSolid())); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/AbstractPulleyRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/AbstractPulleyRenderer.java index f707114df..3a7a2b3ff 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/AbstractPulleyRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/AbstractPulleyRenderer.java @@ -6,6 +6,7 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.IRotate; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; +import com.simibubi.create.foundation.render.PartialBufferer; import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import com.simibubi.create.foundation.utility.AngleHelper; @@ -50,16 +51,16 @@ public abstract class AbstractPulleyRenderer extends KineticTileEntityRenderer { boolean running = isRunning(te); Axis rotationAxis = ((IRotate) te.getBlockState() - .getBlock()).getRotationAxis(te.getBlockState()); + .getBlock()).getRotationAxis(te.getBlockState()); kineticRotationTransform(getRotatedCoil(te), te, rotationAxis, AngleHelper.rad(offset * 180), light) - .renderInto(ms, buffer.getBuffer(RenderType.getSolid())); + .renderInto(ms, buffer.getBuffer(RenderType.getSolid())); World world = te.getWorld(); BlockState blockState = te.getBlockState(); BlockPos pos = te.getPos(); - SuperByteBuffer halfMagnet = this.halfMagnet.renderOn(blockState); - SuperByteBuffer halfRope = this.halfRope.renderOn(blockState); + SuperByteBuffer halfMagnet = PartialBufferer.get(this.halfMagnet, blockState); + SuperByteBuffer halfRope = PartialBufferer.get(this.halfRope, blockState); SuperByteBuffer magnet = renderMagnet(te); SuperByteBuffer rope = renderRope(te); @@ -106,8 +107,7 @@ public abstract class AbstractPulleyRenderer extends KineticTileEntityRenderer { protected SuperByteBuffer getRotatedCoil(KineticTileEntity te) { BlockState blockState = te.getBlockState(); - return getCoil().renderOnDirectionalSouth(blockState, - Direction.getFacingFromAxis(AxisDirection.POSITIVE, getShaftAxis(te))); + return PartialBufferer.getDirectionalSouth(getCoil(), blockState, Direction.getFacingFromAxis(AxisDirection.POSITIVE, getShaftAxis(te))); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/HosePulleyInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/HosePulleyInstance.java index 8003596b2..a1adb0e43 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/HosePulleyInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/HosePulleyInstance.java @@ -28,7 +28,7 @@ public class HosePulleyInstance extends AbstractPulleyInstance { } protected InstancedModel getCoilModel() { - return AllBlockPartials.HOSE_COIL.getModel(getOrientedMaterial(), blockState, rotatingAbout); + return getOrientedMaterial().getModel(AllBlockPartials.HOSE_COIL, blockState, rotatingAbout); } protected InstancedModel getHalfRopeModel() { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/RopePulleyInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/RopePulleyInstance.java index 8eb8388e4..a3bf2dd82 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/RopePulleyInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/RopePulleyInstance.java @@ -29,7 +29,7 @@ public class RopePulleyInstance extends AbstractPulleyInstance { } protected InstancedModel getCoilModel() { - return AllBlockPartials.ROPE_COIL.getModel(getOrientedMaterial(), blockState, rotatingAbout); + return getOrientedMaterial().getModel(AllBlockPartials.ROPE_COIL, blockState, rotatingAbout); } protected InstancedModel getHalfRopeModel() { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/CouplingRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/CouplingRenderer.java index 9b5544c1b..0a6edeb8d 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/CouplingRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/CouplingRenderer.java @@ -8,6 +8,7 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.CreateClient; import com.simibubi.create.content.contraptions.KineticDebugger; import com.simibubi.create.content.contraptions.components.structureMovement.train.capability.MinecartController; +import com.simibubi.create.foundation.render.PartialBufferer; import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.ColorHelper; @@ -36,7 +37,7 @@ public class CouplingRenderer { c -> { if (c.getFirst().hasContraptionCoupling(true)) return; - CouplingRenderer.renderCoupling(ms, buffer, c.map(MinecartController::cart)); + CouplingRenderer.renderCoupling(ms, buffer, c.map(MinecartController::cart)); }); } @@ -47,37 +48,37 @@ public class CouplingRenderer { public static void renderCoupling(MatrixStack ms, IRenderTypeBuffer buffer, Couple carts) { ClientWorld world = Minecraft.getInstance().world; - + if (carts.getFirst() == null || carts.getSecond() == null) return; - + Couple lightValues = carts.map(c -> WorldRenderer.getLightmapCoordinates(world, new BlockPos(c.getBoundingBox() .getCenter()))); Vector3d center = carts.getFirst() - .getPositionVec() - .add(carts.getSecond() - .getPositionVec()) - .scale(.5f); + .getPositionVec() + .add(carts.getSecond() + .getPositionVec()) + .scale(.5f); Couple transforms = carts.map(c -> getSuitableCartEndpoint(c, center)); BlockState renderState = Blocks.AIR.getDefaultState(); IVertexBuilder builder = buffer.getBuffer(RenderType.getSolid()); - SuperByteBuffer attachment = AllBlockPartials.COUPLING_ATTACHMENT.renderOn(renderState); - SuperByteBuffer ring = AllBlockPartials.COUPLING_RING.renderOn(renderState); - SuperByteBuffer connector = AllBlockPartials.COUPLING_CONNECTOR.renderOn(renderState); + SuperByteBuffer attachment = PartialBufferer.get(AllBlockPartials.COUPLING_ATTACHMENT, renderState); + SuperByteBuffer ring = PartialBufferer.get(AllBlockPartials.COUPLING_RING, renderState); + SuperByteBuffer connector = PartialBufferer.get(AllBlockPartials.COUPLING_CONNECTOR, renderState); Vector3d zero = Vector3d.ZERO; Vector3d firstEndpoint = transforms.getFirst() - .apply(zero); + .apply(zero); Vector3d secondEndpoint = transforms.getSecond() - .apply(zero); + .apply(zero); Vector3d endPointDiff = secondEndpoint.subtract(firstEndpoint); double connectorYaw = -Math.atan2(endPointDiff.z, endPointDiff.x) * 180.0D / Math.PI; double connectorPitch = Math.atan2(endPointDiff.y, endPointDiff.mul(1, 0, 1) - .length()) * 180 / Math.PI; + .length()) * 180 / Math.PI; MatrixStacker msr = MatrixStacker.of(ms); carts.forEachWithContext((cart, isFirst) -> { diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpCogInstance.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpCogInstance.java index 202a93992..470b5ab4e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpCogInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpCogInstance.java @@ -10,6 +10,7 @@ import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; import net.minecraft.block.BlockState; +import net.minecraft.util.Direction; public class PumpCogInstance extends SingleRotatingInstance { @@ -19,7 +20,8 @@ public class PumpCogInstance extends SingleRotatingInstance { @Override protected InstancedModel getModel() { - BlockState referenceState = tile.getBlockState(); - return AllBlockPartials.MECHANICAL_PUMP_COG.getModel(getRotatingMaterial(), referenceState, referenceState.get(FACING)); - } + BlockState referenceState = tile.getBlockState(); + Direction facing = referenceState.get(FACING); + return getRotatingMaterial().getModel(AllBlockPartials.MECHANICAL_PUMP_COG, referenceState, facing); + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpRenderer.java index d8dd29f3d..b26a6d5a1 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpRenderer.java @@ -4,6 +4,7 @@ import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; +import com.simibubi.create.foundation.render.PartialBufferer; import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.MatrixStacker; @@ -34,17 +35,17 @@ public class PumpRenderer extends KineticTileEntityRenderer { float angle = MathHelper.lerp(pump.arrowDirection.getValue(partialTicks), 0, 90) - 90; for (float yRot : new float[] { 0, 90 }) { ms.push(); - SuperByteBuffer arrow = AllBlockPartials.MECHANICAL_PUMP_ARROW.renderOn(blockState); + SuperByteBuffer arrow = PartialBufferer.get(AllBlockPartials.MECHANICAL_PUMP_ARROW, blockState); Direction direction = blockState.get(PumpBlock.FACING); MatrixStacker.of(ms) - .centre() - .rotateY(AngleHelper.horizontalAngle(direction) + 180) - .rotateX(-AngleHelper.verticalAngle(direction) - 90) - .unCentre() - .translate(rotationOffset) - .rotateY(yRot) - .rotateZ(angle) - .translateBack(rotationOffset); + .centre() + .rotateY(AngleHelper.horizontalAngle(direction) + 180) + .rotateX(-AngleHelper.verticalAngle(direction) - 90) + .unCentre() + .translate(rotationOffset) + .rotateY(yRot) + .rotateZ(angle) + .translateBack(rotationOffset); arrow.light(light).renderInto(ms, buffer.getBuffer(RenderType.getSolid())); ms.pop(); } @@ -52,7 +53,7 @@ public class PumpRenderer extends KineticTileEntityRenderer { @Override protected SuperByteBuffer getRotatedModel(KineticTileEntity te) { - return AllBlockPartials.MECHANICAL_PUMP_COG.renderOnDirectionalSouth(te.getBlockState()); + return PartialBufferer.getDirectionalSouth(AllBlockPartials.MECHANICAL_PUMP_COG, te.getBlockState()); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/HosePulleyRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/HosePulleyRenderer.java index c0d4091c6..d73652919 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/HosePulleyRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/HosePulleyRenderer.java @@ -3,6 +3,7 @@ package com.simibubi.create.content.contraptions.fluids.actors; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.components.structureMovement.pulley.AbstractPulleyRenderer; +import com.simibubi.create.foundation.render.PartialBufferer; import com.simibubi.create.foundation.render.SuperByteBuffer; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; @@ -29,12 +30,12 @@ public class HosePulleyRenderer extends AbstractPulleyRenderer { @Override protected SuperByteBuffer renderRope(KineticTileEntity te) { - return AllBlockPartials.HOSE.renderOn(te.getBlockState()); + return PartialBufferer.get(AllBlockPartials.HOSE, te.getBlockState()); } @Override protected SuperByteBuffer renderMagnet(KineticTileEntity te) { - return AllBlockPartials.HOSE_MAGNET.renderOn(te.getBlockState()); + return PartialBufferer.get(AllBlockPartials.HOSE_MAGNET, te.getBlockState()); } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/SpoutRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/SpoutRenderer.java index cc4eaa7a4..f4364a14e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/SpoutRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/SpoutRenderer.java @@ -3,6 +3,7 @@ package com.simibubi.create.content.contraptions.fluids.actors; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.foundation.fluid.FluidRenderer; +import com.simibubi.create.foundation.render.PartialBufferer; import com.simibubi.create.foundation.tileEntity.behaviour.fluid.SmartFluidTankBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.fluid.SmartFluidTankBehaviour.TankSegment; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; @@ -70,9 +71,9 @@ public class SpoutRenderer extends SafeTileEntityRenderer { ms.push(); for (AllBlockPartials bit : BITS) { - bit.renderOn(te.getBlockState()) - .light(light) - .renderInto(ms, buffer.getBuffer(RenderType.getSolid())); + PartialBufferer.get(bit, te.getBlockState()) + .light(light) + .renderInto(ms, buffer.getBuffer(RenderType.getSolid())); ms.translate(0, -3 * squeeze / 32f, 0); } ms.pop(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveRenderer.java index 14439f84a..3d3a02951 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveRenderer.java @@ -4,6 +4,7 @@ import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; +import com.simibubi.create.foundation.render.PartialBufferer; import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import com.simibubi.create.foundation.utility.AngleHelper; @@ -31,7 +32,7 @@ public class FluidValveRenderer extends KineticTileEntityRenderer { super.renderSafe(te, partialTicks, ms, buffer, light, overlay); BlockState blockState = te.getBlockState(); - SuperByteBuffer pointer = AllBlockPartials.FLUID_VALVE_POINTER.renderOn(blockState); + SuperByteBuffer pointer = PartialBufferer.get(AllBlockPartials.FLUID_VALVE_POINTER, blockState); Direction facing = blockState.get(FluidValveBlock.FACING); if (!(te instanceof FluidValveTileEntity)) diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerRenderer.java index df11ef484..c12ce5b23 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerRenderer.java @@ -3,6 +3,7 @@ package com.simibubi.create.content.contraptions.processing.burner; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock.HeatLevel; +import com.simibubi.create.foundation.render.PartialBufferer; import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; import com.simibubi.create.foundation.utility.AngleHelper; @@ -31,10 +32,10 @@ public class BlazeBurnerRenderer extends SafeTileEntityRenderer { AllBlockPartials beltPartial = getBeltPartial(diagonal, start, end, bottom); - SuperByteBuffer beltBuffer = beltPartial.renderOn(blockState) - .light(light); + SuperByteBuffer beltBuffer = PartialBufferer.get(beltPartial, blockState) + .light(light); SpriteShiftEntry spriteShift = getSpriteShiftEntry(color, diagonal, bottom); @@ -127,18 +129,20 @@ public class BeltRenderer extends SafeTileEntityRenderer { } if (te.hasPulley()) { - // TODO 1.15 find a way to cache this model matrix computation - MatrixStack modelTransform = new MatrixStack(); - Direction dir = blockState.get(BeltBlock.HORIZONTAL_FACING).rotateY(); - if (sideways) dir = Direction.UP; - msr = MatrixStacker.of(modelTransform); - msr.centre(); - if (dir.getAxis() == Axis.X) msr.rotateY(90); - if (dir.getAxis() == Axis.Y) msr.rotateX(90); - msr.rotateX(90); - msr.unCentre(); + Direction dir = sideways ? Direction.UP : blockState.get(BeltBlock.HORIZONTAL_FACING).rotateY(); - SuperByteBuffer superBuffer = CreateClient.bufferCache.renderDirectionalPartial(AllBlockPartials.BELT_PULLEY, blockState, dir, modelTransform); + Supplier matrixStackSupplier = () -> { + MatrixStack stack = new MatrixStack(); + MatrixStacker stacker = MatrixStacker.of(stack); + stacker.centre(); + if (dir.getAxis() == Axis.X) stacker.rotateY(90); + if (dir.getAxis() == Axis.Y) stacker.rotateX(90); + stacker.rotateX(90); + stacker.unCentre(); + return stack; + }; + + SuperByteBuffer superBuffer = CreateClient.bufferCache.renderDirectionalPartial(AllBlockPartials.BELT_PULLEY, blockState, dir, matrixStackSupplier); KineticTileEntityRenderer.standardKineticRotationTransform(superBuffer, te, light).renderInto(ms, vb); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftInstance.java b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftInstance.java index 92eab7077..f317fd24d 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftInstance.java @@ -30,12 +30,12 @@ public class SplitShaftInstance extends KineticTileInstance half = AllBlockPartials.SHAFT_HALF.getModel(rotatingMaterial, blockState, dir); + InstancedModel half = rotatingMaterial.getModel(AllBlockPartials.SHAFT_HALF, blockState, dir); - float splitSpeed = speed * tile.getRotationSpeedModifier(dir); + float splitSpeed = speed * tile.getRotationSpeedModifier(dir); - keys.add(setup(half.createInstance(), splitSpeed)); - } + keys.add(setup(half.createInstance(), splitSpeed)); + } } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java index a1cf575af..4e35c6bdc 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java @@ -5,6 +5,7 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.IRotate; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; +import com.simibubi.create.foundation.render.PartialBufferer; import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import com.simibubi.create.foundation.utility.AnimationTickHolder; @@ -51,7 +52,7 @@ public class SplitShaftRenderer extends KineticTileEntityRenderer { angle = angle / 180f * (float) Math.PI; SuperByteBuffer superByteBuffer = - AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouth(te.getBlockState(), direction); + PartialBufferer.getDirectionalSouth(AllBlockPartials.SHAFT_HALF, te.getBlockState(), direction); kineticRotationTransform(superByteBuffer, te, axis, angle, light); superByteBuffer.renderInto(ms, buffer.getBuffer(RenderType.getSolid())); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/GaugeRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/GaugeRenderer.java index bc89519bb..5a1d37e39 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/GaugeRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/GaugeRenderer.java @@ -6,6 +6,7 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.contraptions.relays.gauge.GaugeBlock.Type; +import com.simibubi.create.foundation.render.PartialBufferer; import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import com.simibubi.create.foundation.utility.Iterate; @@ -25,11 +26,11 @@ public class GaugeRenderer extends KineticTileEntityRenderer { public static GaugeRenderer speed(TileEntityRendererDispatcher dispatcher) { return new GaugeRenderer(dispatcher, Type.SPEED); } - + public static GaugeRenderer stress(TileEntityRendererDispatcher dispatcher) { return new GaugeRenderer(dispatcher, Type.STRESS); } - + protected GaugeRenderer(TileEntityRendererDispatcher dispatcher, GaugeBlock.Type type) { super(dispatcher); this.type = type; @@ -45,17 +46,17 @@ public class GaugeRenderer extends KineticTileEntityRenderer { GaugeTileEntity gaugeTE = (GaugeTileEntity) te; int lightCoords = WorldRenderer.getLightmapCoordinates(te.getWorld(), gaugeState, te.getPos()); + AllBlockPartials allBlockPartials = (type == Type.SPEED ? AllBlockPartials.GAUGE_HEAD_SPEED : AllBlockPartials.GAUGE_HEAD_STRESS); SuperByteBuffer headBuffer = - (type == Type.SPEED ? AllBlockPartials.GAUGE_HEAD_SPEED : AllBlockPartials.GAUGE_HEAD_STRESS) - .renderOn(gaugeState); - SuperByteBuffer dialBuffer = AllBlockPartials.GAUGE_DIAL.renderOn(gaugeState); + PartialBufferer.get(allBlockPartials, gaugeState); + SuperByteBuffer dialBuffer = PartialBufferer.get(AllBlockPartials.GAUGE_DIAL, gaugeState); float dialPivot = 5.75f / 16; float progress = MathHelper.lerp(partialTicks, gaugeTE.prevDialState, gaugeTE.dialState); for (Direction facing : Iterate.directions) { if (!((GaugeBlock) gaugeState.getBlock()).shouldRenderHeadOnFace(te.getWorld(), te.getPos(), gaugeState, - facing)) + facing)) continue; IVertexBuilder vb = buffer.getBuffer(RenderType.getSolid()); diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxInstance.java b/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxInstance.java index 62a2cd6b2..a991802fa 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxInstance.java @@ -36,20 +36,20 @@ public class GearboxInstance extends KineticTileInstance { RenderMaterial> rotatingMaterial = getRotatingMaterial(); for (Direction direction : Iterate.directions) { - final Direction.Axis axis = direction.getAxis(); - if (boxAxis == axis) - continue; + final Direction.Axis axis = direction.getAxis(); + if (boxAxis == axis) + continue; - InstancedModel shaft = AllBlockPartials.SHAFT_HALF.getModel(rotatingMaterial, blockState, direction); + InstancedModel shaft = rotatingMaterial.getModel(AllBlockPartials.SHAFT_HALF, blockState, direction); - RotatingData key = shaft.createInstance(); + RotatingData key = shaft.createInstance(); - key.setRotationAxis(Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis).getUnitVector()) - .setRotationalSpeed(getSpeed(direction)) - .setRotationOffset(getRotationOffset(axis)).setColor(tile) - .setPosition(getInstancePosition()) - .setBlockLight(blockLight) - .setSkyLight(skyLight); + key.setRotationAxis(Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis).getUnitVector()) + .setRotationalSpeed(getSpeed(direction)) + .setRotationOffset(getRotationOffset(axis)).setColor(tile) + .setPosition(getInstancePosition()) + .setBlockLight(blockLight) + .setSkyLight(skyLight); keys.put(direction, key); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java index 45463f007..78a1206a9 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java @@ -4,6 +4,7 @@ import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; +import com.simibubi.create.foundation.render.PartialBufferer; import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import com.simibubi.create.foundation.utility.AnimationTickHolder; @@ -37,7 +38,7 @@ public class GearboxRenderer extends KineticTileEntityRenderer { if (boxAxis == axis) continue; - SuperByteBuffer shaft = AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouth(te.getBlockState(), direction); + SuperByteBuffer shaft = PartialBufferer.getDirectionalSouth(AllBlockPartials.SHAFT_HALF, te.getBlockState(), direction); float offset = getRotationOffsetForPosition(te, pos, axis); float angle = (time * te.getSpeed() * 3f / 10) % 360; diff --git a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelRenderer.java b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelRenderer.java index f82be3bb1..49252ec37 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelRenderer.java @@ -3,6 +3,7 @@ package com.simibubi.create.content.logistics.block.belts.tunnel; import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.vertex.IVertexBuilder; import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.foundation.render.PartialBufferer; import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import com.simibubi.create.foundation.tileEntity.renderer.SmartTileEntityRenderer; @@ -32,7 +33,7 @@ public class BeltTunnelRenderer extends SmartTileEntityRenderer { BlockState blockState = te.getBlockState(); IVertexBuilder vb = buffer.getBuffer(RenderType.getSolid()); - SuperByteBuffer flapBuffer = (blockState.getBlock() instanceof FunnelBlock ? AllBlockPartials.FUNNEL_FLAP - : AllBlockPartials.BELT_FUNNEL_FLAP).renderOn(blockState); + AllBlockPartials allBlockPartials = (blockState.getBlock() instanceof FunnelBlock ? AllBlockPartials.FUNNEL_FLAP + : AllBlockPartials.BELT_FUNNEL_FLAP); + SuperByteBuffer flapBuffer = PartialBufferer.get(allBlockPartials, blockState); Vector3d pivot = VecHelper.voxelSpace(0, 10, 9.5f); MatrixStacker msr = MatrixStacker.of(ms); float horizontalAngle = AngleHelper.horizontalAngle(FunnelBlock.getFunnelFacing(blockState) - .getOpposite()); + .getOpposite()); float f = te.flap.get(partialTicks); ms.push(); msr.centre() - .rotateY(horizontalAngle) + .rotateY(horizontalAngle) .unCentre(); ms.translate(0, 0, -te.getFlapOffset()); diff --git a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java index 6553f676c..2a9a72ac3 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java @@ -6,6 +6,7 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.logistics.block.mechanicalArm.ArmTileEntity.Phase; +import com.simibubi.create.foundation.render.PartialBufferer; import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import com.simibubi.create.foundation.utility.AnimationTickHolder; @@ -66,7 +67,7 @@ public class ArmRenderer extends KineticTileEntityRenderer { float lowerArmAngle = arm.lowerArmAngle.get(pt) - 135; float upperArmAngle = arm.upperArmAngle.get(pt) - 90; float headAngle = arm.headAngle.get(pt); - + boolean rave = arm.phase == Phase.DANCING; float renderTick = AnimationTickHolder.getRenderTime(te.getWorld()) + (te.hashCode() % 64); if (rave) { @@ -104,21 +105,21 @@ public class ArmRenderer extends KineticTileEntityRenderer { } private void renderArm(IVertexBuilder builder, MatrixStack ms, MatrixStack msLocal, MatrixStacker msr, BlockState blockState, int color, float baseAngle, float lowerArmAngle, float upperArmAngle, float headAngle, boolean hasItem, boolean isBlockItem, int light) { - SuperByteBuffer base = AllBlockPartials.ARM_BASE.renderOn(blockState).light(light); - SuperByteBuffer lowerBody = AllBlockPartials.ARM_LOWER_BODY.renderOn(blockState).light(light); - SuperByteBuffer upperBody = AllBlockPartials.ARM_UPPER_BODY.renderOn(blockState).light(light); - SuperByteBuffer head = AllBlockPartials.ARM_HEAD.renderOn(blockState).light(light); - SuperByteBuffer claw = AllBlockPartials.ARM_CLAW_BASE.renderOn(blockState).light(light); - SuperByteBuffer clawGrip = AllBlockPartials.ARM_CLAW_GRIP.renderOn(blockState); + SuperByteBuffer base = PartialBufferer.get(AllBlockPartials.ARM_BASE, blockState).light(light); + SuperByteBuffer lowerBody = PartialBufferer.get(AllBlockPartials.ARM_LOWER_BODY, blockState).light(light); + SuperByteBuffer upperBody = PartialBufferer.get(AllBlockPartials.ARM_UPPER_BODY, blockState).light(light); + SuperByteBuffer head = PartialBufferer.get(AllBlockPartials.ARM_HEAD, blockState).light(light); + SuperByteBuffer claw = PartialBufferer.get(AllBlockPartials.ARM_CLAW_BASE, blockState).light(light); + SuperByteBuffer clawGrip = PartialBufferer.get(AllBlockPartials.ARM_CLAW_GRIP, blockState); transformBase(msr, baseAngle); base.transform(msLocal) - .renderInto(ms, builder); + .renderInto(ms, builder); transformLowerArm(msr, lowerArmAngle); lowerBody.color(color) - .transform(msLocal) - .renderInto(ms, builder); + .transform(msLocal) + .renderInto(ms, builder); transformUpperArm(msr, upperArmAngle); upperBody.color(color) @@ -182,7 +183,7 @@ public class ArmRenderer extends KineticTileEntityRenderer { @Override protected SuperByteBuffer getRotatedModel(KineticTileEntity te) { - return AllBlockPartials.ARM_COG.renderOn(te.getBlockState()); + return PartialBufferer.get(AllBlockPartials.ARM_COG, te.getBlockState()); } } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/redstone/AnalogLeverRenderer.java b/src/main/java/com/simibubi/create/content/logistics/block/redstone/AnalogLeverRenderer.java index cbde2d0e5..329760ede 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/redstone/AnalogLeverRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/redstone/AnalogLeverRenderer.java @@ -3,6 +3,7 @@ package com.simibubi.create.content.logistics.block.redstone; import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.vertex.IVertexBuilder; import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.foundation.render.PartialBufferer; import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; @@ -36,20 +37,20 @@ public class AnalogLeverRenderer extends SafeTileEntityRenderer ms = () -> { + MatrixStack stack = new MatrixStack(); + MatrixStacker.of(stack) + .centre() + .rotateY(AngleHelper.horizontalAngle(facing)) + .rotateX(facing == Direction.UP ? 0 : facing == Direction.DOWN ? 180 : 90) + .unCentre(); + + return stack; + }; + return CreateClient.bufferCache.renderDirectionalPartial(partial, referenceState, facing, ms); + } + + public static Supplier rotateToFace(Direction facing) { + return () -> { + MatrixStack stack = new MatrixStack(); + MatrixStacker.of(stack) + .centre() + .rotateY(AngleHelper.horizontalAngle(facing)) + .rotateX(AngleHelper.verticalAngle(facing)) + .unCentre(); + return stack; + }; + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/render/SuperByteBufferCache.java b/src/main/java/com/simibubi/create/foundation/render/SuperByteBufferCache.java index 93407bc6b..2293037d2 100644 --- a/src/main/java/com/simibubi/create/foundation/render/SuperByteBufferCache.java +++ b/src/main/java/com/simibubi/create/foundation/render/SuperByteBufferCache.java @@ -46,9 +46,9 @@ public class SuperByteBufferCache { } public SuperByteBuffer renderPartial(AllBlockPartials partial, BlockState referenceState, - MatrixStack modelTransform) { + Supplier modelTransform) { return get(Compartment.PARTIAL, partial, - () -> standardModelRender(partial.get(), referenceState, modelTransform)); + () -> standardModelRender(partial.get(), referenceState, modelTransform.get())); } public SuperByteBuffer renderDirectionalPartial(AllBlockPartials partial, BlockState referenceState, @@ -58,9 +58,9 @@ public class SuperByteBufferCache { } public SuperByteBuffer renderDirectionalPartial(AllBlockPartials partial, BlockState referenceState, Direction dir, - MatrixStack modelTransform) { + Supplier modelTransform) { return get(Compartment.DIRECTIONAL_PARTIAL, Pair.of(dir, partial), - () -> standardModelRender(partial.get(), referenceState, modelTransform)); + () -> standardModelRender(partial.get(), referenceState, modelTransform.get())); } public SuperByteBuffer renderBlockIn(Compartment compartment, BlockState toRender) { diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/RenderMaterial.java b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/RenderMaterial.java index f2f3e1bc7..f383bad97 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/RenderMaterial.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/RenderMaterial.java @@ -22,6 +22,8 @@ import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import com.simibubi.create.foundation.render.backend.gl.BasicProgram; import com.simibubi.create.foundation.render.backend.gl.shader.ProgramSpec; import com.simibubi.create.foundation.render.backend.gl.shader.ShaderCallback; +import com.simibubi.create.foundation.utility.AngleHelper; +import com.simibubi.create.foundation.utility.MatrixStacker; import net.minecraft.block.BlockState; import net.minecraft.client.Minecraft; @@ -104,8 +106,7 @@ public class RenderMaterial

buildModel(partial.get(), referenceState)); + return getModel(partial, referenceState, dir, rotateToFace(dir)); } public MODEL getModel(AllBlockPartials partial, BlockState referenceState, Direction dir, Supplier modelTransform) { @@ -132,14 +133,25 @@ public class RenderMaterial

rotateToFace(Direction facing) { + return () -> { + MatrixStack stack = new MatrixStack(); + MatrixStacker.of(stack) + .centre() + .rotateY(AngleHelper.horizontalAngle(facing)) + .rotateX(AngleHelper.verticalAngle(facing)) + .unCentre(); + return stack; + }; + } } From 572b30f8152627f38824920270601a7a33365909 Mon Sep 17 00:00:00 2001 From: CKenJa <41111170+CKenJa@users.noreply.github.com> Date: Thu, 29 Apr 2021 18:58:23 +0900 Subject: [PATCH 10/18] Update & fix ja_jp.json credit: RakuGaki-MC --- .../resources/assets/create/lang/ja_jp.json | 1422 ++++++++++------- 1 file changed, 874 insertions(+), 548 deletions(-) diff --git a/src/main/resources/assets/create/lang/ja_jp.json b/src/main/resources/assets/create/lang/ja_jp.json index 0c0543021..6e05619b5 100644 --- a/src/main/resources/assets/create/lang/ja_jp.json +++ b/src/main/resources/assets/create/lang/ja_jp.json @@ -163,7 +163,7 @@ "block.create.gabbro_cobblestone_stairs": "斑れい岩の丸石の階段", "block.create.gabbro_cobblestone_wall": "斑れい岩の丸石の壁", "block.create.gabbro_pillar": "斑れい岩の柱", - "block.create.gantry_pinion": "ガントリーピニオン", + "block.create.gantry_carriage": "ガントリーキャリッジ", "block.create.gantry_shaft": "ガントリーシャフト", "block.create.gearbox": "ギアボックス", "block.create.gearshift": "ギアシフト", @@ -349,7 +349,7 @@ "block.create.red_valve_handle": "赤色のバルブハンドル", "block.create.redstone_contact": "レッドストーンコンタクト", "block.create.redstone_link": "レッドストーンリンク", - "block.create.refined_radiance_casing": "極光体ケーシング", + "block.create.refined_radiance_casing": "光輝ケーシング", "block.create.reinforced_rail": "補強レール", "block.create.rope": "ロープ", "block.create.rope_pulley": "ローププーリー", @@ -373,18 +373,19 @@ "block.create.shaft": "シャフト", "block.create.smart_chute": "スマートシュート", "block.create.smart_fluid_pipe": "スマート液体パイプ", - "block.create.speedometer": "回転速度メーター", + "block.create.speedometer": "速度メーター", "block.create.spout": "アイテム注液口", "block.create.spruce_window": "マツの窓", "block.create.spruce_window_pane": "マツの窓パネル", + "block.create.sticker": "スティッカー", "block.create.sticky_mechanical_piston": "粘着メカニカルピストン", "block.create.stockpile_switch": "在庫スイッチ", "block.create.stressometer": "応力メーター", "block.create.tiled_glass": "タイルガラス", "block.create.tiled_glass_pane": "タイルガラス板", "block.create.turntable": "ターンテーブル", - "block.create.vertical_framed_glass": "垂直ガラス窓", - "block.create.vertical_framed_glass_pane": "垂直ガラス窓板", + "block.create.vertical_framed_glass": "縦型ガラス窓", + "block.create.vertical_framed_glass_pane": "縦型ガラス窓板", "block.create.warped_window": "歪んだ窓", "block.create.warped_window_pane": "歪んだ窓パネル", "block.create.water_wheel": "水車", @@ -392,12 +393,13 @@ "block.create.weathered_limestone_bricks": "風化した石灰岩レンガ", "block.create.weathered_limestone_bricks_slab": "風化した石灰岩レンガのハーフブロック", "block.create.weathered_limestone_bricks_stairs": "風化した石灰岩レンガの階段", - "block.create.weathered_limestone_bricks_wall": "風化した石灰岩レンガの塀", + "block.create.weathered_limestone_bricks_wall": "風化した石灰岩レンガの壁", "block.create.weathered_limestone_cobblestone": "風化した石灰岩の丸石", "block.create.weathered_limestone_cobblestone_slab": "風化した石灰岩の丸石のハーフブロック", "block.create.weathered_limestone_cobblestone_stairs": "風化した石灰岩の丸石の階段", "block.create.weathered_limestone_cobblestone_wall": "風化した石灰岩の丸石の壁", "block.create.weathered_limestone_pillar": "風化した石灰岩の柱", + "block.create.weighted_ejector": "重量射出機", "block.create.white_sail": "白色の帆", "block.create.white_seat": "白色のシート", "block.create.white_valve_handle": "白色のバルブハンドル", @@ -413,7 +415,7 @@ "entity.create.gantry_contraption": "ガントリーからくり", "entity.create.seat": "シート", "entity.create.stationary_contraption": "付設からくり", - "entity.create.super_glue": "強力接着剤", + "entity.create.super_glue": "超粘着剤", "fluid.create.milk": "牛乳", "fluid.create.potion": "ポーション", @@ -427,15 +429,16 @@ "item.create.blaze_cake_base": "ブレイズケーキの型", "item.create.brass_hand": "真鍮の手", "item.create.brass_ingot": "真鍮インゴット", - "item.create.brass_nugget": "真鍮ナゲット", + "item.create.brass_nugget": "真鍮塊", "item.create.brass_sheet": "真鍮シート", "item.create.builders_tea": "建築家のお茶", "item.create.chest_minecart_contraption": "からくりチェスト付きトロッコ", "item.create.chocolate_bucket": "チョコレート入りバケツ", + "item.create.chocolate_glazed_berries": "チョコレートグレーズドベリー", "item.create.chromatic_compound": "色彩の化合物", "item.create.cinder_flour": "ネザーラックの粉", "item.create.copper_ingot": "銅インゴット", - "item.create.copper_nugget": "銅ナゲット", + "item.create.copper_nugget": "銅塊", "item.create.copper_sheet": "銅板", "item.create.crafter_slot_cover": "クラフタースロットカバー", "item.create.crushed_aluminum_ore": "砕いたアルミニウム鉱石", @@ -465,22 +468,24 @@ "item.create.handheld_blockzapper": "携帯型ブロックザッパー", "item.create.handheld_worldshaper": "携帯型ワールドシェーパー", "item.create.honey_bucket": "ハチミツ入りバケツ", + "item.create.honeyed_apple": "リンゴのハチミツかけ", "item.create.integrated_circuit": "集積回路", "item.create.iron_sheet": "鉄板", "item.create.lapis_sheet": "ラピスラズリ板", - "item.create.minecart_contraption": "からくりトロッコ", + "item.create.minecart_contraption": "からくり付きトロッコ", "item.create.minecart_coupling": "トロッコ連結器", "item.create.polished_rose_quartz": "磨かれたローズクォーツ", "item.create.powdered_obsidian": "黒曜石の粉", "item.create.propeller": "プロペラ", "item.create.red_sand_paper": "赤い紙やすり", - "item.create.refined_radiance": "洗練された極光体", + "item.create.refined_radiance": "高貴な光輝", "item.create.rose_quartz": "ローズクォーツ", "item.create.sand_paper": "紙やすり", "item.create.schematic": "概略図", "item.create.schematic_and_quill": "概略図と羽根ペン", "item.create.shadow_steel": "シャドウスチール", - "item.create.super_glue": "強力接着剤", + "item.create.super_glue": "超粘着剤", + "item.create.sweet_roll": "スイートロール", "item.create.tree_fertilizer": "樹木の肥料", "item.create.vertical_gearbox": "垂直ギアボックス", "item.create.wand_of_symmetry": "対称の杖", @@ -488,19 +493,19 @@ "item.create.whisk": "泡立て器", "item.create.wrench": "レンチ", "item.create.zinc_ingot": "亜鉛インゴット", - "item.create.zinc_nugget": "亜鉛ナゲット", + "item.create.zinc_nugget": "亜鉛塊", "_": "->------------------------] Advancements [------------------------<-", "advancement.create.root": "Createへようこそ", - "advancement.create.root.desc": "素晴らしいからくり仕掛けを作る時間だ!", + "advancement.create.root.desc": "素晴らしいからくり機構を作る時間だ!", "advancement.create.andesite_alloy": "大いに押韻", "advancement.create.andesite_alloy.desc": "Createの素材には変な名前がついています、安山岩合金もその一つです", "advancement.create.its_alive": "こいつ…動くぞ!", "advancement.create.its_alive.desc": "機械の回転を初めて見る", "advancement.create.shifting_gears": "ギアシフト!", - "advancement.create.shifting_gears.desc": "大きい歯車と小さい歯車を噛み合わせて速度を変更する", + "advancement.create.shifting_gears.desc": "大きい歯車と小さい歯車を噛み合わせて回転速度を変更する", "advancement.create.overstressed": "超過応力", "advancement.create.overstressed.desc": "応力の限界を肌で感じる", "advancement.create.belt": "コンブ駆動", @@ -534,7 +539,7 @@ "advancement.create.stressometer": "正確な応力は?", "advancement.create.stressometer.desc": "動作中の応力メーターをゴーグルを通して見て、正確な値を読み取る", "advancement.create.aesthetics": "装飾ブーム!", - "advancement.create.aesthetics.desc": "シャフト、パイプ、歯車に腕木や腕金を取り付ける", + "advancement.create.aesthetics.desc": "シャフト、パイプ、歯車に木製ブラケットや金属ブラケットを取り付ける", "advancement.create.reinforced": "補強ブーム!", "advancement.create.reinforced.desc": "シャフト、パイプ、メカニカルベルトなどにケーシングブロックを取り付ける", "advancement.create.water_wheel": "水力を使おう", @@ -602,7 +607,7 @@ "advancement.create.infinite_chocolate": "空想に溺れて", "advancement.create.infinite_chocolate.desc": "無限と言えるほどの大量の溶けたチョコレートを吸引する", "advancement.create.crafter": "自動作業台", - "advancement.create.crafter.desc": "メカニカルクラフターを設置して、回転力を与える", + "advancement.create.crafter.desc": "メカニカルクラフターを設置して、回転力を供給する", "advancement.create.clockwork_bearing": "時計仕掛け", "advancement.create.clockwork_bearing.desc": "時計仕掛けのベアリングの上に構造物を組み立てる", "advancement.create.nixie_tube": "イカした看板", @@ -618,11 +623,11 @@ "advancement.create.integrated_circuit": "複素数の計算", "advancement.create.integrated_circuit.desc": "集積回路を組み立てる", "advancement.create.mechanical_arm": "手が離せない!", - "advancement.create.mechanical_arm.desc": "搬入先と搬出先を設定したメカニカルアームを設置して、稼働させ、あなたのために一生懸命労働している様子を見る", + "advancement.create.mechanical_arm.desc": "搬入元と搬出先を設定したメカニカルアームを設置して、稼働させ、あなたのために一生懸命労働している様子を見る", "advancement.create.musical_arm": "お気に入りの曲を流して!", "advancement.create.musical_arm.desc": "メカニカルアームがジュークボックスを使う様子を見る", "advancement.create.arm_many_targets": "整理整頓", - "advancement.create.arm_many_targets.desc": "メカニカルアームに10ヶ所以上、出力先を設定する", + "advancement.create.arm_many_targets.desc": "メカニカルアームに10ヶ所以上、搬出先を設定する", "advancement.create.arm_blaze_burner": "燃料補給", "advancement.create.arm_blaze_burner.desc": "メカニカルアームにブレイズバーナーの燃料補給をさせる", "advancement.create.fist_bump": "グータッチだ、兄弟!", @@ -631,12 +636,12 @@ "advancement.create.crushing_wheel.desc": "より効率的に粉砕するために、破砕ホイールを作る", "advancement.create.blaze_cake": "シュガー・ラッシュ", "advancement.create.blaze_cake.desc": "ブレイズバーナーで特別なケーキを焼く", - "advancement.create.chromatic_compound": "二極性鉱物", + "advancement.create.chromatic_compound": "二極性化合物", "advancement.create.chromatic_compound.desc": "色彩の化合物を作る", "advancement.create.shadow_steel": "奈落からの帰還", "advancement.create.shadow_steel.desc": "究極の虚無、「シャドウスチール」を作る", - "advancement.create.refined_radiance": "眩い光", - "advancement.create.refined_radiance.desc": "究極の色彩物質、「洗練された極光体」を作る", + "advancement.create.refined_radiance": "光輝の吹入", + "advancement.create.refined_radiance.desc": "究極の色彩、「高貴な光輝」を作る", "advancement.create.chromatic_age": "色彩の時代", "advancement.create.chromatic_age.desc": "光と闇のケーシングを作る", "advancement.create.zapper": "風格ある建築", @@ -667,7 +672,7 @@ "death.attack.create.mechanical_saw": "%1$s はメカニカルソーで半分にカットされた", "death.attack.create.cuckoo_clock_explosion": "%1$s は改ざんされた鳩時計に爆破された", - "create.block.deployer.damage_source_name": "変異デプロイヤー", + "create.block.deployer.damage_source_name": "悪いデプロイヤー", "create.block.cart_assembler.invalid": "トロッコアセンブラはレールの上にのみ設置できます", "create.recipe.crushing": "粉砕", @@ -691,27 +696,27 @@ "create.recipe.wood_cutting": "自動製材", "create.recipe.blockzapper_upgrade": "携帯型ブロックザッパー", "create.recipe.sandpaper_polishing": "紙やすりでの研磨", - "create.recipe.mystery_conversion": "不思議な変換", + "create.recipe.mystery_conversion": "神秘の変転", "create.recipe.spout_filling": "アイテム注液口による注入", - "create.recipe.draining": "アイテムの排液", - "create.recipe.processing.chance": "%1$s%% チャンス", + "create.recipe.draining": "アイテムから排液", + "create.recipe.processing.chance": "%1$s%%チャンス", "create.recipe.heat_requirement.none": "加熱不要", "create.recipe.heat_requirement.heated": "加熱が必要", - "create.recipe.heat_requirement.superheated": "超加熱が必要", + "create.recipe.heat_requirement.superheated": "極度の加熱が必要", "create.generic.range": "範囲", "create.generic.radius": "半径", "create.generic.width": "幅", "create.generic.height": "高さ", "create.generic.length": "長さ", - "create.generic.speed": "速度", + "create.generic.speed": "回転速度", "create.generic.delay": "遅延", "create.generic.unit.ticks": "ティック", "create.generic.unit.seconds": "秒", "create.generic.unit.minutes": "分", "create.generic.unit.rpm": "RPM", "create.generic.unit.stress": "su", - "create.generic.unit.degrees": "°", + "create.generic.unit.degrees": "度", "create.generic.unit.millibuckets": "%1$smB", "create.generic.clockwise": "時計回り", "create.generic.counter_clockwise": "反時計回り", @@ -759,7 +764,7 @@ "create.gui.blockzapper.pattern.chance25": "25%", "create.gui.blockzapper.pattern.chance50": "50%", "create.gui.blockzapper.pattern.chance75": "75%", - "create.gui.terrainzapper.title": "携帯型ワールドシェイパー", + "create.gui.terrainzapper.title": "携帯型ワールドシェーパー", "create.gui.terrainzapper.placement": "配置", "create.gui.terrainzapper.placement.merged": "合併", "create.gui.terrainzapper.placement.attached": "添える", @@ -779,12 +784,12 @@ "create.terrainzapper.shiftRightClickToSet": "シフト-右クリックで形状を選択", "create.blockzapper.usingBlock": "使用中: %1$s", - "create.blockzapper.componentUpgrades": "コンポーネントアップグレード:", + "create.blockzapper.componentUpgrades": "アップグレード部品:", "create.blockzapper.component.body": "ボディー", - "create.blockzapper.component.amplifier": "増幅", - "create.blockzapper.component.accelerator": "加速", - "create.blockzapper.component.retriever": "レトリーバー", - "create.blockzapper.component.scope": "範囲", + "create.blockzapper.component.amplifier": "範囲", + "create.blockzapper.component.accelerator": "連射", + "create.blockzapper.component.retriever": "回収", + "create.blockzapper.component.scope": "射程", "create.blockzapper.componentTier.none": "無し", "create.blockzapper.componentTier.brass": "真鍮", "create.blockzapper.componentTier.chromatic": "色彩", @@ -825,22 +830,25 @@ "create.gui.goggles.generator_stats": "原動機の統計:", "create.gui.goggles.kinetic_stats": "動力の統計:", - "create.gui.goggles.at_current_speed": "現在の速度", + "create.gui.goggles.at_current_speed": "現在の回転速度", "create.gui.goggles.pole_length": "ポールの長さ:", - "create.gui.assembly.exception": "このからくりは組み立てることができません:", - "create.gui.assembly.exception.unmovableBlock": "移動不可能なブロック (%4$s) 、 [%1$s %2$s %3$s]", - "create.gui.assembly.exception.chunkNotLoaded": "[%1$s %2$s %3$s] は、チャンクロード外にあります", + "create.gui.goggles.fluid_container": "液体コンテナの情報:", + "create.gui.goggles.fluid_container.capacity": "容量: ", + "create.gui.assembly.exception": "このからくりは組み立ることができません。:", + "create.gui.assembly.exception.unmovableBlock": "移動できないブロック(%4$s)、[%1$s %2$s %3$s]", + "create.gui.assembly.exception.chunkNotLoaded": "[%1$s %2$s %3$s] のブロックがロードされているチャンクにありません。", "create.gui.assembly.exception.structureTooLarge": "からくりに含まれるブロックが多すぎます。\n最大値: %1$s", "create.gui.assembly.exception.tooManyPistonPoles": "このピストンに取り付けられている拡張ポールが多すぎます。\n最大値: %1$s", - "create.gui.assembly.exception.noPistonPoles": "ピストンに延長ポールが不足しています", - "create.gui.gauge.info_header": "計器の情報:", + "create.gui.assembly.exception.noPistonPoles": "ピストンに延長ポールが不足しています。", + "create.gui.assembly.exception.not_enough_sails": "この構造物は帆ブロックが足りていません。: %1$s\nAが最低でも%2$sコ必要です。", + "create.gui.gauge.info_header": "メーターの情報:", "create.gui.speedometer.title": "回転速度", "create.gui.stressometer.title": "ネットワークの応力", "create.gui.stressometer.capacity": "残りの応力許容量", "create.gui.stressometer.overstressed": "超過応力", "create.gui.stressometer.no_rotation": "回転なし", "create.gui.contraptions.not_fast_enough": "この %1$s は_十分な_回転を_していない_ようです。", - "create.gui.contraptions.network_overstressed": "この仕掛けは_超過応力_のようです。さらに原動機を追加するか、_応力_の影響が大きい機械の速度を_下げて_ください。", + "create.gui.contraptions.network_overstressed": "この仕掛けは_超過応力_のようです。さらに原動機を追加するか、_応力_への影響が大きい機械の回転速度を_下げて_ください。", "create.gui.adjustable_crate.title": "可変クレート", "create.gui.adjustable_crate.storageSpace": "収納スペース", "create.gui.stockpile_switch.title": "在庫スイッチ", @@ -851,34 +859,34 @@ "create.gui.sequenced_gearshift.instruction": "命令", "create.gui.sequenced_gearshift.instruction.turn_angle.descriptive": "回す角度", "create.gui.sequenced_gearshift.instruction.turn_angle": "回転", - "create.gui.sequenced_gearshift.instruction.turn_angle.angle": "角度", + "create.gui.sequenced_gearshift.instruction.turn_angle.angle": "角度分だけ回す", "create.gui.sequenced_gearshift.instruction.turn_distance.descriptive": "ピストン/プーリー/ガントリーを動かすために回す", "create.gui.sequenced_gearshift.instruction.turn_distance": "ピストン", "create.gui.sequenced_gearshift.instruction.turn_distance.distance": "距離", - "create.gui.sequenced_gearshift.instruction.wait": "待機", - "create.gui.sequenced_gearshift.instruction.wait.duration": "期間", - "create.gui.sequenced_gearshift.instruction.delay.duration": "持続時間", + "create.gui.sequenced_gearshift.instruction.delay.descriptive": "一定時間待つ", + "create.gui.sequenced_gearshift.instruction.delay": "遅延", + "create.gui.sequenced_gearshift.instruction.delay.duration": "待機時間", "create.gui.sequenced_gearshift.instruction.end.descriptive": "終了", "create.gui.sequenced_gearshift.instruction.end": "終了", - "create.gui.sequenced_gearshift.instruction.await.descriptive": "新しいレッドストーンパルスを待つ", + "create.gui.sequenced_gearshift.instruction.await.descriptive": "レッドストーンパルスを待つ", "create.gui.sequenced_gearshift.instruction.await": "待機", - "create.gui.sequenced_gearshift.speed": "速度, 方向", + "create.gui.sequenced_gearshift.speed": "回転速度, 方向", "create.gui.sequenced_gearshift.speed.forward": "入力速度, 正転", "create.gui.sequenced_gearshift.speed.forward_fast": "倍速, 正転", "create.gui.sequenced_gearshift.speed.back": "入力速度, 反転", "create.gui.sequenced_gearshift.speed.back_fast": "倍速, 反転", "create.schematicAndQuill.dimensions": "概略図サイズ: %1$sx%2$sx%3$s", - "create.schematicAndQuill.firstPos": "最初の位置セット。", - "create.schematicAndQuill.secondPos": "2番目の位置セット。", + "create.schematicAndQuill.firstPos": "最初の位置セット", + "create.schematicAndQuill.secondPos": "2番目の位置セット", "create.schematicAndQuill.noTarget": "[Ctrl] を押したままで空気ブロックを選択します", - "create.schematicAndQuill.abort": "選択を削除しました。", + "create.schematicAndQuill.abort": "選択を削除しました", "create.schematicAndQuill.title": "概略図名:", "create.schematicAndQuill.convert": "保存してすぐに適用", "create.schematicAndQuill.fallbackName": "My Schematic", "create.schematicAndQuill.saved": "%1$s として保存しました", - "create.schematic.invalid": "[!] 無効なアイテム-代わりに概略図テーブルを使用してください", + "create.schematic.invalid": "[!] 無効なアイテム-代わりに概略図テーブルを使ってください", "create.schematic.position": "位置", "create.schematic.rotation": "回転", "create.schematic.rotation.none": "無し", @@ -895,33 +903,33 @@ "create.schematic.tool.rotate": "回転", "create.schematic.tool.print": "印刷", "create.schematic.tool.flip": "裏返し", - "create.schematic.tool.deploy.description.0": "構造物を特定の場所に移動します。", - "create.schematic.tool.deploy.description.1": "地面を右クリックして配置します。", - "create.schematic.tool.deploy.description.2": "[Ctrl] を押したまま、一定の距離で選択します。", - "create.schematic.tool.deploy.description.3": "[Ctrl]-スクロールして距離を変更します。", - "create.schematic.tool.move.description.0": "概略図を水平に動かします。", - "create.schematic.tool.move.description.1": "概略図を向け、 [Ctrl]-スクロールして押し出します。", + "create.schematic.tool.deploy.description.0": "構造物を特定の場所に移動します", + "create.schematic.tool.deploy.description.1": "地面を右クリックして配置します", + "create.schematic.tool.deploy.description.2": "[Ctrl] を押したまま、一定の距離で選択します", + "create.schematic.tool.deploy.description.3": "[Ctrl]-スクロールして距離を変更します", + "create.schematic.tool.move.description.0": "概略図を水平に動かします", + "create.schematic.tool.move.description.1": "概略図を向け、 [Ctrl]-スクロールして押し出します", "create.schematic.tool.move.description.2": "", "create.schematic.tool.move.description.3": "", - "create.schematic.tool.movey.description.0": "概略図を垂直に動かします。", - "create.schematic.tool.movey.description.1": "[Ctrl]-スクロールして上下に移動します。", + "create.schematic.tool.movey.description.0": "概略図を垂直に動かします", + "create.schematic.tool.movey.description.1": "[Ctrl]-スクロールして上下に移動します", "create.schematic.tool.movey.description.2": "", "create.schematic.tool.movey.description.3": "", - "create.schematic.tool.rotate.description.0": "概略図をその中心を中心に回転させます。", - "create.schematic.tool.rotate.description.1": "[Ctrl]-スクロールして90度回転します。", + "create.schematic.tool.rotate.description.0": "概略図をその中心を中心に回転させます", + "create.schematic.tool.rotate.description.1": "[Ctrl]-スクロールして90度回転します", "create.schematic.tool.rotate.description.2": "", "create.schematic.tool.rotate.description.3": "", - "create.schematic.tool.print.description.0": "構造物を即座にワールドに配置します。", - "create.schematic.tool.print.description.1": "[右クリック] して、現在の場所への配置を確認します。", - "create.schematic.tool.print.description.2": "このツールはクリエイティブモード専用です。", + "create.schematic.tool.print.description.0": "構造物を即座にワールドに配置します", + "create.schematic.tool.print.description.1": "[右クリック] して、現在の場所への配置を確認します", + "create.schematic.tool.print.description.2": "このツールはクリエイティブモード専用です", "create.schematic.tool.print.description.3": "", - "create.schematic.tool.flip.description.0": "選択した面に沿って概略図を反転します。", - "create.schematic.tool.flip.description.1": "概略図をポイントし、 [Ctrl]-スクロールして反転します。", + "create.schematic.tool.flip.description.0": "選択した面に沿って概略図を反転します", + "create.schematic.tool.flip.description.1": "概略図をポイントし、 [Ctrl]-スクロールして反転します", "create.schematic.tool.flip.description.2": "", "create.schematic.tool.flip.description.3": "", "create.schematics.synchronizing": "同期しています...", - "create.schematics.uploadTooLarge": "概略図が大きすぎます。", + "create.schematics.uploadTooLarge": "概略図が大きすぎます", "create.schematics.maxAllowedSize": "最大許容概略図ファイルサイズは:", "create.gui.schematicTable.refresh": "ファイルを更新する", @@ -933,8 +941,8 @@ "create.gui.schematicTable.finished": "アップロードが完了しました!", "create.gui.schematicannon.title": "概略図砲", "create.gui.schematicannon.listPrinter": "材料リストプリンター", - "create.gui.schematicannon.gunpowderLevel": "火薬残量 %1$s%%", - "create.gui.schematicannon.shotsRemaining": "残りのショット数: %1$s", + "create.gui.schematicannon.gunpowderLevel": "火薬残量: %1$s%%", + "create.gui.schematicannon.shotsRemaining": "残りショット数: %1$s", "create.gui.schematicannon.shotsRemainingWithBackup": "バックアップ: %1$s", "create.gui.schematicannon.optionEnabled": "現在 有効", "create.gui.schematicannon.optionDisabled": "現在 無効", @@ -945,7 +953,7 @@ "create.gui.schematicannon.option.replaceWithEmpty": "空の固体と交換", "create.gui.schematicannon.option.skipMissing": "不足しているブロックをスキップ", "create.gui.schematicannon.option.skipTileEntities": "タイルエンティティを保護する", - "create.gui.schematicannon.slot.gunpowder": "火薬を燃料として概略図砲に入れてください", + "create.gui.schematicannon.slot.gunpowder": "火薬を燃料として概略図砲に入れてください。", "create.gui.schematicannon.slot.listPrinter": "本をここに入れると概略図の材料チェックリストをプリントアウトします。", "create.gui.schematicannon.slot.schematic": "あなたの概略図をここに入れてください。特定の場所に配置されていることを確認してください。", "create.gui.schematicannon.option.skipMissing.description": "大砲が配置に必要なブロックを見つけられない場合、次の場所に進みます。", @@ -997,8 +1005,8 @@ "create.item_attributes.smokable.inverted": "燻製器で調理不可能か", "create.item_attributes.crushable": "粉砕可能か", "create.item_attributes.crushable.inverted": "粉砕不可能か", - "create.item_attributes.blastable": "高炉で精錬可能か", - "create.item_attributes.blastable.inverted": "高炉で精錬不可能か", + "create.item_attributes.blastable": "溶鉱炉で精錬可能か", + "create.item_attributes.blastable.inverted": "溶鉱炉で精錬不可能か", "create.item_attributes.enchanted": "エンチャント済みか", "create.item_attributes.enchanted.inverted": "エンチャントなしか", "create.item_attributes.damaged": "破損してるか", @@ -1019,6 +1027,10 @@ "create.item_attributes.added_by.inverted": "%1$sによって追加されていないか", "create.item_attributes.has_enchant": "エンチャントされているか%1$s", "create.item_attributes.has_enchant.inverted": "エンチャントがされていないか", + "create.item_attributes.color": "%1$sで染められているか", + "create.item_attributes.color.inverted": "%1$sで染められていないか", + "create.item_attributes.max_enchanted": "最大レベルのエンチャントがされているか", + "create.item_attributes.max_enchanted.inverted": "最大レベルのエンチャントがされていないか", "create.item_attributes.has_fluid": "%1$sを含んでいるか", "create.item_attributes.has_fluid.inverted": "%1$sを含んでいないか", "create.item_attributes.has_name": "%1$sの名前が付けられているか", @@ -1054,8 +1066,8 @@ "create.gui.attribute_filter.deny_list.description": "選択された属性を持たない場合、アイテムは通り抜けます。", "create.gui.attribute_filter.add_reference_item": "参照アイテムを追加", - "create.tooltip.holdKey": "[%1$s] を長押し", - "create.tooltip.holdKeyOrKey": "[%1$s] または [%2$s] を長押し", + "create.tooltip.holdForDescription": "説明を表示するには [%1$s] を長押し", + "create.tooltip.holdForControls": "操作方法を確認するには [%1$s] を長押し", "create.tooltip.keyShift": "Shift", "create.tooltip.keyCtrl": "Ctrl", "create.tooltip.speedRequirement": "必要な回転速度: %1$s", @@ -1071,16 +1083,21 @@ "create.tooltip.capacityProvided.low": "小", "create.tooltip.capacityProvided.medium": "中", "create.tooltip.capacityProvided.high": "大", - "create.tooltip.capacityProvided.asGenerator": "(原動機として)", "create.tooltip.generationSpeed": "%1$s %2$sを生成", "create.tooltip.analogStrength": "アナログ強度: %1$s/15", - "create.mechanical_arm.extract_from": "%1$s からアイテムを取得", - "create.mechanical_arm.deposit_to": "%1$s にアイテムを預ける", + "create.mechanical_arm.extract_from": "%1$sからアイテムを取得", + "create.mechanical_arm.deposit_to": "%1$sにアイテムを置く", "create.mechanical_arm.summary": "メカニカルアームは%1$s個の搬入ブロックと%2$s個の搬出ブロックを持っています。", "create.mechanical_arm.points_outside_range": "%1$s個の選択ブロックが射程限界のため、除外されました。", - "create.logistics.when_multiple_outputs_available": "複数の出力が利用可能なとき:", + "create.weighted_ejector.target_set": "ターゲットを選択", + "create.weighted_ejector.target_not_valid": "隣接ブロックへの射出(ターゲットが無効)", + "create.weighted_ejector.no_target": "隣接ブロックへの射出(ターゲットが選択されていない)", + "create.weighted_ejector.targeting": "[%1$s,%2$s,%3$s]へ射出", + "create.weighted_ejector.stack_size": "射出スタック量", + + "create.logistics.when_multiple_outputs_available": "複数の搬出先が利用できるとき:", "create.mechanical_arm.selection_mode.round_robin": "順繰り分配", "create.mechanical_arm.selection_mode.forced_round_robin": "強制順繰り分配", @@ -1090,28 +1107,24 @@ "create.tunnel.selection_mode.forced_split": "強制スタック分割", "create.tunnel.selection_mode.round_robin": "順繰り分配", "create.tunnel.selection_mode.forced_round_robin": "強制順繰り分配", - "create.tunnel.selection_mode.prefer_nearest": "近いところを優先", + "create.tunnel.selection_mode.prefer_nearest": "近い所を優先", "create.tunnel.selection_mode.randomize": "ランダム", "create.tunnel.selection_mode.synchronize": "同期", "create.tooltip.chute.header": "シュート情報", - "create.tooltip.chute.items_move_down": "アイテムを下方向に移動します。", - "create.tooltip.chute.items_move_up": "アイテムを上方向に移動します。", - "create.tooltip.chute.no_fans_attached": "ファンは接続されていません。", - "create.tooltip.chute.fans_push_up": "下からファンが押しています。", - "create.tooltip.chute.fans_push_down": "ファンが上から押しています。", - "create.tooltip.chute.fans_pull_up": "ファンが上から引っ張っています。", - "create.tooltip.chute.fans_pull_down": "ファンが下から引っ張っています。", + "create.tooltip.chute.items_move_down": "アイテムを下方向に移動します", + "create.tooltip.chute.items_move_up": "アイテムを上方向に移動します", + "create.tooltip.chute.no_fans_attached": "ファンは接続されていません", + "create.tooltip.chute.fans_push_up": "下からファンが押しています", + "create.tooltip.chute.fans_push_down": "ファンが上から押しています", + "create.tooltip.chute.fans_pull_up": "ファンが上から吸い込んでいます", + "create.tooltip.chute.fans_pull_down": "ファンが下から吸い込んでいます", "create.tooltip.chute.contains": "内容物: %1$s x%2$s", "create.hint.hose_pulley.title": "底なし搬出", "create.hint.hose_pulley": "対象となる液体は無限とみなされています。", "create.hint.mechanical_arm_no_targets.title": "ターゲットが見つかりません", "create.hint.mechanical_arm_no_targets": "どうやらこの_メカニカルアーム_には_ターゲット_が割り当てられていないようです。_メカニカルアーム_を_手_に持って_右クリック_して、ベルト、デポ、ファンネルなどのブロックを選択します。", - "create.hint.horizontal_funnel.title": "水平ファンネル", - "create.hint.horizontal_funnel": "この状態ではインベントリ間でアイテムを_直接_転送することはできません。インベントリからアイテムを取り出すために、ファンネルの下 _メカニカルベルト_ や _デポ_ を置いてみて下さい。", - "create.hint.upward_funnel.title": "上向きファンネル", - "create.hint.upward_funnel": "この状態では_メカニカルアーム_や風を送り込んだ_シュート_、_落ちている_アイテムしか移動できません。アイテムを_縦_に移動させたい場合は、いくつか_シュート_を作ってみてください。", "create.hint.empty_bearing.title": "ベアリングの更新", "create.hint.empty_bearing": "_素手_でベアリングを_右クリック_して、その前に先ほど作った構造物を_接続_します。", "create.hint.full_deployer.title": "デプロイヤーのアイテムが溢れています", @@ -1134,16 +1147,33 @@ "create.command.killTPSCommand.status.usage.1": "[Create]: /killtps start を使用して、サーバーのティックを意図的に遅くします", "create.command.killTPSCommand.argument.tickTime": "tickTime", - "create.subtitle.schematicannon_launch_block": "概略図砲が発射する", - "create.subtitle.schematicannon_finish": "概略図砲が作業を終える", + "create.contraption.minecart_contraption_too_big": "このからくりトロッコは大きすぎて拾えません。", + + + "_": "->------------------------] Subtitles [------------------------<-", + + "create.subtitle.cogs": "歯車がゴロゴロと鳴る", "create.subtitle.slime_added": "スライムがぐしゃっとつぶれる", - "create.subtitle.mechanical_press_activation": "メカニカルプレスが作動する", - "create.subtitle.mechanical_press_item_break": "金属がガチャンと鳴る", - "create.subtitle.blockzapper_place": "ブロックを発射して設置する", + "create.subtitle.contraption_disassemble": "からくりが止まる", + "create.subtitle.wrench_rotate": "レンチを使う", + "create.subtitle.mixing": "混ぜる音", + "create.subtitle.mechanical_press_activation_belt": "メカニカルプレスがボンと鳴る", "create.subtitle.blockzapper_confirm": "成功音", - "create.subtitle.blockzapper_deny": "失敗音", - "create.subtitle.block_funnel_eat": "ファンネルが大口で食べる", + "create.subtitle.depot_slide": "アイテムが滑る", + "create.subtitle.blockzapper_place": "ブロックを発射して設置する", "create.subtitle.blaze_munch": "ブレイズの咀嚼音", + "create.subtitle.schematicannon_launch_block": "概略図砲が発射する", + "create.subtitle.funnel_flap": "ファンネルがはためく", + "create.subtitle.schematicannon_finish": "概略図砲が作業を終える", + "create.subtitle.scroll_value": "スクロールのカチカチ音", + "create.subtitle.mechanical_press_activation": "メカニカルプレスがガーンと鳴る", + "create.subtitle.contraption_assemble": "からくりが動く", + "create.subtitle.crafter_craft": "メカニカルクラフターがクラフトする", + "create.subtitle.blockzapper_deny": "失敗音", + "create.subtitle.cranking": "ハンドクランクが回る", + "create.subtitle.crafter_click": "メカニカルクラフターのカチカチ音", + "create.subtitle.wrench_remove": "機械を壊す", + "create.subtitle.depot_plop": "デプロイヤーにアイテムが入れられる", "_": "->------------------------] Item Descriptions [------------------------<-", @@ -1153,61 +1183,16 @@ "item.create.example_item.tooltip.condition1": "これをしたとき", "item.create.example_item.tooltip.behaviour1": "すると、このアイテムはこのようなことを行います。(シフトを押したときに表示される)", "item.create.example_item.tooltip.condition2": "そしてこれをしたとき", - "item.create.example_item.tooltip.behaviour2": "好きなだけ挙動を追加することができます。", + "item.create.example_item.tooltip.behaviour2": "好きなだけ挙動を追加できます。", "item.create.example_item.tooltip.control1": "Ctrlを押したとき", "item.create.example_item.tooltip.action1": "これらのコントロールが表示されます。", - "block.create.andesite_encased_shaft.tooltip": "安山岩のケース入りシャフト", - "block.create.andesite_encased_shaft.tooltip.summary": "クリエイティブ限定アイテム。_安山岩ケーシング_を_設置した_シャフトに使って覆ったもの。ケーシングブロックは消費されません。", - - "block.create.brass_encased_shaft.tooltip": "真鍮のケース入りシャフト", - "block.create.brass_encased_shaft.tooltip.summary": "クリエイティブ限定アイテム。_真鍮ケーシング_を_設置した_シャフトに使って覆ったものケーシングブロックは消費されません。", - "block.create.wooden_bracket.tooltip": "木製ブラケット", "block.create.wooden_bracket.tooltip.summary": "補強用の温かみのある木の欠片で_シャフト_、_歯車_、そして_パイプ_を_飾ろう_。", "block.create.metal_bracket.tooltip": "金属ブラケット", "block.create.metal_bracket.tooltip.summary": "補強用の頑丈で工業的な欠片で_シャフト_、_歯車_、そして_パイプ_を_飾ろう_。", - "block.create.andesite_casing.tooltip": "安山岩ケーシング", - "block.create.andesite_casing.tooltip.summary": "様々な用途に使えるシンプルなマシンケーシング。飾り付けにも安心してお使いいただけます。_シャフト_や_メカニカルベルト_のケースにも使えます。", - - "block.create.andesite_funnel.tooltip": "安山岩ファンネル", - "block.create.andesite_funnel.tooltip.summary": "一般的なアイテム運搬装置で、運搬装置間でアイテムを移動させます。_レッドストーン信号_で制御できます。", - "block.create.andesite_funnel.tooltip.condition1": "基本動作", - "block.create.andesite_funnel.tooltip.behaviour1": "_搬入面_からその前に_落ちているアイテム_を_集めて_、反対側の搬出面にある任意の収納に自動_搬入_します。", - "block.create.andesite_funnel.tooltip.condition2": "メカニカルベルトやデポ、その他これに類するものに載せたとき", - "block.create.andesite_funnel.tooltip.behaviour2": "載せた装置の_後ろにある収納_からアイテムを_搬出_したり、アイテムを_搬入_したりします。ファンネルが指向性を持っている場合はいつでもレンチを使用することで逆にすることができます。", - "block.create.andesite_funnel.tooltip.condition3": "2つの収納の間に下向きに設置したとき", - "block.create.andesite_funnel.tooltip.behaviour3": "内部インベントリがないホッパーのように、_アイテム_を_下方向_に_運搬_します。", - - "block.create.andesite_tunnel.tooltip": "安山岩トンネル", - "block.create.andesite_tunnel.tooltip.summary": "_メカニカルベルト_の保護カバー!_安山岩トンネル_は、メインのメカニカルベルトの脇に別のメカニカルベルトやデポを置くと、スタックから1つ、アイテムを分割することができます。", - "block.create.andesite_tunnel.tooltip.control1": "レンチで右クリックしたとき", - "block.create.andesite_tunnel.tooltip.action1": "その面が窓の場合は、窓のシャッターを調整します。", - - "block.create.brass_funnel.tooltip": "真鍮ファンネル", - "block.create.brass_funnel.tooltip.summary": "アイテムを_吸い込み_、コンテナに搬入します。_レッドストーン信号_で停止できます。便利なフィルター付き!", - "block.create.brass_funnel.tooltip.condition1": "アイテムコンテナに使った時", - "block.create.brass_funnel.tooltip.behaviour1": "_ファンネル_で_吸い込んだアイテム_は、搬出面の_チェスト_、_メカニカルベルト_、_シュート_などの_アイテムコンテナ_に搬入されます。", - "block.create.brass_funnel.tooltip.condition2": "メカニカルベルトの上に設置したとき", - "block.create.brass_funnel.tooltip.behaviour2": "動くメカニカルベルトの上のファンネルは、アイテムを自動的に_インベントリ_に_搬入_したり、_搬出_したりできます。", - "block.create.brass_funnel.tooltip.condition3": "2つのインベントリの間に下向きに設置したとき", - "block.create.brass_funnel.tooltip.behaviour3": "下向きホッパーのように、_アイテム_を_下方向_に_移動_させます。", - - "block.create.brass_tunnel.tooltip": "真鍮トンネル", - "block.create.brass_tunnel.tooltip.summary": "オシャレな_メカニカルベルト_の保護カバー!_真鍮トンネル_にはアイテムの_フィルター機能_や、_分割機能_の設定項目も多数用意されています。", - "block.create.brass_tunnel.tooltip.condition1": "並べて設置したとき", - "block.create.brass_tunnel.tooltip.behaviour1": "_真鍮トンネル_は相互に接続し、ある_メカニカルベルト_のアイテムを別の_メカニカルベルト_に送ったりできるようにします。", - "block.create.brass_tunnel.tooltip.condition2": "フィルター機能", - "block.create.brass_tunnel.tooltip.behaviour2": "_真鍮トンネル_は_搬入_と_搬出_、両方のフィルターを搭載しています。_トンネル_のフィルター付き出力から_アイテム_が出てくることが許可されていない場合、並べて設置された_トンネル_の出力に送られます。", - "block.create.brass_tunnel.tooltip.condition3": "分割機能", - "block.create.brass_tunnel.tooltip.behaviour3": "_真鍮トンネル_は、_アイテム_が接続された_メカニカルベルト_に分類して並べる方法を変更するように設定できます。", - "block.create.brass_tunnel.tooltip.control1": "側面をレンチで右クリックしたとき。", - "block.create.brass_tunnel.tooltip.action1": "その面が窓の場合は、窓の_シャッターを調整_します。", - "block.create.brass_tunnel.tooltip.control2": "上面をレンチでスクロールしたとき", - "block.create.brass_tunnel.tooltip.action2": "接続された_トンネル_の分割方法を変更します。", - "block.create.copper_casing.tooltip": "銅ケーシング", "block.create.copper_casing.tooltip.summary": "様々な用途に使える丈夫なマシンケーシング。飾り付けにも安心してお使いいただけます。", "block.create.copper_casing.tooltip.condition1": "液体パイプに使ったとき", @@ -1216,44 +1201,24 @@ "block.create.encased_fluid_pipe.tooltip": "ケース入り液体パイプ", "block.create.encased_fluid_pipe.tooltip.summary": "銅ケーシングに覆われた液体パイプ", - "block.create.copper_valve_handle.tooltip": "銅のバルブハンドル", - "block.create.copper_valve_handle.tooltip.summary": "プレイヤーの相互作用が必要とする精密な_原動機_。働きすぎには気を付けて!", - "block.create.copper_valve_handle.tooltip.condition1": "使っしているとき", - "block.create.copper_valve_handle.tooltip.behaviour1": "接続された機械に_回転力_を供給します。スニークすると逆向きの回転力を供給します。", - "block.create.seat.tooltip": "シート", - "block.create.seat.tooltip.summary": "シートに座って乗り物を楽しもう!移動する_構造物_の上にプレイヤーを固定します。もちろん家具にも使えます。色々な色に染められます。", + "block.create.seat.tooltip.summary": "シートに座って乗り物を楽しもう!移動する_構造物_の上にプレイヤーを固定します。もちろん家具にも使えます。染色することも。", "block.create.seat.tooltip.condition1": "右クリックしたとき", "block.create.seat.tooltip.behaviour1": "_シート_の上に座ります。左シフトを押すと_シート_から離れます。", - "block.create.chute.tooltip": "シュート", - "block.create.chute.tooltip.summary": "アイテムを_吸い込んだり_、縦や斜めに運んだりする。アイテムを_アイテムコンテナ_に搬出入することもできます。また、_ホッパー_や_載せたファンネル_等を使うことで横から搬出入することもできます。", - "block.create.chute.tooltip.condition1": "風を送ったとき", - "block.create.chute.tooltip.behaviour1": "_ファン_で駆動する_シュート_は_アイテム_を上向きに運び、_デポ_や_ベルト_からアイテムを吸い上げることができます。", - - "block.create.depot.tooltip": "デポ", - "block.create.depot.tooltip.summary": "_アイテム_を置くのに便利な場所。いくつかの機械が相互作用する場所を提供します。", - "block.create.depot.tooltip.condition1": "右クリックしたとき", - "block.create.depot.tooltip.behaviour1": "_デポ_に_アイテム_を置いたり取ったりする。_ベルト_と連動する_機械_や_装置_、_ブロック_は_デポ_とも連動します。", - "item.create.blaze_cake.tooltip": "ブレイズケーキ", "item.create.blaze_cake.tooltip.summary": "働き者の_ブレイズバーナー_達に美味しいご馳走を。彼らを燃え上がらせよう(物理)!", - "item.create.empty_blaze_burner.tooltip": "空のブレイズバーナー", - "item.create.empty_blaze_burner.tooltip.summary": "燃えるお友達のための小さな鉄のおうち。君なら上手く使える思うよ。", - "item.create.empty_blaze_burner.tooltip.condition1": "ブレイズまたはブレイズスポナーに使ったとき", - "item.create.empty_blaze_burner.tooltip.behaviour1": "ブレイズバーナーの中にブレイズを_捕獲_する", - "block.create.fluid_pipe.tooltip": "液体パイプ", - "block.create.fluid_pipe.tooltip.summary": "_液体_の運搬に使用します。液体運搬にはメカニカルポンプが必要です。", - "block.create.fluid_pipe.tooltip.condition1": "液体運搬", - "block.create.fluid_pipe.tooltip.behaviour1": "_タンク_や_鉢_などの_液体コンテナ_に接続できます。また、パイプの端が露出しているので液体を吹き出したり設置したりできます。液漏れ注意!", - "block.create.fluid_pipe.tooltip.control1": "レンチで右クリックしたとき", - "block.create.fluid_pipe.tooltip.action1": "可能ならパイプに窓を設けます。", + "block.create.fluid_pipe.tooltip.summary": "_液体_の輸送に使います。_液体_輸送にはメカニカルポンプが必要です。", + "block.create.fluid_pipe.tooltip.condition1": "液体輸送", + "block.create.fluid_pipe.tooltip.behaviour1": "_タンク_や_鉢_などの_液体コンテナ_に繋がります。また、_パイプ_の端が露出しているので液体を吹き出したり設置したりできます。液漏れ注意!", + "block.create.fluid_pipe.tooltip.condition2": "レンチで右クリックしたとき", + "block.create.fluid_pipe.tooltip.behaviour2": "可能ならパイプに窓を設けます。", "block.create.hose_pulley.tooltip": "ホースプーリー", "block.create.hose_pulley.tooltip.summary": "ワールドの大量の_液体_を_吸引_したり、_放出_したりするのに使います。", - "block.create.hose_pulley.tooltip.condition1": "回転したとき", + "block.create.hose_pulley.tooltip.condition1": "回転力を供給したとき", "block.create.hose_pulley.tooltip.behaviour1": "ホースを_上げ下げ_して、どの程度の_高さ_まで_吸引_や_放出_を行うか決めます。", "block.create.hose_pulley.tooltip.condition2": "プーリー本体から液体を吸い込むとき", "block.create.hose_pulley.tooltip.behaviour2": "ホースの端がおろされた本体から_液体_ブロックを_吸引_し始めます。非常に_大量_の液体は_無限_と_みなされます_。", @@ -1263,55 +1228,46 @@ "block.create.fluid_tank.tooltip": "液体タンク", "block.create.fluid_tank.tooltip.summary": "あなたのお気に入りのあらゆる_液体_を_貯蔵_できます。縦横に並べて大きさを調整できます。", "block.create.fluid_tank.tooltip.condition1": "レンチで右クリックしたとき", - "block.create.fluid_tank.tooltip.behaviour1": "窓の設定を変更します。", + "block.create.fluid_tank.tooltip.behaviour1": "窓の付けたり、外したりします。", "block.create.creative_fluid_tank.tooltip": "クリエイティブ液体タンク", - "block.create.creative_fluid_tank.tooltip.summary": "この_液体タンク_は、あらゆる液体を無限に複製することができます。縦横に並べて大きさを調整できます。", + "block.create.creative_fluid_tank.tooltip.summary": "この_液体タンク_は、あらゆる液体を無限に複製します。縦横に並べて大きさを調整できます。", "block.create.creative_fluid_tank.tooltip.condition1": "液体がタンクに入っているとき", "block.create.creative_fluid_tank.tooltip.behaviour1": "このタンクから何かを_取り出す_と、指定された液体が_無限_に_供給_されます。このタンクに_搬入_された液体は_消滅_します。", "block.create.creative_fluid_tank.tooltip.condition2": "レンチで左クリックしたとき", - "block.create.creative_fluid_tank.tooltip.behaviour2": "窓の設定を変更します。", + "block.create.creative_fluid_tank.tooltip.behaviour2": "窓を付け外しします。", "block.create.fluid_valve.tooltip": "液体バルブ", "block.create.fluid_valve.tooltip.summary": "パイプ内の液体の流れを止めます。", "block.create.fluid_valve.tooltip.condition1": "液体制御", - "block.create.fluid_valve.tooltip.behaviour1": "_回転力_を加えると_バルブ_は強制的に閉じ、液体の流れを止めます。_回転_方向を逆にするとバルブが再び開きます。", + "block.create.fluid_valve.tooltip.behaviour1": "_回転力_を加えると_バルブ_は強制的に閉じ、_液体_の流れを止めます。_回転_方向を逆にするとバルブが再び開きます。", "block.create.mechanical_pump.tooltip": "メカニカルポンプ", - "block.create.mechanical_pump.tooltip.summary": "_回転力_を使って_パイプ_に沿って_液体_を移動させます。", - "block.create.mechanical_pump.tooltip.condition1": "液体移動", - "block.create.mechanical_pump.tooltip.behaviour1": "_回転力_を加えるとパイプを流れる_液体_を移動させる圧力が発生します。_回転方向_を逆にすると、_液体_の流れる方向を切り替えられます。", + "block.create.mechanical_pump.tooltip.summary": "_回転力_を使って_パイプ_に沿って_液体_を輸送します。両方向に最大効果範囲があります。(デフォルト16ブロック)", + "block.create.mechanical_pump.tooltip.condition1": "液体輸送", + "block.create.mechanical_pump.tooltip.behaviour1": "_回転力_を加えると_パイプ_を流れる_液体_を移動させる圧力が発生します。_回転方向_を逆にすると、_液体_の流れる方向を切り替えられます。", "block.create.mechanical_pump.tooltip.control1": "レンチで右クリックしたとき", - "block.create.mechanical_pump.tooltip.action1": "ポンプの方向を反転させ、デフォルトの流れる方向を切り替えます。", + "block.create.mechanical_pump.tooltip.action1": "_ポンプ_の方向を反転させ、デフォルトの流れる方向を切り替えます。", "block.create.smart_fluid_pipe.tooltip": "スマート液体パイプ", - "block.create.smart_fluid_pipe.tooltip.summary": "フィルター付きの_液体パイプ_。特定の_液体_を通過させるか設定できます。", + "block.create.smart_fluid_pipe.tooltip.summary": "フィルター付きの_液体パイプ_。どの_液体_を通過させるか設定できます。", "block.create.smart_fluid_pipe.tooltip.condition1": "液体を搬入したとき", "block.create.smart_fluid_pipe.tooltip.behaviour1": "フィルターに合わない液体を搬入したスマート液体パイプは、流れを遮断します。", "block.create.smart_fluid_pipe.tooltip.condition2": "液体コンテナに隣接しているとき", - "block.create.smart_fluid_pipe.tooltip.behaviour2": "あらゆる容器から_流れ出す_スマート液体パイプは、その_フィルター_に合った液体のみを搬入します。", + "block.create.smart_fluid_pipe.tooltip.behaviour2": "あらゆる容器から_流れ出す_スマート液体パイプは、その_フィルター_に_合った_液体のみを搬入します。", "block.create.spout.tooltip": "アイテム注液口", - "block.create.spout.tooltip.summary": "液体を注入する注液器。", + "block.create.spout.tooltip.summary": "_液体_を注入する注液器。", "block.create.spout.tooltip.condition1": "液体充填", - "block.create.spout.tooltip.behaviour1": "_バケツ_や_瓶_のような_容器アイテム_を下に置くと、貯蔵された液体でそれを満たします。", + "block.create.spout.tooltip.behaviour1": "_バケツ_や_瓶_のような_容器アイテム_を下に置くと、貯蔵された_液体_でそれを満たします。", "block.create.spout.tooltip.condition2": "液体自動化", "block.create.spout.tooltip.behaviour2": "_ベルト_や_デポ_の上に置かれたアイテム注液口は、その下を通過する_容器アイテム_に反応します。", "block.create.item_drain.tooltip": "アイテム排液口", - "block.create.item_drain.tooltip.summary": "_液体アイテム_を空にする格子付きデポ。", + "block.create.item_drain.tooltip.summary": "_液体アイテム_を空にする格子の付いたデポ。", "block.create.item_drain.tooltip.condition1": "液体排液", "block.create.item_drain.tooltip.behaviour1": "_バケツ_や_ボトル_などの_液体入り容器_を横から搬入すると、アイテム排液口はその_液体入り容器_に空にしようとします。その後、アイテムは反対側に排出されます。", - "block.create.mechanical_arm.tooltip": "メカニカルアーム", - "block.create.mechanical_arm.tooltip.summary": "アイテムを運搬する高度な機械。", - "block.create.mechanical_arm.tooltip.condition1": "アイテム運搬", - "block.create.mechanical_arm.tooltip.behaviour1": "_ベルト_、_デポ_、_ファンネル_、_メカニカルクラフター_などの_アクセス可能_なインベントリにアイテムを入れたり、出したりすることができます。", - "block.create.mechanical_arm.tooltip.control1": "手に持っているとき", - "block.create.mechanical_arm.tooltip.action1": "アクセス可能な_アイテムインベントリ_を右クリックして、_メカニカルアーム_の_搬入先_として設定します。2回右クリックすると、_搬出先_として設定されます。", - "block.create.mechanical_arm.tooltip.control2": "レンチを持ってスクロールしたとき", - "block.create.mechanical_arm.tooltip.action2": "_メカニカルアーム_が搬出する_アイテム_の順序付け動作を設定します。", - "item.create.wand_of_symmetry.tooltip": "対称の杖", "item.create.wand_of_symmetry.tooltip.summary": "対象の鏡をまたいだ範囲内のブロック設置を完全に複製します。", "item.create.wand_of_symmetry.tooltip.condition1": "ホットバーにあるとき", @@ -1344,15 +1300,15 @@ "item.create.tree_fertilizer.tooltip": "樹木の肥料", "item.create.tree_fertilizer.tooltip.summary": "一般的な種類の木の成長を早めるのに適したミネラルを配合した強力な肥料。", "item.create.tree_fertilizer.tooltip.condition1": "苗木に使ったとき", - "item.create.tree_fertilizer.tooltip.behaviour1": "_間隔の条件_に_関係なく_ツリーを成長させる", + "item.create.tree_fertilizer.tooltip.behaviour1": "_間隔の条件_に_関係なく_苗木を成長させる", "item.create.deforester.tooltip": "デフォレスター", "item.create.deforester.tooltip.summary": "一瞬で木を切り倒すことができる_輝く斧_。", "item.create.extendo_grip.tooltip": "マジックハンド", - "item.create.extendo_grip.tooltip.summary": "ビヨヨーン!使用者の_射程_を大幅に_伸ばし_ます。", + "item.create.extendo_grip.tooltip.summary": "ビヨヨーン!着用者の_射程_を大幅に_伸ばし_ます。", "item.create.extendo_grip.tooltip.condition1": "オフハンドに装備したとき", - "item.create.extendo_grip.tooltip.behaviour1": "メインハンドで使用するアイテムの射程を伸ばします。", + "item.create.extendo_grip.tooltip.behaviour1": "_メインハンド_で使うアイテムの_射程_を_伸ばし_ます。", "item.create.filter.tooltip": "フィルター", "item.create.filter.tooltip.summary": "物流系の装置の_搬入_と_搬出_をより_正確_に_制御_し、_アイテムのセット_またはいくつかの_入れ子になったフィルター_と照合します。", @@ -1369,17 +1325,17 @@ "item.create.attribute_filter.tooltip.behaviour2": "_設定インターフェース_を開きます。", "item.create.empty_schematic.tooltip": "空の概略図", - "item.create.empty_schematic.tooltip.summary": "レシピの材料、および_概略図テーブル_での書き込みに使用されます。", + "item.create.empty_schematic.tooltip.summary": "レシピの材料、および_概略図テーブル_での書き込みに使われます。", "item.create.schematic.tooltip": "概略図", - "item.create.schematic.tooltip.summary": "ワールドに設置できる構造物を保持します。ホログラムを必要に応じて配置し、_概略図砲_を使用して建築します。", + "item.create.schematic.tooltip.summary": "ワールドに設置できる構造物を保持します。ホログラムを必要に応じて配置し、_概略図砲_を使って建築します。", "item.create.schematic.tooltip.condition1": "持ったとき", - "item.create.schematic.tooltip.behaviour1": "画面上のツールを使用して配置できます。", + "item.create.schematic.tooltip.behaviour1": "画面上のツールを使ってホログラムを配置します。", "item.create.schematic.tooltip.control1": "スニークしながら右クリックしたとき", - "item.create.schematic.tooltip.action1": "正確な_座標_を入力する_インターフェース_を開きます。", + "item.create.schematic.tooltip.action1": "正確な_座標_を入力する_インターフェース_を開きます", "item.create.schematic_and_quill.tooltip": "概略図と羽根ペン", - "item.create.schematic_and_quill.tooltip.summary": "ワールドの構造物を.nbtファイルに保存するために使用されます。", + "item.create.schematic_and_quill.tooltip.summary": "ワールドの構造物を.nbtファイルに保存できます。", "item.create.schematic_and_quill.tooltip.condition1": "ステップ1", "item.create.schematic_and_quill.tooltip.behaviour1": "右クリックして2つのコーナーポイントを選択します。", "item.create.schematic_and_quill.tooltip.condition2": "ステップ2", @@ -1392,171 +1348,42 @@ "item.create.schematic_and_quill.tooltip.action3": "選択を_リセット_して削除します。", "block.create.schematicannon.tooltip": "概略図砲", - "block.create.schematicannon.tooltip.summary": "ブロックを撃って、展開された_概略図_をもとにワールドに設置します。隣接するインベントリからのアイテムを自動搬入し、_火薬_を燃料として使用します。", - "block.create.schematicannon.tooltip.control1": "右クリックしたとき", - "block.create.schematicannon.tooltip.action1": "_インターフェース_を開きます。", + "block.create.schematicannon.tooltip.summary": "ブロックを撃って、展開された_概略図_をもとにワールドに設置します。隣接する収納ブロックからのアイテムを自動搬入し、_火薬_を燃料とします。", + "block.create.schematicannon.tooltip.condition1": "右クリックしたとき", + "block.create.schematicannon.tooltip.behaviour1": "_インターフェース_を開きます。", "block.create.schematic_table.tooltip": "概略図テーブル", "block.create.schematic_table.tooltip.summary": "保存された構造物を_空の概略図_に書き込みます。", - "block.create.schematic_table.tooltip.condition1": "空の概略図が与えられたとき", + "block.create.schematic_table.tooltip.condition1": "空の概略図を入れたとき", "block.create.schematic_table.tooltip.behaviour1": "Schematicsフォルダから選択したファイルをアップロードします。", - "block.create.shaft.tooltip": "シャフト", - "block.create.shaft.tooltip.summary": "_回転_を直線で_伝達_します。", - - "block.create.cogwheel.tooltip": "歯車", - "block.create.cogwheel.tooltip.summary": "_回転_を直線で、または隣接する_歯車_に_伝達_します。", - - "block.create.large_cogwheel.tooltip": "大きな歯車", - "block.create.large_cogwheel.tooltip.summary": "小さな歯車に接続したときに_回転速度_を_変更_できる歯車の大型バージョン。", - - "block.create.encased_shaft.tooltip": "ケース入りシャフト", - "block.create.encased_shaft.tooltip.summary": "_回転_を直線で_伝達_します。壁を通過する回転の伝達に適しています。", - - "block.create.gearbox.tooltip": "ギアボックス", - "block.create.gearbox.tooltip.summary": "接続された_4方向_の_回転_方向を逆にして_伝達_します。", - - "block.create.gearshift.tooltip": "ギアシフト", - "block.create.gearshift.tooltip.summary": "接続されたシャフトの回転方向の切り替えを制御します。", - "block.create.gearshift.tooltip.condition1": "レッドストーン信号を受けたとき", - "block.create.gearshift.tooltip.behaviour1": "出力する回転の方向を_逆_にします。", - - "block.create.clutch.tooltip": "クラッチ", - "block.create.clutch.tooltip.summary": "接続されたシャフトの回転のオン/オフを制御します。", - "block.create.clutch.tooltip.condition1": "レッドストーン信号を受けたとき", - "block.create.clutch.tooltip.behaviour1": "反対側への回転の伝達を_停止_します。", - - "block.create.encased_chain_drive.tooltip": "ケース入りチェーンドライブ", - "block.create.encased_chain_drive.tooltip.summary": "直線状に接続する_ケース入りチェーンドライブ_へ_回転を伝達_する。チェーンドライブはシャフトのない任意の面に隣接して設置されたとき、直線状なら接続されます。向きは必ずしも一致している必要はありません。", - "block.create.encased_chain_drive.tooltip.condition1": "接続したとき", - "block.create.encased_chain_drive.tooltip.behaviour1": "接続されたブロックは、この機械の_回転速度_と方向を伝達します。。", - - "block.create.adjustable_chain_gearshift.tooltip": "可変チェーンギアシフト", - "block.create.adjustable_chain_gearshift.tooltip.summary": "直線状に接続する_可変ケース入りチェーンドライブ_は_回転を伝達_する。このブロックに入力される_レッドストーン信号強度_で、どのサイズのホイールが接続されたチェーンドライブに噛み合うかを制御できます。", - "block.create.adjustable_chain_gearshift.tooltip.condition1": "レッドストーン制御", - "block.create.adjustable_chain_gearshift.tooltip.behaviour1": "レッドストーン信号を受けて_いない_ときは、隣接するチェーンドライブと_同じ速度_で回転を伝達します。_レッドストーン信号強度が最大_のときは隣接するチェーンドライブは_その2倍_の速度で伝達します。その間にあるものは1-2倍の速度で伝達されます。", - - "item.create.belt_connector.tooltip": "メカニカルベルト", - "item.create.belt_connector.tooltip.summary": "2本以上の_シャフト_を_メカニカルベルト_で接続します。接続されたシャフトは全く同じ速度と方向で回転します。メカニカルベルトは_アイテム_と_エンティティ_を_運搬_するベルトコンベアとして使えます。", - "item.create.belt_connector.tooltip.control1": "シャフトを右クリックしたとき", - "item.create.belt_connector.tooltip.action1": "ベルトの片端のシャフトを選択します。選択する2つのシャフトは_ベルトの方向_に向かって_縦_、_横_、または_斜め_に_並べる_必要があります。", - "item.create.belt_connector.tooltip.control2": "スニークしながら右クリックしたとき", - "item.create.belt_connector.tooltip.action2": "ベルトの最初に選択した位置を_リセット_します。", - "item.create.goggles.tooltip": "ゴーグル", - "item.create.goggles.tooltip.summary": "有用な回転力の情報を視界に映す眼鏡。", + "item.create.goggles.tooltip.summary": "有用な_回転力_の_情報_を視界に映す眼鏡。", "item.create.goggles.tooltip.condition1": "着用したとき", - "item.create.goggles.tooltip.behaviour1": "設置された機械の_速度レベル_および、_機械_の_応力の影響_と_容量_を_色付きのインジケーター_で表示します。", + "item.create.goggles.tooltip.behaviour1": "設置された機械の_回転速度_および、_機械_の_応力への影響_と_許容量_を_色付きのインジケーター_で表示します。", "item.create.goggles.tooltip.condition2": "計器を見たとき", - "item.create.goggles.tooltip.behaviour2": "計器が接続されているネットワークの_速度_または_応力_に関する詳細情報を表示します。", + "item.create.goggles.tooltip.behaviour2": "計器が接続されているネットワークの_回転速度_または_応力_に関する詳細情報を表示します。", + "item.create.goggles.tooltip.condition3": "液体コンテナを見たとき", + "item.create.goggles.tooltip.behaviour3": "ブロックの_容量_と、その中に貯蔵されている_液体_の詳細情報を表示します。", "item.create.wrench.tooltip": "レンチ", - "item.create.wrench.tooltip.summary": "動的からくりに取り組むための便利なツール。コンポーネントの_回転_、_解体_、_設定_に使用できます。", + "item.create.wrench.tooltip.summary": "機械いじりに便利な道具。機械の_回転_、_解体_、_設定_に使います。", "item.create.wrench.tooltip.control1": "機械を右クリックしたとき", - "item.create.wrench.tooltip.action1": "操作した面に向かって、または面から離れるように機械を_回転_させます。", + "item.create.wrench.tooltip.action1": "操作した面に向かって、または面から離れるように_機械_を_回転_させます。", "item.create.wrench.tooltip.control2": "スニークしながら右クリックしたとき", "item.create.wrench.tooltip.action2": "_機械を分解_し、_インベントリ_に戻します。", - "block.create.creative_motor.tooltip": "クリエイティブモーター", - "block.create.creative_motor.tooltip.summary": "_回転力_を設定可能な原動機。", - - "block.create.water_wheel.tooltip": "水車", - "block.create.water_wheel.tooltip.summary": "_隣接する水流_から得られる_回転力_を供給します。", - - "block.create.encased_fan.tooltip": "ケース入りファン", - "block.create.encased_fan.tooltip.summary": "_回転力_を_気流_に変換し往復させます。色んな使い方があります。", - "block.create.encased_fan.tooltip.condition1": "レッドストーン信号を受けたとき", - "block.create.encased_fan.tooltip.behaviour1": "真下の_熱源_から_回転力_を供給します。ファンは下向きにする必要があります。", - "block.create.encased_fan.tooltip.condition2": "回転したとき", - "block.create.encased_fan.tooltip.behaviour2": "回転速度に応じてエンティティを_押し_たり、_吸い戻し_たりします。", - "block.create.encased_fan.tooltip.condition3": "特別なブロックを吹き抜けるとき", - "block.create.encased_fan.tooltip.behaviour3": "_液体_や_炎_の粒子が空気の流れに放出されます。これは、_アイテムの加工_に使用できます。", - "block.create.nozzle.tooltip": "ノズル", "block.create.nozzle.tooltip.summary": "_ケース入りファン_の前面に取り付けて、エンティティへの影響を_全方向_に分散します。", - "block.create.hand_crank.tooltip": "ハンドクランク", - "block.create.hand_crank.tooltip.summary": "プレイヤーの相互作用を必要とする_シンプル_な_原動機_。", - "block.create.hand_crank.tooltip.condition1": "使っているとき", - "block.create.hand_crank.tooltip.behaviour1": "接続したに_回転力_を供給します。_スニークで回転を逆_にできます。", - "block.create.cuckoo_clock.tooltip": "鳩時計", "block.create.cuckoo_clock.tooltip.summary": "空間を_彩り_、_時間を刻む_素晴らしい細工。", "block.create.cuckoo_clock.tooltip.condition1": "回転したとき", - "block.create.cuckoo_clock.tooltip.behaviour1": "_現在の時刻_を表示し、1日に2回曲を再生します。、_正午_と夕暮れにプレイヤーが_眠れるようになるとすぐ_に_アクティブ_になります。", + "block.create.cuckoo_clock.tooltip.behaviour1": "_現在の時刻_を表示し、1日に2回曲を再生します。、_正午_と夕暮れに_プレイヤーが眠れる_時間になるとすぐに_再生_します。", "block.create.turntable.tooltip": "ターンテーブル", "block.create.turntable.tooltip.summary": "_回転力_を洗練された乗り物酔いに変えます。", - "block.create.millstone.tooltip": "石臼", - "block.create.millstone.tooltip.summary": "搬入された_材料_の_研削_に適した機械。隣接する歯車によって、または下部のシャフトに接続することによって、回転力を供給できます。完成品は機械から搬出する必要があります。", - "block.create.millstone.tooltip.condition1": "回転したとき", - "block.create.millstone.tooltip.behaviour1": "ブロックの側面または上面から搬入されたアイテムを_粉砕_を開始します。", - "block.create.millstone.tooltip.condition2": "右クリックしたとき", - "block.create.millstone.tooltip.behaviour2": "出力物を手動で回収します。", - - "block.create.crushing_wheel.tooltip": "破砕ホイール", - "block.create.crushing_wheel.tooltip.summary": "何かを_破砕_する大きな回転させられるホイール。", - "block.create.crushing_wheel.tooltip.condition1": "他の破砕ホイールに取り付けたとき", - "block.create.crushing_wheel.tooltip.behaviour1": "様々な物を処理する破砕機を形成します。ホイールの歯は、_同じ速度_で_反対方向_に回る必要があります。", - - "block.create.mechanical_press.tooltip": "メカニカルプレス", - "block.create.mechanical_press.tooltip.summary": "その下のアイテムを圧縮する強力なピストン。一定の_回転力_が必要です。", - "block.create.mechanical_press.tooltip.condition1": "レッドストーン信号を受けたとき", - "block.create.mechanical_press.tooltip.behaviour1": "その下にドロップされたアイテムの圧縮を_開始_します。", - "block.create.mechanical_press.tooltip.condition2": "メカニカルベルトの上にあるとき", - "block.create.mechanical_press.tooltip.behaviour2": "ベルト上のバイパスアイテムを_自動的_に圧縮します。", - "block.create.mechanical_press.tooltip.condition3": "鉢の上にあるとき", - "block.create.mechanical_press.tooltip.behaviour3": "必要な材料がすべて揃っているときに、鉢の_アイテムを_圧縮_し始めます。", - - "block.create.basin.tooltip": "鉢", - "block.create.basin.tooltip.summary": "_メカニカルミキサー_と_メカニカルプレス_での加工に使用される便利な_アイテムの入れ物_。_レッドストーンコンパレーター_に対応しています。", - "block.create.basin.tooltip.condition1": "自動搬出", - "block.create.basin.tooltip.behaviour1": "ベルト、他の鉢、デポ、アイテム排液口などの_インベントリ_が_障害物_のない鉢の_側面より下_にある場合、鉢で作成された_アイテム/液体_の_完成品_を自動搬出することができます。これは自動化に便利です。", - - "block.create.blaze_burner.tooltip": "ブレイズバーナー", - "block.create.blaze_burner.tooltip.summary": "飼いならしたブレイズの家とするついでに鉢を暖めるブロック。", - "block.create.blaze_burner.tooltip.condition1": "鉢の下に設置したとき", - "block.create.blaze_burner.tooltip.behaviour1": "鉢のレシピに_熱気_を供給します。", - "block.create.blaze_burner.tooltip.condition2": "燃料を使ったとき", - "block.create.blaze_burner.tooltip.behaviour2": "使用したアイテムのかまど燃焼時間分、残りの燃焼時間を伸ばします。アイテムを消費します。_ブレイズケーキ_を使用したときはさらに高温になります。", - - "block.create.reinforced_rail.tooltip": "補強レール", - "block.create.reinforced_rail.tooltip.summary": "木材で安定させたレールは、_支えとなるブロックなし_で_設置_できます。", - - "block.create.mechanical_mixer.tooltip": "メカニカルミキサー", - "block.create.mechanical_mixer.tooltip.summary": "無定形レシピをその下のアイテムに適用する動的ミキサー。一定の_回転力_と下に配置された_鉢_が必要です(間に隙間が必要です)。", - "block.create.mechanical_mixer.tooltip.condition1": "鉢の上にあるとき", - "block.create.mechanical_mixer.tooltip.behaviour1": "必要なすべての材料が存在するときはいつでも、鉢のアイテムの混合を開始します。意図しないレシピで動くのを防ぐには、鉢のフィルタースロットを使用するか、必要な材料がすべてそろうまで回転を止めましょう。", - - "block.create.mechanical_crafter.tooltip": "メカニカルクラフター", - "block.create.mechanical_crafter.tooltip.summary": "_あらゆる形_の_クラフトレシピ_を_自動化_する自動作業台。_レシピ_に対応する_グリッド_として、ベルトがアイテムが集まりクラフターから出るような流れを作るように複数設置してください。", - "block.create.mechanical_crafter.tooltip.condition1": "回転したとき", - "block.create.mechanical_crafter.tooltip.behaviour1": "グリッド内の全てのクラフターにアイテムが入ったら、すぐにクラフトを開始します。", - "block.create.mechanical_crafter.tooltip.condition2": "レッドストーンパルスがオンの時", - "block.create.mechanical_crafter.tooltip.behaviour2": "現在与えられているすべての_アイテム_を使って、_強制的_に_クラフト_を開始します。", - "block.create.mechanical_crafter.tooltip.control1": "正面をレンチで使ったとき", - "block.create.mechanical_crafter.tooltip.action1": "_個々のクラフターが_アイテムを移動_させる_方向_を循環させます。クラフトグリッドを形成するには、すべてのアイテムを最後のクラフターに向かって_移動させる流れ_を作るように_ベルト_を設置する必要があります。最後のクラフターはグリッドから_離れる_方向を指す必要があります。", - "block.create.mechanical_crafter.tooltip.control2": "背面をレンチで使ったとき", - "block.create.mechanical_crafter.tooltip.action2": "隣接するクラフターの_搬入インベントリ_を_接続_します。これを使用してクラフトグリッドの_スロットを_結合_し、_搬入作業_を_簡略化_できます。", - - "block.create.furnace_engine.tooltip": "かまどエンジン", - "block.create.furnace_engine.tooltip.summary": "_稼動しているかまど_で動く強力な_原動機_。", - "block.create.furnace_engine.tooltip.condition1": "燃えてるかまどに取り付けたとき", - "block.create.furnace_engine.tooltip.behaviour1": "その前(1m離す)に置かれた_勢車_への_動力供給_を_開始_します。高速化するには溶鉱炉を使用してください。", - - "block.create.flywheel.tooltip": "勢車", - "block.create.flywheel.tooltip.summary": "_取り付けられているエンジン_の力を利用して、発生した力を_安定させる_大きな金属ホイール。勢車は_1m離れていて_、_互いの角度に90°の差があれば_エンジンに繋がります。", - "block.create.flywheel.tooltip.condition1": "稼働中のエンジンに取り付けられてるとき", - "block.create.flywheel.tooltip.behaviour1": "原動機の強度と速度に基づいて、接続された機械に_回転力_を供給します。", - - "block.create.portable_storage_interface.tooltip": "ポータブルストレージインターフェース", - "block.create.portable_storage_interface.tooltip.summary": "ピストン、ベアリング、トロッコ、またはプーリーによって移動する_構造物_との間で_アイテム_を_移動_させる可搬式の交換ポイント。2つのインターフェースは、互いに_向かい合って_、_1~2ブロック離す_必要があります。", - "block.create.portable_storage_interface.tooltip.condition1": "移動してるとき", - "block.create.portable_storage_interface.tooltip.behaviour1": "設置してある_ポータブルストレージインターフェース_と相互作用して、構造物との間でアイテムを運搬します。_設置してあるインターフェース_に搬入または搬出するは、構造物上のインベントリと_直接_相互作用します。アイテムが交換される間、構造物は一時的に停止します。", - "block.create.portable_storage_interface.tooltip.condition2": "レッドストーン信号を受けたとき", - "block.create.portable_storage_interface.tooltip.behaviour2": "アクティブな接続を即座に_切断_します。", - "block.create.portable_fluid_interface.tooltip": "ポータブル液体インターフェース", "block.create.portable_fluid_interface.tooltip.summary": "ピストン、ベアリング、トロッコ、またはプーリーで移動する_構造物_との間で_液体_を_移動_させる可搬式の交換ポイント。2つのインターフェースは、互いに_向かい合って_、_1~2ブロック離す_必要があります。", "block.create.portable_fluid_interface.tooltip.condition1": "動かしたとき", @@ -1564,245 +1391,744 @@ "block.create.portable_fluid_interface.tooltip.condition2": "レッドストーン信号を受けたとき", "block.create.portable_fluid_interface.tooltip.behaviour2": "アクティブな接続を即座に_切断_します。", - "block.create.rotation_speed_controller.tooltip": "回転速度コントローラー", - "block.create.rotation_speed_controller.tooltip.summary": "回転を任意の速度に上げたり下げたりさせることができる_設定_可能な_伝達機_。", - "block.create.rotation_speed_controller.tooltip.condition1": "大きな歯車を取り付けたとき", - "block.create.rotation_speed_controller.tooltip.behaviour1": "入ってくる回転力を歯車に伝達して、目標とする_速度_に_合わせ_ようとします。_歯車_はコントローラの_上_に_取り付ける_必要があります。", - - "block.create.mechanical_piston.tooltip": "メカニカルピストン", - "block.create.mechanical_piston.tooltip.summary": "ピストンのさらに進化したバージョン。回転力を利用して前にある構造物を正確に移動させます。後部にあるピストン延長ポールは、このの稼働範囲を決めます。延長ポールがないと、ピストンは動きません。_シャーシ_や_スライムボール_、_強力接着剤_を使用して、1列以上のブロックを移動させることができます。", - "block.create.mechanical_piston.tooltip.condition1": "回転したとき", - "block.create.mechanical_piston.tooltip.behaviour1": "取り付けられた構造物の移動を開始します。速度と方向は、入力される回転速度と相関します。", - - "block.create.piston_extension_pole.tooltip": "ピストン延長ポール", - "block.create.piston_extension_pole.tooltip.summary": "メカニカルピストンの範囲を拡張します。", - "block.create.piston_extension_pole.tooltip.condition1": "メカニカルピストンに取り付けたとき", - "block.create.piston_extension_pole.tooltip.behaviour1": "ピストンの範囲を1ブロック拡張します。", - - "block.create.mechanical_bearing.tooltip": "メカニカルベアリング", - "block.create.mechanical_bearing.tooltip.summary": "_大きな構造物_を回転させたり、風からの_回転力_を利用したりするために使用されます。", - "block.create.mechanical_bearing.tooltip.condition1": "回転したとき", - "block.create.mechanical_bearing.tooltip.behaviour1": "アタッチされたブロックの回転を開始します。_シャーシ_や_スライム_、_強力接着剤_を使用して、複数のブロックを移動します。", - - "block.create.windmill_bearing.tooltip": "風車ベアリング", - "block.create.windmill_bearing.tooltip.summary": "風からの_回転力_を利用します。自分でデザインした風車を取り付けて、回転するのを見よう!", - "block.create.windmill_bearing.tooltip.condition1": "右クリックしたとき", - "block.create.windmill_bearing.tooltip.behaviour1": "装着された構造物の回転から発生する_回転力_の供給を開始します。構造物には、適切な_帆ブロック_または_羊毛_が含まれている必要があります。_シャーシ_、_スライム_、_強力接着剤_を使用して1つ以上のブロックを移動させることができます。", - - "block.create.sail_frame.tooltip": "帆フレーム", - "block.create.sail_frame.tooltip.summary": "構造物の一部が_風車ベアリング_に取り付けられたときに有用な運動エネルギーの源。建築ブロックにも。", - - "block.create.white_sail.tooltip": "帆", - "block.create.white_sail.tooltip.summary": "構造物の一部が_風車ベアリング_に取り付けられたときに有用な運動エネルギーの源。建築ブロックにも。様々な色があります。", - "block.create.white_sail.tooltip.condition1": "染料で右クリックしたとき", - "block.create.white_sail.tooltip.behaviour1": "帆の色を変更します。", - - "block.create.clockwork_bearing.tooltip": "時計仕掛けのベアリング", - "block.create.clockwork_bearing.tooltip.summary": "現在の_ゲーム内時間_に応じて最大2つの_時計の針_を回転させる、_メカニカルベアリング_の進化版。", - "block.create.clockwork_bearing.tooltip.condition1": "回転したとき", - "block.create.clockwork_bearing.tooltip.behaviour1": "現在の時間に向かって取り付けた構造物の回転を開始します。2番目の構造物が存在する場合、それは分針として機能します。", - - "block.create.sequenced_gearshift.tooltip": "シーケンスギアシフト", - "block.create.sequenced_gearshift.tooltip.summary": "_プログラミング_できる_便利_な伝達機械。最大_5つ_の_連続_した_命令_に従って_回転処理_を変更することができます。高速になると精度が悪くなる可能性があります。", - "block.create.sequenced_gearshift.tooltip.condition1": "レッドストーン信号を受けたとき", - "block.create.sequenced_gearshift.tooltip.behaviour1": "回転速度に基づいてプログラムされた命令の実行を開始します。", - "block.create.sequenced_gearshift.tooltip.condition2": "右クリックしたとき", - "block.create.sequenced_gearshift.tooltip.behaviour2": "_設定インターフェース_を開きます。", - - "block.create.cart_assembler.tooltip": "トロッコアセンブラ", - "block.create.cart_assembler.tooltip.summary": "_レール_の上に置き、動く構造物を通過するトロッコの上に_組み立て_及び_分解_することができます。各種レール特有の動作については[Ctrl]を参照してください。", - "block.create.cart_assembler.tooltip.condition1": "1つのからくりトロッコ", - "block.create.cart_assembler.tooltip.behaviour1": "_1つ_のアセンブラを使用すると、構造物は _1つ_の_トロッコ_上に固定され、回転します。_レンチ_を使用して、希望する_回転動作_を指定します。", - "block.create.cart_assembler.tooltip.condition2": "からくり列車", - "block.create.cart_assembler.tooltip.behaviour2": "_構造物_によって_接続_された2つのトロッコアセンブラは、両方がトロッコを含むと、それらの_2つ_の_間_に_載せられた構造物_を使用してそれらのトロッコを接続します。構造物は_トロッコ連結器_と同様の動作をします。", - "block.create.cart_assembler.tooltip.control1": "レールの上に置いたとき", - "block.create.cart_assembler.tooltip.action1": " _レッドストーン信号_を受けると通過するトロッコに_組み立て_、それ以外の場合は_分解_します。", - "block.create.cart_assembler.tooltip.control2": "パワードレールの上に置いたとき", - "block.create.cart_assembler.tooltip.action2": "_レッドストーン信号_を受けているときはトロッコを組み立てて_加速_し、そうでないときは分解して_保持_する。", - "block.create.cart_assembler.tooltip.control3": "ディテクターレールの上に設置したとき", - "block.create.cart_assembler.tooltip.action3": "_未組立_のトロッコを_組み立て_、_組立済み_のトロッコを_分解_します。", - "block.create.cart_assembler.tooltip.control4": "アクティベーターレールの上に置いたとき", - "block.create.cart_assembler.tooltip.action4": "レッドストーン信号を受けるとトロッコを_分解_します。", - - "block.create.rope_pulley.tooltip": "ローププーリー", - "block.create.rope_pulley.tooltip.summary": "_取り付けられたブロック_や_構造物_を_垂直_方向に移動させます。_シャーシ_、_スライムボール_、_強力接着剤_を使用して、1つ以上のブロックを移動させることもできます。", - "block.create.rope_pulley.tooltip.condition1": "回転したとき", - "block.create.rope_pulley.tooltip.behaviour1": "取り付けた構造物の移動を開始します。速度と方向は、回転速度に相関します。", - - "block.create.linear_chassis.tooltip": "リニアシャーシ", - "block.create.linear_chassis.tooltip.summary": "移動用の構造物を接続する設定可能な土台ブロック。", - "block.create.linear_chassis.tooltip.condition1": "動かしたとき", - "block.create.linear_chassis.tooltip.behaviour1": "同じ向きに_接続_したすべての_シャーシ_と、その範囲内にあるブロックを移動させます。ブロックはシャーシの_粘着面_に面している場合のみ_引っ張ります_。([Ctrl]を参照)", - "block.create.linear_chassis.tooltip.condition2": "レンチを持ったとき", - "block.create.linear_chassis.tooltip.behaviour2": "このシャーシブロックの範囲を設定します。Ctrl を押したままにすると、接続されているすべてのシャーシブロックの範囲も変更できます。", - "block.create.linear_chassis.tooltip.control1": "スライムボールで右クリックしたとき", - "block.create.linear_chassis.tooltip.action1": "クリックした面を_粘着面_にします。移動させると、移動方向に関わらず、シャーシは取り付けられたブロックを_引っ張り_ます。", - - "block.create.secondary_linear_chassis.tooltip": "セカンダリリニアシャーシ", - "block.create.secondary_linear_chassis.tooltip.summary": "他のシャーシと接続しない第2の_リニアシャーシ_。", - - "block.create.radial_chassis.tooltip": "ラジアルシャーシ", - "block.create.radial_chassis.tooltip.summary": "移動用の構造物を接続する設定可能な土台ブロック。", - "block.create.radial_chassis.tooltip.condition1": "動かしたとき", - "block.create.radial_chassis.tooltip.behaviour1": "柱状に_接続_したすべての_シャーシ_と、周囲のブロックを_移動_させます。周囲のブロックは、範囲内にあり、かつ粘着面に面している場合にのみ_引っ張られ_ます([Ctrl]を参照)。", - "block.create.radial_chassis.tooltip.condition2": "レンチを持ったとき", - "block.create.radial_chassis.tooltip.behaviour2": "このシャーシブロックの有効_範囲_を設定します。Ctrlキーを押したままにすると、接続されているすべてのシャーシブロックの範囲も同時に変更できます。", - "block.create.radial_chassis.tooltip.control1": "スライムボールで右クリックしたとき", - "block.create.radial_chassis.tooltip.action1": "クリックした面を_粘着面_にします。シャーシが移動すると、粘着面に接続されているすべての指定のブロックも一緒に移動します。", - - "block.create.mechanical_drill.tooltip": "メカニカルドリル", - "block.create.mechanical_drill.tooltip.summary": "_ブロックを壊す_のに適した作業機。_メカニカルピストン_や_ベアリング_等で移動できます。", - "block.create.mechanical_drill.tooltip.condition1": "回転したとき", - "block.create.mechanical_drill.tooltip.behaviour1": "_固定式_のブロック破壊機として機能します。また、有効範囲の_エンティティを傷つけます_。", - "block.create.mechanical_drill.tooltip.condition2": "動かしたとき", - "block.create.mechanical_drill.tooltip.behaviour2": "ドリルが衝突するブロックを壊します。", - - "block.create.mechanical_harvester.tooltip": "メカニカルハーベスター", - "block.create.mechanical_harvester.tooltip.summary": "中規模の作物の自動化に適した機械式植物カッター。_メカニカルピストン_や_ベアリング_等で移動できます。", - "block.create.mechanical_harvester.tooltip.condition1": "動かしたとき", - "block.create.mechanical_harvester.tooltip.behaviour1": "ブレードが衝突する_すべての成熟した作物を収穫_し、それらを初期の成長状態にリセットします。", - - "block.create.mechanical_plough.tooltip": "メカニカルプラウ", - "block.create.mechanical_plough.tooltip.summary": "メカニカルプラウには様々な用途があります。これは_メカニカルピストン_や_ベアリング_等で移動できます。", - "block.create.mechanical_plough.tooltip.condition1": "動かしたとき", - "block.create.mechanical_plough.tooltip.behaviour1": "松明や雪など、当たり判定がないブロックを壊します。エンティティを傷付けることはありません。また、クワを使うように土を耕します。", - - "block.create.mechanical_saw.tooltip": "メカニカルソー", - "block.create.mechanical_saw.tooltip.summary": "_木_を効率的に_切り倒したり_、_ブロック_を_加工_したりするのに適しています。_メカニカルピストン_や_ベアリング_等で移動できます。", - "block.create.mechanical_saw.tooltip.condition1": "上向きのとき", - "block.create.mechanical_saw.tooltip.behaviour1": "そこにドロップまたは搬入されたアイテムに_製材_および石工レシピを適用します。複数の出力が可能な場合、フィルターが割り当てられていない限り、出力が循環します。", - "block.create.mechanical_saw.tooltip.condition2": "横向きの場合", - "block.create.mechanical_saw.tooltip.behaviour2": "その前の_原木_を_切り倒す_。その原木が木を支えていた場合、_木_は_崩壊_します。", - "block.create.mechanical_saw.tooltip.condition3": "動かしたとき", - "block.create.mechanical_saw.tooltip.behaviour3": "ノコギリが衝突する_すべての木を切り倒します_。", - "block.create.stockpile_switch.tooltip": "在庫スイッチ", - "block.create.stockpile_switch.tooltip.summary": "接続されたコンテナの_空き容量_に基づいてレッドストーン信号を切り替えます。", - "block.create.stockpile_switch.tooltip.condition1": "下限を下回ったとき", - "block.create.stockpile_switch.tooltip.behaviour1": "レッドストーン信号を停止", + "block.create.stockpile_switch.tooltip.summary": "接続されたコンテナの_空き容量_に基づいてレッドストーン信号を切り替えます。便利なフィルターが付属しています。_コンパレータ―_とは違って、_在庫スイッチ_は、信号が反転される_しきい値_を設定できます。", + "block.create.stockpile_switch.tooltip.condition1": "右クリックしたとき", + "block.create.stockpile_switch.tooltip.behaviour1": "_設定インターフェース_を開きます。", "block.create.content_observer.tooltip": "コンテンツオブザーバー", - "block.create.content_observer.tooltip.summary": "設定された_フィルター_に一致する_コンテナ_や_メカニカルベルト_内の_アイテム_を検出します。観察している_インベントリ_、_ベルト_、または_シュート_に一致するアイテムが含まれている場合、このは_レッドストーン信号_を発します。観察された_ファンネル_が一致するアイテムを_輸送_すると、このコンポーネントは_レッドストーンパルス_を発します。", - - "block.create.redstone_link.tooltip": "レッドストーンリンク", - "block.create.redstone_link.tooltip.summary": "_ワイヤレスレッドストーン_接続の終点。任意のアイテムを使用して_周波数_を割り当てることができます。通信距離は限られていますが、かなり離れても通信することができます。", - "block.create.redstone_link.tooltip.condition1": "信号を受信したとき", - "block.create.redstone_link.tooltip.behaviour1": "同じ周波数のリンクから信号を受信すると、レッドストーン信号を出力します。", - "block.create.redstone_link.tooltip.control1": "アイテムで右クリックしたとき", - "block.create.redstone_link.tooltip.action1": "_周波数_をそのアイテムに設定します。周波数を定義するために、_合計2つの異なるアイテム_を組み合わせて使えます。", - "block.create.redstone_link.tooltip.control2": "スニークしながら右クリックしたとき", - "block.create.redstone_link.tooltip.action2": "_受信_モードと_送信_モードを切り替えます。", - - "block.create.nixie_tube.tooltip": "ニキシー管", - "block.create.nixie_tube.tooltip.summary": "オシャレにレッドストーン強度と文字を表示します。", - "block.create.nixie_tube.tooltip.condition1": "レッドストーン信号を受けたとき", - "block.create.nixie_tube.tooltip.behaviour1": "現在のレッドストーンの_信号強度_を表示します。", - "block.create.nixie_tube.tooltip.condition2": "名札を使ったとき", - "block.create.nixie_tube.tooltip.behaviour2": "_名札_の_内容_を複数のニキシー管を並べて表示します。", - - "block.create.redstone_contact.tooltip": "レッドストーンコンタクト", - "block.create.redstone_contact.tooltip.summary": "レッドストーン信号をペアで出力します。_メカニカルピストン_や_ベアリング_等で移動できます。", - "block.create.redstone_contact.tooltip.condition1": "他のコンタクトと向かい合ったとき", - "block.create.redstone_contact.tooltip.behaviour1": "レッドストーン信号を出力します。", - "block.create.redstone_contact.tooltip.condition2": "動かしたとき", - "block.create.redstone_contact.tooltip.behaviour2": "通過するすべての固定したレッドストーンコンタクトに反応します。", + "block.create.content_observer.tooltip.summary": "設定された_フィルター_に一致する_コンテナ_や_メカニカルベルト_内の_アイテム_を_検出_します。観察している_収納ブロック_、_ベルト_、または_シュート_に一致するアイテムが含まれている場合、このは_レッドストーン信号_を発します。観察された_ファンネル_が一致するアイテムを_運搬_すると、このコンポーネントは_レッドストーンパルス_を発します。", "block.create.adjustable_crate.tooltip": "可変クレート", - "block.create.adjustable_crate.tooltip.summary": "この_収納ブロック_は、容量を手動で制御できます。任意のアイテムを_16スタック_まで収納できます。_レッドストーンコンパレーター_に対応しています。", - "block.create.adjustable_crate.tooltip.control1": "右クリックしたとき", - "block.create.adjustable_crate.tooltip.action1": "_インターフェース_を開きます。", + "block.create.adjustable_crate.tooltip.summary": "この_収納ブロック_は、容量を手動で調整できます。任意のアイテムを_16スタック_まで収納できます。_レッドストーンコンパレーター_に対応しています。", + "block.create.adjustable_crate.tooltip.condition": "右クリックしたとき", + "block.create.adjustable_crate.tooltip.behaviour1": "_インターフェース_を開きます。", "block.create.creative_crate.tooltip": "クリエイティブクレート", - "block.create.creative_crate.tooltip.summary": "隣接する概略図砲へブロックを無限に供給します。", + "block.create.creative_crate.tooltip.summary": "この_収納ブロック_は、あらゆるアイテムを無限に複製します。隣接する_概略図砲_へブロックを無限に供給します。", "block.create.creative_crate.tooltip.condition1": "フィルタースロットにアイテムが入っているとき", "block.create.creative_crate.tooltip.behaviour1": "このクレートから何かを_搬出_すると、指定されたアイテムが_無限_に_搬出_されます。このクレートに_搬入_されたアイテムは_消滅_します。", - "block.create.deployer.tooltip": "デプロイヤー", - "block.create.deployer.tooltip.summary": "_殴る_、_使う_、_起動する_。この機械は、_プレイヤー_をできるだけ_真似_しようとします。_アイテムを自分のインベントリに入れたり_、_預けたり_できます。持っているアイテムはブロックから直接搬入・搬出する必要があります。", - "block.create.deployer.tooltip.condition1": "回転したとき", - "block.create.deployer.tooltip.behaviour1": "腕を機械の2m先まで伸ばし、アイテムを_発動_する。", - "block.create.deployer.tooltip.condition2": "レンチで右クリックしたとき", - "block.create.deployer.tooltip.behaviour2": "パンチモードと切り替えます。_パンチモード_では、デプロイヤーはそのアイテムを使用して_ブロックを壊したりエンティティを殴ったり_しようとします。", - "block.create.deployer.tooltip.condition3": "フィルターが割り当てられているとき", - "block.create.deployer.tooltip.behaviour3": "合わないアイテムは搬入できません。逆に合うアイテムは搬出できません。", - - "block.create.brass_casing.tooltip": "真鍮ケーシング", - "block.create.brass_casing.tooltip.summary": "さまざまな用途に使用できる頑丈な機械ケーシング。装飾にも安心してお使いいただけます。", - - "block.create.pulse_repeater.tooltip": "パルスリピーター", - "block.create.pulse_repeater.tooltip.summary": "通過するレッドストーン信号を_1ティック_の長さにカットする簡単な回路。", - - "block.create.adjustable_repeater.tooltip": "可変リピーター", - "block.create.adjustable_repeater.tooltip.summary": "最大_30分_の遅延を_設定可能_な高度な_レッドストーンリピーター_。", - - "block.create.adjustable_pulse_repeater.tooltip": "可変パルスリピーター", - "block.create.adjustable_pulse_repeater.tooltip.summary": "最大_30分_の遅延を_設定可能_な_パルスリピーター_。", - - "block.create.analog_lever.tooltip": "アナログレバー", - "block.create.analog_lever.tooltip.summary": "_出力するレッドストーン信号強度_をより_正確に制御_できるレバー。", - - "block.create.powered_toggle_latch.tooltip": "パワードトグルラッチ", - "block.create.powered_toggle_latch.tooltip.summary": "レッドストーンパルスによって切替できるレバー。", - - "block.create.powered_latch.tooltip": "パワードラッチ", - "block.create.powered_latch.tooltip.summary": "_レッドストーン信号_で制御できるレバー。_背面のレッドストーン信号_でオンになり、_側面からのレッドストーン信号_でリセットされます。", - "block.create.controller_rail.tooltip": "コントローラーレール", - "block.create.controller_rail.tooltip.summary": "トロッコの_移動速度_を_細かく制御_できる一方通行の_パワード_レール", + "block.create.controller_rail.tooltip.summary": "トロッコの_移動速度_を_細かく制御_できる_一方通行_の_パワード_レール", "block.create.controller_rail.tooltip.condition1": "レッドストーン信号を受けたとき", - "block.create.controller_rail.tooltip.behaviour1": "通過する_トロッコ_を_信号の強度_に対応した速度に_加速_または_減速_します。また、隣接するコントローラレールにレッドストーン信号を伝達します。強度の異なる2つのコントローラレールにレッドストーン信号を供給すると、それらの間のレールはその信号の変化を補間します。", - - "block.create.speedometer.tooltip": "回転速度メーター", - "block.create.speedometer.tooltip.summary": "接続された機械の_回転速度_を測定して表示します。_レッドストーンコンパレーター_に対応しています。", - "block.create.speedometer.tooltip.condition1": "回転したとき", - "block.create.speedometer.tooltip.behaviour1": "速度レベルに対応する色を表示します。_緑_は低速、_青_は中速、_紫_は高速を示します。一部の機械は、稼働に十分なレベルの速度を必要とします。", - - "block.create.stressometer.tooltip": "応力メーター", - "block.create.stressometer.tooltip.summary": "接続された動力ネットワーク全体の応力を測定して表示します。_レッドストーンコンパレーター_に対応しています。", - "block.create.stressometer.tooltip.condition1": "回転したとき", - "block.create.stressometer.tooltip.behaviour1": "応力レベルに対応する色を表示します。_過度に応力がかかった(超過応力)ネットワーク_の機械は全て停止します。応力は動力ネットワークに_原動機_を追加することで緩和することができます。", + "block.create.controller_rail.tooltip.behaviour1": "通過する_トロッコ_を_信号の強度_に対応した移動速度に_加速_または_減速_します。また、隣接するコントローラレールにレッドストーン信号を伝達します。2つのコントローラレールに強度の異なるレッドストーン信号を供給すると、それらの間のレールはその信号の変化を補間します。", "item.create.sand_paper.tooltip": "紙やすり", "item.create.sand_paper.tooltip.summary": "_素材_を_磨く_のに使える荒い紙。デプロイヤーに自動的で磨かせることもできます。", "item.create.sand_paper.tooltip.condition1": "使ったとき", - "item.create.sand_paper.tooltip.behaviour1": "オフハンドで持っていたり、視線先の床に転がっているアイテムを磨きます。", - - "item.create.super_glue.tooltip": "強力接着剤", - "item.create.super_glue.tooltip.summary": "これでブロックを接着すると、永遠に外れることはありません。", - "item.create.super_glue.tooltip.condition1": "使ったとき", - "item.create.super_glue.tooltip.behaviour1": "ブロックの_クリックされた面_を_粘着面_にします。粘着面に取り付けられたブロックは、_メカニカルピストン_や_ベアリング_等によって移動されると、_引っ張られ_ます。", - "item.create.super_glue.tooltip.condition2": "オフハンドに持ったとき", - "item.create.super_glue.tooltip.behaviour2": "メインハンドで_設置_したブロックの_側面_に_自動的_に接着剤を_塗り_ます。", + "item.create.sand_paper.tooltip.behaviour1": "_オフハンド_で持っていたり、_視線先_の_ドロップ状態のアイテム_を磨きます。", "item.create.builders_tea.tooltip": "建築家のお茶", "item.create.builders_tea.tooltip.summary": "_やる気_がみなぎる、一日の始まりに最適な飲み物。", - "item.create.refined_radiance.tooltip": "洗練された極光体", - "item.create.refined_radiance.tooltip.summary": "_吸収した輝き_から鍛造した色彩の化合物。", + "item.create.refined_radiance.tooltip": "高貴な光輝", + "item.create.refined_radiance.tooltip.summary": "_吸収した光輝_から鍛造した色彩素材。", "item.create.shadow_steel.tooltip": "シャドウスチール", - "item.create.shadow_steel.tooltip.summary": "_奈落の虚無_から鍛造した色彩の化合物。", + "item.create.shadow_steel.tooltip.summary": "_奈落の虚無_から鍛造した色彩素材。", "item.create.minecart_coupling.tooltip": "トロッコ連結器", - "item.create.minecart_coupling.tooltip.summary": "壮大な列車を作成するために一緒にすべてのトロッコやからくり列車を連結しよう。", + "item.create.minecart_coupling.tooltip.summary": "壮大な列車を作るために_トロッコ_や_からくり車両_を_連結_しよう。", "item.create.minecart_coupling.tooltip.condition1": "トロッコに使ったとき", - "item.create.minecart_coupling.tooltip.behaviour1": "2台のトロッコを連結します。それらは移動中に一定の距離を保とうします。", - - "item.create.crafter_slot_cover.tooltip": "スロットカバー", - "item.create.crafter_slot_cover.tooltip.summary": "取り付けた_メカニカルクラフター_をレシピの空のスロットとして示します。クラフターは必ずしも正方形である必要はありません。これは、_同じアイテムが離れた場所にある_レシピに便利です。", + "item.create.minecart_coupling.tooltip.behaviour1": "_2台_のトロッコを連結します。それらは移動中に_一定_の_距離_を保とうします。", "create.tooltip.wip": "WIP", "create.tooltip.workInProgress": "作業中です!", "create.tooltip.randomWipDescription0": "お子様の手の届かないところに保管してください。", - "create.tooltip.randomWipDescription1": "赤ちゃんパンダは、このアイテムを使用するたびに死にます。そう、いつでもね。", + "create.tooltip.randomWipDescription1": "赤ちゃんパンダは、このアイテムを使うたびに死にます。そう、いつでもね。", "create.tooltip.randomWipDescription2": "自己責任。", "create.tooltip.randomWipDescription3": "これはあなたが探しているアイテムではありません。*人差し指を振って*ちっちっちっ、解散!", "create.tooltip.randomWipDescription4": "このアイテムは10秒で自爆します。10、9、8 ...", "create.tooltip.randomWipDescription5": "私を信じて、それは無駄だ。", - "create.tooltip.randomWipDescription6": "このアイテムを使用することにより、お客様はここに免責事項に同意し、その条件に同意するものとします。", + "create.tooltip.randomWipDescription6": "このアイテムを使うことにより、お客様は免責事項に同意し、その条件を承諾するものとします。", "create.tooltip.randomWipDescription7": "これは君に向いていないかもしれない。あれはどう??", - "create.tooltip.randomWipDescription8": "それを使ったことをすぐ後悔する。", + "create.tooltip.randomWipDescription8": "それを使ったことをすぐ後悔するだろう。", - "_": "Thank you for translating Create!" -} + + "_": "->------------------------] Ponder Content [------------------------<-", + + "create.ponder.hold_to_ponder": "[%1$s] を長押しして思案画面を開く", + "create.ponder.subject": "このシーンの主題", + "create.ponder.pondering": "思案中...", + "create.ponder.identify_mode": "確認モードになっています.\n [%1$s] で一時停止を解除", + "create.ponder.associated": "関連項目", + "create.ponder.close": "閉じる", + "create.ponder.identify": "ブロック名を確認", + "create.ponder.next": "次のシーン", + "create.ponder.previous": "前のシーン", + "create.ponder.replay": "最初から", + "create.ponder.think_back": "戻る", + "create.ponder.slow_text": "熟考(スロー再生)", + "create.ponder.shared.movement_anchors": "シャーシや超粘着剤を使えば大きな構造物も動かせます", + "create.ponder.shared.rpm32": "32 RPM", + "create.ponder.shared.sneak_and": "スニーク +", + "create.ponder.shared.storage_on_contraption": "構造物中の収納ブロックは自動的にドロップを拾います", + "create.ponder.shared.behaviour_modify_wrench": "この挙動はレンチを使って変更できます", + "create.ponder.shared.rpm8": "8 RPM", + "create.ponder.shared.ctrl_and": "Ctrl +", + "create.ponder.shared.rpm16_source": "動力源: 16 RPM", + "create.ponder.shared.rpm16": "16 RPM", + "create.ponder.tag.kinetic_sources": "原動機", + "create.ponder.tag.kinetic_sources.description": "回転力を生み出す機械です", + "create.ponder.tag.contraption_actor": "からくり構造部品", + "create.ponder.tag.contraption_actor.description": "ブロックを動かす機械に取り付けたときに特別な動作をする機械です", + "create.ponder.tag.arm_targets": "メカニカルアームのターゲット", + "create.ponder.tag.arm_targets.description": "メカニカルアームの搬入元または搬出先にできる機械/ブロックです", + "create.ponder.tag.logistics": "輸送機械", + "create.ponder.tag.logistics.description": "アイテムの運搬を補助する機械です", + "create.ponder.tag.movement_anchor": "からくり機械", + "create.ponder.tag.movement_anchor.description": "取り付けたブロック構造物を様々な方法で動かすことができるからくりを作ることができる機械です", + "create.ponder.tag.creative": "クリエイティブ限定", + "create.ponder.tag.creative.description": "サバイバルモードでは通常入手できない機械です", + "create.ponder.tag.kinetic_relays": "伝達機械", + "create.ponder.tag.kinetic_relays.description": "回転力の伝達に役立つ機械です", + "create.ponder.tag.windmill_sails": "風車ベアリング用の帆", + "create.ponder.tag.windmill_sails.description": "風車につける構造物を組み立てたときに帆にカウントされるブロック。どのブロックを使っても同じ効率です", + "create.ponder.tag.contraption_assembly": "ブロック組み立て用品", + "create.ponder.tag.contraption_assembly.description": "アニメーションして動く構造物を組み立てるための道具や機械です", + "create.ponder.tag.decoration": "装飾", + "create.ponder.tag.decoration.description": "主に装飾に使うブロックです", + "create.ponder.tag.kinetic_appliances": "作業機械", + "create.ponder.tag.kinetic_appliances.description": "回転力を利用する機械です", + "create.ponder.tag.redstone": "制御機械", + "create.ponder.tag.redstone.description": "レッドストーン工学に役立つ機械です", + "create.ponder.tag.fluids": "液体制御機械", + "create.ponder.tag.fluids.description": "液体の輸送や利用に役立つ機械です", + + "create.ponder.adjustable_pulse_repeater.header": "可変パルスリピーターによる信号制御", + "create.ponder.adjustable_pulse_repeater.text_1": "可変パルスリピーターは信号を遅延し、短いパルスにして出力します", + "create.ponder.adjustable_pulse_repeater.text_2": "マウスホイールで遅延時間を調整できます", + "create.ponder.adjustable_pulse_repeater.text_3": "最大30分まで遅延時間を調整できます", + + "create.ponder.adjustable_repeater.header": "可変リピーターによる信号制御", + "create.ponder.adjustable_repeater.text_1": "可変リピーターは通常のレッドストーンリピーターと同様の動作をします", + "create.ponder.adjustable_repeater.text_2": "決められた時間だけ遅延します...", + "create.ponder.adjustable_repeater.text_3": "...そして同じ時間だけクールダウンします", + "create.ponder.adjustable_repeater.text_4": "マウスホイールで遅延時間を調整できます", + "create.ponder.adjustable_repeater.text_5": "最大30分まで遅延時間を調整できます", + + "create.ponder.analog_lever.header": "アナログレバーによる信号制御", + "create.ponder.analog_lever.text_1": "アナログレバーはコンパクトに正確なレッドストーン動力を出力できます。", + "create.ponder.analog_lever.text_2": "右クリックでレッドストーン強度を上げられます。", + "create.ponder.analog_lever.text_3": "スニークしながら右クリックでレッドストーン強度を下げられます。", + + "create.ponder.andesite_tunnel.header": "安山岩トンネルの使い方", + "create.ponder.andesite_tunnel.text_1": "安山岩のトンネルは、ベルトを隠せます", + "create.ponder.andesite_tunnel.text_2": "安山岩のトンネルが横につながっていると...", + "create.ponder.andesite_tunnel.text_3": "...通過するアイテムスタックから正確に1つのアイテムを分割します", + "create.ponder.andesite_tunnel.text_4": "残ったものは、そのルートを進み続けます", + + "create.ponder.basin.header": "鉢によるアイテム加工", + "create.ponder.basin.text_1": "鉢には材料となるアイテムや液体を入れられます", + "create.ponder.basin.text_2": "鉢は完成品アイテムを斜め下へ搬出しようとします", + "create.ponder.basin.text_3": "搬出できる機械が存在する場合、鉢には搬出用の蛇口が表示されます", + "create.ponder.basin.text_4": "ここではいくつかの選択肢があります", + "create.ponder.basin.text_5": "搬出したアイテムは下の収納ブロックに入ります", + "create.ponder.basin.text_6": "搬出先がない場合、鉢は完成品アイテムを保持します", + "create.ponder.basin.text_7": "これは、完成品アイテムを材料として再利用する必要がある場合に役立ちます", + "create.ponder.basin.text_8": "完成品アイテムは、鉢から搬出する必要があります", + "create.ponder.basin.text_9": "未処理のアイテムが搬出されないように、フィルターが必要になる場合があります", + + "create.ponder.bearing_modes.header": ":メカニカルベアリングの動作モード", + "create.ponder.bearing_modes.text_1": "止まったとき、ベアリングは格子に沿った近い角度に構造物を配置します", + "create.ponder.bearing_modes.text_2": "通常のブロックに戻らないように設定したり、開始時の角度のみブロックに戻るように設定することもできます", + + "create.ponder.belt_casing.header": "ケース入りベルト", + "create.ponder.belt_casing.text_1": "真鍮か安山岩のケーシングを使ってメカニカルベルトを飾れます", + "create.ponder.belt_casing.text_2": "ケーシングはレンチを使って外せます", + + "create.ponder.belt_connector.header": "メカニカルベルトの使い方", + "create.ponder.belt_connector.text_1": "メカニカルベルトを持って2つのシャフトを右クリックすると、シャフトにベルトコンベアを繋げて設置されます", + "create.ponder.belt_connector.text_2": "誤ったシャフトをクリックしてしまった場合、スニークしながら右クリックでキャンセルできます", + "create.ponder.belt_connector.text_3": "ベルトの何処にでもシャフトを追加できます", + "create.ponder.belt_connector.text_4": "ベルトを介して接続されたシャフトは、同じ速度・方向で回転します", + "create.ponder.belt_connector.text_5": "追加したシャフトは、レンチで取り除けま", + "create.ponder.belt_connector.text_6": "メカニカルベルトは見栄えのために染色できます", + + "create.ponder.belt_directions.header": "メカニカルベルトの有効な向きについて", + "create.ponder.belt_directions.text_1": "ベルトは自由な方向に接続できるわけではありません", + "create.ponder.belt_directions.text_2": "1.水平方向", + "create.ponder.belt_directions.text_3": "2.斜め", + "create.ponder.belt_directions.text_4": "3.垂直方向", + "create.ponder.belt_directions.text_5": "4.垂直方向のシャフトを水平に", + "create.ponder.belt_directions.text_6": "これらはすべて接続可能な方向です。ベルトの長さは2~20ブロックの間で自由に接続できます", + + "create.ponder.belt_transport.header": "メカニカルベルトによる運搬", + "create.ponder.belt_transport.text_1": "ベルトを動かすと、アイテムやエンティティを運べます", + "create.ponder.belt_transport.text_2": "素手で右クリックすると、ベルトからアイテムを取り出せます", + + "create.ponder.blaze_burner.header": "ブレイズバーナーへの餌やり", + "create.ponder.blaze_burner.text_1": "ブレイズバーナーは、鉢で加工するアイテムを加熱できます", + "create.ponder.blaze_burner.text_2": "その為には、ブレイズに燃料を与える必要があります", + "create.ponder.blaze_burner.text_3": "ブレイズケーキを与えると、バーナーはさらに強力な火力を出せます", + "create.ponder.blaze_burner.text_4": "供給作業は、デプロイヤーやメカニカルアームで自動化できます", + + "create.ponder.brass_funnel.header": "真鍮ファンネル", + "create.ponder.brass_funnel.text_1": "安山岩ファンネルでは、1回につき1つのアイテムしか搬出できません", + "create.ponder.brass_funnel.text_2": "真鍮ファンネルは、最大で1スタックのアイテムを搬出できます", + "create.ponder.brass_funnel.text_3": "フィルタースロットを見ながらスクロールすると、取り出すアイテム数を正確に調整できます", + "create.ponder.brass_funnel.text_4": "フィルタースロットにアイテムを設定すると、ファンネルは一致するアイテムのみを運搬できます", + + "create.ponder.brass_tunnel.header": "真鍮トンネルの使い方", + "create.ponder.brass_tunnel.text_1": "真鍮トンネルは、ベルトを隠せます", + "create.ponder.brass_tunnel.text_2": "真鍮トンネルには、搬出入面それぞれにフィルタースロットがあります", + "create.ponder.brass_tunnel.text_3": "搬入側のフィルターは、単純に一致しないアイテムを搬入しないようにします", + "create.ponder.brass_tunnel.text_4": "搬出側のフィルターは、搬出するアイテムを種類別に分類できます", + "create.ponder.brass_tunnel.text_5": "通過するアイテムが複数の口から搬出できる場合は、モードによってどのように搬出されるかが決まります", + "create.ponder.brass_tunnel.text_6": "並べられた複数のベルト上の真鍮製トンネルは接続されます", + "create.ponder.brass_tunnel.text_7": "搬入したアイテムは、接続されているすべての搬出口に分配されます", + "create.ponder.brass_tunnel.text_8": "アイテムをトンネルへ直接搬入することもできます", + + "create.ponder.brass_tunnel_modes.header": "真鍮トンネルのモード", + "create.ponder.brass_tunnel_modes.text_1": "真鍮トンネルはレンチを使って分配モードを変更できます", + "create.ponder.brass_tunnel_modes.text_10": "「同期」は、真鍮製トンネルのデフォルト設定です", + "create.ponder.brass_tunnel_modes.text_11": "アイテムはグループ内の全てのトンネルがアイテムを搬入できる場合のみ通過を許可します", + "create.ponder.brass_tunnel_modes.text_12": "これにより、影響を受ける全てのベルトに同じ割合でアイテムを供給できます", + "create.ponder.brass_tunnel_modes.text_2": "「スタック分割」は、アイテムを通せる搬出口の間でアイテムスタックを均等に分配しようとします", + "create.ponder.brass_tunnel_modes.text_3": "搬出口がアイテムを通せない場合はスキップされます ", + "create.ponder.brass_tunnel_modes.text_4": "「強制スタック分割」は搬出をスキップせず、それができるようになるまで待機します", + "create.ponder.brass_tunnel_modes.text_5": "「順繰り分配」 はスタックを分割せず、それぞれの搬出口から順番に搬出します ", + "create.ponder.brass_tunnel_modes.text_6": "繰り返しになりますが、搬出口がアイテムを通せない場合はスキップされます", + "create.ponder.brass_tunnel_modes.text_7": "「強制順繰り分配」は、搬出をスキップしません", + "create.ponder.brass_tunnel_modes.text_8": "「近い所を優先」アイテムの搬入口に最も近い搬出口から優先して分配します ", + "create.ponder.brass_tunnel_modes.text_9": "「ランダム」は、スタック全体をランダムに選択された搬出口に分配します ", + + "create.ponder.cart_assembler.header": "トロッコアセンブラによる構造物の移動", + "create.ponder.cart_assembler.text_1": "レッドストーン信号を受けたアセンブラは、通過するトロッコに接続された構造物を取り付けます", + "create.ponder.cart_assembler.text_2": "レッドストーン信号を受けていない場合、通過するトロッコの構造物を取り外し、ブロックへ戻します", + "create.ponder.cart_assembler.text_3": "トロッコにレンチを使うと、構造物を付けたまま別の場所へ運べます", + + "create.ponder.cart_assembler_dual.header": "列車を組み立てる", + "create.ponder.cart_assembler_dual.text_1": "2つのトロッコアセンブラが構造物を共有している場合...", + "create.ponder.cart_assembler_dual.text_2": "...どちらかにレッドストーン信号を受けると、列車が組み立てられます", + "create.ponder.cart_assembler_dual.text_3": "トロッコ連結器で接続されたトロッコと同様の動作をします", + + "create.ponder.cart_assembler_modes.header": "からくり付きトロッコの方向設定", + "create.ponder.cart_assembler_modes.text_1": "トロッコの構造物は、トロッコの動きに合わせて回転します", + "create.ponder.cart_assembler_modes.text_2": "アセンブラーが「常に向きを固定する」に設定されている場合、構造物の向きは変わりません", + + "create.ponder.cart_assembler_rails.header": "その他のトロッコとレールの種類", + "create.ponder.cart_assembler_rails.text_1": "通常のレールに設置されたトロッコアセンブラは、通過するカートの動きに影響を与えません", + "create.ponder.cart_assembler_rails.text_2": "パワードレールやコントローラーレールでは、レッドストーン信号を受けるまでトロッコは固定されます", + "create.ponder.cart_assembler_rails.text_3": "他のトロッコをアンカーとして使えます", + "create.ponder.cart_assembler_rails.text_4": "かまど付きトロッコは、構造物の収納ブロックから燃料を確保します", + + "create.ponder.chain_drive.header": "ケース入りチェーンドライブによる回転力の伝達", + "create.ponder.chain_drive.text_1": "チェーンドライブは、一列に並べると回転を伝達します", + "create.ponder.chain_drive.text_2": "この様に接続された全てのシャフトは、回転方向が同じです", + "create.ponder.chain_drive.text_3": "列のどの部分でも90度回転させて設置できます", + + "create.ponder.chain_gearshift.header": "チェーンギアシフトによる回転速度の制御", + "create.ponder.chain_gearshift.text_1": "信号を受けていないチェーンギアシフトは、チェーンドライブと同じように動作します", + "create.ponder.chain_gearshift.text_2": "信号を受けている時は、列内の他のチェーンドライブに伝達される速度が2倍になります", + "create.ponder.chain_gearshift.text_3": "信号を受けているチェーンギアシフトが動力源に無い場合、速度が半分になります", + "create.ponder.chain_gearshift.text_4": "いずれの場合も、列内のチェーンドライブは常に「信号入りチェーンギアシフト」の2倍の速度で動作します", + "create.ponder.chain_gearshift.text_5": "レッドストーン信号の強度で、比率を1と2の間でより正確に調整できます", + "create.ponder.chain_gearshift.text_6": "12 RPM", + + "create.ponder.chute.header": "シュートでの下方向へ運搬", + "create.ponder.chute.text_1": "シュートは、収納ブロックから垂直方向にアイテムを運搬できます", + "create.ponder.chute.text_2": "レンチを使って、窓を付けられます", + "create.ponder.chute.text_3": "シュートを側面に配置すると、斜めに接続されます", + + "create.ponder.chute_upward.header": "シュートでの上方向へ運搬", + "create.ponder.chute_upward.text_1": "シュートの上部または下部にファンを配置すると、アイテムを上方向へ運搬できます", + "create.ponder.chute_upward.text_2": "エンジニアのゴーグルを付けてシュートを見ると、移動方向の情報が表示されます", + "create.ponder.chute_upward.text_3": "ブロックで詰まっている端では、アイテムを側面から搬出入する必要があります", + + "create.ponder.clockwork_bearing.header": "時計仕掛けのベアリングを使った構造物のアニメーション", + "create.ponder.clockwork_bearing.text_1": "時計仕掛けのベアリングは、前面にブロックを取り付けられます", + "create.ponder.clockwork_bearing.text_2": "回転力を受けると、現在の時間に合わせて構造物が回転します", + "create.ponder.clockwork_bearing.text_3": "3:00", + "create.ponder.clockwork_bearing.text_4": "4:00", + "create.ponder.clockwork_bearing.text_5": "ベアリングを右クリックして、構造物のアニメーションを開始・停止します", + "create.ponder.clockwork_bearing.text_6": "時針の前に、2つ目の構造物を追加できます", + "create.ponder.clockwork_bearing.text_7": "2つの構造物が超粘着剤などでくっついていないことを確認してください", + "create.ponder.clockwork_bearing.text_8": "2つ目の構造物は分針として回転します", + + "create.ponder.clutch.header": "クラッチによる回転力の制御", + "create.ponder.clutch.text_1": "クラッチは直線に回転を伝達します", + "create.ponder.clutch.text_2": "レッドストーン信号を受けると、回転の伝達を停止します", + + "create.ponder.cog_speedup.header": "歯車による回転速度変化", + "create.ponder.cog_speedup.text_1": "大小の歯車は斜めに接続できます", + "create.ponder.cog_speedup.text_2": "大きな歯車から歯車に接続すると、伝達される回転速度が2倍になります", + "create.ponder.cog_speedup.text_3": "逆に接続すると、伝達される回転速度が半分になります", + + "create.ponder.cogwheel.header": "歯車による回転力の伝達", + "create.ponder.cogwheel.text_1": "歯車は隣接する歯車へ回転力を伝達します", + "create.ponder.cogwheel.text_2": "このように連結された隣のシャフトは、逆方向に回転します", + + "create.ponder.creative_motor.header": "クリエイティブモーターによる回転力の生成", + "create.ponder.creative_motor.text_1": "クリエイティブモーターは、コンパクトで調整できる原動機です", + "create.ponder.creative_motor.text_2": "背面パネルを見てスクロールすると、モーターの回転速度を変更できます", + + "create.ponder.crushing_wheels.header": "破砕ホイールによるアイテム加工", + "create.ponder.crushing_wheels.text_1": "一対の破砕ホイールは、非常に効果的にアイテムを粉砕できます", + "create.ponder.crushing_wheels.text_2": "動作には、互いに逆方向で回転させる必要があります", + "create.ponder.crushing_wheels.text_3": "上からアイテムを投げ入れたりして、搬入すると加工されます", + "create.ponder.crushing_wheels.text_4": "アイテムを搬出入を自動化することもできます", + + "create.ponder.deployer.header": "デプロイヤーの使い方", + "create.ponder.deployer.text_1": "回転力を供給したデプロイヤーは、プレイヤーの動作を模倣できます", + "create.ponder.deployer.text_10": "前面へアイテムを右クリックして、アイテムを搬出入できます", + "create.ponder.deployer.text_11": "自動でアイテムを搬出入することもできます", + "create.ponder.deployer.text_12": "デプロイヤーはフィルタースロットを持っています", + "create.ponder.deployer.text_13": "フィルターを設定すると、一致するアイテムを持っている時だけ稼働します", + "create.ponder.deployer.text_14": "また、フィルターに一致するアイテムのみが搬入されるようになり...", + "create.ponder.deployer.text_15": "...一致しないアイテムのみが搬出されます", + "create.ponder.deployer.text_2": "動作は、常に前方2ブロックの位置へ行われます", + "create.ponder.deployer.text_3": "真正面のブロックが邪魔になることはありません", + "create.ponder.deployer.text_4": "デプロイヤーは以下の動作に使えます", + "create.ponder.deployer.text_5": "ブロックの設置", + "create.ponder.deployer.text_6": "アイテムの使用", + "create.ponder.deployer.text_7": "ブロックの使用", + "create.ponder.deployer.text_8": "ブロックの収穫", + "create.ponder.deployer.text_9": "モブへの攻撃", + + "create.ponder.deployer_contraption.header": "からくりに組み込んでのデプロイヤーの使い方", + "create.ponder.deployer_contraption.text_1": "からくりの一部として、デプロイヤーを稼働させると...", + "create.ponder.deployer_contraption.text_2": "...稼働した場所ごとに稼働し、からくり内の収納ブロックのアイテムを使用します", + "create.ponder.deployer_contraption.text_3": "フィルタースロットを使って、どのアイテムを使用するか指定できます", + + "create.ponder.deployer_modes.header": "デプロイヤーのモード", + "create.ponder.deployer_modes.text_1": "デフォルトでは、デプロイヤーは右クリックの動作を模倣します", + "create.ponder.deployer_modes.text_2": "レンチを使えば、左クリックの動作を模倣するように設定できます", + + "create.ponder.deployer_redstone.header": "レッドストーン信号によるデプロイヤーの制御", + "create.ponder.deployer_redstone.text_1": "レッドストーン信号を受けている間、デプロイヤーは稼働しません", + "create.ponder.deployer_redstone.text_2": "デプロイヤーは停止する前に、開始したサイクルは終了させます", + "create.ponder.deployer_redstone.text_3": "その為、オフのパルス信号を使って丁度1サイクルだけ稼働させられます", + + "create.ponder.depot.header": "デポの使い方", + "create.ponder.depot.text_1": "デポは動かないメカニカルベルトのようなブロックです", + "create.ponder.depot.text_2": "右クリックして、手動でのアイテム搬出入できます", + "create.ponder.depot.text_3": "メカニカルベルトのように、載せたアイテムを加工できます", + "create.ponder.depot.text_4": "また、メカニカルアームにアイテムを供給することもできます", + + "create.ponder.empty_blaze_burner.header": "空のブレイズバーナーの使い方", + "create.ponder.empty_blaze_burner.text_1": "空のバーナーでブレイズを右クリックし捕獲できます", + "create.ponder.empty_blaze_burner.text_2": "また、ブレイズはスポーンブロックから直接捕獲することもできます", + "create.ponder.empty_blaze_burner.text_3": "これで、様々な機械で利用する理想的な熱源が得られます", + "create.ponder.empty_blaze_burner.text_4": "空のブレイズバーナーは火打石と打ち金を使って火を付ければ装飾にも使えます", + "create.ponder.empty_blaze_burner.text_5": "しかし、これは加工用の熱源には適していません", + + "create.ponder.fan_direction.header": "ケース入りファンの気流", + "create.ponder.fan_direction.text_1": "ケース入りファンは、回転力を利用して気流を生み出します", + "create.ponder.fan_direction.text_2": "気流の強さと方向は、供給される回転力に依存します", + + "create.ponder.fan_processing.header": "ケース付きファンによるアイテム加工", + "create.ponder.fan_processing.text_1": "溶岩を通過した気流は、加熱されます", + "create.ponder.fan_processing.text_2": "この気流に当てられたアイテムは精錬されます", + "create.ponder.fan_processing.text_3": "ただし、食品は焼却されてしまいます", + "create.ponder.fan_processing.text_4": "食品加工には、代わりに火を使った燻製気流を利用する必要があります", + "create.ponder.fan_processing.text_5": "水を通過する気流は、洗浄気流になります", + "create.ponder.fan_processing.text_6": "この気流を使って、いくつかの面白い加工ができます", + "create.ponder.fan_processing.text_7": "ファンの速度は処理速度とは関係がなく、範囲のみが変わります", + "create.ponder.fan_processing.text_8": "ファンでの加工は、デポやベルト上のアイテムにも行われます", + + "create.ponder.fan_source.header": "ケース入りファンによる回転力の生成", + "create.ponder.fan_source.text_1": "ファンを熱源に向けて設置すると、回転力を生成できます", + "create.ponder.fan_source.text_2": "レッドストーン信号を受けると、回転力が生成されます", + + "create.ponder.flywheel.header": "勢車による回転力の生成", + "create.ponder.flywheel.text_1": "かまどエンジンで回転力を生成するには、勢車が必要です", + "create.ponder.flywheel.text_2": "これによって生成される回転力は、非常に大きな応力許容量を持っています", + "create.ponder.flywheel.text_3": "溶鉱炉を使うと、エンジンの効率が2倍になります", + + "create.ponder.funnel_compat.header": "ファンネルの互換性", + "create.ponder.funnel_compat.text_1": "ファンネルは、他のいくつかの機械とも相性が良いです", + "create.ponder.funnel_compat.text_2": "上向きのメカニカルソー", + "create.ponder.funnel_compat.text_3": "デポ", + "create.ponder.funnel_compat.text_4": "アイテム排液口など", + + "create.ponder.funnel_direction.header": "運搬の方向", + "create.ponder.funnel_direction.text_1": "通常の配置では、収納ブロックからアイテムを搬出ます", + "create.ponder.funnel_direction.text_2": "スニークしながら設置すると、収納ブロックにアイテムを搬入します", + "create.ponder.funnel_direction.text_3": "レンチを使って、設置後にファンネルのモードを変えられます", + "create.ponder.funnel_direction.text_4": "ほとんどの方向で同じことができます", + "create.ponder.funnel_direction.text_5": "ベルト上のファンネルは、ベルトの移動方向に応じて搬入/搬出が決まります", + + "create.ponder.funnel_intro.header": "ファンネルの使い方", + "create.ponder.funnel_intro.text_1": "ファンネルは、収納ブロックのアイテムを運搬するのに使います", + + "create.ponder.funnel_redstone.header": "レッドストーンコントロール", + "create.ponder.funnel_redstone.text_1": "レッドストーン信号によって、ファンネルが動作を防げます", + + "create.ponder.funnel_transfer.header": "直接運搬", + "create.ponder.funnel_transfer.text_1": "ファンネルでは、閉じた収納ブロック間を直接運搬することはできません", + "create.ponder.funnel_transfer.text_2": "この様な場合は、シュートやスマートシュートの方が適しています", + "create.ponder.funnel_transfer.text_3": "また水平方向の運搬も同様で、この場合メカニカルベルトの方が適しています", + + "create.ponder.furnace_engine.header": "かまどエンジンによる回転力の生成", + "create.ponder.furnace_engine.text_1": "かまどエンジンは、取り付けたかまどの稼働中に回転力を生成します", + "create.ponder.furnace_engine.text_2": "この回転力は、非常に大きな応力許容量を持っています", + "create.ponder.furnace_engine.text_3": "溶鉱炉を使うと、エンジンの効率が2倍になります", + + "create.ponder.gantry_carriage.header": "ガントリーキャリッジの使い方", + "create.ponder.gantry_carriage.text_1": "ガントリーキャリッジは、ガントリーシャフトに取り付けてスライドさせられます", + "create.ponder.gantry_carriage.text_2": "ガントリーの仕掛けは、取り付けたブロックを動かせます", + + "create.ponder.gantry_cascaded.header": "立体ガンドリー", + "create.ponder.gantry_cascaded.text_1": "ガントリーシャフトは、超粘着剤を使わずにキャリッジに取り付けられます", + "create.ponder.gantry_cascaded.text_2": "そのガントリーシャフトに取り付けたキャリッジも同様です", + "create.ponder.gantry_cascaded.text_3": "このように、ガントリー機構を立体的に接続すると、複数の移動軸をカバーできます", + + "create.ponder.gantry_direction.header": "ガントリーの移動方向", + "create.ponder.gantry_direction.text_1": "ガントリーシャフトは、向きを反対に設置できます", + "create.ponder.gantry_direction.text_2": "キャリッジの移動方向は、シャフトの向きによって決まります", + "create.ponder.gantry_direction.text_3": "また、シャフトの回転方向にも依存します", + "create.ponder.gantry_direction.text_4": "キャリッジへ伝達する回転力も同じルールが適用されます", + + "create.ponder.gantry_redstone.header": "ガントリーでの回転力の伝播", + "create.ponder.gantry_redstone.text_1": "レッドストーン信号を受けたガントリーシャフトは、キャリッジの移動を停止します", + "create.ponder.gantry_redstone.text_2": "代わりに、その回転力がキャリッジの出力軸から伝達されます", + + "create.ponder.gantry_shaft.header": "ガントリーシャフトの使い方", + "create.ponder.gantry_shaft.text_1": "ガントリーシャフトは、ガントリー機構の基本となるものです。取り付けられたキャリッジはこのシャフトに沿って移動します", + "create.ponder.gantry_shaft.text_2": "ガントリーによるからくりは、取り付けたブロックを動かせます", + + "create.ponder.gearbox.header": "ギアボックスによる回転力の伝達", + "create.ponder.gearbox.text_1": "回転軸の向きを変えようとすると、すぐに機構がかさばってしまいます", + "create.ponder.gearbox.text_2": "これをコンパクトにしたものがギアボックスです", + "create.ponder.gearbox.text_3": "角を曲がったシャフトは鏡映しの方向に回転します", + "create.ponder.gearbox.text_4": "直線方向への接続は、回転方向が逆になります", + + "create.ponder.gearshift.header": "ギアシフトによる回転力の制御", + "create.ponder.gearshift.text_1": "ギアシフトは、直線に回転を伝達します", + "create.ponder.gearshift.text_2": "レッドストーン信号を受けると、回転方向を逆に伝達します", + + "create.ponder.hand_crank.header": "ハンドクランクによる回転力の生成", + "create.ponder.hand_crank.text_1": "ハンドクランクは手動で回転力を生み出す機械です", + "create.ponder.hand_crank.text_2": "右クリックし続けると、反時計回りに回転します", + "create.ponder.hand_crank.text_3": "回転速度は比較的速めです", + "create.ponder.hand_crank.text_4": "スニークしながら右クリックし続けると、時計回りに回転します", + + "create.ponder.large_cogwheel.header": "大きな歯車による回転力の伝達", + "create.ponder.large_cogwheel.text_1": "大きな歯車は、直角に接続できます", + "create.ponder.large_cogwheel.text_2": "回転力の回転軸を変えてに伝達するのに役立ちます", + + "create.ponder.linear_chassis_attachment.header": "リニアシャーシによるブロックの取り付け", + "create.ponder.linear_chassis_attachment.text_1": "リニアシャーシの特定の面は特殊な粘着面にできます", + "create.ponder.linear_chassis_attachment.text_2": "もう一度クリックすると、反対側の面も粘着面になります", + "create.ponder.linear_chassis_attachment.text_3": "素手でスニークしながら右クリックすると粘着剤を剥がせます", + "create.ponder.linear_chassis_attachment.text_4": "リニアシャーシの特殊な粘着面は、ブロックの列をまとめてくっつけることができます", + "create.ponder.linear_chassis_attachment.text_5": "レンチを使って、このシャーシの粘着範囲を正確に調整できます", + "create.ponder.linear_chassis_attachment.text_6": "CTRLを押しながらスクロールすると、接続している全てのシャーシブロックの範囲を調整できます", + "create.ponder.linear_chassis_attachment.text_7": "他の面にブロックを接着するには、超粘着剤を使う必要があります", + "create.ponder.linear_chassis_attachment.text_8": "この仕組みを使えば、どんな形の構造物もからくりとして動かせます", + + "create.ponder.linear_chassis_group.header": "リニアシャーシをグループで動かす", + "create.ponder.linear_chassis_group.text_1": "リニアシャーシは、隣の同じシャーシブロックと接続します", + "create.ponder.linear_chassis_group.text_2": "からくり機械で1つを動かすと、他のリニアシャーシも一緒に動きます", + "create.ponder.linear_chassis_group.text_3": "異なる種類のシャーシや、別の方向を向いているシャーシは接続されません", + + "create.ponder.mechanical_arm.header": "メカニカルアームの設定", + "create.ponder.mechanical_arm.text_1": "メカニカルアームを設置する前に、搬入元と搬出先を設定しなければなりません", + "create.ponder.mechanical_arm.text_2": "特定のブロックをターゲットと設定するには、アームを持ったまま右クリックしましょう", + "create.ponder.mechanical_arm.text_3": "搬入元(青)と搬出先(オレンジ)を切り替えるには、もう1度右クリックします", + "create.ponder.mechanical_arm.text_4": "アームを持ったまま左クリックすると選択が解除されます", + "create.ponder.mechanical_arm.text_5": "設置したメカニカルアームは、設定されたブロックをターゲットにします", + "create.ponder.mechanical_arm.text_6": "範囲内であれば、複数の搬入元と搬出先を設定できます", + "create.ponder.mechanical_arm.text_7": "しかし、あらゆる機械やブロックをターゲットにできるわけではありません", + "create.ponder.mechanical_arm.text_8": "そんな時はファンネルやデポを経由させましょう", + + "create.ponder.mechanical_arm_filtering.header": "メカニカルアームの搬出フィルタリング", + "create.ponder.mechanical_arm_filtering.text_1": "搬入元", + "create.ponder.mechanical_arm_filtering.text_2": "搬出先", + "create.ponder.mechanical_arm_filtering.text_3": "フィルターを使ってアームが搬出入するアイテムを制限したいと思っても", + "create.ponder.mechanical_arm_filtering.text_4": "メカニカルアーム自体には、フィルタリングオプションがありません", + "create.ponder.mechanical_arm_filtering.text_5": "そこで真鍮製ファンネル等をターゲットにした場合、アームにそのフィルターが反映されます", + "create.ponder.mechanical_arm_filtering.text_6": "アームは賢いので、搬出できないアイテムを拾うことはありません", + + "create.ponder.mechanical_arm_modes.header": "メカニカルアームの分配モード", + "create.ponder.mechanical_arm_modes.text_1": "搬入元", + "create.ponder.mechanical_arm_modes.text_2": "搬出先", + "create.ponder.mechanical_arm_modes.text_3": "アームに複数の有効な搬出先が設定されている場合...", + "create.ponder.mechanical_arm_modes.text_4": "...設定に従ってアイテムを分配します", + "create.ponder.mechanical_arm_modes.text_5": "レンチを持ってスクロールすると設定を変えられます", + "create.ponder.mechanical_arm_modes.text_6": "「順繰り分配」は、有効な全ての搬出先へ順番に搬出します", + "create.ponder.mechanical_arm_modes.text_7": "搬出先がそれ以上のアイテムを受け取れない場合、そこへの搬出はスキップされます", + "create.ponder.mechanical_arm_modes.text_8": "「強制順繰り分配」は、搬出をスキップせず、空きがでるまで待機します", + "create.ponder.mechanical_arm_modes.text_9": "「最初のターゲットを優先」は、設定した順番が先の方のターゲットに優先して搬出します", + + "create.ponder.mechanical_arm_redstone.header": "メカニカルアームのレッドストーン制御", + "create.ponder.mechanical_arm_redstone.text_1": "レッドストーン信号を受けると、メカニカルアームは稼働しません", + "create.ponder.mechanical_arm_redstone.text_2": "ただし、停止する前に開始した搬出入が終わるまで稼働し続けます", + "create.ponder.mechanical_arm_redstone.text_3": "それを利用し、反転したパルス信号を使って1回だけ稼働させられます", + + "create.ponder.mechanical_bearing.header": "メカニカルベアリングによる構造物の移動", + "create.ponder.mechanical_bearing.text_1": "メカニカルベアリングは、前方にブロックを取り付けられます", + "create.ponder.mechanical_bearing.text_2": "回転力を供給すると、組み立てた構造物を回転できます", + + "create.ponder.mechanical_crafter.header": "メカニカルクラフターの配置", + "create.ponder.mechanical_crafter.text_1": "メカニカルクラフターは、あらゆるクラフトレシピを自動化できます", + "create.ponder.mechanical_crafter.text_2": "レンチを使えばクラフターがアイテムを移動させるベルトの向きを変えられます", + "create.ponder.mechanical_crafter.text_3": "動かすためにはすべてのベルトが、外にベルトが向いている1つのクラフターへ続いていなければなりません", + "create.ponder.mechanical_crafter.text_4": "完成品は外に向かうベルトが指す方向にある収納ブロックに搬出されます", + "create.ponder.mechanical_crafter.text_5": "メカニカルクラフターを動かすには回転力が必要です", + "create.ponder.mechanical_crafter.text_6": "前面を右クリックすると手動でアイテムを搬入できます", + "create.ponder.mechanical_crafter.text_7": "1つのクラフターに続くベルトの全スロットにアイテムが入ると、クラフトが開始されます", + "create.ponder.mechanical_crafter.text_8": "スロットが埋まっていなくても、レッドストーンパルスを使って強制的にクラフトを開始できます", + + "create.ponder.mechanical_crafter_connect.header": "メカニカルクラフターの搬入口の共有", + "create.ponder.mechanical_crafter_connect.text_1": "アイテムは自動でクラフターに搬入することもできます", + "create.ponder.mechanical_crafter_connect.text_2": "背面でレンチを使うと、メカニカルクラフターが接続されます", + "create.ponder.mechanical_crafter_connect.text_3": "接続された全てのクラフターは、同じ搬入口からアイテムを搬入できるようになります", + + "create.ponder.mechanical_crafter_covers.header": "メカニカルクラフターとスロットカバー", + "create.ponder.mechanical_crafter_covers.text_1": "一部のレシピでは、ベルトの流れの隙間を埋める為に追加のクラフターが必要になります", + "create.ponder.mechanical_crafter_covers.text_2": "スロットカバーを使って、クラフターを空のスロットとして動作するように設定できます", + "create.ponder.mechanical_crafter_covers.text_3": "背面にレンチを使って接続したクラフターは、カバーしたクラフターを無視して同じアイテムを搬入できます", + + "create.ponder.mechanical_drill.header": "メカニカルドリルでブロックを破壊する", + "create.ponder.mechanical_drill.text_1": "メカニカルドリルは回転力を供給すると、目の前のブロックを破壊します", + "create.ponder.mechanical_drill.text_2": "採掘速度は回転速度に依存します", + + "create.ponder.mechanical_drill_contraption.header": "からくりに組み込んでのメカニカルドリルの使い方", + "create.ponder.mechanical_drill_contraption.text_1": "からくりの一部として、メカニカルドリルを動かすと...", + "create.ponder.mechanical_drill_contraption.text_2": "...ドリルは、移動先のブロックを破壊します", + + "create.ponder.mechanical_harvester.header": "からくりに組み込んでのメカニカルハーベスターの使い方", + "create.ponder.mechanical_harvester.text_1": "からくりの一部として、ハーベスターを動かすと...", + "create.ponder.mechanical_harvester.text_2": "...成熟した作物を収穫し、成長をリセットします", + + "create.ponder.mechanical_mixer.header": "メカニカルミキサーによるアイテム加工", + "create.ponder.mechanical_mixer.text_1": "ミキサーと鉢があれば、いくつかのクラフトレシピを自動化できます", + "create.ponder.mechanical_mixer.text_2": "自動化できるのは不定形レシピといくつかの追加レシピです", + "create.ponder.mechanical_mixer.text_3": "レシピの中には、ブレイズバーナーの熱を必要とするものもあります", + "create.ponder.mechanical_mixer.text_4": "フィルタースロットは、2つのレシピが競合する場合に使えます", + + "create.ponder.mechanical_piston.header": "メカニカルピストンによる構造物の移動", + "create.ponder.mechanical_piston.text_1": "メカニカルピストンは、前方にあるブロックを動かせます", + "create.ponder.mechanical_piston.text_2": "移動の速度と方向は、供給する回転力に依存します", + "create.ponder.mechanical_piston.text_3": "粘着性メカニカルピストンは、取り付けられたブロックを引き戻せます", + + "create.ponder.mechanical_piston_modes.header": "メカニカルピストンの動作モード", + "create.ponder.mechanical_piston_modes.text_1": "ピストンの動作が止まると、移動した構造物はブロックへ戻ります", + "create.ponder.mechanical_piston_modes.text_2": "ブロックに戻らないように設定したり、動かし始めた場所でのみブロックに戻るように設定できます", + + "create.ponder.mechanical_plough.header": "からくりに組み込んでのメカニカルプラウの使い方", + "create.ponder.mechanical_plough.text_1": "プラウを組み込んだからくりを動かすと...", + "create.ponder.mechanical_plough.text_2": "...当たり判定のないブロックが破壊されます", + "create.ponder.mechanical_plough.text_3": "さらに、プラウは土を耕やします", + "create.ponder.mechanical_plough.text_4": "また、エンティティを傷つけずに飛ばすこともできます", + + "create.ponder.mechanical_press.header": "メカニカルプレスによるアイテム加工", + "create.ponder.mechanical_press.text_1": "メカニカルプレスは、その下に配置されたアイテムを加工できます", + "create.ponder.mechanical_press.text_2": "加工するアイテムは下に落としたり、プレス機の下にあるデポに置いたり", + "create.ponder.mechanical_press.text_3": "アイテムがベルトへ供給されると...", + "create.ponder.mechanical_press.text_4": "...プレス機が自動的にアイテムを保持し、加工します", + + "create.ponder.mechanical_press_compacting.header": "メカニカルプレスでの圧縮加工", + "create.ponder.mechanical_press_compacting.text_1": "鉢に入れられたアイテムをプレスし、圧縮加工できます", + "create.ponder.mechanical_press_compacting.text_2": "圧縮加工には、2x2、3x3のクラフトレシピに加え、いくつかの追加レシピがあります", + "create.ponder.mechanical_press_compacting.text_3": "これらのレシピの中には、ブレイズバーナーの熱を必要とするものがあります", + "create.ponder.mechanical_press_compacting.text_4": "フィルタースロットは、2つのレシピが競合する場合に使えます", + + "create.ponder.mechanical_saw_breaker.header": "メカニカルソーによる伐採", + "create.ponder.mechanical_saw_breaker.text_1": "メカニカルソーは回転力を供給すると、目の前の木を伐採できます", + "create.ponder.mechanical_saw_breaker.text_2": "木を完全に伐採するには、木と地面を繋ぐ最後の根本を伐採しなければなりません", + + "create.ponder.mechanical_saw_contraption.header": "からくりに組み込んでのメカニカルソーの使い方", + "create.ponder.mechanical_saw_contraption.text_1": "ソーを組み込んだからくりを動かすと...", + "create.ponder.mechanical_saw_contraption.text_2": "...ソーは木を伐採します", + + "create.ponder.mechanical_saw_processing.header": "メカニカルソーでのアイテム加工", + "create.ponder.mechanical_saw_processing.text_1": "上向きのメカニカルソーは、様々なアイテムを加工できます", + "create.ponder.mechanical_saw_processing.text_2": "加工されたアイテムは、常にソーの回転方向とは逆に移動します", + "create.ponder.mechanical_saw_processing.text_3": "ソーはメカニカルベルトと繋げて加工できます", + "create.ponder.mechanical_saw_processing.text_4": "複数の完成品がある場合、フィルタースロットでどの完成品を作るかを指定できます", + "create.ponder.mechanical_saw_processing.text_5": "フィルターがない場合、ソーは全ての加工結果を順番に繰り返します", + + "create.ponder.millstone.header": "石臼でのアイテム加工", + "create.ponder.millstone.text_1": "石臼はアイテムを粉砕加工する機械です", + "create.ponder.millstone.text_2": "歯車を使って、側面から回転力を供給できます", + "create.ponder.millstone.text_3": "上からアイテムを投げ入れてアイテムを搬入できます", + "create.ponder.millstone.text_4": "しばらく待った後、右クリックで完成品を取り出せます", + "create.ponder.millstone.text_5": "加工品を搬出して自動化することもできます", + + "create.ponder.nixie_tube.header": "ニキシー管の使い方", + "create.ponder.nixie_tube.text_1": "ニキシー管は受けたレッドストーン信号の強度を表示します", + "create.ponder.nixie_tube.text_2": "金床で名付けた名札を使って、好きな文字を表示することもできます", + + "create.ponder.piston_pole.header": "ピストン延長ポール", + "create.ponder.piston_pole.text_1": "ポールが無いとメカニカルピストンは動きません", + "create.ponder.piston_pole.text_2": "後ろに付けたポールの長さによって、伸び縮みする長さが決まります", + + "create.ponder.portable_storage_interface.header": "稼働中のからくりとの搬出入", + "create.ponder.portable_storage_interface.text_1": "稼働中のからくりに組み込まれた収納ブロックは、プレイヤーが開くことはできません", + "create.ponder.portable_storage_interface.text_2": "この装置は、からくりを停止することなく、収納ブロックと搬出入できます", + "create.ponder.portable_storage_interface.text_3": "1~2ブロックの間隔をあけて、二つ目のインターフェースを設置しましょう", + "create.ponder.portable_storage_interface.text_4": "両者がすれ違うたびに接続されます", + "create.ponder.portable_storage_interface.text_5": "接続されている間、設置されている方のインターフェースはからくり内全ての収納ブロックのように振る舞います", + "create.ponder.portable_storage_interface.text_6": "アイテムを搬入したり...", + "create.ponder.portable_storage_interface.text_7": "...アイテムを搬出したりできます", + "create.ponder.portable_storage_interface.text_8": "しばらくの間アイテムのやり取りがないと、からくりは稼働を再開します", + + "create.ponder.portable_storage_interface_redstone.header": "レッドストーンによる制御", + "create.ponder.portable_storage_interface_redstone.text_1": "レッドストーン信号を受けている間、設置されたインターフェースは接続を行いません", + + "create.ponder.powered_latch.header": "パワードラッチによる信号制御", + "create.ponder.powered_latch.text_1": "パワードラッチはレッドストーン信号で制御できるレバーです", + "create.ponder.powered_latch.text_2": "後ろからの信号でオンに", + "create.ponder.powered_latch.text_3": "側面からの信号でオフに戻ります", + "create.ponder.powered_latch.text_4": "パワードラッチは、手動でも切り替えられます", + + "create.ponder.powered_toggle_latch.header": "パワードトグルラッチによる信号制御", + "create.ponder.powered_toggle_latch.text_1": "パワードトグルラッチはレッドストーン信号で切り替えできるレバーです", + "create.ponder.powered_toggle_latch.text_2": "後ろからの信号で切り替えできます", + "create.ponder.powered_toggle_latch.text_3": "何度も信号を送るとオンとオフと繰り返します", + "create.ponder.powered_toggle_latch.text_4": "パワードトグルラッチは、手動で切り替えることもできます", + + "create.ponder.pulse_repeater.header": "パルスリピーターによる信号制御", + "create.ponder.pulse_repeater.text_1": "パルスリピーターは、レッドストーン信号を短縮して1tickのパルス信号にします", + + "create.ponder.radial_chassis.header": "ラジアルシャーシによるブロックの取り付け", + "create.ponder.radial_chassis.text_1": "ラジアルシャーシは、同種のシャーシブロックと繋がります", + "create.ponder.radial_chassis.text_2": "からくり機械によって1つが動かされると、他も一緒に動きます", + "create.ponder.radial_chassis.text_3": "ラジアルシャーシの側面を粘着面にできます", + "create.ponder.radial_chassis.text_4": "もう一度クリックすると、他の全ての面も粘着面になります", + "create.ponder.radial_chassis.text_5": "素手でスニークしながら右クリックすると、粘着剤を剥がせます", + "create.ponder.radial_chassis.text_6": "ブロックが粘着面に設置されていると...", + "create.ponder.radial_chassis.text_7": "...その範囲内の繋がっている全てのブロックが取り付けられます", + "create.ponder.radial_chassis.text_8": "レンチを使って、シャーシの範囲の半径を正確に指定できます", + "create.ponder.radial_chassis.text_9": "どの粘着面とも繋がっていないブロックはくっつきません", + + "create.ponder.redstone_contact.header": "レッドストーンコンタクト", + "create.ponder.redstone_contact.text_1": "向かい合ったレッドストーンコンタクトは、レッドストーン信号を出力します", + "create.ponder.redstone_contact.text_2": "これは、片方のコンタクトがからくりの一部である場合でも同様です", + + "create.ponder.redstone_link.header": "レッドストーンリンクの使い方", + "create.ponder.redstone_link.text_1": "レッドストーンリンクは、レッドストーン信号を無線で送受信できます", + "create.ponder.redstone_link.text_2": "モードを切り替えるには、スニークしながら右クリックします", + "create.ponder.redstone_link.text_3": "レンチをもって右クリックでも、モードを切り替えられます", + "create.ponder.redstone_link.text_4": "受信機は、128ブロック以内の送信機のレッドストーン信号を受信します", + "create.ponder.redstone_link.text_5": "2つのスロットにアイテムを設定すると、周波数を設定できます", + "create.ponder.redstone_link.text_6": "周波数が一致するリンク同士のみが送受信を行います", + + "create.ponder.rope_pulley.header": "ローププーリーによる構造物の移動", + "create.ponder.rope_pulley.text_1": "ローププーリーは、回転力を供給するとブロックを垂直に動かせます", + "create.ponder.rope_pulley.text_2": "移動の方向と速度は、供給される回転力に依存します", + + "create.ponder.rope_pulley_attachment.header": "プーリーをからくりの一部として動かす", + "create.ponder.rope_pulley_attachment.text_1": "プーリーがからくりによって動かされると...", + "create.ponder.rope_pulley_attachment.text_2": "...プーリーと接続している構造物も一緒に動かされます", + "create.ponder.rope_pulley_attachment.text_3": "プーリーが稼働している間は動かせないことに注意してください", + + "create.ponder.rope_pulley_modes.header": "ローププーリーの動作モード", + "create.ponder.rope_pulley_modes.text_1": "プーリーの動きが止まると、移動した構造物はブロックに戻ります", + "create.ponder.rope_pulley_modes.text_2": "ブロックに戻らないように設定することも、動かし始めた場所でのみブロックに戻るように設定することもできます", + + "create.ponder.rotation_speed_controller.header": "回転速度コントローラーの使い方", + "create.ponder.rotation_speed_controller.text_1": "コントローラーは、側面の軸から上の大きな歯車に回転を伝達します", + "create.ponder.rotation_speed_controller.text_2": "側面のパネルを見てスクロールすると、伝達する回転速度を調整できます", + + "create.ponder.sail.header": "帆による風車の組み立て", + "create.ponder.sail.text_1": "帆は、風車を作るのに便利なブロックです", + "create.ponder.sail.text_2": "超粘着剤やシャーシなしに、ブロックや帆フレームに取り付けられます", + "create.ponder.sail.text_3": "染料で右クリックして染色できます", + "create.ponder.sail.text_4": "ハサミで右クリックすると、フレームに戻せます", + + "create.ponder.sail_frame.header": "帆フレームによる風車の組み立て", + "create.ponder.sail_frame.text_1": "帆フレームは、風車を作るのに便利なブロックです", + "create.ponder.sail_frame.text_2": "超粘着剤やシャーシなしに、ブロックや帆フレームに取り付けられます", + + "create.ponder.sequenced_gearshift.header": "シーケンスギアシフトによる回転の制御", + "create.ponder.sequenced_gearshift.text_1": "シーケンスギアシフトは、設定されたプログラムに従って回転を伝達します", + "create.ponder.sequenced_gearshift.text_2": "右クリックで設定インターフェースを開けます", + "create.ponder.sequenced_gearshift.text_3": "レッドストーン信号を受けると、設定されたプログラムを実行します", + "create.ponder.sequenced_gearshift.text_4": "終了すると止まり、また次のレッドストーン信号を受けると同じように実行します", + "create.ponder.sequenced_gearshift.text_5": "レッドストーンコンパレータで、現在の進捗を読み取れます", + + "create.ponder.shaft.header": "シャフトによる回転力の伝達", + "create.ponder.shaft.text_1": "シャフトはまっすぐに回転を伝達します", + + "create.ponder.shaft_casing.header": "ケース入りシャフト", + "create.ponder.shaft_casing.text_1": "真鍮製、安山岩製ケーシングを使って、シャフトを装飾できます", + + "create.ponder.smart_chute.header": "スマートシュートによるアイテムのフィルタリング", + "create.ponder.smart_chute.text_1": "スマートシュートは、垂直方向のシュートにフィルター機能を追加したものです", + "create.ponder.smart_chute.text_2": "フィルタースロットを使って、何を搬出入するかを設定できます", + "create.ponder.smart_chute.text_3": "マウスホイールで搬出するスタック量を指定できます", + "create.ponder.smart_chute.text_4": "レッドストーン信号で、スマートシュートを停止させることもできます", + + "create.ponder.speedometer.header": "速度メーターによる動力情報の監視", + "create.ponder.speedometer.text_1": "速度メーターは、接続された機械の現在の回転速度を表示します", + "create.ponder.speedometer.text_2": "エンジニアのゴーグルを装着していると、より詳細な情報を得られます", + "create.ponder.speedometer.text_3": "コンパレータは、速度メーターの測定値に応じたレッドストーン信号を出力します", + + "create.ponder.stabilized_bearings.header": "からくりの角度の固定", + "create.ponder.stabilized_bearings.text_1": "メカニカルベアリングが動いている構造物に組み込まれているとき ...", + "create.ponder.stabilized_bearings.text_2": "...自身の角度を真っ直ぐに保とうとします", + "create.ponder.stabilized_bearings.text_3": "ベアリングにブロックを取り付けると", + "create.ponder.stabilized_bearings.text_4": "ベアリングに取り付けたサブのからくり全体が角度を真っ直ぐに保ったままになります", + + "create.ponder.sticker.header": "スティッカーを使ったブロックの付け外し", + "create.ponder.sticker.text_1": "スティッカーは、ブロックの付け外しをレッドストーン信号で制御できます", + "create.ponder.sticker.text_2": "信号を受けると、状態が切り替わります", + "create.ponder.sticker.text_3": "付けているときは、からくりで動かされるとブロックも一緒に動きます", + "create.ponder.sticker.text_4": "もう一度信号を受けると、ブロックは離れます", + + "create.ponder.stressometer.header": "応力メーターによる動力情報の監視", + "create.ponder.stressometer.text_1": "応力メーターは、接続された動力ネットワークの現在の応力許容量を表示します", + "create.ponder.stressometer.text_2": "エンジニアのゴーグルを装着していると、より詳しい数値を見られます", + "create.ponder.stressometer.text_3": "コンパレータは、応力メーターの測定値に応じたレッドストーン信号を出力します", + + "create.ponder.super_glue.header": "超粘着剤によるブロックの取り付け", + "create.ponder.super_glue.text_1": "超粘着剤は、任意の2つのブロックの間に塗れます", + "create.ponder.super_glue.text_2": "貼り付けたブロックは、からくりに組み込まれると一緒に動きます", + "create.ponder.super_glue.text_3": "超粘着剤をオフハンドで持つと...", + "create.ponder.super_glue.text_4": "...設置したブロックは置いたブロックの面と接着されます", + "create.ponder.super_glue.text_5": "左クリックすれば超粘着剤を剥がせます", + + "create.ponder.valve_handle.header": "バルブハンドルによる回転力の生成", + "create.ponder.valve_handle.text_1": "バルブハンドルは手動で回転力を生み出す原動機です", + "create.ponder.valve_handle.text_2": "右クリックし続けると、反時計回りに回転します", + "create.ponder.valve_handle.text_3": "回転速度はゆっくりですが、正確です", + "create.ponder.valve_handle.text_4": "スニーク状態で右クリックし続けると、時計回りに回転します", + "create.ponder.valve_handle.text_5": "バルブハンドルは、染色できます", + + "create.ponder.water_wheel.header": "水車による回転力の生成", + "create.ponder.water_wheel.text_1": "水車は隣接する水流から回転力を生み出します", + "create.ponder.water_wheel.text_2": "水流を受ける面が多ければ多いほど、水車の回転速度は速くなります", + "create.ponder.water_wheel.text_3": "水車の羽根は水流に逆らわないように設置してください", + "create.ponder.water_wheel.text_4": "逆向きに設置すると、回転速度が落ちてしまいます", + + "create.ponder.weighted_ejector.header": "重量射出機の使い方", + "create.ponder.weighted_ejector.text_1": "射出機を持ちスニークしながら右クリックすると、ターゲットとなる位置を設定できます", + "create.ponder.weighted_ejector.text_10": "スタック数を設定すると、保持しているスタックがその量に達したときのみ射出するようになります", + "create.ponder.weighted_ejector.text_11": "他のエンティティが射出機を踏むと、いつでも射出機が稼働します", + "create.ponder.weighted_ejector.text_2": "設置された射出機は、設定した場所に物体を発射します", + "create.ponder.weighted_ejector.text_3": "ターゲットは、範囲内であれば高さや距離は問いません", + "create.ponder.weighted_ejector.text_4": "ただし、真正面方向以外へは射出できません", + "create.ponder.weighted_ejector.text_5": "有効なターゲットが設定されていない場合、真正面のブロックがターゲットになります", + "create.ponder.weighted_ejector.text_6": "巻き上げるには、回転力を供給する必要があります", + "create.ponder.weighted_ejector.text_7": "上にアイテムを置くと、射出機が稼働します", + "create.ponder.weighted_ejector.text_8": "ターゲットが満杯の収納ブロックの場合、射出機はそのブロックに空きがでるまで待機します", + "create.ponder.weighted_ejector.text_9": "レンチを使って、スタック量を調整できます", + + "create.ponder.weighted_ejector_redstone.header": "レッドストーン信号による重量射出機の制御", + "create.ponder.weighted_ejector_redstone.text_1": "レッドストーン信号を受けている間、射出機は稼働しません", + "create.ponder.weighted_ejector_redstone.text_2": "また、オブザーバーは射出機の稼働を検知できます", + + "create.ponder.weighted_ejector_tunnel.header": "重量射出機によるアイテムスタックの分割", + "create.ponder.weighted_ejector_tunnel.text_1": "真鍮製トンネルと組み合わせて、アイテムスタックを特定の量だけ分割できます", + "create.ponder.weighted_ejector_tunnel.text_2": "まず、側面の搬出口を優先させる為に、真鍮製トンネルを[最寄りを優先] に設定します", + "create.ponder.weighted_ejector_tunnel.text_3": "次に、射出機に分割したいスタック量を設定します", + "create.ponder.weighted_ejector_tunnel.text_4": "設定された量のアイテムスタックは側面の搬出口から搬出され...", + "create.ponder.weighted_ejector_tunnel.text_5": "...残りのアイテムはそのまま搬出されます", + + "create.ponder.windmill_source.header": "風車ベアリングによる回転力の生成", + "create.ponder.windmill_source.text_1": "風車ベアリングは手前にブロックを取り付けられます", + "create.ponder.windmill_source.text_2": "帆とみなされるブロックを十分な数取り付けられていれば、風車として機能します", + "create.ponder.windmill_source.text_3": "右クリックして風車ベアリングを起動すると、回転力を供給し始めます", + "create.ponder.windmill_source.text_4": "回転速度は帆ブロックの数で決まります", + "create.ponder.windmill_source.text_5": "レンチを使って回転方向を変えられます", + "create.ponder.windmill_source.text_6": "いつでもベアリングを右クリックすれば、回転を停止させて構造物を組み立てなおせます", + + "create.ponder.windmill_structure.header": "からくり風車", + "create.ponder.windmill_structure.text_1": "帆とみなされるブロックが8個以上あれば、どのような構造物でも風車として動きます" +} \ No newline at end of file From 446b24f1cffce99ef46606d4797981feaf994337 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Thu, 29 Apr 2021 11:44:45 -0700 Subject: [PATCH 11/18] Random stuff - Multiply by 31 in some hash functions - Remove unused render utility classes --- .../logistics/RedstoneLinkNetworkHandler.java | 2 +- .../create/foundation/OptionalUtil.java | 24 ------------------- .../backend/ShaderLoadingException.java | 23 ------------------ .../create/foundation/utility/Pair.java | 6 ++++- 4 files changed, 6 insertions(+), 49 deletions(-) delete mode 100644 src/main/java/com/simibubi/create/foundation/OptionalUtil.java delete mode 100644 src/main/java/com/simibubi/create/foundation/render/backend/ShaderLoadingException.java diff --git a/src/main/java/com/simibubi/create/content/logistics/RedstoneLinkNetworkHandler.java b/src/main/java/com/simibubi/create/content/logistics/RedstoneLinkNetworkHandler.java index 969ea7984..910ef68d1 100644 --- a/src/main/java/com/simibubi/create/content/logistics/RedstoneLinkNetworkHandler.java +++ b/src/main/java/com/simibubi/create/content/logistics/RedstoneLinkNetworkHandler.java @@ -52,7 +52,7 @@ public class RedstoneLinkNetworkHandler { @Override public int hashCode() { - return item.hashCode() ^ color; + return (item.hashCode() * 31) ^ color; } @Override diff --git a/src/main/java/com/simibubi/create/foundation/OptionalUtil.java b/src/main/java/com/simibubi/create/foundation/OptionalUtil.java deleted file mode 100644 index f15ec5969..000000000 --- a/src/main/java/com/simibubi/create/foundation/OptionalUtil.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.simibubi.create.foundation; - -import java.util.Optional; -import java.util.function.Supplier; - -public class OptionalUtil { - - public static Optional thenTry(Optional first, Optional thenTry) { - if (first.isPresent()) { - return first; - } else { - return thenTry; - } - } - - public static Optional thenTryLazy(Supplier> first, Supplier> thenTry) { - Optional one = first.get(); - if (one.isPresent()) { - return one; - } else { - return thenTry.get(); - } - } -} diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/ShaderLoadingException.java b/src/main/java/com/simibubi/create/foundation/render/backend/ShaderLoadingException.java deleted file mode 100644 index 50b1c916a..000000000 --- a/src/main/java/com/simibubi/create/foundation/render/backend/ShaderLoadingException.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.simibubi.create.foundation.render.backend; - -public class ShaderLoadingException extends RuntimeException { - - public ShaderLoadingException() { - } - - public ShaderLoadingException(String message) { - super(message); - } - - public ShaderLoadingException(String message, Throwable cause) { - super(message, cause); - } - - public ShaderLoadingException(Throwable cause) { - super(cause); - } - - public ShaderLoadingException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { - super(message, cause, enableSuppression, writableStackTrace); - } -} diff --git a/src/main/java/com/simibubi/create/foundation/utility/Pair.java b/src/main/java/com/simibubi/create/foundation/utility/Pair.java index 7941c090d..908e7047c 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/Pair.java +++ b/src/main/java/com/simibubi/create/foundation/utility/Pair.java @@ -49,7 +49,11 @@ public class Pair { @Override public int hashCode() { - return (first == null ? 0 : first.hashCode()) ^ (second == null ? 0 : second.hashCode()); + return (nullHash(first) * 31) ^ nullHash(second); + } + + int nullHash(Object o) { + return o == null ? 0 : o.hashCode(); } @Override From 063e98983f9f5a4a05477b5ccf4ade33c985cbd6 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Thu, 29 Apr 2021 14:03:52 -0700 Subject: [PATCH 12/18] Oh god the line endings - Isolate AllBlockPartials to PartialModel - Further cleanup to PartialBufferer --- .../com/simibubi/create/AllBlockPartials.java | 70 +++++-------------- .../com/simibubi/create/CreateClient.java | 7 +- .../category/ProcessingViaFanCategory.java | 2 +- .../animations/AnimatedBlazeBurner.java | 3 +- .../category/animations/AnimatedKinetics.java | 9 +-- .../animations/AnimatedMillstone.java | 2 +- .../components/actors/DrillRenderer.java | 2 +- .../PortableStorageInterfaceRenderer.java | 5 +- .../components/clock/CuckooClockRenderer.java | 9 +-- .../crafter/MechanicalCrafterRenderer.java | 3 +- .../components/crank/HandCrankBlock.java | 9 +-- .../components/crank/HandCrankInstance.java | 4 +- .../components/crank/HandCrankRenderer.java | 6 +- .../components/crank/ValveHandleBlock.java | 4 +- .../deployer/DeployerActorInstance.java | 3 +- .../components/deployer/DeployerInstance.java | 5 +- .../components/deployer/DeployerRenderer.java | 5 +- .../deployer/DeployerTileEntity.java | 9 +-- .../components/fan/EncasedFanRenderer.java | 4 +- .../components/flywheel/FlywheelRenderer.java | 10 ++- .../flywheel/engine/EngineBlock.java | 10 +-- .../flywheel/engine/EngineInstance.java | 4 +- .../flywheel/engine/EngineRenderer.java | 4 +- .../flywheel/engine/FurnaceEngineBlock.java | 3 +- .../millstone/MillstoneRenderer.java | 2 +- .../motor/CreativeMotorRenderer.java | 2 +- .../press/MechanicalPressRenderer.java | 4 +- .../components/saw/SawRenderer.java | 7 +- .../bearing/BearingInstance.java | 3 +- .../bearing/BearingRenderer.java | 5 +- .../StabilizedBearingMovementBehaviour.java | 3 +- .../pulley/AbstractPulleyRenderer.java | 14 ++-- .../pulley/PulleyRenderer.java | 3 +- .../contraptions/fluids/PumpRenderer.java | 2 +- .../fluids/actors/HosePulleyRenderer.java | 3 +- .../fluids/actors/SpoutRenderer.java | 5 +- .../contraptions/goggles/GogglesModel.java | 2 +- .../burner/BlazeBurnerRenderer.java | 3 +- .../relays/belt/BeltInstance.java | 3 +- .../relays/belt/BeltRenderer.java | 5 +- .../relays/encased/SplitShaftRenderer.java | 2 +- .../relays/gauge/GaugeRenderer.java | 5 +- .../relays/gearbox/GearboxRenderer.java | 2 +- .../symmetry/mirror/CrossPlaneMirror.java | 3 +- .../symmetry/mirror/EmptyMirror.java | 10 +-- .../symmetry/mirror/PlaneMirror.java | 3 +- .../symmetry/mirror/SymmetryMirror.java | 4 +- .../symmetry/mirror/TriplePlaneMirror.java | 7 +- .../tools/ExtendoGripRenderHandler.java | 3 +- .../belts/tunnel/BeltTunnelInstance.java | 2 +- .../block/funnel/FunnelInstance.java | 3 +- .../block/funnel/FunnelRenderer.java | 5 +- .../mechanicalArm/ArmInteractionPoint.java | 3 +- .../create/foundation/gui/GuiGameElement.java | 6 +- .../create/foundation/render/Compartment.java | 6 +- .../foundation/render/PartialBufferer.java | 35 ++-------- .../render/SuperByteBufferCache.java | 12 ++-- .../render/backend/core/PartialModel.java | 56 +++++++++++++++ .../backend/instancing/RenderMaterial.java | 8 +-- 59 files changed, 234 insertions(+), 199 deletions(-) create mode 100644 src/main/java/com/simibubi/create/foundation/render/backend/core/PartialModel.java diff --git a/src/main/java/com/simibubi/create/AllBlockPartials.java b/src/main/java/com/simibubi/create/AllBlockPartials.java index d32c28e3d..102fc4412 100644 --- a/src/main/java/com/simibubi/create/AllBlockPartials.java +++ b/src/main/java/com/simibubi/create/AllBlockPartials.java @@ -1,27 +1,20 @@ package com.simibubi.create; -import java.util.ArrayList; import java.util.HashMap; -import java.util.List; import java.util.Map; -import com.simibubi.create.content.contraptions.fluids.FluidTransportBehaviour.AttachmentTypes; -import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock.HeatLevel; +import com.simibubi.create.content.contraptions.fluids.FluidTransportBehaviour; +import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock; +import com.simibubi.create.foundation.render.backend.core.PartialModel; import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.Lang; -import net.minecraft.client.renderer.model.IBakedModel; import net.minecraft.util.Direction; import net.minecraft.util.ResourceLocation; -import net.minecraftforge.client.event.ModelBakeEvent; -import net.minecraftforge.client.event.ModelRegistryEvent; -import net.minecraftforge.client.model.ModelLoader; public class AllBlockPartials { - private static final List all = new ArrayList<>(); - - public static final AllBlockPartials SCHEMATICANNON_CONNECTOR = get("schematicannon/connector"), + public static final PartialModel SCHEMATICANNON_CONNECTOR = get("schematicannon/connector"), SCHEMATICANNON_PIPE = get("schematicannon/pipe"), SHAFTLESS_COGWHEEL = get("cogwheel_shaftless"), SHAFT_HALF = get("shaft_half"), @@ -112,69 +105,40 @@ public class AllBlockPartials { ; - public static final Map> PIPE_ATTACHMENTS = map(); - public static final Map BLAZES = map(); + public static final Map> PIPE_ATTACHMENTS = new HashMap<>(); + public static final Map BLAZES = new HashMap<>(); static { populateMaps(); } - ; - - private ResourceLocation modelLocation; - private IBakedModel bakedModel; - - private AllBlockPartials() {} - - private static void populateMaps() { - for (AttachmentTypes type : AttachmentTypes.values()) { + static void populateMaps() { + for (FluidTransportBehaviour.AttachmentTypes type : FluidTransportBehaviour.AttachmentTypes.values()) { if (!type.hasModel()) continue; - Map map = map(); + Map map = new HashMap<>(); for (Direction d : Iterate.directions) { String asId = Lang.asId(type.name()); map.put(d, get("fluid_pipe/" + asId + "/" + Lang.asId(d.getString()))); } PIPE_ATTACHMENTS.put(type, map); } - for (HeatLevel heat : HeatLevel.values()) { - if (heat == HeatLevel.NONE) + for (BlazeBurnerBlock.HeatLevel heat : BlazeBurnerBlock.HeatLevel.values()) { + if (heat == BlazeBurnerBlock.HeatLevel.NONE) continue; BLAZES.put(heat, get("blaze_burner/blaze/" + heat.getString())); } } - private static Map map() { - return new HashMap<>(); + private static PartialModel getEntity(String path) { + return new PartialModel(new ResourceLocation(Create.ID, "entity/" + path)); } - private static AllBlockPartials getEntity(String path) { - AllBlockPartials partials = new AllBlockPartials(); - partials.modelLocation = new ResourceLocation(Create.ID, "entity/" + path); - all.add(partials); - return partials; + private static PartialModel get(String path) { + return new PartialModel(new ResourceLocation(Create.ID, "block/" + path)); } - private static AllBlockPartials get(String path) { - AllBlockPartials partials = new AllBlockPartials(); - partials.modelLocation = new ResourceLocation(Create.ID, "block/" + path); - all.add(partials); - return partials; + public static void clientInit() { + // init static fields } - - public static void onModelRegistry(ModelRegistryEvent event) { - for (AllBlockPartials partial : all) - ModelLoader.addSpecialModel(partial.modelLocation); - } - - public static void onModelBake(ModelBakeEvent event) { - Map modelRegistry = event.getModelRegistry(); - for (AllBlockPartials partial : all) - partial.bakedModel = modelRegistry.get(partial.modelLocation); - } - - public IBakedModel get() { - return bakedModel; - } - } diff --git a/src/main/java/com/simibubi/create/CreateClient.java b/src/main/java/com/simibubi/create/CreateClient.java index 103166ff1..2940b484d 100644 --- a/src/main/java/com/simibubi/create/CreateClient.java +++ b/src/main/java/com/simibubi/create/CreateClient.java @@ -27,6 +27,7 @@ import com.simibubi.create.foundation.render.KineticRenderer; import com.simibubi.create.foundation.render.SuperByteBufferCache; import com.simibubi.create.foundation.render.backend.Backend; import com.simibubi.create.foundation.render.backend.OptifineHandler; +import com.simibubi.create.foundation.render.backend.core.PartialModel; import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; import com.simibubi.create.foundation.utility.WorldAttached; import com.simibubi.create.foundation.utility.ghost.GhostBlocks; @@ -115,6 +116,8 @@ public class CreateClient { .getResourceManager(); if (resourceManager instanceof IReloadableResourceManager) ((IReloadableResourceManager) resourceManager).addReloadListener(new ResourceReloadHandler()); + + AllBlockPartials.clientInit(); } public static void onTextureStitch(TextureStitchEvent.Pre event) { @@ -128,7 +131,7 @@ public class CreateClient { public static void onModelBake(ModelBakeEvent event) { Map modelRegistry = event.getModelRegistry(); - AllBlockPartials.onModelBake(event); + PartialModel.onModelBake(event); getCustomBlockModels() .foreach((block, modelFunc) -> swapModels(modelRegistry, getAllBlockStateModelLocations(block), modelFunc)); @@ -141,7 +144,7 @@ public class CreateClient { } public static void onModelRegistry(ModelRegistryEvent event) { - AllBlockPartials.onModelRegistry(event); + PartialModel.onModelRegistry(event); getCustomRenderedItems().foreach((item, modelFunc) -> modelFunc.apply(null) .getModelLocations() diff --git a/src/main/java/com/simibubi/create/compat/jei/category/ProcessingViaFanCategory.java b/src/main/java/com/simibubi/create/compat/jei/category/ProcessingViaFanCategory.java index 207baa023..2f03d2056 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/ProcessingViaFanCategory.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/ProcessingViaFanCategory.java @@ -28,7 +28,7 @@ public abstract class ProcessingViaFanCategory> extends Cre public ProcessingViaFanCategory(IDrawable icon) { this(177, icon); } - + protected ProcessingViaFanCategory(int width, IDrawable icon) { super(icon, emptyBackground(width, 71)); } diff --git a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedBlazeBurner.java b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedBlazeBurner.java index 8ec5983de..920ab0bf3 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedBlazeBurner.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedBlazeBurner.java @@ -5,6 +5,7 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.AllBlocks; import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock.HeatLevel; import com.simibubi.create.foundation.gui.GuiGameElement; +import com.simibubi.create.foundation.render.backend.core.PartialModel; import mezz.jei.api.gui.drawable.IDrawable; import net.minecraft.util.math.vector.Vector3f; @@ -30,7 +31,7 @@ public class AnimatedBlazeBurner implements IDrawable { .scale(scale) .render(matrixStack); - AllBlockPartials blaze = AllBlockPartials.BLAZES.get(heatLevel); + PartialModel blaze = AllBlockPartials.BLAZES.get(heatLevel); GuiGameElement.of(blaze) .atLocal(1, 1.65, 1) .rotate(0, 180, 0) diff --git a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedKinetics.java b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedKinetics.java index ef9e662ce..fb0e5a880 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedKinetics.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedKinetics.java @@ -2,6 +2,7 @@ package com.simibubi.create.compat.jei.category.animations; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.AllBlocks; +import com.simibubi.create.foundation.render.backend.core.PartialModel; import com.simibubi.create.foundation.utility.AnimationTickHolder; import mezz.jei.api.gui.drawable.IDrawable; @@ -14,15 +15,15 @@ public abstract class AnimatedKinetics implements IDrawable { public static float getCurrentAngle() { return ((AnimationTickHolder.getRenderTime()) * 4f) % 360; } - + protected BlockState shaft(Axis axis) { return AllBlocks.SHAFT.getDefaultState().with(BlockStateProperties.AXIS, axis); } - - protected AllBlockPartials cogwheel() { + + protected PartialModel cogwheel() { return AllBlockPartials.SHAFTLESS_COGWHEEL; } - + @Override public int getWidth() { return 50; diff --git a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedMillstone.java b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedMillstone.java index 80bc6a479..8e98eb372 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedMillstone.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedMillstone.java @@ -20,7 +20,7 @@ public class AnimatedMillstone extends AnimatedKinetics { .rotateBlock(22.5, getCurrentAngle() * 2, 0) .scale(scale) .render(matrixStack); - + GuiGameElement.of(AllBlocks.MILLSTONE.getDefaultState()) .rotateBlock(22.5, 22.5, 0) .scale(scale) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillRenderer.java index 288451551..3734c3509 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillRenderer.java @@ -26,7 +26,7 @@ public class DrillRenderer extends KineticTileEntityRenderer { @Override protected SuperByteBuffer getRotatedModel(KineticTileEntity te) { - return PartialBufferer.getDirectionalSouth(AllBlockPartials.DRILL_HEAD, te.getBlockState()); + return PartialBufferer.getFacing(AllBlockPartials.DRILL_HEAD, te.getBlockState()); } public static void renderInContraption(MovementContext context, MatrixStack ms, MatrixStack msLocal, diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceRenderer.java index 31c4eea44..01c3d4d6f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceRenderer.java @@ -10,6 +10,7 @@ import com.simibubi.create.content.contraptions.components.structureMovement.Mov import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionRenderDispatcher; import com.simibubi.create.foundation.render.PartialBufferer; import com.simibubi.create.foundation.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.backend.core.PartialModel; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.AnimationTickHolder; @@ -110,7 +111,7 @@ public class PortableStorageInterfaceRenderer extends SafeTileEntityRenderer getTileEntityClass() { return HandCrankTileEntity.class; } - + @Override public boolean allowsMovement(BlockState state, IBlockReader reader, BlockPos pos, PathType type) { return false; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankInstance.java index b26402bb3..843882dce 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankInstance.java @@ -1,9 +1,9 @@ package com.simibubi.create.content.contraptions.components.crank; import com.mojang.blaze3d.matrix.MatrixStack; -import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.SingleRotatingInstance; import com.simibubi.create.foundation.render.backend.core.ModelData; +import com.simibubi.create.foundation.render.backend.core.PartialModel; import com.simibubi.create.foundation.render.backend.instancing.IDynamicInstance; import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; @@ -25,7 +25,7 @@ public class HandCrankInstance extends SingleRotatingInstance implements IDynami this.tile = tile; Block block = blockState.getBlock(); - AllBlockPartials renderedHandle = null; + PartialModel renderedHandle = null; if (block instanceof HandCrankBlock) renderedHandle = ((HandCrankBlock) block).getRenderedHandle(); if (renderedHandle == null) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankRenderer.java index bbf3ec4f6..7db258093 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankRenderer.java @@ -3,12 +3,12 @@ package com.simibubi.create.content.contraptions.components.crank; import static net.minecraft.state.properties.BlockStateProperties.FACING; import com.mojang.blaze3d.matrix.MatrixStack; -import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.foundation.render.PartialBufferer; import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; +import com.simibubi.create.foundation.render.backend.core.PartialModel; import net.minecraft.block.Block; import net.minecraft.block.BlockState; @@ -32,14 +32,14 @@ public class HandCrankRenderer extends KineticTileEntityRenderer { BlockState state = te.getBlockState(); Block block = state.getBlock(); - AllBlockPartials renderedHandle = null; + PartialModel renderedHandle = null; if (block instanceof HandCrankBlock) renderedHandle = ((HandCrankBlock) block).getRenderedHandle(); if (renderedHandle == null) return; Direction facing = state.get(FACING); - SuperByteBuffer handle = PartialBufferer.getDirectionalSouth(renderedHandle, state, facing.getOpposite()); + SuperByteBuffer handle = PartialBufferer.getFacing(renderedHandle, state, facing.getOpposite()); HandCrankTileEntity crank = (HandCrankTileEntity) te; kineticRotationTransform(handle, te, facing.getAxis(), (crank.independentAngle + partialTicks * crank.chasingVelocity) / 360, light); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crank/ValveHandleBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/crank/ValveHandleBlock.java index bca18a69a..e9e8c32d7 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/crank/ValveHandleBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crank/ValveHandleBlock.java @@ -2,8 +2,8 @@ package com.simibubi.create.content.contraptions.components.crank; import javax.annotation.ParametersAreNonnullByDefault; -import com.simibubi.create.AllBlockPartials; import com.simibubi.create.AllBlocks; +import com.simibubi.create.foundation.render.backend.core.PartialModel; import com.simibubi.create.foundation.utility.DyeHelper; import net.minecraft.block.BlockState; @@ -68,7 +68,7 @@ public class ValveHandleBlock extends HandCrankBlock { @Override @OnlyIn(Dist.CLIENT) - public AllBlockPartials getRenderedHandle() { + public PartialModel getRenderedHandle() { return null; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerActorInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerActorInstance.java index a62bf37d8..e91bc8a0d 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerActorInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerActorInstance.java @@ -14,6 +14,7 @@ import com.simibubi.create.content.contraptions.components.structureMovement.ren import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionKineticRenderer; import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionProgram; import com.simibubi.create.foundation.render.backend.core.ModelData; +import com.simibubi.create.foundation.render.backend.core.PartialModel; import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; import com.simibubi.create.foundation.render.backend.instancing.RenderMaterial; import com.simibubi.create.foundation.utility.AngleHelper; @@ -48,7 +49,7 @@ public class DeployerActorInstance extends ActorInstance { BlockState state = context.state; DeployerTileEntity.Mode mode = NBTHelper.readEnum(context.tileData, "Mode", DeployerTileEntity.Mode.class); - AllBlockPartials handPose = DeployerRenderer.getHandPose(mode); + PartialModel handPose = DeployerRenderer.getHandPose(mode); stationaryTimer = context.data.contains("StationaryTimer"); facing = state.get(FACING); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerInstance.java index 3ffd3339b..31b1d7665 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerInstance.java @@ -7,6 +7,7 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.relays.encased.ShaftInstance; import com.simibubi.create.foundation.render.backend.core.OrientedData; +import com.simibubi.create.foundation.render.backend.core.PartialModel; import com.simibubi.create.foundation.render.backend.instancing.IDynamicInstance; import com.simibubi.create.foundation.render.backend.instancing.ITickableInstance; import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; @@ -31,7 +32,7 @@ public class DeployerInstance extends ShaftInstance implements IDynamicInstance, protected OrientedData hand; - AllBlockPartials currentHand; + PartialModel currentHand; float progress; private boolean newHand = false; @@ -89,7 +90,7 @@ public class DeployerInstance extends ShaftInstance implements IDynamicInstance, } private boolean updateHandPose() { - AllBlockPartials handPose = tile.getHandPose(); + PartialModel handPose = tile.getHandPose(); if (currentHand == handPose) return false; currentHand = handPose; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerRenderer.java index 84eccae4c..0261f9651 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerRenderer.java @@ -14,6 +14,7 @@ import com.simibubi.create.content.contraptions.components.structureMovement.ren import com.simibubi.create.foundation.render.PartialBufferer; import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; +import com.simibubi.create.foundation.render.backend.core.PartialModel; import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringRenderer; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; import com.simibubi.create.foundation.utility.AngleHelper; @@ -161,7 +162,7 @@ public class DeployerRenderer extends SafeTileEntityRenderer BlockPos pos = BlockPos.ZERO; Mode mode = NBTHelper.readEnum(context.tileData, "Mode", Mode.class); World world = context.world; - AllBlockPartials handPose = getHandPose(mode); + PartialModel handPose = getHandPose(mode); SuperByteBuffer pole = PartialBufferer.get(AllBlockPartials.DEPLOYER_POLE, blockState); SuperByteBuffer hand = PartialBufferer.get(handPose, blockState); @@ -192,7 +193,7 @@ public class DeployerRenderer extends SafeTileEntityRenderer .renderInto(ms, builder); } - static AllBlockPartials getHandPose(DeployerTileEntity.Mode mode) { + static PartialModel getHandPose(DeployerTileEntity.Mode mode) { return mode == DeployerTileEntity.Mode.PUNCH ? AllBlockPartials.DEPLOYER_HAND_PUNCHING : AllBlockPartials.DEPLOYER_HAND_POINTING; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerTileEntity.java index 8705330ba..c1e5493a1 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerTileEntity.java @@ -11,6 +11,7 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.curiosities.tools.SandPaperItem; import com.simibubi.create.foundation.advancement.AllTriggers; import com.simibubi.create.foundation.item.TooltipHelper; +import com.simibubi.create.foundation.render.backend.core.PartialModel; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour; import com.simibubi.create.foundation.utility.NBTHelper; @@ -113,7 +114,7 @@ public class DeployerTileEntity extends KineticTileEntity { @Override public void tick() { super.tick(); - + if (getSpeed() == 0) return; if (!world.isRemote && player != null && player.blockBreakingProgress != null) { @@ -331,7 +332,7 @@ public class DeployerTileEntity extends KineticTileEntity { private IItemHandlerModifiable createHandler() { return new DeployerItemHandler(this); } - + public void redstoneUpdate() { if (world.isRemote) return; @@ -342,7 +343,7 @@ public class DeployerTileEntity extends KineticTileEntity { sendData(); } - public AllBlockPartials getHandPose() { + public PartialModel getHandPose() { return mode == Mode.PUNCH ? AllBlockPartials.DEPLOYER_HAND_PUNCHING : heldItem.isEmpty() ? AllBlockPartials.DEPLOYER_HAND_POINTING : AllBlockPartials.DEPLOYER_HAND_HOLDING; } @@ -395,7 +396,7 @@ public class DeployerTileEntity extends KineticTileEntity { float progress = 0; int timerSpeed = getTimerSpeed(); - AllBlockPartials handPose = getHandPose(); + PartialModel handPose = getHandPose(); if (state == State.EXPANDING) progress = 1 - (timer - partialTicks * timerSpeed) / 1000f; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanRenderer.java index 0cf853af1..6491d16e3 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanRenderer.java @@ -38,9 +38,9 @@ public class EncasedFanRenderer extends KineticTileEntityRenderer { int lightInFront = WorldRenderer.getLightmapCoordinates(te.getWorld(), te.getPos().offset(direction)); SuperByteBuffer shaftHalf = - PartialBufferer.getDirectionalSouth(AllBlockPartials.SHAFT_HALF, te.getBlockState(), direction.getOpposite()); + PartialBufferer.getFacing(AllBlockPartials.SHAFT_HALF, te.getBlockState(), direction.getOpposite()); SuperByteBuffer fanInner = - PartialBufferer.getDirectionalSouth(AllBlockPartials.ENCASED_FAN_INNER, te.getBlockState(), direction.getOpposite()); + PartialBufferer.getFacing(AllBlockPartials.ENCASED_FAN_INNER, te.getBlockState(), direction.getOpposite()); float time = AnimationTickHolder.getRenderTime(te.getWorld()); float speed = te.getSpeed() * 5; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelRenderer.java index f219c4ec4..bf3b46295 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelRenderer.java @@ -72,7 +72,13 @@ public class FlywheelRenderer extends KineticTileEntityRenderer { .renderInto(ms, vb); } - SuperByteBuffer wheel = PartialBufferer.getHorizontal(AllBlockPartials.FLYWHEEL, blockState.rotate(Rotation.CLOCKWISE_90)); + renderFlywheel(te, ms, light, blockState, angle, vb); + } + + private void renderFlywheel(KineticTileEntity te, MatrixStack ms, int light, BlockState blockState, float angle, IVertexBuilder vb) { + BlockState referenceState = blockState.rotate(Rotation.CLOCKWISE_90); + Direction facing = referenceState.get(BlockStateProperties.HORIZONTAL_FACING); + SuperByteBuffer wheel = PartialBufferer.getFacing(AllBlockPartials.FLYWHEEL, referenceState, facing); kineticRotationTransform(wheel, te, blockState.get(HORIZONTAL_FACING) .getAxis(), AngleHelper.rad(angle), light); wheel.renderInto(ms, vb); @@ -80,7 +86,7 @@ public class FlywheelRenderer extends KineticTileEntityRenderer { @Override protected SuperByteBuffer getRotatedModel(KineticTileEntity te) { - return PartialBufferer.getDirectionalSouth(AllBlockPartials.SHAFT_HALF, te.getBlockState(), te.getBlockState() + return PartialBufferer.getFacing(AllBlockPartials.SHAFT_HALF, te.getBlockState(), te.getBlockState() .get(BlockStateProperties.HORIZONTAL_FACING) .getOpposite()); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/engine/EngineBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/engine/EngineBlock.java index 268aa65cc..f3d07cf66 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/engine/EngineBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/engine/EngineBlock.java @@ -2,8 +2,8 @@ package com.simibubi.create.content.contraptions.components.flywheel.engine; import javax.annotation.Nullable; -import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.wrench.IWrenchable; +import com.simibubi.create.foundation.render.backend.core.PartialModel; import com.simibubi.create.foundation.utility.Iterate; import net.minecraft.block.Block; @@ -37,12 +37,12 @@ public abstract class EngineBlock extends HorizontalBlock implements IWrenchable public boolean hasTileEntity(BlockState state) { return true; } - + @Override public ActionResultType onWrenched(BlockState state, ItemUseContext context) { return ActionResultType.FAIL; } - + @Override public abstract TileEntity createTileEntity(BlockState state, IBlockReader world); @@ -88,14 +88,14 @@ public abstract class EngineBlock extends HorizontalBlock implements IWrenchable return true; } - + public static BlockPos getBaseBlockPos(BlockState state, BlockPos pos) { return pos.offset(state.get(HORIZONTAL_FACING).getOpposite()); } @Nullable @OnlyIn(Dist.CLIENT) - public abstract AllBlockPartials getFrameModel(); + public abstract PartialModel getFrameModel(); protected abstract boolean isValidBaseBlock(BlockState baseBlock, IBlockReader world, BlockPos pos); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/engine/EngineInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/engine/EngineInstance.java index a88cbbd1a..3f76914d0 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/engine/EngineInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/engine/EngineInstance.java @@ -1,8 +1,8 @@ package com.simibubi.create.content.contraptions.components.flywheel.engine; import com.mojang.blaze3d.matrix.MatrixStack; -import com.simibubi.create.AllBlockPartials; import com.simibubi.create.foundation.render.backend.core.ModelData; +import com.simibubi.create.foundation.render.backend.core.PartialModel; import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; import com.simibubi.create.foundation.render.backend.instancing.TileEntityInstance; import com.simibubi.create.foundation.utility.AngleHelper; @@ -25,7 +25,7 @@ public class EngineInstance extends TileEntityInstance { return; EngineBlock engineBlock = (EngineBlock) block; - AllBlockPartials frame = engineBlock.getFrameModel(); + PartialModel frame = engineBlock.getFrameModel(); Direction facing = blockState.get(BlockStateProperties.HORIZONTAL_FACING); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/engine/EngineRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/engine/EngineRenderer.java index c96459be9..42be5bedf 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/engine/EngineRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/engine/EngineRenderer.java @@ -1,9 +1,9 @@ package com.simibubi.create.content.contraptions.components.flywheel.engine; import com.mojang.blaze3d.matrix.MatrixStack; -import com.simibubi.create.AllBlockPartials; import com.simibubi.create.foundation.render.PartialBufferer; import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; +import com.simibubi.create.foundation.render.backend.core.PartialModel; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; import com.simibubi.create.foundation.utility.AngleHelper; @@ -30,7 +30,7 @@ public class EngineRenderer extends SafeTileEntityRe .getBlock(); if (block instanceof EngineBlock) { EngineBlock engineBlock = (EngineBlock) block; - AllBlockPartials frame = engineBlock.getFrameModel(); + PartialModel frame = engineBlock.getFrameModel(); if (frame != null) { Direction facing = te.getBlockState() .get(EngineBlock.HORIZONTAL_FACING); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/engine/FurnaceEngineBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/engine/FurnaceEngineBlock.java index 85a84e172..e50508ad0 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/engine/FurnaceEngineBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/engine/FurnaceEngineBlock.java @@ -5,6 +5,7 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.AllShapes; import com.simibubi.create.AllTileEntities; import com.simibubi.create.foundation.block.ITE; +import com.simibubi.create.foundation.render.backend.core.PartialModel; import com.simibubi.create.foundation.utility.worldWrappers.WrappedWorld; import net.minecraft.block.AbstractFurnaceBlock; @@ -41,7 +42,7 @@ public class FurnaceEngineBlock extends EngineBlock implements ITE { protected void renderBlade(SawTileEntity te, MatrixStack ms, IRenderTypeBuffer buffer, int light) { BlockState blockState = te.getBlockState(); SuperByteBuffer superBuffer; - AllBlockPartials partial; + PartialModel partial; float speed = te.getSpeed(); ms.push(); @@ -82,7 +83,7 @@ public class SawRenderer extends SafeTileEntityRenderer { .rotateY(90) .unCentre(); } - superBuffer = PartialBufferer.getDirectionalSouth(partial, blockState); + superBuffer = PartialBufferer.getFacing(partial, blockState); superBuffer.light(light) .renderInto(ms, buffer.getBuffer(RenderType.getCutoutMipped())); @@ -141,7 +142,7 @@ public class SawRenderer extends SafeTileEntityRenderer { protected SuperByteBuffer getRotatedModel(KineticTileEntity te) { BlockState state = te.getBlockState(); if (state.get(FACING).getAxis().isHorizontal()) - return PartialBufferer.getDirectionalSouth(AllBlockPartials.SHAFT_HALF, state.rotate(te.getWorld(), te.getPos(), Rotation.CLOCKWISE_180)); + return PartialBufferer.getFacing(AllBlockPartials.SHAFT_HALF, state.rotate(te.getWorld(), te.getPos(), Rotation.CLOCKWISE_180)); return CreateClient.bufferCache.renderBlockIn(KineticTileEntityRenderer.KINETIC_TILE, getRenderedBlockState(te)); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingInstance.java index a4ce86d26..f3c46d7d6 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingInstance.java @@ -4,6 +4,7 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.BackHalfShaftInstance; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.foundation.render.backend.core.OrientedData; +import com.simibubi.create.foundation.render.backend.core.PartialModel; import com.simibubi.create.foundation.render.backend.instancing.IDynamicInstance; import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; import com.simibubi.create.foundation.utility.AngleHelper; @@ -31,7 +32,7 @@ public class BearingInstance e blockOrientation = getBlockStateOrientation(facing); - AllBlockPartials top = + PartialModel top = bearing.isWoodenTop() ? AllBlockPartials.BEARING_TOP_WOODEN : AllBlockPartials.BEARING_TOP; topInstance = getOrientedMaterial().getModel(top, blockState).createInstance(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingRenderer.java index d176eccbb..cf6f59b7c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingRenderer.java @@ -7,6 +7,7 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.foundation.render.PartialBufferer; import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; +import com.simibubi.create.foundation.render.backend.core.PartialModel; import com.simibubi.create.foundation.utility.AngleHelper; import net.minecraft.client.renderer.IRenderTypeBuffer; @@ -32,7 +33,7 @@ public class BearingRenderer extends KineticTileEntityRenderer { IBearingTileEntity bearingTe = (IBearingTileEntity) te; final Direction facing = te.getBlockState() .get(BlockStateProperties.FACING); - AllBlockPartials top = + PartialModel top = bearingTe.isWoodenTop() ? AllBlockPartials.BEARING_TOP_WOODEN : AllBlockPartials.BEARING_TOP; SuperByteBuffer superBuffer = PartialBufferer.get(top, te.getBlockState()); @@ -49,7 +50,7 @@ public class BearingRenderer extends KineticTileEntityRenderer { @Override protected SuperByteBuffer getRotatedModel(KineticTileEntity te) { - return PartialBufferer.getDirectionalSouth(AllBlockPartials.SHAFT_HALF, te.getBlockState(), te.getBlockState() + return PartialBufferer.getFacing(AllBlockPartials.SHAFT_HALF, te.getBlockState(), te.getBlockState() .get(BearingBlock.FACING) .getOpposite()); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedBearingMovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedBearingMovementBehaviour.java index 4cab614ba..9d776cb3a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedBearingMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedBearingMovementBehaviour.java @@ -15,6 +15,7 @@ import com.simibubi.create.content.contraptions.components.structureMovement.ren import com.simibubi.create.foundation.render.PartialBufferer; import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; +import com.simibubi.create.foundation.render.backend.core.PartialModel; import com.simibubi.create.foundation.utility.AnimationTickHolder; import net.minecraft.client.renderer.IRenderTypeBuffer; @@ -35,7 +36,7 @@ public class StabilizedBearingMovementBehaviour extends MovementBehaviour { if (FastRenderDispatcher.available()) return; Direction facing = context.state.get(BlockStateProperties.FACING); - AllBlockPartials top = AllBlockPartials.BEARING_TOP; + PartialModel top = AllBlockPartials.BEARING_TOP; SuperByteBuffer superBuffer = PartialBufferer.get(top, context.state); float renderPartialTicks = AnimationTickHolder.getPartialTicks(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/AbstractPulleyRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/AbstractPulleyRenderer.java index 3a7a2b3ff..481b065d0 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/AbstractPulleyRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/AbstractPulleyRenderer.java @@ -2,13 +2,13 @@ package com.simibubi.create.content.contraptions.components.structureMovement.pu import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.vertex.IVertexBuilder; -import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.IRotate; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.foundation.render.PartialBufferer; import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; +import com.simibubi.create.foundation.render.backend.core.PartialModel; import com.simibubi.create.foundation.utility.AngleHelper; import net.minecraft.block.BlockState; @@ -25,11 +25,11 @@ import net.minecraft.world.World; public abstract class AbstractPulleyRenderer extends KineticTileEntityRenderer { - private AllBlockPartials halfRope; - private AllBlockPartials halfMagnet; + private PartialModel halfRope; + private PartialModel halfMagnet; - public AbstractPulleyRenderer(TileEntityRendererDispatcher dispatcher, AllBlockPartials halfRope, - AllBlockPartials halfMagnet) { + public AbstractPulleyRenderer(TileEntityRendererDispatcher dispatcher, PartialModel halfRope, + PartialModel halfMagnet) { super(dispatcher); this.halfRope = halfRope; this.halfMagnet = halfMagnet; @@ -90,7 +90,7 @@ public abstract class AbstractPulleyRenderer extends KineticTileEntityRenderer { protected abstract Axis getShaftAxis(KineticTileEntity te); - protected abstract AllBlockPartials getCoil(); + protected abstract PartialModel getCoil(); protected abstract SuperByteBuffer renderRope(KineticTileEntity te); @@ -107,7 +107,7 @@ public abstract class AbstractPulleyRenderer extends KineticTileEntityRenderer { protected SuperByteBuffer getRotatedCoil(KineticTileEntity te) { BlockState blockState = te.getBlockState(); - return PartialBufferer.getDirectionalSouth(getCoil(), blockState, Direction.getFacingFromAxis(AxisDirection.POSITIVE, getShaftAxis(te))); + return PartialBufferer.getFacing(getCoil(), blockState, Direction.getFacingFromAxis(AxisDirection.POSITIVE, getShaftAxis(te))); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyRenderer.java index 740302722..4db922553 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyRenderer.java @@ -6,6 +6,7 @@ import com.simibubi.create.CreateClient; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.components.structureMovement.AbstractContraptionEntity; import com.simibubi.create.foundation.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.backend.core.PartialModel; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; import net.minecraft.util.Direction.Axis; @@ -24,7 +25,7 @@ public class PulleyRenderer extends AbstractPulleyRenderer { } @Override - protected AllBlockPartials getCoil() { + protected PartialModel getCoil() { return AllBlockPartials.ROPE_COIL; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpRenderer.java index b26a6d5a1..8ecc077a4 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpRenderer.java @@ -53,7 +53,7 @@ public class PumpRenderer extends KineticTileEntityRenderer { @Override protected SuperByteBuffer getRotatedModel(KineticTileEntity te) { - return PartialBufferer.getDirectionalSouth(AllBlockPartials.MECHANICAL_PUMP_COG, te.getBlockState()); + return PartialBufferer.getFacing(AllBlockPartials.MECHANICAL_PUMP_COG, te.getBlockState()); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/HosePulleyRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/HosePulleyRenderer.java index d73652919..3e1a43506 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/HosePulleyRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/HosePulleyRenderer.java @@ -5,6 +5,7 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.components.structureMovement.pulley.AbstractPulleyRenderer; import com.simibubi.create.foundation.render.PartialBufferer; import com.simibubi.create.foundation.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.backend.core.PartialModel; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; import net.minecraft.util.Direction.Axis; @@ -24,7 +25,7 @@ public class HosePulleyRenderer extends AbstractPulleyRenderer { } @Override - protected AllBlockPartials getCoil() { + protected PartialModel getCoil() { return AllBlockPartials.HOSE_COIL; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/SpoutRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/SpoutRenderer.java index f4364a14e..2cbacbd36 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/SpoutRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/SpoutRenderer.java @@ -4,6 +4,7 @@ import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.foundation.fluid.FluidRenderer; import com.simibubi.create.foundation.render.PartialBufferer; +import com.simibubi.create.foundation.render.backend.core.PartialModel; import com.simibubi.create.foundation.tileEntity.behaviour.fluid.SmartFluidTankBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.fluid.SmartFluidTankBehaviour.TankSegment; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; @@ -21,7 +22,7 @@ public class SpoutRenderer extends SafeTileEntityRenderer { super(dispatcher); } - static final AllBlockPartials[] BITS = + static final PartialModel[] BITS = { AllBlockPartials.SPOUT_TOP, AllBlockPartials.SPOUT_MIDDLE, AllBlockPartials.SPOUT_BOTTOM }; @Override @@ -70,7 +71,7 @@ public class SpoutRenderer extends SafeTileEntityRenderer { squeeze = -1; ms.push(); - for (AllBlockPartials bit : BITS) { + for (PartialModel bit : BITS) { PartialBufferer.get(bit, te.getBlockState()) .light(light) .renderInto(ms, buffer.getBuffer(RenderType.getSolid())); diff --git a/src/main/java/com/simibubi/create/content/contraptions/goggles/GogglesModel.java b/src/main/java/com/simibubi/create/content/contraptions/goggles/GogglesModel.java index 333f65bbd..0702465f7 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/goggles/GogglesModel.java +++ b/src/main/java/com/simibubi/create/content/contraptions/goggles/GogglesModel.java @@ -21,4 +21,4 @@ public class GogglesModel extends WrappedBakedModel { return super.handlePerspective(cameraTransformType, mat); } -} \ No newline at end of file +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerRenderer.java index c12ce5b23..1d3765ac6 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerRenderer.java @@ -5,6 +5,7 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock.HeatLevel; import com.simibubi.create.foundation.render.PartialBufferer; import com.simibubi.create.foundation.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.backend.core.PartialModel; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.AnimationTickHolder; @@ -31,7 +32,7 @@ public class BlazeBurnerRenderer extends SafeTileEntityRenderer { DyeColor color = tile.color.orElse(null); for (boolean bottom : Iterate.trueAndFalse) { - AllBlockPartials beltPartial = BeltRenderer.getBeltPartial(diagonal, start, end, bottom); + PartialModel beltPartial = BeltRenderer.getBeltPartial(diagonal, start, end, bottom); SpriteShiftEntry spriteShift = BeltRenderer.getSpriteShiftEntry(color, diagonal, bottom); InstancedModel beltModel = modelManager.getMaterial(KineticRenderMaterials.BELTS).getModel(beltPartial, blockState); diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java index 8e628d4aa..4beec3bb0 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java @@ -16,6 +16,7 @@ import com.simibubi.create.foundation.render.PartialBufferer; import com.simibubi.create.foundation.render.ShadowRenderHelper; import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; +import com.simibubi.create.foundation.render.backend.core.PartialModel; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.AnimationTickHolder; @@ -95,7 +96,7 @@ public class BeltRenderer extends SafeTileEntityRenderer { for (boolean bottom : Iterate.trueAndFalse) { - AllBlockPartials beltPartial = getBeltPartial(diagonal, start, end, bottom); + PartialModel beltPartial = getBeltPartial(diagonal, start, end, bottom); SuperByteBuffer beltBuffer = PartialBufferer.get(beltPartial, blockState) .light(light); @@ -159,7 +160,7 @@ public class BeltRenderer extends SafeTileEntityRenderer { : bottom ? AllSpriteShifts.BELT_OFFSET : AllSpriteShifts.BELT; } - public static AllBlockPartials getBeltPartial(boolean diagonal, boolean start, boolean end, boolean bottom) { + public static PartialModel getBeltPartial(boolean diagonal, boolean start, boolean end, boolean bottom) { if (diagonal) { if (start) return AllBlockPartials.BELT_DIAGONAL_START; if (end) return AllBlockPartials.BELT_DIAGONAL_END; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java index 4e35c6bdc..cac191681 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java @@ -52,7 +52,7 @@ public class SplitShaftRenderer extends KineticTileEntityRenderer { angle = angle / 180f * (float) Math.PI; SuperByteBuffer superByteBuffer = - PartialBufferer.getDirectionalSouth(AllBlockPartials.SHAFT_HALF, te.getBlockState(), direction); + PartialBufferer.getFacing(AllBlockPartials.SHAFT_HALF, te.getBlockState(), direction); kineticRotationTransform(superByteBuffer, te, axis, angle, light); superByteBuffer.renderInto(ms, buffer.getBuffer(RenderType.getSolid())); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/GaugeRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/GaugeRenderer.java index 5a1d37e39..56c9fb89b 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/GaugeRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/GaugeRenderer.java @@ -9,6 +9,7 @@ import com.simibubi.create.content.contraptions.relays.gauge.GaugeBlock.Type; import com.simibubi.create.foundation.render.PartialBufferer; import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; +import com.simibubi.create.foundation.render.backend.core.PartialModel; import com.simibubi.create.foundation.utility.Iterate; import net.minecraft.block.BlockState; @@ -46,9 +47,9 @@ public class GaugeRenderer extends KineticTileEntityRenderer { GaugeTileEntity gaugeTE = (GaugeTileEntity) te; int lightCoords = WorldRenderer.getLightmapCoordinates(te.getWorld(), gaugeState, te.getPos()); - AllBlockPartials allBlockPartials = (type == Type.SPEED ? AllBlockPartials.GAUGE_HEAD_SPEED : AllBlockPartials.GAUGE_HEAD_STRESS); + PartialModel partialModel = (type == Type.SPEED ? AllBlockPartials.GAUGE_HEAD_SPEED : AllBlockPartials.GAUGE_HEAD_STRESS); SuperByteBuffer headBuffer = - PartialBufferer.get(allBlockPartials, gaugeState); + PartialBufferer.get(partialModel, gaugeState); SuperByteBuffer dialBuffer = PartialBufferer.get(AllBlockPartials.GAUGE_DIAL, gaugeState); float dialPivot = 5.75f / 16; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java index 78a1206a9..72c2e09e8 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java @@ -38,7 +38,7 @@ public class GearboxRenderer extends KineticTileEntityRenderer { if (boxAxis == axis) continue; - SuperByteBuffer shaft = PartialBufferer.getDirectionalSouth(AllBlockPartials.SHAFT_HALF, te.getBlockState(), direction); + SuperByteBuffer shaft = PartialBufferer.getFacing(AllBlockPartials.SHAFT_HALF, te.getBlockState(), direction); float offset = getRotationOffsetForPosition(te, pos, axis); float angle = (time * te.getSpeed() * 3f / 10) % 360; diff --git a/src/main/java/com/simibubi/create/content/curiosities/symmetry/mirror/CrossPlaneMirror.java b/src/main/java/com/simibubi/create/content/curiosities/symmetry/mirror/CrossPlaneMirror.java index ccdd17720..805673bec 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/symmetry/mirror/CrossPlaneMirror.java +++ b/src/main/java/com/simibubi/create/content/curiosities/symmetry/mirror/CrossPlaneMirror.java @@ -7,6 +7,7 @@ import java.util.Map; import com.google.common.collect.ImmutableList; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.foundation.render.backend.core.PartialModel; import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.foundation.utility.MatrixStacker; @@ -86,7 +87,7 @@ public class CrossPlaneMirror extends SymmetryMirror { } @Override - public AllBlockPartials getModel() { + public PartialModel getModel() { return AllBlockPartials.SYMMETRY_CROSSPLANE; } diff --git a/src/main/java/com/simibubi/create/content/curiosities/symmetry/mirror/EmptyMirror.java b/src/main/java/com/simibubi/create/content/curiosities/symmetry/mirror/EmptyMirror.java index d7cdd00b5..9e953ae5b 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/symmetry/mirror/EmptyMirror.java +++ b/src/main/java/com/simibubi/create/content/curiosities/symmetry/mirror/EmptyMirror.java @@ -5,7 +5,7 @@ import java.util.List; import java.util.Map; import com.google.common.collect.ImmutableList; -import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.foundation.render.backend.core.PartialModel; import net.minecraft.block.BlockState; import net.minecraft.util.IStringSerializable; @@ -17,13 +17,13 @@ public class EmptyMirror extends SymmetryMirror { public static enum Align implements IStringSerializable { None("none"); - + private final String name; private Align(String name) { this.name = name; } @Override public String getString() { return name; } @Override public String toString() { return name; } } - + public EmptyMirror(Vector3d pos) { super(pos); orientation = Align.None; @@ -50,10 +50,10 @@ public class EmptyMirror extends SymmetryMirror { } @Override - public AllBlockPartials getModel() { + public PartialModel getModel() { return null; } - + @Override public List getAlignToolTips() { return ImmutableList.of(); diff --git a/src/main/java/com/simibubi/create/content/curiosities/symmetry/mirror/PlaneMirror.java b/src/main/java/com/simibubi/create/content/curiosities/symmetry/mirror/PlaneMirror.java index 497ecc269..53f8a55c3 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/symmetry/mirror/PlaneMirror.java +++ b/src/main/java/com/simibubi/create/content/curiosities/symmetry/mirror/PlaneMirror.java @@ -7,6 +7,7 @@ import java.util.Map; import com.google.common.collect.ImmutableList; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.foundation.render.backend.core.PartialModel; import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.foundation.utility.MatrixStacker; @@ -82,7 +83,7 @@ public class PlaneMirror extends SymmetryMirror { } @Override - public AllBlockPartials getModel() { + public PartialModel getModel() { return AllBlockPartials.SYMMETRY_PLANE; } diff --git a/src/main/java/com/simibubi/create/content/curiosities/symmetry/mirror/SymmetryMirror.java b/src/main/java/com/simibubi/create/content/curiosities/symmetry/mirror/SymmetryMirror.java index 33f4f5ff2..02e950e9e 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/symmetry/mirror/SymmetryMirror.java +++ b/src/main/java/com/simibubi/create/content/curiosities/symmetry/mirror/SymmetryMirror.java @@ -6,7 +6,7 @@ import java.util.Map; import com.google.common.collect.ImmutableList; import com.mojang.blaze3d.matrix.MatrixStack; -import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.foundation.render.backend.core.PartialModel; import com.simibubi.create.foundation.utility.Lang; import net.minecraft.block.BlockState; @@ -80,7 +80,7 @@ public abstract class SymmetryMirror { public abstract String typeName(); - public abstract AllBlockPartials getModel(); + public abstract PartialModel getModel(); public void applyModelTransform(MatrixStack ms) {} diff --git a/src/main/java/com/simibubi/create/content/curiosities/symmetry/mirror/TriplePlaneMirror.java b/src/main/java/com/simibubi/create/content/curiosities/symmetry/mirror/TriplePlaneMirror.java index 586b4145b..838d4b366 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/symmetry/mirror/TriplePlaneMirror.java +++ b/src/main/java/com/simibubi/create/content/curiosities/symmetry/mirror/TriplePlaneMirror.java @@ -6,6 +6,7 @@ import java.util.Map; import com.google.common.collect.ImmutableList; import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.foundation.render.backend.core.PartialModel; import com.simibubi.create.foundation.utility.Lang; import net.minecraft.block.BlockState; @@ -43,7 +44,7 @@ public class TriplePlaneMirror extends SymmetryMirror { } @Override - public AllBlockPartials getModel() { + public PartialModel getModel() { return AllBlockPartials.SYMMETRY_TRIPLEPLANE; } @@ -54,12 +55,12 @@ public class TriplePlaneMirror extends SymmetryMirror { @Override public void setOrientation(int index) { } - + @Override public IStringSerializable getOrientation() { return CrossPlaneMirror.Align.Y; } - + @Override public List getAlignToolTips() { return ImmutableList.of(Lang.translate("orientation.horizontal")); diff --git a/src/main/java/com/simibubi/create/content/curiosities/tools/ExtendoGripRenderHandler.java b/src/main/java/com/simibubi/create/content/curiosities/tools/ExtendoGripRenderHandler.java index 1943ebf4d..847935f56 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/tools/ExtendoGripRenderHandler.java +++ b/src/main/java/com/simibubi/create/content/curiosities/tools/ExtendoGripRenderHandler.java @@ -3,6 +3,7 @@ package com.simibubi.create.content.curiosities.tools; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.AllItems; +import com.simibubi.create.foundation.render.backend.core.PartialModel; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.MatrixStacker; @@ -28,7 +29,7 @@ public class ExtendoGripRenderHandler { public static float mainHandAnimation; public static float lastMainHandAnimation; - public static AllBlockPartials pose = AllBlockPartials.DEPLOYER_HAND_PUNCHING; + public static PartialModel pose = AllBlockPartials.DEPLOYER_HAND_PUNCHING; public static void tick() { lastMainHandAnimation = mainHandAnimation; diff --git a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelInstance.java b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelInstance.java index 36cf2bbd7..81793455e 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelInstance.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelInstance.java @@ -66,7 +66,7 @@ public class BeltTunnelInstance extends TileEntityInstance tunnelFlaps.put(direction, flaps); }); } - + @Override public boolean shouldReset() { return super.shouldReset() || tunnelFlaps.size() != tile.flaps.size(); diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelInstance.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelInstance.java index 32207fd68..16090ddbd 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelInstance.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelInstance.java @@ -5,6 +5,7 @@ import java.util.ArrayList; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticRenderMaterials; import com.simibubi.create.content.logistics.block.FlapData; +import com.simibubi.create.foundation.render.backend.core.PartialModel; import com.simibubi.create.foundation.render.backend.instancing.IDynamicInstance; import com.simibubi.create.foundation.render.backend.instancing.InstanceData; import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; @@ -26,7 +27,7 @@ public class FunnelInstance extends TileEntityInstance impleme if (!tile.hasFlap()) return; - AllBlockPartials flapPartial = (blockState.getBlock() instanceof FunnelBlock ? AllBlockPartials.FUNNEL_FLAP + PartialModel flapPartial = (blockState.getBlock() instanceof FunnelBlock ? AllBlockPartials.FUNNEL_FLAP : AllBlockPartials.BELT_FUNNEL_FLAP); InstancedModel model = modelManager.getMaterial(KineticRenderMaterials.FLAPS) .getModel(flapPartial, blockState); diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelRenderer.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelRenderer.java index a59417f15..87d762e51 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelRenderer.java @@ -6,6 +6,7 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.foundation.render.PartialBufferer; import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; +import com.simibubi.create.foundation.render.backend.core.PartialModel; import com.simibubi.create.foundation.tileEntity.renderer.SmartTileEntityRenderer; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.MatrixStacker; @@ -34,9 +35,9 @@ public class FunnelRenderer extends SmartTileEntityRenderer { BlockState blockState = te.getBlockState(); IVertexBuilder vb = buffer.getBuffer(RenderType.getSolid()); - AllBlockPartials allBlockPartials = (blockState.getBlock() instanceof FunnelBlock ? AllBlockPartials.FUNNEL_FLAP + PartialModel partialModel = (blockState.getBlock() instanceof FunnelBlock ? AllBlockPartials.FUNNEL_FLAP : AllBlockPartials.BELT_FUNNEL_FLAP); - SuperByteBuffer flapBuffer = PartialBufferer.get(allBlockPartials, blockState); + SuperByteBuffer flapBuffer = PartialBufferer.get(partialModel, blockState); Vector3d pivot = VecHelper.voxelSpace(0, 10, 9.5f); MatrixStacker msr = MatrixStacker.of(ms); diff --git a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInteractionPoint.java b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInteractionPoint.java index 50d9a041b..84baeee39 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInteractionPoint.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInteractionPoint.java @@ -27,6 +27,7 @@ import com.simibubi.create.content.logistics.block.funnel.FunnelBlock; import com.simibubi.create.content.logistics.block.funnel.FunnelTileEntity; import com.simibubi.create.foundation.advancement.AllTriggers; import com.simibubi.create.foundation.item.SmartInventory; +import com.simibubi.create.foundation.render.backend.core.PartialModel; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour.TransportedResult; @@ -100,7 +101,7 @@ public abstract class ArmInteractionPoint { @OnlyIn(Dist.CLIENT) void transformFlag(MatrixStack stack) {} - AllBlockPartials getFlagType() { + PartialModel getFlagType() { return mode == Mode.TAKE ? AllBlockPartials.FLAG_LONG_OUT : AllBlockPartials.FLAG_LONG_IN; } diff --git a/src/main/java/com/simibubi/create/foundation/gui/GuiGameElement.java b/src/main/java/com/simibubi/create/foundation/gui/GuiGameElement.java index a9b3c24a4..385f1a019 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/GuiGameElement.java +++ b/src/main/java/com/simibubi/create/foundation/gui/GuiGameElement.java @@ -8,8 +8,8 @@ import com.mojang.blaze3d.platform.GlStateManager.DestFactor; import com.mojang.blaze3d.platform.GlStateManager.SourceFactor; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.IVertexBuilder; -import com.simibubi.create.AllBlockPartials; import com.simibubi.create.foundation.fluid.FluidRenderer; +import com.simibubi.create.foundation.render.backend.core.PartialModel; import com.simibubi.create.foundation.utility.ColorHelper; import com.simibubi.create.foundation.utility.VecHelper; import com.simibubi.create.foundation.utility.VirtualEmptyModelData; @@ -53,7 +53,7 @@ public class GuiGameElement { return new GuiBlockStateRenderBuilder(state); } - public static GuiRenderBuilder of(AllBlockPartials partial) { + public static GuiRenderBuilder of(PartialModel partial) { return new GuiBlockPartialRenderBuilder(partial); } @@ -251,7 +251,7 @@ public class GuiGameElement { public static class GuiBlockPartialRenderBuilder extends GuiBlockModelRenderBuilder { - public GuiBlockPartialRenderBuilder(AllBlockPartials partial) { + public GuiBlockPartialRenderBuilder(PartialModel partial) { super(partial.get(), null); } diff --git a/src/main/java/com/simibubi/create/foundation/render/Compartment.java b/src/main/java/com/simibubi/create/foundation/render/Compartment.java index 33d1ba678..01087fc22 100644 --- a/src/main/java/com/simibubi/create/foundation/render/Compartment.java +++ b/src/main/java/com/simibubi/create/foundation/render/Compartment.java @@ -2,13 +2,13 @@ package com.simibubi.create.foundation.render; import org.apache.commons.lang3.tuple.Pair; -import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.foundation.render.backend.core.PartialModel; import net.minecraft.block.BlockState; import net.minecraft.util.Direction; public class Compartment { public static final Compartment GENERIC_TILE = new Compartment<>(); - public static final Compartment PARTIAL = new Compartment<>(); - public static final Compartment> DIRECTIONAL_PARTIAL = new Compartment<>(); + public static final Compartment PARTIAL = new Compartment<>(); + public static final Compartment> DIRECTIONAL_PARTIAL = new Compartment<>(); } diff --git a/src/main/java/com/simibubi/create/foundation/render/PartialBufferer.java b/src/main/java/com/simibubi/create/foundation/render/PartialBufferer.java index 91d70d238..4ed176c64 100644 --- a/src/main/java/com/simibubi/create/foundation/render/PartialBufferer.java +++ b/src/main/java/com/simibubi/create/foundation/render/PartialBufferer.java @@ -1,13 +1,12 @@ package com.simibubi.create.foundation.render; import static net.minecraft.state.properties.BlockStateProperties.FACING; -import static net.minecraft.state.properties.BlockStateProperties.HORIZONTAL_FACING; import java.util.function.Supplier; import com.mojang.blaze3d.matrix.MatrixStack; -import com.simibubi.create.AllBlockPartials; import com.simibubi.create.CreateClient; +import com.simibubi.create.foundation.render.backend.core.PartialModel; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.MatrixStacker; @@ -16,43 +15,19 @@ import net.minecraft.util.Direction; public class PartialBufferer { - public static SuperByteBuffer get(AllBlockPartials partial, BlockState referenceState) { + public static SuperByteBuffer get(PartialModel partial, BlockState referenceState) { return CreateClient.bufferCache.renderPartial(partial, referenceState); } - public static SuperByteBuffer getDirectionalSouth(AllBlockPartials partial, BlockState referenceState) { + public static SuperByteBuffer getFacing(PartialModel partial, BlockState referenceState) { Direction facing = referenceState.get(FACING); - return getDirectionalSouth(partial, referenceState, facing); + return getFacing(partial, referenceState, facing); } - public static SuperByteBuffer getDirectional(AllBlockPartials partial, BlockState referenceState) { - Direction facing = referenceState.get(FACING); - return getDirectional(partial, referenceState, facing); - } - - public static SuperByteBuffer getHorizontal(AllBlockPartials partial, BlockState referenceState) { - Direction facing = referenceState.get(HORIZONTAL_FACING); - return getDirectionalSouth(partial, referenceState, facing); - } - - public static SuperByteBuffer getDirectionalSouth(AllBlockPartials partial, BlockState referenceState, Direction facing) { + public static SuperByteBuffer getFacing(PartialModel partial, BlockState referenceState, Direction facing) { return CreateClient.bufferCache.renderDirectionalPartial(partial, referenceState, facing, rotateToFace(facing)); } - public static SuperByteBuffer getDirectional(AllBlockPartials partial, BlockState referenceState, Direction facing) { - Supplier ms = () -> { - MatrixStack stack = new MatrixStack(); - MatrixStacker.of(stack) - .centre() - .rotateY(AngleHelper.horizontalAngle(facing)) - .rotateX(facing == Direction.UP ? 0 : facing == Direction.DOWN ? 180 : 90) - .unCentre(); - - return stack; - }; - return CreateClient.bufferCache.renderDirectionalPartial(partial, referenceState, facing, ms); - } - public static Supplier rotateToFace(Direction facing) { return () -> { MatrixStack stack = new MatrixStack(); diff --git a/src/main/java/com/simibubi/create/foundation/render/SuperByteBufferCache.java b/src/main/java/com/simibubi/create/foundation/render/SuperByteBufferCache.java index 2293037d2..f5f7d7559 100644 --- a/src/main/java/com/simibubi/create/foundation/render/SuperByteBufferCache.java +++ b/src/main/java/com/simibubi/create/foundation/render/SuperByteBufferCache.java @@ -12,7 +12,7 @@ import org.lwjgl.opengl.GL11; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; import com.mojang.blaze3d.matrix.MatrixStack; -import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.foundation.render.backend.core.PartialModel; import com.simibubi.create.foundation.utility.VirtualEmptyModelData; import net.minecraft.block.BlockState; @@ -41,23 +41,23 @@ public class SuperByteBufferCache { return getGeneric(toRender, () -> standardBlockRender(toRender)); } - public SuperByteBuffer renderPartial(AllBlockPartials partial, BlockState referenceState) { + public SuperByteBuffer renderPartial(PartialModel partial, BlockState referenceState) { return get(Compartment.PARTIAL, partial, () -> standardModelRender(partial.get(), referenceState)); } - public SuperByteBuffer renderPartial(AllBlockPartials partial, BlockState referenceState, + public SuperByteBuffer renderPartial(PartialModel partial, BlockState referenceState, Supplier modelTransform) { return get(Compartment.PARTIAL, partial, () -> standardModelRender(partial.get(), referenceState, modelTransform.get())); } - public SuperByteBuffer renderDirectionalPartial(AllBlockPartials partial, BlockState referenceState, - Direction dir) { + public SuperByteBuffer renderDirectionalPartial(PartialModel partial, BlockState referenceState, + Direction dir) { return get(Compartment.DIRECTIONAL_PARTIAL, Pair.of(dir, partial), () -> standardModelRender(partial.get(), referenceState)); } - public SuperByteBuffer renderDirectionalPartial(AllBlockPartials partial, BlockState referenceState, Direction dir, + public SuperByteBuffer renderDirectionalPartial(PartialModel partial, BlockState referenceState, Direction dir, Supplier modelTransform) { return get(Compartment.DIRECTIONAL_PARTIAL, Pair.of(dir, partial), () -> standardModelRender(partial.get(), referenceState, modelTransform.get())); diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/core/PartialModel.java b/src/main/java/com/simibubi/create/foundation/render/backend/core/PartialModel.java new file mode 100644 index 000000000..87fafb9dd --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/backend/core/PartialModel.java @@ -0,0 +1,56 @@ +package com.simibubi.create.foundation.render.backend.core; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import net.minecraft.client.renderer.model.IBakedModel; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.client.event.ModelBakeEvent; +import net.minecraftforge.client.event.ModelRegistryEvent; +import net.minecraftforge.client.model.ModelLoader; + +/** + * A helper class for loading and accessing json models. + *

+ * Creating a PartialModel will make the associated modelLocation automatically load. + * As such, PartialModels must be initialized at or before {@link ModelRegistryEvent}. + * Once {@link ModelBakeEvent} finishes, all PartialModels (with valid modelLocations) + * will have their bakedModel fields populated. + *

+ * Attempting to create a PartialModel after ModelRegistryEvent will cause an error. + */ +public class PartialModel { + + private static boolean tooLate = false; + private static final List all = new ArrayList<>(); + + protected final ResourceLocation modelLocation; + protected IBakedModel bakedModel; + + public PartialModel(ResourceLocation modelLocation) { + + if (tooLate) throw new RuntimeException("PartialModel '" + modelLocation + "' loaded after ModelRegistryEvent"); + + this.modelLocation = modelLocation; + all.add(this); + } + + public static void onModelRegistry(ModelRegistryEvent event) { + for (PartialModel partial : all) + ModelLoader.addSpecialModel(partial.modelLocation); + + tooLate = true; + } + + public static void onModelBake(ModelBakeEvent event) { + Map modelRegistry = event.getModelRegistry(); + for (PartialModel partial : all) + partial.bakedModel = modelRegistry.get(partial.modelLocation); + } + + public IBakedModel get() { + return bakedModel; + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/RenderMaterial.java b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/RenderMaterial.java index f383bad97..fe7517b8f 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/RenderMaterial.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/RenderMaterial.java @@ -14,11 +14,11 @@ import org.apache.commons.lang3.tuple.Pair; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; import com.mojang.blaze3d.matrix.MatrixStack; -import com.simibubi.create.AllBlockPartials; import com.simibubi.create.foundation.render.Compartment; import com.simibubi.create.foundation.render.SuperByteBufferCache; import com.simibubi.create.foundation.render.backend.Backend; import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; +import com.simibubi.create.foundation.render.backend.core.PartialModel; import com.simibubi.create.foundation.render.backend.gl.BasicProgram; import com.simibubi.create.foundation.render.backend.gl.shader.ProgramSpec; import com.simibubi.create.foundation.render.backend.gl.shader.ShaderCallback; @@ -101,15 +101,15 @@ public class RenderMaterial

buildModel(partial.get(), referenceState)); } - public MODEL getModel(AllBlockPartials partial, BlockState referenceState, Direction dir) { + public MODEL getModel(PartialModel partial, BlockState referenceState, Direction dir) { return getModel(partial, referenceState, dir, rotateToFace(dir)); } - public MODEL getModel(AllBlockPartials partial, BlockState referenceState, Direction dir, Supplier modelTransform) { + public MODEL getModel(PartialModel partial, BlockState referenceState, Direction dir, Supplier modelTransform) { return get(Compartment.DIRECTIONAL_PARTIAL, Pair.of(dir, partial), () -> buildModel(partial.get(), referenceState, modelTransform.get())); } From d9b04138dfe6f39ed900cf38a85efa97dec9f219 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Thu, 29 Apr 2021 15:12:08 -0700 Subject: [PATCH 13/18] Whoops flywheels are straight again --- .../contraptions/components/flywheel/FlyWheelInstance.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlyWheelInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlyWheelInstance.java index c4a1f2385..219adb6d1 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlyWheelInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlyWheelInstance.java @@ -53,7 +53,7 @@ public class FlyWheelInstance extends KineticTileInstance im shaft = setup(shaftModel().createInstance()); BlockState referenceState = blockState.rotate(Rotation.CLOCKWISE_90); - wheel = getTransformMaterial().getModel(AllBlockPartials.FLYWHEEL, referenceState, facing).createInstance(); + wheel = getTransformMaterial().getModel(AllBlockPartials.FLYWHEEL, referenceState, referenceState.get(HORIZONTAL_FACING)).createInstance(); connection = FlywheelBlock.getConnection(blockState); if (connection != null) { From 322496f3b47df0032713205febbf7c1de4b02565 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Thu, 29 Apr 2021 17:19:08 -0700 Subject: [PATCH 14/18] Reformat backend --- .../foundation/render/backend/Backend.java | 1 - .../render/backend/BufferedModel.java | 108 ++-- .../render/backend/FastRenderDispatcher.java | 81 ++- .../render/backend/MaterialTypes.java | 4 +- .../render/backend/OptifineHandler.java | 113 ++-- .../foundation/render/backend/RenderUtil.java | 4 +- .../foundation/render/backend/RenderWork.java | 24 +- .../render/backend/ShaderLoader.java | 15 +- .../render/backend/core/BasicData.java | 114 ++-- .../render/backend/core/IFlatLight.java | 27 +- .../render/backend/core/ModelAttributes.java | 52 +- .../render/backend/core/ModelData.java | 32 +- .../backend/core/OrientedAttributes.java | 52 +- .../render/backend/core/OrientedData.java | 2 +- .../render/backend/core/OrientedModel.java | 30 +- .../backend/core/TransformAttributes.java | 50 +- .../render/backend/core/TransformedModel.java | 30 +- .../render/backend/gl/BasicProgram.java | 66 +- .../render/backend/gl/GlBuffer.java | 56 +- .../foundation/render/backend/gl/GlFog.java | 62 +- .../render/backend/gl/GlFogMode.java | 42 +- .../render/backend/gl/GlObject.java | 56 +- .../render/backend/gl/GlPrimitiveType.java | 50 +- .../render/backend/gl/GlTexture.java | 30 +- .../render/backend/gl/GlVertexArray.java | 34 +- .../backend/gl/attrib/CommonAttributes.java | 22 +- .../render/backend/gl/attrib/IAttribSpec.java | 6 +- .../backend/gl/attrib/IVertexAttrib.java | 8 +- .../backend/gl/attrib/MatrixAttributes.java | 48 +- .../backend/gl/attrib/VertexAttribSpec.java | 54 +- .../backend/gl/attrib/VertexFormat.java | 90 +-- .../gl/shader/FogSensitiveProgram.java | 24 +- .../render/backend/gl/shader/GLSLType.java | 64 +- .../render/backend/gl/shader/GlProgram.java | 180 +++--- .../render/backend/gl/shader/GlShader.java | 56 +- .../backend/gl/shader/IMultiProgram.java | 1 + .../backend/gl/shader/ProgramFogMode.java | 74 +-- .../render/backend/gl/shader/ProgramSpec.java | 116 ++-- .../backend/gl/shader/ShaderCallback.java | 14 +- .../backend/gl/shader/ShaderConstants.java | 70 +-- .../render/backend/gl/shader/ShaderType.java | 14 +- .../backend/gl/versioned/DrawInstanced.java | 84 ++- .../render/backend/gl/versioned/GlCompat.java | 162 ++--- .../backend/gl/versioned/GlVersioned.java | 13 +- .../backend/gl/versioned/InstancedArrays.java | 64 +- .../backend/gl/versioned/MapBuffer.java | 102 ++-- .../backend/gl/versioned/RGPixelFormat.java | 116 ++-- .../gl/versioned/VertexArrayObject.java | 116 ++-- .../backend/instancing/IDynamicInstance.java | 32 +- .../backend/instancing/IFlywheelWorld.java | 6 +- .../backend/instancing/IInstanceRendered.java | 6 +- .../backend/instancing/IRendererFactory.java | 2 +- .../backend/instancing/InstanceData.java | 90 +-- .../backend/instancing/InstancedModel.java | 362 +++++------ .../InstancedTileRenderRegistry.java | 26 +- .../instancing/InstancedTileRenderer.java | 438 ++++++------- .../backend/instancing/ModelFactory.java | 2 +- .../backend/instancing/RenderMaterial.java | 155 ++--- .../instancing/TileEntityInstance.java | 156 ++--- .../instancing/util/InstanceGroup.java | 3 +- .../backend/light/CoordinateConsumer.java | 2 +- .../render/backend/light/EmptyLighter.java | 14 +- .../render/backend/light/GridAlignedBB.java | 524 ++++++++-------- .../render/backend/light/LightUpdater.java | 12 +- .../render/backend/light/LightVolume.java | 577 +++++++++--------- .../backend/light/LightVolumeDebugger.java | 36 +- 66 files changed, 2537 insertions(+), 2539 deletions(-) diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/Backend.java b/src/main/java/com/simibubi/create/foundation/render/backend/Backend.java index 9c17503c9..ece39702a 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/Backend.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/Backend.java @@ -9,7 +9,6 @@ import org.lwjgl.opengl.GL; import org.lwjgl.opengl.GLCapabilities; import com.simibubi.create.foundation.config.AllConfigs; -import com.simibubi.create.foundation.render.backend.gl.GlFog; import com.simibubi.create.foundation.render.backend.gl.shader.GlProgram; import com.simibubi.create.foundation.render.backend.gl.shader.IMultiProgram; import com.simibubi.create.foundation.render.backend.gl.shader.ProgramSpec; diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/BufferedModel.java b/src/main/java/com/simibubi/create/foundation/render/backend/BufferedModel.java index ecd90508a..20c7436f9 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/BufferedModel.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/BufferedModel.java @@ -13,75 +13,75 @@ import net.minecraft.client.renderer.BufferBuilder; public abstract class BufferedModel extends TemplateBuffer { - protected GlBuffer modelVBO; - protected boolean removed; + protected GlBuffer modelVBO; + protected boolean removed; - protected BufferedModel(BufferBuilder buf) { - super(buf); - if (vertexCount > 0) init(); - } + protected BufferedModel(BufferBuilder buf) { + super(buf); + if (vertexCount > 0) init(); + } - protected void init() { + protected void init() { - modelVBO = new GlBuffer(GL20.GL_ARRAY_BUFFER); + modelVBO = new GlBuffer(GL20.GL_ARRAY_BUFFER); - modelVBO.with(vbo -> initModel()); - } + modelVBO.with(vbo -> initModel()); + } - protected void initModel() { - int stride = getModelFormat().getStride(); - int invariantSize = vertexCount * stride; + protected void initModel() { + int stride = getModelFormat().getStride(); + int invariantSize = vertexCount * stride; - // allocate the buffer on the gpu - GL15.glBufferData(GL15.GL_ARRAY_BUFFER, invariantSize, GL15.GL_STATIC_DRAW); + // allocate the buffer on the gpu + GL15.glBufferData(GL15.GL_ARRAY_BUFFER, invariantSize, GL15.GL_STATIC_DRAW); - // mirror it in system memory so we can write to it - modelVBO.map(invariantSize, buffer -> { - for (int i = 0; i < vertexCount; i++) { - copyVertex(buffer, i); - } - }); - } + // mirror it in system memory so we can write to it + modelVBO.map(invariantSize, buffer -> { + for (int i = 0; i < vertexCount; i++) { + copyVertex(buffer, i); + } + }); + } - protected abstract void copyVertex(ByteBuffer to, int index); + protected abstract void copyVertex(ByteBuffer to, int index); - protected abstract VertexFormat getModelFormat(); + protected abstract VertexFormat getModelFormat(); - protected int getTotalShaderAttributeCount() { - return getModelFormat().getShaderAttributeCount(); - } + protected int getTotalShaderAttributeCount() { + return getModelFormat().getShaderAttributeCount(); + } - /** - * Renders this model, checking first if there is anything to render. - */ - public final void render() { - if (vertexCount == 0 || removed) return; + /** + * Renders this model, checking first if there is anything to render. + */ + public final void render() { + if (vertexCount == 0 || removed) return; - doRender(); - } + doRender(); + } - /** - * Set up any state and make the draw calls. - */ - protected abstract void doRender(); + /** + * Set up any state and make the draw calls. + */ + protected abstract void doRender(); - protected void setupAttributes() { - int numAttributes = getTotalShaderAttributeCount(); - for (int i = 0; i <= numAttributes; i++) { - GL20.glEnableVertexAttribArray(i); - } + protected void setupAttributes() { + int numAttributes = getTotalShaderAttributeCount(); + for (int i = 0; i <= numAttributes; i++) { + GL20.glEnableVertexAttribArray(i); + } - getModelFormat().vertexAttribPointers(0); - } + getModelFormat().vertexAttribPointers(0); + } - public final void delete() { - removed = true; - if (vertexCount > 0) { - RenderWork.enqueue(this::deleteInternal); - } - } + public final void delete() { + removed = true; + if (vertexCount > 0) { + RenderWork.enqueue(this::deleteInternal); + } + } - protected void deleteInternal() { - modelVBO.delete(); - } + protected void deleteInternal() { + modelVBO.delete(); + } } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/FastRenderDispatcher.java b/src/main/java/com/simibubi/create/foundation/render/backend/FastRenderDispatcher.java index f4deae1dc..ee9fc282f 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/FastRenderDispatcher.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/FastRenderDispatcher.java @@ -2,78 +2,71 @@ package com.simibubi.create.foundation.render.backend; import java.util.concurrent.ConcurrentHashMap; -import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.CreateClient; import com.simibubi.create.content.contraptions.KineticDebugger; import com.simibubi.create.foundation.render.KineticRenderer; -import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.WorldAttached; import net.minecraft.client.Minecraft; -import net.minecraft.client.entity.player.ClientPlayerEntity; -import net.minecraft.client.renderer.GameRenderer; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.world.ClientWorld; import net.minecraft.entity.Entity; -import net.minecraft.potion.Effects; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.vector.Matrix4f; -import net.minecraft.util.math.vector.Vector3f; import net.minecraft.world.World; public class FastRenderDispatcher { - public static WorldAttached> queuedUpdates = new WorldAttached<>(ConcurrentHashMap::newKeySet); + public static WorldAttached> queuedUpdates = new WorldAttached<>(ConcurrentHashMap::newKeySet); - public static void enqueueUpdate(TileEntity te) { - queuedUpdates.get(te.getWorld()).add(te); - } + public static void enqueueUpdate(TileEntity te) { + queuedUpdates.get(te.getWorld()).add(te); + } - public static void tick() { - Minecraft mc = Minecraft.getInstance(); - ClientWorld world = mc.world; + public static void tick() { + Minecraft mc = Minecraft.getInstance(); + ClientWorld world = mc.world; - KineticRenderer kineticRenderer = CreateClient.kineticRenderer.get(world); + KineticRenderer kineticRenderer = CreateClient.kineticRenderer.get(world); - Entity renderViewEntity = mc.renderViewEntity; - kineticRenderer.tick(renderViewEntity.getX(), renderViewEntity.getY(), renderViewEntity.getZ()); + Entity renderViewEntity = mc.renderViewEntity; + kineticRenderer.tick(renderViewEntity.getX(), renderViewEntity.getY(), renderViewEntity.getZ()); - ConcurrentHashMap.KeySetView map = queuedUpdates.get(world); - map - .forEach(te -> { - map.remove(te); + ConcurrentHashMap.KeySetView map = queuedUpdates.get(world); + map + .forEach(te -> { + map.remove(te); - kineticRenderer.update(te); - }); - } + kineticRenderer.update(te); + }); + } - public static boolean available() { - return Backend.canUseInstancing(); - } + public static boolean available() { + return Backend.canUseInstancing(); + } - public static boolean available(World world) { - return Backend.canUseInstancing() && Backend.isFlywheelWorld(world); - } + public static boolean available(World world) { + return Backend.canUseInstancing() && Backend.isFlywheelWorld(world); + } - public static int getDebugMode() { - return KineticDebugger.isActive() ? 1 : 0; - } + public static int getDebugMode() { + return KineticDebugger.isActive() ? 1 : 0; + } - public static void refresh() { - RenderWork.enqueue(Minecraft.getInstance().worldRenderer::loadRenderers); - } + public static void refresh() { + RenderWork.enqueue(Minecraft.getInstance().worldRenderer::loadRenderers); + } - public static void renderLayer(RenderType layer, Matrix4f viewProjection, double cameraX, double cameraY, double cameraZ) { - if (!Backend.canUseInstancing()) return; + public static void renderLayer(RenderType layer, Matrix4f viewProjection, double cameraX, double cameraY, double cameraZ) { + if (!Backend.canUseInstancing()) return; - ClientWorld world = Minecraft.getInstance().world; - KineticRenderer kineticRenderer = CreateClient.kineticRenderer.get(world); + ClientWorld world = Minecraft.getInstance().world; + KineticRenderer kineticRenderer = CreateClient.kineticRenderer.get(world); - layer.startDrawing(); + layer.startDrawing(); - kineticRenderer.render(layer, viewProjection, cameraX, cameraY, cameraZ); + kineticRenderer.render(layer, viewProjection, cameraX, cameraY, cameraZ); - layer.endDrawing(); - } + layer.endDrawing(); + } } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/MaterialTypes.java b/src/main/java/com/simibubi/create/foundation/render/backend/MaterialTypes.java index 66d838f08..e524b295c 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/MaterialTypes.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/MaterialTypes.java @@ -5,6 +5,6 @@ import com.simibubi.create.foundation.render.backend.core.OrientedData; import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; public class MaterialTypes { - public static final MaterialType> TRANSFORMED = new MaterialType<>(); - public static final MaterialType> ORIENTED = new MaterialType<>(); + public static final MaterialType> TRANSFORMED = new MaterialType<>(); + public static final MaterialType> ORIENTED = new MaterialType<>(); } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/OptifineHandler.java b/src/main/java/com/simibubi/create/foundation/render/backend/OptifineHandler.java index 49b967e7b..58cc82188 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/OptifineHandler.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/OptifineHandler.java @@ -9,77 +9,78 @@ import java.util.Optional; import net.minecraft.client.Minecraft; public class OptifineHandler { - public static final String OPTIFINE_ROOT_PACKAGE = "net.optifine"; - public static final String SHADER_PACKAGE = "net.optifine.shaders"; + public static final String OPTIFINE_ROOT_PACKAGE = "net.optifine"; + public static final String SHADER_PACKAGE = "net.optifine.shaders"; - private static Package optifine; - private static OptifineHandler handler; + private static Package optifine; + private static OptifineHandler handler; - public final boolean usingShaders; + public final boolean usingShaders; - public OptifineHandler(boolean usingShaders) { - this.usingShaders = usingShaders; - } + public OptifineHandler(boolean usingShaders) { + this.usingShaders = usingShaders; + } - /** - * Get information about the current Optifine configuration. - * @return {@link Optional#empty()} if Optifine is not installed. - */ - public static Optional get() { - return Optional.ofNullable(handler); - } + /** + * Get information about the current Optifine configuration. + * + * @return {@link Optional#empty()} if Optifine is not installed. + */ + public static Optional get() { + return Optional.ofNullable(handler); + } - public static boolean optifineInstalled() { - return optifine != null; - } + public static boolean optifineInstalled() { + return optifine != null; + } - public static boolean usingShaders() { - return OptifineHandler.get() - .map(OptifineHandler::isUsingShaders) - .orElse(false); - } + public static boolean usingShaders() { + return OptifineHandler.get() + .map(OptifineHandler::isUsingShaders) + .orElse(false); + } - public static void init() { - optifine = Package.getPackage(OPTIFINE_ROOT_PACKAGE); + public static void init() { + optifine = Package.getPackage(OPTIFINE_ROOT_PACKAGE); - if (optifine == null) { - Backend.log.info("Optifine not detected."); - } else { - Backend.log.info("Optifine detected."); + if (optifine == null) { + Backend.log.info("Optifine not detected."); + } else { + Backend.log.info("Optifine detected."); - refresh(); - } - } + refresh(); + } + } - public static void refresh() { - if (optifine == null) return; + public static void refresh() { + if (optifine == null) return; - File dir = Minecraft.getInstance().gameDir; + File dir = Minecraft.getInstance().gameDir; - File shaderOptions = new File(dir, "optionsshaders.txt"); + File shaderOptions = new File(dir, "optionsshaders.txt"); - boolean shadersOff = true; - try { - BufferedReader reader = new BufferedReader(new FileReader(shaderOptions)); + boolean shadersOff = true; + try { + BufferedReader reader = new BufferedReader(new FileReader(shaderOptions)); - shadersOff = reader.lines() - .anyMatch(it -> { - String line = it.replaceAll("\\s", ""); - if (line.startsWith("shaderPack=")) { - String setting = line.substring("shaderPack=".length()); + shadersOff = reader.lines() + .anyMatch(it -> { + String line = it.replaceAll("\\s", ""); + if (line.startsWith("shaderPack=")) { + String setting = line.substring("shaderPack=".length()); - return setting.equals("OFF") || setting.equals("(internal)"); - } - return false; - }); - } catch (FileNotFoundException e) { - Backend.log.info("No shader config found."); - } + return setting.equals("OFF") || setting.equals("(internal)"); + } + return false; + }); + } catch (FileNotFoundException e) { + Backend.log.info("No shader config found."); + } - handler = new OptifineHandler(!shadersOff); - } + handler = new OptifineHandler(!shadersOff); + } - public boolean isUsingShaders() { - return usingShaders; - } + public boolean isUsingShaders() { + return usingShaders; + } } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/RenderUtil.java b/src/main/java/com/simibubi/create/foundation/render/backend/RenderUtil.java index 30f21fff8..43058e362 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/RenderUtil.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/RenderUtil.java @@ -6,7 +6,7 @@ import net.minecraft.util.math.vector.Matrix3f; import net.minecraft.util.math.vector.Matrix4f; public class RenderUtil { - public static int nextPowerOf2(int a) { + public static int nextPowerOf2(int a) { int h = Integer.highestOneBit(a); return (h == a) ? h : (h << 1); } @@ -22,7 +22,7 @@ public class RenderUtil { // GPUs want matrices in column major order. public static float[] writeMatrixStack(Matrix4f model, Matrix3f normal) { - return new float[] { + return new float[]{ model.a00, model.a10, model.a20, diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/RenderWork.java b/src/main/java/com/simibubi/create/foundation/render/backend/RenderWork.java index 5a44845f6..b20f1d64e 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/RenderWork.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/RenderWork.java @@ -4,18 +4,18 @@ import java.util.Queue; import java.util.concurrent.ConcurrentLinkedQueue; public class RenderWork { - private static final Queue runs = new ConcurrentLinkedQueue<>(); + private static final Queue runs = new ConcurrentLinkedQueue<>(); - public static void runAll() { - while (!runs.isEmpty()) { - runs.remove().run(); - } - } + public static void runAll() { + while (!runs.isEmpty()) { + runs.remove().run(); + } + } - /** - * Queue work to be executed at the end of a frame - */ - public static void enqueue(Runnable run) { - runs.add(run); - } + /** + * Queue work to be executed at the end of a frame + */ + public static void enqueue(Runnable run) { + runs.add(run); + } } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/ShaderLoader.java b/src/main/java/com/simibubi/create/foundation/render/backend/ShaderLoader.java index 41c5dfb33..a3bf9b096 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/ShaderLoader.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/ShaderLoader.java @@ -28,14 +28,14 @@ import org.lwjgl.system.MemoryUtil; import com.google.common.collect.Lists; import com.mojang.blaze3d.systems.RenderSystem; import com.simibubi.create.foundation.render.backend.gl.GlFogMode; -import com.simibubi.create.foundation.render.backend.gl.shader.SingleProgram; +import com.simibubi.create.foundation.render.backend.gl.shader.FogSensitiveProgram; import com.simibubi.create.foundation.render.backend.gl.shader.GlProgram; import com.simibubi.create.foundation.render.backend.gl.shader.GlShader; -import com.simibubi.create.foundation.render.backend.gl.shader.FogSensitiveProgram; import com.simibubi.create.foundation.render.backend.gl.shader.IMultiProgram; import com.simibubi.create.foundation.render.backend.gl.shader.ProgramSpec; import com.simibubi.create.foundation.render.backend.gl.shader.ShaderConstants; import com.simibubi.create.foundation.render.backend.gl.shader.ShaderType; +import com.simibubi.create.foundation.render.backend.gl.shader.SingleProgram; import net.minecraft.resources.IResource; import net.minecraft.resources.IResourceManager; @@ -70,7 +70,7 @@ public class ShaderLoader { } } - private void loadShaderSources(IResourceManager manager){ + private void loadShaderSources(IResourceManager manager) { Collection allShaders = manager.getAllResourceLocations(SHADER_DIR, s -> { for (String ext : EXTENSIONS) { if (s.endsWith(ext)) return true; @@ -185,7 +185,7 @@ public class ShaderLoader { try { bytebuffer = readToBuffer(is); int i = bytebuffer.position(); - ((Buffer)bytebuffer).rewind(); + ((Buffer) bytebuffer).rewind(); return MemoryUtil.memASCII(bytebuffer, i); } catch (IOException e) { @@ -202,11 +202,12 @@ public class ShaderLoader { public ByteBuffer readToBuffer(InputStream is) throws IOException { ByteBuffer bytebuffer; if (is instanceof FileInputStream) { - FileInputStream fileinputstream = (FileInputStream)is; + FileInputStream fileinputstream = (FileInputStream) is; FileChannel filechannel = fileinputstream.getChannel(); - bytebuffer = MemoryUtil.memAlloc((int)filechannel.size() + 1); + bytebuffer = MemoryUtil.memAlloc((int) filechannel.size() + 1); - while (filechannel.read(bytebuffer) != -1) { } + while (filechannel.read(bytebuffer) != -1) { + } } else { bytebuffer = MemoryUtil.memAlloc(8192); ReadableByteChannel readablebytechannel = Channels.newChannel(is); diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/core/BasicData.java b/src/main/java/com/simibubi/create/foundation/render/backend/core/BasicData.java index 2a555ede7..531b2d929 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/core/BasicData.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/core/BasicData.java @@ -7,72 +7,72 @@ import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; public class BasicData extends InstanceData implements IFlatLight { - protected byte blockLight; - protected byte skyLight; + protected byte blockLight; + protected byte skyLight; - protected byte r = (byte) 0xFF; - protected byte g = (byte) 0xFF; - protected byte b = (byte) 0xFF; - protected byte a = (byte) 0xFF; + protected byte r = (byte) 0xFF; + protected byte g = (byte) 0xFF; + protected byte b = (byte) 0xFF; + protected byte a = (byte) 0xFF; - public BasicData(InstancedModel owner) { - super(owner); - } + public BasicData(InstancedModel owner) { + super(owner); + } - @Override - public BasicData setBlockLight(int blockLight) { - this.blockLight = (byte) (blockLight << 4); - markDirty(); - return this; - } + @Override + public BasicData setBlockLight(int blockLight) { + this.blockLight = (byte) (blockLight << 4); + markDirty(); + return this; + } - @Override - public BasicData setSkyLight(int skyLight) { - this.skyLight = (byte) (skyLight << 4); - markDirty(); - return this; - } + @Override + public BasicData setSkyLight(int skyLight) { + this.skyLight = (byte) (skyLight << 4); + markDirty(); + return this; + } - public BasicData setColor(int color) { - return setColor(color, false); - } + public BasicData setColor(int color) { + return setColor(color, false); + } - public BasicData setColor(int color, boolean alpha) { - byte r = (byte) ((color >> 16) & 0xFF); - byte g = (byte) ((color >> 8) & 0xFF); - byte b = (byte) (color & 0xFF); + public BasicData setColor(int color, boolean alpha) { + byte r = (byte) ((color >> 16) & 0xFF); + byte g = (byte) ((color >> 8) & 0xFF); + byte b = (byte) (color & 0xFF); - if (alpha) { - byte a = (byte) ((color >> 24) & 0xFF); - return setColor(r, g, b, a); - } else { - return setColor(r, g, b); - } - } + if (alpha) { + byte a = (byte) ((color >> 24) & 0xFF); + return setColor(r, g, b, a); + } else { + return setColor(r, g, b); + } + } - public BasicData setColor(int r, int g, int b) { - return setColor((byte) r, (byte) g, (byte) b); - } + public BasicData setColor(int r, int g, int b) { + return setColor((byte) r, (byte) g, (byte) b); + } - public BasicData setColor(byte r, byte g, byte b) { - this.r = r; - this.g = g; - this.b = b; - markDirty(); - return this; - } + public BasicData setColor(byte r, byte g, byte b) { + this.r = r; + this.g = g; + this.b = b; + markDirty(); + return this; + } - public BasicData setColor(byte r, byte g, byte b, byte a) { - this.r = r; - this.g = g; - this.b = b; - this.a = a; - markDirty(); - return this; - } + public BasicData setColor(byte r, byte g, byte b, byte a) { + this.r = r; + this.g = g; + this.b = b; + this.a = a; + markDirty(); + return this; + } - @Override - public void write(ByteBuffer buf) { - buf.put(new byte[] { blockLight, skyLight, r, g, b, a }); - } + @Override + public void write(ByteBuffer buf) { + buf.put(new byte[]{blockLight, skyLight, r, g, b, a}); + } } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/core/IFlatLight.java b/src/main/java/com/simibubi/create/foundation/render/backend/core/IFlatLight.java index 0920e037a..fbbdd58b2 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/core/IFlatLight.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/core/IFlatLight.java @@ -5,22 +5,23 @@ import com.simibubi.create.foundation.render.backend.instancing.InstanceData; /** * An interface that implementors of {@link InstanceData} should also implement * if they wish to make use of Flywheel's provided light update methods. - * + *

* This only covers flat lighting, smooth lighting is still TODO. + * * @param The name of the class that implements this interface. */ public interface IFlatLight> { - /** - * @param blockLight An integer in the range [0, 15] representing the - * amount of block light this instance should receive. - * @return this - */ - D setBlockLight(int blockLight); + /** + * @param blockLight An integer in the range [0, 15] representing the + * amount of block light this instance should receive. + * @return this + */ + D setBlockLight(int blockLight); - /** - * @param skyLight An integer in the range [0, 15] representing the - * amount of sky light this instance should receive. - * @return this - */ - D setSkyLight(int skyLight); + /** + * @param skyLight An integer in the range [0, 15] representing the + * amount of sky light this instance should receive. + * @return this + */ + D setSkyLight(int skyLight); } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/core/ModelAttributes.java b/src/main/java/com/simibubi/create/foundation/render/backend/core/ModelAttributes.java index b4d220bc3..970fd672e 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/core/ModelAttributes.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/core/ModelAttributes.java @@ -6,36 +6,36 @@ import com.simibubi.create.foundation.render.backend.gl.attrib.IVertexAttrib; import com.simibubi.create.foundation.render.backend.gl.attrib.VertexAttribSpec; public enum ModelAttributes implements IVertexAttrib { - VERTEX_POSITION("aPos", CommonAttributes.VEC3), - NORMAL("aNormal", CommonAttributes.NORMAL), - TEXTURE("aTexCoords", CommonAttributes.UV), - ; + VERTEX_POSITION("aPos", CommonAttributes.VEC3), + NORMAL("aNormal", CommonAttributes.NORMAL), + TEXTURE("aTexCoords", CommonAttributes.UV), + ; - private final String name; - private final VertexAttribSpec spec; + private final String name; + private final VertexAttribSpec spec; - ModelAttributes(String name, VertexAttribSpec spec) { - this.name = name; - this.spec = spec; - } + ModelAttributes(String name, VertexAttribSpec spec) { + this.name = name; + this.spec = spec; + } - @Override - public String attribName() { - return name; - } + @Override + public String attribName() { + return name; + } - @Override - public IAttribSpec attribSpec() { - return spec; - } + @Override + public IAttribSpec attribSpec() { + return spec; + } - @Override - public int getDivisor() { - return 0; - } + @Override + public int getDivisor() { + return 0; + } - @Override - public int getBufferIndex() { - return 0; - } + @Override + public int getBufferIndex() { + return 0; + } } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/core/ModelData.java b/src/main/java/com/simibubi/create/foundation/render/backend/core/ModelData.java index 99e3192bd..c2f338bf6 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/core/ModelData.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/core/ModelData.java @@ -7,24 +7,24 @@ import com.simibubi.create.foundation.render.backend.RenderUtil; import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; public class ModelData extends BasicData { - private static final float[] empty = new float[25]; + private static final float[] empty = new float[25]; - private float[] matrices = empty; + private float[] matrices = empty; - public ModelData(InstancedModel owner) { - super(owner); - } + public ModelData(InstancedModel owner) { + super(owner); + } - public ModelData setTransform(MatrixStack stack) { - matrices = RenderUtil.writeMatrixStack(stack); - markDirty(); - return this; - } + public ModelData setTransform(MatrixStack stack) { + matrices = RenderUtil.writeMatrixStack(stack); + markDirty(); + return this; + } - @Override - public void write(ByteBuffer buf) { - super.write(buf); - buf.asFloatBuffer().put(matrices); - buf.position(buf.position() + matrices.length * 4); - } + @Override + public void write(ByteBuffer buf) { + super.write(buf); + buf.asFloatBuffer().put(matrices); + buf.position(buf.position() + matrices.length * 4); + } } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/core/OrientedAttributes.java b/src/main/java/com/simibubi/create/foundation/render/backend/core/OrientedAttributes.java index 9ee10ce4b..135958501 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/core/OrientedAttributes.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/core/OrientedAttributes.java @@ -5,36 +5,36 @@ import com.simibubi.create.foundation.render.backend.gl.attrib.IAttribSpec; import com.simibubi.create.foundation.render.backend.gl.attrib.IVertexAttrib; public enum OrientedAttributes implements IVertexAttrib { - INSTANCE_POS("aInstancePos", CommonAttributes.VEC3), - PIVOT("aPivot", CommonAttributes.VEC3), - ROTATION("aRotation", CommonAttributes.QUATERNION), - ; + INSTANCE_POS("aInstancePos", CommonAttributes.VEC3), + PIVOT("aPivot", CommonAttributes.VEC3), + ROTATION("aRotation", CommonAttributes.QUATERNION), + ; - private final String name; - private final IAttribSpec spec; + private final String name; + private final IAttribSpec spec; - OrientedAttributes(String name, IAttribSpec spec) { - this.name = name; - this.spec = spec; - } + OrientedAttributes(String name, IAttribSpec spec) { + this.name = name; + this.spec = spec; + } - @Override - public String attribName() { - return name; - } + @Override + public String attribName() { + return name; + } - @Override - public IAttribSpec attribSpec() { - return spec; - } + @Override + public IAttribSpec attribSpec() { + return spec; + } - @Override - public int getDivisor() { - return 0; - } + @Override + public int getDivisor() { + return 0; + } - @Override - public int getBufferIndex() { - return 0; - } + @Override + public int getBufferIndex() { + return 0; + } } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/core/OrientedData.java b/src/main/java/com/simibubi/create/foundation/render/backend/core/OrientedData.java index dd3b6640d..77becf79e 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/core/OrientedData.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/core/OrientedData.java @@ -85,7 +85,7 @@ public class OrientedData extends BasicData { public void write(ByteBuffer buf) { super.write(buf); - buf.asFloatBuffer().put(new float[] { + buf.asFloatBuffer().put(new float[]{ posX, posY, posZ, diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/core/OrientedModel.java b/src/main/java/com/simibubi/create/foundation/render/backend/core/OrientedModel.java index e1cd0b00b..42ee8334b 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/core/OrientedModel.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/core/OrientedModel.java @@ -7,22 +7,22 @@ import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRen import net.minecraft.client.renderer.BufferBuilder; public class OrientedModel extends InstancedModel { - public static final VertexFormat INSTANCE_FORMAT = VertexFormat.builder() - .addAttributes(BasicAttributes.class) - .addAttributes(OrientedAttributes.class) - .build(); + public static final VertexFormat INSTANCE_FORMAT = VertexFormat.builder() + .addAttributes(BasicAttributes.class) + .addAttributes(OrientedAttributes.class) + .build(); - public OrientedModel(InstancedTileRenderer renderer, BufferBuilder buf) { - super(renderer, buf); - } + public OrientedModel(InstancedTileRenderer renderer, BufferBuilder buf) { + super(renderer, buf); + } - @Override - protected OrientedData newInstance() { - return new OrientedData(this); - } + @Override + protected OrientedData newInstance() { + return new OrientedData(this); + } - @Override - protected VertexFormat getInstanceFormat() { - return INSTANCE_FORMAT; - } + @Override + protected VertexFormat getInstanceFormat() { + return INSTANCE_FORMAT; + } } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/core/TransformAttributes.java b/src/main/java/com/simibubi/create/foundation/render/backend/core/TransformAttributes.java index db7428aa9..f35cdf988 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/core/TransformAttributes.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/core/TransformAttributes.java @@ -5,35 +5,35 @@ import com.simibubi.create.foundation.render.backend.gl.attrib.IVertexAttrib; import com.simibubi.create.foundation.render.backend.gl.attrib.MatrixAttributes; public enum TransformAttributes implements IVertexAttrib { - TRANSFORM("aTransform", MatrixAttributes.MAT4), - NORMAL_MAT("aNormalMat", MatrixAttributes.MAT3), - ; + TRANSFORM("aTransform", MatrixAttributes.MAT4), + NORMAL_MAT("aNormalMat", MatrixAttributes.MAT3), + ; - private final String name; - private final IAttribSpec spec; + private final String name; + private final IAttribSpec spec; - TransformAttributes(String name, IAttribSpec spec) { - this.name = name; - this.spec = spec; - } + TransformAttributes(String name, IAttribSpec spec) { + this.name = name; + this.spec = spec; + } - @Override - public String attribName() { - return name; - } + @Override + public String attribName() { + return name; + } - @Override - public IAttribSpec attribSpec() { - return spec; - } + @Override + public IAttribSpec attribSpec() { + return spec; + } - @Override - public int getDivisor() { - return 0; - } + @Override + public int getDivisor() { + return 0; + } - @Override - public int getBufferIndex() { - return 0; - } + @Override + public int getBufferIndex() { + return 0; + } } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/core/TransformedModel.java b/src/main/java/com/simibubi/create/foundation/render/backend/core/TransformedModel.java index b5d80ded6..e5fd44ed1 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/core/TransformedModel.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/core/TransformedModel.java @@ -7,22 +7,22 @@ import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRen import net.minecraft.client.renderer.BufferBuilder; public class TransformedModel extends InstancedModel { - public static final VertexFormat INSTANCE_FORMAT = VertexFormat.builder() - .addAttributes(BasicAttributes.class) - .addAttributes(TransformAttributes.class) - .build(); + public static final VertexFormat INSTANCE_FORMAT = VertexFormat.builder() + .addAttributes(BasicAttributes.class) + .addAttributes(TransformAttributes.class) + .build(); - public TransformedModel(InstancedTileRenderer renderer, BufferBuilder buf) { - super(renderer, buf); - } + public TransformedModel(InstancedTileRenderer renderer, BufferBuilder buf) { + super(renderer, buf); + } - @Override - protected ModelData newInstance() { - return new ModelData(this); - } + @Override + protected ModelData newInstance() { + return new ModelData(this); + } - @Override - protected VertexFormat getInstanceFormat() { - return INSTANCE_FORMAT; - } + @Override + protected VertexFormat getInstanceFormat() { + return INSTANCE_FORMAT; + } } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/gl/BasicProgram.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/BasicProgram.java index 2087795b0..3cd58940f 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/gl/BasicProgram.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/BasicProgram.java @@ -11,48 +11,48 @@ import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.vector.Matrix4f; public class BasicProgram extends GlProgram { - protected final int uTime; - protected final int uViewProjection; - protected final int uDebug; - protected final int uCameraPos; + protected final int uTime; + protected final int uViewProjection; + protected final int uDebug; + protected final int uCameraPos; - protected final ProgramFogMode fogMode; + protected final ProgramFogMode fogMode; - protected int uBlockAtlas; - protected int uLightMap; + protected int uBlockAtlas; + protected int uLightMap; - public BasicProgram(ResourceLocation name, int handle, ProgramFogMode.Factory fogFactory) { - super(name, handle); - uTime = getUniformLocation("uTime"); - uViewProjection = getUniformLocation("uViewProjection"); - uDebug = getUniformLocation("uDebug"); - uCameraPos = getUniformLocation("uCameraPos"); + public BasicProgram(ResourceLocation name, int handle, ProgramFogMode.Factory fogFactory) { + super(name, handle); + uTime = getUniformLocation("uTime"); + uViewProjection = getUniformLocation("uViewProjection"); + uDebug = getUniformLocation("uDebug"); + uCameraPos = getUniformLocation("uCameraPos"); - fogMode = fogFactory.create(this); + fogMode = fogFactory.create(this); - bind(); - registerSamplers(); - unbind(); - } + bind(); + registerSamplers(); + unbind(); + } - protected void registerSamplers() { - uBlockAtlas = setSamplerBinding("uBlockAtlas", 0); - uLightMap = setSamplerBinding("uLightMap", 2); - } + protected void registerSamplers() { + uBlockAtlas = setSamplerBinding("uBlockAtlas", 0); + uLightMap = setSamplerBinding("uLightMap", 2); + } - public void bind(Matrix4f viewProjection, double camX, double camY, double camZ, int debugMode) { - super.bind(); + public void bind(Matrix4f viewProjection, double camX, double camY, double camZ, int debugMode) { + super.bind(); - GL20.glUniform1i(uDebug, debugMode); - GL20.glUniform1f(uTime, AnimationTickHolder.getRenderTime()); + GL20.glUniform1i(uDebug, debugMode); + GL20.glUniform1f(uTime, AnimationTickHolder.getRenderTime()); - uploadMatrixUniform(uViewProjection, viewProjection); - GL20.glUniform3f(uCameraPos, (float) camX, (float) camY, (float) camZ); + uploadMatrixUniform(uViewProjection, viewProjection); + GL20.glUniform3f(uCameraPos, (float) camX, (float) camY, (float) camZ); - fogMode.bind(); - } + fogMode.bind(); + } - protected static void uploadMatrixUniform(int uniform, Matrix4f mat) { - GL20.glUniformMatrix4fv(uniform, false, RenderUtil.writeMatrix(mat)); - } + protected static void uploadMatrixUniform(int uniform, Matrix4f mat) { + GL20.glUniformMatrix4fv(uniform, false, RenderUtil.writeMatrix(mat)); + } } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/gl/GlBuffer.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/GlBuffer.java index f39913ccd..6d045be02 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/gl/GlBuffer.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/GlBuffer.java @@ -9,40 +9,40 @@ import com.simibubi.create.foundation.render.backend.Backend; public class GlBuffer extends GlObject { - protected final int bufferType; + protected final int bufferType; - public GlBuffer(int bufferType) { - setHandle(GL20.glGenBuffers()); - this.bufferType = bufferType; - } + public GlBuffer(int bufferType) { + setHandle(GL20.glGenBuffers()); + this.bufferType = bufferType; + } - public int getBufferType() { - return bufferType; - } + public int getBufferType() { + return bufferType; + } - public void bind() { - GL20.glBindBuffer(bufferType, handle()); - } + public void bind() { + GL20.glBindBuffer(bufferType, handle()); + } - public void unbind() { - GL20.glBindBuffer(bufferType, 0); - } + public void unbind() { + GL20.glBindBuffer(bufferType, 0); + } - public void with(Consumer action) { - bind(); - action.accept(this); - unbind(); - } + public void with(Consumer action) { + bind(); + action.accept(this); + unbind(); + } - public void map(int length, Consumer upload) { - Backend.compat.mapBuffer(bufferType, 0, length, upload); - } + public void map(int length, Consumer upload) { + Backend.compat.mapBuffer(bufferType, 0, length, upload); + } - public void map(int offset, int length, Consumer upload) { - Backend.compat.mapBuffer(bufferType, offset, length, upload); - } + public void map(int offset, int length, Consumer upload) { + Backend.compat.mapBuffer(bufferType, offset, length, upload); + } - protected void deleteInternal(int handle) { - GL20.glDeleteBuffers(handle); - } + protected void deleteInternal(int handle) { + GL20.glDeleteBuffers(handle); + } } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/gl/GlFog.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/GlFog.java index 02172e02e..6dfab5be8 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/gl/GlFog.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/GlFog.java @@ -5,43 +5,43 @@ import org.lwjgl.opengl.GL11; import com.mojang.blaze3d.platform.GlStateManager; public class GlFog { - public static float[] FOG_COLOR = new float[] {0, 0, 0, 0}; + public static float[] FOG_COLOR = new float[]{0, 0, 0, 0}; - public static boolean fogEnabled() { - return GlStateManager.FOG.field_179049_a.field_179201_b; - } + public static boolean fogEnabled() { + return GlStateManager.FOG.field_179049_a.field_179201_b; + } - public static int getFogModeGlEnum() { - return GlStateManager.FOG.field_179047_b; - } + public static int getFogModeGlEnum() { + return GlStateManager.FOG.field_179047_b; + } - public static float getFogDensity() { - return GlStateManager.FOG.field_179048_c; - } + public static float getFogDensity() { + return GlStateManager.FOG.field_179048_c; + } - public static float getFogEnd() { - return GlStateManager.FOG.field_179046_e; - } + public static float getFogEnd() { + return GlStateManager.FOG.field_179046_e; + } - public static float getFogStart() { - return GlStateManager.FOG.field_179045_d; - } + public static float getFogStart() { + return GlStateManager.FOG.field_179045_d; + } - public static GlFogMode getFogMode() { - if (!fogEnabled()) { - return GlFogMode.NONE; - } + public static GlFogMode getFogMode() { + if (!fogEnabled()) { + return GlFogMode.NONE; + } - int mode = getFogModeGlEnum(); + int mode = getFogModeGlEnum(); - switch (mode) { - case GL11.GL_EXP2: - case GL11.GL_EXP: - return GlFogMode.EXP2; - case GL11.GL_LINEAR: - return GlFogMode.LINEAR; - default: - throw new UnsupportedOperationException("Unknown fog mode: " + mode); - } - } + switch (mode) { + case GL11.GL_EXP2: + case GL11.GL_EXP: + return GlFogMode.EXP2; + case GL11.GL_LINEAR: + return GlFogMode.LINEAR; + default: + throw new UnsupportedOperationException("Unknown fog mode: " + mode); + } + } } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/gl/GlFogMode.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/GlFogMode.java index ff35e7e12..eb333c732 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/gl/GlFogMode.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/GlFogMode.java @@ -7,31 +7,31 @@ import com.google.common.collect.Lists; import com.simibubi.create.foundation.render.backend.gl.shader.ProgramFogMode; public enum GlFogMode { - NONE(ProgramFogMode.None::new), - LINEAR(ProgramFogMode.Linear::new, "USE_FOG_LINEAR"), - EXP2(ProgramFogMode.Exp2::new, "USE_FOG_EXP2"), - ; + NONE(ProgramFogMode.None::new), + LINEAR(ProgramFogMode.Linear::new, "USE_FOG_LINEAR"), + EXP2(ProgramFogMode.Exp2::new, "USE_FOG_EXP2"), + ; - public static final String USE_FOG = "USE_FOG"; + public static final String USE_FOG = "USE_FOG"; - private final ProgramFogMode.Factory fogFactory; - private final List defines; + private final ProgramFogMode.Factory fogFactory; + private final List defines; - GlFogMode(ProgramFogMode.Factory fogFactory) { - this.fogFactory = fogFactory; - this.defines = Collections.emptyList(); - } + GlFogMode(ProgramFogMode.Factory fogFactory) { + this.fogFactory = fogFactory; + this.defines = Collections.emptyList(); + } - GlFogMode(ProgramFogMode.Factory fogFactory, String name) { - this.fogFactory = fogFactory; - this.defines = Lists.newArrayList(USE_FOG, name); - } + GlFogMode(ProgramFogMode.Factory fogFactory, String name) { + this.fogFactory = fogFactory; + this.defines = Lists.newArrayList(USE_FOG, name); + } - public List getDefines() { - return defines; - } + public List getDefines() { + return defines; + } - public ProgramFogMode.Factory getFogFactory() { - return fogFactory; - } + public ProgramFogMode.Factory getFogFactory() { + return fogFactory; + } } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/gl/GlObject.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/GlObject.java index ef34e5ebe..5bc642869 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/gl/GlObject.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/GlObject.java @@ -2,42 +2,42 @@ package com.simibubi.create.foundation.render.backend.gl; // Utility class for safely dealing with gl object handles. public abstract class GlObject { - private static final int INVALID_HANDLE = Integer.MIN_VALUE; + private static final int INVALID_HANDLE = Integer.MIN_VALUE; - private int handle = INVALID_HANDLE; + private int handle = INVALID_HANDLE; - protected final void setHandle(int handle) { - this.handle = handle; - } + protected final void setHandle(int handle) { + this.handle = handle; + } - public final int handle() { - this.checkHandle(); + public final int handle() { + this.checkHandle(); - return this.handle; - } + return this.handle; + } - protected final void checkHandle() { - if (!this.isHandleValid()) { - throw new IllegalStateException("Handle is not valid"); - } - } + protected final void checkHandle() { + if (!this.isHandleValid()) { + throw new IllegalStateException("Handle is not valid"); + } + } - protected final boolean isHandleValid() { - return this.handle != INVALID_HANDLE; - } + protected final boolean isHandleValid() { + return this.handle != INVALID_HANDLE; + } - protected final void invalidateHandle() { - this.handle = INVALID_HANDLE; - } + protected final void invalidateHandle() { + this.handle = INVALID_HANDLE; + } - public final void delete() { - if (!isHandleValid()) { - throw new IllegalStateException("Handle already deleted."); - } + public final void delete() { + if (!isHandleValid()) { + throw new IllegalStateException("Handle already deleted."); + } - deleteInternal(handle); - invalidateHandle(); - } + deleteInternal(handle); + invalidateHandle(); + } - protected abstract void deleteInternal(int handle); + protected abstract void deleteInternal(int handle); } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/gl/GlPrimitiveType.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/GlPrimitiveType.java index 1850b3670..da1d0efba 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/gl/GlPrimitiveType.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/GlPrimitiveType.java @@ -7,33 +7,33 @@ import net.minecraftforge.api.distmarker.OnlyIn; @OnlyIn(Dist.CLIENT) public enum GlPrimitiveType { - FLOAT(4, "float", GL11.GL_FLOAT), - UBYTE(1, "ubyte", GL11.GL_UNSIGNED_BYTE), - BYTE(1, "byte", GL11.GL_BYTE), - USHORT(2, "ushort", GL11.GL_UNSIGNED_SHORT), - SHORT(2, "short", GL11.GL_SHORT), - UINT(4, "uint", GL11.GL_UNSIGNED_INT), - INT(4, "int", GL11.GL_INT); + FLOAT(4, "float", GL11.GL_FLOAT), + UBYTE(1, "ubyte", GL11.GL_UNSIGNED_BYTE), + BYTE(1, "byte", GL11.GL_BYTE), + USHORT(2, "ushort", GL11.GL_UNSIGNED_SHORT), + SHORT(2, "short", GL11.GL_SHORT), + UINT(4, "uint", GL11.GL_UNSIGNED_INT), + INT(4, "int", GL11.GL_INT); - private final int size; - private final String displayName; - private final int glConstant; + private final int size; + private final String displayName; + private final int glConstant; - GlPrimitiveType(int bytes, String name, int glEnum) { - this.size = bytes; - this.displayName = name; - this.glConstant = glEnum; - } + GlPrimitiveType(int bytes, String name, int glEnum) { + this.size = bytes; + this.displayName = name; + this.glConstant = glEnum; + } - public int getSize() { - return this.size; - } + public int getSize() { + return this.size; + } - public String getDisplayName() { - return this.displayName; - } + public String getDisplayName() { + return this.displayName; + } - public int getGlConstant() { - return this.glConstant; - } -} \ No newline at end of file + public int getGlConstant() { + return this.glConstant; + } +} diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/gl/GlTexture.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/GlTexture.java index 30b5d3f0f..67fbd8dc5 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/gl/GlTexture.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/GlTexture.java @@ -3,23 +3,23 @@ package com.simibubi.create.foundation.render.backend.gl; import org.lwjgl.opengl.GL20; public class GlTexture extends GlObject { - private final int textureType; + private final int textureType; - public GlTexture(int textureType) { - this.textureType = textureType; - setHandle(GL20.glGenTextures()); - } + public GlTexture(int textureType) { + this.textureType = textureType; + setHandle(GL20.glGenTextures()); + } - @Override - protected void deleteInternal(int handle) { - GL20.glDeleteTextures(handle); - } + @Override + protected void deleteInternal(int handle) { + GL20.glDeleteTextures(handle); + } - public void bind() { - GL20.glBindTexture(textureType, handle()); - } + public void bind() { + GL20.glBindTexture(textureType, handle()); + } - public void unbind() { - GL20.glBindTexture(textureType, 0); - } + public void unbind() { + GL20.glBindTexture(textureType, 0); + } } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/gl/GlVertexArray.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/GlVertexArray.java index e4854990e..54bb20b81 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/gl/GlVertexArray.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/GlVertexArray.java @@ -5,25 +5,25 @@ import java.util.function.Consumer; import com.simibubi.create.foundation.render.backend.Backend; public class GlVertexArray extends GlObject { - public GlVertexArray() { - setHandle(Backend.compat.genVertexArrays()); - } + public GlVertexArray() { + setHandle(Backend.compat.genVertexArrays()); + } - public void bind() { - Backend.compat.bindVertexArray(handle()); - } + public void bind() { + Backend.compat.bindVertexArray(handle()); + } - public void unbind() { - Backend.compat.bindVertexArray(0); - } + public void unbind() { + Backend.compat.bindVertexArray(0); + } - public void with(Consumer action) { - bind(); - action.accept(this); - unbind(); - } + public void with(Consumer action) { + bind(); + action.accept(this); + unbind(); + } - protected void deleteInternal(int handle) { - Backend.compat.deleteVertexArrays(handle); - } + protected void deleteInternal(int handle) { + Backend.compat.deleteVertexArrays(handle); + } } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/gl/attrib/CommonAttributes.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/attrib/CommonAttributes.java index acc24f822..5c1a3a91a 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/gl/attrib/CommonAttributes.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/attrib/CommonAttributes.java @@ -4,18 +4,18 @@ import com.simibubi.create.foundation.render.backend.gl.GlPrimitiveType; public class CommonAttributes { - public static final VertexAttribSpec VEC4 = new VertexAttribSpec(GlPrimitiveType.FLOAT, 4); - public static final VertexAttribSpec VEC3 = new VertexAttribSpec(GlPrimitiveType.FLOAT, 3); - public static final VertexAttribSpec VEC2 = new VertexAttribSpec(GlPrimitiveType.FLOAT, 2); - public static final VertexAttribSpec FLOAT = new VertexAttribSpec(GlPrimitiveType.FLOAT, 1); + public static final VertexAttribSpec VEC4 = new VertexAttribSpec(GlPrimitiveType.FLOAT, 4); + public static final VertexAttribSpec VEC3 = new VertexAttribSpec(GlPrimitiveType.FLOAT, 3); + public static final VertexAttribSpec VEC2 = new VertexAttribSpec(GlPrimitiveType.FLOAT, 2); + public static final VertexAttribSpec FLOAT = new VertexAttribSpec(GlPrimitiveType.FLOAT, 1); - public static final VertexAttribSpec QUATERNION = new VertexAttribSpec(GlPrimitiveType.FLOAT, 4); - public static final VertexAttribSpec NORMAL = new VertexAttribSpec(GlPrimitiveType.BYTE, 3, true); - public static final VertexAttribSpec UV = new VertexAttribSpec(GlPrimitiveType.FLOAT, 2); + public static final VertexAttribSpec QUATERNION = new VertexAttribSpec(GlPrimitiveType.FLOAT, 4); + public static final VertexAttribSpec NORMAL = new VertexAttribSpec(GlPrimitiveType.BYTE, 3, true); + public static final VertexAttribSpec UV = new VertexAttribSpec(GlPrimitiveType.FLOAT, 2); - public static final VertexAttribSpec RGBA = new VertexAttribSpec(GlPrimitiveType.UBYTE, 4, true); - public static final VertexAttribSpec RGB = new VertexAttribSpec(GlPrimitiveType.UBYTE, 3, true); - public static final VertexAttribSpec LIGHT = new VertexAttribSpec(GlPrimitiveType.UBYTE, 2, true); + public static final VertexAttribSpec RGBA = new VertexAttribSpec(GlPrimitiveType.UBYTE, 4, true); + public static final VertexAttribSpec RGB = new VertexAttribSpec(GlPrimitiveType.UBYTE, 3, true); + public static final VertexAttribSpec LIGHT = new VertexAttribSpec(GlPrimitiveType.UBYTE, 2, true); - public static final VertexAttribSpec NORMALIZED_BYTE = new VertexAttribSpec(GlPrimitiveType.BYTE, 1, true); + public static final VertexAttribSpec NORMALIZED_BYTE = new VertexAttribSpec(GlPrimitiveType.BYTE, 1, true); } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/gl/attrib/IAttribSpec.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/attrib/IAttribSpec.java index 01f762f07..31369cd3f 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/gl/attrib/IAttribSpec.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/attrib/IAttribSpec.java @@ -2,9 +2,9 @@ package com.simibubi.create.foundation.render.backend.gl.attrib; public interface IAttribSpec { - void vertexAttribPointer(int stride, int index, int pointer); + void vertexAttribPointer(int stride, int index, int pointer); - int getSize(); + int getSize(); - int getAttributeCount(); + int getAttributeCount(); } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/gl/attrib/IVertexAttrib.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/attrib/IVertexAttrib.java index ee122db00..335ba8644 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/gl/attrib/IVertexAttrib.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/attrib/IVertexAttrib.java @@ -2,11 +2,11 @@ package com.simibubi.create.foundation.render.backend.gl.attrib; public interface IVertexAttrib { - String attribName(); + String attribName(); - IAttribSpec attribSpec(); + IAttribSpec attribSpec(); - int getDivisor(); + int getDivisor(); - int getBufferIndex(); + int getBufferIndex(); } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/gl/attrib/MatrixAttributes.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/attrib/MatrixAttributes.java index 22bbf16c9..0e57cf59f 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/gl/attrib/MatrixAttributes.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/attrib/MatrixAttributes.java @@ -5,33 +5,33 @@ import org.lwjgl.opengl.GL20; import com.simibubi.create.foundation.render.backend.gl.GlPrimitiveType; public enum MatrixAttributes implements IAttribSpec { - MAT3(3, 3), - MAT4(4, 4), - ; + MAT3(3, 3), + MAT4(4, 4), + ; - private final int rows; - private final int cols; + private final int rows; + private final int cols; - MatrixAttributes(int rows, int cols) { - this.rows = rows; - this.cols = cols; - } + MatrixAttributes(int rows, int cols) { + this.rows = rows; + this.cols = cols; + } - @Override - public void vertexAttribPointer(int stride, int index, int pointer) { - for (int i = 0; i < rows; i++) { - long attribPointer = pointer + (long) i * cols * GlPrimitiveType.FLOAT.getSize(); - GL20.glVertexAttribPointer(index + i, cols, GlPrimitiveType.FLOAT.getGlConstant(), false, stride, attribPointer); - } - } + @Override + public void vertexAttribPointer(int stride, int index, int pointer) { + for (int i = 0; i < rows; i++) { + long attribPointer = pointer + (long) i * cols * GlPrimitiveType.FLOAT.getSize(); + GL20.glVertexAttribPointer(index + i, cols, GlPrimitiveType.FLOAT.getGlConstant(), false, stride, attribPointer); + } + } - @Override - public int getSize() { - return GlPrimitiveType.FLOAT.getSize() * rows * cols; - } + @Override + public int getSize() { + return GlPrimitiveType.FLOAT.getSize() * rows * cols; + } - @Override - public int getAttributeCount() { - return rows; - } + @Override + public int getAttributeCount() { + return rows; + } } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/gl/attrib/VertexAttribSpec.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/attrib/VertexAttribSpec.java index 82cdac6fc..a9b451d01 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/gl/attrib/VertexAttribSpec.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/attrib/VertexAttribSpec.java @@ -6,36 +6,36 @@ import com.simibubi.create.foundation.render.backend.gl.GlPrimitiveType; public class VertexAttribSpec implements IAttribSpec { - private final GlPrimitiveType type; - private final int count; - private final int size; - private final int attributeCount; - private final boolean normalized; + private final GlPrimitiveType type; + private final int count; + private final int size; + private final int attributeCount; + private final boolean normalized; - public VertexAttribSpec(GlPrimitiveType type, int count) { - this(type, count, false); - } + public VertexAttribSpec(GlPrimitiveType type, int count) { + this(type, count, false); + } - public VertexAttribSpec(GlPrimitiveType type, int count, boolean normalized) { - this.type = type; - this.count = count; - this.size = type.getSize() * count; - this.attributeCount = (this.size + 15) / 16; // ceiling division. GLSL vertex attributes can only be 16 bytes wide - this.normalized = normalized; - } + public VertexAttribSpec(GlPrimitiveType type, int count, boolean normalized) { + this.type = type; + this.count = count; + this.size = type.getSize() * count; + this.attributeCount = (this.size + 15) / 16; // ceiling division. GLSL vertex attributes can only be 16 bytes wide + this.normalized = normalized; + } - @Override - public void vertexAttribPointer(int stride, int index, int pointer) { - GL20.glVertexAttribPointer(index, count, type.getGlConstant(), normalized, stride, pointer); - } + @Override + public void vertexAttribPointer(int stride, int index, int pointer) { + GL20.glVertexAttribPointer(index, count, type.getGlConstant(), normalized, stride, pointer); + } - @Override - public int getSize() { - return size; - } + @Override + public int getSize() { + return size; + } - @Override - public int getAttributeCount() { - return attributeCount; - } + @Override + public int getAttributeCount() { + return attributeCount; + } } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/gl/attrib/VertexFormat.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/attrib/VertexFormat.java index 4541a9205..9a3fc8601 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/gl/attrib/VertexFormat.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/attrib/VertexFormat.java @@ -5,61 +5,61 @@ import java.util.Arrays; public class VertexFormat { - private final ArrayList allAttributes; + private final ArrayList allAttributes; - private final int numAttributes; - private final int stride; + private final int numAttributes; + private final int stride; - public VertexFormat(ArrayList allAttributes) { - this.allAttributes = allAttributes; + public VertexFormat(ArrayList allAttributes) { + this.allAttributes = allAttributes; - int numAttributes = 0, stride = 0; - for (IVertexAttrib attrib : allAttributes) { - IAttribSpec spec = attrib.attribSpec(); - numAttributes += spec.getAttributeCount(); - stride += spec.getSize(); - } - this.numAttributes = numAttributes; - this.stride = stride; - } + int numAttributes = 0, stride = 0; + for (IVertexAttrib attrib : allAttributes) { + IAttribSpec spec = attrib.attribSpec(); + numAttributes += spec.getAttributeCount(); + stride += spec.getSize(); + } + this.numAttributes = numAttributes; + this.stride = stride; + } - public int getShaderAttributeCount() { - return numAttributes; - } + public int getShaderAttributeCount() { + return numAttributes; + } - public int getStride() { - return stride; - } + public int getStride() { + return stride; + } - public void vertexAttribPointers(int index) { - int offset = 0; - for (IVertexAttrib attrib : this.allAttributes) { - IAttribSpec spec = attrib.attribSpec(); - spec.vertexAttribPointer(stride, index, offset); - index += spec.getAttributeCount(); - offset += spec.getSize(); - } - } + public void vertexAttribPointers(int index) { + int offset = 0; + for (IVertexAttrib attrib : this.allAttributes) { + IAttribSpec spec = attrib.attribSpec(); + spec.vertexAttribPointer(stride, index, offset); + index += spec.getAttributeCount(); + offset += spec.getSize(); + } + } - public static Builder builder() { - return new Builder(); - } + public static Builder builder() { + return new Builder(); + } - public static class Builder { - private final ArrayList allAttributes; + public static class Builder { + private final ArrayList allAttributes; - public Builder() { - allAttributes = new ArrayList<>(); - } + public Builder() { + allAttributes = new ArrayList<>(); + } - public & IVertexAttrib> Builder addAttributes(Class attribEnum) { - allAttributes.addAll(Arrays.asList(attribEnum.getEnumConstants())); - return this; - } + public & IVertexAttrib> Builder addAttributes(Class attribEnum) { + allAttributes.addAll(Arrays.asList(attribEnum.getEnumConstants())); + return this; + } - public VertexFormat build() { - return new VertexFormat(allAttributes); - } - } + public VertexFormat build() { + return new VertexFormat(allAttributes); + } + } } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/FogSensitiveProgram.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/FogSensitiveProgram.java index 426dbc4ac..9e43e520b 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/FogSensitiveProgram.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/FogSensitiveProgram.java @@ -7,20 +7,20 @@ import com.simibubi.create.foundation.render.backend.gl.GlFogMode; public class FogSensitiveProgram

implements IMultiProgram

{ - private final Map programs; + private final Map programs; - public FogSensitiveProgram(Map programs) { - this.programs = programs; - } + public FogSensitiveProgram(Map programs) { + this.programs = programs; + } - @Override - public P get() { - return programs.get(GlFog.getFogMode()); - } + @Override + public P get() { + return programs.get(GlFog.getFogMode()); + } - @Override - public void delete() { - programs.values().forEach(GlProgram::delete); - } + @Override + public void delete() { + programs.values().forEach(GlProgram::delete); + } } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/GLSLType.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/GLSLType.java index 80dc2fa16..30037b7c2 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/GLSLType.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/GLSLType.java @@ -3,43 +3,43 @@ package com.simibubi.create.foundation.render.backend.gl.shader; import com.simibubi.create.foundation.render.backend.gl.GlPrimitiveType; public class GLSLType { - public static final GLSLType FLOAT = new GLSLType("mat4", GlPrimitiveType.FLOAT, 16); - public static final GLSLType VEC2 = new GLSLType("vec4", GlPrimitiveType.FLOAT, 4); - public static final GLSLType VEC3 = new GLSLType("vec3", GlPrimitiveType.FLOAT, 3); - public static final GLSLType VEC4 = new GLSLType("vec2", GlPrimitiveType.FLOAT, 2); - public static final GLSLType MAT4 = new GLSLType("float", GlPrimitiveType.FLOAT, 1); + public static final GLSLType FLOAT = new GLSLType("mat4", GlPrimitiveType.FLOAT, 16); + public static final GLSLType VEC2 = new GLSLType("vec4", GlPrimitiveType.FLOAT, 4); + public static final GLSLType VEC3 = new GLSLType("vec3", GlPrimitiveType.FLOAT, 3); + public static final GLSLType VEC4 = new GLSLType("vec2", GlPrimitiveType.FLOAT, 2); + public static final GLSLType MAT4 = new GLSLType("float", GlPrimitiveType.FLOAT, 1); - private final String symbol; - private final GlPrimitiveType base; - private final int count; - private final int size; - private final int attributeCount; + private final String symbol; + private final GlPrimitiveType base; + private final int count; + private final int size; + private final int attributeCount; - public GLSLType(String symbol, GlPrimitiveType base, int count) { - this.symbol = symbol; - this.base = base; - this.count = count; - this.size = base.getSize() * count; - this.attributeCount = (this.size + 15) / 16; // ceiling division. GLSL vertex attributes can only be 16 bytes wide - } + public GLSLType(String symbol, GlPrimitiveType base, int count) { + this.symbol = symbol; + this.base = base; + this.count = count; + this.size = base.getSize() * count; + this.attributeCount = (this.size + 15) / 16; // ceiling division. GLSL vertex attributes can only be 16 bytes wide + } - public String getSymbol() { - return symbol; - } + public String getSymbol() { + return symbol; + } - public GlPrimitiveType getBase() { - return base; - } + public GlPrimitiveType getBase() { + return base; + } - public int getCount() { - return count; - } + public int getCount() { + return count; + } - public int getSize() { - return size; - } + public int getSize() { + return size; + } - public int getAttributeCount() { - return attributeCount; - } + public int getAttributeCount() { + return attributeCount; + } } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/GlProgram.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/GlProgram.java index 56dce3fd8..007d94d44 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/GlProgram.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/GlProgram.java @@ -11,117 +11,119 @@ import net.minecraft.util.ResourceLocation; public abstract class GlProgram extends GlObject { - public final ResourceLocation name; + public final ResourceLocation name; - protected GlProgram(ResourceLocation name, int handle) { - setHandle(handle); - this.name = name; - } + protected GlProgram(ResourceLocation name, int handle) { + setHandle(handle); + this.name = name; + } - public static Builder builder(ResourceLocation name, GlFogMode fogMode) { - return new Builder(name, fogMode); - } + public static Builder builder(ResourceLocation name, GlFogMode fogMode) { + return new Builder(name, fogMode); + } - public void bind() { - GL20.glUseProgram(handle()); - } + public void bind() { + GL20.glUseProgram(handle()); + } - public void unbind() { - GL20.glUseProgram(0); - } + public void unbind() { + GL20.glUseProgram(0); + } - /** - * Retrieves the index of the uniform with the given name. - * @param uniform The name of the uniform to find the index of - * @return The uniform's index - */ - public int getUniformLocation(String uniform) { - int index = GL20.glGetUniformLocation(this.handle(), uniform); + /** + * Retrieves the index of the uniform with the given name. + * + * @param uniform The name of the uniform to find the index of + * @return The uniform's index + */ + public int getUniformLocation(String uniform) { + int index = GL20.glGetUniformLocation(this.handle(), uniform); - if (index < 0) { - Backend.log.debug("No active uniform '{}' exists in program '{}'. Could be unused.", uniform, this.name); - } + if (index < 0) { + Backend.log.debug("No active uniform '{}' exists in program '{}'. Could be unused.", uniform, this.name); + } - return index; - } + return index; + } - /** - * Binds a sampler uniform to the given texture unit. - * @param name The name of the sampler uniform. - * @param binding The index of the texture unit. - * @return The sampler uniform's index. - * @throws NullPointerException If no uniform exists with the given name. - */ - public int setSamplerBinding(String name, int binding) { - int samplerUniform = getUniformLocation(name); + /** + * Binds a sampler uniform to the given texture unit. + * + * @param name The name of the sampler uniform. + * @param binding The index of the texture unit. + * @return The sampler uniform's index. + * @throws NullPointerException If no uniform exists with the given name. + */ + public int setSamplerBinding(String name, int binding) { + int samplerUniform = getUniformLocation(name); - if (samplerUniform >= 0) { - GL20.glUniform1i(samplerUniform, binding); - } + if (samplerUniform >= 0) { + GL20.glUniform1i(samplerUniform, binding); + } - return samplerUniform; - } + return samplerUniform; + } - @Override - protected void deleteInternal(int handle) { - GL20.glDeleteProgram(handle); - } + @Override + protected void deleteInternal(int handle) { + GL20.glDeleteProgram(handle); + } - public static class Builder { - private final ResourceLocation name; - private final int program; - private final GlFogMode fogMode; + public static class Builder { + private final ResourceLocation name; + private final int program; + private final GlFogMode fogMode; - private int attributeIndex; + private int attributeIndex; - public Builder(ResourceLocation name, GlFogMode fogMode) { - this.name = name; - this.program = GL20.glCreateProgram(); - this.fogMode = fogMode; - } + public Builder(ResourceLocation name, GlFogMode fogMode) { + this.name = name; + this.program = GL20.glCreateProgram(); + this.fogMode = fogMode; + } - public Builder attachShader(GlShader shader) { - GL20.glAttachShader(this.program, shader.handle()); + public Builder attachShader(GlShader shader) { + GL20.glAttachShader(this.program, shader.handle()); - return this; - } + return this; + } - public Builder addAttribute(A attrib) { - GL20.glBindAttribLocation(this.program, attributeIndex, attrib.attribName()); - attributeIndex += attrib.attribSpec().getAttributeCount(); - return this; - } + public Builder addAttribute(A attrib) { + GL20.glBindAttribLocation(this.program, attributeIndex, attrib.attribName()); + attributeIndex += attrib.attribSpec().getAttributeCount(); + return this; + } - /** - * Links the attached shaders to this program and returns a user-defined container which wraps the shader - * program. This container can, for example, provide methods for updating the specific uniforms of that shader - * set. - * - * @param factory The factory which will create the shader program's container - * @param

The type which should be instantiated with the new program's handle - * @return An instantiated shader container as provided by the factory - */ - public

P build(ProgramFactory

factory) { - GL20.glLinkProgram(this.program); + /** + * Links the attached shaders to this program and returns a user-defined container which wraps the shader + * program. This container can, for example, provide methods for updating the specific uniforms of that shader + * set. + * + * @param factory The factory which will create the shader program's container + * @param

The type which should be instantiated with the new program's handle + * @return An instantiated shader container as provided by the factory + */ + public

P build(ProgramFactory

factory) { + GL20.glLinkProgram(this.program); - String log = GL20.glGetProgramInfoLog(this.program); + String log = GL20.glGetProgramInfoLog(this.program); - if (!log.isEmpty()) { - Backend.log.debug("Program link log for " + this.name + ": " + log); - } + if (!log.isEmpty()) { + Backend.log.debug("Program link log for " + this.name + ": " + log); + } - int result = GL20.glGetProgrami(this.program, GL20.GL_LINK_STATUS); + int result = GL20.glGetProgrami(this.program, GL20.GL_LINK_STATUS); - if (result != GL20.GL_TRUE) { - throw new RuntimeException("Shader program linking failed, see log for details"); - } + if (result != GL20.GL_TRUE) { + throw new RuntimeException("Shader program linking failed, see log for details"); + } - return factory.create(this.name, this.program, this.fogMode.getFogFactory()); - } - } + return factory.create(this.name, this.program, this.fogMode.getFogFactory()); + } + } - @FunctionalInterface - public interface ProgramFactory

{ - P create(ResourceLocation name, int handle, ProgramFogMode.Factory fogFactory); - } + @FunctionalInterface + public interface ProgramFactory

{ + P create(ResourceLocation name, int handle, ProgramFogMode.Factory fogFactory); + } } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/GlShader.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/GlShader.java index dc54e425b..208b3843d 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/GlShader.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/GlShader.java @@ -10,41 +10,41 @@ import net.minecraft.util.ResourceLocation; public class GlShader extends GlObject { - public final ResourceLocation name; - public final ShaderType type; + public final ResourceLocation name; + public final ShaderType type; - public GlShader(ShaderType type, ResourceLocation name, String source) { - this.type = type; - this.name = name; - int handle = GL20.glCreateShader(type.glEnum); + public GlShader(ShaderType type, ResourceLocation name, String source) { + this.type = type; + this.name = name; + int handle = GL20.glCreateShader(type.glEnum); - GlCompat.safeShaderSource(handle, source); - GL20.glCompileShader(handle); + GlCompat.safeShaderSource(handle, source); + GL20.glCompileShader(handle); - String log = GL20.glGetShaderInfoLog(handle); + String log = GL20.glGetShaderInfoLog(handle); - if (!log.isEmpty()) { - Backend.log.error("Shader compilation log for " + name + ": " + log); - } + if (!log.isEmpty()) { + Backend.log.error("Shader compilation log for " + name + ": " + log); + } - if (GL20.glGetShaderi(handle, GL20.GL_COMPILE_STATUS) != GL20.GL_TRUE) { - throw new RuntimeException("Could not compile shader. See log for details."); - } + if (GL20.glGetShaderi(handle, GL20.GL_COMPILE_STATUS) != GL20.GL_TRUE) { + throw new RuntimeException("Could not compile shader. See log for details."); + } - setHandle(handle); - } + setHandle(handle); + } - @Override - protected void deleteInternal(int handle) { - GL20.glDeleteShader(handle); - } + @Override + protected void deleteInternal(int handle) { + GL20.glDeleteShader(handle); + } - @FunctionalInterface - public interface PreProcessor { - String process(String source); + @FunctionalInterface + public interface PreProcessor { + String process(String source); - default PreProcessor andThen(PreProcessor that) { - return source -> that.process(this.process(source)); - } - } + default PreProcessor andThen(PreProcessor that) { + return source -> that.process(this.process(source)); + } + } } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/IMultiProgram.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/IMultiProgram.java index 0fdf6cc7d..072c8ab31 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/IMultiProgram.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/IMultiProgram.java @@ -10,6 +10,7 @@ public interface IMultiProgram

{ /** * Get the shader program most suited for the current game state. + * * @return The one true program. */ P get(); diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/ProgramFogMode.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/ProgramFogMode.java index b614601fb..f0cb24123 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/ProgramFogMode.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/ProgramFogMode.java @@ -6,53 +6,53 @@ import com.simibubi.create.foundation.render.backend.gl.GlFog; public abstract class ProgramFogMode { - public abstract void bind(); + public abstract void bind(); - public static class None extends ProgramFogMode { + public static class None extends ProgramFogMode { - public None(GlProgram program) { + public None(GlProgram program) { - } + } - @Override - public void bind() { + @Override + public void bind() { - } - } + } + } - public static class Linear extends ProgramFogMode { - private final int uFogColor; - private final int uFogRange; + public static class Linear extends ProgramFogMode { + private final int uFogColor; + private final int uFogRange; - public Linear(GlProgram program) { - this.uFogColor = program.getUniformLocation("uFogColor"); - this.uFogRange = program.getUniformLocation("uFogRange"); - } + public Linear(GlProgram program) { + this.uFogColor = program.getUniformLocation("uFogColor"); + this.uFogRange = program.getUniformLocation("uFogRange"); + } - @Override - public void bind() { - GL20.glUniform2f(uFogRange, GlFog.getFogStart(), GlFog.getFogEnd()); - GL20.glUniform4fv(uFogColor, GlFog.FOG_COLOR); - } - } + @Override + public void bind() { + GL20.glUniform2f(uFogRange, GlFog.getFogStart(), GlFog.getFogEnd()); + GL20.glUniform4fv(uFogColor, GlFog.FOG_COLOR); + } + } - public static class Exp2 extends ProgramFogMode { - private final int uFogColor; - private final int uFogDensity; + public static class Exp2 extends ProgramFogMode { + private final int uFogColor; + private final int uFogDensity; - public Exp2(GlProgram program) { - this.uFogColor = program.getUniformLocation("uFogColor"); - this.uFogDensity = program.getUniformLocation("uFogDensity"); - } + public Exp2(GlProgram program) { + this.uFogColor = program.getUniformLocation("uFogColor"); + this.uFogDensity = program.getUniformLocation("uFogDensity"); + } - @Override - public void bind() { - GL20.glUniform1f(uFogDensity, GlFog.getFogDensity()); - GL20.glUniform4fv(uFogColor, GlFog.FOG_COLOR); - } - } + @Override + public void bind() { + GL20.glUniform1f(uFogDensity, GlFog.getFogDensity()); + GL20.glUniform4fv(uFogColor, GlFog.FOG_COLOR); + } + } - public interface Factory { - ProgramFogMode create(GlProgram program); - } + public interface Factory { + ProgramFogMode create(GlProgram program); + } } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/ProgramSpec.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/ProgramSpec.java index 26c3b0eb2..354649175 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/ProgramSpec.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/ProgramSpec.java @@ -10,75 +10,75 @@ import net.minecraft.util.ResourceLocation; public class ProgramSpec

{ - public final ResourceLocation name; - public final ResourceLocation vert; - public final ResourceLocation frag; + public final ResourceLocation name; + public final ResourceLocation vert; + public final ResourceLocation frag; - public final ShaderConstants defines; + public final ShaderConstants defines; - public final GlProgram.ProgramFactory

factory; + public final GlProgram.ProgramFactory

factory; - public final ArrayList attributes; + public final ArrayList attributes; - public final boolean fogSensitive; + public final boolean fogSensitive; - public static

Builder

builder(String name, GlProgram.ProgramFactory

factory) { - return builder(new ResourceLocation(Create.ID, name), factory); - } + public static

Builder

builder(String name, GlProgram.ProgramFactory

factory) { + return builder(new ResourceLocation(Create.ID, name), factory); + } - public static

Builder

builder(ResourceLocation name, GlProgram.ProgramFactory

factory) { - return new Builder<>(name, factory); - } + public static

Builder

builder(ResourceLocation name, GlProgram.ProgramFactory

factory) { + return new Builder<>(name, factory); + } - public ProgramSpec(ResourceLocation name, ResourceLocation vert, ResourceLocation frag, GlProgram.ProgramFactory

factory, ShaderConstants defines, ArrayList attributes, boolean fogSensitive) { - this.name = name; - this.vert = vert; - this.frag = frag; - this.defines = defines; + public ProgramSpec(ResourceLocation name, ResourceLocation vert, ResourceLocation frag, GlProgram.ProgramFactory

factory, ShaderConstants defines, ArrayList attributes, boolean fogSensitive) { + this.name = name; + this.vert = vert; + this.frag = frag; + this.defines = defines; - this.factory = factory; - this.attributes = attributes; + this.factory = factory; + this.attributes = attributes; this.fogSensitive = fogSensitive; } - public ResourceLocation getVert() { - return vert; - } + public ResourceLocation getVert() { + return vert; + } - public ResourceLocation getFrag() { - return frag; - } + public ResourceLocation getFrag() { + return frag; + } - public static class Builder

{ - private ResourceLocation vert; - private ResourceLocation frag; - private ShaderConstants defines = ShaderConstants.EMPTY; - private boolean fogSensitive = true; + public static class Builder

{ + private ResourceLocation vert; + private ResourceLocation frag; + private ShaderConstants defines = ShaderConstants.EMPTY; + private boolean fogSensitive = true; - private final ResourceLocation name; - private final GlProgram.ProgramFactory

factory; - private final ArrayList attributes; + private final ResourceLocation name; + private final GlProgram.ProgramFactory

factory; + private final ArrayList attributes; - public Builder(ResourceLocation name, GlProgram.ProgramFactory

factory) { - this.name = name; - this.factory = factory; - attributes = new ArrayList<>(); - } + public Builder(ResourceLocation name, GlProgram.ProgramFactory

factory) { + this.name = name; + this.factory = factory; + attributes = new ArrayList<>(); + } - public Builder

setVert(ResourceLocation vert) { - this.vert = vert; - return this; - } + public Builder

setVert(ResourceLocation vert) { + this.vert = vert; + return this; + } - public Builder

setFrag(ResourceLocation frag) { - this.frag = frag; - return this; - } + public Builder

setFrag(ResourceLocation frag) { + this.frag = frag; + return this; + } - public Builder

setDefines(ShaderConstants defines) { - this.defines = defines; - return this; - } + public Builder

setDefines(ShaderConstants defines) { + this.defines = defines; + return this; + } public Builder

setFogSensitive(boolean fogSensitive) { this.fogSensitive = fogSensitive; @@ -86,12 +86,12 @@ public class ProgramSpec

{ } public & IVertexAttrib> Builder

addAttributes(Class attributeEnum) { - attributes.addAll(Arrays.asList(attributeEnum.getEnumConstants())); - return this; - } + attributes.addAll(Arrays.asList(attributeEnum.getEnumConstants())); + return this; + } - public ProgramSpec

createProgramSpec() { - return new ProgramSpec<>(name, vert, frag, factory, defines, attributes, fogSensitive); - } - } + public ProgramSpec

createProgramSpec() { + return new ProgramSpec<>(name, vert, frag, factory, defines, attributes, fogSensitive); + } + } } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/ShaderCallback.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/ShaderCallback.java index b410d91ff..e6e17c096 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/ShaderCallback.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/ShaderCallback.java @@ -6,12 +6,12 @@ package com.simibubi.create.foundation.render.backend.gl.shader; @FunctionalInterface public interface ShaderCallback

{ - void call(P program); + void call(P program); - default ShaderCallback

andThen(ShaderCallback

other) { - return program -> { - call(program); - other.call(program); - }; - } + default ShaderCallback

andThen(ShaderCallback

other) { + return program -> { + call(program); + other.call(program); + }; + } } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/ShaderConstants.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/ShaderConstants.java index 0ff228099..3d1780628 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/ShaderConstants.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/ShaderConstants.java @@ -10,50 +10,50 @@ import java.util.stream.Stream; import com.google.common.collect.Lists; public class ShaderConstants implements GlShader.PreProcessor { - public static final ShaderConstants EMPTY = new ShaderConstants(); + public static final ShaderConstants EMPTY = new ShaderConstants(); - private final ArrayList defines; + private final ArrayList defines; - public ShaderConstants() { - defines = new ArrayList<>(); - } + public ShaderConstants() { + defines = new ArrayList<>(); + } - public ShaderConstants(ShaderConstants other) { - this.defines = Lists.newArrayList(other.defines); - } + public ShaderConstants(ShaderConstants other) { + this.defines = Lists.newArrayList(other.defines); + } - public static ShaderConstants define(String def) { - return new ShaderConstants().def(def); - } + public static ShaderConstants define(String def) { + return new ShaderConstants().def(def); + } - public ShaderConstants def(String def) { - defines.add(def); - return this; - } + public ShaderConstants def(String def) { + defines.add(def); + return this; + } - public ShaderConstants defineAll(Collection defines) { - this.defines.addAll(defines); - return this; - } + public ShaderConstants defineAll(Collection defines) { + this.defines.addAll(defines); + return this; + } - public ArrayList getDefines() { - return defines; - } + public ArrayList getDefines() { + return defines; + } - public Stream directives() { - return defines.stream().map(it -> "#define " + it); - } + public Stream directives() { + return defines.stream().map(it -> "#define " + it); + } - @Override - public String process(String source) { - return new BufferedReader(new StringReader(source)).lines().flatMap(line -> { - Stream map = Stream.of(line); + @Override + public String process(String source) { + return new BufferedReader(new StringReader(source)).lines().flatMap(line -> { + Stream map = Stream.of(line); - if (line.startsWith("#version")) { - map = Stream.concat(map, directives()); - } + if (line.startsWith("#version")) { + map = Stream.concat(map, directives()); + } - return map; - }).collect(Collectors.joining("\n")); - } + return map; + }).collect(Collectors.joining("\n")); + } } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/ShaderType.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/ShaderType.java index b90f15cca..63be397f2 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/ShaderType.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/ShaderType.java @@ -3,13 +3,13 @@ package com.simibubi.create.foundation.render.backend.gl.shader; import org.lwjgl.opengl.GL20; public enum ShaderType { - VERTEX(GL20.GL_VERTEX_SHADER), - FRAGMENT(GL20.GL_FRAGMENT_SHADER), - ; + VERTEX(GL20.GL_VERTEX_SHADER), + FRAGMENT(GL20.GL_FRAGMENT_SHADER), + ; - public final int glEnum; + public final int glEnum; - ShaderType(int glEnum) { - this.glEnum = glEnum; - } + ShaderType(int glEnum) { + this.glEnum = glEnum; + } } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/gl/versioned/DrawInstanced.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/versioned/DrawInstanced.java index d8cca0eb5..166bd919c 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/gl/versioned/DrawInstanced.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/versioned/DrawInstanced.java @@ -6,52 +6,50 @@ import org.lwjgl.opengl.GL31; import org.lwjgl.opengl.GLCapabilities; public enum DrawInstanced implements GlVersioned { - GL31_DRAW_INSTANCED { - @Override - public boolean supported(GLCapabilities caps) { - return caps.OpenGL31; - } + GL31_DRAW_INSTANCED { + @Override + public boolean supported(GLCapabilities caps) { + return caps.OpenGL31; + } - @Override - public void drawArraysInstanced(int mode, int first, int count, int primcount) { - GL31.glDrawArraysInstanced(mode, first, count, primcount); - } - }, - ARB_DRAW_INSTANCED { - @Override - public boolean supported(GLCapabilities caps) { - return caps.GL_ARB_draw_instanced; - } + @Override + public void drawArraysInstanced(int mode, int first, int count, int primcount) { + GL31.glDrawArraysInstanced(mode, first, count, primcount); + } + }, + ARB_DRAW_INSTANCED { + @Override + public boolean supported(GLCapabilities caps) { + return caps.GL_ARB_draw_instanced; + } - @Override - public void drawArraysInstanced(int mode, int first, int count, int primcount) { - ARBDrawInstanced.glDrawArraysInstancedARB(mode, first, count, primcount); - } - }, - EXT_DRAW_INSTANCED { - @Override - public boolean supported(GLCapabilities caps) { - return caps.GL_EXT_draw_instanced; - } + @Override + public void drawArraysInstanced(int mode, int first, int count, int primcount) { + ARBDrawInstanced.glDrawArraysInstancedARB(mode, first, count, primcount); + } + }, + EXT_DRAW_INSTANCED { + @Override + public boolean supported(GLCapabilities caps) { + return caps.GL_EXT_draw_instanced; + } - @Override - public void drawArraysInstanced(int mode, int first, int count, int primcount) { - EXTDrawInstanced.glDrawArraysInstancedEXT(mode, first, count, primcount); - } - }, - UNSUPPORTED { - @Override - public boolean supported(GLCapabilities caps) { - return true; - } + @Override + public void drawArraysInstanced(int mode, int first, int count, int primcount) { + EXTDrawInstanced.glDrawArraysInstancedEXT(mode, first, count, primcount); + } + }, + UNSUPPORTED { + @Override + public boolean supported(GLCapabilities caps) { + return true; + } - @Override - public void drawArraysInstanced(int mode, int first, int count, int primcount) { - throw new UnsupportedOperationException(); - } - } + @Override + public void drawArraysInstanced(int mode, int first, int count, int primcount) { + throw new UnsupportedOperationException(); + } + }; - ; - - public abstract void drawArraysInstanced(int mode, int first, int count, int primcount); + public abstract void drawArraysInstanced(int mode, int first, int count, int primcount); } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/gl/versioned/GlCompat.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/versioned/GlCompat.java index 1c152fce3..59b2771ee 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/gl/versioned/GlCompat.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/versioned/GlCompat.java @@ -13,109 +13,109 @@ import org.lwjgl.system.MemoryUtil; /** * An instance of this class stores information * about what OpenGL features are available. - * + *

* Each field stores an enum variant that provides access to the * most appropriate version of a feature for the current system. */ public class GlCompat { - public final MapBuffer mapBuffer; + public final MapBuffer mapBuffer; - public final VertexArrayObject vertexArrayObject; - public final InstancedArrays instancedArrays; - public final DrawInstanced drawInstanced; + public final VertexArrayObject vertexArrayObject; + public final InstancedArrays instancedArrays; + public final DrawInstanced drawInstanced; - public final RGPixelFormat pixelFormat; + public final RGPixelFormat pixelFormat; - public GlCompat(GLCapabilities caps) { - mapBuffer = getLatest(MapBuffer.class, caps); + public GlCompat(GLCapabilities caps) { + mapBuffer = getLatest(MapBuffer.class, caps); - vertexArrayObject = getLatest(VertexArrayObject.class, caps); - instancedArrays = getLatest(InstancedArrays.class, caps); - drawInstanced = getLatest(DrawInstanced.class, caps); + vertexArrayObject = getLatest(VertexArrayObject.class, caps); + instancedArrays = getLatest(InstancedArrays.class, caps); + drawInstanced = getLatest(DrawInstanced.class, caps); - pixelFormat = getLatest(RGPixelFormat.class, caps); - } + pixelFormat = getLatest(RGPixelFormat.class, caps); + } - public void mapBuffer(int target, int offset, int length, Consumer upload) { - mapBuffer.mapBuffer(target, offset, length, upload); - } + public void mapBuffer(int target, int offset, int length, Consumer upload) { + mapBuffer.mapBuffer(target, offset, length, upload); + } - public void vertexAttribDivisor(int index, int divisor) { - instancedArrays.vertexAttribDivisor(index, divisor); - } + public void vertexAttribDivisor(int index, int divisor) { + instancedArrays.vertexAttribDivisor(index, divisor); + } - public void drawArraysInstanced(int mode, int first, int count, int primcount) { - drawInstanced.drawArraysInstanced(mode, first, count, primcount); - } + public void drawArraysInstanced(int mode, int first, int count, int primcount) { + drawInstanced.drawArraysInstanced(mode, first, count, primcount); + } - public int genVertexArrays() { - return vertexArrayObject.genVertexArrays(); - } + public int genVertexArrays() { + return vertexArrayObject.genVertexArrays(); + } - public void deleteVertexArrays(int array) { - vertexArrayObject.deleteVertexArrays(array); - } + public void deleteVertexArrays(int array) { + vertexArrayObject.deleteVertexArrays(array); + } - public void bindVertexArray(int array) { - vertexArrayObject.bindVertexArray(array); - } + public void bindVertexArray(int array) { + vertexArrayObject.bindVertexArray(array); + } - public boolean vertexArrayObjectsSupported() { - return vertexArrayObject != VertexArrayObject.UNSUPPORTED; - } + public boolean vertexArrayObjectsSupported() { + return vertexArrayObject != VertexArrayObject.UNSUPPORTED; + } - public boolean instancedArraysSupported() { - return instancedArrays != InstancedArrays.UNSUPPORTED; - } + public boolean instancedArraysSupported() { + return instancedArrays != InstancedArrays.UNSUPPORTED; + } - public boolean drawInstancedSupported() { - return drawInstanced != DrawInstanced.UNSUPPORTED; - } + public boolean drawInstancedSupported() { + return drawInstanced != DrawInstanced.UNSUPPORTED; + } - /** - * Get the most compatible version of a specific OpenGL feature by iterating over enum constants in order. - * - * @param clazz The class of the versioning enum. - * @param caps The current system's supported features. - * @param The type of the versioning enum. - * @return The first defined enum variant to return true. - */ - public static & GlVersioned> V getLatest(Class clazz, GLCapabilities caps) { - V[] constants = clazz.getEnumConstants(); - V last = constants[constants.length - 1]; - if (!last.supported(caps)) { - throw new IllegalStateException(""); - } + /** + * Get the most compatible version of a specific OpenGL feature by iterating over enum constants in order. + * + * @param clazz The class of the versioning enum. + * @param caps The current system's supported features. + * @param The type of the versioning enum. + * @return The first defined enum variant to return true. + */ + public static & GlVersioned> V getLatest(Class clazz, GLCapabilities caps) { + V[] constants = clazz.getEnumConstants(); + V last = constants[constants.length - 1]; + if (!last.supported(caps)) { + throw new IllegalStateException(""); + } - return Arrays.stream(constants).filter(it -> it.supported(caps)).findFirst().get(); - } + return Arrays.stream(constants).filter(it -> it.supported(caps)).findFirst().get(); + } - /** - * Copied from: - *
https://github.com/grondag/canvas/commit/820bf754092ccaf8d0c169620c2ff575722d7d96 - * - *

Identical in function to {@link GL20C#glShaderSource(int, CharSequence)} but - * passes a null pointer for string length to force the driver to rely on the null - * terminator for string length. This is a workaround for an apparent flaw with some - * AMD drivers that don't receive or interpret the length correctly, resulting in - * an access violation when the driver tries to read past the string memory. - * - *

Hat tip to fewizz for the find and the fix. - */ - public static void safeShaderSource(int glId, CharSequence source) { - final MemoryStack stack = MemoryStack.stackGet(); - final int stackPointer = stack.getPointer(); + /** + * Copied from: + *
https://github.com/grondag/canvas/commit/820bf754092ccaf8d0c169620c2ff575722d7d96 + * + *

Identical in function to {@link GL20C#glShaderSource(int, CharSequence)} but + * passes a null pointer for string length to force the driver to rely on the null + * terminator for string length. This is a workaround for an apparent flaw with some + * AMD drivers that don't receive or interpret the length correctly, resulting in + * an access violation when the driver tries to read past the string memory. + * + *

Hat tip to fewizz for the find and the fix. + */ + public static void safeShaderSource(int glId, CharSequence source) { + final MemoryStack stack = MemoryStack.stackGet(); + final int stackPointer = stack.getPointer(); - try { - final ByteBuffer sourceBuffer = MemoryUtil.memUTF8(source, true); - final PointerBuffer pointers = stack.mallocPointer(1); - pointers.put(sourceBuffer); + try { + final ByteBuffer sourceBuffer = MemoryUtil.memUTF8(source, true); + final PointerBuffer pointers = stack.mallocPointer(1); + pointers.put(sourceBuffer); - GL20C.nglShaderSource(glId, 1, pointers.address0(), 0); - org.lwjgl.system.APIUtil.apiArrayFree(pointers.address0(), 1); - } finally { - stack.setPointer(stackPointer); - } - } + GL20C.nglShaderSource(glId, 1, pointers.address0(), 0); + org.lwjgl.system.APIUtil.apiArrayFree(pointers.address0(), 1); + } finally { + stack.setPointer(stackPointer); + } + } } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/gl/versioned/GlVersioned.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/versioned/GlVersioned.java index 6f456c802..a670cd8f9 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/gl/versioned/GlVersioned.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/versioned/GlVersioned.java @@ -7,10 +7,11 @@ import org.lwjgl.opengl.GLCapabilities; * last defined variant always returns true. */ public interface GlVersioned { - /** - * Queries whether this variant is supported by the current system. - * @param caps The {@link GLCapabilities} reported by the current system. - * @return true if this variant is supported, or if this is the last defined variant. - */ - boolean supported(GLCapabilities caps); + /** + * Queries whether this variant is supported by the current system. + * + * @param caps The {@link GLCapabilities} reported by the current system. + * @return true if this variant is supported, or if this is the last defined variant. + */ + boolean supported(GLCapabilities caps); } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/gl/versioned/InstancedArrays.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/versioned/InstancedArrays.java index ee00f760f..609242bd8 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/gl/versioned/InstancedArrays.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/versioned/InstancedArrays.java @@ -5,41 +5,39 @@ import org.lwjgl.opengl.GL33; import org.lwjgl.opengl.GLCapabilities; public enum InstancedArrays implements GlVersioned { - GL33_INSTANCED_ARRAYS { - @Override - public boolean supported(GLCapabilities caps) { - return caps.OpenGL33; - } + GL33_INSTANCED_ARRAYS { + @Override + public boolean supported(GLCapabilities caps) { + return caps.OpenGL33; + } - @Override - public void vertexAttribDivisor(int index, int divisor) { - GL33.glVertexAttribDivisor(index, divisor); - } - }, - ARB_INSTANCED_ARRAYS { - @Override - public boolean supported(GLCapabilities caps) { - return caps.GL_ARB_instanced_arrays; - } + @Override + public void vertexAttribDivisor(int index, int divisor) { + GL33.glVertexAttribDivisor(index, divisor); + } + }, + ARB_INSTANCED_ARRAYS { + @Override + public boolean supported(GLCapabilities caps) { + return caps.GL_ARB_instanced_arrays; + } - @Override - public void vertexAttribDivisor(int index, int divisor) { - ARBInstancedArrays.glVertexAttribDivisorARB(index, divisor); - } - }, - UNSUPPORTED { - @Override - public boolean supported(GLCapabilities caps) { - return true; - } + @Override + public void vertexAttribDivisor(int index, int divisor) { + ARBInstancedArrays.glVertexAttribDivisorARB(index, divisor); + } + }, + UNSUPPORTED { + @Override + public boolean supported(GLCapabilities caps) { + return true; + } - @Override - public void vertexAttribDivisor(int index, int divisor) { - throw new UnsupportedOperationException(); - } - } + @Override + public void vertexAttribDivisor(int index, int divisor) { + throw new UnsupportedOperationException(); + } + }; - ; - - public abstract void vertexAttribDivisor(int index, int divisor); + public abstract void vertexAttribDivisor(int index, int divisor); } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/gl/versioned/MapBuffer.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/versioned/MapBuffer.java index 74bd7baa4..dc11699fb 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/gl/versioned/MapBuffer.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/versioned/MapBuffer.java @@ -10,66 +10,66 @@ import org.lwjgl.opengl.GLCapabilities; public enum MapBuffer implements GlVersioned { - GL30_RANGE { - @Override - public boolean supported(GLCapabilities caps) { - return caps.OpenGL30; - } + GL30_RANGE { + @Override + public boolean supported(GLCapabilities caps) { + return caps.OpenGL30; + } - @Override - public void mapBuffer(int target, int offset, int length, Consumer upload) { - ByteBuffer buffer = GL30.glMapBufferRange(target, offset, length, GL30.GL_MAP_WRITE_BIT); + @Override + public void mapBuffer(int target, int offset, int length, Consumer upload) { + ByteBuffer buffer = GL30.glMapBufferRange(target, offset, length, GL30.GL_MAP_WRITE_BIT); - upload.accept(buffer); - buffer.rewind(); + upload.accept(buffer); + buffer.rewind(); - GL30.glUnmapBuffer(target); - } - }, - ARB_RANGE { - @Override - public boolean supported(GLCapabilities caps) { - return caps.GL_ARB_map_buffer_range; - } + GL30.glUnmapBuffer(target); + } + }, + ARB_RANGE { + @Override + public boolean supported(GLCapabilities caps) { + return caps.GL_ARB_map_buffer_range; + } - @Override - public void mapBuffer(int target, int offset, int length, Consumer upload) { - ByteBuffer buffer = ARBMapBufferRange.glMapBufferRange(target, offset, length, GL30.GL_MAP_WRITE_BIT); + @Override + public void mapBuffer(int target, int offset, int length, Consumer upload) { + ByteBuffer buffer = ARBMapBufferRange.glMapBufferRange(target, offset, length, GL30.GL_MAP_WRITE_BIT); - upload.accept(buffer); - buffer.rewind(); + upload.accept(buffer); + buffer.rewind(); - GL30.glUnmapBuffer(target); - } - }, - GL15_MAP { - @Override - public boolean supported(GLCapabilities caps) { - return caps.OpenGL15; - } + GL30.glUnmapBuffer(target); + } + }, + GL15_MAP { + @Override + public boolean supported(GLCapabilities caps) { + return caps.OpenGL15; + } - @Override - public void mapBuffer(int target, int offset, int length, Consumer upload) { - ByteBuffer buffer = GL15.glMapBuffer(target, GL15.GL_WRITE_ONLY); + @Override + public void mapBuffer(int target, int offset, int length, Consumer upload) { + ByteBuffer buffer = GL15.glMapBuffer(target, GL15.GL_WRITE_ONLY); - buffer.position(offset); - upload.accept(buffer); - buffer.rewind(); - GL15.glUnmapBuffer(target); - } - }, - UNSUPPORTED { - @Override - public boolean supported(GLCapabilities caps) { - return true; - } + buffer.position(offset); + upload.accept(buffer); + buffer.rewind(); + GL15.glUnmapBuffer(target); + } + }, + UNSUPPORTED { + @Override + public boolean supported(GLCapabilities caps) { + return true; + } - @Override - public void mapBuffer(int target, int offset, int length, Consumer upload) { - throw new UnsupportedOperationException("glMapBuffer not supported"); - } - }; + @Override + public void mapBuffer(int target, int offset, int length, Consumer upload) { + throw new UnsupportedOperationException("glMapBuffer not supported"); + } + }; - public abstract void mapBuffer(int target, int offset, int length, Consumer upload); + public abstract void mapBuffer(int target, int offset, int length, Consumer upload); } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/gl/versioned/RGPixelFormat.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/versioned/RGPixelFormat.java index e886fcfe5..62233e7b4 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/gl/versioned/RGPixelFormat.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/versioned/RGPixelFormat.java @@ -5,73 +5,73 @@ import org.lwjgl.opengl.GL30; import org.lwjgl.opengl.GLCapabilities; public enum RGPixelFormat implements GlVersioned { - GL30_RG { - @Override - public boolean supported(GLCapabilities caps) { - return caps.OpenGL30; - } + GL30_RG { + @Override + public boolean supported(GLCapabilities caps) { + return caps.OpenGL30; + } - @Override - public int internalFormat() { - return GL30.GL_RG8; - } + @Override + public int internalFormat() { + return GL30.GL_RG8; + } - @Override - public int format() { - return GL30.GL_RG; - } + @Override + public int format() { + return GL30.GL_RG; + } - @Override - public int byteCount() { - return 2; - } - }, - GL11_RGB { - @Override - public boolean supported(GLCapabilities caps) { - return caps.OpenGL11; - } + @Override + public int byteCount() { + return 2; + } + }, + GL11_RGB { + @Override + public boolean supported(GLCapabilities caps) { + return caps.OpenGL11; + } - @Override - public int internalFormat() { - return GL11.GL_RGB8; - } + @Override + public int internalFormat() { + return GL11.GL_RGB8; + } - @Override - public int format() { - return GL11.GL_RGB; - } + @Override + public int format() { + return GL11.GL_RGB; + } - @Override - public int byteCount() { - return 3; - } - }, - UNSUPPORTED { - @Override - public boolean supported(GLCapabilities caps) { - return true; - } + @Override + public int byteCount() { + return 3; + } + }, + UNSUPPORTED { + @Override + public boolean supported(GLCapabilities caps) { + return true; + } - @Override - public int internalFormat() { - throw new UnsupportedOperationException(); - } + @Override + public int internalFormat() { + throw new UnsupportedOperationException(); + } - @Override - public int format() { - throw new UnsupportedOperationException(); - } + @Override + public int format() { + throw new UnsupportedOperationException(); + } - @Override - public int byteCount() { - throw new UnsupportedOperationException(); - } - } + @Override + public int byteCount() { + throw new UnsupportedOperationException(); + } + }; - ; + public abstract int internalFormat(); - public abstract int internalFormat(); - public abstract int format(); - public abstract int byteCount(); + public abstract int format(); + + public abstract int byteCount(); } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/gl/versioned/VertexArrayObject.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/versioned/VertexArrayObject.java index 356970877..16f6bfd46 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/gl/versioned/VertexArrayObject.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/versioned/VertexArrayObject.java @@ -5,75 +5,73 @@ import org.lwjgl.opengl.GL30; import org.lwjgl.opengl.GLCapabilities; public enum VertexArrayObject implements GlVersioned { - GL30_VAO { - @Override - public boolean supported(GLCapabilities caps) { - return caps.OpenGL30; - } + GL30_VAO { + @Override + public boolean supported(GLCapabilities caps) { + return caps.OpenGL30; + } - @Override - public int genVertexArrays() { - return GL30.glGenVertexArrays(); - } + @Override + public int genVertexArrays() { + return GL30.glGenVertexArrays(); + } - @Override - public void bindVertexArray(int array) { - GL30.glBindVertexArray(array); - } + @Override + public void bindVertexArray(int array) { + GL30.glBindVertexArray(array); + } - @Override - public void deleteVertexArrays(int array) { - GL30.glDeleteVertexArrays(array); - } - }, - ARB_VAO { - @Override - public boolean supported(GLCapabilities caps) { - return caps.GL_ARB_vertex_array_object; - } + @Override + public void deleteVertexArrays(int array) { + GL30.glDeleteVertexArrays(array); + } + }, + ARB_VAO { + @Override + public boolean supported(GLCapabilities caps) { + return caps.GL_ARB_vertex_array_object; + } - @Override - public int genVertexArrays() { - return ARBVertexArrayObject.glGenVertexArrays(); - } + @Override + public int genVertexArrays() { + return ARBVertexArrayObject.glGenVertexArrays(); + } - @Override - public void bindVertexArray(int array) { - ARBVertexArrayObject.glBindVertexArray(array); - } + @Override + public void bindVertexArray(int array) { + ARBVertexArrayObject.glBindVertexArray(array); + } - @Override - public void deleteVertexArrays(int array) { - ARBVertexArrayObject.glDeleteVertexArrays(array); - } - }, - UNSUPPORTED { - @Override - public boolean supported(GLCapabilities caps) { - return true; - } + @Override + public void deleteVertexArrays(int array) { + ARBVertexArrayObject.glDeleteVertexArrays(array); + } + }, + UNSUPPORTED { + @Override + public boolean supported(GLCapabilities caps) { + return true; + } - @Override - public int genVertexArrays() { - throw new UnsupportedOperationException(); - } + @Override + public int genVertexArrays() { + throw new UnsupportedOperationException(); + } - @Override - public void bindVertexArray(int array) { - throw new UnsupportedOperationException(); - } + @Override + public void bindVertexArray(int array) { + throw new UnsupportedOperationException(); + } - @Override - public void deleteVertexArrays(int array) { - throw new UnsupportedOperationException(); - } - } + @Override + public void deleteVertexArrays(int array) { + throw new UnsupportedOperationException(); + } + }; - ; + public abstract int genVertexArrays(); - public abstract int genVertexArrays(); + public abstract void bindVertexArray(int array); - public abstract void bindVertexArray(int array); - - public abstract void deleteVertexArrays(int array); + public abstract void deleteVertexArrays(int array); } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/IDynamicInstance.java b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/IDynamicInstance.java index 8ee257a3c..a125fd11a 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/IDynamicInstance.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/IDynamicInstance.java @@ -10,21 +10,21 @@ package com.simibubi.create.foundation.render.backend.instancing; * to parameterize the instances, you're encouraged to implement this for prototyping. */ public interface IDynamicInstance extends IInstance { - /** - * Called every frame. - */ - void beginFrame(); + /** + * Called every frame. + */ + void beginFrame(); - /** - * As a further optimization, dynamic instances that are far away are ticked less often. - * This behavior can be disabled by returning false. - * - *
You might want to opt out of this if you want your animations to remain smooth - * even when far away from the camera. It is recommended to keep this as is, however. - * - * @return true if your instance should be slow ticked. - */ - default boolean decreaseFramerateWithDistance() { - return true; - } + /** + * As a further optimization, dynamic instances that are far away are ticked less often. + * This behavior can be disabled by returning false. + * + *
You might want to opt out of this if you want your animations to remain smooth + * even when far away from the camera. It is recommended to keep this as is, however. + * + * @return true if your instance should be slow ticked. + */ + default boolean decreaseFramerateWithDistance() { + return true; + } } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/IFlywheelWorld.java b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/IFlywheelWorld.java index 91684c428..86a00ab01 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/IFlywheelWorld.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/IFlywheelWorld.java @@ -7,7 +7,7 @@ package com.simibubi.create.foundation.render.backend.instancing; * Minecraft.getInstance().world will always support Flywheel. */ public interface IFlywheelWorld { - default boolean supportsFlywheel() { - return true; - } + default boolean supportsFlywheel() { + return true; + } } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/IInstanceRendered.java b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/IInstanceRendered.java index 05f3f35b5..386fd9b9c 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/IInstanceRendered.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/IInstanceRendered.java @@ -1,7 +1,7 @@ package com.simibubi.create.foundation.render.backend.instancing; public interface IInstanceRendered { - default boolean shouldRenderAsTE() { - return false; - } + default boolean shouldRenderAsTE() { + return false; + } } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/IRendererFactory.java b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/IRendererFactory.java index f1ec0d323..206a7534e 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/IRendererFactory.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/IRendererFactory.java @@ -4,5 +4,5 @@ import net.minecraft.tileentity.TileEntity; @FunctionalInterface public interface IRendererFactory { - TileEntityInstance create(InstancedTileRenderer manager, T te); + TileEntityInstance create(InstancedTileRenderer manager, T te); } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstanceData.java b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstanceData.java index d77c75fb7..14d5f1fb4 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstanceData.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstanceData.java @@ -4,61 +4,61 @@ import java.nio.ByteBuffer; public abstract class InstanceData { - protected final InstancedModel owner; + protected final InstancedModel owner; - boolean dirty; - boolean removed; + boolean dirty; + boolean removed; - protected InstanceData(InstancedModel owner) { - this.owner = owner; - } + protected InstanceData(InstancedModel owner) { + this.owner = owner; + } - public abstract void write(ByteBuffer buf); + public abstract void write(ByteBuffer buf); - public void markDirty() { - owner.anyToUpdate = true; - dirty = true; - } + public void markDirty() { + owner.anyToUpdate = true; + dirty = true; + } - public void delete() { - owner.anyToRemove = true; - removed = true; - } + public void delete() { + owner.anyToRemove = true; + removed = true; + } - public void putVec4(ByteBuffer buf, float x, float y, float z, float w) { - put(buf, x); - put(buf, y); - put(buf, z); - put(buf, w); - } + public void putVec4(ByteBuffer buf, float x, float y, float z, float w) { + put(buf, x); + put(buf, y); + put(buf, z); + put(buf, w); + } - public void putVec3(ByteBuffer buf, float x, float y, float z) { - put(buf, x); - put(buf, y); - put(buf, z); - } + public void putVec3(ByteBuffer buf, float x, float y, float z) { + put(buf, x); + put(buf, y); + put(buf, z); + } - public void putVec2(ByteBuffer buf, float x, float y) { - put(buf, x); - put(buf, y); - } + public void putVec2(ByteBuffer buf, float x, float y) { + put(buf, x); + put(buf, y); + } - public void putVec3(ByteBuffer buf, byte x, byte y, byte z) { - put(buf, x); - put(buf, y); - put(buf, z); - } + public void putVec3(ByteBuffer buf, byte x, byte y, byte z) { + put(buf, x); + put(buf, y); + put(buf, z); + } - public void putVec2(ByteBuffer buf, byte x, byte y) { - put(buf, x); - put(buf, y); - } + public void putVec2(ByteBuffer buf, byte x, byte y) { + put(buf, x); + put(buf, y); + } - public void put(ByteBuffer buf, byte b) { - buf.put(b); - } + public void put(ByteBuffer buf, byte b) { + buf.put(b); + } - public void put(ByteBuffer buf, float f) { - buf.putFloat(f); - } + public void put(ByteBuffer buf, float f) { + buf.putFloat(f); + } } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedModel.java b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedModel.java index fc6be1b40..37db0841e 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedModel.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedModel.java @@ -19,239 +19,239 @@ import com.simibubi.create.foundation.render.backend.gl.attrib.VertexFormat; import net.minecraft.client.renderer.BufferBuilder; public abstract class InstancedModel extends BufferedModel { - public static final VertexFormat FORMAT = VertexFormat.builder().addAttributes(ModelAttributes.class).build(); + public static final VertexFormat FORMAT = VertexFormat.builder().addAttributes(ModelAttributes.class).build(); - public final InstancedTileRenderer renderer; + public final InstancedTileRenderer renderer; - protected GlVertexArray vao; - protected GlBuffer instanceVBO; - protected int glBufferSize = -1; - protected int glInstanceCount = 0; + protected GlVertexArray vao; + protected GlBuffer instanceVBO; + protected int glBufferSize = -1; + protected int glInstanceCount = 0; - protected final ArrayList data = new ArrayList<>(); + protected final ArrayList data = new ArrayList<>(); - boolean anyToRemove; - boolean anyToUpdate; + boolean anyToRemove; + boolean anyToUpdate; - public InstancedModel(InstancedTileRenderer renderer, BufferBuilder buf) { - super(buf); - this.renderer = renderer; - } + public InstancedModel(InstancedTileRenderer renderer, BufferBuilder buf) { + super(buf); + this.renderer = renderer; + } - @Override - protected void init() { - vao = new GlVertexArray(); - instanceVBO = new GlBuffer(GL20.GL_ARRAY_BUFFER); + @Override + protected void init() { + vao = new GlVertexArray(); + instanceVBO = new GlBuffer(GL20.GL_ARRAY_BUFFER); - vao.with(vao -> super.init()); - } + vao.with(vao -> super.init()); + } - @Override - protected void initModel() { - super.initModel(); - setupAttributes(); - } + @Override + protected void initModel() { + super.initModel(); + setupAttributes(); + } - public int instanceCount() { - return data.size(); - } + public int instanceCount() { + return data.size(); + } - public boolean isEmpty() { - return instanceCount() == 0; - } + public boolean isEmpty() { + return instanceCount() == 0; + } - protected void deleteInternal() { - super.deleteInternal(); + protected void deleteInternal() { + super.deleteInternal(); - instanceVBO.delete(); - vao.delete(); - } + instanceVBO.delete(); + vao.delete(); + } - public synchronized D createInstance() { - D instanceData = newInstance(); - instanceData.dirty = true; - anyToUpdate = true; - data.add(instanceData); + public synchronized D createInstance() { + D instanceData = newInstance(); + instanceData.dirty = true; + anyToUpdate = true; + data.add(instanceData); - return instanceData; - } + return instanceData; + } - protected abstract D newInstance(); + protected abstract D newInstance(); - protected void doRender() { - vao.with(vao -> { - renderSetup(); + protected void doRender() { + vao.with(vao -> { + renderSetup(); - if (glInstanceCount > 0) - Backend.compat.drawArraysInstanced(GL11.GL_QUADS, 0, vertexCount, glInstanceCount); - }); - } + if (glInstanceCount > 0) + Backend.compat.drawArraysInstanced(GL11.GL_QUADS, 0, vertexCount, glInstanceCount); + }); + } - protected void renderSetup() { - if (anyToRemove) { - removeDeletedInstances(); - } + protected void renderSetup() { + if (anyToRemove) { + removeDeletedInstances(); + } - instanceVBO.bind(); - if (!realloc()) { + instanceVBO.bind(); + if (!realloc()) { - if (anyToRemove) { - clearBufferTail(); - } + if (anyToRemove) { + clearBufferTail(); + } - if (anyToUpdate) { - updateBuffer(); - } + if (anyToUpdate) { + updateBuffer(); + } - } + } - glInstanceCount = data.size(); - informAttribDivisors(); - instanceVBO.unbind(); + glInstanceCount = data.size(); + informAttribDivisors(); + instanceVBO.unbind(); - this.anyToRemove = false; - this.anyToUpdate = false; - } + this.anyToRemove = false; + this.anyToUpdate = false; + } - private void informAttribDivisors() { - int staticAttributes = getModelFormat().getShaderAttributeCount(); - getInstanceFormat().vertexAttribPointers(staticAttributes); + private void informAttribDivisors() { + int staticAttributes = getModelFormat().getShaderAttributeCount(); + getInstanceFormat().vertexAttribPointers(staticAttributes); - for (int i = 0; i < getInstanceFormat().getShaderAttributeCount(); i++) { - Backend.compat.vertexAttribDivisor(i + staticAttributes, 1); - } - } + for (int i = 0; i < getInstanceFormat().getShaderAttributeCount(); i++) { + Backend.compat.vertexAttribDivisor(i + staticAttributes, 1); + } + } - private void clearBufferTail() { - int size = data.size(); - final int offset = size * getInstanceFormat().getStride(); - final int length = glBufferSize - offset; - if (length > 0) { - instanceVBO.map(offset, length, buffer -> { - buffer.put(new byte[length]); - }); - } - } + private void clearBufferTail() { + int size = data.size(); + final int offset = size * getInstanceFormat().getStride(); + final int length = glBufferSize - offset; + if (length > 0) { + instanceVBO.map(offset, length, buffer -> { + buffer.put(new byte[length]); + }); + } + } - private void updateBuffer() { - final int size = data.size(); + private void updateBuffer() { + final int size = data.size(); - if (size <= 0) return; + if (size <= 0) return; - final int stride = getInstanceFormat().getStride(); - final BitSet dirtySet = getDirtyBitSet(); + final int stride = getInstanceFormat().getStride(); + final BitSet dirtySet = getDirtyBitSet(); - if (dirtySet.isEmpty()) return; + if (dirtySet.isEmpty()) return; - final int firstDirty = dirtySet.nextSetBit(0); - final int lastDirty = dirtySet.previousSetBit(size); + final int firstDirty = dirtySet.nextSetBit(0); + final int lastDirty = dirtySet.previousSetBit(size); - final int offset = firstDirty * stride; - final int length = (1 + lastDirty - firstDirty) * stride; + final int offset = firstDirty * stride; + final int length = (1 + lastDirty - firstDirty) * stride; - if (length > 0) { - instanceVBO.map(offset, length, buffer -> { - dirtySet.stream().forEach(i -> { - final D d = data.get(i); + if (length > 0) { + instanceVBO.map(offset, length, buffer -> { + dirtySet.stream().forEach(i -> { + final D d = data.get(i); - buffer.position(i * stride - offset); - d.write(buffer); - }); - }); - } - } + buffer.position(i * stride - offset); + d.write(buffer); + }); + }); + } + } - private BitSet getDirtyBitSet() { - final int size = data.size(); - final BitSet dirtySet = new BitSet(size); + private BitSet getDirtyBitSet() { + final int size = data.size(); + final BitSet dirtySet = new BitSet(size); - for (int i = 0; i < size; i++) { - D element = data.get(i); - if (element.dirty) { - dirtySet.set(i); + for (int i = 0; i < size; i++) { + D element = data.get(i); + if (element.dirty) { + dirtySet.set(i); - element.dirty = false; - } - } - return dirtySet; - } + element.dirty = false; + } + } + return dirtySet; + } - private boolean realloc() { - int size = this.data.size(); - int stride = getInstanceFormat().getStride(); - int requiredSize = size * stride; - if (requiredSize > glBufferSize) { - glBufferSize = requiredSize + stride * 16; - GL15.glBufferData(instanceVBO.getBufferType(), glBufferSize, GL15.GL_STATIC_DRAW); + private boolean realloc() { + int size = this.data.size(); + int stride = getInstanceFormat().getStride(); + int requiredSize = size * stride; + if (requiredSize > glBufferSize) { + glBufferSize = requiredSize + stride * 16; + GL15.glBufferData(instanceVBO.getBufferType(), glBufferSize, GL15.GL_STATIC_DRAW); - instanceVBO.map(glBufferSize, buffer -> { - for (D datum : data) { - datum.write(buffer); - } - }); + instanceVBO.map(glBufferSize, buffer -> { + for (D datum : data) { + datum.write(buffer); + } + }); - glInstanceCount = size; - return true; - } - return false; - } + glInstanceCount = size; + return true; + } + return false; + } - private void removeDeletedInstances() { - // figure out which elements are to be removed - // any exception thrown from the filter predicate at this stage - // will leave the collection unmodified - final int oldSize = this.data.size(); - int removeCount = 0; - final BitSet removeSet = new BitSet(oldSize); - for (int i = 0; i < oldSize; i++) { - final D element = this.data.get(i); - if (element.removed) { - removeSet.set(i); - removeCount++; - } - } + private void removeDeletedInstances() { + // figure out which elements are to be removed + // any exception thrown from the filter predicate at this stage + // will leave the collection unmodified + final int oldSize = this.data.size(); + int removeCount = 0; + final BitSet removeSet = new BitSet(oldSize); + for (int i = 0; i < oldSize; i++) { + final D element = this.data.get(i); + if (element.removed) { + removeSet.set(i); + removeCount++; + } + } - final int newSize = oldSize - removeCount; + final int newSize = oldSize - removeCount; - // shift surviving elements left over the spaces left by removed elements - for (int i = 0, j = 0; (i < oldSize) && (j < newSize); i++, j++) { - i = removeSet.nextClearBit(i); + // shift surviving elements left over the spaces left by removed elements + for (int i = 0, j = 0; (i < oldSize) && (j < newSize); i++, j++) { + i = removeSet.nextClearBit(i); - if (i != j) { - D element = data.get(i); - data.set(j, element); - element.dirty = true; - } - } + if (i != j) { + D element = data.get(i); + data.set(j, element); + element.dirty = true; + } + } - anyToUpdate = true; + anyToUpdate = true; - data.subList(newSize, oldSize).clear(); + data.subList(newSize, oldSize).clear(); - } + } - @Override - protected void copyVertex(ByteBuffer constant, int i) { - constant.putFloat(getX(template, i)); - constant.putFloat(getY(template, i)); - constant.putFloat(getZ(template, i)); + @Override + protected void copyVertex(ByteBuffer constant, int i) { + constant.putFloat(getX(template, i)); + constant.putFloat(getY(template, i)); + constant.putFloat(getZ(template, i)); - constant.put(getNX(template, i)); - constant.put(getNY(template, i)); - constant.put(getNZ(template, i)); + constant.put(getNX(template, i)); + constant.put(getNY(template, i)); + constant.put(getNZ(template, i)); - constant.putFloat(getU(template, i)); - constant.putFloat(getV(template, i)); - } + constant.putFloat(getU(template, i)); + constant.putFloat(getV(template, i)); + } - @Override - protected VertexFormat getModelFormat() { - return FORMAT; - } + @Override + protected VertexFormat getModelFormat() { + return FORMAT; + } - protected abstract VertexFormat getInstanceFormat(); + protected abstract VertexFormat getInstanceFormat(); - protected int getTotalShaderAttributeCount() { - return getInstanceFormat().getShaderAttributeCount() + super.getTotalShaderAttributeCount(); - } + protected int getTotalShaderAttributeCount() { + return getInstanceFormat().getShaderAttributeCount() + super.getTotalShaderAttributeCount(); + } } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedTileRenderRegistry.java b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedTileRenderRegistry.java index 26bdd4f96..19370f6a0 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedTileRenderRegistry.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedTileRenderRegistry.java @@ -10,22 +10,22 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntityType; public class InstancedTileRenderRegistry { - public static final InstancedTileRenderRegistry instance = new InstancedTileRenderRegistry(); + public static final InstancedTileRenderRegistry instance = new InstancedTileRenderRegistry(); - private final Map, IRendererFactory> renderers = Maps.newHashMap(); + private final Map, IRendererFactory> renderers = Maps.newHashMap(); - public void register(TileEntityType type, IRendererFactory rendererFactory) { - this.renderers.put(type, rendererFactory); - } + public void register(TileEntityType type, IRendererFactory rendererFactory) { + this.renderers.put(type, rendererFactory); + } - @SuppressWarnings("unchecked") - @Nullable - public TileEntityInstance create(InstancedTileRenderer manager, T tile) { - TileEntityType type = tile.getType(); - IRendererFactory factory = (IRendererFactory) this.renderers.get(type); + @SuppressWarnings("unchecked") + @Nullable + public TileEntityInstance create(InstancedTileRenderer manager, T tile) { + TileEntityType type = tile.getType(); + IRendererFactory factory = (IRendererFactory) this.renderers.get(type); - if (factory == null) return null; - else return factory.create(manager, tile); - } + if (factory == null) return null; + else return factory.create(manager, tile); + } } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedTileRenderer.java b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedTileRenderer.java index a7bdc1dcc..5ae473052 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedTileRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedTileRenderer.java @@ -25,259 +25,259 @@ import net.minecraft.world.IBlockReader; import net.minecraft.world.World; public abstract class InstancedTileRenderer

{ - protected ArrayList queuedAdditions = new ArrayList<>(64); - - protected Map> instances = new HashMap<>(); - - protected Map tickableInstances = new HashMap<>(); - protected Map dynamicInstances = new HashMap<>(); + protected ArrayList queuedAdditions = new ArrayList<>(64); + + protected Map> instances = new HashMap<>(); + + protected Map tickableInstances = new HashMap<>(); + protected Map dynamicInstances = new HashMap<>(); - protected Map, RenderMaterial> materials = new HashMap<>(); - - protected int frame; - protected int tick; - - protected InstancedTileRenderer() { - registerMaterials(); - } - - public abstract BlockPos getOriginCoordinate(); - - public abstract void registerMaterials(); - - public void tick(double cameraX, double cameraY, double cameraZ) { - tick++; - - // integer camera pos - int cX = (int) cameraX; - int cY = (int) cameraY; - int cZ = (int) cameraZ; - - if (tickableInstances.size() > 0) { - for (ITickableInstance instance : tickableInstances.values()) { - if (!instance.decreaseTickRateWithDistance()) { - instance.tick(); - continue; - } - - BlockPos pos = instance.getWorldPosition(); - - int dX = pos.getX() - cX; - int dY = pos.getY() - cY; - int dZ = pos.getZ() - cZ; + protected Map, RenderMaterial> materials = new HashMap<>(); + + protected int frame; + protected int tick; + + protected InstancedTileRenderer() { + registerMaterials(); + } + + public abstract BlockPos getOriginCoordinate(); + + public abstract void registerMaterials(); + + public void tick(double cameraX, double cameraY, double cameraZ) { + tick++; + + // integer camera pos + int cX = (int) cameraX; + int cY = (int) cameraY; + int cZ = (int) cameraZ; + + if (tickableInstances.size() > 0) { + for (ITickableInstance instance : tickableInstances.values()) { + if (!instance.decreaseTickRateWithDistance()) { + instance.tick(); + continue; + } + + BlockPos pos = instance.getWorldPosition(); + + int dX = pos.getX() - cX; + int dY = pos.getY() - cY; + int dZ = pos.getZ() - cZ; - if ((tick % getUpdateDivisor(dX, dY, dZ)) == 0) - instance.tick(); - } - } - } + if ((tick % getUpdateDivisor(dX, dY, dZ)) == 0) + instance.tick(); + } + } + } - public void beginFrame(ActiveRenderInfo info, double cameraX, double cameraY, double cameraZ) { - frame++; - processQueuedAdditions(); - - Vector3f look = info.getHorizontalPlane(); - float lookX = look.getX(); - float lookY = look.getY(); - float lookZ = look.getZ(); - - // integer camera pos - int cX = (int) cameraX; - int cY = (int) cameraY; - int cZ = (int) cameraZ; - - if (dynamicInstances.size() > 0) { - for (IDynamicInstance dyn : dynamicInstances.values()) { - if (!dyn.decreaseFramerateWithDistance()) { - dyn.beginFrame(); - continue; - } - - if (shouldTick(dyn.getWorldPosition(), lookX, lookY, lookZ, cX, cY, cZ)) - dyn.beginFrame(); - } - } - } - - public void render(RenderType layer, Matrix4f viewProjection, double camX, double camY, double camZ) { - render(layer, viewProjection, camX, camY, camZ, null); - } - - public void render(RenderType layer, Matrix4f viewProjection, double camX, double camY, double camZ, ShaderCallback

callback) { - for (RenderMaterial material : materials.values()) { - if (material.canRenderInLayer(layer)) - material.render(layer, viewProjection, camX, camY, camZ, callback); - } - } + public void beginFrame(ActiveRenderInfo info, double cameraX, double cameraY, double cameraZ) { + frame++; + processQueuedAdditions(); + + Vector3f look = info.getHorizontalPlane(); + float lookX = look.getX(); + float lookY = look.getY(); + float lookZ = look.getZ(); + + // integer camera pos + int cX = (int) cameraX; + int cY = (int) cameraY; + int cZ = (int) cameraZ; + + if (dynamicInstances.size() > 0) { + for (IDynamicInstance dyn : dynamicInstances.values()) { + if (!dyn.decreaseFramerateWithDistance()) { + dyn.beginFrame(); + continue; + } + + if (shouldTick(dyn.getWorldPosition(), lookX, lookY, lookZ, cX, cY, cZ)) + dyn.beginFrame(); + } + } + } + + public void render(RenderType layer, Matrix4f viewProjection, double camX, double camY, double camZ) { + render(layer, viewProjection, camX, camY, camZ, null); + } + + public void render(RenderType layer, Matrix4f viewProjection, double camX, double camY, double camZ, ShaderCallback

callback) { + for (RenderMaterial material : materials.values()) { + if (material.canRenderInLayer(layer)) + material.render(layer, viewProjection, camX, camY, camZ, callback); + } + } - @SuppressWarnings("unchecked") - public > RenderMaterial getMaterial(MaterialType materialType) { - return (RenderMaterial) materials.get(materialType); - } + @SuppressWarnings("unchecked") + public > RenderMaterial getMaterial(MaterialType materialType) { + return (RenderMaterial) materials.get(materialType); + } - public RenderMaterial> getTransformMaterial() { - return getMaterial(MaterialTypes.TRANSFORMED); - } + public RenderMaterial> getTransformMaterial() { + return getMaterial(MaterialTypes.TRANSFORMED); + } - public RenderMaterial> getOrientedMaterial() { - return getMaterial(MaterialTypes.ORIENTED); - } + public RenderMaterial> getOrientedMaterial() { + return getMaterial(MaterialTypes.ORIENTED); + } - @SuppressWarnings("unchecked") - @Nullable - public TileEntityInstance getInstance(T tile, boolean create) { - if (!Backend.canUseInstancing()) return null; + @SuppressWarnings("unchecked") + @Nullable + public TileEntityInstance getInstance(T tile, boolean create) { + if (!Backend.canUseInstancing()) return null; - TileEntityInstance instance = instances.get(tile); - - if (instance != null) { - return (TileEntityInstance) instance; - } else if (create && canCreateInstance(tile)) { - return createInternal(tile); - } else { - return null; - } - } - - public void onLightUpdate(T tile) { - if (!Backend.canUseInstancing()) return; - - if (tile instanceof IInstanceRendered) { - TileEntityInstance instance = getInstance(tile, false); - - if (instance != null) - instance.updateLight(); - } - } - - public void add(T tile) { - if (!Backend.canUseInstancing()) return; - - if (tile instanceof IInstanceRendered) { - addInternal(tile); - } - } - - public void update(T tile) { - if (!Backend.canUseInstancing()) return; - - if (tile instanceof IInstanceRendered) { - TileEntityInstance instance = getInstance(tile, false); - - if (instance != null) { - - if (instance.shouldReset()) { - removeInternal(tile, instance); - - createInternal(tile); - } else { - instance.update(); - } - } - } - } - - public void remove(T tile) { - if (!Backend.canUseInstancing()) return; + TileEntityInstance instance = instances.get(tile); + + if (instance != null) { + return (TileEntityInstance) instance; + } else if (create && canCreateInstance(tile)) { + return createInternal(tile); + } else { + return null; + } + } + + public void onLightUpdate(T tile) { + if (!Backend.canUseInstancing()) return; + + if (tile instanceof IInstanceRendered) { + TileEntityInstance instance = getInstance(tile, false); + + if (instance != null) + instance.updateLight(); + } + } + + public void add(T tile) { + if (!Backend.canUseInstancing()) return; + + if (tile instanceof IInstanceRendered) { + addInternal(tile); + } + } + + public void update(T tile) { + if (!Backend.canUseInstancing()) return; + + if (tile instanceof IInstanceRendered) { + TileEntityInstance instance = getInstance(tile, false); + + if (instance != null) { + + if (instance.shouldReset()) { + removeInternal(tile, instance); + + createInternal(tile); + } else { + instance.update(); + } + } + } + } + + public void remove(T tile) { + if (!Backend.canUseInstancing()) return; - if (tile instanceof IInstanceRendered) { - removeInternal(tile); - } - } + if (tile instanceof IInstanceRendered) { + removeInternal(tile); + } + } - public synchronized void queueAdd(T tile) { - if (!Backend.canUseInstancing()) return; + public synchronized void queueAdd(T tile) { + if (!Backend.canUseInstancing()) return; - queuedAdditions.add(tile); - } + queuedAdditions.add(tile); + } - protected synchronized void processQueuedAdditions() { - if (queuedAdditions.size() > 0) { - queuedAdditions.forEach(this::addInternal); - queuedAdditions.clear(); - } - } + protected synchronized void processQueuedAdditions() { + if (queuedAdditions.size() > 0) { + queuedAdditions.forEach(this::addInternal); + queuedAdditions.clear(); + } + } - protected boolean shouldTick(BlockPos worldPos, float lookX, float lookY, float lookZ, int cX, int cY, int cZ) { - int dX = worldPos.getX() - cX; - int dY = worldPos.getY() - cY; - int dZ = worldPos.getZ() - cZ; + protected boolean shouldTick(BlockPos worldPos, float lookX, float lookY, float lookZ, int cX, int cY, int cZ) { + int dX = worldPos.getX() - cX; + int dY = worldPos.getY() - cY; + int dZ = worldPos.getZ() - cZ; - float dot = (dX + lookX * 2) * lookX + (dY + lookY * 2) * lookY + (dZ + lookZ * 2) * lookZ; + float dot = (dX + lookX * 2) * lookX + (dY + lookY * 2) * lookY + (dZ + lookZ * 2) * lookZ; - if (dot < 0) return false; // is it more than 2 blocks behind the camera? + if (dot < 0) return false; // is it more than 2 blocks behind the camera? - return (frame % getUpdateDivisor(dX, dY, dZ)) == 0; - } + return (frame % getUpdateDivisor(dX, dY, dZ)) == 0; + } - protected int getUpdateDivisor(int dX, int dY, int dZ) { - int dSq = dX * dX + dY * dY + dZ * dZ; + protected int getUpdateDivisor(int dX, int dY, int dZ) { + int dSq = dX * dX + dY * dY + dZ * dZ; - return (dSq / 1024) + 1; - } + return (dSq / 1024) + 1; + } - private void addInternal(TileEntity tile) { - getInstance(tile, true); - } + private void addInternal(TileEntity tile) { + getInstance(tile, true); + } - private void removeInternal(T tile) { - TileEntityInstance instance = getInstance(tile, false); + private void removeInternal(T tile) { + TileEntityInstance instance = getInstance(tile, false); - if (instance != null) { - removeInternal(tile, instance); - } - } + if (instance != null) { + removeInternal(tile, instance); + } + } - private void removeInternal(TileEntity tile, TileEntityInstance instance) { - instance.remove(); - instances.remove(tile); - dynamicInstances.remove(tile); - tickableInstances.remove(tile); - } + private void removeInternal(TileEntity tile, TileEntityInstance instance) { + instance.remove(); + instances.remove(tile); + dynamicInstances.remove(tile); + tickableInstances.remove(tile); + } - private TileEntityInstance createInternal(T tile) { - TileEntityInstance renderer = InstancedTileRenderRegistry.instance.create(this, tile); + private TileEntityInstance createInternal(T tile) { + TileEntityInstance renderer = InstancedTileRenderRegistry.instance.create(this, tile); - if (renderer != null) { - renderer.updateLight(); - instances.put(tile, renderer); + if (renderer != null) { + renderer.updateLight(); + instances.put(tile, renderer); - if (renderer instanceof IDynamicInstance) - dynamicInstances.put(tile, (IDynamicInstance) renderer); + if (renderer instanceof IDynamicInstance) + dynamicInstances.put(tile, (IDynamicInstance) renderer); - if (renderer instanceof ITickableInstance) - tickableInstances.put(tile, ((ITickableInstance) renderer)); - } + if (renderer instanceof ITickableInstance) + tickableInstances.put(tile, ((ITickableInstance) renderer)); + } - return renderer; - } + return renderer; + } - public void invalidate() { - for (RenderMaterial material : materials.values()) { - material.delete(); - } - instances.clear(); - dynamicInstances.clear(); - tickableInstances.clear(); - } + public void invalidate() { + for (RenderMaterial material : materials.values()) { + material.delete(); + } + instances.clear(); + dynamicInstances.clear(); + tickableInstances.clear(); + } - public boolean canCreateInstance(TileEntity tile) { - if (tile.isRemoved()) return false; + public boolean canCreateInstance(TileEntity tile) { + if (tile.isRemoved()) return false; - World world = tile.getWorld(); + World world = tile.getWorld(); - if (world == null) return false; + if (world == null) return false; - if (world.isAirBlock(tile.getPos())) return false; + if (world.isAirBlock(tile.getPos())) return false; - if (world == Minecraft.getInstance().world) { - BlockPos pos = tile.getPos(); + if (world == Minecraft.getInstance().world) { + BlockPos pos = tile.getPos(); - IBlockReader existingChunk = world.getExistingChunk(pos.getX() >> 4, pos.getZ() >> 4); + IBlockReader existingChunk = world.getExistingChunk(pos.getX() >> 4, pos.getZ() >> 4); - return existingChunk != null; - } + return existingChunk != null; + } - return world instanceof IFlywheelWorld && ((IFlywheelWorld) world).supportsFlywheel(); - } + return world instanceof IFlywheelWorld && ((IFlywheelWorld) world).supportsFlywheel(); + } } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/ModelFactory.java b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/ModelFactory.java index 61d7e36ff..2042929a8 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/ModelFactory.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/ModelFactory.java @@ -4,5 +4,5 @@ import net.minecraft.client.renderer.BufferBuilder; @FunctionalInterface public interface ModelFactory> { - B makeModel(InstancedTileRenderer renderer, BufferBuilder buf); + B makeModel(InstancedTileRenderer renderer, BufferBuilder buf); } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/RenderMaterial.java b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/RenderMaterial.java index fe7517b8f..d91077e2b 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/RenderMaterial.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/RenderMaterial.java @@ -36,102 +36,103 @@ import net.minecraft.util.math.vector.Matrix4f; public class RenderMaterial

> { - protected final InstancedTileRenderer renderer; - protected final Map, Cache> models; - protected final ModelFactory factory; - protected final ProgramSpec

programSpec; - protected final Predicate layerPredicate; + protected final InstancedTileRenderer renderer; + protected final Map, Cache> models; + protected final ModelFactory factory; + protected final ProgramSpec

programSpec; + protected final Predicate layerPredicate; - /** - * Creates a material that renders in the default layer (CUTOUT_MIPPED) - */ - public RenderMaterial(InstancedTileRenderer renderer, ProgramSpec

programSpec, ModelFactory factory) { - this(renderer, programSpec, factory, type -> type == RenderType.getCutoutMipped()); - } + /** + * Creates a material that renders in the default layer (CUTOUT_MIPPED) + */ + public RenderMaterial(InstancedTileRenderer renderer, ProgramSpec

programSpec, ModelFactory factory) { + this(renderer, programSpec, factory, type -> type == RenderType.getCutoutMipped()); + } - public RenderMaterial(InstancedTileRenderer renderer, ProgramSpec

programSpec, ModelFactory factory, Predicate layerPredicate) { - this.renderer = renderer; - this.models = new HashMap<>(); - this.factory = factory; - this.programSpec = programSpec; - this.layerPredicate = layerPredicate; - registerCompartment(Compartment.PARTIAL); - registerCompartment(Compartment.DIRECTIONAL_PARTIAL); - registerCompartment(Compartment.GENERIC_TILE); - } + public RenderMaterial(InstancedTileRenderer renderer, ProgramSpec

programSpec, ModelFactory factory, Predicate layerPredicate) { + this.renderer = renderer; + this.models = new HashMap<>(); + this.factory = factory; + this.programSpec = programSpec; + this.layerPredicate = layerPredicate; + registerCompartment(Compartment.PARTIAL); + registerCompartment(Compartment.DIRECTIONAL_PARTIAL); + registerCompartment(Compartment.GENERIC_TILE); + } - public boolean canRenderInLayer(RenderType layer) { - return layerPredicate.test(layer); - } + public boolean canRenderInLayer(RenderType layer) { + return layerPredicate.test(layer); + } - public void render(RenderType layer, Matrix4f projection, double camX, double camY, double camZ) { - render(layer, projection, camX, camY, camZ, null); - } + public void render(RenderType layer, Matrix4f projection, double camX, double camY, double camZ) { + render(layer, projection, camX, camY, camZ, null); + } - public void render(RenderType layer, Matrix4f viewProjection, double camX, double camY, double camZ, ShaderCallback

setup) { - P program = Backend.getProgram(programSpec); - program.bind(viewProjection, camX, camY, camZ, FastRenderDispatcher.getDebugMode()); + public void render(RenderType layer, Matrix4f viewProjection, double camX, double camY, double camZ, ShaderCallback

setup) { + P program = Backend.getProgram(programSpec); + program.bind(viewProjection, camX, camY, camZ, FastRenderDispatcher.getDebugMode()); - if (setup != null) setup.call(program); + if (setup != null) setup.call(program); - makeRenderCalls(); - teardown(); - } + makeRenderCalls(); + teardown(); + } - public void teardown() {} + public void teardown() { + } - public void delete() { - runOnAll(InstancedModel::delete); - models.values().forEach(Cache::invalidateAll); - } + public void delete() { + runOnAll(InstancedModel::delete); + models.values().forEach(Cache::invalidateAll); + } - protected void makeRenderCalls() { - runOnAll(InstancedModel::render); - } + protected void makeRenderCalls() { + runOnAll(InstancedModel::render); + } - public void runOnAll(Consumer f) { - for (Cache cache : models.values()) { - for (MODEL model : cache.asMap().values()) { - f.accept(model); - } - } - } + public void runOnAll(Consumer f) { + for (Cache cache : models.values()) { + for (MODEL model : cache.asMap().values()) { + f.accept(model); + } + } + } - public void registerCompartment(Compartment instance) { - models.put(instance, CacheBuilder.newBuilder().build()); - } + public void registerCompartment(Compartment instance) { + models.put(instance, CacheBuilder.newBuilder().build()); + } - public MODEL getModel(PartialModel partial, BlockState referenceState) { - return get(PARTIAL, partial, () -> buildModel(partial.get(), referenceState)); - } + public MODEL getModel(PartialModel partial, BlockState referenceState) { + return get(PARTIAL, partial, () -> buildModel(partial.get(), referenceState)); + } - public MODEL getModel(PartialModel partial, BlockState referenceState, Direction dir) { + public MODEL getModel(PartialModel partial, BlockState referenceState, Direction dir) { return getModel(partial, referenceState, dir, rotateToFace(dir)); - } + } - public MODEL getModel(PartialModel partial, BlockState referenceState, Direction dir, Supplier modelTransform) { - return get(Compartment.DIRECTIONAL_PARTIAL, Pair.of(dir, partial), - () -> buildModel(partial.get(), referenceState, modelTransform.get())); - } + public MODEL getModel(PartialModel partial, BlockState referenceState, Direction dir, Supplier modelTransform) { + return get(Compartment.DIRECTIONAL_PARTIAL, Pair.of(dir, partial), + () -> buildModel(partial.get(), referenceState, modelTransform.get())); + } - public MODEL getModel(BlockState toRender) { - return get(Compartment.GENERIC_TILE, toRender, () -> buildModel(toRender)); - } + public MODEL getModel(BlockState toRender) { + return get(Compartment.GENERIC_TILE, toRender, () -> buildModel(toRender)); + } - public MODEL get(Compartment compartment, T key, Supplier supplier) { - Cache compartmentCache = models.get(compartment); - try { - return compartmentCache.get(key, supplier::get); - } catch (ExecutionException e) { - e.printStackTrace(); - return null; - } - } + public MODEL get(Compartment compartment, T key, Supplier supplier) { + Cache compartmentCache = models.get(compartment); + try { + return compartmentCache.get(key, supplier::get); + } catch (ExecutionException e) { + e.printStackTrace(); + return null; + } + } - private MODEL buildModel(BlockState renderedState) { - BlockRendererDispatcher dispatcher = Minecraft.getInstance().getBlockRendererDispatcher(); - return buildModel(dispatcher.getModelForState(renderedState), renderedState); - } + private MODEL buildModel(BlockState renderedState) { + BlockRendererDispatcher dispatcher = Minecraft.getInstance().getBlockRendererDispatcher(); + return buildModel(dispatcher.getModelForState(renderedState), renderedState); + } private MODEL buildModel(IBakedModel model, BlockState renderedState) { return buildModel(model, renderedState, new MatrixStack()); diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/TileEntityInstance.java b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/TileEntityInstance.java index aece43527..f5f23f31a 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/TileEntityInstance.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/TileEntityInstance.java @@ -32,94 +32,96 @@ import net.minecraft.world.World; */ public abstract class TileEntityInstance implements IInstance { - protected final InstancedTileRenderer renderer; - protected final T tile; - protected final World world; - protected final BlockPos pos; - protected final BlockPos instancePos; - protected final BlockState blockState; + protected final InstancedTileRenderer renderer; + protected final T tile; + protected final World world; + protected final BlockPos pos; + protected final BlockPos instancePos; + protected final BlockState blockState; - public TileEntityInstance(InstancedTileRenderer renderer, T tile) { - this.renderer = renderer; - this.tile = tile; - this.world = tile.getWorld(); - this.pos = tile.getPos(); - this.blockState = tile.getBlockState(); - this.instancePos = pos.subtract(renderer.getOriginCoordinate()); - } + public TileEntityInstance(InstancedTileRenderer renderer, T tile) { + this.renderer = renderer; + this.tile = tile; + this.world = tile.getWorld(); + this.pos = tile.getPos(); + this.blockState = tile.getBlockState(); + this.instancePos = pos.subtract(renderer.getOriginCoordinate()); + } - /** - * Update instance data here. Good for when data doesn't change very often and when animations are GPU based. - * Don't query lighting data here, that's handled separately in {@link #updateLight()}. - * - *

If your animations are complex or more CPU driven, see {@link IDynamicInstance} or {@link ITickableInstance}. - */ - protected void update() { } + /** + * Update instance data here. Good for when data doesn't change very often and when animations are GPU based. + * Don't query lighting data here, that's handled separately in {@link #updateLight()}. + * + *

If your animations are complex or more CPU driven, see {@link IDynamicInstance} or {@link ITickableInstance}. + */ + protected void update() { + } - /** - * Called after construction and when a light update occurs in the world. - * - *
If your model needs it, update light here. - */ - public void updateLight() { } + /** + * Called after construction and when a light update occurs in the world. + * + *
If your model needs it, update light here. + */ + public void updateLight() { + } - /** - * Free any acquired resources. - * - *
eg. call {@link InstanceKey#delete()}. - */ - public abstract void remove(); + /** + * Free any acquired resources. + * + *
eg. call {@link InstanceKey#delete()}. + */ + public abstract void remove(); - /** - * Just before {@link #update()} would be called, shouldReset() is checked. - * If this function returns true, then this instance will be {@link #remove}d, - * and another instance will be constructed to replace it. This allows for more sane resource - * acquisition compared to trying to update everything within the lifetime of an instance. - * - * @return true if this instance should be discarded and refreshed. - */ - public boolean shouldReset() { - return tile.getBlockState() != blockState; - } + /** + * Just before {@link #update()} would be called, shouldReset() is checked. + * If this function returns true, then this instance will be {@link #remove}d, + * and another instance will be constructed to replace it. This allows for more sane resource + * acquisition compared to trying to update everything within the lifetime of an instance. + * + * @return true if this instance should be discarded and refreshed. + */ + public boolean shouldReset() { + return tile.getBlockState() != blockState; + } - /** - * In order to accommodate for floating point precision errors at high coordinates, - * {@link InstancedTileRenderer}s are allowed to arbitrarily adjust the origin, and - * shift the world matrix provided as a shader uniform accordingly. - * - * @return The {@link BlockPos} at which the {@link TileEntity} this instance - * represents should be rendered at to appear in the correct location. - */ - public BlockPos getInstancePosition() { - return instancePos; - } + /** + * In order to accommodate for floating point precision errors at high coordinates, + * {@link InstancedTileRenderer}s are allowed to arbitrarily adjust the origin, and + * shift the world matrix provided as a shader uniform accordingly. + * + * @return The {@link BlockPos} at which the {@link TileEntity} this instance + * represents should be rendered at to appear in the correct location. + */ + public BlockPos getInstancePosition() { + return instancePos; + } - @Override - public BlockPos getWorldPosition() { - return pos; - } + @Override + public BlockPos getWorldPosition() { + return pos; + } - protected void relight(BlockPos pos, IFlatLight... models) { - relight(world.getLightLevel(LightType.BLOCK, pos), world.getLightLevel(LightType.SKY, pos), models); - } + protected void relight(BlockPos pos, IFlatLight... models) { + relight(world.getLightLevel(LightType.BLOCK, pos), world.getLightLevel(LightType.SKY, pos), models); + } - protected > void relight(BlockPos pos, Stream models) { - relight(world.getLightLevel(LightType.BLOCK, pos), world.getLightLevel(LightType.SKY, pos), models); - } + protected > void relight(BlockPos pos, Stream models) { + relight(world.getLightLevel(LightType.BLOCK, pos), world.getLightLevel(LightType.SKY, pos), models); + } - protected void relight(int block, int sky, IFlatLight... models) { - relight(block, sky, Arrays.stream(models)); - } + protected void relight(int block, int sky, IFlatLight... models) { + relight(block, sky, Arrays.stream(models)); + } - protected > void relight(int block, int sky, Stream models) { - models.forEach(model -> model.setBlockLight(block).setSkyLight(sky)); - } + protected > void relight(int block, int sky, Stream models) { + models.forEach(model -> model.setBlockLight(block).setSkyLight(sky)); + } - protected RenderMaterial> getTransformMaterial() { - return renderer.getTransformMaterial(); - } + protected RenderMaterial> getTransformMaterial() { + return renderer.getTransformMaterial(); + } - protected RenderMaterial> getOrientedMaterial() { - return renderer.getOrientedMaterial(); - } + protected RenderMaterial> getOrientedMaterial() { + return renderer.getOrientedMaterial(); + } } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/util/InstanceGroup.java b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/util/InstanceGroup.java index f550f4e46..6aa8f0cff 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/util/InstanceGroup.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/util/InstanceGroup.java @@ -8,7 +8,7 @@ import java.util.List; import com.simibubi.create.foundation.render.backend.instancing.InstanceData; import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; -public class InstanceGroup extends AbstractCollection { +public class InstanceGroup extends AbstractCollection { final InstancedModel model; final List backing; @@ -30,7 +30,6 @@ public class InstanceGroup extends AbstractCollection } /** - * * @param count * @return True if the number of elements changed. */ diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/light/CoordinateConsumer.java b/src/main/java/com/simibubi/create/foundation/render/backend/light/CoordinateConsumer.java index 4011c19e0..6f20a8c33 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/light/CoordinateConsumer.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/light/CoordinateConsumer.java @@ -2,5 +2,5 @@ package com.simibubi.create.foundation.render.backend.light; @FunctionalInterface public interface CoordinateConsumer { - void consume(int x, int y, int z); + void consume(int x, int y, int z); } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/light/EmptyLighter.java b/src/main/java/com/simibubi/create/foundation/render/backend/light/EmptyLighter.java index b58653899..a92cf4e27 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/light/EmptyLighter.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/light/EmptyLighter.java @@ -5,12 +5,12 @@ import com.simibubi.create.content.contraptions.components.structureMovement.Con // so other contraptions don't crash before they have a lighter public class EmptyLighter extends ContraptionLighter { - public EmptyLighter(Contraption contraption) { - super(contraption); - } + public EmptyLighter(Contraption contraption) { + super(contraption); + } - @Override - public GridAlignedBB getContraptionBounds() { - return new GridAlignedBB(0, 0, 0, 1, 1, 1); - } + @Override + public GridAlignedBB getContraptionBounds() { + return new GridAlignedBB(0, 0, 0, 1, 1, 1); + } } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/light/GridAlignedBB.java b/src/main/java/com/simibubi/create/foundation/render/backend/light/GridAlignedBB.java index b8d499010..3703143f5 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/light/GridAlignedBB.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/light/GridAlignedBB.java @@ -11,313 +11,313 @@ import net.minecraft.util.math.SectionPos; import net.minecraft.util.math.vector.Vector3i; public class GridAlignedBB { - public int minX; - public int minY; - public int minZ; - public int maxX; - public int maxY; - public int maxZ; + public int minX; + public int minY; + public int minZ; + public int maxX; + public int maxY; + public int maxZ; - public GridAlignedBB(int minX, int minY, int minZ, int maxX, int maxY, int maxZ) { - this.minX = minX; - this.minY = minY; - this.minZ = minZ; - this.maxX = maxX; - this.maxY = maxY; - this.maxZ = maxZ; - } + public GridAlignedBB(int minX, int minY, int minZ, int maxX, int maxY, int maxZ) { + this.minX = minX; + this.minY = minY; + this.minZ = minZ; + this.maxX = maxX; + this.maxY = maxY; + this.maxZ = maxZ; + } - public static GridAlignedBB ofRadius(int radius) { - return new GridAlignedBB(-radius, -radius, -radius, radius + 1, radius + 1, radius + 1); - } + public static GridAlignedBB ofRadius(int radius) { + return new GridAlignedBB(-radius, -radius, -radius, radius + 1, radius + 1, radius + 1); + } - public static GridAlignedBB copy(GridAlignedBB bb) { - return new GridAlignedBB(bb.minX, bb.minY, bb.minZ, bb.maxX, bb.maxY, bb.maxZ); - } + public static GridAlignedBB copy(GridAlignedBB bb) { + return new GridAlignedBB(bb.minX, bb.minY, bb.minZ, bb.maxX, bb.maxY, bb.maxZ); + } - public static GridAlignedBB from(AxisAlignedBB aabb) { - int minX = (int) Math.floor(aabb.minX); - int minY = (int) Math.floor(aabb.minY); - int minZ = (int) Math.floor(aabb.minZ); - int maxX = (int) Math.ceil(aabb.maxX); - int maxY = (int) Math.ceil(aabb.maxY); - int maxZ = (int) Math.ceil(aabb.maxZ); - return new GridAlignedBB(minX, minY, minZ, maxX, maxY, maxZ); - } + public static GridAlignedBB from(AxisAlignedBB aabb) { + int minX = (int) Math.floor(aabb.minX); + int minY = (int) Math.floor(aabb.minY); + int minZ = (int) Math.floor(aabb.minZ); + int maxX = (int) Math.ceil(aabb.maxX); + int maxY = (int) Math.ceil(aabb.maxY); + int maxZ = (int) Math.ceil(aabb.maxZ); + return new GridAlignedBB(minX, minY, minZ, maxX, maxY, maxZ); + } - public static GridAlignedBB from(SectionPos pos) { - return new GridAlignedBB(pos.getWorldStartX(), - pos.getWorldStartY(), - pos.getWorldStartZ(), - pos.getWorldEndX() + 1, - pos.getWorldEndY() + 1, - pos.getWorldEndZ() + 1); - } + public static GridAlignedBB from(SectionPos pos) { + return new GridAlignedBB(pos.getWorldStartX(), + pos.getWorldStartY(), + pos.getWorldStartZ(), + pos.getWorldEndX() + 1, + pos.getWorldEndY() + 1, + pos.getWorldEndZ() + 1); + } - public static GridAlignedBB from(BlockPos start, BlockPos end) { - return new GridAlignedBB(start.getX(), - start.getY(), - start.getZ(), - end.getX() + 1, - end.getY() + 1, - end.getZ() + 1); - } + public static GridAlignedBB from(BlockPos start, BlockPos end) { + return new GridAlignedBB(start.getX(), + start.getY(), + start.getZ(), + end.getX() + 1, + end.getY() + 1, + end.getZ() + 1); + } - public static GridAlignedBB from(int sectionX, int sectionZ) { - int startX = sectionX << 4; - int startZ = sectionZ << 4; - return new GridAlignedBB(startX, - 0, - startZ, - startX + 16, - 256, - startZ + 16); - } + public static GridAlignedBB from(int sectionX, int sectionZ) { + int startX = sectionX << 4; + int startZ = sectionZ << 4; + return new GridAlignedBB(startX, + 0, + startZ, + startX + 16, + 256, + startZ + 16); + } - public static AxisAlignedBB toAABB(GridAlignedBB bb) { - return new AxisAlignedBB(bb.minX, bb.minY, bb.minZ, bb.maxX, bb.maxY, bb.maxZ); - } + public static AxisAlignedBB toAABB(GridAlignedBB bb) { + return new AxisAlignedBB(bb.minX, bb.minY, bb.minZ, bb.maxX, bb.maxY, bb.maxZ); + } - public GridAlignedBB copy() { - return copy(this); - } + public GridAlignedBB copy() { + return copy(this); + } - public boolean sameAs(GridAlignedBB other) { - return minX == other.minX && - minY == other.minY && - minZ == other.minZ && - maxX == other.maxX && - maxY == other.maxY && - maxZ == other.maxZ; - } + public boolean sameAs(GridAlignedBB other) { + return minX == other.minX && + minY == other.minY && + minZ == other.minZ && + maxX == other.maxX && + maxY == other.maxY && + maxZ == other.maxZ; + } - public void fixMinMax() { - int minX = Math.min(this.minX, this.maxX); - int minY = Math.min(this.minY, this.maxY); - int minZ = Math.min(this.minZ, this.maxZ); - int maxX = Math.max(this.minX, this.maxX); - int maxY = Math.max(this.minY, this.maxY); - int maxZ = Math.max(this.minZ, this.maxZ); + public void fixMinMax() { + int minX = Math.min(this.minX, this.maxX); + int minY = Math.min(this.minY, this.maxY); + int minZ = Math.min(this.minZ, this.maxZ); + int maxX = Math.max(this.minX, this.maxX); + int maxY = Math.max(this.minY, this.maxY); + int maxZ = Math.max(this.minZ, this.maxZ); - this.minX = minX; - this.minY = minY; - this.minZ = minZ; - this.maxX = maxX; - this.maxY = maxY; - this.maxZ = maxZ; - } + this.minX = minX; + this.minY = minY; + this.minZ = minZ; + this.maxX = maxX; + this.maxY = maxY; + this.maxZ = maxZ; + } - public int sizeX() { - return maxX - minX; - } + public int sizeX() { + return maxX - minX; + } - public int sizeY() { - return maxY - minY; - } + public int sizeY() { + return maxY - minY; + } - public int sizeZ() { - return maxZ - minZ; - } + public int sizeZ() { + return maxZ - minZ; + } - public int volume() { - return sizeX() * sizeY() * sizeZ(); - } + public int volume() { + return sizeX() * sizeY() * sizeZ(); + } - public boolean empty() { - // if any dimension has side length 0 this box contains no volume - return minX == maxX || - minY == maxY || - minZ == maxZ; - } + public boolean empty() { + // if any dimension has side length 0 this box contains no volume + return minX == maxX || + minY == maxY || + minZ == maxZ; + } - public void translate(Vector3i by) { - translate(by.getX(), by.getY(), by.getZ()); - } + public void translate(Vector3i by) { + translate(by.getX(), by.getY(), by.getZ()); + } - public void translate(int x, int y, int z) { - minX += x; - maxX += x; - minY += y; - maxY += y; - minZ += z; - maxZ += z; - } + public void translate(int x, int y, int z) { + minX += x; + maxX += x; + minY += y; + maxY += y; + minZ += z; + maxZ += z; + } - public void mirrorAbout(Direction.Axis axis) { - Vector3i axisVec = Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis).getDirectionVec(); - int flipX = axisVec.getX() - 1; - int flipY = axisVec.getY() - 1; - int flipZ = axisVec.getZ() - 1; + public void mirrorAbout(Direction.Axis axis) { + Vector3i axisVec = Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis).getDirectionVec(); + int flipX = axisVec.getX() - 1; + int flipY = axisVec.getY() - 1; + int flipZ = axisVec.getZ() - 1; - int maxX = this.maxX * flipX; - int maxY = this.maxY * flipY; - int maxZ = this.maxZ * flipZ; - this.maxX = this.minX * flipX; - this.maxY = this.minY * flipY; - this.maxZ = this.minZ * flipZ; - this.minX = maxX; - this.minY = maxY; - this.minZ = maxZ; - } + int maxX = this.maxX * flipX; + int maxY = this.maxY * flipY; + int maxZ = this.maxZ * flipZ; + this.maxX = this.minX * flipX; + this.maxY = this.minY * flipY; + this.maxZ = this.minZ * flipZ; + this.minX = maxX; + this.minY = maxY; + this.minZ = maxZ; + } - /** - * Grow this bounding box to have power of 2 side length, scaling from the center. - */ - public void nextPowerOf2Centered() { - int sizeX = sizeX(); - int sizeY = sizeY(); - int sizeZ = sizeZ(); + /** + * Grow this bounding box to have power of 2 side length, scaling from the center. + */ + public void nextPowerOf2Centered() { + int sizeX = sizeX(); + int sizeY = sizeY(); + int sizeZ = sizeZ(); - int newSizeX = RenderUtil.nextPowerOf2(sizeX); - int newSizeY = RenderUtil.nextPowerOf2(sizeY); - int newSizeZ = RenderUtil.nextPowerOf2(sizeZ); + int newSizeX = RenderUtil.nextPowerOf2(sizeX); + int newSizeY = RenderUtil.nextPowerOf2(sizeY); + int newSizeZ = RenderUtil.nextPowerOf2(sizeZ); - int diffX = newSizeX - sizeX; - int diffY = newSizeY - sizeY; - int diffZ = newSizeZ - sizeZ; + int diffX = newSizeX - sizeX; + int diffY = newSizeY - sizeY; + int diffZ = newSizeZ - sizeZ; - minX -= diffX / 2; // floor division for the minimums - minY -= diffY / 2; - minZ -= diffZ / 2; - maxX += (diffX + 1) / 2; // ceiling divison for the maximums - maxY += (diffY + 1) / 2; - maxZ += (diffZ + 1) / 2; - } + minX -= diffX / 2; // floor division for the minimums + minY -= diffY / 2; + minZ -= diffZ / 2; + maxX += (diffX + 1) / 2; // ceiling divison for the maximums + maxY += (diffY + 1) / 2; + maxZ += (diffZ + 1) / 2; + } - /** - * Grow this bounding box to have power of 2 side lengths, scaling from the minimum coords. - */ - public void nextPowerOf2() { - int sizeX = RenderUtil.nextPowerOf2(sizeX()); - int sizeY = RenderUtil.nextPowerOf2(sizeY()); - int sizeZ = RenderUtil.nextPowerOf2(sizeZ()); + /** + * Grow this bounding box to have power of 2 side lengths, scaling from the minimum coords. + */ + public void nextPowerOf2() { + int sizeX = RenderUtil.nextPowerOf2(sizeX()); + int sizeY = RenderUtil.nextPowerOf2(sizeY()); + int sizeZ = RenderUtil.nextPowerOf2(sizeZ()); - this.maxX = this.minX + sizeX; - this.maxY = this.minY + sizeY; - this.maxZ = this.minZ + sizeZ; - } + this.maxX = this.minX + sizeX; + this.maxY = this.minY + sizeY; + this.maxZ = this.minZ + sizeZ; + } - public boolean hasPowerOf2Sides() { - // this is only true if all individual side lengths are powers of 2 - return isPowerOf2(volume()); - } + public boolean hasPowerOf2Sides() { + // this is only true if all individual side lengths are powers of 2 + return isPowerOf2(volume()); + } - public void grow(int s) { - this.grow(s, s, s); - } + public void grow(int s) { + this.grow(s, s, s); + } - public void grow(int x, int y, int z) { - minX -= x; - minY -= y; - minZ -= z; - maxX += x; - maxY += y; - maxZ += z; - } + public void grow(int x, int y, int z) { + minX -= x; + minY -= y; + minZ -= z; + maxX += x; + maxY += y; + maxZ += z; + } - public GridAlignedBB intersect(GridAlignedBB other) { - int minX = Math.max(this.minX, other.minX); - int minY = Math.max(this.minY, other.minY); - int minZ = Math.max(this.minZ, other.minZ); - int maxX = Math.min(this.maxX, other.maxX); - int maxY = Math.min(this.maxY, other.maxY); - int maxZ = Math.min(this.maxZ, other.maxZ); - return new GridAlignedBB(minX, minY, minZ, maxX, maxY, maxZ); - } + public GridAlignedBB intersect(GridAlignedBB other) { + int minX = Math.max(this.minX, other.minX); + int minY = Math.max(this.minY, other.minY); + int minZ = Math.max(this.minZ, other.minZ); + int maxX = Math.min(this.maxX, other.maxX); + int maxY = Math.min(this.maxY, other.maxY); + int maxZ = Math.min(this.maxZ, other.maxZ); + return new GridAlignedBB(minX, minY, minZ, maxX, maxY, maxZ); + } - public void intersectAssign(GridAlignedBB other) { - this.minX = Math.max(this.minX, other.minX); - this.minY = Math.max(this.minY, other.minY); - this.minZ = Math.max(this.minZ, other.minZ); - this.maxX = Math.min(this.maxX, other.maxX); - this.maxY = Math.min(this.maxY, other.maxY); - this.maxZ = Math.min(this.maxZ, other.maxZ); - } + public void intersectAssign(GridAlignedBB other) { + this.minX = Math.max(this.minX, other.minX); + this.minY = Math.max(this.minY, other.minY); + this.minZ = Math.max(this.minZ, other.minZ); + this.maxX = Math.min(this.maxX, other.maxX); + this.maxY = Math.min(this.maxY, other.maxY); + this.maxZ = Math.min(this.maxZ, other.maxZ); + } - public GridAlignedBB union(GridAlignedBB other) { - int minX = Math.min(this.minX, other.minX); - int minY = Math.min(this.minY, other.minY); - int minZ = Math.min(this.minZ, other.minZ); - int maxX = Math.max(this.maxX, other.maxX); - int maxY = Math.max(this.maxY, other.maxY); - int maxZ = Math.max(this.maxZ, other.maxZ); - return new GridAlignedBB(minX, minY, minZ, maxX, maxY, maxZ); - } + public GridAlignedBB union(GridAlignedBB other) { + int minX = Math.min(this.minX, other.minX); + int minY = Math.min(this.minY, other.minY); + int minZ = Math.min(this.minZ, other.minZ); + int maxX = Math.max(this.maxX, other.maxX); + int maxY = Math.max(this.maxY, other.maxY); + int maxZ = Math.max(this.maxZ, other.maxZ); + return new GridAlignedBB(minX, minY, minZ, maxX, maxY, maxZ); + } - public void unionAssign(GridAlignedBB other) { - this.minX = Math.min(this.minX, other.minX); - this.minY = Math.min(this.minY, other.minY); - this.minZ = Math.min(this.minZ, other.minZ); - this.maxX = Math.max(this.maxX, other.maxX); - this.maxY = Math.max(this.maxY, other.maxY); - this.maxZ = Math.max(this.maxZ, other.maxZ); - } + public void unionAssign(GridAlignedBB other) { + this.minX = Math.min(this.minX, other.minX); + this.minY = Math.min(this.minY, other.minY); + this.minZ = Math.min(this.minZ, other.minZ); + this.maxX = Math.max(this.maxX, other.maxX); + this.maxY = Math.max(this.maxY, other.maxY); + this.maxZ = Math.max(this.maxZ, other.maxZ); + } - public void unionAssign(AxisAlignedBB other) { - this.minX = Math.min(this.minX, (int) Math.floor(other.minX)); - this.minY = Math.min(this.minY, (int) Math.floor(other.minY)); - this.minZ = Math.min(this.minZ, (int) Math.floor(other.minZ)); - this.maxX = Math.max(this.maxX, (int) Math.ceil(other.maxX)); - this.maxY = Math.max(this.maxY, (int) Math.ceil(other.maxY)); - this.maxZ = Math.max(this.maxZ, (int) Math.ceil(other.maxZ)); - } + public void unionAssign(AxisAlignedBB other) { + this.minX = Math.min(this.minX, (int) Math.floor(other.minX)); + this.minY = Math.min(this.minY, (int) Math.floor(other.minY)); + this.minZ = Math.min(this.minZ, (int) Math.floor(other.minZ)); + this.maxX = Math.max(this.maxX, (int) Math.ceil(other.maxX)); + this.maxY = Math.max(this.maxY, (int) Math.ceil(other.maxY)); + this.maxZ = Math.max(this.maxZ, (int) Math.ceil(other.maxZ)); + } - public boolean intersects(GridAlignedBB other) { - return this.intersects(other.minX, other.minY, other.minZ, other.maxX, other.maxY, other.maxZ); - } + public boolean intersects(GridAlignedBB other) { + return this.intersects(other.minX, other.minY, other.minZ, other.maxX, other.maxY, other.maxZ); + } - public boolean contains(GridAlignedBB other) { - return other.minX >= this.minX && - other.maxX <= this.maxX && - other.minY >= this.minY && - other.maxY <= this.maxY && - other.minZ >= this.minZ && - other.maxZ <= this.maxZ; - } + public boolean contains(GridAlignedBB other) { + return other.minX >= this.minX && + other.maxX <= this.maxX && + other.minY >= this.minY && + other.maxY <= this.maxY && + other.minZ >= this.minZ && + other.maxZ <= this.maxZ; + } - public boolean isContainedBy(GridAlignedBB other) { - return other.contains(this); - } + public boolean isContainedBy(GridAlignedBB other) { + return other.contains(this); + } - public boolean intersects(int minX, int minY, int minZ, int maxX, int maxY, int maxZ) { - return this.minX < maxX && this.maxX > minX && this.minY < maxY && this.maxY > minY && this.minZ < maxZ && this.maxZ > minZ; - } + public boolean intersects(int minX, int minY, int minZ, int maxX, int maxY, int maxZ) { + return this.minX < maxX && this.maxX > minX && this.minY < maxY && this.maxY > minY && this.minZ < maxZ && this.maxZ > minZ; + } - public void forEachContained(CoordinateConsumer func) { - if (empty()) return; + public void forEachContained(CoordinateConsumer func) { + if (empty()) return; - for (int x = minX; x < maxX; x++) { - for (int y = Math.max(minY, 0); y < Math.min(maxY, 255); y++) { // clamp to world height limits - for (int z = minZ; z < maxZ; z++) { - func.consume(x, y, z); - } - } - } - } + for (int x = minX; x < maxX; x++) { + for (int y = Math.max(minY, 0); y < Math.min(maxY, 255); y++) { // clamp to world height limits + for (int z = minZ; z < maxZ; z++) { + func.consume(x, y, z); + } + } + } + } - public AxisAlignedBB toAABB() { - return toAABB(this); - } + public AxisAlignedBB toAABB() { + return toAABB(this); + } - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; - GridAlignedBB that = (GridAlignedBB) o; + GridAlignedBB that = (GridAlignedBB) o; - return this.sameAs(that); - } + return this.sameAs(that); + } - @Override - public int hashCode() { - int result = minX; - result = 31 * result + minY; - result = 31 * result + minZ; - result = 31 * result + maxX; - result = 31 * result + maxY; - result = 31 * result + maxZ; - return result; - } + @Override + public int hashCode() { + int result = minX; + result = 31 * result + minY; + result = 31 * result + minZ; + result = 31 * result + maxX; + result = 31 * result + maxY; + result = 31 * result + maxZ; + return result; + } } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/light/LightUpdater.java b/src/main/java/com/simibubi/create/foundation/render/backend/light/LightUpdater.java index dd63bef83..089376a23 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/light/LightUpdater.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/light/LightUpdater.java @@ -49,11 +49,11 @@ public class LightUpdater { /** * Add a listener associated with the given {@link BlockPos}. - * + *

* When a light update occurs in the chunk the position is contained in, * {@link LightUpdateListener#onLightUpdate} will be called. * - * @param pos The position in the world that the listener cares about. + * @param pos The position in the world that the listener cares about. * @param listener The object that wants to receive light update notifications. */ public void startListening(BlockPos pos, LightUpdateListener listener) { @@ -71,11 +71,11 @@ public class LightUpdater { /** * Add a listener associated with the given {@link GridAlignedBB}. - * + *

* When a light update occurs in any chunk spanning the given volume, * {@link LightUpdateListener#onLightUpdate} will be called. * - * @param volume The volume in the world that the listener cares about. + * @param volume The volume in the world that the listener cares about. * @param listener The object that wants to receive light update notifications. */ public void startListening(GridAlignedBB volume, LightUpdateListener listener) { @@ -106,8 +106,8 @@ public class LightUpdater { /** * Dispatch light updates to all registered {@link LightUpdateListener}s. * - * @param world The world in which light was updated. - * @param type The type of light that changed. + * @param world The world in which light was updated. + * @param type The type of light that changed. * @param sectionPos A long representing the section position where light changed. */ public void onLightUpdate(IBlockDisplayReader world, LightType type, long sectionPos) { diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/light/LightVolume.java b/src/main/java/com/simibubi/create/foundation/render/backend/light/LightVolume.java index e201550f7..ae0bdaa23 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/light/LightVolume.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/light/LightVolume.java @@ -19,291 +19,294 @@ import net.minecraft.world.LightType; public class LightVolume { - private GridAlignedBB sampleVolume; - private GridAlignedBB textureVolume; - private ByteBuffer lightData; - - private boolean bufferDirty; - private boolean removed; - - private final GlTexture glTexture; - - private final RGPixelFormat pixelFormat; - - public LightVolume(GridAlignedBB sampleVolume) { - setSampleVolume(sampleVolume); - - pixelFormat = Backend.compat.pixelFormat; - - this.glTexture = new GlTexture(GL20.GL_TEXTURE_3D); - this.lightData = MemoryUtil.memAlloc(this.textureVolume.volume() * pixelFormat.byteCount()); - - // allocate space for the texture - GL20.glActiveTexture(GL20.GL_TEXTURE4); - glTexture.bind(); - - int sizeX = textureVolume.sizeX(); - int sizeY = textureVolume.sizeY(); - int sizeZ = textureVolume.sizeZ(); - GL12.glTexImage3D(GL12.GL_TEXTURE_3D, 0, pixelFormat.internalFormat(), sizeX, sizeY, sizeZ, 0, pixelFormat.format(), GL20.GL_UNSIGNED_BYTE, 0); - - glTexture.unbind(); - GL20.glActiveTexture(GL20.GL_TEXTURE0); - } - - private void setSampleVolume(GridAlignedBB sampleVolume) { - this.sampleVolume = sampleVolume; - this.textureVolume = sampleVolume.copy(); - this.textureVolume.nextPowerOf2Centered(); - } - - public GridAlignedBB getTextureVolume() { - return GridAlignedBB.copy(textureVolume); - } - - public GridAlignedBB getSampleVolume() { - return GridAlignedBB.copy(sampleVolume); - } - - public int getMinX() { - return textureVolume.minX; - } - - public int getMinY() { - return textureVolume.minY; - } - - public int getMinZ() { - return textureVolume.minZ; - } - - public int getMaxX() { - return textureVolume.maxX; - } - - public int getMaxY() { - return textureVolume.maxY; - } - - public int getMaxZ() { - return textureVolume.maxZ; - } - - public int getSizeX() { - return textureVolume.sizeX(); - } - - public int getSizeY() { - return textureVolume.sizeY(); - } - - public int getSizeZ() { - return textureVolume.sizeZ(); - } - - public void move(IBlockDisplayReader world, GridAlignedBB newSampleVolume) { - if (textureVolume.contains(newSampleVolume)) { - if (newSampleVolume.intersects(sampleVolume)) { - GridAlignedBB newArea = newSampleVolume.intersect(sampleVolume); - sampleVolume = newSampleVolume; - - copyLight(world, newArea); - } else { - sampleVolume = newSampleVolume; - initialize(world); - } - } else { - setSampleVolume(newSampleVolume); - int volume = textureVolume.volume(); - if (volume * 2 > lightData.capacity()) { - lightData = MemoryUtil.memRealloc(lightData, volume * 2); - } - initialize(world); - } - } - - public void notifyLightUpdate(IBlockDisplayReader world, LightType type, GridAlignedBB changedVolume) { - if (removed) - return; - - if (!changedVolume.intersects(sampleVolume)) - return; - changedVolume = changedVolume.intersect(sampleVolume); // compute the region contained by us that has dirty lighting data. - - if (type == LightType.BLOCK) copyBlock(world, changedVolume); - else if (type == LightType.SKY) copySky(world, changedVolume); - } - - public void notifyLightPacket(IBlockDisplayReader world, int chunkX, int chunkZ) { - if (removed) return; - - GridAlignedBB changedVolume = GridAlignedBB.from(chunkX, chunkZ); - if (!changedVolume.intersects(sampleVolume)) - return; - changedVolume.intersectAssign(sampleVolume); // compute the region contained by us that has dirty lighting data. - - copyLight(world, changedVolume); - } - - /** - * Completely (re)populate this volume with block and sky lighting data. - * This is expensive and should be avoided. - */ - public void initialize(IBlockDisplayReader world) { - BlockPos.Mutable pos = new BlockPos.Mutable(); - - int shiftX = textureVolume.minX; - int shiftY = textureVolume.minY; - int shiftZ = textureVolume.minZ; - - sampleVolume.forEachContained((x, y, z) -> { - pos.setPos(x, y, z); - - int blockLight = world.getLightLevel(LightType.BLOCK, pos); - int skyLight = world.getLightLevel(LightType.SKY, pos); - - writeLight(x - shiftX, y - shiftY, z - shiftZ, blockLight, skyLight); - }); - - bufferDirty = true; - } - - /** - * Copy block light from the world into this volume. - * @param worldVolume the region in the world to copy data from. - */ - public void copyBlock(IBlockDisplayReader world, GridAlignedBB worldVolume) { - BlockPos.Mutable pos = new BlockPos.Mutable(); - - int xShift = textureVolume.minX; - int yShift = textureVolume.minY; - int zShift = textureVolume.minZ; - - worldVolume.forEachContained((x, y, z) -> { - pos.setPos(x, y, z); - - int light = world.getLightLevel(LightType.BLOCK, pos); - - writeBlock(x - xShift, y - yShift, z - zShift, light); - }); - - bufferDirty = true; - } - - /** - * Copy sky light from the world into this volume. - * @param worldVolume the region in the world to copy data from. - */ - public void copySky(IBlockDisplayReader world, GridAlignedBB worldVolume) { - BlockPos.Mutable pos = new BlockPos.Mutable(); - - int xShift = textureVolume.minX; - int yShift = textureVolume.minY; - int zShift = textureVolume.minZ; - - worldVolume.forEachContained((x, y, z) -> { - pos.setPos(x, y, z); - - int light = world.getLightLevel(LightType.SKY, pos); - - writeSky(x - xShift, y - yShift, z - zShift, light); - }); - - bufferDirty = true; - } - - /** - * Copy all light from the world into this volume. - * @param worldVolume the region in the world to copy data from. - */ - public void copyLight(IBlockDisplayReader world, GridAlignedBB worldVolume) { - BlockPos.Mutable pos = new BlockPos.Mutable(); - - int xShift = textureVolume.minX; - int yShift = textureVolume.minY; - int zShift = textureVolume.minZ; - - worldVolume.forEachContained((x, y, z) -> { - pos.setPos(x, y, z); - - int block = world.getLightLevel(LightType.BLOCK, pos); - int sky = world.getLightLevel(LightType.SKY, pos); - - writeLight(x - xShift, y - yShift, z - zShift, block, sky); - }); - - bufferDirty = true; - } - - public void bind() { - // just in case something goes wrong or we accidentally call this before this volume is properly disposed of. - if (lightData == null || removed) return; - - GL13.glActiveTexture(GL20.GL_TEXTURE4); - glTexture.bind(); - GL11.glTexParameteri(GL13.GL_TEXTURE_3D, GL13.GL_TEXTURE_MIN_FILTER, GL13.GL_LINEAR); - GL11.glTexParameteri(GL13.GL_TEXTURE_3D, GL13.GL_TEXTURE_MAG_FILTER, GL13.GL_LINEAR); - GL11.glTexParameteri(GL13.GL_TEXTURE_3D, GL13.GL_TEXTURE_WRAP_S, GL20.GL_MIRRORED_REPEAT); - GL11.glTexParameteri(GL13.GL_TEXTURE_3D, GL13.GL_TEXTURE_WRAP_R, GL20.GL_MIRRORED_REPEAT); - GL11.glTexParameteri(GL13.GL_TEXTURE_3D, GL13.GL_TEXTURE_WRAP_T, GL20.GL_MIRRORED_REPEAT); - - uploadTexture(); - } - - private void uploadTexture() { - if (bufferDirty) { - GL20.glPixelStorei(GL20.GL_UNPACK_ROW_LENGTH, 0); - GL20.glPixelStorei(GL20.GL_UNPACK_SKIP_PIXELS, 0); - GL20.glPixelStorei(GL20.GL_UNPACK_SKIP_ROWS, 0); - GL20.glPixelStorei(GL20.GL_UNPACK_SKIP_IMAGES, 0); - GL20.glPixelStorei(GL20.GL_UNPACK_IMAGE_HEIGHT, 0); - GL20.glPixelStorei(GL20.GL_UNPACK_ALIGNMENT, 2); - int sizeX = textureVolume.sizeX(); - int sizeY = textureVolume.sizeY(); - int sizeZ = textureVolume.sizeZ(); - - GL12.glTexSubImage3D(GL12.GL_TEXTURE_3D, 0, 0, 0, 0, sizeX, sizeY, sizeZ, pixelFormat.format(), GL20.GL_UNSIGNED_BYTE, lightData); - - GL20.glPixelStorei(GL20.GL_UNPACK_ALIGNMENT, 4); // 4 is the default - bufferDirty = false; - } - } - - public void unbind() { - glTexture.unbind(); - } - - public void delete() { - removed = true; - RenderWork.enqueue(() -> { - glTexture.delete(); - MemoryUtil.memFree(lightData); - lightData = null; - }); - } - - private void writeLight(int x, int y, int z, int block, int sky) { - byte b = (byte) ((block & 0xF) << 4); - byte s = (byte) ((sky & 0xF) << 4); - - int i = posToIndex(x, y, z); - lightData.put(i, b); - lightData.put(i + 1, s); - } - - private void writeBlock(int x, int y, int z, int block) { - byte b = (byte) ((block & 0xF) << 4); - - lightData.put(posToIndex(x, y, z), b); - } - - private void writeSky(int x, int y, int z, int sky) { - byte b = (byte) ((sky & 0xF) << 4); - - lightData.put(posToIndex(x, y, z) + 1, b); - } - - private int posToIndex(int x, int y, int z) { - return (x + textureVolume.sizeX() * (y + z * textureVolume.sizeY())) * pixelFormat.byteCount(); - } + private GridAlignedBB sampleVolume; + private GridAlignedBB textureVolume; + private ByteBuffer lightData; + + private boolean bufferDirty; + private boolean removed; + + private final GlTexture glTexture; + + private final RGPixelFormat pixelFormat; + + public LightVolume(GridAlignedBB sampleVolume) { + setSampleVolume(sampleVolume); + + pixelFormat = Backend.compat.pixelFormat; + + this.glTexture = new GlTexture(GL20.GL_TEXTURE_3D); + this.lightData = MemoryUtil.memAlloc(this.textureVolume.volume() * pixelFormat.byteCount()); + + // allocate space for the texture + GL20.glActiveTexture(GL20.GL_TEXTURE4); + glTexture.bind(); + + int sizeX = textureVolume.sizeX(); + int sizeY = textureVolume.sizeY(); + int sizeZ = textureVolume.sizeZ(); + GL12.glTexImage3D(GL12.GL_TEXTURE_3D, 0, pixelFormat.internalFormat(), sizeX, sizeY, sizeZ, 0, pixelFormat.format(), GL20.GL_UNSIGNED_BYTE, 0); + + glTexture.unbind(); + GL20.glActiveTexture(GL20.GL_TEXTURE0); + } + + private void setSampleVolume(GridAlignedBB sampleVolume) { + this.sampleVolume = sampleVolume; + this.textureVolume = sampleVolume.copy(); + this.textureVolume.nextPowerOf2Centered(); + } + + public GridAlignedBB getTextureVolume() { + return GridAlignedBB.copy(textureVolume); + } + + public GridAlignedBB getSampleVolume() { + return GridAlignedBB.copy(sampleVolume); + } + + public int getMinX() { + return textureVolume.minX; + } + + public int getMinY() { + return textureVolume.minY; + } + + public int getMinZ() { + return textureVolume.minZ; + } + + public int getMaxX() { + return textureVolume.maxX; + } + + public int getMaxY() { + return textureVolume.maxY; + } + + public int getMaxZ() { + return textureVolume.maxZ; + } + + public int getSizeX() { + return textureVolume.sizeX(); + } + + public int getSizeY() { + return textureVolume.sizeY(); + } + + public int getSizeZ() { + return textureVolume.sizeZ(); + } + + public void move(IBlockDisplayReader world, GridAlignedBB newSampleVolume) { + if (textureVolume.contains(newSampleVolume)) { + if (newSampleVolume.intersects(sampleVolume)) { + GridAlignedBB newArea = newSampleVolume.intersect(sampleVolume); + sampleVolume = newSampleVolume; + + copyLight(world, newArea); + } else { + sampleVolume = newSampleVolume; + initialize(world); + } + } else { + setSampleVolume(newSampleVolume); + int volume = textureVolume.volume(); + if (volume * 2 > lightData.capacity()) { + lightData = MemoryUtil.memRealloc(lightData, volume * 2); + } + initialize(world); + } + } + + public void notifyLightUpdate(IBlockDisplayReader world, LightType type, GridAlignedBB changedVolume) { + if (removed) + return; + + if (!changedVolume.intersects(sampleVolume)) + return; + changedVolume = changedVolume.intersect(sampleVolume); // compute the region contained by us that has dirty lighting data. + + if (type == LightType.BLOCK) copyBlock(world, changedVolume); + else if (type == LightType.SKY) copySky(world, changedVolume); + } + + public void notifyLightPacket(IBlockDisplayReader world, int chunkX, int chunkZ) { + if (removed) return; + + GridAlignedBB changedVolume = GridAlignedBB.from(chunkX, chunkZ); + if (!changedVolume.intersects(sampleVolume)) + return; + changedVolume.intersectAssign(sampleVolume); // compute the region contained by us that has dirty lighting data. + + copyLight(world, changedVolume); + } + + /** + * Completely (re)populate this volume with block and sky lighting data. + * This is expensive and should be avoided. + */ + public void initialize(IBlockDisplayReader world) { + BlockPos.Mutable pos = new BlockPos.Mutable(); + + int shiftX = textureVolume.minX; + int shiftY = textureVolume.minY; + int shiftZ = textureVolume.minZ; + + sampleVolume.forEachContained((x, y, z) -> { + pos.setPos(x, y, z); + + int blockLight = world.getLightLevel(LightType.BLOCK, pos); + int skyLight = world.getLightLevel(LightType.SKY, pos); + + writeLight(x - shiftX, y - shiftY, z - shiftZ, blockLight, skyLight); + }); + + bufferDirty = true; + } + + /** + * Copy block light from the world into this volume. + * + * @param worldVolume the region in the world to copy data from. + */ + public void copyBlock(IBlockDisplayReader world, GridAlignedBB worldVolume) { + BlockPos.Mutable pos = new BlockPos.Mutable(); + + int xShift = textureVolume.minX; + int yShift = textureVolume.minY; + int zShift = textureVolume.minZ; + + worldVolume.forEachContained((x, y, z) -> { + pos.setPos(x, y, z); + + int light = world.getLightLevel(LightType.BLOCK, pos); + + writeBlock(x - xShift, y - yShift, z - zShift, light); + }); + + bufferDirty = true; + } + + /** + * Copy sky light from the world into this volume. + * + * @param worldVolume the region in the world to copy data from. + */ + public void copySky(IBlockDisplayReader world, GridAlignedBB worldVolume) { + BlockPos.Mutable pos = new BlockPos.Mutable(); + + int xShift = textureVolume.minX; + int yShift = textureVolume.minY; + int zShift = textureVolume.minZ; + + worldVolume.forEachContained((x, y, z) -> { + pos.setPos(x, y, z); + + int light = world.getLightLevel(LightType.SKY, pos); + + writeSky(x - xShift, y - yShift, z - zShift, light); + }); + + bufferDirty = true; + } + + /** + * Copy all light from the world into this volume. + * + * @param worldVolume the region in the world to copy data from. + */ + public void copyLight(IBlockDisplayReader world, GridAlignedBB worldVolume) { + BlockPos.Mutable pos = new BlockPos.Mutable(); + + int xShift = textureVolume.minX; + int yShift = textureVolume.minY; + int zShift = textureVolume.minZ; + + worldVolume.forEachContained((x, y, z) -> { + pos.setPos(x, y, z); + + int block = world.getLightLevel(LightType.BLOCK, pos); + int sky = world.getLightLevel(LightType.SKY, pos); + + writeLight(x - xShift, y - yShift, z - zShift, block, sky); + }); + + bufferDirty = true; + } + + public void bind() { + // just in case something goes wrong or we accidentally call this before this volume is properly disposed of. + if (lightData == null || removed) return; + + GL13.glActiveTexture(GL20.GL_TEXTURE4); + glTexture.bind(); + GL11.glTexParameteri(GL13.GL_TEXTURE_3D, GL13.GL_TEXTURE_MIN_FILTER, GL13.GL_LINEAR); + GL11.glTexParameteri(GL13.GL_TEXTURE_3D, GL13.GL_TEXTURE_MAG_FILTER, GL13.GL_LINEAR); + GL11.glTexParameteri(GL13.GL_TEXTURE_3D, GL13.GL_TEXTURE_WRAP_S, GL20.GL_MIRRORED_REPEAT); + GL11.glTexParameteri(GL13.GL_TEXTURE_3D, GL13.GL_TEXTURE_WRAP_R, GL20.GL_MIRRORED_REPEAT); + GL11.glTexParameteri(GL13.GL_TEXTURE_3D, GL13.GL_TEXTURE_WRAP_T, GL20.GL_MIRRORED_REPEAT); + + uploadTexture(); + } + + private void uploadTexture() { + if (bufferDirty) { + GL20.glPixelStorei(GL20.GL_UNPACK_ROW_LENGTH, 0); + GL20.glPixelStorei(GL20.GL_UNPACK_SKIP_PIXELS, 0); + GL20.glPixelStorei(GL20.GL_UNPACK_SKIP_ROWS, 0); + GL20.glPixelStorei(GL20.GL_UNPACK_SKIP_IMAGES, 0); + GL20.glPixelStorei(GL20.GL_UNPACK_IMAGE_HEIGHT, 0); + GL20.glPixelStorei(GL20.GL_UNPACK_ALIGNMENT, 2); + int sizeX = textureVolume.sizeX(); + int sizeY = textureVolume.sizeY(); + int sizeZ = textureVolume.sizeZ(); + + GL12.glTexSubImage3D(GL12.GL_TEXTURE_3D, 0, 0, 0, 0, sizeX, sizeY, sizeZ, pixelFormat.format(), GL20.GL_UNSIGNED_BYTE, lightData); + + GL20.glPixelStorei(GL20.GL_UNPACK_ALIGNMENT, 4); // 4 is the default + bufferDirty = false; + } + } + + public void unbind() { + glTexture.unbind(); + } + + public void delete() { + removed = true; + RenderWork.enqueue(() -> { + glTexture.delete(); + MemoryUtil.memFree(lightData); + lightData = null; + }); + } + + private void writeLight(int x, int y, int z, int block, int sky) { + byte b = (byte) ((block & 0xF) << 4); + byte s = (byte) ((sky & 0xF) << 4); + + int i = posToIndex(x, y, z); + lightData.put(i, b); + lightData.put(i + 1, s); + } + + private void writeBlock(int x, int y, int z, int block) { + byte b = (byte) ((block & 0xF) << 4); + + lightData.put(posToIndex(x, y, z), b); + } + + private void writeSky(int x, int y, int z, int sky) { + byte b = (byte) ((sky & 0xF) << 4); + + lightData.put(posToIndex(x, y, z) + 1, b); + } + + private int posToIndex(int x, int y, int z) { + return (x + textureVolume.sizeX() * (y + z * textureVolume.sizeY())) * pixelFormat.byteCount(); + } } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/light/LightVolumeDebugger.java b/src/main/java/com/simibubi/create/foundation/render/backend/light/LightVolumeDebugger.java index ca96b1b79..e63257d04 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/light/LightVolumeDebugger.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/light/LightVolumeDebugger.java @@ -10,26 +10,26 @@ import com.simibubi.create.foundation.utility.Pair; import com.simibubi.create.foundation.utility.outliner.AABBOutline; public class LightVolumeDebugger { - public static void render(MatrixStack ms, SuperRenderTypeBuffer buffer) { - ContraptionRenderDispatcher.renderers.values() - .stream() - .flatMap(r -> { - GridAlignedBB texture = r.getLighter().lightVolume.getTextureVolume(); - GridAlignedBB sample = r.getLighter().lightVolume.getSampleVolume(); + public static void render(MatrixStack ms, SuperRenderTypeBuffer buffer) { + ContraptionRenderDispatcher.renderers.values() + .stream() + .flatMap(r -> { + GridAlignedBB texture = r.getLighter().lightVolume.getTextureVolume(); + GridAlignedBB sample = r.getLighter().lightVolume.getSampleVolume(); - ArrayList> pairs = new ArrayList<>(2); + ArrayList> pairs = new ArrayList<>(2); - pairs.add(Pair.of(texture, 0xFFFFFF)); - pairs.add(Pair.of(sample, 0xFFFF00)); + pairs.add(Pair.of(texture, 0xFFFFFF)); + pairs.add(Pair.of(sample, 0xFFFF00)); - return pairs.stream(); - }) - .map(pair -> { - AABBOutline outline = new AABBOutline(GridAlignedBB.toAABB(pair.getFirst())); + return pairs.stream(); + }) + .map(pair -> { + AABBOutline outline = new AABBOutline(GridAlignedBB.toAABB(pair.getFirst())); - outline.getParams().colored(pair.getSecond()); - return outline; - }) - .forEach(outline -> outline.render(ms, buffer, AnimationTickHolder.getPartialTicks())); - } + outline.getParams().colored(pair.getSecond()); + return outline; + }) + .forEach(outline -> outline.render(ms, buffer, AnimationTickHolder.getPartialTicks())); + } } From c9718b0a1bc4bca17922b0f05f61cec0ef0daa87 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Fri, 30 Apr 2021 00:31:52 -0700 Subject: [PATCH 15/18] No more compartments in Flywheel. It never really needed them in the first place. --- .../foundation/render/backend/RenderUtil.java | 19 +++++- .../backend/instancing/RenderMaterial.java | 59 +++++-------------- 2 files changed, 33 insertions(+), 45 deletions(-) diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/RenderUtil.java b/src/main/java/com/simibubi/create/foundation/render/backend/RenderUtil.java index 43058e362..9ed534cde 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/RenderUtil.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/RenderUtil.java @@ -1,7 +1,12 @@ package com.simibubi.create.foundation.render.backend; -import com.mojang.blaze3d.matrix.MatrixStack; +import java.util.function.Supplier; +import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.foundation.utility.AngleHelper; +import com.simibubi.create.foundation.utility.MatrixStacker; + +import net.minecraft.util.Direction; import net.minecraft.util.math.vector.Matrix3f; import net.minecraft.util.math.vector.Matrix4f; @@ -71,4 +76,16 @@ public class RenderUtil { model.a33, }; } + + public static Supplier rotateToFace(Direction facing) { + return () -> { + MatrixStack stack = new MatrixStack(); + MatrixStacker.of(stack) + .centre() + .rotateY(AngleHelper.horizontalAngle(facing)) + .rotateX(AngleHelper.verticalAngle(facing)) + .unCentre(); + return stack; + }; + } } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/RenderMaterial.java b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/RenderMaterial.java index d91077e2b..9458f4f6a 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/RenderMaterial.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/RenderMaterial.java @@ -1,9 +1,5 @@ package com.simibubi.create.foundation.render.backend.instancing; -import static com.simibubi.create.foundation.render.Compartment.PARTIAL; - -import java.util.HashMap; -import java.util.Map; import java.util.concurrent.ExecutionException; import java.util.function.Consumer; import java.util.function.Predicate; @@ -14,16 +10,14 @@ import org.apache.commons.lang3.tuple.Pair; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; import com.mojang.blaze3d.matrix.MatrixStack; -import com.simibubi.create.foundation.render.Compartment; import com.simibubi.create.foundation.render.SuperByteBufferCache; import com.simibubi.create.foundation.render.backend.Backend; import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; +import com.simibubi.create.foundation.render.backend.RenderUtil; import com.simibubi.create.foundation.render.backend.core.PartialModel; import com.simibubi.create.foundation.render.backend.gl.BasicProgram; import com.simibubi.create.foundation.render.backend.gl.shader.ProgramSpec; import com.simibubi.create.foundation.render.backend.gl.shader.ShaderCallback; -import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.MatrixStacker; import net.minecraft.block.BlockState; import net.minecraft.client.Minecraft; @@ -37,7 +31,7 @@ import net.minecraft.util.math.vector.Matrix4f; public class RenderMaterial

> { protected final InstancedTileRenderer renderer; - protected final Map, Cache> models; + protected final Cache models; protected final ModelFactory factory; protected final ProgramSpec

programSpec; protected final Predicate layerPredicate; @@ -51,13 +45,12 @@ public class RenderMaterial

renderer, ProgramSpec

programSpec, ModelFactory factory, Predicate layerPredicate) { this.renderer = renderer; - this.models = new HashMap<>(); + this.models = CacheBuilder.newBuilder() + .removalListener(notification -> ((InstancedModel) notification.getValue()).delete()) + .build(); this.factory = factory; this.programSpec = programSpec; this.layerPredicate = layerPredicate; - registerCompartment(Compartment.PARTIAL); - registerCompartment(Compartment.DIRECTIONAL_PARTIAL); - registerCompartment(Compartment.GENERIC_TILE); } public boolean canRenderInLayer(RenderType layer) { @@ -75,15 +68,11 @@ public class RenderMaterial

f) { - for (Cache cache : models.values()) { - for (MODEL model : cache.asMap().values()) { - f.accept(model); - } + for (MODEL model : models.asMap().values()) { + f.accept(model); } } - public void registerCompartment(Compartment instance) { - models.put(instance, CacheBuilder.newBuilder().build()); - } - public MODEL getModel(PartialModel partial, BlockState referenceState) { - return get(PARTIAL, partial, () -> buildModel(partial.get(), referenceState)); + return get(partial, () -> buildModel(partial.get(), referenceState)); } public MODEL getModel(PartialModel partial, BlockState referenceState, Direction dir) { - return getModel(partial, referenceState, dir, rotateToFace(dir)); + return getModel(partial, referenceState, dir, RenderUtil.rotateToFace(dir)); } public MODEL getModel(PartialModel partial, BlockState referenceState, Direction dir, Supplier modelTransform) { - return get(Compartment.DIRECTIONAL_PARTIAL, Pair.of(dir, partial), + return get(Pair.of(dir, partial), () -> buildModel(partial.get(), referenceState, modelTransform.get())); } public MODEL getModel(BlockState toRender) { - return get(Compartment.GENERIC_TILE, toRender, () -> buildModel(toRender)); + return get(toRender, () -> buildModel(toRender)); } - public MODEL get(Compartment compartment, T key, Supplier supplier) { - Cache compartmentCache = models.get(compartment); + public MODEL get(Object key, Supplier supplier) { try { - return compartmentCache.get(key, supplier::get); + return models.get(key, supplier::get); } catch (ExecutionException e) { e.printStackTrace(); return null; @@ -144,15 +126,4 @@ public class RenderMaterial

rotateToFace(Direction facing) { - return () -> { - MatrixStack stack = new MatrixStack(); - MatrixStacker.of(stack) - .centre() - .rotateY(AngleHelper.horizontalAngle(facing)) - .rotateX(AngleHelper.verticalAngle(facing)) - .unCentre(); - return stack; - }; - } } From 8fff3d6745958269f1632eee788b238c59ba3d09 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Sat, 1 May 2021 13:19:01 +0200 Subject: [PATCH 16/18] The great second purge of Tools - Removed the Blockzapper - Removed the Deforester - Handheld Worldshaper -> Creative Worldshaper - Worldshapers now have a "surface" and "cluster" brush type - Worldshapers now follow the creative colour palette - Some UI touch-ups for tools --- src/generated/resources/.cache/cache | 39 +- .../resources/assets/create/lang/en_ud.json | 4 +- .../resources/assets/create/lang/en_us.json | 70 +--- .../assets/create/lang/unfinished/de_de.json | 68 +-- .../assets/create/lang/unfinished/es_es.json | 68 +-- .../assets/create/lang/unfinished/es_mx.json | 70 +--- .../assets/create/lang/unfinished/fr_fr.json | 68 +-- .../assets/create/lang/unfinished/it_it.json | 68 +-- .../assets/create/lang/unfinished/ja_jp.json | 68 +-- .../assets/create/lang/unfinished/ko_kr.json | 68 +-- .../assets/create/lang/unfinished/nl_nl.json | 72 +--- .../assets/create/lang/unfinished/pt_br.json | 72 +--- .../assets/create/lang/unfinished/ru_ru.json | 68 +-- .../assets/create/lang/unfinished/zh_cn.json | 68 +-- .../assets/create/lang/unfinished/zh_tw.json | 68 +-- .../assets/create/models/item/deforester.json | 3 - .../models/item/handheld_blockzapper.json | 3 - .../resources/assets/create/sounds.json | 52 +-- .../data/create/advancements/deforester.json | 36 -- .../crafting/curiosities/deforester.json | 32 -- .../curiosities/handheld_blockzapper.json | 32 -- .../create/advancements/upgraded_zapper.json | 30 -- .../data/create/advancements/zapper.json | 35 -- .../crafting/curiosities/deforester.json | 22 - .../curiosities/handheld_blockzapper.json | 22 - .../java/com/simibubi/create/AllBlocks.java | 3 + .../java/com/simibubi/create/AllItems.java | 51 +-- .../com/simibubi/create/AllRecipeTypes.java | 3 - .../com/simibubi/create/AllSoundEvents.java | 10 +- .../simibubi/create/compat/jei/CreateJEI.java | 11 - .../category/BlockzapperUpgradeCategory.java | 95 ----- .../symmetry/SymmetryWandScreen.java | 12 +- .../curiosities/tools/AllToolTiers.java | 59 --- .../curiosities/tools/DeforesterItem.java | 75 ---- .../tools/DeforesterItemRenderer.java | 30 -- .../curiosities/tools/DeforesterModel.java | 20 - .../zapper/ZapperInteractionHandler.java | 2 +- .../curiosities/zapper/ZapperItem.java | 10 +- .../zapper/ZapperRenderHandler.java | 4 +- .../curiosities/zapper/ZapperScreen.java | 31 +- .../zapper/blockzapper/BlockzapperItem.java | 396 ------------------ .../blockzapper/BlockzapperItemRenderer.java | 86 ---- .../zapper/blockzapper/BlockzapperModel.java | 32 -- .../blockzapper/BlockzapperRenderHandler.java | 62 --- .../zapper/blockzapper/BlockzapperScreen.java | 114 ----- .../blockzapper/BlockzapperUpgradeRecipe.java | 134 ------ .../zapper/terrainzapper/Brush.java | 24 +- .../zapper/terrainzapper/CuboidBrush.java | 2 +- .../zapper/terrainzapper/CylinderBrush.java | 2 +- .../zapper/terrainzapper/DynamicBrush.java | 147 +++++++ .../zapper/terrainzapper/ShapedBrush.java | 29 ++ .../zapper/terrainzapper/SphereBrush.java | 2 +- .../zapper/terrainzapper/TerrainBrushes.java | 6 +- .../zapper/terrainzapper/TerrainTools.java | 4 +- .../zapper/terrainzapper/WorldshaperItem.java | 6 +- .../WorldshaperRenderHandler.java | 29 +- .../terrainzapper/WorldshaperScreen.java | 190 ++++++--- .../simibubi/create/events/ClientEvents.java | 2 - .../advancement/AllAdvancements.java | 19 - .../foundation/data/BuilderTransformers.java | 2 + .../data/recipe/StandardRecipeGen.java | 30 +- .../create/foundation/gui/AllGuiTextures.java | 6 +- .../foundation/utility/RemapHelper.java | 2 - .../create/lang/default/advancements.json | 6 - .../assets/create/lang/default/messages.json | 44 +- .../assets/create/lang/default/tooltips.json | 12 - .../create/models/item/deforester/core.json | 37 -- .../models/item/deforester/core_glow.json | 34 -- .../create/models/item/deforester/gear.json | 65 --- .../create/models/item/deforester/item.json | 117 ------ .../handheld_blockzapper/accelerator.json | 63 --- .../handheld_blockzapper/amplifier_core.json | 18 - .../amplifier_core_glow.json | 21 - .../item/handheld_blockzapper/body.json | 64 --- .../chorus_accelerator.json | 63 --- .../chorus_amplifier.json | 35 -- .../handheld_blockzapper/chorus_body.json | 64 --- .../chorus_retriever.json | 23 - .../handheld_blockzapper/chorus_scope.json | 38 -- .../item/handheld_blockzapper/core.json | 18 - .../item/handheld_blockzapper/core_glow.json | 21 - .../gold_accelerator.json | 63 --- .../handheld_blockzapper/gold_amplifier.json | 35 -- .../item/handheld_blockzapper/gold_body.json | 64 --- .../handheld_blockzapper/gold_retriever.json | 23 - .../item/handheld_blockzapper/gold_scope.json | 38 -- .../item/handheld_blockzapper/item.json | 71 ---- .../handheld_worldshaper/accelerator.json | 74 ++-- .../item/handheld_worldshaper/item.json | 125 +++--- .../textures/block/blaze_brass_mesh.png | Bin 640 -> 0 bytes .../textures/block/chorus_chrome_mesh.png | Bin 616 -> 0 bytes .../textures/block/terrain_zapper_mesh.png | Bin 620 -> 429 bytes .../create/textures/gui/curiosities.png | Bin 2097 -> 1997 bytes .../create/textures/gui/curiosities_2.png | Bin 1488 -> 0 bytes .../blockzapper_upgrade/gold_accelerator.json | 24 -- .../blockzapper_upgrade/gold_amplifier.json | 24 -- .../blockzapper_upgrade/gold_body.json | 22 - .../blockzapper_upgrade/gold_retriever.json | 24 -- .../blockzapper_upgrade/gold_scope.json | 24 -- .../purpur_accelerator.json | 24 -- .../blockzapper_upgrade/purpur_amplifier.json | 25 -- .../blockzapper_upgrade/purpur_body.json | 22 - .../blockzapper_upgrade/purpur_retriever.json | 24 -- .../blockzapper_upgrade/purpur_scope.json | 24 -- 104 files changed, 811 insertions(+), 3610 deletions(-) delete mode 100644 src/generated/resources/assets/create/models/item/deforester.json delete mode 100644 src/generated/resources/assets/create/models/item/handheld_blockzapper.json delete mode 100644 src/generated/resources/data/create/advancements/deforester.json delete mode 100644 src/generated/resources/data/create/advancements/recipes/create.base/crafting/curiosities/deforester.json delete mode 100644 src/generated/resources/data/create/advancements/recipes/create.base/crafting/curiosities/handheld_blockzapper.json delete mode 100644 src/generated/resources/data/create/advancements/upgraded_zapper.json delete mode 100644 src/generated/resources/data/create/advancements/zapper.json delete mode 100644 src/generated/resources/data/create/recipes/crafting/curiosities/deforester.json delete mode 100644 src/generated/resources/data/create/recipes/crafting/curiosities/handheld_blockzapper.json delete mode 100644 src/main/java/com/simibubi/create/compat/jei/category/BlockzapperUpgradeCategory.java delete mode 100644 src/main/java/com/simibubi/create/content/curiosities/tools/AllToolTiers.java delete mode 100644 src/main/java/com/simibubi/create/content/curiosities/tools/DeforesterItem.java delete mode 100644 src/main/java/com/simibubi/create/content/curiosities/tools/DeforesterItemRenderer.java delete mode 100644 src/main/java/com/simibubi/create/content/curiosities/tools/DeforesterModel.java delete mode 100644 src/main/java/com/simibubi/create/content/curiosities/zapper/blockzapper/BlockzapperItem.java delete mode 100644 src/main/java/com/simibubi/create/content/curiosities/zapper/blockzapper/BlockzapperItemRenderer.java delete mode 100644 src/main/java/com/simibubi/create/content/curiosities/zapper/blockzapper/BlockzapperModel.java delete mode 100644 src/main/java/com/simibubi/create/content/curiosities/zapper/blockzapper/BlockzapperRenderHandler.java delete mode 100644 src/main/java/com/simibubi/create/content/curiosities/zapper/blockzapper/BlockzapperScreen.java delete mode 100644 src/main/java/com/simibubi/create/content/curiosities/zapper/blockzapper/BlockzapperUpgradeRecipe.java create mode 100644 src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/DynamicBrush.java create mode 100644 src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/ShapedBrush.java delete mode 100644 src/main/resources/assets/create/models/item/deforester/core.json delete mode 100644 src/main/resources/assets/create/models/item/deforester/core_glow.json delete mode 100644 src/main/resources/assets/create/models/item/deforester/gear.json delete mode 100644 src/main/resources/assets/create/models/item/deforester/item.json delete mode 100644 src/main/resources/assets/create/models/item/handheld_blockzapper/accelerator.json delete mode 100644 src/main/resources/assets/create/models/item/handheld_blockzapper/amplifier_core.json delete mode 100644 src/main/resources/assets/create/models/item/handheld_blockzapper/amplifier_core_glow.json delete mode 100644 src/main/resources/assets/create/models/item/handheld_blockzapper/body.json delete mode 100644 src/main/resources/assets/create/models/item/handheld_blockzapper/chorus_accelerator.json delete mode 100644 src/main/resources/assets/create/models/item/handheld_blockzapper/chorus_amplifier.json delete mode 100644 src/main/resources/assets/create/models/item/handheld_blockzapper/chorus_body.json delete mode 100644 src/main/resources/assets/create/models/item/handheld_blockzapper/chorus_retriever.json delete mode 100644 src/main/resources/assets/create/models/item/handheld_blockzapper/chorus_scope.json delete mode 100644 src/main/resources/assets/create/models/item/handheld_blockzapper/core.json delete mode 100644 src/main/resources/assets/create/models/item/handheld_blockzapper/core_glow.json delete mode 100644 src/main/resources/assets/create/models/item/handheld_blockzapper/gold_accelerator.json delete mode 100644 src/main/resources/assets/create/models/item/handheld_blockzapper/gold_amplifier.json delete mode 100644 src/main/resources/assets/create/models/item/handheld_blockzapper/gold_body.json delete mode 100644 src/main/resources/assets/create/models/item/handheld_blockzapper/gold_retriever.json delete mode 100644 src/main/resources/assets/create/models/item/handheld_blockzapper/gold_scope.json delete mode 100644 src/main/resources/assets/create/models/item/handheld_blockzapper/item.json delete mode 100644 src/main/resources/assets/create/textures/block/blaze_brass_mesh.png delete mode 100644 src/main/resources/assets/create/textures/block/chorus_chrome_mesh.png delete mode 100644 src/main/resources/assets/create/textures/gui/curiosities_2.png delete mode 100644 src/main/resources/data/create/recipes/blockzapper_upgrade/gold_accelerator.json delete mode 100644 src/main/resources/data/create/recipes/blockzapper_upgrade/gold_amplifier.json delete mode 100644 src/main/resources/data/create/recipes/blockzapper_upgrade/gold_body.json delete mode 100644 src/main/resources/data/create/recipes/blockzapper_upgrade/gold_retriever.json delete mode 100644 src/main/resources/data/create/recipes/blockzapper_upgrade/gold_scope.json delete mode 100644 src/main/resources/data/create/recipes/blockzapper_upgrade/purpur_accelerator.json delete mode 100644 src/main/resources/data/create/recipes/blockzapper_upgrade/purpur_amplifier.json delete mode 100644 src/main/resources/data/create/recipes/blockzapper_upgrade/purpur_body.json delete mode 100644 src/main/resources/data/create/recipes/blockzapper_upgrade/purpur_retriever.json delete mode 100644 src/main/resources/data/create/recipes/blockzapper_upgrade/purpur_scope.json diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index 448cb418c..f74258d44 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -406,20 +406,20 @@ a3a11524cd3515fc01d905767b4b7ea782adaf03 assets/create/blockstates/yellow_seat.j 6801fa1f466f172700e573e5b8ee8ee5f9ca4583 assets/create/blockstates/yellow_valve_handle.json 7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json -97e9ee471ea650f6b7f3d3f39f00201cd5ad752d assets/create/lang/en_ud.json -de5b848a5bb52bb1c85a9123b3f3fbc084e315b8 assets/create/lang/en_us.json -77fc60d2271fe111ccd165ab936da031555a5987 assets/create/lang/unfinished/de_de.json -413556ffe8e3459b75930681f5b6923d9d90c0b6 assets/create/lang/unfinished/es_es.json -b2e5909fc6169fa68968e74d4592834f5e72ae24 assets/create/lang/unfinished/es_mx.json -aa79feefc0d9fd7006079aba9eaab882127478c3 assets/create/lang/unfinished/fr_fr.json -3eded7242f2a47068bf2298ae68dbe645ef405aa assets/create/lang/unfinished/it_it.json -88f3ced413786eea34a1344a4df8b530854f6c39 assets/create/lang/unfinished/ja_jp.json -e3f82fb1de5c4e08a3b7ea2fbecaa43183762e54 assets/create/lang/unfinished/ko_kr.json -c39e821107cced812df201720542f96bcafc3338 assets/create/lang/unfinished/nl_nl.json -0598ab0e3f20a17d8ffec9874b5165b6c40c654c assets/create/lang/unfinished/pt_br.json -bb1e3d00fc19e93813e7437a2c2cea2b0b8c2af1 assets/create/lang/unfinished/ru_ru.json -a8e0dfc2ba5b41cee05636b16b4661e96d5e8b5a assets/create/lang/unfinished/zh_cn.json -74c50139e2274be160a1bd0068f411cc6ec845d5 assets/create/lang/unfinished/zh_tw.json +0e10e87986a76f18efeb1255f2c025d1aad8f8fa assets/create/lang/en_ud.json +949bac58ef9534024eac6d9082f5d241ce5b91f3 assets/create/lang/en_us.json +26ab60b925659e6daac2e449267d202c68cafe94 assets/create/lang/unfinished/de_de.json +78086e1c23ce96db3a9ec3d304d7418f39ed96fa assets/create/lang/unfinished/es_es.json +62fcca040385405c7655ea6e4b524b2a5e652e4c assets/create/lang/unfinished/es_mx.json +0f527cc6472caec6ec090985c5000e6f7f93208f assets/create/lang/unfinished/fr_fr.json +812f7e66a1d5a06a7b81a41216ee2151e678db69 assets/create/lang/unfinished/it_it.json +d5275e066511ce8e99db0d5504ed24e38d98a45f assets/create/lang/unfinished/ja_jp.json +2c3a1bd28a6a08bec850cc36735204c59045b188 assets/create/lang/unfinished/ko_kr.json +27559156601b57cc2e9fae07a92c7f79a7f4e473 assets/create/lang/unfinished/nl_nl.json +fa22d8055979012a45a6648009ef0094be4560d8 assets/create/lang/unfinished/pt_br.json +c3f6825459aa7153a6f65fe23d32c91290ff14f3 assets/create/lang/unfinished/ru_ru.json +2bd50e62c0ed45c7fc109cf7e229207e324912d8 assets/create/lang/unfinished/zh_cn.json +8052350b58969035d456f882fa5624ee16a0024c assets/create/lang/unfinished/zh_tw.json 487a511a01b2a4531fb672f917922312db78f958 assets/create/models/block/acacia_window.json b48060cba1a382f373a05bf0039054053eccf076 assets/create/models/block/acacia_window_pane_noside.json 3066db1bf03cffa1a9c7fbacf47ae586632f4eb3 assets/create/models/block/acacia_window_pane_noside_alt.json @@ -1305,7 +1305,6 @@ b50e3471476783be80f28bb4e3543f5a426b9eb6 assets/create/models/item/dark_scoria_b e67fe11e9036c81f0f54d368b41a971822a84a32 assets/create/models/item/dark_scoria_cobblestone_stairs.json 6e6867197215635b7febac7ffca77b763c021cc4 assets/create/models/item/dark_scoria_cobblestone_wall.json f5b2995929ac9dca9857d4618660ffa7778d5618 assets/create/models/item/dark_scoria_pillar.json -f06f56ffb1cd7c9a2b81c65f7796726692e5cc59 assets/create/models/item/deforester.json 2104c1276259ab67b94f3d4fe97e14b6bc6941ac assets/create/models/item/deployer.json 84d87f715efab45dc7bcb2e3c0870ed56fa20ee9 assets/create/models/item/depot.json a97ca9b6fc3e10a9c9409b27458a852222045e4e assets/create/models/item/diorite_bricks.json @@ -1408,7 +1407,6 @@ e7daa31c1fc445d542bad476dfe1d6a8811f2070 assets/create/models/item/gray_seat.jso 1c9c9157a06108bf58967bfc4fb069c35d20e90a assets/create/models/item/green_seat.json ecb9f32f62d3fa43fb226ab85adc2eb229fdfb77 assets/create/models/item/green_valve_handle.json 398b1a7c76c7bdb6a23b1248fdce98f6d835467f assets/create/models/item/hand_crank.json -cfab82a2cf7495d21778c1de9730a26afbdd523d assets/create/models/item/handheld_blockzapper.json dee43bf1a9c211a752fac2c07aeba123f7f0c914 assets/create/models/item/handheld_worldshaper.json f0d5af58e23e2705b3ef675c30bdf85ed9567c57 assets/create/models/item/honey_bucket.json 068729724f5f7b276b9bc378e533898a92e8debe assets/create/models/item/honeyed_apple.json @@ -1648,7 +1646,7 @@ d080b1b25e5bc8baf5aee68691b08c7f12ece3b0 assets/create/models/item/windmill_bear 866fbb0ce2878a73e0440d1caf6534c8bd7c384f assets/create/models/item/zinc_ingot.json a80fb25a0b655e76be986b5b49fcb0f03461a1ab assets/create/models/item/zinc_nugget.json b1689617190c05ef34bd18456b0c7ae09bb3210f assets/create/models/item/zinc_ore.json -a3214d60696bcbca721ad4b3ebbdd84ff6f6b32d assets/create/sounds.json +7b73f40a65af0c2288c886928c609ec783c0fc40 assets/create/sounds.json 5d0cc4c0255dc241e61c173b31ddca70c88d08e4 data/create/advancements/aesthetics.json 187921fa131b06721bfaf63f2623a28c141aae9a data/create/advancements/andesite_alloy.json 0ea2db7173b5be28b289ea7c9a6a0cf5805c60c7 data/create/advancements/andesite_casing.json @@ -1674,7 +1672,6 @@ d1015e059a2f2008a364b6d045a011a6d671f20d data/create/advancements/copper_casing. 8e2a12a26218a46665c46f350ef9c3418a901988 data/create/advancements/crafter.json d1fbc14303c7327e9fc02e505e7e434591b7f785 data/create/advancements/crushing_wheel.json e9e1789de5cd5577a801a09d489a13f2c98779dc data/create/advancements/cuckoo.json -0761f3e12d587fec7a2ddf326b43969d262771e3 data/create/advancements/deforester.json 2a96fad5b44b62f233c9af5b4a637faf32ce24af data/create/advancements/deployer.json eb8e7c13163923d2f88c999c6eb5afa4b7d2426e data/create/advancements/dual_extendo_grip.json 04eaf829696d735244c0e4798dd3bdeb26e13a32 data/create/advancements/electron_tube.json @@ -1773,8 +1770,6 @@ c368cadffa9177fefb9e92ff4453b40bc8dd670d data/create/advancements/recipes/create 4bb60ef5e186f12a9d52e61319db8c78300c64ab data/create/advancements/recipes/create.base/blasting/zinc_ingot_from_ore.json dd487f98c411f1ff22cb7fc208b8cc24b27deb2f data/create/advancements/recipes/create.base/crafting/appliances/dough.json 51cdcf168087f47e4458eed7543d227da1ee5ca0 data/create/advancements/recipes/create.base/crafting/appliances/tree_fertilizer.json -eba09a9ca1c5c249517da9b3a883479fd6480ac6 data/create/advancements/recipes/create.base/crafting/curiosities/deforester.json -0479fa3c10130c799269c40df6b18deb3a3d8331 data/create/advancements/recipes/create.base/crafting/curiosities/handheld_blockzapper.json d531f87f425d199aee4777a588c1cd6cab6f5173 data/create/advancements/recipes/create.base/crafting/curiosities/minecart_coupling.json 2eef3201017af03f6a2f0f015645e3ff5e25d9c1 data/create/advancements/recipes/create.base/crafting/curiosities/wand_of_symmetry.json 80155fa8e28e7de87adad3dc2cd79564496d7ef7 data/create/advancements/recipes/create.base/crafting/kinetics/adjustable_chain_gearshift.json @@ -2365,13 +2360,11 @@ b69d174d7a5e9eab8ca013b66bc9d02244d7f9a3 data/create/advancements/spout.json 15f73da913c54cd2f945e4d7402fb8d587cbaa9f data/create/advancements/spout_potion.json 0efdaf483d84791044f085f79197b6bab3e15872 data/create/advancements/stressometer.json 1aceaa6e47709aa03f3d4f606fa5dcaacc899835 data/create/advancements/tunnel.json -42461143b64112fdf6f123b9fcd44b5457df3915 data/create/advancements/upgraded_zapper.json 4fef92dce84fa1a075db31fb33081f5fb8ec7e9e data/create/advancements/upward_chute.json fe37896bb804d2be9b8abf3744c5b9b7bc1c086e data/create/advancements/wand_of_symmetry.json 2c278dc6e6e4c12c0cfce22b5192844586a2d5c1 data/create/advancements/water_wheel.json d6b94fd499cb4fb0ae587b0e9e7088832f67fe01 data/create/advancements/windmill.json 4513d0c4dd40c948028a3fc8e6f3b4d0356c0a90 data/create/advancements/wrench.json -33c1224f4f6a7bb0a3439eb0f8b8af9341b62574 data/create/advancements/zapper.json 054392b614e410c6d1b37c546b4bfd36f50aec4a data/create/loot_tables/blocks/acacia_window.json 64b95066bf96a3f0de95919d526243ba4f5a3ade data/create/loot_tables/blocks/acacia_window_pane.json 113f225f01d45c420ee038e8aad3d6c5e836dea2 data/create/loot_tables/blocks/adjustable_chain_gearshift.json @@ -2846,8 +2839,6 @@ f7879d404d7a848d818278b4e788f285a9087e63 data/create/recipes/compacting/blaze_ca 19526da3a59fc136654ff1bc93c0251581f397a9 data/create/recipes/crafting/appliances/dough.json 7b5f863dda3d05a79cb85943a178eba0bd8a7dc7 data/create/recipes/crafting/appliances/slime_ball.json b159ba84428eee6ef6e23df1766f2a18f2c8a63e data/create/recipes/crafting/appliances/tree_fertilizer.json -8c00fe124ea516511f00a89bcf9e63a6d1fa47e4 data/create/recipes/crafting/curiosities/deforester.json -87a4a5ec53a0f8e125dfdbd77906a418a9b83d9c data/create/recipes/crafting/curiosities/handheld_blockzapper.json 660e92da2b1b6698b1c0df74bd74a56a25fb3eca data/create/recipes/crafting/curiosities/minecart_coupling.json fcbc04d0a7eaf820a74bc7e4736a4a581e0a9dff data/create/recipes/crafting/curiosities/wand_of_symmetry.json cc56d21a25286a9024e506dde9fa161230eaf46d data/create/recipes/crafting/kinetics/adjustable_chain_gearshift.json diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index 33c7d7480..5d42d7042 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -449,7 +449,6 @@ "item.create.crushed_tin_ore": "\u01DD\u0279O u\u0131\u27D8 p\u01DD\u0265sn\u0279\u0186", "item.create.crushed_uranium_ore": "\u01DD\u0279O \u026Fn\u0131u\u0250\u0279\u2229 p\u01DD\u0265sn\u0279\u0186", "item.create.crushed_zinc_ore": "\u01DD\u0279O \u0254u\u0131Z p\u01DD\u0265sn\u0279\u0186", - "item.create.deforester": "\u0279\u01DD\u0287s\u01DD\u0279o\u025F\u01DD\u15E1", "item.create.dough": "\u0265bno\u15E1", "item.create.electron_tube": "\u01DDqn\u27D8 uo\u0279\u0287\u0254\u01DD\u05DF\u018E", "item.create.empty_blaze_burner": "\u0279\u01DDu\u0279n\u15FA \u01DDz\u0250\u05DF\u15FA \u028E\u0287d\u026F\u018E", @@ -459,8 +458,7 @@ "item.create.furnace_minecart_contraption": "uo\u0131\u0287d\u0250\u0279\u0287uo\u0186 \u0287\u0279\u0250\u0254\u01DDu\u0131W \u01DD\u0254\u0250u\u0279n\u2132", "item.create.goggles": "s\u01DD\u05DFbbo\u2141 s,\u0279\u01DD\u01DDu\u0131bu\u018E", "item.create.golden_sheet": "\u0287\u01DD\u01DD\u0265S u\u01DDp\u05DFo\u2141", - "item.create.handheld_blockzapper": "\u0279\u01DDdd\u0250z\u029E\u0254o\u05DF\u15FA p\u05DF\u01DD\u0265pu\u0250H", - "item.create.handheld_worldshaper": "\u0279\u01DDd\u0250\u0265sp\u05DF\u0279oM p\u05DF\u01DD\u0265pu\u0250H", + "item.create.handheld_worldshaper": "\u0279\u01DDd\u0250\u0265sp\u05DF\u0279oM \u01DD\u028C\u0131\u0287\u0250\u01DD\u0279\u0186", "item.create.honey_bucket": "\u0287\u01DD\u029E\u0254n\u15FA \u028E\u01DDuoH", "item.create.honeyed_apple": "\u01DD\u05DFdd\u2C6F p\u01DD\u028E\u01DDuoH", "item.create.integrated_circuit": "\u0287\u0131n\u0254\u0279\u0131\u0186 p\u01DD\u0287\u0250\u0279b\u01DD\u0287uI", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index dde4ec38e..99e1675fc 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -455,7 +455,6 @@ "item.create.crushed_tin_ore": "Crushed Tin Ore", "item.create.crushed_uranium_ore": "Crushed Uranium Ore", "item.create.crushed_zinc_ore": "Crushed Zinc Ore", - "item.create.deforester": "Deforester", "item.create.dough": "Dough", "item.create.electron_tube": "Electron Tube", "item.create.empty_blaze_burner": "Empty Blaze Burner", @@ -465,8 +464,7 @@ "item.create.furnace_minecart_contraption": "Furnace Minecart Contraption", "item.create.goggles": "Engineer's Goggles", "item.create.golden_sheet": "Golden Sheet", - "item.create.handheld_blockzapper": "Handheld Blockzapper", - "item.create.handheld_worldshaper": "Handheld Worldshaper", + "item.create.handheld_worldshaper": "Creative Worldshaper", "item.create.honey_bucket": "Honey Bucket", "item.create.honeyed_apple": "Honeyed Apple", "item.create.integrated_circuit": "Integrated Circuit", @@ -644,14 +642,8 @@ "advancement.create.refined_radiance.desc": "Create Refined Radiance, a powerful chromatic substance.", "advancement.create.chromatic_age": "The Chromatic Age", "advancement.create.chromatic_age.desc": "Create casing blocks of the light and dark.", - "advancement.create.zapper": "Building With Style", - "advancement.create.zapper.desc": "Craft a Blockzapper. A radiant laser gun that helps you build.", - "advancement.create.upgraded_zapper": "Radiant Overdrive", - "advancement.create.upgraded_zapper.desc": "Create and activate a fully upgraded Blockzapper.", "advancement.create.wand_of_symmetry": "Radiant Mirrors", "advancement.create.wand_of_symmetry.desc": "Craft a Staff of Symmetry.", - "advancement.create.deforester": "Radiant Chopping", - "advancement.create.deforester.desc": "Craft a Deforester, and say goodbye to the local forest.", "advancement.create.extendo_grip": "Boioioing!", "advancement.create.extendo_grip.desc": "Get hold of an Extendo Grip.", "advancement.create.dual_extendo_grip": "Ultimate Boing-age", @@ -694,7 +686,6 @@ "create.recipe.automatic_shaped": "Automated Shaped Crafting", "create.recipe.block_cutting": "Block Cutting", "create.recipe.wood_cutting": "Wood Cutting", - "create.recipe.blockzapper_upgrade": "Handheld Blockzapper", "create.recipe.sandpaper_polishing": "Sandpaper Polishing", "create.recipe.mystery_conversion": "Mysterious Conversion", "create.recipe.spout_filling": "Filling by Spout", @@ -751,20 +742,16 @@ "create.orientation.alongZ": "Along Z", "create.orientation.alongX": "Along X", - "create.gui.blockzapper.title": "Handheld Blockzapper", - "create.gui.blockzapper.replaceMode": "Replace Mode", - "create.gui.blockzapper.searchDiagonal": "Follow Diagonals", - "create.gui.blockzapper.searchFuzzy": "Ignore Material Borders", - "create.gui.blockzapper.range": "Spread Range", - "create.gui.blockzapper.needsUpgradedAmplifier": "Requires Upgraded Amplifier", - "create.gui.blockzapper.patternSection": "Pattern", - "create.gui.blockzapper.pattern.solid": "Solid", - "create.gui.blockzapper.pattern.checkered": "Checkerboard", - "create.gui.blockzapper.pattern.inversecheckered": "Inverted Checkerboard", - "create.gui.blockzapper.pattern.chance25": "25% Roll", - "create.gui.blockzapper.pattern.chance50": "50% Roll", - "create.gui.blockzapper.pattern.chance75": "75% Roll", - "create.gui.terrainzapper.title": "Handheld Worldshaper", + "create.gui.terrainzapper.title": "Handheld Blockzapper", + "create.gui.terrainzapper.searchDiagonal": "Follow Diagonals", + "create.gui.terrainzapper.searchFuzzy": "Ignore Material Borders", + "create.gui.terrainzapper.patternSection": "Pattern", + "create.gui.terrainzapper.pattern.solid": "Solid", + "create.gui.terrainzapper.pattern.checkered": "Checkerboard", + "create.gui.terrainzapper.pattern.inversecheckered": "Inverted Checkerboard", + "create.gui.terrainzapper.pattern.chance25": "25% Roll", + "create.gui.terrainzapper.pattern.chance50": "50% Roll", + "create.gui.terrainzapper.pattern.chance75": "75% Roll", "create.gui.terrainzapper.placement": "Placement", "create.gui.terrainzapper.placement.merged": "Merged", "create.gui.terrainzapper.placement.attached": "Attached", @@ -773,6 +760,8 @@ "create.gui.terrainzapper.brush.cuboid": "Cuboid", "create.gui.terrainzapper.brush.sphere": "Sphere", "create.gui.terrainzapper.brush.cylinder": "Cylinder", + "create.gui.terrainzapper.brush.surface": "Surface", + "create.gui.terrainzapper.brush.cluster": "Cluster", "create.gui.terrainzapper.tool": "Tool", "create.gui.terrainzapper.tool.fill": "Fill", "create.gui.terrainzapper.tool.place": "Place", @@ -782,19 +771,8 @@ "create.gui.terrainzapper.tool.flatten": "Flatten", "create.terrainzapper.shiftRightClickToSet": "Shift-Right-Click to Select a Shape", - - "create.blockzapper.usingBlock": "Using: %1$s", - "create.blockzapper.componentUpgrades": "Component Upgrades:", - "create.blockzapper.component.body": "Body", - "create.blockzapper.component.amplifier": "Amplifier", - "create.blockzapper.component.accelerator": "Accelerator", - "create.blockzapper.component.retriever": "Retriever", - "create.blockzapper.component.scope": "Scope", - "create.blockzapper.componentTier.none": "None", - "create.blockzapper.componentTier.brass": "Brass", - "create.blockzapper.componentTier.chromatic": "Chromatic", - "create.blockzapper.leftClickToSet": "Left-Click a Block to set Material", - "create.blockzapper.empty": "Out of Blocks!", + "create.terrainzapper.usingBlock": "Using: %1$s", + "create.terrainzapper.leftClickToSet": "Left-Click a Block to set Material", "create.minecart_coupling.two_couplings_max": "Minecarts cannot have more than two couplings each", "create.minecart_coupling.unloaded": "Parts of your train seem to be in unloaded chunks", @@ -1158,9 +1136,9 @@ "create.subtitle.wrench_rotate": "Wrench used", "create.subtitle.mixing": "Mixing Noises", "create.subtitle.mechanical_press_activation_belt": "Mechanical Press bonks", - "create.subtitle.blockzapper_confirm": "Affirmative ding", + "create.subtitle.worldshaper_place": "Worldshaper zaps", "create.subtitle.depot_slide": "Item slides", - "create.subtitle.blockzapper_place": "Blockzapper zaps", + "create.subtitle.deny": "Declining boop", "create.subtitle.blaze_munch": "Blaze Burner munches", "create.subtitle.schematicannon_launch_block": "Schematicannon fires", "create.subtitle.funnel_flap": "Funnel Flaps", @@ -1169,11 +1147,11 @@ "create.subtitle.mechanical_press_activation": "Mechanical Press clangs", "create.subtitle.contraption_assemble": "Contraption moves", "create.subtitle.crafter_craft": "Crafter crafts", - "create.subtitle.blockzapper_deny": "Declining boop", "create.subtitle.cranking": "Hand Crank turns", "create.subtitle.crafter_click": "Crafter clicks", "create.subtitle.wrench_remove": "Component breaks", "create.subtitle.depot_plop": "Item lands", + "create.subtitle.confirm": "Affirmative ding", "_": "->------------------------] Item Descriptions [------------------------<-", @@ -1279,15 +1257,6 @@ "item.create.wand_of_symmetry.tooltip.control3": "R-Click while Sneaking", "item.create.wand_of_symmetry.tooltip.action3": "Opens the _Configuration Interface_", - "item.create.handheld_blockzapper.tooltip": "BLOCKZAPPER", - "item.create.handheld_blockzapper.tooltip.summary": "Novel gadget for placing or exchanging blocks at a distance.", - "item.create.handheld_blockzapper.tooltip.control1": "L-Click at Block", - "item.create.handheld_blockzapper.tooltip.action1": "Sets blocks placed by the tool to the targeted block.", - "item.create.handheld_blockzapper.tooltip.control2": "R-Click at Block", - "item.create.handheld_blockzapper.tooltip.action2": "_Places_ or _Replaces_ the targeted block.", - "item.create.handheld_blockzapper.tooltip.control3": "R-Click while Sneaking", - "item.create.handheld_blockzapper.tooltip.action3": "Opens the _Configuration Interface_.", - "item.create.handheld_worldshaper.tooltip": "HANDHELD WORLDSHAPER", "item.create.handheld_worldshaper.tooltip.summary": "Handy tool for creating _landscapes_ and _terrain features_.", "item.create.handheld_worldshaper.tooltip.control1": "L-Click at Block", @@ -1302,9 +1271,6 @@ "item.create.tree_fertilizer.tooltip.condition1": "When used on a Sapling", "item.create.tree_fertilizer.tooltip.behaviour1": "Grows Trees _regardless_ of their _spacing conditions_", - "item.create.deforester.tooltip": "DEFORESTER", - "item.create.deforester.tooltip.summary": "A _radiant axe_ able to chop down trees in a split second.", - "item.create.extendo_grip.tooltip": "EXTENDO GRIP", "item.create.extendo_grip.tooltip.summary": "Boioioing! Greatly _increases reach distance_ of the wielder.", "item.create.extendo_grip.tooltip.condition1": "When in Off-Hand", diff --git a/src/generated/resources/assets/create/lang/unfinished/de_de.json b/src/generated/resources/assets/create/lang/unfinished/de_de.json index 1d4498a2c..d28a04eb6 100644 --- a/src/generated/resources/assets/create/lang/unfinished/de_de.json +++ b/src/generated/resources/assets/create/lang/unfinished/de_de.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 927", + "_": "Missing Localizations: 935", "_": "->------------------------] Game Elements [------------------------<-", @@ -456,7 +456,6 @@ "item.create.crushed_tin_ore": "Zerkleinertes Zinnerz", "item.create.crushed_uranium_ore": "Zerkleinertes Uranerz", "item.create.crushed_zinc_ore": "Zerkleinertes Zinkerz", - "item.create.deforester": "Entforster", "item.create.dough": "Teig", "item.create.electron_tube": "Elektronenröhre", "item.create.empty_blaze_burner": "Leerer Lohenbrenner", @@ -466,7 +465,6 @@ "item.create.furnace_minecart_contraption": "Antriebsloren Vorrichtung", "item.create.goggles": "Ingenieursbrille", "item.create.golden_sheet": "Goldblech", - "item.create.handheld_blockzapper": "Blockpistole", "item.create.handheld_worldshaper": "Geländeformer", "item.create.honey_bucket": "Honigeimer", "item.create.honeyed_apple": "Honigapfel", @@ -645,14 +643,8 @@ "advancement.create.refined_radiance.desc": "UNLOCALIZED: Create Refined Radiance, a powerful chromatic substance.", "advancement.create.chromatic_age": "UNLOCALIZED: The Chromatic Age", "advancement.create.chromatic_age.desc": "UNLOCALIZED: Create casing blocks of the light and dark.", - "advancement.create.zapper": "UNLOCALIZED: Building With Style", - "advancement.create.zapper.desc": "UNLOCALIZED: Craft a Blockzapper. A radiant laser gun that helps you build.", - "advancement.create.upgraded_zapper": "UNLOCALIZED: Radiant Overdrive", - "advancement.create.upgraded_zapper.desc": "UNLOCALIZED: Create and activate a fully upgraded Blockzapper.", "advancement.create.wand_of_symmetry": "UNLOCALIZED: Radiant Mirrors", "advancement.create.wand_of_symmetry.desc": "UNLOCALIZED: Craft a Staff of Symmetry.", - "advancement.create.deforester": "UNLOCALIZED: Radiant Chopping", - "advancement.create.deforester.desc": "UNLOCALIZED: Craft a Deforester, and say goodbye to the local forest.", "advancement.create.extendo_grip": "Boioioing!", "advancement.create.extendo_grip.desc": "Beschaffe einen Extendo Griff.", "advancement.create.dual_extendo_grip": "Ultimatives Boing-Zeitalter", @@ -695,7 +687,6 @@ "create.recipe.automatic_shaped": "Automatisiertes Geformtes Bauen", "create.recipe.block_cutting": "Schneiden von Blöcken", "create.recipe.wood_cutting": "Schneiden von Holz", - "create.recipe.blockzapper_upgrade": "Blockpistole", "create.recipe.sandpaper_polishing": "Schleifen", "create.recipe.mystery_conversion": "Mysteriöse Konvertierung", "create.recipe.spout_filling": "Befüllung per Ausguss", @@ -752,20 +743,16 @@ "create.orientation.alongZ": "Entlang Z", "create.orientation.alongX": "Entlang X", - "create.gui.blockzapper.title": "Blockpistole", - "create.gui.blockzapper.replaceMode": "Austauschmodus", - "create.gui.blockzapper.searchDiagonal": "Diagonalen folgen", - "create.gui.blockzapper.searchFuzzy": "Materialgrenzen ignorieren", - "create.gui.blockzapper.range": "Reichweite", - "create.gui.blockzapper.needsUpgradedAmplifier": "Benötigt besseren Verstärker", - "create.gui.blockzapper.patternSection": "Muster", - "create.gui.blockzapper.pattern.solid": "Fest", - "create.gui.blockzapper.pattern.checkered": "Schachbrett", - "create.gui.blockzapper.pattern.inversecheckered": "Inverses Schachbrett", - "create.gui.blockzapper.pattern.chance25": "25%-Chance", - "create.gui.blockzapper.pattern.chance50": "50%-Chance", - "create.gui.blockzapper.pattern.chance75": "75%-Chance", "create.gui.terrainzapper.title": "Tragbarer Geländeformer", + "create.gui.terrainzapper.searchDiagonal": "UNLOCALIZED: Follow Diagonals", + "create.gui.terrainzapper.searchFuzzy": "UNLOCALIZED: Ignore Material Borders", + "create.gui.terrainzapper.patternSection": "UNLOCALIZED: Pattern", + "create.gui.terrainzapper.pattern.solid": "UNLOCALIZED: Solid", + "create.gui.terrainzapper.pattern.checkered": "UNLOCALIZED: Checkerboard", + "create.gui.terrainzapper.pattern.inversecheckered": "UNLOCALIZED: Inverted Checkerboard", + "create.gui.terrainzapper.pattern.chance25": "UNLOCALIZED: 25% Roll", + "create.gui.terrainzapper.pattern.chance50": "UNLOCALIZED: 50% Roll", + "create.gui.terrainzapper.pattern.chance75": "UNLOCALIZED: 75% Roll", "create.gui.terrainzapper.placement": "Platzierung", "create.gui.terrainzapper.placement.merged": "Zusammengeführt", "create.gui.terrainzapper.placement.attached": "Angefügt", @@ -774,6 +761,8 @@ "create.gui.terrainzapper.brush.cuboid": "Quader", "create.gui.terrainzapper.brush.sphere": "Kugel", "create.gui.terrainzapper.brush.cylinder": "Zylinder", + "create.gui.terrainzapper.brush.surface": "UNLOCALIZED: Surface", + "create.gui.terrainzapper.brush.cluster": "UNLOCALIZED: Cluster", "create.gui.terrainzapper.tool": "Werkzeug", "create.gui.terrainzapper.tool.fill": "Füllen", "create.gui.terrainzapper.tool.place": "Platzieren", @@ -783,19 +772,8 @@ "create.gui.terrainzapper.tool.flatten": "Abflachen", "create.terrainzapper.shiftRightClickToSet": "Shift-Rechts-Klick um eine Form auszuwählen", - - "create.blockzapper.usingBlock": "Auswahl: %1$s", - "create.blockzapper.componentUpgrades": "Bauteil-Upgrades:", - "create.blockzapper.component.body": "Rumpf", - "create.blockzapper.component.amplifier": "Verstärker", - "create.blockzapper.component.accelerator": "Beschleuniger", - "create.blockzapper.component.retriever": "Empfänger", - "create.blockzapper.component.scope": "Fernrohr", - "create.blockzapper.componentTier.none": "Nichts", - "create.blockzapper.componentTier.brass": "Messing", - "create.blockzapper.componentTier.chromatic": "Chromatisch", - "create.blockzapper.leftClickToSet": "Linksklick auf einen Block zum Auswählen", - "create.blockzapper.empty": "Keine Blöcke übrig!", + "create.terrainzapper.usingBlock": "UNLOCALIZED: Using: %1$s", + "create.terrainzapper.leftClickToSet": "UNLOCALIZED: Left-Click a Block to set Material", "create.minecart_coupling.two_couplings_max": "Jede Lore kann nicht mehr als zwei Kupplungen haben", "create.minecart_coupling.unloaded": "Teile des Zuges scheinen in nicht geladenen Chunks zu sein", @@ -1159,9 +1137,9 @@ "create.subtitle.wrench_rotate": "UNLOCALIZED: Wrench used", "create.subtitle.mixing": "UNLOCALIZED: Mixing Noises", "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", - "create.subtitle.blockzapper_confirm": "Bestätigendes Ding", + "create.subtitle.worldshaper_place": "UNLOCALIZED: Worldshaper zaps", "create.subtitle.depot_slide": "UNLOCALIZED: Item slides", - "create.subtitle.blockzapper_place": "Blöcke zappen an Ort und Stelle", + "create.subtitle.deny": "UNLOCALIZED: Declining boop", "create.subtitle.blaze_munch": "Lohe kaut glücklich", "create.subtitle.schematicannon_launch_block": "Bauplankanone schießt", "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps", @@ -1170,11 +1148,11 @@ "create.subtitle.mechanical_press_activation": "Mechanische Presse wird aktiviert", "create.subtitle.contraption_assemble": "UNLOCALIZED: Contraption moves", "create.subtitle.crafter_craft": "UNLOCALIZED: Crafter crafts", - "create.subtitle.blockzapper_deny": "Ablehnendes Boop", "create.subtitle.cranking": "UNLOCALIZED: Hand Crank turns", "create.subtitle.crafter_click": "UNLOCALIZED: Crafter clicks", "create.subtitle.wrench_remove": "UNLOCALIZED: Component breaks", "create.subtitle.depot_plop": "UNLOCALIZED: Item lands", + "create.subtitle.confirm": "UNLOCALIZED: Affirmative ding", "_": "->------------------------] Item Descriptions [------------------------<-", @@ -1280,15 +1258,6 @@ "item.create.wand_of_symmetry.tooltip.control3": "R-Klick beim Schleichen", "item.create.wand_of_symmetry.tooltip.action3": "Öffnet das _Konfigurationsmenü_", - "item.create.handheld_blockzapper.tooltip": "BLOCKPISTOLE", - "item.create.handheld_blockzapper.tooltip.summary": "Ermöglicht das Platzieren und Austauschen von Blöcken aus großer Entfernung.", - "item.create.handheld_blockzapper.tooltip.control1": "L-Klick auf Block", - "item.create.handheld_blockzapper.tooltip.action1": "Legt die von dem Werkzeug platzierten Blöcke auf den angeschauten Block fest.", - "item.create.handheld_blockzapper.tooltip.control2": "R-Klick auf Block", - "item.create.handheld_blockzapper.tooltip.action2": "_Platziert_ oder _Ersetzt_ den ausgewählten Block.", - "item.create.handheld_blockzapper.tooltip.control3": "R-Klick beim Schleichen", - "item.create.handheld_blockzapper.tooltip.action3": "Öffnet das _Konfigurationsmenü_", - "item.create.handheld_worldshaper.tooltip": "UNLOCALIZED: HANDHELD WORLDSHAPER", "item.create.handheld_worldshaper.tooltip.summary": "UNLOCALIZED: Handy tool for creating _landscapes_ and _terrain features_.", "item.create.handheld_worldshaper.tooltip.control1": "UNLOCALIZED: L-Click at Block", @@ -1303,9 +1272,6 @@ "item.create.tree_fertilizer.tooltip.condition1": "Wenn auf einen Setzling angewendet", "item.create.tree_fertilizer.tooltip.behaviour1": "Lässt Bäume unabhängig vom Platz um sie herum wachsen", - "item.create.deforester.tooltip": "UNLOCALIZED: DEFORESTER", - "item.create.deforester.tooltip.summary": "UNLOCALIZED: A _radiant axe_ able to chop down trees in a split second.", - "item.create.extendo_grip.tooltip": "UNLOCALIZED: EXTENDO GRIP", "item.create.extendo_grip.tooltip.summary": "UNLOCALIZED: Boioioing! Greatly _increases reach distance_ of the wielder.", "item.create.extendo_grip.tooltip.condition1": "UNLOCALIZED: When in Off-Hand", diff --git a/src/generated/resources/assets/create/lang/unfinished/es_es.json b/src/generated/resources/assets/create/lang/unfinished/es_es.json index 012220dfa..838d09dcf 100644 --- a/src/generated/resources/assets/create/lang/unfinished/es_es.json +++ b/src/generated/resources/assets/create/lang/unfinished/es_es.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 620", + "_": "Missing Localizations: 636", "_": "->------------------------] Game Elements [------------------------<-", @@ -456,7 +456,6 @@ "item.create.crushed_tin_ore": "Mineral de estaño molido", "item.create.crushed_uranium_ore": "Mineral de uranio molido", "item.create.crushed_zinc_ore": "Mineral de zinc molido", - "item.create.deforester": "Deforestador", "item.create.dough": "Masilla", "item.create.electron_tube": "Tubo de electrones", "item.create.empty_blaze_burner": "Quemador de Blaze vacío", @@ -466,7 +465,6 @@ "item.create.furnace_minecart_contraption": "Artilugio de vagoneta de horno", "item.create.goggles": "Gafas del Ingeniero", "item.create.golden_sheet": "Lámina de oro", - "item.create.handheld_blockzapper": "Blockzapper", "item.create.handheld_worldshaper": "Worldshaper", "item.create.honey_bucket": "Cubo de miel", "item.create.honeyed_apple": "UNLOCALIZED: Honeyed Apple", @@ -645,14 +643,8 @@ "advancement.create.refined_radiance.desc": "Crea un Resplandor refinado, una poderosa sustancia cromática.", "advancement.create.chromatic_age": "La edad cromática", "advancement.create.chromatic_age.desc": "Crear bloques de revestimiento de la luz y la oscuridad.", - "advancement.create.zapper": "Construir con estilo", - "advancement.create.zapper.desc": "Construye un Blockzapper. Una pistola láser radiante que te ayuda a construir.", - "advancement.create.upgraded_zapper": "Radiante sobrecarga", - "advancement.create.upgraded_zapper.desc": "Crear y activar un Blockzapper totalmente mejorado.", "advancement.create.wand_of_symmetry": "Espejos radiantes", "advancement.create.wand_of_symmetry.desc": "Crear un bastón de simetría.", - "advancement.create.deforester": "Picado radiante", - "advancement.create.deforester.desc": "Crea un Deforestador y despídete del bosque local.", "advancement.create.extendo_grip": "Boioioing!", "advancement.create.extendo_grip.desc": "Hazte con un Agarre extentido.", "advancement.create.dual_extendo_grip": "La última edad del boing", @@ -695,7 +687,6 @@ "create.recipe.automatic_shaped": "Elaboración automatizada de productos con forma", "create.recipe.block_cutting": "Corte de bloques", "create.recipe.wood_cutting": "Corte de maderas", - "create.recipe.blockzapper_upgrade": "Blockzapper", "create.recipe.sandpaper_polishing": "Pulido con papel de lija", "create.recipe.mystery_conversion": "Conversión misteriosa", "create.recipe.spout_filling": "Llenar por el pico", @@ -752,20 +743,16 @@ "create.orientation.alongZ": "A lo largo de Z", "create.orientation.alongX": "A lo largo de X", - "create.gui.blockzapper.title": "Blockzapper", - "create.gui.blockzapper.replaceMode": "Modo de sustitución", - "create.gui.blockzapper.searchDiagonal": "Seguir las diagonales", - "create.gui.blockzapper.searchFuzzy": "Ignorar los bordes del material", - "create.gui.blockzapper.range": "Alcance del margen de maniobra", - "create.gui.blockzapper.needsUpgradedAmplifier": "Requiere un amplificador mejorado", - "create.gui.blockzapper.patternSection": "Patrón", - "create.gui.blockzapper.pattern.solid": "Sólido", - "create.gui.blockzapper.pattern.checkered": "Tablero de ajedrez", - "create.gui.blockzapper.pattern.inversecheckered": "Tablero de ajedrez invertido", - "create.gui.blockzapper.pattern.chance25": "25% Roll", - "create.gui.blockzapper.pattern.chance50": "50% Roll", - "create.gui.blockzapper.pattern.chance75": "75% Roll", "create.gui.terrainzapper.title": "Worldshaper", + "create.gui.terrainzapper.searchDiagonal": "UNLOCALIZED: Follow Diagonals", + "create.gui.terrainzapper.searchFuzzy": "UNLOCALIZED: Ignore Material Borders", + "create.gui.terrainzapper.patternSection": "UNLOCALIZED: Pattern", + "create.gui.terrainzapper.pattern.solid": "UNLOCALIZED: Solid", + "create.gui.terrainzapper.pattern.checkered": "UNLOCALIZED: Checkerboard", + "create.gui.terrainzapper.pattern.inversecheckered": "UNLOCALIZED: Inverted Checkerboard", + "create.gui.terrainzapper.pattern.chance25": "UNLOCALIZED: 25% Roll", + "create.gui.terrainzapper.pattern.chance50": "UNLOCALIZED: 50% Roll", + "create.gui.terrainzapper.pattern.chance75": "UNLOCALIZED: 75% Roll", "create.gui.terrainzapper.placement": "Colocación", "create.gui.terrainzapper.placement.merged": "Fusionado", "create.gui.terrainzapper.placement.attached": "Adjuntado", @@ -774,6 +761,8 @@ "create.gui.terrainzapper.brush.cuboid": "Cuboide", "create.gui.terrainzapper.brush.sphere": "Esfera", "create.gui.terrainzapper.brush.cylinder": "Cilindro", + "create.gui.terrainzapper.brush.surface": "UNLOCALIZED: Surface", + "create.gui.terrainzapper.brush.cluster": "UNLOCALIZED: Cluster", "create.gui.terrainzapper.tool": "Herramienta", "create.gui.terrainzapper.tool.fill": "Llenar", "create.gui.terrainzapper.tool.place": "Sitio", @@ -783,19 +772,8 @@ "create.gui.terrainzapper.tool.flatten": "Aplanar", "create.terrainzapper.shiftRightClickToSet": "Shift+Clic con el botón derecho para seleccionar una forma", - - "create.blockzapper.usingBlock": "Utilizando: %1$s", - "create.blockzapper.componentUpgrades": "Mejoras de componentes:", - "create.blockzapper.component.body": "Cuerpo", - "create.blockzapper.component.amplifier": "Amplificador", - "create.blockzapper.component.accelerator": "Acelerador", - "create.blockzapper.component.retriever": "Recuperador", - "create.blockzapper.component.scope": "Mira telescópica", - "create.blockzapper.componentTier.none": "Ninguno", - "create.blockzapper.componentTier.brass": "Latón", - "create.blockzapper.componentTier.chromatic": "Cromático", - "create.blockzapper.leftClickToSet": "Clic izquierdo en un bloque para establecer el material", - "create.blockzapper.empty": "Sin bloques!", + "create.terrainzapper.usingBlock": "UNLOCALIZED: Using: %1$s", + "create.terrainzapper.leftClickToSet": "UNLOCALIZED: Left-Click a Block to set Material", "create.minecart_coupling.two_couplings_max": "Las vagonetas no pueden tener más de dos enganches cada una", "create.minecart_coupling.unloaded": "Algunas partes de su tren parecen estar en chunks no cargados", @@ -1159,9 +1137,9 @@ "create.subtitle.wrench_rotate": "UNLOCALIZED: Wrench used", "create.subtitle.mixing": "UNLOCALIZED: Mixing Noises", "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", - "create.subtitle.blockzapper_confirm": "Ding afirmativo", + "create.subtitle.worldshaper_place": "UNLOCALIZED: Worldshaper zaps", "create.subtitle.depot_slide": "UNLOCALIZED: Item slides", - "create.subtitle.blockzapper_place": "Los bloques se colocan en su sitio", + "create.subtitle.deny": "UNLOCALIZED: Declining boop", "create.subtitle.blaze_munch": "Blaze mastica felizmente", "create.subtitle.schematicannon_launch_block": "Disparos de Schematicannon", "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps", @@ -1170,11 +1148,11 @@ "create.subtitle.mechanical_press_activation": "La Prensa Mecánica se activa", "create.subtitle.contraption_assemble": "UNLOCALIZED: Contraption moves", "create.subtitle.crafter_craft": "UNLOCALIZED: Crafter crafts", - "create.subtitle.blockzapper_deny": "Boop declinante", "create.subtitle.cranking": "UNLOCALIZED: Hand Crank turns", "create.subtitle.crafter_click": "UNLOCALIZED: Crafter clicks", "create.subtitle.wrench_remove": "UNLOCALIZED: Component breaks", "create.subtitle.depot_plop": "UNLOCALIZED: Item lands", + "create.subtitle.confirm": "UNLOCALIZED: Affirmative ding", "_": "->------------------------] Item Descriptions [------------------------<-", @@ -1280,15 +1258,6 @@ "item.create.wand_of_symmetry.tooltip.control3": "Click derecho mientras se agacha", "item.create.wand_of_symmetry.tooltip.action3": "Abre la _Interfaz de Configuración_", - "item.create.handheld_blockzapper.tooltip": "BLOCKZAPPER", - "item.create.handheld_blockzapper.tooltip.summary": "Novedoso artefacto para colocar o intercambiar bloques a distancia", - "item.create.handheld_blockzapper.tooltip.control1": "Click izquierdo en un bloque", - "item.create.handheld_blockzapper.tooltip.action1": "Establece los bloques colocados por la herramienta en el bloque objetivo", - "item.create.handheld_blockzapper.tooltip.control2": "Click derecho en un bloque", - "item.create.handheld_blockzapper.tooltip.action2": "_Coloca_ o _Reemplaza_ el bloque objetivo", - "item.create.handheld_blockzapper.tooltip.control3": "Click derecho mientras se agacha", - "item.create.handheld_blockzapper.tooltip.action3": "Abre la _Interfaz de Configuración_", - "item.create.handheld_worldshaper.tooltip": "WORLDSHAPER", "item.create.handheld_worldshaper.tooltip.summary": "Práctica herramienta para crear _paisajes_ y _características del terreno_", "item.create.handheld_worldshaper.tooltip.control1": "Click izquierdo en un bloque", @@ -1303,9 +1272,6 @@ "item.create.tree_fertilizer.tooltip.condition1": "Cuando se utiliza en un árbol joven", "item.create.tree_fertilizer.tooltip.behaviour1": "Hace crecer los árboles _independientemente_ de sus condiciones de _espacio_", - "item.create.deforester.tooltip": "DEFORESTADOR", - "item.create.deforester.tooltip.summary": "Un hacha _radiante_ capaz de talar árboles en una fracción de segundo", - "item.create.extendo_grip.tooltip": "AGARRE EXTENDIDO", "item.create.extendo_grip.tooltip.summary": "¡Boioioing! Aumenta enormemente la _distancia de alcance_ del portador", "item.create.extendo_grip.tooltip.condition1": "Cuando está fuera de la mano", diff --git a/src/generated/resources/assets/create/lang/unfinished/es_mx.json b/src/generated/resources/assets/create/lang/unfinished/es_mx.json index 4fd59a9f5..5e4233492 100644 --- a/src/generated/resources/assets/create/lang/unfinished/es_mx.json +++ b/src/generated/resources/assets/create/lang/unfinished/es_mx.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1278", + "_": "Missing Localizations: 1259", "_": "->------------------------] Game Elements [------------------------<-", @@ -456,7 +456,6 @@ "item.create.crushed_tin_ore": "Mineral de Estaño Molido", "item.create.crushed_uranium_ore": "Mineral de Uranio Molido", "item.create.crushed_zinc_ore": "Mineral de Zinc Molido", - "item.create.deforester": "Deforestador", "item.create.dough": "Masa", "item.create.electron_tube": "Válvula Electrónica", "item.create.empty_blaze_burner": "Quemador de Blaze Vacío", @@ -466,7 +465,6 @@ "item.create.furnace_minecart_contraption": "Artefacto de Vagón con Horno", "item.create.goggles": "Gafas de Protección para Ingenieros", "item.create.golden_sheet": "Lámina de Oro", - "item.create.handheld_blockzapper": "Pistola de Manipulación de Bloques", "item.create.handheld_worldshaper": "Pistola de Manipulación de Mundo", "item.create.honey_bucket": "Cubeta de Miel", "item.create.honeyed_apple": "UNLOCALIZED: Honeyed Apple", @@ -645,14 +643,8 @@ "advancement.create.refined_radiance.desc": "UNLOCALIZED: Create Refined Radiance, a powerful chromatic substance.", "advancement.create.chromatic_age": "UNLOCALIZED: The Chromatic Age", "advancement.create.chromatic_age.desc": "UNLOCALIZED: Create casing blocks of the light and dark.", - "advancement.create.zapper": "UNLOCALIZED: Building With Style", - "advancement.create.zapper.desc": "UNLOCALIZED: Craft a Blockzapper. A radiant laser gun that helps you build.", - "advancement.create.upgraded_zapper": "UNLOCALIZED: Radiant Overdrive", - "advancement.create.upgraded_zapper.desc": "UNLOCALIZED: Create and activate a fully upgraded Blockzapper.", "advancement.create.wand_of_symmetry": "UNLOCALIZED: Radiant Mirrors", "advancement.create.wand_of_symmetry.desc": "UNLOCALIZED: Craft a Staff of Symmetry.", - "advancement.create.deforester": "UNLOCALIZED: Radiant Chopping", - "advancement.create.deforester.desc": "UNLOCALIZED: Craft a Deforester, and say goodbye to the local forest.", "advancement.create.extendo_grip": "UNLOCALIZED: Boioioing!", "advancement.create.extendo_grip.desc": "UNLOCALIZED: Get hold of an Extendo Grip.", "advancement.create.dual_extendo_grip": "UNLOCALIZED: Ultimate Boing-age", @@ -695,7 +687,6 @@ "create.recipe.automatic_shaped": "UNLOCALIZED: Automated Shaped Crafting", "create.recipe.block_cutting": "UNLOCALIZED: Block Cutting", "create.recipe.wood_cutting": "UNLOCALIZED: Wood Cutting", - "create.recipe.blockzapper_upgrade": "UNLOCALIZED: Handheld Blockzapper", "create.recipe.sandpaper_polishing": "UNLOCALIZED: Sandpaper Polishing", "create.recipe.mystery_conversion": "UNLOCALIZED: Mysterious Conversion", "create.recipe.spout_filling": "UNLOCALIZED: Filling by Spout", @@ -752,20 +743,16 @@ "create.orientation.alongZ": "UNLOCALIZED: Along Z", "create.orientation.alongX": "UNLOCALIZED: Along X", - "create.gui.blockzapper.title": "UNLOCALIZED: Handheld Blockzapper", - "create.gui.blockzapper.replaceMode": "UNLOCALIZED: Replace Mode", - "create.gui.blockzapper.searchDiagonal": "UNLOCALIZED: Follow Diagonals", - "create.gui.blockzapper.searchFuzzy": "UNLOCALIZED: Ignore Material Borders", - "create.gui.blockzapper.range": "UNLOCALIZED: Spread Range", - "create.gui.blockzapper.needsUpgradedAmplifier": "UNLOCALIZED: Requires Upgraded Amplifier", - "create.gui.blockzapper.patternSection": "UNLOCALIZED: Pattern", - "create.gui.blockzapper.pattern.solid": "UNLOCALIZED: Solid", - "create.gui.blockzapper.pattern.checkered": "UNLOCALIZED: Checkerboard", - "create.gui.blockzapper.pattern.inversecheckered": "UNLOCALIZED: Inverted Checkerboard", - "create.gui.blockzapper.pattern.chance25": "UNLOCALIZED: 25% Roll", - "create.gui.blockzapper.pattern.chance50": "UNLOCALIZED: 50% Roll", - "create.gui.blockzapper.pattern.chance75": "UNLOCALIZED: 75% Roll", - "create.gui.terrainzapper.title": "UNLOCALIZED: Handheld Worldshaper", + "create.gui.terrainzapper.title": "UNLOCALIZED: Handheld Blockzapper", + "create.gui.terrainzapper.searchDiagonal": "UNLOCALIZED: Follow Diagonals", + "create.gui.terrainzapper.searchFuzzy": "UNLOCALIZED: Ignore Material Borders", + "create.gui.terrainzapper.patternSection": "UNLOCALIZED: Pattern", + "create.gui.terrainzapper.pattern.solid": "UNLOCALIZED: Solid", + "create.gui.terrainzapper.pattern.checkered": "UNLOCALIZED: Checkerboard", + "create.gui.terrainzapper.pattern.inversecheckered": "UNLOCALIZED: Inverted Checkerboard", + "create.gui.terrainzapper.pattern.chance25": "UNLOCALIZED: 25% Roll", + "create.gui.terrainzapper.pattern.chance50": "UNLOCALIZED: 50% Roll", + "create.gui.terrainzapper.pattern.chance75": "UNLOCALIZED: 75% Roll", "create.gui.terrainzapper.placement": "UNLOCALIZED: Placement", "create.gui.terrainzapper.placement.merged": "UNLOCALIZED: Merged", "create.gui.terrainzapper.placement.attached": "UNLOCALIZED: Attached", @@ -774,6 +761,8 @@ "create.gui.terrainzapper.brush.cuboid": "UNLOCALIZED: Cuboid", "create.gui.terrainzapper.brush.sphere": "UNLOCALIZED: Sphere", "create.gui.terrainzapper.brush.cylinder": "UNLOCALIZED: Cylinder", + "create.gui.terrainzapper.brush.surface": "UNLOCALIZED: Surface", + "create.gui.terrainzapper.brush.cluster": "UNLOCALIZED: Cluster", "create.gui.terrainzapper.tool": "UNLOCALIZED: Tool", "create.gui.terrainzapper.tool.fill": "UNLOCALIZED: Fill", "create.gui.terrainzapper.tool.place": "UNLOCALIZED: Place", @@ -783,19 +772,8 @@ "create.gui.terrainzapper.tool.flatten": "UNLOCALIZED: Flatten", "create.terrainzapper.shiftRightClickToSet": "UNLOCALIZED: Shift-Right-Click to Select a Shape", - - "create.blockzapper.usingBlock": "UNLOCALIZED: Using: %1$s", - "create.blockzapper.componentUpgrades": "UNLOCALIZED: Component Upgrades:", - "create.blockzapper.component.body": "UNLOCALIZED: Body", - "create.blockzapper.component.amplifier": "UNLOCALIZED: Amplifier", - "create.blockzapper.component.accelerator": "UNLOCALIZED: Accelerator", - "create.blockzapper.component.retriever": "UNLOCALIZED: Retriever", - "create.blockzapper.component.scope": "UNLOCALIZED: Scope", - "create.blockzapper.componentTier.none": "UNLOCALIZED: None", - "create.blockzapper.componentTier.brass": "UNLOCALIZED: Brass", - "create.blockzapper.componentTier.chromatic": "UNLOCALIZED: Chromatic", - "create.blockzapper.leftClickToSet": "UNLOCALIZED: Left-Click a Block to set Material", - "create.blockzapper.empty": "UNLOCALIZED: Out of Blocks!", + "create.terrainzapper.usingBlock": "UNLOCALIZED: Using: %1$s", + "create.terrainzapper.leftClickToSet": "UNLOCALIZED: Left-Click a Block to set Material", "create.minecart_coupling.two_couplings_max": "UNLOCALIZED: Minecarts cannot have more than two couplings each", "create.minecart_coupling.unloaded": "UNLOCALIZED: Parts of your train seem to be in unloaded chunks", @@ -1159,9 +1137,9 @@ "create.subtitle.wrench_rotate": "UNLOCALIZED: Wrench used", "create.subtitle.mixing": "UNLOCALIZED: Mixing Noises", "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", - "create.subtitle.blockzapper_confirm": "UNLOCALIZED: Affirmative ding", + "create.subtitle.worldshaper_place": "UNLOCALIZED: Worldshaper zaps", "create.subtitle.depot_slide": "UNLOCALIZED: Item slides", - "create.subtitle.blockzapper_place": "UNLOCALIZED: Blockzapper zaps", + "create.subtitle.deny": "UNLOCALIZED: Declining boop", "create.subtitle.blaze_munch": "UNLOCALIZED: Blaze Burner munches", "create.subtitle.schematicannon_launch_block": "UNLOCALIZED: Schematicannon fires", "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps", @@ -1170,11 +1148,11 @@ "create.subtitle.mechanical_press_activation": "UNLOCALIZED: Mechanical Press clangs", "create.subtitle.contraption_assemble": "UNLOCALIZED: Contraption moves", "create.subtitle.crafter_craft": "UNLOCALIZED: Crafter crafts", - "create.subtitle.blockzapper_deny": "UNLOCALIZED: Declining boop", "create.subtitle.cranking": "UNLOCALIZED: Hand Crank turns", "create.subtitle.crafter_click": "UNLOCALIZED: Crafter clicks", "create.subtitle.wrench_remove": "UNLOCALIZED: Component breaks", "create.subtitle.depot_plop": "UNLOCALIZED: Item lands", + "create.subtitle.confirm": "UNLOCALIZED: Affirmative ding", "_": "->------------------------] Item Descriptions [------------------------<-", @@ -1280,15 +1258,6 @@ "item.create.wand_of_symmetry.tooltip.control3": "Click Derecho cuando se esta agachado", "item.create.wand_of_symmetry.tooltip.action3": "Abre la _Interfaz_ _de_ _Configuración_", - "item.create.handheld_blockzapper.tooltip": "BLOCKZAPPER", - "item.create.handheld_blockzapper.tooltip.summary": "Novedoso artilugio para colocar o intercambiar bloques a distancia.", - "item.create.handheld_blockzapper.tooltip.control1": "Click Izquierdo a un bloque", - "item.create.handheld_blockzapper.tooltip.action1": "Establece los bloques que serán colocados por la herramienta en el bloque objetivo.", - "item.create.handheld_blockzapper.tooltip.control2": "Click Derecho en un bloque", - "item.create.handheld_blockzapper.tooltip.action2": "_Coloca_ o _reemplaza_ el bloque objetivo.", - "item.create.handheld_blockzapper.tooltip.control3": "Click Derecho mientras se está agachado", - "item.create.handheld_blockzapper.tooltip.action3": "Abre la _Interfaz_ _de_ _Configuración._", - "item.create.handheld_worldshaper.tooltip": "HANDHELD WORLDSHAPER", "item.create.handheld_worldshaper.tooltip.summary": "Una herramienta útil para crear _paisajes_ y _características_ en el _terreno._", "item.create.handheld_worldshaper.tooltip.control1": "Click Izquierdo a un bloque", @@ -1303,9 +1272,6 @@ "item.create.tree_fertilizer.tooltip.condition1": "Cuando se usa en un retoño de árbol", "item.create.tree_fertilizer.tooltip.behaviour1": "Hace crecer los árboles, sin importar el espacio entre ellos.", - "item.create.deforester.tooltip": "DEFORESTER", - "item.create.deforester.tooltip.summary": "Un _hacha_ _radiante_ capaz de cortar árboles en una fracción de segundo.", - "item.create.extendo_grip.tooltip": "EXTENDO GRIP", "item.create.extendo_grip.tooltip.summary": "Boioioing! En gran medida, _aumenta_ _la_ _distancia_ _de_ _alcance_ del portador.", "item.create.extendo_grip.tooltip.condition1": "Cuando está en la mano secundaria", diff --git a/src/generated/resources/assets/create/lang/unfinished/fr_fr.json b/src/generated/resources/assets/create/lang/unfinished/fr_fr.json index b59bbd5f4..5dbf5571b 100644 --- a/src/generated/resources/assets/create/lang/unfinished/fr_fr.json +++ b/src/generated/resources/assets/create/lang/unfinished/fr_fr.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1177", + "_": "Missing Localizations: 1187", "_": "->------------------------] Game Elements [------------------------<-", @@ -456,7 +456,6 @@ "item.create.crushed_tin_ore": "Etain concassé", "item.create.crushed_uranium_ore": "Uranium concassé", "item.create.crushed_zinc_ore": "Zinc concassé", - "item.create.deforester": "Déforesteur", "item.create.dough": "Pâte", "item.create.electron_tube": "Tube électronique", "item.create.empty_blaze_burner": "Brûleur à blaze vide", @@ -466,7 +465,6 @@ "item.create.furnace_minecart_contraption": "Engin de wagon avec fourneau", "item.create.goggles": "Lunettes d'ingénieur", "item.create.golden_sheet": "Feuille d'or", - "item.create.handheld_blockzapper": "Blockzappeur portable", "item.create.handheld_worldshaper": "Térraformeur portable", "item.create.honey_bucket": "Seau de miel", "item.create.honeyed_apple": "UNLOCALIZED: Honeyed Apple", @@ -645,14 +643,8 @@ "advancement.create.refined_radiance.desc": "UNLOCALIZED: Create Refined Radiance, a powerful chromatic substance.", "advancement.create.chromatic_age": "UNLOCALIZED: The Chromatic Age", "advancement.create.chromatic_age.desc": "UNLOCALIZED: Create casing blocks of the light and dark.", - "advancement.create.zapper": "UNLOCALIZED: Building With Style", - "advancement.create.zapper.desc": "UNLOCALIZED: Craft a Blockzapper. A radiant laser gun that helps you build.", - "advancement.create.upgraded_zapper": "UNLOCALIZED: Radiant Overdrive", - "advancement.create.upgraded_zapper.desc": "UNLOCALIZED: Create and activate a fully upgraded Blockzapper.", "advancement.create.wand_of_symmetry": "UNLOCALIZED: Radiant Mirrors", "advancement.create.wand_of_symmetry.desc": "UNLOCALIZED: Craft a Staff of Symmetry.", - "advancement.create.deforester": "UNLOCALIZED: Radiant Chopping", - "advancement.create.deforester.desc": "UNLOCALIZED: Craft a Deforester, and say goodbye to the local forest.", "advancement.create.extendo_grip": "UNLOCALIZED: Boioioing!", "advancement.create.extendo_grip.desc": "UNLOCALIZED: Get hold of an Extendo Grip.", "advancement.create.dual_extendo_grip": "UNLOCALIZED: Ultimate Boing-age", @@ -695,7 +687,6 @@ "create.recipe.automatic_shaped": "UNLOCALIZED: Automated Shaped Crafting", "create.recipe.block_cutting": "Coupe de bloc", "create.recipe.wood_cutting": "UNLOCALIZED: Wood Cutting", - "create.recipe.blockzapper_upgrade": "Blockzappeur portable", "create.recipe.sandpaper_polishing": "Polissage au papier de verre", "create.recipe.mystery_conversion": "Métamorphose chromatique", "create.recipe.spout_filling": "Remplissage par un bec verseur", @@ -752,20 +743,16 @@ "create.orientation.alongZ": "Sur Z", "create.orientation.alongX": "Sur X", - "create.gui.blockzapper.title": "Blockzappeur portable", - "create.gui.blockzapper.replaceMode": "Mode de remplacement", - "create.gui.blockzapper.searchDiagonal": "Suivez les diagonales", - "create.gui.blockzapper.searchFuzzy": "Ignorer les bordures de matériau", - "create.gui.blockzapper.range": "Plage de propagation", - "create.gui.blockzapper.needsUpgradedAmplifier": "Nécessite un amplificateur amélioré", - "create.gui.blockzapper.patternSection": "Motif", - "create.gui.blockzapper.pattern.solid": "Solide", - "create.gui.blockzapper.pattern.checkered": "Quamechanical_drillage", - "create.gui.blockzapper.pattern.inversecheckered": "Quamechanical_drillage inversé", - "create.gui.blockzapper.pattern.chance25": "25%", - "create.gui.blockzapper.pattern.chance50": "50%", - "create.gui.blockzapper.pattern.chance75": "75%", "create.gui.terrainzapper.title": "Térraformeur portable", + "create.gui.terrainzapper.searchDiagonal": "UNLOCALIZED: Follow Diagonals", + "create.gui.terrainzapper.searchFuzzy": "UNLOCALIZED: Ignore Material Borders", + "create.gui.terrainzapper.patternSection": "UNLOCALIZED: Pattern", + "create.gui.terrainzapper.pattern.solid": "UNLOCALIZED: Solid", + "create.gui.terrainzapper.pattern.checkered": "UNLOCALIZED: Checkerboard", + "create.gui.terrainzapper.pattern.inversecheckered": "UNLOCALIZED: Inverted Checkerboard", + "create.gui.terrainzapper.pattern.chance25": "UNLOCALIZED: 25% Roll", + "create.gui.terrainzapper.pattern.chance50": "UNLOCALIZED: 50% Roll", + "create.gui.terrainzapper.pattern.chance75": "UNLOCALIZED: 75% Roll", "create.gui.terrainzapper.placement": "Placement", "create.gui.terrainzapper.placement.merged": "Fusionner", "create.gui.terrainzapper.placement.attached": "Attacher", @@ -774,6 +761,8 @@ "create.gui.terrainzapper.brush.cuboid": "Cuboïde", "create.gui.terrainzapper.brush.sphere": "Sphère", "create.gui.terrainzapper.brush.cylinder": "Cylindre", + "create.gui.terrainzapper.brush.surface": "UNLOCALIZED: Surface", + "create.gui.terrainzapper.brush.cluster": "UNLOCALIZED: Cluster", "create.gui.terrainzapper.tool": "Outil", "create.gui.terrainzapper.tool.fill": "Remplir", "create.gui.terrainzapper.tool.place": "Placer", @@ -783,19 +772,8 @@ "create.gui.terrainzapper.tool.flatten": "Applatir", "create.terrainzapper.shiftRightClickToSet": "Maj + clic droit pour sélectionner une forme", - - "create.blockzapper.usingBlock": "Utilisation: %1$s", - "create.blockzapper.componentUpgrades": "Mises à niveau des composants:", - "create.blockzapper.component.body": "Corps", - "create.blockzapper.component.amplifier": "Amplifieur", - "create.blockzapper.component.accelerator": "Accélérateur", - "create.blockzapper.component.retriever": "Récupérateur", - "create.blockzapper.component.scope": "Lunette", - "create.blockzapper.componentTier.none": "Aucun", - "create.blockzapper.componentTier.brass": "Laiton", - "create.blockzapper.componentTier.chromatic": "Chromatique", - "create.blockzapper.leftClickToSet": "Clic gauche sur un bloc pour en définir le matériau", - "create.blockzapper.empty": "Plus de blocs!", + "create.terrainzapper.usingBlock": "UNLOCALIZED: Using: %1$s", + "create.terrainzapper.leftClickToSet": "UNLOCALIZED: Left-Click a Block to set Material", "create.minecart_coupling.two_couplings_max": "UNLOCALIZED: Minecarts cannot have more than two couplings each", "create.minecart_coupling.unloaded": "UNLOCALIZED: Parts of your train seem to be in unloaded chunks", @@ -1159,9 +1137,9 @@ "create.subtitle.wrench_rotate": "UNLOCALIZED: Wrench used", "create.subtitle.mixing": "UNLOCALIZED: Mixing Noises", "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", - "create.subtitle.blockzapper_confirm": "Ding d'affirmation", + "create.subtitle.worldshaper_place": "UNLOCALIZED: Worldshaper zaps", "create.subtitle.depot_slide": "UNLOCALIZED: Item slides", - "create.subtitle.blockzapper_place": "Blocs se zappant en place", + "create.subtitle.deny": "UNLOCALIZED: Declining boop", "create.subtitle.blaze_munch": "UNLOCALIZED: Blaze Burner munches", "create.subtitle.schematicannon_launch_block": "Tir de schémacanon", "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps", @@ -1170,11 +1148,11 @@ "create.subtitle.mechanical_press_activation": "Activation de la presse mechanique", "create.subtitle.contraption_assemble": "UNLOCALIZED: Contraption moves", "create.subtitle.crafter_craft": "UNLOCALIZED: Crafter crafts", - "create.subtitle.blockzapper_deny": "Boop de déclin", "create.subtitle.cranking": "UNLOCALIZED: Hand Crank turns", "create.subtitle.crafter_click": "UNLOCALIZED: Crafter clicks", "create.subtitle.wrench_remove": "UNLOCALIZED: Component breaks", "create.subtitle.depot_plop": "UNLOCALIZED: Item lands", + "create.subtitle.confirm": "UNLOCALIZED: Affirmative ding", "_": "->------------------------] Item Descriptions [------------------------<-", @@ -1280,15 +1258,6 @@ "item.create.wand_of_symmetry.tooltip.control3": "Clic droit en étant accroupi", "item.create.wand_of_symmetry.tooltip.action3": "Ouvre l'_interface_ _de_ _configuration_", - "item.create.handheld_blockzapper.tooltip": "BLOCKZAPPEUR", - "item.create.handheld_blockzapper.tooltip.summary": "Nouveau gadget pour placer ou échanger des blocs à distance.", - "item.create.handheld_blockzapper.tooltip.control1": "Clic gauche sur un bloc", - "item.create.handheld_blockzapper.tooltip.action1": "Définit les blocs placés par l'outil sur le bloc ciblé.", - "item.create.handheld_blockzapper.tooltip.control2": "Clic droit sur un bloc", - "item.create.handheld_blockzapper.tooltip.action2": "_Place_ ou _remplace_ le bloc ciblé.", - "item.create.handheld_blockzapper.tooltip.control3": "Clic droit en étant accroupi", - "item.create.handheld_blockzapper.tooltip.action3": "Ouvre l'_interface_ _de_ _configuration_.", - "item.create.handheld_worldshaper.tooltip": "TERRAFORMEUR", "item.create.handheld_worldshaper.tooltip.summary": "Outil pratique pour créer des _paysage_ et _caractéristiques_ _de_ _terrain_.", "item.create.handheld_worldshaper.tooltip.control1": "Clic gauche sur un bloc", @@ -1303,9 +1272,6 @@ "item.create.tree_fertilizer.tooltip.condition1": "Lorsqu'utilisé sur une pousse d'rotor", "item.create.tree_fertilizer.tooltip.behaviour1": "Fait pousser des rotors _indépendamment_ de leurs _conditions_ _d'emplacement_", - "item.create.deforester.tooltip": "DÉFORESTEUR", - "item.create.deforester.tooltip.summary": "Une _hache_ _rayonnante_ capable d'abattre des rotors en une fraction de seconde.", - "item.create.extendo_grip.tooltip": "UNLOCALIZED: EXTENDO GRIP", "item.create.extendo_grip.tooltip.summary": "UNLOCALIZED: Boioioing! Greatly _increases reach distance_ of the wielder.", "item.create.extendo_grip.tooltip.condition1": "UNLOCALIZED: When in Off-Hand", diff --git a/src/generated/resources/assets/create/lang/unfinished/it_it.json b/src/generated/resources/assets/create/lang/unfinished/it_it.json index eef42803f..82e91b1f4 100644 --- a/src/generated/resources/assets/create/lang/unfinished/it_it.json +++ b/src/generated/resources/assets/create/lang/unfinished/it_it.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 637", + "_": "Missing Localizations: 653", "_": "->------------------------] Game Elements [------------------------<-", @@ -456,7 +456,6 @@ "item.create.crushed_tin_ore": "Stagno grezzo frantumato", "item.create.crushed_uranium_ore": "Uranio grezzo frantumato", "item.create.crushed_zinc_ore": "Zinco grezzo frantumato", - "item.create.deforester": "Deforestatore", "item.create.dough": "Impasto", "item.create.electron_tube": "Valvola", "item.create.empty_blaze_burner": "Inceneritore di blaze vuoto", @@ -466,7 +465,6 @@ "item.create.furnace_minecart_contraption": "Contrazione per carrello da miniera con fornace", "item.create.goggles": "Occhiali da ingegnere", "item.create.golden_sheet": "Lamiera d'oro", - "item.create.handheld_blockzapper": "Zapper di blocchi portatile", "item.create.handheld_worldshaper": "Plasmatore del mondo portatile", "item.create.honey_bucket": "Secchio di miele", "item.create.honeyed_apple": "UNLOCALIZED: Honeyed Apple", @@ -645,14 +643,8 @@ "advancement.create.refined_radiance.desc": "Crea la radiance raffinata, una sostanza cromatica potente.", "advancement.create.chromatic_age": "L'era cromatica", "advancement.create.chromatic_age.desc": "Crea involucri di luce e d'ombra.", - "advancement.create.zapper": "Stile nella costruzione", - "advancement.create.zapper.desc": "Crea uno zapper di blocchi. Una pistola laser che ti aiuta a costruire.", - "advancement.create.upgraded_zapper": "Overdrive", - "advancement.create.upgraded_zapper.desc": "Crea e attiva uno zapper di blocchi potenziato al massimo.", "advancement.create.wand_of_symmetry": "Perfettamente simmetrico", "advancement.create.wand_of_symmetry.desc": "Crea un'asta di simmetria.", - "advancement.create.deforester": "Deforestazione avanzata", - "advancement.create.deforester.desc": "Crea un deforestatore. Ciao ciao alberelli...", "advancement.create.extendo_grip": "BOIOIOING", "advancement.create.extendo_grip.desc": "Procurati una presa extendo.", "advancement.create.dual_extendo_grip": "Boingaggio estremo", @@ -695,7 +687,6 @@ "create.recipe.automatic_shaped": "Costruzione con forma automatizzata", "create.recipe.block_cutting": "Taglio di blocchi", "create.recipe.wood_cutting": "UNLOCALIZED: Wood Cutting", - "create.recipe.blockzapper_upgrade": "Zapper di blocchi portatile", "create.recipe.sandpaper_polishing": "Levigamento da carta vetrata", "create.recipe.mystery_conversion": "Metamorfosi cromatica", "create.recipe.spout_filling": "Riempimento da spruzzo", @@ -752,20 +743,16 @@ "create.orientation.alongZ": "Lungo Z", "create.orientation.alongX": "Lungo X", - "create.gui.blockzapper.title": "Zapper di blocchi", - "create.gui.blockzapper.replaceMode": "Modalità sostituzione", - "create.gui.blockzapper.searchDiagonal": "Segui diagonali", - "create.gui.blockzapper.searchFuzzy": "Ignora i bordi dei materiali", - "create.gui.blockzapper.range": "Gamma diffusione", - "create.gui.blockzapper.needsUpgradedAmplifier": "Richiede aggiornamento dell'amplificatore", - "create.gui.blockzapper.patternSection": "Schema", - "create.gui.blockzapper.pattern.solid": "Solido", - "create.gui.blockzapper.pattern.checkered": "Scacchiera", - "create.gui.blockzapper.pattern.inversecheckered": "Scacchiera invertita", - "create.gui.blockzapper.pattern.chance25": "Riempito al 25%", - "create.gui.blockzapper.pattern.chance50": "Riempito al 50%", - "create.gui.blockzapper.pattern.chance75": "Riempito al 75%", "create.gui.terrainzapper.title": "Plasmatore del mondo", + "create.gui.terrainzapper.searchDiagonal": "UNLOCALIZED: Follow Diagonals", + "create.gui.terrainzapper.searchFuzzy": "UNLOCALIZED: Ignore Material Borders", + "create.gui.terrainzapper.patternSection": "UNLOCALIZED: Pattern", + "create.gui.terrainzapper.pattern.solid": "UNLOCALIZED: Solid", + "create.gui.terrainzapper.pattern.checkered": "UNLOCALIZED: Checkerboard", + "create.gui.terrainzapper.pattern.inversecheckered": "UNLOCALIZED: Inverted Checkerboard", + "create.gui.terrainzapper.pattern.chance25": "UNLOCALIZED: 25% Roll", + "create.gui.terrainzapper.pattern.chance50": "UNLOCALIZED: 50% Roll", + "create.gui.terrainzapper.pattern.chance75": "UNLOCALIZED: 75% Roll", "create.gui.terrainzapper.placement": "Piazzamento", "create.gui.terrainzapper.placement.merged": "Fuso", "create.gui.terrainzapper.placement.attached": "Attaccato", @@ -774,6 +761,8 @@ "create.gui.terrainzapper.brush.cuboid": "Cuboide", "create.gui.terrainzapper.brush.sphere": "Sferico", "create.gui.terrainzapper.brush.cylinder": "Cilindrico", + "create.gui.terrainzapper.brush.surface": "UNLOCALIZED: Surface", + "create.gui.terrainzapper.brush.cluster": "UNLOCALIZED: Cluster", "create.gui.terrainzapper.tool": "Strumento", "create.gui.terrainzapper.tool.fill": "Riempi", "create.gui.terrainzapper.tool.place": "Piazza", @@ -783,19 +772,8 @@ "create.gui.terrainzapper.tool.flatten": "Appiattisci", "create.terrainzapper.shiftRightClickToSet": "Clic destro e shift per selezionare una forma", - - "create.blockzapper.usingBlock": "In utilizzo: %1$s", - "create.blockzapper.componentUpgrades": "Componenti:", - "create.blockzapper.component.body": "Corpo", - "create.blockzapper.component.amplifier": "Amplificatore", - "create.blockzapper.component.accelerator": "Acceleratore", - "create.blockzapper.component.retriever": "Retriever", - "create.blockzapper.component.scope": "Portata", - "create.blockzapper.componentTier.none": "Nessuno", - "create.blockzapper.componentTier.brass": "Ottone", - "create.blockzapper.componentTier.chromatic": "Cromatico", - "create.blockzapper.leftClickToSet": "Clic sinistro su un blocco per impostare il materiale", - "create.blockzapper.empty": "Fuori dai blocchi!", + "create.terrainzapper.usingBlock": "UNLOCALIZED: Using: %1$s", + "create.terrainzapper.leftClickToSet": "UNLOCALIZED: Left-Click a Block to set Material", "create.minecart_coupling.two_couplings_max": "I carrelli da miniera non possono avere più di due agganci ciascuno", "create.minecart_coupling.unloaded": "Parti del tuo treno sembrano essere in mezzo a chunk non caricati", @@ -1159,9 +1137,9 @@ "create.subtitle.wrench_rotate": "UNLOCALIZED: Wrench used", "create.subtitle.mixing": "UNLOCALIZED: Mixing Noises", "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", - "create.subtitle.blockzapper_confirm": "Ding affermativo", + "create.subtitle.worldshaper_place": "UNLOCALIZED: Worldshaper zaps", "create.subtitle.depot_slide": "UNLOCALIZED: Item slides", - "create.subtitle.blockzapper_place": "Posiziona blocchi nello spazio", + "create.subtitle.deny": "UNLOCALIZED: Declining boop", "create.subtitle.blaze_munch": "Il blaze lo gusta felicemente", "create.subtitle.schematicannon_launch_block": "Tiri del cannoneschematico", "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps", @@ -1170,11 +1148,11 @@ "create.subtitle.mechanical_press_activation": "Pressa meccanica attiva", "create.subtitle.contraption_assemble": "UNLOCALIZED: Contraption moves", "create.subtitle.crafter_craft": "UNLOCALIZED: Crafter crafts", - "create.subtitle.blockzapper_deny": "Boop in calo", "create.subtitle.cranking": "UNLOCALIZED: Hand Crank turns", "create.subtitle.crafter_click": "UNLOCALIZED: Crafter clicks", "create.subtitle.wrench_remove": "UNLOCALIZED: Component breaks", "create.subtitle.depot_plop": "UNLOCALIZED: Item lands", + "create.subtitle.confirm": "UNLOCALIZED: Affirmative ding", "_": "->------------------------] Item Descriptions [------------------------<-", @@ -1280,15 +1258,6 @@ "item.create.wand_of_symmetry.tooltip.control3": "Clic destro da accovacciato", "item.create.wand_of_symmetry.tooltip.action3": "Apre l'_interfaccia_ _di_ _configurazione_", - "item.create.handheld_blockzapper.tooltip": "ZAPPER DI BLOCCHI PORTATILE", - "item.create.handheld_blockzapper.tooltip.summary": "Nuovo gadget per posizionare o scambiare blocchi a distanza.", - "item.create.handheld_blockzapper.tooltip.control1": "Clic sinistro su un blocco", - "item.create.handheld_blockzapper.tooltip.action1": "Imposta i blocchi posizionati dallo strumento sul blocco selezionato.", - "item.create.handheld_blockzapper.tooltip.control2": "Clic destro su un blocco", - "item.create.handheld_blockzapper.tooltip.action2": "_Piazza_ o _sostituisce_ il blocco selezionato.", - "item.create.handheld_blockzapper.tooltip.control3": "Clic destro da accovacciato", - "item.create.handheld_blockzapper.tooltip.action3": "Apre l'_interfaccia_ _di_ _configurazione_.", - "item.create.handheld_worldshaper.tooltip": "PLASMATORE DEL MONDO PORTATILE", "item.create.handheld_worldshaper.tooltip.summary": "Strumento per la creazione di _paesaggi_ e _caratteristiche_ _del_ _terreno_.", "item.create.handheld_worldshaper.tooltip.control1": "Clic sinistro su un blocco", @@ -1303,9 +1272,6 @@ "item.create.tree_fertilizer.tooltip.condition1": "Se utilizzato su un arboscello", "item.create.tree_fertilizer.tooltip.behaviour1": "Fa crescere gli alberi _indipendentemente_ dalle _condizioni_ _di_ _spazio_", - "item.create.deforester.tooltip": "DEFORESTATORE", - "item.create.deforester.tooltip.summary": "Un'_ascia_ _radiante_ in grado di abbattere alberi in una frazione di secondo.", - "item.create.extendo_grip.tooltip": "PRESA EXTENDO", "item.create.extendo_grip.tooltip.summary": "Boioioing! _Incrementa notevolmente la distanza per piazzare_ di chi lo brandisce.", "item.create.extendo_grip.tooltip.condition1": "Quando in mano secondaria", diff --git a/src/generated/resources/assets/create/lang/unfinished/ja_jp.json b/src/generated/resources/assets/create/lang/unfinished/ja_jp.json index dd556f5a6..1076dfbcd 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ja_jp.json +++ b/src/generated/resources/assets/create/lang/unfinished/ja_jp.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 619", + "_": "Missing Localizations: 635", "_": "->------------------------] Game Elements [------------------------<-", @@ -456,7 +456,6 @@ "item.create.crushed_tin_ore": "砕いた錫鉱石", "item.create.crushed_uranium_ore": "砕いたウラン鉱石", "item.create.crushed_zinc_ore": "砕いた亜鉛鉱石", - "item.create.deforester": "デフォレスター", "item.create.dough": "生地", "item.create.electron_tube": "電子管", "item.create.empty_blaze_burner": "空のブレイズバーナー", @@ -466,7 +465,6 @@ "item.create.furnace_minecart_contraption": "からくりかまど付きトロッコ", "item.create.goggles": "エンジニアのゴーグル", "item.create.golden_sheet": "金板", - "item.create.handheld_blockzapper": "携帯型ブロックザッパー", "item.create.handheld_worldshaper": "携帯型ワールドシェーパー", "item.create.honey_bucket": "ハチミツ入りバケツ", "item.create.honeyed_apple": "UNLOCALIZED: Honeyed Apple", @@ -645,14 +643,8 @@ "advancement.create.refined_radiance.desc": "究極の色彩物質、「洗練された極光体」を作る", "advancement.create.chromatic_age": "色彩の時代", "advancement.create.chromatic_age.desc": "光と闇のケーシングを作る", - "advancement.create.zapper": "風格ある建築", - "advancement.create.zapper.desc": "建築に役立つレーザー銃、ブロックザッパーを作る", - "advancement.create.upgraded_zapper": "究極の輝き", - "advancement.create.upgraded_zapper.desc": "ブロックザッパーを最大までアップグレードする", "advancement.create.wand_of_symmetry": "輝く鏡", "advancement.create.wand_of_symmetry.desc": "対象の杖を作る", - "advancement.create.deforester": "輝く斧", - "advancement.create.deforester.desc": "デフォレスターを作って、地元の森に別れを告げる", "advancement.create.extendo_grip": "ビヨヨーン!", "advancement.create.extendo_grip.desc": "マジックハンドを手に入れる", "advancement.create.dual_extendo_grip": "究極のビヨンビヨン時代", @@ -695,7 +687,6 @@ "create.recipe.automatic_shaped": "自動定形クラフト", "create.recipe.block_cutting": "自動石切", "create.recipe.wood_cutting": "自動製材", - "create.recipe.blockzapper_upgrade": "携帯型ブロックザッパー", "create.recipe.sandpaper_polishing": "紙やすりでの研磨", "create.recipe.mystery_conversion": "不思議な変換", "create.recipe.spout_filling": "アイテム注液口による注入", @@ -752,20 +743,16 @@ "create.orientation.alongZ": "Z に沿る", "create.orientation.alongX": "X に沿る", - "create.gui.blockzapper.title": "携帯型ブロックザッパー", - "create.gui.blockzapper.replaceMode": "置換モード", - "create.gui.blockzapper.searchDiagonal": "対角線にフォロー", - "create.gui.blockzapper.searchFuzzy": "素材の境界を無視", - "create.gui.blockzapper.range": "範囲", - "create.gui.blockzapper.needsUpgradedAmplifier": "増幅アップグレードが必要", - "create.gui.blockzapper.patternSection": "模様", - "create.gui.blockzapper.pattern.solid": "敷き詰め", - "create.gui.blockzapper.pattern.checkered": "市松模様", - "create.gui.blockzapper.pattern.inversecheckered": "逆市松模様", - "create.gui.blockzapper.pattern.chance25": "25%", - "create.gui.blockzapper.pattern.chance50": "50%", - "create.gui.blockzapper.pattern.chance75": "75%", "create.gui.terrainzapper.title": "携帯型ワールドシェイパー", + "create.gui.terrainzapper.searchDiagonal": "UNLOCALIZED: Follow Diagonals", + "create.gui.terrainzapper.searchFuzzy": "UNLOCALIZED: Ignore Material Borders", + "create.gui.terrainzapper.patternSection": "UNLOCALIZED: Pattern", + "create.gui.terrainzapper.pattern.solid": "UNLOCALIZED: Solid", + "create.gui.terrainzapper.pattern.checkered": "UNLOCALIZED: Checkerboard", + "create.gui.terrainzapper.pattern.inversecheckered": "UNLOCALIZED: Inverted Checkerboard", + "create.gui.terrainzapper.pattern.chance25": "UNLOCALIZED: 25% Roll", + "create.gui.terrainzapper.pattern.chance50": "UNLOCALIZED: 50% Roll", + "create.gui.terrainzapper.pattern.chance75": "UNLOCALIZED: 75% Roll", "create.gui.terrainzapper.placement": "配置", "create.gui.terrainzapper.placement.merged": "合併", "create.gui.terrainzapper.placement.attached": "添える", @@ -774,6 +761,8 @@ "create.gui.terrainzapper.brush.cuboid": "直方体", "create.gui.terrainzapper.brush.sphere": "球体", "create.gui.terrainzapper.brush.cylinder": "円筒", + "create.gui.terrainzapper.brush.surface": "UNLOCALIZED: Surface", + "create.gui.terrainzapper.brush.cluster": "UNLOCALIZED: Cluster", "create.gui.terrainzapper.tool": "ツール", "create.gui.terrainzapper.tool.fill": "埋立", "create.gui.terrainzapper.tool.place": "設置", @@ -783,19 +772,8 @@ "create.gui.terrainzapper.tool.flatten": "なだらかに", "create.terrainzapper.shiftRightClickToSet": "シフト-右クリックで形状を選択", - - "create.blockzapper.usingBlock": "使用中: %1$s", - "create.blockzapper.componentUpgrades": "コンポーネントアップグレード:", - "create.blockzapper.component.body": "ボディー", - "create.blockzapper.component.amplifier": "増幅", - "create.blockzapper.component.accelerator": "加速", - "create.blockzapper.component.retriever": "レトリーバー", - "create.blockzapper.component.scope": "範囲", - "create.blockzapper.componentTier.none": "無し", - "create.blockzapper.componentTier.brass": "真鍮", - "create.blockzapper.componentTier.chromatic": "色彩", - "create.blockzapper.leftClickToSet": "ブロックをスニークせず左クリックでブロックを選択", - "create.blockzapper.empty": "ブロック不足!", + "create.terrainzapper.usingBlock": "UNLOCALIZED: Using: %1$s", + "create.terrainzapper.leftClickToSet": "UNLOCALIZED: Left-Click a Block to set Material", "create.minecart_coupling.two_couplings_max": "トロッコを2つ以上連結させることはできません", "create.minecart_coupling.unloaded": "列車の一部のあるチャンクがロードされていません", @@ -1159,9 +1137,9 @@ "create.subtitle.wrench_rotate": "UNLOCALIZED: Wrench used", "create.subtitle.mixing": "UNLOCALIZED: Mixing Noises", "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", - "create.subtitle.blockzapper_confirm": "成功音", + "create.subtitle.worldshaper_place": "UNLOCALIZED: Worldshaper zaps", "create.subtitle.depot_slide": "UNLOCALIZED: Item slides", - "create.subtitle.blockzapper_place": "ブロックを発射して設置する", + "create.subtitle.deny": "UNLOCALIZED: Declining boop", "create.subtitle.blaze_munch": "ブレイズの咀嚼音", "create.subtitle.schematicannon_launch_block": "概略図砲が発射する", "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps", @@ -1170,11 +1148,11 @@ "create.subtitle.mechanical_press_activation": "メカニカルプレスが作動する", "create.subtitle.contraption_assemble": "UNLOCALIZED: Contraption moves", "create.subtitle.crafter_craft": "UNLOCALIZED: Crafter crafts", - "create.subtitle.blockzapper_deny": "失敗音", "create.subtitle.cranking": "UNLOCALIZED: Hand Crank turns", "create.subtitle.crafter_click": "UNLOCALIZED: Crafter clicks", "create.subtitle.wrench_remove": "UNLOCALIZED: Component breaks", "create.subtitle.depot_plop": "UNLOCALIZED: Item lands", + "create.subtitle.confirm": "UNLOCALIZED: Affirmative ding", "_": "->------------------------] Item Descriptions [------------------------<-", @@ -1280,15 +1258,6 @@ "item.create.wand_of_symmetry.tooltip.control3": "スニークしながら右クリックしたとき", "item.create.wand_of_symmetry.tooltip.action3": "_設定インターフェース_を開きます。", - "item.create.handheld_blockzapper.tooltip": "携帯型ブロックザッパー", - "item.create.handheld_blockzapper.tooltip.summary": "離れた場所にブロックを設置または交換する新しいガジェット。", - "item.create.handheld_blockzapper.tooltip.control1": "ブロックを左クリックしたとき", - "item.create.handheld_blockzapper.tooltip.action1": "ターゲットのブロックをこのツールに設定します。", - "item.create.handheld_blockzapper.tooltip.control2": "ブロックを右クリックしたとき", - "item.create.handheld_blockzapper.tooltip.action2": "ターゲットブロックを_配置_または_置換_します。", - "item.create.handheld_blockzapper.tooltip.control3": "スニークしながら右クリックしたとき。", - "item.create.handheld_blockzapper.tooltip.action3": "_設定インターフェース_を開きます。", - "item.create.handheld_worldshaper.tooltip": "携帯型ワールドシェーパー", "item.create.handheld_worldshaper.tooltip.summary": "特色ある_風景_や_地形_を作成する便利なツール。", "item.create.handheld_worldshaper.tooltip.control1": "ブロックを左クリックしたとき", @@ -1303,9 +1272,6 @@ "item.create.tree_fertilizer.tooltip.condition1": "苗木に使ったとき", "item.create.tree_fertilizer.tooltip.behaviour1": "_間隔の条件_に_関係なく_ツリーを成長させる", - "item.create.deforester.tooltip": "デフォレスター", - "item.create.deforester.tooltip.summary": "一瞬で木を切り倒すことができる_輝く斧_。", - "item.create.extendo_grip.tooltip": "マジックハンド", "item.create.extendo_grip.tooltip.summary": "ビヨヨーン!使用者の_射程_を大幅に_伸ばし_ます。", "item.create.extendo_grip.tooltip.condition1": "オフハンドに装備したとき", diff --git a/src/generated/resources/assets/create/lang/unfinished/ko_kr.json b/src/generated/resources/assets/create/lang/unfinished/ko_kr.json index 0191967b5..ee9042656 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ko_kr.json +++ b/src/generated/resources/assets/create/lang/unfinished/ko_kr.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 690", + "_": "Missing Localizations: 706", "_": "->------------------------] Game Elements [------------------------<-", @@ -456,7 +456,6 @@ "item.create.crushed_tin_ore": "UNLOCALIZED: Crushed Tin Ore", "item.create.crushed_uranium_ore": "UNLOCALIZED: Crushed Uranium Ore", "item.create.crushed_zinc_ore": "분쇄된 아연 광석", - "item.create.deforester": "산림파괴자", "item.create.dough": "반죽", "item.create.electron_tube": "전지 튜브", "item.create.empty_blaze_burner": "빈 블레이즈 버너", @@ -466,7 +465,6 @@ "item.create.furnace_minecart_contraption": "화로가 실린 광산 수레 장치", "item.create.goggles": "엔지니어의 고글", "item.create.golden_sheet": "금 판", - "item.create.handheld_blockzapper": "휴대용 블록발사기", "item.create.handheld_worldshaper": "휴대용 세계편집기", "item.create.honey_bucket": "꿀 양동이", "item.create.honeyed_apple": "UNLOCALIZED: Honeyed Apple", @@ -645,14 +643,8 @@ "advancement.create.refined_radiance.desc": "강력한 색채 물질, 정제된 빛을 생성하세요.", "advancement.create.chromatic_age": "양극 시대", "advancement.create.chromatic_age.desc": "빛과 어둠의 케이스를 제작하세요.", - "advancement.create.zapper": "나는 스타일있게 건축해", - "advancement.create.zapper.desc": "당신의 건축을 도와줄 멋진 레이저 건, 휴대용 블록발사기를 만드세요.", - "advancement.create.upgraded_zapper": "화려한 빛이 날 감싸네", - "advancement.create.upgraded_zapper.desc": "완전히 업그레이드된 휴대용 블록발사기를 만들고 써보세요.", "advancement.create.wand_of_symmetry": "빛나는 건축", "advancement.create.wand_of_symmetry.desc": "대칭의 지팡이를 만드세요.", - "advancement.create.deforester": "빛나는 벌목", - "advancement.create.deforester.desc": "산림파괴자를 만들고, 숲에게 작별인사를 하세요.", "advancement.create.extendo_grip": "띠요오옹!", "advancement.create.extendo_grip.desc": "외장형 연장 팔을 드세요.", "advancement.create.dual_extendo_grip": "궁극의 띠용!", @@ -695,7 +687,6 @@ "create.recipe.automatic_shaped": "유형 자동 조합", "create.recipe.block_cutting": "블 절단", "create.recipe.wood_cutting": "UNLOCALIZED: Wood Cutting", - "create.recipe.blockzapper_upgrade": "휴대용 블록발사기 업그레이드", "create.recipe.sandpaper_polishing": "사포질", "create.recipe.mystery_conversion": "?", "create.recipe.spout_filling": "채우기", @@ -752,20 +743,16 @@ "create.orientation.alongZ": "Z좌표를 따라", "create.orientation.alongX": "X좌표를 따라", - "create.gui.blockzapper.title": "휴대용 블록발사기", - "create.gui.blockzapper.replaceMode": "대체 모드", - "create.gui.blockzapper.searchDiagonal": "대각선을 따라", - "create.gui.blockzapper.searchFuzzy": "물질 경계 무시", - "create.gui.blockzapper.range": "범위", - "create.gui.blockzapper.needsUpgradedAmplifier": "업그레이드가 필요합니다", - "create.gui.blockzapper.patternSection": "패턴 설정", - "create.gui.blockzapper.pattern.solid": "원형", - "create.gui.blockzapper.pattern.checkered": "체스판", - "create.gui.blockzapper.pattern.inversecheckered": "반전된 체스판", - "create.gui.blockzapper.pattern.chance25": "랜덤으로 25% 채우기", - "create.gui.blockzapper.pattern.chance50": "랜덤으로 50% 채우기", - "create.gui.blockzapper.pattern.chance75": "랜덤으로 75% 채우기", "create.gui.terrainzapper.title": "휴대용 세계편집기", + "create.gui.terrainzapper.searchDiagonal": "UNLOCALIZED: Follow Diagonals", + "create.gui.terrainzapper.searchFuzzy": "UNLOCALIZED: Ignore Material Borders", + "create.gui.terrainzapper.patternSection": "UNLOCALIZED: Pattern", + "create.gui.terrainzapper.pattern.solid": "UNLOCALIZED: Solid", + "create.gui.terrainzapper.pattern.checkered": "UNLOCALIZED: Checkerboard", + "create.gui.terrainzapper.pattern.inversecheckered": "UNLOCALIZED: Inverted Checkerboard", + "create.gui.terrainzapper.pattern.chance25": "UNLOCALIZED: 25% Roll", + "create.gui.terrainzapper.pattern.chance50": "UNLOCALIZED: 50% Roll", + "create.gui.terrainzapper.pattern.chance75": "UNLOCALIZED: 75% Roll", "create.gui.terrainzapper.placement": "설치방식", "create.gui.terrainzapper.placement.merged": "선택한 블록에", "create.gui.terrainzapper.placement.attached": "선택한 블록 옆에", @@ -774,6 +761,8 @@ "create.gui.terrainzapper.brush.cuboid": "정육면체", "create.gui.terrainzapper.brush.sphere": "구", "create.gui.terrainzapper.brush.cylinder": "원통", + "create.gui.terrainzapper.brush.surface": "UNLOCALIZED: Surface", + "create.gui.terrainzapper.brush.cluster": "UNLOCALIZED: Cluster", "create.gui.terrainzapper.tool": "도구", "create.gui.terrainzapper.tool.fill": "채우기", "create.gui.terrainzapper.tool.place": "설치", @@ -783,19 +772,8 @@ "create.gui.terrainzapper.tool.flatten": "평탄화", "create.terrainzapper.shiftRightClickToSet": "쉬프트-우클릭으로 모양 설정하기", - - "create.blockzapper.usingBlock": "현재 블록: %1$s", - "create.blockzapper.componentUpgrades": "부품 업그레이드:", - "create.blockzapper.component.body": "몸통", - "create.blockzapper.component.amplifier": "증폭기", - "create.blockzapper.component.accelerator": "가속기", - "create.blockzapper.component.retriever": "회수기", - "create.blockzapper.component.scope": "스코프", - "create.blockzapper.componentTier.none": "없음", - "create.blockzapper.componentTier.brass": "황동", - "create.blockzapper.componentTier.chromatic": "혼돈의 결정체", - "create.blockzapper.leftClickToSet": "좌클릭으로 블록 설정하기", - "create.blockzapper.empty": "블록이 없습니다!", + "create.terrainzapper.usingBlock": "UNLOCALIZED: Using: %1$s", + "create.terrainzapper.leftClickToSet": "UNLOCALIZED: Left-Click a Block to set Material", "create.minecart_coupling.two_couplings_max": "광산 수레는 최대 2개의 커플링만 가질 수 있습니다", "create.minecart_coupling.unloaded": "열차 일부분이 로딩되지 않은 청크에 있는 것 같습니다", @@ -1159,9 +1137,9 @@ "create.subtitle.wrench_rotate": "UNLOCALIZED: Wrench used", "create.subtitle.mixing": "UNLOCALIZED: Mixing Noises", "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", - "create.subtitle.blockzapper_confirm": "확인 효과음", + "create.subtitle.worldshaper_place": "UNLOCALIZED: Worldshaper zaps", "create.subtitle.depot_slide": "UNLOCALIZED: Item slides", - "create.subtitle.blockzapper_place": "블록이 순간이동됨", + "create.subtitle.deny": "UNLOCALIZED: Declining boop", "create.subtitle.blaze_munch": "블레이즈가 행복하게 섭취함", "create.subtitle.schematicannon_launch_block": "청사진 대포가 발포함", "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps", @@ -1170,11 +1148,11 @@ "create.subtitle.mechanical_press_activation": "압착기가 가동됨", "create.subtitle.contraption_assemble": "UNLOCALIZED: Contraption moves", "create.subtitle.crafter_craft": "UNLOCALIZED: Crafter crafts", - "create.subtitle.blockzapper_deny": "취소 효과음", "create.subtitle.cranking": "UNLOCALIZED: Hand Crank turns", "create.subtitle.crafter_click": "UNLOCALIZED: Crafter clicks", "create.subtitle.wrench_remove": "UNLOCALIZED: Component breaks", "create.subtitle.depot_plop": "UNLOCALIZED: Item lands", + "create.subtitle.confirm": "UNLOCALIZED: Affirmative ding", "_": "->------------------------] Item Descriptions [------------------------<-", @@ -1280,15 +1258,6 @@ "item.create.wand_of_symmetry.tooltip.control3": "웅크린 상태에서 우클릭", "item.create.wand_of_symmetry.tooltip.action3": "_설정_ _창_을 엽니다.", - "item.create.handheld_blockzapper.tooltip": "BLOCKZAPPER", - "item.create.handheld_blockzapper.tooltip.summary": "멀리있는 블록을 교체, 설치하는 놀라운 도구입니다.", - "item.create.handheld_blockzapper.tooltip.control1": "블록을 보고 좌클릭", - "item.create.handheld_blockzapper.tooltip.action1": "이 도구로 설치할 블록을 설정합니다.", - "item.create.handheld_blockzapper.tooltip.control2": "블록을 보고 우클릭", - "item.create.handheld_blockzapper.tooltip.action2": "해당 위치에 설정된 블록으로 설치하거나 교체합니다.", - "item.create.handheld_blockzapper.tooltip.control3": "웅크린 상태에서 우클릭", - "item.create.handheld_blockzapper.tooltip.action3": "_설정_ _창_을 엽니다.", - "item.create.handheld_worldshaper.tooltip": "HANDHELD WORLDSHAPER", "item.create.handheld_worldshaper.tooltip.summary": "_지형경관_을 만들 때 좋은 간편한 도구입니다.", "item.create.handheld_worldshaper.tooltip.control1": "블록을 보고 좌클릭", @@ -1303,9 +1272,6 @@ "item.create.tree_fertilizer.tooltip.condition1": "묘목에 사용했을 때", "item.create.tree_fertilizer.tooltip.behaviour1": "묘목을 주위 공간과 _상관없이_ 성장시킵니다.", - "item.create.deforester.tooltip": "DEFORESTER", - "item.create.deforester.tooltip.summary": "수 초 만에 나무를 쓰러뜨리는 _놀라운_ _도끼_입니다.", - "item.create.extendo_grip.tooltip": "EXTENDO GRIP", "item.create.extendo_grip.tooltip.summary": "띠요오옹! 사용자의 _사거리_를 늘려줍니다.", "item.create.extendo_grip.tooltip.condition1": "다른 손에 있을 때", diff --git a/src/generated/resources/assets/create/lang/unfinished/nl_nl.json b/src/generated/resources/assets/create/lang/unfinished/nl_nl.json index 91eca1428..a1da4d3be 100644 --- a/src/generated/resources/assets/create/lang/unfinished/nl_nl.json +++ b/src/generated/resources/assets/create/lang/unfinished/nl_nl.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1567", + "_": "Missing Localizations: 1570", "_": "->------------------------] Game Elements [------------------------<-", @@ -456,7 +456,6 @@ "item.create.crushed_tin_ore": "UNLOCALIZED: Crushed Tin Ore", "item.create.crushed_uranium_ore": "UNLOCALIZED: Crushed Uranium Ore", "item.create.crushed_zinc_ore": "UNLOCALIZED: Crushed Zinc Ore", - "item.create.deforester": "Ontbosser", "item.create.dough": "Deeg", "item.create.electron_tube": "UNLOCALIZED: Electron Tube", "item.create.empty_blaze_burner": "UNLOCALIZED: Empty Blaze Burner", @@ -466,8 +465,7 @@ "item.create.furnace_minecart_contraption": "UNLOCALIZED: Furnace Minecart Contraption", "item.create.goggles": "Ingenieur's Bril", "item.create.golden_sheet": "UNLOCALIZED: Golden Sheet", - "item.create.handheld_blockzapper": "Blokzapper", - "item.create.handheld_worldshaper": "UNLOCALIZED: Handheld Worldshaper", + "item.create.handheld_worldshaper": "UNLOCALIZED: Creative Worldshaper", "item.create.honey_bucket": "UNLOCALIZED: Honey Bucket", "item.create.honeyed_apple": "UNLOCALIZED: Honeyed Apple", "item.create.integrated_circuit": "UNLOCALIZED: Integrated Circuit", @@ -645,14 +643,8 @@ "advancement.create.refined_radiance.desc": "UNLOCALIZED: Create Refined Radiance, a powerful chromatic substance.", "advancement.create.chromatic_age": "UNLOCALIZED: The Chromatic Age", "advancement.create.chromatic_age.desc": "UNLOCALIZED: Create casing blocks of the light and dark.", - "advancement.create.zapper": "UNLOCALIZED: Building With Style", - "advancement.create.zapper.desc": "UNLOCALIZED: Craft a Blockzapper. A radiant laser gun that helps you build.", - "advancement.create.upgraded_zapper": "UNLOCALIZED: Radiant Overdrive", - "advancement.create.upgraded_zapper.desc": "UNLOCALIZED: Create and activate a fully upgraded Blockzapper.", "advancement.create.wand_of_symmetry": "UNLOCALIZED: Radiant Mirrors", "advancement.create.wand_of_symmetry.desc": "UNLOCALIZED: Craft a Staff of Symmetry.", - "advancement.create.deforester": "UNLOCALIZED: Radiant Chopping", - "advancement.create.deforester.desc": "UNLOCALIZED: Craft a Deforester, and say goodbye to the local forest.", "advancement.create.extendo_grip": "UNLOCALIZED: Boioioing!", "advancement.create.extendo_grip.desc": "UNLOCALIZED: Get hold of an Extendo Grip.", "advancement.create.dual_extendo_grip": "UNLOCALIZED: Ultimate Boing-age", @@ -695,7 +687,6 @@ "create.recipe.automatic_shaped": "UNLOCALIZED: Automated Shaped Crafting", "create.recipe.block_cutting": "Blok Zagen", "create.recipe.wood_cutting": "UNLOCALIZED: Wood Cutting", - "create.recipe.blockzapper_upgrade": "Blokzapper", "create.recipe.sandpaper_polishing": "UNLOCALIZED: Sandpaper Polishing", "create.recipe.mystery_conversion": "UNLOCALIZED: Mysterious Conversion", "create.recipe.spout_filling": "UNLOCALIZED: Filling by Spout", @@ -752,20 +743,16 @@ "create.orientation.alongZ": "Langs Z-as", "create.orientation.alongX": "Langs X-as", - "create.gui.blockzapper.title": "Blokzapper", - "create.gui.blockzapper.replaceMode": "Vervang Modus", - "create.gui.blockzapper.searchDiagonal": "Volg Diagonalen", - "create.gui.blockzapper.searchFuzzy": "Negeer materiaal granzen", - "create.gui.blockzapper.range": "Verspreid bereik", - "create.gui.blockzapper.needsUpgradedAmplifier": "Benodigd een opgewaardeerde versterker", - "create.gui.blockzapper.patternSection": "Patronen", - "create.gui.blockzapper.pattern.solid": "Vast", - "create.gui.blockzapper.pattern.checkered": "Schaakbord", - "create.gui.blockzapper.pattern.inversecheckered": "Omgekeerd Schaakbord", - "create.gui.blockzapper.pattern.chance25": "25% Gedraaid", - "create.gui.blockzapper.pattern.chance50": "50% Gedraaid", - "create.gui.blockzapper.pattern.chance75": "75% Gedraaid", - "create.gui.terrainzapper.title": "UNLOCALIZED: Handheld Worldshaper", + "create.gui.terrainzapper.title": "UNLOCALIZED: Handheld Blockzapper", + "create.gui.terrainzapper.searchDiagonal": "UNLOCALIZED: Follow Diagonals", + "create.gui.terrainzapper.searchFuzzy": "UNLOCALIZED: Ignore Material Borders", + "create.gui.terrainzapper.patternSection": "UNLOCALIZED: Pattern", + "create.gui.terrainzapper.pattern.solid": "UNLOCALIZED: Solid", + "create.gui.terrainzapper.pattern.checkered": "UNLOCALIZED: Checkerboard", + "create.gui.terrainzapper.pattern.inversecheckered": "UNLOCALIZED: Inverted Checkerboard", + "create.gui.terrainzapper.pattern.chance25": "UNLOCALIZED: 25% Roll", + "create.gui.terrainzapper.pattern.chance50": "UNLOCALIZED: 50% Roll", + "create.gui.terrainzapper.pattern.chance75": "UNLOCALIZED: 75% Roll", "create.gui.terrainzapper.placement": "UNLOCALIZED: Placement", "create.gui.terrainzapper.placement.merged": "UNLOCALIZED: Merged", "create.gui.terrainzapper.placement.attached": "UNLOCALIZED: Attached", @@ -774,6 +761,8 @@ "create.gui.terrainzapper.brush.cuboid": "UNLOCALIZED: Cuboid", "create.gui.terrainzapper.brush.sphere": "UNLOCALIZED: Sphere", "create.gui.terrainzapper.brush.cylinder": "UNLOCALIZED: Cylinder", + "create.gui.terrainzapper.brush.surface": "UNLOCALIZED: Surface", + "create.gui.terrainzapper.brush.cluster": "UNLOCALIZED: Cluster", "create.gui.terrainzapper.tool": "UNLOCALIZED: Tool", "create.gui.terrainzapper.tool.fill": "UNLOCALIZED: Fill", "create.gui.terrainzapper.tool.place": "UNLOCALIZED: Place", @@ -783,19 +772,8 @@ "create.gui.terrainzapper.tool.flatten": "UNLOCALIZED: Flatten", "create.terrainzapper.shiftRightClickToSet": "UNLOCALIZED: Shift-Right-Click to Select a Shape", - - "create.blockzapper.usingBlock": "Gebruikt: %1$s", - "create.blockzapper.componentUpgrades": "Component Upgrades:", - "create.blockzapper.component.body": "Lichaam", - "create.blockzapper.component.amplifier": "Versterker", - "create.blockzapper.component.accelerator": "Accelerator", - "create.blockzapper.component.retriever": "Ontvanger", - "create.blockzapper.component.scope": "Omvang", - "create.blockzapper.componentTier.none": "Geen", - "create.blockzapper.componentTier.brass": "UNLOCALIZED: Brass", - "create.blockzapper.componentTier.chromatic": "UNLOCALIZED: Chromatic", - "create.blockzapper.leftClickToSet": "Klik met links op een Blok om een Materiaal te kiezen", - "create.blockzapper.empty": "De Blokken zijn op!", + "create.terrainzapper.usingBlock": "UNLOCALIZED: Using: %1$s", + "create.terrainzapper.leftClickToSet": "UNLOCALIZED: Left-Click a Block to set Material", "create.minecart_coupling.two_couplings_max": "UNLOCALIZED: Minecarts cannot have more than two couplings each", "create.minecart_coupling.unloaded": "UNLOCALIZED: Parts of your train seem to be in unloaded chunks", @@ -1159,9 +1137,9 @@ "create.subtitle.wrench_rotate": "UNLOCALIZED: Wrench used", "create.subtitle.mixing": "UNLOCALIZED: Mixing Noises", "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", - "create.subtitle.blockzapper_confirm": "UNLOCALIZED: Affirmative ding", + "create.subtitle.worldshaper_place": "UNLOCALIZED: Worldshaper zaps", "create.subtitle.depot_slide": "UNLOCALIZED: Item slides", - "create.subtitle.blockzapper_place": "UNLOCALIZED: Blockzapper zaps", + "create.subtitle.deny": "UNLOCALIZED: Declining boop", "create.subtitle.blaze_munch": "UNLOCALIZED: Blaze Burner munches", "create.subtitle.schematicannon_launch_block": "UNLOCALIZED: Schematicannon fires", "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps", @@ -1170,11 +1148,11 @@ "create.subtitle.mechanical_press_activation": "UNLOCALIZED: Mechanical Press clangs", "create.subtitle.contraption_assemble": "UNLOCALIZED: Contraption moves", "create.subtitle.crafter_craft": "UNLOCALIZED: Crafter crafts", - "create.subtitle.blockzapper_deny": "UNLOCALIZED: Declining boop", "create.subtitle.cranking": "UNLOCALIZED: Hand Crank turns", "create.subtitle.crafter_click": "UNLOCALIZED: Crafter clicks", "create.subtitle.wrench_remove": "UNLOCALIZED: Component breaks", "create.subtitle.depot_plop": "UNLOCALIZED: Item lands", + "create.subtitle.confirm": "UNLOCALIZED: Affirmative ding", "_": "->------------------------] Item Descriptions [------------------------<-", @@ -1280,15 +1258,6 @@ "item.create.wand_of_symmetry.tooltip.control3": "R-Klik terwijl je Sluipt", "item.create.wand_of_symmetry.tooltip.action3": "Opent de _Configuratie_ _Interface_", - "item.create.handheld_blockzapper.tooltip": "BLOKZAPPER", - "item.create.handheld_blockzapper.tooltip.summary": "Ongebruikelijke gadget voor het plaatsen en verwissel van blokken over een afstand", - "item.create.handheld_blockzapper.tooltip.control1": "L-Klik op een Blok", - "item.create.handheld_blockzapper.tooltip.action1": "Zet het doelwit blok om naar het geselecteerde blok.", - "item.create.handheld_blockzapper.tooltip.control2": "R-Klik op een Blok", - "item.create.handheld_blockzapper.tooltip.action2": "_Plaatst_ of _Vervangt_ het doelwit blok.", - "item.create.handheld_blockzapper.tooltip.control3": "R-Click while Sneaking", - "item.create.handheld_blockzapper.tooltip.action3": "Opent de _Configuratie_ _Interface_", - "item.create.handheld_worldshaper.tooltip": "UNLOCALIZED: HANDHELD WORLDSHAPER", "item.create.handheld_worldshaper.tooltip.summary": "UNLOCALIZED: Handy tool for creating _landscapes_ and _terrain features_.", "item.create.handheld_worldshaper.tooltip.control1": "UNLOCALIZED: L-Click at Block", @@ -1303,9 +1272,6 @@ "item.create.tree_fertilizer.tooltip.condition1": "Wanneer gebruikt op Kiemplanten", "item.create.tree_fertilizer.tooltip.behaviour1": "Groeit bomen onafhankelijk van beschikbare ruimte", - "item.create.deforester.tooltip": "UNLOCALIZED: DEFORESTER", - "item.create.deforester.tooltip.summary": "UNLOCALIZED: A _radiant axe_ able to chop down trees in a split second.", - "item.create.extendo_grip.tooltip": "UNLOCALIZED: EXTENDO GRIP", "item.create.extendo_grip.tooltip.summary": "UNLOCALIZED: Boioioing! Greatly _increases reach distance_ of the wielder.", "item.create.extendo_grip.tooltip.condition1": "UNLOCALIZED: When in Off-Hand", diff --git a/src/generated/resources/assets/create/lang/unfinished/pt_br.json b/src/generated/resources/assets/create/lang/unfinished/pt_br.json index 36899f42b..338fb9e10 100644 --- a/src/generated/resources/assets/create/lang/unfinished/pt_br.json +++ b/src/generated/resources/assets/create/lang/unfinished/pt_br.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1621", + "_": "Missing Localizations: 1622", "_": "->------------------------] Game Elements [------------------------<-", @@ -456,7 +456,6 @@ "item.create.crushed_tin_ore": "UNLOCALIZED: Crushed Tin Ore", "item.create.crushed_uranium_ore": "UNLOCALIZED: Crushed Uranium Ore", "item.create.crushed_zinc_ore": "UNLOCALIZED: Crushed Zinc Ore", - "item.create.deforester": "UNLOCALIZED: Deforester", "item.create.dough": "Massa", "item.create.electron_tube": "UNLOCALIZED: Electron Tube", "item.create.empty_blaze_burner": "UNLOCALIZED: Empty Blaze Burner", @@ -466,8 +465,7 @@ "item.create.furnace_minecart_contraption": "UNLOCALIZED: Furnace Minecart Contraption", "item.create.goggles": "UNLOCALIZED: Engineer's Goggles", "item.create.golden_sheet": "UNLOCALIZED: Golden Sheet", - "item.create.handheld_blockzapper": "Blockzapper Portátil", - "item.create.handheld_worldshaper": "UNLOCALIZED: Handheld Worldshaper", + "item.create.handheld_worldshaper": "UNLOCALIZED: Creative Worldshaper", "item.create.honey_bucket": "UNLOCALIZED: Honey Bucket", "item.create.honeyed_apple": "UNLOCALIZED: Honeyed Apple", "item.create.integrated_circuit": "UNLOCALIZED: Integrated Circuit", @@ -645,14 +643,8 @@ "advancement.create.refined_radiance.desc": "UNLOCALIZED: Create Refined Radiance, a powerful chromatic substance.", "advancement.create.chromatic_age": "UNLOCALIZED: The Chromatic Age", "advancement.create.chromatic_age.desc": "UNLOCALIZED: Create casing blocks of the light and dark.", - "advancement.create.zapper": "UNLOCALIZED: Building With Style", - "advancement.create.zapper.desc": "UNLOCALIZED: Craft a Blockzapper. A radiant laser gun that helps you build.", - "advancement.create.upgraded_zapper": "UNLOCALIZED: Radiant Overdrive", - "advancement.create.upgraded_zapper.desc": "UNLOCALIZED: Create and activate a fully upgraded Blockzapper.", "advancement.create.wand_of_symmetry": "UNLOCALIZED: Radiant Mirrors", "advancement.create.wand_of_symmetry.desc": "UNLOCALIZED: Craft a Staff of Symmetry.", - "advancement.create.deforester": "UNLOCALIZED: Radiant Chopping", - "advancement.create.deforester.desc": "UNLOCALIZED: Craft a Deforester, and say goodbye to the local forest.", "advancement.create.extendo_grip": "UNLOCALIZED: Boioioing!", "advancement.create.extendo_grip.desc": "UNLOCALIZED: Get hold of an Extendo Grip.", "advancement.create.dual_extendo_grip": "UNLOCALIZED: Ultimate Boing-age", @@ -695,7 +687,6 @@ "create.recipe.automatic_shaped": "UNLOCALIZED: Automated Shaped Crafting", "create.recipe.block_cutting": "UNLOCALIZED: Block Cutting", "create.recipe.wood_cutting": "UNLOCALIZED: Wood Cutting", - "create.recipe.blockzapper_upgrade": "Blockzapper Portátil", "create.recipe.sandpaper_polishing": "UNLOCALIZED: Sandpaper Polishing", "create.recipe.mystery_conversion": "UNLOCALIZED: Mysterious Conversion", "create.recipe.spout_filling": "UNLOCALIZED: Filling by Spout", @@ -752,20 +743,16 @@ "create.orientation.alongZ": "Através de Z", "create.orientation.alongX": "Através de X", - "create.gui.blockzapper.title": "Blockzapper Portátil", - "create.gui.blockzapper.replaceMode": "Modo de Substituição", - "create.gui.blockzapper.searchDiagonal": "Seguir as Diagonais", - "create.gui.blockzapper.searchFuzzy": "Ignorar Material nas Bordas", - "create.gui.blockzapper.range": "Raio de Expansão", - "create.gui.blockzapper.needsUpgradedAmplifier": "UNLOCALIZED: Requires Upgraded Amplifier", - "create.gui.blockzapper.patternSection": "Padrões", - "create.gui.blockzapper.pattern.solid": "Sólido", - "create.gui.blockzapper.pattern.checkered": "Xadrez", - "create.gui.blockzapper.pattern.inversecheckered": "Xadrez invertido", - "create.gui.blockzapper.pattern.chance25": "25% de chance", - "create.gui.blockzapper.pattern.chance50": "50% de chance", - "create.gui.blockzapper.pattern.chance75": "75% de chance", - "create.gui.terrainzapper.title": "UNLOCALIZED: Handheld Worldshaper", + "create.gui.terrainzapper.title": "UNLOCALIZED: Handheld Blockzapper", + "create.gui.terrainzapper.searchDiagonal": "UNLOCALIZED: Follow Diagonals", + "create.gui.terrainzapper.searchFuzzy": "UNLOCALIZED: Ignore Material Borders", + "create.gui.terrainzapper.patternSection": "UNLOCALIZED: Pattern", + "create.gui.terrainzapper.pattern.solid": "UNLOCALIZED: Solid", + "create.gui.terrainzapper.pattern.checkered": "UNLOCALIZED: Checkerboard", + "create.gui.terrainzapper.pattern.inversecheckered": "UNLOCALIZED: Inverted Checkerboard", + "create.gui.terrainzapper.pattern.chance25": "UNLOCALIZED: 25% Roll", + "create.gui.terrainzapper.pattern.chance50": "UNLOCALIZED: 50% Roll", + "create.gui.terrainzapper.pattern.chance75": "UNLOCALIZED: 75% Roll", "create.gui.terrainzapper.placement": "UNLOCALIZED: Placement", "create.gui.terrainzapper.placement.merged": "UNLOCALIZED: Merged", "create.gui.terrainzapper.placement.attached": "UNLOCALIZED: Attached", @@ -774,6 +761,8 @@ "create.gui.terrainzapper.brush.cuboid": "UNLOCALIZED: Cuboid", "create.gui.terrainzapper.brush.sphere": "UNLOCALIZED: Sphere", "create.gui.terrainzapper.brush.cylinder": "UNLOCALIZED: Cylinder", + "create.gui.terrainzapper.brush.surface": "UNLOCALIZED: Surface", + "create.gui.terrainzapper.brush.cluster": "UNLOCALIZED: Cluster", "create.gui.terrainzapper.tool": "UNLOCALIZED: Tool", "create.gui.terrainzapper.tool.fill": "UNLOCALIZED: Fill", "create.gui.terrainzapper.tool.place": "UNLOCALIZED: Place", @@ -783,19 +772,8 @@ "create.gui.terrainzapper.tool.flatten": "UNLOCALIZED: Flatten", "create.terrainzapper.shiftRightClickToSet": "UNLOCALIZED: Shift-Right-Click to Select a Shape", - - "create.blockzapper.usingBlock": "Usando: %1$s", - "create.blockzapper.componentUpgrades": "Melhorias do Componente:", - "create.blockzapper.component.body": "Corpo", - "create.blockzapper.component.amplifier": "Amplificador", - "create.blockzapper.component.accelerator": "Acelerador", - "create.blockzapper.component.retriever": "Retornador", - "create.blockzapper.component.scope": "Mira", - "create.blockzapper.componentTier.none": "Nada", - "create.blockzapper.componentTier.brass": "UNLOCALIZED: Brass", - "create.blockzapper.componentTier.chromatic": "UNLOCALIZED: Chromatic", - "create.blockzapper.leftClickToSet": "Botão-Esquerdo em um Bloco para selecionar Material", - "create.blockzapper.empty": "Sem Blocos!", + "create.terrainzapper.usingBlock": "UNLOCALIZED: Using: %1$s", + "create.terrainzapper.leftClickToSet": "UNLOCALIZED: Left-Click a Block to set Material", "create.minecart_coupling.two_couplings_max": "UNLOCALIZED: Minecarts cannot have more than two couplings each", "create.minecart_coupling.unloaded": "UNLOCALIZED: Parts of your train seem to be in unloaded chunks", @@ -1159,9 +1137,9 @@ "create.subtitle.wrench_rotate": "UNLOCALIZED: Wrench used", "create.subtitle.mixing": "UNLOCALIZED: Mixing Noises", "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", - "create.subtitle.blockzapper_confirm": "UNLOCALIZED: Affirmative ding", + "create.subtitle.worldshaper_place": "UNLOCALIZED: Worldshaper zaps", "create.subtitle.depot_slide": "UNLOCALIZED: Item slides", - "create.subtitle.blockzapper_place": "UNLOCALIZED: Blockzapper zaps", + "create.subtitle.deny": "UNLOCALIZED: Declining boop", "create.subtitle.blaze_munch": "UNLOCALIZED: Blaze Burner munches", "create.subtitle.schematicannon_launch_block": "UNLOCALIZED: Schematicannon fires", "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps", @@ -1170,11 +1148,11 @@ "create.subtitle.mechanical_press_activation": "UNLOCALIZED: Mechanical Press clangs", "create.subtitle.contraption_assemble": "UNLOCALIZED: Contraption moves", "create.subtitle.crafter_craft": "UNLOCALIZED: Crafter crafts", - "create.subtitle.blockzapper_deny": "UNLOCALIZED: Declining boop", "create.subtitle.cranking": "UNLOCALIZED: Hand Crank turns", "create.subtitle.crafter_click": "UNLOCALIZED: Crafter clicks", "create.subtitle.wrench_remove": "UNLOCALIZED: Component breaks", "create.subtitle.depot_plop": "UNLOCALIZED: Item lands", + "create.subtitle.confirm": "UNLOCALIZED: Affirmative ding", "_": "->------------------------] Item Descriptions [------------------------<-", @@ -1280,15 +1258,6 @@ "item.create.wand_of_symmetry.tooltip.control3": "B-Direito enquanto Abaixado", "item.create.wand_of_symmetry.tooltip.action3": "Abre _Interface_ de _Configuração_", - "item.create.handheld_blockzapper.tooltip": "BLOCKZAPPER", - "item.create.handheld_blockzapper.tooltip.summary": "Gadget imaginário para colocar ou substituir blocos a distância.", - "item.create.handheld_blockzapper.tooltip.control1": "B-Esquerdo no Bloco", - "item.create.handheld_blockzapper.tooltip.action1": "Define os blocos colocados pela ferramenta no bloco de destino.", - "item.create.handheld_blockzapper.tooltip.control2": "B-Direito em Bloco", - "item.create.handheld_blockzapper.tooltip.action2": "_Coloca_ ou _Substitui_ o bloco alvo.", - "item.create.handheld_blockzapper.tooltip.control3": "B-Direito equando Abaixado", - "item.create.handheld_blockzapper.tooltip.action3": "Abre _Interface_ de _Configuração_", - "item.create.handheld_worldshaper.tooltip": "UNLOCALIZED: HANDHELD WORLDSHAPER", "item.create.handheld_worldshaper.tooltip.summary": "UNLOCALIZED: Handy tool for creating _landscapes_ and _terrain features_.", "item.create.handheld_worldshaper.tooltip.control1": "UNLOCALIZED: L-Click at Block", @@ -1303,9 +1272,6 @@ "item.create.tree_fertilizer.tooltip.condition1": "Quando usada em Mudas", "item.create.tree_fertilizer.tooltip.behaviour1": "Cresce Arvores independentemente das suas Regras de espaço", - "item.create.deforester.tooltip": "UNLOCALIZED: DEFORESTER", - "item.create.deforester.tooltip.summary": "UNLOCALIZED: A _radiant axe_ able to chop down trees in a split second.", - "item.create.extendo_grip.tooltip": "UNLOCALIZED: EXTENDO GRIP", "item.create.extendo_grip.tooltip.summary": "UNLOCALIZED: Boioioing! Greatly _increases reach distance_ of the wielder.", "item.create.extendo_grip.tooltip.condition1": "UNLOCALIZED: When in Off-Hand", diff --git a/src/generated/resources/assets/create/lang/unfinished/ru_ru.json b/src/generated/resources/assets/create/lang/unfinished/ru_ru.json index 89c218e6d..3bf313cbe 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ru_ru.json +++ b/src/generated/resources/assets/create/lang/unfinished/ru_ru.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 534", + "_": "Missing Localizations: 550", "_": "->------------------------] Game Elements [------------------------<-", @@ -456,7 +456,6 @@ "item.create.crushed_tin_ore": "Дроблёная оловянная руда", "item.create.crushed_uranium_ore": "Дроблёная урановая руда", "item.create.crushed_zinc_ore": "Дроблёная цинковая руда", - "item.create.deforester": "Уничтожитель леса", "item.create.dough": "Тесто", "item.create.electron_tube": "Электронная лампа", "item.create.empty_blaze_burner": "Пустая горелека Всполоха", @@ -466,7 +465,6 @@ "item.create.furnace_minecart_contraption": "Печно-вагонеточная штуковина", "item.create.goggles": "Инженерные очки", "item.create.golden_sheet": "Золотой лист", - "item.create.handheld_blockzapper": "Ручная блоковая пушка", "item.create.handheld_worldshaper": "Ручной редактор мира", "item.create.honey_bucket": "Ведро мёда", "item.create.honeyed_apple": "Яблоко в меду", @@ -645,14 +643,8 @@ "advancement.create.refined_radiance.desc": "Создайте изысканное сияние, мощное хроматическое вещество.", "advancement.create.chromatic_age": "Хроматический век", "advancement.create.chromatic_age.desc": "Создайте блоки корпуса из света и тьмы.", - "advancement.create.zapper": "Строительство со стилем", - "advancement.create.zapper.desc": "Создайте ручную блоковую пушку, которая поможет вам строить.", - "advancement.create.upgraded_zapper": "Сияющий овердрайв", - "advancement.create.upgraded_zapper.desc": "Создайте и активируйте полностью модернизированную ручную блоковую пушку.", "advancement.create.wand_of_symmetry": "Сияющие зеркала", "advancement.create.wand_of_symmetry.desc": "Создайте жезл симметрии.", - "advancement.create.deforester": "Лучистая рубка", - "advancement.create.deforester.desc": "Создайте уничтожитель леса и попрощайтесь с местным лесом.", "advancement.create.extendo_grip": "Кипение!", "advancement.create.extendo_grip.desc": "Возьмите в руки удлинённую руку", "advancement.create.dual_extendo_grip": "Окончательное выкипание", @@ -695,7 +687,6 @@ "create.recipe.automatic_shaped": "Автоматическая форменная сборка", "create.recipe.block_cutting": "Резка блока", "create.recipe.wood_cutting": "UNLOCALIZED: Wood Cutting", - "create.recipe.blockzapper_upgrade": "Ручная блоковая пушка", "create.recipe.sandpaper_polishing": "Полировка наждачной бумагой", "create.recipe.mystery_conversion": "Хроматический метаморфоз", "create.recipe.spout_filling": "Заполнение дозатором", @@ -752,20 +743,16 @@ "create.orientation.alongZ": "Вдоль Z", "create.orientation.alongX": "Вдоль X", - "create.gui.blockzapper.title": "Ручная блоковая пушка", - "create.gui.blockzapper.replaceMode": "Режим замены", - "create.gui.blockzapper.searchDiagonal": "Следовать по диагонали", - "create.gui.blockzapper.searchFuzzy": "Игнорировать границы материала", - "create.gui.blockzapper.range": "Диапазон распространения", - "create.gui.blockzapper.needsUpgradedAmplifier": "Требуется модернизированный усилитель", - "create.gui.blockzapper.patternSection": "Шаблон", - "create.gui.blockzapper.pattern.solid": "Всё", - "create.gui.blockzapper.pattern.checkered": "Шахматная доска", - "create.gui.blockzapper.pattern.inversecheckered": "Перевернутая шахматная доска", - "create.gui.blockzapper.pattern.chance25": "25% крен", - "create.gui.blockzapper.pattern.chance50": "50% крен", - "create.gui.blockzapper.pattern.chance75": "75% крен", "create.gui.terrainzapper.title": "Ручной редактор мира", + "create.gui.terrainzapper.searchDiagonal": "UNLOCALIZED: Follow Diagonals", + "create.gui.terrainzapper.searchFuzzy": "UNLOCALIZED: Ignore Material Borders", + "create.gui.terrainzapper.patternSection": "UNLOCALIZED: Pattern", + "create.gui.terrainzapper.pattern.solid": "UNLOCALIZED: Solid", + "create.gui.terrainzapper.pattern.checkered": "UNLOCALIZED: Checkerboard", + "create.gui.terrainzapper.pattern.inversecheckered": "UNLOCALIZED: Inverted Checkerboard", + "create.gui.terrainzapper.pattern.chance25": "UNLOCALIZED: 25% Roll", + "create.gui.terrainzapper.pattern.chance50": "UNLOCALIZED: 50% Roll", + "create.gui.terrainzapper.pattern.chance75": "UNLOCALIZED: 75% Roll", "create.gui.terrainzapper.placement": "Размещение", "create.gui.terrainzapper.placement.merged": "Слитый", "create.gui.terrainzapper.placement.attached": "Прикреплённый", @@ -774,6 +761,8 @@ "create.gui.terrainzapper.brush.cuboid": "Куб", "create.gui.terrainzapper.brush.sphere": "Сфера", "create.gui.terrainzapper.brush.cylinder": "Цилиндр", + "create.gui.terrainzapper.brush.surface": "UNLOCALIZED: Surface", + "create.gui.terrainzapper.brush.cluster": "UNLOCALIZED: Cluster", "create.gui.terrainzapper.tool": "Инструмент", "create.gui.terrainzapper.tool.fill": "Заполнить", "create.gui.terrainzapper.tool.place": "Поставить", @@ -783,19 +772,8 @@ "create.gui.terrainzapper.tool.flatten": "Выравнивание", "create.terrainzapper.shiftRightClickToSet": "ПКМ крадучись, чтобы выбрать форму", - - "create.blockzapper.usingBlock": "С помощью: %1$s", - "create.blockzapper.componentUpgrades": "Обновления компонентов:", - "create.blockzapper.component.body": "Корпус", - "create.blockzapper.component.amplifier": "Усилитель", - "create.blockzapper.component.accelerator": "Ускоритель", - "create.blockzapper.component.retriever": "Поисковик", - "create.blockzapper.component.scope": "Объем", - "create.blockzapper.componentTier.none": "Нет", - "create.blockzapper.componentTier.brass": "Латунный", - "create.blockzapper.componentTier.chromatic": "Хроматический", - "create.blockzapper.leftClickToSet": "Щелкните ЛКМ по блоку, чтобы выбрать материал", - "create.blockzapper.empty": "Вне блоков!", + "create.terrainzapper.usingBlock": "UNLOCALIZED: Using: %1$s", + "create.terrainzapper.leftClickToSet": "UNLOCALIZED: Left-Click a Block to set Material", "create.minecart_coupling.two_couplings_max": "Вагонетки могут иметь только две связи", "create.minecart_coupling.unloaded": "Кажется, часть вашего поезда в незагруженных чанках", @@ -1159,9 +1137,9 @@ "create.subtitle.wrench_rotate": "UNLOCALIZED: Wrench used", "create.subtitle.mixing": "UNLOCALIZED: Mixing Noises", "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", - "create.subtitle.blockzapper_confirm": "Утвердительный динь", + "create.subtitle.worldshaper_place": "UNLOCALIZED: Worldshaper zaps", "create.subtitle.depot_slide": "UNLOCALIZED: Item slides", - "create.subtitle.blockzapper_place": "Блок запрыгивает на место", + "create.subtitle.deny": "UNLOCALIZED: Declining boop", "create.subtitle.blaze_munch": "Всполох радостно жуёт", "create.subtitle.schematicannon_launch_block": "Выстрелы схематичной пушки", "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps", @@ -1170,11 +1148,11 @@ "create.subtitle.mechanical_press_activation": "Механический пресс активирован", "create.subtitle.contraption_assemble": "UNLOCALIZED: Contraption moves", "create.subtitle.crafter_craft": "UNLOCALIZED: Crafter crafts", - "create.subtitle.blockzapper_deny": "Тихий буп", "create.subtitle.cranking": "UNLOCALIZED: Hand Crank turns", "create.subtitle.crafter_click": "UNLOCALIZED: Crafter clicks", "create.subtitle.wrench_remove": "UNLOCALIZED: Component breaks", "create.subtitle.depot_plop": "UNLOCALIZED: Item lands", + "create.subtitle.confirm": "UNLOCALIZED: Affirmative ding", "_": "->------------------------] Item Descriptions [------------------------<-", @@ -1280,15 +1258,6 @@ "item.create.wand_of_symmetry.tooltip.control3": "ПКМ крадучись", "item.create.wand_of_symmetry.tooltip.action3": "Открывает _интерфейс_ _конфигурации_", - "item.create.handheld_blockzapper.tooltip": "BLOCKZAPPER", - "item.create.handheld_blockzapper.tooltip.summary": "Новейшее устройство для размещения или замены блоков на расстоянии.", - "item.create.handheld_blockzapper.tooltip.control1": "ЛКМ на блок", - "item.create.handheld_blockzapper.tooltip.action1": "Устанавливает выбранный блок как материал.", - "item.create.handheld_blockzapper.tooltip.control2": "ПКМ на блок", - "item.create.handheld_blockzapper.tooltip.action2": "_Размещает_ или _Замещает_ блок.", - "item.create.handheld_blockzapper.tooltip.control3": "ПКМ крадучись", - "item.create.handheld_blockzapper.tooltip.action3": "Открывает _интерфейс_ _конфигурации_", - "item.create.handheld_worldshaper.tooltip": "HANDHELD WORLDSHAPER", "item.create.handheld_worldshaper.tooltip.summary": "Удобный инструмент для создания _ландшафтов_ и _рельефа_ _местности_.", "item.create.handheld_worldshaper.tooltip.control1": "ЛКМ на блок", @@ -1303,9 +1272,6 @@ "item.create.tree_fertilizer.tooltip.condition1": "При использовании на саженце", "item.create.tree_fertilizer.tooltip.behaviour1": "Выращивает деревья,_независимо_ от _условий_ _их_ _расположения_", - "item.create.deforester.tooltip": "DEFORESTER", - "item.create.deforester.tooltip.summary": "_Уничтожитель_ _леса_, способен рубить деревья за доли секунды.", - "item.create.extendo_grip.tooltip": "EXTENDO GRIP", "item.create.extendo_grip.tooltip.summary": "Бойоиоинг! Значительно _увеличивает_ _досягаемость_ владельца.", "item.create.extendo_grip.tooltip.condition1": "Находясь в другой руке", diff --git a/src/generated/resources/assets/create/lang/unfinished/zh_cn.json b/src/generated/resources/assets/create/lang/unfinished/zh_cn.json index e557f4c8b..73926ad0b 100644 --- a/src/generated/resources/assets/create/lang/unfinished/zh_cn.json +++ b/src/generated/resources/assets/create/lang/unfinished/zh_cn.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 634", + "_": "Missing Localizations: 650", "_": "->------------------------] Game Elements [------------------------<-", @@ -456,7 +456,6 @@ "item.create.crushed_tin_ore": "粉碎锡矿石", "item.create.crushed_uranium_ore": "粉碎铀矿石", "item.create.crushed_zinc_ore": "粉碎锌矿石", - "item.create.deforester": "树林毁灭者", "item.create.dough": "面团", "item.create.electron_tube": "电子管", "item.create.empty_blaze_burner": "空的烈焰人燃烧室", @@ -466,7 +465,6 @@ "item.create.furnace_minecart_contraption": "装配过的动力矿车", "item.create.goggles": "工程师护目镜", "item.create.golden_sheet": "金板", - "item.create.handheld_blockzapper": "手持式方块放置器", "item.create.handheld_worldshaper": "手持式环境塑形器", "item.create.honey_bucket": "蜂蜜桶", "item.create.honeyed_apple": "UNLOCALIZED: Honeyed Apple", @@ -645,14 +643,8 @@ "advancement.create.refined_radiance.desc": "制作一个光辉石", "advancement.create.chromatic_age": "异彩纪元", "advancement.create.chromatic_age.desc": "创造出光与影的机壳。", - "advancement.create.zapper": "讲究的建筑师", - "advancement.create.zapper.desc": "制作一个非常方便的手持方块放置器", - "advancement.create.upgraded_zapper": "来自异世界的超频", - "advancement.create.upgraded_zapper.desc": "制作一个完全升级的手持方块放置器", "advancement.create.wand_of_symmetry": "简单的镜面几何学", "advancement.create.wand_of_symmetry.desc": "制作一个对称之杖", - "advancement.create.deforester": "超时空砍伐", - "advancement.create.deforester.desc": "制作一个森林毁灭者,然后跟你后院的树林说再见吧", "advancement.create.extendo_grip": "biu biu biu!", "advancement.create.extendo_grip.desc": "获得一个伸缩机械手", "advancement.create.dual_extendo_grip": "biu——biu——biu——", @@ -695,7 +687,6 @@ "create.recipe.automatic_shaped": "自动合成", "create.recipe.block_cutting": "方块切割", "create.recipe.wood_cutting": "UNLOCALIZED: Wood Cutting", - "create.recipe.blockzapper_upgrade": "手持式方块放置器", "create.recipe.sandpaper_polishing": "砂纸打磨", "create.recipe.mystery_conversion": "神秘转化", "create.recipe.spout_filling": "注液", @@ -752,20 +743,16 @@ "create.orientation.alongZ": "以z轴对齐", "create.orientation.alongX": "以x轴对齐", - "create.gui.blockzapper.title": "手持式方块放置机", - "create.gui.blockzapper.replaceMode": "替换模式", - "create.gui.blockzapper.searchDiagonal": "对角线延伸", - "create.gui.blockzapper.searchFuzzy": "忽视种类分界", - "create.gui.blockzapper.range": "延伸范围", - "create.gui.blockzapper.needsUpgradedAmplifier": "需要升级范围扩大器", - "create.gui.blockzapper.patternSection": "模式", - "create.gui.blockzapper.pattern.solid": "实心", - "create.gui.blockzapper.pattern.checkered": "棋盘", - "create.gui.blockzapper.pattern.inversecheckered": "反转棋盘", - "create.gui.blockzapper.pattern.chance25": "25% ", - "create.gui.blockzapper.pattern.chance50": "50% ", - "create.gui.blockzapper.pattern.chance75": "75% ", "create.gui.terrainzapper.title": "手持式环境塑形器", + "create.gui.terrainzapper.searchDiagonal": "UNLOCALIZED: Follow Diagonals", + "create.gui.terrainzapper.searchFuzzy": "UNLOCALIZED: Ignore Material Borders", + "create.gui.terrainzapper.patternSection": "UNLOCALIZED: Pattern", + "create.gui.terrainzapper.pattern.solid": "UNLOCALIZED: Solid", + "create.gui.terrainzapper.pattern.checkered": "UNLOCALIZED: Checkerboard", + "create.gui.terrainzapper.pattern.inversecheckered": "UNLOCALIZED: Inverted Checkerboard", + "create.gui.terrainzapper.pattern.chance25": "UNLOCALIZED: 25% Roll", + "create.gui.terrainzapper.pattern.chance50": "UNLOCALIZED: 50% Roll", + "create.gui.terrainzapper.pattern.chance75": "UNLOCALIZED: 75% Roll", "create.gui.terrainzapper.placement": "放置模式", "create.gui.terrainzapper.placement.merged": "结合", "create.gui.terrainzapper.placement.attached": "依附", @@ -774,6 +761,8 @@ "create.gui.terrainzapper.brush.cuboid": "矩形体", "create.gui.terrainzapper.brush.sphere": "球体", "create.gui.terrainzapper.brush.cylinder": "圆柱体", + "create.gui.terrainzapper.brush.surface": "UNLOCALIZED: Surface", + "create.gui.terrainzapper.brush.cluster": "UNLOCALIZED: Cluster", "create.gui.terrainzapper.tool": "填充类型", "create.gui.terrainzapper.tool.fill": "填充", "create.gui.terrainzapper.tool.place": "复写", @@ -783,19 +772,8 @@ "create.gui.terrainzapper.tool.flatten": "平整", "create.terrainzapper.shiftRightClickToSet": "Shift+鼠标右键以设置塑形类型", - - "create.blockzapper.usingBlock": "使用:%1$s", - "create.blockzapper.componentUpgrades": "组件升级:", - "create.blockzapper.component.body": "放置器机体", - "create.blockzapper.component.amplifier": "范围扩大器", - "create.blockzapper.component.accelerator": "射击加速器", - "create.blockzapper.component.retriever": "物品回捡器", - "create.blockzapper.component.scope": "距离观察镜", - "create.blockzapper.componentTier.none": "无", - "create.blockzapper.componentTier.brass": "黄铜", - "create.blockzapper.componentTier.chromatic": "异彩化合物", - "create.blockzapper.leftClickToSet": "左击方块将其设定为放置方块", - "create.blockzapper.empty": "方块不足!", + "create.terrainzapper.usingBlock": "UNLOCALIZED: Using: %1$s", + "create.terrainzapper.leftClickToSet": "UNLOCALIZED: Left-Click a Block to set Material", "create.minecart_coupling.two_couplings_max": "矿车无法被连接两个以上的矿车连轴器", "create.minecart_coupling.unloaded": "有一部分火车存在于未加载区块中", @@ -1159,9 +1137,9 @@ "create.subtitle.wrench_rotate": "UNLOCALIZED: Wrench used", "create.subtitle.mixing": "UNLOCALIZED: Mixing Noises", "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", - "create.subtitle.blockzapper_confirm": "选择方块", + "create.subtitle.worldshaper_place": "UNLOCALIZED: Worldshaper zaps", "create.subtitle.depot_slide": "UNLOCALIZED: Item slides", - "create.subtitle.blockzapper_place": "放置方块", + "create.subtitle.deny": "UNLOCALIZED: Declining boop", "create.subtitle.blaze_munch": "烈焰人:开心地咀嚼着", "create.subtitle.schematicannon_launch_block": "蓝图加农炮:发射", "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps", @@ -1170,11 +1148,11 @@ "create.subtitle.mechanical_press_activation": "辊压机:工作中", "create.subtitle.contraption_assemble": "UNLOCALIZED: Contraption moves", "create.subtitle.crafter_craft": "UNLOCALIZED: Crafter crafts", - "create.subtitle.blockzapper_deny": "放置失败", "create.subtitle.cranking": "UNLOCALIZED: Hand Crank turns", "create.subtitle.crafter_click": "UNLOCALIZED: Crafter clicks", "create.subtitle.wrench_remove": "UNLOCALIZED: Component breaks", "create.subtitle.depot_plop": "UNLOCALIZED: Item lands", + "create.subtitle.confirm": "UNLOCALIZED: Affirmative ding", "_": "->------------------------] Item Descriptions [------------------------<-", @@ -1280,15 +1258,6 @@ "item.create.wand_of_symmetry.tooltip.control3": "当潜行右键时", "item.create.wand_of_symmetry.tooltip.action3": "打开_配置界面_。", - "item.create.handheld_blockzapper.tooltip": "手持式方块放置器", - "item.create.handheld_blockzapper.tooltip.summary": "新颖的小工具,可以远距离放置或更换方块。", - "item.create.handheld_blockzapper.tooltip.control1": "当左击方块时", - "item.create.handheld_blockzapper.tooltip.action1": "将工具放置的方块设置为该方块。", - "item.create.handheld_blockzapper.tooltip.control2": "当右击方块时", - "item.create.handheld_blockzapper.tooltip.action2": "_放置_或_替换_目标方块。", - "item.create.handheld_blockzapper.tooltip.control3": "当潜行右击时", - "item.create.handheld_blockzapper.tooltip.action3": "打开_配置界面_。", - "item.create.handheld_worldshaper.tooltip": "手持式环境塑形器", "item.create.handheld_worldshaper.tooltip.summary": "_创造_大陆和山脉的手持工具", "item.create.handheld_worldshaper.tooltip.control1": "当左击方块时", @@ -1303,9 +1272,6 @@ "item.create.tree_fertilizer.tooltip.condition1": "在树苗上使用时", "item.create.tree_fertilizer.tooltip.behaviour1": "使得该树_无视_它的_生长空间条件_,立刻长大。", - "item.create.deforester.tooltip": "树林毁灭者", - "item.create.deforester.tooltip.summary": "一把_光辉四溢的斧子_,能够瞬间砍倒一棵树", - "item.create.extendo_grip.tooltip": "伸缩机械手", "item.create.extendo_grip.tooltip.summary": "biubiubiu! 大幅度_增加了_使用者的_触碰距离_。", "item.create.extendo_grip.tooltip.condition1": "放置于副手栏时", diff --git a/src/generated/resources/assets/create/lang/unfinished/zh_tw.json b/src/generated/resources/assets/create/lang/unfinished/zh_tw.json index a6cca6523..2beea3cc9 100644 --- a/src/generated/resources/assets/create/lang/unfinished/zh_tw.json +++ b/src/generated/resources/assets/create/lang/unfinished/zh_tw.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 639", + "_": "Missing Localizations: 655", "_": "->------------------------] Game Elements [------------------------<-", @@ -456,7 +456,6 @@ "item.create.crushed_tin_ore": "碎狀錫礦石", "item.create.crushed_uranium_ore": "碎狀鈾礦石", "item.create.crushed_zinc_ore": "碎狀鋅礦石", - "item.create.deforester": "連根拔樹斧", "item.create.dough": "麵團", "item.create.electron_tube": "真空管", "item.create.empty_blaze_burner": "空的烈焰使者動力爐", @@ -466,7 +465,6 @@ "item.create.furnace_minecart_contraption": "裝配過的機械礦車", "item.create.goggles": "MR護目鏡", "item.create.golden_sheet": "金板", - "item.create.handheld_blockzapper": "方塊放置器", "item.create.handheld_worldshaper": "地形雕塑器", "item.create.honey_bucket": "蜂蜜桶", "item.create.honeyed_apple": "UNLOCALIZED: Honeyed Apple", @@ -645,14 +643,8 @@ "advancement.create.refined_radiance.desc": "製作光輝石", "advancement.create.chromatic_age": "繽紛時代", "advancement.create.chromatic_age.desc": "創造出光與影的機殼。", - "advancement.create.zapper": "專業的建築師", - "advancement.create.zapper.desc": "製作一個非常方便的方塊放置器", - "advancement.create.upgraded_zapper": "來自異世界的超頻", - "advancement.create.upgraded_zapper.desc": "製作一個完全升級的方塊放置器", "advancement.create.wand_of_symmetry": "簡單的鏡面幾何學", "advancement.create.wand_of_symmetry.desc": "製作一個對稱杖", - "advancement.create.deforester": "超時空砍伐", - "advancement.create.deforester.desc": "製作一個連根拔樹斧,然後跟你後院的樹林道別吧", "advancement.create.extendo_grip": "piu piu piu!", "advancement.create.extendo_grip.desc": "拿到一個伸縮機械手", "advancement.create.dual_extendo_grip": "piu——piu——piu——", @@ -695,7 +687,6 @@ "create.recipe.automatic_shaped": "自動合成", "create.recipe.block_cutting": "方塊切割", "create.recipe.wood_cutting": "UNLOCALIZED: Wood Cutting", - "create.recipe.blockzapper_upgrade": "方塊放置器", "create.recipe.sandpaper_polishing": "砂紙打磨", "create.recipe.mystery_conversion": "神秘轉化", "create.recipe.spout_filling": "注液", @@ -752,20 +743,16 @@ "create.orientation.alongZ": "以z軸對齊", "create.orientation.alongX": "以x軸對齊", - "create.gui.blockzapper.title": "方塊放置機", - "create.gui.blockzapper.replaceMode": "替換模式", - "create.gui.blockzapper.searchDiagonal": "對角線延伸", - "create.gui.blockzapper.searchFuzzy": "忽視種類分界", - "create.gui.blockzapper.range": "延伸範圍", - "create.gui.blockzapper.needsUpgradedAmplifier": "需要升級範圍擴大器", - "create.gui.blockzapper.patternSection": "模式", - "create.gui.blockzapper.pattern.solid": "實心", - "create.gui.blockzapper.pattern.checkered": "棋盤", - "create.gui.blockzapper.pattern.inversecheckered": "反轉棋盤", - "create.gui.blockzapper.pattern.chance25": "25% ", - "create.gui.blockzapper.pattern.chance50": "50% ", - "create.gui.blockzapper.pattern.chance75": "75% ", "create.gui.terrainzapper.title": "地形雕塑器", + "create.gui.terrainzapper.searchDiagonal": "UNLOCALIZED: Follow Diagonals", + "create.gui.terrainzapper.searchFuzzy": "UNLOCALIZED: Ignore Material Borders", + "create.gui.terrainzapper.patternSection": "UNLOCALIZED: Pattern", + "create.gui.terrainzapper.pattern.solid": "UNLOCALIZED: Solid", + "create.gui.terrainzapper.pattern.checkered": "UNLOCALIZED: Checkerboard", + "create.gui.terrainzapper.pattern.inversecheckered": "UNLOCALIZED: Inverted Checkerboard", + "create.gui.terrainzapper.pattern.chance25": "UNLOCALIZED: 25% Roll", + "create.gui.terrainzapper.pattern.chance50": "UNLOCALIZED: 50% Roll", + "create.gui.terrainzapper.pattern.chance75": "UNLOCALIZED: 75% Roll", "create.gui.terrainzapper.placement": "放置模式", "create.gui.terrainzapper.placement.merged": "結合", "create.gui.terrainzapper.placement.attached": "依附", @@ -774,6 +761,8 @@ "create.gui.terrainzapper.brush.cuboid": "矩形體", "create.gui.terrainzapper.brush.sphere": "球體", "create.gui.terrainzapper.brush.cylinder": "圓柱體", + "create.gui.terrainzapper.brush.surface": "UNLOCALIZED: Surface", + "create.gui.terrainzapper.brush.cluster": "UNLOCALIZED: Cluster", "create.gui.terrainzapper.tool": "填充類型", "create.gui.terrainzapper.tool.fill": "填充", "create.gui.terrainzapper.tool.place": "覆寫", @@ -783,19 +772,8 @@ "create.gui.terrainzapper.tool.flatten": "平整", "create.terrainzapper.shiftRightClickToSet": "Shift+滑鼠右鍵 以設定雕塑類型", - - "create.blockzapper.usingBlock": "使用:%1$s", - "create.blockzapper.componentUpgrades": "零件升級:", - "create.blockzapper.component.body": "放置器機體", - "create.blockzapper.component.amplifier": "範圍擴大器", - "create.blockzapper.component.accelerator": "射擊加速器", - "create.blockzapper.component.retriever": "物品撿回器", - "create.blockzapper.component.scope": "距離觀察鏡", - "create.blockzapper.componentTier.none": "無", - "create.blockzapper.componentTier.brass": "黃銅", - "create.blockzapper.componentTier.chromatic": "異彩化合物", - "create.blockzapper.leftClickToSet": "左鍵點擊方塊以設定方塊種類", - "create.blockzapper.empty": "方塊不足!", + "create.terrainzapper.usingBlock": "UNLOCALIZED: Using: %1$s", + "create.terrainzapper.leftClickToSet": "UNLOCALIZED: Left-Click a Block to set Material", "create.minecart_coupling.two_couplings_max": "礦車無法被連接兩個以上的礦車連結器", "create.minecart_coupling.unloaded": "有一部份礦車存在於未讀取區塊中", @@ -1159,9 +1137,9 @@ "create.subtitle.wrench_rotate": "UNLOCALIZED: Wrench used", "create.subtitle.mixing": "UNLOCALIZED: Mixing Noises", "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", - "create.subtitle.blockzapper_confirm": "選擇方塊", + "create.subtitle.worldshaper_place": "UNLOCALIZED: Worldshaper zaps", "create.subtitle.depot_slide": "UNLOCALIZED: Item slides", - "create.subtitle.blockzapper_place": "放置方塊", + "create.subtitle.deny": "UNLOCALIZED: Declining boop", "create.subtitle.blaze_munch": "烈焰使者開心地吃著", "create.subtitle.schematicannon_launch_block": "藍圖大炮發射", "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps", @@ -1170,11 +1148,11 @@ "create.subtitle.mechanical_press_activation": "液壓機工作", "create.subtitle.contraption_assemble": "UNLOCALIZED: Contraption moves", "create.subtitle.crafter_craft": "UNLOCALIZED: Crafter crafts", - "create.subtitle.blockzapper_deny": "放置失敗", "create.subtitle.cranking": "UNLOCALIZED: Hand Crank turns", "create.subtitle.crafter_click": "UNLOCALIZED: Crafter clicks", "create.subtitle.wrench_remove": "UNLOCALIZED: Component breaks", "create.subtitle.depot_plop": "UNLOCALIZED: Item lands", + "create.subtitle.confirm": "UNLOCALIZED: Affirmative ding", "_": "->------------------------] Item Descriptions [------------------------<-", @@ -1280,15 +1258,6 @@ "item.create.wand_of_symmetry.tooltip.control3": "當潛行右鍵時", "item.create.wand_of_symmetry.tooltip.action3": "打開_gui界面_", - "item.create.handheld_blockzapper.tooltip": "方塊放置器", - "item.create.handheld_blockzapper.tooltip.summary": "新穎的小工具,可以遠距離放置或更換方塊。", - "item.create.handheld_blockzapper.tooltip.control1": "當左鍵方塊時", - "item.create.handheld_blockzapper.tooltip.action1": "設定放置此方塊。", - "item.create.handheld_blockzapper.tooltip.control2": "當右鍵方塊時", - "item.create.handheld_blockzapper.tooltip.action2": "_放置_或_替換_目標方塊。", - "item.create.handheld_blockzapper.tooltip.control3": "當潛行右鍵時", - "item.create.handheld_blockzapper.tooltip.action3": "打開_gui界面_", - "item.create.handheld_worldshaper.tooltip": "環境塑形器", "item.create.handheld_worldshaper.tooltip.summary": "_大面積_更改地形的手持工具", "item.create.handheld_worldshaper.tooltip.control1": "當左鍵方塊時", @@ -1303,9 +1272,6 @@ "item.create.tree_fertilizer.tooltip.condition1": "在樹苗上使用時", "item.create.tree_fertilizer.tooltip.behaviour1": "無論_生長時間_多少,直接長大", - "item.create.deforester.tooltip": "連根拔樹斧", - "item.create.deforester.tooltip.summary": "_連根拔樹斧_,從最根砍樹時,能夠瞬間連根拔起一棵樹", - "item.create.extendo_grip.tooltip": "伸縮機械手", "item.create.extendo_grip.tooltip.summary": "biubiubiu! 大幅度_增加了_使用者的_觸碰距離_。", "item.create.extendo_grip.tooltip.condition1": "放置於副手欄時", diff --git a/src/generated/resources/assets/create/models/item/deforester.json b/src/generated/resources/assets/create/models/item/deforester.json deleted file mode 100644 index 00fa0cc0c..000000000 --- a/src/generated/resources/assets/create/models/item/deforester.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "create:item/deforester/item" -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/handheld_blockzapper.json b/src/generated/resources/assets/create/models/item/handheld_blockzapper.json deleted file mode 100644 index a48ce16e4..000000000 --- a/src/generated/resources/assets/create/models/item/handheld_blockzapper.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "create:item/handheld_blockzapper/item" -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/sounds.json b/src/generated/resources/assets/create/sounds.json index aea8a9701..24f47e279 100644 --- a/src/generated/resources/assets/create/sounds.json +++ b/src/generated/resources/assets/create/sounds.json @@ -8,38 +8,20 @@ ], "subtitle": "create.subtitle.blaze_munch" }, - "blockzapper_confirm": { + "cogs": { + "sounds": [ + "create:cogs" + ], + "subtitle": "create.subtitle.cogs" + }, + "confirm": { "sounds": [ { "name": "minecraft:block.note_block.bell", "type": "event" } ], - "subtitle": "create.subtitle.blockzapper_confirm" - }, - "blockzapper_deny": { - "sounds": [ - { - "name": "minecraft:block.note_block.bass", - "type": "event" - } - ], - "subtitle": "create.subtitle.blockzapper_deny" - }, - "blockzapper_place": { - "sounds": [ - { - "name": "minecraft:block.note_block.basedrum", - "type": "event" - } - ], - "subtitle": "create.subtitle.blockzapper_place" - }, - "cogs": { - "sounds": [ - "create:cogs" - ], - "subtitle": "create.subtitle.cogs" + "subtitle": "create.subtitle.confirm" }, "contraption_assemble": { "sounds": [ @@ -110,6 +92,15 @@ } ] }, + "deny": { + "sounds": [ + { + "name": "minecraft:block.note_block.bass", + "type": "event" + } + ], + "subtitle": "create.subtitle.deny" + }, "depot_plop": { "sounds": [ { @@ -232,6 +223,15 @@ ], "subtitle": "create.subtitle.slime_added" }, + "worldshaper_place": { + "sounds": [ + { + "name": "minecraft:block.note_block.basedrum", + "type": "event" + } + ], + "subtitle": "create.subtitle.worldshaper_place" + }, "wrench_remove": { "sounds": [ { diff --git a/src/generated/resources/data/create/advancements/deforester.json b/src/generated/resources/data/create/advancements/deforester.json deleted file mode 100644 index c0db60900..000000000 --- a/src/generated/resources/data/create/advancements/deforester.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "parent": "create:refined_radiance", - "display": { - "icon": { - "item": "create:deforester", - "nbt": "{Damage:0}" - }, - "title": { - "translate": "advancement.create.deforester" - }, - "description": { - "translate": "advancement.create.deforester.desc" - }, - "frame": "task", - "show_toast": true, - "announce_to_chat": false, - "hidden": false - }, - "criteria": { - "0": { - "trigger": "minecraft:inventory_changed", - "conditions": { - "items": [ - { - "item": "create:deforester" - } - ] - } - } - }, - "requirements": [ - [ - "0" - ] - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/curiosities/deforester.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/curiosities/deforester.json deleted file mode 100644 index 31d8dbe0f..000000000 --- a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/curiosities/deforester.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "rewards": { - "recipes": [ - "create:crafting/curiosities/deforester" - ] - }, - "criteria": { - "has_item": { - "trigger": "minecraft:inventory_changed", - "conditions": { - "items": [ - { - "item": "create:refined_radiance" - } - ] - } - }, - "has_the_recipe": { - "trigger": "minecraft:recipe_unlocked", - "conditions": { - "recipe": "create:crafting/curiosities/deforester" - } - } - }, - "requirements": [ - [ - "has_item", - "has_the_recipe" - ] - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/curiosities/handheld_blockzapper.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/curiosities/handheld_blockzapper.json deleted file mode 100644 index 737429783..000000000 --- a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/curiosities/handheld_blockzapper.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "rewards": { - "recipes": [ - "create:crafting/curiosities/handheld_blockzapper" - ] - }, - "criteria": { - "has_item": { - "trigger": "minecraft:inventory_changed", - "conditions": { - "items": [ - { - "item": "create:refined_radiance" - } - ] - } - }, - "has_the_recipe": { - "trigger": "minecraft:recipe_unlocked", - "conditions": { - "recipe": "create:crafting/curiosities/handheld_blockzapper" - } - } - }, - "requirements": [ - [ - "has_item", - "has_the_recipe" - ] - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/upgraded_zapper.json b/src/generated/resources/data/create/advancements/upgraded_zapper.json deleted file mode 100644 index 870723d1a..000000000 --- a/src/generated/resources/data/create/advancements/upgraded_zapper.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "parent": "create:zapper", - "display": { - "icon": { - "item": "create:handheld_blockzapper", - "nbt": "{Retriever:\"Chromatic\",Scope:\"Chromatic\",Amplifier:\"Chromatic\",Body:\"Chromatic\",Accelerator:\"Chromatic\"}" - }, - "title": { - "translate": "advancement.create.upgraded_zapper" - }, - "description": { - "translate": "advancement.create.upgraded_zapper.desc" - }, - "frame": "challenge", - "show_toast": true, - "announce_to_chat": true, - "hidden": false - }, - "criteria": { - "0": { - "trigger": "create:upgraded_zapper", - "conditions": {} - } - }, - "requirements": [ - [ - "0" - ] - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/zapper.json b/src/generated/resources/data/create/advancements/zapper.json deleted file mode 100644 index 07313062d..000000000 --- a/src/generated/resources/data/create/advancements/zapper.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "parent": "create:refined_radiance", - "display": { - "icon": { - "item": "create:handheld_blockzapper" - }, - "title": { - "translate": "advancement.create.zapper" - }, - "description": { - "translate": "advancement.create.zapper.desc" - }, - "frame": "task", - "show_toast": true, - "announce_to_chat": false, - "hidden": false - }, - "criteria": { - "0": { - "trigger": "minecraft:inventory_changed", - "conditions": { - "items": [ - { - "item": "create:handheld_blockzapper" - } - ] - } - } - }, - "requirements": [ - [ - "0" - ] - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/curiosities/deforester.json b/src/generated/resources/data/create/recipes/crafting/curiosities/deforester.json deleted file mode 100644 index de44f0a44..000000000 --- a/src/generated/resources/data/create/recipes/crafting/curiosities/deforester.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "pattern": [ - "EG", - "EO", - " O" - ], - "key": { - "E": { - "item": "create:refined_radiance" - }, - "G": { - "item": "create:cogwheel" - }, - "O": { - "tag": "forge:obsidian" - } - }, - "result": { - "item": "create:deforester" - } -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/curiosities/handheld_blockzapper.json b/src/generated/resources/data/create/recipes/crafting/curiosities/handheld_blockzapper.json deleted file mode 100644 index 02b7a8cd0..000000000 --- a/src/generated/resources/data/create/recipes/crafting/curiosities/handheld_blockzapper.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "pattern": [ - " E", - " O ", - "OA " - ], - "key": { - "E": { - "item": "create:refined_radiance" - }, - "A": { - "item": "create:andesite_alloy" - }, - "O": { - "tag": "forge:obsidian" - } - }, - "result": { - "item": "create:handheld_blockzapper" - } -} \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index fb06bd42f..bf7e9dc14 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -179,6 +179,7 @@ import net.minecraft.client.renderer.RenderType; import net.minecraft.data.ShapedRecipeBuilder; import net.minecraft.item.DyeColor; import net.minecraft.item.Item; +import net.minecraft.item.Rarity; import net.minecraft.state.properties.PistonType; import net.minecraft.tags.BlockTags; import net.minecraft.tags.ItemTags; @@ -336,6 +337,7 @@ public class AllBlocks { .blockstate(new CreativeMotorGenerator()::generate) .transform(StressConfigDefaults.setCapacity(16384.0)) .item() + .properties(p -> p.rarity(Rarity.EPIC)) .transform(customItemModel()) .register(); @@ -644,6 +646,7 @@ public class AllBlocks { .onRegister(CreateRegistrate.blockModel(() -> FluidTankModel::creative)) .addLayer(() -> RenderType::getCutoutMipped) .item(FluidTankItem::new) + .properties(p -> p.rarity(Rarity.EPIC)) .model((c, p) -> p.withExistingParent(c.getName(), p.modLoc("block/fluid_tank/block_single_window")) .texture("5", p.modLoc("block/creative_fluid_tank_window_single")) .texture("1", p.modLoc("block/creative_fluid_tank")) diff --git a/src/main/java/com/simibubi/create/AllItems.java b/src/main/java/com/simibubi/create/AllItems.java index 6554462e0..9d68df344 100644 --- a/src/main/java/com/simibubi/create/AllItems.java +++ b/src/main/java/com/simibubi/create/AllItems.java @@ -31,14 +31,10 @@ import com.simibubi.create.content.curiosities.ShadowSteelItem; import com.simibubi.create.content.curiosities.TreeFertilizerItem; import com.simibubi.create.content.curiosities.symmetry.SymmetryWandItem; import com.simibubi.create.content.curiosities.symmetry.client.SymmetryWandModel; -import com.simibubi.create.content.curiosities.tools.DeforesterItem; -import com.simibubi.create.content.curiosities.tools.DeforesterModel; import com.simibubi.create.content.curiosities.tools.ExtendoGripItem; import com.simibubi.create.content.curiosities.tools.ExtendoGripModel; import com.simibubi.create.content.curiosities.tools.SandPaperItem; import com.simibubi.create.content.curiosities.tools.SandPaperItemRenderer.SandPaperModel; -import com.simibubi.create.content.curiosities.zapper.blockzapper.BlockzapperItem; -import com.simibubi.create.content.curiosities.zapper.blockzapper.BlockzapperModel; import com.simibubi.create.content.curiosities.zapper.terrainzapper.WorldshaperItem; import com.simibubi.create.content.curiosities.zapper.terrainzapper.WorldshaperModel; import com.simibubi.create.content.logistics.item.filter.FilterItem; @@ -208,6 +204,25 @@ public class AllItems { .model(AssetLookup.itemModelWithPartials()) .register(); + public static final ItemEntry EXTENDO_GRIP = REGISTRATE.item("extendo_grip", ExtendoGripItem::new) + .transform(CreateRegistrate.customRenderedItem(() -> ExtendoGripModel::new)) + .model(AssetLookup.itemModelWithPartials()) + .register(); + + public static final ItemEntry WAND_OF_SYMMETRY = + REGISTRATE.item("wand_of_symmetry", SymmetryWandItem::new) + .transform(CreateRegistrate.customRenderedItem(() -> SymmetryWandModel::new)) + .model(AssetLookup.itemModelWithPartials()) + .register(); + + public static final ItemEntry WORLDSHAPER = + REGISTRATE.item("handheld_worldshaper", WorldshaperItem::new) + .properties(p -> p.rarity(Rarity.EPIC)) + .transform(CreateRegistrate.customRenderedItem(() -> WorldshaperModel::new)) + .lang("Creative Worldshaper") + .model(AssetLookup.itemModelWithPartials()) + .register(); + public static final ItemEntry MINECART_CONTRAPTION = REGISTRATE.item("minecart_contraption", MinecartContraptionItem::rideable) .register(); @@ -245,34 +260,6 @@ public class AllItems { REGISTRATE.item("tree_fertilizer", TreeFertilizerItem::new) .register(); - public static final ItemEntry BLOCKZAPPER = - REGISTRATE.item("handheld_blockzapper", BlockzapperItem::new) - .transform(CreateRegistrate.customRenderedItem(() -> BlockzapperModel::new)) - .model(AssetLookup.itemModelWithPartials()) - .register(); - - public static final ItemEntry WORLDSHAPER = - REGISTRATE.item("handheld_worldshaper", WorldshaperItem::new) - .transform(CreateRegistrate.customRenderedItem(() -> WorldshaperModel::new)) - .model(AssetLookup.itemModelWithPartials()) - .register(); - - public static final ItemEntry DEFORESTER = REGISTRATE.item("deforester", DeforesterItem::new) - .transform(CreateRegistrate.customRenderedItem(() -> DeforesterModel::new)) - .model(AssetLookup.itemModelWithPartials()) - .register(); - - public static final ItemEntry WAND_OF_SYMMETRY = - REGISTRATE.item("wand_of_symmetry", SymmetryWandItem::new) - .transform(CreateRegistrate.customRenderedItem(() -> SymmetryWandModel::new)) - .model(AssetLookup.itemModelWithPartials()) - .register(); - - public static final ItemEntry EXTENDO_GRIP = REGISTRATE.item("extendo_grip", ExtendoGripItem::new) - .transform(CreateRegistrate.customRenderedItem(() -> ExtendoGripModel::new)) - .model(AssetLookup.itemModelWithPartials()) - .register(); - // Schematics static { diff --git a/src/main/java/com/simibubi/create/AllRecipeTypes.java b/src/main/java/com/simibubi/create/AllRecipeTypes.java index 908e39e87..910241dd6 100644 --- a/src/main/java/com/simibubi/create/AllRecipeTypes.java +++ b/src/main/java/com/simibubi/create/AllRecipeTypes.java @@ -19,7 +19,6 @@ import com.simibubi.create.content.contraptions.processing.ProcessingRecipe; import com.simibubi.create.content.contraptions.processing.ProcessingRecipeBuilder.ProcessingRecipeFactory; import com.simibubi.create.content.contraptions.processing.ProcessingRecipeSerializer; import com.simibubi.create.content.curiosities.tools.SandPaperPolishingRecipe; -import com.simibubi.create.content.curiosities.zapper.blockzapper.BlockzapperUpgradeRecipe; import com.simibubi.create.foundation.utility.Lang; import net.minecraft.inventory.IInventory; @@ -34,9 +33,7 @@ import net.minecraftforge.event.RegistryEvent; public enum AllRecipeTypes { - BLOCKZAPPER_UPGRADE(BlockzapperUpgradeRecipe.Serializer::new, IRecipeType.CRAFTING), MECHANICAL_CRAFTING(MechanicalCraftingRecipe.Serializer::new), - CONVERSION(processingSerializer(ConversionRecipe::new)), CRUSHING(processingSerializer(CrushingRecipe::new)), CUTTING(processingSerializer(CuttingRecipe::new)), diff --git a/src/main/java/com/simibubi/create/AllSoundEvents.java b/src/main/java/com/simibubi/create/AllSoundEvents.java index 51f00ef71..32976ac3f 100644 --- a/src/main/java/com/simibubi/create/AllSoundEvents.java +++ b/src/main/java/com/simibubi/create/AllSoundEvents.java @@ -91,7 +91,7 @@ public class AllSoundEvents { .category(SoundCategory.BLOCKS) .build(), - BLOCKZAPPER_PLACE = create("blockzapper_place").subtitle("Blockzapper zaps") + WORLDSHAPER_PLACE = create("worldshaper_place").subtitle("Worldshaper zaps") .playExisting(SoundEvents.BLOCK_NOTE_BLOCK_BASEDRUM) .category(SoundCategory.PLAYERS) .build(), @@ -101,12 +101,12 @@ public class AllSoundEvents { .category(SoundCategory.PLAYERS) .build(), - BLOCKZAPPER_CONFIRM = create("blockzapper_confirm").subtitle("Affirmative ding") + CONFIRM = create("confirm").subtitle("Affirmative ding") .playExisting(SoundEvents.BLOCK_NOTE_BLOCK_BELL, 0.5f, 0.8f) .category(SoundCategory.PLAYERS) .build(), - BLOCKZAPPER_DENY = create("blockzapper_deny").subtitle("Declining boop") + DENY = create("deny").subtitle("Declining boop") .playExisting(SoundEvents.BLOCK_NOTE_BLOCK_BASS, 1f, 0.5f) .category(SoundCategory.PLAYERS) .build(), @@ -136,13 +136,13 @@ public class AllSoundEvents { .playExisting(SoundEvents.BLOCK_NETHERITE_BLOCK_HIT, .25f, .75f) .category(SoundCategory.BLOCKS) .build(), - + CRAFTER_CLICK = create("crafter_click").subtitle("Crafter clicks") .playExisting(SoundEvents.BLOCK_NETHERITE_BLOCK_HIT, .25f, 1) .playExisting(SoundEvents.BLOCK_WOODEN_TRAPDOOR_OPEN, .125f, 1) .category(SoundCategory.BLOCKS) .build(), - + CRAFTER_CRAFT = create("crafter_craft").subtitle("Crafter crafts") .playExisting(SoundEvents.ENTITY_ITEM_BREAK, .125f, .75f) .category(SoundCategory.BLOCKS) diff --git a/src/main/java/com/simibubi/create/compat/jei/CreateJEI.java b/src/main/java/com/simibubi/create/compat/jei/CreateJEI.java index adbcf7883..6e8b8d227 100644 --- a/src/main/java/com/simibubi/create/compat/jei/CreateJEI.java +++ b/src/main/java/com/simibubi/create/compat/jei/CreateJEI.java @@ -17,7 +17,6 @@ import com.simibubi.create.AllRecipeTypes; import com.simibubi.create.Create; import com.simibubi.create.compat.jei.category.BlockCuttingCategory; import com.simibubi.create.compat.jei.category.BlockCuttingCategory.CondensedBlockCuttingRecipe; -import com.simibubi.create.compat.jei.category.BlockzapperUpgradeCategory; import com.simibubi.create.compat.jei.category.CreateRecipeCategory; import com.simibubi.create.compat.jei.category.CrushingCategory; import com.simibubi.create.compat.jei.category.FanBlastingCategory; @@ -110,11 +109,6 @@ public class CreateJEI implements IModPlugin { .catalystStack(ProcessingViaFanCategory.getFan("fan_blasting")) .build(), - blockzapper = register("blockzapper_upgrade", BlockzapperUpgradeCategory::new) - .recipes(AllRecipeTypes.BLOCKZAPPER_UPGRADE.serializer.getRegistryName()) - .catalyst(AllItems.BLOCKZAPPER::get) - .build(), - mixing = register("mixing", MixingCategory::standard).recipes(AllRecipeTypes.MIXING::getType) .catalyst(AllBlocks.MECHANICAL_MIXER::get) .catalyst(AllBlocks.BASIN::get) @@ -208,11 +202,6 @@ public class CreateJEI implements IModPlugin { return new CategoryBuilder(name, supplier); } - @Override - public void registerItemSubtypes(ISubtypeRegistration registration) { - registration.useNbtForSubtypes(AllItems.BLOCKZAPPER.get()); - } - @Override public void registerCategories(IRecipeCategoryRegistration registration) { ALL.forEach(registration::addRecipeCategories); diff --git a/src/main/java/com/simibubi/create/compat/jei/category/BlockzapperUpgradeCategory.java b/src/main/java/com/simibubi/create/compat/jei/category/BlockzapperUpgradeCategory.java deleted file mode 100644 index 581ebc9cd..000000000 --- a/src/main/java/com/simibubi/create/compat/jei/category/BlockzapperUpgradeCategory.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.simibubi.create.compat.jei.category; - -import static com.simibubi.create.foundation.gui.AllGuiTextures.BLOCKZAPPER_UPGRADE_RECIPE; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import com.mojang.blaze3d.matrix.MatrixStack; -import com.simibubi.create.AllItems; -import com.simibubi.create.compat.jei.ScreenResourceWrapper; -import com.simibubi.create.content.curiosities.zapper.blockzapper.BlockzapperUpgradeRecipe; -import com.simibubi.create.foundation.gui.GuiGameElement; -import com.simibubi.create.foundation.utility.Lang; - -import mezz.jei.api.constants.VanillaTypes; -import mezz.jei.api.gui.IRecipeLayout; -import mezz.jei.api.gui.ingredient.IGuiItemStackGroup; -import mezz.jei.api.ingredients.IIngredients; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.FontRenderer; -import net.minecraft.client.util.ITooltipFlag; -import net.minecraft.item.crafting.Ingredient; -import net.minecraft.item.crafting.ShapedRecipe; -import net.minecraft.util.NonNullList; -import net.minecraft.util.text.IFormattableTextComponent; -import net.minecraft.util.text.ITextComponent; -import net.minecraft.util.text.StringTextComponent; - -public class BlockzapperUpgradeCategory extends CreateRecipeCategory { - - public BlockzapperUpgradeCategory() { - super(itemIcon(AllItems.BLOCKZAPPER.get()), new ScreenResourceWrapper(BLOCKZAPPER_UPGRADE_RECIPE)); - } - - @Override - public Class getRecipeClass() { - return BlockzapperUpgradeRecipe.class; - } - - @Override - public void setIngredients(BlockzapperUpgradeRecipe recipe, IIngredients ingredients) { - ingredients.setInputIngredients(recipe.getIngredients()); - ingredients.setOutput(VanillaTypes.ITEM, recipe.getRecipeOutput()); - } - - @Override - public void setRecipe(IRecipeLayout recipeLayout, BlockzapperUpgradeRecipe recipe, IIngredients ingredients) { - IGuiItemStackGroup itemStacks = recipeLayout.getItemStacks(); - ShapedRecipe shape = recipe.getRecipe(); - NonNullList shapedIngredients = shape.getIngredients(); - - int top = 0; - int left = 0; - - int i = 0; - for (int y = 0; y < shape.getRecipeHeight(); y++) { - for (int x = 0; x < shape.getRecipeWidth(); x++) { - itemStacks.init(i, true, left + x * 18, top + y * 18); - itemStacks.set(i, Arrays.asList(shapedIngredients.get(i) - .getMatchingStacks())); - i++; - } - } - } - - @Override - public List getTooltipStrings(BlockzapperUpgradeRecipe recipe, double mouseX, double mouseY) { - List list = new ArrayList<>(); - if (mouseX < 91 || mouseX > 91 + 52 || mouseY < 1 || mouseY > 53) - return list; - list.addAll(recipe.getRecipeOutput() - .getTooltip(Minecraft.getInstance().player, - Minecraft.getInstance().gameSettings.advancedItemTooltips ? ITooltipFlag.TooltipFlags.ADVANCED - : ITooltipFlag.TooltipFlags.NORMAL)); - return list; - } - - @Override - public void draw(BlockzapperUpgradeRecipe recipe, MatrixStack matrixStack, double mouseX, double mouseY) { - FontRenderer font = Minecraft.getInstance().fontRenderer; - - IFormattableTextComponent textComponent = - new StringTextComponent("+ ") - .append(Lang.translate("blockzapper.component." + Lang.asId(recipe.getUpgradedComponent().name()))) - .formatted(recipe.getTier().color); - - font.drawWithShadow(matrixStack, textComponent, (BLOCKZAPPER_UPGRADE_RECIPE.width - font.getStringWidth(textComponent.getString())) / 2f, 57, 0x8B8B8B); - - GuiGameElement.of(recipe.getRecipeOutput()) - .at(90, 0) - .scale(3.5) - .render(matrixStack); - } -} \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/content/curiosities/symmetry/SymmetryWandScreen.java b/src/main/java/com/simibubi/create/content/curiosities/symmetry/SymmetryWandScreen.java index 3c95f62ec..ecae91299 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/symmetry/SymmetryWandScreen.java +++ b/src/main/java/com/simibubi/create/content/curiosities/symmetry/SymmetryWandScreen.java @@ -60,9 +60,9 @@ public class SymmetryWandScreen extends AbstractSimiScreen { AllGuiTextures background = AllGuiTextures.WAND_OF_SYMMETRY; this.setWindowSize(background.width + 50, background.height + 50); - labelType = new Label(guiLeft + 49, guiTop + 26, StringTextComponent.EMPTY).colored(0xFFFFFFFF) + labelType = new Label(guiLeft + 49, guiTop + 28, StringTextComponent.EMPTY).colored(0xFFFFFFFF) .withShadow(); - labelAlign = new Label(guiLeft + 49, guiTop + 48, StringTextComponent.EMPTY).colored(0xFFFFFFFF) + labelAlign = new Label(guiLeft + 49, guiTop + 50, StringTextComponent.EMPTY).colored(0xFFFFFFFF) .withShadow(); int state = @@ -118,12 +118,10 @@ public class SymmetryWandScreen extends AbstractSimiScreen { @Override protected void renderWindow(MatrixStack matrixStack, int mouseX, int mouseY, float partialTicks) { AllGuiTextures.WAND_OF_SYMMETRY.draw(matrixStack, this, guiLeft, guiTop); - - textRenderer.drawWithShadow(matrixStack, wand.getDisplayName(), guiLeft + 11, guiTop + 3, 0xffffff); - + textRenderer.draw(matrixStack, wand.getDisplayName(), guiLeft + 11, guiTop + 4, 0x6B3802); renderBlock(matrixStack); GuiGameElement.of(wand) - .at(guiLeft + 190, guiTop + 420, -150) + .at(guiLeft + 170, guiTop + 490, -150) .scale(4) .rotate(-70, 20, 20) .render(matrixStack); @@ -131,7 +129,7 @@ public class SymmetryWandScreen extends AbstractSimiScreen { protected void renderBlock(MatrixStack ms) { ms.push(); - ms.translate(guiLeft + 26f, guiTop + 37, 20); + ms.translate(guiLeft + 26f, guiTop + 39, 20); ms.scale(16, 16, 16); ms.multiply(new Vector3f(.3f, 1f, 0f).getDegreesQuaternion(-22.5f)); currentElement.applyModelTransform(ms); diff --git a/src/main/java/com/simibubi/create/content/curiosities/tools/AllToolTiers.java b/src/main/java/com/simibubi/create/content/curiosities/tools/AllToolTiers.java deleted file mode 100644 index 22ba52060..000000000 --- a/src/main/java/com/simibubi/create/content/curiosities/tools/AllToolTiers.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.simibubi.create.content.curiosities.tools; - -import java.util.function.Supplier; - -import com.simibubi.create.AllItems; - -import net.minecraft.item.IItemTier; -import net.minecraft.item.crafting.Ingredient; -import net.minecraft.util.LazyValue; - -public enum AllToolTiers implements IItemTier { - - RADIANT(4, 1024, 16.0F, 3.5F, 10, () -> { - return Ingredient.fromItems(AllItems.REFINED_RADIANCE.get()); - }), - - ; - - private final int harvestLevel; - private final int maxUses; - private final float efficiency; - private final float attackDamage; - private final int enchantability; - private final LazyValue repairMaterial; - - private AllToolTiers(int harvestLevelIn, int maxUsesIn, float efficiencyIn, float attackDamageIn, - int enchantabilityIn, Supplier repairMaterialIn) { - this.harvestLevel = harvestLevelIn; - this.maxUses = maxUsesIn; - this.efficiency = efficiencyIn; - this.attackDamage = attackDamageIn; - this.enchantability = enchantabilityIn; - this.repairMaterial = new LazyValue<>(repairMaterialIn); - } - - public int getMaxUses() { - return this.maxUses; - } - - public float getEfficiency() { - return this.efficiency; - } - - public float getAttackDamage() { - return this.attackDamage; - } - - public int getHarvestLevel() { - return this.harvestLevel; - } - - public int getEnchantability() { - return this.enchantability; - } - - public Ingredient getRepairMaterial() { - return this.repairMaterial.getValue(); - } -} diff --git a/src/main/java/com/simibubi/create/content/curiosities/tools/DeforesterItem.java b/src/main/java/com/simibubi/create/content/curiosities/tools/DeforesterItem.java deleted file mode 100644 index 862b11161..000000000 --- a/src/main/java/com/simibubi/create/content/curiosities/tools/DeforesterItem.java +++ /dev/null @@ -1,75 +0,0 @@ -package com.simibubi.create.content.curiosities.tools; - -import javax.annotation.ParametersAreNonnullByDefault; - -import com.simibubi.create.AllItems; -import com.simibubi.create.AllTags; -import com.simibubi.create.foundation.utility.TreeCutter; -import com.simibubi.create.foundation.utility.VecHelper; - -import mcp.MethodsReturnNonnullByDefault; -import net.minecraft.block.BlockState; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.item.ItemEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.AxeItem; -import net.minecraft.item.ItemStack; -import net.minecraft.tags.BlockTags; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.vector.Vector3d; -import net.minecraft.world.IWorld; -import net.minecraft.world.World; -import net.minecraftforge.event.world.BlockEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod.EventBusSubscriber; -import net.minecraftforge.fml.common.Mod.EventBusSubscriber.Bus; - - -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -@EventBusSubscriber(bus = Bus.FORGE) -public class DeforesterItem extends AxeItem { - private static boolean deforesting = false; // required as to not run into "recursions" over forge events on tree cutting - - public DeforesterItem(Properties builder) { - super(AllToolTiers.RADIANT, 5.0F, -3.1F, builder); - } - - // Moved away from Item#onBlockDestroyed as it does not get called in Creative - public static void destroyTree(IWorld iWorld, BlockState state, BlockPos pos, - PlayerEntity player) { - - if (deforesting ||!(state.isIn(BlockTags.LOGS) || AllTags.AllBlockTags.SLIMY_LOGS.matches(state)) || player.isSneaking() || !(iWorld instanceof World)) - return; - World worldIn = (World) iWorld; - Vector3d vec = player.getLookVec(); - - deforesting = true; - TreeCutter.findTree(worldIn, pos).destroyBlocks(worldIn, player, (dropPos, item) -> dropItemFromCutTree(worldIn, pos, vec, dropPos, item)); - deforesting = false; - } - - @SubscribeEvent - public static void onBlockDestroyed(BlockEvent.BreakEvent event) { - ItemStack heldItemMainhand = event.getPlayer().getHeldItemMainhand(); - if (!AllItems.DEFORESTER.isIn(heldItemMainhand)) - return; - destroyTree(event.getWorld(), event.getState(), event.getPos(), event.getPlayer()); - } - - public static void dropItemFromCutTree(World world, BlockPos breakingPos, Vector3d fallDirection, BlockPos pos, - ItemStack stack) { - float distance = (float) Math.sqrt(pos.distanceSq(breakingPos)); - Vector3d dropPos = VecHelper.getCenterOf(pos); - ItemEntity entity = new ItemEntity(world, dropPos.x, dropPos.y, dropPos.z, stack); - entity.setMotion(fallDirection.scale(distance / 20f)); - world.addEntity(entity); - } - - @Override - public boolean onBlockDestroyed(ItemStack stack, World world, BlockState state, BlockPos pos, LivingEntity entity) { - if (!state.isIn(BlockTags.LEAVES)) - super.onBlockDestroyed(stack, world, state, pos, entity); - return true; - } -} diff --git a/src/main/java/com/simibubi/create/content/curiosities/tools/DeforesterItemRenderer.java b/src/main/java/com/simibubi/create/content/curiosities/tools/DeforesterItemRenderer.java deleted file mode 100644 index 46712178b..000000000 --- a/src/main/java/com/simibubi/create/content/curiosities/tools/DeforesterItemRenderer.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.simibubi.create.content.curiosities.tools; - -import com.mojang.blaze3d.matrix.MatrixStack; -import com.simibubi.create.foundation.block.render.CustomRenderedItemModelRenderer; -import com.simibubi.create.foundation.item.PartialItemModelRenderer; -import com.simibubi.create.foundation.utility.AnimationTickHolder; - -import net.minecraft.client.renderer.IRenderTypeBuffer; -import net.minecraft.item.ItemStack; -import net.minecraft.util.math.vector.Vector3f; - -public class DeforesterItemRenderer extends CustomRenderedItemModelRenderer { - - @Override - protected void render(ItemStack stack, DeforesterModel model, PartialItemModelRenderer renderer, - MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay) { - int maxLight = 0xF000F0; - float worldTime = AnimationTickHolder.getRenderTime(); - - renderer.renderSolid(model.getBakedModel(), light); - renderer.renderSolidGlowing(model.getPartial("core"), maxLight); - renderer.renderGlowing(model.getPartial("core_glow"), maxLight); - - float angle = worldTime * -.5f % 360; - ms.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(angle)); - renderer.renderSolid(model.getPartial("gear"), light); - } - - -} diff --git a/src/main/java/com/simibubi/create/content/curiosities/tools/DeforesterModel.java b/src/main/java/com/simibubi/create/content/curiosities/tools/DeforesterModel.java deleted file mode 100644 index 5fad1cfac..000000000 --- a/src/main/java/com/simibubi/create/content/curiosities/tools/DeforesterModel.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.simibubi.create.content.curiosities.tools; - -import com.simibubi.create.foundation.block.render.CustomRenderedItemModel; - -import net.minecraft.client.renderer.model.IBakedModel; -import net.minecraft.client.renderer.tileentity.ItemStackTileEntityRenderer; - -public class DeforesterModel extends CustomRenderedItemModel { - - public DeforesterModel(IBakedModel template) { - super(template, "deforester"); - addPartials("gear", "core", "core_glow"); - } - - @Override - public ItemStackTileEntityRenderer createRenderer() { - return new DeforesterItemRenderer(); - } - -} diff --git a/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperInteractionHandler.java b/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperInteractionHandler.java index 5b1de8daf..c56d86a0e 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperInteractionHandler.java +++ b/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperInteractionHandler.java @@ -98,7 +98,7 @@ public class ZapperInteractionHandler { else tag.put("BlockData", data); - AllSoundEvents.BLOCKZAPPER_CONFIRM.playOnServer(player.world, player.getBlockPos()); + AllSoundEvents.CONFIRM.playOnServer(player.world, player.getBlockPos()); return true; } diff --git a/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperItem.java b/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperItem.java index ac7229898..f6e573b8e 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperItem.java +++ b/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperItem.java @@ -21,7 +21,6 @@ import net.minecraft.entity.player.ServerPlayerEntity; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.item.ItemUseContext; -import net.minecraft.item.Rarity; import net.minecraft.item.UseAction; import net.minecraft.nbt.CompoundNBT; import net.minecraft.nbt.NBTUtil; @@ -49,8 +48,7 @@ import net.minecraftforge.fml.network.PacketDistributor; public abstract class ZapperItem extends Item { public ZapperItem(Properties properties) { - super(properties.maxStackSize(1) - .rarity(Rarity.UNCOMMON)); + super(properties.maxStackSize(1)); } @Override @@ -63,7 +61,7 @@ public abstract class ZapperItem extends Item { .getBlock() .getTranslationKey(); ItemDescription.add(tooltip, - Lang.translate("blockzapper.usingBlock", + Lang.translate("terrainzapper.usingBlock", new TranslationTextComponent(usedblock).formatted(TextFormatting.GRAY)) .formatted(TextFormatting.DARK_GRAY)); } @@ -143,7 +141,7 @@ public abstract class ZapperItem extends Item { // Check if can be used ITextComponent msg = validateUsage(item); if (msg != null) { - AllSoundEvents.BLOCKZAPPER_DENY.play(world, player, player.getBlockPos()); + AllSoundEvents.DENY.play(world, player, player.getBlockPos()); player.sendStatusMessage(msg.copy().formatted(TextFormatting.RED), true); return new ActionResult<>(ActionResultType.FAIL, item); } @@ -202,7 +200,7 @@ public abstract class ZapperItem extends Item { public ITextComponent validateUsage(ItemStack item) { CompoundNBT tag = item.getOrCreateTag(); if (!canActivateWithoutSelectedBlock(item) && !tag.contains("BlockUsed")) - return Lang.createTranslationTextComponent("blockzapper.leftClickToSet"); + return Lang.createTranslationTextComponent("terrainzapper.leftClickToSet"); return null; } diff --git a/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperRenderHandler.java b/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperRenderHandler.java index bcf8f8e5c..f69316011 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperRenderHandler.java +++ b/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperRenderHandler.java @@ -113,9 +113,9 @@ public class ZapperRenderHandler { } public static void playSound(Hand hand, BlockPos position) { - float pitch = hand == Hand.MAIN_HAND ? 2f : 0.9f; + float pitch = hand == Hand.MAIN_HAND ? 0.1f : 0.9f; Minecraft mc = Minecraft.getInstance(); - AllSoundEvents.BLOCKZAPPER_PLACE.play(mc.world, mc.player, position, 0.8f, pitch); + AllSoundEvents.WORLDSHAPER_PLACE.play(mc.world, mc.player, position, 0.1f, pitch); } public static void addBeam(LaserBeam beam) { diff --git a/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperScreen.java b/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperScreen.java index bb5a6f3c7..7589047be 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperScreen.java +++ b/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperScreen.java @@ -30,8 +30,8 @@ public class ZapperScreen extends AbstractSimiScreen { protected float animationProgress; protected AllGuiTextures background; private IconButton confirmButton; - - protected final ITextComponent patternSection = Lang.translate("gui.blockzapper.patternSection"); + + protected final ITextComponent patternSection = Lang.translate("gui.terrainzapper.patternSection"); protected ITextComponent title; protected Vector patternButtons; @@ -51,14 +51,15 @@ public class ZapperScreen extends AbstractSimiScreen { @Override protected void init() { animationProgress = 0; - setWindowSize(background.width + 40, background.height); + setWindowSize(background.width, background.height); super.init(); widgets.clear(); - - confirmButton = new IconButton(guiLeft + background.width - 53, guiTop + background.height - 24, AllIcons.I_CONFIRM); + + confirmButton = + new IconButton(guiLeft + background.width - 43, guiTop + background.height - 24, AllIcons.I_CONFIRM); widgets.add(confirmButton); - int i = guiLeft - 20; + int i = guiLeft - 10; int j = guiTop; CompoundNBT nbt = zapper.getOrCreateTag(); @@ -67,9 +68,10 @@ public class ZapperScreen extends AbstractSimiScreen { for (int col = 0; col <= 2; col++) { int id = patternButtons.size(); PlacementPatterns pattern = PlacementPatterns.values()[id]; - patternButtons.add(new IconButton(i + background.width - 76 + col * 18, j + 19 + row * 18, pattern.icon)); + patternButtons + .add(new IconButton(i + background.width - 76 + col * 18, j + 21 + row * 18, pattern.icon)); patternButtons.get(id) - .setToolTip(Lang.translate("gui.blockzapper.pattern." + pattern.translationKey)); + .setToolTip(Lang.translate("gui.terrainzapper.pattern." + pattern.translationKey)); } } @@ -82,7 +84,7 @@ public class ZapperScreen extends AbstractSimiScreen { @Override protected void renderWindow(MatrixStack matrixStack, int mouseX, int mouseY, float partialTicks) { - int i = guiLeft - 20; + int i = guiLeft - 10; int j = guiTop; background.draw(matrixStack, this, i, j); @@ -93,7 +95,7 @@ public class ZapperScreen extends AbstractSimiScreen { } protected void drawOnBackground(MatrixStack matrixStack, int i, int j) { - textRenderer.drawWithShadow(matrixStack, title, i + 11, j + 3, brightColor); + textRenderer.draw(matrixStack, title, i + 11, j + 4, 0x54214F); } @Override @@ -122,7 +124,7 @@ public class ZapperScreen extends AbstractSimiScreen { nbt.putString("Pattern", PlacementPatterns.values()[patternButtons.indexOf(patternButton)].name()); } } - + if (confirmButton.isHovered()) { onClose(); return true; @@ -133,15 +135,16 @@ public class ZapperScreen extends AbstractSimiScreen { protected void renderZapper(MatrixStack matrixStack) { GuiGameElement.of(zapper) - .at((this.width - this.sWidth) / 2 + 200, this.height / 2 - this.sHeight / 4 + 25, -150) + .at((this.width - this.sWidth) / 2 + 220, this.height / 2 - this.sHeight / 4 + 27, -150) .scale(4) .render(matrixStack); } protected void renderBlock(MatrixStack matrixStack) { matrixStack.push(); - matrixStack.translate(guiLeft + 7f, guiTop + 43.5f, 120); - matrixStack.multiply(new Vector3f(.5f, .9f, -.1f).getDegreesQuaternion(-30f)); + matrixStack.translate(guiLeft + 22f, guiTop + 42f, 120); + matrixStack.multiply(new Vector3f(1f, 0, 0).getDegreesQuaternion(-25f)); + matrixStack.multiply(new Vector3f(0, 1f, 0).getDegreesQuaternion(-45f)); matrixStack.scale(20, 20, 20); BlockState state = Blocks.AIR.getDefaultState(); diff --git a/src/main/java/com/simibubi/create/content/curiosities/zapper/blockzapper/BlockzapperItem.java b/src/main/java/com/simibubi/create/content/curiosities/zapper/blockzapper/BlockzapperItem.java deleted file mode 100644 index 1a8cdb843..000000000 --- a/src/main/java/com/simibubi/create/content/curiosities/zapper/blockzapper/BlockzapperItem.java +++ /dev/null @@ -1,396 +0,0 @@ -package com.simibubi.create.content.curiosities.zapper.blockzapper; - -import java.util.HashSet; -import java.util.LinkedList; -import java.util.List; -import java.util.Set; - -import com.simibubi.create.AllItems; -import com.simibubi.create.Create; -import com.simibubi.create.content.curiosities.zapper.PlacementPatterns; -import com.simibubi.create.content.curiosities.zapper.ZapperInteractionHandler; -import com.simibubi.create.content.curiosities.zapper.ZapperItem; -import com.simibubi.create.foundation.advancement.AllTriggers; -import com.simibubi.create.foundation.gui.ScreenOpener; -import com.simibubi.create.foundation.item.ItemDescription; -import com.simibubi.create.foundation.utility.BlockHelper; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.Lang; -import com.simibubi.create.foundation.utility.NBTHelper; - -import net.minecraft.advancements.CriteriaTriggers; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.util.ITooltipFlag; -import net.minecraft.entity.Entity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.player.ServerPlayerEntity; -import net.minecraft.fluid.FluidState; -import net.minecraft.item.ItemGroup; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.Direction; -import net.minecraft.util.NonNullList; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockRayTraceResult; -import net.minecraft.util.math.RayTraceContext; -import net.minecraft.util.math.RayTraceContext.BlockMode; -import net.minecraft.util.math.RayTraceContext.FluidMode; -import net.minecraft.util.math.vector.Vector3d; -import net.minecraft.util.text.ITextComponent; -import net.minecraft.util.text.StringTextComponent; -import net.minecraft.util.text.TextFormatting; -import net.minecraft.world.World; -import net.minecraft.world.server.ServerWorld; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; -import net.minecraftforge.common.util.BlockSnapshot; -import net.minecraftforge.common.util.Constants.BlockFlags; -import net.minecraftforge.event.ForgeEventFactory; - -public class BlockzapperItem extends ZapperItem { - - public BlockzapperItem(Properties properties) { - super(properties); - } - - @Override - @OnlyIn(Dist.CLIENT) - public void addInformation(ItemStack stack, World worldIn, List tooltip, ITooltipFlag flagIn) { - super.addInformation(stack, worldIn, tooltip, flagIn); - if (Screen.hasShiftDown()) { - - tooltip.add(new StringTextComponent("")); - ItemDescription.add(tooltip, Lang.translate("blockzapper.componentUpgrades").formatted(TextFormatting.WHITE)); - - for (Components c : Components.values()) { - ComponentTier tier = getTier(c, stack); - ITextComponent componentName = - Lang.translate("blockzapper.component." + Lang.asId(c.name())).formatted(TextFormatting.GRAY); - ITextComponent tierName = Lang.translate("blockzapper.componentTier." + Lang.asId(tier.name())).formatted(tier.color); - ItemDescription.add(tooltip, new StringTextComponent("> ").append(componentName).append(": ").append(tierName)); - } - } - } - - @Override - public void fillItemGroup(ItemGroup group, NonNullList items) { - if (group != Create.baseCreativeTab && group != ItemGroup.SEARCH) - return; - - ItemStack gunWithoutStuff = new ItemStack(this); - items.add(gunWithoutStuff); - - ItemStack gunWithGoldStuff = new ItemStack(this); - for (Components c : Components.values()) - setTier(c, ComponentTier.Brass, gunWithGoldStuff); - items.add(gunWithGoldStuff); - - ItemStack gunWithPurpurStuff = new ItemStack(this); - for (Components c : Components.values()) - setTier(c, ComponentTier.Chromatic, gunWithPurpurStuff); - items.add(gunWithPurpurStuff); - } - - @Override - protected boolean activate(World world, PlayerEntity player, ItemStack stack, BlockState selectedState, - BlockRayTraceResult raytrace, CompoundNBT data) { - CompoundNBT nbt = stack.getOrCreateTag(); - boolean replace = nbt.contains("Replace") && nbt.getBoolean("Replace"); - - List selectedBlocks = getSelectedBlocks(stack, world, player); - PlacementPatterns.applyPattern(selectedBlocks, stack); - Direction face = raytrace.getFace(); - - for (BlockPos placed : selectedBlocks) { - if (world.getBlockState(placed) == selectedState) - continue; - if (!selectedState.isValidPosition(world, placed)) - continue; - if (!player.isCreative() && !canBreak(stack, world.getBlockState(placed), world, placed,player)) - continue; - if (!player.isCreative() && BlockHelper.findAndRemoveInInventory(selectedState, player, 1) == 0) { - player.getCooldownTracker() - .setCooldown(stack.getItem(), 20); - player.sendStatusMessage( Lang.translate("blockzapper.empty").formatted(TextFormatting.RED), true); - return false; - } - - if (!player.isCreative() && replace) - dropBlocks(world, player, stack, face, placed); - - BlockState state = selectedState; - for (Direction updateDirection : Iterate.directions) - state = state.updatePostPlacement(updateDirection, - world.getBlockState(placed.offset(updateDirection)), world, placed, placed.offset(updateDirection)); - - BlockSnapshot blocksnapshot = BlockSnapshot.create(world.getRegistryKey(), world, placed); - FluidState FluidState = world.getFluidState(placed); - world.setBlockState(placed, FluidState.getBlockState(), BlockFlags.UPDATE_NEIGHBORS); - world.setBlockState(placed, state); - - if (ForgeEventFactory.onBlockPlace(player, blocksnapshot, Direction.UP)) { - blocksnapshot.restore(true, false); - return false; - } - setTileData(world, placed, state, data, player); - - if (player instanceof ServerPlayerEntity && world instanceof ServerWorld) { - ServerPlayerEntity serverPlayer = (ServerPlayerEntity) player; - CriteriaTriggers.PLACED_BLOCK.trigger(serverPlayer, placed, new ItemStack(state.getBlock())); - - boolean fullyUpgraded = true; - for (Components c : Components.values()) { - if (getTier(c, stack) != ComponentTier.Chromatic) { - fullyUpgraded = false; - break; - } - } - if (fullyUpgraded) - AllTriggers.UPGRADED_ZAPPER.trigger(serverPlayer); - } - } - for (BlockPos placed : selectedBlocks) { - world.neighborChanged(placed, selectedState.getBlock(), placed); - } - - return true; - } - - @Override - public void inventoryTick(ItemStack stack, World worldIn, Entity entityIn, int itemSlot, boolean isSelected) { - if (AllItems.BLOCKZAPPER.isIn(stack)) { - CompoundNBT nbt = stack.getOrCreateTag(); - if (!nbt.contains("Replace")) - nbt.putBoolean("Replace", false); - if (!nbt.contains("Pattern")) - nbt.putString("Pattern", PlacementPatterns.Solid.name()); - if (!nbt.contains("SearchDiagonal")) - nbt.putBoolean("SearchDiagonal", false); - if (!nbt.contains("SearchMaterial")) - nbt.putBoolean("SearchMaterial", false); - if (!nbt.contains("SearchDistance")) - nbt.putInt("SearchDistance", 1); - } - } - - @Override - @OnlyIn(Dist.CLIENT) - protected void openHandgunGUI(ItemStack handgun, boolean offhand) { - ScreenOpener.open(new BlockzapperScreen(handgun, offhand)); - } - - public static List getSelectedBlocks(ItemStack stack, World worldIn, PlayerEntity player) { - List list = new LinkedList<>(); - CompoundNBT tag = stack.getTag(); - if (tag == null) - return list; - - boolean searchDiagonals = tag.contains("SearchDiagonal") && tag.getBoolean("SearchDiagonal"); - boolean searchAcrossMaterials = tag.contains("SearchFuzzy") && tag.getBoolean("SearchFuzzy"); - boolean replace = tag.contains("Replace") && tag.getBoolean("Replace"); - int searchRange = tag.contains("SearchDistance") ? tag.getInt("SearchDistance") : 0; - - Set visited = new HashSet<>(); - List frontier = new LinkedList<>(); - - Vector3d start = player.getPositionVec() - .add(0, player.getEyeHeight(), 0); - Vector3d range = player.getLookVec() - .scale(ZapperInteractionHandler.getRange(stack)); - BlockRayTraceResult raytrace = player.world - .rayTraceBlocks(new RayTraceContext(start, start.add(range), BlockMode.COLLIDER, FluidMode.NONE, player)); - BlockPos pos = raytrace.getPos() - .toImmutable(); - - if (pos == null) - return list; - - BlockState state = worldIn.getBlockState(pos); - Direction face = raytrace.getFace(); - List offsets = new LinkedList<>(); - - for (int x = -1; x <= 1; x++) - for (int y = -1; y <= 1; y++) - for (int z = -1; z <= 1; z++) - if (Math.abs(x) + Math.abs(y) + Math.abs(z) < 2 || searchDiagonals) - if (face.getAxis() - .getCoordinate(x, y, z) == 0) - offsets.add(new BlockPos(x, y, z)); - - BlockPos startPos = replace ? pos : pos.offset(face); - frontier.add(startPos); - - while (!frontier.isEmpty()) { - BlockPos currentPos = frontier.remove(0); - if (visited.contains(currentPos)) - continue; - visited.add(currentPos); - if (!currentPos.withinDistance(startPos, searchRange)) - continue; - - // Replace Mode - if (replace) { - BlockState stateToReplace = worldIn.getBlockState(currentPos); - BlockState stateAboveStateToReplace = worldIn.getBlockState(currentPos.offset(face)); - - // Criteria - if (stateToReplace.getBlockHardness(worldIn, currentPos) == -1) - continue; - if (stateToReplace.getBlock() != state.getBlock() && !searchAcrossMaterials) - continue; - if (stateToReplace.getMaterial() - .isReplaceable()) - continue; - if (stateAboveStateToReplace.isSolid()) - continue; - list.add(currentPos); - - // Search adjacent spaces - for (BlockPos offset : offsets) - frontier.add(currentPos.add(offset)); - continue; - } - - // Place Mode - BlockState stateToPlaceAt = worldIn.getBlockState(currentPos); - BlockState stateToPlaceOn = worldIn.getBlockState(currentPos.offset(face.getOpposite())); - - // Criteria - if (stateToPlaceOn.getMaterial() - .isReplaceable()) - continue; - if (stateToPlaceOn.getBlock() != state.getBlock() && !searchAcrossMaterials) - continue; - if (!stateToPlaceAt.getMaterial() - .isReplaceable()) - continue; - list.add(currentPos); - - // Search adjacent spaces - for (BlockPos offset : offsets) - frontier.add(currentPos.add(offset)); - continue; - } - - return list; - } - - public static boolean canBreak(ItemStack stack, BlockState state, World world, BlockPos pos,PlayerEntity player) { - ComponentTier tier = getTier(Components.Body, stack); - float blockHardness = state.getBlockHardness(world, pos); - //If we can't change the block (e.g chunk protection) - if (!isAllowedToPlace(world,pos,player)){ - return false; - } - if (blockHardness == -1) - return false; - if (tier == ComponentTier.None) - return blockHardness < 3; - if (tier == ComponentTier.Brass) - return blockHardness < 6; - if (tier == ComponentTier.Chromatic) - return true; - - return false; - } - - public static boolean isAllowedToPlace(World world, BlockPos pos,PlayerEntity player){ - BlockSnapshot blocksnapshot = BlockSnapshot.create(world.getRegistryKey(), world, pos); - if (ForgeEventFactory.onBlockPlace(player, blocksnapshot, Direction.UP)) { - return false; - } - return true; - } - - public static int getMaxAoe(ItemStack stack) { - ComponentTier tier = getTier(Components.Amplifier, stack); - if (tier == ComponentTier.None) - return 2; - if (tier == ComponentTier.Brass) - return 4; - if (tier == ComponentTier.Chromatic) - return 8; - - return 0; - } - - @Override - protected int getCooldownDelay(ItemStack stack) { - return getCooldown(stack); - } - - public static int getCooldown(ItemStack stack) { - ComponentTier tier = getTier(Components.Accelerator, stack); - if (tier == ComponentTier.None) - return 10; - if (tier == ComponentTier.Brass) - return 6; - if (tier == ComponentTier.Chromatic) - return 2; - - return 20; - } - - @Override - protected int getZappingRange(ItemStack stack) { - ComponentTier tier = getTier(Components.Scope, stack); - if (tier == ComponentTier.None) - return 15; - if (tier == ComponentTier.Brass) - return 30; - if (tier == ComponentTier.Chromatic) - return 100; - - return 0; - } - - protected static void dropBlocks(World worldIn, PlayerEntity playerIn, ItemStack item, Direction face, - BlockPos placed) { - TileEntity tileentity = worldIn.getBlockState(placed) - .hasTileEntity() ? worldIn.getTileEntity(placed) : null; - - if (getTier(Components.Retriever, item) == ComponentTier.None) { - Block.spawnDrops(worldIn.getBlockState(placed), worldIn, placed.offset(face), tileentity); - } - - if (getTier(Components.Retriever, item) == ComponentTier.Brass) - Block.spawnDrops(worldIn.getBlockState(placed), worldIn, playerIn.getBlockPos(), tileentity); - - if (getTier(Components.Retriever, item) == ComponentTier.Chromatic) - for (ItemStack stack : Block.getDrops(worldIn.getBlockState(placed), (ServerWorld) worldIn, placed, - tileentity)) - if (!playerIn.inventory.addItemStackToInventory(stack)) - Block.spawnAsEntity(worldIn, placed, stack); - } - - public static ComponentTier getTier(Components component, ItemStack stack) { - if (!stack.hasTag() || !stack.getTag() - .contains(component.name())) - stack.getOrCreateTag() - .putString(component.name(), ComponentTier.None.name()); - return NBTHelper.readEnum(stack.getTag(), component.name(), ComponentTier.class); - } - - public static void setTier(Components component, ComponentTier tier, ItemStack stack) { - NBTHelper.writeEnum(stack.getOrCreateTag(), component.name(), tier); - } - - public static enum ComponentTier { - None(TextFormatting.DARK_GRAY), Brass(TextFormatting.GOLD), Chromatic(TextFormatting.LIGHT_PURPLE); - - public TextFormatting color; - - private ComponentTier(TextFormatting color) { - this.color = color; - } - - } - - public static enum Components { - Body, Amplifier, Accelerator, Retriever, Scope - } - -} diff --git a/src/main/java/com/simibubi/create/content/curiosities/zapper/blockzapper/BlockzapperItemRenderer.java b/src/main/java/com/simibubi/create/content/curiosities/zapper/blockzapper/BlockzapperItemRenderer.java deleted file mode 100644 index e59924335..000000000 --- a/src/main/java/com/simibubi/create/content/curiosities/zapper/blockzapper/BlockzapperItemRenderer.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.simibubi.create.content.curiosities.zapper.blockzapper; - -import static com.simibubi.create.content.curiosities.zapper.blockzapper.BlockzapperItem.Components.Accelerator; -import static com.simibubi.create.content.curiosities.zapper.blockzapper.BlockzapperItem.Components.Amplifier; -import static com.simibubi.create.content.curiosities.zapper.blockzapper.BlockzapperItem.Components.Body; -import static com.simibubi.create.content.curiosities.zapper.blockzapper.BlockzapperItem.Components.Retriever; -import static com.simibubi.create.content.curiosities.zapper.blockzapper.BlockzapperItem.Components.Scope; -import static java.lang.Math.max; -import static net.minecraft.util.math.MathHelper.clamp; - -import com.mojang.blaze3d.matrix.MatrixStack; -import com.simibubi.create.content.curiosities.zapper.ZapperItemRenderer; -import com.simibubi.create.content.curiosities.zapper.blockzapper.BlockzapperItem.ComponentTier; -import com.simibubi.create.content.curiosities.zapper.blockzapper.BlockzapperItem.Components; -import com.simibubi.create.foundation.item.PartialItemModelRenderer; -import com.simibubi.create.foundation.utility.AnimationTickHolder; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.entity.player.ClientPlayerEntity; -import net.minecraft.client.renderer.IRenderTypeBuffer; -import net.minecraft.client.renderer.LightTexture; -import net.minecraft.client.renderer.model.IBakedModel; -import net.minecraft.item.ItemStack; -import net.minecraft.util.HandSide; -import net.minecraft.util.math.MathHelper; -import net.minecraft.util.math.vector.Vector3f; - -public class BlockzapperItemRenderer extends ZapperItemRenderer { - - @Override - protected void render(ItemStack stack, BlockzapperModel model, PartialItemModelRenderer renderer, MatrixStack ms, - IRenderTypeBuffer buffer, int light, int overlay) { - super.render(stack, model, renderer, ms, buffer, light, overlay); - - float pt = AnimationTickHolder.getPartialTicks(); - float worldTime = AnimationTickHolder.getRenderTime() / 20; - - renderer.render(model.getBakedModel(), light); - renderComponent(stack, model, Body, renderer, light); - renderComponent(stack, model, Amplifier, renderer, light); - renderComponent(stack, model, Retriever, renderer, light); - renderComponent(stack, model, Scope, renderer, light); - - ClientPlayerEntity player = Minecraft.getInstance().player; - boolean leftHanded = player.getPrimaryHand() == HandSide.LEFT; - boolean mainHand = player.getHeldItemMainhand() == stack; - boolean offHand = player.getHeldItemOffhand() == stack; - float animation = getAnimationProgress(pt, leftHanded, mainHand); - - // Core glows - float multiplier = MathHelper.sin(worldTime * 5); - if (mainHand || offHand) - multiplier = animation; - - int lightItensity = (int) (15 * clamp(multiplier, 0, 1)); - int glowLight = LightTexture.pack(lightItensity, max(lightItensity, 4)); - renderer.renderSolidGlowing(model.getPartial("core"), glowLight); - renderer.renderGlowing(model.getPartial("core_glow"), glowLight); - - if (BlockzapperItem.getTier(Amplifier, stack) != ComponentTier.None) { - renderer.renderSolidGlowing(model.getPartial("amplifier_core"), glowLight); - renderer.renderGlowing(model.getPartial("amplifier_core_glow"), glowLight); - } - - // Accelerator spins - float angle = worldTime * -25; - if (mainHand || offHand) - angle += 360 * animation; - - angle %= 360; - float offset = -.155f; - ms.translate(0, offset, 0); - ms.multiply(Vector3f.POSITIVE_Z.getDegreesQuaternion(angle)); - ms.translate(0, -offset, 0); - renderComponent(stack, model, Accelerator, renderer, light); - } - - public void renderComponent(ItemStack stack, BlockzapperModel model, Components component, - PartialItemModelRenderer renderer, int light) { - ComponentTier tier = BlockzapperItem.getTier(component, stack); - IBakedModel partial = model.getComponentPartial(tier, component); - if (partial != null) - renderer.render(partial, light); - } - -} diff --git a/src/main/java/com/simibubi/create/content/curiosities/zapper/blockzapper/BlockzapperModel.java b/src/main/java/com/simibubi/create/content/curiosities/zapper/blockzapper/BlockzapperModel.java deleted file mode 100644 index f5688e9f6..000000000 --- a/src/main/java/com/simibubi/create/content/curiosities/zapper/blockzapper/BlockzapperModel.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.simibubi.create.content.curiosities.zapper.blockzapper; - -import javax.annotation.Nullable; - -import com.simibubi.create.content.curiosities.zapper.blockzapper.BlockzapperItem.ComponentTier; -import com.simibubi.create.foundation.block.render.CustomRenderedItemModel; -import com.simibubi.create.foundation.utility.Lang; - -import net.minecraft.client.renderer.model.IBakedModel; -import net.minecraft.client.renderer.tileentity.ItemStackTileEntityRenderer; - -public class BlockzapperModel extends CustomRenderedItemModel { - - public BlockzapperModel(IBakedModel template) { - super(template, "handheld_blockzapper"); - addPartials("core", "core_glow", "body", "amplifier_core", "amplifier_core_glow", "accelerator", "gold_body", - "gold_scope", "gold_amplifier", "gold_retriever", "gold_accelerator", "chorus_body", "chorus_scope", - "chorus_amplifier", "chorus_retriever", "chorus_accelerator"); - } - - @Override - public ItemStackTileEntityRenderer createRenderer() { - return new BlockzapperItemRenderer(); - } - - @Nullable - IBakedModel getComponentPartial(BlockzapperItem.ComponentTier tier, BlockzapperItem.Components component) { - String prefix = tier == ComponentTier.Chromatic ? "chorus_" : tier == ComponentTier.Brass ? "gold_" : ""; - return getPartial(prefix + Lang.asId(component.name())); - } - -} diff --git a/src/main/java/com/simibubi/create/content/curiosities/zapper/blockzapper/BlockzapperRenderHandler.java b/src/main/java/com/simibubi/create/content/curiosities/zapper/blockzapper/BlockzapperRenderHandler.java deleted file mode 100644 index f897956a3..000000000 --- a/src/main/java/com/simibubi/create/content/curiosities/zapper/blockzapper/BlockzapperRenderHandler.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.simibubi.create.content.curiosities.zapper.blockzapper; - -import java.util.Collections; -import java.util.List; - -import com.simibubi.create.AllItems; -import com.simibubi.create.AllSpecialTextures; -import com.simibubi.create.CreateClient; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.entity.player.ClientPlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.util.math.BlockPos; - -public class BlockzapperRenderHandler { - - private static List renderedShape; - - public static void tick() { - gatherSelectedBlocks(); - if (renderedShape.isEmpty()) - return; - - CreateClient.outliner.showCluster("blockzapper", renderedShape) - .colored(0xbfbfbf) - .lineWidth(1 / 32f) - .withFaceTexture(AllSpecialTextures.CHECKERED); - } - - protected static void gatherSelectedBlocks() { - ClientPlayerEntity player = Minecraft.getInstance().player; - ItemStack heldMain = player.getHeldItemMainhand(); - ItemStack heldOff = player.getHeldItemOffhand(); - boolean zapperInMain = AllItems.BLOCKZAPPER.isIn(heldMain); - boolean zapperInOff = AllItems.BLOCKZAPPER.isIn(heldOff); - - if (zapperInMain) { - CompoundNBT tag = heldMain.getOrCreateTag(); - if (!tag.contains("_Swap") || !zapperInOff) { - createOutline(player, heldMain); - return; - } - } - - if (zapperInOff) { - createOutline(player, heldOff); - return; - } - - renderedShape = Collections.emptyList(); - } - - private static void createOutline(ClientPlayerEntity player, ItemStack held) { - if (!held.getOrCreateTag().contains("BlockUsed")) { - renderedShape = Collections.emptyList(); - return; - } - renderedShape = BlockzapperItem.getSelectedBlocks(held, player.world, player); - } - -} diff --git a/src/main/java/com/simibubi/create/content/curiosities/zapper/blockzapper/BlockzapperScreen.java b/src/main/java/com/simibubi/create/content/curiosities/zapper/blockzapper/BlockzapperScreen.java deleted file mode 100644 index 3bdc13ee5..000000000 --- a/src/main/java/com/simibubi/create/content/curiosities/zapper/blockzapper/BlockzapperScreen.java +++ /dev/null @@ -1,114 +0,0 @@ -package com.simibubi.create.content.curiosities.zapper.blockzapper; - -import java.util.Collections; - -import com.simibubi.create.content.curiosities.zapper.ZapperScreen; -import com.simibubi.create.foundation.gui.AllGuiTextures; -import com.simibubi.create.foundation.gui.AllIcons; -import com.simibubi.create.foundation.gui.widgets.IconButton; -import com.simibubi.create.foundation.gui.widgets.Indicator; -import com.simibubi.create.foundation.gui.widgets.Indicator.State; -import com.simibubi.create.foundation.gui.widgets.Label; -import com.simibubi.create.foundation.gui.widgets.ScrollInput; -import com.simibubi.create.foundation.utility.Lang; - -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.util.text.ITextComponent; -import net.minecraft.util.text.StringTextComponent; -import net.minecraft.util.text.TextFormatting; - -public class BlockzapperScreen extends ZapperScreen { - - private final ITextComponent needsUpgradedAmplifier = Lang.translate("gui.blockzapper.needsUpgradedAmplifier"); - - private IconButton replaceModeButton; - private Indicator replaceModeIndicator; - private IconButton spreadDiagonallyButton; - private Indicator spreadDiagonallyIndicator; - private IconButton spreadMaterialButton; - private Indicator spreadMaterialIndicator; - - private ScrollInput spreadRangeInput; - private Label spreadRangeLabel; - - public BlockzapperScreen(ItemStack zapper, boolean offhand) { - super(AllGuiTextures.BLOCKZAPPER, zapper, offhand); - title = Lang.translate("gui.blockzapper.title"); - } - - @Override - protected void init() { - super.init(); - - int i = guiLeft - 20; - int j = guiTop; - CompoundNBT nbt = zapper.getOrCreateTag(); - - replaceModeIndicator = new Indicator(i + 49, j + 67, StringTextComponent.EMPTY); - replaceModeButton = new IconButton(i + 49, j + 73, AllIcons.I_REPLACE_SOLID); - if (nbt.contains("Replace") && nbt.getBoolean("Replace")) - replaceModeIndicator.state = State.ON; - replaceModeButton.setToolTip(Lang.translate("gui.blockzapper.replaceMode")); - - spreadDiagonallyIndicator = new Indicator(i + 8, j + 67, StringTextComponent.EMPTY); - spreadDiagonallyButton = new IconButton(i + 8, j + 73, AllIcons.I_FOLLOW_DIAGONAL); - if (nbt.contains("SearchDiagonal") && nbt.getBoolean("SearchDiagonal")) - spreadDiagonallyIndicator.state = State.ON; - spreadDiagonallyButton.setToolTip(Lang.translate("gui.blockzapper.searchDiagonal")); - - spreadMaterialIndicator = new Indicator(i + 26, j + 67, StringTextComponent.EMPTY); - spreadMaterialButton = new IconButton(i + 26, j + 73, AllIcons.I_FOLLOW_MATERIAL); - if (nbt.contains("SearchFuzzy") && nbt.getBoolean("SearchFuzzy")) - spreadMaterialIndicator.state = State.ON; - spreadMaterialButton.setToolTip(Lang.translate("gui.blockzapper.searchFuzzy")); - - spreadRangeLabel = new Label(i + 79, j + 78, StringTextComponent.EMPTY).withShadow().withSuffix("m"); - spreadRangeInput = new ScrollInput(i + 73, j + 73, 26, 18).withRange(1, BlockzapperItem.getMaxAoe(zapper)) - .setState(1).titled(Lang.translate("gui.blockzapper.range")).writingTo(spreadRangeLabel); - - if (nbt.contains("SearchDistance")) - spreadRangeInput.setState(nbt.getInt("SearchDistance")); - if (BlockzapperItem.getMaxAoe(zapper) == 2) - spreadRangeInput.getToolTip().add(1,needsUpgradedAmplifier.copy().formatted(TextFormatting.RED)); - - Collections.addAll(widgets, replaceModeButton, replaceModeIndicator, spreadDiagonallyButton, - spreadDiagonallyIndicator, spreadMaterialButton, spreadMaterialIndicator, spreadRangeLabel, - spreadRangeInput); - } - - @Override - public boolean mouseClicked(double x, double y, int button) { - CompoundNBT nbt = zapper.getTag(); - - if (replaceModeButton.isHovered()) { - boolean mode = nbt.contains("Replace") && nbt.getBoolean("Replace"); - mode = !mode; - replaceModeIndicator.state = mode ? State.ON : State.OFF; - nbt.putBoolean("Replace", mode); - } - - if (spreadDiagonallyButton.isHovered()) { - boolean mode = nbt.contains("SearchDiagonal") && nbt.getBoolean("SearchDiagonal"); - mode = !mode; - spreadDiagonallyIndicator.state = mode ? State.ON : State.OFF; - nbt.putBoolean("SearchDiagonal", mode); - } - - if (spreadMaterialButton.isHovered()) { - boolean mode = nbt.contains("SearchFuzzy") && nbt.getBoolean("SearchFuzzy"); - mode = !mode; - spreadMaterialIndicator.state = mode ? State.ON : State.OFF; - nbt.putBoolean("SearchFuzzy", mode); - } - - return super.mouseClicked(x, y, button); - } - - - @Override - protected void writeAdditionalOptions(CompoundNBT nbt) { - nbt.putInt("SearchDistance", spreadRangeInput.getState()); - } - -} diff --git a/src/main/java/com/simibubi/create/content/curiosities/zapper/blockzapper/BlockzapperUpgradeRecipe.java b/src/main/java/com/simibubi/create/content/curiosities/zapper/blockzapper/BlockzapperUpgradeRecipe.java deleted file mode 100644 index 41b736a41..000000000 --- a/src/main/java/com/simibubi/create/content/curiosities/zapper/blockzapper/BlockzapperUpgradeRecipe.java +++ /dev/null @@ -1,134 +0,0 @@ -package com.simibubi.create.content.curiosities.zapper.blockzapper; - -import com.google.gson.JsonObject; -import com.simibubi.create.AllItems; -import com.simibubi.create.AllRecipeTypes; -import com.simibubi.create.content.curiosities.zapper.blockzapper.BlockzapperItem.ComponentTier; -import com.simibubi.create.content.curiosities.zapper.blockzapper.BlockzapperItem.Components; - -import net.minecraft.inventory.CraftingInventory; -import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.ICraftingRecipe; -import net.minecraft.item.crafting.IRecipeSerializer; -import net.minecraft.item.crafting.Ingredient; -import net.minecraft.item.crafting.ShapedRecipe; -import net.minecraft.network.PacketBuffer; -import net.minecraft.util.JSONUtils; -import net.minecraft.util.NonNullList; -import net.minecraft.util.ResourceLocation; -import net.minecraft.world.World; -import net.minecraftforge.registries.ForgeRegistryEntry; - -public class BlockzapperUpgradeRecipe implements ICraftingRecipe { - - private ShapedRecipe recipe; - private Components component; - private ComponentTier tier; - - public BlockzapperUpgradeRecipe(ShapedRecipe recipe, Components component, ComponentTier tier) { - this.recipe = recipe; - this.component = component; - this.tier = tier; - } - - @Override - public boolean matches(CraftingInventory inv, World worldIn) { - return getRecipe().matches(inv, worldIn); - } - - @Override - public NonNullList getIngredients() { - return recipe.getIngredients(); - } - - @Override - public ItemStack getCraftingResult(CraftingInventory inv) { - for (int slot = 0; slot < inv.getSizeInventory(); slot++) { - ItemStack handgun = inv.getStackInSlot(slot).copy(); - if (!AllItems.BLOCKZAPPER.isIn(handgun)) - continue; - BlockzapperItem.setTier(getUpgradedComponent(), getTier(), handgun); - return handgun; - } - return ItemStack.EMPTY; - } - - @Override - public ItemStack getRecipeOutput() { - ItemStack handgun = new ItemStack(AllItems.BLOCKZAPPER.get()); - BlockzapperItem.setTier(getUpgradedComponent(), getTier(), handgun); - return handgun; - } - - @Override - public boolean isDynamic() { - return true; - } - - @Override - public ResourceLocation getId() { - return getRecipe().getId(); - } - -// @Override -// public IRecipeType getType() { -// return AllRecipes.Types.BLOCKZAPPER_UPGRADE; -// } - - @Override - public IRecipeSerializer getSerializer() { - return AllRecipeTypes.BLOCKZAPPER_UPGRADE.serializer; - } - - public static class Serializer extends ForgeRegistryEntry> implements IRecipeSerializer { - - @Override - public BlockzapperUpgradeRecipe read(ResourceLocation recipeId, JsonObject json) { - ShapedRecipe recipe = IRecipeSerializer.CRAFTING_SHAPED.read(recipeId, json); - - Components component = Components.valueOf(JSONUtils.getString(json, "component")); - ComponentTier tier = ComponentTier.valueOf(JSONUtils.getString(json, "tier")); - return new BlockzapperUpgradeRecipe(recipe, component, tier); - } - - @Override - public BlockzapperUpgradeRecipe read(ResourceLocation recipeId, PacketBuffer buffer) { - ShapedRecipe recipe = IRecipeSerializer.CRAFTING_SHAPED.read(recipeId, buffer); - - Components component = Components.valueOf(buffer.readString(buffer.readInt())); - ComponentTier tier = ComponentTier.valueOf(buffer.readString(buffer.readInt())); - return new BlockzapperUpgradeRecipe(recipe, component, tier); - } - - @Override - public void write(PacketBuffer buffer, BlockzapperUpgradeRecipe recipe) { - IRecipeSerializer.CRAFTING_SHAPED.write(buffer, recipe.getRecipe()); - - String name = recipe.getUpgradedComponent().name(); - String name2 = recipe.getTier().name(); - buffer.writeInt(name.length()); - buffer.writeString(name); - buffer.writeInt(name2.length()); - buffer.writeString(name2); - } - - } - - @Override - public boolean canFit(int width, int height) { - return getRecipe().canFit(width, height); - } - - public ShapedRecipe getRecipe() { - return recipe; - } - - public Components getUpgradedComponent() { - return component; - } - - public ComponentTier getTier() { - return tier; - } - -} diff --git a/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/Brush.java b/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/Brush.java index f2cb47c88..8ff5ac568 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/Brush.java +++ b/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/Brush.java @@ -1,6 +1,6 @@ package com.simibubi.create.content.curiosities.zapper.terrainzapper; -import java.util.List; +import java.util.Collection; import com.simibubi.create.foundation.utility.Lang; @@ -8,6 +8,7 @@ import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.vector.Vector3d; import net.minecraft.util.text.ITextComponent; +import net.minecraft.world.IWorld; public abstract class Brush { @@ -26,6 +27,22 @@ public abstract class Brush { this.param2 = param2; } + public TerrainTools[] getSupportedTools() { + return TerrainTools.values(); + } + + public TerrainTools redirectTool(TerrainTools tool) { + return tool; + } + + public boolean hasPlacementOptions() { + return true; + } + + public boolean hasConnectivityOptions() { + return false; + } + int getMax(int paramIndex) { return Integer.MAX_VALUE; } @@ -36,7 +53,7 @@ public abstract class Brush { ITextComponent getParamLabel(int paramIndex) { return Lang - .translate(paramIndex == 0 ? "generic.width" : paramIndex == 1 ? "generic.height" : "generic.length"); + .translate(paramIndex == 0 ? "generic.width" : paramIndex == 1 ? "generic.height" : "generic.length"); } public int get(int paramIndex) { @@ -47,6 +64,7 @@ public abstract class Brush { return BlockPos.ZERO; } - abstract List getIncludedPositions(); + public abstract Collection addToGlobalPositions(IWorld world, BlockPos targetPos, Direction targetFace, + Collection affectedPositions, TerrainTools usedTool); } diff --git a/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/CuboidBrush.java b/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/CuboidBrush.java index 67e0f82c3..af409cc5a 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/CuboidBrush.java +++ b/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/CuboidBrush.java @@ -9,7 +9,7 @@ import net.minecraft.util.Direction.AxisDirection; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.vector.Vector3d; -public class CuboidBrush extends Brush { +public class CuboidBrush extends ShapedBrush { public static final int MAX_SIZE = 32; private List positions; diff --git a/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/CylinderBrush.java b/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/CylinderBrush.java index c2b7beb19..0ec8b4f99 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/CylinderBrush.java +++ b/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/CylinderBrush.java @@ -17,7 +17,7 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.vector.Vector3d; import net.minecraft.util.text.ITextComponent; -public class CylinderBrush extends Brush { +public class CylinderBrush extends ShapedBrush { public static final int MAX_RADIUS = 8; public static final int MAX_HEIGHT = 8; diff --git a/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/DynamicBrush.java b/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/DynamicBrush.java new file mode 100644 index 000000000..5305a65e5 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/DynamicBrush.java @@ -0,0 +1,147 @@ +package com.simibubi.create.content.curiosities.zapper.terrainzapper; + +import java.util.Collection; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import java.util.Set; + +import com.simibubi.create.foundation.utility.BlockHelper; +import com.simibubi.create.foundation.utility.Lang; + +import net.minecraft.block.BlockState; +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.world.IWorld; + +public class DynamicBrush extends Brush { + + public static final int MAX_RADIUS = 10; + + private boolean surface; + + public DynamicBrush(boolean surface) { + super(1); + this.surface = surface; + } + + ITextComponent getParamLabel(int paramIndex) { + return Lang.translate("generic.range"); + } + + @Override + public TerrainTools[] getSupportedTools() { + return surface ? new TerrainTools[] { TerrainTools.Overlay, TerrainTools.Replace, TerrainTools.Clear } + : new TerrainTools[] { TerrainTools.Replace, TerrainTools.Clear }; + } + + @Override + public boolean hasPlacementOptions() { + return false; + } + + @Override + public boolean hasConnectivityOptions() { + return true; + } + + @Override + int getMax(int paramIndex) { + return MAX_RADIUS; + } + + @Override + int getMin(int paramIndex) { + return 1; + } + + @Override + public TerrainTools redirectTool(TerrainTools tool) { + if (tool == TerrainTools.Overlay) + return TerrainTools.Place; + return super.redirectTool(tool); + } + + @Override + public Collection addToGlobalPositions(IWorld world, BlockPos targetPos, Direction targetFace, + Collection affectedPositions, TerrainTools usedTool) { + + boolean searchDiagonals = param1 == 0; + boolean fuzzy = param2 == 0; + boolean replace = usedTool != TerrainTools.Overlay; + int searchRange = param0; + + Set visited = new HashSet<>(); + List frontier = new LinkedList<>(); + + BlockState state = world.getBlockState(targetPos); + List offsets = new LinkedList<>(); + + for (int x = -1; x <= 1; x++) + for (int y = -1; y <= 1; y++) + for (int z = -1; z <= 1; z++) + if (Math.abs(x) + Math.abs(y) + Math.abs(z) < 2 || searchDiagonals) + if (targetFace.getAxis() + .getCoordinate(x, y, z) == 0 || !surface) + offsets.add(new BlockPos(x, y, z)); + + BlockPos startPos = replace ? targetPos : targetPos.offset(targetFace); + frontier.add(startPos); + + while (!frontier.isEmpty()) { + BlockPos currentPos = frontier.remove(0); + if (visited.contains(currentPos)) + continue; + visited.add(currentPos); + if (!currentPos.withinDistance(startPos, searchRange)) + continue; + + // Replace Mode + if (replace) { + BlockState stateToReplace = world.getBlockState(currentPos); + BlockState stateAboveStateToReplace = world.getBlockState(currentPos.offset(targetFace)); + + // Criteria + if (stateToReplace.getBlockHardness(world, currentPos) == -1) + continue; + if (stateToReplace.getBlock() != state.getBlock() && !fuzzy) + continue; + if (stateToReplace.getMaterial() + .isReplaceable()) + continue; + if (BlockHelper.hasBlockSolidSide(stateAboveStateToReplace, world, currentPos.offset(targetFace), + targetFace.getOpposite()) && surface) + continue; + affectedPositions.add(currentPos); + + // Search adjacent spaces + for (BlockPos offset : offsets) + frontier.add(currentPos.add(offset)); + continue; + } + + // Place Mode + BlockState stateToPlaceAt = world.getBlockState(currentPos); + BlockState stateToPlaceOn = world.getBlockState(currentPos.offset(targetFace.getOpposite())); + + // Criteria + if (stateToPlaceOn.getMaterial() + .isReplaceable()) + continue; + if (stateToPlaceOn.getBlock() != state.getBlock() && !fuzzy) + continue; + if (!stateToPlaceAt.getMaterial() + .isReplaceable()) + continue; + affectedPositions.add(currentPos); + + // Search adjacent spaces + for (BlockPos offset : offsets) + frontier.add(currentPos.add(offset)); + continue; + } + + return affectedPositions; + } +} diff --git a/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/ShapedBrush.java b/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/ShapedBrush.java new file mode 100644 index 000000000..f0e67f3c2 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/ShapedBrush.java @@ -0,0 +1,29 @@ +package com.simibubi.create.content.curiosities.zapper.terrainzapper; + +import java.util.Collection; +import java.util.List; + +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.IWorld; + +public abstract class ShapedBrush extends Brush { + + public ShapedBrush(int amtParams) { + super(amtParams); + } + + @Override + public Collection addToGlobalPositions(IWorld world, BlockPos targetPos, Direction targetFace, + Collection affectedPositions, TerrainTools usedTool) { + List includedPositions = getIncludedPositions(); + if (includedPositions == null) + return affectedPositions; + for (BlockPos blockPos : includedPositions) + affectedPositions.add(targetPos.add(blockPos)); + return affectedPositions; + } + + abstract List getIncludedPositions(); + +} diff --git a/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/SphereBrush.java b/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/SphereBrush.java index b7865c5ac..be7657398 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/SphereBrush.java +++ b/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/SphereBrush.java @@ -13,7 +13,7 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.vector.Vector3d; import net.minecraft.util.text.ITextComponent; -public class SphereBrush extends Brush { +public class SphereBrush extends ShapedBrush { public static final int MAX_RADIUS = 10; private Map> cachedBrushes; diff --git a/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/TerrainBrushes.java b/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/TerrainBrushes.java index 0088d025d..fa11468b6 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/TerrainBrushes.java +++ b/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/TerrainBrushes.java @@ -5,6 +5,8 @@ public enum TerrainBrushes { Cuboid(new CuboidBrush()), Sphere(new SphereBrush()), Cylinder(new CylinderBrush()), + Surface(new DynamicBrush(true)), + Cluster(new DynamicBrush(false)), ; @@ -15,10 +17,6 @@ public enum TerrainBrushes { } public Brush get() { -// if (this == Cylinder) -// brush = new CylinderBrush(); -// if (this == Sphere) -// brush = new SphereBrush(); return brush; } diff --git a/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/TerrainTools.java b/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/TerrainTools.java index 3abb7fe27..43ba4e9f5 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/TerrainTools.java +++ b/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/TerrainTools.java @@ -23,8 +23,10 @@ public enum TerrainTools { Replace(AllIcons.I_REPLACE), Clear(AllIcons.I_CLEAR), Overlay(AllIcons.I_OVERLAY), - Flatten(AllIcons.I_FLATTEN); + Flatten(AllIcons.I_FLATTEN), + ; + public String translationKey; public AllIcons icon; diff --git a/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/WorldshaperItem.java b/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/WorldshaperItem.java index 4e5df7686..86d74a5c6 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/WorldshaperItem.java +++ b/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/WorldshaperItem.java @@ -74,10 +74,10 @@ public class WorldshaperItem extends ZapperItem { brush.set(params.getX(), params.getY(), params.getZ()); targetPos = targetPos.add(brush.getOffset(player.getLookVec(), raytrace.getFace(), option)); - for (BlockPos blockPos : brush.getIncludedPositions()) - affectedPositions.add(targetPos.add(blockPos)); + brush.addToGlobalPositions(world, targetPos, raytrace.getFace(), affectedPositions, tool); PlacementPatterns.applyPattern(affectedPositions, stack); - tool.run(world, affectedPositions, raytrace.getFace(), stateToUse, data, player); + brush.redirectTool(tool) + .run(world, affectedPositions, raytrace.getFace(), stateToUse, data, player); return true; } diff --git a/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/WorldshaperRenderHandler.java b/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/WorldshaperRenderHandler.java index 30566128b..9edd53a8d 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/WorldshaperRenderHandler.java +++ b/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/WorldshaperRenderHandler.java @@ -1,7 +1,8 @@ package com.simibubi.create.content.curiosities.zapper.terrainzapper; -import java.util.List; -import java.util.stream.Collectors; +import java.util.ArrayList; +import java.util.Collection; +import java.util.function.Supplier; import com.simibubi.create.AllItems; import com.simibubi.create.AllSpecialTextures; @@ -23,18 +24,16 @@ import net.minecraft.util.math.vector.Vector3d; public class WorldshaperRenderHandler { - private static List renderedShape; - private static BlockPos renderedPosition; + private static Supplier> renderedPositions; public static void tick() { gatherSelectedBlocks(); - if (renderedPosition == null) + if (renderedPositions == null) return; - CreateClient.outliner.showCluster("terrainZapper", renderedShape.stream() - .map(pos -> pos.add(renderedPosition)) - .collect(Collectors.toList())) + CreateClient.outliner.showCluster("terrainZapper", renderedPositions.get()) .colored(0xbfbfbf) + .disableNormals() .lineWidth(1 / 32f) .withFaceTexture(AllSpecialTextures.CHECKERED); } @@ -60,21 +59,21 @@ public class WorldshaperRenderHandler { return; } - renderedPosition = null; + renderedPositions = null; } public static void createBrushOutline(CompoundNBT tag, ClientPlayerEntity player, ItemStack zapper) { if (!tag.contains("BrushParams")) { - renderedPosition = null; + renderedPositions = null; return; } Brush brush = NBTHelper.readEnum(tag, "Brush", TerrainBrushes.class) .get(); PlacementOptions placement = NBTHelper.readEnum(tag, "Placement", PlacementOptions.class); + TerrainTools tool = NBTHelper.readEnum(tag, "Tool", TerrainTools.class); BlockPos params = NBTUtil.readBlockPos(tag.getCompound("BrushParams")); brush.set(params.getX(), params.getY(), params.getZ()); - renderedShape = brush.getIncludedPositions(); Vector3d start = player.getPositionVec() .add(0, player.getEyeHeight(), 0); @@ -83,12 +82,14 @@ public class WorldshaperRenderHandler { BlockRayTraceResult raytrace = player.world .rayTraceBlocks(new RayTraceContext(start, start.add(range), BlockMode.OUTLINE, FluidMode.NONE, player)); if (raytrace == null || raytrace.getType() == Type.MISS) { - renderedPosition = null; + renderedPositions = null; return; } - BlockPos pos = raytrace.getPos(); - renderedPosition = pos.add(brush.getOffset(player.getLookVec(), raytrace.getFace(), placement)); + BlockPos pos = raytrace.getPos() + .add(brush.getOffset(player.getLookVec(), raytrace.getFace(), placement)); + renderedPositions = + () -> brush.addToGlobalPositions(player.world, pos, raytrace.getFace(), new ArrayList<>(), tool); } } diff --git a/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/WorldshaperScreen.java b/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/WorldshaperScreen.java index 5a7c70d7f..6937f719d 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/WorldshaperScreen.java +++ b/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/WorldshaperScreen.java @@ -6,7 +6,10 @@ import java.util.Vector; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.content.curiosities.zapper.ZapperScreen; import com.simibubi.create.foundation.gui.AllGuiTextures; +import com.simibubi.create.foundation.gui.AllIcons; import com.simibubi.create.foundation.gui.widgets.IconButton; +import com.simibubi.create.foundation.gui.widgets.Indicator; +import com.simibubi.create.foundation.gui.widgets.Indicator.State; import com.simibubi.create.foundation.gui.widgets.Label; import com.simibubi.create.foundation.gui.widgets.ScrollInput; import com.simibubi.create.foundation.gui.widgets.SelectionScrollInput; @@ -26,7 +29,7 @@ public class WorldshaperScreen extends ZapperScreen { protected final ITextComponent placementSection = Lang.translate("gui.terrainzapper.placement"); protected final ITextComponent toolSection = Lang.translate("gui.terrainzapper.tool"); protected final List brushOptions = - Lang.translatedOptions("gui.terrainzapper.brush", "cuboid", "sphere", "cylinder"); + Lang.translatedOptions("gui.terrainzapper.brush", "cuboid", "sphere", "cylinder", "surface", "cluster"); protected Vector toolButtons; protected Vector placementButtons; @@ -35,6 +38,11 @@ public class WorldshaperScreen extends ZapperScreen { protected Label brushLabel; protected Vector brushParams; protected Vector