Merge remote-tracking branch 'origin/mc1.16/dev' into mc1.16/chromatic-projector

# Conflicts:
#	src/generated/resources/assets/create/lang/en_us.json
#	src/main/java/com/simibubi/create/AllBlocks.java
#	src/main/java/com/simibubi/create/AllTileEntities.java
#	src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerTileEntity.java
#	src/main/java/com/simibubi/create/foundation/gui/AllIcons.java
#	src/main/java/com/simibubi/create/foundation/networking/AllPackets.java
#	src/main/resources/assets/create/textures/gui/icons.png
#	src/main/resources/create.mixins.json
This commit is contained in:
JozsefA 2021-05-22 18:01:01 -07:00
commit 341a385628
954 changed files with 6641 additions and 1097 deletions

View file

@ -16,6 +16,7 @@ indent_size = 2
[*.java]
indent_style = tab
ij_continuation_indent_size = 8
ij_java_class_count_to_use_import_on_demand = 99
ij_java_names_count_to_use_import_on_demand = 99
ij_java_imports_layout = $*,|,java.**,|,javax.**,|,org.**,|,com.**,|,*
ij_java_imports_layout = $*,|,java.**,|,javax.**,|,org.**,|,com.**,|,*

View file

@ -116,7 +116,7 @@ configurations {
dependencies {
minecraft "net.minecraftforge:forge:${minecraft_version}-${forge_version}"
def registrate = "com.tterrag.registrate:Registrate:MC1.16.2-${registrate_version}"
def registrate = "com.tterrag.registrate:Registrate:MC1.16.5-${registrate_version}"
implementation fg.deobf(registrate)
shade registrate

View file

@ -9,7 +9,7 @@ minecraft_version=1.16.5
forge_version=36.0.42
# dependency versions
registrate_version=1.0.0-beta.33
registrate_version=1.0.4
jei_version=7.6.1.71
# curseforge information

View file

@ -53,6 +53,7 @@ b59324f051f21d8ce1a48a08f4721a61a3c414d6 assets/create/blockstates/chute.json
e5e3757e99c139d67b2a70288466d8a74d818841 assets/create/blockstates/cogwheel.json
36f54136a7756c97f71bc6b47ef4e8e575e72879 assets/create/blockstates/content_observer.json
cfea7283f0ebd2432d67e80a523f2a12e24c0bd5 assets/create/blockstates/controller_rail.json
961b615124ea9a5a5735e8a79f81a702de7da2cf assets/create/blockstates/copper_backtank.json
f8eff64c75fc599e9a44a003f54ae9931cd8ce7c assets/create/blockstates/copper_block.json
cabf6b8c59eb0e3d56a0a5a856ca058bb3200882 assets/create/blockstates/copper_casing.json
3355a852cdc717e257ca19b3db836068964733e3 assets/create/blockstates/copper_ore.json
@ -406,21 +407,21 @@ a3a11524cd3515fc01d905767b4b7ea782adaf03 assets/create/blockstates/yellow_seat.j
6801fa1f466f172700e573e5b8ee8ee5f9ca4583 assets/create/blockstates/yellow_valve_handle.json
7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json
b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json
0e10e87986a76f18efeb1255f2c025d1aad8f8fa assets/create/lang/en_ud.json
949bac58ef9534024eac6d9082f5d241ce5b91f3 assets/create/lang/en_us.json
26ab60b925659e6daac2e449267d202c68cafe94 assets/create/lang/unfinished/de_de.json
78086e1c23ce96db3a9ec3d304d7418f39ed96fa assets/create/lang/unfinished/es_es.json
62fcca040385405c7655ea6e4b524b2a5e652e4c assets/create/lang/unfinished/es_mx.json
0f527cc6472caec6ec090985c5000e6f7f93208f assets/create/lang/unfinished/fr_fr.json
812f7e66a1d5a06a7b81a41216ee2151e678db69 assets/create/lang/unfinished/it_it.json
8122ad97eac98b1f549a08e623066be1ffd3a29e assets/create/lang/unfinished/ja_jp.json
2c3a1bd28a6a08bec850cc36735204c59045b188 assets/create/lang/unfinished/ko_kr.json
27559156601b57cc2e9fae07a92c7f79a7f4e473 assets/create/lang/unfinished/nl_nl.json
f401f044ec0785b9399d29d2a82f0f998a2a4db7 assets/create/lang/unfinished/pl_pl.json
fa22d8055979012a45a6648009ef0094be4560d8 assets/create/lang/unfinished/pt_br.json
d1b6b069a4547c107c58af4f8837f3cc843e1613 assets/create/lang/unfinished/ru_ru.json
b1650c7805cfe03c6b3b9d43f96964b695f55415 assets/create/lang/unfinished/zh_cn.json
8052350b58969035d456f882fa5624ee16a0024c assets/create/lang/unfinished/zh_tw.json
a6d814f94926d88764c38862cc4ece9c367e023b assets/create/lang/en_ud.json
d1838140c8383ee4537db90eb8f657d0c268fe91 assets/create/lang/en_us.json
4fcda300efe5a2ad8695b5ae3f24a54ea109a954 assets/create/lang/unfinished/de_de.json
6a1dde57b2224d4b0287ebc705d6a75d329b5e1f assets/create/lang/unfinished/es_es.json
93ee0e30a56b405a9e766d353c36276e36a84b5c assets/create/lang/unfinished/es_mx.json
49a691320c73e09f921cd0ea97398126231e99fa assets/create/lang/unfinished/fr_fr.json
cf14b3828b6c11013f606f277d88fb63245bb2a8 assets/create/lang/unfinished/it_it.json
73c1c1489833cbcb28bb1ce90541c8c8bdf329c0 assets/create/lang/unfinished/ja_jp.json
924303b9bcf56aedbbfc46108655f71324308e12 assets/create/lang/unfinished/ko_kr.json
079aea6843e756efbfca0976983be1957863717c assets/create/lang/unfinished/nl_nl.json
b7bab15167400ee48a9728f81446e572c494fd8d assets/create/lang/unfinished/pl_pl.json
07e84cc3eee3faa1ab3d26e0c85c7f09c8573368 assets/create/lang/unfinished/pt_br.json
6ffb0cf20d712aee23a42a9ec440dd7dc92293d6 assets/create/lang/unfinished/ru_ru.json
0ae98a18e59f478da41d8c5d832737b65f6a8c8a assets/create/lang/unfinished/zh_cn.json
4c96e5a76e72368a59190b7588d389fdd2cc75e1 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
@ -1261,6 +1262,7 @@ c1da21be9f1af4f7a2ef4ec9cd92195d65ada316 assets/create/models/item/clockwork_bea
dcb09deae110077bcddf090996b51cc66e9a7de3 assets/create/models/item/cogwheel.json
7717e3b21cff39f497f07687c70c1fa40eaa756d assets/create/models/item/content_observer.json
9dbd63c9e1b09a663fd4b83d76e3ab5967086167 assets/create/models/item/controller_rail.json
10397036fc0bb1e18a767cfd7b19b10d805a83fe assets/create/models/item/copper_backtank.json
965a90a882d85dba93b30af9bce7ecf8e68ce747 assets/create/models/item/copper_block.json
759bcb5fe7dfdd628716f9b4ff19a5ab00393381 assets/create/models/item/copper_casing.json
c2a320162daa2d24cef969d1d14a0cbd55eb574f assets/create/models/item/copper_ingot.json
@ -1317,6 +1319,8 @@ a215bca75c32124c4cb070065967de1d56c6c57f assets/create/models/item/diorite_cobbl
645a16dfb3619cedf2046e1d0869a27394e6460a assets/create/models/item/diorite_cobblestone_stairs.json
32ebea959ce34458ac2f5ae105f9b415ab18ae4c assets/create/models/item/diorite_cobblestone_wall.json
e0ecc0a20cf9dd54ccfc48e0041d5220b2c8316e assets/create/models/item/diorite_pillar.json
6006f88e56d74a3fd75a9dddb25af39075e0482b assets/create/models/item/diving_boots.json
df8cfe7e8eb527329094396e11222e9097e309d7 assets/create/models/item/diving_helmet.json
1bd32eb16dee4bbf313a8813a7f1461ea5feeffe assets/create/models/item/dolomite.json
4c5e12f1acb8c4abc24b9dd80e5cbbf3a5cbd89c assets/create/models/item/dolomite_bricks.json
ebb596ce665b085e501ee2fd9a5371ce53e40553 assets/create/models/item/dolomite_bricks_slab.json
@ -1647,8 +1651,8 @@ d080b1b25e5bc8baf5aee68691b08c7f12ece3b0 assets/create/models/item/windmill_bear
866fbb0ce2878a73e0440d1caf6534c8bd7c384f assets/create/models/item/zinc_ingot.json
a80fb25a0b655e76be986b5b49fcb0f03461a1ab assets/create/models/item/zinc_nugget.json
b1689617190c05ef34bd18456b0c7ae09bb3210f assets/create/models/item/zinc_ore.json
7b73f40a65af0c2288c886928c609ec783c0fc40 assets/create/sounds.json
0f1b4b980afba9bf2caf583b88e261bba8b10313 data/create/advancements/aesthetics.json
096382a4c025b5ffdde9c496ee9da0d5345fbe17 assets/create/sounds.json
5d0cc4c0255dc241e61c173b31ddca70c88d08e4 data/create/advancements/aesthetics.json
187921fa131b06721bfaf63f2623a28c141aae9a data/create/advancements/andesite_alloy.json
0ea2db7173b5be28b289ea7c9a6a0cf5805c60c7 data/create/advancements/andesite_casing.json
83c046bd200623933545c9e4326f782fb02c87fa data/create/advancements/arm_blaze_burner.json
@ -1769,6 +1773,9 @@ c33e122c534a7a134f69faa36446ce7564d8a705 data/create/advancements/recipes/buildi
c368cadffa9177fefb9e92ff4453b40bc8dd670d data/create/advancements/recipes/create.base/blasting/copper_ingot_from_ore.json
8fffce2a5c5dd88d52e3b006fa92fb18cf2f1571 data/create/advancements/recipes/create.base/blasting/zinc_ingot_from_crushed.json
4bb60ef5e186f12a9d52e61319db8c78300c64ab data/create/advancements/recipes/create.base/blasting/zinc_ingot_from_ore.json
d1d8cf6e1c95b7d99bf873fa6fee033103f995fd data/create/advancements/recipes/create.base/crafting/appliances/copper_backtank.json
46c04e685ab345a80598176f7ac68a044a76cd76 data/create/advancements/recipes/create.base/crafting/appliances/diving_boots.json
5f06b7dcf2af11f30c2e10ade4ac3fd172bc04df data/create/advancements/recipes/create.base/crafting/appliances/diving_helmet.json
dd487f98c411f1ff22cb7fc208b8cc24b27deb2f data/create/advancements/recipes/create.base/crafting/appliances/dough.json
51cdcf168087f47e4458eed7543d227da1ee5ca0 data/create/advancements/recipes/create.base/crafting/appliances/tree_fertilizer.json
d531f87f425d199aee4777a588c1cd6cab6f5173 data/create/advancements/recipes/create.base/crafting/curiosities/minecart_coupling.json
@ -2420,6 +2427,7 @@ d76113310fc56eca6382d44df174096f2210d416 data/create/loot_tables/blocks/clutch.j
673ba3a5deae9133b917d16c9eb87fe4c2873c8a data/create/loot_tables/blocks/cogwheel.json
096af6b5df6e87d36cb936eea9b00982a554f4af data/create/loot_tables/blocks/content_observer.json
80c2cb21714651116a71f449368c06bb22e841ce data/create/loot_tables/blocks/controller_rail.json
662b8d41803ef166d20850653b36759de719206c data/create/loot_tables/blocks/copper_backtank.json
f38802b919c49f162f102d6e5d94113f05bf4ab1 data/create/loot_tables/blocks/copper_block.json
5a65a18ea787130ac7b8f5652bfa5ed187446649 data/create/loot_tables/blocks/copper_casing.json
31a51237763c374b7cdf39b9b62c14e965871047 data/create/loot_tables/blocks/copper_ore.json
@ -2718,7 +2726,7 @@ cecaac07bd275bb1ae9e302f0bf44b581e74105d data/create/loot_tables/blocks/rope_pul
aa6af37356d65105efab2503ffe75f778cfe873b data/create/loot_tables/blocks/rotation_speed_controller.json
30de11bec82606fead9d6bff7bba0232e97f1039 data/create/loot_tables/blocks/sail_frame.json
069701cb804b6522c18624a0d4f3f949ff8b0281 data/create/loot_tables/blocks/schematic_table.json
c4a89145334addfd0dd1fedf7fa75ba07a7d3490 data/create/loot_tables/blocks/schematicannon.json
a2b172dc749176d4df34729007019605fc6dd150 data/create/loot_tables/blocks/schematicannon.json
af1bbbb8236b4ab05a6a8edc6db960bc758cbdf3 data/create/loot_tables/blocks/scoria.json
bb670ac5dd2fa4c743bc268cd0547926eb6cdb68 data/create/loot_tables/blocks/scoria_bricks.json
a7217ea301a282d0ef52f2d8c06dd8683398408d data/create/loot_tables/blocks/scoria_bricks_slab.json
@ -2837,6 +2845,9 @@ f7879d404d7a848d818278b4e788f285a9087e63 data/create/recipes/compacting/blaze_ca
27c23592d8fec03072a04544d3598ca9b1c798ff data/create/recipes/compacting/chocolate.json
7b2ef15dd28d1d8a450ea49a82dfb361d1adde4c data/create/recipes/compacting/diorite_from_flint.json
7657603e95ccf83dd0d4b104635db66e531d092a data/create/recipes/compacting/granite_from_flint.json
30030b15caa11b3a7c0104adb62fe74e8c7c0df1 data/create/recipes/crafting/appliances/copper_backtank.json
9ad82ac5ce02654b7af7f1a570a6b2c01e140da3 data/create/recipes/crafting/appliances/diving_boots.json
813081c6421b34e161ec44e8e470994c282f76be data/create/recipes/crafting/appliances/diving_helmet.json
19526da3a59fc136654ff1bc93c0251581f397a9 data/create/recipes/crafting/appliances/dough.json
7b5f863dda3d05a79cb85943a178eba0bd8a7dc7 data/create/recipes/crafting/appliances/slime_ball.json
b159ba84428eee6ef6e23df1766f2a18f2c8a63e data/create/recipes/crafting/appliances/tree_fertilizer.json
@ -3634,7 +3645,7 @@ d3fdb8ece6cb072a93ddb64a0baad5ac952117a4 data/create/recipes/weathered_limestone
0f3c993eb6dd3f37953f304b8fad15bf60469ef4 data/create/recipes/weathered_limestone_cobblestone_wall_from_weathered_limestone_cobblestone_stonecutting.json
6eceb25fabbb6b389ca35de3b829ad061c9c456a data/create/recipes/weathered_limestone_pillar.json
11667414f73bc2d00bda7c5c1a7d2934bf6e9165 data/create/recipes/weathered_limestone_pillar_from_weathered_limestone_stonecutting.json
eedf31af7134d03656c5fa57229982f9c5bed07c data/create/tags/blocks/brittle.json
20c20a12b0baff2ba493b1405db7d2d8a15b81af data/create/tags/blocks/brittle.json
330bfb3850ba3964b10b1bccbc3cbb9b012cae54 data/create/tags/blocks/fan_heaters.json
3bc64e3a1e7980237435b1770a9ba2102d57fcd4 data/create/tags/blocks/fan_transparent.json
74700d556ca80c7a1db5fd4efb09c3ddb26cad66 data/create/tags/blocks/non_movable.json

View file

@ -0,0 +1,34 @@
{
"variants": {
"facing=north,waterlogged=false": {
"model": "create:block/copper_backtank/block"
},
"facing=south,waterlogged=false": {
"model": "create:block/copper_backtank/block",
"y": 180
},
"facing=west,waterlogged=false": {
"model": "create:block/copper_backtank/block",
"y": 270
},
"facing=east,waterlogged=false": {
"model": "create:block/copper_backtank/block",
"y": 90
},
"facing=north,waterlogged=true": {
"model": "create:block/copper_backtank/block"
},
"facing=south,waterlogged=true": {
"model": "create:block/copper_backtank/block",
"y": 180
},
"facing=west,waterlogged=true": {
"model": "create:block/copper_backtank/block",
"y": 270
},
"facing=east,waterlogged=true": {
"model": "create:block/copper_backtank/block",
"y": 90
}
}
}

View file

@ -55,6 +55,7 @@
"block.create.cogwheel": "\u05DF\u01DD\u01DD\u0265\u028Dbo\u0186",
"block.create.content_observer": "\u0279\u01DD\u028C\u0279\u01DDsqO \u0287u\u01DD\u0287uo\u0186",
"block.create.controller_rail": "\u05DF\u0131\u0250\u1D1A \u0279\u01DD\u05DF\u05DFo\u0279\u0287uo\u0186",
"block.create.copper_backtank": "\u029Eu\u0250\u0287\u029E\u0254\u0250\u15FA \u0279\u01DDddo\u0186",
"block.create.copper_block": "\u0279\u01DDddo\u0186 \u025Fo \u029E\u0254o\u05DF\u15FA",
"block.create.copper_casing": "bu\u0131s\u0250\u0186 \u0279\u01DDddo\u0186",
"block.create.copper_ore": "\u01DD\u0279O \u0279\u01DDddo\u0186",
@ -432,6 +433,7 @@
"item.create.chocolate_glazed_berries": "s\u01DD\u0131\u0279\u0279\u01DD\u15FA p\u01DDz\u0250\u05DF\u2141 \u01DD\u0287\u0250\u05DFo\u0254o\u0265\u0186",
"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_ingot": "\u0287obuI \u0279\u01DDddo\u0186",
"item.create.copper_nugget": "\u0287\u01DDbbnN \u0279\u01DDddo\u0186",
"item.create.copper_sheet": "\u0287\u01DD\u01DD\u0265S \u0279\u01DDddo\u0186",
@ -450,6 +452,8 @@
"item.create.crushed_tin_ore": "\u01DD\u0279O u\u0131\u27D8 p\u01DD\u0265sn\u0279\u0186",
"item.create.crushed_uranium_ore": "\u01DD\u0279O \u026Fn\u0131u\u0250\u0279\u2229 p\u01DD\u0265sn\u0279\u0186",
"item.create.crushed_zinc_ore": "\u01DD\u0279O \u0254u\u0131Z p\u01DD\u0265sn\u0279\u0186",
"item.create.diving_boots": "s\u0287oo\u15FA bu\u0131\u028C\u0131\u15E1",
"item.create.diving_helmet": "\u0287\u01DD\u026F\u05DF\u01DDH bu\u0131\u028C\u0131\u15E1",
"item.create.dough": "\u0265bno\u15E1",
"item.create.electron_tube": "\u01DDqn\u27D8 uo\u0279\u0287\u0254\u01DD\u05DF\u018E",
"item.create.empty_blaze_burner": "\u0279\u01DDu\u0279n\u15FA \u01DDz\u0250\u05DF\u15FA \u028E\u0287d\u026F\u018E",

View file

@ -41,27 +41,28 @@
"block.create.brass_funnel": "Brass Funnel",
"block.create.brass_tunnel": "Brass Tunnel",
"block.create.brown_sail": "Brown Sail",
"block.create.brown_seat": "Brown Seat",
"block.create.brown_valve_handle": "Brown Valve Handle",
"block.create.cart_assembler": "Cart Assembler",
"block.create.chiseled_dark_scoria": "Chiseled Dark Scoria",
"block.create.chiseled_dolomite": "Chiseled Dolomite",
"block.create.chiseled_gabbro": "Chiseled Gabbro",
"block.create.chiseled_limestone": "Chiseled Limestone",
"block.create.chiseled_scoria": "Chiseled Scoria",
"block.create.chiseled_weathered_limestone": "Chiseled Weathered Limestone",
"block.create.chocolate": "Chocolate",
"block.create.brown_seat": "Brown Seat",
"block.create.brown_valve_handle": "Brown Valve Handle",
"block.create.cart_assembler": "Cart Assembler",
"block.create.chiseled_dark_scoria": "Chiseled Dark Scoria",
"block.create.chiseled_dolomite": "Chiseled Dolomite",
"block.create.chiseled_gabbro": "Chiseled Gabbro",
"block.create.chiseled_limestone": "Chiseled Limestone",
"block.create.chiseled_scoria": "Chiseled Scoria",
"block.create.chiseled_weathered_limestone": "Chiseled Weathered Limestone",
"block.create.chocolate": "Chocolate",
"block.create.chromatic_projector": "Chromatic Projector",
"block.create.chute": "Chute",
"block.create.clockwork_bearing": "Clockwork Bearing",
"block.create.clutch": "Clutch",
"block.create.cogwheel": "Cogwheel",
"block.create.content_observer": "Content Observer",
"block.create.controller_rail": "Controller Rail",
"block.create.copper_block": "Block of Copper",
"block.create.copper_casing": "Copper Casing",
"block.create.copper_ore": "Copper Ore",
"block.create.copper_shingles": "Copper Shingles",
"block.create.chute": "Chute",
"block.create.clockwork_bearing": "Clockwork Bearing",
"block.create.clutch": "Clutch",
"block.create.cogwheel": "Cogwheel",
"block.create.content_observer": "Content Observer",
"block.create.controller_rail": "Controller Rail",
"block.create.copper_backtank": "Copper Backtank",
"block.create.copper_block": "Block of Copper",
"block.create.copper_casing": "Copper Casing",
"block.create.copper_ore": "Copper Ore",
"block.create.copper_shingles": "Copper Shingles",
"block.create.copper_tiles": "Copper Tiles",
"block.create.copper_valve_handle": "Copper Valve Handle",
"block.create.creative_crate": "Creative Crate",
@ -438,6 +439,7 @@
"item.create.chocolate_glazed_berries": "Chocolate Glazed Berries",
"item.create.chromatic_compound": "Chromatic Compound",
"item.create.cinder_flour": "Cinder Flour",
"item.create.copper_backtank": "Copper Backtank",
"item.create.copper_ingot": "Copper Ingot",
"item.create.copper_nugget": "Copper Nugget",
"item.create.copper_sheet": "Copper Sheet",
@ -456,6 +458,8 @@
"item.create.crushed_tin_ore": "Crushed Tin Ore",
"item.create.crushed_uranium_ore": "Crushed Uranium Ore",
"item.create.crushed_zinc_ore": "Crushed Zinc Ore",
"item.create.diving_boots": "Diving Boots",
"item.create.diving_helmet": "Diving Helmet",
"item.create.dough": "Dough",
"item.create.electron_tube": "Electron Tube",
"item.create.empty_blaze_burner": "Empty Blaze Burner",
@ -678,6 +682,7 @@
"create.recipe.fan_blasting.fan": "Fan behind Lava",
"create.recipe.pressing": "Pressing",
"create.recipe.mixing": "Mixing",
"create.recipe.deploying": "Deploying",
"create.recipe.automatic_shapeless": "Automated Shapeless Crafting",
"create.recipe.automatic_brewing": "Automated Brewing",
"create.recipe.packing": "Compacting",
@ -1138,11 +1143,13 @@
"create.subtitle.mixing": "Mixing Noises",
"create.subtitle.mechanical_press_activation_belt": "Mechanical Press bonks",
"create.subtitle.worldshaper_place": "Worldshaper zaps",
"create.subtitle.deployer_polish": "Deployer applies polish",
"create.subtitle.depot_slide": "Item slides",
"create.subtitle.deny": "Declining boop",
"create.subtitle.blaze_munch": "Blaze Burner munches",
"create.subtitle.schematicannon_launch_block": "Schematicannon fires",
"create.subtitle.funnel_flap": "Funnel Flaps",
"create.subtitle.copper_armor_equip": "Diving equipment clinks",
"create.subtitle.schematicannon_finish": "Schematicannon dings",
"create.subtitle.scroll_value": "Scroll-input clicks",
"create.subtitle.mechanical_press_activation": "Mechanical Press clangs",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 935",
"_": "Missing Localizations: 942",
"_": "->------------------------] Game Elements [------------------------<-",
@ -58,6 +58,7 @@
"block.create.cogwheel": "Zahnrad",
"block.create.content_observer": "Inhaltsbeobachter",
"block.create.controller_rail": "Steuerungsschiene",
"block.create.copper_backtank": "UNLOCALIZED: Copper Backtank",
"block.create.copper_block": "Kupfer Block",
"block.create.copper_casing": "Kupferrahmen",
"block.create.copper_ore": "Kupfererz",
@ -438,6 +439,7 @@
"item.create.chocolate_glazed_berries": "Schokoladenglasierte Beeren",
"item.create.chromatic_compound": "Chromatische Verbindung",
"item.create.cinder_flour": "Aschenmehl",
"item.create.copper_backtank": "UNLOCALIZED: Copper Backtank",
"item.create.copper_ingot": "Kupferbarren",
"item.create.copper_nugget": "Kupferklumpen",
"item.create.copper_sheet": "Kupferblech",
@ -456,6 +458,8 @@
"item.create.crushed_tin_ore": "Zerkleinertes Zinnerz",
"item.create.crushed_uranium_ore": "Zerkleinertes Uranerz",
"item.create.crushed_zinc_ore": "Zerkleinertes Zinkerz",
"item.create.diving_boots": "UNLOCALIZED: Diving Boots",
"item.create.diving_helmet": "UNLOCALIZED: Diving Helmet",
"item.create.dough": "Teig",
"item.create.electron_tube": "Elektronenröhre",
"item.create.empty_blaze_burner": "Leerer Lohenbrenner",
@ -678,6 +682,7 @@
"create.recipe.fan_blasting.fan": "Propeller hinter Lava",
"create.recipe.pressing": "Mechanische Presse",
"create.recipe.mixing": "Mixen",
"create.recipe.deploying": "UNLOCALIZED: Deploying",
"create.recipe.automatic_shapeless": "Automatisiertes Formloses Bauen",
"create.recipe.automatic_brewing": "Automatisiertes Brauen",
"create.recipe.packing": "Komprimieren",
@ -1138,11 +1143,13 @@
"create.subtitle.mixing": "UNLOCALIZED: Mixing Noises",
"create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks",
"create.subtitle.worldshaper_place": "UNLOCALIZED: Worldshaper zaps",
"create.subtitle.deployer_polish": "UNLOCALIZED: Deployer applies polish",
"create.subtitle.depot_slide": "UNLOCALIZED: Item slides",
"create.subtitle.deny": "UNLOCALIZED: Declining boop",
"create.subtitle.blaze_munch": "Lohe kaut glücklich",
"create.subtitle.schematicannon_launch_block": "Bauplankanone schießt",
"create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps",
"create.subtitle.copper_armor_equip": "UNLOCALIZED: Diving equipment clinks",
"create.subtitle.schematicannon_finish": "Bauplankanone endet",
"create.subtitle.scroll_value": "UNLOCALIZED: Scroll-input clicks",
"create.subtitle.mechanical_press_activation": "Mechanische Presse wird aktiviert",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 636",
"_": "Missing Localizations: 643",
"_": "->------------------------] Game Elements [------------------------<-",
@ -58,6 +58,7 @@
"block.create.cogwheel": "Rueda dentada",
"block.create.content_observer": "Observador de contenidos",
"block.create.controller_rail": "Raíl de control",
"block.create.copper_backtank": "UNLOCALIZED: Copper Backtank",
"block.create.copper_block": "Bloque de cobre",
"block.create.copper_casing": "Revestidor de caliza",
"block.create.copper_ore": "Mineral de cobre",
@ -438,6 +439,7 @@
"item.create.chocolate_glazed_berries": "UNLOCALIZED: Chocolate Glazed Berries",
"item.create.chromatic_compound": "Compuesto cromático",
"item.create.cinder_flour": "Harina de ceniza",
"item.create.copper_backtank": "UNLOCALIZED: Copper Backtank",
"item.create.copper_ingot": "Lingote de cobre",
"item.create.copper_nugget": "Pepita de cobre",
"item.create.copper_sheet": "Lámina de cobre",
@ -456,6 +458,8 @@
"item.create.crushed_tin_ore": "Mineral de estaño molido",
"item.create.crushed_uranium_ore": "Mineral de uranio molido",
"item.create.crushed_zinc_ore": "Mineral de zinc molido",
"item.create.diving_boots": "UNLOCALIZED: Diving Boots",
"item.create.diving_helmet": "UNLOCALIZED: Diving Helmet",
"item.create.dough": "Masilla",
"item.create.electron_tube": "Tubo de electrones",
"item.create.empty_blaze_burner": "Quemador de Blaze vacío",
@ -678,6 +682,7 @@
"create.recipe.fan_blasting.fan": "Ventilador detrás de la lava",
"create.recipe.pressing": "Prensando",
"create.recipe.mixing": "Mezclando",
"create.recipe.deploying": "UNLOCALIZED: Deploying",
"create.recipe.automatic_shapeless": "Elaboración automatizada de productos sin forma",
"create.recipe.automatic_brewing": "Elaboración de cerveza automatizada",
"create.recipe.packing": "Compactando",
@ -1138,11 +1143,13 @@
"create.subtitle.mixing": "UNLOCALIZED: Mixing Noises",
"create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks",
"create.subtitle.worldshaper_place": "UNLOCALIZED: Worldshaper zaps",
"create.subtitle.deployer_polish": "UNLOCALIZED: Deployer applies polish",
"create.subtitle.depot_slide": "UNLOCALIZED: Item slides",
"create.subtitle.deny": "UNLOCALIZED: Declining boop",
"create.subtitle.blaze_munch": "Blaze mastica felizmente",
"create.subtitle.schematicannon_launch_block": "Disparos de Schematicannon",
"create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps",
"create.subtitle.copper_armor_equip": "UNLOCALIZED: Diving equipment clinks",
"create.subtitle.schematicannon_finish": "Acabados de Schematicannon",
"create.subtitle.scroll_value": "UNLOCALIZED: Scroll-input clicks",
"create.subtitle.mechanical_press_activation": "La Prensa Mecánica se activa",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 1259",
"_": "Missing Localizations: 1266",
"_": "->------------------------] Game Elements [------------------------<-",
@ -58,6 +58,7 @@
"block.create.cogwheel": "Rueda Dentada",
"block.create.content_observer": "Observador de Contenido",
"block.create.controller_rail": "Vía de Control",
"block.create.copper_backtank": "UNLOCALIZED: Copper Backtank",
"block.create.copper_block": "Bloque de Cobre",
"block.create.copper_casing": "Carcasa de Cobre",
"block.create.copper_ore": "Mineral de Cobre",
@ -438,6 +439,7 @@
"item.create.chocolate_glazed_berries": "UNLOCALIZED: Chocolate Glazed Berries",
"item.create.chromatic_compound": "Compuesto Cromático",
"item.create.cinder_flour": "Ceniza Molida",
"item.create.copper_backtank": "UNLOCALIZED: Copper Backtank",
"item.create.copper_ingot": "Lingote de Cobre",
"item.create.copper_nugget": "Pepita de Cobre",
"item.create.copper_sheet": "Lámina de Cobre",
@ -456,6 +458,8 @@
"item.create.crushed_tin_ore": "Mineral de Estaño Molido",
"item.create.crushed_uranium_ore": "Mineral de Uranio Molido",
"item.create.crushed_zinc_ore": "Mineral de Zinc Molido",
"item.create.diving_boots": "UNLOCALIZED: Diving Boots",
"item.create.diving_helmet": "UNLOCALIZED: Diving Helmet",
"item.create.dough": "Masa",
"item.create.electron_tube": "Válvula Electrónica",
"item.create.empty_blaze_burner": "Quemador de Blaze Vacío",
@ -678,6 +682,7 @@
"create.recipe.fan_blasting.fan": "UNLOCALIZED: Fan behind Lava",
"create.recipe.pressing": "UNLOCALIZED: Pressing",
"create.recipe.mixing": "UNLOCALIZED: Mixing",
"create.recipe.deploying": "UNLOCALIZED: Deploying",
"create.recipe.automatic_shapeless": "UNLOCALIZED: Automated Shapeless Crafting",
"create.recipe.automatic_brewing": "UNLOCALIZED: Automated Brewing",
"create.recipe.packing": "UNLOCALIZED: Compacting",
@ -1138,11 +1143,13 @@
"create.subtitle.mixing": "UNLOCALIZED: Mixing Noises",
"create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks",
"create.subtitle.worldshaper_place": "UNLOCALIZED: Worldshaper zaps",
"create.subtitle.deployer_polish": "UNLOCALIZED: Deployer applies polish",
"create.subtitle.depot_slide": "UNLOCALIZED: Item slides",
"create.subtitle.deny": "UNLOCALIZED: Declining boop",
"create.subtitle.blaze_munch": "UNLOCALIZED: Blaze Burner munches",
"create.subtitle.schematicannon_launch_block": "UNLOCALIZED: Schematicannon fires",
"create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps",
"create.subtitle.copper_armor_equip": "UNLOCALIZED: Diving equipment clinks",
"create.subtitle.schematicannon_finish": "UNLOCALIZED: Schematicannon dings",
"create.subtitle.scroll_value": "UNLOCALIZED: Scroll-input clicks",
"create.subtitle.mechanical_press_activation": "UNLOCALIZED: Mechanical Press clangs",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 1187",
"_": "Missing Localizations: 1194",
"_": "->------------------------] Game Elements [------------------------<-",
@ -58,6 +58,7 @@
"block.create.cogwheel": "Roue dentée",
"block.create.content_observer": "Observateur de contenu",
"block.create.controller_rail": "Rails controlleurs",
"block.create.copper_backtank": "UNLOCALIZED: Copper Backtank",
"block.create.copper_block": "Bloc de cuivre",
"block.create.copper_casing": "Revêtement en cuivre",
"block.create.copper_ore": "Minerai de cuivre",
@ -438,6 +439,7 @@
"item.create.chocolate_glazed_berries": "UNLOCALIZED: Chocolate Glazed Berries",
"item.create.chromatic_compound": "Composé chromatique",
"item.create.cinder_flour": "Farine de braise",
"item.create.copper_backtank": "UNLOCALIZED: Copper Backtank",
"item.create.copper_ingot": "Lingot de cuivre",
"item.create.copper_nugget": "Pépite de cuivre",
"item.create.copper_sheet": "Plaques de cuivre",
@ -456,6 +458,8 @@
"item.create.crushed_tin_ore": "Etain concassé",
"item.create.crushed_uranium_ore": "Uranium concassé",
"item.create.crushed_zinc_ore": "Zinc concassé",
"item.create.diving_boots": "UNLOCALIZED: Diving Boots",
"item.create.diving_helmet": "UNLOCALIZED: Diving Helmet",
"item.create.dough": "Pâte",
"item.create.electron_tube": "Tube électronique",
"item.create.empty_blaze_burner": "Brûleur à blaze vide",
@ -678,6 +682,7 @@
"create.recipe.fan_blasting.fan": "Ventilateur derrière de la lave",
"create.recipe.pressing": "Pressage",
"create.recipe.mixing": "Mixage",
"create.recipe.deploying": "UNLOCALIZED: Deploying",
"create.recipe.automatic_shapeless": "UNLOCALIZED: Automated Shapeless Crafting",
"create.recipe.automatic_brewing": "Alchimie automatisée",
"create.recipe.packing": "Compactage",
@ -1138,11 +1143,13 @@
"create.subtitle.mixing": "UNLOCALIZED: Mixing Noises",
"create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks",
"create.subtitle.worldshaper_place": "UNLOCALIZED: Worldshaper zaps",
"create.subtitle.deployer_polish": "UNLOCALIZED: Deployer applies polish",
"create.subtitle.depot_slide": "UNLOCALIZED: Item slides",
"create.subtitle.deny": "UNLOCALIZED: Declining boop",
"create.subtitle.blaze_munch": "UNLOCALIZED: Blaze Burner munches",
"create.subtitle.schematicannon_launch_block": "Tir de schémacanon",
"create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps",
"create.subtitle.copper_armor_equip": "UNLOCALIZED: Diving equipment clinks",
"create.subtitle.schematicannon_finish": "Fin de schémacanon",
"create.subtitle.scroll_value": "UNLOCALIZED: Scroll-input clicks",
"create.subtitle.mechanical_press_activation": "Activation de la presse mechanique",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 653",
"_": "Missing Localizations: 660",
"_": "->------------------------] Game Elements [------------------------<-",
@ -58,6 +58,7 @@
"block.create.cogwheel": "Ruota dentata",
"block.create.content_observer": "Osservatore dei contenuti",
"block.create.controller_rail": "Binario di controllo",
"block.create.copper_backtank": "UNLOCALIZED: Copper Backtank",
"block.create.copper_block": "Blocco di rame",
"block.create.copper_casing": "Involucro di rame",
"block.create.copper_ore": "Rame grezzo",
@ -438,6 +439,7 @@
"item.create.chocolate_glazed_berries": "UNLOCALIZED: Chocolate Glazed Berries",
"item.create.chromatic_compound": "Composto cromatico",
"item.create.cinder_flour": "Cenere farinosa",
"item.create.copper_backtank": "UNLOCALIZED: Copper Backtank",
"item.create.copper_ingot": "Lingotto di rame",
"item.create.copper_nugget": "Pepita di rame",
"item.create.copper_sheet": "Lamiera di rame",
@ -456,6 +458,8 @@
"item.create.crushed_tin_ore": "Stagno grezzo frantumato",
"item.create.crushed_uranium_ore": "Uranio grezzo frantumato",
"item.create.crushed_zinc_ore": "Zinco grezzo frantumato",
"item.create.diving_boots": "UNLOCALIZED: Diving Boots",
"item.create.diving_helmet": "UNLOCALIZED: Diving Helmet",
"item.create.dough": "Impasto",
"item.create.electron_tube": "Valvola",
"item.create.empty_blaze_burner": "Inceneritore di blaze vuoto",
@ -678,6 +682,7 @@
"create.recipe.fan_blasting.fan": "Ventilatore dietro la lava",
"create.recipe.pressing": "Pressatura",
"create.recipe.mixing": "Mescolamento",
"create.recipe.deploying": "UNLOCALIZED: Deploying",
"create.recipe.automatic_shapeless": "Costruzione informe automatizzata",
"create.recipe.automatic_brewing": "Fermentazione automatica",
"create.recipe.packing": "Compattazione",
@ -1138,11 +1143,13 @@
"create.subtitle.mixing": "UNLOCALIZED: Mixing Noises",
"create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks",
"create.subtitle.worldshaper_place": "UNLOCALIZED: Worldshaper zaps",
"create.subtitle.deployer_polish": "UNLOCALIZED: Deployer applies polish",
"create.subtitle.depot_slide": "UNLOCALIZED: Item slides",
"create.subtitle.deny": "UNLOCALIZED: Declining boop",
"create.subtitle.blaze_munch": "Il blaze lo gusta felicemente",
"create.subtitle.schematicannon_launch_block": "Tiri del cannoneschematico",
"create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps",
"create.subtitle.copper_armor_equip": "UNLOCALIZED: Diving equipment clinks",
"create.subtitle.schematicannon_finish": "Finiture cannoneschematico",
"create.subtitle.scroll_value": "UNLOCALIZED: Scroll-input clicks",
"create.subtitle.mechanical_press_activation": "Pressa meccanica attiva",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 17",
"_": "Missing Localizations: 24",
"_": "->------------------------] Game Elements [------------------------<-",
@ -58,6 +58,7 @@
"block.create.cogwheel": "歯車",
"block.create.content_observer": "コンテンツオブザーバー",
"block.create.controller_rail": "コントローラーレール",
"block.create.copper_backtank": "UNLOCALIZED: Copper Backtank",
"block.create.copper_block": "銅ブロック",
"block.create.copper_casing": "銅ケーシング",
"block.create.copper_ore": "銅鉱石",
@ -438,6 +439,7 @@
"item.create.chocolate_glazed_berries": "チョコレートグレーズドベリー",
"item.create.chromatic_compound": "色彩の化合物",
"item.create.cinder_flour": "ネザーラックの粉",
"item.create.copper_backtank": "UNLOCALIZED: Copper Backtank",
"item.create.copper_ingot": "銅インゴット",
"item.create.copper_nugget": "銅塊",
"item.create.copper_sheet": "銅板",
@ -456,6 +458,8 @@
"item.create.crushed_tin_ore": "砕いた錫鉱石",
"item.create.crushed_uranium_ore": "砕いたウラン鉱石",
"item.create.crushed_zinc_ore": "砕いた亜鉛鉱石",
"item.create.diving_boots": "UNLOCALIZED: Diving Boots",
"item.create.diving_helmet": "UNLOCALIZED: Diving Helmet",
"item.create.dough": "生地",
"item.create.electron_tube": "電子管",
"item.create.empty_blaze_burner": "空のブレイズバーナー",
@ -678,6 +682,7 @@
"create.recipe.fan_blasting.fan": "溶岩の奥のケース入りファン",
"create.recipe.pressing": "プレス",
"create.recipe.mixing": "混合",
"create.recipe.deploying": "UNLOCALIZED: Deploying",
"create.recipe.automatic_shapeless": "自動不定形クラフト",
"create.recipe.automatic_brewing": "自動醸造",
"create.recipe.packing": "圧縮",
@ -1138,11 +1143,13 @@
"create.subtitle.mixing": "混ぜる音",
"create.subtitle.mechanical_press_activation_belt": "メカニカルプレスがボンと鳴る",
"create.subtitle.worldshaper_place": "UNLOCALIZED: Worldshaper zaps",
"create.subtitle.deployer_polish": "UNLOCALIZED: Deployer applies polish",
"create.subtitle.depot_slide": "アイテムが滑る",
"create.subtitle.deny": "UNLOCALIZED: Declining boop",
"create.subtitle.blaze_munch": "ブレイズの咀嚼音",
"create.subtitle.schematicannon_launch_block": "概略図砲が発射する",
"create.subtitle.funnel_flap": "ファンネルがはためく",
"create.subtitle.copper_armor_equip": "UNLOCALIZED: Diving equipment clinks",
"create.subtitle.schematicannon_finish": "概略図砲が作業を終える",
"create.subtitle.scroll_value": "スクロールのカチカチ音",
"create.subtitle.mechanical_press_activation": "メカニカルプレスがガーンと鳴る",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 706",
"_": "Missing Localizations: 713",
"_": "->------------------------] Game Elements [------------------------<-",
@ -58,6 +58,7 @@
"block.create.cogwheel": "톱니바퀴",
"block.create.content_observer": "정보 감지기",
"block.create.controller_rail": "방향 레일",
"block.create.copper_backtank": "UNLOCALIZED: Copper Backtank",
"block.create.copper_block": "구리 블록",
"block.create.copper_casing": "구리 케이스",
"block.create.copper_ore": "구리 광석",
@ -438,6 +439,7 @@
"item.create.chocolate_glazed_berries": "UNLOCALIZED: Chocolate Glazed Berries",
"item.create.chromatic_compound": "색채 혼합물",
"item.create.cinder_flour": "잿가루",
"item.create.copper_backtank": "UNLOCALIZED: Copper Backtank",
"item.create.copper_ingot": "구리 주괴",
"item.create.copper_nugget": "구리 조각",
"item.create.copper_sheet": "구리 판",
@ -456,6 +458,8 @@
"item.create.crushed_tin_ore": "UNLOCALIZED: Crushed Tin Ore",
"item.create.crushed_uranium_ore": "UNLOCALIZED: Crushed Uranium Ore",
"item.create.crushed_zinc_ore": "분쇄된 아연 광석",
"item.create.diving_boots": "UNLOCALIZED: Diving Boots",
"item.create.diving_helmet": "UNLOCALIZED: Diving Helmet",
"item.create.dough": "반죽",
"item.create.electron_tube": "전지 튜브",
"item.create.empty_blaze_burner": "빈 블레이즈 버너",
@ -678,6 +682,7 @@
"create.recipe.fan_blasting.fan": "용암과 선풍기",
"create.recipe.pressing": "압착",
"create.recipe.mixing": "혼합",
"create.recipe.deploying": "UNLOCALIZED: Deploying",
"create.recipe.automatic_shapeless": "무형 자동 조합",
"create.recipe.automatic_brewing": "자동 양조",
"create.recipe.packing": "압축",
@ -1138,11 +1143,13 @@
"create.subtitle.mixing": "UNLOCALIZED: Mixing Noises",
"create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks",
"create.subtitle.worldshaper_place": "UNLOCALIZED: Worldshaper zaps",
"create.subtitle.deployer_polish": "UNLOCALIZED: Deployer applies polish",
"create.subtitle.depot_slide": "UNLOCALIZED: Item slides",
"create.subtitle.deny": "UNLOCALIZED: Declining boop",
"create.subtitle.blaze_munch": "블레이즈가 행복하게 섭취함",
"create.subtitle.schematicannon_launch_block": "청사진 대포가 발포함",
"create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps",
"create.subtitle.copper_armor_equip": "UNLOCALIZED: Diving equipment clinks",
"create.subtitle.schematicannon_finish": "청사진 대포가 끝남",
"create.subtitle.scroll_value": "UNLOCALIZED: Scroll-input clicks",
"create.subtitle.mechanical_press_activation": "압착기가 가동됨",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 1570",
"_": "Missing Localizations: 1577",
"_": "->------------------------] Game Elements [------------------------<-",
@ -58,6 +58,7 @@
"block.create.cogwheel": "Tandwiel",
"block.create.content_observer": "UNLOCALIZED: Content Observer",
"block.create.controller_rail": "UNLOCALIZED: Controller Rail",
"block.create.copper_backtank": "UNLOCALIZED: Copper Backtank",
"block.create.copper_block": "UNLOCALIZED: Block of Copper",
"block.create.copper_casing": "UNLOCALIZED: Copper Casing",
"block.create.copper_ore": "UNLOCALIZED: Copper Ore",
@ -438,6 +439,7 @@
"item.create.chocolate_glazed_berries": "UNLOCALIZED: Chocolate Glazed Berries",
"item.create.chromatic_compound": "UNLOCALIZED: Chromatic Compound",
"item.create.cinder_flour": "UNLOCALIZED: Cinder Flour",
"item.create.copper_backtank": "UNLOCALIZED: Copper Backtank",
"item.create.copper_ingot": "Koperstaaf",
"item.create.copper_nugget": "Koper klompje",
"item.create.copper_sheet": "UNLOCALIZED: Copper Sheet",
@ -456,6 +458,8 @@
"item.create.crushed_tin_ore": "UNLOCALIZED: Crushed Tin Ore",
"item.create.crushed_uranium_ore": "UNLOCALIZED: Crushed Uranium Ore",
"item.create.crushed_zinc_ore": "UNLOCALIZED: Crushed Zinc Ore",
"item.create.diving_boots": "UNLOCALIZED: Diving Boots",
"item.create.diving_helmet": "UNLOCALIZED: Diving Helmet",
"item.create.dough": "Deeg",
"item.create.electron_tube": "UNLOCALIZED: Electron Tube",
"item.create.empty_blaze_burner": "UNLOCALIZED: Empty Blaze Burner",
@ -678,6 +682,7 @@
"create.recipe.fan_blasting.fan": "UNLOCALIZED: Fan behind Lava",
"create.recipe.pressing": "Persen",
"create.recipe.mixing": "Mengen",
"create.recipe.deploying": "UNLOCALIZED: Deploying",
"create.recipe.automatic_shapeless": "UNLOCALIZED: Automated Shapeless Crafting",
"create.recipe.automatic_brewing": "UNLOCALIZED: Automated Brewing",
"create.recipe.packing": "Compressen",
@ -1138,11 +1143,13 @@
"create.subtitle.mixing": "UNLOCALIZED: Mixing Noises",
"create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks",
"create.subtitle.worldshaper_place": "UNLOCALIZED: Worldshaper zaps",
"create.subtitle.deployer_polish": "UNLOCALIZED: Deployer applies polish",
"create.subtitle.depot_slide": "UNLOCALIZED: Item slides",
"create.subtitle.deny": "UNLOCALIZED: Declining boop",
"create.subtitle.blaze_munch": "UNLOCALIZED: Blaze Burner munches",
"create.subtitle.schematicannon_launch_block": "UNLOCALIZED: Schematicannon fires",
"create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps",
"create.subtitle.copper_armor_equip": "UNLOCALIZED: Diving equipment clinks",
"create.subtitle.schematicannon_finish": "UNLOCALIZED: Schematicannon dings",
"create.subtitle.scroll_value": "UNLOCALIZED: Scroll-input clicks",
"create.subtitle.mechanical_press_activation": "UNLOCALIZED: Mechanical Press clangs",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 31",
"_": "Missing Localizations: 38",
"_": "->------------------------] Game Elements [------------------------<-",
@ -58,6 +58,7 @@
"block.create.cogwheel": "Koło zębate",
"block.create.content_observer": "Detektor zawartości",
"block.create.controller_rail": "Tory sterujące",
"block.create.copper_backtank": "UNLOCALIZED: Copper Backtank",
"block.create.copper_block": "Blok miedzi",
"block.create.copper_casing": "Miedziana Obudowa",
"block.create.copper_ore": "Ruda miedzi",
@ -438,6 +439,7 @@
"item.create.chocolate_glazed_berries": "Jagody w czekoladzie",
"item.create.chromatic_compound": "Związek chromatyczny",
"item.create.cinder_flour": "Rozżarzona mąka",
"item.create.copper_backtank": "UNLOCALIZED: Copper Backtank",
"item.create.copper_ingot": "Sztabka miedzi",
"item.create.copper_nugget": "Bryłka miedzi",
"item.create.copper_sheet": "Arkusz miedzi",
@ -456,6 +458,8 @@
"item.create.crushed_tin_ore": "Rozkruszona ruda cyny",
"item.create.crushed_uranium_ore": "Rozkruszona ruda uranu",
"item.create.crushed_zinc_ore": "Rozkruszona ruda cynku",
"item.create.diving_boots": "UNLOCALIZED: Diving Boots",
"item.create.diving_helmet": "UNLOCALIZED: Diving Helmet",
"item.create.dough": "Ciasto",
"item.create.electron_tube": "Lampa elektronowa",
"item.create.empty_blaze_burner": "Pusty płomienny palnik",
@ -678,6 +682,7 @@
"create.recipe.fan_blasting.fan": "Wiatrak za lawą",
"create.recipe.pressing": "Tłoczenie",
"create.recipe.mixing": "Mieszanie",
"create.recipe.deploying": "UNLOCALIZED: Deploying",
"create.recipe.automatic_shapeless": "Zautomatyzowanie nieokreślone konstruowanie",
"create.recipe.automatic_brewing": "Zautomatyzowane warzenie",
"create.recipe.packing": "Prasowanie",
@ -1138,11 +1143,13 @@
"create.subtitle.mixing": "UNLOCALIZED: Mixing Noises",
"create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks",
"create.subtitle.worldshaper_place": "UNLOCALIZED: Worldshaper zaps",
"create.subtitle.deployer_polish": "UNLOCALIZED: Deployer applies polish",
"create.subtitle.depot_slide": "UNLOCALIZED: Item slides",
"create.subtitle.deny": "UNLOCALIZED: Declining boop",
"create.subtitle.blaze_munch": "Płomyk szczęśliwie przeżuwa",
"create.subtitle.schematicannon_launch_block": "Schematoarmata strzela",
"create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps",
"create.subtitle.copper_armor_equip": "UNLOCALIZED: Diving equipment clinks",
"create.subtitle.schematicannon_finish": "Schematoarmata skończyła",
"create.subtitle.scroll_value": "UNLOCALIZED: Scroll-input clicks",
"create.subtitle.mechanical_press_activation": "Mechaniczna prasa się uruchamia",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 1622",
"_": "Missing Localizations: 1629",
"_": "->------------------------] Game Elements [------------------------<-",
@ -58,6 +58,7 @@
"block.create.cogwheel": "Roda Dentada",
"block.create.content_observer": "UNLOCALIZED: Content Observer",
"block.create.controller_rail": "UNLOCALIZED: Controller Rail",
"block.create.copper_backtank": "UNLOCALIZED: Copper Backtank",
"block.create.copper_block": "UNLOCALIZED: Block of Copper",
"block.create.copper_casing": "UNLOCALIZED: Copper Casing",
"block.create.copper_ore": "UNLOCALIZED: Copper Ore",
@ -438,6 +439,7 @@
"item.create.chocolate_glazed_berries": "UNLOCALIZED: Chocolate Glazed Berries",
"item.create.chromatic_compound": "UNLOCALIZED: Chromatic Compound",
"item.create.cinder_flour": "UNLOCALIZED: Cinder Flour",
"item.create.copper_backtank": "UNLOCALIZED: Copper Backtank",
"item.create.copper_ingot": "UNLOCALIZED: Copper Ingot",
"item.create.copper_nugget": "UNLOCALIZED: Copper Nugget",
"item.create.copper_sheet": "UNLOCALIZED: Copper Sheet",
@ -456,6 +458,8 @@
"item.create.crushed_tin_ore": "UNLOCALIZED: Crushed Tin Ore",
"item.create.crushed_uranium_ore": "UNLOCALIZED: Crushed Uranium Ore",
"item.create.crushed_zinc_ore": "UNLOCALIZED: Crushed Zinc Ore",
"item.create.diving_boots": "UNLOCALIZED: Diving Boots",
"item.create.diving_helmet": "UNLOCALIZED: Diving Helmet",
"item.create.dough": "Massa",
"item.create.electron_tube": "UNLOCALIZED: Electron Tube",
"item.create.empty_blaze_burner": "UNLOCALIZED: Empty Blaze Burner",
@ -678,6 +682,7 @@
"create.recipe.fan_blasting.fan": "UNLOCALIZED: Fan behind Lava",
"create.recipe.pressing": "Prensa Mecânica",
"create.recipe.mixing": "UNLOCALIZED: Mixing",
"create.recipe.deploying": "UNLOCALIZED: Deploying",
"create.recipe.automatic_shapeless": "UNLOCALIZED: Automated Shapeless Crafting",
"create.recipe.automatic_brewing": "UNLOCALIZED: Automated Brewing",
"create.recipe.packing": "UNLOCALIZED: Compacting",
@ -1138,11 +1143,13 @@
"create.subtitle.mixing": "UNLOCALIZED: Mixing Noises",
"create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks",
"create.subtitle.worldshaper_place": "UNLOCALIZED: Worldshaper zaps",
"create.subtitle.deployer_polish": "UNLOCALIZED: Deployer applies polish",
"create.subtitle.depot_slide": "UNLOCALIZED: Item slides",
"create.subtitle.deny": "UNLOCALIZED: Declining boop",
"create.subtitle.blaze_munch": "UNLOCALIZED: Blaze Burner munches",
"create.subtitle.schematicannon_launch_block": "UNLOCALIZED: Schematicannon fires",
"create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps",
"create.subtitle.copper_armor_equip": "UNLOCALIZED: Diving equipment clinks",
"create.subtitle.schematicannon_finish": "UNLOCALIZED: Schematicannon dings",
"create.subtitle.scroll_value": "UNLOCALIZED: Scroll-input clicks",
"create.subtitle.mechanical_press_activation": "UNLOCALIZED: Mechanical Press clangs",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 550",
"_": "Missing Localizations: 557",
"_": "->------------------------] Game Elements [------------------------<-",
@ -58,6 +58,7 @@
"block.create.cogwheel": "Шестерня",
"block.create.content_observer": "Наблюдетель за содержимым",
"block.create.controller_rail": "Контролирующая рельса",
"block.create.copper_backtank": "UNLOCALIZED: Copper Backtank",
"block.create.copper_block": "Медный блок",
"block.create.copper_casing": "Медный корпус",
"block.create.copper_ore": "Медная руда",
@ -438,6 +439,7 @@
"item.create.chocolate_glazed_berries": "Ягоды в шоколадной глазури",
"item.create.chromatic_compound": "Хроматический компаунд",
"item.create.cinder_flour": "Незераковая пыль",
"item.create.copper_backtank": "UNLOCALIZED: Copper Backtank",
"item.create.copper_ingot": "Медный слиток",
"item.create.copper_nugget": "Кусочек меди",
"item.create.copper_sheet": "Медный лист",
@ -456,6 +458,8 @@
"item.create.crushed_tin_ore": "Дроблёная оловянная руда",
"item.create.crushed_uranium_ore": "Дроблёная урановая руда",
"item.create.crushed_zinc_ore": "Дроблёная цинковая руда",
"item.create.diving_boots": "UNLOCALIZED: Diving Boots",
"item.create.diving_helmet": "UNLOCALIZED: Diving Helmet",
"item.create.dough": "Тесто",
"item.create.electron_tube": "Электронная лампа",
"item.create.empty_blaze_burner": "Пустая горелека Всполоха",
@ -678,6 +682,7 @@
"create.recipe.fan_blasting.fan": "Вентилятор за текущей лавой",
"create.recipe.pressing": "Прессование",
"create.recipe.mixing": "Смешивание",
"create.recipe.deploying": "UNLOCALIZED: Deploying",
"create.recipe.automatic_shapeless": "Автоматическая бесформенная сборка",
"create.recipe.automatic_brewing": "Автоматическое смешивание",
"create.recipe.packing": "Прессование",
@ -1138,11 +1143,13 @@
"create.subtitle.mixing": "UNLOCALIZED: Mixing Noises",
"create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks",
"create.subtitle.worldshaper_place": "UNLOCALIZED: Worldshaper zaps",
"create.subtitle.deployer_polish": "UNLOCALIZED: Deployer applies polish",
"create.subtitle.depot_slide": "UNLOCALIZED: Item slides",
"create.subtitle.deny": "UNLOCALIZED: Declining boop",
"create.subtitle.blaze_munch": "Всполох радостно жуёт",
"create.subtitle.schematicannon_launch_block": "Выстрелы схематичной пушки",
"create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps",
"create.subtitle.copper_armor_equip": "UNLOCALIZED: Diving equipment clinks",
"create.subtitle.schematicannon_finish": "Схематичная пушка закончила работу",
"create.subtitle.scroll_value": "UNLOCALIZED: Scroll-input clicks",
"create.subtitle.mechanical_press_activation": "Механический пресс активирован",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 36",
"_": "Missing Localizations: 43",
"_": "->------------------------] Game Elements [------------------------<-",
@ -58,6 +58,7 @@
"block.create.cogwheel": "齿轮",
"block.create.content_observer": "物品侦测器",
"block.create.controller_rail": "控制铁轨",
"block.create.copper_backtank": "UNLOCALIZED: Copper Backtank",
"block.create.copper_block": "铜块",
"block.create.copper_casing": "铜机壳",
"block.create.copper_ore": "铜矿石",
@ -438,6 +439,7 @@
"item.create.chocolate_glazed_berries": "巧克力包层浆果",
"item.create.chromatic_compound": "异彩化合物",
"item.create.cinder_flour": "下界面粉",
"item.create.copper_backtank": "UNLOCALIZED: Copper Backtank",
"item.create.copper_ingot": "铜锭",
"item.create.copper_nugget": "铜粒",
"item.create.copper_sheet": "铜板",
@ -456,6 +458,8 @@
"item.create.crushed_tin_ore": "粉碎锡矿石",
"item.create.crushed_uranium_ore": "粉碎铀矿石",
"item.create.crushed_zinc_ore": "粉碎锌矿石",
"item.create.diving_boots": "UNLOCALIZED: Diving Boots",
"item.create.diving_helmet": "UNLOCALIZED: Diving Helmet",
"item.create.dough": "面团",
"item.create.electron_tube": "电子管",
"item.create.empty_blaze_burner": "空的烈焰人燃烧室",
@ -678,6 +682,7 @@
"create.recipe.fan_blasting.fan": "在熔岩后放置鼓风机",
"create.recipe.pressing": "金属压片",
"create.recipe.mixing": "混合搅拌",
"create.recipe.deploying": "UNLOCALIZED: Deploying",
"create.recipe.automatic_shapeless": "自动搅拌",
"create.recipe.automatic_brewing": "自动酿造",
"create.recipe.packing": "压块塑形",
@ -1138,11 +1143,13 @@
"create.subtitle.mixing": "UNLOCALIZED: Mixing Noises",
"create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks",
"create.subtitle.worldshaper_place": "UNLOCALIZED: Worldshaper zaps",
"create.subtitle.deployer_polish": "UNLOCALIZED: Deployer applies polish",
"create.subtitle.depot_slide": "UNLOCALIZED: Item slides",
"create.subtitle.deny": "UNLOCALIZED: Declining boop",
"create.subtitle.blaze_munch": "烈焰人:咀嚼",
"create.subtitle.schematicannon_launch_block": "蓝图加农炮:发射",
"create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps",
"create.subtitle.copper_armor_equip": "UNLOCALIZED: Diving equipment clinks",
"create.subtitle.schematicannon_finish": "蓝图加农炮:叮",
"create.subtitle.scroll_value": "UNLOCALIZED: Scroll-input clicks",
"create.subtitle.mechanical_press_activation": "辊压机:工作中",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 655",
"_": "Missing Localizations: 662",
"_": "->------------------------] Game Elements [------------------------<-",
@ -58,6 +58,7 @@
"block.create.cogwheel": "齒輪",
"block.create.content_observer": "物品偵測器",
"block.create.controller_rail": "控制鐵軌",
"block.create.copper_backtank": "UNLOCALIZED: Copper Backtank",
"block.create.copper_block": "銅磚",
"block.create.copper_casing": "銅機殼",
"block.create.copper_ore": "銅礦石",
@ -438,6 +439,7 @@
"item.create.chocolate_glazed_berries": "UNLOCALIZED: Chocolate Glazed Berries",
"item.create.chromatic_compound": "異彩化合物",
"item.create.cinder_flour": "地獄麵粉",
"item.create.copper_backtank": "UNLOCALIZED: Copper Backtank",
"item.create.copper_ingot": "銅錠",
"item.create.copper_nugget": "銅粒",
"item.create.copper_sheet": "銅板",
@ -456,6 +458,8 @@
"item.create.crushed_tin_ore": "碎狀錫礦石",
"item.create.crushed_uranium_ore": "碎狀鈾礦石",
"item.create.crushed_zinc_ore": "碎狀鋅礦石",
"item.create.diving_boots": "UNLOCALIZED: Diving Boots",
"item.create.diving_helmet": "UNLOCALIZED: Diving Helmet",
"item.create.dough": "麵團",
"item.create.electron_tube": "真空管",
"item.create.empty_blaze_burner": "空的烈焰使者動力爐",
@ -678,6 +682,7 @@
"create.recipe.fan_blasting.fan": "在熔岩後放置鼓風機",
"create.recipe.pressing": "金屬壓片",
"create.recipe.mixing": "混合攪拌",
"create.recipe.deploying": "UNLOCALIZED: Deploying",
"create.recipe.automatic_shapeless": "自動攪拌",
"create.recipe.automatic_brewing": "自動釀造",
"create.recipe.packing": "壓塊塑形",
@ -1138,11 +1143,13 @@
"create.subtitle.mixing": "UNLOCALIZED: Mixing Noises",
"create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks",
"create.subtitle.worldshaper_place": "UNLOCALIZED: Worldshaper zaps",
"create.subtitle.deployer_polish": "UNLOCALIZED: Deployer applies polish",
"create.subtitle.depot_slide": "UNLOCALIZED: Item slides",
"create.subtitle.deny": "UNLOCALIZED: Declining boop",
"create.subtitle.blaze_munch": "烈焰使者開心地吃著",
"create.subtitle.schematicannon_launch_block": "藍圖大炮發射",
"create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps",
"create.subtitle.copper_armor_equip": "UNLOCALIZED: Diving equipment clinks",
"create.subtitle.schematicannon_finish": "藍圖大炮完成任務",
"create.subtitle.scroll_value": "UNLOCALIZED: Scroll-input clicks",
"create.subtitle.mechanical_press_activation": "液壓機工作",

View file

@ -0,0 +1,3 @@
{
"parent": "create:block/copper_backtank/item"
}

View file

@ -0,0 +1,6 @@
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "create:item/diving_boots"
}
}

