Merge branch 'mc1.16/dev' into mc1.16/toolbox

This commit is contained in:
simibubi 2021-10-07 13:34:56 +02:00
commit b0143d604d
108 changed files with 1862 additions and 1207 deletions

View file

@ -427,19 +427,19 @@ a3a11524cd3515fc01d905767b4b7ea782adaf03 assets/create/blockstates/yellow_seat.j
7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json
b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json
337227971382d97fbaa69170e0b6bcc621bdc494 assets/create/lang/en_ud.json
4da832d10fb5bacf10c564bc4f828cdc6592d56c assets/create/lang/en_us.json
31064dd15c813975de6dbe771a94b2fff87d7c84 assets/create/lang/unfinished/de_de.json
785119499208f5a35c4f77a1d189ac78394a133a assets/create/lang/unfinished/es_es.json
7fb3d9f560b08e7d7e4b0e51f7f789ac2eeb3af8 assets/create/lang/unfinished/fr_fr.json
e418df14fbcd15e4b87024dbe4bda97ef1544f47 assets/create/lang/unfinished/it_it.json
95d0baec2d79b914b3aecbfdc6dde970722c552c assets/create/lang/unfinished/ja_jp.json
4fa09f736a742db2d843b0880edc5d607f28d80e assets/create/lang/unfinished/ko_kr.json
757ac709807bdb1322da17f27e0853de552638d1 assets/create/lang/unfinished/nl_nl.json
9b5bc245e4795d86eb27fa35670cd4f261c07576 assets/create/lang/unfinished/pl_pl.json
aaa1e873003b446858fc8bae839db4d0b293472e assets/create/lang/unfinished/pt_br.json
9745c2d6a2e8fc50648399785eb10cc8b125bd1d assets/create/lang/unfinished/ru_ru.json
b04454180b5b4af323009e33c3ba5b163b4e63c1 assets/create/lang/unfinished/zh_cn.json
ce4759ba4aa4ec9e0c24242796ac04b43f4b9a04 assets/create/lang/unfinished/zh_tw.json
6fbddf85df18d5d543c61e75ca0df197020717c3 assets/create/lang/en_us.json
f595a194a0cf13b78a54dd2992fb9800c03c6069 assets/create/lang/unfinished/de_de.json
49ef2d0d2367adbbecb84e43c966fdee1601a8a9 assets/create/lang/unfinished/es_es.json
20671957a67f5161d8036a04017d1eca5af12c90 assets/create/lang/unfinished/fr_fr.json
59750f2614d4f4cb7c8a3948c7ca4b92eac6edf8 assets/create/lang/unfinished/it_it.json
bb413333dbb4a7a9c6246c919c33acd16682deb9 assets/create/lang/unfinished/ja_jp.json
01b3861f93f426d896a9a840d8e39077c3bf5911 assets/create/lang/unfinished/ko_kr.json
cebabb4ac874fb1f3030d0146c840bcd3837851d assets/create/lang/unfinished/nl_nl.json
5da7bb73717a274e1a5a232f9f9f31263f6b1e35 assets/create/lang/unfinished/pl_pl.json
bd556bc413d98056b4cf13b324b929ad1f204232 assets/create/lang/unfinished/pt_br.json
80e7c074afb6aed7ff23d67d6d15f2e277008660 assets/create/lang/unfinished/ru_ru.json
e60e773410c1c736fac37e0ae5a8ad14290621cc assets/create/lang/unfinished/zh_cn.json
ca8139f0563e2910b6a74d8af39cea6cc5045a74 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
@ -1701,7 +1701,7 @@ d080b1b25e5bc8baf5aee68691b08c7f12ece3b0 assets/create/models/item/windmill_bear
a80fb25a0b655e76be986b5b49fcb0f03461a1ab assets/create/models/item/zinc_nugget.json
b1689617190c05ef34bd18456b0c7ae09bb3210f assets/create/models/item/zinc_ore.json
58880e397902f8ca5b3b59ed4423e626109ddc4c assets/create/sounds.json
0f1b4b980afba9bf2caf583b88e261bba8b10313 data/create/advancements/aesthetics.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
@ -3760,19 +3760,23 @@ bce28787b0271382842823d04a977912a88b01c2 data/create/tags/items/sandpaper.json
6cdeeac1689f7b5bfd9bc40b462143d8eaf3ad0b data/create/tags/items/seats.json
2f4044c2989b9a8aa394c88617d67a6a310e6b1b data/create/tags/items/upright_on_belt.json
50936b211d94167a35ec78c89954082a336b6269 data/create/tags/items/valve_handles.json
05ca51cdc60a5e109b5a0e3b782de13d34ebcb24 data/forge/tags/blocks/cobblestone.json
16bcb8fcbe9170c2c11f1ca8d99d8b36cd812bbd data/forge/tags/blocks/glass/colorless.json
81d3eb40b048160fcc2d6bb7ff12b49276297efd data/forge/tags/blocks/glass_panes.json
4b700ee8aa748c2ec70c29ef1589844879c0deae data/forge/tags/blocks/ores.json
4a0b13a9835106de9a1dd0a71a02372abb48e7b6 data/forge/tags/blocks/ores/copper.json
d5ea262a0f5fb210612d22521818e26cf08e591a data/forge/tags/blocks/ores/zinc.json
55196ee770ad20602211e26864dd62a58b2e985c data/forge/tags/blocks/stone.json
508730d3822c54d355329bf6a33d58071653afad data/forge/tags/blocks/storage_blocks.json
ff1900963bc4cd8ceffa78d58ef1952ceacb2fb7 data/forge/tags/blocks/storage_blocks/brass.json
f6c8f34ceb475546dba5cc6ff288863ea795d20b data/forge/tags/blocks/storage_blocks/copper.json
7f71a774800111e50b42de0e6159ed2d2a807d32 data/forge/tags/blocks/storage_blocks/zinc.json
2072c51afc5bbc6c9d64fd086803193d8a3c40de data/forge/tags/blocks/wg_stone.json
6b73c57912934d09233ad2966110968a6109f2c9 data/forge/tags/fluids/chocolate.json
391c9b2be5740aea943a8a5fe27eb327e2d973b0 data/forge/tags/fluids/honey.json
d6a4e4fe1204b718010543a28a9b9ec4e0977bd7 data/forge/tags/fluids/tea.json
d9ffc62a496946fc4848934e7c0a6e917337f8be data/forge/tags/items/beacon_payment.json
5af3164b14c92d2d6e235b5d4eebd93cbee37c0a data/forge/tags/items/buckets/honey.json
05ca51cdc60a5e109b5a0e3b782de13d34ebcb24 data/forge/tags/items/cobblestone.json
16bcb8fcbe9170c2c11f1ca8d99d8b36cd812bbd data/forge/tags/items/glass/colorless.json
81d3eb40b048160fcc2d6bb7ff12b49276297efd data/forge/tags/items/glass_panes.json
@ -3792,6 +3796,7 @@ d5ea262a0f5fb210612d22521818e26cf08e591a data/forge/tags/items/ores/zinc.json
c3dab5fe379bc1b7b10d4a0ba7009eee1b75a27c data/forge/tags/items/plates/copper.json
fb9bfb4c84ed9cf2da8c4b2fbc4cd4d9f37d3016 data/forge/tags/items/plates/gold.json
04d947ed7a5066f3cfe75a8dc564fe2dca8a9c93 data/forge/tags/items/plates/iron.json
55196ee770ad20602211e26864dd62a58b2e985c data/forge/tags/items/stone.json
508730d3822c54d355329bf6a33d58071653afad data/forge/tags/items/storage_blocks.json
ff1900963bc4cd8ceffa78d58ef1952ceacb2fb7 data/forge/tags/items/storage_blocks/brass.json
f6c8f34ceb475546dba5cc6ff288863ea795d20b data/forge/tags/items/storage_blocks/copper.json

View file

