Merge branch 'mc1.18/dev' into mc1.18/global-railways

This commit is contained in:
simibubi 2022-03-23 19:45:40 +01:00
commit 9db9c3f710
183 changed files with 4429 additions and 3570 deletions

View file

@ -49,6 +49,8 @@ body:
label: Mod Version
description: The version of the mod you were using when the bug occured
options:
- "0.4.0f"
- "0.4.0e"
- "0.4.0d"
- "0.4.0c"
- "0.4.0b"

View file

@ -48,8 +48,6 @@ minecraft {
arg '-mixin.config=flywheel.mixins.json'
//jvmArgs '-XX:+UnlockCommercialFeatures' // uncomment for profiling
property 'forge.logging.console.level', 'info'
property 'mixin.env.remapRefMap', 'true'
property 'mixin.env.refMapRemappingFile', "${projectDir}/build/createSrgToMcp/output.srg"
mods {
create {
source sourceSets.main
@ -67,8 +65,6 @@ minecraft {
workingDirectory project.file('run/server')
arg '-mixin.config=create.mixins.json'
property 'forge.logging.console.level', 'info'
property 'mixin.env.remapRefMap', 'true'
property 'mixin.env.refMapRemappingFile', "${projectDir}/build/createSrgToMcp/output.srg"
mods {
create {
source sourceSets.main
@ -80,8 +76,6 @@ minecraft {
workingDirectory project.file('run')
property 'forge.logging.markers', 'REGISTRIES,REGISTRYDUMP'
property 'forge.logging.console.level', 'debug'
property 'mixin.env.remapRefMap', 'true'
property 'mixin.env.refMapRemappingFile', "${projectDir}/build/createSrgToMcp/output.srg"
args '--mod', 'create', '--all', '--output', file('src/generated/resources/'), '--existing', file('src/main/resources')
mods {
create {

View file

@ -4,9 +4,9 @@ org.gradle.jvmargs = -Xmx3G
org.gradle.daemon = false
# mod version info
mod_version = 0.4d
minecraft_version = 1.18.1
forge_version = 39.0.59
mod_version = 0.4.1
minecraft_version = 1.18.2
forge_version = 40.0.19
# build dependency versions
forgegradle_version = 5.1.+
@ -15,13 +15,13 @@ mixin_version = 0.8.5
librarian_version = 1.+
shadow_version = 7.1.0
cursegradle_version = 1.4.0
parchment_version = 2022.01.23
parchment_version = 2022.03.13
# dependency versions
registrate_version = MC1.18-1.0.21
flywheel_version = 1.18-0.6.1.62
jei_minecraft_version = 1.18.1
jei_version = 9.3.2.92
registrate_version = MC1.18.2-1.0.24
flywheel_version = 1.18-0.6.2.64
jei_minecraft_version = 1.18.2
jei_version = 9.5.3.143
# curseforge information
projectId = 328085

Binary file not shown.

View file

@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.1-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.1-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

10
gradlew vendored
View file

@ -1,7 +1,7 @@
#!/bin/sh
#
# Copyright © 2015-2021 the original authors.
# Copyright © 2015-2021 the original authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@ -32,10 +32,10 @@
# Busybox and similar reduced shells will NOT work, because this script
# requires all of these POSIX shell features:
# * functions;
# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
# * compound commands having a testable exit status, especially «case»;
# * various built-in commands including «command», «set», and «ulimit».
# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
# * compound commands having a testable exit status, especially «case»;
# * various built-in commands including «command», «set», and «ulimit».
#
# Important for patching:
#

View file

@ -540,22 +540,22 @@ bf2b0310500213ff853c748c236eb5d01f61658e assets/create/blockstates/yellow_toolbo
6801fa1f466f172700e573e5b8ee8ee5f9ca4583 assets/create/blockstates/yellow_valve_handle.json
7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json
b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json
255e47ab7894ba35851a2f34c82be3dc9c9e8784 assets/create/lang/en_ud.json
e6698e4672c04cf7b8251e2267b1fe3d6c60e50c assets/create/lang/en_us.json
dfd5234276f508edfb10160fa2b7859363acc313 assets/create/lang/unfinished/de_de.json
c23ca905e7aa9983057c970d9e799b4ba91a9acd assets/create/lang/unfinished/es_cl.json
1781ed3854e04116319528699b4edee9cff4a435 assets/create/lang/unfinished/es_es.json
24d421795a67a19efd3a092b693c2397b3b84d9b assets/create/lang/unfinished/fr_fr.json
50107fc09f422527f20b0a2ddee7e961540e4f6c assets/create/lang/unfinished/it_it.json
570cc561fcb7f1839212e7ba3e1a68886874c846 assets/create/lang/unfinished/ja_jp.json
f5ddd8b98314636c4c763cdd8aee7acd462b00a9 assets/create/lang/unfinished/ko_kr.json
f3696cf3bfcdff92eb11882be9be9fa2759c51c6 assets/create/lang/unfinished/nl_nl.json
3df68a7b3fb44dd666de541d7437c300d596aa7b assets/create/lang/unfinished/pl_pl.json
6a7fb1146f15117abca1a0ea970ab4054a1ee6a7 assets/create/lang/unfinished/pt_br.json
6e993c9e6f5faa55448a8b24456082096cb10935 assets/create/lang/unfinished/pt_pt.json
d8fc231286d4a53e249037905c92513857432c4c assets/create/lang/unfinished/ru_ru.json
3aedca5bf7cf2f08cb53d6e8b5949009cddc1843 assets/create/lang/unfinished/zh_cn.json
30f01dd054c4706d37f6d5ece0fc09ad241a6214 assets/create/lang/unfinished/zh_tw.json
03a6020bfac9e4f979252abc8a631e6aafaa6b8b assets/create/lang/en_ud.json
f30503db6d2841ebc7c59bf0a79b680a765613cd assets/create/lang/en_us.json
3730041212c67067395b57218f26a403a18016c9 assets/create/lang/unfinished/de_de.json
f1dd81b07e832b0f3187b2f52fdf3cdbea41fec1 assets/create/lang/unfinished/es_cl.json
afc637fd921e0f17ec2b70d93b7a474d347a6a18 assets/create/lang/unfinished/es_es.json
7258250074ffe3e50fe4803a2effe4f2b7a94c4e assets/create/lang/unfinished/fr_fr.json
91cd404b62a87dd820cc5602622c88c65a5d5dbb assets/create/lang/unfinished/it_it.json
7716adb1099e6b164d07390679b3a1b77397048e assets/create/lang/unfinished/ja_jp.json
4b2b3ff736dbbfc58803432463e11850d651e631 assets/create/lang/unfinished/ko_kr.json
23ec8c0fbb3d82e92397ef5857b2f57e2f72ae40 assets/create/lang/unfinished/nl_nl.json
e8ef3db7b90bbc2a91bd104228c81b54bca638e7 assets/create/lang/unfinished/pl_pl.json
0213870418b26af7f67c794973144594918fa114 assets/create/lang/unfinished/pt_br.json
c0fccd4886228185a61af35535f3a92944d64c98 assets/create/lang/unfinished/pt_pt.json
2cf778412184edac79cf457adb57f68475d7bcf0 assets/create/lang/unfinished/ru_ru.json
feab3d65b3b95ecb6730d5d45fd672e4e2545ee3 assets/create/lang/unfinished/zh_cn.json
eee611a3eecfa457050d522195f76e95a35dca81 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
@ -1630,6 +1630,7 @@ dcb09deae110077bcddf090996b51cc66e9a7de3 assets/create/models/item/cogwheel.json
9dbd63c9e1b09a663fd4b83d76e3ab5967086167 assets/create/models/item/controller_rail.json
9a93b3ccef02cd0abd8106edec954dc0f2269229 assets/create/models/item/controls.json
10397036fc0bb1e18a767cfd7b19b10d805a83fe assets/create/models/item/copper_backtank.json
3652f8f7b454940050f090ab32d38e04b93e14f8 assets/create/models/item/copper_backtank_placeable.json
759bcb5fe7dfdd628716f9b4ff19a5ab00393381 assets/create/models/item/copper_casing.json
751324b03f657f4166460eb10a64dae47cb97bd4 assets/create/models/item/copper_nugget.json
177dafb51d70c55ec62036332868efed4e01f353 assets/create/models/item/copper_sheet.json
@ -2143,7 +2144,7 @@ d080b1b25e5bc8baf5aee68691b08c7f12ece3b0 assets/create/models/item/windmill_bear
a80fb25a0b655e76be986b5b49fcb0f03461a1ab assets/create/models/item/zinc_nugget.json
b1689617190c05ef34bd18456b0c7ae09bb3210f assets/create/models/item/zinc_ore.json
5049f72c327a88f175f6f9425909e098fc711100 assets/create/sounds.json
5d0cc4c0255dc241e61c173b31ddca70c88d08e4 data/create/advancements/aesthetics.json
0f1b4b980afba9bf2caf583b88e261bba8b10313 data/create/advancements/aesthetics.json
613e64b44bed959da899fdd54c1cacb227fb33f2 data/create/advancements/andesite_alloy.json
81885c6bfb85792c88aaa7c9b70f58832945d31f data/create/advancements/andesite_casing.json
83c046bd200623933545c9e4326f782fb02c87fa data/create/advancements/arm_blaze_burner.json
@ -3357,7 +3358,6 @@ c633372228a13023f9dde2cd3478a7dc90affcea data/create/loot_tables/blocks/crimsite
62800d2baf79e7a45b246896f2679fd6f5082efe data/create/loot_tables/blocks/crimson_window.json
572dfdf4daaaf2c97882f3b2a856737365bf5873 data/create/loot_tables/blocks/crimson_window_pane.json
3503b55a82b94ddaeebbc510eece2cc313c33e43 data/create/loot_tables/blocks/crushing_wheel.json
5c1df8443043b3fe3b665dba348e2ff188bcbe31 data/create/loot_tables/blocks/crushing_wheel_controller.json
252a6476bd2dd730dd97afbf2c69d9627f0d1672 data/create/loot_tables/blocks/cuckoo_clock.json
838c008dc2881fbb4136773b3c84c3d988483f73 data/create/loot_tables/blocks/cut_andesite.json
accd5aecce569330b1821d12f031a68259a42f27 data/create/loot_tables/blocks/cut_andesite_brick_slab.json
@ -5216,13 +5216,16 @@ ac265a674626e0e832330086fd18fe0be37fc327 data/create/recipes/weathered_copper_ti
10781e8cfcbb3486327aace3aa00e437fb44b331 data/create/tags/blocks/ore_override_stone.json
197ed7ee3b284045c005011d28c38ac5b2e44d8c data/create/tags/blocks/passive_boiler_heaters.json
557a29a61145b0f266760ef06256188a296739a7 data/create/tags/blocks/safe_nbt.json
c9ac7e3e5ec18554e7184168d65e9b8e44ef5610 data/create/tags/blocks/sails.json
6cdeeac1689f7b5bfd9bc40b462143d8eaf3ad0b data/create/tags/blocks/seats.json
d063e12c9ef75f39518c6d129ea35d833464d547 data/create/tags/blocks/toolboxes.json
50936b211d94167a35ec78c89954082a336b6269 data/create/tags/blocks/valve_handles.json
eac71740fb12bdb38b5dfaa2268613d7ba82b809 data/create/tags/blocks/windmill_sails.json
74700d556ca80c7a1db5fd4efb09c3ddb26cad66 data/create/tags/blocks/windowable.json
893a01e6004d6d8272bd1658e98da88bb572ee57 data/create/tags/blocks/wrench_pickup.json
a8bdc387cfa6296ebcc4af14323e2ddb632234dc data/create/tags/fluids/bottomless/allow.json
74700d556ca80c7a1db5fd4efb09c3ddb26cad66 data/create/tags/fluids/bottomless/deny.json
74700d556ca80c7a1db5fd4efb09c3ddb26cad66 data/create/tags/items/blaze_burner_fuel/regular.json
97061ef67cac1fafd869493d06115b968bcb99bf data/create/tags/items/blaze_burner_fuel/special.json
5212172aee2239136c94f9868ad39ec2e17cf1c6 data/create/tags/items/create_ingots.json
4480f211f4a37bfee193eba945bc9f5a8d2c6e34 data/create/tags/items/crushed_ores.json
bce28787b0271382842823d04a977912a88b01c2 data/create/tags/items/sandpaper.json

View file

@ -570,6 +570,7 @@
"item.create.chromatic_compound": "punod\u026Fo\u0186 \u0254\u0131\u0287\u0250\u026Fo\u0279\u0265\u0186",
"item.create.cinder_flour": "\u0279no\u05DF\u2132 \u0279\u01DDpu\u0131\u0186",
"item.create.copper_backtank": "\u029Eu\u0250\u0287\u029E\u0254\u0250\u15FA \u0279\u01DDddo\u0186",
"item.create.copper_backtank_placeable": "\u01DD\u05DFq\u0250\u01DD\u0254\u0250\u05DF\u0500 \u029Eu\u0250\u0287\u029E\u0254\u0250\u15FA \u0279\u01DDddo\u0186",
"item.create.copper_nugget": "\u0287\u01DDbbnN \u0279\u01DDddo\u0186",
"item.create.copper_sheet": "\u0287\u01DD\u01DD\u0265S \u0279\u01DDddo\u0186",
"item.create.crafter_slot_cover": "\u0279\u01DD\u028Co\u0186 \u0287o\u05DFS \u0279\u01DD\u0287\u025F\u0250\u0279\u0186",

View file

@ -577,6 +577,7 @@
"item.create.chromatic_compound": "Chromatic Compound",
"item.create.cinder_flour": "Cinder Flour",
"item.create.copper_backtank": "Copper Backtank",
"item.create.copper_backtank_placeable": "Copper Backtank Placeable",
"item.create.copper_nugget": "Copper Nugget",
"item.create.copper_sheet": "Copper Sheet",
"item.create.crafter_slot_cover": "Crafter Slot Cover",
@ -652,23 +653,23 @@
"advancement.create.its_alive": "It's Alive!",
"advancement.create.its_alive.desc": "Watch your first kinetic component spin.",
"advancement.create.shifting_gears": "Shifting Gears",
"advancement.create.shifting_gears.desc": "Connect a Large Cogwheel to a Small Cogwheel, allowing you to change the speed of your contraption.",
"advancement.create.shifting_gears.desc": "Connect a Large Cogwheel to a Small Cogwheel, allowing you to change the speed of your Contraption.",
"advancement.create.overstressed": "Overstressed",
"advancement.create.overstressed.desc": "Experience the limits of stress firsthand.",
"advancement.create.belt": "Kelp Drive",
"advancement.create.belt.desc": "Connect two shafts with a Mechanical Belt.",
"advancement.create.tunnel": "Take cover!",
"advancement.create.tunnel.desc": "Embellish your mechanical belt with a Tunnel.",
"advancement.create.tunnel": "Take Cover!",
"advancement.create.tunnel.desc": "Embellish your Mechanical Belt with a Tunnel.",
"advancement.create.splitter_tunnel": "Divide and Conquer",
"advancement.create.splitter_tunnel.desc": "Create a splitter with a group of Brass Tunnels.",
"advancement.create.chute": "Tumbling down",
"advancement.create.chute.desc": "Place a chute, the vertical counterpart of the belt.",
"advancement.create.chute": "Tumbling Down",
"advancement.create.chute.desc": "Place a Chute, the vertical counterpart of the Belt.",
"advancement.create.upward_chute": "Aerial Abduction",
"advancement.create.upward_chute.desc": "Watch a thrown item fly up into a fan-powered chute.",
"advancement.create.upward_chute.desc": "Watch a thrown item fly up into a Fan-powered Chute.",
"advancement.create.belt_funnel": "Funnels' Flappy Danglers",
"advancement.create.belt_funnel.desc": "Place a sideways funnel on top of a belt or depot to create a special type.",
"advancement.create.belt_funnel.desc": "Place a sideways Funnel on top of a Belt or Depot to create a special type.",
"advancement.create.belt_funnel_kiss": "The Parrots and the Flaps",
"advancement.create.belt_funnel_kiss.desc": "Make two belt mounted funnels kiss.",
"advancement.create.belt_funnel_kiss.desc": "Make two Belt-mounted Funnels kiss.",
"advancement.create.fan": "Mechanical Airbender",
"advancement.create.fan.desc": "Ride the stream of air provided by an Encased Fan.",
"advancement.create.fan_lava": "Geothermal Space Heater",
@ -676,32 +677,32 @@
"advancement.create.fan_water": "Wacky Washing",
"advancement.create.fan_water.desc": "Get caught in a stream of air that washes things.",
"advancement.create.fan_smoke": "Mechanical Bellows",
"advancement.create.fan_smoke.desc": "Get caught in a stream of air that smokes items.",
"advancement.create.fan_smoke.desc": "Get caught in a stream of air that smokes things.",
"advancement.create.wrench": "Configure Conveniently",
"advancement.create.wrench.desc": "Create a Wrench to aid you in building your contraptions.",
"advancement.create.wrench.desc": "Create a Wrench to aid you in building your Contraptions.",
"advancement.create.goggles": "Stress-O-Vision",
"advancement.create.goggles.desc": "Create some Engineer's Goggles to aid you in getting more kinetic information from components.",
"advancement.create.speedometer": "But How Fast Exactly?",
"advancement.create.speedometer.desc": "Place and power a Speedometer. Look at it through your goggles to read its exact value.",
"advancement.create.speedometer.desc": "Place and power a Speedometer. Look at it through your Goggles to read its exact value.",
"advancement.create.stressometer": "But How Stressed Exactly?",
"advancement.create.stressometer.desc": "Place and power a Stressometer. Look at it through your goggles to read its exact value.",
"advancement.create.stressometer.desc": "Place and power a Stressometer. Look at it through your Goggles to read its exact value.",
"advancement.create.aesthetics": "Boom, Aesthetics!",
"advancement.create.aesthetics.desc": "Place brackets on a shaft, pipe and cogwheel.",
"advancement.create.aesthetics.desc": "Place Brackets on a Shaft, Pipe, and Cogwheel.",
"advancement.create.reinforced": "Boom, Reinforced!",
"advancement.create.reinforced.desc": "Use fitting casing blocks on a shaft, pipe and mechanical belt.",
"advancement.create.reinforced.desc": "Use fitting Casing blocks on a Shaft, Pipe, and Mechanical Belt.",
"advancement.create.water_wheel": "Harnessing Hydraulics",
"advancement.create.water_wheel.desc": "Place a Water Wheel and try getting it to spin!",
"advancement.create.chocolate_wheel": "Tasteful power",
"advancement.create.chocolate_wheel.desc": "Run a Water Wheel with molten Chocolate.",
"advancement.create.chocolate_wheel": "Tasteful Power",
"advancement.create.chocolate_wheel.desc": "Run a Water Wheel with Molten Chocolate.",
"advancement.create.lava_wheel": "Magma Wheel",
"advancement.create.lava_wheel.desc": "This shouldn't have worked.",
"advancement.create.cuckoo": "Is it time?",
"advancement.create.cuckoo.desc": "Witness a cuckhoo clock announce bedtime.",
"advancement.create.cuckoo": "Is It Time?",
"advancement.create.cuckoo.desc": "Witness a Cuckoo Clock announce bedtime.",
"advancement.create.millstone": "Pocket Crusher",
"advancement.create.millstone.desc": "Place and power a Millstone.",
"advancement.create.windmill": "A mild Breeze",
"advancement.create.windmill": "A Mild Breeze",
"advancement.create.windmill.desc": "Assemble a windmill.",
"advancement.create.maxed_windmill": "A strong breeze",
"advancement.create.maxed_windmill": "A Strong Breeze",
"advancement.create.maxed_windmill.desc": "Assemble a windmill of maximum strength.",
"advancement.create.andesite_casing": "The Andesite Age",
"advancement.create.andesite_casing.desc": "Use some Andesite Alloy and Wood to create a basic Casing.",
@ -719,7 +720,7 @@
"advancement.create.basin.desc": "Place a Basin and try throwing items into it.",
"advancement.create.mixer": "Mixin' It Up",
"advancement.create.mixer.desc": "Place a Mechanical Mixer above the Basin, power it, and start mixing some ingredients.",
"advancement.create.blaze_burner": "A living Fireplace",
"advancement.create.blaze_burner": "A Living Fireplace",
"advancement.create.blaze_burner.desc": "Obtain a Blaze Burner.",
"advancement.create.compact": "Automated Compacting",
"advancement.create.compact.desc": "Use a Press and a Basin to compact some items.",
@ -730,42 +731,42 @@
"advancement.create.copper_casing": "The Copper Age",
"advancement.create.copper_casing.desc": "Use some Copper Sheets and Wood to create some Copper Casings.",
"advancement.create.spout": "Sploosh",
"advancement.create.spout.desc": "Watch a fluid item being filled using a spout.",
"advancement.create.spout.desc": "Watch a fluid item being filled using a Spout.",
"advancement.create.spout_potion": "Global Brewery",
"advancement.create.spout_potion.desc": "Watch a spout fill a bottle with potion fluid.",
"advancement.create.chocolate": "A world of Imagination",
"advancement.create.chocolate.desc": "Obtain a bucket of Molten Chocolate.",
"advancement.create.spout_potion.desc": "Watch a Spout fill a Bottle with potion fluid.",
"advancement.create.chocolate": "A World of Imagination",
"advancement.create.chocolate.desc": "Obtain a Bucket of Molten Chocolate.",
"advancement.create.item_drain": "Tumble Draining",
"advancement.create.item_drain.desc": "Watch a fluid item being emptied by an item drain.",
"advancement.create.chained_item_drain": "Let it roll!",
"advancement.create.chained_item_drain.desc": "Watch an item roll across several chained item drains.",
"advancement.create.item_drain.desc": "Watch a fluid item being emptied by an Item Drain.",
"advancement.create.chained_item_drain": "Let It Roll!",
"advancement.create.chained_item_drain.desc": "Watch an item roll across several chained Item Drains.",
"advancement.create.glass_pipe": "Flow Spy",
"advancement.create.glass_pipe.desc": "Watch fluid propagate through a windowed fluid pipe. Straight fluid pipes become windowed when a wrench is used on them.",
"advancement.create.pipe_collision": "Never cross the Streams!",
"advancement.create.glass_pipe.desc": "Watch fluid propagate through a windowed Fluid Pipe. Straight Fluid Pipes become windowed when a Wrench is used on them.",
"advancement.create.pipe_collision": "Never Cross the Streams!",
"advancement.create.pipe_collision.desc": "Watch two fluids meet in your pipe network.",
"advancement.create.pipe_spill": "There's a leak!",
"advancement.create.pipe_spill.desc": "Watch an open end of a pipe take or place fluids into the world.",
"advancement.create.pipe_spill": "There's a Leak!",
"advancement.create.pipe_spill.desc": "Watch an open end of a Pipe take or place fluids into the world.",
"advancement.create.hose_pulley": "Industrial Spillage",
"advancement.create.hose_pulley.desc": "Lower a hose pulley and watch it drain or fill a body of fluid.",
"advancement.create.hose_pulley.desc": "Lower a Hose Pulley and watch it drain or fill a body of fluid.",
"advancement.create.infinite_water": "Draining the Ocean",
"advancement.create.infinite_water.desc": "Pump from a body of Water large enough to be considered Infinite.",
"advancement.create.infinite_water.desc": "Pump from a body of Water large enough to be considered infinite.",
"advancement.create.infinite_lava": "Draining the Planets' Core",
"advancement.create.infinite_lava.desc": "Pump from a body of Lava large enough to be considered Infinite.",
"advancement.create.infinite_lava.desc": "Pump from a body of Lava large enough to be considered infinite.",
"advancement.create.infinite_chocolate": "Drowning in Imagination",
"advancement.create.infinite_chocolate.desc": "Pump from a body of Molten Chocolate large enough to be considered Infinite.",
"advancement.create.infinite_chocolate.desc": "Pump from a body of Molten Chocolate large enough to be considered infinite.",
"advancement.create.crafter": "Automated Assembly",
"advancement.create.crafter.desc": "Place and power some Mechanical Crafters.",
"advancement.create.clockwork_bearing": "Contraption o'clock",
"advancement.create.clockwork_bearing.desc": "Assemble a Structure mounted on a Clockwork Bearing.",
"advancement.create.clockwork_bearing": "Contraption O'Clock",
"advancement.create.clockwork_bearing.desc": "Assemble a structure mounted on a Clockwork Bearing.",
"advancement.create.nixie_tube": "Signs of Style",
"advancement.create.nixie_tube.desc": "Obtain and place down a pair of Nixie Tubes.",
"advancement.create.deployer": "Poke, Place, and Attack",
"advancement.create.deployer.desc": "Place and power a Deployer, the perfect reflection of yourself.",
"advancement.create.speed_controller": "Engineers hate him!",
"advancement.create.speed_controller": "Engineers Hate Him!",
"advancement.create.speed_controller.desc": "Place a Rotation Speed Controller, the ultimate device for changing gear.",
"advancement.create.flywheel": "Heart of the Factory",
"advancement.create.flywheel.desc": "Successfully connect an engine to the Flywheel.",
"advancement.create.overstress_flywheel": "High levels of Stress",
"advancement.create.flywheel.desc": "Successfully connect a Furnace Engine to the Flywheel.",
"advancement.create.overstress_flywheel": "High Levels of Stress",
"advancement.create.overstress_flywheel.desc": "Overstress a Furnace Engine.",
"advancement.create.precision_mechanism": "Complex Curiosities",
"advancement.create.precision_mechanism.desc": "Assemble a Precision Mechanism.",
@ -782,7 +783,7 @@
"advancement.create.crushing_wheel": "A Pair of Giants",
"advancement.create.crushing_wheel.desc": "Create some Crushing Wheels to break down more materials more effectively.",
"advancement.create.blaze_cake": "Sugar Rush",
"advancement.create.blaze_cake.desc": "Bake your blaze burner a special cake.",
"advancement.create.blaze_cake.desc": "Bake your Blaze Burner a special cake.",
"advancement.create.wand_of_symmetry": "Radiant Mirrors",
"advancement.create.wand_of_symmetry.desc": "Craft a Staff of Symmetry.",
"advancement.create.extendo_grip": "Boioioing!",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 1438",
"_": "Missing Localizations: 1439",
"_": "->------------------------] Game Elements [------------------------<-",
@ -578,6 +578,7 @@
"item.create.chromatic_compound": "Chromatische Verbindung",
"item.create.cinder_flour": "Aschenmehl",
"item.create.copper_backtank": "UNLOCALIZED: Copper Backtank",
"item.create.copper_backtank_placeable": "UNLOCALIZED: Copper Backtank Placeable",
"item.create.copper_nugget": "Kupferklumpen",
"item.create.copper_sheet": "Kupferblech",
"item.create.crafter_slot_cover": "Handwerkseinheit Slot Abdeckung",
@ -756,17 +757,17 @@
"advancement.create.infinite_chocolate.desc": "Pumpe aus einem Schokoladenbecken, das groß genug ist, um als unendlich bezeichnet zu werden.",
"advancement.create.crafter": "Automatisierte Montage",
"advancement.create.crafter.desc": "Plaziere und aktiviere ein paar Mechanische Handwerkseinheiten.",
"advancement.create.clockwork_bearing": "UNLOCALIZED: Contraption o'clock",
"advancement.create.clockwork_bearing.desc": "UNLOCALIZED: Assemble a Structure mounted on a Clockwork Bearing.",
"advancement.create.clockwork_bearing": "UNLOCALIZED: Contraption O'Clock",
"advancement.create.clockwork_bearing.desc": "UNLOCALIZED: Assemble a structure mounted on a Clockwork Bearing.",
"advancement.create.nixie_tube": "UNLOCALIZED: Signs of Style",
"advancement.create.nixie_tube.desc": "UNLOCALIZED: Obtain and place down a pair of Nixie Tubes.",
"advancement.create.deployer": "UNLOCALIZED: Poke, Place, and Attack",
"advancement.create.deployer.desc": "UNLOCALIZED: Place and power a Deployer, the perfect reflection of yourself.",
"advancement.create.speed_controller": "UNLOCALIZED: Engineers hate him!",
"advancement.create.speed_controller": "UNLOCALIZED: Engineers Hate Him!",
"advancement.create.speed_controller.desc": "UNLOCALIZED: Place a Rotation Speed Controller, the ultimate device for changing gear.",
"advancement.create.flywheel": "UNLOCALIZED: Heart of the Factory",
"advancement.create.flywheel.desc": "UNLOCALIZED: Successfully connect an engine to the Flywheel.",
"advancement.create.overstress_flywheel": "UNLOCALIZED: High levels of Stress",
"advancement.create.flywheel.desc": "UNLOCALIZED: Successfully connect a Furnace Engine to the Flywheel.",
"advancement.create.overstress_flywheel": "UNLOCALIZED: High Levels of Stress",
"advancement.create.overstress_flywheel.desc": "UNLOCALIZED: Overstress a Furnace Engine.",
"advancement.create.precision_mechanism": "UNLOCALIZED: Complex Curiosities",
"advancement.create.precision_mechanism.desc": "UNLOCALIZED: Assemble a Precision Mechanism.",
@ -783,7 +784,7 @@
"advancement.create.crushing_wheel": "UNLOCALIZED: A Pair of Giants",
"advancement.create.crushing_wheel.desc": "UNLOCALIZED: Create some Crushing Wheels to break down more materials more effectively.",
"advancement.create.blaze_cake": "UNLOCALIZED: Sugar Rush",
"advancement.create.blaze_cake.desc": "UNLOCALIZED: Bake your blaze burner a special cake.",
"advancement.create.blaze_cake.desc": "UNLOCALIZED: Bake your Blaze Burner a special cake.",
"advancement.create.wand_of_symmetry": "UNLOCALIZED: Radiant Mirrors",
"advancement.create.wand_of_symmetry.desc": "UNLOCALIZED: Craft a Staff of Symmetry.",
"advancement.create.extendo_grip": "Boioioing!",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 449",
"_": "Missing Localizations: 450",
"_": "->------------------------] Game Elements [------------------------<-",
@ -578,6 +578,7 @@
"item.create.chromatic_compound": "Compuesto Cromático",
"item.create.cinder_flour": "Harina de Cenizas",
"item.create.copper_backtank": "Mochila-Tanque de Cobre",
"item.create.copper_backtank_placeable": "UNLOCALIZED: Copper Backtank Placeable",
"item.create.copper_nugget": "Nugget de Cobre",
"item.create.copper_sheet": "Plancha de Cobre",
"item.create.crafter_slot_cover": "Cubre Ranuras",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 1700",
"_": "Missing Localizations: 1701",
"_": "->------------------------] Game Elements [------------------------<-",
@ -578,6 +578,7 @@
"item.create.chromatic_compound": "Composé chromatique",
"item.create.cinder_flour": "Farine de braise",
"item.create.copper_backtank": "UNLOCALIZED: Copper Backtank",
"item.create.copper_backtank_placeable": "UNLOCALIZED: Copper Backtank Placeable",
"item.create.copper_nugget": "Pépite de cuivre",
"item.create.copper_sheet": "Plaques de cuivre",
"item.create.crafter_slot_cover": "Couvercle",
@ -658,18 +659,18 @@
"advancement.create.overstressed.desc": "Testez d'abord les limites de la force mécanique",
"advancement.create.belt": "UNLOCALIZED: Kelp Drive",
"advancement.create.belt.desc": "UNLOCALIZED: Connect two shafts with a Mechanical Belt.",
"advancement.create.tunnel": "UNLOCALIZED: Take cover!",
"advancement.create.tunnel.desc": "UNLOCALIZED: Embellish your mechanical belt with a Tunnel.",
"advancement.create.tunnel": "UNLOCALIZED: Take Cover!",
"advancement.create.tunnel.desc": "UNLOCALIZED: Embellish your Mechanical Belt with a Tunnel.",
"advancement.create.splitter_tunnel": "UNLOCALIZED: Divide and Conquer",
"advancement.create.splitter_tunnel.desc": "UNLOCALIZED: Create a splitter with a group of Brass Tunnels.",
"advancement.create.chute": "UNLOCALIZED: Tumbling down",
"advancement.create.chute.desc": "UNLOCALIZED: Place a chute, the vertical counterpart of the belt.",
"advancement.create.chute": "UNLOCALIZED: Tumbling Down",
"advancement.create.chute.desc": "UNLOCALIZED: Place a Chute, the vertical counterpart of the Belt.",
"advancement.create.upward_chute": "UNLOCALIZED: Aerial Abduction",
"advancement.create.upward_chute.desc": "UNLOCALIZED: Watch a thrown item fly up into a fan-powered chute.",
"advancement.create.upward_chute.desc": "UNLOCALIZED: Watch a thrown item fly up into a Fan-powered Chute.",
"advancement.create.belt_funnel": "UNLOCALIZED: Funnels' Flappy Danglers",
"advancement.create.belt_funnel.desc": "UNLOCALIZED: Place a sideways funnel on top of a belt or depot to create a special type.",
"advancement.create.belt_funnel.desc": "UNLOCALIZED: Place a sideways Funnel on top of a Belt or Depot to create a special type.",
"advancement.create.belt_funnel_kiss": "UNLOCALIZED: The Parrots and the Flaps",
"advancement.create.belt_funnel_kiss.desc": "UNLOCALIZED: Make two belt mounted funnels kiss.",
"advancement.create.belt_funnel_kiss.desc": "UNLOCALIZED: Make two Belt-mounted Funnels kiss.",
"advancement.create.fan": "UNLOCALIZED: Mechanical Airbender",
"advancement.create.fan.desc": "UNLOCALIZED: Ride the stream of air provided by an Encased Fan.",
"advancement.create.fan_lava": "UNLOCALIZED: Geothermal Space Heater",
@ -677,27 +678,27 @@
"advancement.create.fan_water": "UNLOCALIZED: Wacky Washing",
"advancement.create.fan_water.desc": "UNLOCALIZED: Get caught in a stream of air that washes things.",
"advancement.create.fan_smoke": "UNLOCALIZED: Mechanical Bellows",
"advancement.create.fan_smoke.desc": "UNLOCALIZED: Get caught in a stream of air that smokes items.",
"advancement.create.fan_smoke.desc": "UNLOCALIZED: Get caught in a stream of air that smokes things.",
"advancement.create.wrench": "UNLOCALIZED: Configure Conveniently",
"advancement.create.wrench.desc": "UNLOCALIZED: Create a Wrench to aid you in building your contraptions.",
"advancement.create.wrench.desc": "UNLOCALIZED: Create a Wrench to aid you in building your Contraptions.",
"advancement.create.goggles": "UNLOCALIZED: Stress-O-Vision",
"advancement.create.goggles.desc": "UNLOCALIZED: Create some Engineer's Goggles to aid you in getting more kinetic information from components.",
"advancement.create.speedometer": "UNLOCALIZED: But How Fast Exactly?",
"advancement.create.speedometer.desc": "UNLOCALIZED: Place and power a Speedometer. Look at it through your goggles to read its exact value.",
"advancement.create.speedometer.desc": "UNLOCALIZED: Place and power a Speedometer. Look at it through your Goggles to read its exact value.",
"advancement.create.stressometer": "UNLOCALIZED: But How Stressed Exactly?",
"advancement.create.stressometer.desc": "UNLOCALIZED: Place and power a Stressometer. Look at it through your goggles to read its exact value.",
"advancement.create.stressometer.desc": "UNLOCALIZED: Place and power a Stressometer. Look at it through your Goggles to read its exact value.",
"advancement.create.aesthetics": "UNLOCALIZED: Boom, Aesthetics!",
"advancement.create.aesthetics.desc": "UNLOCALIZED: Place brackets on a shaft, pipe and cogwheel.",
"advancement.create.aesthetics.desc": "UNLOCALIZED: Place Brackets on a Shaft, Pipe, and Cogwheel.",
"advancement.create.reinforced": "UNLOCALIZED: Boom, Reinforced!",
"advancement.create.reinforced.desc": "UNLOCALIZED: Use fitting casing blocks on a shaft, pipe and mechanical belt.",
"advancement.create.reinforced.desc": "UNLOCALIZED: Use fitting Casing blocks on a Shaft, Pipe, and Mechanical Belt.",
"advancement.create.water_wheel": "UNLOCALIZED: Harnessing Hydraulics",
"advancement.create.water_wheel.desc": "UNLOCALIZED: Place a Water Wheel and try getting it to spin!",
"advancement.create.chocolate_wheel": "UNLOCALIZED: Tasteful power",
"advancement.create.chocolate_wheel.desc": "UNLOCALIZED: Run a Water Wheel with molten Chocolate.",
"advancement.create.chocolate_wheel": "UNLOCALIZED: Tasteful Power",
"advancement.create.chocolate_wheel.desc": "UNLOCALIZED: Run a Water Wheel with Molten Chocolate.",
"advancement.create.lava_wheel": "Roue à aubes... dans de la lave?",
"advancement.create.lava_wheel.desc": "Cela... N'aurait pas dû fonctionner.",
"advancement.create.cuckoo": "C'est déjà l'heure?",
"advancement.create.cuckoo.desc": "UNLOCALIZED: Witness a cuckhoo clock announce bedtime.",
"advancement.create.cuckoo.desc": "UNLOCALIZED: Witness a Cuckoo Clock announce bedtime.",
"advancement.create.millstone": "UNLOCALIZED: Pocket Crusher",
"advancement.create.millstone.desc": "UNLOCALIZED: Place and power a Millstone.",
"advancement.create.windmill": "Une brise moyenne...",
@ -720,7 +721,7 @@
"advancement.create.basin.desc": "UNLOCALIZED: Place a Basin and try throwing items into it.",
"advancement.create.mixer": "UNLOCALIZED: Mixin' It Up",
"advancement.create.mixer.desc": "UNLOCALIZED: Place a Mechanical Mixer above the Basin, power it, and start mixing some ingredients.",
"advancement.create.blaze_burner": "UNLOCALIZED: A living Fireplace",
"advancement.create.blaze_burner": "UNLOCALIZED: A Living Fireplace",
"advancement.create.blaze_burner.desc": "UNLOCALIZED: Obtain a Blaze Burner.",
"advancement.create.compact": "UNLOCALIZED: Automated Compacting",
"advancement.create.compact.desc": "UNLOCALIZED: Use a Press and a Basin to compact some items.",
@ -731,42 +732,42 @@
"advancement.create.copper_casing": "UNLOCALIZED: The Copper Age",
"advancement.create.copper_casing.desc": "UNLOCALIZED: Use some Copper Sheets and Wood to create some Copper Casings.",
"advancement.create.spout": "UNLOCALIZED: Sploosh",
"advancement.create.spout.desc": "UNLOCALIZED: Watch a fluid item being filled using a spout.",
"advancement.create.spout.desc": "UNLOCALIZED: Watch a fluid item being filled using a Spout.",
"advancement.create.spout_potion": "UNLOCALIZED: Global Brewery",
"advancement.create.spout_potion.desc": "UNLOCALIZED: Watch a spout fill a bottle with potion fluid.",
"advancement.create.chocolate": "UNLOCALIZED: A world of Imagination",
"advancement.create.chocolate.desc": "UNLOCALIZED: Obtain a bucket of Molten Chocolate.",
"advancement.create.spout_potion.desc": "UNLOCALIZED: Watch a Spout fill a Bottle with potion fluid.",
"advancement.create.chocolate": "UNLOCALIZED: A World of Imagination",
"advancement.create.chocolate.desc": "UNLOCALIZED: Obtain a Bucket of Molten Chocolate.",
"advancement.create.item_drain": "UNLOCALIZED: Tumble Draining",
"advancement.create.item_drain.desc": "UNLOCALIZED: Watch a fluid item being emptied by an item drain.",
"advancement.create.chained_item_drain": "UNLOCALIZED: Let it roll!",
"advancement.create.chained_item_drain.desc": "UNLOCALIZED: Watch an item roll across several chained item drains.",
"advancement.create.item_drain.desc": "UNLOCALIZED: Watch a fluid item being emptied by an Item Drain.",
"advancement.create.chained_item_drain": "UNLOCALIZED: Let It Roll!",
"advancement.create.chained_item_drain.desc": "UNLOCALIZED: Watch an item roll across several chained Item Drains.",
"advancement.create.glass_pipe": "UNLOCALIZED: Flow Spy",
"advancement.create.glass_pipe.desc": "UNLOCALIZED: Watch fluid propagate through a windowed fluid pipe. Straight fluid pipes become windowed when a wrench is used on them.",
"advancement.create.pipe_collision": "UNLOCALIZED: Never cross the Streams!",
"advancement.create.glass_pipe.desc": "UNLOCALIZED: Watch fluid propagate through a windowed Fluid Pipe. Straight Fluid Pipes become windowed when a Wrench is used on them.",
"advancement.create.pipe_collision": "UNLOCALIZED: Never Cross the Streams!",
"advancement.create.pipe_collision.desc": "UNLOCALIZED: Watch two fluids meet in your pipe network.",
"advancement.create.pipe_spill": "UNLOCALIZED: There's a leak!",
"advancement.create.pipe_spill.desc": "UNLOCALIZED: Watch an open end of a pipe take or place fluids into the world.",
"advancement.create.pipe_spill": "UNLOCALIZED: There's a Leak!",
"advancement.create.pipe_spill.desc": "UNLOCALIZED: Watch an open end of a Pipe take or place fluids into the world.",
"advancement.create.hose_pulley": "UNLOCALIZED: Industrial Spillage",
"advancement.create.hose_pulley.desc": "UNLOCALIZED: Lower a hose pulley and watch it drain or fill a body of fluid.",
"advancement.create.hose_pulley.desc": "UNLOCALIZED: Lower a Hose Pulley and watch it drain or fill a body of fluid.",
"advancement.create.infinite_water": "UNLOCALIZED: Draining the Ocean",
"advancement.create.infinite_water.desc": "UNLOCALIZED: Pump from a body of Water large enough to be considered Infinite.",
"advancement.create.infinite_water.desc": "UNLOCALIZED: Pump from a body of Water large enough to be considered infinite.",
"advancement.create.infinite_lava": "UNLOCALIZED: Draining the Planets' Core",
"advancement.create.infinite_lava.desc": "UNLOCALIZED: Pump from a body of Lava large enough to be considered Infinite.",
"advancement.create.infinite_lava.desc": "UNLOCALIZED: Pump from a body of Lava large enough to be considered infinite.",
"advancement.create.infinite_chocolate": "UNLOCALIZED: Drowning in Imagination",
"advancement.create.infinite_chocolate.desc": "UNLOCALIZED: Pump from a body of Molten Chocolate large enough to be considered Infinite.",
"advancement.create.infinite_chocolate.desc": "UNLOCALIZED: Pump from a body of Molten Chocolate large enough to be considered infinite.",
"advancement.create.crafter": "UNLOCALIZED: Automated Assembly",
"advancement.create.crafter.desc": "UNLOCALIZED: Place and power some Mechanical Crafters.",
"advancement.create.clockwork_bearing": "UNLOCALIZED: Contraption o'clock",
"advancement.create.clockwork_bearing.desc": "UNLOCALIZED: Assemble a Structure mounted on a Clockwork Bearing.",
"advancement.create.clockwork_bearing": "UNLOCALIZED: Contraption O'Clock",
"advancement.create.clockwork_bearing.desc": "UNLOCALIZED: Assemble a structure mounted on a Clockwork Bearing.",
"advancement.create.nixie_tube": "UNLOCALIZED: Signs of Style",
"advancement.create.nixie_tube.desc": "UNLOCALIZED: Obtain and place down a pair of Nixie Tubes.",
"advancement.create.deployer": "UNLOCALIZED: Poke, Place, and Attack",
"advancement.create.deployer.desc": "UNLOCALIZED: Place and power a Deployer, the perfect reflection of yourself.",
"advancement.create.speed_controller": "UNLOCALIZED: Engineers hate him!",
"advancement.create.speed_controller": "UNLOCALIZED: Engineers Hate Him!",
"advancement.create.speed_controller.desc": "UNLOCALIZED: Place a Rotation Speed Controller, the ultimate device for changing gear.",
"advancement.create.flywheel": "UNLOCALIZED: Heart of the Factory",
"advancement.create.flywheel.desc": "UNLOCALIZED: Successfully connect an engine to the Flywheel.",
"advancement.create.overstress_flywheel": "UNLOCALIZED: High levels of Stress",
"advancement.create.flywheel.desc": "UNLOCALIZED: Successfully connect a Furnace Engine to the Flywheel.",
"advancement.create.overstress_flywheel": "UNLOCALIZED: High Levels of Stress",
"advancement.create.overstress_flywheel.desc": "UNLOCALIZED: Overstress a Furnace Engine.",
"advancement.create.precision_mechanism": "UNLOCALIZED: Complex Curiosities",
"advancement.create.precision_mechanism.desc": "UNLOCALIZED: Assemble a Precision Mechanism.",
@ -783,7 +784,7 @@
"advancement.create.crushing_wheel": "UNLOCALIZED: A Pair of Giants",
"advancement.create.crushing_wheel.desc": "UNLOCALIZED: Create some Crushing Wheels to break down more materials more effectively.",
"advancement.create.blaze_cake": "UNLOCALIZED: Sugar Rush",
"advancement.create.blaze_cake.desc": "UNLOCALIZED: Bake your blaze burner a special cake.",
"advancement.create.blaze_cake.desc": "UNLOCALIZED: Bake your Blaze Burner a special cake.",
"advancement.create.wand_of_symmetry": "UNLOCALIZED: Radiant Mirrors",
"advancement.create.wand_of_symmetry.desc": "UNLOCALIZED: Craft a Staff of Symmetry.",
"advancement.create.extendo_grip": "UNLOCALIZED: Boioioing!",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 1389",
"_": "Missing Localizations: 1390",
"_": "->------------------------] Game Elements [------------------------<-",
@ -578,6 +578,7 @@
"item.create.chromatic_compound": "Composto cromatico",
"item.create.cinder_flour": "Cenere farinosa",
"item.create.copper_backtank": "UNLOCALIZED: Copper Backtank",
"item.create.copper_backtank_placeable": "UNLOCALIZED: Copper Backtank Placeable",
"item.create.copper_nugget": "Pepita di rame",
"item.create.copper_sheet": "Lamiera di rame",
"item.create.crafter_slot_cover": "Rivestimento per slot da costruzione",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 119",
"_": "Missing Localizations: 116",
"_": "->------------------------] Game Elements [------------------------<-",
@ -578,6 +578,7 @@
"item.create.chromatic_compound": "色彩の化合物",
"item.create.cinder_flour": "ネザーラックの粉",
"item.create.copper_backtank": "銅のバックタンク",
"item.create.copper_backtank_placeable": "UNLOCALIZED: Copper Backtank Placeable",
"item.create.copper_nugget": "銅塊",
"item.create.copper_sheet": "銅板",
"item.create.crafter_slot_cover": "クラフタースロットカバー",
@ -654,7 +655,7 @@
"advancement.create.its_alive.desc": "機械の回転を初めて見る",
"advancement.create.shifting_gears": "ギアシフト!",
"advancement.create.shifting_gears.desc": "大きい歯車と小さい歯車を噛み合わせて回転速度を変更する",
"advancement.create.overstressed": "超過応力",
"advancement.create.overstressed": "応力超過",
"advancement.create.overstressed.desc": "応力の限界を肌で感じる",
"advancement.create.belt": "ベルトコンブア",
"advancement.create.belt.desc": "2つのシャフトをメカニカルベルトで繋ぐ",
@ -767,7 +768,7 @@
"advancement.create.flywheel": "工場の心臓部",
"advancement.create.flywheel.desc": "かまどエンジンを弾み車に繋ぐ",
"advancement.create.overstress_flywheel": "ハイレベル応力",
"advancement.create.overstress_flywheel.desc": "かまどエンジンに超過応力をかける",
"advancement.create.overstress_flywheel.desc": "かまどエンジンに応力超過をかける",
"advancement.create.precision_mechanism": "手間暇かけた骨董品",
"advancement.create.precision_mechanism.desc": "精密機構を組み立てる",
"advancement.create.mechanical_arm": "手が離せない!",
@ -833,8 +834,8 @@
"create.recipe.fan_washing.fan": "水の奥のケース入りファン",
"create.recipe.fan_smoking": "一括燻製",
"create.recipe.fan_smoking.fan": "炎の奥のケース入りファン",
"create.recipe.fan_haunting": "UNLOCALIZED: Bulk Haunting",
"create.recipe.fan_haunting.fan": "UNLOCALIZED: Fan behind Soul Fire",
"create.recipe.fan_haunting": "一括憑霊",
"create.recipe.fan_haunting.fan": "魂の炎の奥のケース入りファン",
"create.recipe.fan_blasting": "一括精錬",
"create.recipe.fan_blasting.fan": "溶岩の奥のケース入りファン",
"create.recipe.pressing": "プレス",
@ -1011,10 +1012,10 @@
"create.gui.speedometer.title": "回転速度",
"create.gui.stressometer.title": "ネットワークの応力",
"create.gui.stressometer.capacity": "残りの応力許容量",
"create.gui.stressometer.overstressed": "超過応力",
"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": "在庫スイッチ",
@ -1183,8 +1184,8 @@
"create.item_attributes.furnace_fuel.inverted": "かまどの燃料でないか",
"create.item_attributes.washable": "洗浄できるかか",
"create.item_attributes.washable.inverted": "洗浄できないか",
"create.item_attributes.hauntable": "UNLOCALIZED: can be Haunted",
"create.item_attributes.hauntable.inverted": "UNLOCALIZED: cannot be Haunted",
"create.item_attributes.hauntable": "憑霊できるか",
"create.item_attributes.hauntable.inverted": "憑霊できないか",
"create.item_attributes.crushable": "粉砕できるかか",
"create.item_attributes.crushable.inverted": "粉砕できないか",
"create.item_attributes.smeltable": "精錬できるかか",
@ -1255,7 +1256,7 @@
"create.tooltip.stressImpact.low": "低",
"create.tooltip.stressImpact.medium": "中",
"create.tooltip.stressImpact.high": "高",
"create.tooltip.stressImpact.overstressed": "超過応力",
"create.tooltip.stressImpact.overstressed": "応力超過",
"create.tooltip.capacityProvided": "応力許容量: %1$s",
"create.tooltip.capacityProvided.low": "小",
"create.tooltip.capacityProvided.medium": "中",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 121",
"_": "Missing Localizations: 116",
"_": "->------------------------] Game Elements [------------------------<-",
@ -578,6 +578,7 @@
"item.create.chromatic_compound": "색채 혼합물",
"item.create.cinder_flour": "잿가루",
"item.create.copper_backtank": "구리 산소통",
"item.create.copper_backtank_placeable": "UNLOCALIZED: Copper Backtank Placeable",
"item.create.copper_nugget": "구리 조각",
"item.create.copper_sheet": "구리 판",
"item.create.crafter_slot_cover": "조합기 슬롯 덮개",
@ -833,8 +834,8 @@
"create.recipe.fan_washing.fan": "물과 선풍기",
"create.recipe.fan_smoking": "훈연",
"create.recipe.fan_smoking.fan": "불과 선풍기",
"create.recipe.fan_haunting": "UNLOCALIZED: Bulk Haunting",
"create.recipe.fan_haunting.fan": "UNLOCALIZED: Fan behind Soul Fire",
"create.recipe.fan_haunting": "심령",
"create.recipe.fan_haunting.fan": "영혼 불과 선풍기",
"create.recipe.fan_blasting": "제련",
"create.recipe.fan_blasting.fan": "용암과 선풍기",
"create.recipe.pressing": "압착",
@ -912,7 +913,7 @@
"create.gui.toolmenu.cycle": "스크롤로 순환",
"create.toolbox.unequip": "되돌리기: %1$s",
"create.toolbox.outOfRange": "현재 아이템은 공구상자와 너무 멀리있습니다",
"create.toolbox.outOfRange": "현재 아이템은 공구상자와 너무 멀리 있습니다",
"create.toolbox.detach": "공구상자와 연결 끊기",
"create.toolbox.depositAll": "근처 공구상자로 모든 아이템 되돌리기",
"create.toolbox.depositBox": "공구상자로 아이템 되돌리기",
@ -1049,7 +1050,7 @@
"create.schematicAndQuill.abort": "위치 설정을 제거했습니다.",
"create.schematicAndQuill.title": "설계도 이름:",
"create.schematicAndQuill.convert": "저장하고 즉시 적용",
"create.schematicAndQuill.fallbackName": "My Schematic",
"create.schematicAndQuill.fallbackName": "내 청사진",
"create.schematicAndQuill.saved": "%1$s으(로) 저장했습니다",
"create.schematic.invalid": "[!] 없는 아이템 - 청사진 테이블을 이용하세요",
@ -1118,12 +1119,12 @@
"create.gui.schematicannon.option.replaceWithAny": "온전한 블록을 아무 재료로 대체함",
"create.gui.schematicannon.option.replaceWithEmpty": "온전한 블록을 공기로 채움",
"create.gui.schematicannon.option.skipMissing": "부족한 블록을 무시하고 진행",
"create.gui.schematicannon.option.skipTileEntities": "UNLOCALIZED: Protect Tile Entities",
"create.gui.schematicannon.option.skipTileEntities": "블록 엔티티 보호",
"create.gui.schematicannon.slot.gunpowder": "화약을 넣어 대포 연료를 채우세요",
"create.gui.schematicannon.slot.listPrinter": "책을 넣어 건축 재료 체크리스트를 인쇄하세요",
"create.gui.schematicannon.slot.schematic": "여기에 청사진을 넣으세요. 건설 구역이 설정되어 있어야 합니다.",
"create.gui.schematicannon.option.skipMissing.description": "만약 대포가 설치에 필요한 블록을 찾지 못할 경우,건너뛰고 다음 블록 설치를 진행합니다.",
"create.gui.schematicannon.option.skipTileEntities.description": "UNLOCALIZED: The cannon will avoid replacing data holding blocks such as Chests.",
"create.gui.schematicannon.option.skipTileEntities.description": "대포가 상자, 화로같이 데이터가 담긴 블록을 설치하지 않습니다.",
"create.gui.schematicannon.option.dontReplaceSolid.description": "대포가 작업구역의 온전한 블록을 대체하지 않습니다.",
"create.gui.schematicannon.option.replaceWithSolid.description": "대포가 작업구역의 온전한 블록을 대포가 가진 재료로 대체합니다.",
"create.gui.schematicannon.option.replaceWithAny.description": "대포가 작업구역의 온전한 블록을 대포가 가진 어떠한 재료로든 대체합니다.",
@ -1183,8 +1184,8 @@
"create.item_attributes.furnace_fuel.inverted": "화로 연료로 쓸 수 없음",
"create.item_attributes.washable": "세척될 수 있음",
"create.item_attributes.washable.inverted": "세척될 수 없음",
"create.item_attributes.hauntable": "UNLOCALIZED: can be Haunted",
"create.item_attributes.hauntable.inverted": "UNLOCALIZED: cannot be Haunted",
"create.item_attributes.hauntable": "귀신들릴 수 있음",
"create.item_attributes.hauntable.inverted": "귀신들릴 수 없음",
"create.item_attributes.crushable": "분쇄될 수 있음",
"create.item_attributes.crushable.inverted": "분쇄될 수 없음",
"create.item_attributes.smeltable": "구워질 수 있음",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 2053",
"_": "Missing Localizations: 2054",
"_": "->------------------------] Game Elements [------------------------<-",
@ -578,6 +578,7 @@
"item.create.chromatic_compound": "UNLOCALIZED: Chromatic Compound",
"item.create.cinder_flour": "UNLOCALIZED: Cinder Flour",
"item.create.copper_backtank": "UNLOCALIZED: Copper Backtank",
"item.create.copper_backtank_placeable": "UNLOCALIZED: Copper Backtank Placeable",
"item.create.copper_nugget": "Koper klompje",
"item.create.copper_sheet": "UNLOCALIZED: Copper Sheet",
"item.create.crafter_slot_cover": "UNLOCALIZED: Crafter Slot Cover",
@ -653,23 +654,23 @@
"advancement.create.its_alive": "UNLOCALIZED: It's Alive!",
"advancement.create.its_alive.desc": "UNLOCALIZED: Watch your first kinetic component spin.",
"advancement.create.shifting_gears": "UNLOCALIZED: Shifting Gears",
"advancement.create.shifting_gears.desc": "UNLOCALIZED: Connect a Large Cogwheel to a Small Cogwheel, allowing you to change the speed of your contraption.",
"advancement.create.shifting_gears.desc": "UNLOCALIZED: Connect a Large Cogwheel to a Small Cogwheel, allowing you to change the speed of your Contraption.",
"advancement.create.overstressed": "UNLOCALIZED: Overstressed",
"advancement.create.overstressed.desc": "UNLOCALIZED: Experience the limits of stress firsthand.",
"advancement.create.belt": "UNLOCALIZED: Kelp Drive",
"advancement.create.belt.desc": "UNLOCALIZED: Connect two shafts with a Mechanical Belt.",
"advancement.create.tunnel": "UNLOCALIZED: Take cover!",
"advancement.create.tunnel.desc": "UNLOCALIZED: Embellish your mechanical belt with a Tunnel.",
"advancement.create.tunnel": "UNLOCALIZED: Take Cover!",
"advancement.create.tunnel.desc": "UNLOCALIZED: Embellish your Mechanical Belt with a Tunnel.",
"advancement.create.splitter_tunnel": "UNLOCALIZED: Divide and Conquer",
"advancement.create.splitter_tunnel.desc": "UNLOCALIZED: Create a splitter with a group of Brass Tunnels.",
"advancement.create.chute": "UNLOCALIZED: Tumbling down",
"advancement.create.chute.desc": "UNLOCALIZED: Place a chute, the vertical counterpart of the belt.",
"advancement.create.chute": "UNLOCALIZED: Tumbling Down",
"advancement.create.chute.desc": "UNLOCALIZED: Place a Chute, the vertical counterpart of the Belt.",
"advancement.create.upward_chute": "UNLOCALIZED: Aerial Abduction",
"advancement.create.upward_chute.desc": "UNLOCALIZED: Watch a thrown item fly up into a fan-powered chute.",
"advancement.create.upward_chute.desc": "UNLOCALIZED: Watch a thrown item fly up into a Fan-powered Chute.",
"advancement.create.belt_funnel": "UNLOCALIZED: Funnels' Flappy Danglers",
"advancement.create.belt_funnel.desc": "UNLOCALIZED: Place a sideways funnel on top of a belt or depot to create a special type.",
"advancement.create.belt_funnel.desc": "UNLOCALIZED: Place a sideways Funnel on top of a Belt or Depot to create a special type.",
"advancement.create.belt_funnel_kiss": "UNLOCALIZED: The Parrots and the Flaps",
"advancement.create.belt_funnel_kiss.desc": "UNLOCALIZED: Make two belt mounted funnels kiss.",
"advancement.create.belt_funnel_kiss.desc": "UNLOCALIZED: Make two Belt-mounted Funnels kiss.",
"advancement.create.fan": "UNLOCALIZED: Mechanical Airbender",
"advancement.create.fan.desc": "UNLOCALIZED: Ride the stream of air provided by an Encased Fan.",
"advancement.create.fan_lava": "UNLOCALIZED: Geothermal Space Heater",
@ -677,32 +678,32 @@
"advancement.create.fan_water": "UNLOCALIZED: Wacky Washing",
"advancement.create.fan_water.desc": "UNLOCALIZED: Get caught in a stream of air that washes things.",
"advancement.create.fan_smoke": "UNLOCALIZED: Mechanical Bellows",
"advancement.create.fan_smoke.desc": "UNLOCALIZED: Get caught in a stream of air that smokes items.",
"advancement.create.fan_smoke.desc": "UNLOCALIZED: Get caught in a stream of air that smokes things.",
"advancement.create.wrench": "UNLOCALIZED: Configure Conveniently",
"advancement.create.wrench.desc": "UNLOCALIZED: Create a Wrench to aid you in building your contraptions.",
"advancement.create.wrench.desc": "UNLOCALIZED: Create a Wrench to aid you in building your Contraptions.",
"advancement.create.goggles": "UNLOCALIZED: Stress-O-Vision",
"advancement.create.goggles.desc": "UNLOCALIZED: Create some Engineer's Goggles to aid you in getting more kinetic information from components.",
"advancement.create.speedometer": "UNLOCALIZED: But How Fast Exactly?",
"advancement.create.speedometer.desc": "UNLOCALIZED: Place and power a Speedometer. Look at it through your goggles to read its exact value.",
"advancement.create.speedometer.desc": "UNLOCALIZED: Place and power a Speedometer. Look at it through your Goggles to read its exact value.",
"advancement.create.stressometer": "UNLOCALIZED: But How Stressed Exactly?",
"advancement.create.stressometer.desc": "UNLOCALIZED: Place and power a Stressometer. Look at it through your goggles to read its exact value.",
"advancement.create.stressometer.desc": "UNLOCALIZED: Place and power a Stressometer. Look at it through your Goggles to read its exact value.",
"advancement.create.aesthetics": "UNLOCALIZED: Boom, Aesthetics!",
"advancement.create.aesthetics.desc": "UNLOCALIZED: Place brackets on a shaft, pipe and cogwheel.",
"advancement.create.aesthetics.desc": "UNLOCALIZED: Place Brackets on a Shaft, Pipe, and Cogwheel.",
"advancement.create.reinforced": "UNLOCALIZED: Boom, Reinforced!",
"advancement.create.reinforced.desc": "UNLOCALIZED: Use fitting casing blocks on a shaft, pipe and mechanical belt.",
"advancement.create.reinforced.desc": "UNLOCALIZED: Use fitting Casing blocks on a Shaft, Pipe, and Mechanical Belt.",
"advancement.create.water_wheel": "UNLOCALIZED: Harnessing Hydraulics",
"advancement.create.water_wheel.desc": "UNLOCALIZED: Place a Water Wheel and try getting it to spin!",
"advancement.create.chocolate_wheel": "UNLOCALIZED: Tasteful power",
"advancement.create.chocolate_wheel.desc": "UNLOCALIZED: Run a Water Wheel with molten Chocolate.",
"advancement.create.chocolate_wheel": "UNLOCALIZED: Tasteful Power",
"advancement.create.chocolate_wheel.desc": "UNLOCALIZED: Run a Water Wheel with Molten Chocolate.",
"advancement.create.lava_wheel": "UNLOCALIZED: Magma Wheel",
"advancement.create.lava_wheel.desc": "UNLOCALIZED: This shouldn't have worked.",
"advancement.create.cuckoo": "UNLOCALIZED: Is it time?",
"advancement.create.cuckoo.desc": "UNLOCALIZED: Witness a cuckhoo clock announce bedtime.",
"advancement.create.cuckoo": "UNLOCALIZED: Is It Time?",
"advancement.create.cuckoo.desc": "UNLOCALIZED: Witness a Cuckoo Clock announce bedtime.",
"advancement.create.millstone": "UNLOCALIZED: Pocket Crusher",
"advancement.create.millstone.desc": "UNLOCALIZED: Place and power a Millstone.",
"advancement.create.windmill": "UNLOCALIZED: A mild Breeze",
"advancement.create.windmill": "UNLOCALIZED: A Mild Breeze",
"advancement.create.windmill.desc": "UNLOCALIZED: Assemble a windmill.",
"advancement.create.maxed_windmill": "UNLOCALIZED: A strong breeze",
"advancement.create.maxed_windmill": "UNLOCALIZED: A Strong Breeze",
"advancement.create.maxed_windmill.desc": "UNLOCALIZED: Assemble a windmill of maximum strength.",
"advancement.create.andesite_casing": "UNLOCALIZED: The Andesite Age",
"advancement.create.andesite_casing.desc": "UNLOCALIZED: Use some Andesite Alloy and Wood to create a basic Casing.",
@ -720,7 +721,7 @@
"advancement.create.basin.desc": "UNLOCALIZED: Place a Basin and try throwing items into it.",
"advancement.create.mixer": "UNLOCALIZED: Mixin' It Up",
"advancement.create.mixer.desc": "UNLOCALIZED: Place a Mechanical Mixer above the Basin, power it, and start mixing some ingredients.",
"advancement.create.blaze_burner": "UNLOCALIZED: A living Fireplace",
"advancement.create.blaze_burner": "UNLOCALIZED: A Living Fireplace",
"advancement.create.blaze_burner.desc": "UNLOCALIZED: Obtain a Blaze Burner.",
"advancement.create.compact": "UNLOCALIZED: Automated Compacting",
"advancement.create.compact.desc": "UNLOCALIZED: Use a Press and a Basin to compact some items.",
@ -731,42 +732,42 @@
"advancement.create.copper_casing": "UNLOCALIZED: The Copper Age",
"advancement.create.copper_casing.desc": "UNLOCALIZED: Use some Copper Sheets and Wood to create some Copper Casings.",
"advancement.create.spout": "UNLOCALIZED: Sploosh",
"advancement.create.spout.desc": "UNLOCALIZED: Watch a fluid item being filled using a spout.",
"advancement.create.spout.desc": "UNLOCALIZED: Watch a fluid item being filled using a Spout.",
"advancement.create.spout_potion": "UNLOCALIZED: Global Brewery",
"advancement.create.spout_potion.desc": "UNLOCALIZED: Watch a spout fill a bottle with potion fluid.",
"advancement.create.chocolate": "UNLOCALIZED: A world of Imagination",
"advancement.create.chocolate.desc": "UNLOCALIZED: Obtain a bucket of Molten Chocolate.",
"advancement.create.spout_potion.desc": "UNLOCALIZED: Watch a Spout fill a Bottle with potion fluid.",
"advancement.create.chocolate": "UNLOCALIZED: A World of Imagination",
"advancement.create.chocolate.desc": "UNLOCALIZED: Obtain a Bucket of Molten Chocolate.",
"advancement.create.item_drain": "UNLOCALIZED: Tumble Draining",
"advancement.create.item_drain.desc": "UNLOCALIZED: Watch a fluid item being emptied by an item drain.",
"advancement.create.chained_item_drain": "UNLOCALIZED: Let it roll!",
"advancement.create.chained_item_drain.desc": "UNLOCALIZED: Watch an item roll across several chained item drains.",
"advancement.create.item_drain.desc": "UNLOCALIZED: Watch a fluid item being emptied by an Item Drain.",
"advancement.create.chained_item_drain": "UNLOCALIZED: Let It Roll!",
"advancement.create.chained_item_drain.desc": "UNLOCALIZED: Watch an item roll across several chained Item Drains.",
"advancement.create.glass_pipe": "UNLOCALIZED: Flow Spy",
"advancement.create.glass_pipe.desc": "UNLOCALIZED: Watch fluid propagate through a windowed fluid pipe. Straight fluid pipes become windowed when a wrench is used on them.",
"advancement.create.pipe_collision": "UNLOCALIZED: Never cross the Streams!",
"advancement.create.glass_pipe.desc": "UNLOCALIZED: Watch fluid propagate through a windowed Fluid Pipe. Straight Fluid Pipes become windowed when a Wrench is used on them.",
"advancement.create.pipe_collision": "UNLOCALIZED: Never Cross the Streams!",
"advancement.create.pipe_collision.desc": "UNLOCALIZED: Watch two fluids meet in your pipe network.",
"advancement.create.pipe_spill": "UNLOCALIZED: There's a leak!",
"advancement.create.pipe_spill.desc": "UNLOCALIZED: Watch an open end of a pipe take or place fluids into the world.",
"advancement.create.pipe_spill": "UNLOCALIZED: There's a Leak!",
"advancement.create.pipe_spill.desc": "UNLOCALIZED: Watch an open end of a Pipe take or place fluids into the world.",
"advancement.create.hose_pulley": "UNLOCALIZED: Industrial Spillage",
"advancement.create.hose_pulley.desc": "UNLOCALIZED: Lower a hose pulley and watch it drain or fill a body of fluid.",
"advancement.create.hose_pulley.desc": "UNLOCALIZED: Lower a Hose Pulley and watch it drain or fill a body of fluid.",
"advancement.create.infinite_water": "UNLOCALIZED: Draining the Ocean",
"advancement.create.infinite_water.desc": "UNLOCALIZED: Pump from a body of Water large enough to be considered Infinite.",
"advancement.create.infinite_water.desc": "UNLOCALIZED: Pump from a body of Water large enough to be considered infinite.",
"advancement.create.infinite_lava": "UNLOCALIZED: Draining the Planets' Core",
"advancement.create.infinite_lava.desc": "UNLOCALIZED: Pump from a body of Lava large enough to be considered Infinite.",
"advancement.create.infinite_lava.desc": "UNLOCALIZED: Pump from a body of Lava large enough to be considered infinite.",
"advancement.create.infinite_chocolate": "UNLOCALIZED: Drowning in Imagination",
"advancement.create.infinite_chocolate.desc": "UNLOCALIZED: Pump from a body of Molten Chocolate large enough to be considered Infinite.",
"advancement.create.infinite_chocolate.desc": "UNLOCALIZED: Pump from a body of Molten Chocolate large enough to be considered infinite.",
"advancement.create.crafter": "UNLOCALIZED: Automated Assembly",
"advancement.create.crafter.desc": "UNLOCALIZED: Place and power some Mechanical Crafters.",
"advancement.create.clockwork_bearing": "UNLOCALIZED: Contraption o'clock",
"advancement.create.clockwork_bearing.desc": "UNLOCALIZED: Assemble a Structure mounted on a Clockwork Bearing.",
"advancement.create.clockwork_bearing": "UNLOCALIZED: Contraption O'Clock",
"advancement.create.clockwork_bearing.desc": "UNLOCALIZED: Assemble a structure mounted on a Clockwork Bearing.",
"advancement.create.nixie_tube": "UNLOCALIZED: Signs of Style",
"advancement.create.nixie_tube.desc": "UNLOCALIZED: Obtain and place down a pair of Nixie Tubes.",
"advancement.create.deployer": "UNLOCALIZED: Poke, Place, and Attack",
"advancement.create.deployer.desc": "UNLOCALIZED: Place and power a Deployer, the perfect reflection of yourself.",
"advancement.create.speed_controller": "UNLOCALIZED: Engineers hate him!",
"advancement.create.speed_controller": "UNLOCALIZED: Engineers Hate Him!",
"advancement.create.speed_controller.desc": "UNLOCALIZED: Place a Rotation Speed Controller, the ultimate device for changing gear.",
"advancement.create.flywheel": "UNLOCALIZED: Heart of the Factory",
"advancement.create.flywheel.desc": "UNLOCALIZED: Successfully connect an engine to the Flywheel.",
"advancement.create.overstress_flywheel": "UNLOCALIZED: High levels of Stress",
"advancement.create.flywheel.desc": "UNLOCALIZED: Successfully connect a Furnace Engine to the Flywheel.",
"advancement.create.overstress_flywheel": "UNLOCALIZED: High Levels of Stress",
"advancement.create.overstress_flywheel.desc": "UNLOCALIZED: Overstress a Furnace Engine.",
"advancement.create.precision_mechanism": "UNLOCALIZED: Complex Curiosities",
"advancement.create.precision_mechanism.desc": "UNLOCALIZED: Assemble a Precision Mechanism.",
@ -783,7 +784,7 @@
"advancement.create.crushing_wheel": "UNLOCALIZED: A Pair of Giants",
"advancement.create.crushing_wheel.desc": "UNLOCALIZED: Create some Crushing Wheels to break down more materials more effectively.",
"advancement.create.blaze_cake": "UNLOCALIZED: Sugar Rush",
"advancement.create.blaze_cake.desc": "UNLOCALIZED: Bake your blaze burner a special cake.",
"advancement.create.blaze_cake.desc": "UNLOCALIZED: Bake your Blaze Burner a special cake.",
"advancement.create.wand_of_symmetry": "UNLOCALIZED: Radiant Mirrors",
"advancement.create.wand_of_symmetry.desc": "UNLOCALIZED: Craft a Staff of Symmetry.",
"advancement.create.extendo_grip": "UNLOCALIZED: Boioioing!",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 488",
"_": "Missing Localizations: 489",
"_": "->------------------------] Game Elements [------------------------<-",
@ -578,6 +578,7 @@
"item.create.chromatic_compound": "Związek chromatyczny",
"item.create.cinder_flour": "Rozżarzona mąka",
"item.create.copper_backtank": "Miedziany zbiornik w plecaku",
"item.create.copper_backtank_placeable": "UNLOCALIZED: Copper Backtank Placeable",
"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",

View file

@ -1,10 +1,10 @@
{
"_": "Missing Localizations: 1672",
"_": "Missing Localizations: 1301",
"_": "->------------------------] Game Elements [------------------------<-",
"block.create.acacia_window": "UNLOCALIZED: Acacia Window",
"block.create.acacia_window_pane": "UNLOCALIZED: Acacia Window Pane",
"block.create.acacia_window": "Janela de Acácia",
"block.create.acacia_window_pane": "Vidraça de Acácia",
"block.create.adjustable_chain_gearshift": "Correia Ajustável",
"block.create.analog_lever": "Alavanca Analógica",
"block.create.andesite_belt_funnel": "Funil de Esteira de Andesito",
@ -13,14 +13,14 @@
"block.create.andesite_encased_large_cogwheel": "Roda dentada grande revestida com andesito",
"block.create.andesite_encased_shaft": "Eixo revestido com latão",
"block.create.andesite_funnel": "Funil de Andesito",
"block.create.andesite_pillar": "UNLOCALIZED: Andesite Pillar",
"block.create.andesite_pillar": "Pilar de andesito",
"block.create.andesite_tunnel": "Tunel de Andesito",
"block.create.asurine": "UNLOCALIZED: Asurine",
"block.create.asurine_pillar": "UNLOCALIZED: Asurine Pillar",
"block.create.asurine": "Asurino",
"block.create.asurine_pillar": "Pilar de Asurino",
"block.create.basin": "Bacia",
"block.create.belt": "Esteira Mecânica",
"block.create.birch_window": "UNLOCALIZED: Birch Window",
"block.create.birch_window_pane": "UNLOCALIZED: Birch Window Pane",
"block.create.birch_window": "Janela de Bétula",
"block.create.birch_window_pane": "Vidraça de Bétula",
"block.create.black_nixie_tube": "Tubo nixie preto",
"block.create.black_sail": "Vela preta",
"block.create.black_seat": "Assento preto",
@ -45,7 +45,7 @@
"block.create.brown_seat": "Assento marrom",
"block.create.brown_toolbox": "Caixa de ferramentas marrom",
"block.create.brown_valve_handle": "Válvula marrom",
"block.create.calcite_pillar": "UNLOCALIZED: Calcite Pillar",
"block.create.calcite_pillar": "Pilar de Calcita",
"block.create.cart_assembler": "Montador de Carrinho de Mina",
"block.create.chocolate": "Chocolate",
"block.create.chute": "Calha",
@ -57,170 +57,170 @@
"block.create.controls": "UNLOCALIZED: Controls",
"block.create.copper_backtank": "Tanque Traseiro de Cobre",
"block.create.copper_casing": "Revestimento de Cobre",
"block.create.copper_shingle_slab": "UNLOCALIZED: Copper Shingle Slab",
"block.create.copper_shingle_stairs": "UNLOCALIZED: Copper Shingle Stairs",
"block.create.copper_shingles": "UNLOCALIZED: Copper Shingles",
"block.create.copper_tile_slab": "UNLOCALIZED: Copper Tile Slab",
"block.create.copper_tile_stairs": "UNLOCALIZED: Copper Tile Stairs",
"block.create.copper_tiles": "UNLOCALIZED: Copper Tiles",
"block.create.copper_shingle_slab": "Laje de telha de cobre",
"block.create.copper_shingle_stairs": "Escada de telha de cobre",
"block.create.copper_shingles": "Telha de cobre",
"block.create.copper_tile_slab": "Laje de ladrilho de cobre",
"block.create.copper_tile_stairs": "Escada de ladrilho de cobre",
"block.create.copper_tiles": "Ladrilho de cobre",
"block.create.copper_valve_handle": "Válvula de Cobre",
"block.create.creative_crate": "Caixa Criativa",
"block.create.creative_fluid_tank": "Tanque de Fluidos Criativo",
"block.create.creative_motor": "Motor Criativo",
"block.create.crimsite": "UNLOCALIZED: Crimsite",
"block.create.crimsite_pillar": "UNLOCALIZED: Crimsite Pillar",
"block.create.crimson_window": "UNLOCALIZED: Crimson Window",
"block.create.crimson_window_pane": "UNLOCALIZED: Crimson Window Pane",
"block.create.crimsite": "Carmesito",
"block.create.crimsite_pillar": "Pilar de Camesito",
"block.create.crimson_window": "Janela carmesim",
"block.create.crimson_window_pane": "Vidraça carmesim",
"block.create.crushing_wheel": "Roda de Moer",
"block.create.crushing_wheel_controller": "UNLOCALIZED: Crushing Wheel Controller",
"block.create.crushing_wheel_controller": "Controlador da roda de moer",
"block.create.cuckoo_clock": "Relógio Cuckoo",
"block.create.cut_andesite": "UNLOCALIZED: Cut Andesite",
"block.create.cut_andesite_brick_slab": "UNLOCALIZED: Cut Andesite Brick Slab",
"block.create.cut_andesite_brick_stairs": "UNLOCALIZED: Cut Andesite Brick Stairs",
"block.create.cut_andesite_brick_wall": "UNLOCALIZED: Cut Andesite Brick Wall",
"block.create.cut_andesite_bricks": "UNLOCALIZED: Cut Andesite Bricks",
"block.create.cut_andesite_slab": "UNLOCALIZED: Cut Andesite Slab",
"block.create.cut_andesite_stairs": "UNLOCALIZED: Cut Andesite Stairs",
"block.create.cut_andesite_wall": "UNLOCALIZED: Cut Andesite Wall",
"block.create.cut_asurine": "UNLOCALIZED: Cut Asurine",
"block.create.cut_asurine_brick_slab": "UNLOCALIZED: Cut Asurine Brick Slab",
"block.create.cut_asurine_brick_stairs": "UNLOCALIZED: Cut Asurine Brick Stairs",
"block.create.cut_asurine_brick_wall": "UNLOCALIZED: Cut Asurine Brick Wall",
"block.create.cut_asurine_bricks": "UNLOCALIZED: Cut Asurine Bricks",
"block.create.cut_asurine_slab": "UNLOCALIZED: Cut Asurine Slab",
"block.create.cut_asurine_stairs": "UNLOCALIZED: Cut Asurine Stairs",
"block.create.cut_asurine_wall": "UNLOCALIZED: Cut Asurine Wall",
"block.create.cut_calcite": "UNLOCALIZED: Cut Calcite",
"block.create.cut_calcite_brick_slab": "UNLOCALIZED: Cut Calcite Brick Slab",
"block.create.cut_calcite_brick_stairs": "UNLOCALIZED: Cut Calcite Brick Stairs",
"block.create.cut_calcite_brick_wall": "UNLOCALIZED: Cut Calcite Brick Wall",
"block.create.cut_calcite_bricks": "UNLOCALIZED: Cut Calcite Bricks",
"block.create.cut_calcite_slab": "UNLOCALIZED: Cut Calcite Slab",
"block.create.cut_calcite_stairs": "UNLOCALIZED: Cut Calcite Stairs",
"block.create.cut_calcite_wall": "UNLOCALIZED: Cut Calcite Wall",
"block.create.cut_crimsite": "UNLOCALIZED: Cut Crimsite",
"block.create.cut_crimsite_brick_slab": "UNLOCALIZED: Cut Crimsite Brick Slab",
"block.create.cut_crimsite_brick_stairs": "UNLOCALIZED: Cut Crimsite Brick Stairs",
"block.create.cut_crimsite_brick_wall": "UNLOCALIZED: Cut Crimsite Brick Wall",
"block.create.cut_crimsite_bricks": "UNLOCALIZED: Cut Crimsite Bricks",
"block.create.cut_crimsite_slab": "UNLOCALIZED: Cut Crimsite Slab",
"block.create.cut_crimsite_stairs": "UNLOCALIZED: Cut Crimsite Stairs",
"block.create.cut_crimsite_wall": "UNLOCALIZED: Cut Crimsite Wall",
"block.create.cut_deepslate": "UNLOCALIZED: Cut Deepslate",
"block.create.cut_deepslate_brick_slab": "UNLOCALIZED: Cut Deepslate Brick Slab",
"block.create.cut_deepslate_brick_stairs": "UNLOCALIZED: Cut Deepslate Brick Stairs",
"block.create.cut_deepslate_brick_wall": "UNLOCALIZED: Cut Deepslate Brick Wall",
"block.create.cut_deepslate_bricks": "UNLOCALIZED: Cut Deepslate Bricks",
"block.create.cut_deepslate_slab": "UNLOCALIZED: Cut Deepslate Slab",
"block.create.cut_deepslate_stairs": "UNLOCALIZED: Cut Deepslate Stairs",
"block.create.cut_deepslate_wall": "UNLOCALIZED: Cut Deepslate Wall",
"block.create.cut_diorite": "UNLOCALIZED: Cut Diorite",
"block.create.cut_diorite_brick_slab": "UNLOCALIZED: Cut Diorite Brick Slab",
"block.create.cut_diorite_brick_stairs": "UNLOCALIZED: Cut Diorite Brick Stairs",
"block.create.cut_diorite_brick_wall": "UNLOCALIZED: Cut Diorite Brick Wall",
"block.create.cut_diorite_bricks": "UNLOCALIZED: Cut Diorite Bricks",
"block.create.cut_diorite_slab": "UNLOCALIZED: Cut Diorite Slab",
"block.create.cut_diorite_stairs": "UNLOCALIZED: Cut Diorite Stairs",
"block.create.cut_diorite_wall": "UNLOCALIZED: Cut Diorite Wall",
"block.create.cut_dripstone": "UNLOCALIZED: Cut Dripstone",
"block.create.cut_dripstone_brick_slab": "UNLOCALIZED: Cut Dripstone Brick Slab",
"block.create.cut_dripstone_brick_stairs": "UNLOCALIZED: Cut Dripstone Brick Stairs",
"block.create.cut_dripstone_brick_wall": "UNLOCALIZED: Cut Dripstone Brick Wall",
"block.create.cut_dripstone_bricks": "UNLOCALIZED: Cut Dripstone Bricks",
"block.create.cut_dripstone_slab": "UNLOCALIZED: Cut Dripstone Slab",
"block.create.cut_dripstone_stairs": "UNLOCALIZED: Cut Dripstone Stairs",
"block.create.cut_dripstone_wall": "UNLOCALIZED: Cut Dripstone Wall",
"block.create.cut_granite": "UNLOCALIZED: Cut Granite",
"block.create.cut_granite_brick_slab": "UNLOCALIZED: Cut Granite Brick Slab",
"block.create.cut_granite_brick_stairs": "UNLOCALIZED: Cut Granite Brick Stairs",
"block.create.cut_granite_brick_wall": "UNLOCALIZED: Cut Granite Brick Wall",
"block.create.cut_granite_bricks": "UNLOCALIZED: Cut Granite Bricks",
"block.create.cut_granite_slab": "UNLOCALIZED: Cut Granite Slab",
"block.create.cut_granite_stairs": "UNLOCALIZED: Cut Granite Stairs",
"block.create.cut_granite_wall": "UNLOCALIZED: Cut Granite Wall",
"block.create.cut_limestone": "UNLOCALIZED: Cut Limestone",
"block.create.cut_limestone_brick_slab": "UNLOCALIZED: Cut Limestone Brick Slab",
"block.create.cut_limestone_brick_stairs": "UNLOCALIZED: Cut Limestone Brick Stairs",
"block.create.cut_limestone_brick_wall": "UNLOCALIZED: Cut Limestone Brick Wall",
"block.create.cut_limestone_bricks": "UNLOCALIZED: Cut Limestone Bricks",
"block.create.cut_limestone_slab": "UNLOCALIZED: Cut Limestone Slab",
"block.create.cut_limestone_stairs": "UNLOCALIZED: Cut Limestone Stairs",
"block.create.cut_limestone_wall": "UNLOCALIZED: Cut Limestone Wall",
"block.create.cut_ochrum": "UNLOCALIZED: Cut Ochrum",
"block.create.cut_ochrum_brick_slab": "UNLOCALIZED: Cut Ochrum Brick Slab",
"block.create.cut_ochrum_brick_stairs": "UNLOCALIZED: Cut Ochrum Brick Stairs",
"block.create.cut_ochrum_brick_wall": "UNLOCALIZED: Cut Ochrum Brick Wall",
"block.create.cut_ochrum_bricks": "UNLOCALIZED: Cut Ochrum Bricks",
"block.create.cut_ochrum_slab": "UNLOCALIZED: Cut Ochrum Slab",
"block.create.cut_ochrum_stairs": "UNLOCALIZED: Cut Ochrum Stairs",
"block.create.cut_ochrum_wall": "UNLOCALIZED: Cut Ochrum Wall",
"block.create.cut_scorchia": "UNLOCALIZED: Cut Scorchia",
"block.create.cut_scorchia_brick_slab": "UNLOCALIZED: Cut Scorchia Brick Slab",
"block.create.cut_scorchia_brick_stairs": "UNLOCALIZED: Cut Scorchia Brick Stairs",
"block.create.cut_scorchia_brick_wall": "UNLOCALIZED: Cut Scorchia Brick Wall",
"block.create.cut_scorchia_bricks": "UNLOCALIZED: Cut Scorchia Bricks",
"block.create.cut_scorchia_slab": "UNLOCALIZED: Cut Scorchia Slab",
"block.create.cut_scorchia_stairs": "UNLOCALIZED: Cut Scorchia Stairs",
"block.create.cut_scorchia_wall": "UNLOCALIZED: Cut Scorchia Wall",
"block.create.cut_scoria": "UNLOCALIZED: Cut Scoria",
"block.create.cut_scoria_brick_slab": "UNLOCALIZED: Cut Scoria Brick Slab",
"block.create.cut_scoria_brick_stairs": "UNLOCALIZED: Cut Scoria Brick Stairs",
"block.create.cut_scoria_brick_wall": "UNLOCALIZED: Cut Scoria Brick Wall",
"block.create.cut_scoria_bricks": "UNLOCALIZED: Cut Scoria Bricks",
"block.create.cut_scoria_slab": "UNLOCALIZED: Cut Scoria Slab",
"block.create.cut_scoria_stairs": "UNLOCALIZED: Cut Scoria Stairs",
"block.create.cut_scoria_wall": "UNLOCALIZED: Cut Scoria Wall",
"block.create.cut_tuff": "UNLOCALIZED: Cut Tuff",
"block.create.cut_tuff_brick_slab": "UNLOCALIZED: Cut Tuff Brick Slab",
"block.create.cut_tuff_brick_stairs": "UNLOCALIZED: Cut Tuff Brick Stairs",
"block.create.cut_tuff_brick_wall": "UNLOCALIZED: Cut Tuff Brick Wall",
"block.create.cut_tuff_bricks": "UNLOCALIZED: Cut Tuff Bricks",
"block.create.cut_tuff_slab": "UNLOCALIZED: Cut Tuff Slab",
"block.create.cut_tuff_stairs": "UNLOCALIZED: Cut Tuff Stairs",
"block.create.cut_tuff_wall": "UNLOCALIZED: Cut Tuff Wall",
"block.create.cut_veridium": "UNLOCALIZED: Cut Veridium",
"block.create.cut_veridium_brick_slab": "UNLOCALIZED: Cut Veridium Brick Slab",
"block.create.cut_veridium_brick_stairs": "UNLOCALIZED: Cut Veridium Brick Stairs",
"block.create.cut_veridium_brick_wall": "UNLOCALIZED: Cut Veridium Brick Wall",
"block.create.cut_veridium_bricks": "UNLOCALIZED: Cut Veridium Bricks",
"block.create.cut_veridium_slab": "UNLOCALIZED: Cut Veridium Slab",
"block.create.cut_veridium_stairs": "UNLOCALIZED: Cut Veridium Stairs",
"block.create.cut_veridium_wall": "UNLOCALIZED: Cut Veridium Wall",
"block.create.cut_andesite": "Andesito lapidado",
"block.create.cut_andesite_brick_slab": "Laje de tijolos lapidados de andesito",
"block.create.cut_andesite_brick_stairs": "Escada de tijolos lapidados de andesito",
"block.create.cut_andesite_brick_wall": "Muro de tijolos lapidados de andesito",
"block.create.cut_andesite_bricks": "Tijolos lapidados de andesito",
"block.create.cut_andesite_slab": "Laje de andesito lapidado",
"block.create.cut_andesite_stairs": "Escada de andesito lapidado",
"block.create.cut_andesite_wall": "Muro de andesito lapidado",
"block.create.cut_asurine": "Asurino lapidado",
"block.create.cut_asurine_brick_slab": "Laje de tijolos lapidados de Asurino",
"block.create.cut_asurine_brick_stairs": "Escada de tijolos lapidados de Asurino",
"block.create.cut_asurine_brick_wall": "Muro de tijolos lapidados de Asurino",
"block.create.cut_asurine_bricks": "Tijolos lapidados de Asurino",
"block.create.cut_asurine_slab": "Laje de Asurino lapidado",
"block.create.cut_asurine_stairs": "Escada de Asurino lapidado",
"block.create.cut_asurine_wall": "Muro de Asurino lapidado",
"block.create.cut_calcite": "Calcita lapidada",
"block.create.cut_calcite_brick_slab": "Laje de tijolos lapidados de Calcita",
"block.create.cut_calcite_brick_stairs": "Escada de tijolos lapidados de Calcita",
"block.create.cut_calcite_brick_wall": "Muro de tijolos lapidados de Calcita",
"block.create.cut_calcite_bricks": "Tijolos lapidados de Calcita",
"block.create.cut_calcite_slab": "Laje de Calcita lapidada",
"block.create.cut_calcite_stairs": "Escada de Calcita lapidada",
"block.create.cut_calcite_wall": "Muro de Calcita lapidada",
"block.create.cut_crimsite": "Carmesito lapidado",
"block.create.cut_crimsite_brick_slab": "Laje de tijolos lapidados de Carmesito",
"block.create.cut_crimsite_brick_stairs": "Escada de tijolos lapidados de Carmesito",
"block.create.cut_crimsite_brick_wall": "Muro de tijolos lapidados de Carmesito",
"block.create.cut_crimsite_bricks": "Tijolos lapidados de Carmesito",
"block.create.cut_crimsite_slab": "Laje de Carmesito lapidado",
"block.create.cut_crimsite_stairs": "Escada de Carmesito lapidado",
"block.create.cut_crimsite_wall": "Muro de Carmesito lapidado",
"block.create.cut_deepslate": "Ardósia lapidada",
"block.create.cut_deepslate_brick_slab": "Laje de tijolos lapidados de ardósia",
"block.create.cut_deepslate_brick_stairs": "Escada de tijolos lapidados de ardósia",
"block.create.cut_deepslate_brick_wall": "Muro de tijolos lapidados de ardósia",
"block.create.cut_deepslate_bricks": "Tijolos lapidados de ardósia",
"block.create.cut_deepslate_slab": "Laje de ardósia lapidada",
"block.create.cut_deepslate_stairs": "Escada de ardósia lapidada",
"block.create.cut_deepslate_wall": "Muro de ardósia lapidada",
"block.create.cut_diorite": "Diorito lapidado",
"block.create.cut_diorite_brick_slab": "Laje de tijolos lapidados de diorito",
"block.create.cut_diorite_brick_stairs": "Escada de tijolos lapidados de diorito",
"block.create.cut_diorite_brick_wall": "Muro de tijolos lapidados de diorito",
"block.create.cut_diorite_bricks": "Tijolos lapidados de diorito",
"block.create.cut_diorite_slab": "Laje de diorito lapidado",
"block.create.cut_diorite_stairs": "Escada de diorito lapidado",
"block.create.cut_diorite_wall": "Muro de diorito lapidado",
"block.create.cut_dripstone": "Espeleotema lapidado",
"block.create.cut_dripstone_brick_slab": "Laje de tijolos lapidados de espeleotema",
"block.create.cut_dripstone_brick_stairs": "Escada de tijolos lapidados de espeleotema",
"block.create.cut_dripstone_brick_wall": "Muro de tijolos lapidados de espeleotema",
"block.create.cut_dripstone_bricks": "Tijolos lapidados de espeleotema",
"block.create.cut_dripstone_slab": "Laje de espeleotema lapidado",
"block.create.cut_dripstone_stairs": "Escada de espeleotema lapidado",
"block.create.cut_dripstone_wall": "Muro de espeleotema lapidado",
"block.create.cut_granite": "Granito lapidado",
"block.create.cut_granite_brick_slab": "Laje de tijolos lapidados de granito",
"block.create.cut_granite_brick_stairs": "Escada de tijolos lapidados de granito",
"block.create.cut_granite_brick_wall": "Muro de tijolos lapidados de granito",
"block.create.cut_granite_bricks": "Tijolos lapidados de granito",
"block.create.cut_granite_slab": "Laje de granito lapidado",
"block.create.cut_granite_stairs": "Escada de granito lapidado",
"block.create.cut_granite_wall": "Muro de granito lapidado",
"block.create.cut_limestone": "Calcário lapidado",
"block.create.cut_limestone_brick_slab": "Laje de tijolos lapidados de calcário",
"block.create.cut_limestone_brick_stairs": "Escada de tijolos lapidados de calcário",
"block.create.cut_limestone_brick_wall": "Muro de tijolos lapidados de calcário",
"block.create.cut_limestone_bricks": "Tijolos lapidados de calcário",
"block.create.cut_limestone_slab": "Laje de calcário lapidado",
"block.create.cut_limestone_stairs": "Escada de calcário lapidado",
"block.create.cut_limestone_wall": "Muro de calcário lapidado",
"block.create.cut_ochrum": "Ocrom",
"block.create.cut_ochrum_brick_slab": "Laje de tijolos lapidados de Ocrom",
"block.create.cut_ochrum_brick_stairs": "Escada de tijolos lapidados de Ocrom",
"block.create.cut_ochrum_brick_wall": "Muro de tijolos lapidados de Ocrom",
"block.create.cut_ochrum_bricks": "Tijolos lapidados de Ocrom",
"block.create.cut_ochrum_slab": "Laje de Ocrom lapidado",
"block.create.cut_ochrum_stairs": "Escada de Ocrom lapidado",
"block.create.cut_ochrum_wall": "Muro de Ocrom lapidado",
"block.create.cut_scorchia": "Escória negra lapidada",
"block.create.cut_scorchia_brick_slab": "Laje de tijolos lapidados de escória negra",
"block.create.cut_scorchia_brick_stairs": "Escada de tijolos lapidados de escória negra",
"block.create.cut_scorchia_brick_wall": "Muro de tijolos lapidados de escória negra",
"block.create.cut_scorchia_bricks": "Tijolos lapidados de escória negra",
"block.create.cut_scorchia_slab": "Laje de escória negra lapidada",
"block.create.cut_scorchia_stairs": "Escada de escória negra lapidada",
"block.create.cut_scorchia_wall": "Muro de escória negra lapidada",
"block.create.cut_scoria": "Escória lapidada",
"block.create.cut_scoria_brick_slab": "Laje de tijolos lapidados de escória",
"block.create.cut_scoria_brick_stairs": "Escada de tijolos lapidados de escória",
"block.create.cut_scoria_brick_wall": "Muro de tijolos lapidados de escória",
"block.create.cut_scoria_bricks": "Tijolos lapidados de escória",
"block.create.cut_scoria_slab": "Laje de escória lapidada",
"block.create.cut_scoria_stairs": "Escada de escória lapidada",
"block.create.cut_scoria_wall": "Muro de escória lapidada",
"block.create.cut_tuff": "Tufo lapidado",
"block.create.cut_tuff_brick_slab": "Laje de tijolos lapidados de tufo",
"block.create.cut_tuff_brick_stairs": "Escada de tijolos lapidados de tufo",
"block.create.cut_tuff_brick_wall": "Muro de tijolos lapidados de tufo",
"block.create.cut_tuff_bricks": "Tijolos lapidados de tufo",
"block.create.cut_tuff_slab": "Laje de tufo lapidado",
"block.create.cut_tuff_stairs": "Escada de tufo lapidado",
"block.create.cut_tuff_wall": "Muro de tufo lapidado",
"block.create.cut_veridium": "Veridiano lapidado",
"block.create.cut_veridium_brick_slab": "Laje de tijolos lapidados de Veridiano",
"block.create.cut_veridium_brick_stairs": "Escada de tijolos lapidados de Veridiano",
"block.create.cut_veridium_brick_wall": "Muro de tijolos lapidados de Veridiano",
"block.create.cut_veridium_bricks": "Tijolos lapidados de Veridiano",
"block.create.cut_veridium_slab": "Laje de Veridiano lapidado",
"block.create.cut_veridium_stairs": "Escada de Veridiano lapidado",
"block.create.cut_veridium_wall": "Muro de Veridiano lapidado",
"block.create.cyan_nixie_tube": "Tubo nixie ciano",
"block.create.cyan_sail": "Vela ciano",
"block.create.cyan_seat": "Assento ciano",
"block.create.cyan_toolbox": "caixa de ferramentas ciano",
"block.create.cyan_valve_handle": "Válvula ciano",
"block.create.dark_oak_window": "UNLOCALIZED: Dark Oak Window",
"block.create.dark_oak_window_pane": "UNLOCALIZED: Dark Oak Window Pane",
"block.create.deepslate_pillar": "UNLOCALIZED: Deepslate Pillar",
"block.create.dark_oak_window": "Janela de carvalho escuro",
"block.create.dark_oak_window_pane": "Vidraça de carvalho escuro",
"block.create.deepslate_pillar": "Pilar de ardósia",
"block.create.deepslate_zinc_ore": "Minério de zinco de ardósia",
"block.create.deployer": "Implantador",
"block.create.depot": "Depósito",
"block.create.diorite_pillar": "UNLOCALIZED: Diorite Pillar",
"block.create.dripstone_pillar": "UNLOCALIZED: Dripstone Pillar",
"block.create.diorite_pillar": "Pilar de diorito",
"block.create.dripstone_pillar": "Pilar de espeleotema",
"block.create.encased_chain_drive": "Correia Revestida",
"block.create.encased_fan": "Ventilador Revestida",
"block.create.encased_fluid_pipe": "Cano de Fluidos Revestido",
"block.create.exposed_copper_shingle_slab": "UNLOCALIZED: Exposed Copper Shingle Slab",
"block.create.exposed_copper_shingle_stairs": "UNLOCALIZED: Exposed Copper Shingle Stairs",
"block.create.exposed_copper_shingles": "UNLOCALIZED: Exposed Copper Shingles",
"block.create.exposed_copper_tile_slab": "UNLOCALIZED: Exposed Copper Tile Slab",
"block.create.exposed_copper_tile_stairs": "UNLOCALIZED: Exposed Copper Tile Stairs",
"block.create.exposed_copper_tiles": "UNLOCALIZED: Exposed Copper Tiles",
"block.create.exposed_copper_shingle_slab": "Laje de telha de cobre exposta",
"block.create.exposed_copper_shingle_stairs": "Escada de telha de cobre exposta",
"block.create.exposed_copper_shingles": "Telha de cobre exposta",
"block.create.exposed_copper_tile_slab": "Laje de ladrilho de cobre exposta",
"block.create.exposed_copper_tile_stairs": "Escada de ladrilho de cobre exposta",
"block.create.exposed_copper_tiles": "Ladrilho de cobre exposto",
"block.create.fluid_pipe": "Cano de Fluido",
"block.create.fluid_tank": "Tanque de fluido",
"block.create.fluid_valve": "Válvula",
"block.create.flywheel": "Volante de inércia",
"block.create.framed_glass": "UNLOCALIZED: Framed Glass",
"block.create.framed_glass_pane": "UNLOCALIZED: Framed Glass Pane",
"block.create.framed_glass": "Vidro emoldurado",
"block.create.framed_glass_pane": "Vidraça emoldurada",
"block.create.furnace_engine": "Motor de Fornalha",
"block.create.gantry_carriage": "Carruagem de Pórtico",
"block.create.gantry_shaft": "Eixo de Pórtico",
"block.create.gearbox": "Caixa de Transmissão",
"block.create.gearshift": "Câmbio",
"block.create.glass_fluid_pipe": "Cano de Fluido de Vidro",
"block.create.granite_pillar": "UNLOCALIZED: Granite Pillar",
"block.create.granite_pillar": "Pilar de granito",
"block.create.gray_nixie_tube": "Tubo nixie cinza",
"block.create.gray_sail": "Vela cinza",
"block.create.gray_seat": "Assento cinza",
@ -234,29 +234,29 @@
"block.create.hand_crank": "Manivela",
"block.create.haunted_bell": "Sino assombrado",
"block.create.honey": "Mel",
"block.create.horizontal_framed_glass": "UNLOCALIZED: Horizontal Framed Glass",
"block.create.horizontal_framed_glass_pane": "UNLOCALIZED: Horizontal Framed Glass Pane",
"block.create.horizontal_framed_glass": "Vidro emoldurado horizontal",
"block.create.horizontal_framed_glass_pane": "Vidraça emoldurada horizontal",
"block.create.hose_pulley": "Polia de Mangueira",
"block.create.item_drain": "Dreno de Item",
"block.create.item_vault": "Cofre de itens",
"block.create.jungle_window": "UNLOCALIZED: Jungle Window",
"block.create.jungle_window_pane": "UNLOCALIZED: Jungle Window Pane",
"block.create.jungle_window": "Janela da selva",
"block.create.jungle_window_pane": "Vidraça da selva",
"block.create.large_bogey": "UNLOCALIZED: Large Bogey",
"block.create.large_cogwheel": "UNLOCALIZED: Large Cogwheel",
"block.create.layered_andesite": "UNLOCALIZED: Layered Andesite",
"block.create.layered_asurine": "UNLOCALIZED: Layered Asurine",
"block.create.layered_calcite": "UNLOCALIZED: Layered Calcite",
"block.create.layered_crimsite": "UNLOCALIZED: Layered Crimsite",
"block.create.layered_deepslate": "UNLOCALIZED: Layered Deepslate",
"block.create.layered_diorite": "UNLOCALIZED: Layered Diorite",
"block.create.layered_dripstone": "UNLOCALIZED: Layered Dripstone",
"block.create.layered_granite": "UNLOCALIZED: Layered Granite",
"block.create.layered_limestone": "UNLOCALIZED: Layered Limestone",
"block.create.layered_ochrum": "UNLOCALIZED: Layered Ochrum",
"block.create.layered_scorchia": "UNLOCALIZED: Layered Scorchia",
"block.create.layered_scoria": "UNLOCALIZED: Layered Scoria",
"block.create.layered_tuff": "UNLOCALIZED: Layered Tuff",
"block.create.layered_veridium": "UNLOCALIZED: Layered Veridium",
"block.create.large_cogwheel": "Roda dentada grande",
"block.create.layered_andesite": "Andesito estratificado",
"block.create.layered_asurine": "Asurino estratificado",
"block.create.layered_calcite": "Calcita estratificada",
"block.create.layered_crimsite": "Carmesito estratificado",
"block.create.layered_deepslate": "Ardósia estratificado",
"block.create.layered_diorite": "Diorito estratificado",
"block.create.layered_dripstone": "Espeleotema estratificado",
"block.create.layered_granite": "Granito estratificado",
"block.create.layered_limestone": "Calcário estratificado",
"block.create.layered_ochrum": "Ocrom estratificado",
"block.create.layered_scorchia": "Escória negra estratificada",
"block.create.layered_scoria": "Escória estratificada",
"block.create.layered_tuff": "Tufo estratificado",
"block.create.layered_veridium": "Veridiano estratificado",
"block.create.lectern_controller": "Controle de Atril",
"block.create.light_blue_nixie_tube": "tubo nixie azul claro",
"block.create.light_blue_sail": "Vela azul claro",
@ -302,22 +302,22 @@
"block.create.mysterious_cuckoo_clock": "Relógio cuckoo",
"block.create.nixie_tube": "Tubo Nixie",
"block.create.nozzle": "Bocal",
"block.create.oak_window": "UNLOCALIZED: Oak Window",
"block.create.oak_window_pane": "UNLOCALIZED: Oak Window Pane",
"block.create.ochrum": "UNLOCALIZED: Ochrum",
"block.create.ochrum_pillar": "UNLOCALIZED: Ochrum Pillar",
"block.create.oak_window": "janela de carvalho",
"block.create.oak_window_pane": "Vidraça de carvalho",
"block.create.ochrum": "Ocrom",
"block.create.ochrum_pillar": "Pilar de Ocrom",
"block.create.orange_sail": "Vela laranja",
"block.create.orange_seat": "Assento laranja",
"block.create.orange_toolbox": "Caixa de ferramentas laranja",
"block.create.orange_valve_handle": "Válvula laranja",
"block.create.ornate_iron_window": "UNLOCALIZED: Ornate Iron Window",
"block.create.ornate_iron_window_pane": "UNLOCALIZED: Ornate Iron Window Pane",
"block.create.oxidized_copper_shingle_slab": "UNLOCALIZED: Oxidized Copper Shingle Slab",
"block.create.oxidized_copper_shingle_stairs": "UNLOCALIZED: Oxidized Copper Shingle Stairs",
"block.create.oxidized_copper_shingles": "UNLOCALIZED: Oxidized Copper Shingles",
"block.create.oxidized_copper_tile_slab": "UNLOCALIZED: Oxidized Copper Tile Slab",
"block.create.oxidized_copper_tile_stairs": "UNLOCALIZED: Oxidized Copper Tile Stairs",
"block.create.oxidized_copper_tiles": "UNLOCALIZED: Oxidized Copper Tiles",
"block.create.ornate_iron_window": "Janela ornamentada com ferro",
"block.create.ornate_iron_window_pane": "Vidraça ornamentada com ferro",
"block.create.oxidized_copper_shingle_slab": "Laje de telha de cobre oxidada",
"block.create.oxidized_copper_shingle_stairs": "Escada de telha de cobre oxidada",
"block.create.oxidized_copper_shingles": "Telha de cobre oxidada",
"block.create.oxidized_copper_tile_slab": "Laje de ladrilho de cobre oxidado",
"block.create.oxidized_copper_tile_stairs": "Escada de ladrilho de cobre oxidado",
"block.create.oxidized_copper_tiles": "Ladrilho de cobre oxidado",
"block.create.peculiar_bell": "Sino peculiar",
"block.create.pink_nixie_tube": "Tubo nixie rosa",
"block.create.pink_sail": "Vela rosa",
@ -325,67 +325,67 @@
"block.create.pink_toolbox": "Caixa de ferramentas rosa",
"block.create.pink_valve_handle": "Válvula rosa",
"block.create.piston_extension_pole": "Vara de Extensão do Pistão",
"block.create.polished_cut_andesite": "UNLOCALIZED: Polished Cut Andesite",
"block.create.polished_cut_andesite_slab": "UNLOCALIZED: Polished Cut Andesite Slab",
"block.create.polished_cut_andesite_stairs": "UNLOCALIZED: Polished Cut Andesite Stairs",
"block.create.polished_cut_andesite_wall": "UNLOCALIZED: Polished Cut Andesite Wall",
"block.create.polished_cut_asurine": "UNLOCALIZED: Polished Cut Asurine",
"block.create.polished_cut_asurine_slab": "UNLOCALIZED: Polished Cut Asurine Slab",
"block.create.polished_cut_asurine_stairs": "UNLOCALIZED: Polished Cut Asurine Stairs",
"block.create.polished_cut_asurine_wall": "UNLOCALIZED: Polished Cut Asurine Wall",
"block.create.polished_cut_calcite": "UNLOCALIZED: Polished Cut Calcite",
"block.create.polished_cut_calcite_slab": "UNLOCALIZED: Polished Cut Calcite Slab",
"block.create.polished_cut_calcite_stairs": "UNLOCALIZED: Polished Cut Calcite Stairs",
"block.create.polished_cut_calcite_wall": "UNLOCALIZED: Polished Cut Calcite Wall",
"block.create.polished_cut_crimsite": "UNLOCALIZED: Polished Cut Crimsite",
"block.create.polished_cut_crimsite_slab": "UNLOCALIZED: Polished Cut Crimsite Slab",
"block.create.polished_cut_crimsite_stairs": "UNLOCALIZED: Polished Cut Crimsite Stairs",
"block.create.polished_cut_crimsite_wall": "UNLOCALIZED: Polished Cut Crimsite Wall",
"block.create.polished_cut_deepslate": "UNLOCALIZED: Polished Cut Deepslate",
"block.create.polished_cut_deepslate_slab": "UNLOCALIZED: Polished Cut Deepslate Slab",
"block.create.polished_cut_deepslate_stairs": "UNLOCALIZED: Polished Cut Deepslate Stairs",
"block.create.polished_cut_deepslate_wall": "UNLOCALIZED: Polished Cut Deepslate Wall",
"block.create.polished_cut_diorite": "UNLOCALIZED: Polished Cut Diorite",
"block.create.polished_cut_diorite_slab": "UNLOCALIZED: Polished Cut Diorite Slab",
"block.create.polished_cut_diorite_stairs": "UNLOCALIZED: Polished Cut Diorite Stairs",
"block.create.polished_cut_diorite_wall": "UNLOCALIZED: Polished Cut Diorite Wall",
"block.create.polished_cut_dripstone": "UNLOCALIZED: Polished Cut Dripstone",
"block.create.polished_cut_dripstone_slab": "UNLOCALIZED: Polished Cut Dripstone Slab",
"block.create.polished_cut_dripstone_stairs": "UNLOCALIZED: Polished Cut Dripstone Stairs",
"block.create.polished_cut_dripstone_wall": "UNLOCALIZED: Polished Cut Dripstone Wall",
"block.create.polished_cut_granite": "UNLOCALIZED: Polished Cut Granite",
"block.create.polished_cut_granite_slab": "UNLOCALIZED: Polished Cut Granite Slab",
"block.create.polished_cut_granite_stairs": "UNLOCALIZED: Polished Cut Granite Stairs",
"block.create.polished_cut_granite_wall": "UNLOCALIZED: Polished Cut Granite Wall",
"block.create.polished_cut_limestone": "UNLOCALIZED: Polished Cut Limestone",
"block.create.polished_cut_limestone_slab": "UNLOCALIZED: Polished Cut Limestone Slab",
"block.create.polished_cut_limestone_stairs": "UNLOCALIZED: Polished Cut Limestone Stairs",
"block.create.polished_cut_limestone_wall": "UNLOCALIZED: Polished Cut Limestone Wall",
"block.create.polished_cut_ochrum": "UNLOCALIZED: Polished Cut Ochrum",
"block.create.polished_cut_ochrum_slab": "UNLOCALIZED: Polished Cut Ochrum Slab",
"block.create.polished_cut_ochrum_stairs": "UNLOCALIZED: Polished Cut Ochrum Stairs",
"block.create.polished_cut_ochrum_wall": "UNLOCALIZED: Polished Cut Ochrum Wall",
"block.create.polished_cut_scorchia": "UNLOCALIZED: Polished Cut Scorchia",
"block.create.polished_cut_scorchia_slab": "UNLOCALIZED: Polished Cut Scorchia Slab",
"block.create.polished_cut_scorchia_stairs": "UNLOCALIZED: Polished Cut Scorchia Stairs",
"block.create.polished_cut_scorchia_wall": "UNLOCALIZED: Polished Cut Scorchia Wall",
"block.create.polished_cut_scoria": "UNLOCALIZED: Polished Cut Scoria",
"block.create.polished_cut_scoria_slab": "UNLOCALIZED: Polished Cut Scoria Slab",
"block.create.polished_cut_scoria_stairs": "UNLOCALIZED: Polished Cut Scoria Stairs",
"block.create.polished_cut_scoria_wall": "UNLOCALIZED: Polished Cut Scoria Wall",
"block.create.polished_cut_tuff": "UNLOCALIZED: Polished Cut Tuff",
"block.create.polished_cut_tuff_slab": "UNLOCALIZED: Polished Cut Tuff Slab",
"block.create.polished_cut_tuff_stairs": "UNLOCALIZED: Polished Cut Tuff Stairs",
"block.create.polished_cut_tuff_wall": "UNLOCALIZED: Polished Cut Tuff Wall",
"block.create.polished_cut_veridium": "UNLOCALIZED: Polished Cut Veridium",
"block.create.polished_cut_veridium_slab": "UNLOCALIZED: Polished Cut Veridium Slab",
"block.create.polished_cut_veridium_stairs": "UNLOCALIZED: Polished Cut Veridium Stairs",
"block.create.polished_cut_veridium_wall": "UNLOCALIZED: Polished Cut Veridium Wall",
"block.create.polished_cut_andesite": "Andesito lapidado polido",
"block.create.polished_cut_andesite_slab": "Laje de andesito lapidado polido",
"block.create.polished_cut_andesite_stairs": "Escada de andesito lapidado polido",
"block.create.polished_cut_andesite_wall": "Muro de andesito lapidado polido",
"block.create.polished_cut_asurine": "Asurino lapidado polido",
"block.create.polished_cut_asurine_slab": "Laje de Asurino lapidado polido",
"block.create.polished_cut_asurine_stairs": "Escada de Asurino lapidado polido",
"block.create.polished_cut_asurine_wall": "Muro de Asurino lapidado polido",
"block.create.polished_cut_calcite": "Calcita lapidada polida",
"block.create.polished_cut_calcite_slab": "Laje de calcita lapidada polida",
"block.create.polished_cut_calcite_stairs": "Escada de calcita lapidada polida",
"block.create.polished_cut_calcite_wall": "Muro de calcita lapidada polida",
"block.create.polished_cut_crimsite": "Carmesito lapidado polido",
"block.create.polished_cut_crimsite_slab": "Laje de Carmesito lapidado polido",
"block.create.polished_cut_crimsite_stairs": "Escada de Carmesito lapidado polido",
"block.create.polished_cut_crimsite_wall": "Muro de Carmesito lapidado polido",
"block.create.polished_cut_deepslate": "Ardósia lapidado polido",
"block.create.polished_cut_deepslate_slab": "Laje de ardósia lapidado polido",
"block.create.polished_cut_deepslate_stairs": "Escada de ardósia lapidado polido",
"block.create.polished_cut_deepslate_wall": "Muro de ardósia lapidado polido",
"block.create.polished_cut_diorite": "Diorito lapidado polido",
"block.create.polished_cut_diorite_slab": "Laje de diorito lapidado polido",
"block.create.polished_cut_diorite_stairs": "Escada de diorito lapidado polido",
"block.create.polished_cut_diorite_wall": "Muro de diorito lapidado polido",
"block.create.polished_cut_dripstone": "Espeleotema lapidado polido",
"block.create.polished_cut_dripstone_slab": "Laje de espeleotema lapidado polido",
"block.create.polished_cut_dripstone_stairs": "Escada de espeleotema lapidado polido",
"block.create.polished_cut_dripstone_wall": "Muro de espeleotema lapidado polido",
"block.create.polished_cut_granite": "Granito lapidado polido",
"block.create.polished_cut_granite_slab": "Laje de granito lapidado polido",
"block.create.polished_cut_granite_stairs": "Escada de granito lapidado polido",
"block.create.polished_cut_granite_wall": "Muro de granito lapidado polido",
"block.create.polished_cut_limestone": "Calcário lapidado polido",
"block.create.polished_cut_limestone_slab": "Laje de calcário lapidado polido",
"block.create.polished_cut_limestone_stairs": "Escada de calcário lapidado polido",
"block.create.polished_cut_limestone_wall": "Muro de calcário lapidado polido",
"block.create.polished_cut_ochrum": "Ocrom lapidado polido",
"block.create.polished_cut_ochrum_slab": "Laje de Ocrom lapidado polido",
"block.create.polished_cut_ochrum_stairs": "Escada de Ocrom lapidado polido",
"block.create.polished_cut_ochrum_wall": "Muro de Ocrom lapidado polido",
"block.create.polished_cut_scorchia": "Escória negra lapidada polida",
"block.create.polished_cut_scorchia_slab": "Laje de escória negra lapidada polida",
"block.create.polished_cut_scorchia_stairs": "Escada de escória negra lapidada polida",
"block.create.polished_cut_scorchia_wall": "Muro de escória negra lapidada polida",
"block.create.polished_cut_scoria": "Escória lapidada polida",
"block.create.polished_cut_scoria_slab": "Laje de escória lapidada polida",
"block.create.polished_cut_scoria_stairs": "Escada de escória lapidada polida",
"block.create.polished_cut_scoria_wall": "Muro de escória lapidada polida",
"block.create.polished_cut_tuff": "Tufo lapidado polido",
"block.create.polished_cut_tuff_slab": "Laje de tufo lapidado polido",
"block.create.polished_cut_tuff_stairs": "Escada de tufo lapidado polido",
"block.create.polished_cut_tuff_wall": "Muro de tufo lapidado polido",
"block.create.polished_cut_veridium": "Veridiano lapidado polido",
"block.create.polished_cut_veridium_slab": "Laje de Veridiano lapidado polido",
"block.create.polished_cut_veridium_stairs": "Escada de Veridiano lapidado polido",
"block.create.polished_cut_veridium_wall": "muro de Veridiano lapidado polido",
"block.create.portable_fluid_interface": "Interface de fluidos portátil",
"block.create.portable_storage_interface": "Interface de armazenamento portátil",
"block.create.powered_latch": "UNLOCALIZED: Powered Latch",
"block.create.powered_latch": "Trava de redstone",
"block.create.powered_shaft": "UNLOCALIZED: Powered Shaft",
"block.create.powered_toggle_latch": "UNLOCALIZED: Powered Toggle Latch",
"block.create.powered_toggle_latch": "Trave de alternância de redstone",
"block.create.pulley_magnet": "Imã da Polia",
"block.create.pulse_extender": "Extensor de pulso",
"block.create.pulse_repeater": "Repetidor de Pulso",
@ -410,77 +410,77 @@
"block.create.sail_frame": "moldura de vela",
"block.create.schematic_table": "Mesa de Esquema",
"block.create.schematicannon": "Canhão de Esquema",
"block.create.scorchia": "UNLOCALIZED: Scorchia",
"block.create.scorchia_pillar": "UNLOCALIZED: Scorchia Pillar",
"block.create.scoria": "UNLOCALIZED: Scoria",
"block.create.scoria_pillar": "UNLOCALIZED: Scoria Pillar",
"block.create.scorchia": "Escória negra",
"block.create.scorchia_pillar": "Pilar de escória negra",
"block.create.scoria": "Escória",
"block.create.scoria_pillar": "Pilar de escória",
"block.create.secondary_linear_chassis": "Chassis linear secundário",
"block.create.sequenced_gearshift": "Câmbio sequenciado",
"block.create.shadow_steel_casing": "Revestiment das Sombras",
"block.create.shaft": "Eixo",
"block.create.small_andesite_brick_slab": "UNLOCALIZED: Small Andesite Brick Slab",
"block.create.small_andesite_brick_stairs": "UNLOCALIZED: Small Andesite Brick Stairs",
"block.create.small_andesite_brick_wall": "UNLOCALIZED: Small Andesite Brick Wall",
"block.create.small_andesite_bricks": "UNLOCALIZED: Small Andesite Bricks",
"block.create.small_asurine_brick_slab": "UNLOCALIZED: Small Asurine Brick Slab",
"block.create.small_asurine_brick_stairs": "UNLOCALIZED: Small Asurine Brick Stairs",
"block.create.small_asurine_brick_wall": "UNLOCALIZED: Small Asurine Brick Wall",
"block.create.small_asurine_bricks": "UNLOCALIZED: Small Asurine Bricks",
"block.create.small_andesite_brick_slab": "Laje de tijolos pequenos de andesito",
"block.create.small_andesite_brick_stairs": "Escada de tijolos pequenos de andesito",
"block.create.small_andesite_brick_wall": "Muro de tijolos pequenos de andesito",
"block.create.small_andesite_bricks": "Tijolos pequenos de andesito",
"block.create.small_asurine_brick_slab": "Laje de tijolos pequenos de Asurino",
"block.create.small_asurine_brick_stairs": "Escada de tijolos pequenos de Asurino",
"block.create.small_asurine_brick_wall": "Muro de tijolos pequenos de Asurino",
"block.create.small_asurine_bricks": "Tijolos pequenos de Asurino",
"block.create.small_bogey": "UNLOCALIZED: Small Bogey",
"block.create.small_calcite_brick_slab": "UNLOCALIZED: Small Calcite Brick Slab",
"block.create.small_calcite_brick_stairs": "UNLOCALIZED: Small Calcite Brick Stairs",
"block.create.small_calcite_brick_wall": "UNLOCALIZED: Small Calcite Brick Wall",
"block.create.small_calcite_bricks": "UNLOCALIZED: Small Calcite Bricks",
"block.create.small_crimsite_brick_slab": "UNLOCALIZED: Small Crimsite Brick Slab",
"block.create.small_crimsite_brick_stairs": "UNLOCALIZED: Small Crimsite Brick Stairs",
"block.create.small_crimsite_brick_wall": "UNLOCALIZED: Small Crimsite Brick Wall",
"block.create.small_crimsite_bricks": "UNLOCALIZED: Small Crimsite Bricks",
"block.create.small_deepslate_brick_slab": "UNLOCALIZED: Small Deepslate Brick Slab",
"block.create.small_deepslate_brick_stairs": "UNLOCALIZED: Small Deepslate Brick Stairs",
"block.create.small_deepslate_brick_wall": "UNLOCALIZED: Small Deepslate Brick Wall",
"block.create.small_deepslate_bricks": "UNLOCALIZED: Small Deepslate Bricks",
"block.create.small_diorite_brick_slab": "UNLOCALIZED: Small Diorite Brick Slab",
"block.create.small_diorite_brick_stairs": "UNLOCALIZED: Small Diorite Brick Stairs",
"block.create.small_diorite_brick_wall": "UNLOCALIZED: Small Diorite Brick Wall",
"block.create.small_diorite_bricks": "UNLOCALIZED: Small Diorite Bricks",
"block.create.small_dripstone_brick_slab": "UNLOCALIZED: Small Dripstone Brick Slab",
"block.create.small_dripstone_brick_stairs": "UNLOCALIZED: Small Dripstone Brick Stairs",
"block.create.small_dripstone_brick_wall": "UNLOCALIZED: Small Dripstone Brick Wall",
"block.create.small_dripstone_bricks": "UNLOCALIZED: Small Dripstone Bricks",
"block.create.small_granite_brick_slab": "UNLOCALIZED: Small Granite Brick Slab",
"block.create.small_granite_brick_stairs": "UNLOCALIZED: Small Granite Brick Stairs",
"block.create.small_granite_brick_wall": "UNLOCALIZED: Small Granite Brick Wall",
"block.create.small_granite_bricks": "UNLOCALIZED: Small Granite Bricks",
"block.create.small_limestone_brick_slab": "UNLOCALIZED: Small Limestone Brick Slab",
"block.create.small_limestone_brick_stairs": "UNLOCALIZED: Small Limestone Brick Stairs",
"block.create.small_limestone_brick_wall": "UNLOCALIZED: Small Limestone Brick Wall",
"block.create.small_limestone_bricks": "UNLOCALIZED: Small Limestone Bricks",
"block.create.small_ochrum_brick_slab": "UNLOCALIZED: Small Ochrum Brick Slab",
"block.create.small_ochrum_brick_stairs": "UNLOCALIZED: Small Ochrum Brick Stairs",
"block.create.small_ochrum_brick_wall": "UNLOCALIZED: Small Ochrum Brick Wall",
"block.create.small_ochrum_bricks": "UNLOCALIZED: Small Ochrum Bricks",
"block.create.small_scorchia_brick_slab": "UNLOCALIZED: Small Scorchia Brick Slab",
"block.create.small_scorchia_brick_stairs": "UNLOCALIZED: Small Scorchia Brick Stairs",
"block.create.small_scorchia_brick_wall": "UNLOCALIZED: Small Scorchia Brick Wall",
"block.create.small_scorchia_bricks": "UNLOCALIZED: Small Scorchia Bricks",
"block.create.small_scoria_brick_slab": "UNLOCALIZED: Small Scoria Brick Slab",
"block.create.small_scoria_brick_stairs": "UNLOCALIZED: Small Scoria Brick Stairs",
"block.create.small_scoria_brick_wall": "UNLOCALIZED: Small Scoria Brick Wall",
"block.create.small_scoria_bricks": "UNLOCALIZED: Small Scoria Bricks",
"block.create.small_tuff_brick_slab": "UNLOCALIZED: Small Tuff Brick Slab",
"block.create.small_tuff_brick_stairs": "UNLOCALIZED: Small Tuff Brick Stairs",
"block.create.small_tuff_brick_wall": "UNLOCALIZED: Small Tuff Brick Wall",
"block.create.small_tuff_bricks": "UNLOCALIZED: Small Tuff Bricks",
"block.create.small_veridium_brick_slab": "UNLOCALIZED: Small Veridium Brick Slab",
"block.create.small_veridium_brick_stairs": "UNLOCALIZED: Small Veridium Brick Stairs",
"block.create.small_veridium_brick_wall": "UNLOCALIZED: Small Veridium Brick Wall",
"block.create.small_veridium_bricks": "UNLOCALIZED: Small Veridium Bricks",
"block.create.smart_chute": "calha Inteligente",
"block.create.small_calcite_brick_slab": "Laje de tijolos pequenos de calcita",
"block.create.small_calcite_brick_stairs": "Escada de tijolos pequenos de calcita",
"block.create.small_calcite_brick_wall": "Muro de tijolos pequenos de calcita",
"block.create.small_calcite_bricks": "Tijolos pequenos de calcita",
"block.create.small_crimsite_brick_slab": "Laje de tijolos pequenos de Carmesito",
"block.create.small_crimsite_brick_stairs": "Escada de tijolos pequenos de Carmesito",
"block.create.small_crimsite_brick_wall": "Muro de tijolos pequenos de Carmesito",
"block.create.small_crimsite_bricks": "Tijolos pequenos de Carmesito",
"block.create.small_deepslate_brick_slab": "Laje de tijolos pequenos de ardósia",
"block.create.small_deepslate_brick_stairs": "Escada de tijolos pequenos de ardósia",
"block.create.small_deepslate_brick_wall": "Muro de tijolos pequenos de ardósia",
"block.create.small_deepslate_bricks": "Tijolos pequenos de ardósia",
"block.create.small_diorite_brick_slab": "Laje de tijolos pequenos de diorito",
"block.create.small_diorite_brick_stairs": "Escada de tijolos pequenos de diorito",
"block.create.small_diorite_brick_wall": "Muro de tijolos pequenos de diorito",
"block.create.small_diorite_bricks": "Tijolos pequenos de diorito",
"block.create.small_dripstone_brick_slab": "Laje de tijolos pequenos de espeleotema",
"block.create.small_dripstone_brick_stairs": "Escada de tijolos pequenos de espeleotema",
"block.create.small_dripstone_brick_wall": "Muro de tijolos pequenos de espeleotema",
"block.create.small_dripstone_bricks": "Tijolos pequenos de espeleotema",
"block.create.small_granite_brick_slab": "Laje de tijolos pequenos de granito",
"block.create.small_granite_brick_stairs": "Escada de tijolos pequenos de granito",
"block.create.small_granite_brick_wall": "Muro de tijolos pequenos de granito",
"block.create.small_granite_bricks": "Tijolos pequenos de granito",
"block.create.small_limestone_brick_slab": "Laje de tijolos pequenos de calcário",
"block.create.small_limestone_brick_stairs": "Escada de tijolos pequenos de calcário",
"block.create.small_limestone_brick_wall": "Muro de tijolos pequenos de calcário",
"block.create.small_limestone_bricks": "Tijolos pequenos de calcário",
"block.create.small_ochrum_brick_slab": "Laje de tijolos pequenos de Ocrom",
"block.create.small_ochrum_brick_stairs": "Escada de tijolos pequenos de Ocrom",
"block.create.small_ochrum_brick_wall": "Muro de tijolos pequenos de Ocrom",
"block.create.small_ochrum_bricks": "Tijolos pequenos de Ocrom",
"block.create.small_scorchia_brick_slab": "Laje de tijolos pequenos de escória negra",
"block.create.small_scorchia_brick_stairs": "Escada de tijolos pequenos de escória negra",
"block.create.small_scorchia_brick_wall": "Muro de tijolos pequenos de escória negra",
"block.create.small_scorchia_bricks": "Tijolos pequenos de escória negra",
"block.create.small_scoria_brick_slab": "Laje de tijolos pequenos de escória",
"block.create.small_scoria_brick_stairs": "Escada de tijolos pequenos de escória",
"block.create.small_scoria_brick_wall": "Muro de tijolos pequenos de escória",
"block.create.small_scoria_bricks": "Tijolos pequenos de escória",
"block.create.small_tuff_brick_slab": "Laje de tijolos pequenos de tufo",
"block.create.small_tuff_brick_stairs": "Escada de tijolos pequenos de tufo",
"block.create.small_tuff_brick_wall": "Muro de tijolos pequenos de tufo",
"block.create.small_tuff_bricks": "Tijolos pequenos de tufo",
"block.create.small_veridium_brick_slab": "Laje de tijolos pequenos de Veridiano",
"block.create.small_veridium_brick_stairs": "Escada de tijolos pequenos de Veridiano",
"block.create.small_veridium_brick_wall": "Muro de tijolos pequenos de Veridiano",
"block.create.small_veridium_bricks": "Tijolos pequenos de Veridiano",
"block.create.smart_chute": "Calha Inteligente",
"block.create.smart_fluid_pipe": "Cano de Fluidos Inteligente",
"block.create.speedometer": "Velocímetro",
"block.create.spout": "Bica",
"block.create.spruce_window": "UNLOCALIZED: Spruce Window",
"block.create.spruce_window_pane": "UNLOCALIZED: Spruce Window Pane",
"block.create.spruce_window": "Janela de pinheiro",
"block.create.spruce_window_pane": "Vidraça de pinheiro",
"block.create.steam_engine": "UNLOCALIZED: Steam Engine",
"block.create.sticker": "Adesivo",
"block.create.sticky_mechanical_piston": "Pistão Mecânico Grudento",
@ -491,46 +491,46 @@
"block.create.track": "UNLOCALIZED: Train Track",
"block.create.track_signal": "UNLOCALIZED: Train Signal",
"block.create.track_station": "UNLOCALIZED: Train Station",
"block.create.tuff_pillar": "UNLOCALIZED: Tuff Pillar",
"block.create.tuff_pillar": "Pilar de tufo",
"block.create.turntable": "Mesa giratória",
"block.create.veridium": "UNLOCALIZED: Veridium",
"block.create.veridium_pillar": "UNLOCALIZED: Veridium Pillar",
"block.create.vertical_framed_glass": "UNLOCALIZED: Vertical Framed Glass",
"block.create.vertical_framed_glass_pane": "UNLOCALIZED: Vertical Framed Glass Pane",
"block.create.warped_window": "UNLOCALIZED: Warped Window",
"block.create.warped_window_pane": "UNLOCALIZED: Warped Window Pane",
"block.create.veridium": "Veridiano",
"block.create.veridium_pillar": "Pilar de Verdiano",
"block.create.vertical_framed_glass": "Vidro emoldurado vertical",
"block.create.vertical_framed_glass_pane": "Vidraça emoldurada vertical",
"block.create.warped_window": "Janela distorcida",
"block.create.warped_window_pane": "Vidraça distorcida",
"block.create.water_wheel": "Roda de Água",
"block.create.waxed_copper_shingle_slab": "UNLOCALIZED: Waxed Copper Shingle Slab",
"block.create.waxed_copper_shingle_stairs": "UNLOCALIZED: Waxed Copper Shingle Stairs",
"block.create.waxed_copper_shingles": "UNLOCALIZED: Waxed Copper Shingles",
"block.create.waxed_copper_tile_slab": "UNLOCALIZED: Waxed Copper Tile Slab",
"block.create.waxed_copper_tile_stairs": "UNLOCALIZED: Waxed Copper Tile Stairs",
"block.create.waxed_copper_tiles": "UNLOCALIZED: Waxed Copper Tiles",
"block.create.waxed_exposed_copper_shingle_slab": "UNLOCALIZED: Waxed Exposed Copper Shingle Slab",
"block.create.waxed_exposed_copper_shingle_stairs": "UNLOCALIZED: Waxed Exposed Copper Shingle Stairs",
"block.create.waxed_exposed_copper_shingles": "UNLOCALIZED: Waxed Exposed Copper Shingles",
"block.create.waxed_exposed_copper_tile_slab": "UNLOCALIZED: Waxed Exposed Copper Tile Slab",
"block.create.waxed_exposed_copper_tile_stairs": "UNLOCALIZED: Waxed Exposed Copper Tile Stairs",
"block.create.waxed_exposed_copper_tiles": "UNLOCALIZED: Waxed Exposed Copper Tiles",
"block.create.waxed_oxidized_copper_shingle_slab": "UNLOCALIZED: Waxed Oxidized Copper Shingle Slab",
"block.create.waxed_oxidized_copper_shingle_stairs": "UNLOCALIZED: Waxed Oxidized Copper Shingle Stairs",
"block.create.waxed_oxidized_copper_shingles": "UNLOCALIZED: Waxed Oxidized Copper Shingles",
"block.create.waxed_oxidized_copper_tile_slab": "UNLOCALIZED: Waxed Oxidized Copper Tile Slab",
"block.create.waxed_oxidized_copper_tile_stairs": "UNLOCALIZED: Waxed Oxidized Copper Tile Stairs",
"block.create.waxed_oxidized_copper_tiles": "UNLOCALIZED: Waxed Oxidized Copper Tiles",
"block.create.waxed_weathered_copper_shingle_slab": "UNLOCALIZED: Waxed Weathered Copper Shingle Slab",
"block.create.waxed_weathered_copper_shingle_stairs": "UNLOCALIZED: Waxed Weathered Copper Shingle Stairs",
"block.create.waxed_weathered_copper_shingles": "UNLOCALIZED: Waxed Weathered Copper Shingles",
"block.create.waxed_weathered_copper_tile_slab": "UNLOCALIZED: Waxed Weathered Copper Tile Slab",
"block.create.waxed_weathered_copper_tile_stairs": "UNLOCALIZED: Waxed Weathered Copper Tile Stairs",
"block.create.waxed_weathered_copper_tiles": "UNLOCALIZED: Waxed Weathered Copper Tiles",
"block.create.weathered_copper_shingle_slab": "UNLOCALIZED: Weathered Copper Shingle Slab",
"block.create.weathered_copper_shingle_stairs": "UNLOCALIZED: Weathered Copper Shingle Stairs",
"block.create.weathered_copper_shingles": "UNLOCALIZED: Weathered Copper Shingles",
"block.create.weathered_copper_tile_slab": "UNLOCALIZED: Weathered Copper Tile Slab",
"block.create.weathered_copper_tile_stairs": "UNLOCALIZED: Weathered Copper Tile Stairs",
"block.create.weathered_copper_tiles": "UNLOCALIZED: Weathered Copper Tiles",
"block.create.weighted_ejector": "Ejetor ´ponderado",
"block.create.waxed_copper_shingle_slab": "Laje de telha de cobre encerada",
"block.create.waxed_copper_shingle_stairs": "Escada de telha de cobre encerada",
"block.create.waxed_copper_shingles": "Telha de cobre encerada",
"block.create.waxed_copper_tile_slab": "Laje de ladrilho de cobre encerada",
"block.create.waxed_copper_tile_stairs": "Escada de ladrilho de cobre encerada",
"block.create.waxed_copper_tiles": "Ladrilho de cobre encerado",
"block.create.waxed_exposed_copper_shingle_slab": "Laje de telha de cobre exposta encerada",
"block.create.waxed_exposed_copper_shingle_stairs": "Escada de telha de cobre exposta encerada",
"block.create.waxed_exposed_copper_shingles": "Telha de cobre exposta encerada",
"block.create.waxed_exposed_copper_tile_slab": "Laje de ladrilho de cobre exposta encerada",
"block.create.waxed_exposed_copper_tile_stairs": "Escada de ladrilho de cobre exposta encerada",
"block.create.waxed_exposed_copper_tiles": "Ladrilhos de cobre exposto encerado",
"block.create.waxed_oxidized_copper_shingle_slab": "Laje de telha de cobre oxidada encerada",
"block.create.waxed_oxidized_copper_shingle_stairs": "Escada de telha de cobre oxidada encerada",
"block.create.waxed_oxidized_copper_shingles": "Telha de cobre oxidada encerada",
"block.create.waxed_oxidized_copper_tile_slab": "Laje de ladrilhos de cobre oxidada encerada",
"block.create.waxed_oxidized_copper_tile_stairs": "Escada de ladrilhos de cobre oxidada encerada",
"block.create.waxed_oxidized_copper_tiles": "Ladrilhos de cobre oxidado encerado",
"block.create.waxed_weathered_copper_shingle_slab": "Laje de telha de cobre desgastada encerada",
"block.create.waxed_weathered_copper_shingle_stairs": "Escada de telha de cobre desgastada encerada",
"block.create.waxed_weathered_copper_shingles": "Telha de cobre desgastada encereda",
"block.create.waxed_weathered_copper_tile_slab": "Laje de ladrilho de cobre desgastado encerado",
"block.create.waxed_weathered_copper_tile_stairs": "Escada de ladrilho de cobre desgastado encerado",
"block.create.waxed_weathered_copper_tiles": "Ladrilho de cobre desgastado encerado",
"block.create.weathered_copper_shingle_slab": "Laje de telha de cobre desgastada encerada",
"block.create.weathered_copper_shingle_stairs": "Escada de telha de cobre desgastada encerada",
"block.create.weathered_copper_shingles": "Telha de cobre desgastada encerada",
"block.create.weathered_copper_tile_slab": "Laje de ladrilhos de cobre desgastada encerada",
"block.create.weathered_copper_tile_stairs": "Escada de ladrilhos de cobre desgastada encerada",
"block.create.weathered_copper_tiles": "Ladrilhos de cobre desgastado encerado",
"block.create.weighted_ejector": "Ejetor ponderado",
"block.create.white_nixie_tube": "Tubo nixie branco",
"block.create.white_sail": "Vela branca",
"block.create.white_seat": "Assento branco",
@ -578,6 +578,7 @@
"item.create.chromatic_compound": "Composto Cromático",
"item.create.cinder_flour": "Farinha de Netherrack",
"item.create.copper_backtank": "Tanque Traseiro",
"item.create.copper_backtank_placeable": "UNLOCALIZED: Copper Backtank Placeable",
"item.create.copper_nugget": "Pepita de Cobre",
"item.create.copper_sheet": "Chapa de Cobre",
"item.create.crafter_slot_cover": "Cobertura do slot de fabricador",
@ -608,7 +609,7 @@
"item.create.furnace_minecart_contraption": "Engenhoca de Carrinho de Mina com Fornalha",
"item.create.goggles": "Óculos de Engenheiro",
"item.create.golden_sheet": "Chapa de Ouro",
"item.create.handheld_worldshaper": "Modelador de Mundo Criativo",
"item.create.handheld_worldshaper": "Terraformador de Mundo Criativo",
"item.create.honey_bucket": "Balde de Mel",
"item.create.honeyed_apple": "Maçã com Cobertura de Mel",
"item.create.incomplete_cogwheel": "Roda Dentada Incompleta",
@ -669,7 +670,7 @@
"advancement.create.belt_funnel": "UNLOCALIZED: Funnels' Flappy Danglers",
"advancement.create.belt_funnel.desc": "Coloque um funil lateral em cima de uma esteira ou depósito para criar um tipo especial.",
"advancement.create.belt_funnel_kiss": "UNLOCALIZED: The Parrots and the Flaps",
"advancement.create.belt_funnel_kiss.desc": "UNLOCALIZED: Make two belt mounted funnels kiss.",
"advancement.create.belt_funnel_kiss.desc": "Faça dois funis de esteira beijarem.",
"advancement.create.fan": "Dobrador de ar mecânico",
"advancement.create.fan.desc": "Pegue uma carona no fluxo de ar provido pelo ventilador revestido.",
"advancement.create.fan_lava": "Aquecedor de espaço geotermal",
@ -732,7 +733,7 @@
"advancement.create.copper_casing.desc": "Use um pouco de chapas de cobre e madeira para criar um pouco de revestimentos de cobre.",
"advancement.create.spout": "Sploosh",
"advancement.create.spout.desc": "Assista um item ser enchido usando uma bica.",
"advancement.create.spout_potion": "UNLOCALIZED: Global Brewery",
"advancement.create.spout_potion": "Mestre de química",
"advancement.create.spout_potion.desc": "Assista uma bica encher uma garrafa com uma poção.",
"advancement.create.chocolate": "Um mundo de imaginação",
"advancement.create.chocolate.desc": "Obtenha um balde de chocolate.",
@ -778,11 +779,11 @@
"advancement.create.arm_many_targets.desc": "Programe um braço mecânico com dez ou mais locais de saida.",
"advancement.create.arm_blaze_burner": "Combuste-tron",
"advancement.create.arm_blaze_burner.desc": "Instrua um braço mecânico para alimentar seu queimador de blaze.",
"advancement.create.fist_bump": "UNLOCALIZED: Pound It, Bro!",
"advancement.create.fist_bump.desc": "UNLOCALIZED: Make two Deployers fist-bump.",
"advancement.create.fist_bump": "Bate isso, mano!",
"advancement.create.fist_bump.desc": "Faça dois implantadores baterem com o punho.",
"advancement.create.crushing_wheel": "Par de gigantes",
"advancement.create.crushing_wheel.desc": "Crie algumas rodas de moer para triturar alguns materiais eficientemente.",
"advancement.create.blaze_cake": "UNLOCALIZED: Sugar Rush",
"advancement.create.blaze_cake": "Descarga de açucar",
"advancement.create.blaze_cake.desc": "Asse para o seu queimador de blaze um bolo especial.",
"advancement.create.wand_of_symmetry": "Espelhos radiantes",
"advancement.create.wand_of_symmetry.desc": "Fabrique uma varinha de simetria.",
@ -827,47 +828,47 @@
"create.menu.report_bugs": "UNLOCALIZED: Report Issues",
"create.menu.support": "UNLOCALIZED: Support Us",
"create.recipe.crushing": "Moendo",
"create.recipe.milling": "UNLOCALIZED: Milling",
"create.recipe.crushing": "Triturando",
"create.recipe.milling": "Moendo",
"create.recipe.fan_washing": "Lavagem em massa",
"create.recipe.fan_washing.fan": "Ventilador atrás de água",
"create.recipe.fan_smoking": "Defumação em massa",
"create.recipe.fan_smoking.fan": "Ventilador atrás de fogo",
"create.recipe.fan_haunting": "UNLOCALIZED: Bulk Haunting",
"create.recipe.fan_haunting.fan": "UNLOCALIZED: Fan behind Soul Fire",
"create.recipe.fan_smoking.fan": "Ventilador atrás do fogo",
"create.recipe.fan_haunting": "Assombração em massa",
"create.recipe.fan_haunting.fan": "Ventilador atrás do fogo das almas ",
"create.recipe.fan_blasting": "Fundição em massa",
"create.recipe.fan_blasting.fan": "entilador atrás de lava",
"create.recipe.pressing": "Prensa Mecânica",
"create.recipe.pressing": "Prensando",
"create.recipe.mixing": "Misturando",
"create.recipe.deploying": "Implantando",
"create.recipe.automatic_shapeless": "UNLOCALIZED: Automated Shapeless Crafting",
"create.recipe.automatic_shapeless": "Fabricação sem forma automático",
"create.recipe.automatic_brewing": "UNLOCALIZED: Automated Brewing",
"create.recipe.packing": "Compactando",
"create.recipe.automatic_packing": "UNLOCALIZED: Automated Packing",
"create.recipe.sawing": "UNLOCALIZED: Sawing",
"create.recipe.mechanical_crafting": "UNLOCALIZED: Mechanical Crafting",
"create.recipe.automatic_shaped": "UNLOCALIZED: Automated Shaped Crafting",
"create.recipe.block_cutting": "UNLOCALIZED: Block Cutting",
"create.recipe.wood_cutting": "UNLOCALIZED: Wood Cutting",
"create.recipe.sandpaper_polishing": "UNLOCALIZED: Sandpaper Polishing",
"create.recipe.mystery_conversion": "UNLOCALIZED: Mysterious Conversion",
"create.recipe.spout_filling": "UNLOCALIZED: Filling by Spout",
"create.recipe.draining": "UNLOCALIZED: Item Draining",
"create.recipe.sequenced_assembly": "UNLOCALIZED: Sequenced Assembly",
"create.recipe.assembly.next": "UNLOCALIZED: Next: %1$s",
"create.recipe.assembly.step": "UNLOCALIZED: Step %1$s:",
"create.recipe.assembly.progress": "UNLOCALIZED: Progress: %1$s/%2$s",
"create.recipe.assembly.pressing": "UNLOCALIZED: Process in Press",
"create.recipe.assembly.spout_filling_fluid": "UNLOCALIZED: Spout %1$s",
"create.recipe.assembly.deploying_item": "UNLOCALIZED: Deploy %1$s",
"create.recipe.assembly.cutting": "UNLOCALIZED: Cut with Saw",
"create.recipe.assembly.repeat": "UNLOCALIZED: Repeat Sequence %1$s Times",
"create.recipe.assembly.junk": "UNLOCALIZED: Random salvage",
"create.recipe.processing.chance": "UNLOCALIZED: %1$s%% Chance",
"create.recipe.deploying.not_consumed": "UNLOCALIZED: Not Consumed",
"create.recipe.heat_requirement.none": "UNLOCALIZED: No Heating Required",
"create.recipe.heat_requirement.heated": "UNLOCALIZED: Heated",
"create.recipe.heat_requirement.superheated": "UNLOCALIZED: Super-Heated",
"create.recipe.automatic_packing": "Compactamento automático",
"create.recipe.sawing": "Serrando",
"create.recipe.mechanical_crafting": "Fabricação mecânica",
"create.recipe.automatic_shaped": "Fabricação com forma automática",
"create.recipe.block_cutting": "Corte de blocos",
"create.recipe.wood_cutting": "Corte de madeira",
"create.recipe.sandpaper_polishing": "Polimento com lixa",
"create.recipe.mystery_conversion": "Conversão misteriosa",
"create.recipe.spout_filling": "Preenchimento com bica",
"create.recipe.draining": "Drenação de item",
"create.recipe.sequenced_assembly": "Montagem sequenciada",
"create.recipe.assembly.next": "Proximo: %1$s",
"create.recipe.assembly.step": "Passo %1$s:",
"create.recipe.assembly.progress": "Progresso: %1$s/%2$s",
"create.recipe.assembly.pressing": "Processa na prensa",
"create.recipe.assembly.spout_filling_fluid": "Despejar %1$s",
"create.recipe.assembly.deploying_item": "Implantar %1$s",
"create.recipe.assembly.cutting": "Cortado com serra",
"create.recipe.assembly.repeat": "Repetir sequencia %1$s vezes",
"create.recipe.assembly.junk": "Recuperação aleatório",
"create.recipe.processing.chance": "%1$s%% Chance",
"create.recipe.deploying.not_consumed": "Não consumido",
"create.recipe.heat_requirement.none": "Aquecimento não requerido",
"create.recipe.heat_requirement.heated": "Aquecido",
"create.recipe.heat_requirement.superheated": "Super-aquecido",
"create.generic.range": "Área",
"create.generic.radius": "Raio",
@ -1135,7 +1136,7 @@
"create.schematicannon.status.finished": "Concluído",
"create.schematicannon.status.paused": "Pausado",
"create.schematicannon.status.stopped": "Parada",
"create.schematicannon.status.noGunpowder": "UNLOCALIZED: Sem pólvora",
"create.schematicannon.status.noGunpowder": "Sem pólvora",
"create.schematicannon.status.targetNotLoaded": "Bloco não carregado",
"create.schematicannon.status.targetOutsideRange": "Alvo está muito Longe",
"create.schematicannon.status.searching": "Procurando",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 1672",
"_": "Missing Localizations: 1673",
"_": "->------------------------] Game Elements [------------------------<-",
@ -578,6 +578,7 @@
"item.create.chromatic_compound": "Composto Cromático",
"item.create.cinder_flour": "Farinha de Netherrack",
"item.create.copper_backtank": "Tanque Traseiro",
"item.create.copper_backtank_placeable": "UNLOCALIZED: Copper Backtank Placeable",
"item.create.copper_nugget": "Pepita de Cobre",
"item.create.copper_sheet": "Chapa de Cobre",
"item.create.crafter_slot_cover": "Cobertura do slot de fabricador",
@ -669,7 +670,7 @@
"advancement.create.belt_funnel": "UNLOCALIZED: Funnels' Flappy Danglers",
"advancement.create.belt_funnel.desc": "Coloque um funil lateral em cima de uma esteira ou depósito para criar um tipo especial.",
"advancement.create.belt_funnel_kiss": "UNLOCALIZED: The Parrots and the Flaps",
"advancement.create.belt_funnel_kiss.desc": "UNLOCALIZED: Make two belt mounted funnels kiss.",
"advancement.create.belt_funnel_kiss.desc": "UNLOCALIZED: Make two Belt-mounted Funnels kiss.",
"advancement.create.fan": "Dobrador de ar mecânico",
"advancement.create.fan.desc": "Pegue uma carona no fluxo de ar provido pelo ventilador revestido.",
"advancement.create.fan_lava": "Aquecedor de espaço geotermal",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 493",
"_": "Missing Localizations: 494",
"_": "->------------------------] Game Elements [------------------------<-",
@ -578,6 +578,7 @@
"item.create.chromatic_compound": "Хроматический компаунд",
"item.create.cinder_flour": "Незераковая пыль",
"item.create.copper_backtank": "Медный баллон",
"item.create.copper_backtank_placeable": "UNLOCALIZED: Copper Backtank Placeable",
"item.create.copper_nugget": "Кусочек меди",
"item.create.copper_sheet": "Медный лист",
"item.create.crafter_slot_cover": "Крышка на слот крафтера",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 119",
"_": "Missing Localizations: 116",
"_": "->------------------------] Game Elements [------------------------<-",
@ -234,8 +234,8 @@
"block.create.hand_crank": "手摇曲柄",
"block.create.haunted_bell": "森魂钟",
"block.create.honey": "蜂蜜",
"block.create.horizontal_framed_glass": "竖直边框玻璃",
"block.create.horizontal_framed_glass_pane": "竖直边框玻璃板",
"block.create.horizontal_framed_glass": "水平边框玻璃",
"block.create.horizontal_framed_glass_pane": "水平边框玻璃板",
"block.create.hose_pulley": "软管滑轮",
"block.create.item_drain": "分液池",
"block.create.item_vault": "物品保险库",
@ -578,6 +578,7 @@
"item.create.chromatic_compound": "异彩化合物",
"item.create.cinder_flour": "下界面粉",
"item.create.copper_backtank": "铜制背罐",
"item.create.copper_backtank_placeable": "UNLOCALIZED: Copper Backtank Placeable",
"item.create.copper_nugget": "铜粒",
"item.create.copper_sheet": "铜板",
"item.create.crafter_slot_cover": "合成器盖板",
@ -833,8 +834,8 @@
"create.recipe.fan_washing.fan": "在水后放置鼓风机",
"create.recipe.fan_smoking": "批量烟熏",
"create.recipe.fan_smoking.fan": "在火焰后放置鼓风机",
"create.recipe.fan_haunting": "UNLOCALIZED: Bulk Haunting",
"create.recipe.fan_haunting.fan": "UNLOCALIZED: Fan behind Soul Fire",
"create.recipe.fan_haunting": "批量缠魂",
"create.recipe.fan_haunting.fan": "在灵魂火后放置鼓风机",
"create.recipe.fan_blasting": "批量熔炼",
"create.recipe.fan_blasting.fan": "在熔岩后放置鼓风机",
"create.recipe.pressing": "金属压片",
@ -1183,8 +1184,8 @@
"create.item_attributes.furnace_fuel.inverted": "不可作为燃料",
"create.item_attributes.washable": "可被洗涤",
"create.item_attributes.washable.inverted": "不可被洗涤",
"create.item_attributes.hauntable": "UNLOCALIZED: can be Haunted",
"create.item_attributes.hauntable.inverted": "UNLOCALIZED: cannot be Haunted",
"create.item_attributes.hauntable": "可被缠魂",
"create.item_attributes.hauntable.inverted": "不可被缠魂",
"create.item_attributes.crushable": "可被粉碎",
"create.item_attributes.crushable.inverted": "不可被粉碎",
"create.item_attributes.smeltable": "可被熔炉烧制",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 507",
"_": "Missing Localizations: 508",
"_": "->------------------------] Game Elements [------------------------<-",
@ -578,6 +578,7 @@
"item.create.chromatic_compound": "異彩化合物",
"item.create.cinder_flour": "地獄麵粉",
"item.create.copper_backtank": "銅製後背包",
"item.create.copper_backtank_placeable": "UNLOCALIZED: Copper Backtank Placeable",
"item.create.copper_nugget": "銅粒",
"item.create.copper_sheet": "銅板",
"item.create.crafter_slot_cover": "合成器蓋板",

View file

@ -0,0 +1,3 @@
{
"parent": "minecraft:item/barrier"
}

View file

@ -1,20 +0,0 @@
{
"type": "minecraft:block",
"pools": [
{
"rolls": 1.0,
"bonus_rolls": 0.0,
"entries": [
{
"type": "minecraft:item",
"name": "minecraft:air"
}
],
"conditions": [
{
"condition": "minecraft:survives_explosion"
}
]
}
]
}

View file

@ -1,20 +0,0 @@
{
"replace": false,
"values": [
"create:orange_sail",
"create:magenta_sail",
"create:light_blue_sail",
"create:yellow_sail",
"create:lime_sail",
"create:pink_sail",
"create:gray_sail",
"create:light_gray_sail",
"create:cyan_sail",
"create:purple_sail",
"create:blue_sail",
"create:brown_sail",
"create:green_sail",
"create:red_sail",
"create:black_sail"
]
}

View file

@ -0,0 +1,7 @@
{
"replace": false,
"values": [
"minecraft:water",
"minecraft:lava"
]
}

View file

@ -0,0 +1,4 @@
{
"replace": false,
"values": []
}

View file

@ -0,0 +1,4 @@
{
"replace": false,
"values": []
}

View file

@ -0,0 +1,6 @@
{
"replace": false,
"values": [
"create:blaze_cake"
]
}

View file

@ -53,6 +53,7 @@ import com.simibubi.create.content.contraptions.components.saw.SawBlock;
import com.simibubi.create.content.contraptions.components.saw.SawGenerator;
import com.simibubi.create.content.contraptions.components.steam.PoweredShaftBlock;
import com.simibubi.create.content.contraptions.components.steam.SteamEngineBlock;
import com.simibubi.create.content.contraptions.components.structureMovement.bearing.BlankSailBlockItem;
import com.simibubi.create.content.contraptions.components.structureMovement.bearing.ClockworkBearingBlock;
import com.simibubi.create.content.contraptions.components.structureMovement.bearing.MechanicalBearingBlock;
import com.simibubi.create.content.contraptions.components.structureMovement.bearing.SailBlock;
@ -419,7 +420,7 @@ public class AllBlocks {
.register();
public static final BlockEntry<BeltBlock> BELT = REGISTRATE.block("belt", BeltBlock::new)
.initialProperties(SharedProperties.beltMaterial, MaterialColor.COLOR_GRAY)
.initialProperties(SharedProperties.BELT_MATERIAL, MaterialColor.COLOR_GRAY)
.properties(p -> p.sound(SoundType.WOOL))
.properties(p -> p.strength(0.8F))
.transform(axeOrPickaxe())
@ -526,7 +527,8 @@ public class AllBlocks {
public static final BlockEntry<CrushingWheelControllerBlock> CRUSHING_WHEEL_CONTROLLER =
REGISTRATE.block("crushing_wheel_controller", CrushingWheelControllerBlock::new)
.initialProperties(() -> Blocks.AIR)
.initialProperties(SharedProperties.CRUSHING_WHEEL_CONTROLLER_MATERIAL)
.properties(p -> p.noOcclusion().noDrops().air())
.blockstate((c, p) -> p.getVariantBuilder(c.get())
.forAllStatesExcept(state -> ConfiguredModel.builder()
.modelFile(p.models()
@ -969,7 +971,7 @@ public class AllBlocks {
.register();
public static final BlockEntry<PulleyBlock.RopeBlock> ROPE = REGISTRATE.block("rope", PulleyBlock.RopeBlock::new)
.initialProperties(SharedProperties.beltMaterial, MaterialColor.COLOR_BROWN)
.initialProperties(SharedProperties.BELT_MATERIAL, MaterialColor.COLOR_BROWN)
.tag(AllBlockTags.BRITTLE.tag)
.properties(p -> p.sound(SoundType.WOOL))
.blockstate((c, p) -> p.simpleBlock(c.get(), p.models()
@ -1187,7 +1189,8 @@ public class AllBlocks {
.transform(axeOnly())
.blockstate(BlockStateGen.directionalBlockProvider(false))
.tag(AllBlockTags.WINDMILL_SAILS.tag)
.simpleItem()
.item(BlankSailBlockItem::new)
.build()
.register();
public static final DyedBlockList<SailBlock> DYED_SAILS = new DyedBlockList<>(colour -> {
@ -1197,13 +1200,13 @@ public class AllBlocks {
String colourName = colour.getSerializedName();
return REGISTRATE.block(colourName + "_sail", p -> SailBlock.withCanvas(p, colour))
.initialProperties(SharedProperties::wooden)
.properties(BlockBehaviour.Properties::noOcclusion)
.properties(p -> p.sound(SoundType.SCAFFOLDING)
.noOcclusion())
.transform(axeOnly())
.blockstate((c, p) -> p.directionalBlock(c.get(), p.models()
.withExistingParent(colourName + "_sail", p.modLoc("block/white_sail"))
.texture("0", p.modLoc("block/sail/canvas_" + colourName))))
.tag(AllBlockTags.WINDMILL_SAILS.tag)
.tag(AllBlockTags.SAILS.tag)
.loot((p, b) -> p.dropOther(b, SAIL.get()))
.register();
});

View file

@ -9,6 +9,15 @@ import static com.simibubi.create.content.AllSections.KINETICS;
import static com.simibubi.create.content.AllSections.LOGISTICS;
import static com.simibubi.create.content.AllSections.MATERIALS;
import static com.simibubi.create.content.AllSections.SCHEMATICS;
import static com.simibubi.create.foundation.data.recipe.CompatMetals.ALUMINUM;
import static com.simibubi.create.foundation.data.recipe.CompatMetals.LEAD;
import static com.simibubi.create.foundation.data.recipe.CompatMetals.NICKEL;
import static com.simibubi.create.foundation.data.recipe.CompatMetals.OSMIUM;
import static com.simibubi.create.foundation.data.recipe.CompatMetals.PLATINUM;
import static com.simibubi.create.foundation.data.recipe.CompatMetals.QUICKSILVER;
import static com.simibubi.create.foundation.data.recipe.CompatMetals.SILVER;
import static com.simibubi.create.foundation.data.recipe.CompatMetals.TIN;
import static com.simibubi.create.foundation.data.recipe.CompatMetals.URANIUM;
import com.simibubi.create.AllTags.AllItemTags;
import com.simibubi.create.content.contraptions.components.structureMovement.glue.SuperGlueItem;
@ -31,6 +40,7 @@ import com.simibubi.create.content.curiosities.ShadowSteelItem;
import com.simibubi.create.content.curiosities.TreeFertilizerItem;
import com.simibubi.create.content.curiosities.armor.CopperArmorItem;
import com.simibubi.create.content.curiosities.armor.CopperBacktankItem;
import com.simibubi.create.content.curiosities.armor.CopperBacktankItem.CopperBacktankBlockItem;
import com.simibubi.create.content.curiosities.armor.DivingBootsItem;
import com.simibubi.create.content.curiosities.armor.DivingHelmetItem;
import com.simibubi.create.content.curiosities.symmetry.SymmetryWandItem;
@ -46,16 +56,15 @@ import com.simibubi.create.content.schematics.item.SchematicAndQuillItem;
import com.simibubi.create.content.schematics.item.SchematicItem;
import com.simibubi.create.foundation.data.AssetLookup;
import com.simibubi.create.foundation.data.CreateRegistrate;
import com.simibubi.create.foundation.data.recipe.CompatMetals;
import com.simibubi.create.foundation.item.HiddenIngredientItem;
import com.simibubi.create.foundation.item.TagDependentIngredientItem;
import com.simibubi.create.foundation.item.TooltipHelper;
import com.tterrag.registrate.util.entry.ItemEntry;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.tags.ItemTags;
import net.minecraft.tags.Tag;
import net.minecraft.tags.TagKey;
import net.minecraft.world.food.FoodProperties;
import net.minecraft.world.item.BlockItem;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.Rarity;
import net.minecraftforge.common.Tags;
@ -101,7 +110,7 @@ public class AllItems {
.register();
public static final ItemEntry<CombustibleItem> BLAZE_CAKE = REGISTRATE.item("blaze_cake", CombustibleItem::new)
.tag(AllItemTags.UPRIGHT_ON_BELT.tag)
.tag(AllItemTags.BLAZE_BURNER_FUEL_SPECIAL.tag, AllItemTags.UPRIGHT_ON_BELT.tag)
.onRegister(i -> i.setBurnTime(6400))
.register();
@ -189,11 +198,11 @@ public class AllItems {
CRUSHED_COPPER = taggedIngredient("crushed_copper_ore", CRUSHED_ORES.tag),
CRUSHED_ZINC = taggedIngredient("crushed_zinc_ore", CRUSHED_ORES.tag);
public static final ItemEntry<TagDependentIngredientItem> CRUSHED_OSMIUM = compatCrushedOre("osmium"),
CRUSHED_PLATINUM = compatCrushedOre("platinum"), CRUSHED_SILVER = compatCrushedOre("silver"),
CRUSHED_TIN = compatCrushedOre("tin"), CRUSHED_LEAD = compatCrushedOre("lead"),
CRUSHED_QUICKSILVER = compatCrushedOre("quicksilver"), CRUSHED_BAUXITE = compatCrushedOre("aluminum"),
CRUSHED_URANIUM = compatCrushedOre("uranium"), CRUSHED_NICKEL = compatCrushedOre("nickel");
public static final ItemEntry<TagDependentIngredientItem> CRUSHED_OSMIUM = compatCrushedOre(OSMIUM),
CRUSHED_PLATINUM = compatCrushedOre(PLATINUM), CRUSHED_SILVER = compatCrushedOre(SILVER),
CRUSHED_TIN = compatCrushedOre(TIN), CRUSHED_LEAD = compatCrushedOre(LEAD),
CRUSHED_QUICKSILVER = compatCrushedOre(QUICKSILVER), CRUSHED_BAUXITE = compatCrushedOre(ALUMINUM),
CRUSHED_URANIUM = compatCrushedOre(URANIUM), CRUSHED_NICKEL = compatCrushedOre(NICKEL);
// Kinetics
@ -235,13 +244,18 @@ public class AllItems {
REGISTRATE.item("crafting_blueprint", BlueprintItem::new)
.register();
// wrapped by COPPER_BACKTANK for block placement uses.
// must be registered as of 1.18.2
public static final ItemEntry<CopperBacktankBlockItem> COPPER_BACKTANK_PLACEABLE = REGISTRATE
.item("copper_backtank_placeable", p -> new CopperBacktankBlockItem(AllBlocks.COPPER_BACKTANK.get(), p))
.model((c, p) -> p.withExistingParent(c.getName(), p.mcLoc("item/barrier")))
.register();
public static final ItemEntry<? extends CopperArmorItem>
COPPER_BACKTANK =
REGISTRATE
.item("copper_backtank", p -> new CopperBacktankItem(p, new BlockItem(AllBlocks.COPPER_BACKTANK.get(), p)))
.model(AssetLookup.<CopperBacktankItem>customGenericItemModel("_", "item"))
.register(),
COPPER_BACKTANK = REGISTRATE.item("copper_backtank", p -> new CopperBacktankItem(p, COPPER_BACKTANK_PLACEABLE))
.model(AssetLookup.customGenericItemModel("_", "item"))
.register(),
DIVING_HELMET = REGISTRATE.item("diving_helmet", DivingHelmetItem::new)
.register(),
@ -299,7 +313,8 @@ public class AllItems {
public static final ItemEntry<SymmetryWandItem> WAND_OF_SYMMETRY =
REGISTRATE.item("wand_of_symmetry", SymmetryWandItem::new)
.properties(p -> p.stacksTo(1).rarity(Rarity.UNCOMMON))
.properties(p -> p.stacksTo(1)
.rarity(Rarity.UNCOMMON))
.model(AssetLookup.itemModelWithPartials())
.register();
@ -365,16 +380,17 @@ public class AllItems {
}
@SafeVarargs
private static ItemEntry<Item> taggedIngredient(String name, Tag.Named<Item>... tags) {
private static ItemEntry<Item> taggedIngredient(String name, TagKey<Item>... tags) {
return REGISTRATE.item(name, Item::new)
.tag(tags)
.register();
}
private static ItemEntry<TagDependentIngredientItem> compatCrushedOre(String metalName) {
private static ItemEntry<TagDependentIngredientItem> compatCrushedOre(CompatMetals metal) {
String metalName = metal.getName();
return REGISTRATE
.item("crushed_" + metalName + "_ore",
props -> new TagDependentIngredientItem(props, new ResourceLocation("forge", "ores/" + metalName)))
props -> new TagDependentIngredientItem(props, AllTags.forgeItemTag("ores/" + metalName)))
.tag(CRUSHED_ORES.tag)
.register();
}

View file

@ -1,8 +1,10 @@
package com.simibubi.create;
import java.util.Optional;
import java.util.Set;
import java.util.function.Supplier;
import com.google.common.collect.ImmutableSet;
import com.simibubi.create.compat.jei.ConversionRecipe;
import com.simibubi.create.content.contraptions.components.crafter.MechanicalCraftingRecipe;
import com.simibubi.create.content.contraptions.components.crusher.CrushingRecipe;
@ -134,7 +136,13 @@ public enum AllRecipeTypes implements IRecipeTypeInfo {
});
}
public static boolean isManualRecipe(Recipe<?> recipe) {
public static final Set<ResourceLocation> RECIPE_DENY_SET =
ImmutableSet.of(new ResourceLocation("occultism", "spirit_trade"), new ResourceLocation("occultism", "ritual"));
public static boolean shouldIgnoreInAutomation(Recipe<?> recipe) {
RecipeSerializer<?> serializer = recipe.getSerializer();
if (serializer != null && RECIPE_DENY_SET.contains(serializer.getRegistryName()))
return true;
return recipe.getId()
.getPath()
.endsWith("_manual_only");

View file

@ -4,7 +4,7 @@ import static com.simibubi.create.AllTags.NameSpace.FORGE;
import static com.simibubi.create.AllTags.NameSpace.MOD;
import static com.simibubi.create.AllTags.NameSpace.TIC;
import java.util.function.Function;
import java.util.Collections;
import com.simibubi.create.foundation.data.CreateRegistrate;
import com.simibubi.create.foundation.utility.Lang;
@ -17,7 +17,7 @@ import net.minecraft.resources.ResourceLocation;
import net.minecraft.tags.BlockTags;
import net.minecraft.tags.FluidTags;
import net.minecraft.tags.ItemTags;
import net.minecraft.tags.Tag;
import net.minecraft.tags.TagKey;
import net.minecraft.world.item.BlockItem;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
@ -26,32 +26,36 @@ import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.material.Fluid;
import net.minecraft.world.level.material.FluidState;
import net.minecraft.world.level.material.Fluids;
import net.minecraftforge.common.Tags;
import net.minecraftforge.registries.ForgeRegistries;
import net.minecraftforge.registries.IForgeRegistry;
import net.minecraftforge.registries.IForgeRegistryEntry;
public class AllTags {
private static final CreateRegistrate REGISTRATE = Create.registrate()
.creativeModeTab(() -> Create.BASE_CREATIVE_TAB);
public static <T> Tag.Named<T> tag(Function<ResourceLocation, Tag.Named<T>> wrapperFactory, String namespace,
String path) {
return wrapperFactory.apply(new ResourceLocation(namespace, path));
public static <T extends IForgeRegistryEntry<T>> TagKey<T> optionalTag(IForgeRegistry<T> registry, ResourceLocation id) {
return registry.tags().createOptionalTagKey(id, Collections.emptySet());
}
public static <T> Tag.Named<T> forgeTag(Function<ResourceLocation, Tag.Named<T>> wrapperFactory, String path) {
return tag(wrapperFactory, "forge", path);
public static <T extends IForgeRegistryEntry<T>> TagKey<T> forgeTag(IForgeRegistry<T> registry, String path) {
return optionalTag(registry, new ResourceLocation("forge", path));
}
public static Tag.Named<Block> forgeBlockTag(String path) {
return forgeTag(BlockTags::createOptional, path);
public static TagKey<Block> forgeBlockTag(String path) {
return forgeTag(ForgeRegistries.BLOCKS, path);
}
public static Tag.Named<Item> forgeItemTag(String path) {
return forgeTag(ItemTags::createOptional, path);
public static TagKey<Item> forgeItemTag(String path) {
return forgeTag(ForgeRegistries.ITEMS, path);
}
public static Tag.Named<Fluid> forgeFluidTag(String path) {
return forgeTag(FluidTags::createOptional, path);
public static TagKey<Fluid> forgeFluidTag(String path) {
return forgeTag(ForgeRegistries.FLUIDS, path);
}
public static <T extends Block, P> NonNullFunction<BlockBuilder<T, P>, BlockBuilder<T, P>> axeOrPickaxe() {
@ -81,7 +85,9 @@ public class AllTags {
public enum NameSpace {
MOD(Create.ID, false, true), FORGE("forge"), TIC("tconstruct")
MOD(Create.ID, false, true),
FORGE("forge"),
TIC("tconstruct")
;
@ -106,8 +112,8 @@ public class AllTags {
BRITTLE,
FAN_HEATERS,
FAN_TRANSPARENT,
ORE_OVERRIDE_STONE,
SAFE_NBT,
SAILS,
SEATS,
TOOLBOXES,
VALVE_HANDLES,
@ -118,15 +124,14 @@ public class AllTags {
PASSIVE_BOILER_HEATERS,
ACTIVE_BOILER_HEATERS,
ORE_OVERRIDE_STONE,
RELOCATION_NOT_SUPPORTED(FORGE),
WG_STONE(FORGE),
SLIMY_LOGS(TIC),
;
public final Tag.Named<Block> tag;
public final TagKey<Block> tag;
AllBlockTags() {
this(MOD);
@ -147,21 +152,22 @@ public class AllTags {
AllBlockTags(NameSpace namespace, String path, boolean optional, boolean alwaysDatagen) {
ResourceLocation id = new ResourceLocation(namespace.id, path == null ? Lang.asId(name()) : path);
if (optional) {
tag = BlockTags.createOptional(id);
tag = optionalTag(ForgeRegistries.BLOCKS, id);
} else {
tag = BlockTags.bind(id.toString());
tag = BlockTags.create(id);
}
if (alwaysDatagen) {
REGISTRATE.addDataGenerator(ProviderType.BLOCK_TAGS, prov -> prov.tag(tag));
}
}
@SuppressWarnings("deprecation")
public boolean matches(Block block) {
return tag.contains(block);
return block.builtInRegistryHolder().is(tag);
}
public boolean matches(BlockState state) {
return matches(state.getBlock());
return state.is(tag);
}
public void add(Block... values) {
@ -169,7 +175,7 @@ public class AllTags {
.add(values));
}
public void includeIn(Tag.Named<Block> parent) {
public void includeIn(TagKey<Block> parent) {
REGISTRATE.addDataGenerator(ProviderType.BLOCK_TAGS, prov -> prov.tag(parent)
.addTag(tag));
}
@ -178,7 +184,7 @@ public class AllTags {
includeIn(parent.tag);
}
public void includeAll(Tag.Named<Block> child) {
public void includeAll(TagKey<Block> child) {
REGISTRATE.addDataGenerator(ProviderType.BLOCK_TAGS, prov -> prov.tag(tag)
.addTag(child));
}
@ -187,6 +193,8 @@ public class AllTags {
public enum AllItemTags {
BLAZE_BURNER_FUEL_REGULAR(MOD, "blaze_burner_fuel/regular"),
BLAZE_BURNER_FUEL_SPECIAL(MOD, "blaze_burner_fuel/special"),
CREATE_INGOTS,
CRUSHED_ORES,
SANDPAPER,
@ -200,7 +208,7 @@ public class AllTags {
;
public final Tag.Named<Item> tag;
public final TagKey<Item> tag;
AllItemTags() {
this(MOD);
@ -221,17 +229,22 @@ public class AllTags {
AllItemTags(NameSpace namespace, String path, boolean optional, boolean alwaysDatagen) {
ResourceLocation id = new ResourceLocation(namespace.id, path == null ? Lang.asId(name()) : path);
if (optional) {
tag = ItemTags.createOptional(id);
tag = optionalTag(ForgeRegistries.ITEMS, id);
} else {
tag = ItemTags.bind(id.toString());
tag = ItemTags.create(id);
}
if (alwaysDatagen) {
REGISTRATE.addDataGenerator(ProviderType.ITEM_TAGS, prov -> prov.tag(tag));
}
}
@SuppressWarnings("deprecation")
public boolean matches(Item item) {
return item.builtInRegistryHolder().is(tag);
}
public boolean matches(ItemStack stack) {
return tag.contains(stack.getItem());
return stack.is(tag);
}
public void add(Item... values) {
@ -239,7 +252,7 @@ public class AllTags {
.add(values));
}
public void includeIn(Tag.Named<Item> parent) {
public void includeIn(TagKey<Item> parent) {
REGISTRATE.addDataGenerator(ProviderType.ITEM_TAGS, prov -> prov.tag(parent)
.addTag(tag));
}
@ -248,7 +261,7 @@ public class AllTags {
includeIn(parent.tag);
}
public void includeAll(Tag.Named<Item> child) {
public void includeAll(TagKey<Item> child) {
REGISTRATE.addDataGenerator(ProviderType.ITEM_TAGS, prov -> prov.tag(tag)
.addTag(child));
}
@ -257,13 +270,14 @@ public class AllTags {
public enum AllFluidTags {
NO_INFINITE_DRAINING(MOD, true, false),
BOTTOMLESS_ALLOW(MOD, "bottomless/allow"),
BOTTOMLESS_DENY(MOD, "bottomless/deny"),
HONEY(FORGE)
;
public final Tag.Named<Fluid> tag;
public final TagKey<Fluid> tag;
AllFluidTags() {
this(MOD);
@ -284,17 +298,22 @@ public class AllTags {
AllFluidTags(NameSpace namespace, String path, boolean optional, boolean alwaysDatagen) {
ResourceLocation id = new ResourceLocation(namespace.id, path == null ? Lang.asId(name()) : path);
if (optional) {
tag = FluidTags.createOptional(id);
tag = optionalTag(ForgeRegistries.FLUIDS, id);
} else {
tag = FluidTags.bind(id.toString());
tag = FluidTags.create(id);
}
if (alwaysDatagen) {
REGISTRATE.addDataGenerator(ProviderType.FLUID_TAGS, prov -> prov.tag(tag));
}
}
@SuppressWarnings("deprecation")
public boolean matches(Fluid fluid) {
return fluid != null && fluid.is(tag);
return fluid.is(tag);
}
public boolean matches(FluidState state) {
return state.is(tag);
}
public void add(Fluid... values) {
@ -302,7 +321,7 @@ public class AllTags {
.add(values));
}
public void includeIn(Tag.Named<Fluid> parent) {
public void includeIn(TagKey<Fluid> parent) {
REGISTRATE.addDataGenerator(ProviderType.FLUID_TAGS, prov -> prov.tag(parent)
.addTag(tag));
}
@ -311,17 +330,15 @@ public class AllTags {
includeIn(parent.tag);
}
public void includeAll(Tag.Named<Fluid> child) {
public void includeAll(TagKey<Fluid> child) {
REGISTRATE.addDataGenerator(ProviderType.FLUID_TAGS, prov -> prov.tag(tag)
.addTag(child));
}
private static void loadClass() {}
}
public static void register() {
AllFluidTags.loadClass();
AllFluidTags.BOTTOMLESS_ALLOW.add(Fluids.WATER, Fluids.LAVA);
AllItemTags.CREATE_INGOTS.includeIn(AllItemTags.BEACON_PAYMENT);
AllItemTags.CREATE_INGOTS.includeIn(Tags.Items.INGOTS);

View file

@ -32,7 +32,7 @@ import com.simibubi.create.foundation.data.recipe.SequencedAssemblyRecipeGen;
import com.simibubi.create.foundation.data.recipe.StandardRecipeGen;
import com.simibubi.create.foundation.networking.AllPackets;
import com.simibubi.create.foundation.worldgen.AllWorldFeatures;
import com.tterrag.registrate.util.NonNullLazyValue;
import com.tterrag.registrate.util.nullness.NonNullSupplier;
import net.minecraft.core.particles.ParticleType;
import net.minecraft.data.DataGenerator;
@ -59,7 +59,7 @@ public class Create {
public static final String ID = "create";
public static final String NAME = "Create";
public static final String VERSION = "0.4d";
public static final String VERSION = "0.4.1";
public static final Logger LOGGER = LogManager.getLogger();
@ -77,7 +77,7 @@ public class Create {
public static final ServerLagger LAGGER = new ServerLagger();
public static final Random RANDOM = new Random();
private static final NonNullLazyValue<CreateRegistrate> REGISTRATE = CreateRegistrate.lazy(ID);
private static final NonNullSupplier<CreateRegistrate> REGISTRATE = CreateRegistrate.lazy(ID);
public Create() {
onCtor();

View file

@ -1,15 +1,50 @@
package com.simibubi.create.compat.jei;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;
import java.util.stream.Collectors;
import javax.annotation.Nonnull;
import com.google.common.base.Predicates;
import com.simibubi.create.*;
import com.simibubi.create.compat.jei.category.*;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.AllFluids;
import com.simibubi.create.AllItems;
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.CreateRecipeCategory;
import com.simibubi.create.compat.jei.category.CrushingCategory;
import com.simibubi.create.compat.jei.category.DeployingCategory;
import com.simibubi.create.compat.jei.category.FanBlastingCategory;
import com.simibubi.create.compat.jei.category.FanHauntingCategory;
import com.simibubi.create.compat.jei.category.FanSmokingCategory;
import com.simibubi.create.compat.jei.category.FanWashingCategory;
import com.simibubi.create.compat.jei.category.ItemDrainCategory;
import com.simibubi.create.compat.jei.category.MechanicalCraftingCategory;
import com.simibubi.create.compat.jei.category.MillingCategory;
import com.simibubi.create.compat.jei.category.MixingCategory;
import com.simibubi.create.compat.jei.category.MysteriousItemConversionCategory;
import com.simibubi.create.compat.jei.category.PackingCategory;
import com.simibubi.create.compat.jei.category.PolishingCategory;
import com.simibubi.create.compat.jei.category.PressingCategory;
import com.simibubi.create.compat.jei.category.ProcessingViaFanCategory;
import com.simibubi.create.compat.jei.category.SawingCategory;
import com.simibubi.create.compat.jei.category.SequencedAssemblyCategory;
import com.simibubi.create.compat.jei.category.SpoutCategory;
import com.simibubi.create.content.contraptions.components.crafter.MechanicalCraftingRecipe;
import com.simibubi.create.content.contraptions.components.deployer.DeployerApplicationRecipe;
import com.simibubi.create.content.contraptions.components.press.MechanicalPressTileEntity;
import com.simibubi.create.content.contraptions.components.saw.SawTileEntity;
import com.simibubi.create.content.contraptions.fluids.potion.PotionFluid;
import com.simibubi.create.content.contraptions.fluids.recipe.PotionMixingRecipeManager;
import com.simibubi.create.content.contraptions.fluids.recipe.PotionMixingRecipes;
import com.simibubi.create.content.contraptions.processing.BasinRecipe;
import com.simibubi.create.content.curiosities.tools.BlueprintScreen;
import com.simibubi.create.content.logistics.item.LinkedControllerScreen;
@ -23,26 +58,25 @@ import com.simibubi.create.foundation.utility.recipe.IRecipeTypeInfo;
import mezz.jei.api.IModPlugin;
import mezz.jei.api.JeiPlugin;
import mezz.jei.api.constants.VanillaRecipeCategoryUid;
import mezz.jei.api.registration.*;
import mezz.jei.api.recipe.category.IRecipeCategory;
import mezz.jei.api.registration.IGuiHandlerRegistration;
import mezz.jei.api.registration.IRecipeCatalystRegistration;
import mezz.jei.api.registration.IRecipeCategoryRegistration;
import mezz.jei.api.registration.IRecipeRegistration;
import mezz.jei.api.registration.IRecipeTransferRegistration;
import mezz.jei.api.registration.ISubtypeRegistration;
import mezz.jei.api.runtime.IIngredientManager;
import net.minecraft.client.Minecraft;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items;
import net.minecraft.world.item.crafting.*;
import net.minecraft.world.item.crafting.CraftingRecipe;
import net.minecraft.world.item.crafting.Recipe;
import net.minecraft.world.item.crafting.RecipeType;
import net.minecraft.world.level.ItemLike;
import net.minecraftforge.common.crafting.IShapedRecipe;
import net.minecraftforge.fml.ModList;
import javax.annotation.Nonnull;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;
import java.util.stream.Collectors;
@JeiPlugin
@SuppressWarnings("unused")
public class CreateJEI implements IModPlugin {
@ -51,144 +85,152 @@ public class CreateJEI implements IModPlugin {
public IIngredientManager ingredientManager;
private final List<CreateRecipeCategory<?>> allCategories = new ArrayList<>();
private final CreateRecipeCategory<?>
milling = register("milling", MillingCategory::new).recipes(AllRecipeTypes.MILLING)
private void loadCategories() {
allCategories.clear();
CreateRecipeCategory<?>
milling = register("milling", MillingCategory::new).addTypedRecipes(AllRecipeTypes.MILLING)
.catalyst(AllBlocks.MILLSTONE::get)
.build(),
crushing = register("crushing", CrushingCategory::new).recipes(AllRecipeTypes.CRUSHING)
.recipesExcluding(AllRecipeTypes.MILLING::getType, AllRecipeTypes.CRUSHING::getType)
.catalyst(AllBlocks.CRUSHING_WHEEL::get)
.build(),
crushing = register("crushing", CrushingCategory::new).addTypedRecipes(AllRecipeTypes.CRUSHING)
.addTypedRecipesExcluding(AllRecipeTypes.MILLING::getType, AllRecipeTypes.CRUSHING::getType)
.catalyst(AllBlocks.CRUSHING_WHEEL::get)
.build(),
pressing = register("pressing", PressingCategory::new).recipes(AllRecipeTypes.PRESSING)
.catalyst(AllBlocks.MECHANICAL_PRESS::get)
.build(),
pressing = register("pressing", PressingCategory::new).addTypedRecipes(AllRecipeTypes.PRESSING)
.catalyst(AllBlocks.MECHANICAL_PRESS::get)
.build(),
washing = register("fan_washing", FanWashingCategory::new).recipes(AllRecipeTypes.SPLASHING)
.catalystStack(ProcessingViaFanCategory.getFan("fan_washing"))
.build(),
washing = register("fan_washing", FanWashingCategory::new).addTypedRecipes(AllRecipeTypes.SPLASHING)
.catalystStack(ProcessingViaFanCategory.getFan("fan_washing"))
.build(),
smoking = register("fan_smoking", FanSmokingCategory::new).recipes(() -> RecipeType.SMOKING)
.catalystStack(ProcessingViaFanCategory.getFan("fan_smoking"))
.build(),
smoking = register("fan_smoking", FanSmokingCategory::new).addTypedRecipes(() -> RecipeType.SMOKING)
.catalystStack(ProcessingViaFanCategory.getFan("fan_smoking"))
.build(),
soul_smoking = register("fan_haunting", FanHauntingCategory::new).recipes(AllRecipeTypes.HAUNTING)
.catalystStack(ProcessingViaFanCategory.getFan("fan_haunting")).build(),
blasting = register("fan_blasting", FanBlastingCategory::new)
.addTypedRecipesExcluding(() -> RecipeType.SMELTING, () -> RecipeType.BLASTING)
.addTypedRecipes(() -> RecipeType.BLASTING)
.removeRecipes(() -> RecipeType.SMOKING)
.catalystStack(ProcessingViaFanCategory.getFan("fan_blasting"))
.build(),
blasting = register("fan_blasting", FanBlastingCategory::new)
.recipesExcluding(() -> RecipeType.SMELTING, () -> RecipeType.BLASTING)
.recipes(() -> RecipeType.BLASTING)
.removeRecipes(() -> RecipeType.SMOKING)
.catalystStack(ProcessingViaFanCategory.getFan("fan_blasting"))
.build(),
haunting = register("fan_haunting", FanHauntingCategory::new).addTypedRecipes(AllRecipeTypes.HAUNTING)
.catalystStack(ProcessingViaFanCategory.getFan("fan_haunting"))
.build(),
mixing = register("mixing", MixingCategory::standard).recipes(AllRecipeTypes.MIXING::getType)
.catalyst(AllBlocks.MECHANICAL_MIXER::get)
.catalyst(AllBlocks.BASIN::get)
.build(),
mixing = register("mixing", MixingCategory::standard).addTypedRecipes(AllRecipeTypes.MIXING)
.catalyst(AllBlocks.MECHANICAL_MIXER::get)
.catalyst(AllBlocks.BASIN::get)
.build(),
seqAssembly = register("sequenced_assembly", SequencedAssemblyCategory::new)
.recipes(AllRecipeTypes.SEQUENCED_ASSEMBLY::getType)
.build(),
seqAssembly = register("sequenced_assembly", SequencedAssemblyCategory::new)
.addTypedRecipes(AllRecipeTypes.SEQUENCED_ASSEMBLY)
.build(),
autoShapeless = register("automatic_shapeless", MixingCategory::autoShapeless)
.recipes(r -> r.getSerializer() == RecipeSerializer.SHAPELESS_RECIPE && r.getIngredients()
.size() > 1 && !MechanicalPressTileEntity.canCompress(r) && !AllRecipeTypes.isManualRecipe(r),
autoShapeless = register("automatic_shapeless", MixingCategory::autoShapeless)
.addAllRecipesIf(r -> r instanceof CraftingRecipe && !(r instanceof IShapedRecipe<?>)
&& r.getIngredients()
.size() > 1
&& !MechanicalPressTileEntity.canCompress(r) && !AllRecipeTypes.shouldIgnoreInAutomation(r),
BasinRecipe::convertShapeless)
.catalyst(AllBlocks.MECHANICAL_MIXER::get)
.catalyst(AllBlocks.BASIN::get)
.enableWhen(c -> c.allowShapelessInMixer)
.build(),
.catalyst(AllBlocks.MECHANICAL_MIXER::get)
.catalyst(AllBlocks.BASIN::get)
.enableWhen(c -> c.allowShapelessInMixer)
.build(),
brewing = register("automatic_brewing", MixingCategory::autoBrewing)
.recipeList(PotionMixingRecipeManager::getAllBrewingRecipes)
.catalyst(AllBlocks.MECHANICAL_MIXER::get)
.catalyst(AllBlocks.BASIN::get)
.build(),
brewing =
register("automatic_brewing", MixingCategory::autoBrewing).addRecipes(() -> PotionMixingRecipes.ALL)
.catalyst(AllBlocks.MECHANICAL_MIXER::get)
.catalyst(AllBlocks.BASIN::get)
.build(),
sawing = register("sawing", SawingCategory::new).recipes(AllRecipeTypes.CUTTING)
.catalyst(AllBlocks.MECHANICAL_SAW::get)
.build(),
sawing = register("sawing", SawingCategory::new).addTypedRecipes(AllRecipeTypes.CUTTING)
.catalyst(AllBlocks.MECHANICAL_SAW::get)
.build(),
blockCutting = register("block_cutting", () -> new BlockCuttingCategory(Items.STONE_BRICK_STAIRS))
.recipeList(() -> CondensedBlockCuttingRecipe.condenseRecipes(findRecipes(
recipe -> recipe.getType() == RecipeType.STONECUTTING && !AllRecipeTypes.isManualRecipe(recipe))))
.catalyst(AllBlocks.MECHANICAL_SAW::get)
.enableWhen(c -> c.allowStonecuttingOnSaw)
.build(),
blockCutting =
register("block_cutting", () -> new BlockCuttingCategory(Items.STONE_BRICK_STAIRS))
.addRecipes(() -> CondensedBlockCuttingRecipe.condenseRecipes(getTypedRecipesExcluding(
RecipeType.STONECUTTING, recipe -> AllRecipeTypes.shouldIgnoreInAutomation(recipe))))
.catalyst(AllBlocks.MECHANICAL_SAW::get)
.enableWhen(c -> c.allowStonecuttingOnSaw)
.build(),
woodCutting = register("wood_cutting", () -> new BlockCuttingCategory(Items.OAK_STAIRS))
.recipeList(() -> CondensedBlockCuttingRecipe
.condenseRecipes(findRecipes(recipe -> recipe.getType() == SawTileEntity.woodcuttingRecipeType.get()
&& !AllRecipeTypes.isManualRecipe(recipe))))
.catalyst(AllBlocks.MECHANICAL_SAW::get)
.enableWhenBool(c -> c.allowWoodcuttingOnSaw.get() && ModList.get()
woodCutting = register("wood_cutting", () -> new BlockCuttingCategory(Items.OAK_STAIRS))
.addRecipes(() -> CondensedBlockCuttingRecipe
.condenseRecipes(getTypedRecipesExcluding(SawTileEntity.woodcuttingRecipeType.get(),
recipe -> AllRecipeTypes.shouldIgnoreInAutomation(recipe))))
.catalyst(AllBlocks.MECHANICAL_SAW::get)
.enableWhenBool(c -> c.allowWoodcuttingOnSaw.get() && ModList.get()
.isLoaded("druidcraft"))
.build(),
.build(),
packing = register("packing", PackingCategory::standard).recipes(AllRecipeTypes.COMPACTING)
.catalyst(AllBlocks.MECHANICAL_PRESS::get)
.catalyst(AllBlocks.BASIN::get)
.build(),
packing = register("packing", PackingCategory::standard).addTypedRecipes(AllRecipeTypes.COMPACTING)
.catalyst(AllBlocks.MECHANICAL_PRESS::get)
.catalyst(AllBlocks.BASIN::get)
.build(),
autoSquare = register("automatic_packing", PackingCategory::autoSquare)
.recipes(
autoSquare = register("automatic_packing", PackingCategory::autoSquare)
.addAllRecipesIf(
r -> (r instanceof CraftingRecipe) && !(r instanceof MechanicalCraftingRecipe)
&& MechanicalPressTileEntity.canCompress(r) && !AllRecipeTypes.isManualRecipe(r),
&& MechanicalPressTileEntity.canCompress(r) && !AllRecipeTypes.shouldIgnoreInAutomation(r),
BasinRecipe::convertShapeless)
.catalyst(AllBlocks.MECHANICAL_PRESS::get)
.catalyst(AllBlocks.BASIN::get)
.enableWhen(c -> c.allowShapedSquareInPress)
.build(),
.catalyst(AllBlocks.MECHANICAL_PRESS::get)
.catalyst(AllBlocks.BASIN::get)
.enableWhen(c -> c.allowShapedSquareInPress)
.build(),
polishing = register("sandpaper_polishing", PolishingCategory::new).recipes(AllRecipeTypes.SANDPAPER_POLISHING)
.catalyst(AllItems.SAND_PAPER::get)
.catalyst(AllItems.RED_SAND_PAPER::get)
.build(),
polishing = register("sandpaper_polishing", PolishingCategory::new)
.addTypedRecipes(AllRecipeTypes.SANDPAPER_POLISHING)
.catalyst(AllItems.SAND_PAPER::get)
.catalyst(AllItems.RED_SAND_PAPER::get)
.build(),
deploying = register("deploying", DeployingCategory::new)
.recipeList(() -> DeployerApplicationRecipe
.convert(findRecipesByType(AllRecipeTypes.SANDPAPER_POLISHING.getType())))
.recipes(AllRecipeTypes.DEPLOYING)
.catalyst(AllBlocks.DEPLOYER::get)
.catalyst(AllBlocks.DEPOT::get)
.catalyst(AllItems.BELT_CONNECTOR::get)
.build(),
deploying = register("deploying", DeployingCategory::new).addTypedRecipes(AllRecipeTypes.DEPLOYING)
.addTypedRecipes(AllRecipeTypes.SANDPAPER_POLISHING::getType, DeployerApplicationRecipe::convert)
.catalyst(AllBlocks.DEPLOYER::get)
.catalyst(AllBlocks.DEPOT::get)
.catalyst(AllItems.BELT_CONNECTOR::get)
.build(),
mysteryConversion = register("mystery_conversion", MysteriousItemConversionCategory::new)
.recipeList(MysteriousItemConversionCategory::getRecipes)
.build(),
mysteryConversion = register("mystery_conversion", MysteriousItemConversionCategory::new)
.addRecipes(() -> MysteriousItemConversionCategory.RECIPES)
.build(),
spoutFilling = register("spout_filling", SpoutCategory::new).recipes(AllRecipeTypes.FILLING)
.recipeList(() -> SpoutCategory.getRecipes(ingredientManager))
.catalyst(AllBlocks.SPOUT::get)
.build(),
spoutFilling = register("spout_filling", SpoutCategory::new).addTypedRecipes(AllRecipeTypes.FILLING)
.addRecipeListConsumer(recipes -> SpoutCategory.consumeRecipes(recipes::add, ingredientManager))
.catalyst(AllBlocks.SPOUT::get)
.build(),
draining = register("draining", ItemDrainCategory::new)
.recipeList(() -> ItemDrainCategory.getRecipes(ingredientManager))
.recipes(AllRecipeTypes.EMPTYING)
.catalyst(AllBlocks.ITEM_DRAIN::get)
.build(),
draining = register("draining", ItemDrainCategory::new)
.addRecipeListConsumer(recipes -> ItemDrainCategory.consumeRecipes(recipes::add, ingredientManager))
.addTypedRecipes(AllRecipeTypes.EMPTYING)
.catalyst(AllBlocks.ITEM_DRAIN::get)
.build(),
autoShaped = register("automatic_shaped", MechanicalCraftingCategory::new)
.recipes(r -> r.getSerializer() == RecipeSerializer.SHAPELESS_RECIPE && r.getIngredients()
.size() == 1)
.recipes(r -> (r.getType() == RecipeType.CRAFTING
&& r.getType() != AllRecipeTypes.MECHANICAL_CRAFTING.getType()) && (r instanceof ShapedRecipe)
&& !AllRecipeTypes.isManualRecipe(r))
.catalyst(AllBlocks.MECHANICAL_CRAFTER::get)
.enableWhen(c -> c.allowRegularCraftingInCrafter)
.build(),
autoShaped = register("automatic_shaped", MechanicalCraftingCategory::new)
.addAllRecipesIf(r -> r instanceof CraftingRecipe && !(r instanceof IShapedRecipe<?>)
&& r.getIngredients()
.size() == 1
&& !AllRecipeTypes.shouldIgnoreInAutomation(r))
.addTypedRecipesIf(() -> RecipeType.CRAFTING,
recipe -> recipe instanceof IShapedRecipe<?> && !AllRecipeTypes.shouldIgnoreInAutomation(recipe))
.catalyst(AllBlocks.MECHANICAL_CRAFTER::get)
.enableWhen(c -> c.allowRegularCraftingInCrafter)
.build(),
mechanicalCrafting =
register("mechanical_crafting", MechanicalCraftingCategory::new).recipes(AllRecipeTypes.MECHANICAL_CRAFTING)
.catalyst(AllBlocks.MECHANICAL_CRAFTER::get)
.build();
mechanicalCrafting = register("mechanical_crafting", MechanicalCraftingCategory::new)
.addTypedRecipes(AllRecipeTypes.MECHANICAL_CRAFTING)
.catalyst(AllBlocks.MECHANICAL_CRAFTER::get)
.build();
private <T extends Recipe<?>> CategoryBuilder<T> register(String name,
Supplier<CreateRecipeCategory<T>> supplier) {
}
private <T extends Recipe<?>> CategoryBuilder<T> register(String name, Supplier<CreateRecipeCategory<T>> supplier) {
return new CategoryBuilder<T>(name, supplier);
}
@ -205,7 +247,8 @@ public class CreateJEI implements IModPlugin {
@Override
public void registerCategories(IRecipeCategoryRegistration registration) {
allCategories.forEach(registration::addRecipeCategories);
loadCategories();
registration.addRecipeCategories(allCategories.toArray(IRecipeCategory[]::new));
}
@Override
@ -222,7 +265,7 @@ public class CreateJEI implements IModPlugin {
allCategories.forEach(c -> c.recipes.forEach(s -> registration.addRecipes(s.get(), c.getUid())));
registration.addRecipes(ToolboxColoringRecipeMaker.createRecipes()
.collect(Collectors.toList()), VanillaRecipeCategoryUid.CRAFTING);
.collect(Collectors.toList()), VanillaRecipeCategoryUid.CRAFTING);
}
@Override
@ -230,7 +273,7 @@ public class CreateJEI implements IModPlugin {
allCategories.forEach(c -> c.recipeCatalysts.forEach(s -> registration.addRecipeCatalyst(s.get(), c.getUid())));
}
@SuppressWarnings({"unchecked", "rawtypes"})
@SuppressWarnings({ "unchecked", "rawtypes" })
@Override
public void registerGuiHandlers(IGuiHandlerRegistration registration) {
registration.addGenericGuiContainerHandler(AbstractSimiContainerScreen.class, new SlotMover());
@ -251,63 +294,87 @@ public class CreateJEI implements IModPlugin {
pred = Predicates.alwaysTrue();
}
public CategoryBuilder<T> recipes(IRecipeTypeInfo recipeTypeEntry) {
return recipes(recipeTypeEntry::getType);
}
public CategoryBuilder<T> recipes(Supplier<RecipeType<? extends T>> recipeType) {
return recipes(r -> r.getType() == recipeType.get());
}
public CategoryBuilder<T> recipes(ResourceLocation serializer) {
return recipes(r -> r.getSerializer()
.getRegistryName()
.equals(serializer));
}
public CategoryBuilder<T> recipes(Predicate<Recipe<?>> pred) {
return recipeList(() -> findRecipes(pred));
}
public CategoryBuilder<T> recipes(Predicate<Recipe<?>> pred, Function<Recipe<?>, T> converter) {
return recipeList(() -> findRecipes(pred), converter);
}
public CategoryBuilder<T> recipeList(Supplier<List<? extends Recipe<?>>> list) {
return recipeList(list, null);
}
public CategoryBuilder<T> recipeList(Supplier<List<? extends Recipe<?>>> list,
Function<Recipe<?>, T> converter) {
recipeListConsumers.add(recipes -> {
List<? extends Recipe<?>> toAdd = list.get();
if (converter != null)
toAdd = toAdd.stream()
.map(converter)
.collect(Collectors.toList());
recipes.addAll(toAdd);
});
public CategoryBuilder<T> addRecipeListConsumer(Consumer<List<Recipe<?>>> consumer) {
recipeListConsumers.add(consumer);
return this;
}
public CategoryBuilder<T> recipesExcluding(Supplier<RecipeType<? extends T>> recipeType,
Supplier<RecipeType<? extends T>> excluded) {
recipeListConsumers.add(recipes -> {
recipes.addAll(findRecipesByTypeExcluding(recipeType.get(), excluded.get()));
public CategoryBuilder<T> addRecipes(Supplier<Collection<? extends Recipe<?>>> collection) {
return addRecipeListConsumer(recipes -> recipes.addAll(collection.get()));
}
public CategoryBuilder<T> addAllRecipesIf(Predicate<Recipe<?>> pred) {
return addRecipeListConsumer(recipes -> consumeAllRecipes(recipe -> {
if (pred.test(recipe)) {
recipes.add(recipe);
}
}));
}
public CategoryBuilder<T> addAllRecipesIf(Predicate<Recipe<?>> pred, Function<Recipe<?>, T> converter) {
return addRecipeListConsumer(recipes -> consumeAllRecipes(recipe -> {
if (pred.test(recipe)) {
recipes.add(converter.apply(recipe));
}
}));
}
public CategoryBuilder<T> addTypedRecipes(IRecipeTypeInfo recipeTypeEntry) {
return addTypedRecipes(recipeTypeEntry::getType);
}
public CategoryBuilder<T> addTypedRecipes(Supplier<RecipeType<? extends T>> recipeType) {
return addRecipeListConsumer(recipes -> consumeTypedRecipes(recipes::add, recipeType.get()));
}
public CategoryBuilder<T> addTypedRecipes(Supplier<RecipeType<? extends T>> recipeType,
Function<Recipe<?>, T> converter) {
return addRecipeListConsumer(recipes -> consumeTypedRecipes(recipe -> {
recipes.add(converter.apply(recipe));
}, recipeType.get()));
}
public CategoryBuilder<T> addTypedRecipesIf(Supplier<RecipeType<? extends T>> recipeType,
Predicate<Recipe<?>> pred) {
return addRecipeListConsumer(recipes -> consumeTypedRecipes(recipe -> {
if (pred.test(recipe)) {
recipes.add(recipe);
}
}, recipeType.get()));
}
public CategoryBuilder<T> addTypedRecipesExcluding(Supplier<RecipeType<? extends T>> recipeType,
Supplier<RecipeType<? extends T>> excluded) {
return addRecipeListConsumer(recipes -> {
List<Recipe<?>> excludedRecipes = getTypedRecipes(excluded.get());
consumeTypedRecipes(recipe -> {
for (Recipe<?> excludedRecipe : excludedRecipes) {
if (doInputsMatch(recipe, excludedRecipe)) {
return;
}
}
recipes.add(recipe);
}, recipeType.get());
});
return this;
}
public CategoryBuilder<T> removeRecipes(Supplier<RecipeType<? extends T>> recipeType) {
recipeListConsumers.add(recipes -> {
removeRecipesByType(recipes, recipeType.get());
return addRecipeListConsumer(recipes -> {
List<Recipe<?>> excludedRecipes = getTypedRecipes(recipeType.get());
recipes.removeIf(recipe -> {
for (Recipe<?> excludedRecipe : excludedRecipes) {
if (doInputsMatch(recipe, excludedRecipe)) {
return true;
}
}
return false;
});
});
return this;
}
public CategoryBuilder<T> catalyst(Supplier<ItemLike> supplier) {
return catalystStack(() -> new ItemStack(supplier.get()
.asItem()));
.asItem()));
}
public CategoryBuilder<T> catalystStack(Supplier<ItemStack> supplier) {
@ -317,7 +384,7 @@ public class CreateJEI implements IModPlugin {
public CategoryBuilder<T> enableWhen(Function<CRecipes, ConfigBool> configValue) {
pred = c -> configValue.apply(c)
.get();
.get();
return this;
}
@ -340,52 +407,52 @@ public class CreateJEI implements IModPlugin {
}
public static List<Recipe<?>> findRecipes(Predicate<Recipe<?>> predicate) {
return Minecraft.getInstance()
public static void consumeAllRecipes(Consumer<Recipe<?>> consumer) {
Minecraft.getInstance()
.getConnection()
.getRecipeManager()
.getRecipes()
.stream()
.filter(predicate)
.collect(Collectors.toList());
.forEach(consumer);
}
public static List<Recipe<?>> findRecipesByType(RecipeType<?> type) {
return findRecipes(recipe -> recipe.getType() == type);
public static void consumeTypedRecipes(Consumer<Recipe<?>> consumer, RecipeType<?> type) {
Map<ResourceLocation, Recipe<?>> map = Minecraft.getInstance()
.getConnection()
.getRecipeManager().recipes.get(type);
if (map != null) {
map.values()
.forEach(consumer);
}
}
public static List<Recipe<?>> findRecipesByTypeExcluding(RecipeType<?> type, RecipeType<?> excludingType) {
List<Recipe<?>> byType = findRecipesByType(type);
removeRecipesByType(byType, excludingType);
return byType;
public static List<Recipe<?>> getTypedRecipes(RecipeType<?> type) {
List<Recipe<?>> recipes = new ArrayList<>();
consumeTypedRecipes(recipes::add, type);
return recipes;
}
public static List<Recipe<?>> findRecipesByTypeExcluding(RecipeType<?> type, RecipeType<?>... excludingTypes) {
List<Recipe<?>> byType = findRecipesByType(type);
for (RecipeType<?> excludingType : excludingTypes)
removeRecipesByType(byType, excludingType);
return byType;
}
public static void removeRecipesByType(List<Recipe<?>> recipes, RecipeType<?> type) {
List<Recipe<?>> byType = findRecipesByType(type);
recipes.removeIf(recipe -> {
for (Recipe<?> r : byType)
if (doInputsMatch(recipe, r))
return true;
return false;
});
public static List<Recipe<?>> getTypedRecipesExcluding(RecipeType<?> type, Predicate<Recipe<?>> exclusionPred) {
List<Recipe<?>> recipes = getTypedRecipes(type);
recipes.removeIf(exclusionPred);
return recipes;
}
public static boolean doInputsMatch(Recipe<?> recipe1, Recipe<?> recipe2) {
if (recipe1.getIngredients()
.isEmpty()
|| recipe2.getIngredients()
.isEmpty()) {
return false;
}
ItemStack[] matchingStacks = recipe1.getIngredients()
.get(0)
.getItems();
if (matchingStacks.length == 0)
return true;
.get(0)
.getItems();
if (matchingStacks.length == 0) {
return false;
}
if (recipe2.getIngredients()
.get(0)
.test(matchingStacks[0]))
.get(0)
.test(matchingStacks[0]))
return true;
return false;
}

View file

@ -8,7 +8,7 @@ import com.simibubi.create.Create;
import net.minecraft.core.NonNullList;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.tags.Tag;
import net.minecraft.tags.TagKey;
import net.minecraft.world.item.DyeColor;
import net.minecraft.world.item.DyeItem;
import net.minecraft.world.item.Item;
@ -32,7 +32,7 @@ public final class ToolboxColoringRecipeMaker {
.map(color -> {
DyeItem dye = DyeItem.byColor(color);
ItemStack dyeStack = new ItemStack(dye);
Tag<Item> colorTag = color.getTag();
TagKey<Item> colorTag = color.getTag();
Ingredient.Value dyeList = new Ingredient.ItemValue(dyeStack);
Ingredient.Value colorList = new Ingredient.TagValue(colorTag);
Stream<Ingredient.Value> colorIngredientStream = Stream.of(dyeList, colorList);

View file

@ -86,7 +86,7 @@ public class BlockCuttingCategory extends CreateRecipeCategory<CondensedBlockCut
public List<ItemStack> getOutputs() {
return outputs;
}
public List<List<ItemStack>> getCondensedOutputs() {
List<List<ItemStack>> result = new ArrayList<>();
int index = 0;
@ -104,6 +104,11 @@ public class BlockCuttingCategory extends CreateRecipeCategory<CondensedBlockCut
return result;
}
@Override
public boolean isSpecial() {
return true;
}
public static List<CondensedBlockCuttingRecipe> condenseRecipes(List<Recipe<?>> stoneCuttingRecipes) {
List<CondensedBlockCuttingRecipe> condensed = new ArrayList<>();
Recipes: for (Recipe<?> recipe : stoneCuttingRecipes) {
@ -120,11 +125,6 @@ public class BlockCuttingCategory extends CreateRecipeCategory<CondensedBlockCut
}
return condensed;
}
@Override
public boolean isSpecial() {
return true;
}
}

View file

@ -1,9 +1,9 @@
package com.simibubi.create.compat.jei.category;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.function.Consumer;
import com.google.common.collect.ImmutableList;
import com.mojang.blaze3d.vertex.PoseStack;
@ -41,53 +41,47 @@ public class ItemDrainCategory extends CreateRecipeCategory<EmptyingRecipe> {
drain = new AnimatedItemDrain();
}
public static List<EmptyingRecipe> getRecipes(IIngredientManager ingredientManager) {
List<EmptyingRecipe> recipes = new ArrayList<>();
public static void consumeRecipes(Consumer<EmptyingRecipe> consumer, IIngredientManager ingredientManager) {
for (ItemStack stack : ingredientManager.getAllIngredients(VanillaTypes.ITEM)) {
if (stack.getItem() instanceof PotionItem) {
FluidStack fluidFromPotionItem = PotionFluidHandler.getFluidFromPotionItem(stack);
Ingredient potion = Ingredient.of(stack);
consumer.accept(new ProcessingRecipeBuilder<>(EmptyingRecipe::new, Create.asResource("potions"))
.withItemIngredients(potion)
.withFluidOutputs(fluidFromPotionItem)
.withSingleItemOutput(new ItemStack(Items.GLASS_BOTTLE))
.build());
continue;
}
ingredientManager.getAllIngredients(VanillaTypes.ITEM)
.stream()
.forEach(stack -> {
if (stack.getItem() instanceof PotionItem) {
FluidStack fluidFromPotionItem = PotionFluidHandler.getFluidFromPotionItem(stack);
Ingredient potion = Ingredient.of(stack);
recipes.add(new ProcessingRecipeBuilder<>(EmptyingRecipe::new, Create.asResource("potions"))
.withItemIngredients(potion)
.withFluidOutputs(fluidFromPotionItem)
.withSingleItemOutput(new ItemStack(Items.GLASS_BOTTLE))
LazyOptional<IFluidHandlerItem> capability =
stack.getCapability(CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY);
if (!capability.isPresent())
continue;
ItemStack copy = stack.copy();
capability = copy.getCapability(CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY);
IFluidHandlerItem handler = capability.orElse(null);
FluidStack extracted = handler.drain(1000, FluidAction.EXECUTE);
ItemStack result = handler.getContainer();
if (extracted.isEmpty())
continue;
if (result.isEmpty())
continue;
Ingredient ingredient = Ingredient.of(stack);
ResourceLocation itemName = stack.getItem()
.getRegistryName();
ResourceLocation fluidName = extracted.getFluid()
.getRegistryName();
consumer.accept(new ProcessingRecipeBuilder<>(EmptyingRecipe::new,
Create.asResource("empty_" + itemName.getNamespace() + "_" + itemName.getPath() + "_of_"
+ fluidName.getNamespace() + "_" + fluidName.getPath())).withItemIngredients(ingredient)
.withFluidOutputs(extracted)
.withSingleItemOutput(result)
.build());
return;
}
LazyOptional<IFluidHandlerItem> capability =
stack.getCapability(CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY);
if (!capability.isPresent())
return;
ItemStack copy = stack.copy();
capability = copy.getCapability(CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY);
IFluidHandlerItem handler = capability.orElse(null);
FluidStack extracted = handler.drain(1000, FluidAction.EXECUTE);
ItemStack result = handler.getContainer();
if (extracted.isEmpty())
return;
if (result.isEmpty())
return;
Ingredient ingredient = Ingredient.of(stack);
ResourceLocation itemName = stack.getItem()
.getRegistryName();
ResourceLocation fluidName = extracted.getFluid()
.getRegistryName();
recipes.add(new ProcessingRecipeBuilder<>(EmptyingRecipe::new,
Create.asResource("empty_" + itemName.getNamespace() + "_" + itemName.getPath() + "_of_"
+ fluidName.getNamespace() + "_" + fluidName.getPath())).withItemIngredients(ingredient)
.withFluidOutputs(extracted)
.withSingleItemOutput(result)
.build());
});
return recipes;
}
}
@Override

View file

@ -27,7 +27,7 @@ import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.TooltipFlag;
import net.minecraft.world.item.crafting.CraftingRecipe;
import net.minecraft.world.item.crafting.Ingredient;
import net.minecraft.world.item.crafting.ShapedRecipe;
import net.minecraftforge.common.crafting.IShapedRecipe;
public class MechanicalCraftingCategory extends CreateRecipeCategory<CraftingRecipe> {
@ -86,11 +86,11 @@ public class MechanicalCraftingCategory extends CreateRecipeCategory<CraftingRec
}
private static int getWidth(CraftingRecipe recipe) {
return recipe instanceof ShapedRecipe ? ((ShapedRecipe) recipe).getWidth() : 1;
return recipe instanceof IShapedRecipe<?> ? ((IShapedRecipe<?>) recipe).getRecipeWidth() : 1;
}
private static int getHeight(CraftingRecipe recipe) {
return recipe instanceof ShapedRecipe ? ((ShapedRecipe) recipe).getHeight() : 1;
return recipe instanceof IShapedRecipe<?> ? ((IShapedRecipe<?>) recipe).getRecipeHeight() : 1;
}
@Override
@ -155,6 +155,7 @@ public class MechanicalCraftingCategory extends CreateRecipeCategory<CraftingRec
modelViewStack.pushPose();
modelViewStack.mulPoseMatrix(matrixStack.last()
.pose());
RenderSystem.applyModelViewMatrix();
RenderSystem.enableDepthTest();
Minecraft minecraft = Minecraft.getInstance();
Font font = getFontRenderer(minecraft, ingredient);
@ -163,6 +164,7 @@ public class MechanicalCraftingCategory extends CreateRecipeCategory<CraftingRec
itemRenderer.renderGuiItemDecorations(font, ingredient, xPosition, yPosition, null);
RenderSystem.disableBlend();
modelViewStack.popPose();
RenderSystem.applyModelViewMatrix();
}
matrixStack.popPose();

View file

@ -18,13 +18,13 @@ import mezz.jei.api.ingredients.IIngredients;
public class MysteriousItemConversionCategory extends CreateRecipeCategory<ConversionRecipe> {
public static List<ConversionRecipe> getRecipes() {
List<ConversionRecipe> recipes = new ArrayList<>();
recipes.add(ConversionRecipe.create(AllItems.EMPTY_BLAZE_BURNER.asStack(), AllBlocks.BLAZE_BURNER.asStack()));
recipes.add(ConversionRecipe.create(AllItems.CHROMATIC_COMPOUND.asStack(), AllItems.SHADOW_STEEL.asStack()));
recipes.add(ConversionRecipe.create(AllItems.CHROMATIC_COMPOUND.asStack(), AllItems.REFINED_RADIANCE.asStack()));
recipes.add(ConversionRecipe.create(AllBlocks.PECULIAR_BELL.asStack(), AllBlocks.HAUNTED_BELL.asStack()));
return recipes;
public static final List<ConversionRecipe> RECIPES = new ArrayList<>();
static {
RECIPES.add(ConversionRecipe.create(AllItems.EMPTY_BLAZE_BURNER.asStack(), AllBlocks.BLAZE_BURNER.asStack()));
RECIPES.add(ConversionRecipe.create(AllBlocks.PECULIAR_BELL.asStack(), AllBlocks.HAUNTED_BELL.asStack()));
RECIPES.add(ConversionRecipe.create(AllItems.CHROMATIC_COMPOUND.asStack(), AllItems.SHADOW_STEEL.asStack()));
RECIPES.add(ConversionRecipe.create(AllItems.CHROMATIC_COMPOUND.asStack(), AllItems.REFINED_RADIANCE.asStack()));
}
public MysteriousItemConversionCategory() {

View file

@ -1,9 +1,10 @@
package com.simibubi.create.compat.jei.category;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.function.Consumer;
import java.util.stream.Collectors;
import com.google.common.collect.ImmutableList;
@ -44,62 +45,55 @@ public class SpoutCategory extends CreateRecipeCategory<FillingRecipe> {
spout = new AnimatedSpout();
}
public static List<FillingRecipe> getRecipes(IIngredientManager ingredientManager) {
List<FillingRecipe> recipes = new ArrayList<>();
public static void consumeRecipes(Consumer<FillingRecipe> consumer, IIngredientManager ingredientManager) {
Collection<FluidStack> fluidStacks = ingredientManager.getAllIngredients(VanillaTypes.FLUID);
for (ItemStack stack : ingredientManager.getAllIngredients(VanillaTypes.ITEM)) {
if (stack.getItem() instanceof PotionItem) {
FluidStack fluidFromPotionItem = PotionFluidHandler.getFluidFromPotionItem(stack);
Ingredient bottle = Ingredient.of(Items.GLASS_BOTTLE);
consumer.accept(new ProcessingRecipeBuilder<>(FillingRecipe::new, Create.asResource("potions"))
.withItemIngredients(bottle)
.withFluidIngredients(FluidIngredient.fromFluidStack(fluidFromPotionItem))
.withSingleItemOutput(stack)
.build());
continue;
}
ingredientManager.getAllIngredients(VanillaTypes.ITEM)
.stream()
.forEach(stack -> {
if (stack.getItem() instanceof PotionItem) {
FluidStack fluidFromPotionItem = PotionFluidHandler.getFluidFromPotionItem(stack);
Ingredient bottle = Ingredient.of(Items.GLASS_BOTTLE);
recipes.add(new ProcessingRecipeBuilder<>(FillingRecipe::new, Create.asResource("potions"))
.withItemIngredients(bottle)
.withFluidIngredients(FluidIngredient.fromFluidStack(fluidFromPotionItem))
.withSingleItemOutput(stack)
.build());
return;
}
LazyOptional<IFluidHandlerItem> capability =
stack.getCapability(CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY);
if (!capability.isPresent())
continue;
LazyOptional<IFluidHandlerItem> capability =
stack.getCapability(CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY);
if (!capability.isPresent())
return;
for (FluidStack fluidStack : fluidStacks) {
ItemStack copy = stack.copy();
copy.getCapability(CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY)
.ifPresent(fhi -> {
if (!GenericItemFilling.isFluidHandlerValid(copy, fhi))
return;
FluidStack fluidCopy = fluidStack.copy();
fluidCopy.setAmount(1000);
fhi.fill(fluidCopy, FluidAction.EXECUTE);
ItemStack container = fhi.getContainer();
if (container.sameItem(copy))
return;
if (container.isEmpty())
return;
ingredientManager.getAllIngredients(VanillaTypes.FLUID)
.stream()
.forEach(fluidStack -> {
ItemStack copy = stack.copy();
copy.getCapability(CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY)
.ifPresent(fhi -> {
if (!GenericItemFilling.isFluidHandlerValid(copy, fhi))
return;
FluidStack fluidCopy = fluidStack.copy();
fluidCopy.setAmount(1000);
fhi.fill(fluidCopy, FluidAction.EXECUTE);
ItemStack container = fhi.getContainer();
if (container.sameItem(copy))
return;
if (container.isEmpty())
return;
Ingredient bucket = Ingredient.of(stack);
ResourceLocation itemName = stack.getItem()
.getRegistryName();
ResourceLocation fluidName = fluidCopy.getFluid()
.getRegistryName();
recipes.add(new ProcessingRecipeBuilder<>(FillingRecipe::new,
Create.asResource("fill_" + itemName.getNamespace() + "_" + itemName.getPath()
+ "_with_" + fluidName.getNamespace() + "_" + fluidName.getPath()))
.withItemIngredients(bucket)
.withFluidIngredients(FluidIngredient.fromFluidStack(fluidCopy))
.withSingleItemOutput(container)
.build());
});
Ingredient bucket = Ingredient.of(stack);
ResourceLocation itemName = stack.getItem()
.getRegistryName();
ResourceLocation fluidName = fluidCopy.getFluid()
.getRegistryName();
consumer.accept(new ProcessingRecipeBuilder<>(FillingRecipe::new,
Create.asResource("fill_" + itemName.getNamespace() + "_" + itemName.getPath()
+ "_with_" + fluidName.getNamespace() + "_" + fluidName.getPath()))
.withItemIngredients(bucket)
.withFluidIngredients(FluidIngredient.fromFluidStack(fluidCopy))
.withSingleItemOutput(container)
.build());
});
});
return recipes;
}
}
}
@Override

View file

@ -534,7 +534,7 @@ public class KineticTileEntity extends SmartTileEntity
.forEach(offset -> {
if (axis.choose(offset.getX(), offset.getY(), offset.getZ()) != 0)
return;
if (offset.distSqr(0, 0, 0, false) != BlockPos.ZERO.distSqr(1, 1, 0, false))
if (offset.distSqr(BlockPos.ZERO) != 2)
return;
neighbours.add(worldPosition.offset(offset));
});

View file

@ -14,84 +14,84 @@ import net.minecraft.world.level.block.state.BlockState;
public abstract class KineticTileInstance<T extends KineticTileEntity> extends BlockEntityInstance<T> {
protected final Direction.Axis axis;
protected final Direction.Axis axis;
public KineticTileInstance(MaterialManager modelManager, T tile) {
super(modelManager, tile);
public KineticTileInstance(MaterialManager modelManager, T tile) {
super(modelManager, tile);
axis = ((IRotate) blockState.getBlock()).getRotationAxis(blockState);
}
axis = ((IRotate) blockState.getBlock()).getRotationAxis(blockState);
}
protected final void updateRotation(RotatingData instance) {
updateRotation(instance, getRotationAxis(), getTileSpeed());
}
protected final void updateRotation(RotatingData instance) {
updateRotation(instance, getRotationAxis(), getTileSpeed());
}
protected final void updateRotation(RotatingData instance, Direction.Axis axis) {
updateRotation(instance, axis, getTileSpeed());
}
protected final void updateRotation(RotatingData instance, Direction.Axis axis) {
updateRotation(instance, axis, getTileSpeed());
}
protected final void updateRotation(RotatingData instance, float speed) {
updateRotation(instance, getRotationAxis(), speed);
}
protected final void updateRotation(RotatingData instance, float speed) {
updateRotation(instance, getRotationAxis(), speed);
}
protected final void updateRotation(RotatingData instance, Direction.Axis axis, float speed) {
instance.setRotationAxis(axis)
.setRotationOffset(getRotationOffset(axis))
.setRotationalSpeed(speed)
.setColor(blockEntity);
}
protected final void updateRotation(RotatingData instance, Direction.Axis axis, float speed) {
instance.setRotationAxis(axis)
.setRotationOffset(getRotationOffset(axis))
.setRotationalSpeed(speed)
.setColor(blockEntity);
}
protected final RotatingData setup(RotatingData key) {
return setup(key, getRotationAxis(), getTileSpeed());
}
protected final RotatingData setup(RotatingData key) {
return setup(key, getRotationAxis(), getTileSpeed());
}
protected final RotatingData setup(RotatingData key, Direction.Axis axis) {
return setup(key, axis, getTileSpeed());
}
protected final RotatingData setup(RotatingData key, Direction.Axis axis) {
return setup(key, axis, getTileSpeed());
}
protected final RotatingData setup(RotatingData key, float speed) {
return setup(key, getRotationAxis(), speed);
}
protected final RotatingData setup(RotatingData key, float speed) {
return setup(key, getRotationAxis(), speed);
}
protected final RotatingData setup(RotatingData key, Direction.Axis axis, float speed) {
key.setRotationAxis(axis)
.setRotationalSpeed(speed)
.setRotationOffset(getRotationOffset(axis))
.setColor(blockEntity)
.setPosition(getInstancePosition());
protected final RotatingData setup(RotatingData key, Direction.Axis axis, float speed) {
key.setRotationAxis(axis)
.setRotationalSpeed(speed)
.setRotationOffset(getRotationOffset(axis))
.setColor(blockEntity)
.setPosition(getInstancePosition());
return key;
}
return key;
}
protected float getRotationOffset(final Direction.Axis axis) {
float offset = ICogWheel.isLargeCog(blockState) ? 11.25f : 0;
double d = (((axis == Direction.Axis.X) ? 0 : pos.getX()) + ((axis == Direction.Axis.Y) ? 0 : pos.getY())
+ ((axis == Direction.Axis.Z) ? 0 : pos.getZ())) % 2;
if (d == 0) {
offset = 22.5f;
}
return offset + blockEntity.getRotationAngleOffset(axis);
}
protected float getRotationOffset(final Direction.Axis axis) {
float offset = ICogWheel.isLargeCog(blockState) ? 11.25f : 0;
double d = (((axis == Direction.Axis.X) ? 0 : pos.getX()) + ((axis == Direction.Axis.Y) ? 0 : pos.getY())
+ ((axis == Direction.Axis.Z) ? 0 : pos.getZ())) % 2;
if (d == 0) {
offset = 22.5f;
}
return offset;
}
protected Direction.Axis getRotationAxis() {
return axis;
}
protected Direction.Axis getRotationAxis() {
return axis;
}
protected float getTileSpeed() {
return blockEntity.getSpeed();
}
protected float getTileSpeed() {
return blockEntity.getSpeed();
}
protected BlockState shaft() {
return shaft(getRotationAxis());
}
protected BlockState shaft() {
return shaft(getRotationAxis());
}
protected Material<RotatingData> getRotatingMaterial() {
protected Material<RotatingData> getRotatingMaterial() {
return materialManager.defaultSolid()
.material(AllMaterialSpecs.ROTATING);
}
public static BlockState shaft(Direction.Axis axis) {
return AllBlocks.SHAFT.getDefaultState()
.setValue(ShaftBlock.AXIS, axis);
}
public static BlockState shaft(Direction.Axis axis) {
return AllBlocks.SHAFT.getDefaultState()
.setValue(ShaftBlock.AXIS, axis);
}
}

View file

@ -10,35 +10,35 @@ public class SingleRotatingInstance extends KineticTileInstance<KineticTileEntit
protected RotatingData rotatingModel;
public SingleRotatingInstance(MaterialManager modelManager, KineticTileEntity tile) {
public SingleRotatingInstance(MaterialManager modelManager, KineticTileEntity tile) {
super(modelManager, tile);
}
@Override
public void init() {
rotatingModel = setup(getModel().createInstance());
}
@Override
public void init() {
rotatingModel = setup(getModel().createInstance());
}
@Override
public void update() {
updateRotation(rotatingModel);
}
@Override
public void update() {
updateRotation(rotatingModel);
}
@Override
public void updateLight() {
relight(pos, rotatingModel);
}
@Override
public void updateLight() {
relight(pos, rotatingModel);
}
@Override
public void remove() {
rotatingModel.delete();
}
@Override
public void remove() {
rotatingModel.delete();
}
protected BlockState getRenderedBlockState() {
return blockState;
}
protected BlockState getRenderedBlockState() {
return blockState;
}
protected Instancer<RotatingData> getModel() {
return getRotatingMaterial().getModel(getRenderedBlockState());
}
protected Instancer<RotatingData> getModel() {
return getRotatingMaterial().getModel(getRenderedBlockState());
}
}

View file

@ -11,7 +11,7 @@ import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.phys.Vec3;
public class BellMovementBehaviour extends MovementBehaviour {
public class BellMovementBehaviour implements MovementBehaviour {
@Override
public boolean renderAsNormalTileEntity() {

View file

@ -21,7 +21,7 @@ import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.AABB;
import net.minecraft.world.phys.Vec3;
public class BlockBreakingMovementBehaviour extends MovementBehaviour {
public class BlockBreakingMovementBehaviour implements MovementBehaviour {
@Override
public void startMoving(MovementContext context) {

View file

@ -8,7 +8,7 @@ import com.simibubi.create.content.contraptions.components.structureMovement.Mov
import net.minecraft.core.particles.ParticleTypes;
import net.minecraft.world.level.block.CampfireBlock;
public class CampfireMovementBehaviour extends MovementBehaviour {
public class CampfireMovementBehaviour implements MovementBehaviour {
@Override
public boolean renderAsNormalTileEntity() {
return true;

View file

@ -35,7 +35,7 @@ import net.minecraft.world.level.block.state.properties.Property;
import net.minecraft.world.phys.Vec3;
import net.minecraftforge.common.IPlantable;
public class HarvesterMovementBehaviour extends MovementBehaviour {
public class HarvesterMovementBehaviour implements MovementBehaviour {
@Override
public boolean isActive(MovementContext context) {

View file

@ -27,7 +27,7 @@ import net.minecraft.world.phys.Vec3;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
public class PortableStorageInterfaceMovement extends MovementBehaviour {
public class PortableStorageInterfaceMovement implements MovementBehaviour {
static final String _workingPos_ = "WorkingPos";
static final String _clientPrevPos_ = "ClientPrevPos";

View file

@ -15,11 +15,11 @@ import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.block.state.properties.SlabType;
import net.minecraft.world.phys.Vec3;
public class SeatMovementBehaviour extends MovementBehaviour {
public class SeatMovementBehaviour implements MovementBehaviour {
@Override
public void startMoving(MovementContext context) {
super.startMoving(context);
MovementBehaviour.super.startMoving(context);
int indexOf = context.contraption.getSeats()
.indexOf(context.localPos);
context.data.putInt("SeatIndex", indexOf);
@ -27,8 +27,8 @@ public class SeatMovementBehaviour extends MovementBehaviour {
@Override
public void visitNewPosition(MovementContext context, BlockPos pos) {
super.visitNewPosition(context, pos);
MovementBehaviour.super.visitNewPosition(context, pos);
AbstractContraptionEntity contraptionEntity = context.contraption.entity;
if (contraptionEntity == null)
return;

View file

@ -2,11 +2,9 @@ package com.simibubi.create.content.contraptions.components.actors.dispenser;
import java.util.HashMap;
import javax.annotation.ParametersAreNonnullByDefault;
import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext;
import com.simibubi.create.foundation.mixin.accessor.DispenserBlockAccessor;
import net.minecraft.MethodsReturnNonnullByDefault;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.core.dispenser.AbstractProjectileDispenseBehavior;
@ -16,54 +14,57 @@ import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.DispenserBlock;
import net.minecraft.world.level.block.state.BlockBehaviour;
import net.minecraft.world.phys.Vec3;
public class DispenserMovementBehaviour extends DropperMovementBehaviour {
private static final HashMap<Item, IMovedDispenseItemBehaviour> MOVED_DISPENSE_ITEM_BEHAVIOURS = new HashMap<>();
private static final HashMap<Item, IMovedDispenseItemBehaviour> MOVED_PROJECTILE_DISPENSE_BEHAVIOURS = new HashMap<>();
private static final DispenserLookup BEHAVIOUR_LOOKUP = new DispenserLookup();
private static boolean spawneggsRegistered = false;
private static boolean spawnEggsRegistered = false;
public static void gatherMovedDispenseItemBehaviours() {
IMovedDispenseItemBehaviour.init();
}
public static void registerMovedDispenseItemBehaviour(Item item, IMovedDispenseItemBehaviour movedDispenseItemBehaviour) {
public static void registerMovedDispenseItemBehaviour(Item item,
IMovedDispenseItemBehaviour movedDispenseItemBehaviour) {
MOVED_DISPENSE_ITEM_BEHAVIOURS.put(item, movedDispenseItemBehaviour);
}
public static DispenseItemBehavior getDispenseMethod(ItemStack itemstack) {
return ((DispenserBlockAccessor) Blocks.DISPENSER).create$callGetDispenseMethod(itemstack);
}
@Override
protected void activate(MovementContext context, BlockPos pos) {
if (!spawneggsRegistered) {
spawneggsRegistered = true;
IMovedDispenseItemBehaviour.initSpawneggs();
if (!spawnEggsRegistered) {
spawnEggsRegistered = true;
IMovedDispenseItemBehaviour.initSpawnEggs();
}
DispenseItemLocation location = getDispenseLocation(context);
if (location.isEmpty()) {
context.world.levelEvent(1001, pos, 0);
} else {
ItemStack itemstack = getItemStackAt(location, context);
ItemStack itemStack = getItemStackAt(location, context);
// Special dispense item behaviour for moving contraptions
if (MOVED_DISPENSE_ITEM_BEHAVIOURS.containsKey(itemstack.getItem())) {
setItemStackAt(location, MOVED_DISPENSE_ITEM_BEHAVIOURS.get(itemstack.getItem()).dispense(itemstack, context, pos), context);
if (MOVED_DISPENSE_ITEM_BEHAVIOURS.containsKey(itemStack.getItem())) {
setItemStackAt(location, MOVED_DISPENSE_ITEM_BEHAVIOURS.get(itemStack.getItem()).dispense(itemStack, context, pos), context);
return;
}
ItemStack backup = itemstack.copy();
ItemStack backup = itemStack.copy();
// If none is there, try vanilla registry
try {
if (MOVED_PROJECTILE_DISPENSE_BEHAVIOURS.containsKey(itemstack.getItem())) {
setItemStackAt(location, MOVED_PROJECTILE_DISPENSE_BEHAVIOURS.get(itemstack.getItem()).dispense(itemstack, context, pos), context);
if (MOVED_PROJECTILE_DISPENSE_BEHAVIOURS.containsKey(itemStack.getItem())) {
setItemStackAt(location, MOVED_PROJECTILE_DISPENSE_BEHAVIOURS.get(itemStack.getItem()).dispense(itemStack, context, pos), context);
return;
}
DispenseItemBehavior idispenseitembehavior = BEHAVIOUR_LOOKUP.getDispenseMethod(itemstack);
if (idispenseitembehavior instanceof AbstractProjectileDispenseBehavior) { // Projectile behaviours can be converted most of the time
IMovedDispenseItemBehaviour iMovedDispenseItemBehaviour = MovedProjectileDispenserBehaviour.of((AbstractProjectileDispenseBehavior) idispenseitembehavior);
setItemStackAt(location, iMovedDispenseItemBehaviour.dispense(itemstack, context, pos), context);
MOVED_PROJECTILE_DISPENSE_BEHAVIOURS.put(itemstack.getItem(), iMovedDispenseItemBehaviour); // buffer conversion if successful
DispenseItemBehavior behavior = getDispenseMethod(itemStack);
if (behavior instanceof AbstractProjectileDispenseBehavior) { // Projectile behaviours can be converted most of the time
IMovedDispenseItemBehaviour movedBehaviour = MovedProjectileDispenserBehaviour.of((AbstractProjectileDispenseBehavior) behavior);
setItemStackAt(location, movedBehaviour.dispense(itemStack, context, pos), context);
MOVED_PROJECTILE_DISPENSE_BEHAVIOURS.put(itemStack.getItem(), movedBehaviour); // buffer conversion if successful
return;
}
@ -73,27 +74,16 @@ public class DispenserMovementBehaviour extends DropperMovementBehaviour {
Direction clostestFacing = Direction.getNearest(facingVec.x, facingVec.y, facingVec.z);
ContraptionBlockSource blockSource = new ContraptionBlockSource(context, pos, clostestFacing);
if (idispenseitembehavior.getClass() != DefaultDispenseItemBehavior.class) { // There is a dispense item behaviour registered for the vanilla dispenser
setItemStackAt(location, idispenseitembehavior.dispense(blockSource, itemstack), context);
if (behavior.getClass() != DefaultDispenseItemBehavior.class) { // There is a dispense item behaviour registered for the vanilla dispenser
setItemStackAt(location, behavior.dispense(blockSource, itemStack), context);
return;
}
} catch (NullPointerException ignored) {
itemstack = backup; // Something went wrong with the TE being null in ContraptionBlockSource, reset the stack
itemStack = backup; // Something went wrong with the TE being null in ContraptionBlockSource, reset the stack
}
setItemStackAt(location, defaultBehaviour.dispense(itemstack, context, pos), context); // the default: launch the item
setItemStackAt(location, DEFAULT_BEHAVIOUR.dispense(itemStack, context, pos), context); // the default: launch the item
}
}
@ParametersAreNonnullByDefault
@MethodsReturnNonnullByDefault
private static class DispenserLookup extends DispenserBlock {
protected DispenserLookup() {
super(BlockBehaviour.Properties.copy(Blocks.DISPENSER));
}
public DispenseItemBehavior getDispenseMethod(ItemStack itemStack) {
return super.getDispenseMethod(itemStack);
}
}
}

View file

@ -14,8 +14,8 @@ import net.minecraft.world.ContainerHelper;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items;
public class DropperMovementBehaviour extends MovementBehaviour {
protected static final MovedDefaultDispenseItemBehaviour defaultBehaviour = new MovedDefaultDispenseItemBehaviour();
public class DropperMovementBehaviour implements MovementBehaviour {
protected static final MovedDefaultDispenseItemBehaviour DEFAULT_BEHAVIOUR = new MovedDefaultDispenseItemBehaviour();
private static final Random RNG = new Random();
protected void activate(MovementContext context, BlockPos pos) {
@ -23,7 +23,7 @@ public class DropperMovementBehaviour extends MovementBehaviour {
if (location.isEmpty()) {
context.world.levelEvent(1001, pos, 0);
} else {
setItemStackAt(location, defaultBehaviour.dispense(getItemStackAt(location, context), context, pos), context);
setItemStackAt(location, DEFAULT_BEHAVIOUR.dispense(getItemStackAt(location, context), context, pos), context);
}
}
@ -81,7 +81,7 @@ public class DropperMovementBehaviour extends MovementBehaviour {
@Override
public void stopMoving(MovementContext context) {
super.stopMoving(context);
MovementBehaviour.super.stopMoving(context);
writeExtraData(context);
}

View file

@ -35,7 +35,7 @@ import net.minecraft.world.phys.Vec3;
public interface IMovedDispenseItemBehaviour {
static void initSpawneggs() {
static void initSpawnEggs() {
final IMovedDispenseItemBehaviour spawnEggDispenseBehaviour = new MovedDefaultDispenseItemBehaviour() {
@Override
protected ItemStack dispenseStack(ItemStack itemStack, MovementContext context, BlockPos pos, Vec3 facing) {

View file

@ -15,7 +15,7 @@ import net.minecraft.world.phys.Vec3;
import net.minecraftforge.items.ItemHandlerHelper;
public class MovedDefaultDispenseItemBehaviour implements IMovedDispenseItemBehaviour {
private static final MovedDefaultDispenseItemBehaviour defaultInstance = new MovedDefaultDispenseItemBehaviour();
private static final MovedDefaultDispenseItemBehaviour DEFAULT_INSTANCE = new MovedDefaultDispenseItemBehaviour();
public static void doDispense(Level p_82486_0_, ItemStack p_82486_1_, int p_82486_2_, Vec3 facing, BlockPos p_82486_4_, MovementContext context) {
double d0 = p_82486_4_.getX() + facing.x + .5;
@ -87,7 +87,7 @@ public class MovedDefaultDispenseItemBehaviour implements IMovedDispenseItemBeha
consumedFrom.shrink(1);
ItemStack remainder = ItemHandlerHelper.insertItem(context.contraption.inventory, output.copy(), false);
if (!remainder.isEmpty())
defaultInstance.dispenseStack(output, context, pos, facing);
DEFAULT_INSTANCE.dispenseStack(output, context, pos, facing);
return consumedFrom;
}
}

View file

@ -1,20 +1,17 @@
package com.simibubi.create.content.contraptions.components.actors.dispenser;
import java.lang.reflect.Method;
import javax.annotation.Nullable;
import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext;
import com.simibubi.create.foundation.mixin.accessor.AbstractProjectileDispenseBehaviorAccessor;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Position;
import net.minecraft.core.dispenser.AbstractProjectileDispenseBehavior;
import net.minecraft.world.entity.projectile.Projectile;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.LevelAccessor;
import net.minecraft.world.phys.Vec3;
import net.minecraftforge.fml.util.ObfuscationReflectionHelper;
public abstract class MovedProjectileDispenserBehaviour extends MovedDefaultDispenseItemBehaviour {
@ -50,51 +47,22 @@ public abstract class MovedProjectileDispenserBehaviour extends MovedDefaultDisp
}
public static MovedProjectileDispenserBehaviour of(AbstractProjectileDispenseBehavior vanillaBehaviour) {
AbstractProjectileDispenseBehaviorAccessor accessor = (AbstractProjectileDispenseBehaviorAccessor) vanillaBehaviour;
return new MovedProjectileDispenserBehaviour() {
@Override
protected Projectile getProjectileEntity(Level world, double x, double y, double z, ItemStack itemStack) {
try {
return (Projectile) MovedProjectileDispenserBehaviour.getProjectileEntityLookup().invoke(vanillaBehaviour, world, new SimplePos(x, y, z) , itemStack);
} catch (Throwable ignored) {
}
return null;
return accessor.create$callGetProjectile(world, new SimplePos(x, y, z), itemStack);
}
@Override
protected float getProjectileInaccuracy() {
try {
return (float) MovedProjectileDispenserBehaviour.getProjectileInaccuracyLookup().invoke(vanillaBehaviour);
} catch (Throwable ignored) {
}
return super.getProjectileInaccuracy();
return accessor.create$callGetUncertainty();
}
@Override
protected float getProjectileVelocity() {
try {
return (float) MovedProjectileDispenserBehaviour.getProjectileVelocityLookup().invoke(vanillaBehaviour);
} catch (Throwable ignored) {
}
return super.getProjectileVelocity();
return accessor.create$callGetPower();
}
};
}
private static Method getProjectileEntityLookup() {
Method getProjectileEntity = ObfuscationReflectionHelper.findMethod(AbstractProjectileDispenseBehavior.class, "m_6895_", Level.class, Position.class, ItemStack.class); // getProjectile
getProjectileEntity.setAccessible(true);
return getProjectileEntity;
}
private static Method getProjectileInaccuracyLookup() {
Method getProjectileInaccuracy = ObfuscationReflectionHelper.findMethod(AbstractProjectileDispenseBehavior.class, "m_7101_"); // getUncertainty
getProjectileInaccuracy.setAccessible(true);
return getProjectileInaccuracy;
}
private static Method getProjectileVelocityLookup() {
Method getProjectileVelocity = ObfuscationReflectionHelper.findMethod(AbstractProjectileDispenseBehavior.class, "m_7104_"); // getPower
getProjectileVelocity.setAccessible(true);
return getProjectileVelocity;
}
}

View file

@ -166,7 +166,7 @@ public class RecipeGridHandler {
if (numItems > 9)
return false;
}
if (AllRecipeTypes.isManualRecipe(recipe))
if (AllRecipeTypes.shouldIgnoreInAutomation(recipe))
return false;
return true;
}

View file

@ -87,8 +87,8 @@ public class CrushingWheelControllerBlock extends DirectionalBlock implements IT
return;
if (te.crushingspeed == 0)
return;
if (entityIn instanceof ItemEntity)
((ItemEntity) entityIn).setPickUpDelay(10);
// if (entityIn instanceof ItemEntity)
// ((ItemEntity) entityIn).setPickUpDelay(10);
CompoundTag data = entityIn.getPersistentData();
if (data.contains("BypassCrushingWheel")) {
if (pos.equals(NbtUtils.readBlockPos(data.getCompound("BypassCrushingWheel"))))

View file

@ -144,8 +144,7 @@ public class CrushingWheelControllerTileEntity extends SmartTileEntity {
inventory.remainingTime = 0;
// Output Items
if (facing.getAxis()
.isHorizontal() || facing == Direction.DOWN) {
if (facing != Direction.UP) {
BlockPos nextPos = worldPosition.offset(facing.getAxis() == Axis.X ? 1f * offset : 0f, (-1f),
facing.getAxis() == Axis.Z ? 1f * offset : 0f);
DirectBeltInputBehaviour behaviour =

View file

@ -3,7 +3,6 @@ package com.simibubi.create.content.contraptions.components.deployer;
import java.util.List;
import java.util.Set;
import java.util.function.Supplier;
import java.util.stream.Collectors;
import com.google.gson.JsonObject;
import com.simibubi.create.AllBlocks;
@ -74,17 +73,15 @@ public class DeployerApplicationRecipe extends ProcessingRecipe<RecipeWrapper> i
return ingredients.get(0);
}
public static List<DeployerApplicationRecipe> convert(List<Recipe<?>> sandpaperRecipes) {
return sandpaperRecipes.stream()
.map(r -> new ProcessingRecipeBuilder<>(DeployerApplicationRecipe::new, new ResourceLocation(r.getId()
.getNamespace(),
r.getId()
.getPath() + "_using_deployer")).require(r.getIngredients()
public static DeployerApplicationRecipe convert(Recipe<?> sandpaperRecipe) {
return new ProcessingRecipeBuilder<>(DeployerApplicationRecipe::new,
new ResourceLocation(sandpaperRecipe.getId().getNamespace(),
sandpaperRecipe.getId().getPath() + "_using_deployer"))
.require(sandpaperRecipe.getIngredients()
.get(0))
.require(AllItemTags.SANDPAPER.tag)
.output(r.getResultItem())
.build())
.collect(Collectors.toList());
.require(AllItemTags.SANDPAPER.tag)
.output(sandpaperRecipe.getResultItem())
.build();
}
@Override

View file

@ -1,7 +1,5 @@
package com.simibubi.create.content.contraptions.components.deployer;
import java.util.Iterator;
import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour;
import net.minecraft.world.InteractionHand;
@ -21,12 +19,12 @@ public class DeployerItemHandler implements IItemHandlerModifiable {
@Override
public int getSlots() {
return 1;
return 1 + te.overflowItems.size();
}
@Override
public ItemStack getStackInSlot(int slot) {
return getHeld();
return slot >= te.overflowItems.size() ? getHeld() : te.overflowItems.get(slot);
}
public ItemStack getHeld() {
@ -47,14 +45,18 @@ public class DeployerItemHandler implements IItemHandlerModifiable {
@Override
public ItemStack insertItem(int slot, ItemStack stack, boolean simulate) {
ItemStack held = getHeld();
if (slot < te.overflowItems.size())
return stack;
if (!isItemValid(slot, stack))
return stack;
ItemStack held = getHeld();
if (held.isEmpty()) {
if (!simulate)
set(stack);
return ItemStack.EMPTY;
}
if (!ItemHandlerHelper.canItemStacksStack(held, stack))
return stack;
@ -78,36 +80,18 @@ public class DeployerItemHandler implements IItemHandlerModifiable {
if (amount == 0)
return ItemStack.EMPTY;
ItemStack extractedFromOverflow = ItemStack.EMPTY;
ItemStack returnToOverflow = ItemStack.EMPTY;
for (Iterator<ItemStack> iterator = te.overflowItems.iterator(); iterator.hasNext();) {
ItemStack existing = iterator.next();
if (existing.isEmpty()) {
iterator.remove();
continue;
}
int toExtract = Math.min(amount, existing.getMaxStackSize());
if (existing.getCount() <= toExtract) {
if (!simulate)
iterator.remove();
extractedFromOverflow = existing;
break;
}
if (!simulate) {
iterator.remove();
returnToOverflow = ItemHandlerHelper.copyStackWithSize(existing, existing.getCount() - toExtract);
}
extractedFromOverflow = ItemHandlerHelper.copyStackWithSize(existing, toExtract);
break;
if (slot < te.overflowItems.size()) {
ItemStack itemStack = te.overflowItems.get(slot);
int toExtract = Math.min(amount, itemStack.getCount());
ItemStack extracted = simulate ? itemStack.copy() : itemStack.split(toExtract);
extracted.setCount(toExtract);
if (!simulate && itemStack.isEmpty())
te.overflowItems.remove(slot);
if (!simulate && !extracted.isEmpty())
te.setChanged();
return extracted;
}
if (!returnToOverflow.isEmpty())
te.overflowItems.add(returnToOverflow);
if (!extractedFromOverflow.isEmpty())
return extractedFromOverflow;
ItemStack held = getHeld();
if (amount == 0 || held.isEmpty())
return ItemStack.EMPTY;
@ -126,7 +110,7 @@ public class DeployerItemHandler implements IItemHandlerModifiable {
@Override
public int getSlotLimit(int slot) {
return Math.min(getHeld().getMaxStackSize(), 64);
return Math.min(getStackInSlot(slot).getMaxStackSize(), 64);
}
@Override
@ -137,6 +121,10 @@ public class DeployerItemHandler implements IItemHandlerModifiable {
@Override
public void setStackInSlot(int slot, ItemStack stack) {
if (slot < te.overflowItems.size()) {
te.overflowItems.set(slot, stack);
return;
}
set(stack);
}

View file

@ -47,7 +47,7 @@ import net.minecraftforge.common.util.BlockSnapshot;
import net.minecraftforge.event.ForgeEventFactory;
import net.minecraftforge.items.IItemHandler;
public class DeployerMovementBehaviour extends MovementBehaviour {
public class DeployerMovementBehaviour implements MovementBehaviour {
@Override
public Vec3 getActiveAreaOffset(MovementContext context) {

View file

@ -96,7 +96,7 @@ public class EncasedFanTileEntity extends GeneratingKineticTileEntity implements
return false;
BlockState checkState = level.getBlockState(worldPosition.below());
if (!checkState.is(AllBlockTags.FAN_HEATERS.tag))
if (!AllBlockTags.FAN_HEATERS.matches(checkState))
return false;
if (checkState.hasProperty(BlazeBurnerBlock.HEAT_LEVEL) && !checkState.getValue(BlazeBurnerBlock.HEAT_LEVEL)

View file

@ -7,7 +7,7 @@ import com.simibubi.create.AllRecipeTypes;
import com.simibubi.create.AllSoundEvents;
import com.simibubi.create.content.contraptions.components.press.MechanicalPressTileEntity;
import com.simibubi.create.content.contraptions.fluids.FluidFX;
import com.simibubi.create.content.contraptions.fluids.recipe.PotionMixingRecipeManager;
import com.simibubi.create.content.contraptions.fluids.recipe.PotionMixingRecipes;
import com.simibubi.create.content.contraptions.processing.BasinOperatingTileEntity;
import com.simibubi.create.content.contraptions.processing.BasinTileEntity;
import com.simibubi.create.content.contraptions.processing.ProcessingRecipe;
@ -32,14 +32,15 @@ import net.minecraft.sounds.SoundSource;
import net.minecraft.util.Mth;
import net.minecraft.world.Container;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.crafting.CraftingRecipe;
import net.minecraft.world.item.crafting.Recipe;
import net.minecraft.world.item.crafting.RecipeSerializer;
import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.AABB;
import net.minecraft.world.phys.Vec3;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
import net.minecraftforge.common.crafting.IShapedRecipe;
import net.minecraftforge.items.CapabilityItemHandler;
import net.minecraftforge.items.IItemHandler;
@ -224,7 +225,7 @@ public class MechanicalMixerTileEntity extends BasinOperatingTileEntity {
if (stack.isEmpty())
continue;
List<MixingRecipe> list = PotionMixingRecipeManager.ALL.get(stack.getItem());
List<MixingRecipe> list = PotionMixingRecipes.BY_ITEM.get(stack.getItem());
if (list == null)
continue;
for (MixingRecipe mixingRecipe : list)
@ -237,10 +238,10 @@ public class MechanicalMixerTileEntity extends BasinOperatingTileEntity {
@Override
protected <C extends Container> boolean matchStaticFilters(Recipe<C> r) {
return ((r.getSerializer() == RecipeSerializer.SHAPELESS_RECIPE
&& AllConfigs.SERVER.recipes.allowShapelessInMixer.get() && r.getIngredients()
return ((r instanceof CraftingRecipe && !(r instanceof IShapedRecipe<?>)
&& AllConfigs.SERVER.recipes.allowShapelessInMixer.get() && r.getIngredients()
.size() > 1
&& !MechanicalPressTileEntity.canCompress(r)) && !AllRecipeTypes.isManualRecipe(r)
&& !MechanicalPressTileEntity.canCompress(r)) && !AllRecipeTypes.shouldIgnoreInAutomation(r)
|| r.getType() == AllRecipeTypes.MIXING.getType());
}
@ -289,9 +290,9 @@ public class MechanicalMixerTileEntity extends BasinOperatingTileEntity {
// SoundEvents.BLOCK_STONE_BREAK
boolean slow = Math.abs(getSpeed()) < 65;
if (slow && AnimationTickHolder.getTicks() % 2 == 0)
if (slow && AnimationTickHolder.getTicks() % 2 == 0)
return;
if (runningTicks == 20)
if (runningTicks == 20)
AllSoundEvents.MIXING.playAt(level, worldPosition, .75f, 1, true);
}

View file

@ -4,7 +4,6 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import com.google.common.collect.ImmutableList;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.AllRecipeTypes;
import com.simibubi.create.AllSoundEvents;
@ -31,7 +30,6 @@ import net.minecraft.core.particles.ItemParticleOption;
import net.minecraft.core.particles.ParticleTypes;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.Tag;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.util.Mth;
import net.minecraft.world.Container;
import net.minecraft.world.entity.Entity;
@ -40,7 +38,6 @@ import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.crafting.CraftingRecipe;
import net.minecraft.world.item.crafting.Ingredient;
import net.minecraft.world.item.crafting.Recipe;
import net.minecraft.world.item.crafting.RecipeSerializer;
import net.minecraft.world.level.block.SoundType;
import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.state.BlockState;
@ -344,28 +341,17 @@ public class MechanicalPressTileEntity extends BasinOperatingTileEntity {
return AllRecipeTypes.PRESSING.find(pressingInv, level);
}
private static final List<ResourceLocation> RECIPE_DENY_LIST =
ImmutableList.of(new ResourceLocation("occultism", "spirit_trade"), new ResourceLocation("occultism", "ritual"));
public static <C extends Container> boolean canCompress(Recipe<C> recipe) {
NonNullList<Ingredient> ingredients = recipe.getIngredients();
if (!(recipe instanceof CraftingRecipe))
if (!(recipe instanceof CraftingRecipe) || !AllConfigs.SERVER.recipes.allowShapedSquareInPress.get())
return false;
RecipeSerializer<?> serializer = recipe.getSerializer();
for (ResourceLocation denied : RECIPE_DENY_LIST)
if (serializer != null && denied.equals(serializer.getRegistryName()))
return false;
return AllConfigs.SERVER.recipes.allowShapedSquareInPress.get()
&& (ingredients.size() == 4 || ingredients.size() == 9) && ItemHelper.condenseIngredients(ingredients)
.size() == 1;
NonNullList<Ingredient> ingredients = recipe.getIngredients();
return (ingredients.size() == 4 || ingredients.size() == 9) && ItemHelper.matchAllIngredients(ingredients);
}
@Override
protected <C extends Container> boolean matchStaticFilters(Recipe<C> recipe) {
return (recipe instanceof CraftingRecipe && !(recipe instanceof MechanicalCraftingRecipe)
&& canCompress(recipe) && !AllRecipeTypes.isManualRecipe(recipe))
&& canCompress(recipe) && !AllRecipeTypes.shouldIgnoreInAutomation(recipe))
|| recipe.getType() == AllRecipeTypes.COMPACTING.getType();
}

View file

@ -365,7 +365,7 @@ public class SawTileEntity extends BlockBreakingKineticTileEntity {
return startedSearch.stream()
.filter(RecipeConditions.outputMatchesFilter(filtering))
.filter(RecipeConditions.firstIngredientMatches(inventory.getStackInSlot(0)))
.filter(r -> !AllRecipeTypes.isManualRecipe(r))
.filter(r -> !AllRecipeTypes.shouldIgnoreInAutomation(r))
.collect(Collectors.toList());
}

View file

@ -60,7 +60,6 @@ import net.minecraft.world.phys.Vec3;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
import net.minecraftforge.entity.IEntityAdditionalSpawnData;
import net.minecraftforge.fml.util.ObfuscationReflectionHelper;
import net.minecraftforge.network.NetworkHooks;
import net.minecraftforge.network.PacketDistributor;
@ -76,7 +75,7 @@ public abstract class AbstractContraptionEntity extends Entity implements IEntit
protected Contraption contraption;
protected boolean initialized;
protected boolean prevPosInvalid;
private boolean ticking;
private boolean skipActorStop;
public AbstractContraptionEntity(EntityType<?> entityTypeIn, Level worldIn) {
super(entityTypeIn, worldIn);
@ -302,7 +301,7 @@ public abstract class AbstractContraptionEntity extends Entity implements IEntit
if (!level.isClientSide)
contraption.stalled = false;
ticking = true;
skipActorStop = true;
for (MutablePair<StructureBlockInfo, MovementContext> pair : contraption.getActors()) {
MovementContext context = pair.right;
StructureBlockInfo blockInfo = pair.left;
@ -339,7 +338,7 @@ public abstract class AbstractContraptionEntity extends Entity implements IEntit
contraption.stop(level);
return;
}
ticking = false;
skipActorStop = false;
for (Entity entity : getPassengers()) {
if (!(entity instanceof OrientedContraptionEntity))
@ -497,6 +496,8 @@ public abstract class AbstractContraptionEntity extends Entity implements IEntit
return;
StructureTransform transform = makeStructureTransform();
contraption.stop(level);
AllPackets.channel.send(PacketDistributor.TRACKING_ENTITY.with(() -> this),
new ContraptionDisassemblyPacket(this.getId(), transform));
@ -515,6 +516,7 @@ public abstract class AbstractContraptionEntity extends Entity implements IEntit
((AbstractContraptionEntity) entity).disassemble();
}
skipActorStop = true;
discard();
ejectPassengers();
@ -535,9 +537,8 @@ public abstract class AbstractContraptionEntity extends Entity implements IEntit
@Override
public void remove(RemovalReason p_146834_) {
if (!level.isClientSide && !isRemoved() && contraption != null)
if (!ticking)
contraption.stop(level);
if (!level.isClientSide && !isRemoved() && contraption != null && !skipActorStop)
contraption.stop(level);
if (contraption != null)
contraption.onEntityRemoved(this);
super.remove(p_146834_);
@ -605,8 +606,7 @@ public abstract class AbstractContraptionEntity extends Entity implements IEntit
for (Entity entity : passengers) {
// setPos has world accessing side-effects when removed == null
String srg = "f_146795_"; // removalReason
ObfuscationReflectionHelper.setPrivateValue(Entity.class, entity, RemovalReason.UNLOADED_TO_CHUNK, srg);
entity.removalReason = RemovalReason.UNLOADED_TO_CHUNK;
// Gather passengers into same chunk when saving
Vec3 prevVec = entity.position();
@ -614,7 +614,7 @@ public abstract class AbstractContraptionEntity extends Entity implements IEntit
// Super requires all passengers to not be removed in order to write them to the
// tag
ObfuscationReflectionHelper.setPrivateValue(Entity.class, entity, null, srg);
entity.removalReason = null;
}
CompoundTag tag = super.saveWithoutId(nbt);

View file

@ -5,7 +5,6 @@ import java.util.List;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.AllTags.AllBlockTags;
import com.simibubi.create.Create;
import com.simibubi.create.content.contraptions.components.actors.AttachedActorBlock;
import com.simibubi.create.content.contraptions.components.actors.HarvesterBlock;
import com.simibubi.create.content.contraptions.components.actors.PloughBlock;
@ -39,7 +38,6 @@ import com.simibubi.create.foundation.config.ContraptionMovementSetting;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.BasePressurePlateBlock;
import net.minecraft.world.level.block.BaseRailBlock;
@ -78,7 +76,6 @@ public class BlockMovementChecks {
private static final List<BrittleCheck> BRITTLE_CHECKS = new ArrayList<>();
private static final List<AttachedCheck> ATTACHED_CHECKS = new ArrayList<>();
private static final List<NotSupportiveCheck> NOT_SUPPORTIVE_CHECKS = new ArrayList<>();
public static final ResourceLocation NON_MOVABLE = Create.asResource("non_movable");
// Registration
// Add new checks to the front instead of the end
@ -197,7 +194,7 @@ public class BlockMovementChecks {
return true;
if (state.getDestroySpeed(world, pos) == -1)
return false;
if (state.getBlock().getTags().contains(NON_MOVABLE))
if (AllBlockTags.RELOCATION_NOT_SUPPORTED.matches(state))
return false;
if (ContraptionMovementSetting.get(state.getBlock()) == ContraptionMovementSetting.UNMOVABLE)
return false;
@ -262,7 +259,7 @@ public class BlockMovementChecks {
return true;
if (block instanceof WoolCarpetBlock)
return true;
return AllBlockTags.BRITTLE.tag.contains(block);
return AllBlockTags.BRITTLE.matches(state);
}
private static boolean isBlockAttachedTowardsFallback(BlockState state, Level world, BlockPos pos,

View file

@ -17,23 +17,26 @@ import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
import net.minecraftforge.items.ItemHandlerHelper;
public abstract class MovementBehaviour {
public interface MovementBehaviour {
public boolean isActive(MovementContext context) {
default boolean isActive(MovementContext context) {
return true;
}
public void tick(MovementContext context) {}
default void tick(MovementContext context) {
}
public void startMoving(MovementContext context) {}
default void startMoving(MovementContext context) {
}
public void visitNewPosition(MovementContext context, BlockPos pos) {}
default void visitNewPosition(MovementContext context, BlockPos pos) {
}
public Vec3 getActiveAreaOffset(MovementContext context) {
default Vec3 getActiveAreaOffset(MovementContext context) {
return Vec3.ZERO;
}
public void dropItem(MovementContext context, ItemStack stack) {
default void dropItem(MovementContext context, ItemStack stack) {
ItemStack remainder;
if (AllConfigs.SERVER.kinetics.moveItemsToStorage.get())
remainder = ItemHandlerHelper.insertItem(context.contraption.inventory, stack, false);
@ -49,32 +52,31 @@ public abstract class MovementBehaviour {
context.world.addFreshEntity(itemEntity);
}
public void stopMoving(MovementContext context) {
default void onSpeedChanged(MovementContext context, Vec3 oldMotion, Vec3 motion) {
}
public void writeExtraData(MovementContext context) {
default void stopMoving(MovementContext context) {
}
public boolean renderAsNormalTileEntity() {
default void writeExtraData(MovementContext context) {
}
default boolean renderAsNormalTileEntity() {
return false;
}
public boolean hasSpecialInstancedRendering() {
default boolean hasSpecialInstancedRendering() {
return false;
}
@OnlyIn(Dist.CLIENT)
public void renderInContraption(MovementContext context, VirtualRenderWorld renderWorld,
ContraptionMatrices matrices, MultiBufferSource buffer) {}
default void renderInContraption(MovementContext context, VirtualRenderWorld renderWorld,
ContraptionMatrices matrices, MultiBufferSource buffer) {
}
@OnlyIn(Dist.CLIENT)
@Nullable
public ActorInstance createInstance(MaterialManager materialManager, VirtualRenderWorld simulationWorld, MovementContext context) {
default ActorInstance createInstance(MaterialManager materialManager, VirtualRenderWorld simulationWorld, MovementContext context) {
return null;
}
public void onSpeedChanged(MovementContext context, Vec3 oldMotion, Vec3 motion) {
}
}

View file

@ -0,0 +1,32 @@
package com.simibubi.create.content.contraptions.components.structureMovement.bearing;
import java.util.Map;
import com.simibubi.create.AllBlocks;
import com.tterrag.registrate.util.entry.BlockEntry;
import net.minecraft.world.item.BlockItem;
import net.minecraft.world.item.Item;
import net.minecraft.world.level.block.Block;
public class BlankSailBlockItem extends BlockItem {
public BlankSailBlockItem(Block block, Properties properties) {
super(block, properties);
}
@Override
public void registerBlocks(Map<Block, Item> blockToItemMap, Item item) {
super.registerBlocks(blockToItemMap, item);
for (BlockEntry<SailBlock> entry : AllBlocks.DYED_SAILS) {
blockToItemMap.put(entry.get(), item);
}
}
@Override
public void removeFromBlockToItemMap(Map<Block, Item> blockToItemMap, Item item) {
super.removeFromBlockToItemMap(blockToItemMap, item);
for (BlockEntry<SailBlock> entry : AllBlocks.DYED_SAILS) {
blockToItemMap.remove(entry.get());
}
}
}

View file

@ -20,12 +20,14 @@ import com.simibubi.create.foundation.utility.placement.PlacementOffset;
import net.minecraft.MethodsReturnNonnullByDefault;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.core.NonNullList;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResult;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.BlockItem;
import net.minecraft.world.item.CreativeModeTab;
import net.minecraft.world.item.DyeColor;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.ShearsItem;
@ -62,6 +64,13 @@ public class SailBlock extends WrenchableDirectionalBlock {
this.color = color;
}
@Override
public void fillItemCategory(CreativeModeTab tab, NonNullList<ItemStack> items) {
if (frame || color == DyeColor.WHITE) {
super.fillItemCategory(tab, items);
}
}
@Override
public BlockState getStateForPlacement(BlockPlaceContext context) {
BlockState state = super.getStateForPlacement(context);

View file

@ -28,7 +28,7 @@ import net.minecraft.world.level.block.state.properties.BlockStateProperties;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
public class StabilizedBearingMovementBehaviour extends MovementBehaviour {
public class StabilizedBearingMovementBehaviour implements MovementBehaviour {
@Override
@OnlyIn(Dist.CLIENT)

View file

@ -103,7 +103,7 @@ public class SuperGlueHandler {
if (!world.isClientSide) {
entity.playPlaceSound();
world.addFreshEntity(entity);
AllPackets.channel.send(PacketDistributor.TRACKING_ENTITY_AND_SELF.with(() -> entity),
AllPackets.channel.send(PacketDistributor.TRACKING_ENTITY.with(() -> entity),
new GlueEffectPacket(ray.getBlockPos(), face, true));
}
itemstack.hurtAndBreak(1, placer, SuperGlueItem::onBroken);

View file

@ -20,14 +20,18 @@ import net.minecraft.core.Direction;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.sounds.SoundEvents;
import net.minecraft.sounds.SoundSource;
import net.minecraft.tags.BlockTags;
import net.minecraft.tags.FluidTags;
import net.minecraft.world.effect.MobEffect;
import net.minecraft.world.effect.MobEffectInstance;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items;
import net.minecraft.world.item.alchemy.PotionUtils;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.AbstractCandleBlock;
import net.minecraft.world.level.block.CampfireBlock;
import net.minecraft.world.level.block.LiquidBlock;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.material.FluidState;
@ -46,6 +50,8 @@ public class OpenEndedPipe extends FlowSource {
static {
registerEffectHandler(new PotionEffectHandler());
registerEffectHandler(new MilkEffectHandler());
registerEffectHandler(new WaterEffectHandler());
registerEffectHandler(new LavaEffectHandler());
}
private Level world;
@ -173,11 +179,8 @@ public class OpenEndedPipe extends FlowSource {
return false;
if (fluid.isEmpty())
return false;
if (!FluidHelper.hasBlockState(fluid.getFluid())) {
if (!simulate)
applyEffects(fluid);
if (!FluidHelper.hasBlockState(fluid.getFluid()))
return true;
}
if (!fluidState.isEmpty() && fluidState.getType() != fluid.getFluid()) {
FluidReactions.handlePipeSpillCollision(world, outputPos, fluid.getFluid(), fluidState);
@ -266,6 +269,8 @@ public class OpenEndedPipe extends FlowSource {
int fill = super.fill(resource, action);
if (action.simulate())
return fill;
if (!resource.isEmpty())
applyEffects(resource);
if (getFluidAmount() == 1000 || !FluidHelper.hasBlockState(containedFluidStack.getFluid()))
if (provideFluidToSpace(containedFluidStack, false))
setFluid(FluidStack.EMPTY);
@ -348,15 +353,15 @@ public class OpenEndedPipe extends FlowSource {
if (pipe.cachedEffects.isEmpty())
return;
List<LivingEntity> list =
List<LivingEntity> entities =
pipe.getWorld().getEntitiesOfClass(LivingEntity.class, pipe.getAOE(), LivingEntity::isAffectedByPotions);
for (LivingEntity livingentity : list) {
for (MobEffectInstance effectinstance : pipe.cachedEffects) {
MobEffect effect = effectinstance.getEffect();
for (LivingEntity entity : entities) {
for (MobEffectInstance effectInstance : pipe.cachedEffects) {
MobEffect effect = effectInstance.getEffect();
if (effect.isInstantenous()) {
effect.applyInstantenousEffect(null, null, livingentity, effectinstance.getAmplifier(), 0.5D);
effect.applyInstantenousEffect(null, null, entity, effectInstance.getAmplifier(), 0.5D);
} else {
livingentity.addEffect(new MobEffectInstance(effectinstance));
entity.addEffect(new MobEffectInstance(effectInstance));
}
}
}
@ -366,7 +371,7 @@ public class OpenEndedPipe extends FlowSource {
public static class MilkEffectHandler implements IEffectHandler {
@Override
public boolean canApplyEffects(OpenEndedPipe pipe, FluidStack fluid) {
return Tags.Fluids.MILK.contains(fluid.getFluid());
return fluid.getFluid().is(Tags.Fluids.MILK);
}
@Override
@ -374,11 +379,60 @@ public class OpenEndedPipe extends FlowSource {
Level world = pipe.getWorld();
if (world.getGameTime() % 5 != 0)
return;
List<LivingEntity> list =
List<LivingEntity> entities =
world.getEntitiesOfClass(LivingEntity.class, pipe.getAOE(), LivingEntity::isAffectedByPotions);
ItemStack curativeItem = new ItemStack(Items.MILK_BUCKET);
for (LivingEntity livingentity : list)
livingentity.curePotionEffects(curativeItem);
for (LivingEntity entity : entities)
entity.curePotionEffects(curativeItem);
}
}
public static class WaterEffectHandler implements IEffectHandler {
@Override
public boolean canApplyEffects(OpenEndedPipe pipe, FluidStack fluid) {
return fluid.getFluid().is(FluidTags.WATER);
}
@Override
public void applyEffects(OpenEndedPipe pipe, FluidStack fluid) {
Level world = pipe.getWorld();
if (world.getGameTime() % 5 != 0)
return;
List<Entity> entities = world.getEntities((Entity) null, pipe.getAOE(), Entity::isOnFire);
for (Entity entity : entities)
entity.clearFire();
BlockPos.betweenClosedStream(pipe.getAOE()).forEach(pos -> dowseFire(world, pos));
}
// Adapted from ThrownPotion
private static void dowseFire(Level level, BlockPos pos) {
BlockState state = level.getBlockState(pos);
if (state.is(BlockTags.FIRE)) {
level.removeBlock(pos, false);
} else if (AbstractCandleBlock.isLit(state)) {
AbstractCandleBlock.extinguish(null, state, level, pos);
} else if (CampfireBlock.isLitCampfire(state)) {
level.levelEvent(null, 1009, pos, 0);
CampfireBlock.dowse(null, level, pos, state);
level.setBlockAndUpdate(pos, state.setValue(CampfireBlock.LIT, false));
}
}
}
public static class LavaEffectHandler implements IEffectHandler {
@Override
public boolean canApplyEffects(OpenEndedPipe pipe, FluidStack fluid) {
return fluid.getFluid().is(FluidTags.LAVA);
}
@Override
public void applyEffects(OpenEndedPipe pipe, FluidStack fluid) {
Level world = pipe.getWorld();
if (world.getGameTime() % 5 != 0)
return;
List<Entity> entities = world.getEntities((Entity) null, pipe.getAOE(), entity -> !entity.fireImmune());
for (Entity entity : entities)
entity.setSecondsOnFire(3);
}
}

View file

@ -5,8 +5,9 @@ import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.function.BiConsumer;
import java.util.function.Predicate;
import com.simibubi.create.AllTags;
import com.simibubi.create.AllTags.AllFluidTags;
import com.simibubi.create.foundation.config.AllConfigs;
import com.simibubi.create.foundation.fluid.FluidHelper;
import com.simibubi.create.foundation.networking.AllPackets;
@ -212,7 +213,7 @@ public abstract class FluidManipulationBehaviour extends TileEntityBehaviour {
}
protected boolean canDrainInfinitely(Fluid fluid) {
return maxBlocks() != -1 && !AllTags.AllFluidTags.NO_INFINITE_DRAINING.matches(fluid);
return maxBlocks() != -1 && AllConfigs.SERVER.fluids.bottomlessFluidMode.get().test(fluid);
}
@Override
@ -238,4 +239,31 @@ public abstract class FluidManipulationBehaviour extends TileEntityBehaviour {
super.read(nbt, clientPacket);
}
public enum BottomlessFluidMode implements Predicate<Fluid> {
ALLOW_ALL {
@Override
public boolean test(Fluid fluid) {
return true;
}
},
DENY_ALL {
@Override
public boolean test(Fluid fluid) {
return false;
}
},
ALLOW_BY_TAG {
@Override
public boolean test(Fluid fluid) {
return AllFluidTags.BOTTOMLESS_ALLOW.matches(fluid);
}
},
DENY_BY_TAG {
@Override
public boolean test(Fluid fluid) {
return !AllFluidTags.BOTTOMLESS_DENY.matches(fluid);
}
};
}
}

View file

@ -24,22 +24,49 @@ import net.minecraftforge.registries.ForgeRegistries;
public class PotionFluid extends VirtualFluid {
public enum BottleType {
REGULAR, SPLASH, LINGERING;
}
public PotionFluid(Properties properties) {
super(properties);
}
public static FluidStack withEffects(int amount, Potion potion, List<MobEffectInstance> customEffects) {
public static FluidStack of(int amount, Potion potion) {
FluidStack fluidStack = new FluidStack(AllFluids.POTION.get()
.getSource(), amount);
addPotionToFluidStack(fluidStack, potion);
return fluidStack;
}
public static FluidStack withEffects(int amount, Potion potion, List<MobEffectInstance> customEffects) {
FluidStack fluidStack = of(amount, potion);
appendEffects(fluidStack, customEffects);
return fluidStack;
}
public static FluidStack addPotionToFluidStack(FluidStack fs, Potion potion) {
ResourceLocation resourcelocation = ForgeRegistries.POTIONS.getKey(potion);
if (potion == Potions.EMPTY) {
fs.removeChildTag("Potion");
return fs;
}
fs.getOrCreateTag()
.putString("Potion", resourcelocation.toString());
return fs;
}
public static FluidStack appendEffects(FluidStack fs, Collection<MobEffectInstance> customEffects) {
if (customEffects.isEmpty())
return fs;
CompoundTag compoundnbt = fs.getOrCreateTag();
ListTag listnbt = compoundnbt.getList("CustomPotionEffects", 9);
for (MobEffectInstance effectinstance : customEffects)
listnbt.add(effectinstance.save(new CompoundTag()));
compoundnbt.put("CustomPotionEffects", listnbt);
return fs;
}
public enum BottleType {
REGULAR, SPLASH, LINGERING;
}
public static class PotionFluidAttributes extends FluidAttributes {
public PotionFluidAttributes(Builder builder, Fluid fluid) {
@ -70,26 +97,4 @@ public class PotionFluid extends VirtualFluid {
}
public static FluidStack addPotionToFluidStack(FluidStack fs, Potion potion) {
ResourceLocation resourcelocation = ForgeRegistries.POTIONS.getKey(potion);
if (potion == Potions.EMPTY) {
fs.removeChildTag("Potion");
return fs;
}
fs.getOrCreateTag()
.putString("Potion", resourcelocation.toString());
return fs;
}
public static FluidStack appendEffects(FluidStack fs, Collection<MobEffectInstance> customEffects) {
if (customEffects.isEmpty())
return fs;
CompoundTag compoundnbt = fs.getOrCreateTag();
ListTag listnbt = compoundnbt.getList("CustomPotionEffects", 9);
for (MobEffectInstance effectinstance : customEffects)
listnbt.add(effectinstance.save(new CompoundTag()));
compoundnbt.put("CustomPotionEffects", listnbt);
return fs;
}
}

View file

@ -51,16 +51,23 @@ public class PotionFluidHandler {
public static FluidStack getFluidFromPotionItem(ItemStack stack) {
Potion potion = PotionUtils.getPotion(stack);
List<MobEffectInstance> list = PotionUtils.getCustomEffects(stack);
FluidStack fluid = PotionFluid.withEffects(250, potion, list);
BottleType bottleTypeFromItem = bottleTypeFromItem(stack);
BottleType bottleTypeFromItem = bottleTypeFromItem(stack.getItem());
if (potion == Potions.WATER && list.isEmpty() && bottleTypeFromItem == BottleType.REGULAR)
return new FluidStack(Fluids.WATER, fluid.getAmount());
return new FluidStack(Fluids.WATER, 250);
FluidStack fluid = PotionFluid.withEffects(250, potion, list);
NBTHelper.writeEnum(fluid.getOrCreateTag(), "Bottle", bottleTypeFromItem);
return fluid;
}
public static BottleType bottleTypeFromItem(ItemStack stack) {
Item item = stack.getItem();
public static FluidStack getFluidFromPotion(Potion potion, BottleType bottleType, int amount) {
if (potion == Potions.WATER && bottleType == BottleType.REGULAR)
return new FluidStack(Fluids.WATER, amount);
FluidStack fluid = PotionFluid.of(amount, potion);
NBTHelper.writeEnum(fluid.getOrCreateTag(), "Bottle", bottleType);
return fluid;
}
public static BottleType bottleTypeFromItem(Item item) {
if (item == Items.LINGERING_POTION)
return BottleType.LINGERING;
if (item == Items.SPLASH_POTION)

View file

@ -1,20 +0,0 @@
package com.simibubi.create.content.contraptions.fluids.recipe;
import java.util.ArrayList;
import java.util.List;
import net.minecraft.server.packs.resources.ResourceManagerReloadListener;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
public class FluidTransferRecipes {
public static List<ItemStack> POTION_ITEMS = new ArrayList<>();
public static List<Item> FILLED_BUCKETS = new ArrayList<>();
public static final ResourceManagerReloadListener LISTENER = resourceManager -> {
POTION_ITEMS.clear();
FILLED_BUCKETS.clear();
};
}

View file

@ -1,147 +0,0 @@
package com.simibubi.create.content.contraptions.fluids.recipe;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
import com.simibubi.create.Create;
import com.simibubi.create.content.contraptions.components.mixer.MixingRecipe;
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 net.minecraft.server.packs.resources.ResourceManagerReloadListener;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.alchemy.Potion;
import net.minecraft.world.item.alchemy.PotionBrewing;
import net.minecraft.world.item.alchemy.PotionUtils;
import net.minecraft.world.item.alchemy.Potions;
import net.minecraft.world.item.crafting.Ingredient;
import net.minecraftforge.common.brewing.BrewingRecipeRegistry;
import net.minecraftforge.common.brewing.IBrewingRecipe;
import net.minecraftforge.common.brewing.VanillaBrewingRecipe;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.registries.ForgeRegistries;
public class PotionMixingRecipeManager {
public static Map<Item, List<MixingRecipe>> ALL = new HashMap<>();
public static List<MixingRecipe> getAllBrewingRecipes() {
List<MixingRecipe> mixingRecipes = new ArrayList<>();
// Vanilla
for (IBrewingRecipe iBrewingRecipe : BrewingRecipeRegistry.getRecipes()) {
if (!(iBrewingRecipe instanceof VanillaBrewingRecipe))
continue;
List<ItemStack> bottles = new ArrayList<>();
PotionBrewing.ALLOWED_CONTAINERS.forEach(i -> {
for (ItemStack itemStack : i.getItems())
bottles.add(itemStack);
});
Collection<ItemStack> reagents = getAllReagents(iBrewingRecipe);
Set<ItemStack> basicPotions = new HashSet<>();
for (Potion potion : ForgeRegistries.POTIONS.getValues()) {
if (potion == Potions.EMPTY)
continue;
for (ItemStack stack : bottles)
basicPotions.add(PotionUtils.setPotion(stack.copy(), potion));
}
Set<String> uniqueKeys = new HashSet<>();
List<ItemStack> potionFrontier = new ArrayList<>();
List<ItemStack> newPotions = new ArrayList<>();
potionFrontier.addAll(basicPotions);
int recipeIndex = 0;
while (!potionFrontier.isEmpty()) {
newPotions.clear();
for (ItemStack inputPotionStack : potionFrontier) {
Potion inputPotion = PotionUtils.getPotion(inputPotionStack);
for (ItemStack potionReagent : reagents) {
ItemStack outputPotionStack = iBrewingRecipe.getOutput(inputPotionStack.copy(), potionReagent);
if (outputPotionStack.isEmpty())
continue;
String uniqueKey = potionReagent.getItem()
.getRegistryName()
.toString() + "_"
+ inputPotion.getRegistryName()
.toString()
+ "_" + inputPotionStack.getItem()
.getRegistryName()
.toString();
if (!uniqueKeys.add(uniqueKey))
continue;
if (inputPotionStack.getItem() == outputPotionStack.getItem()) {
Potion outputPotion = PotionUtils.getPotion(outputPotionStack);
if (outputPotion == Potions.WATER)
continue;
}
FluidStack fluidFromPotionItem = PotionFluidHandler.getFluidFromPotionItem(inputPotionStack);
FluidStack fluidFromPotionItem2 = PotionFluidHandler.getFluidFromPotionItem(outputPotionStack);
fluidFromPotionItem.setAmount(1000);
fluidFromPotionItem2.setAmount(1000);
MixingRecipe mixingRecipe = new ProcessingRecipeBuilder<>(MixingRecipe::new,
Create.asResource("potion_" + recipeIndex++)).require(Ingredient.of(potionReagent))
.require(FluidIngredient.fromFluidStack(fluidFromPotionItem))
.output(fluidFromPotionItem2)
.requiresHeat(HeatCondition.HEATED)
.build();
mixingRecipes.add(mixingRecipe);
newPotions.add(outputPotionStack);
}
}
potionFrontier.clear();
potionFrontier.addAll(newPotions);
}
break;
}
// TODO Modded brewing recipes?
return mixingRecipes;
}
public static Collection<ItemStack> getAllReagents(IBrewingRecipe recipe) {
return ForgeRegistries.ITEMS.getValues()
.stream()
.map(ItemStack::new)
.filter(recipe::isIngredient)
.collect(Collectors.toList());
}
public static final ResourceManagerReloadListener LISTENER = resourceManager -> {
ALL.clear();
getAllBrewingRecipes().forEach(recipe -> {
for (Ingredient ingredient : recipe.getIngredients()) {
for (ItemStack itemStack : ingredient.getItems()) {
ALL.computeIfAbsent(itemStack.getItem(), t -> new ArrayList<>())
.add(recipe);
return;
}
}
});
};
}

View file

@ -0,0 +1,141 @@
package com.simibubi.create.content.contraptions.fluids.recipe;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import com.simibubi.create.Create;
import com.simibubi.create.content.contraptions.components.mixer.MixingRecipe;
import com.simibubi.create.content.contraptions.fluids.potion.PotionFluid.BottleType;
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 net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items;
import net.minecraft.world.item.alchemy.Potion;
import net.minecraft.world.item.alchemy.PotionBrewing;
import net.minecraft.world.item.alchemy.Potions;
import net.minecraft.world.item.crafting.Ingredient;
import net.minecraftforge.common.brewing.BrewingRecipe;
import net.minecraftforge.common.brewing.BrewingRecipeRegistry;
import net.minecraftforge.common.brewing.IBrewingRecipe;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.registries.ForgeRegistries;
public class PotionMixingRecipes {
public static final List<Item> SUPPORTED_CONTAINERS = List.of(Items.POTION, Items.SPLASH_POTION, Items.LINGERING_POTION);
public static final List<MixingRecipe> ALL = createRecipes();
public static final Map<Item, List<MixingRecipe>> BY_ITEM = sortRecipesByItem(ALL);
private static List<MixingRecipe> createRecipes() {
List<MixingRecipe> mixingRecipes = new ArrayList<>();
int recipeIndex = 0;
List<Item> allowedSupportedContainers = new ArrayList<>();
List<ItemStack> supportedContainerStacks = new ArrayList<>();
for (Item container : SUPPORTED_CONTAINERS) {
ItemStack stack = new ItemStack(container);
supportedContainerStacks.add(stack);
if (PotionBrewing.ALLOWED_CONTAINER.test(stack)) {
allowedSupportedContainers.add(container);
}
}
for (Item container : allowedSupportedContainers) {
BottleType bottleType = PotionFluidHandler.bottleTypeFromItem(container);
for (PotionBrewing.Mix<Potion> mix : PotionBrewing.POTION_MIXES) {
FluidStack fromFluid = PotionFluidHandler.getFluidFromPotion(mix.from.get(), bottleType, 1000);
FluidStack toFluid = PotionFluidHandler.getFluidFromPotion(mix.to.get(), bottleType, 1000);
mixingRecipes.add(createRecipe("potion_mixing_vanilla_" + recipeIndex++, mix.ingredient, fromFluid, toFluid));
}
}
for (PotionBrewing.Mix<Item> mix : PotionBrewing.CONTAINER_MIXES) {
Item from = mix.from.get();
if (!allowedSupportedContainers.contains(from)) {
continue;
}
Item to = mix.to.get();
if (!allowedSupportedContainers.contains(to)) {
continue;
}
BottleType fromBottleType = PotionFluidHandler.bottleTypeFromItem(from);
BottleType toBottleType = PotionFluidHandler.bottleTypeFromItem(to);
Ingredient ingredient = mix.ingredient;
for (Potion potion : ForgeRegistries.POTIONS.getValues()) {
if (potion == Potions.EMPTY) {
continue;
}
FluidStack fromFluid = PotionFluidHandler.getFluidFromPotion(potion, fromBottleType, 1000);
FluidStack toFluid = PotionFluidHandler.getFluidFromPotion(potion, toBottleType, 1000);
mixingRecipes.add(createRecipe("potion_mixing_vanilla_" + recipeIndex++, ingredient, fromFluid, toFluid));
}
}
recipeIndex = 0;
for (IBrewingRecipe recipe : BrewingRecipeRegistry.getRecipes()) {
if (recipe instanceof BrewingRecipe recipeImpl) {
ItemStack output = recipeImpl.getOutput();
if (!SUPPORTED_CONTAINERS.contains(output.getItem())) {
continue;
}
Ingredient input = recipeImpl.getInput();
Ingredient ingredient = recipeImpl.getIngredient();
FluidStack outputFluid = null;
for (ItemStack stack : supportedContainerStacks) {
if (input.test(stack)) {
FluidStack inputFluid = PotionFluidHandler.getFluidFromPotionItem(stack);
if (outputFluid == null) {
outputFluid = PotionFluidHandler.getFluidFromPotionItem(output);
}
mixingRecipes.add(createRecipe("potion_mixing_modded_" + recipeIndex++, ingredient, inputFluid, outputFluid));
}
}
}
}
return mixingRecipes;
}
private static MixingRecipe createRecipe(String id, Ingredient ingredient, FluidStack fromFluid, FluidStack toFluid) {
return new ProcessingRecipeBuilder<>(MixingRecipe::new,
Create.asResource(id)).require(ingredient)
.require(FluidIngredient.fromFluidStack(fromFluid))
.output(toFluid)
.requiresHeat(HeatCondition.HEATED)
.build();
}
private static Map<Item, List<MixingRecipe>> sortRecipesByItem(List<MixingRecipe> all) {
Map<Item, List<MixingRecipe>> byItem = new HashMap<>();
Set<Item> processedItems = new HashSet<>();
for (MixingRecipe recipe : all) {
for (Ingredient ingredient : recipe.getIngredients()) {
for (ItemStack itemStack : ingredient.getItems()) {
Item item = itemStack.getItem();
if (processedItems.add(item)) {
byItem.computeIfAbsent(item, i -> new ArrayList<>())
.add(recipe);
}
}
}
processedItems.clear();
}
return byItem;
}
}

View file

@ -23,7 +23,7 @@ import net.minecraftforge.client.model.data.ModelProperty;
public class FluidTankModel extends CTModel {
protected static ModelProperty<CullData> CULL_PROPERTY = new ModelProperty<>();
protected static final ModelProperty<CullData> CULL_PROPERTY = new ModelProperty<>();
public static FluidTankModel standard(BakedModel originalModel) {
return new FluidTankModel(originalModel, AllSpriteShifts.FLUID_TANK, AllSpriteShifts.COPPER_CASING);

View file

@ -15,7 +15,7 @@ import com.simibubi.create.content.contraptions.processing.ProcessingRecipeBuild
import net.minecraft.data.recipes.FinishedRecipe;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.tags.Tag;
import net.minecraft.tags.TagKey;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.crafting.Ingredient;
@ -52,7 +52,7 @@ public class SequencedAssemblyRecipeBuilder {
return require(Ingredient.of(ingredient));
}
public SequencedAssemblyRecipeBuilder require(Tag.Named<Item> tag) {
public SequencedAssemblyRecipeBuilder require(TagKey<Item> tag) {
return require(Ingredient.of(tag));
}

View file

@ -1,5 +1,7 @@
package com.simibubi.create.content.contraptions.particle;
import javax.annotation.Nonnull;
import com.simibubi.create.Create;
import com.simibubi.create.content.contraptions.components.fan.IAirCurrentSource;
import com.simibubi.create.content.contraptions.processing.InWorldProcessing;
@ -7,7 +9,11 @@ import com.simibubi.create.foundation.utility.Color;
import com.simibubi.create.foundation.utility.VecHelper;
import net.minecraft.client.multiplayer.ClientLevel;
import net.minecraft.client.particle.*;
import net.minecraft.client.particle.Particle;
import net.minecraft.client.particle.ParticleProvider;
import net.minecraft.client.particle.ParticleRenderType;
import net.minecraft.client.particle.SimpleAnimatedParticle;
import net.minecraft.client.particle.SpriteSet;
import net.minecraft.client.renderer.LevelRenderer;
import net.minecraft.core.BlockPos;
import net.minecraft.core.particles.BlockParticleOption;
@ -17,8 +23,6 @@ import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.phys.Vec3;
import javax.annotation.Nonnull;
public class AirFlowParticle extends SimpleAnimatedParticle {
private final IAirCurrentSource source;

View file

@ -13,7 +13,7 @@ import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.phys.Vec3;
import net.minecraftforge.items.ItemStackHandler;
public class BasinMovementBehaviour extends MovementBehaviour {
public class BasinMovementBehaviour implements MovementBehaviour {
public Map<String, ItemStackHandler> getOrReadInventory(MovementContext context) {
Map<String, ItemStackHandler> map = new HashMap<>();
map.put("InputItems", new ItemStackHandler(9));
@ -29,7 +29,7 @@ public class BasinMovementBehaviour extends MovementBehaviour {
@Override
public void tick(MovementContext context) {
super.tick(context);
MovementBehaviour.super.tick(context);
if (context.temporaryData == null || (boolean) context.temporaryData) {
Vec3 facingVec = context.rotation.apply(Vec3.atLowerCornerOf(Direction.UP.getNormal()));
facingVec.normalize();

View file

@ -76,13 +76,9 @@ public class InWorldProcessing {
if (compound.contains("Processing")) {
CompoundTag processing = compound.getCompound("Processing");
if (Type.valueOf(processing.getString("Type")) != type) {
boolean canProcess = type.canProcess(entity.getItem(), entity.level);
processing.putString("Type", type.name());
if (!canProcess)
processing.putInt("Time", -1);
return canProcess;
} else if (processing.getInt("Time") >= 0)
if (Type.valueOf(processing.getString("Type")) != type)
return type.canProcess(entity.getItem(), entity.level);
else if (processing.getInt("Time") >= 0)
return true;
else if (processing.getInt("Time") == -1)
return false;
@ -296,8 +292,8 @@ public class InWorldProcessing {
}
if (entity.isOnFire()) {
entity.clearFire();
level.playSound(null, entity.blockPosition(), SoundEvents.GENERIC_EXTINGUISH_FIRE, SoundSource.NEUTRAL,
0.7F, 1.6F + (level.random.nextFloat() - level.random.nextFloat()) * 0.4F);
level.playSound(null, entity.blockPosition(), SoundEvents.GENERIC_EXTINGUISH_FIRE,
SoundSource.NEUTRAL, 0.7F, 1.6F + (level.random.nextFloat() - level.random.nextFloat()) * 0.4F);
}
}
@ -445,12 +441,10 @@ public class InWorldProcessing {
},
NONE {
@Override
public void spawnParticlesForProcessing(Level level, Vec3 pos) {
}
public void spawnParticlesForProcessing(Level level, Vec3 pos) {}
@Override
public void affectEntity(Entity entity, Level level) {
}
public void affectEntity(Entity entity, Level level) {}
@Override
public boolean canProcess(ItemStack stack, Level level) {
@ -473,14 +467,18 @@ public class InWorldProcessing {
if (block == Blocks.SOUL_FIRE
|| block == Blocks.SOUL_CAMPFIRE && blockState.getOptionalValue(CampfireBlock.LIT)
.orElse(false)
|| AllBlocks.LIT_BLAZE_BURNER.has(blockState) && blockState.getOptionalValue(LitBlazeBurnerBlock.FLAME_TYPE)
.map(flame -> flame == LitBlazeBurnerBlock.FlameType.SOUL).orElse(false))
|| AllBlocks.LIT_BLAZE_BURNER.has(blockState)
&& blockState.getOptionalValue(LitBlazeBurnerBlock.FLAME_TYPE)
.map(flame -> flame == LitBlazeBurnerBlock.FlameType.SOUL)
.orElse(false))
return Type.HAUNTING;
if (block == Blocks.FIRE
|| BlockTags.CAMPFIRES.contains(block) && blockState.getOptionalValue(CampfireBlock.LIT)
if (block == Blocks.FIRE || blockState.is(BlockTags.CAMPFIRES)
&& blockState.getOptionalValue(CampfireBlock.LIT)
.orElse(false)
|| AllBlocks.LIT_BLAZE_BURNER.has(blockState) && blockState.getOptionalValue(LitBlazeBurnerBlock.FLAME_TYPE)
.map(flame -> flame == LitBlazeBurnerBlock.FlameType.REGULAR).orElse(false)
|| AllBlocks.LIT_BLAZE_BURNER.has(blockState)
&& blockState.getOptionalValue(LitBlazeBurnerBlock.FLAME_TYPE)
.map(flame -> flame == LitBlazeBurnerBlock.FlameType.REGULAR)
.orElse(false)
|| getHeatLevelOf(blockState) == BlazeBurnerBlock.HeatLevel.SMOULDERING)
return Type.SMOKING;
if (block == Blocks.LAVA || getHeatLevelOf(blockState).isAtLeast(BlazeBurnerBlock.HeatLevel.FADING))

View file

@ -14,7 +14,7 @@ import com.simibubi.create.foundation.utility.recipe.IRecipeTypeInfo;
import net.minecraft.core.NonNullList;
import net.minecraft.data.recipes.FinishedRecipe;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.tags.Tag;
import net.minecraft.tags.TagKey;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.crafting.Ingredient;
@ -103,7 +103,7 @@ public class ProcessingRecipeBuilder<T extends ProcessingRecipe<?>> {
// Datagen shortcuts
public ProcessingRecipeBuilder<T> require(Tag.Named<Item> tag) {
public ProcessingRecipeBuilder<T> require(TagKey<Item> tag) {
return require(Ingredient.of(tag));
}
@ -120,7 +120,7 @@ public class ProcessingRecipeBuilder<T extends ProcessingRecipe<?>> {
return require(FluidIngredient.fromFluid(fluid, amount));
}
public ProcessingRecipeBuilder<T> require(Tag.Named<Fluid> fluidTag, int amount) {
public ProcessingRecipeBuilder<T> require(TagKey<Fluid> fluidTag, int amount) {
return require(FluidIngredient.fromTag(fluidTag, amount));
}

View file

@ -16,7 +16,6 @@ import net.minecraft.core.particles.ParticleTypes;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.sounds.SoundEvents;
import net.minecraft.sounds.SoundSource;
import net.minecraft.util.random.SimpleWeightedRandomList;
import net.minecraft.util.random.WeightedEntry.Wrapper;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResult;
@ -36,7 +35,6 @@ import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.entity.SpawnerBlockEntity;
import net.minecraft.world.phys.Vec3;
import net.minecraftforge.fml.util.ObfuscationReflectionHelper;
@MethodsReturnNonnullByDefault
@ParametersAreNonnullByDefault
@ -90,17 +88,15 @@ public class BlazeBurnerBlockItem extends BlockItem {
return super.useOn(context);
BaseSpawner spawner = ((SpawnerBlockEntity) te).getSpawner();
SimpleWeightedRandomList<SpawnData> spawnPotentials =
ObfuscationReflectionHelper.getPrivateValue(BaseSpawner.class, spawner, "f_45443_"); // spawnPotentials
List<SpawnData> possibleSpawns = spawnPotentials.unwrap()
List<SpawnData> possibleSpawns = spawner.spawnPotentials.unwrap()
.stream()
.map(Wrapper::getData)
.toList();
if (possibleSpawns.isEmpty()) {
possibleSpawns = new ArrayList<>();
possibleSpawns.add(ObfuscationReflectionHelper.getPrivateValue(BaseSpawner.class, spawner, "f_45444_")); // nextSpawnData
possibleSpawns.add(spawner.nextSpawnData);
}
ResourceLocation blazeId = EntityType.BLAZE.getRegistryName();

View file

@ -4,6 +4,7 @@ import java.util.List;
import java.util.Random;
import com.simibubi.create.AllItems;
import com.simibubi.create.AllTags.AllItemTags;
import com.simibubi.create.content.contraptions.particle.CubeParticleData;
import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock.HeatLevel;
import com.simibubi.create.foundation.tileEntity.SmartTileEntity;
@ -169,13 +170,17 @@ public class BlazeBurnerTileEntity extends SmartTileEntity {
FuelType newFuel = FuelType.NONE;
int newBurnTime;
if (AllItems.BLAZE_CAKE.isIn(itemStack)) {
if (AllItemTags.BLAZE_BURNER_FUEL_SPECIAL.matches(itemStack)) {
newBurnTime = 1000;
newFuel = FuelType.SPECIAL;
} else {
newBurnTime = ForgeHooks.getBurnTime(itemStack, null);
if (newBurnTime > 0)
newFuel = FuelType.NORMAL;
else if (AllItemTags.BLAZE_BURNER_FUEL_REGULAR.matches(itemStack)) {
newBurnTime = 1600; // Same as coal
newFuel = FuelType.NORMAL;
}
}
if (newFuel == FuelType.NONE)

View file

@ -130,7 +130,8 @@ public class BeltBlock extends HorizontalKineticBlock implements ITE<BeltTileEnt
}
@Override
public ItemStack getCloneItemStack(BlockState state, HitResult target, BlockGetter world, BlockPos pos, Player player) {
public ItemStack getCloneItemStack(BlockState state, HitResult target, BlockGetter world, BlockPos pos,
Player player) {
return AllItems.BELT_CONNECTOR.asStack();
}
@ -249,7 +250,7 @@ public class BeltBlock extends HorizontalKineticBlock implements ITE<BeltTileEnt
boolean isWrench = AllItems.WRENCH.isIn(heldItem);
boolean isConnector = AllItems.BELT_CONNECTOR.isIn(heldItem);
boolean isShaft = AllBlocks.SHAFT.isIn(heldItem);
boolean isDye = Tags.Items.DYES.contains(heldItem.getItem());
boolean isDye = heldItem.is(Tags.Items.DYES);
boolean hasWater = EmptyingByBasin.emptyItem(world, heldItem, true)
.getFirst()
.getFluid()
@ -603,7 +604,8 @@ public class BeltBlock extends HorizontalKineticBlock implements ITE<BeltTileEnt
public static class RenderProperties extends ReducedDestroyEffects implements DestroyProgressRenderingHandler {
@Override
public boolean renderDestroyProgress(ClientLevel level, LevelRenderer renderer, int breakerId, BlockPos pos, int progress, BlockState blockState) {
public boolean renderDestroyProgress(ClientLevel level, LevelRenderer renderer, int breakerId, BlockPos pos,
int progress, BlockState blockState) {
BlockEntity blockEntity = level.getBlockEntity(pos);
if (blockEntity instanceof BeltTileEntity belt) {
for (BlockPos beltPos : BeltBlock.getBeltChain(level, belt.getController())) {

View file

@ -17,7 +17,7 @@ public class BeltHelper {
public static boolean isItemUpright(ItemStack stack) {
return stack.getCapability(CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY)
.isPresent() || stack.is(AllItemTags.UPRIGHT_ON_BELT.tag);
.isPresent() || AllItemTags.UPRIGHT_ON_BELT.matches(stack);
}
public static BeltTileEntity getSegmentTE(LevelAccessor world, BlockPos pos) {

View file

@ -58,10 +58,10 @@ public class BeltInventory {
belt.setChanged();
belt.sendData();
}
if (belt.getSpeed() == 0)
return;
// Reverse item collection if belt just reversed
if (beltMovementPositive != belt.getDirectionAwareBeltMovementSpeed() > 0) {
beltMovementPositive = !beltMovementPositive;
@ -107,7 +107,7 @@ public class BeltInventory {
// Don't move if held by processing (client)
if (world.isClientSide && currentItem.locked)
continue;
// Don't move if held by external components
if (currentItem.lockedExternally) {
currentItem.lockedExternally = false;
@ -149,7 +149,11 @@ public class BeltInventory {
if (currentItem.locked)
continue;
}
// Belt Funnels
if (BeltFunnelInteractionHandler.checkForFunnels(this, currentItem, nextOffset))
continue;
if (noMovement)
continue;
@ -157,10 +161,6 @@ public class BeltInventory {
if (BeltTunnelInteractionHandler.flapTunnelsAndCheckIfStuck(this, currentItem, nextOffset))
continue;
// Belt Funnels
if (BeltFunnelInteractionHandler.checkForFunnels(this, currentItem, nextOffset))
continue;
// Horizontal Crushing Wheels
if (BeltCrusherInteractionHandler.checkForCrushers(this, currentItem, nextOffset))
continue;
@ -216,7 +216,8 @@ public class BeltInventory {
}
}
protected boolean handleBeltProcessingAndCheckIfRemoved(TransportedItemStack currentItem, float nextOffset, boolean noMovement) {
protected boolean handleBeltProcessingAndCheckIfRemoved(TransportedItemStack currentItem, float nextOffset,
boolean noMovement) {
int currentSegment = (int) currentItem.beltPosition;
// Continue processing if held
@ -243,7 +244,7 @@ public class BeltInventory {
belt.sendData();
return false;
}
if (noMovement)
return false;
@ -314,8 +315,9 @@ public class BeltInventory {
if (inputBehaviour != null)
return Ending.INSERT;
if (BlockHelper.hasBlockSolidSide(world.getBlockState(nextPosition), world, nextPosition, belt.getMovementFacing()
.getOpposite()))
if (BlockHelper.hasBlockSolidSide(world.getBlockState(nextPosition), world, nextPosition,
belt.getMovementFacing()
.getOpposite()))
return Ending.BLOCKED;
return Ending.EJECT;
@ -404,9 +406,11 @@ public class BeltInventory {
ItemStack ejected = stack.stack;
Vec3 outPos = BeltHelper.getVectorForOffset(belt, stack.beltPosition);
float movementSpeed = Math.max(Math.abs(belt.getBeltMovementSpeed()), 1 / 8f);
Vec3 outMotion = Vec3.atLowerCornerOf(belt.getBeltChainDirection()).scale(movementSpeed)
Vec3 outMotion = Vec3.atLowerCornerOf(belt.getBeltChainDirection())
.scale(movementSpeed)
.add(0, 1 / 8f, 0);
outPos = outPos.add(outMotion.normalize().scale(0.001));
outPos = outPos.add(outMotion.normalize()
.scale(0.001));
ItemEntity entity = new ItemEntity(belt.getLevel(), outPos.x, outPos.y + 6 / 16f, outPos.z, ejected);
entity.setDeltaMovement(outMotion);
entity.setDefaultPickUpDelay();
@ -428,7 +432,7 @@ public class BeltInventory {
if (Math.abs(position - transported.beltPosition) >= maxDistanceToPosition)
continue;
TransportedResult result = processFunction.apply(transported);
if (result == null|| result.didntChangeFrom(stackBefore))
if (result == null || result.didntChangeFrom(stackBefore))
continue;
dirty = true;
@ -449,5 +453,5 @@ public class BeltInventory {
public List<TransportedItemStack> getTransportedItems() {
return items;
}
}

View file

@ -28,7 +28,7 @@ public class SimpleKineticTileEntity extends KineticTileEntity {
BlockPos.betweenClosedStream(new BlockPos(-1, -1, -1), new BlockPos(1, 1, 1))
.forEach(offset -> {
if (offset.distSqr(0, 0, 0, false) == BlockPos.ZERO.distSqr(1, 1, 0, false))
if (offset.distSqr(BlockPos.ZERO) == 2)
neighbours.add(worldPosition.offset(offset));
});
return neighbours;

View file

@ -12,6 +12,7 @@ import com.simibubi.create.foundation.block.ITE;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.core.Direction.Axis;
import net.minecraft.core.NonNullList;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.ListTag;
import net.minecraft.network.chat.Component;
@ -23,6 +24,7 @@ import net.minecraft.world.entity.EquipmentSlot;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.BlockItem;
import net.minecraft.world.item.CreativeModeTab;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.context.BlockPlaceContext;
import net.minecraft.world.item.enchantment.EnchantmentHelper;
@ -63,7 +65,10 @@ public class CopperBacktankBlock extends HorizontalKineticBlock
builder.add(BlockStateProperties.WATERLOGGED);
super.createBlockStateDefinition(builder);
}
@Override
public void fillItemCategory(CreativeModeTab pTab, NonNullList<ItemStack> pItems) {}
@Override
public boolean hasAnalogOutputSignal(BlockState p_149740_1_) {
return true;

View file

@ -1,6 +1,7 @@
package com.simibubi.create.content.curiosities.armor;
import com.simibubi.create.content.curiosities.armor.CapacityEnchantment.ICapacityEnchantable;
import com.tterrag.registrate.util.entry.ItemEntry;
import net.minecraft.core.NonNullList;
import net.minecraft.nbt.CompoundTag;
@ -11,27 +12,29 @@ import net.minecraft.world.item.BlockItem;
import net.minecraft.world.item.CreativeModeTab;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.context.UseOnContext;
import net.minecraft.world.level.block.Block;
public class CopperBacktankItem extends CopperArmorItem implements ICapacityEnchantable {
public static final int DURABILITY_BAR = 0xEFEFEF;
private BlockItem blockItem;
private ItemEntry<CopperBacktankBlockItem> blockItem;
public CopperBacktankItem(Properties p_i48534_3_, BlockItem blockItem) {
public CopperBacktankItem(Properties p_i48534_3_, ItemEntry<CopperBacktankBlockItem> copperBacktankPlaceable) {
super(EquipmentSlot.CHEST, p_i48534_3_);
this.blockItem = blockItem;
this.blockItem = copperBacktankPlaceable;
}
@Override
public InteractionResult useOn(UseOnContext p_195939_1_) {
return blockItem.useOn(p_195939_1_);
return blockItem.get()
.useOn(p_195939_1_);
}
@Override
public boolean canBeDepleted() {
return false;
}
@Override
public boolean isEnchantable(ItemStack p_77616_1_) {
return true;
@ -41,7 +44,7 @@ public class CopperBacktankItem extends CopperArmorItem implements ICapacityEnch
public void fillItemCategory(CreativeModeTab p_150895_1_, NonNullList<ItemStack> p_150895_2_) {
if (!allowdedIn(p_150895_1_))
return;
ItemStack stack = new ItemStack(this);
CompoundTag nbt = new CompoundTag();
nbt.putInt("Air", BackTankUtil.maxAirWithoutEnchants());
@ -68,5 +71,21 @@ public class CopperBacktankItem extends CopperArmorItem implements ICapacityEnch
CompoundTag orCreateTag = stack.getOrCreateTag();
return orCreateTag.getInt("Air");
}
public static class CopperBacktankBlockItem extends BlockItem {
public CopperBacktankBlockItem(Block pBlock, Properties pProperties) {
super(pBlock, pProperties);
}
@Override
public void fillItemCategory(CreativeModeTab pGroup, NonNullList<ItemStack> pItems) {}
@Override
public String getDescriptionId() {
return this.getOrCreateDescriptionId();
}
}
}

View file

@ -11,7 +11,6 @@ import net.minecraft.world.phys.Vec3;
import net.minecraftforge.event.entity.living.LivingEvent.LivingUpdateEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod.EventBusSubscriber;
import net.minecraftforge.fml.util.ObfuscationReflectionHelper;
@EventBusSubscriber
public class DivingBootsItem extends CopperArmorItem {
@ -27,7 +26,7 @@ public class DivingBootsItem extends CopperArmorItem {
return;
Vec3 motion = entity.getDeltaMovement();
Boolean isJumping = ObfuscationReflectionHelper.getPrivateValue(LivingEntity.class, entity, "f_20899_"); // jumping
boolean isJumping = entity.jumping;
entity.setOnGround(entity.isOnGround() || entity.verticalCollision);
if (isJumping && entity.isOnGround()) {

View file

@ -11,12 +11,12 @@ import net.minecraft.client.multiplayer.ClientLevel;
import net.minecraft.client.particle.Particle;
import net.minecraft.client.particle.ParticleEngine;
import net.minecraft.client.particle.SpriteSet;
import net.minecraft.core.Registry;
import net.minecraft.core.particles.ParticleOptions;
import net.minecraft.core.particles.ParticleType;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
import net.minecraftforge.registries.ForgeRegistries;
@ParametersAreNonnullByDefault
@MethodsReturnNonnullByDefault
@ -61,7 +61,7 @@ public abstract class BasicParticleData<T extends Particle> implements ParticleO
@Override
public String writeToString() {
return Registry.PARTICLE_TYPE.getKey(getType()).toString();
return ForgeRegistries.PARTICLE_TYPES.getKey(getType()).toString();
}
@Override

View file

@ -119,7 +119,7 @@ public class SoulPulseEffect {
for (int z = 0; z < MAX_DISTANCE; z++) {
BlockPos candidate = new BlockPos(x, y, z);
int dist = (int) Math.round(Math.sqrt(candidate.distSqr(0, 0, 0, false)));
int dist = (int) Math.round(Math.sqrt(candidate.distSqr(BlockPos.ZERO)));
if (dist > MAX_DISTANCE)
continue;
if (dist <= 0)

View file

@ -13,6 +13,7 @@ import net.minecraft.core.NonNullList;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.ListTag;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.tags.ItemTags;
import net.minecraft.util.GsonHelper;
import net.minecraft.world.InteractionResult;
import net.minecraft.world.entity.EntityType;
@ -26,10 +27,9 @@ import net.minecraft.world.item.crafting.Ingredient.ItemValue;
import net.minecraft.world.item.crafting.Ingredient.TagValue;
import net.minecraft.world.item.crafting.Ingredient.Value;
import net.minecraft.world.item.crafting.Recipe;
import net.minecraft.world.item.crafting.ShapedRecipe;
import net.minecraft.world.level.Level;
import net.minecraftforge.common.crafting.IShapedRecipe;
import net.minecraftforge.common.crafting.MultiItemValue;
import net.minecraftforge.fml.util.ObfuscationReflectionHelper;
import net.minecraftforge.items.ItemStackHandler;
public class BlueprintItem extends Item {
@ -79,12 +79,12 @@ public class BlueprintItem extends Item {
inv.setStackInSlot(i, ItemStack.EMPTY);
inv.setStackInSlot(9, recipe.getResultItem());
if (recipe instanceof ShapedRecipe) {
ShapedRecipe shapedRecipe = (ShapedRecipe) recipe;
for (int row = 0; row < shapedRecipe.getHeight(); row++)
for (int col = 0; col < shapedRecipe.getWidth(); col++)
if (recipe instanceof IShapedRecipe) {
IShapedRecipe<?> shapedRecipe = (IShapedRecipe<?>) recipe;
for (int row = 0; row < shapedRecipe.getRecipeHeight(); row++)
for (int col = 0; col < shapedRecipe.getRecipeWidth(); col++)
inv.setStackInSlot(row * 3 + col,
convertIngredientToFilter(ingredients.get(row * shapedRecipe.getWidth() + col)));
convertIngredientToFilter(ingredients.get(row * shapedRecipe.getRecipeWidth() + col)));
} else {
for (int i = 0; i < ingredients.size(); i++)
inv.setStackInSlot(i, convertIngredientToFilter(ingredients.get(i)));
@ -92,8 +92,7 @@ public class BlueprintItem extends Item {
}
private static ItemStack convertIngredientToFilter(Ingredient ingredient) {
Ingredient.Value[] acceptedItems =
ObfuscationReflectionHelper.getPrivateValue(Ingredient.class, ingredient, "f_43902_"); // values
Ingredient.Value[] acceptedItems = ingredient.values;
if (acceptedItems == null || acceptedItems.length > 18)
return ItemStack.EMPTY;
if (acceptedItems.length == 0)
@ -123,7 +122,7 @@ public class BlueprintItem extends Item {
filterItem.getOrCreateTag()
.putInt("WhitelistMode", WhitelistMode.WHITELIST_DISJ.ordinal());
ListTag attributes = new ListTag();
ItemAttribute at = new ItemAttribute.InTag(resourcelocation);
ItemAttribute at = new ItemAttribute.InTag(ItemTags.create(resourcelocation));
CompoundTag compoundNBT = new CompoundTag();
at.serializeNBT(compoundNBT);
compoundNBT.putBoolean("Inverted", false);

View file

@ -24,14 +24,11 @@ import net.minecraft.ChatFormatting;
import net.minecraft.client.Minecraft;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.ListTag;
import net.minecraft.tags.ItemTags;
import net.minecraft.tags.Tag;
import net.minecraft.world.inventory.CraftingContainer;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items;
import net.minecraft.world.item.crafting.CraftingRecipe;
import net.minecraft.world.item.crafting.Ingredient;
import net.minecraft.world.item.crafting.RecipeType;
import net.minecraft.world.phys.EntityHitResult;
import net.minecraft.world.phys.HitResult;
@ -40,6 +37,9 @@ import net.minecraftforge.client.gui.ForgeIngameGui;
import net.minecraftforge.client.gui.IIngameOverlay;
import net.minecraftforge.items.ItemHandlerHelper;
import net.minecraftforge.items.ItemStackHandler;
import net.minecraftforge.registries.ForgeRegistries;
import net.minecraftforge.registries.tags.ITag;
import net.minecraftforge.registries.tags.ITagManager;
public class BlueprintOverlayRenderer {
@ -206,7 +206,8 @@ public class BlueprintOverlayRenderer {
}
}
public static void renderOverlay(ForgeIngameGui gui, PoseStack poseStack, float partialTicks, int width, int height) {
public static void renderOverlay(ForgeIngameGui gui, PoseStack poseStack, float partialTicks, int width,
int height) {
if (!active || empty)
return;
@ -277,13 +278,20 @@ public class BlueprintOverlayRenderer {
ListTag attributes = tag.getList("MatchedAttributes", net.minecraft.nbt.Tag.TAG_COMPOUND);
if (whitelistMode == WhitelistMode.WHITELIST_DISJ && attributes.size() == 1) {
ItemAttribute fromNBT = ItemAttribute.fromNBT((CompoundTag) attributes.get(0));
if (fromNBT instanceof ItemAttribute.InTag) {
ItemAttribute.InTag inTag = (ItemAttribute.InTag) fromNBT;
Tag<Item> itag = ItemTags.getAllTags()
.getTag(inTag.tagName);
if (itag != null)
return Ingredient.of(itag)
.getItems();
if (fromNBT instanceof ItemAttribute.InTag inTag) {
ITagManager<Item> tagManager = ForgeRegistries.ITEMS.tags();
if (tagManager.isKnownTagName(inTag.tag)) {
ITag<Item> taggedItems = tagManager.getTag(inTag.tag);
if (!taggedItems.isEmpty()) {
ItemStack[] stacks = new ItemStack[taggedItems.size()];
int i = 0;
for (Item item : taggedItems) {
stacks[i] = new ItemStack(item);
i++;
}
return stacks;
}
}
}
}
}

View file

@ -8,6 +8,7 @@ import javax.annotation.ParametersAreNonnullByDefault;
import com.simibubi.create.AllSoundEvents;
import com.simibubi.create.foundation.item.CustomUseEffectsItem;
import com.simibubi.create.foundation.item.render.SimpleCustomRenderer;
import com.simibubi.create.foundation.mixin.accessor.LivingEntityAccessor;
import com.simibubi.create.foundation.utility.VecHelper;
import net.minecraft.MethodsReturnNonnullByDefault;
@ -213,7 +214,7 @@ public class SandPaperItem extends Item implements CustomUseEffectsItem {
CompoundTag tag = stack.getOrCreateTag();
if (tag.contains("Polishing")) {
ItemStack polishing = ItemStack.of(tag.getCompound("Polishing"));
entity.spawnItemParticles(polishing, 1);
((LivingEntityAccessor) entity).create$callSpawnItemParticles(polishing, 1);
}
// After 6 ticks play the sound every 7th
@ -238,14 +239,9 @@ public class SandPaperItem extends Item implements CustomUseEffectsItem {
return 32;
}
@Override
public int getItemEnchantability(ItemStack stack) {
return 1;
}
@Override
public int getEnchantmentValue() {
return 5;
return 1;
}
@Override

Some files were not shown because too many files have changed in this diff Show more