View file

@ -0,0 +1,6 @@
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "create:item/diving_helmet"
}
}

View file

@ -49,6 +49,15 @@
],
"subtitle": "create.subtitle.contraption_disassemble"
},
"copper_armor_equip": {
"sounds": [
{
"name": "minecraft:item.armor.equip_gold",
"type": "event"
}
],
"subtitle": "create.subtitle.copper_armor_equip"
},
"crafter_click": {
"sounds": [
{
@ -101,6 +110,15 @@
],
"subtitle": "create.subtitle.deny"
},
"deployer_polish": {
"sounds": [
{
"name": "minecraft:ui.stonecutter.take_result",
"type": "event"
}
],
"subtitle": "create.subtitle.deployer_polish"
},
"depot_plop": {
"sounds": [
{

View file

@ -0,0 +1,32 @@
{
"parent": "minecraft:recipes/root",
"rewards": {
"recipes": [
"create:crafting/appliances/copper_backtank"
]
},
"criteria": {
"has_item": {
"trigger": "minecraft:inventory_changed",
"conditions": {
"items": [
{
"tag": "forge:ingots/copper"
}
]
}
},
"has_the_recipe": {
"trigger": "minecraft:recipe_unlocked",
"conditions": {
"recipe": "create:crafting/appliances/copper_backtank"
}
}
},
"requirements": [
[
"has_item",
"has_the_recipe"
]
]
}

View file

@ -0,0 +1,32 @@
{
"parent": "minecraft:recipes/root",
"rewards": {
"recipes": [
"create:crafting/appliances/diving_boots"
]
},
"criteria": {
"has_item": {
"trigger": "minecraft:inventory_changed",
"conditions": {
"items": [
{
"tag": "forge:ingots/copper"
}
]
}
},
"has_the_recipe": {
"trigger": "minecraft:recipe_unlocked",
"conditions": {
"recipe": "create:crafting/appliances/diving_boots"
}
}
},
"requirements": [
[
"has_item",
"has_the_recipe"
]
]
}

View file

@ -0,0 +1,32 @@
{
"parent": "minecraft:recipes/root",
"rewards": {
"recipes": [
"create:crafting/appliances/diving_helmet"
]
},
"criteria": {
"has_item": {
"trigger": "minecraft:inventory_changed",
"conditions": {
"items": [
{
"tag": "forge:ingots/copper"
}
]
}
},
"has_the_recipe": {
"trigger": "minecraft:recipe_unlocked",
"conditions": {
"recipe": "create:crafting/appliances/diving_helmet"
}
}
},
"requirements": [
[
"has_item",
"has_the_recipe"
]
]
}

View file

@ -0,0 +1,36 @@
{
"type": "minecraft:block",
"pools": [
{
"rolls": 1,
"entries": [
{
"type": "minecraft:item",
"functions": [
{
"function": "minecraft:copy_name",
"source": "block_entity"
},
{
"function": "minecraft:copy_nbt",
"source": "block_entity",
"ops": [
{
"source": "Air",
"target": "Air",
"op": "replace"
}
]
}
],
"name": "create:copper_backtank"
}
],
"conditions": [
{
"condition": "minecraft:survives_explosion"
}
]
}
]
}

View file

@ -6,6 +6,19 @@
"entries": [
{
"type": "minecraft:item",
"functions": [
{
"function": "minecraft:copy_nbt",
"source": "block_entity",
"ops": [
{
"source": "Options",
"target": "BlockEntityTag.Options",
"op": "replace"
}
]
}
],
"name": "create:schematicannon"
}
],

View file

@ -0,0 +1,22 @@
{
"type": "minecraft:crafting_shaped",
"pattern": [
"AGA",
"PPP",
" P "
],
"key": {
"G": {
"item": "create:shaft"
},
"A": {
"item": "create:andesite_alloy"
},
"P": {
"tag": "forge:ingots/copper"
}
},
"result": {
"item": "create:copper_backtank"
}
}

View file

@ -0,0 +1,19 @@
{
"type": "minecraft:crafting_shaped",
"pattern": [
"P P",
"P P",
"G G"
],
"key": {
"G": {
"item": "create:andesite_alloy"
},
"P": {
"tag": "forge:ingots/copper"
}
},
"result": {
"item": "create:diving_boots"
}
}

View file

@ -0,0 +1,18 @@
{
"type": "minecraft:crafting_shaped",
"pattern": [
"PPP",
"PGP"
],
"key": {
"G": {
"tag": "forge:glass"
},
"P": {
"tag": "forge:ingots/copper"
}
},
"result": {
"item": "create:diving_helmet"
}
}

View file

@ -25,6 +25,7 @@
"create:furnace_engine",
"create:redstone_link",
"#minecraft:doors",
"#minecraft:beds",
"minecraft:flower_pot",
"minecraft:bell",
"minecraft:cocoa"

View file

@ -98,6 +98,9 @@ public class AllBlockPartials {
GOGGLES = get("goggles"),
EJECTOR_TOP = get("weighted_ejector/top"),
COPPER_BACKTANK_SHAFT = get("copper_backtank/block_shaft_input"),
COPPER_BACKTANK_COGS = get("copper_backtank/block_cogs"),
COUPLING_ATTACHMENT = getEntity("minecart_coupling/attachment"),
COUPLING_RING = getEntity("minecart_coupling/ring"),

View file

@ -115,6 +115,7 @@ import com.simibubi.create.content.contraptions.relays.encased.GearshiftBlock;
import com.simibubi.create.content.contraptions.relays.gauge.GaugeBlock;
import com.simibubi.create.content.contraptions.relays.gauge.GaugeGenerator;
import com.simibubi.create.content.contraptions.relays.gearbox.GearboxBlock;
import com.simibubi.create.content.curiosities.armor.CopperBacktankBlock;
import com.simibubi.create.content.curiosities.projector.ChromaticProjectorBlock;
import com.simibubi.create.content.logistics.block.belts.tunnel.BeltTunnelBlock;
import com.simibubi.create.content.logistics.block.belts.tunnel.BrassTunnelBlock;
@ -181,6 +182,15 @@ import net.minecraft.data.ShapedRecipeBuilder;
import net.minecraft.item.DyeColor;
import net.minecraft.item.Item;
import net.minecraft.item.Rarity;
import net.minecraft.loot.ConstantRange;
import net.minecraft.loot.ItemLootEntry;
import net.minecraft.loot.LootPool;
import net.minecraft.loot.LootTable;
import net.minecraft.loot.LootTable.Builder;
import net.minecraft.loot.conditions.ILootCondition.IBuilder;
import net.minecraft.loot.conditions.SurvivesExplosion;
import net.minecraft.loot.functions.CopyName;
import net.minecraft.loot.functions.CopyNbt;
import net.minecraft.state.properties.PistonType;
import net.minecraft.tags.BlockTags;
import net.minecraft.tags.ItemTags;
@ -206,6 +216,16 @@ public class AllBlocks {
REGISTRATE.block("schematicannon", SchematicannonBlock::new)
.initialProperties(() -> Blocks.DISPENSER)
.blockstate((ctx, prov) -> prov.simpleBlock(ctx.getEntry(), AssetLookup.partialBaseModel(ctx, prov)))
.loot((lt, block) -> {
Builder builder = LootTable.builder();
IBuilder survivesExplosion = SurvivesExplosion.builder();
lt.registerLootTable(block, builder.addLootPool(LootPool.builder()
.acceptCondition(survivesExplosion)
.rolls(ConstantRange.of(1))
.addEntry(ItemLootEntry.builder(AllBlocks.SCHEMATICANNON.get().asItem())
.acceptFunction(CopyNbt.func_215881_a(CopyNbt.Source.BLOCK_ENTITY)
.func_216056_a("Options", "BlockEntityTag.Options")))));
})
.item()
.transform(customItemModel())
.register();
@ -466,7 +486,7 @@ public class AllBlocks {
.loot((lt, block) -> lt.registerLootTable(block, BlazeBurnerBlock.buildLootTable()))
.blockstate((c, p) -> p.simpleBlock(c.getEntry(), AssetLookup.partialBaseModel(c, p)))
.item(BlazeBurnerBlockItem::withBlaze)
.model(AssetLookup.<BlazeBurnerBlockItem>customItemModel("blaze_burner", "block_with_blaze"))
.model(AssetLookup.<BlazeBurnerBlockItem>customBlockItemModel("blaze_burner", "block_with_blaze"))
.build()
.register();
@ -634,7 +654,7 @@ public class AllBlocks {
.onRegister(CreateRegistrate.blockModel(() -> FluidTankModel::standard))
.addLayer(() -> RenderType::getCutoutMipped)
.item(FluidTankItem::new)
.model(AssetLookup.<FluidTankItem>customItemModel("_", "block_single_window"))
.model(AssetLookup.<FluidTankItem>customBlockItemModel("_", "block_single_window"))
.build()
.register();
@ -1273,6 +1293,38 @@ public class AllBlocks {
.transform(customItemModel("diodes", "latch_off"))
.register();
// Curiosities
static {
REGISTRATE.startSection(AllSections.CURIOSITIES);
}
public static final BlockEntry<CopperBacktankBlock> COPPER_BACKTANK =
REGISTRATE.block("copper_backtank", CopperBacktankBlock::new)
.initialProperties(SharedProperties::softMetal)
.blockstate((c, p) -> p.horizontalBlock(c.getEntry(), AssetLookup.partialBaseModel(c, p)))
.addLayer(() -> RenderType::getCutoutMipped)
.transform(StressConfigDefaults.setImpact(4.0))
.loot((lt, block) -> {
Builder builder = LootTable.builder();
IBuilder survivesExplosion = SurvivesExplosion.builder();
lt.registerLootTable(block, builder.addLootPool(LootPool.builder()
.acceptCondition(survivesExplosion)
.rolls(ConstantRange.of(1))
.addEntry(ItemLootEntry.builder(AllItems.COPPER_BACKTANK.get())
.acceptFunction(CopyName.builder(CopyName.Source.BLOCK_ENTITY))
.acceptFunction(CopyNbt.func_215881_a(CopyNbt.Source.BLOCK_ENTITY)
.func_216056_a("Air", "Air")))));
})
.register();
public static final BlockEntry<ChromaticProjectorBlock> CHROMATIC_PROJECTOR =
REGISTRATE.block("chromatic_projector", ChromaticProjectorBlock::new)
.initialProperties(() -> Blocks.IRON_BLOCK)
.item()
.build()
.register();
// Materials
static {
@ -1350,17 +1402,6 @@ public class AllBlocks {
.lang("Block of Brass")
.register();
static {
REGISTRATE.startSection(AllSections.CURIOSITIES);
}
public static final BlockEntry<ChromaticProjectorBlock> CHROMATIC_PROJECTOR =
REGISTRATE.block("chromatic_projector", ChromaticProjectorBlock::new)
.initialProperties(() -> Blocks.IRON_BLOCK)
.item()
.build()
.register();
// Load this class
public static void register() {}

View file

@ -29,6 +29,10 @@ import com.simibubi.create.content.curiosities.CombustibleItem;
import com.simibubi.create.content.curiosities.RefinedRadianceItem;
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.DivingBootsItem;
import com.simibubi.create.content.curiosities.armor.DivingHelmetItem;
import com.simibubi.create.content.curiosities.symmetry.SymmetryWandItem;
import com.simibubi.create.content.curiosities.symmetry.client.SymmetryWandModel;
import com.simibubi.create.content.curiosities.tools.ExtendoGripItem;
@ -47,6 +51,7 @@ import com.simibubi.create.foundation.item.TagDependentIngredientItem;
import com.simibubi.create.foundation.item.TooltipHelper;
import com.tterrag.registrate.util.entry.ItemEntry;
import net.minecraft.item.BlockItem;
import net.minecraft.item.Food;
import net.minecraft.item.Item;
import net.minecraft.item.Rarity;
@ -168,12 +173,12 @@ public class AllItems {
public static final ItemEntry<VerticalGearboxItem> VERTICAL_GEARBOX =
REGISTRATE.item("vertical_gearbox", VerticalGearboxItem::new)
.model(AssetLookup.<VerticalGearboxItem>customItemModel("gearbox", "item_vertical"))
.model(AssetLookup.<VerticalGearboxItem>customBlockItemModel("gearbox", "item_vertical"))
.register();
public static final ItemEntry<BlazeBurnerBlockItem> EMPTY_BLAZE_BURNER =
REGISTRATE.item("empty_blaze_burner", BlazeBurnerBlockItem::empty)
.model(AssetLookup.<BlazeBurnerBlockItem>customItemModel("blaze_burner", "block"))
.model(AssetLookup.<BlazeBurnerBlockItem>customBlockItemModel("blaze_burner", "block"))
.register();
public static final ItemEntry<GogglesItem> GOGGLES = REGISTRATE.item("goggles", GogglesItem::new)
@ -208,13 +213,13 @@ public class AllItems {
.transform(CreateRegistrate.customRenderedItem(() -> ExtendoGripModel::new))
.model(AssetLookup.itemModelWithPartials())
.register();
public static final ItemEntry<SymmetryWandItem> WAND_OF_SYMMETRY =
REGISTRATE.item("wand_of_symmetry", SymmetryWandItem::new)
.transform(CreateRegistrate.customRenderedItem(() -> SymmetryWandModel::new))
.model(AssetLookup.itemModelWithPartials())
.register();
public static final ItemEntry<WorldshaperItem> WORLDSHAPER =
REGISTRATE.item("handheld_worldshaper", WorldshaperItem::new)
.properties(p -> p.rarity(Rarity.EPIC))
@ -256,6 +261,20 @@ public class AllItems {
REGISTRATE.startSection(CURIOSITIES);
}
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(),
DIVING_HELMET = REGISTRATE.item("diving_helmet", DivingHelmetItem::new)
.register(),
DIVING_BOOTS = REGISTRATE.item("diving_boots", DivingBootsItem::new)
.register();
public static final ItemEntry<TreeFertilizerItem> TREE_FERTILIZER =
REGISTRATE.item("tree_fertilizer", TreeFertilizerItem::new)
.register();

View file

@ -6,6 +6,7 @@ import java.util.function.Supplier;
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;
import com.simibubi.create.content.contraptions.components.deployer.DeployerApplicationRecipe;
import com.simibubi.create.content.contraptions.components.fan.SplashingRecipe;
import com.simibubi.create.content.contraptions.components.millstone.MillingRecipe;
import com.simibubi.create.content.contraptions.components.mixer.CompactingRecipe;
@ -44,6 +45,7 @@ public enum AllRecipeTypes {
PRESSING(processingSerializer(PressingRecipe::new)),
SANDPAPER_POLISHING(processingSerializer(SandPaperPolishingRecipe::new)),
SPLASHING(processingSerializer(SplashingRecipe::new)),
DEPLOYING(processingSerializer(DeployerApplicationRecipe::new)),
FILLING(processingSerializer(FillingRecipe::new)),
EMPTYING(processingSerializer(EmptyingRecipe::new)),

View file

@ -141,6 +141,8 @@ public class AllShapes {
BASIN_COLLISION_SHAPE = shape(0, 2, 0, 16, 13, 16).erase(2, 5, 2, 14, 16, 14)
.add(2, 0, 2, 14, 2, 14)
.build(),
BACKTANK = shape(3, 0, 3, 13, 12, 13).add(SIX_VOXEL_POLE.get(Axis.Y))
.build(),
SPEED_CONTROLLER = shape(0, 0, 0, 16, 4, 16).add(1, 1, 1, 15, 13, 15)
.add(0, 8, 0, 16, 14, 16)
.build(),

View file

@ -148,6 +148,16 @@ public class AllSoundEvents {
.category(SoundCategory.BLOCKS)
.build(),
COPPER_ARMOR_EQUIP = create("copper_armor_equip").subtitle("Diving equipment clinks")
.playExisting(SoundEvents.ITEM_ARMOR_EQUIP_GOLD, 1f, 1f)
.category(SoundCategory.PLAYERS)
.build(),
AUTO_POLISH = create("deployer_polish").subtitle("Deployer applies polish")
.playExisting(SoundEvents.UI_STONECUTTER_TAKE_RESULT, 1f, 1f)
.category(SoundCategory.BLOCKS)
.build(),
BLAZE_MUNCH = create("blaze_munch").subtitle("Blaze Burner munches")
.playExisting(SoundEvents.ENTITY_GENERIC_EAT, .5f, 1f)
.category(SoundCategory.BLOCKS)
@ -162,6 +172,11 @@ public class AllSoundEvents {
for (SoundEntry entry : entries.values())
entry.register(registry);
}
public static void prepare() {
for (SoundEntry entry : entries.values())
entry.prepare();
}
public static JsonElement provideLangEntries() {
JsonObject object = new JsonObject();
@ -278,6 +293,8 @@ public class AllSoundEvents {
this.category = category;
}
public abstract void prepare();
public abstract void register(IForgeRegistry<SoundEvent> registry);
public abstract void write(JsonObject json);
@ -346,18 +363,23 @@ public class AllSoundEvents {
this.wrappedEvents = wrappedEvents;
compiledEvents = Lists.newArrayList();
}
@Override
public void register(IForgeRegistry<SoundEvent> registry) {
public void prepare() {
for (int i = 0; i < wrappedEvents.size(); i++) {
ResourceLocation location = Create.asResource(getIdOf(i));
SoundEvent sound = new SoundEvent(location).setRegistryName(location);
registry.register(sound);
compiledEvents.add(Pair.of(sound, wrappedEvents.get(i)
.getSecond()));
}
}
@Override
public void register(IForgeRegistry<SoundEvent> registry) {
for (Pair<SoundEvent, Couple<Float>> pair : compiledEvents)
registry.register(pair.getFirst());
}
@Override
public SoundEvent getMainEvent() {
return compiledEvents.get(0)
@ -413,11 +435,16 @@ public class AllSoundEvents {
public CustomSoundEntry(String id, String subtitle, SoundCategory category) {
super(id, subtitle, category);
}
@Override
public void prepare() {
ResourceLocation location = getLocation();
event = new SoundEvent(location).setRegistryName(location);
}
@Override
public void register(IForgeRegistry<SoundEvent> registry) {
ResourceLocation location = getLocation();
registry.register(event = new SoundEvent(location).setRegistryName(location));
registry.register(event);
}
@Override

View file

@ -209,6 +209,7 @@ public class AllTags {
AllBlockTags.WINDMILL_SAILS.includeAll(BlockTags.WOOL);
AllBlockTags.BRITTLE.includeAll(BlockTags.DOORS);
AllBlockTags.BRITTLE.includeAll(BlockTags.BEDS);
AllBlockTags.BRITTLE.add(Blocks.FLOWER_POT, Blocks.BELL, Blocks.COCOA);
AllBlockTags.FAN_TRANSPARENT.includeAll(BlockTags.FENCES);

View file

@ -116,6 +116,9 @@ import com.simibubi.create.content.contraptions.relays.gearbox.GearboxInstance;
import com.simibubi.create.content.contraptions.relays.gearbox.GearboxRenderer;
import com.simibubi.create.content.contraptions.relays.gearbox.GearboxTileEntity;
import com.simibubi.create.content.contraptions.relays.gearbox.GearshiftTileEntity;
import com.simibubi.create.content.curiosities.armor.CopperBacktankInstance;
import com.simibubi.create.content.curiosities.armor.CopperBacktankRenderer;
import com.simibubi.create.content.curiosities.armor.CopperBacktankTileEntity;
import com.simibubi.create.content.curiosities.projector.ChromaticProjectorInstance;
import com.simibubi.create.content.curiosities.projector.ChromaticProjectorTileEntity;
import com.simibubi.create.content.logistics.block.belts.tunnel.BeltTunnelInstance;
@ -647,23 +650,27 @@ public class AllTileEntities {
.instance(() -> AdjustableRepeaterInstance::new)
.validBlocks(AllBlocks.ADJUSTABLE_REPEATER)
.renderer(() -> AdjustableRepeaterRenderer::new)
.register();
.register();
public static final TileEntityEntry<AdjustablePulseRepeaterTileEntity> ADJUSTABLE_PULSE_REPEATER =
Create.registrate()
.tileEntity("adjustable_pulse_repeater", AdjustablePulseRepeaterTileEntity::new)
.instance(() -> AdjustableRepeaterInstance::new)
.validBlocks(AllBlocks.ADJUSTABLE_PULSE_REPEATER)
.renderer(() -> AdjustableRepeaterRenderer::new)
.register();
Create.registrate()
.tileEntity("adjustable_pulse_repeater", AdjustablePulseRepeaterTileEntity::new)
.instance(() -> AdjustableRepeaterInstance::new)
.validBlocks(AllBlocks.ADJUSTABLE_PULSE_REPEATER)
.renderer(() -> AdjustableRepeaterRenderer::new)
.register();
public static final TileEntityEntry<CopperBacktankTileEntity> COPPER_BACKTANK = Create.registrate()
.tileEntity("copper_backtank", CopperBacktankTileEntity::new)
.instance(() -> CopperBacktankInstance::new)
.validBlocks(AllBlocks.COPPER_BACKTANK)
.renderer(() -> CopperBacktankRenderer::new)
.register();
public static final TileEntityEntry<ChromaticProjectorTileEntity> CHROMATIC_PROJECTOR =
Create.registrate()
.tileEntity("chromatic_projector", ChromaticProjectorTileEntity::new)
.instance(() -> ChromaticProjectorInstance::new)
.validBlocks(AllBlocks.CHROMATIC_PROJECTOR)
.register();
public static final TileEntityEntry<ChromaticProjectorTileEntity> CHROMATIC_PROJECTOR =Create.registrate()
.tileEntity("chromatic_projector", ChromaticProjectorTileEntity::new)
.instance(() -> ChromaticProjectorInstance::new)
.validBlocks(AllBlocks.CHROMATIC_PROJECTOR)
.register();
public static void register() {
}
public static void register() {}
}

View file

@ -78,6 +78,7 @@ public class Create {
IEventBus modEventBus = FMLJavaModLoadingContext.get()
.getModEventBus();
AllSoundEvents.prepare();
AllBlocks.register();
AllItems.register();
AllFluids.register();

View file

@ -14,9 +14,11 @@ import com.jozufozu.flywheel.backend.instancing.InstancedTileRenderer;
import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer;
import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionRenderDispatcher;
import com.simibubi.create.content.contraptions.relays.encased.CasingConnectivity;
import com.simibubi.create.content.curiosities.armor.CopperBacktankArmorLayer;
import com.simibubi.create.content.schematics.ClientSchematicLoader;
import com.simibubi.create.content.schematics.client.SchematicAndQuillHandler;
import com.simibubi.create.content.schematics.client.SchematicHandler;
import com.simibubi.create.events.ClientEvents;
import com.simibubi.create.foundation.ResourceReloadHandler;
import com.simibubi.create.foundation.block.render.CustomBlockModels;
import com.simibubi.create.foundation.block.render.SpriteShifter;
@ -79,6 +81,7 @@ public class CreateClient {
modEventBus.addListener(CreateClient::onModelRegistry);
modEventBus.addListener(CreateClient::onTextureStitch);
modEventBus.addListener(AllParticleTypes::registerFactories);
modEventBus.addListener(ClientEvents::loadCompleted);
Backend.init();
CreateFlywheelHandler.init();
@ -109,6 +112,7 @@ public class CreateClient {
PonderIndex.registerTags();
UIRenderHelper.init();
UIRenderHelper.enableStencil();
IResourceManager resourceManager = Minecraft.getInstance()
.getResourceManager();
@ -116,6 +120,10 @@ public class CreateClient {
((IReloadableResourceManager) resourceManager).addReloadListener(new ResourceReloadHandler());
AllBlockPartials.clientInit();
event.enqueueWork(() -> {
CopperBacktankArmorLayer.register();
});
}
public static void onTextureStitch(TextureStitchEvent.Pre event) {

View file

@ -19,6 +19,7 @@ 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.FanSmokingCategory;
import com.simibubi.create.compat.jei.category.FanWashingCategory;
@ -33,6 +34,7 @@ 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.SpoutCategory;
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.recipe.PotionMixingRecipeManager;
@ -53,7 +55,6 @@ 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.ISubtypeRegistration;
import mezz.jei.api.runtime.IIngredientManager;
import net.minecraft.client.Minecraft;
import net.minecraft.item.ItemStack;
@ -164,6 +165,14 @@ public class CreateJEI implements IModPlugin {
.catalyst(AllItems.SAND_PAPER::get)
.catalyst(AllItems.RED_SAND_PAPER::get)
.build(),
deploying = register("deploying", DeployingCategory::new)
.recipeList(() -> DeployerApplicationRecipe.convert(findRecipesByType(AllRecipeTypes.SANDPAPER_POLISHING.type)))
.recipes(AllRecipeTypes.DEPLOYING)
.catalyst(AllBlocks.DEPLOYER::get)
.catalyst(AllBlocks.DEPOT::get)
.catalyst(AllItems.BELT_CONNECTOR::get)
.build(),
mysteryConversion = register("mystery_conversion", MysteriousItemConversionCategory::new)
.recipeList(MysteriousItemConversionCategory::getRecipes)

View file

@ -0,0 +1,68 @@
package com.simibubi.create.compat.jei.category;
import java.util.Arrays;
import java.util.stream.Collectors;
import com.mojang.blaze3d.matrix.MatrixStack;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.compat.jei.category.animations.AnimatedDeployer;
import com.simibubi.create.content.contraptions.components.deployer.DeployerApplicationRecipe;
import com.simibubi.create.foundation.fluid.FluidIngredient;
import com.simibubi.create.foundation.gui.AllGuiTextures;
import mezz.jei.api.constants.VanillaTypes;
import mezz.jei.api.gui.IRecipeLayout;
import mezz.jei.api.gui.ingredient.IGuiItemStackGroup;
import mezz.jei.api.ingredients.IIngredients;
public class DeployingCategory extends CreateRecipeCategory<DeployerApplicationRecipe> {
AnimatedDeployer deployer;
public DeployingCategory() {
super(itemIcon(AllBlocks.DEPLOYER.get()), emptyBackground(177, 70));
deployer = new AnimatedDeployer();
}
@Override
public Class<DeployerApplicationRecipe> getRecipeClass() {
return DeployerApplicationRecipe.class;
}
@Override
public void setIngredients(DeployerApplicationRecipe recipe, IIngredients ingredients) {
ingredients.setInputIngredients(recipe.getIngredients());
ingredients.setInputLists(VanillaTypes.FLUID, recipe.getFluidIngredients()
.stream()
.map(FluidIngredient::getMatchingFluidStacks)
.collect(Collectors.toList()));
if (!recipe.getRollableResults()
.isEmpty())
ingredients.setOutput(VanillaTypes.ITEM, recipe.getRecipeOutput());
}
@Override
public void setRecipe(IRecipeLayout recipeLayout, DeployerApplicationRecipe recipe, IIngredients ingredients) {
IGuiItemStackGroup itemStacks = recipeLayout.getItemStacks();
itemStacks.init(0, true, 50, 4);
itemStacks.set(0, Arrays.asList(recipe.getRequiredHeldItem()
.getMatchingStacks()));
itemStacks.init(1, true, 26, 50);
itemStacks.set(1, Arrays.asList(recipe.getProcessedItem()
.getMatchingStacks()));
itemStacks.init(2, false, 131, 50);
itemStacks.set(2, recipe.getRecipeOutput());
}
@Override
public void draw(DeployerApplicationRecipe recipe, MatrixStack matrixStack, double mouseX, double mouseY) {
AllGuiTextures.JEI_SLOT.draw(matrixStack, 50, 4);
AllGuiTextures.JEI_SLOT.draw(matrixStack, 26, 50);
getRenderedSlot(recipe, 0).draw(matrixStack, 131, 50);
AllGuiTextures.JEI_SHADOW.draw(matrixStack, 62, 57);
AllGuiTextures.JEI_DOWN_ARROW.draw(matrixStack, 126, 29);
deployer.draw(matrixStack, getBackground().getWidth() / 2 - 13, 22);
}
}

View file

@ -73,7 +73,7 @@ public class PolishingCategory extends CreateRecipeCategory<SandPaperPolishingRe
tag.put("Polishing", matchingStacks[0].serializeNBT());
tag.putBoolean("JEI", true);
GuiGameElement.of(renderedSandpaper)
.at(getBackground().getWidth() / 2 - 16, 0, 0)
.<GuiGameElement.GuiRenderBuilder>at(getBackground().getWidth() / 2 - 16, 0, 0)
.scale(2)
.render(matrixStack);
}

View file

@ -12,6 +12,7 @@ import com.simibubi.create.AllBlocks;
import com.simibubi.create.Create;
import com.simibubi.create.compat.jei.category.animations.AnimatedSpout;
import com.simibubi.create.content.contraptions.fluids.actors.FillingRecipe;
import com.simibubi.create.content.contraptions.fluids.actors.GenericItemFilling;
import com.simibubi.create.content.contraptions.fluids.potion.PotionFluidHandler;
import com.simibubi.create.content.contraptions.processing.ProcessingRecipeBuilder;
import com.simibubi.create.foundation.fluid.FluidIngredient;
@ -71,6 +72,8 @@ public class SpoutCategory extends CreateRecipeCategory<FillingRecipe> {
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);

View file

@ -1,7 +1,6 @@
package com.simibubi.create.compat.jei.category.animations;
import com.mojang.blaze3d.matrix.MatrixStack;
import com.mojang.blaze3d.systems.RenderSystem;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.foundation.gui.GuiGameElement;
@ -14,11 +13,11 @@ public class AnimatedCrushingWheels extends AnimatedKinetics {
@Override
public void draw(MatrixStack matrixStack, int xOffset, int yOffset) {
RenderSystem.enableDepthTest();
matrixStack.push();
matrixStack.translate(xOffset, yOffset, 100);
matrixStack.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(-22.5f));
int scale = 22;
BlockState wheel = AllBlocks.CRUSHING_WHEEL.get()
.getDefaultState()
.with(BlockStateProperties.AXIS, Axis.X);
@ -33,6 +32,8 @@ public class AnimatedCrushingWheels extends AnimatedKinetics {
.atLocal(2, 0, 0)
.scale(scale)
.render(matrixStack);
matrixStack.pop();
}
}

View file

@ -0,0 +1,61 @@
package com.simibubi.create.compat.jei.category.animations;
import com.mojang.blaze3d.matrix.MatrixStack;
import com.simibubi.create.AllBlockPartials;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.content.contraptions.components.deployer.DeployerBlock;
import com.simibubi.create.foundation.gui.GuiGameElement;
import com.simibubi.create.foundation.utility.AnimationTickHolder;
import net.minecraft.util.Direction;
import net.minecraft.util.Direction.Axis;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.vector.Vector3f;
public class AnimatedDeployer extends AnimatedKinetics {
@Override
public void draw(MatrixStack matrixStack, int xOffset, int yOffset) {
matrixStack.push();
matrixStack.translate(xOffset, yOffset, 100);
matrixStack.multiply(Vector3f.POSITIVE_X.getDegreesQuaternion(-15.5f));
matrixStack.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(22.5f));
int scale = 20;
GuiGameElement.of(shaft(Axis.Z))
.rotateBlock(0, 0, getCurrentAngle())
.scale(scale)
.render(matrixStack);
GuiGameElement.of(AllBlocks.DEPLOYER.getDefaultState()
.with(DeployerBlock.FACING, Direction.DOWN)
.with(DeployerBlock.AXIS_ALONG_FIRST_COORDINATE, false))
.scale(scale)
.render(matrixStack);
float cycle = AnimationTickHolder.getRenderTime() % 30;
float offset = cycle < 10 ? cycle / 10f : cycle < 20 ? (20 - cycle) / 10f : 0;
matrixStack.push();
matrixStack.translate(0, offset * 17, 0);
GuiGameElement.of(AllBlockPartials.DEPLOYER_POLE)
.rotateBlock(90, 0, 0)
.scale(scale)
.render(matrixStack);
GuiGameElement.of(AllBlockPartials.DEPLOYER_HAND_HOLDING)
.rotateBlock(90, 0, 0)
.scale(scale)
.render(matrixStack);
matrixStack.pop();
GuiGameElement.of(AllBlocks.DEPOT.getDefaultState())
.atLocal(0, 2, 0)
.scale(scale)
.render(matrixStack);
matrixStack.pop();
}
}

View file

@ -21,13 +21,13 @@ public enum AllSections {
/** Decorative blocks */
PALETTES(Palette.Green),
/** Helpful gadgets and other shenanigans */
CURIOSITIES(Palette.Purple),
/** Base materials, ingredients and tools */
MATERIALS(Palette.Green),
/** Helpful gadgets and other shenanigans */
CURIOSITIES(Palette.Purple),
/** Fallback section */
UNASSIGNED(Palette.Gray)

View file

@ -0,0 +1,123 @@
package com.simibubi.create.content.contraptions.components.deployer;
import static com.simibubi.create.content.contraptions.base.DirectionalKineticBlock.FACING;
import java.util.List;
import java.util.stream.Collectors;
import com.simibubi.create.AllSoundEvents;
import com.simibubi.create.Create;
import com.simibubi.create.content.contraptions.components.deployer.DeployerTileEntity.Mode;
import com.simibubi.create.content.contraptions.components.deployer.DeployerTileEntity.State;
import com.simibubi.create.content.contraptions.relays.belt.BeltHelper;
import com.simibubi.create.content.contraptions.relays.belt.transport.TransportedItemStack;
import com.simibubi.create.content.curiosities.tools.SandPaperPolishingRecipe;
import com.simibubi.create.content.logistics.InWorldProcessing;
import com.simibubi.create.foundation.tileEntity.behaviour.belt.BeltProcessingBehaviour.ProcessingResult;
import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour.TransportedResult;
import net.minecraft.block.BlockState;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.IRecipe;
import net.minecraft.util.Direction;
import net.minecraft.util.Hand;
import net.minecraft.util.SoundCategory;
import net.minecraft.util.SoundEvents;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraftforge.items.ItemHandlerHelper;
public class BeltDeployerCallbacks {
public static ProcessingResult onItemReceived(TransportedItemStack s, TransportedItemStackHandlerBehaviour i,
DeployerTileEntity deployerTileEntity) {
if (deployerTileEntity.getSpeed() == 0)
return ProcessingResult.PASS;
if (deployerTileEntity.mode == Mode.PUNCH)
return ProcessingResult.PASS;
BlockState blockState = deployerTileEntity.getBlockState();
if (!blockState.contains(FACING) || blockState.get(FACING) != Direction.DOWN)
return ProcessingResult.PASS;
if (deployerTileEntity.state != State.WAITING)
return ProcessingResult.HOLD;
if (deployerTileEntity.redstoneLocked)
return ProcessingResult.PASS;
if (deployerTileEntity.getRecipe(s.stack) == null)
return ProcessingResult.PASS;
deployerTileEntity.start();
return ProcessingResult.HOLD;
}
public static ProcessingResult whenItemHeld(TransportedItemStack s, TransportedItemStackHandlerBehaviour i,
DeployerTileEntity deployerTileEntity) {
if (deployerTileEntity.getSpeed() == 0)
return ProcessingResult.PASS;
BlockState blockState = deployerTileEntity.getBlockState();
if (!blockState.contains(FACING) || blockState.get(FACING) != Direction.DOWN)
return ProcessingResult.PASS;
IRecipe<?> recipe = deployerTileEntity.getRecipe(s.stack);
if (recipe == null)
return ProcessingResult.PASS;
if (deployerTileEntity.state == State.RETRACTING && deployerTileEntity.timer == 1000) {
activate(s, i, deployerTileEntity, recipe);
return ProcessingResult.HOLD;
}
if (deployerTileEntity.state == State.WAITING) {
if (deployerTileEntity.redstoneLocked)
return ProcessingResult.PASS;
deployerTileEntity.start();
}
return ProcessingResult.HOLD;
}
public static void activate(TransportedItemStack transported, TransportedItemStackHandlerBehaviour handler,
DeployerTileEntity deployerTileEntity, IRecipe<?> recipe) {
List<TransportedItemStack> collect =
InWorldProcessing.applyRecipeOn(ItemHandlerHelper.copyStackWithSize(transported.stack, 1), recipe)
.stream()
.map(stack -> {
TransportedItemStack copy = transported.copy();
boolean centered = BeltHelper.isItemUpright(stack);
copy.stack = stack;
copy.locked = true;
copy.angle = centered ? 180 : Create.random.nextInt(360);
return copy;
})
.collect(Collectors.toList());
TransportedItemStack left = transported.copy();
deployerTileEntity.player.spawnedItemEffects = transported.stack.copy();
left.stack.shrink(1);
if (collect.isEmpty())
handler.handleProcessingOnItem(transported, TransportedResult.convertTo(left));
else
handler.handleProcessingOnItem(transported, TransportedResult.convertToAndLeaveHeld(collect, left));
ItemStack heldItem = deployerTileEntity.player.getHeldItemMainhand();
if (heldItem.isDamageable())
heldItem.damageItem(1, deployerTileEntity.player, s -> s.sendBreakAnimation(Hand.MAIN_HAND));
else
heldItem.shrink(1);
BlockPos pos = deployerTileEntity.getPos();
World world = deployerTileEntity.getWorld();
if (heldItem.isEmpty())
world.playSound(null, pos, SoundEvents.ENTITY_ITEM_BREAK, SoundCategory.BLOCKS, .25f, 1);
world.playSound(null, pos, SoundEvents.ENTITY_ITEM_PICKUP, SoundCategory.BLOCKS, .25f, .75f);
if (recipe instanceof SandPaperPolishingRecipe)
AllSoundEvents.AUTO_POLISH.playOnServer(world, pos, .25f, 1f);
deployerTileEntity.sendData();
}
}

View file

@ -0,0 +1,66 @@
package com.simibubi.create.content.contraptions.components.deployer;
import java.util.List;
import java.util.stream.Collectors;
import com.simibubi.create.AllItems;
import com.simibubi.create.AllRecipeTypes;
import com.simibubi.create.Create;
import com.simibubi.create.content.contraptions.processing.ProcessingRecipe;
import com.simibubi.create.content.contraptions.processing.ProcessingRecipeBuilder;
import com.simibubi.create.content.contraptions.processing.ProcessingRecipeBuilder.ProcessingRecipeParams;
import net.minecraft.item.crafting.IRecipe;
import net.minecraft.item.crafting.Ingredient;
import net.minecraft.world.World;
import net.minecraftforge.items.wrapper.RecipeWrapper;
public class DeployerApplicationRecipe extends ProcessingRecipe<RecipeWrapper> {
public DeployerApplicationRecipe(ProcessingRecipeParams params) {
super(AllRecipeTypes.DEPLOYING, params);
}
@Override
public boolean matches(RecipeWrapper inv, World p_77569_2_) {
return ingredients.get(0)
.test(inv.getStackInSlot(0))
&& ingredients.get(1)
.test(inv.getStackInSlot(1));
}
@Override
protected int getMaxInputCount() {
return 2;
}
@Override
protected int getMaxOutputCount() {
return 2;
}
public Ingredient getRequiredHeldItem() {
if (ingredients.isEmpty())
throw new IllegalStateException("Deploying Recipe: " + id.toString() + " has no tool!");
return ingredients.get(0);
}
public Ingredient getProcessedItem() {
if (ingredients.size() < 2)
throw new IllegalStateException("Deploying Recipe: " + id.toString() + " has no ingredient!");
return ingredients.get(1);
}
public static List<DeployerApplicationRecipe> convert(List<IRecipe<?>> sandpaperRecipes) {
return sandpaperRecipes.stream()
.map(r -> new ProcessingRecipeBuilder<>(DeployerApplicationRecipe::new, Create.asResource(r.getId()
.getPath() + "_using_deployer"))
.require(Ingredient.fromItems(AllItems.SAND_PAPER.get(), AllItems.RED_SAND_PAPER.get()))
.require(r.getIngredients()
.get(0))
.output(r.getRecipeOutput())
.build())
.collect(Collectors.toList());
}
}

View file

@ -6,11 +6,16 @@ import static net.minecraftforge.eventbus.api.Event.Result.DENY;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.Nullable;
import org.apache.commons.lang3.tuple.Pair;
import com.google.common.collect.Multimap;
import com.simibubi.create.AllSoundEvents;
import com.simibubi.create.content.contraptions.components.deployer.DeployerTileEntity.Mode;
import com.simibubi.create.content.curiosities.tools.SandPaperItem;
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour;
import com.simibubi.create.foundation.utility.BlockHelper;
import com.simibubi.create.foundation.utility.worldWrappers.WrappedWorld;
@ -93,7 +98,7 @@ public class DeployerHandler {
}
}
static boolean shouldActivate(ItemStack held, World world, BlockPos targetPos) {
static boolean shouldActivate(ItemStack held, World world, BlockPos targetPos, @Nullable Direction facing) {
if (held.getItem() instanceof BlockItem)
if (world.getBlockState(targetPos)
.getBlock() == ((BlockItem) held.getItem()).getBlock())
@ -107,10 +112,15 @@ public class DeployerHandler {
return false;
}
if (!held.isEmpty() && facing == Direction.DOWN
&& TileEntityBehaviour.get(world, targetPos, TransportedItemStackHandlerBehaviour.TYPE) != null)
return false;
return true;
}
static void activate(DeployerFakePlayer player, Vector3d vec, BlockPos clickedPos, Vector3d extensionVector, Mode mode) {
static void activate(DeployerFakePlayer player, Vector3d vec, BlockPos clickedPos, Vector3d extensionVector,
Mode mode) {
Multimap<Attribute, AttributeModifier> attributeModifiers = player.getHeldItemMainhand()
.getAttributeModifiers(EquipmentSlotType.MAINHAND);
player.getAttributes()
@ -120,8 +130,8 @@ public class DeployerHandler {
.addTemporaryModifiers(attributeModifiers);
}
private static void activateInner(DeployerFakePlayer player, Vector3d vec, BlockPos clickedPos, Vector3d extensionVector,
Mode mode) {
private static void activateInner(DeployerFakePlayer player, Vector3d vec, BlockPos clickedPos,
Vector3d extensionVector, Mode mode) {
Vector3d rayOrigin = vec.add(extensionVector.scale(3 / 2f + 1 / 64f));
Vector3d rayTarget = vec.add(extensionVector.scale(5 / 2f - 1 / 64f));
@ -148,10 +158,11 @@ public class DeployerHandler {
return;
}
if (cancelResult == null) {
if (entity.processInitialInteract(player, hand).isAccepted())
if (entity.processInitialInteract(player, hand)
.isAccepted())
success = true;
else if (entity instanceof LivingEntity
&& stack.useOnEntity(player, (LivingEntity) entity, hand).isAccepted())
else if (entity instanceof LivingEntity && stack.useOnEntity(player, (LivingEntity) entity, hand)
.isAccepted())
success = true;
}
if (!success && stack.isFood() && entity instanceof PlayerEntity) {
@ -215,7 +226,8 @@ public class DeployerHandler {
if (blockBreakingProgress != null)
before = blockBreakingProgress.getValue();
progress += before;
world.playSound(null, clickedPos, clickedState.getSoundType().getHitSound(), SoundCategory.NEUTRAL, .25f, 1);
world.playSound(null, clickedPos, clickedState.getSoundType()
.getHitSound(), SoundCategory.NEUTRAL, .25f, 1);
if (progress >= 1) {
tryHarvestBlock(player.interactionManager, clickedPos);
@ -300,8 +312,10 @@ public class DeployerHandler {
}
CompoundNBT tag = stack.getTag();
if (tag != null && stack.getItem() instanceof SandPaperItem && tag.contains("Polishing"))
if (tag != null && stack.getItem() instanceof SandPaperItem && tag.contains("Polishing")) {
player.spawnedItemEffects = ItemStack.read(tag.getCompound("Polishing"));
AllSoundEvents.AUTO_POLISH.playOnServer(world, pos, .25f, 1f);
}
if (!player.getActiveItemStack()
.isEmpty())
@ -359,7 +373,7 @@ public class DeployerHandler {
protected static ActionResultType safeOnBeehiveUse(BlockState state, World world, BlockPos pos, PlayerEntity player,
Hand hand) {
// <> BeehiveBlock#onUse
BeehiveBlock block = (BeehiveBlock) state.getBlock();
ItemStack prevHeldItem = player.getHeldItem(hand);
int honeyLevel = state.get(BeehiveBlock.HONEY_LEVEL);

View file

@ -64,7 +64,7 @@ public class DeployerMovementBehaviour extends MovementBehaviour {
tryGrabbingItem(context);
DeployerFakePlayer player = getPlayer(context);
Mode mode = getMode(context);
if (mode == Mode.USE && !DeployerHandler.shouldActivate(player.getHeldItemMainhand(), context.world, pos))
if (mode == Mode.USE && !DeployerHandler.shouldActivate(player.getHeldItemMainhand(), context.world, pos, null))
return;
activate(context, pos, player, mode);

View file

@ -5,14 +5,20 @@ import static com.simibubi.create.content.contraptions.base.DirectionalKineticBl
import java.util.ArrayList;
import java.util.List;
import javax.annotation.Nullable;
import com.jozufozu.flywheel.backend.core.PartialModel;
import com.simibubi.create.AllBlockPartials;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.AllRecipeTypes;
import com.simibubi.create.content.contraptions.base.KineticTileEntity;
import com.simibubi.create.content.curiosities.tools.SandPaperItem;
import com.simibubi.create.content.curiosities.tools.SandPaperPolishingRecipe.SandPaperInv;
import com.simibubi.create.foundation.advancement.AllTriggers;
import com.simibubi.create.foundation.item.TooltipHelper;
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.belt.BeltProcessingBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour;
import com.simibubi.create.foundation.utility.NBTHelper;
import com.simibubi.create.foundation.utility.VecHelper;
@ -21,6 +27,7 @@ import com.simibubi.create.foundation.utility.animation.LerpedFloat;
import net.minecraft.block.BlockState;
import net.minecraft.entity.player.ServerPlayerEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.IRecipe;
import net.minecraft.nbt.CompoundNBT;
import net.minecraft.nbt.ListNBT;
import net.minecraft.tileentity.TileEntity;
@ -41,6 +48,8 @@ import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.common.util.Constants.NBT;
import net.minecraftforge.common.util.LazyOptional;
import net.minecraftforge.items.IItemHandlerModifiable;
import net.minecraftforge.items.ItemStackHandler;
import net.minecraftforge.items.wrapper.RecipeWrapper;
public class DeployerTileEntity extends KineticTileEntity {
@ -59,6 +68,8 @@ public class DeployerTileEntity extends KineticTileEntity {
private LerpedFloat animatedOffset;
public BeltProcessingBehaviour processingBehaviour;
enum State {
WAITING, EXPANDING, RETRACTING, DUMPING;
}
@ -82,6 +93,10 @@ public class DeployerTileEntity extends KineticTileEntity {
super.addBehaviours(behaviours);
filtering = new FilteringBehaviour(this, new DeployerFilterSlot());
behaviours.add(filtering);
processingBehaviour =
new BeltProcessingBehaviour(this).whenItemEnters((s, i) -> BeltDeployerCallbacks.onItemReceived(s, i, this))
.whileItemHeld((s, i) -> BeltDeployerCallbacks.whenItemHeld(s, i, this));
behaviours.add(processingBehaviour);
}
@Override
@ -158,7 +173,7 @@ public class DeployerTileEntity extends KineticTileEntity {
}
Direction facing = getBlockState().get(FACING);
if (mode == Mode.USE && !DeployerHandler.shouldActivate(stack, world, pos.offset(facing, 2))) {
if (mode == Mode.USE && !DeployerHandler.shouldActivate(stack, world, pos.offset(facing, 2), facing)) {
timer = getTimerSpeed() * 10;
return;
}
@ -166,25 +181,10 @@ public class DeployerTileEntity extends KineticTileEntity {
// Check for advancement conditions
if (mode == Mode.PUNCH && !boop && startBoop(facing))
return;
if (redstoneLocked)
return;
state = State.EXPANDING;
Vector3d movementVector = getMovementVector();
Vector3d rayOrigin = VecHelper.getCenterOf(pos)
.add(movementVector.scale(3 / 2f));
Vector3d rayTarget = VecHelper.getCenterOf(pos)
.add(movementVector.scale(5 / 2f));
RayTraceContext rayTraceContext =
new RayTraceContext(rayOrigin, rayTarget, BlockMode.OUTLINE, FluidMode.NONE, player);
BlockRayTraceResult result = world.rayTraceBlocks(rayTraceContext);
reach = (float) (.5f + Math.min(result.getHitVec()
.subtract(rayOrigin)
.length(), .75f));
timer = 1000;
sendData();
start();
return;
}
@ -208,6 +208,23 @@ public class DeployerTileEntity extends KineticTileEntity {
}
protected void start() {
state = State.EXPANDING;
Vector3d movementVector = getMovementVector();
Vector3d rayOrigin = VecHelper.getCenterOf(pos)
.add(movementVector.scale(3 / 2f));
Vector3d rayTarget = VecHelper.getCenterOf(pos)
.add(movementVector.scale(5 / 2f));
RayTraceContext rayTraceContext =
new RayTraceContext(rayOrigin, rayTarget, BlockMode.OUTLINE, FluidMode.NONE, player);
BlockRayTraceResult result = world.rayTraceBlocks(rayTraceContext);
reach = (float) (.5f + Math.min(result.getHitVec()
.subtract(rayOrigin)
.length(), .75f));
timer = 1000;
sendData();
}
public boolean startBoop(Direction facing) {
if (!world.isAirBlock(pos.offset(facing, 1)) || !world.isAirBlock(pos.offset(facing, 2)))
return false;
@ -263,6 +280,10 @@ public class DeployerTileEntity extends KineticTileEntity {
player.rotationYaw = direction.getHorizontalAngle();
player.rotationPitch = direction == Direction.UP ? -90 : direction == Direction.DOWN ? 90 : 0;
if (direction == Direction.DOWN
&& TileEntityBehaviour.get(world, clickedPos, TransportedItemStackHandlerBehaviour.TYPE) != null)
return; // Belt processing handled in BeltDeployerCallbacks
DeployerHandler.activate(player, center, clickedPos, movementVector, mode);
if (player != null)
heldItem = player.getHeldItemMainhand();
@ -294,7 +315,7 @@ public class DeployerTileEntity extends KineticTileEntity {
if (compound.contains("Particle")) {
ItemStack particleStack = ItemStack.read(compound.getCompound("Particle"));
SandPaperItem.spawnParticles(VecHelper.getCenterOf(pos)
.add(getMovementVector().scale(2f)), particleStack, this.world);
.add(getMovementVector().scale(reach + 1)), particleStack, this.world);
}
}
@ -413,4 +434,23 @@ public class DeployerTileEntity extends KineticTileEntity {
animatedOffset.setValue(offset);
}
RecipeWrapper recipeInv = new RecipeWrapper(new ItemStackHandler(2));
SandPaperInv sandpaperInv = new SandPaperInv(ItemStack.EMPTY);
@Nullable
public IRecipe<?> getRecipe(ItemStack stack) {
if (player == null)
return null;
ItemStack heldItemMainhand = player.getHeldItemMainhand();
if (heldItemMainhand.getItem() instanceof SandPaperItem) {
sandpaperInv.setInventorySlotContents(0, stack);
return AllRecipeTypes.SANDPAPER_POLISHING.find(sandpaperInv, world)
.orElse(null);
}
recipeInv.setInventorySlotContents(0, heldItemMainhand);
recipeInv.setInventorySlotContents(1, stack);
return AllRecipeTypes.DEPLOYING.find(recipeInv, world)
.orElse(null);
}
}

View file

@ -29,6 +29,7 @@ import com.simibubi.create.content.logistics.block.redstone.RedstoneLinkBlock;
import net.minecraft.block.AbstractPressurePlateBlock;
import net.minecraft.block.AbstractRailBlock;
import net.minecraft.block.AbstractSignBlock;
import net.minecraft.block.BedBlock;
import net.minecraft.block.BellBlock;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
@ -49,6 +50,7 @@ import net.minecraft.block.WallSignBlock;
import net.minecraft.block.WallTorchBlock;
import net.minecraft.block.material.PushReaction;
import net.minecraft.state.properties.AttachFace;
import net.minecraft.state.properties.BedPart;
import net.minecraft.state.properties.BellAttachment;
import net.minecraft.state.properties.BlockStateProperties;
import net.minecraft.tileentity.TileEntity;
@ -163,6 +165,13 @@ public class BlockMovementTraits {
return direction == Direction.DOWN;
if (block instanceof DoorBlock)
return direction == Direction.DOWN;
if (block instanceof BedBlock) {
Direction facing = state.get(BedBlock.HORIZONTAL_FACING);
if (state.get(BedBlock.PART) == BedPart.HEAD) {
facing = facing.getOpposite();
}
return direction == facing;
}
if (block instanceof RedstoneLinkBlock)
return direction.getOpposite() == state.get(RedstoneLinkBlock.FACING);
if (block instanceof FlowerPotBlock)

View file

@ -35,6 +35,7 @@ import com.simibubi.create.content.contraptions.components.actors.SeatBlock;
import com.simibubi.create.content.contraptions.components.actors.SeatEntity;
import com.simibubi.create.content.contraptions.components.structureMovement.bearing.MechanicalBearingBlock;
import com.simibubi.create.content.contraptions.components.structureMovement.bearing.StabilizedContraption;
import com.simibubi.create.content.contraptions.components.structureMovement.bearing.WindmillBearingBlock;
import com.simibubi.create.content.contraptions.components.structureMovement.chassis.AbstractChassisBlock;
import com.simibubi.create.content.contraptions.components.structureMovement.chassis.ChassisTileEntity;
import com.simibubi.create.content.contraptions.components.structureMovement.chassis.StickerBlock;
@ -342,6 +343,10 @@ public abstract class Contraption {
// Bearings potentially create stabilized sub-contraptions
if (AllBlocks.MECHANICAL_BEARING.has(state))
moveBearing(pos, frontier, visited, state);
// WM Bearings attach their structure when moved
if (AllBlocks.WINDMILL_BEARING.has(state))
moveWindmillBearing(pos, frontier, visited, state);
// Seats transfer their passenger to the contraption
if (state.getBlock() instanceof SeatBlock)
@ -497,6 +502,13 @@ public abstract class Contraption {
}
}
private void moveWindmillBearing(BlockPos pos, Queue<BlockPos> frontier, Set<BlockPos> visited, BlockState state) {
Direction facing = state.get(WindmillBearingBlock.FACING);
BlockPos offset = pos.offset(facing);
if (!visited.contains(offset))
frontier.add(offset);
}
private void moveBearing(BlockPos pos, Queue<BlockPos> frontier, Set<BlockPos> visited, BlockState state) {
Direction facing = state.get(MechanicalBearingBlock.FACING);
if (!canBeStabilized(facing, pos.subtract(anchor))) {
@ -701,8 +713,8 @@ public abstract class Contraption {
c -> seatMapping.put(NBTUtil.readUniqueId(NBTHelper.getINBT(c, "Id")), c.getInt("Seat")));
stabilizedSubContraptions.clear();
NBTHelper.iterateCompoundList(nbt.getList("SubContraptions", NBT.TAG_COMPOUND), c -> stabilizedSubContraptions
.put(c.getUniqueId("Id"), BlockFace.fromNBT(c.getCompound("Location"))));
NBTHelper.iterateCompoundList(nbt.getList("SubContraptions", NBT.TAG_COMPOUND),
c -> stabilizedSubContraptions.put(c.getUniqueId("Id"), BlockFace.fromNBT(c.getCompound("Location"))));
storage.clear();
NBTHelper.iterateCompoundList(nbt.getList("Storage", NBT.TAG_COMPOUND), c -> storage
@ -831,7 +843,9 @@ public abstract class Contraption {
private CompoundNBT writeBlocksCompound() {
CompoundNBT compound = new CompoundNBT();
HashMapPalette<BlockState> palette = new HashMapPalette<>(GameData.getBlockStateIDMap(), 16, (i, s) -> {throw new IllegalStateException("Palette Map index exceeded maximum");}, NBTUtil::readBlockState, NBTUtil::writeBlockState);
HashMapPalette<BlockState> palette = new HashMapPalette<>(GameData.getBlockStateIDMap(), 16, (i, s) -> {
throw new IllegalStateException("Palette Map index exceeded maximum");
}, NBTUtil::readBlockState, NBTUtil::writeBlockState);
ListNBT blockList = new ListNBT();
for (BlockInfo block : this.blocks.values()) {
@ -857,7 +871,9 @@ public abstract class Contraption {
ListNBT blockList;
if (usePalettedDeserialization) {
CompoundNBT c = ((CompoundNBT) compound);
palette = new HashMapPalette<>(GameData.getBlockStateIDMap(), 16, (i, s) -> {throw new IllegalStateException("Palette Map index exceeded maximum");}, NBTUtil::readBlockState, NBTUtil::writeBlockState);
palette = new HashMapPalette<>(GameData.getBlockStateIDMap(), 16, (i, s) -> {
throw new IllegalStateException("Palette Map index exceeded maximum");
}, NBTUtil::readBlockState, NBTUtil::writeBlockState);
palette.read(c.getList("Palette", 10));
blockList = c.getList("BlockList", 10);
@ -906,19 +922,15 @@ public abstract class Contraption {
}
private static BlockInfo readBlockInfo(CompoundNBT blockListEntry, HashMapPalette<BlockState> palette) {
return new BlockInfo(
BlockPos.fromLong(blockListEntry.getLong("Pos")),
Objects.requireNonNull(palette.get(blockListEntry.getInt("State"))),
blockListEntry.contains("Data") ? blockListEntry.getCompound("Data") : null
);
return new BlockInfo(BlockPos.fromLong(blockListEntry.getLong("Pos")),
Objects.requireNonNull(palette.get(blockListEntry.getInt("State"))),
blockListEntry.contains("Data") ? blockListEntry.getCompound("Data") : null);
}
private static BlockInfo legacyReadBlockInfo(CompoundNBT blockListEntry) {
return new BlockInfo(
NBTUtil.readBlockPos(blockListEntry.getCompound("Pos")),
NBTUtil.readBlockState(blockListEntry.getCompound("Block")),
blockListEntry.contains("Data") ? blockListEntry.getCompound("Data") : null
);
return new BlockInfo(NBTUtil.readBlockPos(blockListEntry.getCompound("Pos")),
NBTUtil.readBlockState(blockListEntry.getCompound("Block")),
blockListEntry.contains("Data") ? blockListEntry.getCompound("Data") : null);
}
public void removeBlocksFromWorld(World world, BlockPos offset) {
@ -999,8 +1011,7 @@ public abstract class Contraption {
}
if (state.getBlock() instanceof IWaterLoggable && state.contains(BlockStateProperties.WATERLOGGED)) {
FluidState FluidState = world.getFluidState(targetPos);
state = state.with(BlockStateProperties.WATERLOGGED,
FluidState.getFluid() == Fluids.WATER);
state = state.with(BlockStateProperties.WATERLOGGED, FluidState.getFluid() == Fluids.WATER);
}
world.destroyBlock(targetPos, true);
@ -1232,8 +1243,8 @@ public abstract class Contraption {
float distSq = a * a + b * b;
if (distSq > maxDistSq) maxDistSq = distSq;
if (distSq > maxDistSq)
maxDistSq = distSq;
}
return maxDistSq;

View file

@ -13,6 +13,7 @@ import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.IRenderTypeBuffer;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.WorldRenderer;
import net.minecraft.client.renderer.culling.ClippingHelper;
import net.minecraft.client.renderer.entity.EntityRenderer;
import net.minecraft.client.renderer.entity.EntityRendererManager;
import net.minecraft.client.renderer.texture.OverlayTexture;
@ -31,10 +32,8 @@ public class SuperGlueRenderer extends EntityRenderer<SuperGlueEntity> {
private ResourceLocation regular = new ResourceLocation(Create.ID, "textures/entity/super_glue/slime.png");
private Vector3d[] quad1;
private Vector3d[] quad2;
private float[] u = { 0, 1, 1, 0 };
private float[] v = { 0, 0, 1, 1 };
private float[] insideQuad;
private float[] outsideQuad;
public SuperGlueRenderer(EntityRendererManager renderManager) {
super(renderManager);
@ -47,17 +46,23 @@ public class SuperGlueRenderer extends EntityRenderer<SuperGlueEntity> {
}
@Override
public void render(SuperGlueEntity entity, float p_225623_2_, float p_225623_3_, MatrixStack ms,
public boolean shouldRender(SuperGlueEntity entity, ClippingHelper frustum, double x, double y, double z) {
if (super.shouldRender(entity, frustum, x, y, z)) {
PlayerEntity player = Minecraft.getInstance().player;
boolean visible = entity.isVisible();
boolean holdingGlue = AllItems.SUPER_GLUE.isIn(player.getHeldItemMainhand())
|| AllItems.SUPER_GLUE.isIn(player.getHeldItemOffhand());
if (visible || holdingGlue)
return true;
}
return false;
}
@Override
public void render(SuperGlueEntity entity, float yaw, float partialTicks, MatrixStack ms,
IRenderTypeBuffer buffer, int light) {
super.render(entity, p_225623_2_, p_225623_3_, ms, buffer, light);
PlayerEntity player = Minecraft.getInstance().player;
boolean visible = entity.isVisible();
boolean holdingGlue = AllItems.SUPER_GLUE.isIn(player.getHeldItemMainhand())
|| AllItems.SUPER_GLUE.isIn(player.getHeldItemOffhand());
if (!visible && !holdingGlue)
return;
super.render(entity, yaw, partialTicks, ms, buffer, light);
IVertexBuilder builder = buffer.getBuffer(RenderType.getEntityCutout(getEntityTexture(entity)));
light = getBrightnessForRender(entity);
@ -65,24 +70,13 @@ public class SuperGlueRenderer extends EntityRenderer<SuperGlueEntity> {
ms.push();
MatrixStacker.of(ms)
.rotateY(AngleHelper.horizontalAngle(face))
.rotateY(AngleHelper.horizontalAngleNew(face))
.rotateX(AngleHelper.verticalAngle(face));
Entry peek = ms.peek();
Vector3d[][] quads = { quad1, quad2 };
for (Vector3d[] quad : quads) {
for (int i = 0; i < 4; i++) {
Vector3d vertex = quad[i];
builder.vertex(peek.getModel(), (float) vertex.x, (float) vertex.y, (float) vertex.z)
.color(255, 255, 255, 255)
.texture(u[i], v[i])
.overlay(OverlayTexture.DEFAULT_UV)
.light(light)
.normal(peek.getNormal(), face.getXOffset(), face.getYOffset(), face.getZOffset())
.endVertex();
}
face = face.getOpposite();
}
renderQuad(builder, peek, insideQuad, light, -1);
renderQuad(builder, peek, outsideQuad, light, 1);
ms.pop();
}
@ -111,8 +105,18 @@ public class SuperGlueRenderer extends EntityRenderer<SuperGlueEntity> {
Vector3d a4 = plane.add(start);
Vector3d b4 = plane.add(end);
quad1 = new Vector3d[] { a2, a3, a4, a1 };
quad2 = new Vector3d[] { b3, b2, b1, b4 };
insideQuad = new float[] {
(float) a1.x, (float) a1.y, (float) a1.z, 1, 0,
(float) a2.x, (float) a2.y, (float) a2.z, 1, 1,
(float) a3.x, (float) a3.y, (float) a3.z, 0, 1,
(float) a4.x, (float) a4.y, (float) a4.z, 0, 0,
};
outsideQuad = new float[] {
(float) b4.x, (float) b4.y, (float) b4.z, 0, 0,
(float) b3.x, (float) b3.y, (float) b3.z, 0, 1,
(float) b2.x, (float) b2.y, (float) b2.z, 1, 1,
(float) b1.x, (float) b1.y, (float) b1.z, 1, 0,
};
}
private int getBrightnessForRender(SuperGlueEntity entity) {
@ -126,4 +130,17 @@ public class SuperGlueRenderer extends EntityRenderer<SuperGlueEntity> {
return Math.max(light, light2);
}
// Vertex format: pos x, pos y, pos z, u, v
private void renderQuad(IVertexBuilder builder, Entry matrix, float[] data, int light, float normalZ) {
for (int i = 0; i < 4; i++) {
builder.vertex(matrix.getModel(), data[5 * i], data[5 * i + 1], data[5 * i + 2])
.color(255, 255, 255, 255)
.texture(data[5 * i + 3], data[5 * i + 4])
.overlay(OverlayTexture.DEFAULT_UV)
.light(light)
.normal(matrix.getNormal(), 0.0f, 0.0f, normalZ)
.endVertex();
}
}
}

View file

@ -54,6 +54,7 @@ import net.minecraft.util.ActionResultType;
import net.minecraft.util.Direction;
import net.minecraft.util.Direction.Axis;
import net.minecraft.util.Hand;
import net.minecraft.util.Mirror;
import net.minecraft.util.Rotation;
import net.minecraft.util.SoundCategory;
import net.minecraft.util.SoundEvents;
@ -492,29 +493,55 @@ public class CartAssemblerBlock extends AbstractRailBlock
public boolean allowsMovement(BlockState state, IBlockReader reader, BlockPos pos, PathType type) {
return false;
}
@Override
public ActionResultType onWrenched(BlockState state, ItemUseContext context) {
World world = context.getWorld();
if (world.isRemote)
return ActionResultType.SUCCESS;
BlockPos pos = context.getPos();
BlockState newState = state.with(RAIL_SHAPE,
state.get(RAIL_SHAPE) == RailShape.NORTH_SOUTH ? RailShape.EAST_WEST : RailShape.NORTH_SOUTH);
if (state.get(RAIL_TYPE) == CartAssembleRailType.CONTROLLER_RAIL
|| state.get(RAIL_TYPE) == CartAssembleRailType.CONTROLLER_RAIL_BACKWARDS) {
newState = newState.with(RAIL_TYPE, AllBlocks.CONTROLLER_RAIL.get()
.rotate(AllBlocks.CONTROLLER_RAIL.getDefaultState()
.with(ControllerRailBlock.SHAPE, state.get(RAIL_SHAPE))
.with(ControllerRailBlock.BACKWARDS,
state.get(RAIL_TYPE) == CartAssembleRailType.CONTROLLER_RAIL_BACKWARDS),
Rotation.CLOCKWISE_90)
.get(ControllerRailBlock.BACKWARDS) ? CartAssembleRailType.CONTROLLER_RAIL_BACKWARDS
: CartAssembleRailType.CONTROLLER_RAIL);
}
context.getWorld()
.setBlockState(pos, newState, 3);
world.setBlockState(pos, rotate(state, Rotation.CLOCKWISE_90), 3);
world.notifyNeighborsOfStateChange(pos.down(), this);
return ActionResultType.SUCCESS;
}
@Override
public BlockState rotate(BlockState state, Rotation rotation) {
if (rotation == Rotation.NONE)
return state;
boolean is_controller_rail_backwards = state.get(RAIL_TYPE) == CartAssembleRailType.CONTROLLER_RAIL_BACKWARDS;
boolean is_controller_rail = state.get(RAIL_TYPE) == CartAssembleRailType.CONTROLLER_RAIL || is_controller_rail_backwards;
BlockState base = AllBlocks.CONTROLLER_RAIL.getDefaultState()
.with(ControllerRailBlock.SHAPE, state.get(RAIL_SHAPE))
.with(ControllerRailBlock.BACKWARDS, is_controller_rail_backwards)
.rotate(rotation);
if (is_controller_rail) {
state = state.with(RAIL_TYPE,
base.get(ControllerRailBlock.BACKWARDS) ? CartAssembleRailType.CONTROLLER_RAIL_BACKWARDS :
CartAssembleRailType.CONTROLLER_RAIL
);
}
return state.with(RAIL_SHAPE, base.get(ControllerRailBlock.SHAPE));
}
@Override
public BlockState mirror(BlockState state, Mirror mirror) {
if (mirror == Mirror.NONE)
return state;
boolean is_controller_rail_backwards = state.get(RAIL_TYPE) == CartAssembleRailType.CONTROLLER_RAIL_BACKWARDS;
boolean is_controller_rail = state.get(RAIL_TYPE) == CartAssembleRailType.CONTROLLER_RAIL || is_controller_rail_backwards;
BlockState base = AllBlocks.CONTROLLER_RAIL.getDefaultState()
.with(ControllerRailBlock.SHAPE, state.get(RAIL_SHAPE))
.with(ControllerRailBlock.BACKWARDS, is_controller_rail_backwards)
.mirror(mirror);
if (is_controller_rail) {
state = state.with(RAIL_TYPE,
base.get(ControllerRailBlock.BACKWARDS) ? CartAssembleRailType.CONTROLLER_RAIL_BACKWARDS :
CartAssembleRailType.CONTROLLER_RAIL
);
}
return state.with(RAIL_SHAPE, base.get(ControllerRailBlock.SHAPE));
}
}

View file

@ -103,6 +103,11 @@ public class PumpTileEntity extends KineticTileEntity {
BlockPos backPos = pos.offset(getFront().getOpposite());
FluidPropagator.propagateChangedPipe(world, frontPos, world.getBlockState(frontPos));
FluidPropagator.propagateChangedPipe(world, backPos, world.getBlockState(backPos));
FluidTransportBehaviour behaviour = getBehaviour(FluidTransportBehaviour.TYPE);
if (behaviour != null)
behaviour.wipePressure();
sidesToUpdate.forEach(MutableBoolean::setTrue);
}
protected void distributePressureTo(Direction side) {

View file

@ -5,9 +5,11 @@ import com.simibubi.create.content.contraptions.fluids.potion.PotionFluidHandler
import com.simibubi.create.foundation.fluid.FluidHelper;
import net.minecraft.fluid.Fluids;
import net.minecraft.item.BucketItem;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.item.MilkBucketItem;
import net.minecraft.potion.PotionUtils;
import net.minecraft.potion.Potions;
import net.minecraft.world.World;
@ -20,6 +22,33 @@ import net.minecraftforge.fluids.capability.wrappers.FluidBucketWrapper;
public class GenericItemFilling {
/**
* Checks if an ItemStack's IFluidHandlerItem is valid. Ideally, this check would
* not be necessary. Unfortunately, some mods that copy the functionality of the
* MilkBucketItem copy the FluidBucketWrapper capability that is patched in by
* Forge without looking into what it actually does. In all cases this is
* incorrect because having a non-bucket item turn into a bucket item does not
* make sense.
*
* <p>This check is only necessary for filling since a FluidBucketWrapper will be
* empty if it is initialized with a non-bucket item.
*
* @param stack The ItemStack.
* @param fluidHandler The IFluidHandlerItem instance retrieved from the ItemStack.
* @return If the IFluidHandlerItem is valid for the passed ItemStack.
*/
public static boolean isFluidHandlerValid(ItemStack stack, IFluidHandlerItem fluidHandler) {
// Not instanceof in case a correct subclass is made
if (fluidHandler.getClass() == FluidBucketWrapper.class) {
Item item = stack.getItem();
// Forge does not patch the FluidBucketWrapper onto subclasses of BucketItem
if (item.getClass() != BucketItem.class && !(item instanceof MilkBucketItem)) {
return false;
}
}
return true;
}
public static boolean canItemBeFilled(World world, ItemStack stack) {
if (stack.getItem() == Items.GLASS_BOTTLE)
return true;
@ -31,6 +60,8 @@ public class GenericItemFilling {
IFluidHandlerItem tank = capability.orElse(null);
if (tank == null)
return false;
if (!isFluidHandlerValid(stack, tank))
return false;
for (int i = 0; i < tank.getTanks(); i++) {
if (tank.getFluidInTank(i)
.getAmount() < tank.getTankCapacity(i))

View file

@ -1,10 +1,12 @@
package com.simibubi.create.content.contraptions.fluids.tank;
import java.util.List;
import java.util.function.Consumer;
import com.simibubi.create.foundation.fluid.SmartFluidTank;
import net.minecraft.tileentity.TileEntityType;
import net.minecraft.util.text.ITextComponent;
import net.minecraftforge.fluids.FluidStack;
public class CreativeFluidTankTileEntity extends FluidTankTileEntity {
@ -17,6 +19,11 @@ public class CreativeFluidTankTileEntity extends FluidTankTileEntity {
protected SmartFluidTank createInventory() {
return new CreativeSmartFluidTank(getCapacityMultiplier(), this::onFluidStackChanged);
}
@Override
public boolean addToGoggleTooltip(List<ITextComponent> tooltip, boolean isPlayerSneaking) {
return false;
}
public static class CreativeSmartFluidTank extends SmartFluidTank {

View file

@ -141,6 +141,8 @@ public class FluidTankTileEntity extends SmartTileEntity implements IHaveGoggleI
FluidTankTileEntity tankAt = FluidTankConnectivityHandler.anyTankAt(world, pos);
if (tankAt == null)
continue;
world.updateComparatorOutputLevel(pos, tankAt.getBlockState()
.getBlock());
if (tankAt.luminosity == actualLuminosity)
continue;
tankAt.setLuminosity(actualLuminosity);
@ -315,8 +317,11 @@ public class FluidTankTileEntity extends SmartTileEntity implements IHaveGoggleI
@Override
public boolean addToGoggleTooltip(List<ITextComponent> tooltip, boolean isPlayerSneaking) {
FluidTankTileEntity controllerTE = getControllerTE();
if (controllerTE == null)
return false;
return containedFluidTooltip(tooltip, isPlayerSneaking,
getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY));
controllerTE.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY));
}
@Override

View file

@ -169,6 +169,20 @@ public class GantryShaftBlock extends DirectionalKineticBlock {
return onWrenched;
}
@Override
public void onBlockAdded(BlockState state, World worldIn, BlockPos pos, BlockState oldState, boolean isMoving) {
super.onBlockAdded(state, worldIn, pos, oldState, isMoving);
if (!worldIn.isRemote() && oldState.getBlock().is(AllBlocks.GANTRY_SHAFT.get())) {
Part oldPart = oldState.get(PART), part = state.get(PART);
if ((oldPart != Part.MIDDLE && part == Part.MIDDLE) || (oldPart == Part.SINGLE && part != Part.SINGLE)) {
TileEntity te = worldIn.getTileEntity(pos);
if (te instanceof GantryShaftTileEntity)
((GantryShaftTileEntity) te).checkAttachedCarriageBlocks();
}
}
}
@Override
public void neighborChanged(BlockState state, World worldIn, BlockPos pos, Block p_220069_4_, BlockPos p_220069_5_,
boolean p_220069_6_) {
@ -260,7 +274,7 @@ public class GantryShaftBlock extends DirectionalKineticBlock {
return super.areStatesKineticallyEquivalent(oldState, newState)
&& oldState.get(POWERED) == newState.get(POWERED);
}
@Override
public float getParticleTargetRadius() {
return .35f;
@ -270,7 +284,7 @@ public class GantryShaftBlock extends DirectionalKineticBlock {
public float getParticleInitialRadius() {
return .25f;
}
@Override
public boolean allowsMovement(BlockState state, IBlockReader reader, BlockPos pos, PathType type) {
return false;

View file

@ -19,15 +19,12 @@ public class GantryShaftTileEntity extends KineticTileEntity {
super(typeIn);
}
@Override
public void onSpeedChanged(float previousSpeed) {
super.onSpeedChanged(previousSpeed);
public void checkAttachedCarriageBlocks() {
if (!canAssembleOn())
return;
for (Direction d : Iterate.directions) {
if (d.getAxis() == getBlockState().get(GantryShaftBlock.FACING)
.getAxis())
.getAxis())
continue;
BlockPos offset = pos.offset(d);
BlockState pinionState = world.getBlockState(offset);
@ -39,7 +36,12 @@ public class GantryShaftTileEntity extends KineticTileEntity {
if (tileEntity instanceof GantryCarriageTileEntity)
((GantryCarriageTileEntity) tileEntity).queueAssembly();
}
}
@Override
public void onSpeedChanged(float previousSpeed) {
super.onSpeedChanged(previousSpeed);
checkAttachedCarriageBlocks();
}
@Override
@ -99,7 +101,7 @@ public class GantryShaftTileEntity extends KineticTileEntity {
return 0;
return MathHelper.clamp(-getSpeed() / 512f, -.49f, .49f);
}
@Override
protected boolean isNoisy() {
return false;

View file

@ -153,7 +153,7 @@ public class SequencedGearshiftScreen extends AbstractSimiScreen {
0xffffff);
GuiGameElement.of(renderedItem)
.at(guiLeft + background.width + 10, guiTop + 100, -150)
.<GuiGameElement.GuiRenderBuilder>at(guiLeft + background.width + 10, guiTop + 100, -150)
.scale(5)
.render(matrixStack);
}

View file

@ -187,6 +187,10 @@ public class BeltBlock extends HorizontalKineticBlock implements ITE<BeltTileEnt
return;
}
if (AllItems.DIVING_BOOTS.get()
.isWornBy(entityIn))
return;
BeltTileEntity belt = BeltHelper.getSegmentTE(worldIn, pos);
if (belt == null)
return;

View file

@ -41,7 +41,7 @@ public class CogwheelBlockItem extends BlockItem {
large = block.isLarge;
placementHelperId = PlacementHelpers.register(large ? new LargeCogHelper() : new SmallCogHelper());
integratedCogHelperId = large ? PlacementHelpers.register(new IntegratedCogHelper()) : -1;
integratedCogHelperId = PlacementHelpers.register(large ? new IntegratedLargeCogHelper() : new IntegratedSmallCogHelper());
}
@Override
@ -93,7 +93,7 @@ public class CogwheelBlockItem extends BlockItem {
for (int offset1 : Iterate.positiveAndNegative) {
for (int offset2 : Iterate.positiveAndNegative) {
BlockPos connectedPos = pos.offset(d1, offset1)
.offset(d2, offset2);
.offset(d2, offset2);
BlockState blockState = world.getBlockState(connectedPos);
if (!(blockState.getBlock() instanceof CogWheelBlock))
continue;
@ -123,7 +123,7 @@ public class CogwheelBlockItem extends BlockItem {
if (!((CogWheelBlock) state.getBlock()).isLarge) {
List<Direction> directions =
IPlacementHelper.orderedByDistanceExceptAxis(pos, ray.getHitVec(), state.get(AXIS));
IPlacementHelper.orderedByDistanceExceptAxis(pos, ray.getHitVec(), state.get(AXIS));
for (Direction dir : directions) {
BlockPos newPos = pos.offset(dir);
@ -132,8 +132,8 @@ public class CogwheelBlockItem extends BlockItem {
continue;
if (!world.getBlockState(newPos)
.getMaterial()
.isReplaceable())
.getMaterial()
.isReplaceable())
continue;
return PlacementOffset.success(newPos, s -> s.with(AXIS, state.get(AXIS)));
@ -162,19 +162,19 @@ public class CogwheelBlockItem extends BlockItem {
if (((CogWheelBlock) state.getBlock()).isLarge) {
Direction side = IPlacementHelper.orderedByDistanceOnlyAxis(pos, ray.getHitVec(), state.get(AXIS))
.get(0);
.get(0);
List<Direction> directions =
IPlacementHelper.orderedByDistanceExceptAxis(pos, ray.getHitVec(), state.get(AXIS));
IPlacementHelper.orderedByDistanceExceptAxis(pos, ray.getHitVec(), state.get(AXIS));
for (Direction dir : directions) {
BlockPos newPos = pos.offset(dir)
.offset(side);
.offset(side);
if (!CogWheelBlock.isValidCogwheelPosition(true, world, newPos, dir.getAxis()))
continue;
if (!world.getBlockState(newPos)
.getMaterial()
.isReplaceable())
.getMaterial()
.isReplaceable())
continue;
return PlacementOffset.success(newPos, s -> s.with(AXIS, dir.getAxis()));
@ -199,16 +199,16 @@ public class CogwheelBlockItem extends BlockItem {
public PlacementOffset getOffset(PlayerEntity player, World world, BlockState state, BlockPos pos, BlockRayTraceResult ray) {
// diagonal gears of different size
Direction closest = IPlacementHelper.orderedByDistanceExceptAxis(pos, ray.getHitVec(), state.get(AXIS))
.get(0);
.get(0);
List<Direction> directions = IPlacementHelper.orderedByDistanceExceptAxis(pos, ray.getHitVec(),
state.get(AXIS), d -> d.getAxis() != closest.getAxis());
state.get(AXIS), d -> d.getAxis() != closest.getAxis());
for (Direction dir : directions) {
BlockPos newPos = pos.offset(dir)
.offset(closest);
.offset(closest);
if (!world.getBlockState(newPos)
.getMaterial()
.isReplaceable())
.getMaterial()
.isReplaceable())
continue;
if (!CogWheelBlock.isValidCogwheelPosition(ICogWheel.isLargeCog(state), world, newPos, state.get(AXIS)))
@ -222,16 +222,16 @@ public class CogwheelBlockItem extends BlockItem {
protected boolean hitOnShaft(BlockState state, BlockRayTraceResult ray) {
return AllShapes.SIX_VOXEL_POLE.get(state.get(AXIS))
.getBoundingBox()
.grow(0.001)
.contains(ray.getHitVec()
.subtract(ray.getHitVec()
.align(Iterate.axisSet)));
.getBoundingBox()
.grow(0.001)
.contains(ray.getHitVec()
.subtract(ray.getHitVec()
.align(Iterate.axisSet)));
}
}
@MethodsReturnNonnullByDefault
public static class IntegratedCogHelper implements IPlacementHelper {
public static class IntegratedLargeCogHelper implements IPlacementHelper {
@Override
public Predicate<ItemStack> getItemPredicate() {
@ -250,10 +250,10 @@ public class CogwheelBlockItem extends BlockItem {
if (state.contains(HorizontalKineticBlock.HORIZONTAL_FACING))
newAxis = state.get(HorizontalKineticBlock.HORIZONTAL_FACING)
.getAxis();
.getAxis();
else if (state.contains(DirectionalKineticBlock.FACING))
newAxis = state.get(DirectionalKineticBlock.FACING)
.getAxis();
.getAxis();
else
newAxis = Axis.Y;
@ -261,15 +261,15 @@ public class CogwheelBlockItem extends BlockItem {
return PlacementOffset.fail();
List<Direction> directions =
IPlacementHelper.orderedByDistanceExceptAxis(pos, ray.getHitVec(), face.getAxis(), newAxis);
IPlacementHelper.orderedByDistanceExceptAxis(pos, ray.getHitVec(), face.getAxis(), newAxis);
for (Direction d : directions) {
BlockPos newPos = pos.offset(face)
.offset(d);
.offset(d);
if (!world.getBlockState(newPos)
.getMaterial()
.isReplaceable())
.getMaterial()
.isReplaceable())
continue;
if (!CogWheelBlock.isValidCogwheelPosition(false, world, newPos, newAxis))
@ -282,4 +282,57 @@ public class CogwheelBlockItem extends BlockItem {
}
}
@MethodsReturnNonnullByDefault
public static class IntegratedSmallCogHelper implements IPlacementHelper {
@Override
public Predicate<ItemStack> getItemPredicate() {
return ((Predicate<ItemStack>) ICogWheel::isSmallCogItem).and(ICogWheel::isDedicatedCogItem);
}
@Override
public Predicate<BlockState> getStatePredicate() {
return s -> !ICogWheel.isDedicatedCogWheel(s.getBlock()) && ICogWheel.isSmallCog(s);
}
@Override
public PlacementOffset getOffset(PlayerEntity player, World world, BlockState state, BlockPos pos, BlockRayTraceResult ray) {
Direction face = ray.getFace();
Axis newAxis;
if (state.contains(HorizontalKineticBlock.HORIZONTAL_FACING))
newAxis = state.get(HorizontalKineticBlock.HORIZONTAL_FACING)
.getAxis();
else if (state.contains(DirectionalKineticBlock.FACING))
newAxis = state.get(DirectionalKineticBlock.FACING)
.getAxis();
else
newAxis = Axis.Y;
if (face.getAxis() == newAxis)
return PlacementOffset.fail();
List<Direction> directions = IPlacementHelper.orderedByDistanceExceptAxis(pos, ray.getHitVec(), newAxis);
for (Direction d : directions) {
BlockPos newPos = pos.offset(d);
if (!world.getBlockState(newPos)
.getMaterial()
.isReplaceable())
continue;
if (!CogWheelBlock.isValidCogwheelPosition(false, world, newPos, newAxis))
return PlacementOffset.fail();
return PlacementOffset.success()
.at(newPos)
.withTransform(s -> s.with(CogWheelBlock.AXIS, newAxis));
}
return PlacementOffset.fail();
}
}
}

View file

@ -20,8 +20,6 @@ import net.minecraft.item.ItemUseContext;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.ActionResultType;
import net.minecraft.util.Direction;
import net.minecraft.util.SoundCategory;
import net.minecraft.util.SoundEvents;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraft.world.server.ServerWorld;
@ -75,7 +73,7 @@ public interface IWrenchable {
default void playRemoveSound(World world, BlockPos pos) {
AllSoundEvents.WRENCH_REMOVE.playOnServer(world, pos, 1, Create.random.nextFloat() * .5f + .5f);
}
default void playRotateSound(World world, BlockPos pos) {
AllSoundEvents.WRENCH_ROTATE.playOnServer(world, pos, 1, Create.random.nextFloat() + .5f);
}

View file

@ -0,0 +1,78 @@
package com.simibubi.create.content.curiosities.armor;
import java.util.function.Supplier;
import com.simibubi.create.AllItems;
import com.simibubi.create.AllSoundEvents;
import net.minecraft.inventory.EquipmentSlotType;
import net.minecraft.item.IArmorMaterial;
import net.minecraft.item.crafting.Ingredient;
import net.minecraft.util.LazyValue;
import net.minecraft.util.SoundEvent;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
public enum AllArmorMaterials implements IArmorMaterial {
COPPER("copper", 7, new int[] { 1, 3, 4, 2 }, 25, AllSoundEvents.COPPER_ARMOR_EQUIP.getMainEvent(), 0.0F, 0.0F,
() -> Ingredient.fromItems(AllItems.COPPER_INGOT.get()))
;
private static final int[] MAX_DAMAGE_ARRAY = new int[] { 13, 15, 16, 11 };
private final String name;
private final int maxDamageFactor;
private final int[] damageReductionAmountArray;
private final int enchantability;
private final SoundEvent soundEvent;
private final float toughness;
private final float knockbackResistance;
private final LazyValue<Ingredient> repairMaterial;
private AllArmorMaterials(String p_i231593_3_, int p_i231593_4_, int[] p_i231593_5_, int p_i231593_6_,
SoundEvent p_i231593_7_, float p_i231593_8_, float p_i231593_9_, Supplier<Ingredient> p_i231593_10_) {
this.name = p_i231593_3_;
this.maxDamageFactor = p_i231593_4_;
this.damageReductionAmountArray = p_i231593_5_;
this.enchantability = p_i231593_6_;
this.soundEvent = p_i231593_7_;
this.toughness = p_i231593_8_;
this.knockbackResistance = p_i231593_9_;
this.repairMaterial = new LazyValue<>(p_i231593_10_);
}
public int getDurability(EquipmentSlotType p_200896_1_) {
return MAX_DAMAGE_ARRAY[p_200896_1_.getIndex()] * this.maxDamageFactor;
}
public int getDamageReductionAmount(EquipmentSlotType p_200902_1_) {
return this.damageReductionAmountArray[p_200902_1_.getIndex()];
}
public int getEnchantability() {
return this.enchantability;
}
public SoundEvent getSoundEvent() {
return this.soundEvent;
}
public Ingredient getRepairMaterial() {
return this.repairMaterial.getValue();
}
@OnlyIn(Dist.CLIENT)
public String getName() {
return this.name;
}
public float getToughness() {
return this.toughness;
}
public float getKnockbackResistance() {
return this.knockbackResistance;
}
}

View file

@ -0,0 +1,28 @@
package com.simibubi.create.content.curiosities.armor;
import com.simibubi.create.Create;
import net.minecraft.entity.Entity;
import net.minecraft.inventory.EquipmentSlotType;
import net.minecraft.item.ArmorItem;
import net.minecraft.item.ItemStack;
public class CopperArmorItem extends ArmorItem {
public CopperArmorItem(EquipmentSlotType p_i48534_2_, Properties p_i48534_3_) {
super(AllArmorMaterials.COPPER, p_i48534_2_, p_i48534_3_);
}
public boolean isWornBy(Entity entity) {
for (ItemStack itemStack : entity.getArmorInventoryList())
if (itemStack.getItem() == this)
return true;
return false;
}
@Override
public String getArmorTexture(ItemStack stack, Entity entity, EquipmentSlotType slot, String type) {
return String.format("%s:textures/models/armor/copper.png", Create.ID);
}
}

View file

@ -0,0 +1,141 @@
package com.simibubi.create.content.curiosities.armor;
import com.mojang.blaze3d.matrix.MatrixStack;
import com.simibubi.create.AllBlockPartials;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.AllItems;
import com.simibubi.create.CreateClient;
import com.simibubi.create.foundation.gui.GuiGameElement;
import com.simibubi.create.foundation.render.SuperByteBuffer;
import com.simibubi.create.foundation.utility.AngleHelper;
import com.simibubi.create.foundation.utility.AnimationTickHolder;
import com.simibubi.create.foundation.utility.ColorHelper;
import net.minecraft.block.BlockState;
import net.minecraft.client.MainWindow;
import net.minecraft.client.Minecraft;
import net.minecraft.client.entity.player.ClientPlayerEntity;
import net.minecraft.client.renderer.IRenderTypeBuffer;
import net.minecraft.client.renderer.IRenderTypeBuffer.Impl;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.entity.EntityRenderer;
import net.minecraft.client.renderer.entity.EntityRendererManager;
import net.minecraft.client.renderer.entity.LivingRenderer;
import net.minecraft.client.renderer.entity.layers.LayerRenderer;
import net.minecraft.client.renderer.entity.model.BipedModel;
import net.minecraft.client.renderer.entity.model.EntityModel;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.Pose;
import net.minecraft.tags.FluidTags;
import net.minecraft.util.Direction;
import net.minecraft.util.StringUtils;
import net.minecraft.util.text.ITextComponent;
import net.minecraft.util.text.StringTextComponent;
public class CopperBacktankArmorLayer<T extends LivingEntity, M extends EntityModel<T>> extends LayerRenderer<T, M> {
private LivingRenderer<T, M> renderer;
public CopperBacktankArmorLayer(LivingRenderer<T, M> renderer) {
super(renderer);
this.renderer = renderer;
renderer.addLayer(this);
}
@Override
public void render(MatrixStack ms, IRenderTypeBuffer buffer, int light, LivingEntity entity, float yaw, float pitch,
float pt, float p_225628_8_, float p_225628_9_, float p_225628_10_) {
if (entity.getPose() == Pose.SLEEPING)
return;
if (!AllItems.COPPER_BACKTANK.get()
.isWornBy(entity))
return;
M entityModel = renderer.getEntityModel();
if (!(entityModel instanceof BipedModel))
return;
ms.push();
BipedModel<?> model = (BipedModel<?>) entityModel;
BlockState renderedState = AllBlocks.COPPER_BACKTANK.getDefaultState()
.with(CopperBacktankBlock.HORIZONTAL_FACING, Direction.SOUTH);
RenderType renderType = RenderType.getCutout();
SuperByteBuffer backtank = CreateClient.bufferCache.renderBlock(renderedState);
SuperByteBuffer cogs =
CreateClient.bufferCache.renderPartial(AllBlockPartials.COPPER_BACKTANK_COGS, renderedState);
model.bipedBody.rotate(ms);
ms.translate(-1 / 2f, 10 / 16f, 1f);
ms.scale(1, -1, -1);
backtank.light(light)
.renderInto(ms, buffer.getBuffer(renderType));
cogs.matrixStacker()
.centre()
.rotateY(180)
.unCentre()
.translate(0, 6.5f / 16, 11f / 16)
.rotate(Direction.EAST, AngleHelper.rad(2 * AnimationTickHolder.getRenderTime(entity.world) % 360))
.translate(0, -6.5f / 16, -11f / 16);
cogs.light(light)
.renderInto(ms, buffer.getBuffer(renderType));
if (buffer instanceof Impl)
((Impl) buffer).draw(renderType);
ms.pop();
}
public static void register() {
EntityRendererManager renderManager = Minecraft.getInstance()
.getRenderManager();
registerOn(renderManager.playerRenderer);
for (EntityRenderer<?> renderer : renderManager.renderers.values())
registerOn(renderer);
}
private static void registerOn(EntityRenderer<?> entityRenderer) {
if (!(entityRenderer instanceof LivingRenderer))
return;
new CopperBacktankArmorLayer<>((LivingRenderer<?, ?>) entityRenderer);
}
public static void renderRemainingAirOverlay(MatrixStack ms, Impl buffers, int light, int overlay, float pt) {
ClientPlayerEntity player = Minecraft.getInstance().player;
if (player == null)
return;
if (player.isSpectator() || player.isCreative())
return;
if (!player.getPersistentData()
.contains("VisualBacktankAir"))
return;
if (!player.areEyesInFluid(FluidTags.WATER))
return;
int timeLeft = player.getPersistentData()
.getInt("VisualBacktankAir");
ms.push();
MainWindow window = Minecraft.getInstance()
.getWindow();
ms.translate(window.getScaledWidth() / 2 + 90, window.getScaledHeight() - 53, 0);
ITextComponent text = new StringTextComponent(StringUtils.ticksToElapsedTime(timeLeft * 20));
GuiGameElement.of(AllItems.COPPER_BACKTANK.asStack())
.at(0, 0)
.render(ms);
int color = 0xFF_FFFFFF;
if (timeLeft < 60 && timeLeft % 2 == 0) {
color = ColorHelper.mixColors(0xFF_FF0000, color, Math.max(timeLeft / 60f, .25f));
}
Minecraft.getInstance().fontRenderer.drawWithShadow(ms, text, 16, 5, color);
buffers.draw();
ms.pop();
}
}

View file

@ -0,0 +1,165 @@
package com.simibubi.create.content.curiosities.armor;
import java.util.Optional;
import com.simibubi.create.AllItems;
import com.simibubi.create.AllShapes;
import com.simibubi.create.AllTileEntities;
import com.simibubi.create.content.contraptions.base.HorizontalKineticBlock;
import com.simibubi.create.foundation.block.ITE;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.block.IWaterLoggable;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.fluid.FluidState;
import net.minecraft.fluid.Fluids;
import net.minecraft.inventory.EquipmentSlotType;
import net.minecraft.item.BlockItem;
import net.minecraft.item.BlockItemUseContext;
import net.minecraft.item.ItemStack;
import net.minecraft.pathfinding.PathType;
import net.minecraft.state.StateContainer.Builder;
import net.minecraft.state.properties.BlockStateProperties;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.ActionResultType;
import net.minecraft.util.Direction;
import net.minecraft.util.Direction.Axis;
import net.minecraft.util.Hand;
import net.minecraft.util.SoundCategory;
import net.minecraft.util.SoundEvents;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.BlockRayTraceResult;
import net.minecraft.util.math.shapes.ISelectionContext;
import net.minecraft.util.math.shapes.VoxelShape;
import net.minecraft.util.text.ITextComponent;
import net.minecraft.world.IBlockReader;
import net.minecraft.world.IWorld;
import net.minecraft.world.IWorldReader;
import net.minecraft.world.World;
import net.minecraftforge.common.util.FakePlayer;
public class CopperBacktankBlock extends HorizontalKineticBlock
implements ITE<CopperBacktankTileEntity>, IWaterLoggable {
public CopperBacktankBlock(Properties properties) {
super(properties);
setDefaultState(super.getDefaultState().with(BlockStateProperties.WATERLOGGED, false));
}
@Override
public FluidState getFluidState(BlockState state) {
return state.get(BlockStateProperties.WATERLOGGED) ? Fluids.WATER.getStillFluidState(false)
: Fluids.EMPTY.getDefaultState();
}
@Override
protected void fillStateContainer(Builder<Block, BlockState> builder) {
builder.add(BlockStateProperties.WATERLOGGED);
super.fillStateContainer(builder);
}
@Override
public BlockState updatePostPlacement(BlockState state, Direction direction, BlockState neighbourState,
IWorld world, BlockPos pos, BlockPos neighbourPos) {
if (state.get(BlockStateProperties.WATERLOGGED)) {
world.getPendingFluidTicks()
.scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickRate(world));
}
return state;
}
@Override
public BlockState getStateForPlacement(BlockItemUseContext context) {
FluidState ifluidstate = context.getWorld()
.getFluidState(context.getPos());
return super.getStateForPlacement(context).with(BlockStateProperties.WATERLOGGED,
Boolean.valueOf(ifluidstate.getFluid() == Fluids.WATER));
}
@Override
public boolean hasShaftTowards(IWorldReader world, BlockPos pos, BlockState state, Direction face) {
return face == Direction.UP;
}
@Override
public Axis getRotationAxis(BlockState state) {
return Axis.Y;
}
@Override
public void onBlockPlacedBy(World worldIn, BlockPos pos, BlockState state, LivingEntity placer, ItemStack stack) {
super.onBlockPlacedBy(worldIn, pos, state, placer, stack);
if (worldIn.isRemote)
return;
if (stack == null)
return;
withTileEntityDo(worldIn, pos, te -> {
te.setAirLevel(stack.getOrCreateTag()
.getInt("Air"));
if (stack.hasDisplayName())
te.setCustomName(stack.getDisplayName());
});
}
@Override
public ActionResultType onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand p_225533_5_,
BlockRayTraceResult p_225533_6_) {
if (player == null)
return ActionResultType.PASS;
if (player instanceof FakePlayer)
return ActionResultType.PASS;
if (player.isSneaking())
return ActionResultType.PASS;
if (player.getHeldItemMainhand()
.getItem() instanceof BlockItem)
return ActionResultType.PASS;
if (!player.getItemStackFromSlot(EquipmentSlotType.CHEST)
.isEmpty())
return ActionResultType.PASS;
if (!world.isRemote) {
world.playSound(null, pos, SoundEvents.ENTITY_ITEM_PICKUP, SoundCategory.PLAYERS, .75f, 1);
player.setItemStackToSlot(EquipmentSlotType.CHEST, getItem(world, pos, state));
world.destroyBlock(pos, false);
}
return ActionResultType.SUCCESS;
}
@Override
public ItemStack getItem(IBlockReader p_185473_1_, BlockPos p_185473_2_, BlockState p_185473_3_) {
ItemStack item = AllItems.COPPER_BACKTANK.asStack();
Optional<CopperBacktankTileEntity> tileEntityOptional = getTileEntityOptional(p_185473_1_, p_185473_2_);
int air = tileEntityOptional.map(CopperBacktankTileEntity::getAirLevel)
.orElse(0);
ITextComponent customName = tileEntityOptional.map(CopperBacktankTileEntity::getCustomName)
.orElse(null);
item.getOrCreateTag()
.putInt("Air", air);
if (customName != null)
item.setDisplayName(customName);
return item;
}
@Override
public VoxelShape getShape(BlockState p_220053_1_, IBlockReader p_220053_2_, BlockPos p_220053_3_,
ISelectionContext p_220053_4_) {
return AllShapes.BACKTANK;
}
@Override
public TileEntity createTileEntity(BlockState state, IBlockReader world) {
return AllTileEntities.COPPER_BACKTANK.create();
}
@Override
public Class<CopperBacktankTileEntity> getTileEntityClass() {
return CopperBacktankTileEntity.class;
}
@Override
public boolean allowsMovement(BlockState state, IBlockReader reader, BlockPos pos, PathType type) {
return false;
}
}

View file

@ -0,0 +1,21 @@
package com.simibubi.create.content.curiosities.armor;
import com.jozufozu.flywheel.backend.instancing.InstancedModel;
import com.jozufozu.flywheel.backend.instancing.InstancedTileRenderer;
import com.simibubi.create.AllBlockPartials;
import com.simibubi.create.content.contraptions.base.KineticTileEntity;
import com.simibubi.create.content.contraptions.base.RotatingData;
import com.simibubi.create.content.contraptions.base.SingleRotatingInstance;
public class CopperBacktankInstance extends SingleRotatingInstance {
public CopperBacktankInstance(InstancedTileRenderer<?> modelManager, KineticTileEntity tile) {
super(modelManager, tile);
}
@Override
protected InstancedModel<RotatingData> getModel() {
return getRotatingMaterial().getModel(AllBlockPartials.COPPER_BACKTANK_SHAFT, blockState);
}
}

View file

@ -0,0 +1,67 @@
package com.simibubi.create.content.curiosities.armor;
import com.simibubi.create.foundation.config.AllConfigs;
import net.minecraft.inventory.EquipmentSlotType;
import net.minecraft.item.BlockItem;
import net.minecraft.item.ItemGroup;
import net.minecraft.item.ItemStack;
import net.minecraft.item.ItemUseContext;
import net.minecraft.nbt.CompoundNBT;
import net.minecraft.util.ActionResultType;
import net.minecraft.util.NonNullList;
import net.minecraft.util.math.MathHelper;
public class CopperBacktankItem extends CopperArmorItem {
private BlockItem blockItem;
public CopperBacktankItem(Properties p_i48534_3_, BlockItem blockItem) {
super(EquipmentSlotType.CHEST, p_i48534_3_);
this.blockItem = blockItem;
}
@Override
public ActionResultType onItemUse(ItemUseContext p_195939_1_) {
return blockItem.onItemUse(p_195939_1_);
}
@Override
public boolean isDamageable() {
return false;
}
@Override
public int getRGBDurabilityForDisplay(ItemStack stack) {
return 0xefefef;
}
@Override
public void fillItemGroup(ItemGroup p_150895_1_, NonNullList<ItemStack> p_150895_2_) {
if (!isInGroup(p_150895_1_))
return;
ItemStack stack = new ItemStack(this);
CompoundNBT nbt = new CompoundNBT();
nbt.putInt("Air", AllConfigs.SERVER.curiosities.maxAirInBacktank.get());
stack.setTag(nbt);
p_150895_2_.add(stack);
}
@Override
public double getDurabilityForDisplay(ItemStack stack) {
return 1 - MathHelper
.clamp(getRemainingAir(stack) / ((float) AllConfigs.SERVER.curiosities.maxAirInBacktank.get()), 0, 1);
}
@Override
public boolean showDurabilityBar(ItemStack stack) {
return true;
}
public static int getRemainingAir(ItemStack stack) {
CompoundNBT orCreateTag = stack.getOrCreateTag();
return orCreateTag.getInt("Air");
}
}

View file

@ -0,0 +1,49 @@
package com.simibubi.create.content.curiosities.armor;
import com.mojang.blaze3d.matrix.MatrixStack;
import com.simibubi.create.AllBlockPartials;
import com.simibubi.create.CreateClient;
import com.simibubi.create.content.contraptions.base.KineticTileEntity;
import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer;
import com.simibubi.create.foundation.render.PartialBufferer;
import com.simibubi.create.foundation.render.SuperByteBuffer;
import com.simibubi.create.foundation.utility.AngleHelper;
import com.simibubi.create.foundation.utility.AnimationTickHolder;
import net.minecraft.client.renderer.IRenderTypeBuffer;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher;
import net.minecraft.util.Direction;
public class CopperBacktankRenderer extends KineticTileEntityRenderer {
public CopperBacktankRenderer(TileEntityRendererDispatcher dispatcher) {
super(dispatcher);
}
@Override
protected void renderSafe(KineticTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer,
int light, int overlay) {
super.renderSafe(te, partialTicks, ms, buffer, light, overlay);
SuperByteBuffer cogs =
CreateClient.bufferCache.renderPartial(AllBlockPartials.COPPER_BACKTANK_COGS, te.getBlockState());
cogs.matrixStacker()
.centre()
.rotateY(180 + AngleHelper.horizontalAngle(te.getBlockState()
.get(CopperBacktankBlock.HORIZONTAL_FACING)))
.unCentre()
.translate(0, 6.5f / 16, 11f / 16)
.rotate(Direction.EAST,
AngleHelper.rad(te.getSpeed() / 4f * AnimationTickHolder.getRenderTime(te.getWorld()) % 360))
.translate(0, -6.5f / 16, -11f / 16);
cogs.light(light)
.renderInto(ms, buffer.getBuffer(RenderType.getSolid()));
}
@Override
protected SuperByteBuffer getRotatedModel(KineticTileEntity te) {
return PartialBufferer.get(AllBlockPartials.COPPER_BACKTANK_SHAFT, te.getBlockState());
}
}

View file

@ -0,0 +1,130 @@
package com.simibubi.create.content.curiosities.armor;
import com.simibubi.create.AllItems;
import com.simibubi.create.AllSoundEvents;
import com.simibubi.create.Create;
import com.simibubi.create.content.contraptions.base.KineticTileEntity;
import com.simibubi.create.content.contraptions.particle.AirParticleData;
import com.simibubi.create.foundation.config.AllConfigs;
import com.simibubi.create.foundation.utility.VecHelper;
import net.minecraft.block.BlockState;
import net.minecraft.nbt.CompoundNBT;
import net.minecraft.particles.ParticleTypes;
import net.minecraft.tileentity.TileEntityType;
import net.minecraft.util.Direction.Axis;
import net.minecraft.util.INameable;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.vector.Vector3d;
import net.minecraft.util.text.ITextComponent;
import net.minecraft.util.text.TranslationTextComponent;
public class CopperBacktankTileEntity extends KineticTileEntity implements INameable {
public int airLevel;
public int airLevelTimer;
private ITextComponent customName;
public CopperBacktankTileEntity(TileEntityType<?> typeIn) {
super(typeIn);
}
@Override
public void tick() {
super.tick();
if (getSpeed() == 0)
return;
if (airLevelTimer > 0) {
airLevelTimer--;
return;
}
int max = getMaxAir();
if (world.isRemote) {
Vector3d centerOf = VecHelper.getCenterOf(pos);
Vector3d v = VecHelper.offsetRandomly(centerOf, Create.random, .65f);
Vector3d m = centerOf.subtract(v);
if (airLevel != max)
world.addParticle(new AirParticleData(1, .05f), v.x, v.y, v.z, m.x, m.y, m.z);
return;
}
if (airLevel == max)
return;
float abs = Math.abs(getSpeed());
int increment = MathHelper.clamp(((int) abs - 100) / 20, 1, 5);
airLevel = Math.min(max, airLevel + increment);
if (airLevel == max)
sendData();
airLevelTimer = MathHelper.clamp((int) (128f - abs / 5f) - 108, 0, 20);
}
protected int getMaxAir() {
return AllConfigs.SERVER.curiosities.maxAirInBacktank.get();
}
public int getAirLevel() {
return airLevel;
}
public void setAirLevel(int airLevel) {
this.airLevel = airLevel;
sendData();
}
public void setCustomName(ITextComponent customName) {
this.customName = customName;
}
public ITextComponent getCustomName() {
return customName;
}
@Override
protected void write(CompoundNBT compound, boolean clientPacket) {
super.write(compound, clientPacket);
compound.putInt("Air", airLevel);
compound.putInt("Timer", airLevelTimer);
if (this.customName != null)
compound.putString("CustomName", ITextComponent.Serializer.toJson(this.customName));
}
@Override
protected void fromTag(BlockState state, CompoundNBT compound, boolean clientPacket) {
super.fromTag(state, compound, clientPacket);
int prev = airLevel;
airLevel = compound.getInt("Air");
airLevelTimer = compound.getInt("Timer");
if (compound.contains("CustomName", 8))
this.customName = ITextComponent.Serializer.fromJson(compound.getString("CustomName"));
if (prev != 0 && prev != airLevel && airLevel == getMaxAir() && clientPacket)
playFilledEffect();
}
protected void playFilledEffect() {
AllSoundEvents.CONFIRM.playAt(world, pos, 0.4f, 1, true);
Vector3d baseMotion = new Vector3d(.25, 0.1, 0);
Vector3d baseVec = VecHelper.getCenterOf(pos);
for (int i = 0; i < 360; i += 10) {
Vector3d m = VecHelper.rotate(baseMotion, i, Axis.Y);
Vector3d v = baseVec.add(m.normalize()
.scale(.25f));
world.addParticle(ParticleTypes.SPIT, v.x, v.y, v.z, m.x, m.y, m.z);
}
}
@Override
public ITextComponent getName() {
return this.customName != null ? this.customName
: new TranslationTextComponent(AllItems.COPPER_BACKTANK.get()
.getTranslationKey());
}
@Override
public boolean shouldRenderAsTE() {
return true;
}
}

View file

@ -0,0 +1,68 @@
package com.simibubi.create.content.curiosities.armor;
import com.simibubi.create.AllItems;
import com.simibubi.create.foundation.utility.NBTHelper;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.Pose;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.inventory.EquipmentSlotType;
import net.minecraft.util.math.vector.Vector3d;
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.common.ObfuscationReflectionHelper;
@EventBusSubscriber
public class DivingBootsItem extends CopperArmorItem {
public DivingBootsItem(Properties p_i48534_3_) {
super(EquipmentSlotType.FEET, p_i48534_3_);
}
@SubscribeEvent
public static void accellerateDescentUnderwater(LivingUpdateEvent event) {
LivingEntity entity = event.getEntityLiving();
if (!affects(entity))
return;
Vector3d motion = entity.getMotion();
Boolean isJumping = ObfuscationReflectionHelper.getPrivateValue(LivingEntity.class, entity, "field_70703_bu");
entity.onGround |= entity.collidedVertically;
if (isJumping && entity.onGround) {
motion = motion.add(0, .5f, 0);
entity.onGround = false;
} else {
motion = motion.add(0, -0.05f, 0);
}
float multiplier = 1.3f;
if (motion.mul(1, 0, 1)
.length() < 0.145f && (entity.moveForward > 0 || entity.moveStrafing != 0) && !entity.isSneaking())
motion = motion.mul(multiplier, 1, multiplier);
entity.setMotion(motion);
}
protected static boolean affects(LivingEntity entity) {
if (!AllItems.DIVING_BOOTS.get()
.isWornBy(entity)) {
entity.getPersistentData()
.remove("HeavyBoots");
return false;
}
NBTHelper.putMarker(entity.getPersistentData(), "HeavyBoots");
if (!entity.isInWater())
return false;
if (entity.getPose() == Pose.SWIMMING)
return false;
if (entity instanceof PlayerEntity) {
PlayerEntity playerEntity = (PlayerEntity) entity;
if (playerEntity.abilities.isFlying)
return false;
}
return true;
}
}

View file

@ -0,0 +1,72 @@
package com.simibubi.create.content.curiosities.armor;
import com.simibubi.create.AllItems;
import net.minecraft.entity.LivingEntity;
import net.minecraft.inventory.EquipmentSlotType;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.CompoundNBT;
import net.minecraft.potion.EffectInstance;
import net.minecraft.potion.Effects;
import net.minecraft.world.World;
import net.minecraftforge.event.entity.living.LivingEvent.LivingUpdateEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod.EventBusSubscriber;
@EventBusSubscriber
public class DivingHelmetItem extends CopperArmorItem {
public DivingHelmetItem(Properties p_i48534_3_) {
super(EquipmentSlotType.HEAD, p_i48534_3_);
}
@SubscribeEvent
public static void breatheUnderwater(LivingUpdateEvent event) {
LivingEntity entity = event.getEntityLiving();
World world = entity.world;
boolean second = world.getGameTime() % 20 == 0;
boolean drowning = entity.getAir() == 0;
if (world.isRemote)
entity.getPersistentData()
.remove("VisualBacktankAir");
if (!AllItems.DIVING_HELMET.get()
.isWornBy(entity))
return;
if (!entity.isInWater())
return;
ItemStack backtank = ItemStack.EMPTY;
for (ItemStack itemStack : entity.getArmorInventoryList()) {
if (AllItems.COPPER_BACKTANK.isIn(itemStack)) {
backtank = itemStack;
break;
}
}
if (backtank.isEmpty())
return;
CompoundNBT tag = backtank.getOrCreateTag();
int airRemaining = tag.getInt("Air");
if (airRemaining == 0)
return;
if (drowning)
entity.setAir(10);
if (world.isRemote)
entity.getPersistentData()
.putInt("VisualBacktankAir", airRemaining);
if (!second)
return;
entity.setAir(Math.min(entity.getMaxAir(), entity.getAir() + 10));
entity.addPotionEffect(new EffectInstance(Effects.WATER_BREATHING, 30, 0, true, false, true));
tag.putInt("Air", airRemaining - 1);
backtank.setTag(tag);
}
}

View file

@ -229,8 +229,8 @@ public class ChromaticProjectorScreen extends AbstractSimiScreen {
0xffffff);
GuiGameElement.of(renderedItem)
.at(guiLeft + background.width + 10, guiTop + 140, -150)
.scale(5)
.at(guiLeft + background.width + 10, guiTop + 140, -150)
.render(matrixStack);
}

View file

@ -96,14 +96,14 @@ public class SymmetryWandScreen extends AbstractSimiScreen {
widgets.add(labelAlign);
widgets.add(areaType);
widgets.add(labelType);
confirmButton = new IconButton(guiLeft + background.width - 33, guiTop + background.height - 24, AllIcons.I_CONFIRM);
widgets.add(confirmButton);
}
private void initAlign(SymmetryMirror element) {
if (areaAlign != null)
if (areaAlign != null)
widgets.remove(areaAlign);
areaAlign = new SelectionScrollInput(guiLeft + 45, guiTop + 43, 109, 18).forOptions(element.getAlignToolTips())
@ -121,10 +121,10 @@ public class SymmetryWandScreen extends AbstractSimiScreen {
textRenderer.draw(matrixStack, wand.getDisplayName(), guiLeft + 11, guiTop + 4, 0x6B3802);
renderBlock(matrixStack);
GuiGameElement.of(wand)
.at(guiLeft + 170, guiTop + 490, -150)
.scale(4)
.rotate(-70, 20, 20)
.render(matrixStack);
.scale(4)
.rotate(-70, 20, 20)
.at(guiLeft + 170, guiTop + 490, -150)
.render(matrixStack);
}
protected void renderBlock(MatrixStack ms) {
@ -150,7 +150,7 @@ public class SymmetryWandScreen extends AbstractSimiScreen {
client.player.setHeldItem(hand, heldItem);
super.removed();
}
@Override
public boolean mouseClicked(double x, double y, int button) {
if (confirmButton.isHovered()) {

View file

@ -135,9 +135,9 @@ public class ZapperScreen extends AbstractSimiScreen {
protected void renderZapper(MatrixStack matrixStack) {
GuiGameElement.of(zapper)
.at((this.width - this.sWidth) / 2 + 220, this.height / 2 - this.sHeight / 4 + 27, -150)
.scale(4)
.render(matrixStack);
.scale(4)
.at((this.width - this.sWidth) / 2 + 220, this.height / 2 - this.sHeight / 4 + 27, -150)
.render(matrixStack);
}
protected void renderBlock(MatrixStack matrixStack) {

View file

@ -97,7 +97,7 @@ public class AdjustableCrateScreen extends AbstractSimiContainerScreen<Adjustabl
}
GuiGameElement.of(renderedItem)
.at(guiLeft + ADJUSTABLE_CRATE.width + 110, guiTop + 70, -150)
.<GuiGameElement.GuiRenderBuilder>at(guiLeft + ADJUSTABLE_CRATE.width + 110, guiTop + 70, -150)
.scale(5)
.render(matrixStack);
}

View file

@ -122,14 +122,14 @@ public class ArmTileEntity extends KineticTileEntity {
}
if (world.isRemote)
return;
if (phase == Phase.MOVE_TO_INPUT)
collectItem();
else if (phase == Phase.MOVE_TO_OUTPUT)
depositItem();
else if (phase == Phase.SEARCH_INPUTS || phase == Phase.DANCING)
searchForItem();
if (targetReached)
lazyTick();
}
@ -142,7 +142,7 @@ public class ArmTileEntity extends KineticTileEntity {
return;
if (chasedPointProgress < .5f)
return;
if (phase == Phase.SEARCH_INPUTS || phase == Phase.DANCING)
if (phase == Phase.SEARCH_INPUTS || phase == Phase.DANCING)
checkForMusic();
if (phase == Phase.SEARCH_OUTPUTS)
searchForDestination();
@ -175,7 +175,7 @@ public class ArmTileEntity extends KineticTileEntity {
}
private boolean tickMovementProgress() {
boolean targetReachedPreviously = chasedPointProgress >= 1;
boolean targetReachedPreviously = chasedPointProgress >= 1;
chasedPointProgress += Math.min(256, Math.abs(getSpeed())) / 1024f;
if (chasedPointProgress > 1)
chasedPointProgress = 1;
@ -349,7 +349,7 @@ public class ArmTileEntity extends KineticTileEntity {
chasedPointIndex = -1;
sendData();
markDirty();
if (!prevHeld.isItemEqual(heldItem))
world.playSound(null, pos, SoundEvents.ENTITY_ITEM_PICKUP, SoundCategory.BLOCKS, .125f,
.5f + Create.random.nextFloat() * .25f);
@ -416,23 +416,26 @@ public class ArmTileEntity extends KineticTileEntity {
markDirty();
}
public void writeInteractionPoints(CompoundNBT compound) {
if (updateInteractionPoints) {
compound.put("InteractionPoints", interactionPointTag);
} else {
ListNBT pointsNBT = new ListNBT();
inputs.stream()
.map(aip -> aip.serialize(pos))
.forEach(pointsNBT::add);
outputs.stream()
.map(aip -> aip.serialize(pos))
.forEach(pointsNBT::add);
compound.put("InteractionPoints", pointsNBT);
}
}
@Override
public void write(CompoundNBT compound, boolean clientPacket) {
super.write(compound, clientPacket);
if (updateInteractionPoints) {
compound.put("InteractionPoints", interactionPointTag);
} else {
ListNBT pointsNBT = new ListNBT();
inputs.stream()
.map(aip -> aip.serialize(pos))
.forEach(pointsNBT::add);
outputs.stream()
.map(aip -> aip.serialize(pos))
.forEach(pointsNBT::add);
compound.put("InteractionPoints", pointsNBT);
}
writeInteractionPoints(compound);
NBTHelper.writeEnum(compound, "Phase", phase);
compound.putBoolean("Powered", redstoneLocked);
@ -441,6 +444,13 @@ public class ArmTileEntity extends KineticTileEntity {
compound.putFloat("MovementProgress", chasedPointProgress);
}
@Override
public void writeSafe(CompoundNBT compound, boolean clientPacket) {
super.writeSafe(compound, clientPacket);
writeInteractionPoints(compound);
}
@Override
protected void fromTag(BlockState state, CompoundNBT compound, boolean clientPacket) {
int previousIndex = chasedPointIndex;

View file

@ -126,7 +126,7 @@ public class StockpileSwitchScreen extends AbstractSimiScreen {
matrixStack.push();
GuiGameElement.of(renderedItem)
.at(guiLeft + STOCKSWITCH.width + 15, guiTop + 40, -250)
.<GuiGameElement.GuiRenderBuilder>at(guiLeft + STOCKSWITCH.width + 15, guiTop + 40, -250)
.scale(5)
.render(matrixStack);
matrixStack.pop();

View file

@ -69,7 +69,7 @@ public abstract class AbstractFilterScreen<F extends AbstractFilterContainer> ex
textRenderer.draw(ms, I18n.format(container.filterItem.getTranslationKey()), x + 15, y + 3, 0xdedede);
GuiGameElement.of(container.filterItem)
.at(x + background.width, guiTop + background.height - 60)
.<GuiGameElement.GuiRenderBuilder>at(x + background.width, guiTop + background.height - 60, -200)
.scale(5)
.render(ms);

View file

@ -122,7 +122,7 @@ public class SchematicTableScreen extends AbstractSimiContainerScreen<SchematicT
textRenderer.drawWithShadow(matrixStack, noSchematics, mainLeft + 54, mainTop + 26, 0xd3d3d3);
GuiGameElement.of(renderedItem)
.at(mainLeft + 217, mainTop + 50, -150)
.<GuiGameElement.GuiRenderBuilder>at(mainLeft + 217, mainTop + 50, -150)
.scale(3)
.render(matrixStack);

View file

@ -262,7 +262,7 @@ public class SchematicannonScreen extends AbstractSimiContainerScreen<Schematica
renderBlueprintHighlight(matrixStack);
GuiGameElement.of(renderedItem)
.at(guiLeft + 230, guiTop + 110, -200)
.<GuiGameElement.GuiRenderBuilder>at(guiLeft + 230, guiTop + 110, -200)
.scale(5)
.render(matrixStack);
@ -274,7 +274,7 @@ public class SchematicannonScreen extends AbstractSimiContainerScreen<Schematica
if (te.missingItem != null) {
stringWidth += 15;
GuiGameElement.of(te.missingItem)
.at(guiLeft + 150, guiTop + 46, 100)
.<GuiGameElement.GuiRenderBuilder>at(guiLeft + 150, guiTop + 46, 100)
.scale(1)
.render(matrixStack);
}

View file

@ -28,10 +28,15 @@ import com.simibubi.create.foundation.item.ItemHelper;
import com.simibubi.create.foundation.item.ItemHelper.ExtractionCountMode;
import com.simibubi.create.foundation.tileEntity.SmartTileEntity;
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.BehaviourType;
import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour;
import com.simibubi.create.foundation.utility.BlockHelper;
import com.simibubi.create.foundation.utility.IPartialSafeNBT;
import com.simibubi.create.foundation.utility.Iterate;
import com.simibubi.create.foundation.utility.NBTProcessors;
import net.minecraft.block.AbstractRailBlock;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
import net.minecraft.block.PistonHeadBlock;
@ -79,6 +84,10 @@ public class SchematicannonTileEntity extends SmartTileEntity implements INamedC
STOPPED, PAUSED, RUNNING;
}
public enum PrintStage {
BLOCKS, DEFERRED_BLOCKS, ENTITIES
}
// Inventory
public SchematicannonInventory inventory;
@ -99,12 +108,14 @@ public class SchematicannonTileEntity extends SmartTileEntity implements INamedC
private int skipsLeft;
private boolean blockSkipped;
private int printingEntityIndex;
private PrintStage printStage;
public BlockPos target;
public BlockPos previousTarget;
public LinkedHashSet<LazyOptional<IItemHandler>> attachedInventories;
public List<LaunchedItem> flyingBlocks;
public MaterialChecklist checklist;
public List<BlockPos> deferredBlocks;
// Gui information
public float fuelLevel;
@ -142,7 +153,9 @@ public class SchematicannonTileEntity extends SmartTileEntity implements INamedC
inventory = new SchematicannonInventory(this);
statusMsg = "idle";
state = State.STOPPED;
printingEntityIndex = -1;
printingEntityIndex = 0;
printStage = PrintStage.BLOCKS;
deferredBlocks = new LinkedList<>();
replaceMode = 2;
checklist = new MaterialChecklist();
}
@ -198,8 +211,14 @@ public class SchematicannonTileEntity extends SmartTileEntity implements INamedC
replaceTileEntities = options.getBoolean("ReplaceTileEntities");
// Printer & Flying Blocks
if (compound.contains("PrintStage"))
printStage = PrintStage.valueOf(compound.getString("PrintStage"));
if (compound.contains("Target"))
target = NBTUtil.readBlockPos(compound.getCompound("Target"));
if (compound.contains("DeferredBlocks"))
compound.getList("DeferredBlocks", 10).stream()
.map(p -> NBTUtil.readBlockPos((CompoundNBT) p))
.collect(Collectors.toCollection(() -> deferredBlocks));
if (compound.contains("FlyingBlocks"))
readFlyingBlocks(compound);
@ -273,12 +292,20 @@ public class SchematicannonTileEntity extends SmartTileEntity implements INamedC
compound.put("Options", options);
// Printer & Flying Blocks
compound.putString("PrintStage", printStage.name());
if (target != null)
compound.put("Target", NBTUtil.writeBlockPos(target));
ListNBT tagBlocks = new ListNBT();
ListNBT tagDeferredBlocks = new ListNBT();
for (BlockPos p : deferredBlocks)
tagDeferredBlocks.add(NBTUtil.writeBlockPos(p));
compound.put("DeferredBlocks", tagDeferredBlocks);
ListNBT tagFlyingBlocks = new ListNBT();
for (LaunchedItem b : flyingBlocks)
tagBlocks.add(b.serializeNBT());
compound.put("FlyingBlocks", tagBlocks);
tagFlyingBlocks.add(b.serializeNBT());
compound.put("FlyingBlocks", tagFlyingBlocks);
super.write(compound, clientPacket);
}
@ -388,7 +415,7 @@ public class SchematicannonTileEntity extends SmartTileEntity implements INamedC
target = schematicAnchor.add(currentPos);
}
boolean entityMode = printingEntityIndex >= 0;
boolean entityMode = printStage == PrintStage.ENTITIES;
// Check block
if (!getWorld().isAreaLoaded(target, 0)) {
@ -471,13 +498,18 @@ public class SchematicannonTileEntity extends SmartTileEntity implements INamedC
launchBlock(target, icon, blockState, null);
} else {
CompoundNBT data = null;
if (AllBlockTags.SAFE_NBT.matches(blockState)) {
TileEntity tile = blockReader.getTileEntity(target);
if (tile != null) {
TileEntity tile = blockReader.getTileEntity(target);
if (tile != null) {
if (AllBlockTags.SAFE_NBT.matches(blockState)) {
data = tile.write(new CompoundNBT());
data = NBTProcessors.process(tile, data, true);
} else if (tile instanceof IPartialSafeNBT) {
data = new CompoundNBT();
((IPartialSafeNBT) tile).writeSafe(data, false);
data = NBTProcessors.process(tile, data, true);
}
}
launchBlock(target, icon, blockState, data);
}
@ -563,7 +595,9 @@ public class SchematicannonTileEntity extends SmartTileEntity implements INamedC
schematicLoaded = true;
state = State.PAUSED;
statusMsg = "ready";
printingEntityIndex = -1;
printingEntityIndex = 0;
printStage = PrintStage.BLOCKS;
deferredBlocks.clear();
updateChecklist();
sendUpdate = true;
blocksToPlace += blocksPlaced;
@ -649,22 +683,33 @@ public class SchematicannonTileEntity extends SmartTileEntity implements INamedC
protected void advanceCurrentPos() {
List<Entity> entities = blockReader.getEntities()
.collect(Collectors.toList());
if (printingEntityIndex != -1) {
printingEntityIndex++;
// End of entities reached
if (printingEntityIndex >= entities.size()) {
finishedPrinting();
return;
if (printStage == PrintStage.BLOCKS) {
MutableBoundingBox bounds = blockReader.getBounds();
while (tryAdvanceCurrentPos(bounds, entities)) {
deferredBlocks.add(currentPos);
}
currentPos = entities.get(printingEntityIndex)
.getBlockPos()
.subtract(schematicAnchor);
return;
}
MutableBoundingBox bounds = blockReader.getBounds();
if (printStage == PrintStage.DEFERRED_BLOCKS) {
if (deferredBlocks.isEmpty()) {
printStage = PrintStage.ENTITIES;
} else {
currentPos = deferredBlocks.remove(0);
}
}
if (printStage == PrintStage.ENTITIES) {
if (printingEntityIndex < entities.size()) {
currentPos = entities.get(printingEntityIndex).getBlockPos().subtract(schematicAnchor);
printingEntityIndex++;
} else {
finishedPrinting();
}
}
}
protected boolean tryAdvanceCurrentPos(MutableBoundingBox bounds, List<Entity> entities) {
currentPos = currentPos.offset(Direction.EAST);
BlockPos posInBounds = currentPos.add(-bounds.minX, -bounds.minY, -bounds.minZ);
@ -675,15 +720,16 @@ public class SchematicannonTileEntity extends SmartTileEntity implements INamedC
// End of blocks reached
if (currentPos.getY() > bounds.getYSize()) {
printingEntityIndex = 0;
if (entities.isEmpty()) {
finishedPrinting();
return;
}
currentPos = entities.get(0)
.getBlockPos()
.subtract(schematicAnchor);
printStage = PrintStage.DEFERRED_BLOCKS;
return false;
}
return shouldDeferBlock(blockReader.getBlockState(schematicAnchor.add(currentPos)));
}
public static boolean shouldDeferBlock(BlockState state) {
Block block = state.getBlock();
return block instanceof AbstractRailBlock || block.is(AllBlocks.GANTRY_CARRIAGE.get());
}
public void finishedPrinting() {
@ -705,10 +751,12 @@ public class SchematicannonTileEntity extends SmartTileEntity implements INamedC
blockReader = null;
missingItem = null;
sendUpdate = true;
printingEntityIndex = -1;
printingEntityIndex = 0;
printStage = PrintStage.BLOCKS;
schematicProgress = 0;
blocksPlaced = 0;
blocksToPlace = 0;
deferredBlocks.clear();
}
protected boolean shouldPlace(BlockPos pos, BlockState state) {

View file

@ -152,7 +152,7 @@ public class SchematicEditScreen extends AbstractSimiScreen {
x + 93 - textRenderer.getStringWidth(handler.getCurrentSchematicName()) / 2, y + 3, 0xffffff);
GuiGameElement.of(AllItems.SCHEMATIC.asStack())
.at(guiLeft + 200, guiTop + 82, 0)
.<GuiGameElement.GuiRenderBuilder>at(guiLeft + 200, guiTop + 82, 0)
.scale(3)
.render(matrixStack);
}

View file

@ -10,6 +10,7 @@ import com.jozufozu.flywheel.backend.core.shader.WorldProgram;
import com.mojang.blaze3d.matrix.MatrixStack;
import com.mojang.blaze3d.systems.RenderSystem;
import com.simibubi.create.AllFluids;
import com.simibubi.create.AllItems;
import com.simibubi.create.Create;
import com.simibubi.create.CreateClient;
import com.simibubi.create.content.contraptions.KineticDebugger;
@ -26,6 +27,7 @@ import com.simibubi.create.content.contraptions.components.structureMovement.tra
import com.simibubi.create.content.contraptions.components.turntable.TurntableHandler;
import com.simibubi.create.content.contraptions.goggles.IHaveGoggleInformation;
import com.simibubi.create.content.contraptions.relays.belt.item.BeltConnectorHandler;
import com.simibubi.create.content.curiosities.armor.CopperBacktankArmorLayer;
import com.simibubi.create.content.curiosities.tools.ExtendoGripRenderHandler;
import com.simibubi.create.content.curiosities.zapper.ZapperItem;
import com.simibubi.create.content.curiosities.zapper.ZapperRenderHandler;
@ -33,6 +35,8 @@ import com.simibubi.create.content.curiosities.zapper.terrainzapper.WorldshaperR
import com.simibubi.create.content.logistics.block.depot.EjectorTargetHandler;
import com.simibubi.create.content.logistics.block.mechanicalArm.ArmInteractionPointHandler;
import com.simibubi.create.foundation.config.AllConfigs;
import com.simibubi.create.foundation.config.ui.BaseConfigScreen;
import com.simibubi.create.foundation.fluid.FluidHelper;
import com.simibubi.create.foundation.item.ItemDescription;
import com.simibubi.create.foundation.item.TooltipHelper;
import com.simibubi.create.foundation.networking.AllPackets;
@ -53,6 +57,7 @@ import com.simibubi.create.foundation.utility.worldWrappers.WrappedClientWorld;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.ActiveRenderInfo;
import net.minecraft.client.renderer.IRenderTypeBuffer;
import net.minecraft.client.renderer.IRenderTypeBuffer.Impl;
import net.minecraft.client.renderer.texture.OverlayTexture;
import net.minecraft.client.world.ClientWorld;
import net.minecraft.fluid.Fluid;
@ -78,7 +83,11 @@ import net.minecraftforge.event.entity.player.ItemTooltipEvent;
import net.minecraftforge.event.entity.player.PlayerInteractEvent;
import net.minecraftforge.event.world.WorldEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.ExtensionPoint;
import net.minecraftforge.fml.ModContainer;
import net.minecraftforge.fml.ModList;
import net.minecraftforge.fml.common.Mod.EventBusSubscriber;
import net.minecraftforge.fml.event.lifecycle.FMLLoadCompleteEvent;
@EventBusSubscriber(value = Dist.CLIENT)
public class ClientEvents {
@ -190,18 +199,24 @@ public class ClientEvents {
ms.pop();
RenderWork.runAll();
//Backend.effects.render();
}
@SubscribeEvent
public static void onRenderOverlay(RenderGameOverlayEvent.Post event) {
MatrixStack ms = event.getMatrixStack();
Impl buffers = Minecraft.getInstance()
.getBufferBuilders()
.getEntityVertexConsumers();
int light = 0xF000F0;
int overlay = OverlayTexture.DEFAULT_UV;
float pt = event.getPartialTicks();
if (event.getType() == ElementType.AIR)
CopperBacktankArmorLayer.renderRemainingAirOverlay(ms, buffers, light, overlay, pt);
if (event.getType() != ElementType.HOTBAR)
return;
onRenderHotbar(event.getMatrixStack(), Minecraft.getInstance()
.getBufferBuilders()
.getEntityVertexConsumers(), 0xF000F0, OverlayTexture.DEFAULT_UV, event.getPartialTicks());
onRenderHotbar(ms, buffers, light, overlay, pt);
}
public static void onRenderHotbar(MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay,
@ -274,11 +289,20 @@ public class ClientEvents {
if (fluid.isEquivalentTo(AllFluids.CHOCOLATE.get())) {
event.setDensity(5f);
event.setCanceled(true);
return;
}
if (fluid.isEquivalentTo(AllFluids.HONEY.get())) {
event.setDensity(1.5f);
event.setCanceled(true);
return;
}
if (FluidHelper.isWater(fluid) && AllItems.DIVING_HELMET.get()
.isWornBy(Minecraft.getInstance().renderViewEntity)) {
event.setDensity(0.010f);
event.setCanceled(true);
return;
}
}
@ -311,4 +335,9 @@ public class ClientEvents {
}
}
public static void loadCompleted(FMLLoadCompleteEvent event) {
ModContainer createContainer = ModList.get().getModContainerById("create").orElseThrow(() -> new IllegalStateException("Create Mod Container missing after loadCompleted"));
createContainer.registerExtensionPoint(ExtensionPoint.CONFIGGUIFACTORY, () -> (mc, previousScreen) -> new BaseConfigScreen(previousScreen));
}
}

View file

@ -21,20 +21,22 @@ public class AllCommands {
LiteralCommandNode<CommandSource> util = buildUtilityCommands();
LiteralCommandNode<CommandSource> createRoot = dispatcher.register(Commands.literal("create")
.requires(cs -> cs.hasPermissionLevel(0))
// general purpose
.then(new ToggleExperimentalRenderingCommand().register())
.then(new ToggleDebugCommand().register())
.then(FabulousWarningCommand.register())
.then(OverlayConfigCommand.register())
.then(FixLightingCommand.register())
.then(HighlightCommand.register())
.then(CouplingCommand.register())
.then(CloneCommand.register())
.then(PonderCommand.register())
.requires(cs -> cs.hasPermissionLevel(0))
// general purpose
.then(new ToggleExperimentalRenderingCommand().register())
.then(new ToggleDebugCommand().register())
.then(FabulousWarningCommand.register())
.then(OverlayConfigCommand.register())
.then(FixLightingCommand.register())
.then(HighlightCommand.register())
.then(CouplingCommand.register())
.then(ConfigCommand.register())
.then(PonderCommand.register())
.then(CloneCommand.register())
// utility
.then(util));
// utility
.then(util)
);
createRoot.addChild(buildRedirect("u", util));
@ -50,12 +52,12 @@ public class AllCommands {
private static LiteralCommandNode<CommandSource> buildUtilityCommands() {
return Commands.literal("util")
.then(ReplaceInCommandBlocksCommand.register())
.then(ClearBufferCacheCommand.register())
.then(ChunkUtilCommand.register())
.then(FlySpeedCommand.register())
// .then(KillTPSCommand.register())
.build();
.then(ReplaceInCommandBlocksCommand.register())
.then(ClearBufferCacheCommand.register())
.then(ChunkUtilCommand.register())
.then(FlySpeedCommand.register())
//.then(KillTPSCommand.register())
.build();
}
@ -72,15 +74,15 @@ public class AllCommands {
*
* @return the built node
*/
public static LiteralCommandNode<CommandSource> buildRedirect(final String alias,
final LiteralCommandNode<CommandSource> destination) {
public static LiteralCommandNode<CommandSource> buildRedirect(final String alias, final LiteralCommandNode<CommandSource> destination) {
// Redirects only work for nodes with children, but break the top argument-less command.
// Manually adding the root command after setting the redirect doesn't fix it.
// See https://github.com/Mojang/brigadier/issues/46). Manually clone the node instead.
LiteralArgumentBuilder<CommandSource> builder = LiteralArgumentBuilder.<CommandSource>literal(alias)
.requires(destination.getRequirement())
.forward(destination.getRedirect(), destination.getRedirectModifier(), destination.isFork())
.executes(destination.getCommand());
LiteralArgumentBuilder<CommandSource> builder = LiteralArgumentBuilder
.<CommandSource>literal(alias)
.requires(destination.getRequirement())
.forward(destination.getRedirect(), destination.getRedirectModifier(), destination.isFork())
.executes(destination.getCommand());
for (CommandNode<CommandSource> child : destination.getChildren()) {
builder.then(child);
}

View file

@ -0,0 +1,27 @@
package com.simibubi.create.foundation.command;
import net.minecraft.command.CommandSource;
import net.minecraft.command.Commands;
import net.minecraft.entity.player.ServerPlayerEntity;
import net.minecraftforge.fml.network.PacketDistributor;
import com.mojang.brigadier.Command;
import com.mojang.brigadier.builder.ArgumentBuilder;
import com.simibubi.create.foundation.networking.AllPackets;
public class ConfigCommand {
public static ArgumentBuilder<CommandSource, ?> register() {
return Commands.literal("config")
.executes(ctx -> {
ServerPlayerEntity player = ctx.getSource().asPlayer();
AllPackets.channel.send(
PacketDistributor.PLAYER.with(() -> player),
new SConfigureConfigPacket(SConfigureConfigPacket.Actions.configScreen.name(), "")
);
return Command.SINGLE_SUCCESS;
});
}
}

View file

@ -13,16 +13,18 @@ public class FabulousWarningCommand {
public static ArgumentBuilder<CommandSource, ?> register() {
return Commands.literal("dismissFabulousWarning")
.requires(AllCommands.sourceIsPlayer)
.executes(ctx -> {
ServerPlayerEntity player = ctx.getSource()
.asPlayer();
.requires(AllCommands.sourceIsPlayer)
.executes(ctx -> {
ServerPlayerEntity player = ctx.getSource()
.asPlayer();
AllPackets.channel.send(PacketDistributor.PLAYER.with(() -> player),
new ConfigureConfigPacket(ConfigureConfigPacket.Actions.fabulousWarning.name(), ""));
AllPackets.channel.send(
PacketDistributor.PLAYER.with(() -> player),
new SConfigureConfigPacket(SConfigureConfigPacket.Actions.fabulousWarning.name(), "")
);
return Command.SINGLE_SUCCESS;
});
return Command.SINGLE_SUCCESS;
});
}
}

View file

@ -17,7 +17,7 @@ public class FixLightingCommand {
.executes(ctx -> {
AllPackets.channel.send(PacketDistributor.PLAYER.with(() -> (ServerPlayerEntity) ctx.getSource()
.getEntity()),
new ConfigureConfigPacket(ConfigureConfigPacket.Actions.fixLighting.name(), String.valueOf(true)));
new SConfigureConfigPacket(SConfigureConfigPacket.Actions.fixLighting.name(), String.valueOf(true)));
ctx.getSource()
.sendFeedback(

View file

@ -15,35 +15,32 @@ public class OverlayConfigCommand {
public static ArgumentBuilder<CommandSource, ?> register() {
return Commands.literal("overlay")
.requires(cs -> cs.hasPermissionLevel(0))
.then(Commands.literal("reset")
.executes(ctx -> {
DistExecutor.unsafeRunWhenOn(Dist.CLIENT,
() -> () -> ConfigureConfigPacket.Actions.overlayReset.performAction(""));
.requires(cs -> cs.hasPermissionLevel(0))
.then(Commands.literal("reset")
.executes(ctx -> {
DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> SConfigureConfigPacket.Actions.overlayReset.performAction(""));
DistExecutor.unsafeRunWhenOn(Dist.DEDICATED_SERVER,
() -> () -> AllPackets.channel.send(
PacketDistributor.PLAYER.with(() -> (ServerPlayerEntity) ctx.getSource()
.getEntity()),
new ConfigureConfigPacket(ConfigureConfigPacket.Actions.overlayReset.name(), "")));
DistExecutor.unsafeRunWhenOn(Dist.DEDICATED_SERVER, () -> () ->
AllPackets.channel.send(
PacketDistributor.PLAYER.with(() -> (ServerPlayerEntity) ctx.getSource().getEntity()),
new SConfigureConfigPacket(SConfigureConfigPacket.Actions.overlayReset.name(), "")));
ctx.getSource()
.sendFeedback(new StringTextComponent("reset overlay offset"), true);
return 1;
}))
.executes(ctx -> {
DistExecutor.unsafeRunWhenOn(Dist.CLIENT,
() -> () -> ConfigureConfigPacket.Actions.overlayScreen.performAction(""));
return 1;
})
)
.executes(ctx -> {
DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> SConfigureConfigPacket.Actions.overlayScreen.performAction(""));
DistExecutor.unsafeRunWhenOn(Dist.DEDICATED_SERVER,
() -> () -> AllPackets.channel.send(
PacketDistributor.PLAYER.with(() -> (ServerPlayerEntity) ctx.getSource()
.getEntity()),
new ConfigureConfigPacket(ConfigureConfigPacket.Actions.overlayScreen.name(), "")));
DistExecutor.unsafeRunWhenOn(Dist.DEDICATED_SERVER, () -> () ->
AllPackets.channel.send(
PacketDistributor.PLAYER.with(() -> (ServerPlayerEntity) ctx.getSource().getEntity()),
new SConfigureConfigPacket(SConfigureConfigPacket.Actions.overlayScreen.name(), "")));
ctx.getSource()
.sendFeedback(new StringTextComponent("window opened"), true);
ctx.getSource()
.sendFeedback(new StringTextComponent("window opened"), true);
return 1;
});

View file

@ -21,26 +21,20 @@ import net.minecraftforge.common.util.FakePlayer;
import net.minecraftforge.fml.network.PacketDistributor;
public class PonderCommand {
public static final SuggestionProvider<CommandSource> ITEM_PONDERS = SuggestionProviders.register(
new ResourceLocation("all_ponders"),
(iSuggestionProviderCommandContext, builder) -> ISuggestionProvider.func_212476_a(PonderRegistry.all.keySet()
.stream(), builder));
public static final SuggestionProvider<CommandSource> ITEM_PONDERS = SuggestionProviders.register(new ResourceLocation("all_ponders"), (iSuggestionProviderCommandContext, builder) -> ISuggestionProvider.func_212476_a(PonderRegistry.all.keySet().stream(), builder));
static ArgumentBuilder<CommandSource, ?> register() {
return Commands.literal("ponder")
.requires(cs -> cs.hasPermissionLevel(0))
.executes(ctx -> openScene("index", ctx.getSource()
.asPlayer()))
.then(Commands.argument("scene", ResourceLocationArgument.resourceLocation())
.suggests(ITEM_PONDERS)
.executes(ctx -> openScene(ResourceLocationArgument.getResourceLocation(ctx, "scene")
.toString(),
ctx.getSource()
.asPlayer()))
.then(Commands.argument("targets", EntityArgument.players())
.requires(cs -> cs.hasPermissionLevel(2))
.executes(ctx -> openScene(ResourceLocationArgument.getResourceLocation(ctx, "scene")
.toString(), EntityArgument.getPlayers(ctx, "targets")))));
.requires(cs -> cs.hasPermissionLevel(0))
.executes(ctx -> openScene("index", ctx.getSource().asPlayer()))
.then(Commands.argument("scene", ResourceLocationArgument.resourceLocation())
.suggests(ITEM_PONDERS)
.executes(ctx -> openScene(ResourceLocationArgument.getResourceLocation(ctx, "scene").toString(), ctx.getSource().asPlayer()))
.then(Commands.argument("targets", EntityArgument.players())
.requires(cs -> cs.hasPermissionLevel(2))
.executes(ctx -> openScene(ResourceLocationArgument.getResourceLocation(ctx, "scene").toString(), EntityArgument.getPlayers(ctx, "targets")))
)
);
}
@ -53,8 +47,9 @@ public class PonderCommand {
if (player instanceof FakePlayer)
continue;
AllPackets.channel.send(PacketDistributor.PLAYER.with(() -> player),
new ConfigureConfigPacket(ConfigureConfigPacket.Actions.openPonder.name(), sceneId));
AllPackets.channel.send(
PacketDistributor.PLAYER.with(() -> player),
new SConfigureConfigPacket(SConfigureConfigPacket.Actions.openPonder.name(), sceneId));
}
return Command.SINGLE_SUCCESS;
}

View file

@ -10,6 +10,7 @@ import com.jozufozu.flywheel.backend.OptifineHandler;
import com.simibubi.create.Create;
import com.simibubi.create.content.contraptions.goggles.GoggleConfigScreen;
import com.simibubi.create.foundation.config.AllConfigs;
import com.simibubi.create.foundation.config.ui.BaseConfigScreen;
import com.simibubi.create.foundation.gui.ScreenOpener;
import com.simibubi.create.foundation.networking.SimplePacketBase;
import com.simibubi.create.foundation.ponder.PonderRegistry;
@ -31,17 +32,17 @@ import net.minecraftforge.common.ForgeConfig;
import net.minecraftforge.fml.DistExecutor;
import net.minecraftforge.fml.network.NetworkEvent;
public class ConfigureConfigPacket extends SimplePacketBase {
public class SConfigureConfigPacket extends SimplePacketBase {
private final String option;
private final String value;
public ConfigureConfigPacket(String option, String value) {
public SConfigureConfigPacket(String option, String value) {
this.option = option;
this.value = value;
}
public ConfigureConfigPacket(PacketBuffer buffer) {
public SConfigureConfigPacket(PacketBuffer buffer) {
this.option = buffer.readString(32767);
this.value = buffer.readString(32767);
}
@ -69,7 +70,8 @@ public class ConfigureConfigPacket extends SimplePacketBase {
.setPacketHandled(true);
}
enum Actions {
public enum Actions {
configScreen(() -> Actions::configScreen),
rainbowDebug(() -> Actions::rainbowDebug),
overlayScreen(() -> Actions::overlayScreen),
fixLighting(() -> Actions::experimentalLighting),
@ -91,6 +93,11 @@ public class ConfigureConfigPacket extends SimplePacketBase {
.accept(value);
}
@OnlyIn(Dist.CLIENT)
private static void configScreen(String value) {
ScreenOpener.open(new BaseConfigScreen(null));
}
@OnlyIn(Dist.CLIENT)
private static void rainbowDebug(String value) {
ClientPlayerEntity player = Minecraft.getInstance().player;

View file

@ -13,7 +13,9 @@ public class ToggleDebugCommand extends ConfigureConfigCommand {
@Override
protected void sendPacket(ServerPlayerEntity player, String option) {
AllPackets.channel.send(PacketDistributor.PLAYER.with(() -> player),
new ConfigureConfigPacket(ConfigureConfigPacket.Actions.rainbowDebug.name(), option));
AllPackets.channel.send(
PacketDistributor.PLAYER.with(() -> player),
new SConfigureConfigPacket(SConfigureConfigPacket.Actions.rainbowDebug.name(), option)
);
}
}

View file

@ -13,7 +13,9 @@ public class ToggleExperimentalRenderingCommand extends ConfigureConfigCommand {
@Override
protected void sendPacket(ServerPlayerEntity player, String option) {
AllPackets.channel.send(PacketDistributor.PLAYER.with(() -> player),
new ConfigureConfigPacket(ConfigureConfigPacket.Actions.experimentalRendering.name(), option));
AllPackets.channel.send(
PacketDistributor.PLAYER.with(() -> player),
new SConfigureConfigPacket(SConfigureConfigPacket.Actions.experimentalRendering.name(), option)
);
}
}

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