@ -753,6 +753,7 @@
"create.recipe.assembly.repeat": "Repeat Sequence %1$s Times",
"create.recipe.assembly.junk": "Random salvage",
"create.recipe.processing.chance": "%1$s%% Chance",
"create.recipe.deploying.not_consumed": "Not Consumed",
"create.recipe.heat_requirement.none": "No Heating Required",
"create.recipe.heat_requirement.heated": "Heated",
"create.recipe.heat_requirement.superheated": "Super-Heated",
@ -1044,18 +1045,14 @@
"create.item_attributes.placeable.inverted": "is not placeable",
"create.item_attributes.consumable": "can be eaten",
"create.item_attributes.consumable.inverted": "cannot be eaten",
"create.item_attributes.smeltable": "can be Smelted",
"create.item_attributes.smeltable.inverted": "cannot be Smelted",
"create.item_attributes.washable": "can be Washed",
"create.item_attributes.washable.inverted": "cannot be Washed",
"create.item_attributes.smokable": "can be Smoked",
"create.item_attributes.smokable.inverted": "cannot be Smoked",
"create.item_attributes.crushable": "can be Crushed",
"create.item_attributes.crushable.inverted": "cannot be Crushed",
"create.item_attributes.blastable": "is smeltable in Blast Furnace",
"create.item_attributes.blastable.inverted": "is not smeltable in Blast Furnace",
"create.item_attributes.fluid_container": "can store fluids",
"create.item_attributes.fluid_container.inverted": "cannot store fluids",
"create.item_attributes.enchanted": "is enchanted",
"create.item_attributes.enchanted.inverted": "is unenchanted",
"create.item_attributes.max_enchanted": "is enchanted at max level",
"create.item_attributes.max_enchanted.inverted": "is not enchanted at max level",
"create.item_attributes.renamed": "has a custom name",
"create.item_attributes.renamed.inverted": "does not have a custom name",
"create.item_attributes.damaged": "is damaged",
"create.item_attributes.damaged.inverted": "is not damaged",
"create.item_attributes.badly_damaged": "is heavily damaged",
@ -1066,23 +1063,31 @@
"create.item_attributes.equipable.inverted": "cannot be equipped",
"create.item_attributes.furnace_fuel": "is furnace fuel",
"create.item_attributes.furnace_fuel.inverted": "is not furnace fuel",
"create.item_attributes.washable": "can be Washed",
"create.item_attributes.washable.inverted": "cannot be Washed",
"create.item_attributes.crushable": "can be Crushed",
"create.item_attributes.crushable.inverted": "cannot be Crushed",
"create.item_attributes.smeltable": "can be Smelted",
"create.item_attributes.smeltable.inverted": "cannot be Smelted",
"create.item_attributes.smokable": "can be Smoked",
"create.item_attributes.smokable.inverted": "cannot be Smoked",
"create.item_attributes.blastable": "is smeltable in Blast Furnace",
"create.item_attributes.blastable.inverted": "is not smeltable in Blast Furnace",
"create.item_attributes.shulker_level": "is shulker %1$s",
"create.item_attributes.shulker_level.inverted": "is shulker not %1$s",
"create.item_attributes.shulker_level.full": "full",
"create.item_attributes.shulker_level.empty": "empty",
"create.item_attributes.shulker_level.partial": "partially filled",
"create.item_attributes.in_tag": "is tagged %1$s",
"create.item_attributes.in_tag.inverted": "is not tagged %1$s",
"create.item_attributes.in_item_group": "is in group '%1$s'",
"create.item_attributes.in_item_group.inverted": "is not in group '%1$s'",
"create.item_attributes.added_by": "was added by %1$s",
"create.item_attributes.added_by.inverted": "was not added by %1$s",
"create.item_attributes.shulker_level": "is shulker %1$s",
"create.item_attributes.shulker_level.inverted": "is shulker not %1$s",
"create.item_attributes.shulker_level.full": "full",
"create.item_attributes.shulker_level.empty": "empty",
"create.item_attributes.shulker_level.partial": "partially filled",
"create.item_attributes.has_enchant": "is enchanted with %1$s",
"create.item_attributes.has_enchant.inverted": "is not enchanted with %1$s",
"create.item_attributes.color": "is dyed %1$s",
"create.item_attributes.color.inverted": "is not dyed %1$s",
"create.item_attributes.max_enchanted": "is enchanted at max level",
"create.item_attributes.max_enchanted.inverted": "is not enchanted at max level",
"create.item_attributes.has_fluid": "contains %1$s",
"create.item_attributes.has_fluid.inverted": "does not contain %1$s",
"create.item_attributes.has_name": "has the custom name %1$s",
@ -1097,14 +1102,14 @@
"create.item_attributes.book_copy_second.inverted": "is not a second-generation copy",
"create.item_attributes.book_copy_tattered": "is a tattered mess",
"create.item_attributes.book_copy_tattered.inverted": "is not a tattered mess",
"create.item_attributes.astralsorcery_crystal": "has crystal attribute %1$s",
"create.item_attributes.astralsorcery_crystal.inverted": "does not have crystal attribute %1$s",
"create.item_attributes.astralsorcery_constellation": "is attuned to %1$s",
"create.item_attributes.astralsorcery_constellation.inverted": "is not attuned to %1$s",
"create.item_attributes.astralsorcery_perk_gem": "has perk attribute %1$s",
"create.item_attributes.astralsorcery_perk_gem.inverted": "does not have perk attribute %1$s",
"create.item_attributes.astralsorcery_amulet": "improves %1$s",
"create.item_attributes.astralsorcery_amulet.inverted": "does not improve %1$s",
"create.item_attributes.astralsorcery_constellation": "is attuned to %1$s",
"create.item_attributes.astralsorcery_constellation.inverted": "is not attuned to %1$s",
"create.item_attributes.astralsorcery_crystal": "has crystal attribute %1$s",
"create.item_attributes.astralsorcery_crystal.inverted": "does not have crystal attribute %1$s",
"create.item_attributes.astralsorcery_perk_gem": "has perk attribute %1$s",
"create.item_attributes.astralsorcery_perk_gem.inverted": "does not have perk attribute %1$s",
"create.gui.attribute_filter.no_selected_attributes": "No attributes selected",
"create.gui.attribute_filter.selected_attributes": "Selected attributes:",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 1140",
"_": "Missing Localizations: 1145",
"_": "->------------------------] Game Elements [------------------------<-",
@ -754,6 +754,7 @@
"create.recipe.assembly.repeat": "UNLOCALIZED: Repeat Sequence %1$s Times",
"create.recipe.assembly.junk": "UNLOCALIZED: Random salvage",
"create.recipe.processing.chance": "Chance: %1$s%%",
"create.recipe.deploying.not_consumed": "UNLOCALIZED: Not Consumed",
"create.recipe.heat_requirement.none": "Keine Hitze benötigt",
"create.recipe.heat_requirement.heated": "Wenig Hitze benötigt",
"create.recipe.heat_requirement.superheated": "Viel Hitze benötigt",
@ -1045,18 +1046,14 @@
"create.item_attributes.placeable.inverted": "UNLOCALIZED: is not placeable",
"create.item_attributes.consumable": "UNLOCALIZED: can be eaten",
"create.item_attributes.consumable.inverted": "UNLOCALIZED: cannot be eaten",
"create.item_attributes.smeltable": "UNLOCALIZED: can be Smelted",
"create.item_attributes.smeltable.inverted": "UNLOCALIZED: cannot be Smelted",
"create.item_attributes.washable": "UNLOCALIZED: can be Washed",
"create.item_attributes.washable.inverted": "UNLOCALIZED: cannot be Washed",
"create.item_attributes.smokable": "UNLOCALIZED: can be Smoked",
"create.item_attributes.smokable.inverted": "UNLOCALIZED: cannot be Smoked",
"create.item_attributes.crushable": "UNLOCALIZED: can be Crushed",
"create.item_attributes.crushable.inverted": "UNLOCALIZED: cannot be Crushed",
"create.item_attributes.blastable": "UNLOCALIZED: is smeltable in Blast Furnace",
"create.item_attributes.blastable.inverted": "UNLOCALIZED: is not smeltable in Blast Furnace",
"create.item_attributes.fluid_container": "UNLOCALIZED: can store fluids",
"create.item_attributes.fluid_container.inverted": "UNLOCALIZED: cannot store fluids",
"create.item_attributes.enchanted": "UNLOCALIZED: is enchanted",
"create.item_attributes.enchanted.inverted": "UNLOCALIZED: is unenchanted",
"create.item_attributes.max_enchanted": "UNLOCALIZED: is enchanted at max level",
"create.item_attributes.max_enchanted.inverted": "UNLOCALIZED: is not enchanted at max level",
"create.item_attributes.renamed": "UNLOCALIZED: has a custom name",
"create.item_attributes.renamed.inverted": "UNLOCALIZED: does not have a custom name",
"create.item_attributes.damaged": "UNLOCALIZED: is damaged",
"create.item_attributes.damaged.inverted": "UNLOCALIZED: is not damaged",
"create.item_attributes.badly_damaged": "UNLOCALIZED: is heavily damaged",
@ -1067,23 +1064,31 @@
"create.item_attributes.equipable.inverted": "UNLOCALIZED: cannot be equipped",
"create.item_attributes.furnace_fuel": "UNLOCALIZED: is furnace fuel",
"create.item_attributes.furnace_fuel.inverted": "UNLOCALIZED: is not furnace fuel",
"create.item_attributes.washable": "UNLOCALIZED: can be Washed",
"create.item_attributes.washable.inverted": "UNLOCALIZED: cannot be Washed",
"create.item_attributes.crushable": "UNLOCALIZED: can be Crushed",
"create.item_attributes.crushable.inverted": "UNLOCALIZED: cannot be Crushed",
"create.item_attributes.smeltable": "UNLOCALIZED: can be Smelted",
"create.item_attributes.smeltable.inverted": "UNLOCALIZED: cannot be Smelted",
"create.item_attributes.smokable": "UNLOCALIZED: can be Smoked",
"create.item_attributes.smokable.inverted": "UNLOCALIZED: cannot be Smoked",
"create.item_attributes.blastable": "UNLOCALIZED: is smeltable in Blast Furnace",
"create.item_attributes.blastable.inverted": "UNLOCALIZED: is not smeltable in Blast Furnace",
"create.item_attributes.shulker_level": "UNLOCALIZED: is shulker %1$s",
"create.item_attributes.shulker_level.inverted": "UNLOCALIZED: is shulker not %1$s",
"create.item_attributes.shulker_level.full": "UNLOCALIZED: full",
"create.item_attributes.shulker_level.empty": "UNLOCALIZED: empty",
"create.item_attributes.shulker_level.partial": "UNLOCALIZED: partially filled",
"create.item_attributes.in_tag": "UNLOCALIZED: is tagged %1$s",
"create.item_attributes.in_tag.inverted": "UNLOCALIZED: is not tagged %1$s",
"create.item_attributes.in_item_group": "UNLOCALIZED: is in group '%1$s'",
"create.item_attributes.in_item_group.inverted": "UNLOCALIZED: is not in group '%1$s'",
"create.item_attributes.added_by": "UNLOCALIZED: was added by %1$s",
"create.item_attributes.added_by.inverted": "UNLOCALIZED: was not added by %1$s",
"create.item_attributes.shulker_level": "UNLOCALIZED: is shulker %1$s",
"create.item_attributes.shulker_level.inverted": "UNLOCALIZED: is shulker not %1$s",
"create.item_attributes.shulker_level.full": "UNLOCALIZED: full",
"create.item_attributes.shulker_level.empty": "UNLOCALIZED: empty",
"create.item_attributes.shulker_level.partial": "UNLOCALIZED: partially filled",
"create.item_attributes.has_enchant": "UNLOCALIZED: is enchanted with %1$s",
"create.item_attributes.has_enchant.inverted": "UNLOCALIZED: is not enchanted with %1$s",
"create.item_attributes.color": "UNLOCALIZED: is dyed %1$s",
"create.item_attributes.color.inverted": "UNLOCALIZED: is not dyed %1$s",
"create.item_attributes.max_enchanted": "UNLOCALIZED: is enchanted at max level",
"create.item_attributes.max_enchanted.inverted": "UNLOCALIZED: is not enchanted at max level",
"create.item_attributes.has_fluid": "UNLOCALIZED: contains %1$s",
"create.item_attributes.has_fluid.inverted": "UNLOCALIZED: does not contain %1$s",
"create.item_attributes.has_name": "UNLOCALIZED: has the custom name %1$s",
@ -1098,14 +1103,14 @@
"create.item_attributes.book_copy_second.inverted": "UNLOCALIZED: is not a second-generation copy",
"create.item_attributes.book_copy_tattered": "UNLOCALIZED: is a tattered mess",
"create.item_attributes.book_copy_tattered.inverted": "UNLOCALIZED: is not a tattered mess",
"create.item_attributes.astralsorcery_crystal": "UNLOCALIZED: has crystal attribute %1$s",
"create.item_attributes.astralsorcery_crystal.inverted": "UNLOCALIZED: does not have crystal attribute %1$s",
"create.item_attributes.astralsorcery_constellation": "UNLOCALIZED: is attuned to %1$s",
"create.item_attributes.astralsorcery_constellation.inverted": "UNLOCALIZED: is not attuned to %1$s",
"create.item_attributes.astralsorcery_perk_gem": "UNLOCALIZED: has perk attribute %1$s",
"create.item_attributes.astralsorcery_perk_gem.inverted": "UNLOCALIZED: does not have perk attribute %1$s",
"create.item_attributes.astralsorcery_amulet": "UNLOCALIZED: improves %1$s",
"create.item_attributes.astralsorcery_amulet.inverted": "UNLOCALIZED: does not improve %1$s",
"create.item_attributes.astralsorcery_constellation": "UNLOCALIZED: is attuned to %1$s",
"create.item_attributes.astralsorcery_constellation.inverted": "UNLOCALIZED: is not attuned to %1$s",
"create.item_attributes.astralsorcery_crystal": "UNLOCALIZED: has crystal attribute %1$s",
"create.item_attributes.astralsorcery_crystal.inverted": "UNLOCALIZED: does not have crystal attribute %1$s",
"create.item_attributes.astralsorcery_perk_gem": "UNLOCALIZED: has perk attribute %1$s",
"create.item_attributes.astralsorcery_perk_gem.inverted": "UNLOCALIZED: does not have perk attribute %1$s",
"create.gui.attribute_filter.no_selected_attributes": "Keine Attribute ausgewählt",
"create.gui.attribute_filter.selected_attributes": "Ausgewählte Attribute:",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 6",
"_": "Missing Localizations: 11",
"_": "->------------------------] Game Elements [------------------------<-",
@ -754,6 +754,7 @@
"create.recipe.assembly.repeat": "Repetir la secuencia %1$s veces",
"create.recipe.assembly.junk": "Basura aleatoria",
"create.recipe.processing.chance": "%1$s%% Chance",
"create.recipe.deploying.not_consumed": "UNLOCALIZED: Not Consumed",
"create.recipe.heat_requirement.none": "No es necesario calentar",
"create.recipe.heat_requirement.heated": "Calentado",
"create.recipe.heat_requirement.superheated": "Súper-Calentado",
@ -1045,18 +1046,14 @@
"create.item_attributes.placeable.inverted": "no se puede colocar",
"create.item_attributes.consumable": "se puede comer",
"create.item_attributes.consumable.inverted": "no se puede comer",
"create.item_attributes.smeltable": "se puede fundir",
"create.item_attributes.smeltable.inverted": "no se puede fundir",
"create.item_attributes.washable": "se puede lavar",
"create.item_attributes.washable.inverted": "no se puede lavar",
"create.item_attributes.smokable": "puede ser ahumado",
"create.item_attributes.smokable.inverted": "no puede ser ahumado",
"create.item_attributes.crushable": "puede ser molido",
"create.item_attributes.crushable.inverted": "no puede ser molido",
"create.item_attributes.blastable": "es fundible en el alto horno",
"create.item_attributes.blastable.inverted": "no es fundible en el alto horno",
"create.item_attributes.fluid_container": "UNLOCALIZED: can store fluids",
"create.item_attributes.fluid_container.inverted": "UNLOCALIZED: cannot store fluids",
"create.item_attributes.enchanted": "está encantado",
"create.item_attributes.enchanted.inverted": "no está encantado",
"create.item_attributes.max_enchanted": "está encantado en el nivel máximo",
"create.item_attributes.max_enchanted.inverted": "no está encantado en el nivel máximo",
"create.item_attributes.renamed": "UNLOCALIZED: has a custom name",
"create.item_attributes.renamed.inverted": "UNLOCALIZED: does not have a custom name",
"create.item_attributes.damaged": "está dañado",
"create.item_attributes.damaged.inverted": "no está dañado",
"create.item_attributes.badly_damaged": "está muy dañado",
@ -1067,23 +1064,31 @@
"create.item_attributes.equipable.inverted": "no se puede equipar",
"create.item_attributes.furnace_fuel": "es combustible para hornos",
"create.item_attributes.furnace_fuel.inverted": "no es combustible para hornos",
"create.item_attributes.washable": "se puede lavar",
"create.item_attributes.washable.inverted": "no se puede lavar",
"create.item_attributes.crushable": "puede ser molido",
"create.item_attributes.crushable.inverted": "no puede ser molido",
"create.item_attributes.smeltable": "se puede fundir",
"create.item_attributes.smeltable.inverted": "no se puede fundir",
"create.item_attributes.smokable": "puede ser ahumado",
"create.item_attributes.smokable.inverted": "no puede ser ahumado",
"create.item_attributes.blastable": "es fundible en el alto horno",
"create.item_attributes.blastable.inverted": "no es fundible en el alto horno",
"create.item_attributes.shulker_level": "es shulker %1$s",
"create.item_attributes.shulker_level.inverted": "no es shulker %1$s",
"create.item_attributes.shulker_level.full": "lleno",
"create.item_attributes.shulker_level.empty": "vacío",
"create.item_attributes.shulker_level.partial": "parcialmente lleno",
"create.item_attributes.in_tag": "está etiquetado %1$s",
"create.item_attributes.in_tag.inverted": "no está etiquetado %1$s",
"create.item_attributes.in_item_group": "está en el grupo '%1$s'",
"create.item_attributes.in_item_group.inverted": "no está en el grupo '%1$s'",
"create.item_attributes.added_by": "fue añadido por %1$s",
"create.item_attributes.added_by.inverted": "no fue añadida por %1$s",
"create.item_attributes.shulker_level": "es shulker %1$s",
"create.item_attributes.shulker_level.inverted": "no es shulker %1$s",
"create.item_attributes.shulker_level.full": "lleno",
"create.item_attributes.shulker_level.empty": "vacío",
"create.item_attributes.shulker_level.partial": "parcialmente lleno",
"create.item_attributes.has_enchant": "está encantado con %1$s",
"create.item_attributes.has_enchant.inverted": "no está encantado con %1$s",
"create.item_attributes.color": "Está teñido %1$s",
"create.item_attributes.color.inverted": "No está teñido %1$s",
"create.item_attributes.max_enchanted": "está encantado en el nivel máximo",
"create.item_attributes.max_enchanted.inverted": "no está encantado en el nivel máximo",
"create.item_attributes.has_fluid": "contiene %1$s",
"create.item_attributes.has_fluid.inverted": "no contiene %1$s",
"create.item_attributes.has_name": "tiene el nombre personalizado %1$s",
@ -1098,14 +1103,14 @@
"create.item_attributes.book_copy_second.inverted": "no es una copia de segunda generación",
"create.item_attributes.book_copy_tattered": "es un desordenado desastre",
"create.item_attributes.book_copy_tattered.inverted": "no es un desordenado desastre",
"create.item_attributes.astralsorcery_crystal": "tiene el atributo de cristal %1$s",
"create.item_attributes.astralsorcery_crystal.inverted": "no tiene atributo de cristal %1$s",
"create.item_attributes.astralsorcery_constellation": "está en sintonía con %1$s",
"create.item_attributes.astralsorcery_constellation.inverted": "no está en sintonía con %1$s",
"create.item_attributes.astralsorcery_perk_gem": "tiene el atributo ventaja %1$s",
"create.item_attributes.astralsorcery_perk_gem.inverted": "no tiene el atributo ventaja %1$s",
"create.item_attributes.astralsorcery_amulet": "mejora %1$s",
"create.item_attributes.astralsorcery_amulet.inverted": "no mejora %1$s",
"create.item_attributes.astralsorcery_constellation": "está en sintonía con %1$s",
"create.item_attributes.astralsorcery_constellation.inverted": "no está en sintonía con %1$s",
"create.item_attributes.astralsorcery_crystal": "tiene el atributo de cristal %1$s",
"create.item_attributes.astralsorcery_crystal.inverted": "no tiene atributo de cristal %1$s",
"create.item_attributes.astralsorcery_perk_gem": "tiene el atributo ventaja %1$s",
"create.item_attributes.astralsorcery_perk_gem.inverted": "no tiene el atributo ventaja %1$s",
"create.gui.attribute_filter.no_selected_attributes": "No hay atributos seleccionados",
"create.gui.attribute_filter.selected_attributes": "Atributos seleccionados:",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 1392",
"_": "Missing Localizations: 1397",
"_": "->------------------------] Game Elements [------------------------<-",
@ -754,6 +754,7 @@
"create.recipe.assembly.repeat": "UNLOCALIZED: Repeat Sequence %1$s Times",
"create.recipe.assembly.junk": "UNLOCALIZED: Random salvage",
"create.recipe.processing.chance": "%1$s%% de chance",
"create.recipe.deploying.not_consumed": "UNLOCALIZED: Not Consumed",
"create.recipe.heat_requirement.none": "Pas de chauffage requis",
"create.recipe.heat_requirement.heated": "Chauffé",
"create.recipe.heat_requirement.superheated": "Surchauffé",
@ -1045,18 +1046,14 @@
"create.item_attributes.placeable.inverted": "n'est pas plaçable",
"create.item_attributes.consumable": "peut être mangé",
"create.item_attributes.consumable.inverted": "ne peut pas être mangé",
"create.item_attributes.smeltable": "peut être fondu",
"create.item_attributes.smeltable.inverted": "ne peut pas être fondu",
"create.item_attributes.washable": "peut être lavé",
"create.item_attributes.washable.inverted": "ne peut pas être lavé",
"create.item_attributes.smokable": "peut être fumé",
"create.item_attributes.smokable.inverted": "ne peut pas être fumé",
"create.item_attributes.crushable": "peut être concassé",
"create.item_attributes.crushable.inverted": "ne peut pas être concassé",
"create.item_attributes.blastable": "est fondable dans un Haut fourneau",
"create.item_attributes.blastable.inverted": "n'est pas fondable dans un Haut fourneau",
"create.item_attributes.fluid_container": "UNLOCALIZED: can store fluids",
"create.item_attributes.fluid_container.inverted": "UNLOCALIZED: cannot store fluids",
"create.item_attributes.enchanted": "est enchanté",
"create.item_attributes.enchanted.inverted": "n'est pas enchanté",
"create.item_attributes.max_enchanted": "UNLOCALIZED: is enchanted at max level",
"create.item_attributes.max_enchanted.inverted": "UNLOCALIZED: is not enchanted at max level",
"create.item_attributes.renamed": "UNLOCALIZED: has a custom name",
"create.item_attributes.renamed.inverted": "UNLOCALIZED: does not have a custom name",
"create.item_attributes.damaged": "est endommagé",
"create.item_attributes.damaged.inverted": "n'est pas endomagé",
"create.item_attributes.badly_damaged": "est fortement damaged",
@ -1067,23 +1064,31 @@
"create.item_attributes.equipable.inverted": "ne peut pas être équipé",
"create.item_attributes.furnace_fuel": "est du combustible",
"create.item_attributes.furnace_fuel.inverted": "n'est pas un combustible",
"create.item_attributes.washable": "peut être lavé",
"create.item_attributes.washable.inverted": "ne peut pas être lavé",
"create.item_attributes.crushable": "peut être concassé",
"create.item_attributes.crushable.inverted": "ne peut pas être concassé",
"create.item_attributes.smeltable": "peut être fondu",
"create.item_attributes.smeltable.inverted": "ne peut pas être fondu",
"create.item_attributes.smokable": "peut être fumé",
"create.item_attributes.smokable.inverted": "ne peut pas être fumé",
"create.item_attributes.blastable": "est fondable dans un Haut fourneau",
"create.item_attributes.blastable.inverted": "n'est pas fondable dans un Haut fourneau",
"create.item_attributes.shulker_level": "UNLOCALIZED: is shulker %1$s",
"create.item_attributes.shulker_level.inverted": "UNLOCALIZED: is shulker not %1$s",
"create.item_attributes.shulker_level.full": "UNLOCALIZED: full",
"create.item_attributes.shulker_level.empty": "UNLOCALIZED: empty",
"create.item_attributes.shulker_level.partial": "UNLOCALIZED: partially filled",
"create.item_attributes.in_tag": "est étiqueté %1$s",
"create.item_attributes.in_tag.inverted": "n'est pas étiqueté",
"create.item_attributes.in_item_group": "appartient à %1$s",
"create.item_attributes.in_item_group.inverted": "n'appartient pas à %1$s'",
"create.item_attributes.added_by": "a été ajouté par %1$s",
"create.item_attributes.added_by.inverted": "n'a pas été ajouté par %1$s",
"create.item_attributes.shulker_level": "UNLOCALIZED: is shulker %1$s",
"create.item_attributes.shulker_level.inverted": "UNLOCALIZED: is shulker not %1$s",
"create.item_attributes.shulker_level.full": "UNLOCALIZED: full",
"create.item_attributes.shulker_level.empty": "UNLOCALIZED: empty",
"create.item_attributes.shulker_level.partial": "UNLOCALIZED: partially filled",
"create.item_attributes.has_enchant": "est enchanté %1$s",
"create.item_attributes.has_enchant.inverted": "n'est pas enchenté %1$s",
"create.item_attributes.color": "UNLOCALIZED: is dyed %1$s",
"create.item_attributes.color.inverted": "UNLOCALIZED: is not dyed %1$s",
"create.item_attributes.max_enchanted": "UNLOCALIZED: is enchanted at max level",
"create.item_attributes.max_enchanted.inverted": "UNLOCALIZED: is not enchanted at max level",
"create.item_attributes.has_fluid": "contient %1$s",
"create.item_attributes.has_fluid.inverted": "ne contient pas %1$s",
"create.item_attributes.has_name": "est renommé %1$s",
@ -1098,14 +1103,14 @@
"create.item_attributes.book_copy_second.inverted": "UNLOCALIZED: is not a second-generation copy",
"create.item_attributes.book_copy_tattered": "UNLOCALIZED: is a tattered mess",
"create.item_attributes.book_copy_tattered.inverted": "UNLOCALIZED: is not a tattered mess",
"create.item_attributes.astralsorcery_crystal": "UNLOCALIZED: has crystal attribute %1$s",
"create.item_attributes.astralsorcery_crystal.inverted": "UNLOCALIZED: does not have crystal attribute %1$s",
"create.item_attributes.astralsorcery_constellation": "UNLOCALIZED: is attuned to %1$s",
"create.item_attributes.astralsorcery_constellation.inverted": "UNLOCALIZED: is not attuned to %1$s",
"create.item_attributes.astralsorcery_perk_gem": "UNLOCALIZED: has perk attribute %1$s",
"create.item_attributes.astralsorcery_perk_gem.inverted": "UNLOCALIZED: does not have perk attribute %1$s",
"create.item_attributes.astralsorcery_amulet": "UNLOCALIZED: improves %1$s",
"create.item_attributes.astralsorcery_amulet.inverted": "UNLOCALIZED: does not improve %1$s",
"create.item_attributes.astralsorcery_constellation": "UNLOCALIZED: is attuned to %1$s",
"create.item_attributes.astralsorcery_constellation.inverted": "UNLOCALIZED: is not attuned to %1$s",
"create.item_attributes.astralsorcery_crystal": "UNLOCALIZED: has crystal attribute %1$s",
"create.item_attributes.astralsorcery_crystal.inverted": "UNLOCALIZED: does not have crystal attribute %1$s",
"create.item_attributes.astralsorcery_perk_gem": "UNLOCALIZED: has perk attribute %1$s",
"create.item_attributes.astralsorcery_perk_gem.inverted": "UNLOCALIZED: does not have perk attribute %1$s",
"create.gui.attribute_filter.no_selected_attributes": "Aucun attribut sélectionné",
"create.gui.attribute_filter.selected_attributes": "Attributs sélectionnés:",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 920",
"_": "Missing Localizations: 925",
"_": "->------------------------] Game Elements [------------------------<-",
@ -754,6 +754,7 @@
"create.recipe.assembly.repeat": "UNLOCALIZED: Repeat Sequence %1$s Times",
"create.recipe.assembly.junk": "UNLOCALIZED: Random salvage",
"create.recipe.processing.chance": "%1$s%% di probabilità",
"create.recipe.deploying.not_consumed": "UNLOCALIZED: Not Consumed",
"create.recipe.heat_requirement.none": "Nessun riscaldamento",
"create.recipe.heat_requirement.heated": "Riscaldamento",
"create.recipe.heat_requirement.superheated": "Super riscaldamento",
@ -1045,18 +1046,14 @@
"create.item_attributes.placeable.inverted": "non è posizionabile",
"create.item_attributes.consumable": "è commestibile",
"create.item_attributes.consumable.inverted": "non è commestibile",
"create.item_attributes.smeltable": "può essere fuso",
"create.item_attributes.smeltable.inverted": "non può essere fuso",
"create.item_attributes.washable": "può essere lavato",
"create.item_attributes.washable.inverted": "non può essere lavato",
"create.item_attributes.smokable": "può essere affumicato",
"create.item_attributes.smokable.inverted": "non può essere affumicato",
"create.item_attributes.crushable": "può essere frantumato",
"create.item_attributes.crushable.inverted": "non può essere frantumato",
"create.item_attributes.blastable": "è fondibile in un forno fusorio",
"create.item_attributes.blastable.inverted": "non è fondibile in un forno fusorio",
"create.item_attributes.fluid_container": "UNLOCALIZED: can store fluids",
"create.item_attributes.fluid_container.inverted": "UNLOCALIZED: cannot store fluids",
"create.item_attributes.enchanted": "è incantato",
"create.item_attributes.enchanted.inverted": "non è incantato",
"create.item_attributes.max_enchanted": "UNLOCALIZED: is enchanted at max level",
"create.item_attributes.max_enchanted.inverted": "UNLOCALIZED: is not enchanted at max level",
"create.item_attributes.renamed": "UNLOCALIZED: has a custom name",
"create.item_attributes.renamed.inverted": "UNLOCALIZED: does not have a custom name",
"create.item_attributes.damaged": "è danneggiato",
"create.item_attributes.damaged.inverted": "non è danneggiato",
"create.item_attributes.badly_damaged": "è gravemente danneggiato",
@ -1067,23 +1064,31 @@
"create.item_attributes.equipable.inverted": "non può essere equipaggiato",
"create.item_attributes.furnace_fuel": "è un combustibile per fornace",
"create.item_attributes.furnace_fuel.inverted": "non è un combustibile per fornace",
"create.item_attributes.washable": "può essere lavato",
"create.item_attributes.washable.inverted": "non può essere lavato",
"create.item_attributes.crushable": "può essere frantumato",
"create.item_attributes.crushable.inverted": "non può essere frantumato",
"create.item_attributes.smeltable": "può essere fuso",
"create.item_attributes.smeltable.inverted": "non può essere fuso",
"create.item_attributes.smokable": "può essere affumicato",
"create.item_attributes.smokable.inverted": "non può essere affumicato",
"create.item_attributes.blastable": "è fondibile in un forno fusorio",
"create.item_attributes.blastable.inverted": "non è fondibile in un forno fusorio",
"create.item_attributes.shulker_level": "UNLOCALIZED: is shulker %1$s",
"create.item_attributes.shulker_level.inverted": "UNLOCALIZED: is shulker not %1$s",
"create.item_attributes.shulker_level.full": "UNLOCALIZED: full",
"create.item_attributes.shulker_level.empty": "UNLOCALIZED: empty",
"create.item_attributes.shulker_level.partial": "UNLOCALIZED: partially filled",
"create.item_attributes.in_tag": "è etichettato %1$s",
"create.item_attributes.in_tag.inverted": "non è etichettato %1$s",
"create.item_attributes.in_item_group": "appartiene a %1$s",
"create.item_attributes.in_item_group.inverted": "non appartiene a '%1$s'",
"create.item_attributes.added_by": "è stato aggiunto da %1$s",
"create.item_attributes.added_by.inverted": "non è stato aggiunto da %1$s",
"create.item_attributes.shulker_level": "UNLOCALIZED: is shulker %1$s",
"create.item_attributes.shulker_level.inverted": "UNLOCALIZED: is shulker not %1$s",
"create.item_attributes.shulker_level.full": "UNLOCALIZED: full",
"create.item_attributes.shulker_level.empty": "UNLOCALIZED: empty",
"create.item_attributes.shulker_level.partial": "UNLOCALIZED: partially filled",
"create.item_attributes.has_enchant": "è stato incantato con %1$s",
"create.item_attributes.has_enchant.inverted": "non è stato incantato con %1$s",
"create.item_attributes.color": "UNLOCALIZED: is dyed %1$s",
"create.item_attributes.color.inverted": "UNLOCALIZED: is not dyed %1$s",
"create.item_attributes.max_enchanted": "UNLOCALIZED: is enchanted at max level",
"create.item_attributes.max_enchanted.inverted": "UNLOCALIZED: is not enchanted at max level",
"create.item_attributes.has_fluid": "contiene %1$s",
"create.item_attributes.has_fluid.inverted": "non contiene %1$s",
"create.item_attributes.has_name": "è stato rinominato in %1$s",
@ -1098,14 +1103,14 @@
"create.item_attributes.book_copy_second.inverted": "non è una copia di seconda generazione",
"create.item_attributes.book_copy_tattered": "è in condizioni precarie",
"create.item_attributes.book_copy_tattered.inverted": "non è in condizioni precarie",
"create.item_attributes.astralsorcery_crystal": "ha l'attributo del cristallo %1$s",
"create.item_attributes.astralsorcery_crystal.inverted": "non ha l'attributo del cristallo %1$s",
"create.item_attributes.astralsorcery_constellation": "è in sintonia con %1$s",
"create.item_attributes.astralsorcery_constellation.inverted": "non è in sintonia con %1$s",
"create.item_attributes.astralsorcery_perk_gem": "ha l'attributo benefico %1$s",
"create.item_attributes.astralsorcery_perk_gem.inverted": "non ha l'attributo benefico %1$s",
"create.item_attributes.astralsorcery_amulet": "migliora %1$s",
"create.item_attributes.astralsorcery_amulet.inverted": "non migliora %1$s",
"create.item_attributes.astralsorcery_constellation": "è in sintonia con %1$s",
"create.item_attributes.astralsorcery_constellation.inverted": "non è in sintonia con %1$s",
"create.item_attributes.astralsorcery_crystal": "ha l'attributo del cristallo %1$s",
"create.item_attributes.astralsorcery_crystal.inverted": "non ha l'attributo del cristallo %1$s",
"create.item_attributes.astralsorcery_perk_gem": "ha l'attributo benefico %1$s",
"create.item_attributes.astralsorcery_perk_gem.inverted": "non ha l'attributo benefico %1$s",
"create.gui.attribute_filter.no_selected_attributes": "Nessun attributo selezionato",
"create.gui.attribute_filter.selected_attributes": "Attributi selezionati:",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 15",
"_": "Missing Localizations: 20",
"_": "->------------------------] Game Elements [------------------------<-",
@ -754,6 +754,7 @@
"create.recipe.assembly.repeat": "%1$s回繰り返す",
"create.recipe.assembly.junk": "ランダムな仕損品",
"create.recipe.processing.chance": "%1$s%%チャンス",
"create.recipe.deploying.not_consumed": "UNLOCALIZED: Not Consumed",
"create.recipe.heat_requirement.none": "加熱不要",
"create.recipe.heat_requirement.heated": "加熱が必要",
"create.recipe.heat_requirement.superheated": "極度の加熱が必要",
@ -1045,18 +1046,14 @@
"create.item_attributes.placeable.inverted": "設置不可能か",
"create.item_attributes.consumable": "食べられるか",
"create.item_attributes.consumable.inverted": "食べられないか",
"create.item_attributes.smeltable": "精錬可能か",
"create.item_attributes.smeltable.inverted": "精錬不可能か",
"create.item_attributes.washable": "洗浄可能か",
"create.item_attributes.washable.inverted": "洗浄不可能か",
"create.item_attributes.smokable": "燻製器で調理可能か",
"create.item_attributes.smokable.inverted": "燻製器で調理不可能か",
"create.item_attributes.crushable": "粉砕可能か",
"create.item_attributes.crushable.inverted": "粉砕不可能か",
"create.item_attributes.blastable": "溶鉱炉で精錬可能か",
"create.item_attributes.blastable.inverted": "溶鉱炉で精錬不可能か",
"create.item_attributes.fluid_container": "UNLOCALIZED: can store fluids",
"create.item_attributes.fluid_container.inverted": "UNLOCALIZED: cannot store fluids",
"create.item_attributes.enchanted": "エンチャント済みか",
"create.item_attributes.enchanted.inverted": "エンチャントなしか",
"create.item_attributes.max_enchanted": "最大レベルのエンチャントがされているか",
"create.item_attributes.max_enchanted.inverted": "最大レベルのエンチャントがされていないか",
"create.item_attributes.renamed": "UNLOCALIZED: has a custom name",
"create.item_attributes.renamed.inverted": "UNLOCALIZED: does not have a custom name",
"create.item_attributes.damaged": "破損してるか",
"create.item_attributes.damaged.inverted": "破損していないか",
"create.item_attributes.badly_damaged": "ひどく損傷してるか",
@ -1067,23 +1064,31 @@
"create.item_attributes.equipable.inverted": "装備不可能か",
"create.item_attributes.furnace_fuel": "かまどの燃料か",
"create.item_attributes.furnace_fuel.inverted": "かまどの燃料でないか",
"create.item_attributes.washable": "洗浄可能か",
"create.item_attributes.washable.inverted": "洗浄不可能か",
"create.item_attributes.crushable": "粉砕可能か",
"create.item_attributes.crushable.inverted": "粉砕不可能か",
"create.item_attributes.smeltable": "精錬可能か",
"create.item_attributes.smeltable.inverted": "精錬不可能か",
"create.item_attributes.smokable": "燻製器で調理可能か",
"create.item_attributes.smokable.inverted": "燻製器で調理不可能か",
"create.item_attributes.blastable": "溶鉱炉で精錬可能か",
"create.item_attributes.blastable.inverted": "溶鉱炉で精錬不可能か",
"create.item_attributes.shulker_level": "%1$sシュルカーか",
"create.item_attributes.shulker_level.inverted": "%1$sシュルカーでないか",
"create.item_attributes.shulker_level.full": "満杯の",
"create.item_attributes.shulker_level.empty": "空の",
"create.item_attributes.shulker_level.partial": "一部埋まっている",
"create.item_attributes.in_tag": "%1$sのタグが付けられてるか",
"create.item_attributes.in_tag.inverted": "%1$sのタグがついていないか",
"create.item_attributes.in_item_group": "%1$sに属してるか",
"create.item_attributes.in_item_group.inverted": "%1$sに属していないか",
"create.item_attributes.added_by": "%1$sによって追加されたか",
"create.item_attributes.added_by.inverted": "%1$sによって追加されていないか",
"create.item_attributes.shulker_level": "%1$sシュルカーか",
"create.item_attributes.shulker_level.inverted": "%1$sシュルカーでないか",
"create.item_attributes.shulker_level.full": "満杯の",
"create.item_attributes.shulker_level.empty": "空の",
"create.item_attributes.shulker_level.partial": "一部埋まっている",
"create.item_attributes.has_enchant": "エンチャントされているか%1$s",
"create.item_attributes.has_enchant.inverted": "エンチャントがされていないか",
"create.item_attributes.color": "%1$sで染められているか",
"create.item_attributes.color.inverted": "%1$sで染められていないか",
"create.item_attributes.max_enchanted": "最大レベルのエンチャントがされているか",
"create.item_attributes.max_enchanted.inverted": "最大レベルのエンチャントがされていないか",
"create.item_attributes.has_fluid": "%1$sを含んでいるか",
"create.item_attributes.has_fluid.inverted": "%1$sを含んでいないか",
"create.item_attributes.has_name": "%1$sの名前が付けられているか",
@ -1098,14 +1103,14 @@
"create.item_attributes.book_copy_second.inverted": "コピーのコピーでないか",
"create.item_attributes.book_copy_tattered": "ボロボロか",
"create.item_attributes.book_copy_tattered.inverted": "ボロボロでないか",
"create.item_attributes.astralsorcery_crystal": "%1$s クリスタル属性を持つ",
"create.item_attributes.astralsorcery_crystal.inverted": "%1$s クリスタル属性を持たない",
"create.item_attributes.astralsorcery_constellation": "%1$s に同調している",
"create.item_attributes.astralsorcery_constellation.inverted": "%1$s に同調していない",
"create.item_attributes.astralsorcery_perk_gem": "%1$s 特典属性がある",
"create.item_attributes.astralsorcery_perk_gem.inverted": "%1$s 特典属性がない",
"create.item_attributes.astralsorcery_amulet": "%1$s 改善",
"create.item_attributes.astralsorcery_amulet.inverted": "%1$s 改善されない",
"create.item_attributes.astralsorcery_constellation": "%1$s に同調している",
"create.item_attributes.astralsorcery_constellation.inverted": "%1$s に同調していない",
"create.item_attributes.astralsorcery_crystal": "%1$s クリスタル属性を持つ",
"create.item_attributes.astralsorcery_crystal.inverted": "%1$s クリスタル属性を持たない",
"create.item_attributes.astralsorcery_perk_gem": "%1$s 特典属性がある",
"create.item_attributes.astralsorcery_perk_gem.inverted": "%1$s 特典属性がない",
"create.gui.attribute_filter.no_selected_attributes": "属性が選択されていません",
"create.gui.attribute_filter.selected_attributes": "選択された属性:",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 30",
"_": "Missing Localizations: 35",
"_": "->------------------------] Game Elements [------------------------<-",
@ -754,6 +754,7 @@
"create.recipe.assembly.repeat": "%1$s번 반복하기",
"create.recipe.assembly.junk": "조립 실패한 조각들",
"create.recipe.processing.chance": "%1$s%% 확률",
"create.recipe.deploying.not_consumed": "UNLOCALIZED: Not Consumed",
"create.recipe.heat_requirement.none": "열이 필요하지 않음",
"create.recipe.heat_requirement.heated": "가열됨",
"create.recipe.heat_requirement.superheated": "초고온 가열됨",
@ -1045,18 +1046,14 @@
"create.item_attributes.placeable.inverted": "설치할 수 없음",
"create.item_attributes.consumable": "먹을 수 있음",
"create.item_attributes.consumable.inverted": "먹을 수 없음",
"create.item_attributes.smeltable": "구워질 수 있음",
"create.item_attributes.smeltable.inverted": "구워질 수 없음",
"create.item_attributes.washable": "세척될 수 있음",
"create.item_attributes.washable.inverted": "세척될 수 없음",
"create.item_attributes.smokable": "훈연될 수 있음",
"create.item_attributes.smokable.inverted": "훈연될 수 없음",
"create.item_attributes.crushable": "분쇄될 수 있음",
"create.item_attributes.crushable.inverted": "분쇄될 수 없음",
"create.item_attributes.blastable": "용광로에 녹일 수 있음",
"create.item_attributes.blastable.inverted": "용광로에 녹일 수 없음",
"create.item_attributes.fluid_container": "UNLOCALIZED: can store fluids",
"create.item_attributes.fluid_container.inverted": "UNLOCALIZED: cannot store fluids",
"create.item_attributes.enchanted": "마법부여됨",
"create.item_attributes.enchanted.inverted": "마법부여되지 않음",
"create.item_attributes.max_enchanted": "마법부여가 최고 레벨임",
"create.item_attributes.max_enchanted.inverted": "마법부여가 최고 레벨이 아님",
"create.item_attributes.renamed": "UNLOCALIZED: has a custom name",
"create.item_attributes.renamed.inverted": "UNLOCALIZED: does not have a custom name",
"create.item_attributes.damaged": "내구도가 닮",
"create.item_attributes.damaged.inverted": "내구도가 닳지 않음",
"create.item_attributes.badly_damaged": "심각하게 내구도가 닮",
@ -1067,23 +1064,31 @@
"create.item_attributes.equipable.inverted": "장착할 수 없음",
"create.item_attributes.furnace_fuel": "화로 연료로 쓸 수 있음",
"create.item_attributes.furnace_fuel.inverted": "화로 연료로 쓸 수 없음",
"create.item_attributes.washable": "세척될 수 있음",
"create.item_attributes.washable.inverted": "세척될 수 없음",
"create.item_attributes.crushable": "분쇄될 수 있음",
"create.item_attributes.crushable.inverted": "분쇄될 수 없음",
"create.item_attributes.smeltable": "구워질 수 있음",
"create.item_attributes.smeltable.inverted": "구워질 수 없음",
"create.item_attributes.smokable": "훈연될 수 있음",
"create.item_attributes.smokable.inverted": "훈연될 수 없음",
"create.item_attributes.blastable": "용광로에 녹일 수 있음",
"create.item_attributes.blastable.inverted": "용광로에 녹일 수 없음",
"create.item_attributes.shulker_level": "셜커가 %1$s있음",
"create.item_attributes.shulker_level.inverted": "셜커가 %1$s있지 않음",
"create.item_attributes.shulker_level.full": "가득 차",
"create.item_attributes.shulker_level.empty": "비어",
"create.item_attributes.shulker_level.partial": "조금 차",
"create.item_attributes.in_tag": "%1$s로 등록됨",
"create.item_attributes.in_tag.inverted": "%1$s로 등록되지 않음",
"create.item_attributes.in_item_group": "%1$s탭에 속함",
"create.item_attributes.in_item_group.inverted": "%1$s탭에 속함",
"create.item_attributes.added_by": "%1$s모드가 추가함",
"create.item_attributes.added_by.inverted": "%1$s모드가 추가하지 않음",
"create.item_attributes.shulker_level": "셜커가 %1$s있음",
"create.item_attributes.shulker_level.inverted": "셜커가 %1$s있지 않음",
"create.item_attributes.shulker_level.full": "가득 차",
"create.item_attributes.shulker_level.empty": "비어",
"create.item_attributes.shulker_level.partial": "조금 차",
"create.item_attributes.has_enchant": "%1$s 마법부여를 가지고 있음",
"create.item_attributes.has_enchant.inverted": "%1$s 마법부여를 가지고 있지 않음",
"create.item_attributes.color": "염색됨",
"create.item_attributes.color.inverted": "염색되지 않음",
"create.item_attributes.max_enchanted": "마법부여가 최고 레벨임",
"create.item_attributes.max_enchanted.inverted": "마법부여가 최고 레벨이 아님",
"create.item_attributes.has_fluid": "%1$s을(를) 담고 있음",
"create.item_attributes.has_fluid.inverted": "%1$s을(를) 담고 있지 않음",
"create.item_attributes.has_name": "%1$s이라는 이름을 갖고 있음",
@ -1098,14 +1103,14 @@
"create.item_attributes.book_copy_second.inverted": "복사본의 복사본이 아님",
"create.item_attributes.book_copy_tattered": "낡고 헐었음",
"create.item_attributes.book_copy_tattered.inverted": "낡고 헐지 않음",
"create.item_attributes.astralsorcery_crystal": "%1$s 수정 속성을 가짐",
"create.item_attributes.astralsorcery_crystal.inverted": "%1$s 수정 속성을 가지고 있지 않음",
"create.item_attributes.astralsorcery_constellation": "%1$s에 조율됨",
"create.item_attributes.astralsorcery_constellation.inverted": "%1$s에 조율되지 않음",
"create.item_attributes.astralsorcery_perk_gem": "%1$s 퍽 속성을 가짐",
"create.item_attributes.astralsorcery_perk_gem.inverted": "%1$s 퍽 속성을 가지고 있지 않음",
"create.item_attributes.astralsorcery_amulet": "%1$s이(가) 향상됨",
"create.item_attributes.astralsorcery_amulet.inverted": "%1$s이(가) 향상되지 않음",
"create.item_attributes.astralsorcery_constellation": "%1$s에 조율됨",
"create.item_attributes.astralsorcery_constellation.inverted": "%1$s에 조율되지 않음",
"create.item_attributes.astralsorcery_crystal": "%1$s 수정 속성을 가짐",
"create.item_attributes.astralsorcery_crystal.inverted": "%1$s 수정 속성을 가지고 있지 않음",
"create.item_attributes.astralsorcery_perk_gem": "%1$s 퍽 속성을 가짐",
"create.item_attributes.astralsorcery_perk_gem.inverted": "%1$s 퍽 속성을 가지고 있지 않음",
"create.gui.attribute_filter.no_selected_attributes": "속성이 선택되지 않음",
"create.gui.attribute_filter.selected_attributes": "선택된 속성:",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 1772",
"_": "Missing Localizations: 1777",
"_": "->------------------------] Game Elements [------------------------<-",
@ -754,6 +754,7 @@
"create.recipe.assembly.repeat": "UNLOCALIZED: Repeat Sequence %1$s Times",
"create.recipe.assembly.junk": "UNLOCALIZED: Random salvage",
"create.recipe.processing.chance": "%1$s%% Kans",
"create.recipe.deploying.not_consumed": "UNLOCALIZED: Not Consumed",
"create.recipe.heat_requirement.none": "UNLOCALIZED: No Heating Required",
"create.recipe.heat_requirement.heated": "UNLOCALIZED: Heated",
"create.recipe.heat_requirement.superheated": "UNLOCALIZED: Super-Heated",
@ -1045,18 +1046,14 @@
"create.item_attributes.placeable.inverted": "UNLOCALIZED: is not placeable",
"create.item_attributes.consumable": "UNLOCALIZED: can be eaten",
"create.item_attributes.consumable.inverted": "UNLOCALIZED: cannot be eaten",
"create.item_attributes.smeltable": "UNLOCALIZED: can be Smelted",
"create.item_attributes.smeltable.inverted": "UNLOCALIZED: cannot be Smelted",
"create.item_attributes.washable": "UNLOCALIZED: can be Washed",
"create.item_attributes.washable.inverted": "UNLOCALIZED: cannot be Washed",
"create.item_attributes.smokable": "UNLOCALIZED: can be Smoked",
"create.item_attributes.smokable.inverted": "UNLOCALIZED: cannot be Smoked",
"create.item_attributes.crushable": "UNLOCALIZED: can be Crushed",
"create.item_attributes.crushable.inverted": "UNLOCALIZED: cannot be Crushed",
"create.item_attributes.blastable": "UNLOCALIZED: is smeltable in Blast Furnace",
"create.item_attributes.blastable.inverted": "UNLOCALIZED: is not smeltable in Blast Furnace",
"create.item_attributes.fluid_container": "UNLOCALIZED: can store fluids",
"create.item_attributes.fluid_container.inverted": "UNLOCALIZED: cannot store fluids",
"create.item_attributes.enchanted": "UNLOCALIZED: is enchanted",
"create.item_attributes.enchanted.inverted": "UNLOCALIZED: is unenchanted",
"create.item_attributes.max_enchanted": "UNLOCALIZED: is enchanted at max level",
"create.item_attributes.max_enchanted.inverted": "UNLOCALIZED: is not enchanted at max level",
"create.item_attributes.renamed": "UNLOCALIZED: has a custom name",
"create.item_attributes.renamed.inverted": "UNLOCALIZED: does not have a custom name",
"create.item_attributes.damaged": "UNLOCALIZED: is damaged",
"create.item_attributes.damaged.inverted": "UNLOCALIZED: is not damaged",
"create.item_attributes.badly_damaged": "UNLOCALIZED: is heavily damaged",
@ -1067,23 +1064,31 @@
"create.item_attributes.equipable.inverted": "UNLOCALIZED: cannot be equipped",
"create.item_attributes.furnace_fuel": "UNLOCALIZED: is furnace fuel",
"create.item_attributes.furnace_fuel.inverted": "UNLOCALIZED: is not furnace fuel",
"create.item_attributes.washable": "UNLOCALIZED: can be Washed",
"create.item_attributes.washable.inverted": "UNLOCALIZED: cannot be Washed",
"create.item_attributes.crushable": "UNLOCALIZED: can be Crushed",
"create.item_attributes.crushable.inverted": "UNLOCALIZED: cannot be Crushed",
"create.item_attributes.smeltable": "UNLOCALIZED: can be Smelted",
"create.item_attributes.smeltable.inverted": "UNLOCALIZED: cannot be Smelted",
"create.item_attributes.smokable": "UNLOCALIZED: can be Smoked",
"create.item_attributes.smokable.inverted": "UNLOCALIZED: cannot be Smoked",
"create.item_attributes.blastable": "UNLOCALIZED: is smeltable in Blast Furnace",
"create.item_attributes.blastable.inverted": "UNLOCALIZED: is not smeltable in Blast Furnace",
"create.item_attributes.shulker_level": "UNLOCALIZED: is shulker %1$s",
"create.item_attributes.shulker_level.inverted": "UNLOCALIZED: is shulker not %1$s",
"create.item_attributes.shulker_level.full": "UNLOCALIZED: full",
"create.item_attributes.shulker_level.empty": "UNLOCALIZED: empty",
"create.item_attributes.shulker_level.partial": "UNLOCALIZED: partially filled",
"create.item_attributes.in_tag": "UNLOCALIZED: is tagged %1$s",
"create.item_attributes.in_tag.inverted": "UNLOCALIZED: is not tagged %1$s",
"create.item_attributes.in_item_group": "UNLOCALIZED: is in group '%1$s'",
"create.item_attributes.in_item_group.inverted": "UNLOCALIZED: is not in group '%1$s'",
"create.item_attributes.added_by": "UNLOCALIZED: was added by %1$s",
"create.item_attributes.added_by.inverted": "UNLOCALIZED: was not added by %1$s",
"create.item_attributes.shulker_level": "UNLOCALIZED: is shulker %1$s",
"create.item_attributes.shulker_level.inverted": "UNLOCALIZED: is shulker not %1$s",
"create.item_attributes.shulker_level.full": "UNLOCALIZED: full",
"create.item_attributes.shulker_level.empty": "UNLOCALIZED: empty",
"create.item_attributes.shulker_level.partial": "UNLOCALIZED: partially filled",
"create.item_attributes.has_enchant": "UNLOCALIZED: is enchanted with %1$s",
"create.item_attributes.has_enchant.inverted": "UNLOCALIZED: is not enchanted with %1$s",
"create.item_attributes.color": "UNLOCALIZED: is dyed %1$s",
"create.item_attributes.color.inverted": "UNLOCALIZED: is not dyed %1$s",
"create.item_attributes.max_enchanted": "UNLOCALIZED: is enchanted at max level",
"create.item_attributes.max_enchanted.inverted": "UNLOCALIZED: is not enchanted at max level",
"create.item_attributes.has_fluid": "UNLOCALIZED: contains %1$s",
"create.item_attributes.has_fluid.inverted": "UNLOCALIZED: does not contain %1$s",
"create.item_attributes.has_name": "UNLOCALIZED: has the custom name %1$s",
@ -1098,14 +1103,14 @@
"create.item_attributes.book_copy_second.inverted": "UNLOCALIZED: is not a second-generation copy",
"create.item_attributes.book_copy_tattered": "UNLOCALIZED: is a tattered mess",
"create.item_attributes.book_copy_tattered.inverted": "UNLOCALIZED: is not a tattered mess",
"create.item_attributes.astralsorcery_crystal": "UNLOCALIZED: has crystal attribute %1$s",
"create.item_attributes.astralsorcery_crystal.inverted": "UNLOCALIZED: does not have crystal attribute %1$s",
"create.item_attributes.astralsorcery_constellation": "UNLOCALIZED: is attuned to %1$s",
"create.item_attributes.astralsorcery_constellation.inverted": "UNLOCALIZED: is not attuned to %1$s",
"create.item_attributes.astralsorcery_perk_gem": "UNLOCALIZED: has perk attribute %1$s",
"create.item_attributes.astralsorcery_perk_gem.inverted": "UNLOCALIZED: does not have perk attribute %1$s",
"create.item_attributes.astralsorcery_amulet": "UNLOCALIZED: improves %1$s",
"create.item_attributes.astralsorcery_amulet.inverted": "UNLOCALIZED: does not improve %1$s",
"create.item_attributes.astralsorcery_constellation": "UNLOCALIZED: is attuned to %1$s",
"create.item_attributes.astralsorcery_constellation.inverted": "UNLOCALIZED: is not attuned to %1$s",
"create.item_attributes.astralsorcery_crystal": "UNLOCALIZED: has crystal attribute %1$s",
"create.item_attributes.astralsorcery_crystal.inverted": "UNLOCALIZED: does not have crystal attribute %1$s",
"create.item_attributes.astralsorcery_perk_gem": "UNLOCALIZED: has perk attribute %1$s",
"create.item_attributes.astralsorcery_perk_gem.inverted": "UNLOCALIZED: does not have perk attribute %1$s",
"create.gui.attribute_filter.no_selected_attributes": "UNLOCALIZED: No attributes selected",
"create.gui.attribute_filter.selected_attributes": "UNLOCALIZED: Selected attributes:",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 262",
"_": "Missing Localizations: 267",
"_": "->------------------------] Game Elements [------------------------<-",
@ -754,6 +754,7 @@
"create.recipe.assembly.repeat": "UNLOCALIZED: Repeat Sequence %1$s Times",
"create.recipe.assembly.junk": "UNLOCALIZED: Random salvage",
"create.recipe.processing.chance": "%1$s%% szans",
"create.recipe.deploying.not_consumed": "UNLOCALIZED: Not Consumed",
"create.recipe.heat_requirement.none": "Nie wymaga podgrzewania",
"create.recipe.heat_requirement.heated": "Podrzewane",
"create.recipe.heat_requirement.superheated": "Silnie podgrzewane",
@ -1045,18 +1046,14 @@
"create.item_attributes.placeable.inverted": "nie jest stawialny",
"create.item_attributes.consumable": "jadalny",
"create.item_attributes.consumable.inverted": "niejadalny",
"create.item_attributes.smeltable": "może zostać przepalony",
"create.item_attributes.smeltable.inverted": "nie może zostać przepalony",
"create.item_attributes.washable": "może zostać opłukany",
"create.item_attributes.washable.inverted": "nie może zostać opłukany",
"create.item_attributes.smokable": "może być wędzony",
"create.item_attributes.smokable.inverted": "nie może być wędzony",
"create.item_attributes.crushable": "może być rozkruszony",
"create.item_attributes.crushable.inverted": "nie może być rozkruszony",
"create.item_attributes.blastable": "może być stopiony w piecu hutniczym",
"create.item_attributes.blastable.inverted": "nie może być stopiony w piecu hutniczym",
"create.item_attributes.fluid_container": "UNLOCALIZED: can store fluids",
"create.item_attributes.fluid_container.inverted": "UNLOCALIZED: cannot store fluids",
"create.item_attributes.enchanted": "jest zaklęty",
"create.item_attributes.enchanted.inverted": "nie jest zaklęty",
"create.item_attributes.max_enchanted": "jest zaklęte na maksymalny poziom",
"create.item_attributes.max_enchanted.inverted": "nie jest zaklęte na maksymalny poziom",
"create.item_attributes.renamed": "UNLOCALIZED: has a custom name",
"create.item_attributes.renamed.inverted": "UNLOCALIZED: does not have a custom name",
"create.item_attributes.damaged": "jest uszkodzony",
"create.item_attributes.damaged.inverted": "nie jest uszkodzony",
"create.item_attributes.badly_damaged": "jest silnie uszkodzony",
@ -1067,23 +1064,31 @@
"create.item_attributes.equipable.inverted": "nie może zostać założony",
"create.item_attributes.furnace_fuel": "jest paliwem dla pieca",
"create.item_attributes.furnace_fuel.inverted": "nie jest paliwem dla pieca",
"create.item_attributes.washable": "może zostać opłukany",
"create.item_attributes.washable.inverted": "nie może zostać opłukany",
"create.item_attributes.crushable": "może być rozkruszony",
"create.item_attributes.crushable.inverted": "nie może być rozkruszony",
"create.item_attributes.smeltable": "może zostać przepalony",
"create.item_attributes.smeltable.inverted": "nie może zostać przepalony",
"create.item_attributes.smokable": "może być wędzony",
"create.item_attributes.smokable.inverted": "nie może być wędzony",
"create.item_attributes.blastable": "może być stopiony w piecu hutniczym",
"create.item_attributes.blastable.inverted": "nie może być stopiony w piecu hutniczym",
"create.item_attributes.shulker_level": "UNLOCALIZED: is shulker %1$s",
"create.item_attributes.shulker_level.inverted": "UNLOCALIZED: is shulker not %1$s",
"create.item_attributes.shulker_level.full": "UNLOCALIZED: full",
"create.item_attributes.shulker_level.empty": "UNLOCALIZED: empty",
"create.item_attributes.shulker_level.partial": "UNLOCALIZED: partially filled",
"create.item_attributes.in_tag": "posiada znacznik %1$s",
"create.item_attributes.in_tag.inverted": "nie posiada znacznika %1$s",
"create.item_attributes.in_item_group": "jest w grupie \"%1$s\"",
"create.item_attributes.in_item_group.inverted": "nie jest w grupie \"%1$s\"",
"create.item_attributes.added_by": "dodany przez %1$s",
"create.item_attributes.added_by.inverted": "niedodany przez %1$s",
"create.item_attributes.shulker_level": "UNLOCALIZED: is shulker %1$s",
"create.item_attributes.shulker_level.inverted": "UNLOCALIZED: is shulker not %1$s",
"create.item_attributes.shulker_level.full": "UNLOCALIZED: full",
"create.item_attributes.shulker_level.empty": "UNLOCALIZED: empty",
"create.item_attributes.shulker_level.partial": "UNLOCALIZED: partially filled",
"create.item_attributes.has_enchant": "posiada zaklęcie %1$s",
"create.item_attributes.has_enchant.inverted": "nie posiada zaklęcia %1$s",
"create.item_attributes.color": "jest zafarbowane, kolor %1$s",
"create.item_attributes.color.inverted": "nie jest zafarbowane, kolor %1$s",
"create.item_attributes.max_enchanted": "jest zaklęte na maksymalny poziom",
"create.item_attributes.max_enchanted.inverted": "nie jest zaklęte na maksymalny poziom",
"create.item_attributes.has_fluid": "zawiera %1$s",
"create.item_attributes.has_fluid.inverted": "nie zawiera %1$s",
"create.item_attributes.has_name": "posiada nazwę %1$s",
@ -1098,14 +1103,14 @@
"create.item_attributes.book_copy_second.inverted": "nie jest kopią kopii",
"create.item_attributes.book_copy_tattered": "jest postrzępiona",
"create.item_attributes.book_copy_tattered.inverted": "nie jest postrzępiona",
"create.item_attributes.astralsorcery_crystal": "posiada właściwości kryształu %1$s",
"create.item_attributes.astralsorcery_crystal.inverted": "nie posiada właściwości kryształu %1$s",
"create.item_attributes.astralsorcery_constellation": "jest dopasowany do %1$s",
"create.item_attributes.astralsorcery_constellation.inverted": "nie jest dopasowany do %1$s",
"create.item_attributes.astralsorcery_perk_gem": "posiada dodatkową właściwość %1$s",
"create.item_attributes.astralsorcery_perk_gem.inverted": "nie posiada dodatkowej właściwości %1$s",
"create.item_attributes.astralsorcery_amulet": "ulepsza %1$s",
"create.item_attributes.astralsorcery_amulet.inverted": "nie ulepsza %1$s",
"create.item_attributes.astralsorcery_constellation": "jest dopasowany do %1$s",
"create.item_attributes.astralsorcery_constellation.inverted": "nie jest dopasowany do %1$s",
"create.item_attributes.astralsorcery_crystal": "posiada właściwości kryształu %1$s",
"create.item_attributes.astralsorcery_crystal.inverted": "nie posiada właściwości kryształu %1$s",
"create.item_attributes.astralsorcery_perk_gem": "posiada dodatkową właściwość %1$s",
"create.item_attributes.astralsorcery_perk_gem.inverted": "nie posiada dodatkowej właściwości %1$s",
"create.gui.attribute_filter.no_selected_attributes": "Brak wybranych właściwości",
"create.gui.attribute_filter.selected_attributes": "Wybrane właściwości:",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 1813",
"_": "Missing Localizations: 1818",
"_": "->------------------------] Game Elements [------------------------<-",
@ -754,6 +754,7 @@
"create.recipe.assembly.repeat": "UNLOCALIZED: Repeat Sequence %1$s Times",
"create.recipe.assembly.junk": "UNLOCALIZED: Random salvage",
"create.recipe.processing.chance": "%1$s%% de chance",
"create.recipe.deploying.not_consumed": "UNLOCALIZED: Not Consumed",
"create.recipe.heat_requirement.none": "UNLOCALIZED: No Heating Required",
"create.recipe.heat_requirement.heated": "UNLOCALIZED: Heated",
"create.recipe.heat_requirement.superheated": "UNLOCALIZED: Super-Heated",
@ -1045,18 +1046,14 @@
"create.item_attributes.placeable.inverted": "UNLOCALIZED: is not placeable",
"create.item_attributes.consumable": "UNLOCALIZED: can be eaten",
"create.item_attributes.consumable.inverted": "UNLOCALIZED: cannot be eaten",
"create.item_attributes.smeltable": "UNLOCALIZED: can be Smelted",
"create.item_attributes.smeltable.inverted": "UNLOCALIZED: cannot be Smelted",
"create.item_attributes.washable": "UNLOCALIZED: can be Washed",
"create.item_attributes.washable.inverted": "UNLOCALIZED: cannot be Washed",
"create.item_attributes.smokable": "UNLOCALIZED: can be Smoked",
"create.item_attributes.smokable.inverted": "UNLOCALIZED: cannot be Smoked",
"create.item_attributes.crushable": "UNLOCALIZED: can be Crushed",
"create.item_attributes.crushable.inverted": "UNLOCALIZED: cannot be Crushed",
"create.item_attributes.blastable": "UNLOCALIZED: is smeltable in Blast Furnace",
"create.item_attributes.blastable.inverted": "UNLOCALIZED: is not smeltable in Blast Furnace",
"create.item_attributes.fluid_container": "UNLOCALIZED: can store fluids",
"create.item_attributes.fluid_container.inverted": "UNLOCALIZED: cannot store fluids",
"create.item_attributes.enchanted": "UNLOCALIZED: is enchanted",
"create.item_attributes.enchanted.inverted": "UNLOCALIZED: is unenchanted",
"create.item_attributes.max_enchanted": "UNLOCALIZED: is enchanted at max level",
"create.item_attributes.max_enchanted.inverted": "UNLOCALIZED: is not enchanted at max level",
"create.item_attributes.renamed": "UNLOCALIZED: has a custom name",
"create.item_attributes.renamed.inverted": "UNLOCALIZED: does not have a custom name",
"create.item_attributes.damaged": "UNLOCALIZED: is damaged",
"create.item_attributes.damaged.inverted": "UNLOCALIZED: is not damaged",
"create.item_attributes.badly_damaged": "UNLOCALIZED: is heavily damaged",
@ -1067,23 +1064,31 @@
"create.item_attributes.equipable.inverted": "UNLOCALIZED: cannot be equipped",
"create.item_attributes.furnace_fuel": "UNLOCALIZED: is furnace fuel",
"create.item_attributes.furnace_fuel.inverted": "UNLOCALIZED: is not furnace fuel",
"create.item_attributes.washable": "UNLOCALIZED: can be Washed",
"create.item_attributes.washable.inverted": "UNLOCALIZED: cannot be Washed",
"create.item_attributes.crushable": "UNLOCALIZED: can be Crushed",
"create.item_attributes.crushable.inverted": "UNLOCALIZED: cannot be Crushed",
"create.item_attributes.smeltable": "UNLOCALIZED: can be Smelted",
"create.item_attributes.smeltable.inverted": "UNLOCALIZED: cannot be Smelted",
"create.item_attributes.smokable": "UNLOCALIZED: can be Smoked",
"create.item_attributes.smokable.inverted": "UNLOCALIZED: cannot be Smoked",
"create.item_attributes.blastable": "UNLOCALIZED: is smeltable in Blast Furnace",
"create.item_attributes.blastable.inverted": "UNLOCALIZED: is not smeltable in Blast Furnace",
"create.item_attributes.shulker_level": "UNLOCALIZED: is shulker %1$s",
"create.item_attributes.shulker_level.inverted": "UNLOCALIZED: is shulker not %1$s",
"create.item_attributes.shulker_level.full": "UNLOCALIZED: full",
"create.item_attributes.shulker_level.empty": "UNLOCALIZED: empty",
"create.item_attributes.shulker_level.partial": "UNLOCALIZED: partially filled",
"create.item_attributes.in_tag": "UNLOCALIZED: is tagged %1$s",
"create.item_attributes.in_tag.inverted": "UNLOCALIZED: is not tagged %1$s",
"create.item_attributes.in_item_group": "UNLOCALIZED: is in group '%1$s'",
"create.item_attributes.in_item_group.inverted": "UNLOCALIZED: is not in group '%1$s'",
"create.item_attributes.added_by": "UNLOCALIZED: was added by %1$s",
"create.item_attributes.added_by.inverted": "UNLOCALIZED: was not added by %1$s",
"create.item_attributes.shulker_level": "UNLOCALIZED: is shulker %1$s",
"create.item_attributes.shulker_level.inverted": "UNLOCALIZED: is shulker not %1$s",
"create.item_attributes.shulker_level.full": "UNLOCALIZED: full",
"create.item_attributes.shulker_level.empty": "UNLOCALIZED: empty",
"create.item_attributes.shulker_level.partial": "UNLOCALIZED: partially filled",
"create.item_attributes.has_enchant": "UNLOCALIZED: is enchanted with %1$s",
"create.item_attributes.has_enchant.inverted": "UNLOCALIZED: is not enchanted with %1$s",
"create.item_attributes.color": "UNLOCALIZED: is dyed %1$s",
"create.item_attributes.color.inverted": "UNLOCALIZED: is not dyed %1$s",
"create.item_attributes.max_enchanted": "UNLOCALIZED: is enchanted at max level",
"create.item_attributes.max_enchanted.inverted": "UNLOCALIZED: is not enchanted at max level",
"create.item_attributes.has_fluid": "UNLOCALIZED: contains %1$s",
"create.item_attributes.has_fluid.inverted": "UNLOCALIZED: does not contain %1$s",
"create.item_attributes.has_name": "UNLOCALIZED: has the custom name %1$s",
@ -1098,14 +1103,14 @@
"create.item_attributes.book_copy_second.inverted": "UNLOCALIZED: is not a second-generation copy",
"create.item_attributes.book_copy_tattered": "UNLOCALIZED: is a tattered mess",
"create.item_attributes.book_copy_tattered.inverted": "UNLOCALIZED: is not a tattered mess",
"create.item_attributes.astralsorcery_crystal": "UNLOCALIZED: has crystal attribute %1$s",
"create.item_attributes.astralsorcery_crystal.inverted": "UNLOCALIZED: does not have crystal attribute %1$s",
"create.item_attributes.astralsorcery_constellation": "UNLOCALIZED: is attuned to %1$s",
"create.item_attributes.astralsorcery_constellation.inverted": "UNLOCALIZED: is not attuned to %1$s",
"create.item_attributes.astralsorcery_perk_gem": "UNLOCALIZED: has perk attribute %1$s",
"create.item_attributes.astralsorcery_perk_gem.inverted": "UNLOCALIZED: does not have perk attribute %1$s",
"create.item_attributes.astralsorcery_amulet": "UNLOCALIZED: improves %1$s",
"create.item_attributes.astralsorcery_amulet.inverted": "UNLOCALIZED: does not improve %1$s",
"create.item_attributes.astralsorcery_constellation": "UNLOCALIZED: is attuned to %1$s",
"create.item_attributes.astralsorcery_constellation.inverted": "UNLOCALIZED: is not attuned to %1$s",
"create.item_attributes.astralsorcery_crystal": "UNLOCALIZED: has crystal attribute %1$s",
"create.item_attributes.astralsorcery_crystal.inverted": "UNLOCALIZED: does not have crystal attribute %1$s",
"create.item_attributes.astralsorcery_perk_gem": "UNLOCALIZED: has perk attribute %1$s",
"create.item_attributes.astralsorcery_perk_gem.inverted": "UNLOCALIZED: does not have perk attribute %1$s",
"create.gui.attribute_filter.no_selected_attributes": "UNLOCALIZED: No attributes selected",
"create.gui.attribute_filter.selected_attributes": "UNLOCALIZED: Selected attributes:",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 11",
"_": "Missing Localizations: 16",
"_": "->------------------------] Game Elements [------------------------<-",
@ -754,6 +754,7 @@
"create.recipe.assembly.repeat": "Повторите последовательность %1$s раз",
"create.recipe.assembly.junk": "Случайный мусор",
"create.recipe.processing.chance": "%1$s%% шанса",
"create.recipe.deploying.not_consumed": "UNLOCALIZED: Not Consumed",
"create.recipe.heat_requirement.none": "Не требует нагрева",
"create.recipe.heat_requirement.heated": "Нагрето",
"create.recipe.heat_requirement.superheated": "Перегрето",
@ -1045,18 +1046,14 @@
"create.item_attributes.placeable.inverted": "нельзя разместить",
"create.item_attributes.consumable": "можно съесть",
"create.item_attributes.consumable.inverted": "нельзя съесть",
"create.item_attributes.smeltable": "можно расплавить",
"create.item_attributes.smeltable.inverted": "нельзя расплавить",
"create.item_attributes.washable": "можно промыть",
"create.item_attributes.washable.inverted": "нельзя промыть",
"create.item_attributes.smokable": "можно прокоптить",
"create.item_attributes.smokable.inverted": "нельзя прокоптить",
"create.item_attributes.crushable": "можно измельчить",
"create.item_attributes.crushable.inverted": "нельзя разместить",
"create.item_attributes.blastable": "плавится в доменной печи",
"create.item_attributes.blastable.inverted": "не плавится в доменной печи",
"create.item_attributes.fluid_container": "UNLOCALIZED: can store fluids",
"create.item_attributes.fluid_container.inverted": "UNLOCALIZED: cannot store fluids",
"create.item_attributes.enchanted": "зачарован",
"create.item_attributes.enchanted.inverted": "не зачарован",
"create.item_attributes.max_enchanted": "Зачаровано за максимальный уровень",
"create.item_attributes.max_enchanted.inverted": "Не зачаровано за максимальный уровень",
"create.item_attributes.renamed": "UNLOCALIZED: has a custom name",
"create.item_attributes.renamed.inverted": "UNLOCALIZED: does not have a custom name",
"create.item_attributes.damaged": "повреждён",
"create.item_attributes.damaged.inverted": "не повреждён",
"create.item_attributes.badly_damaged": "сильно повреждён",
@ -1067,23 +1064,31 @@
"create.item_attributes.equipable.inverted": "не может быть надет",
"create.item_attributes.furnace_fuel": "является топливом",
"create.item_attributes.furnace_fuel.inverted": "не является топливом",
"create.item_attributes.washable": "можно промыть",
"create.item_attributes.washable.inverted": "нельзя промыть",
"create.item_attributes.crushable": "можно измельчить",
"create.item_attributes.crushable.inverted": "нельзя разместить",
"create.item_attributes.smeltable": "можно расплавить",
"create.item_attributes.smeltable.inverted": "нельзя расплавить",
"create.item_attributes.smokable": "можно прокоптить",
"create.item_attributes.smokable.inverted": "нельзя прокоптить",
"create.item_attributes.blastable": "плавится в доменной печи",
"create.item_attributes.blastable.inverted": "не плавится в доменной печи",
"create.item_attributes.shulker_level": "шалкер %1$s",
"create.item_attributes.shulker_level.inverted": "шалкер не %1$s",
"create.item_attributes.shulker_level.full": "полный",
"create.item_attributes.shulker_level.empty": "пустой",
"create.item_attributes.shulker_level.partial": "частично заполнен",
"create.item_attributes.in_tag": "помечен %1$s",
"create.item_attributes.in_tag.inverted": "не помечен %1$s",
"create.item_attributes.in_item_group": "принадлежит %1$s",
"create.item_attributes.in_item_group.inverted": "не принадлежит '%1$s'",
"create.item_attributes.added_by": "был добавлен %1$s",
"create.item_attributes.added_by.inverted": "не был добавлен %1$s",
"create.item_attributes.shulker_level": "шалкер %1$s",
"create.item_attributes.shulker_level.inverted": "шалкер не %1$s",
"create.item_attributes.shulker_level.full": "полный",
"create.item_attributes.shulker_level.empty": "пустой",
"create.item_attributes.shulker_level.partial": "частично заполнен",
"create.item_attributes.has_enchant": "зачарован на %1$s",
"create.item_attributes.has_enchant.inverted": "не зачарован на %1$s",
"create.item_attributes.color": "Покрашено в %1$s",
"create.item_attributes.color.inverted": "Не покрашено в %1$s",
"create.item_attributes.max_enchanted": "Зачаровано за максимальный уровень",
"create.item_attributes.max_enchanted.inverted": "Не зачаровано за максимальный уровень",
"create.item_attributes.has_fluid": "содержит %1$s",
"create.item_attributes.has_fluid.inverted": "не содержит %1$s",
"create.item_attributes.has_name": "имеет нестандартное имя %1$s",
@ -1098,14 +1103,14 @@
"create.item_attributes.book_copy_second.inverted": "не копия второго порядка",
"create.item_attributes.book_copy_tattered": "полный беспорядок",
"create.item_attributes.book_copy_tattered.inverted": "не полный беспорядок",
"create.item_attributes.astralsorcery_crystal": "имеет характеристики кристалла %1$s",
"create.item_attributes.astralsorcery_crystal.inverted": "не имеет характеристики кристалла %1$s",
"create.item_attributes.astralsorcery_constellation": "настроено на %1$s",
"create.item_attributes.astralsorcery_constellation.inverted": "не настроено на %1$s",
"create.item_attributes.astralsorcery_perk_gem": "имеет характеристики перка %1$s",
"create.item_attributes.astralsorcery_perk_gem.inverted": "не имеет характеристики перка %1$s",
"create.item_attributes.astralsorcery_amulet": "исправляет %1$s",
"create.item_attributes.astralsorcery_amulet.inverted": "не исправляет %1$s",
"create.item_attributes.astralsorcery_constellation": "настроено на %1$s",
"create.item_attributes.astralsorcery_constellation.inverted": "не настроено на %1$s",
"create.item_attributes.astralsorcery_crystal": "имеет характеристики кристалла %1$s",
"create.item_attributes.astralsorcery_crystal.inverted": "не имеет характеристики кристалла %1$s",
"create.item_attributes.astralsorcery_perk_gem": "имеет характеристики перка %1$s",
"create.item_attributes.astralsorcery_perk_gem.inverted": "не имеет характеристики перка %1$s",
"create.gui.attribute_filter.no_selected_attributes": "Атрибуты не выбраны",
"create.gui.attribute_filter.selected_attributes": "Выбранные атрибуты:",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 10",
"_": "Missing Localizations: 15",
"_": "->------------------------] Game Elements [------------------------<-",
@ -754,6 +754,7 @@
"create.recipe.assembly.repeat": "该序列需要重复 %1$s 次",
"create.recipe.assembly.junk": "随机废料",
"create.recipe.processing.chance": "%1$s%%概率",
"create.recipe.deploying.not_consumed": "UNLOCALIZED: Not Consumed",
"create.recipe.heat_requirement.none": "无需加热",
"create.recipe.heat_requirement.heated": "加热",
"create.recipe.heat_requirement.superheated": "超级加热",
@ -1045,18 +1046,14 @@
"create.item_attributes.placeable.inverted": "不可放置",
"create.item_attributes.consumable": "可食用",
"create.item_attributes.consumable.inverted": "不可食用",
"create.item_attributes.smeltable": "可被熔炉烧制",
"create.item_attributes.smeltable.inverted": "不可被熔炉烧制",
"create.item_attributes.washable": "可被洗涤",
"create.item_attributes.washable.inverted": "不可被洗涤",
"create.item_attributes.smokable": "可被烟熏",
"create.item_attributes.smokable.inverted": "不可被烟熏",
"create.item_attributes.crushable": "可被粉碎",
"create.item_attributes.crushable.inverted": "不可被粉碎",
"create.item_attributes.blastable": "可被高炉冶炼",
"create.item_attributes.blastable.inverted": "不可被高炉冶炼",
"create.item_attributes.fluid_container": "UNLOCALIZED: can store fluids",
"create.item_attributes.fluid_container.inverted": "UNLOCALIZED: cannot store fluids",
"create.item_attributes.enchanted": "已被附魔",
"create.item_attributes.enchanted.inverted": "未被附魔",
"create.item_attributes.max_enchanted": "已达到最高附魔等级",
"create.item_attributes.max_enchanted.inverted": "并未达到最高附魔等级",
"create.item_attributes.renamed": "UNLOCALIZED: has a custom name",
"create.item_attributes.renamed.inverted": "UNLOCALIZED: does not have a custom name",
"create.item_attributes.damaged": "已损坏",
"create.item_attributes.damaged.inverted": "未损坏",
"create.item_attributes.badly_damaged": "严重受损",
@ -1067,23 +1064,31 @@
"create.item_attributes.equipable.inverted": "不可装备",
"create.item_attributes.furnace_fuel": "可作为燃料",
"create.item_attributes.furnace_fuel.inverted": "不可作为燃料",
"create.item_attributes.washable": "可被洗涤",
"create.item_attributes.washable.inverted": "不可被洗涤",
"create.item_attributes.crushable": "可被粉碎",
"create.item_attributes.crushable.inverted": "不可被粉碎",
"create.item_attributes.smeltable": "可被熔炉烧制",
"create.item_attributes.smeltable.inverted": "不可被熔炉烧制",
"create.item_attributes.smokable": "可被烟熏",
"create.item_attributes.smokable.inverted": "不可被烟熏",
"create.item_attributes.blastable": "可被高炉冶炼",
"create.item_attributes.blastable.inverted": "不可被高炉冶炼",
"create.item_attributes.shulker_level": "潜影盒是%1$s的",
"create.item_attributes.shulker_level.inverted": "潜影盒不是%1$s的",
"create.item_attributes.shulker_level.full": "满",
"create.item_attributes.shulker_level.empty": "空",
"create.item_attributes.shulker_level.partial": "部分填充",
"create.item_attributes.in_tag": "标签是%1$s",
"create.item_attributes.in_tag.inverted": "标签不是%1$s",
"create.item_attributes.in_item_group": "属于%1$s",
"create.item_attributes.in_item_group.inverted": "不属于%1$s",
"create.item_attributes.added_by": "由%1$s添加",
"create.item_attributes.added_by.inverted": "不由%1$s添加",
"create.item_attributes.shulker_level": "潜影盒是%1$s的",
"create.item_attributes.shulker_level.inverted": "潜影盒不是%1$s的",
"create.item_attributes.shulker_level.full": "满",
"create.item_attributes.shulker_level.empty": "空",
"create.item_attributes.shulker_level.partial": "部分填充",
"create.item_attributes.has_enchant": "有附魔效果%1$s",
"create.item_attributes.has_enchant.inverted": "没有附魔效果%1$s",
"create.item_attributes.color": "染色为%1$s",
"create.item_attributes.color.inverted": "未被染成%1$s",
"create.item_attributes.max_enchanted": "已达到最高附魔等级",
"create.item_attributes.max_enchanted.inverted": "并未达到最高附魔等级",
"create.item_attributes.has_fluid": "含有%1$s",
"create.item_attributes.has_fluid.inverted": "不含有%1$s",
"create.item_attributes.has_name": "有自定义名称%1$s",
@ -1098,14 +1103,14 @@
"create.item_attributes.book_copy_second.inverted": "不是第二代拷贝",
"create.item_attributes.book_copy_tattered": "拷贝次数已不可查",
"create.item_attributes.book_copy_tattered.inverted": "不是拷贝次数已不可查",
"create.item_attributes.astralsorcery_crystal": "有水晶石属性%1$s",
"create.item_attributes.astralsorcery_crystal.inverted": "没有水晶石属性%1$s",
"create.item_attributes.astralsorcery_constellation": "与%1$s共鸣",
"create.item_attributes.astralsorcery_constellation.inverted": "不与%1$s共鸣",
"create.item_attributes.astralsorcery_perk_gem": "带有有星能力属性%1$s",
"create.item_attributes.astralsorcery_perk_gem.inverted": "不带有星能力属性%1$s",
"create.item_attributes.astralsorcery_amulet": "璀璨棱镜增强%1$s",
"create.item_attributes.astralsorcery_amulet.inverted": "璀璨棱镜未增强%1$s",
"create.item_attributes.astralsorcery_constellation": "与%1$s共鸣",
"create.item_attributes.astralsorcery_constellation.inverted": "不与%1$s共鸣",
"create.item_attributes.astralsorcery_crystal": "有水晶石属性%1$s",
"create.item_attributes.astralsorcery_crystal.inverted": "没有水晶石属性%1$s",
"create.item_attributes.astralsorcery_perk_gem": "带有有星能力属性%1$s",
"create.item_attributes.astralsorcery_perk_gem.inverted": "不带有星能力属性%1$s",
"create.gui.attribute_filter.no_selected_attributes": "未选择任何属性",
"create.gui.attribute_filter.selected_attributes": "已选择的属性:",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 25",
"_": "Missing Localizations: 30",
"_": "->------------------------] Game Elements [------------------------<-",
@ -754,6 +754,7 @@
"create.recipe.assembly.repeat": "重複 %1$s 次",
"create.recipe.assembly.junk": "有機率得到垃圾",
"create.recipe.processing.chance": "%1$s%%概率",
"create.recipe.deploying.not_consumed": "UNLOCALIZED: Not Consumed",
"create.recipe.heat_requirement.none": "不需要加熱",
"create.recipe.heat_requirement.heated": "普通加熱",
"create.recipe.heat_requirement.superheated": "超級加熱",
@ -1045,18 +1046,14 @@
"create.item_attributes.placeable.inverted": "不可放置",
"create.item_attributes.consumable": "可食用",
"create.item_attributes.consumable.inverted": "不可食用",
"create.item_attributes.smeltable": "可被熔爐融煉",
"create.item_attributes.smeltable.inverted": "不可被熔爐融煉",
"create.item_attributes.washable": "可被篩洗",
"create.item_attributes.washable.inverted": "不可被篩洗",
"create.item_attributes.smokable": "可被煙熏",
"create.item_attributes.smokable.inverted": "不可被煙熏",
"create.item_attributes.crushable": "可被粉碎",
"create.item_attributes.crushable.inverted": "不可被粉碎",
"create.item_attributes.blastable": "可被高爐融煉",
"create.item_attributes.blastable.inverted": "不可被高爐融煉",
"create.item_attributes.fluid_container": "UNLOCALIZED: can store fluids",
"create.item_attributes.fluid_container.inverted": "UNLOCALIZED: cannot store fluids",
"create.item_attributes.enchanted": "已被附魔",
"create.item_attributes.enchanted.inverted": "未被附魔",
"create.item_attributes.max_enchanted": "已達到最高附魔等級",
"create.item_attributes.max_enchanted.inverted": "未達到最高附魔等級",
"create.item_attributes.renamed": "UNLOCALIZED: has a custom name",
"create.item_attributes.renamed.inverted": "UNLOCALIZED: does not have a custom name",
"create.item_attributes.damaged": "已損壞",
"create.item_attributes.damaged.inverted": "未損壞",
"create.item_attributes.badly_damaged": "嚴重受損",
@ -1067,23 +1064,31 @@
"create.item_attributes.equipable.inverted": "不可裝備",
"create.item_attributes.furnace_fuel": "是燃料",
"create.item_attributes.furnace_fuel.inverted": "不是燃料",
"create.item_attributes.washable": "可被篩洗",
"create.item_attributes.washable.inverted": "不可被篩洗",
"create.item_attributes.crushable": "可被粉碎",
"create.item_attributes.crushable.inverted": "不可被粉碎",
"create.item_attributes.smeltable": "可被熔爐融煉",
"create.item_attributes.smeltable.inverted": "不可被熔爐融煉",
"create.item_attributes.smokable": "可被煙熏",
"create.item_attributes.smokable.inverted": "不可被煙熏",
"create.item_attributes.blastable": "可被高爐融煉",
"create.item_attributes.blastable.inverted": "不可被高爐融煉",
"create.item_attributes.shulker_level": "界伏盒是 %1$s",
"create.item_attributes.shulker_level.inverted": "界伏盒不是 %1$s",
"create.item_attributes.shulker_level.full": "滿的",
"create.item_attributes.shulker_level.empty": "空的",
"create.item_attributes.shulker_level.partial": "有裝東西但沒滿",
"create.item_attributes.in_tag": "標籤是%1$s",
"create.item_attributes.in_tag.inverted": "標籤不是%1$s",
"create.item_attributes.in_item_group": "屬於%1$s",
"create.item_attributes.in_item_group.inverted": "不屬於%1$s",
"create.item_attributes.added_by": "由%1$s添加",
"create.item_attributes.added_by.inverted": "不是由%1$s添加",
"create.item_attributes.shulker_level": "界伏盒是 %1$s",
"create.item_attributes.shulker_level.inverted": "界伏盒不是 %1$s",
"create.item_attributes.shulker_level.full": "滿的",
"create.item_attributes.shulker_level.empty": "空的",
"create.item_attributes.shulker_level.partial": "有裝東西但沒滿",
"create.item_attributes.has_enchant": "有附魔效果%1$s",
"create.item_attributes.has_enchant.inverted": "沒有附魔效果%1$s",
"create.item_attributes.color": "已被染色成 %1$s",
"create.item_attributes.color.inverted": "未被染色成 %1$s",
"create.item_attributes.max_enchanted": "已達到最高附魔等級",
"create.item_attributes.max_enchanted.inverted": "未達到最高附魔等級",
"create.item_attributes.has_fluid": "包含%1$s",
"create.item_attributes.has_fluid.inverted": "不包含%1$s",
"create.item_attributes.has_name": "有自定義名稱%1$s",
@ -1098,14 +1103,14 @@
"create.item_attributes.book_copy_second.inverted": "不是第二份複製",
"create.item_attributes.book_copy_tattered": "是第三份複製",
"create.item_attributes.book_copy_tattered.inverted": "不是第三份複製",
"create.item_attributes.astralsorcery_crystal": "具有晶體屬性%1$s",
"create.item_attributes.astralsorcery_crystal.inverted": "不具有晶體屬性%1$s",
"create.item_attributes.astralsorcery_constellation": "與%1$s調諧",
"create.item_attributes.astralsorcery_constellation.inverted": "未與%1$s調諧",
"create.item_attributes.astralsorcery_perk_gem": "具有特殊屬性%1$s",
"create.item_attributes.astralsorcery_perk_gem.inverted": "不具有特殊屬性%1$s",
"create.item_attributes.astralsorcery_amulet": "提升%1$s",
"create.item_attributes.astralsorcery_amulet.inverted": "不提升%1$s",
"create.item_attributes.astralsorcery_constellation": "與%1$s調諧",
"create.item_attributes.astralsorcery_constellation.inverted": "未與%1$s調諧",
"create.item_attributes.astralsorcery_crystal": "具有晶體屬性%1$s",
"create.item_attributes.astralsorcery_crystal.inverted": "不具有晶體屬性%1$s",
"create.item_attributes.astralsorcery_perk_gem": "具有特殊屬性%1$s",
"create.item_attributes.astralsorcery_perk_gem.inverted": "不具有特殊屬性%1$s",
"create.gui.attribute_filter.no_selected_attributes": "沒有標記任何屬性",
"create.gui.attribute_filter.selected_attributes": "已選擇的屬性:",

View file

@ -28,8 +28,8 @@
"trigger": "create:bracket_apply",
"conditions": {
"accepted_entries": [
"create:cogwheel",
"create:large_cogwheel"
"create:large_cogwheel",
"create:cogwheel"
]
}
},

View file

@ -0,0 +1,14 @@
{
"replace": false,
"values": [
"create:granite_cobblestone",
"create:diorite_cobblestone",
"create:andesite_cobblestone",
"create:limestone_cobblestone",
"create:weathered_limestone_cobblestone",
"create:dolomite_cobblestone",
"create:gabbro_cobblestone",
"create:scoria_cobblestone",
"create:dark_scoria_cobblestone"
]
}

View file

@ -5,10 +5,10 @@
"create:polished_limestone",
"create:weathered_limestone",
"create:polished_weathered_limestone",
"create:gabbro",
"create:polished_gabbro",
"create:dolomite",
"create:polished_dolomite",
"create:gabbro",
"create:polished_gabbro",
"create:scoria",
"create:polished_scoria",
"create:dark_scoria",

View file

@ -3,8 +3,8 @@
"values": [
"create:limestone",
"create:weathered_limestone",
"create:gabbro",
"create:dolomite",
"create:gabbro",
"create:natural_scoria"
]
}

View file

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

View file

@ -5,10 +5,10 @@
"create:polished_limestone",
"create:weathered_limestone",
"create:polished_weathered_limestone",
"create:gabbro",
"create:polished_gabbro",
"create:dolomite",
"create:polished_dolomite",
"create:gabbro",
"create:polished_gabbro",
"create:scoria",
"create:polished_scoria",
"create:dark_scoria",

View file

@ -46,6 +46,9 @@ public class AllFluids {
.slopeFindDistance(3)
.explosionResistance(100f))
.tag(AllFluidTags.HONEY.tag)
.bucket()
.tag(AllTags.forgeItemTag("buckets/honey"))
.build()
.register();
public static final FluidEntry<ForgeFlowingFluid.Flowing> CHOCOLATE =

View file

@ -3,7 +3,6 @@ package com.simibubi.create;
import static com.simibubi.create.AllTags.forgeItemTag;
import static com.simibubi.create.AllTags.AllItemTags.CREATE_INGOTS;
import static com.simibubi.create.AllTags.AllItemTags.CRUSHED_ORES;
import static com.simibubi.create.AllTags.AllItemTags.NUGGETS;
import static com.simibubi.create.AllTags.AllItemTags.PLATES;
import static com.simibubi.create.content.AllSections.CURIOSITIES;
import static com.simibubi.create.content.AllSections.KINETICS;
@ -64,6 +63,7 @@ import net.minecraft.item.Rarity;
import net.minecraft.tags.ITag;
import net.minecraft.tags.ItemTags;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.common.Tags;
public class AllItems {
@ -167,9 +167,9 @@ public class AllItems {
.register();
public static final ItemEntry<Item> COPPER_NUGGET =
taggedIngredient("copper_nugget", forgeItemTag("nuggets/copper"), NUGGETS.tag),
ZINC_NUGGET = taggedIngredient("zinc_nugget", forgeItemTag("nuggets/zinc"), NUGGETS.tag),
BRASS_NUGGET = taggedIngredient("brass_nugget", forgeItemTag("nuggets/brass"), NUGGETS.tag),
taggedIngredient("copper_nugget", forgeItemTag("nuggets/copper"), Tags.Items.NUGGETS),
ZINC_NUGGET = taggedIngredient("zinc_nugget", forgeItemTag("nuggets/zinc"), Tags.Items.NUGGETS),
BRASS_NUGGET = taggedIngredient("brass_nugget", forgeItemTag("nuggets/brass"), Tags.Items.NUGGETS),
COPPER_SHEET = taggedIngredient("copper_sheet", forgeItemTag("plates/copper"), PLATES.tag),
BRASS_SHEET = taggedIngredient("brass_sheet", forgeItemTag("plates/brass"), PLATES.tag),

View file

@ -18,7 +18,7 @@ public enum AllSpecialTextures {
private ResourceLocation location;
private AllSpecialTextures(String filename) {
location = new ResourceLocation(Create.ID, ASSET_PATH + filename);
location = Create.asResource(ASSET_PATH + filename);
}
public void bind() {

View file

@ -78,7 +78,7 @@ public class AllSpriteShifts {
//
private static void populateMaps() {
WoodType[] supportedWoodTypes = new WoodType[]{
WoodType[] supportedWoodTypes = new WoodType[] {
WoodType.OAK, WoodType.SPRUCE, WoodType.BIRCH, WoodType.ACACIA, WoodType.JUNGLE, WoodType.DARK_OAK,
WoodType.CRIMSON, WoodType.WARPED
};

View file

@ -7,7 +7,6 @@ import static com.simibubi.create.AllTags.NameSpace.TIC;
import java.util.function.Function;
import com.simibubi.create.foundation.data.CreateRegistrate;
import com.simibubi.create.foundation.utility.EmptyNamedTag;
import com.simibubi.create.foundation.utility.Lang;
import com.tterrag.registrate.builders.BlockBuilder;
import com.tterrag.registrate.builders.ItemBuilder;
@ -27,78 +26,185 @@ import net.minecraft.tags.FluidTags;
import net.minecraft.tags.ITag;
import net.minecraft.tags.ItemTags;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.fml.ModList;
import net.minecraftforge.common.Tags;
public class AllTags {
private static final CreateRegistrate REGISTRATE = Create.registrate()
.itemGroup(() -> Create.BASE_CREATIVE_TAB);
.itemGroup(() -> Create.BASE_CREATIVE_TAB);
public static <T> ITag.INamedTag<T> tag(Function<ResourceLocation, ITag.INamedTag<T>> wrapperFactory, String namespace,
String path) {
return wrapperFactory.apply(new ResourceLocation(namespace, path));
}
public static <T> ITag.INamedTag<T> forgeTag(Function<ResourceLocation, ITag.INamedTag<T>> wrapperFactory, String path) {
return tag(wrapperFactory, "forge", path);
}
public static ITag.INamedTag<Block> forgeBlockTag(String path) {
return forgeTag(BlockTags::createOptional, path);
}
public static ITag.INamedTag<Item> forgeItemTag(String path) {
return forgeTag(ItemTags::createOptional, path);
}
public static ITag.INamedTag<Fluid> forgeFluidTag(String path) {
return forgeTag(FluidTags::createOptional, path);
}
public static <T extends Block, P> NonNullFunction<BlockBuilder<T, P>, ItemBuilder<BlockItem, BlockBuilder<T, P>>> tagBlockAndItem(
String tagName) {
return b -> b.tag(forgeBlockTag(tagName))
String path) {
return b -> b.tag(forgeBlockTag(path))
.item()
.tag(forgeItemTag(tagName));
.tag(forgeItemTag(path));
}
public static ITag.INamedTag<Block> forgeBlockTag(String name) {
return forgeTag(BlockTags::bind, name);
}
public enum NameSpace {
public static ITag.INamedTag<Item> forgeItemTag(String name) {
return forgeTag(ItemTags::bind, name);
}
public static ITag.INamedTag<Fluid> forgeFluidTag(String name) {
return forgeTag(FluidTags::bind, name);
}
public static <T> ITag.INamedTag<T> forgeTag(Function<String, ITag.INamedTag<T>> wrapperFactory, String name) {
return tag(wrapperFactory, "forge", name);
}
public static <T> ITag.INamedTag<T> tag(Function<String, ITag.INamedTag<T>> wrapperFactory, String domain,
String name) {
return wrapperFactory.apply(new ResourceLocation(domain, name).toString());
}
public static enum NameSpace {
MOD(Create.ID), FORGE("forge"), MC("minecraft"), TIC("tconstruct")
MOD(Create.ID, false, true),
FORGE("forge"),
TIC("tconstruct")
;
String id;
public final String id;
public final boolean optionalDefault;
public final boolean alwaysDatagenDefault;
private NameSpace(String id) {
NameSpace(String id) {
this(id, true, false);
}
NameSpace(String id, boolean optionalDefault, boolean alwaysDatagenDefault) {
this.id = id;
this.optionalDefault = optionalDefault;
this.alwaysDatagenDefault = alwaysDatagenDefault;
}
}
public static enum AllItemTags {
CRUSHED_ORES(MOD),
SEATS(MOD),
VALVE_HANDLES(MOD),
UPRIGHT_ON_BELT(MOD),
SANDPAPER(MOD),
CREATE_INGOTS(MOD),
BEACON_PAYMENT(FORGE),
INGOTS(FORGE),
NUGGETS(FORGE),
PLATES(FORGE),
COBBLESTONE(FORGE)
public enum AllBlockTags {
BRITTLE,
FAN_HEATERS,
FAN_TRANSPARENT,
SAFE_NBT,
SAILS,
SEATS,
VALVE_HANDLES,
WINDMILL_SAILS,
WINDOWABLE,
WRENCH_PICKUP,
WG_STONE(FORGE),
SLIMY_LOGS(TIC),
;
public ITag.INamedTag<Item> tag;
public final ITag.INamedTag<Block> tag;
private AllItemTags(NameSpace namespace) {
this(namespace, "");
AllBlockTags() {
this(MOD);
}
private AllItemTags(NameSpace namespace, String path) {
tag = ItemTags.bind(
new ResourceLocation(namespace.id, (path.isEmpty() ? "" : path + "/") + Lang.asId(name())).toString());
REGISTRATE.addDataGenerator(ProviderType.ITEM_TAGS, prov -> prov.tag(tag));
AllBlockTags(NameSpace namespace) {
this(namespace, namespace.optionalDefault, namespace.alwaysDatagenDefault);
}
AllBlockTags(NameSpace namespace, String path) {
this(namespace, path, namespace.optionalDefault, namespace.alwaysDatagenDefault);
}
AllBlockTags(NameSpace namespace, boolean optional, boolean alwaysDatagen) {
this(namespace, null, optional, alwaysDatagen);
}
AllBlockTags(NameSpace namespace, String path, boolean optional, boolean alwaysDatagen) {
ResourceLocation id = new ResourceLocation(namespace.id, path == null ? Lang.asId(name()) : path);
if (optional) {
tag = BlockTags.createOptional(id);
} else {
tag = BlockTags.bind(id.toString());
}
if (alwaysDatagen) {
REGISTRATE.addDataGenerator(ProviderType.BLOCK_TAGS, prov -> prov.tag(tag));
}
}
public boolean matches(Block block) {
return tag.contains(block.getBlock());
}
public boolean matches(BlockState state) {
return matches(state.getBlock());
}
public void add(Block... values) {
REGISTRATE.addDataGenerator(ProviderType.BLOCK_TAGS, prov -> prov.tag(tag)
.add(values));
}
public void includeIn(ITag.INamedTag<Block> parent) {
REGISTRATE.addDataGenerator(ProviderType.BLOCK_TAGS, prov -> prov.tag(parent)
.addTag(tag));
}
public void includeIn(AllBlockTags parent) {
includeIn(parent.tag);
}
public void includeAll(ITag.INamedTag<Block> child) {
REGISTRATE.addDataGenerator(ProviderType.BLOCK_TAGS, prov -> prov.tag(tag)
.addTag(child));
}
}
public enum AllItemTags {
CREATE_INGOTS,
CRUSHED_ORES,
SANDPAPER,
SEATS,
UPRIGHT_ON_BELT,
VALVE_HANDLES,
BEACON_PAYMENT(FORGE),
PLATES(FORGE)
;
public final ITag.INamedTag<Item> tag;
AllItemTags() {
this(MOD);
}
AllItemTags(NameSpace namespace) {
this(namespace, namespace.optionalDefault, namespace.alwaysDatagenDefault);
}
AllItemTags(NameSpace namespace, String path) {
this(namespace, path, namespace.optionalDefault, namespace.alwaysDatagenDefault);
}
AllItemTags(NameSpace namespace, boolean optional, boolean alwaysDatagen) {
this(namespace, null, optional, alwaysDatagen);
}
AllItemTags(NameSpace namespace, String path, boolean optional, boolean alwaysDatagen) {
ResourceLocation id = new ResourceLocation(namespace.id, path == null ? Lang.asId(name()) : path);
if (optional) {
tag = ItemTags.createOptional(id);
} else {
tag = ItemTags.bind(id.toString());
}
if (alwaysDatagen) {
REGISTRATE.addDataGenerator(ProviderType.ITEM_TAGS, prov -> prov.tag(tag));
}
}
public boolean matches(ItemStack stack) {
@ -110,101 +216,92 @@ public class AllTags {
.add(values));
}
public void includeIn(AllItemTags parent) {
REGISTRATE.addDataGenerator(ProviderType.ITEM_TAGS, prov -> prov.tag(parent.tag)
public void includeIn(ITag.INamedTag<Item> parent) {
REGISTRATE.addDataGenerator(ProviderType.ITEM_TAGS, prov -> prov.tag(parent)
.addTag(tag));
}
public void includeIn(AllItemTags parent) {
includeIn(parent.tag);
}
public void includeAll(ITag.INamedTag<Item> child) {
REGISTRATE.addDataGenerator(ProviderType.ITEM_TAGS, prov -> prov.tag(tag)
.addTag(child));
}
}
public static enum AllFluidTags {
NO_INFINITE_DRAINING,
public enum AllFluidTags {
NO_INFINITE_DRAINING(MOD, true, false),
HONEY(FORGE)
;
public ITag.INamedTag<Fluid> tag;
public final ITag.INamedTag<Fluid> tag;
private AllFluidTags() {
this(MOD, "");
AllFluidTags() {
this(MOD);
}
private AllFluidTags(NameSpace namespace) {
this(namespace, "");
AllFluidTags(NameSpace namespace) {
this(namespace, namespace.optionalDefault, namespace.alwaysDatagenDefault);
}
private AllFluidTags(NameSpace namespace, String path) {
tag = FluidTags.createOptional(
new ResourceLocation(namespace.id, (path.isEmpty() ? "" : path + "/") + Lang.asId(name())));
AllFluidTags(NameSpace namespace, String path) {
this(namespace, path, namespace.optionalDefault, namespace.alwaysDatagenDefault);
}
AllFluidTags(NameSpace namespace, boolean optional, boolean alwaysDatagen) {
this(namespace, null, optional, alwaysDatagen);
}
AllFluidTags(NameSpace namespace, String path, boolean optional, boolean alwaysDatagen) {
ResourceLocation id = new ResourceLocation(namespace.id, path == null ? Lang.asId(name()) : path);
if (optional) {
tag = FluidTags.createOptional(id);
} else {
tag = FluidTags.bind(id.toString());
}
if (alwaysDatagen) {
REGISTRATE.addDataGenerator(ProviderType.FLUID_TAGS, prov -> prov.tag(tag));
}
}
public boolean matches(Fluid fluid) {
return fluid != null && fluid.is(tag);
}
static void loadClass() {}
}
public static enum AllBlockTags {
WINDMILL_SAILS,
FAN_HEATERS,
WINDOWABLE,
BRITTLE,
SEATS,
SAILS,
VALVE_HANDLES,
FAN_TRANSPARENT,
SAFE_NBT,
SLIMY_LOGS(TIC),
WRENCH_PICKUP,
;
public ITag.INamedTag<Block> tag;
private AllBlockTags() {
this(MOD, "");
public void add(Fluid... values) {
REGISTRATE.addDataGenerator(ProviderType.FLUID_TAGS, prov -> prov.tag(tag)
.add(values));
}
private AllBlockTags(NameSpace namespace) {
this(namespace, "");
}
private AllBlockTags(NameSpace namespace, String path) {
ResourceLocation id =
new ResourceLocation(namespace.id, (path.isEmpty() ? "" : path + "/") + Lang.asId(name()));
if (ModList.get()
.isLoaded(namespace.id)) {
tag = BlockTags.bind(id.toString());
REGISTRATE.addDataGenerator(ProviderType.BLOCK_TAGS, prov -> prov.tag(tag));
} else {
tag = new EmptyNamedTag<>(id);
}
}
public boolean matches(BlockState block) {
return tag.contains(block.getBlock());
}
public void includeIn(AllBlockTags parent) {
REGISTRATE.addDataGenerator(ProviderType.BLOCK_TAGS, prov -> prov.tag(parent.tag)
public void includeIn(ITag.INamedTag<Fluid> parent) {
REGISTRATE.addDataGenerator(ProviderType.FLUID_TAGS, prov -> prov.tag(parent)
.addTag(tag));
}
public void includeAll(ITag.INamedTag<Block> child) {
REGISTRATE.addDataGenerator(ProviderType.BLOCK_TAGS, prov -> prov.tag(tag)
public void includeIn(AllFluidTags parent) {
includeIn(parent.tag);
}
public void includeAll(ITag.INamedTag<Fluid> child) {
REGISTRATE.addDataGenerator(ProviderType.FLUID_TAGS, prov -> prov.tag(tag)
.addTag(child));
}
public void add(Block... values) {
REGISTRATE.addDataGenerator(ProviderType.BLOCK_TAGS, prov -> prov.tag(tag)
.add(values));
}
private static void loadClass() {}
}
public static void register() {
AllFluidTags.loadClass();
AllItemTags.CREATE_INGOTS.includeIn(AllItemTags.BEACON_PAYMENT);
AllItemTags.CREATE_INGOTS.includeIn(AllItemTags.INGOTS);
AllItemTags.CREATE_INGOTS.includeIn(Tags.Items.INGOTS);
AllItemTags.UPRIGHT_ON_BELT.add(Items.GLASS_BOTTLE, Items.POTION, Items.SPLASH_POTION, Items.LINGERING_POTION,
Items.HONEY_BOTTLE, Items.CAKE);
@ -228,7 +325,6 @@ public class AllTags {
AllBlockTags.WRENCH_PICKUP.add(Blocks.REDSTONE_WIRE, Blocks.REDSTONE_TORCH, Blocks.REPEATER, Blocks.LEVER,
Blocks.COMPARATOR, Blocks.OBSERVER, Blocks.REDSTONE_WALL_TORCH, Blocks.PISTON, Blocks.STICKY_PISTON,
Blocks.TRIPWIRE, Blocks.TRIPWIRE_HOOK, Blocks.DAYLIGHT_DETECTOR, Blocks.TARGET);
AllFluidTags.loadClass();
}
}

View file

@ -11,7 +11,7 @@ import com.simibubi.create.api.behaviour.BlockSpoutingBehaviour;
import com.simibubi.create.content.CreateItemGroup;
import com.simibubi.create.content.contraptions.TorquePropagator;
import com.simibubi.create.content.contraptions.components.structureMovement.train.capability.CapabilityMinecartController;
import com.simibubi.create.content.curiosities.weapons.PotatoCannonProjectileTypes;
import com.simibubi.create.content.curiosities.weapons.BuiltinPotatoProjectileTypes;
import com.simibubi.create.content.logistics.RedstoneLinkNetworkHandler;
import com.simibubi.create.content.palettes.AllPaletteBlocks;
import com.simibubi.create.content.palettes.PalettesItemGroup;
@ -121,7 +121,7 @@ public class Create {
CapabilityMinecartController.register();
AllPackets.registerPackets();
SchematicInstances.register();
PotatoCannonProjectileTypes.register();
BuiltinPotatoProjectileTypes.register();
CHUNK_UTIL.init();

View file

@ -79,7 +79,7 @@ import net.minecraftforge.fml.ModList;
@SuppressWarnings("unused")
public class CreateJEI implements IModPlugin {
private static final ResourceLocation ID = new ResourceLocation(Create.ID, "jei_plugin");
private static final ResourceLocation ID = Create.asResource("jei_plugin");
public IIngredientManager ingredientManager;
private final List<CreateRecipeCategory<?>> allCategories = new ArrayList<>();

View file

@ -45,7 +45,7 @@ public abstract class CreateRecipeCategory<T extends IRecipe<?>> implements IRec
}
public void setCategoryId(String name) {
this.uid = new ResourceLocation(Create.ID, name);
this.uid = Create.asResource(name);
this.name = name;
}

View file

@ -9,11 +9,13 @@ 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 com.simibubi.create.foundation.utility.Lang;
import mezz.jei.api.constants.VanillaTypes;
import mezz.jei.api.gui.IRecipeLayout;
import mezz.jei.api.gui.ingredient.IGuiItemStackGroup;
import mezz.jei.api.ingredients.IIngredients;
import net.minecraft.util.text.TextFormatting;
public class DeployingCategory extends CreateRecipeCategory<DeployerApplicationRecipe> {
@ -53,7 +55,18 @@ public class DeployingCategory extends CreateRecipeCategory<DeployerApplicationR
.getItems()));
itemStacks.init(2, false, 131, 50);
itemStacks.set(2, recipe.getResultItem());
if (recipe.shouldKeepHeldItem()) {
itemStacks.addTooltipCallback((slotIndex, input, ingredient, tooltip) -> {
if (!input)
return;
if (slotIndex != 1)
return;
tooltip.add(1, Lang.translate("recipe.deploying.not_consumed")
.withStyle(TextFormatting.GOLD));
});
}
addStochasticTooltip(itemStacks, recipe.getRollableResults(), 2);
}

View file

@ -10,12 +10,16 @@ import com.simibubi.create.compat.jei.category.animations.AnimatedDeployer;
import com.simibubi.create.compat.jei.category.animations.AnimatedPress;
import com.simibubi.create.compat.jei.category.animations.AnimatedSaw;
import com.simibubi.create.compat.jei.category.animations.AnimatedSpout;
import com.simibubi.create.content.contraptions.components.deployer.DeployerApplicationRecipe;
import com.simibubi.create.content.contraptions.itemAssembly.IAssemblyRecipe;
import com.simibubi.create.content.contraptions.itemAssembly.SequencedRecipe;
import com.simibubi.create.foundation.fluid.FluidIngredient;
import com.simibubi.create.foundation.gui.AllGuiTextures;
import com.simibubi.create.foundation.utility.Lang;
import mezz.jei.api.gui.ingredient.IGuiFluidStackGroup;
import mezz.jei.api.gui.ingredient.IGuiItemStackGroup;
import net.minecraft.util.text.TextFormatting;
public abstract class SequencedAssemblySubCategory {
@ -115,6 +119,19 @@ public abstract class SequencedAssemblySubCategory {
.getIngredients()
.get(1)
.getItems()));
IAssemblyRecipe contained = recipe.getAsAssemblyRecipe();
if (contained instanceof DeployerApplicationRecipe && ((DeployerApplicationRecipe) contained).shouldKeepHeldItem()) {
itemStacks.addTooltipCallback((slotIndex, input, ingredient, tooltip) -> {
if (!input)
return;
if (slotIndex != index)
return;
tooltip.add(1, Lang.translate("recipe.deploying.not_consumed")
.withStyle(TextFormatting.GOLD));
});
}
return 1;
}

View file

@ -1,6 +1,5 @@
package com.simibubi.create.content.contraptions.base;
import com.jozufozu.flywheel.backend.instancing.Instancer;
import com.jozufozu.flywheel.backend.material.InstanceMaterial;
import com.jozufozu.flywheel.backend.material.MaterialManager;
import com.simibubi.create.foundation.render.AllMaterialSpecs;

View file

@ -1,8 +1,8 @@
package com.simibubi.create.content.contraptions.base;
import com.jozufozu.flywheel.backend.instancing.tile.TileEntityInstance;
import com.jozufozu.flywheel.backend.material.InstanceMaterial;
import com.jozufozu.flywheel.backend.material.MaterialManager;
import com.jozufozu.flywheel.backend.instancing.tile.TileEntityInstance;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.content.contraptions.relays.elementary.ICogWheel;
import com.simibubi.create.content.contraptions.relays.elementary.ShaftBlock;

View file

@ -45,6 +45,11 @@ public class BeltDeployerCallbacks {
if (deployerTileEntity.redstoneLocked)
return ProcessingResult.PASS;
DeployerFakePlayer player = deployerTileEntity.getPlayer();
ItemStack held = player == null ? ItemStack.EMPTY : player.getMainHandItem();
if (held.isEmpty())
return ProcessingResult.HOLD;
if (deployerTileEntity.getRecipe(s.stack) == null)
return ProcessingResult.PASS;
@ -60,6 +65,12 @@ public class BeltDeployerCallbacks {
BlockState blockState = deployerTileEntity.getBlockState();
if (!blockState.hasProperty(FACING) || blockState.getValue(FACING) != Direction.DOWN)
return ProcessingResult.PASS;
DeployerFakePlayer player = deployerTileEntity.getPlayer();
ItemStack held = player == null ? ItemStack.EMPTY : player.getMainHandItem();
if (held.isEmpty())
return ProcessingResult.HOLD;
IRecipe<?> recipe = deployerTileEntity.getRecipe(s.stack);
if (recipe == null)
return ProcessingResult.PASS;
@ -68,10 +79,10 @@ public class BeltDeployerCallbacks {
activate(s, i, deployerTileEntity, recipe);
return ProcessingResult.HOLD;
}
if (deployerTileEntity.state == State.WAITING) {
if (deployerTileEntity.redstoneLocked)
return ProcessingResult.PASS;
return ProcessingResult.PASS;
deployerTileEntity.start();
}
@ -92,6 +103,10 @@ public class BeltDeployerCallbacks {
copy.angle = centered ? 180 : Create.RANDOM.nextInt(360);
return copy;
})
.map(t -> {
t.locked = false;
return t;
})
.collect(Collectors.toList());
TransportedItemStack left = transported.copy();
@ -104,10 +119,13 @@ public class BeltDeployerCallbacks {
handler.handleProcessingOnItem(transported, TransportedResult.convertToAndLeaveHeld(collect, left));
ItemStack heldItem = deployerTileEntity.player.getMainHandItem();
if (heldItem.isDamageableItem())
heldItem.hurtAndBreak(1, deployerTileEntity.player, s -> s.broadcastBreakEvent(Hand.MAIN_HAND));
else
heldItem.shrink(1);
if (!(recipe instanceof DeployerApplicationRecipe)
|| !((DeployerApplicationRecipe) recipe).shouldKeepHeldItem()) {
if (heldItem.isDamageableItem())
heldItem.hurtAndBreak(1, deployerTileEntity.player, s -> s.broadcastBreakEvent(Hand.MAIN_HAND));
else
heldItem.shrink(1);
}
BlockPos pos = deployerTileEntity.getBlockPos();
World world = deployerTileEntity.getLevel();

View file

@ -5,6 +5,7 @@ import java.util.Set;
import java.util.function.Supplier;
import java.util.stream.Collectors;
import com.google.gson.JsonObject;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.AllRecipeTypes;
import com.simibubi.create.AllTags.AllItemTags;
@ -18,7 +19,9 @@ import com.simibubi.create.foundation.utility.Lang;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.IRecipe;
import net.minecraft.item.crafting.Ingredient;
import net.minecraft.network.PacketBuffer;
import net.minecraft.util.IItemProvider;
import net.minecraft.util.JSONUtils;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.text.ITextComponent;
import net.minecraft.util.text.StringTextComponent;
@ -30,8 +33,11 @@ import net.minecraftforge.items.wrapper.RecipeWrapper;
public class DeployerApplicationRecipe extends ProcessingRecipe<RecipeWrapper> implements IAssemblyRecipe {
private boolean keepHeldItem;
public DeployerApplicationRecipe(ProcessingRecipeParams params) {
super(AllRecipeTypes.DEPLOYING, params);
keepHeldItem = false;
}
@Override
@ -52,6 +58,10 @@ public class DeployerApplicationRecipe extends ProcessingRecipe<RecipeWrapper> i
return 2;
}
public boolean shouldKeepHeldItem() {
return keepHeldItem;
}
public Ingredient getRequiredHeldItem() {
if (ingredients.isEmpty())
throw new IllegalStateException("Deploying Recipe: " + id.toString() + " has no tool!");
@ -66,12 +76,14 @@ public class DeployerApplicationRecipe extends ProcessingRecipe<RecipeWrapper> i
public static List<DeployerApplicationRecipe> convert(List<IRecipe<?>> sandpaperRecipes) {
return sandpaperRecipes.stream()
.map(r -> new ProcessingRecipeBuilder<>(DeployerApplicationRecipe::new, new ResourceLocation(r.getId().getNamespace(), r.getId()
.getPath() + "_using_deployer")).require(r.getIngredients()
.get(0))
.require(AllItemTags.SANDPAPER.tag)
.output(r.getResultItem())
.build())
.map(r -> new ProcessingRecipeBuilder<>(DeployerApplicationRecipe::new, new ResourceLocation(r.getId()
.getNamespace(),
r.getId()
.getPath() + "_using_deployer")).require(r.getIngredients()
.get(0))
.require(AllItemTags.SANDPAPER.tag)
.output(r.getResultItem())
.build())
.collect(Collectors.toList());
}
@ -80,6 +92,31 @@ public class DeployerApplicationRecipe extends ProcessingRecipe<RecipeWrapper> i
list.add(ingredients.get(1));
}
@Override
public void readAdditional(JsonObject json) {
super.readAdditional(json);
keepHeldItem = JSONUtils.getAsBoolean(json, "keepHeldItem", false);
}
@Override
public void writeAdditional(JsonObject json) {
super.writeAdditional(json);
if (keepHeldItem)
json.addProperty("keepHeldItem", keepHeldItem);
}
@Override
public void readAdditional(PacketBuffer buffer) {
super.readAdditional(buffer);
keepHeldItem = buffer.readBoolean();
}
@Override
public void writeAdditional(PacketBuffer buffer) {
super.writeAdditional(buffer);
buffer.writeBoolean(keepHeldItem);
}
@Override
@OnlyIn(Dist.CLIENT)
public ITextComponent getDescriptionForAssembly() {

View file

@ -8,8 +8,8 @@ import java.util.List;
import com.google.common.collect.Lists;
import com.jozufozu.flywheel.backend.instancing.IDynamicInstance;
import com.jozufozu.flywheel.backend.instancing.InstanceData;
import com.jozufozu.flywheel.backend.material.InstanceMaterial;
import com.jozufozu.flywheel.backend.instancing.Instancer;
import com.jozufozu.flywheel.backend.material.InstanceMaterial;
import com.jozufozu.flywheel.backend.material.MaterialManager;
import com.jozufozu.flywheel.core.materials.ModelData;
import com.jozufozu.flywheel.util.transform.MatrixTransformStack;

View file

@ -1,7 +1,7 @@
package com.simibubi.create.content.contraptions.components.flywheel.engine;
import com.jozufozu.flywheel.backend.material.MaterialManager;
import com.jozufozu.flywheel.backend.instancing.tile.TileEntityInstance;
import com.jozufozu.flywheel.backend.material.MaterialManager;
import com.jozufozu.flywheel.core.PartialModel;
import com.jozufozu.flywheel.core.materials.ModelData;
import com.jozufozu.flywheel.util.transform.MatrixTransformStack;

View file

@ -74,7 +74,7 @@ public class BlockMovementChecks {
private static final List<BrittleCheck> BRITTLE_CHECKS = new ArrayList<>();
private static final List<AttachedCheck> ATTACHED_CHECKS = new ArrayList<>();
private static final List<NotSupportiveCheck> NOT_SUPPORTIVE_CHECKS = new ArrayList<>();
public static final ResourceLocation NON_MOVABLE = new ResourceLocation(Create.ID, "non_movable");
public static final ResourceLocation NON_MOVABLE = Create.asResource("non_movable");
// Registration
// Add new checks to the front instead of the end

View file

@ -1,8 +1,8 @@
package com.simibubi.create.content.contraptions.components.structureMovement.chassis;
import com.jozufozu.flywheel.backend.instancing.IDynamicInstance;
import com.jozufozu.flywheel.backend.material.MaterialManager;
import com.jozufozu.flywheel.backend.instancing.tile.TileEntityInstance;
import com.jozufozu.flywheel.backend.material.MaterialManager;
import com.jozufozu.flywheel.core.materials.ModelData;
import com.jozufozu.flywheel.util.transform.MatrixTransformStack;
import com.mojang.blaze3d.matrix.MatrixStack;

View file

@ -4,16 +4,12 @@ import com.jozufozu.flywheel.backend.gl.attrib.VertexFormat;
import com.jozufozu.flywheel.backend.gl.buffer.VecBuffer;
import com.jozufozu.flywheel.backend.instancing.ITickableInstance;
import com.jozufozu.flywheel.backend.instancing.Instancer;
import com.jozufozu.flywheel.backend.material.MaterialManager;
import com.jozufozu.flywheel.backend.instancing.entity.EntityInstance;
import com.jozufozu.flywheel.backend.material.MaterialGroup;
import com.jozufozu.flywheel.backend.model.BufferedModel;
import com.jozufozu.flywheel.backend.model.ElementBuffer;
import com.jozufozu.flywheel.backend.model.IndexedModel;
import com.jozufozu.flywheel.backend.material.MaterialManager;
import com.jozufozu.flywheel.backend.state.TextureRenderState;
import com.jozufozu.flywheel.core.Formats;
import com.jozufozu.flywheel.core.Materials;
import com.jozufozu.flywheel.core.QuadConverter;
import com.jozufozu.flywheel.core.instancing.ConditionalInstance;
import com.jozufozu.flywheel.core.materials.OrientedData;
import com.jozufozu.flywheel.core.model.IModel;
@ -36,7 +32,7 @@ import net.minecraft.world.LightType;
public class GlueInstance extends EntityInstance<SuperGlueEntity> implements ITickableInstance {
private static final boolean USE_ATLAS = false;
private static final ResourceLocation TEXTURE = new ResourceLocation(Create.ID, "textures/entity/super_glue/slime.png");
private static final ResourceLocation TEXTURE = Create.asResource("textures/entity/super_glue/slime.png");
private final Quaternion rotation;
protected ConditionalInstance<OrientedData> model;

View file

@ -30,7 +30,7 @@ import net.minecraftforge.api.distmarker.OnlyIn;
@OnlyIn(Dist.CLIENT)
public class SuperGlueRenderer extends EntityRenderer<SuperGlueEntity> {
private ResourceLocation regular = new ResourceLocation(Create.ID, "textures/entity/super_glue/slime.png");
private ResourceLocation regular = Create.asResource("textures/entity/super_glue/slime.png");
private float[] insideQuad;
private float[] outsideQuad;

View file

@ -7,8 +7,8 @@ import javax.annotation.Nullable;
import org.apache.commons.lang3.tuple.Pair;
import com.jozufozu.flywheel.backend.material.MaterialManager;
import com.jozufozu.flywheel.backend.instancing.tile.TileInstanceManager;
import com.jozufozu.flywheel.backend.material.MaterialManager;
import com.simibubi.create.AllMovementBehaviours;
import com.simibubi.create.content.contraptions.components.structureMovement.MovementBehaviour;
import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext;

View file

@ -18,7 +18,6 @@ import com.simibubi.create.content.contraptions.components.structureMovement.Abs
import com.simibubi.create.content.contraptions.components.structureMovement.Contraption;
import com.simibubi.create.content.contraptions.components.structureMovement.MovementBehaviour;
import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext;
import com.simibubi.create.foundation.render.Compartment;
import com.simibubi.create.foundation.render.SuperByteBuffer;
import com.simibubi.create.foundation.render.TileEntityRenderHelper;
import com.simibubi.create.foundation.utility.worldWrappers.PlacementSimulationWorld;

View file

@ -1,13 +1,7 @@
package com.simibubi.create.content.contraptions.components.structureMovement.render;
import java.util.ArrayList;
import com.jozufozu.flywheel.light.GridAlignedBB;
import com.mojang.blaze3d.matrix.MatrixStack;
import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer;
import com.simibubi.create.foundation.utility.AnimationTickHolder;
import com.simibubi.create.foundation.utility.Pair;
import com.simibubi.create.foundation.utility.outliner.AABBOutline;
public class LightVolumeDebugger {
public static void render(MatrixStack ms, SuperRenderTypeBuffer buffer) {

View file

@ -80,6 +80,7 @@ public class WaterWheelBlock extends DirectionalKineticBlock implements ITE<Wate
@Override
public void onPlace(BlockState state, World worldIn, BlockPos pos, BlockState oldState, boolean isMoving) {
super.onPlace(state, worldIn, pos, oldState, isMoving);
updateAllSides(state, worldIn, pos);
}

View file

@ -148,6 +148,7 @@ public class PumpBlock extends DirectionalKineticBlock implements IWaterLoggable
@Override
public void onPlace(BlockState state, World world, BlockPos pos, BlockState oldState, boolean isMoving) {
super.onPlace(state, world, pos, oldState, isMoving);
if (world.isClientSide)
return;
if (state != oldState)

View file

@ -102,6 +102,7 @@ public class FluidValveBlock extends DirectionalAxisKineticBlock implements IAxi
@Override
public void onPlace(BlockState state, World world, BlockPos pos, BlockState oldState, boolean isMoving) {
super.onPlace(state, world, pos, oldState, isMoving);
if (world.isClientSide)
return;
if (state != oldState)

View file

@ -90,7 +90,9 @@ public class ProcessingRecipeSerializer<T extends ProcessingRecipe<?>> extends F
if (JSONUtils.isValidNode(json, "heatRequirement"))
builder.requiresHeat(HeatCondition.deserialize(JSONUtils.getAsString(json, "heatRequirement")));
return builder.build();
T recipe = builder.build();
recipe.readAdditional(json);
return recipe;
}
protected void writeToBuffer(PacketBuffer buffer, T recipe) {
@ -112,6 +114,8 @@ public class ProcessingRecipeSerializer<T extends ProcessingRecipe<?>> extends F
buffer.writeVarInt(recipe.getProcessingDuration());
buffer.writeVarInt(recipe.getRequiredHeat()
.ordinal());
recipe.writeAdditional(buffer);
}
protected T readFromBuffer(ResourceLocation recipeId, PacketBuffer buffer) {
@ -123,26 +127,28 @@ public class ProcessingRecipeSerializer<T extends ProcessingRecipe<?>> extends F
int size = buffer.readVarInt();
for (int i = 0; i < size; i++)
ingredients.add(Ingredient.fromNetwork(buffer));
size = buffer.readVarInt();
for (int i = 0; i < size; i++)
fluidIngredients.add(FluidIngredient.read(buffer));
size = buffer.readVarInt();
for (int i = 0; i < size; i++)
results.add(ProcessingOutput.read(buffer));
size = buffer.readVarInt();
for (int i = 0; i < size; i++)
fluidResults.add(FluidStack.readFromPacket(buffer));
return new ProcessingRecipeBuilder<>(factory, recipeId).withItemIngredients(ingredients)
T recipe = new ProcessingRecipeBuilder<>(factory, recipeId).withItemIngredients(ingredients)
.withItemOutputs(results)
.withFluidIngredients(fluidIngredients)
.withFluidOutputs(fluidResults)
.duration(buffer.readVarInt())
.requiresHeat(HeatCondition.values()[buffer.readVarInt()])
.build();
recipe.readAdditional(buffer);
return recipe;
}
public final void write(JsonObject json, T recipe) {

View file

@ -101,11 +101,12 @@ public class BeltTileEntity extends KineticTileEntity implements ILightUpdateLis
@Override
public void tick() {
super.tick();
// Init belt
if (beltLength == 0)
BeltBlock.initBelt(level, worldPosition);
super.tick();
if (!AllBlocks.BELT.has(level.getBlockState(worldPosition)))
return;
@ -211,6 +212,7 @@ public class BeltTileEntity extends KineticTileEntity implements ILightUpdateLis
@Override
protected void fromTag(BlockState state, CompoundNBT compound, boolean clientPacket) {
int prevBeltLength = beltLength;
super.fromTag(state, compound, clientPacket);
if (compound.getBoolean("IsController"))
@ -224,14 +226,9 @@ public class BeltTileEntity extends KineticTileEntity implements ILightUpdateLis
controller = NBTUtil.readBlockPos(compound.getCompound("Controller"));
trackerUpdateTag = compound;
index = compound.getInt("Index");
int length = compound.getInt("Length");
if (beltLength != length) {
beltLength = length;
if (level != null)
initializeLight();
else
light = null;
}
beltLength = compound.getInt("Length");
if (prevBeltLength != beltLength)
light = null;
}
if (isController())
@ -523,7 +520,7 @@ public class BeltTileEntity extends KineticTileEntity implements ILightUpdateLis
return getController().equals(((BeltTileEntity) target).getController()) ? 1 : 0;
return 0;
}
public void invalidateItemHandler() {
itemHandler.invalidate();
}
@ -535,12 +532,13 @@ public class BeltTileEntity extends KineticTileEntity implements ILightUpdateLis
BlockState state = getBlockState();
return state != null && state.hasProperty(BeltBlock.PART) && state.getValue(BeltBlock.PART) == BeltPart.START;
}
@Override
public boolean onLightUpdate(IBlockDisplayReader world, LightType type, GridAlignedBB changed) {
if (this.remove) {
if (this.remove)
return true;
}
if (this.level == null || this.light == null)
return false;
GridAlignedBB beltVolume = getBeltVolume();

View file

@ -3,8 +3,8 @@ package com.simibubi.create.content.contraptions.relays.encased;
import java.util.ArrayList;
import com.jozufozu.flywheel.backend.instancing.InstanceData;
import com.jozufozu.flywheel.backend.material.InstanceMaterial;
import com.jozufozu.flywheel.backend.instancing.Instancer;
import com.jozufozu.flywheel.backend.material.InstanceMaterial;
import com.jozufozu.flywheel.backend.material.MaterialManager;
import com.simibubi.create.AllBlockPartials;
import com.simibubi.create.content.contraptions.base.IRotate;

View file

@ -4,8 +4,8 @@ import java.util.EnumMap;
import java.util.Map;
import com.jozufozu.flywheel.backend.instancing.InstanceData;
import com.jozufozu.flywheel.backend.material.InstanceMaterial;
import com.jozufozu.flywheel.backend.instancing.Instancer;
import com.jozufozu.flywheel.backend.material.InstanceMaterial;
import com.jozufozu.flywheel.backend.material.MaterialManager;
import com.simibubi.create.AllBlockPartials;
import com.simibubi.create.content.contraptions.base.KineticTileInstance;

View file

@ -7,9 +7,13 @@ import net.minecraft.entity.LivingEntity;
import net.minecraft.inventory.EquipmentSlotType;
import net.minecraft.item.ArmorItem;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ResourceLocation;
public class CopperArmorItem extends ArmorItem {
public static final ResourceLocation TEXTURE = Create.asResource("textures/models/armor/copper.png");
private static final String TEXTURE_STRING = TEXTURE.toString();
public CopperArmorItem(EquipmentSlotType p_i48534_2_, Properties p_i48534_3_) {
super(AllArmorMaterials.COPPER, p_i48534_2_, p_i48534_3_.stacksTo(1));
}
@ -23,7 +27,7 @@ public class CopperArmorItem extends ArmorItem {
@Override
public String getArmorTexture(ItemStack stack, Entity entity, EquipmentSlotType slot, String type) {
return String.format("%s:textures/models/armor/copper.png", Create.ID);
return TEXTURE_STRING;
}
}

View file

@ -0,0 +1,50 @@
package com.simibubi.create.content.curiosities.symmetry;
import java.util.function.Supplier;
import com.simibubi.create.content.curiosities.symmetry.mirror.SymmetryMirror;
import com.simibubi.create.foundation.networking.SimplePacketBase;
import net.minecraft.entity.player.ServerPlayerEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.network.PacketBuffer;
import net.minecraft.util.Hand;
import net.minecraftforge.fml.network.NetworkEvent.Context;
public class ConfigureSymmetryWandPacket extends SimplePacketBase {
protected Hand hand;
protected SymmetryMirror mirror;
public ConfigureSymmetryWandPacket(Hand hand, SymmetryMirror mirror) {
this.hand = hand;
this.mirror = mirror;
}
public ConfigureSymmetryWandPacket(PacketBuffer buffer) {
hand = buffer.readEnum(Hand.class);
mirror = SymmetryMirror.fromNBT(buffer.readNbt());
}
@Override
public void write(PacketBuffer buffer) {
buffer.writeEnum(hand);
buffer.writeNbt(mirror.writeToNbt());
}
@Override
public void handle(Supplier<Context> context) {
context.get().enqueueWork(() -> {
ServerPlayerEntity player = context.get().getSender();
if (player == null) {
return;
}
ItemStack stack = player.getItemInHand(hand);
if (stack.getItem() instanceof SymmetryWandItem) {
SymmetryWandItem.configureSettings(stack, mirror);
}
});
context.get().setPacketHandled(true);
}
}

View file

@ -181,10 +181,15 @@ public class SymmetryWandItem extends Item {
public static SymmetryMirror getMirror(ItemStack stack) {
checkNBT(stack);
return SymmetryMirror.fromNBT((CompoundNBT) stack.getTag()
return SymmetryMirror.fromNBT(stack.getTag()
.getCompound(SYMMETRY));
}
public static void configureSettings(ItemStack stack, SymmetryMirror mirror) {
checkNBT(stack);
stack.getTag().put(SYMMETRY, mirror.writeToNbt());
}
public static void apply(World world, ItemStack wand, PlayerEntity player, BlockPos pos, BlockState block) {
checkNBT(wand);
if (!isEnabled(wand))

View file

@ -15,17 +15,14 @@ import com.simibubi.create.foundation.gui.widgets.Label;
import com.simibubi.create.foundation.gui.widgets.ScrollInput;
import com.simibubi.create.foundation.gui.widgets.SelectionScrollInput;
import com.simibubi.create.foundation.networking.AllPackets;
import com.simibubi.create.foundation.networking.NbtPacket;
import com.simibubi.create.foundation.utility.Lang;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.CompoundNBT;
import net.minecraft.util.Hand;
import net.minecraft.util.math.vector.Vector3d;
import net.minecraft.util.math.vector.Vector3f;
import net.minecraft.util.text.ITextComponent;
import net.minecraft.util.text.StringTextComponent;
import net.minecraftforge.fml.network.PacketDistributor;
public class SymmetryWandScreen extends AbstractSimiScreen {
@ -45,8 +42,6 @@ public class SymmetryWandScreen extends AbstractSimiScreen {
private Hand hand;
public SymmetryWandScreen(ItemStack wand, Hand hand) {
super();
background = AllGuiTextures.WAND_OF_SYMMETRY;
currentElement = SymmetryWandItem.getMirror(wand);
@ -150,19 +145,14 @@ public class SymmetryWandScreen extends AbstractSimiScreen {
@Override
public void removed() {
ItemStack heldItem = minecraft.player.getItemInHand(hand);
CompoundNBT compound = heldItem.getTag();
compound.put(SymmetryWandItem.SYMMETRY, currentElement.writeToNbt());
heldItem.setTag(compound);
AllPackets.channel.send(PacketDistributor.SERVER.noArg(), new NbtPacket(heldItem, hand));
minecraft.player.setItemInHand(hand, heldItem);
super.removed();
SymmetryWandItem.configureSettings(wand, currentElement);
AllPackets.channel.sendToServer(new ConfigureSymmetryWandPacket(hand, currentElement));
}
@Override
public boolean mouseClicked(double x, double y, int button) {
if (confirmButton.isHovered()) {
minecraft.player.closeContainer();
onClose();
return true;
}

View file

@ -1,8 +1,5 @@
package com.simibubi.create.content.curiosities.weapons;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
import java.util.UUID;
import java.util.function.BiPredicate;
import java.util.function.Predicate;
@ -23,7 +20,6 @@ import net.minecraft.entity.monster.ZombieVillagerEntity;
import net.minecraft.entity.passive.FoxEntity;
import net.minecraft.item.Food;
import net.minecraft.item.Foods;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.potion.Effect;
@ -31,8 +27,6 @@ import net.minecraft.potion.EffectInstance;
import net.minecraft.potion.Effects;
import net.minecraft.util.Direction;
import net.minecraft.util.Hand;
import net.minecraft.util.IItemProvider;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.SoundCategory;
import net.minecraft.util.SoundEvent;
import net.minecraft.util.SoundEvents;
@ -50,16 +44,14 @@ import net.minecraftforge.event.ForgeEventFactory;
import net.minecraftforge.event.entity.living.EntityTeleportEvent;
import net.minecraftforge.registries.IRegistryDelegate;
public class PotatoCannonProjectileTypes {
public class BuiltinPotatoProjectileTypes {
private static final GameProfile ZOMBIE_CONVERTER_NAME =
new GameProfile(UUID.fromString("be12d3dc-27d3-4992-8c97-66be53fd49c5"), "Converter");
private static final WorldAttached<FakePlayer> ZOMBIE_CONVERTERS =
new WorldAttached<>(w -> new FakePlayer((ServerWorld) w, ZOMBIE_CONVERTER_NAME));
public static final Map<ResourceLocation, PotatoCannonProjectileTypes> ALL = new HashMap<>();
public static final Map<IRegistryDelegate<Item>, PotatoCannonProjectileTypes> ITEM_MAP = new HashMap<>();
public static final PotatoCannonProjectileTypes
public static final PotatoCannonProjectileType
FALLBACK = create("fallback").damage(0)
.register(),
@ -250,94 +242,11 @@ public class PotatoCannonProjectileTypes {
.preEntityHit(setFire(12))
.soundPitch(1.0f)
.registerAndAssign(AllItems.BLAZE_CAKE.get())
;
public static void registerType(ResourceLocation resLoc, PotatoCannonProjectileTypes type) {
synchronized (ALL) {
ALL.put(resLoc, type);
}
}
public static void assignType(IRegistryDelegate<Item> item, PotatoCannonProjectileTypes type) {
synchronized (ITEM_MAP) {
ITEM_MAP.put(item, type);
}
}
public static Optional<PotatoCannonProjectileTypes> getProjectileTypeOf(ItemStack item) {
if (item.isEmpty())
return Optional.empty();
return Optional.ofNullable(ITEM_MAP.get(item.getItem().delegate));
}
public static void register() {}
private static PotatoCannonProjectileTypes.Builder create(String name) {
return new PotatoCannonProjectileTypes.Builder(Create.asResource(name));
}
private float gravityMultiplier = 1;
private float velocityMultiplier = 1;
private float drag = 0.99f;
private float knockback = 1;
private int reloadTicks = 10;
private int damage = 1;
private int split = 1;
private float fwoompPitch = 1;
private boolean sticky = false;
private PotatoProjectileRenderMode renderMode = new PotatoProjectileRenderMode.Billboard();
private Predicate<EntityRayTraceResult> preEntityHit = e -> false; // True if hit should be canceled
private Predicate<EntityRayTraceResult> onEntityHit = e -> false; // True if shouldn't recover projectile
private BiPredicate<IWorld, BlockRayTraceResult> onBlockHit = (w, ray) -> false;
public float getGravityMultiplier() {
return gravityMultiplier;
}
public float getDrag() {
return drag;
}
public int getSplit() {
return split;
}
public float getVelocityMultiplier() {
return velocityMultiplier;
}
public float getKnockback() {
return knockback;
}
public int getReloadTicks() {
return reloadTicks;
}
public float getSoundPitch() {
return fwoompPitch;
}
public PotatoProjectileRenderMode getRenderMode() {
return renderMode;
}
public int getDamage() {
return damage;
}
public boolean isSticky() { return sticky; }
public boolean preEntityHit(EntityRayTraceResult ray) {
return preEntityHit.test(ray);
}
public boolean onEntityHit(EntityRayTraceResult ray) {
return onEntityHit.test(ray);
}
public boolean onBlockHit(IWorld world, BlockRayTraceResult ray) {
return onBlockHit.test(world, ray);
private static PotatoCannonProjectileType.Builder create(String name) {
return new PotatoCannonProjectileType.Builder(Create.asResource(name));
}
private static Predicate<EntityRayTraceResult> setFire(int seconds) {
@ -477,103 +386,6 @@ public class PotatoCannonProjectileTypes {
};
}
public static class Builder {
protected ResourceLocation loc;
protected PotatoCannonProjectileTypes result;
public Builder(ResourceLocation loc) {
this.result = new PotatoCannonProjectileTypes();
this.loc = loc;
}
public Builder damage(int damage) {
result.damage = damage;
return this;
}
public Builder gravity(float modifier) {
result.gravityMultiplier = modifier;
return this;
}
public Builder knockback(float knockback) {
result.knockback = knockback;
return this;
}
public Builder drag(float drag) {
result.drag = drag;
return this;
}
public Builder reloadTicks(int reload) {
result.reloadTicks = reload;
return this;
}
public Builder splitInto(int split) {
result.split = split;
return this;
}
public Builder soundPitch(float pitch) {
result.fwoompPitch = pitch;
return this;
}
public Builder velocity(float velocity) {
result.velocityMultiplier = velocity;
return this;
}
public Builder renderTumbling() {
result.renderMode = new PotatoProjectileRenderMode.Tumble();
return this;
}
public Builder renderBillboard() {
result.renderMode = new PotatoProjectileRenderMode.Billboard();
return this;
}
public Builder renderTowardMotion(int spriteAngle, float spin) {
result.renderMode = new PotatoProjectileRenderMode.TowardMotion(spriteAngle, spin);
return this;
}
public Builder sticky() {
result.sticky = true;
return this;
}
public Builder preEntityHit(Predicate<EntityRayTraceResult> callback) {
result.preEntityHit = callback;
return this;
}
public Builder onEntityHit(Predicate<EntityRayTraceResult> callback) {
result.onEntityHit = callback;
return this;
}
public Builder onBlockHit(BiPredicate<IWorld, BlockRayTraceResult> callback) {
result.onBlockHit = callback;
return this;
}
public PotatoCannonProjectileTypes register() {
registerType(loc, result);
return result;
}
public PotatoCannonProjectileTypes registerAndAssign(IItemProvider... items) {
registerType(loc, result);
for (IItemProvider provider : items)
assignType(provider.asItem().delegate, result);
return result;
}
}
public static void register() {}
}

View file

@ -49,13 +49,12 @@ public class PotatoCannonItem extends ShootableItem {
public static ItemStack CLIENT_CURRENT_AMMO = ItemStack.EMPTY;
public static final int MAX_DAMAGE = 100;
public PotatoCannonItem(Properties p_i48487_1_) {
super(p_i48487_1_);
public PotatoCannonItem(Properties properties) {
super(properties);
}
@Override
public boolean canAttackBlock(BlockState p_195938_1_, World p_195938_2_, BlockPos p_195938_3_,
PlayerEntity p_195938_4_) {
public boolean canAttackBlock(BlockState state, World world, BlockPos pos, PlayerEntity player) {
return false;
}
@ -137,8 +136,8 @@ public class PotatoCannonItem extends ShootableItem {
.subtract(player.position()
.add(0, player.getEyeHeight(), 0));
PotatoCannonProjectileTypes projectileType = PotatoCannonProjectileTypes.getProjectileTypeOf(itemStack)
.orElse(PotatoCannonProjectileTypes.FALLBACK);
PotatoCannonProjectileType projectileType = PotatoProjectileTypeManager.getTypeForStack(itemStack)
.orElse(BuiltinPotatoProjectileTypes.FALLBACK);
Vector3d lookVec = player.getLookAngle();
Vector3d motion = lookVec.add(correction)
.normalize()
@ -181,8 +180,8 @@ public class PotatoCannonItem extends ShootableItem {
stack.hurtAndBreak(1, player, p -> p.broadcastBreakEvent(hand));
Integer cooldown =
findAmmoInInventory(world, player, stack).flatMap(PotatoCannonProjectileTypes::getProjectileTypeOf)
.map(PotatoCannonProjectileTypes::getReloadTicks)
findAmmoInInventory(world, player, stack).flatMap(PotatoProjectileTypeManager::getTypeForStack)
.map(PotatoCannonProjectileType::getReloadTicks)
.orElse(10);
ShootableGadgetItemMethods.applyCooldown(player, stack, hand, this::isCannon, cooldown);
@ -200,7 +199,7 @@ public class PotatoCannonItem extends ShootableItem {
private Optional<ItemStack> findAmmoInInventory(World world, PlayerEntity player, ItemStack held) {
ItemStack findAmmo = player.getProjectile(held);
return PotatoCannonProjectileTypes.getProjectileTypeOf(findAmmo)
return PotatoProjectileTypeManager.getTypeForStack(findAmmo)
.map($ -> findAmmo);
}
@ -215,7 +214,7 @@ public class PotatoCannonItem extends ShootableItem {
if (player == null)
return Optional.empty();
ItemStack findAmmo = player.getProjectile(cannon);
Optional<ItemStack> found = PotatoCannonProjectileTypes.getProjectileTypeOf(findAmmo)
Optional<ItemStack> found = PotatoProjectileTypeManager.getTypeForStack(findAmmo)
.map($ -> findAmmo);
found.ifPresent(stack -> CLIENT_CURRENT_AMMO = stack);
return found;
@ -237,7 +236,7 @@ public class PotatoCannonItem extends ShootableItem {
tooltip.add(new StringTextComponent(""));
tooltip.add(new TranslationTextComponent(ammo.getDescriptionId()).append(new StringTextComponent(":"))
.withStyle(TextFormatting.GRAY));
PotatoCannonProjectileTypes type = PotatoCannonProjectileTypes.getProjectileTypeOf(ammo)
PotatoCannonProjectileType type = PotatoProjectileTypeManager.getTypeForStack(ammo)
.get();
StringTextComponent spacing = new StringTextComponent(" ");
TextFormatting green = TextFormatting.GREEN;
@ -269,7 +268,7 @@ public class PotatoCannonItem extends ShootableItem {
@Override
public Predicate<ItemStack> getAllSupportedProjectiles() {
return stack -> PotatoCannonProjectileTypes.getProjectileTypeOf(stack)
return stack -> PotatoProjectileTypeManager.getTypeForStack(stack)
.isPresent();
}

View file

@ -0,0 +1,295 @@
package com.simibubi.create.content.curiosities.weapons;
import java.util.HashSet;
import java.util.Set;
import java.util.function.BiPredicate;
import java.util.function.Consumer;
import java.util.function.Predicate;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonPrimitive;
import net.minecraft.item.Item;
import net.minecraft.network.PacketBuffer;
import net.minecraft.util.IItemProvider;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.ResourceLocationException;
import net.minecraft.util.math.BlockRayTraceResult;
import net.minecraft.util.math.EntityRayTraceResult;
import net.minecraft.world.IWorld;
import net.minecraftforge.registries.ForgeRegistries;
import net.minecraftforge.registries.IRegistryDelegate;
public class PotatoCannonProjectileType {
private Set<IRegistryDelegate<Item>> items = new HashSet<>();
private int reloadTicks = 10;
private int damage = 1;
private int split = 1;
private float knockback = 1;
private float drag = 0.99f;
private float velocityMultiplier = 1;
private float gravityMultiplier = 1;
private float soundPitch = 1;
private boolean sticky = false;
private PotatoProjectileRenderMode renderMode = PotatoProjectileRenderMode.Billboard.INSTANCE;
private Predicate<EntityRayTraceResult> preEntityHit = e -> false; // True if hit should be canceled
private Predicate<EntityRayTraceResult> onEntityHit = e -> false; // True if shouldn't recover projectile
private BiPredicate<IWorld, BlockRayTraceResult> onBlockHit = (w, ray) -> false;
protected PotatoCannonProjectileType() {
}
public Set<IRegistryDelegate<Item>> getItems() {
return items;
}
public int getReloadTicks() {
return reloadTicks;
}
public int getDamage() {
return damage;
}
public int getSplit() {
return split;
}
public float getKnockback() {
return knockback;
}
public float getDrag() {
return drag;
}
public float getVelocityMultiplier() {
return velocityMultiplier;
}
public float getGravityMultiplier() {
return gravityMultiplier;
}
public float getSoundPitch() {
return soundPitch;
}
public boolean isSticky() {
return sticky;
}
public PotatoProjectileRenderMode getRenderMode() {
return renderMode;
}
public boolean preEntityHit(EntityRayTraceResult ray) {
return preEntityHit.test(ray);
}
public boolean onEntityHit(EntityRayTraceResult ray) {
return onEntityHit.test(ray);
}
public boolean onBlockHit(IWorld world, BlockRayTraceResult ray) {
return onBlockHit.test(world, ray);
}
public static PotatoCannonProjectileType fromJson(JsonObject object) {
PotatoCannonProjectileType type = new PotatoCannonProjectileType();
try {
JsonElement itemsElement = object.get("items");
if (itemsElement != null && itemsElement.isJsonArray()) {
for (JsonElement element : itemsElement.getAsJsonArray()) {
if (element.isJsonPrimitive()) {
JsonPrimitive primitive = element.getAsJsonPrimitive();
if (primitive.isString()) {
try {
Item item = ForgeRegistries.ITEMS.getValue(new ResourceLocation(primitive.getAsString()));
if (item != null) {
type.items.add(item.delegate);
}
} catch (ResourceLocationException e) {
//
}
}
}
}
}
parseJsonPrimitive(object, "reload_ticks", JsonPrimitive::isNumber, primitive -> type.reloadTicks = primitive.getAsInt());
parseJsonPrimitive(object, "damage", JsonPrimitive::isNumber, primitive -> type.damage = primitive.getAsInt());
parseJsonPrimitive(object, "split", JsonPrimitive::isNumber, primitive -> type.split = primitive.getAsInt());
parseJsonPrimitive(object, "knockback", JsonPrimitive::isNumber, primitive -> type.knockback = primitive.getAsFloat());
parseJsonPrimitive(object, "drag", JsonPrimitive::isNumber, primitive -> type.drag = primitive.getAsFloat());
parseJsonPrimitive(object, "velocity_multiplier", JsonPrimitive::isNumber, primitive -> type.velocityMultiplier = primitive.getAsFloat());
parseJsonPrimitive(object, "gravity_multiplier", JsonPrimitive::isNumber, primitive -> type.gravityMultiplier = primitive.getAsFloat());
parseJsonPrimitive(object, "sound_pitch", JsonPrimitive::isNumber, primitive -> type.soundPitch = primitive.getAsFloat());
parseJsonPrimitive(object, "sticky", JsonPrimitive::isBoolean, primitive -> type.sticky = primitive.getAsBoolean());
} catch (Exception e) {
//
}
return type;
}
private static void parseJsonPrimitive(JsonObject object, String key, Predicate<JsonPrimitive> predicate, Consumer<JsonPrimitive> consumer) {
JsonElement element = object.get(key);
if (element != null && element.isJsonPrimitive()) {
JsonPrimitive primitive = element.getAsJsonPrimitive();
if (predicate.test(primitive)) {
consumer.accept(primitive);
}
}
}
public static void toBuffer(PotatoCannonProjectileType type, PacketBuffer buffer) {
buffer.writeVarInt(type.items.size());
for (IRegistryDelegate<Item> delegate : type.items) {
buffer.writeResourceLocation(delegate.name());
}
buffer.writeInt(type.reloadTicks);
buffer.writeInt(type.damage);
buffer.writeInt(type.split);
buffer.writeFloat(type.knockback);
buffer.writeFloat(type.drag);
buffer.writeFloat(type.velocityMultiplier);
buffer.writeFloat(type.gravityMultiplier);
buffer.writeFloat(type.soundPitch);
buffer.writeBoolean(type.sticky);
}
public static PotatoCannonProjectileType fromBuffer(PacketBuffer buffer) {
PotatoCannonProjectileType type = new PotatoCannonProjectileType();
int size = buffer.readVarInt();
for (int i = 0; i < size; i++) {
Item item = ForgeRegistries.ITEMS.getValue(buffer.readResourceLocation());
if (item != null) {
type.items.add(item.delegate);
}
}
type.reloadTicks = buffer.readInt();
type.damage = buffer.readInt();
type.split = buffer.readInt();
type.knockback = buffer.readFloat();
type.drag = buffer.readFloat();
type.velocityMultiplier = buffer.readFloat();
type.gravityMultiplier = buffer.readFloat();
type.soundPitch = buffer.readFloat();
type.sticky = buffer.readBoolean();
return type;
}
public static class Builder {
protected ResourceLocation id;
protected PotatoCannonProjectileType result;
public Builder(ResourceLocation id) {
this.id = id;
this.result = new PotatoCannonProjectileType();
}
public Builder reloadTicks(int reload) {
result.reloadTicks = reload;
return this;
}
public Builder damage(int damage) {
result.damage = damage;
return this;
}
public Builder splitInto(int split) {
result.split = split;
return this;
}
public Builder knockback(float knockback) {
result.knockback = knockback;
return this;
}
public Builder drag(float drag) {
result.drag = drag;
return this;
}
public Builder velocity(float velocity) {
result.velocityMultiplier = velocity;
return this;
}
public Builder gravity(float modifier) {
result.gravityMultiplier = modifier;
return this;
}
public Builder soundPitch(float pitch) {
result.soundPitch = pitch;
return this;
}
public Builder sticky() {
result.sticky = true;
return this;
}
public Builder renderMode(PotatoProjectileRenderMode renderMode) {
result.renderMode = renderMode;
return this;
}
public Builder renderBillboard() {
renderMode(PotatoProjectileRenderMode.Billboard.INSTANCE);
return this;
}
public Builder renderTumbling() {
renderMode(PotatoProjectileRenderMode.Tumble.INSTANCE);
return this;
}
public Builder renderTowardMotion(int spriteAngle, float spin) {
renderMode(new PotatoProjectileRenderMode.TowardMotion(spriteAngle, spin));
return this;
}
public Builder preEntityHit(Predicate<EntityRayTraceResult> callback) {
result.preEntityHit = callback;
return this;
}
public Builder onEntityHit(Predicate<EntityRayTraceResult> callback) {
result.onEntityHit = callback;
return this;
}
public Builder onBlockHit(BiPredicate<IWorld, BlockRayTraceResult> callback) {
result.onBlockHit = callback;
return this;
}
public Builder addItems(IItemProvider... items) {
for (IItemProvider provider : items)
result.items.add(provider.asItem().delegate);
return this;
}
public PotatoCannonProjectileType register() {
PotatoProjectileTypeManager.registerBuiltinType(id, result);
return result;
}
public PotatoCannonProjectileType registerAndAssign(IItemProvider... items) {
addItems(items);
register();
return result;
}
}
}

View file

@ -39,17 +39,17 @@ import net.minecraftforge.items.ItemHandlerHelper;
public class PotatoProjectileEntity extends DamagingProjectileEntity implements IEntityAdditionalSpawnData {
PotatoCannonProjectileTypes type;
ItemStack stack = ItemStack.EMPTY;
protected PotatoCannonProjectileType type;
protected ItemStack stack = ItemStack.EMPTY;
Entity stuckEntity;
Vector3d stuckOffset;
PotatoProjectileRenderMode stuckRenderer;
double stuckFallSpeed;
protected Entity stuckEntity;
protected Vector3d stuckOffset;
protected PotatoProjectileRenderMode stuckRenderer;
protected double stuckFallSpeed;
float additionalDamageMult = 1;
float additionalKnockback = 0;
float recoveryChance = 0;
protected float additionalDamageMult = 1;
protected float additionalKnockback = 0;
protected float recoveryChance = 0;
public PotatoProjectileEntity(EntityType<? extends DamagingProjectileEntity> type, World world) {
super(type, world);
@ -63,10 +63,10 @@ public class PotatoProjectileEntity extends DamagingProjectileEntity implements
this.stack = stack;
}
public PotatoCannonProjectileTypes getProjectileType() {
public PotatoCannonProjectileType getProjectileType() {
if (type == null)
type = PotatoCannonProjectileTypes.getProjectileTypeOf(stack)
.orElse(PotatoCannonProjectileTypes.FALLBACK);
type = PotatoProjectileTypeManager.getTypeForStack(stack)
.orElse(BuiltinPotatoProjectileTypes.FALLBACK);
return type;
}
@ -128,7 +128,7 @@ public class PotatoProjectileEntity extends DamagingProjectileEntity implements
}
public void tick() {
PotatoCannonProjectileTypes projectileType = getProjectileType();
PotatoCannonProjectileType projectileType = getProjectileType();
Entity stuckEntity = getStuckEntity();
if (stuckEntity != null) {
@ -174,7 +174,7 @@ public class PotatoProjectileEntity extends DamagingProjectileEntity implements
Vector3d hit = ray.getLocation();
Entity target = ray.getEntity();
PotatoCannonProjectileTypes projectileType = getProjectileType();
PotatoCannonProjectileType projectileType = getProjectileType();
float damage = projectileType.getDamage() * additionalDamageMult;
float knockback = projectileType.getKnockback() + additionalKnockback;
Entity owner = this.getOwner();

View file

@ -20,6 +20,8 @@ public interface PotatoProjectileRenderMode {
public static class Billboard implements PotatoProjectileRenderMode {
public static final Billboard INSTANCE = new Billboard();
@Override
@OnlyIn(Dist.CLIENT)
public void transform(MatrixStack ms, PotatoProjectileEntity entity, float pt) {
@ -35,10 +37,13 @@ public interface PotatoProjectileRenderMode {
.rotateX(180
+ AngleHelper.deg(MathHelper.atan2(diff.y, -MathHelper.sqrt(diff.x * diff.x + diff.z * diff.z))));
}
}
public static class Tumble extends Billboard {
public static final Tumble INSTANCE = new Tumble();
@Override
@OnlyIn(Dist.CLIENT)
public void transform(MatrixStack ms, PotatoProjectileEntity entity, float pt) {
@ -47,6 +52,7 @@ public interface PotatoProjectileRenderMode {
.rotateZ((entity.tickCount + pt) * 2 * entityRandom(entity, 16))
.rotateX((entity.tickCount + pt) * entityRandom(entity, 32));
}
}
public static class TowardMotion implements PotatoProjectileRenderMode {

View file

@ -0,0 +1,160 @@
package com.simibubi.create.content.curiosities.weapons;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
import java.util.function.Supplier;
import com.google.gson.Gson;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.simibubi.create.AllItems;
import com.simibubi.create.foundation.networking.AllPackets;
import com.simibubi.create.foundation.networking.SimplePacketBase;
import net.minecraft.client.resources.JsonReloadListener;
import net.minecraft.entity.player.ServerPlayerEntity;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.network.PacketBuffer;
import net.minecraft.profiler.IProfiler;
import net.minecraft.resources.IResourceManager;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.fml.network.NetworkEvent.Context;
import net.minecraftforge.fml.network.PacketDistributor;
import net.minecraftforge.registries.IRegistryDelegate;
public class PotatoProjectileTypeManager {
private static final Map<ResourceLocation, PotatoCannonProjectileType> BUILTIN_TYPE_MAP = new HashMap<>();
private static final Map<ResourceLocation, PotatoCannonProjectileType> CUSTOM_TYPE_MAP = new HashMap<>();
private static final Map<IRegistryDelegate<Item>, PotatoCannonProjectileType> ITEM_TO_TYPE_MAP = new HashMap<>();
public static void registerBuiltinType(ResourceLocation id, PotatoCannonProjectileType type) {
synchronized (BUILTIN_TYPE_MAP) {
BUILTIN_TYPE_MAP.put(id, type);
}
}
public static PotatoCannonProjectileType getBuiltinType(ResourceLocation id) {
return BUILTIN_TYPE_MAP.get(id);
}
public static PotatoCannonProjectileType getCustomType(ResourceLocation id) {
return CUSTOM_TYPE_MAP.get(id);
}
public static PotatoCannonProjectileType getTypeForItem(IRegistryDelegate<Item> item) {
return ITEM_TO_TYPE_MAP.get(item);
}
public static Optional<PotatoCannonProjectileType> getTypeForStack(ItemStack item) {
if (item.isEmpty())
return Optional.empty();
return Optional.ofNullable(getTypeForItem(item.getItem().delegate));
}
public static void clear() {
CUSTOM_TYPE_MAP.clear();
ITEM_TO_TYPE_MAP.clear();
}
public static void fillItemMap() {
for (Map.Entry<ResourceLocation, PotatoCannonProjectileType> entry : BUILTIN_TYPE_MAP.entrySet()) {
PotatoCannonProjectileType type = entry.getValue();
for (IRegistryDelegate<Item> delegate : type.getItems()) {
ITEM_TO_TYPE_MAP.put(delegate, type);
}
}
for (Map.Entry<ResourceLocation, PotatoCannonProjectileType> entry : CUSTOM_TYPE_MAP.entrySet()) {
PotatoCannonProjectileType type = entry.getValue();
for (IRegistryDelegate<Item> delegate : type.getItems()) {
ITEM_TO_TYPE_MAP.put(delegate, type);
}
}
ITEM_TO_TYPE_MAP.remove(AllItems.POTATO_CANNON.get().delegate);
}
public static void toBuffer(PacketBuffer buffer) {
buffer.writeVarInt(CUSTOM_TYPE_MAP.size());
for (Map.Entry<ResourceLocation, PotatoCannonProjectileType> entry : CUSTOM_TYPE_MAP.entrySet()) {
buffer.writeResourceLocation(entry.getKey());
PotatoCannonProjectileType.toBuffer(entry.getValue(), buffer);
}
}
public static void fromBuffer(PacketBuffer buffer) {
clear();
int size = buffer.readVarInt();
for (int i = 0; i < size; i++) {
CUSTOM_TYPE_MAP.put(buffer.readResourceLocation(), PotatoCannonProjectileType.fromBuffer(buffer));
}
fillItemMap();
}
public static void syncTo(ServerPlayerEntity player) {
AllPackets.channel.send(PacketDistributor.PLAYER.with(() -> player), new SyncPacket());
}
public static void syncToAll() {
AllPackets.channel.send(PacketDistributor.ALL.noArg(), new SyncPacket());
}
public static class ReloadListener extends JsonReloadListener {
private static final Gson GSON = new Gson();
public static final ReloadListener INSTANCE = new ReloadListener();
protected ReloadListener() {
super(GSON, "potato_cannon_projectile_types");
}
@Override
protected void apply(Map<ResourceLocation, JsonElement> map, IResourceManager resourceManager, IProfiler profiler) {
clear();
for (Map.Entry<ResourceLocation, JsonElement> entry : map.entrySet()) {
JsonElement element = entry.getValue();
if (element.isJsonObject()) {
ResourceLocation id = entry.getKey();
JsonObject object = element.getAsJsonObject();
PotatoCannonProjectileType type = PotatoCannonProjectileType.fromJson(object);
CUSTOM_TYPE_MAP.put(id, type);
}
}
fillItemMap();
}
}
public static class SyncPacket extends SimplePacketBase {
private PacketBuffer buffer;
public SyncPacket() {
}
public SyncPacket(PacketBuffer buffer) {
this.buffer = buffer;
}
@Override
public void write(PacketBuffer buffer) {
toBuffer(buffer);
}
@Override
public void handle(Supplier<Context> context) {
context.get().enqueueWork(() -> {
fromBuffer(buffer);
});
context.get().setPacketHandled(true);
}
}
}

View file

@ -1,40 +0,0 @@
package com.simibubi.create.content.curiosities.weapons;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityType;
import net.minecraft.nbt.CompoundNBT;
import net.minecraft.network.IPacket;
import net.minecraft.world.World;
public abstract class ProperProjectileEntity extends Entity {
public ProperProjectileEntity(EntityType<?> p_i48580_1_, World p_i48580_2_) {
super(p_i48580_1_, p_i48580_2_);
// TODO Auto-generated constructor stub
}
@Override
protected void defineSynchedData() {
// TODO Auto-generated method stub
}
@Override
protected void readAdditionalSaveData(CompoundNBT p_70037_1_) {
// TODO Auto-generated method stub
}
@Override
protected void addAdditionalSaveData(CompoundNBT p_213281_1_) {
// TODO Auto-generated method stub
}
@Override
public IPacket<?> getAddEntityPacket() {
// TODO Auto-generated method stub
return null;
}
}

View file

@ -0,0 +1,51 @@
package com.simibubi.create.content.curiosities.zapper;
import java.util.function.Supplier;
import com.simibubi.create.foundation.networking.SimplePacketBase;
import net.minecraft.entity.player.ServerPlayerEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.network.PacketBuffer;
import net.minecraft.util.Hand;
import net.minecraftforge.fml.network.NetworkEvent.Context;
public abstract class ConfigureZapperPacket extends SimplePacketBase {
protected Hand hand;
protected PlacementPatterns pattern;
public ConfigureZapperPacket(Hand hand, PlacementPatterns pattern) {
this.hand = hand;
this.pattern = pattern;
}
public ConfigureZapperPacket(PacketBuffer buffer) {
hand = buffer.readEnum(Hand.class);
pattern = buffer.readEnum(PlacementPatterns.class);
}
@Override
public void write(PacketBuffer buffer) {
buffer.writeEnum(hand);
buffer.writeEnum(pattern);
}
@Override
public void handle(Supplier<Context> context) {
context.get().enqueueWork(() -> {
ServerPlayerEntity player = context.get().getSender();
if (player == null) {
return;
}
ItemStack stack = player.getItemInHand(hand);
if (stack.getItem() instanceof ZapperItem) {
configureZapper(stack);
}
});
context.get().setPacketHandled(true);
}
public abstract void configureZapper(ItemStack stack);
}

View file

@ -21,8 +21,8 @@ public enum PlacementPatterns {
Chance50(AllIcons.I_PATTERN_CHANCE_50),
Chance75(AllIcons.I_PATTERN_CHANCE_75);
public String translationKey;
public AllIcons icon;
public final String translationKey;
public final AllIcons icon;
private PlacementPatterns(AllIcons icon) {
this.translationKey = Lang.asId(name());

View file

@ -10,6 +10,7 @@ import com.simibubi.create.CreateClient;
import com.simibubi.create.foundation.item.ItemDescription;
import com.simibubi.create.foundation.utility.BlockHelper;
import com.simibubi.create.foundation.utility.Lang;
import com.simibubi.create.foundation.utility.NBTHelper;
import com.simibubi.create.foundation.utility.NBTProcessors;
import net.minecraft.block.BlockState;
@ -90,7 +91,7 @@ public abstract class ZapperItem extends Item {
.isShiftKeyDown()) {
if (context.getLevel().isClientSide) {
DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> {
openHandgunGUI(context.getItemInHand(), context.getHand() == Hand.OFF_HAND);
openHandgunGUI(context.getItemInHand(), context.getHand());
});
context.getPlayer()
.getCooldowns()
@ -112,7 +113,7 @@ public abstract class ZapperItem extends Item {
if (player.isShiftKeyDown()) {
if (world.isClientSide) {
DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> {
openHandgunGUI(item, hand == Hand.OFF_HAND);
openHandgunGUI(item, hand);
});
player.getCooldowns()
.addCooldown(item.getItem(), 10);
@ -187,7 +188,7 @@ public abstract class ZapperItem extends Item {
BlockRayTraceResult raytrace, CompoundNBT data);
@OnlyIn(Dist.CLIENT)
protected abstract void openHandgunGUI(ItemStack item, boolean b);
protected abstract void openHandgunGUI(ItemStack item, Hand hand);
protected abstract int getCooldownDelay(ItemStack item);
@ -212,6 +213,11 @@ public abstract class ZapperItem extends Item {
return UseAction.NONE;
}
public static void configureSettings(ItemStack stack, PlacementPatterns pattern) {
CompoundNBT nbt = stack.getOrCreateTag();
NBTHelper.writeEnum(nbt, "Pattern", pattern);
}
public static void setTileData(World world, BlockPos pos, BlockState state, CompoundNBT data, PlayerEntity player) {
if (data != null && AllBlockTags.SAFE_NBT.matches(state)) {
TileEntity tile = world.getBlockEntity(pos);

View file

@ -9,8 +9,8 @@ import com.simibubi.create.foundation.gui.AllIcons;
import com.simibubi.create.foundation.gui.GuiGameElement;
import com.simibubi.create.foundation.gui.widgets.IconButton;
import com.simibubi.create.foundation.networking.AllPackets;
import com.simibubi.create.foundation.networking.NbtPacket;
import com.simibubi.create.foundation.utility.Lang;
import com.simibubi.create.foundation.utility.NBTHelper;
import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
@ -22,29 +22,34 @@ import net.minecraft.util.math.vector.Vector3f;
import net.minecraft.util.text.ITextComponent;
import net.minecraft.util.text.StringTextComponent;
public class ZapperScreen extends AbstractSimiScreen {
protected ItemStack zapper;
protected boolean offhand;
protected float animationProgress;
protected AllGuiTextures background;
private IconButton confirmButton;
public abstract class ZapperScreen extends AbstractSimiScreen {
protected final ITextComponent patternSection = Lang.translate("gui.terrainzapper.patternSection");
protected AllGuiTextures background;
protected ItemStack zapper;
protected Hand hand;
protected float animationProgress;
protected ITextComponent title;
protected Vector<IconButton> patternButtons;
protected Vector<IconButton> patternButtons = new Vector<>(6);
private IconButton confirmButton;
protected int brightColor;
protected int fontColor;
public ZapperScreen(AllGuiTextures background, ItemStack zapper, boolean offhand) {
super();
protected PlacementPatterns currentPattern;
public ZapperScreen(AllGuiTextures background, ItemStack zapper, Hand hand) {
this.background = background;
this.zapper = zapper;
this.offhand = offhand;
this.hand = hand;
title = StringTextComponent.EMPTY;
brightColor = 0xFEFEFE;
fontColor = AllGuiTextures.FONT_COLOR;
CompoundNBT nbt = zapper.getOrCreateTag();
currentPattern = NBTHelper.readEnum(nbt, "Pattern", PlacementPatterns.class);
}
@Override
@ -63,9 +68,7 @@ public class ZapperScreen extends AbstractSimiScreen {
new IconButton(x + background.width - 33, y + background.height - 24, AllIcons.I_CONFIRM);
widgets.add(confirmButton);
CompoundNBT nbt = zapper.getOrCreateTag();
patternButtons = new Vector<>(6);
patternButtons.clear();
for (int row = 0; row <= 1; row++) {
for (int col = 0; col <= 2; col++) {
int id = patternButtons.size();
@ -77,9 +80,7 @@ public class ZapperScreen extends AbstractSimiScreen {
}
}
if (nbt.contains("Pattern"))
patternButtons.get(PlacementPatterns.valueOf(nbt.getString("Pattern"))
.ordinal()).active = false;
patternButtons.get(currentPattern.ordinal()).active = false;
widgets.addAll(patternButtons);
}
@ -108,21 +109,19 @@ public class ZapperScreen extends AbstractSimiScreen {
@Override
public void removed() {
CompoundNBT nbt = zapper.getTag();
writeAdditionalOptions(nbt);
AllPackets.channel.sendToServer(new NbtPacket(zapper, offhand ? Hand.OFF_HAND : Hand.MAIN_HAND));
ConfigureZapperPacket packet = getConfigurationPacket();
packet.configureZapper(zapper);
AllPackets.channel.sendToServer(packet);
}
@Override
public boolean mouseClicked(double x, double y, int button) {
CompoundNBT nbt = zapper.getTag();
for (IconButton patternButton : patternButtons) {
if (patternButton.isHovered()) {
patternButtons.forEach(b -> b.active = true);
patternButton.active = false;
patternButton.playDownSound(minecraft.getSoundManager());
nbt.putString("Pattern", PlacementPatterns.values()[patternButtons.indexOf(patternButton)].name());
currentPattern = PlacementPatterns.values()[patternButtons.indexOf(patternButton)];
}
}
@ -159,6 +158,6 @@ public class ZapperScreen extends AbstractSimiScreen {
ms.popPose();
}
protected void writeAdditionalOptions(CompoundNBT nbt) {}
protected abstract ConfigureZapperPacket getConfigurationPacket();
}

View file

@ -0,0 +1,55 @@
package com.simibubi.create.content.curiosities.zapper.terrainzapper;
import com.simibubi.create.content.curiosities.zapper.ConfigureZapperPacket;
import com.simibubi.create.content.curiosities.zapper.PlacementPatterns;
import net.minecraft.item.ItemStack;
import net.minecraft.network.PacketBuffer;
import net.minecraft.util.Hand;
public class ConfigureWorldshaperPacket extends ConfigureZapperPacket {
protected TerrainBrushes brush;
protected int brushParamX;
protected int brushParamY;
protected int brushParamZ;
protected TerrainTools tool;
protected PlacementOptions placement;
public ConfigureWorldshaperPacket(Hand hand, PlacementPatterns pattern, TerrainBrushes brush, int brushParamX, int brushParamY, int brushParamZ, TerrainTools tool, PlacementOptions placement) {
super(hand, pattern);
this.brush = brush;
this.brushParamX = brushParamX;
this.brushParamY = brushParamY;
this.brushParamZ = brushParamZ;
this.tool = tool;
this.placement = placement;
}
public ConfigureWorldshaperPacket(PacketBuffer buffer) {
super(buffer);
brush = buffer.readEnum(TerrainBrushes.class);
brushParamX = buffer.readVarInt();
brushParamY = buffer.readVarInt();
brushParamZ = buffer.readVarInt();
tool = buffer.readEnum(TerrainTools.class);
placement = buffer.readEnum(PlacementOptions.class);
}
@Override
public void write(PacketBuffer buffer) {
super.write(buffer);
buffer.writeEnum(brush);
buffer.writeVarInt(brushParamX);
buffer.writeVarInt(brushParamY);
buffer.writeVarInt(brushParamZ);
buffer.writeEnum(tool);
buffer.writeEnum(placement);
}
@Override
public void configureZapper(ItemStack stack) {
WorldshaperItem.configureSettings(stack, pattern, brush, brushParamX, brushParamY, brushParamZ, tool, placement);
}
}

View file

@ -14,6 +14,7 @@ import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.CompoundNBT;
import net.minecraft.nbt.NBTUtil;
import net.minecraft.util.Hand;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.BlockRayTraceResult;
import net.minecraft.util.text.ITextComponent;
@ -29,8 +30,8 @@ public class WorldshaperItem extends ZapperItem {
@Override
@OnlyIn(value = Dist.CLIENT)
protected void openHandgunGUI(ItemStack item, boolean b) {
ScreenOpener.open(new WorldshaperScreen(item, b));
protected void openHandgunGUI(ItemStack item, Hand hand) {
ScreenOpener.open(new WorldshaperScreen(item, hand));
}
@Override
@ -82,4 +83,13 @@ public class WorldshaperItem extends ZapperItem {
return true;
}
public static void configureSettings(ItemStack stack, PlacementPatterns pattern, TerrainBrushes brush, int brushParamX, int brushParamY, int brushParamZ, TerrainTools tool, PlacementOptions placement) {
ZapperItem.configureSettings(stack, pattern);
CompoundNBT nbt = stack.getOrCreateTag();
NBTHelper.writeEnum(nbt, "Brush", brush);
nbt.put("BrushParams", NBTUtil.writeBlockPos(new BlockPos(brushParamX, brushParamY, brushParamZ)));
nbt.putString("Tool", tool.name());
nbt.putString("Placement", placement.name());
}
}

View file

@ -4,6 +4,7 @@ import java.util.List;
import java.util.Vector;
import com.mojang.blaze3d.matrix.MatrixStack;
import com.simibubi.create.content.curiosities.zapper.ConfigureZapperPacket;
import com.simibubi.create.content.curiosities.zapper.ZapperScreen;
import com.simibubi.create.foundation.gui.AllGuiTextures;
import com.simibubi.create.foundation.gui.AllIcons;
@ -16,13 +17,14 @@ import com.simibubi.create.foundation.gui.widgets.SelectionScrollInput;
import com.simibubi.create.foundation.utility.Lang;
import com.simibubi.create.foundation.utility.NBTHelper;
import net.minecraft.client.Minecraft;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.CompoundNBT;
import net.minecraft.nbt.NBTUtil;
import net.minecraft.util.Hand;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.text.ITextComponent;
import net.minecraft.util.text.StringTextComponent;
import net.minecraftforge.common.util.Constants;
public class WorldshaperScreen extends ZapperScreen {
@ -36,20 +38,41 @@ public class WorldshaperScreen extends ZapperScreen {
protected ScrollInput brushInput;
protected Label brushLabel;
protected Vector<ScrollInput> brushParams;
protected Vector<Label> brushParamLabels;
protected Vector<ScrollInput> brushParams = new Vector<>(3);
protected Vector<Label> brushParamLabels = new Vector<>(3);
protected IconButton followDiagonals;
protected IconButton acrossMaterials;
protected Indicator followDiagonalsIndicator;
protected Indicator acrossMaterialsIndicator;
private CompoundNBT nbt;
protected TerrainBrushes currentBrush;
protected int[] currentBrushParams = new int[] { 1, 1, 1 };
protected boolean currentFollowDiagonals;
protected boolean currentAcrossMaterials;
protected TerrainTools currentTool;
protected PlacementOptions currentPlacement;
public WorldshaperScreen(ItemStack zapper, boolean offhand) {
super(AllGuiTextures.TERRAINZAPPER, zapper, offhand);
public WorldshaperScreen(ItemStack zapper, Hand hand) {
super(AllGuiTextures.TERRAINZAPPER, zapper, hand);
fontColor = 0x767676;
title = zapper.getHoverName();
nbt = zapper.getOrCreateTag();
CompoundNBT nbt = zapper.getOrCreateTag();
currentBrush = NBTHelper.readEnum(nbt, "Brush", TerrainBrushes.class);
if (nbt.contains("BrushParams", Constants.NBT.TAG_COMPOUND)) {
BlockPos paramsData = NBTUtil.readBlockPos(nbt.getCompound("BrushParams"));
currentBrushParams[0] = paramsData.getX();
currentBrushParams[1] = paramsData.getY();
currentBrushParams[2] = paramsData.getZ();
if (currentBrushParams[1] == 0) {
currentFollowDiagonals = true;
}
if (currentBrushParams[2] == 0) {
currentAcrossMaterials = true;
}
}
currentTool = NBTHelper.readEnum(nbt, "Tool", TerrainTools.class);
currentPlacement = NBTHelper.readEnum(nbt, "Placement", PlacementOptions.class);
}
@Override
@ -63,61 +86,61 @@ public class WorldshaperScreen extends ZapperScreen {
brushInput = new SelectionScrollInput(x + 56, y + 20, 77, 18).forOptions(brushOptions)
.titled(Lang.translate("gui.terrainzapper.brush"))
.writingTo(brushLabel)
.calling(brushIndex -> initBrushParams(x, y));
if (nbt.contains("Brush"))
brushInput.setState(NBTHelper.readEnum(nbt, "Brush", TerrainBrushes.class)
.ordinal());
.calling(brushIndex -> {
currentBrush = TerrainBrushes.values()[brushIndex];
initBrushParams(x, y);
});
brushInput.setState(currentBrush.ordinal());
widgets.add(brushLabel);
widgets.add(brushInput);
initBrushParams(x, y);
}
public void initBrushParams(int x, int y) {
if (brushParams != null) {
nbt.put("BrushParams", NBTUtil.writeBlockPos(new BlockPos(brushParams.get(0)
.getState(),
brushParams.get(1)
.getState(),
brushParams.get(2)
.getState())));
protected void initBrushParams(int x, int y) {
Brush currentBrush = this.currentBrush.get();
widgets.removeAll(brushParamLabels);
widgets.removeAll(brushParams);
}
// Brush Params
widgets.removeAll(brushParamLabels);
widgets.removeAll(brushParams);
brushParamLabels.clear();
brushParams.clear();
brushParamLabels = new Vector<>(3);
brushParams = new Vector<>(3);
BlockPos data = NBTUtil.readBlockPos(nbt.getCompound("BrushParams"));
int[] params = new int[] { data.getX(), data.getY(), data.getZ() };
Brush currentBrush = TerrainBrushes.values()[brushInput.getState()].get();
for (int index = 0; index < 3; index++) {
Label label = new Label(x + 65 + 20 * index, y + 45, StringTextComponent.EMPTY).withShadow();
brushParamLabels.add(label);
int indexFinal = index;
final int finalIndex = index;
ScrollInput input = new ScrollInput(x + 56 + 20 * index, y + 40, 18, 18)
.withRange(currentBrush.getMin(index), currentBrush.getMax(index) + 1)
.writingTo(label)
.titled(currentBrush.getParamLabel(index)
.plainCopy())
.calling(state -> {
label.x = x + 65 + 20 * indexFinal - font.width(label.text) / 2;
currentBrushParams[finalIndex] = state;
label.x = x + 65 + 20 * finalIndex - font.width(label.text) / 2;
});
input.setState(params[index]);
input.setState(currentBrushParams[index]);
input.onChanged();
if (index >= currentBrush.amtParams) {
input.visible = false;
label.visible = false;
input.active = false;
}
brushParamLabels.add(label);
brushParams.add(input);
}
widgets.addAll(brushParamLabels);
widgets.addAll(brushParams);
// Connectivity Options
if (followDiagonals != null) {
widgets.remove(followDiagonals);
widgets.remove(followDiagonalsIndicator);
@ -144,13 +167,13 @@ public class WorldshaperScreen extends ZapperScreen {
widgets.add(followDiagonalsIndicator);
widgets.add(acrossMaterials);
widgets.add(acrossMaterialsIndicator);
if (params[1] == 0)
if (currentFollowDiagonals)
followDiagonalsIndicator.state = State.ON;
if (params[2] == 0)
if (currentAcrossMaterials)
acrossMaterialsIndicator.state = State.ON;
}
// TOOLS
// Tools
if (toolButtons != null)
widgets.removeAll(toolButtons);
@ -164,81 +187,71 @@ public class WorldshaperScreen extends ZapperScreen {
.setToolTip(Lang.translate("gui.terrainzapper.tool." + tool.translationKey));
}
if (!nbt.contains("Tool"))
NBTHelper.writeEnum(nbt, "Tool", toolValues[0]);
int index = -1;
TerrainTools tool = NBTHelper.readEnum(nbt, "Tool", TerrainTools.class);
int toolIndex = -1;
for (int i = 0; i < toolValues.length; i++)
if (tool == toolValues[i])
index = i;
if (index == -1) {
NBTHelper.writeEnum(nbt, "Tool", toolValues[0]);
index = 0;
if (currentTool == toolValues[i])
toolIndex = i;
if (toolIndex == -1) {
currentTool = toolValues[0];
toolIndex = 0;
}
toolButtons.get(toolIndex).active = false;
toolButtons.get(index).active = false;
widgets.addAll(toolButtons);
// Placement Options
if (placementButtons != null)
widgets.removeAll(placementButtons);
if (!currentBrush.hasPlacementOptions())
return;
PlacementOptions[] placementValues = PlacementOptions.values();
placementButtons = new Vector<>(placementValues.length);
for (int id = 0; id < placementValues.length; id++) {
PlacementOptions option = placementValues[id];
placementButtons.add(new IconButton(x + 136 + id * 18, y + 79, option.icon));
placementButtons.get(id)
.setToolTip(Lang.translate("gui.terrainzapper.placement." + option.translationKey));
}
if (currentBrush.hasPlacementOptions()) {
PlacementOptions[] placementValues = PlacementOptions.values();
placementButtons = new Vector<>(placementValues.length);
for (int id = 0; id < placementValues.length; id++) {
PlacementOptions option = placementValues[id];
placementButtons.add(new IconButton(x + 136 + id * 18, y + 79, option.icon));
placementButtons.get(id)
.setToolTip(Lang.translate("gui.terrainzapper.placement." + option.translationKey));
}
if (!nbt.contains("Placement"))
NBTHelper.writeEnum(nbt, "Placement", placementValues[0]);
int optionIndex = NBTHelper.readEnum(nbt, "Placement", PlacementOptions.class)
.ordinal();
if (optionIndex >= placementValues.length) {
NBTHelper.writeEnum(nbt, "Placement", placementValues[0]);
optionIndex = 0;
placementButtons.get(currentPlacement.ordinal()).active = false;
widgets.addAll(placementButtons);
}
placementButtons.get(optionIndex).active = false;
widgets.addAll(placementButtons);
}
@Override
public boolean mouseClicked(double x, double y, int button) {
CompoundNBT nbt = zapper.getTag();
TerrainBrushes brush = TerrainBrushes.values()[brushInput.getState()];
TerrainTools[] supportedTools = brush.get()
TerrainTools[] supportedTools = currentBrush.get()
.getSupportedTools();
for (IconButton toolButton : toolButtons) {
if (toolButton.isHovered()) {
toolButtons.forEach(b -> b.active = true);
toolButton.active = false;
toolButton.playDownSound(minecraft.getSoundManager());
currentTool = supportedTools[toolButtons.indexOf(toolButton)];
}
}
if (placementButtons != null) {
for (IconButton placementButton : placementButtons) {
if (placementButton.isHovered()) {
placementButtons.forEach(b -> b.active = true);
placementButton.active = false;
placementButton.playDownSound(Minecraft.getInstance()
.getSoundManager());
nbt.putString("Placement",
PlacementOptions.values()[placementButtons.indexOf(placementButton)].name());
placementButton.playDownSound(minecraft.getSoundManager());
currentPlacement = PlacementOptions.values()[placementButtons.indexOf(placementButton)];
}
}
}
for (IconButton toolButton : toolButtons) {
if (toolButton.isHovered()) {
toolButtons.forEach(b -> b.active = true);
toolButton.active = false;
toolButton.playDownSound(Minecraft.getInstance()
.getSoundManager());
nbt.putString("Tool", supportedTools[toolButtons.indexOf(toolButton)].name());
}
}
if (followDiagonals != null && followDiagonals.isHovered())
if (followDiagonals != null && followDiagonals.isHovered()) {
followDiagonalsIndicator.state = followDiagonalsIndicator.state == State.OFF ? State.ON : State.OFF;
if (acrossMaterials != null && acrossMaterials.isHovered())
currentFollowDiagonals = !currentFollowDiagonals;
}
if (acrossMaterials != null && acrossMaterials.isHovered()) {
acrossMaterialsIndicator.state = acrossMaterialsIndicator.state == State.OFF ? State.ON : State.OFF;
currentAcrossMaterials = !currentAcrossMaterials;
}
return super.mouseClicked(x, y, button);
}
@ -247,7 +260,7 @@ public class WorldshaperScreen extends ZapperScreen {
protected void drawOnBackground(MatrixStack matrixStack, int x, int y) {
super.drawOnBackground(matrixStack, x, y);
Brush currentBrush = TerrainBrushes.values()[brushInput.getState()].get();
Brush currentBrush = this.currentBrush.get();
for (int index = 2; index >= currentBrush.amtParams; index--)
AllGuiTextures.TERRAINZAPPER_INACTIVE_PARAM.draw(matrixStack, x + 56 + 20 * index, y + 40);
@ -257,20 +270,13 @@ public class WorldshaperScreen extends ZapperScreen {
}
@Override
protected void writeAdditionalOptions(CompoundNBT nbt) {
super.writeAdditionalOptions(nbt);
TerrainBrushes brush = TerrainBrushes.values()[brushInput.getState()];
int param1 = brushParams.get(0)
.getState();
int param2 = followDiagonalsIndicator != null ? followDiagonalsIndicator.state == State.ON ? 0 : 1
: brushParams.get(1)
.getState();
int param3 = acrossMaterialsIndicator != null ? acrossMaterialsIndicator.state == State.ON ? 0 : 1
: brushParams.get(2)
.getState();
NBTHelper.writeEnum(nbt, "Brush", brush);
nbt.put("BrushParams", NBTUtil.writeBlockPos(new BlockPos(param1, param2, param3)));
protected ConfigureZapperPacket getConfigurationPacket() {
int brushParamX = currentBrushParams[0];
int brushParamY = followDiagonalsIndicator != null ? followDiagonalsIndicator.state == State.ON ? 0 : 1
: currentBrushParams[1];
int brushParamZ = acrossMaterialsIndicator != null ? acrossMaterialsIndicator.state == State.ON ? 0 : 1
: currentBrushParams[2];
return new ConfigureWorldshaperPacket(hand, currentPattern, currentBrush, brushParamX, brushParamY, brushParamZ, currentTool, currentPlacement);
}
}

View file

@ -7,7 +7,6 @@ import com.jozufozu.flywheel.core.materials.IFlatLight;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.vector.Vector3f;
import net.minecraft.util.math.vector.Vector3i;
public class FlapData extends InstanceData implements IFlatLight<FlapData> {

View file

@ -8,8 +8,8 @@ import java.util.Map;
import com.jozufozu.flywheel.backend.instancing.IDynamicInstance;
import com.jozufozu.flywheel.backend.instancing.InstanceData;
import com.jozufozu.flywheel.backend.instancing.Instancer;
import com.jozufozu.flywheel.backend.material.MaterialManager;
import com.jozufozu.flywheel.backend.instancing.tile.TileEntityInstance;
import com.jozufozu.flywheel.backend.material.MaterialManager;
import com.simibubi.create.AllBlockPartials;
import com.simibubi.create.content.logistics.block.FlapData;
import com.simibubi.create.foundation.gui.widgets.InterpolatedValue;

View file

@ -5,8 +5,8 @@ import java.util.ArrayList;
import com.jozufozu.flywheel.backend.instancing.IDynamicInstance;
import com.jozufozu.flywheel.backend.instancing.InstanceData;
import com.jozufozu.flywheel.backend.instancing.Instancer;
import com.jozufozu.flywheel.backend.material.MaterialManager;
import com.jozufozu.flywheel.backend.instancing.tile.TileEntityInstance;
import com.jozufozu.flywheel.backend.material.MaterialManager;
import com.jozufozu.flywheel.core.PartialModel;
import com.simibubi.create.AllBlockPartials;
import com.simibubi.create.content.logistics.block.FlapData;

View file

@ -61,7 +61,7 @@ public class AttributeFilterScreen extends AbstractFilterScreen<AttributeFilterC
@Override
protected void init() {
setWindowOffset(-11, 7);
setWindowOffset(-11 + (width % 2 == 0 ? 1 : 0), 7);
super.init();
int x = leftPos;

View file

@ -61,12 +61,12 @@ public interface ItemAttribute {
static ItemAttribute hasColor = register(ColorAttribute.EMPTY);
static ItemAttribute hasFluid = register(FluidContentsAttribute.EMPTY);
static ItemAttribute hasName = register(new ItemNameAttribute("dummy"));
static ItemAttribute bookAuthor = register(new BookAuthorAttribute("dummy"));
static ItemAttribute bookCopy = register(new BookCopyAttribute(-1));
static ItemAttribute astralAmulet = register(new AstralSorceryAmuletAttribute("dummy", -1));
static ItemAttribute astralAttunement = register(new AstralSorceryAttunementAttribute("dummy"));
static ItemAttribute astralCrystal = register(new AstralSorceryCrystalAttribute("dummy"));
static ItemAttribute astralPerkGem = register(new AstralSorceryPerkGemAttribute("dummy"));
static ItemAttribute bookAuthor = register(new BookAuthorAttribute("dummy"));
static ItemAttribute bookCopy = register(new BookCopyAttribute(-1));
static ItemAttribute register(ItemAttribute attributeType) {
types.add(attributeType);
@ -131,12 +131,12 @@ public interface ItemAttribute {
CONSUMABLE(ItemStack::isEdible),
FLUID_CONTAINER(s -> s.getCapability(CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY).isPresent()),
ENCHANTED(ItemStack::isEnchanted),
MAX_ENCHANTED(StandardTraits::maxEnchanted),
RENAMED(ItemStack::hasCustomHoverName),
DAMAGED(ItemStack::isDamaged),
BADLY_DAMAGED(s -> s.isDamaged() && s.getDamageValue() / s.getMaxDamage() > 3 / 4f),
NOT_STACKABLE(((Predicate<ItemStack>) ItemStack::isStackable).negate()),
EQUIPABLE(s -> s.getEquipmentSlot() != null),
MAX_ENCHANTED(StandardTraits::maxEnchanted),
FURNACE_FUEL(AbstractFurnaceTileEntity::isFuel),
WASHABLE(InWorldProcessing::isWashable),
CRUSHABLE((s, w) -> testRecipe(s, w, AllRecipeTypes.CRUSHING.getType())

View file

@ -9,6 +9,7 @@ import static com.simibubi.create.foundation.data.WindowGen.woodenWindowPane;
import com.simibubi.create.AllItems;
import com.simibubi.create.AllSpriteShifts;
import com.simibubi.create.AllTags;
import com.simibubi.create.Create;
import com.simibubi.create.content.AllSections;
import com.simibubi.create.foundation.block.connected.HorizontalCTBehaviour;
@ -96,13 +97,13 @@ public class AllPaletteBlocks {
// Vanilla stone variant patterns
public static final PalettesVariantEntry GRANITE_VARIANTS =
new PalettesVariantEntry(PaletteStoneVariants.GRANITE, PaletteBlockPattern.VANILLA_RANGE, () -> Blocks.GRANITE);
new PalettesVariantEntry(PaletteStoneVariants.GRANITE, PaletteBlockPattern.VANILLA_RANGE);
public static final PalettesVariantEntry DIORITE_VARIANTS =
new PalettesVariantEntry(PaletteStoneVariants.DIORITE, PaletteBlockPattern.VANILLA_RANGE, () -> Blocks.DIORITE);
new PalettesVariantEntry(PaletteStoneVariants.DIORITE, PaletteBlockPattern.VANILLA_RANGE);
public static final PalettesVariantEntry ANDESITE_VARIANTS = new PalettesVariantEntry(PaletteStoneVariants.ANDESITE,
PaletteBlockPattern.VANILLA_RANGE, () -> Blocks.ANDESITE);
PaletteBlockPattern.VANILLA_RANGE);
// Create stone variants
@ -113,65 +114,61 @@ public class AllPaletteBlocks {
.register();
public static final BlockEntry<Block> LIMESTONE =
REGISTRATE.baseBlock("limestone", Block::new, () -> Blocks.SANDSTONE, true)
.tag(BlockTags.BASE_STONE_OVERWORLD)
REGISTRATE.paletteStoneBlock("limestone", () -> Blocks.SANDSTONE, true)
.loot(cobblestoneLoot(PaletteStoneVariants.LIMESTONE))
.register();
public static final PalettesVariantEntry LIMESTONE_VARIANTS =
new PalettesVariantEntry(PaletteStoneVariants.LIMESTONE, PaletteBlockPattern.STANDARD_RANGE, LIMESTONE);
new PalettesVariantEntry(PaletteStoneVariants.LIMESTONE, PaletteBlockPattern.STANDARD_RANGE);
public static final BlockEntry<Block> WEATHERED_LIMESTONE =
REGISTRATE.baseBlock("weathered_limestone", Block::new, () -> Blocks.SANDSTONE, true)
.tag(BlockTags.BASE_STONE_OVERWORLD)
REGISTRATE.paletteStoneBlock("weathered_limestone", () -> Blocks.SANDSTONE, true)
.loot(cobblestoneLoot(PaletteStoneVariants.WEATHERED_LIMESTONE))
.register();
public static final PalettesVariantEntry WEATHERED_LIMESTONE_VARIANTS = new PalettesVariantEntry(
PaletteStoneVariants.WEATHERED_LIMESTONE, PaletteBlockPattern.STANDARD_RANGE, WEATHERED_LIMESTONE);
PaletteStoneVariants.WEATHERED_LIMESTONE, PaletteBlockPattern.STANDARD_RANGE);
public static final BlockEntry<Block> DOLOMITE =
REGISTRATE.baseBlock("dolomite", Block::new, () -> Blocks.QUARTZ_BLOCK, true)
.tag(BlockTags.BASE_STONE_OVERWORLD)
REGISTRATE.paletteStoneBlock("dolomite", () -> Blocks.QUARTZ_BLOCK, true)
.loot(cobblestoneLoot(PaletteStoneVariants.DOLOMITE))
.register();
public static final PalettesVariantEntry DOLOMITE_VARIANTS =
new PalettesVariantEntry(PaletteStoneVariants.DOLOMITE, PaletteBlockPattern.STANDARD_RANGE, DOLOMITE);
new PalettesVariantEntry(PaletteStoneVariants.DOLOMITE, PaletteBlockPattern.STANDARD_RANGE);
public static final BlockEntry<Block> GABBRO =
REGISTRATE.baseBlock("gabbro", Block::new, () -> Blocks.ANDESITE, true)
.tag(BlockTags.BASE_STONE_OVERWORLD)
REGISTRATE.paletteStoneBlock("gabbro", () -> Blocks.ANDESITE, true)
.loot(cobblestoneLoot(PaletteStoneVariants.GABBRO))
.register();
public static final PalettesVariantEntry GABBRO_VARIANTS =
new PalettesVariantEntry(PaletteStoneVariants.GABBRO, PaletteBlockPattern.STANDARD_RANGE, GABBRO);
new PalettesVariantEntry(PaletteStoneVariants.GABBRO, PaletteBlockPattern.STANDARD_RANGE);
public static final BlockEntry<Block> SCORIA =
REGISTRATE.baseBlock("scoria", Block::new, () -> Blocks.ANDESITE, true)
REGISTRATE.paletteStoneBlock("scoria", () -> Blocks.ANDESITE, false)
.loot(cobblestoneLoot(PaletteStoneVariants.SCORIA))
.register();
public static final BlockEntry<Block> NATURAL_SCORIA = REGISTRATE.block("natural_scoria", Block::new)
.initialProperties(() -> Blocks.ANDESITE)
.tag(BlockTags.BASE_STONE_OVERWORLD)
.onRegister(CreateRegistrate.blockVertexColors(new ScoriaVertexColor()))
.tag(BlockTags.BASE_STONE_OVERWORLD, AllTags.AllBlockTags.WG_STONE.tag)
.onRegister(CreateRegistrate.blockVertexColors(ScoriaVertexColor.INSTANCE))
.loot((p, g) -> p.add(g, RegistrateBlockLootTables.droppingWithSilkTouch(g, SCORIA.get())))
.blockstate(palettesCubeAll())
.simpleItem()
.register();
public static final PalettesVariantEntry SCORIA_VARIANTS =
new PalettesVariantEntry(PaletteStoneVariants.SCORIA, PaletteBlockPattern.STANDARD_RANGE, SCORIA);
new PalettesVariantEntry(PaletteStoneVariants.SCORIA, PaletteBlockPattern.STANDARD_RANGE);
public static final BlockEntry<Block> DARK_SCORIA =
REGISTRATE.baseBlock("dark_scoria", Block::new, () -> Blocks.ANDESITE, false)
REGISTRATE.paletteStoneBlock("dark_scoria", () -> Blocks.ANDESITE, false)
.loot(cobblestoneLoot(PaletteStoneVariants.DARK_SCORIA))
.register();
public static final PalettesVariantEntry DARK_SCORIA_VARIANTS =
new PalettesVariantEntry(PaletteStoneVariants.DARK_SCORIA, PaletteBlockPattern.STANDARD_RANGE, DARK_SCORIA);
new PalettesVariantEntry(PaletteStoneVariants.DARK_SCORIA, PaletteBlockPattern.STANDARD_RANGE);
private static <T extends Block> NonNullBiConsumer<RegistrateBlockLootTables, T> cobblestoneLoot(PaletteStoneVariants variant) {
return (loot, block) -> loot.add(block, RegistrateBlockLootTables.droppingWithSilkTouch(block,

View file

@ -30,16 +30,21 @@ import net.minecraft.block.RotatedPillarBlock;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.data.CookingRecipeBuilder;
import net.minecraft.data.ShapedRecipeBuilder;
import net.minecraft.item.Item;
import net.minecraft.tags.ITag;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
import net.minecraftforge.client.model.generators.ModelFile;
import net.minecraftforge.common.Tags;
public class PaletteBlockPattern {
public static final PaletteBlockPattern
COBBLESTONE = create("cobblestone", SUFFIX, ALL_PARTIALS)
.blockTags(Tags.Blocks.COBBLESTONE)
.itemTags(Tags.Items.COBBLESTONE)
.addRecipes(v -> (c, p) -> {
DataIngredient ingredient = DataIngredient.items(c.get());
Block result = v.getBaseBlock().get();
@ -49,6 +54,8 @@ public class PaletteBlockPattern {
}),
POLISHED = create("polished", PREFIX, FOR_POLISHED)
.blockTags(Tags.Blocks.STONE)
.itemTags(Tags.Items.STONE)
.addRecipes(v -> (c, p) -> {
DataIngredient ingredient = DataIngredient.items(v.getBaseBlock().get());
ShapedRecipeBuilder.shaped(c.get(), 4)
@ -111,6 +118,8 @@ public class PaletteBlockPattern {
private String id;
private boolean isTranslucent;
private boolean hasFoliage;
private ITag.INamedTag<Block>[] blockTags;
private ITag.INamedTag<Item>[] itemTags;
private Optional<Function<PaletteStoneVariants, ConnectedTextureBehaviour>> ctBehaviour;
private IPatternBlockStateGenerator blockStateGenerator;
@ -149,6 +158,14 @@ public class PaletteBlockPattern {
return hasFoliage;
}
public ITag.INamedTag<Block>[] getBlockTags() {
return blockTags;
}
public ITag.INamedTag<Item>[] getItemTags() {
return itemTags;
}
public NonNullFunction<Properties, ? extends Block> getBlockFactory() {
return blockFactory;
}
@ -198,6 +215,18 @@ public class PaletteBlockPattern {
return this;
}
@SafeVarargs
private final PaletteBlockPattern blockTags(ITag.INamedTag<Block>... tags) {
blockTags = tags;
return this;
}
@SafeVarargs
private final PaletteBlockPattern itemTags(ITag.INamedTag<Item>... tags) {
itemTags = tags;
return this;
}
private PaletteBlockPattern connectedTextures(Function<PaletteStoneVariants, ConnectedTextureBehaviour> factory) {
this.ctBehaviour = Optional.of(factory);
return this;
@ -300,7 +329,7 @@ public class PaletteBlockPattern {
// Textures with connectability, used by Spriteshifter
public static enum CTs {
public enum CTs {
POLISHED(CTType.OMNIDIRECTIONAL), LAYERED(CTType.HORIZONTAL)

View file

@ -2,6 +2,8 @@ package com.simibubi.create.content.palettes;
import java.util.function.Supplier;
import com.tterrag.registrate.util.nullness.NonNullSupplier;
import net.minecraft.block.Block;
import net.minecraft.block.Blocks;
@ -19,15 +21,15 @@ public enum PaletteStoneVariants {
;
private Supplier<Supplier<Block>> baseBlock;
private NonNullSupplier<NonNullSupplier<Block>> baseBlock;
private Supplier<PalettesVariantEntry> variants;
private PaletteStoneVariants(Supplier<Supplier<Block>> baseBlock, Supplier<PalettesVariantEntry> variants) {
private PaletteStoneVariants(NonNullSupplier<NonNullSupplier<Block>> baseBlock, Supplier<PalettesVariantEntry> variants) {
this.baseBlock = baseBlock;
this.variants = variants;
}
public Supplier<Block> getBaseBlock() {
public NonNullSupplier<Block> getBaseBlock() {
return baseBlock.get();
}

View file

@ -3,32 +3,35 @@ package com.simibubi.create.content.palettes;
import static com.simibubi.create.foundation.data.CreateRegistrate.connectedTextures;
import com.google.common.collect.ImmutableList;
import com.simibubi.create.AllTags;
import com.simibubi.create.Create;
import com.simibubi.create.foundation.data.CreateRegistrate;
import com.simibubi.create.foundation.utility.ColorHandlers;
import com.simibubi.create.foundation.utility.Lang;
import com.tterrag.registrate.builders.BlockBuilder;
import com.tterrag.registrate.builders.ItemBuilder;
import com.tterrag.registrate.util.DataIngredient;
import com.tterrag.registrate.util.entry.BlockEntry;
import com.tterrag.registrate.util.nullness.NonNullSupplier;
import net.minecraft.block.Block;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.item.BlockItem;
import net.minecraft.item.Item;
import net.minecraft.tags.ITag;
public class PalettesVariantEntry {
public ImmutableList<BlockEntry<? extends Block>> registeredBlocks;
public ImmutableList<BlockEntry<? extends Block>> registeredPartials;
public final ImmutableList<BlockEntry<? extends Block>> registeredBlocks;
public final ImmutableList<BlockEntry<? extends Block>> registeredPartials;
public PalettesVariantEntry(PaletteStoneVariants variant, PaletteBlockPattern[] patterns,
NonNullSupplier<? extends Block> initialProperties) {
public PalettesVariantEntry(PaletteStoneVariants variant, PaletteBlockPattern[] patterns) {
String name = Lang.asId(variant.name());
NonNullSupplier<Block> initialProperties = variant.getBaseBlock();
ImmutableList.Builder<BlockEntry<? extends Block>> registeredBlocks = ImmutableList.builder();
ImmutableList.Builder<BlockEntry<? extends Block>> registeredPartials = ImmutableList.builder();
CreateRegistrate registrate = Create.registrate();
for (PaletteBlockPattern pattern : patterns) {
CreateRegistrate registrate = Create.registrate();
BlockBuilder<? extends Block, CreateRegistrate> builder =
registrate.block(pattern.createName(name), pattern.getBlockFactory())
.initialProperties(initialProperties)
@ -36,12 +39,24 @@ public class PalettesVariantEntry {
.apply(pattern)
.apply(name)::accept);
ItemBuilder<BlockItem, ? extends BlockBuilder<? extends Block, CreateRegistrate>> itemBuilder =
builder.item();
ITag.INamedTag<Block>[] blockTags = pattern.getBlockTags();
if (blockTags != null) {
builder.tag(blockTags);
}
ITag.INamedTag<Item>[] itemTags = pattern.getItemTags();
if (itemTags != null) {
itemBuilder.tag(itemTags);
}
if (pattern.isTranslucent())
builder.addLayer(() -> RenderType::translucent);
if (pattern == PaletteBlockPattern.COBBLESTONE)
builder.item().tag(AllTags.AllItemTags.COBBLESTONE.tag);
if (pattern.hasFoliage())
if (pattern.hasFoliage()) {
builder.color(() -> ColorHandlers::getGrassyBlock);
itemBuilder.color(() -> ColorHandlers::getGrassyItem);
}
pattern.createCTBehaviour(variant)
.ifPresent(b -> builder.onRegister(connectedTextures(b)));
@ -51,13 +66,7 @@ public class PalettesVariantEntry {
pattern.addRecipes(variant, c, p);
});
if (pattern.hasFoliage())
builder.item()
.color(() -> ColorHandlers::getGrassyItem)
.build();
else
builder.simpleItem();
itemBuilder.register();
BlockEntry<? extends Block> block = builder.register();
registeredBlocks.add(block);

View file

@ -5,6 +5,8 @@ import com.simibubi.create.foundation.utility.Color;
public class ScoriaVertexColor implements IBlockVertexColor {
public static final ScoriaVertexColor INSTANCE = new ScoriaVertexColor();
@Override
public int getColor(float x, float y, float z) {
float x2 = (float) Math.floor(z + x - y * .5);

View file

@ -1,20 +0,0 @@
package com.simibubi.create.content.palettes;
import net.minecraft.block.BlockState;
import net.minecraft.client.renderer.color.IBlockColor;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.GrassColors;
import net.minecraft.world.IBlockDisplayReader;
import net.minecraft.world.biome.BiomeColors;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
@OnlyIn(Dist.CLIENT)
public class StandardFoliageColorHandler implements IBlockColor {
@Override
public int getColor(BlockState state, IBlockDisplayReader light, BlockPos pos, int layer) {
return pos != null && light != null ? BiomeColors.getAverageGrassColor(light, pos) : GrassColors.get(0.5D, 1.0D);
}
}

View file

@ -17,6 +17,7 @@ import com.simibubi.create.AllBlocks;
import com.simibubi.create.AllItems;
import com.simibubi.create.Create;
import com.simibubi.create.content.schematics.block.SchematicTableTileEntity;
import com.simibubi.create.content.schematics.item.SchematicAndQuillItem;
import com.simibubi.create.content.schematics.item.SchematicItem;
import com.simibubi.create.foundation.config.AllConfigs;
import com.simibubi.create.foundation.config.CSchematics;
@ -319,6 +320,7 @@ public class ServerSchematicLoader {
try (OutputStream outputStream = Files.newOutputStream(path)) {
CompoundNBT nbttagcompound = t.save(new CompoundNBT());
SchematicAndQuillItem.replaceStructureVoidWithAir(nbttagcompound);
CompressedStreamTools.writeCompressed(nbttagcompound, outputStream);
player.setItemInHand(Hand.MAIN_HAND, SchematicItem.create(schematic, player.getGameProfile().getName()));

View file

@ -1,9 +1,9 @@
package com.simibubi.create.content.schematics.block;
import com.jozufozu.flywheel.backend.instancing.IDynamicInstance;
import com.jozufozu.flywheel.backend.instancing.tile.TileEntityInstance;
import com.jozufozu.flywheel.backend.material.InstanceMaterial;
import com.jozufozu.flywheel.backend.material.MaterialManager;
import com.jozufozu.flywheel.backend.instancing.tile.TileEntityInstance;
import com.jozufozu.flywheel.core.materials.ModelData;
import com.jozufozu.flywheel.util.transform.MatrixTransformStack;
import com.mojang.blaze3d.matrix.MatrixStack;

View file

@ -15,6 +15,7 @@ import com.simibubi.create.AllSpecialTextures;
import com.simibubi.create.Create;
import com.simibubi.create.CreateClient;
import com.simibubi.create.content.schematics.ClientSchematicLoader;
import com.simibubi.create.content.schematics.item.SchematicAndQuillItem;
import com.simibubi.create.content.schematics.packet.InstantSchematicPacket;
import com.simibubi.create.foundation.gui.ScreenOpener;
import com.simibubi.create.foundation.networking.AllPackets;
@ -126,7 +127,7 @@ public class SchematicAndQuillHandler {
firstPos = selectedPos;
Lang.sendStatus(player, "schematicAndQuill.firstPos");
}
public void discard() {
ClientPlayerEntity player = Minecraft.getInstance().player;
firstPos = null;
@ -213,7 +214,8 @@ public class SchematicAndQuillHandler {
t.fillFromWorld(Minecraft.getInstance().level, origin, bounds, true, Blocks.AIR);
if (string.isEmpty())
string = Lang.translate("schematicAndQuill.fallbackName").getString();
string = Lang.translate("schematicAndQuill.fallbackName")
.getString();
String folderPath = "schematics";
FilesHelper.createFolderIfMissing(folderPath);
@ -225,6 +227,7 @@ public class SchematicAndQuillHandler {
try {
outputStream = Files.newOutputStream(path, StandardOpenOption.CREATE);
CompoundNBT nbttagcompound = t.save(new CompoundNBT());
SchematicAndQuillItem.replaceStructureVoidWithAir(nbttagcompound);
CompressedStreamTools.writeCompressed(nbttagcompound, outputStream);
} catch (IOException e) {
e.printStackTrace();

View file

@ -1,6 +1,10 @@
package com.simibubi.create.content.schematics.item;
import com.simibubi.create.foundation.utility.NBTHelper;
import net.minecraft.block.Blocks;
import net.minecraft.item.Item;
import net.minecraft.nbt.CompoundNBT;
public class SchematicAndQuillItem extends Item {
@ -8,4 +12,18 @@ public class SchematicAndQuillItem extends Item {
super(properties);
}
public static void replaceStructureVoidWithAir(CompoundNBT nbt) {
String air = Blocks.AIR.getRegistryName()
.toString();
String structureVoid = Blocks.STRUCTURE_VOID.getRegistryName()
.toString();
NBTHelper.iterateCompoundList(nbt.getList("palette", 10), c -> {
if (c.contains("Name") && c.getString("Name")
.equals(structureVoid)) {
c.putString("Name", air);
}
});
}
}

View file

@ -93,8 +93,8 @@ import net.minecraftforge.fml.event.lifecycle.FMLLoadCompleteEvent;
@EventBusSubscriber(value = Dist.CLIENT)
public class ClientEvents {
private static final String itemPrefix = "item." + Create.ID;
private static final String blockPrefix = "block." + Create.ID;
private static final String ITEM_PREFIX = "item." + Create.ID;
private static final String BLOCK_PREFIX = "block." + Create.ID;
@SubscribeEvent
public static void onTick(ClientTickEvent event) {
@ -246,7 +246,7 @@ public class ClientEvents {
String translationKey = stack.getItem()
.getDescriptionId(stack);
if (translationKey.startsWith(itemPrefix) || translationKey.startsWith(blockPrefix))
if (translationKey.startsWith(ITEM_PREFIX) || translationKey.startsWith(BLOCK_PREFIX))
if (TooltipHelper.hasTooltip(stack, event.getPlayer())) {
List<ITextComponent> itemTooltip = event.getToolTip();
List<ITextComponent> toolTip = new ArrayList<>();

View file

@ -9,6 +9,7 @@ import com.simibubi.create.content.contraptions.fluids.recipe.FluidTransferRecip
import com.simibubi.create.content.contraptions.fluids.recipe.PotionMixingRecipeManager;
import com.simibubi.create.content.contraptions.wrench.WrenchItem;
import com.simibubi.create.content.curiosities.toolbox.ToolboxHandler;
import com.simibubi.create.content.curiosities.weapons.PotatoProjectileTypeManager;
import com.simibubi.create.content.curiosities.zapper.ZapperInteractionHandler;
import com.simibubi.create.content.curiosities.zapper.ZapperItem;
import com.simibubi.create.content.logistics.item.LinkedControllerServerHandler;
@ -45,7 +46,6 @@ import net.minecraftforge.event.entity.player.PlayerEvent.PlayerLoggedInEvent;
import net.minecraftforge.event.world.BlockEvent.FluidPlaceBlockEvent;
import net.minecraftforge.event.world.ChunkEvent;
import net.minecraftforge.event.world.WorldEvent;
import net.minecraftforge.eventbus.api.EventPriority;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod.EventBusSubscriber;
import net.minecraftforge.fml.event.server.FMLServerStoppingEvent;
@ -129,7 +129,7 @@ public class CommonEvents {
WrenchItem.wrenchInstaKillsMinecarts(event);
}
@SubscribeEvent(priority = EventPriority.NORMAL)
@SubscribeEvent
public static void registerCommands(RegisterCommandsEvent event) {
AllCommands.register(event.getDispatcher());
}
@ -139,6 +139,7 @@ public class CommonEvents {
event.addListener(RecipeFinder.LISTENER);
event.addListener(PotionMixingRecipeManager.LISTENER);
event.addListener(FluidTransferRecipes.LISTENER);
event.addListener(PotatoProjectileTypeManager.ReloadListener.INSTANCE);
}
@SubscribeEvent

View file

@ -26,10 +26,10 @@ import net.minecraft.util.ResourceLocation;
public abstract class CriterionTriggerBase<T extends CriterionTriggerBase.Instance> implements ICriterionTrigger<T> {
public CriterionTriggerBase(String id) {
this.ID = new ResourceLocation(Create.ID, id);
this.id = Create.asResource(id);
}
private final ResourceLocation ID;
private final ResourceLocation id;
protected final Map<PlayerAdvancements, Set<Listener<T>>> listeners = Maps.newHashMap();
@Override
@ -57,7 +57,7 @@ public abstract class CriterionTriggerBase<T extends CriterionTriggerBase.Instan
@Override
public ResourceLocation getId() {
return ID;
return id;
}
protected void trigger(ServerPlayerEntity player, @Nullable List<Supplier<Object>> suppliers) {

View file

@ -7,7 +7,7 @@ import com.simibubi.create.foundation.render.SuperByteBuffer;
public abstract class CTSpriteShiftEntry extends SpriteShiftEntry {
int textureSheetSize;
protected int textureSheetSize;
public CTSpriteShiftEntry(int sheetSize) {
this.textureSheetSize = sheetSize;

View file

@ -7,33 +7,25 @@ import net.minecraft.util.ResourceLocation;
public class CTSpriteShifter extends SpriteShifter {
public enum CTType {
OMNIDIRECTIONAL, HORIZONTAL, VERTICAL, CROSS;
public static CTSpriteShiftEntry getCT(CTType type, ResourceLocation blockTexture, ResourceLocation connectedTexture) {
String key = type.name() + ":" + blockTexture + "->" + connectedTexture;
if (ENTRY_CACHE.containsKey(key))
return (CTSpriteShiftEntry) ENTRY_CACHE.get(key);
CTSpriteShiftEntry entry = create(type);
entry.set(blockTexture, connectedTexture);
ENTRY_CACHE.put(key, entry);
return entry;
}
public static CTSpriteShiftEntry getCT(CTType type, String blockTextureName, String connectedTextureName) {
return getCT(type, Create.asResource("block/" + blockTextureName), Create.asResource("block/" + connectedTextureName + "_connected"));
}
public static CTSpriteShiftEntry getCT(CTType type, String blockTextureName) {
return getCT(type, blockTextureName, blockTextureName);
}
public static CTSpriteShiftEntry getCT(CTType type, String blockTextureName, String connectedTextureName) {
return getCT(type, new ResourceLocation(Create.ID, "block/" + blockTextureName), connectedTextureName);
}
public static CTSpriteShiftEntry getCT(CTType type, ResourceLocation blockTexture, String connectedTextureName) {
String targetLocation = "block/" + connectedTextureName + "_connected";
String key =
type.name() + ":" + blockTexture.getNamespace() + ":" + blockTexture.getPath() + "->" + targetLocation;
if (textures.containsKey(key))
return (CTSpriteShiftEntry) textures.get(key);
CTSpriteShiftEntry entry = create(type);
ResourceLocation targetTextureLocation = new ResourceLocation(Create.ID, targetLocation);
entry.set(blockTexture, targetTextureLocation);
textures.put(key, entry);
return entry;
}
private static CTSpriteShiftEntry create(CTType type) {
switch (type) {
case HORIZONTAL:
@ -49,4 +41,8 @@ public class CTSpriteShifter extends SpriteShifter {
}
}
public enum CTType {
OMNIDIRECTIONAL, HORIZONTAL, VERTICAL, CROSS;
}
}

View file

@ -11,26 +11,29 @@ import net.minecraft.util.ResourceLocation;
public class SpriteShifter {
protected static Map<String, SpriteShiftEntry> textures = new HashMap<>();
protected static final Map<String, SpriteShiftEntry> ENTRY_CACHE = new HashMap<>();
public static SpriteShiftEntry get(String originalLocation, String targetLocation) {
public static SpriteShiftEntry get(ResourceLocation originalLocation, ResourceLocation targetLocation) {
String key = originalLocation + "->" + targetLocation;
if (textures.containsKey(key))
return textures.get(key);
if (ENTRY_CACHE.containsKey(key))
return ENTRY_CACHE.get(key);
SpriteShiftEntry entry = new SpriteShiftEntry();
entry.originalTextureLocation = new ResourceLocation(Create.ID, originalLocation);
entry.targetTextureLocation = new ResourceLocation(Create.ID, targetLocation);
textures.put(key, entry);
entry.set(originalLocation, targetLocation);
ENTRY_CACHE.put(key, entry);
return entry;
}
public static SpriteShiftEntry get(String originalLocation, String targetLocation) {
return get(Create.asResource(originalLocation), Create.asResource(targetLocation));
}
public static void reloadUVs() {
textures.values().forEach(SpriteShiftEntry::loadTextures);
ENTRY_CACHE.values().forEach(SpriteShiftEntry::loadTextures);
}
public static List<ResourceLocation> getAllTargetSprites() {
return textures.values().stream().map(SpriteShiftEntry::getTargetResourceLocation).collect(Collectors.toList());
return ENTRY_CACHE.values().stream().map(SpriteShiftEntry::getTargetResourceLocation).collect(Collectors.toList());
}
}

View file

@ -22,8 +22,8 @@ import com.simibubi.create.content.logistics.block.belts.tunnel.BeltTunnelBlock;
import com.simibubi.create.content.logistics.block.belts.tunnel.BeltTunnelBlock.Shape;
import com.simibubi.create.content.logistics.block.belts.tunnel.BeltTunnelItem;
import com.simibubi.create.content.logistics.block.inventories.CrateBlock;
import com.simibubi.create.foundation.block.ItemUseOverrides;
import com.simibubi.create.foundation.block.BlockStressDefaults;
import com.simibubi.create.foundation.block.ItemUseOverrides;
import com.simibubi.create.foundation.block.connected.CTSpriteShiftEntry;
import com.tterrag.registrate.builders.BlockBuilder;
import com.tterrag.registrate.util.nullness.NonNullUnaryOperator;

View file

@ -9,6 +9,7 @@ import java.util.function.BiFunction;
import java.util.function.Supplier;
import java.util.stream.Collectors;
import com.simibubi.create.AllTags;
import com.simibubi.create.Create;
import com.simibubi.create.CreateClient;
import com.simibubi.create.content.AllSections;
@ -40,10 +41,12 @@ import net.minecraft.entity.EntityClassification;
import net.minecraft.entity.EntityType;
import net.minecraft.fluid.Fluid;
import net.minecraft.item.Item;
import net.minecraft.tags.BlockTags;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.tileentity.TileEntityType;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
import net.minecraftforge.common.Tags;
import net.minecraftforge.fluids.FluidAttributes;
import net.minecraftforge.fluids.ForgeFlowingFluid;
import net.minecraftforge.fml.DistExecutor;
@ -138,17 +141,27 @@ public class CreateRegistrate extends AbstractRegistrate<CreateRegistrate> {
/* Palettes */
public <T extends Block> BlockBuilder<T, CreateRegistrate> baseBlock(String name,
NonNullFunction<Properties, T> factory, NonNullSupplier<Block> propertiesFrom, boolean TFworldGen) {
return super.block(name, factory).initialProperties(propertiesFrom)
public <T extends Block> BlockBuilder<T, CreateRegistrate> paletteStoneBlock(String name,
NonNullFunction<Properties, T> factory, NonNullSupplier<Block> propertiesFrom, boolean worldGenStone) {
BlockBuilder<T, CreateRegistrate> builder = super.block(name, factory).initialProperties(propertiesFrom)
.blockstate((c, p) -> {
final String location = "block/palettes/" + c.getName() + "/plain";
p.simpleBlock(c.get(), p.models()
.cubeAll(c.getName(), p.modLoc(location)));
// TODO tag with forge:stone; if TFWorldGen == true tag with forge:wg_stone
// aswell
})
.simpleItem();
.tag(Tags.Blocks.STONE)
.item()
.tag(Tags.Items.STONE)
.build();
if (worldGenStone) {
builder.tag(BlockTags.BASE_STONE_OVERWORLD, AllTags.AllBlockTags.WG_STONE.tag);
}
return builder;
}
public BlockBuilder<Block, CreateRegistrate> paletteStoneBlock(String name,
NonNullSupplier<Block> propertiesFrom, boolean worldGenStone) {
return paletteStoneBlock(name, Block::new, propertiesFrom, worldGenStone);
}
/* Fluids */

View file

@ -21,7 +21,7 @@ public class ModelGen {
public static ModelFile createOvergrown(DataGenContext<Block, ? extends Block> ctx, BlockStateProvider prov,
ResourceLocation side, ResourceLocation top, ResourceLocation bottom, ResourceLocation overlay) {
return prov.models()
.withExistingParent(ctx.getName(), new ResourceLocation(Create.ID, "block/overgrown"))
.withExistingParent(ctx.getName(), Create.asResource("block/overgrown"))
.texture("particle", side)
.texture("side", side)
.texture("top", top)

View file

@ -213,7 +213,7 @@ public class WindowGen {
.loot((t, g) -> t.dropWhenSilkTouch(g))
.item()
.tag(Tags.Items.GLASS_PANES)
.model((c, p) -> p.withExistingParent(c.getName(), new ResourceLocation(Create.ID, "item/pane"))
.model((c, p) -> p.withExistingParent(c.getName(), Create.asResource("item/pane"))
.texture("pane", sideTexture)
.texture("edge", topTexture))
.build()

View file

@ -21,7 +21,6 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.AllItems;
import com.simibubi.create.content.contraptions.base.IRotate;
import com.simibubi.create.content.contraptions.base.IRotate.SpeedLevel;

View file

@ -0,0 +1,25 @@
package com.simibubi.create.foundation.mixin;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import com.simibubi.create.content.curiosities.weapons.PotatoProjectileTypeManager;
import net.minecraft.entity.player.ServerPlayerEntity;
import net.minecraft.network.NetworkManager;
import net.minecraft.server.management.PlayerList;
@Mixin(PlayerList.class)
public class PlayerListMixin {
@Inject(at = @At(value = "INVOKE", target = "Lnet/minecraft/item/crafting/ServerRecipeBook;sendInitialRecipeBook(Lnet/minecraft/entity/player/ServerPlayerEntity;)V", shift = At.Shift.AFTER), method = "placeNewPlayer(Lnet/minecraft/network/NetworkManager;Lnet/minecraft/entity/player/ServerPlayerEntity;)V")
private void afterSendRecipeBookOnPlaceNewPlayer(NetworkManager networkManager, ServerPlayerEntity player, CallbackInfo ci) {
PotatoProjectileTypeManager.syncTo(player);
}
@Inject(at = @At("TAIL"), method = "reloadResources()V")
private void onReloadResources(CallbackInfo ci) {
PotatoProjectileTypeManager.syncToAll();
}
}

View file

@ -22,13 +22,16 @@ import com.simibubi.create.content.contraptions.components.structureMovement.tra
import com.simibubi.create.content.contraptions.fluids.actors.FluidSplashPacket;
import com.simibubi.create.content.contraptions.relays.advanced.sequencer.ConfigureSequencedGearshiftPacket;
import com.simibubi.create.content.curiosities.bell.SoulPulseEffectPacket;
import com.simibubi.create.content.curiosities.symmetry.ConfigureSymmetryWandPacket;
import com.simibubi.create.content.curiosities.symmetry.SymmetryEffectPacket;
import com.simibubi.create.content.curiosities.toolbox.ToolboxDisposeAllPacket;
import com.simibubi.create.content.curiosities.toolbox.ToolboxEquipPacket;
import com.simibubi.create.content.curiosities.tools.BlueprintAssignCompleteRecipePacket;
import com.simibubi.create.content.curiosities.tools.ExtendoGripInteractionPacket;
import com.simibubi.create.content.curiosities.weapons.PotatoCannonPacket;
import com.simibubi.create.content.curiosities.weapons.PotatoProjectileTypeManager;
import com.simibubi.create.content.curiosities.zapper.ZapperBeamPacket;
import com.simibubi.create.content.curiosities.zapper.terrainzapper.ConfigureWorldshaperPacket;
import com.simibubi.create.content.logistics.block.depot.EjectorElytraPacket;
import com.simibubi.create.content.logistics.block.depot.EjectorPlacementPacket;
import com.simibubi.create.content.logistics.block.depot.EjectorTriggerPacket;
@ -69,7 +72,6 @@ import net.minecraftforge.fml.network.simple.SimpleChannel;
public enum AllPackets {
// Client to Server
NBT(NbtPacket.class, NbtPacket::new, PLAY_TO_SERVER),
CONFIGURE_SCHEMATICANNON(ConfigureSchematicannonPacket.class, ConfigureSchematicannonPacket::new, PLAY_TO_SERVER),
CONFIGURE_FLEXCRATE(ConfigureFlexcratePacket.class, ConfigureFlexcratePacket::new, PLAY_TO_SERVER),
CONFIGURE_STOCKSWITCH(ConfigureStockswitchPacket.class, ConfigureStockswitchPacket::new, PLAY_TO_SERVER),
@ -98,6 +100,8 @@ public enum AllPackets {
C_CONFIGURE_CONFIG(CConfigureConfigPacket.class, CConfigureConfigPacket::new, PLAY_TO_SERVER),
SUBMIT_GHOST_ITEM(GhostItemSubmitPacket.class, GhostItemSubmitPacket::new, PLAY_TO_SERVER),
BLUEPRINT_COMPLETE_RECIPE(BlueprintAssignCompleteRecipePacket.class, BlueprintAssignCompleteRecipePacket::new, PLAY_TO_SERVER),
CONFIGURE_SYMMETRY_WAND(ConfigureSymmetryWandPacket.class, ConfigureSymmetryWandPacket::new, PLAY_TO_SERVER),
CONFIGURE_WORLDSHAPER(ConfigureWorldshaperPacket.class, ConfigureWorldshaperPacket::new, PLAY_TO_SERVER),
TOOLBOX_EQUIP(ToolboxEquipPacket.class, ToolboxEquipPacket::new, PLAY_TO_SERVER),
TOOLBOX_DISPOSE_ALL(ToolboxDisposeAllPacket.class, ToolboxDisposeAllPacket::new, PLAY_TO_SERVER),
@ -121,11 +125,12 @@ public enum AllPackets {
POTATO_CANNON(PotatoCannonPacket.class, PotatoCannonPacket::new, PLAY_TO_CLIENT),
SOUL_PULSE(SoulPulseEffectPacket.class, SoulPulseEffectPacket::new, PLAY_TO_CLIENT),
PERSISTENT_DATA(ISyncPersistentData.Packet.class, ISyncPersistentData.Packet::new, PLAY_TO_CLIENT),
SYNC_POTATO_PROJECTILE_TYPES(PotatoProjectileTypeManager.SyncPacket.class, PotatoProjectileTypeManager.SyncPacket::new, PLAY_TO_CLIENT),
;
public static final ResourceLocation CHANNEL_NAME = new ResourceLocation(Create.ID, "network");
public static final String NETWORK_VERSION = new ResourceLocation(Create.ID, "1").toString();
public static final ResourceLocation CHANNEL_NAME = Create.asResource("network");
public static final String NETWORK_VERSION = Create.asResource("1").toString();
public static SimpleChannel channel;
private LoadedPacket<?> packet;

View file

@ -1,73 +0,0 @@
package com.simibubi.create.foundation.networking;
import java.util.function.Supplier;
import com.simibubi.create.content.curiosities.symmetry.SymmetryWandItem;
import com.simibubi.create.content.curiosities.zapper.ZapperItem;
import net.minecraft.entity.player.ServerPlayerEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.network.PacketBuffer;
import net.minecraft.util.Hand;
import net.minecraftforge.fml.network.NetworkEvent.Context;
@Deprecated
public class NbtPacket extends SimplePacketBase {
public ItemStack stack;
public int slot;
public Hand hand;
public NbtPacket(ItemStack stack, Hand hand) {
this(stack, -1);
this.hand = hand;
}
public NbtPacket(ItemStack stack, int slot) {
this.stack = stack;
this.slot = slot;
this.hand = Hand.MAIN_HAND;
}
public NbtPacket(PacketBuffer buffer) {
stack = buffer.readItem();
slot = buffer.readInt();
hand = Hand.values()[buffer.readInt()];
}
public void write(PacketBuffer buffer) {
buffer.writeItem(stack);
buffer.writeInt(slot);
buffer.writeInt(hand.ordinal());
}
public void handle(Supplier<Context> context) {
context.get()
.enqueueWork(() -> {
ServerPlayerEntity player = context.get()
.getSender();
if (player == null)
return;
if (!(stack.getItem() instanceof SymmetryWandItem || stack.getItem() instanceof ZapperItem)) {
return;
}
stack.removeTagKey("AttributeModifiers");
if (slot == -1) {
ItemStack heldItem = player.getItemInHand(hand);
if (heldItem.getItem() == stack.getItem()) {
heldItem.setTag(stack.getTag());
}
return;
}
ItemStack heldInSlot = player.inventory.getItem(slot);
if (heldInSlot.getItem() == stack.getItem()) {
heldInSlot.setTag(stack.getTag());
}
});
context.get()
.setPacketHandled(true);
}
}

View file

@ -34,6 +34,10 @@ public class PonderLocalization {
TAG.put(key, Couple.create(enUS, description));
}
public static void registerChapter(ResourceLocation key, String enUS) {
CHAPTER.put(key, enUS);
}
public static void registerSpecific(ResourceLocation sceneId, String key, String enUS) {
SPECIFIC.computeIfAbsent(sceneId, $ -> new HashMap<>())
.put(key, enUS);

View file

@ -13,6 +13,8 @@ import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Supplier;
import javax.annotation.Nullable;
import org.apache.commons.lang3.mutable.MutableDouble;
import org.apache.commons.lang3.mutable.MutableObject;
@ -52,8 +54,6 @@ import net.minecraft.util.math.vector.Vector3d;
import net.minecraft.util.math.vector.Vector3i;
import net.minecraft.util.math.vector.Vector4f;
import javax.annotation.Nullable;
public class PonderScene {
public static final String TITLE_KEY = "header";

View file

@ -32,9 +32,9 @@ public class AllMaterialSpecs {
}
public static class Locations {
public static final ResourceLocation ROTATING = new ResourceLocation(Create.ID, "rotating");
public static final ResourceLocation BELTS = new ResourceLocation(Create.ID, "belts");
public static final ResourceLocation ACTORS = new ResourceLocation(Create.ID, "actors");
public static final ResourceLocation FLAPS = new ResourceLocation(Create.ID, "flaps");
public static final ResourceLocation ROTATING = Create.asResource("rotating");
public static final ResourceLocation BELTS = Create.asResource("belts");
public static final ResourceLocation ACTORS = Create.asResource("actors");
public static final ResourceLocation FLAPS = Create.asResource("flaps");
}
}

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