Choo Choo, Part I

- Added Steam Whistles
This commit is contained in:
simibubi 2022-05-07 02:21:23 +02:00
parent 0745e44518
commit 76c57e4695
70 changed files with 2626 additions and 74 deletions

View file

@ -478,6 +478,8 @@ e815bfd854c2653f10828bb11950f7fb991d7efc assets/create/blockstates/speedometer.j
d62b7908119fa4f51715a186d0882b388bb25cab assets/create/blockstates/spruce_window.json
8d7dfa60630a8b4bae4e8eca5c66e1cfa34dda1f assets/create/blockstates/spruce_window_pane.json
0378b27d9ad698b37d72cd958e15112f9ca418d3 assets/create/blockstates/steam_engine.json
9419d87b17175a5177854a2a508a0ffe0b43b018 assets/create/blockstates/steam_whistle.json
442d959d019088d9dbe04c530f5fcabbbb65819f assets/create/blockstates/steam_whistle_extension.json
5d7385d28a23dcfc95a221d36d82337908582726 assets/create/blockstates/sticker.json
3d93eabbb327aecc526beae9c62283f1d43eb710 assets/create/blockstates/sticky_mechanical_piston.json
f385988cb6fa9c48b5d59a6942ec50ed2b60c8bf assets/create/blockstates/stockpile_switch.json
@ -541,23 +543,23 @@ bf2b0310500213ff853c748c236eb5d01f61658e assets/create/blockstates/yellow_toolbo
6801fa1f466f172700e573e5b8ee8ee5f9ca4583 assets/create/blockstates/yellow_valve_handle.json
7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json
b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json
d4cdc38cd19460fd9ba866f3ad3b2e4bd014cb98 assets/create/lang/en_ud.json
4111057d7de305bffb7133afbaea0aea45f7ce79 assets/create/lang/en_us.json
818f913210c5d3e21189a092759b4927ee032564 assets/create/lang/unfinished/de_de.json
23cb78876cf0892edc3b5b11d772d27969773b1c assets/create/lang/unfinished/es_cl.json
8d15c0a8f7d996667c6e38b2f84ed88542344929 assets/create/lang/unfinished/es_es.json
17ae724dfe4ca23b2e39157a9361b38094445e64 assets/create/lang/unfinished/fr_fr.json
c4a51cbb988e18ca1379eeb7256b70743df49bc2 assets/create/lang/unfinished/it_it.json
04d821a172dabdecc6d20eb44f409e9409e5066a assets/create/lang/unfinished/ja_jp.json
816a0b1dbc98a5ebdc013a19c1827dcff0f60461 assets/create/lang/unfinished/ko_kr.json
5ee0cf289312ad91cae5d3bf8e50b1aacb7e6508 assets/create/lang/unfinished/nl_nl.json
f35b613037e9d99dbeee151c1835222c26ce7b74 assets/create/lang/unfinished/pl_pl.json
436da9779b9e9cb943f88999fd77dad71f80779c assets/create/lang/unfinished/pt_br.json
80778b15cf9c92fd1baac3577d791ef7254aa080 assets/create/lang/unfinished/pt_pt.json
9175aa77343034a6cb50203d7ed26513ea1938b0 assets/create/lang/unfinished/ro_ro.json
95f7979d258cd2ddfc4166cae526b3571d17c630 assets/create/lang/unfinished/ru_ru.json
e0e311ce6878a910e9a14eef36c9d5faa6ff780b assets/create/lang/unfinished/zh_cn.json
bbdeb59c2b294eb6ef98aa75b610795f75a4dd7b assets/create/lang/unfinished/zh_tw.json
875f9aff979888b9d63d6a425cbf544431f1af5a assets/create/lang/en_ud.json
9920f89987afa7a5a534f913f930affb5fadaa33 assets/create/lang/en_us.json
13c213be9595e8fe1ad165a14cdd0ec16a092204 assets/create/lang/unfinished/de_de.json
687b9acd091e4222219057ac647402aab2f05ca2 assets/create/lang/unfinished/es_cl.json
20984bb318badfb2a49d1a5467de0aef5fa4a14f assets/create/lang/unfinished/es_es.json
3ef90285ab19e24ff80354849a253a5caf5062f4 assets/create/lang/unfinished/fr_fr.json
af40251171a29093bb6d4f99172af15a734a47f7 assets/create/lang/unfinished/it_it.json
98304b8aebf8db14d0a764140f2e4703bbcffb29 assets/create/lang/unfinished/ja_jp.json
4d7f1ba7e3ced59666d9113577d2e20af54d00ef assets/create/lang/unfinished/ko_kr.json
3530e4d047cf4a654a95d069d874ac73306cbac3 assets/create/lang/unfinished/nl_nl.json
3a82a8398f74ece7d5f6440613fecc14d7056b30 assets/create/lang/unfinished/pl_pl.json
5723fa37dbdd24e31bfd14f71586f67e3a23047f assets/create/lang/unfinished/pt_br.json
f394d6ff13e89051f7582a789ab1cf81905620b4 assets/create/lang/unfinished/pt_pt.json
01ccdd4a7c1beaa84cc6bdc7cd0cc912440fb0c7 assets/create/lang/unfinished/ro_ro.json
d0b58764408454fc6df71e0a340e210c0bc5f70b assets/create/lang/unfinished/ru_ru.json
bf4a93e64419cdacf1636e1a283086e33f853bf5 assets/create/lang/unfinished/zh_cn.json
6a615c911ea01faac6c52f58e98904aef5660dc5 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
@ -1473,6 +1475,12 @@ f6096d529b8f97f0bfdec75c13e4b31958346c58 assets/create/models/block/spruce_windo
ea7952f49c78f0d7b95f3ed34df35a44a921ce15 assets/create/models/block/spruce_window_pane_post.json
04b92ecb2aea4264c58e2d3df0d77ab9fcdcf2d7 assets/create/models/block/spruce_window_pane_side.json
a5bb90cb3f5353bbfe767b3d42f4d1dbac3b498a assets/create/models/block/spruce_window_pane_side_alt.json
c45b9d390c3119503209c0a950d4499116fbf828 assets/create/models/block/steam_whistle/block_large_floor_powered.json
76b70be89147d94471e3b36884dae2cfc51b35a5 assets/create/models/block/steam_whistle/block_large_wall_powered.json
b18fd30c44895bc993db27b6516addd2ad75fe55 assets/create/models/block/steam_whistle/block_medium_floor_powered.json
7820c8787d56b3f9beb283512a01ac8fc44dfc57 assets/create/models/block/steam_whistle/block_medium_wall_powered.json
d144085e04718356d8b1fec7a4f46650b943e180 assets/create/models/block/steam_whistle/block_small_floor_powered.json
1fae9dd3da45f35b63ea9282d24723b2794869d0 assets/create/models/block/steam_whistle/block_small_wall_powered.json
3bda065e24a71b82b92b9c805790ba6d1791ef6a assets/create/models/block/stockpile_switch_0.json
335d6bc2b19d3cdbc9ed8b344142e2e3aa397994 assets/create/models/block/stockpile_switch_1.json
655d5cd249291a550bb3508c97f5a7a3606a7848 assets/create/models/block/stockpile_switch_2.json
@ -2076,6 +2084,7 @@ b9abe1331d49871838231f3a8e5d2973634e9325 assets/create/models/item/spout.json
b305e81f1dc5272634745b6e822af40955a2ef28 assets/create/models/item/spruce_window.json
f3ec8df2ee1690353ae1ec687b822d0fd962160e assets/create/models/item/spruce_window_pane.json
6c0693011f4104999c03328ba5e3bb25ffcf6359 assets/create/models/item/steam_engine.json
ba37dbd2da76713468312b2fe66a3706ffb2ae3e assets/create/models/item/steam_whistle.json
bb546e5342c6d1a6b4040cf7ccdd2f10c6f79965 assets/create/models/item/sticker.json
891abc24593d53d282773eca5534065056d89b4c assets/create/models/item/sticky_mechanical_piston.json
bbb5773adc23128c70174bfc531af936e6e063e3 assets/create/models/item/stockpile_switch.json
@ -3769,6 +3778,8 @@ e257576e224e673ecf3aadc32d145e489c86349e data/create/loot_tables/blocks/small_ve
8f52215e5954a5a14b14db0304cb8471ad26f9fd data/create/loot_tables/blocks/spruce_window.json
ad771358ecd71e2f0c4b71f7244947fc2dc2a1c9 data/create/loot_tables/blocks/spruce_window_pane.json
e3f024bb8366efe8a8b4335a769a93595adcdb18 data/create/loot_tables/blocks/steam_engine.json
de42002e7b77c3bdc8e69407f6dcab57bf5fa96e data/create/loot_tables/blocks/steam_whistle.json
5c1df8443043b3fe3b665dba348e2ff188bcbe31 data/create/loot_tables/blocks/steam_whistle_extension.json
1ab6f4764b93da0e78494dd2deb3a4fff0ed9553 data/create/loot_tables/blocks/sticker.json
94f516dd7e6fd4bd4ee26fad2d2d84b79f40de0b data/create/loot_tables/blocks/sticky_mechanical_piston.json
69cc8ce9ff7b905b62f52d9ac4819e79f3235f58 data/create/loot_tables/blocks/stockpile_switch.json
@ -5294,7 +5305,7 @@ ff1900963bc4cd8ceffa78d58ef1952ceacb2fb7 data/forge/tags/items/storage_blocks/br
69f596fcb065e26b02ce246760432b5174191b76 data/minecraft/tags/blocks/impermeable.json
2db7759fe036160c14c6ed19a68604ca16f4de60 data/minecraft/tags/blocks/lush_ground_replaceable.json
02f7a9df2f9e154749266e7ac59c37aa076a3390 data/minecraft/tags/blocks/mineable/axe.json
5782184ce3d612e9cd747fa606f5cb87bd4d67ef data/minecraft/tags/blocks/mineable/pickaxe.json
85cae90448e40527a084352bd8283627213e7ba3 data/minecraft/tags/blocks/mineable/pickaxe.json
2db7759fe036160c14c6ed19a68604ca16f4de60 data/minecraft/tags/blocks/moss_replaceable.json
e157c1d3af30e409e34bbefbe15a037e6e1c8daa data/minecraft/tags/blocks/needs_iron_tool.json
a08f67865337f62601c5e333b4011382d10020e4 data/minecraft/tags/blocks/needs_stone_tool.json

View file

@ -0,0 +1,184 @@
{
"variants": {
"facing=north,powered=false,size=small,wall=false": {
"model": "create:block/steam_whistle/block_small_floor",
"y": 180
},
"facing=south,powered=false,size=small,wall=false": {
"model": "create:block/steam_whistle/block_small_floor"
},
"facing=west,powered=false,size=small,wall=false": {
"model": "create:block/steam_whistle/block_small_floor",
"y": 90
},
"facing=east,powered=false,size=small,wall=false": {
"model": "create:block/steam_whistle/block_small_floor",
"y": 270
},
"facing=north,powered=true,size=small,wall=false": {
"model": "create:block/steam_whistle/block_small_floor_powered",
"y": 180
},
"facing=south,powered=true,size=small,wall=false": {
"model": "create:block/steam_whistle/block_small_floor_powered"
},
"facing=west,powered=true,size=small,wall=false": {
"model": "create:block/steam_whistle/block_small_floor_powered",
"y": 90
},
"facing=east,powered=true,size=small,wall=false": {
"model": "create:block/steam_whistle/block_small_floor_powered",
"y": 270
},
"facing=north,powered=false,size=medium,wall=false": {
"model": "create:block/steam_whistle/block_medium_floor",
"y": 180
},
"facing=south,powered=false,size=medium,wall=false": {
"model": "create:block/steam_whistle/block_medium_floor"
},
"facing=west,powered=false,size=medium,wall=false": {
"model": "create:block/steam_whistle/block_medium_floor",
"y": 90
},
"facing=east,powered=false,size=medium,wall=false": {
"model": "create:block/steam_whistle/block_medium_floor",
"y": 270
},
"facing=north,powered=true,size=medium,wall=false": {
"model": "create:block/steam_whistle/block_medium_floor_powered",
"y": 180
},
"facing=south,powered=true,size=medium,wall=false": {
"model": "create:block/steam_whistle/block_medium_floor_powered"
},
"facing=west,powered=true,size=medium,wall=false": {
"model": "create:block/steam_whistle/block_medium_floor_powered",
"y": 90
},
"facing=east,powered=true,size=medium,wall=false": {
"model": "create:block/steam_whistle/block_medium_floor_powered",
"y": 270
},
"facing=north,powered=false,size=large,wall=false": {
"model": "create:block/steam_whistle/block_large_floor",
"y": 180
},
"facing=south,powered=false,size=large,wall=false": {
"model": "create:block/steam_whistle/block_large_floor"
},
"facing=west,powered=false,size=large,wall=false": {
"model": "create:block/steam_whistle/block_large_floor",
"y": 90
},
"facing=east,powered=false,size=large,wall=false": {
"model": "create:block/steam_whistle/block_large_floor",
"y": 270
},
"facing=north,powered=true,size=large,wall=false": {
"model": "create:block/steam_whistle/block_large_floor_powered",
"y": 180
},
"facing=south,powered=true,size=large,wall=false": {
"model": "create:block/steam_whistle/block_large_floor_powered"
},
"facing=west,powered=true,size=large,wall=false": {
"model": "create:block/steam_whistle/block_large_floor_powered",
"y": 90
},
"facing=east,powered=true,size=large,wall=false": {
"model": "create:block/steam_whistle/block_large_floor_powered",
"y": 270
},
"facing=north,powered=false,size=small,wall=true": {
"model": "create:block/steam_whistle/block_small_wall",
"y": 180
},
"facing=south,powered=false,size=small,wall=true": {
"model": "create:block/steam_whistle/block_small_wall"
},
"facing=west,powered=false,size=small,wall=true": {
"model": "create:block/steam_whistle/block_small_wall",
"y": 90
},
"facing=east,powered=false,size=small,wall=true": {
"model": "create:block/steam_whistle/block_small_wall",
"y": 270
},
"facing=north,powered=true,size=small,wall=true": {
"model": "create:block/steam_whistle/block_small_wall_powered",
"y": 180
},
"facing=south,powered=true,size=small,wall=true": {
"model": "create:block/steam_whistle/block_small_wall_powered"
},
"facing=west,powered=true,size=small,wall=true": {
"model": "create:block/steam_whistle/block_small_wall_powered",
"y": 90
},
"facing=east,powered=true,size=small,wall=true": {
"model": "create:block/steam_whistle/block_small_wall_powered",
"y": 270
},
"facing=north,powered=false,size=medium,wall=true": {
"model": "create:block/steam_whistle/block_medium_wall",
"y": 180
},
"facing=south,powered=false,size=medium,wall=true": {
"model": "create:block/steam_whistle/block_medium_wall"
},
"facing=west,powered=false,size=medium,wall=true": {
"model": "create:block/steam_whistle/block_medium_wall",
"y": 90
},
"facing=east,powered=false,size=medium,wall=true": {
"model": "create:block/steam_whistle/block_medium_wall",
"y": 270
},
"facing=north,powered=true,size=medium,wall=true": {
"model": "create:block/steam_whistle/block_medium_wall_powered",
"y": 180
},
"facing=south,powered=true,size=medium,wall=true": {
"model": "create:block/steam_whistle/block_medium_wall_powered"
},
"facing=west,powered=true,size=medium,wall=true": {
"model": "create:block/steam_whistle/block_medium_wall_powered",
"y": 90
},
"facing=east,powered=true,size=medium,wall=true": {
"model": "create:block/steam_whistle/block_medium_wall_powered",
"y": 270
},
"facing=north,powered=false,size=large,wall=true": {
"model": "create:block/steam_whistle/block_large_wall",
"y": 180
},
"facing=south,powered=false,size=large,wall=true": {
"model": "create:block/steam_whistle/block_large_wall"
},
"facing=west,powered=false,size=large,wall=true": {
"model": "create:block/steam_whistle/block_large_wall",
"y": 90
},
"facing=east,powered=false,size=large,wall=true": {
"model": "create:block/steam_whistle/block_large_wall",
"y": 270
},
"facing=north,powered=true,size=large,wall=true": {
"model": "create:block/steam_whistle/block_large_wall_powered",
"y": 180
},
"facing=south,powered=true,size=large,wall=true": {
"model": "create:block/steam_whistle/block_large_wall_powered"
},
"facing=west,powered=true,size=large,wall=true": {
"model": "create:block/steam_whistle/block_large_wall_powered",
"y": 90
},
"facing=east,powered=true,size=large,wall=true": {
"model": "create:block/steam_whistle/block_large_wall_powered",
"y": 270
}
}
}

View file

@ -0,0 +1,85 @@
{
"multipart": [
{
"when": {
"size": "small",
"shape": "double"
},
"apply": {
"model": "create:block/steam_whistle/extension/small_top_rim"
}
},
{
"when": {
"size": "small",
"shape": "single"
},
"apply": {
"model": "create:block/steam_whistle/extension/small_single"
}
},
{
"when": {
"size": "small",
"shape": "double|double_connected"
},
"apply": {
"model": "create:block/steam_whistle/extension/small_double"
}
},
{
"when": {
"size": "medium",
"shape": "double"
},
"apply": {
"model": "create:block/steam_whistle/extension/medium_top_rim"
}
},
{
"when": {
"size": "medium",
"shape": "single"
},
"apply": {
"model": "create:block/steam_whistle/extension/medium_single"
}
},
{
"when": {
"size": "medium",
"shape": "double|double_connected"
},
"apply": {
"model": "create:block/steam_whistle/extension/medium_double"
}
},
{
"when": {
"size": "large",
"shape": "double"
},
"apply": {
"model": "create:block/steam_whistle/extension/large_top_rim"
}
},
{
"when": {
"size": "large",
"shape": "single"
},
"apply": {
"model": "create:block/steam_whistle/extension/large_single"
}
},
{
"when": {
"size": "large",
"shape": "double|double_connected"
},
"apply": {
"model": "create:block/steam_whistle/extension/large_double"
}
}
]
}

View file

@ -479,6 +479,8 @@
"block.create.spruce_window": "\u028Dopu\u0131M \u01DD\u0254n\u0279dS",
"block.create.spruce_window_pane": "\u01DDu\u0250\u0500 \u028Dopu\u0131M \u01DD\u0254n\u0279dS",
"block.create.steam_engine": "\u01DDu\u0131bu\u018E \u026F\u0250\u01DD\u0287S",
"block.create.steam_whistle": "\u01DD\u05DF\u0287s\u0131\u0265M \u026F\u0250\u01DD\u0287S",
"block.create.steam_whistle_extension": "uo\u0131su\u01DD\u0287x\u018E \u01DD\u05DF\u0287s\u0131\u0265M \u026F\u0250\u01DD\u0287S",
"block.create.sticker": "\u0279\u01DD\u029E\u0254\u0131\u0287S",
"block.create.sticky_mechanical_piston": "uo\u0287s\u0131\u0500 \u05DF\u0250\u0254\u0131u\u0250\u0265\u0254\u01DDW \u028E\u029E\u0254\u0131\u0287S",
"block.create.stockpile_switch": "\u0265\u0254\u0287\u0131\u028DS \u01DD\u05DF\u0131d\u029E\u0254o\u0287S",

View file

@ -482,6 +482,8 @@
"block.create.spruce_window": "Spruce Window",
"block.create.spruce_window_pane": "Spruce Window Pane",
"block.create.steam_engine": "Steam Engine",
"block.create.steam_whistle": "Steam Whistle",
"block.create.steam_whistle_extension": "Steam Whistle Extension",
"block.create.sticker": "Sticker",
"block.create.sticky_mechanical_piston": "Sticky Mechanical Piston",
"block.create.stockpile_switch": "Stockpile Switch",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 1529",
"_": "Missing Localizations: 1531",
"_": "->------------------------] Game Elements [------------------------<-",
@ -483,6 +483,8 @@
"block.create.spruce_window": "Fichtenfenster",
"block.create.spruce_window_pane": "Fichtenfensterscheibe",
"block.create.steam_engine": "UNLOCALIZED: Steam Engine",
"block.create.steam_whistle": "UNLOCALIZED: Steam Whistle",
"block.create.steam_whistle_extension": "UNLOCALIZED: Steam Whistle Extension",
"block.create.sticker": "Ankleber",
"block.create.sticky_mechanical_piston": "Klebriger Mechanischer Kolben",
"block.create.stockpile_switch": "Vorratssensor",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 551",
"_": "Missing Localizations: 553",
"_": "->------------------------] Game Elements [------------------------<-",
@ -483,6 +483,8 @@
"block.create.spruce_window": "Ventana de Abeto",
"block.create.spruce_window_pane": "Panel de Ventana de Abeto",
"block.create.steam_engine": "UNLOCALIZED: Steam Engine",
"block.create.steam_whistle": "UNLOCALIZED: Steam Whistle",
"block.create.steam_whistle_extension": "UNLOCALIZED: Steam Whistle Extension",
"block.create.sticker": "Pegador",
"block.create.sticky_mechanical_piston": "Pistón Mecánico Pegajoso",
"block.create.stockpile_switch": "Interruptor de Reservas",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 222",
"_": "Missing Localizations: 224",
"_": "->------------------------] Game Elements [------------------------<-",
@ -483,6 +483,8 @@
"block.create.spruce_window": "Ventana de abeto",
"block.create.spruce_window_pane": "Panel de ventana de abeto",
"block.create.steam_engine": "UNLOCALIZED: Steam Engine",
"block.create.steam_whistle": "UNLOCALIZED: Steam Whistle",
"block.create.steam_whistle_extension": "UNLOCALIZED: Steam Whistle Extension",
"block.create.sticker": "Pegatina",
"block.create.sticky_mechanical_piston": "Pistón mecánico pegajoso",
"block.create.stockpile_switch": "Interruptor de acopio",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 1791",
"_": "Missing Localizations: 1793",
"_": "->------------------------] Game Elements [------------------------<-",
@ -483,6 +483,8 @@
"block.create.spruce_window": "UNLOCALIZED: Spruce Window",
"block.create.spruce_window_pane": "UNLOCALIZED: Spruce Window Pane",
"block.create.steam_engine": "UNLOCALIZED: Steam Engine",
"block.create.steam_whistle": "UNLOCALIZED: Steam Whistle",
"block.create.steam_whistle_extension": "UNLOCALIZED: Steam Whistle Extension",
"block.create.sticker": "UNLOCALIZED: Sticker",
"block.create.sticky_mechanical_piston": "Piston mécanique collant",
"block.create.stockpile_switch": "Détecteur de stockage",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 1480",
"_": "Missing Localizations: 1482",
"_": "->------------------------] Game Elements [------------------------<-",
@ -483,6 +483,8 @@
"block.create.spruce_window": "Finestra di abete",
"block.create.spruce_window_pane": "Pannello di finestra di abete",
"block.create.steam_engine": "UNLOCALIZED: Steam Engine",
"block.create.steam_whistle": "UNLOCALIZED: Steam Whistle",
"block.create.steam_whistle_extension": "UNLOCALIZED: Steam Whistle Extension",
"block.create.sticker": "UNLOCALIZED: Sticker",
"block.create.sticky_mechanical_piston": "Pistone meccanico appiccicoso",
"block.create.stockpile_switch": "Interruttore accumulatore",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 217",
"_": "Missing Localizations: 219",
"_": "->------------------------] Game Elements [------------------------<-",
@ -483,6 +483,8 @@
"block.create.spruce_window": "マツの窓",
"block.create.spruce_window_pane": "マツの板窓",
"block.create.steam_engine": "UNLOCALIZED: Steam Engine",
"block.create.steam_whistle": "UNLOCALIZED: Steam Whistle",
"block.create.steam_whistle_extension": "UNLOCALIZED: Steam Whistle Extension",
"block.create.sticker": "スティッカー",
"block.create.sticky_mechanical_piston": "メカニカル粘着ピストン",
"block.create.stockpile_switch": "在庫スイッチ",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 217",
"_": "Missing Localizations: 219",
"_": "->------------------------] Game Elements [------------------------<-",
@ -483,6 +483,8 @@
"block.create.spruce_window": "가문비나무 유리창",
"block.create.spruce_window_pane": "가문비나무 유리판",
"block.create.steam_engine": "UNLOCALIZED: Steam Engine",
"block.create.steam_whistle": "UNLOCALIZED: Steam Whistle",
"block.create.steam_whistle_extension": "UNLOCALIZED: Steam Whistle Extension",
"block.create.sticker": "부착기",
"block.create.sticky_mechanical_piston": "기계식 끈끈이 피스톤",
"block.create.stockpile_switch": "수량 스위치",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 2143",
"_": "Missing Localizations: 2145",
"_": "->------------------------] Game Elements [------------------------<-",
@ -483,6 +483,8 @@
"block.create.spruce_window": "UNLOCALIZED: Spruce Window",
"block.create.spruce_window_pane": "UNLOCALIZED: Spruce Window Pane",
"block.create.steam_engine": "UNLOCALIZED: Steam Engine",
"block.create.steam_whistle": "UNLOCALIZED: Steam Whistle",
"block.create.steam_whistle_extension": "UNLOCALIZED: Steam Whistle Extension",
"block.create.sticker": "UNLOCALIZED: Sticker",
"block.create.sticky_mechanical_piston": "Mechanische Zuiger",
"block.create.stockpile_switch": "Voorraad Schakelaar",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 590",
"_": "Missing Localizations: 592",
"_": "->------------------------] Game Elements [------------------------<-",
@ -483,6 +483,8 @@
"block.create.spruce_window": "Świerkowe okno",
"block.create.spruce_window_pane": "Świerkowa szyba okienna",
"block.create.steam_engine": "UNLOCALIZED: Steam Engine",
"block.create.steam_whistle": "UNLOCALIZED: Steam Whistle",
"block.create.steam_whistle_extension": "UNLOCALIZED: Steam Whistle Extension",
"block.create.sticker": "Przyklejacz",
"block.create.sticky_mechanical_piston": "Lepki mechaniczny tłok",
"block.create.stockpile_switch": "Przełącznik zawartościowy",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 1391",
"_": "Missing Localizations: 1393",
"_": "->------------------------] Game Elements [------------------------<-",
@ -483,6 +483,8 @@
"block.create.spruce_window": "Janela de pinheiro",
"block.create.spruce_window_pane": "Vidraça de pinheiro",
"block.create.steam_engine": "UNLOCALIZED: Steam Engine",
"block.create.steam_whistle": "UNLOCALIZED: Steam Whistle",
"block.create.steam_whistle_extension": "UNLOCALIZED: Steam Whistle Extension",
"block.create.sticker": "Adesivo",
"block.create.sticky_mechanical_piston": "Pistão Mecânico Grudento",
"block.create.stockpile_switch": "Disjuntor de Armazenamento",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 1763",
"_": "Missing Localizations: 1765",
"_": "->------------------------] Game Elements [------------------------<-",
@ -483,6 +483,8 @@
"block.create.spruce_window": "UNLOCALIZED: Spruce Window",
"block.create.spruce_window_pane": "UNLOCALIZED: Spruce Window Pane",
"block.create.steam_engine": "UNLOCALIZED: Steam Engine",
"block.create.steam_whistle": "UNLOCALIZED: Steam Whistle",
"block.create.steam_whistle_extension": "UNLOCALIZED: Steam Whistle Extension",
"block.create.sticker": "Adesivo",
"block.create.sticky_mechanical_piston": "Pistão Mecânico Grudento",
"block.create.stockpile_switch": "Disjuntor de Armazenamento",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 218",
"_": "Missing Localizations: 220",
"_": "->------------------------] Game Elements [------------------------<-",
@ -483,6 +483,8 @@
"block.create.spruce_window": "Sticlă De Molid",
"block.create.spruce_window_pane": "Geam De Molid",
"block.create.steam_engine": "UNLOCALIZED: Steam Engine",
"block.create.steam_whistle": "UNLOCALIZED: Steam Whistle",
"block.create.steam_whistle_extension": "UNLOCALIZED: Steam Whistle Extension",
"block.create.sticker": "Abțipild",
"block.create.sticky_mechanical_piston": "Piston Mecanic Lipicios",
"block.create.stockpile_switch": "Comutator De Depozitare",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 595",
"_": "Missing Localizations: 597",
"_": "->------------------------] Game Elements [------------------------<-",
@ -483,6 +483,8 @@
"block.create.spruce_window": "Еловое окно",
"block.create.spruce_window_pane": "Панель из елового окна",
"block.create.steam_engine": "UNLOCALIZED: Steam Engine",
"block.create.steam_whistle": "UNLOCALIZED: Steam Whistle",
"block.create.steam_whistle_extension": "UNLOCALIZED: Steam Whistle Extension",
"block.create.sticker": "Блок-липучка",
"block.create.sticky_mechanical_piston": "Липкий механический поршень",
"block.create.stockpile_switch": "Настраиваемый компаратор",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 217",
"_": "Missing Localizations: 219",
"_": "->------------------------] Game Elements [------------------------<-",
@ -483,6 +483,8 @@
"block.create.spruce_window": "云杉木窗户",
"block.create.spruce_window_pane": "云杉木窗户板",
"block.create.steam_engine": "UNLOCALIZED: Steam Engine",
"block.create.steam_whistle": "UNLOCALIZED: Steam Whistle",
"block.create.steam_whistle_extension": "UNLOCALIZED: Steam Whistle Extension",
"block.create.sticker": "黏着器",
"block.create.sticky_mechanical_piston": "黏性动力活塞",
"block.create.stockpile_switch": "存量转换器",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 609",
"_": "Missing Localizations: 611",
"_": "->------------------------] Game Elements [------------------------<-",
@ -483,6 +483,8 @@
"block.create.spruce_window": "雲杉木窗戶",
"block.create.spruce_window_pane": "雲杉木窗戶片",
"block.create.steam_engine": "UNLOCALIZED: Steam Engine",
"block.create.steam_whistle": "UNLOCALIZED: Steam Whistle",
"block.create.steam_whistle_extension": "UNLOCALIZED: Steam Whistle Extension",
"block.create.sticker": "方塊黏著器",
"block.create.sticky_mechanical_piston": "黏性機械活塞",
"block.create.stockpile_switch": "存量偵測器",

View file

@ -0,0 +1,6 @@
{
"parent": "create:block/steam_whistle/block_large_floor",
"textures": {
"2": "create:block/copper_redstone_plate_powered"
}
}

View file

@ -0,0 +1,6 @@
{
"parent": "create:block/steam_whistle/block_large_wall",
"textures": {
"2": "create:block/copper_redstone_plate_powered"
}
}

View file

@ -0,0 +1,6 @@
{
"parent": "create:block/steam_whistle/block_medium_floor",
"textures": {
"2": "create:block/copper_redstone_plate_powered"
}
}

View file

@ -0,0 +1,6 @@
{
"parent": "create:block/steam_whistle/block_medium_wall",
"textures": {
"2": "create:block/copper_redstone_plate_powered"
}
}

View file

@ -0,0 +1,6 @@
{
"parent": "create:block/steam_whistle/block_small_floor",
"textures": {
"2": "create:block/copper_redstone_plate_powered"
}
}

View file

@ -0,0 +1,6 @@
{
"parent": "create:block/steam_whistle/block_small_wall",
"textures": {
"2": "create:block/copper_redstone_plate_powered"
}
}

View file

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

View file

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

View file

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

View file

@ -73,6 +73,8 @@
"create:spout",
"create:portable_fluid_interface",
"create:steam_engine",
"create:steam_whistle",
"create:steam_whistle_extension",
"create:powered_shaft",
"create:mechanical_piston",
"create:sticky_mechanical_piston",

View file

@ -137,6 +137,10 @@ public class AllBlockPartials {
SIGNAL_RED = block("track_signal/red_tube"), SIGNAL_YELLOW_CUBE = block("track_signal/yellow_cube"),
SIGNAL_YELLOW_GLOW = block("track_signal/yellow_glow"), SIGNAL_YELLOW = block("track_signal/yellow_tube"),
WHISTLE_MOUTH_LARGE = block("steam_whistle/large_mouth"),
WHISTLE_MOUTH_MEDIUM = block("steam_whistle/medium_mouth"),
WHISTLE_MOUTH_SMALL = block("steam_whistle/small_mouth"),
CRAFTING_BLUEPRINT_1x1 = entity("crafting_blueprint_small"),
CRAFTING_BLUEPRINT_2x2 = entity("crafting_blueprint_medium"),
CRAFTING_BLUEPRINT_3x3 = entity("crafting_blueprint_large"),

View file

@ -52,6 +52,9 @@ import com.simibubi.create.content.contraptions.components.saw.SawBlock;
import com.simibubi.create.content.contraptions.components.saw.SawGenerator;
import com.simibubi.create.content.contraptions.components.steam.PoweredShaftBlock;
import com.simibubi.create.content.contraptions.components.steam.SteamEngineBlock;
import com.simibubi.create.content.contraptions.components.steam.whistle.WhistleBlock;
import com.simibubi.create.content.contraptions.components.steam.whistle.WhistleExtenderBlock;
import com.simibubi.create.content.contraptions.components.steam.whistle.WhistleGenerator;
import com.simibubi.create.content.contraptions.components.structureMovement.bearing.BlankSailBlockItem;
import com.simibubi.create.content.contraptions.components.structureMovement.bearing.ClockworkBearingBlock;
import com.simibubi.create.content.contraptions.components.structureMovement.bearing.MechanicalBearingBlock;
@ -877,6 +880,21 @@ public class AllBlocks {
.transform(customItemModel())
.register();
public static final BlockEntry<WhistleBlock> STEAM_WHISTLE = REGISTRATE.block("steam_whistle", WhistleBlock::new)
.initialProperties(SharedProperties::copperMetal)
.transform(pickaxeOnly())
.blockstate(new WhistleGenerator()::generate)
.item()
.transform(customItemModel())
.register();
public static final BlockEntry<WhistleExtenderBlock> STEAM_WHISTLE_EXTENSION =
REGISTRATE.block("steam_whistle_extension", WhistleExtenderBlock::new)
.initialProperties(SharedProperties::copperMetal)
.transform(pickaxeOnly())
.blockstate(BlockStateGen.whistleExtender())
.register();
public static final BlockEntry<PoweredShaftBlock> POWERED_SHAFT =
REGISTRATE.block("powered_shaft", PoweredShaftBlock::new)
.initialProperties(SharedProperties::stone)

View file

@ -147,7 +147,10 @@ public class AllShapes {
TRACK_ORTHO = shape(TrackVoxelShapes.orthogonal()).forHorizontal(NORTH),
TRACK_ASC = shape(TrackVoxelShapes.ascending()).forHorizontal(SOUTH),
TRACK_DIAG = shape(TrackVoxelShapes.diagonal()).forHorizontal(SOUTH)
TRACK_DIAG = shape(TrackVoxelShapes.diagonal()).forHorizontal(SOUTH),
WHISTLE_BASE = shape(1, 0, 1, 15, 3, 15).add(5, 0, 5, 11, 8, 11)
.forDirectional(UP)
;
@ -165,7 +168,10 @@ public class AllShapes {
LOGISTICS_TABLE_SLOPE = shape(0, 10, 10.667, 16, 14, 15).add(0, 12, 6.333, 16, 16, 10.667)
.add(0, 14, 2, 16, 18, 6.333)
.build(),
TANK_BOTTOM_LID = shape(0, 0, 0, 16, 4, 16).build(), TANK_TOP_LID = shape(0, 12, 0, 16, 16, 16).build()
TANK_BOTTOM_LID = shape(0, 0, 0, 16, 4, 16).build(), TANK_TOP_LID = shape(0, 12, 0, 16, 16, 16).build(),
WHISTLE_SMALL = shape(4, 3, 4, 12, 16, 12).build(), WHISTLE_MEDIUM = shape(3, 3, 3, 13, 16, 13).build(),
WHISTLE_LARGE = shape(2, 3, 2, 14, 16, 14).build()
;
@ -250,7 +256,24 @@ public class AllShapes {
DEPOT = shape(CASING_11PX.get(Direction.UP)).add(1, 11, 1, 15, 13, 15)
.build(),
STATION = shape(0, 0, 0, 16, 2, 16).add(1, 0, 1, 15, 13, 15)
.build()
.build(),
WHISTLE_SMALL_FLOOR = shape(WHISTLE_SMALL).add(WHISTLE_BASE.get(UP))
.build(),
WHISTLE_MEDIUM_FLOOR = shape(WHISTLE_MEDIUM).add(WHISTLE_BASE.get(UP))
.build(),
WHISTLE_LARGE_FLOOR = shape(WHISTLE_LARGE).add(WHISTLE_BASE.get(UP))
.build(),
WHISTLE_EXTENDER_SMALL = shape(4, 0, 4, 12, 10, 12).build(),
WHISTLE_EXTENDER_MEDIUM = shape(3, 0, 3, 13, 10, 13).build(),
WHISTLE_EXTENDER_LARGE = shape(2, 0, 2, 14, 10, 14).build(),
WHISTLE_EXTENDER_SMALL_DOUBLE = shape(4, 0, 4, 12, 18, 12).build(),
WHISTLE_EXTENDER_MEDIUM_DOUBLE = shape(3, 0, 3, 13, 18, 13).build(),
WHISTLE_EXTENDER_LARGE_DOUBLE = shape(2, 0, 2, 14, 18, 14).build(),
WHISTLE_EXTENDER_SMALL_DOUBLE_CONNECTED = shape(4, 0, 4, 12, 16, 12).build(),
WHISTLE_EXTENDER_MEDIUM_DOUBLE_CONNECTED = shape(3, 0, 3, 13, 16, 13).build(),
WHISTLE_EXTENDER_LARGE_DOUBLE_CONNECTED = shape(2, 0, 2, 14, 16, 14).build()
;
@ -275,7 +298,14 @@ public class AllShapes {
.forHorizontal(SOUTH),
SCHEMATICS_TABLE = shape(4, 0, 4, 12, 12, 12).add(0, 11, 2, 16, 14, 14)
.forDirectional(SOUTH),
CHUTE_SLOPE = shape(ChuteShapes.createSlope()).forHorizontal(SOUTH)
CHUTE_SLOPE = shape(ChuteShapes.createSlope()).forHorizontal(SOUTH),
WHISTLE_SMALL_WALL = shape(WHISTLE_SMALL).add(WHISTLE_BASE.get(NORTH))
.forHorizontal(SOUTH),
WHISTLE_MEDIUM_WALL = shape(WHISTLE_MEDIUM).add(WHISTLE_BASE.get(NORTH))
.forHorizontal(SOUTH),
WHISTLE_LARGE_WALL = shape(WHISTLE_LARGE).add(WHISTLE_BASE.get(NORTH))
.forHorizontal(SOUTH)
;

View file

@ -54,6 +54,8 @@ import com.simibubi.create.content.contraptions.components.saw.SawTileEntity;
import com.simibubi.create.content.contraptions.components.steam.PoweredShaftTileEntity;
import com.simibubi.create.content.contraptions.components.steam.SteamEngineRenderer;
import com.simibubi.create.content.contraptions.components.steam.SteamEngineTileEntity;
import com.simibubi.create.content.contraptions.components.steam.whistle.WhistleRenderer;
import com.simibubi.create.content.contraptions.components.steam.whistle.WhistleTileEntity;
import com.simibubi.create.content.contraptions.components.structureMovement.bearing.BearingInstance;
import com.simibubi.create.content.contraptions.components.structureMovement.bearing.BearingRenderer;
import com.simibubi.create.content.contraptions.components.structureMovement.bearing.ClockworkBearingTileEntity;
@ -522,6 +524,12 @@ public class AllTileEntities {
.renderer(() -> SteamEngineRenderer::new)
.register();
public static final BlockEntityEntry<WhistleTileEntity> STEAM_WHISTLE = Create.registrate()
.tileEntity("steam_whistle", WhistleTileEntity::new)
.validBlocks(AllBlocks.STEAM_WHISTLE)
.renderer(() -> WhistleRenderer::new)
.register();
public static final BlockEntityEntry<PoweredShaftTileEntity> POWERED_SHAFT = Create.registrate()
.tileEntity("powered_shaft", PoweredShaftTileEntity::new)
.instance(() -> SingleRotatingInstance::new, false)

View file

@ -8,8 +8,6 @@ import com.simibubi.create.AllBlocks;
import com.simibubi.create.AllShapes;
import com.simibubi.create.AllTileEntities;
import com.simibubi.create.content.contraptions.fluids.tank.FluidTankBlock;
import com.simibubi.create.content.contraptions.fluids.tank.FluidTankConnectivityHandler;
import com.simibubi.create.content.contraptions.fluids.tank.FluidTankTileEntity;
import com.simibubi.create.content.contraptions.relays.elementary.ShaftBlock;
import com.simibubi.create.content.contraptions.wrench.IWrenchable;
import com.simibubi.create.foundation.block.ITE;
@ -98,7 +96,7 @@ public class SteamEngineBlock extends FaceAttachedHorizontalDirectionalBlock
@Override
public void onPlace(BlockState pState, Level pLevel, BlockPos pPos, BlockState pOldState, boolean pIsMoving) {
updateAttachedTank(pState, pLevel, pPos);
FluidTankBlock.updateBoilerState(pState, pLevel, pPos.relative(getFacing(pState).getOpposite()));
BlockPos shaftPos = getShaftPos(pState, pPos);
BlockState shaftState = pLevel.getBlockState(shaftPos);
if (isShaftValid(pState, shaftState))
@ -109,28 +107,13 @@ public class SteamEngineBlock extends FaceAttachedHorizontalDirectionalBlock
public void onRemove(BlockState pState, Level pLevel, BlockPos pPos, BlockState pNewState, boolean pIsMoving) {
if (pState.hasBlockEntity() && (!pState.is(pNewState.getBlock()) || !pNewState.hasBlockEntity()))
pLevel.removeBlockEntity(pPos);
updateAttachedTank(pState, pLevel, pPos);
FluidTankBlock.updateBoilerState(pState, pLevel, pPos.relative(getFacing(pState).getOpposite()));
BlockPos shaftPos = getShaftPos(pState, pPos);
BlockState shaftState = pLevel.getBlockState(shaftPos);
if (AllBlocks.POWERED_SHAFT.has(shaftState))
pLevel.scheduleTick(shaftPos, shaftState.getBlock(), 1);
}
private void updateAttachedTank(BlockState pState, Level pLevel, BlockPos pPos) {
BlockPos tankPos = pPos.relative(getFacing(pState).getOpposite());
BlockState tankState = pLevel.getBlockState(tankPos);
if (!FluidTankBlock.isTank(tankState))
return;
FluidTankTileEntity tankTE = FluidTankConnectivityHandler.anyTankAt(pLevel, tankPos);
if (tankTE == null)
return;
FluidTankTileEntity controllerTE = tankTE.getControllerTE();
if (controllerTE == null)
return;
controllerTE.updateBoilerState();
}
@Override
public VoxelShape getShape(BlockState pState, BlockGetter pLevel, BlockPos pPos, CollisionContext pContext) {
AttachFace face = pState.getValue(FACE);

View file

@ -0,0 +1,232 @@
package com.simibubi.create.content.contraptions.components.steam.whistle;
import java.util.Random;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.AllShapes;
import com.simibubi.create.AllTileEntities;
import com.simibubi.create.content.contraptions.components.steam.whistle.WhistleExtenderBlock.WhistleExtenderShape;
import com.simibubi.create.content.contraptions.fluids.tank.FluidTankBlock;
import com.simibubi.create.content.contraptions.wrench.IWrenchable;
import com.simibubi.create.foundation.block.ITE;
import com.simibubi.create.foundation.utility.Lang;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.core.Direction.Axis;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.util.StringRepresentable;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResult;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.context.BlockPlaceContext;
import net.minecraft.world.level.BlockGetter;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.LevelAccessor;
import net.minecraft.world.level.LevelReader;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.Mirror;
import net.minecraft.world.level.block.Rotation;
import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.block.state.StateDefinition.Builder;
import net.minecraft.world.level.block.state.properties.BlockStateProperties;
import net.minecraft.world.level.block.state.properties.BooleanProperty;
import net.minecraft.world.level.block.state.properties.DirectionProperty;
import net.minecraft.world.level.block.state.properties.EnumProperty;
import net.minecraft.world.level.pathfinder.PathComputationType;
import net.minecraft.world.phys.BlockHitResult;
import net.minecraft.world.phys.shapes.CollisionContext;
import net.minecraft.world.phys.shapes.VoxelShape;
public class WhistleBlock extends Block implements ITE<WhistleTileEntity>, IWrenchable {
public static final DirectionProperty FACING = BlockStateProperties.HORIZONTAL_FACING;
public static final BooleanProperty WALL = BooleanProperty.create("wall");
public static final BooleanProperty POWERED = BlockStateProperties.POWERED;
public static final EnumProperty<WhistleSize> SIZE = EnumProperty.create("size", WhistleSize.class);
public static enum WhistleSize implements StringRepresentable {
SMALL, MEDIUM, LARGE;
@Override
public String getSerializedName() {
return Lang.asId(name());
}
}
public WhistleBlock(Properties p_49795_) {
super(p_49795_);
registerDefaultState(defaultBlockState().setValue(POWERED, false)
.setValue(WALL, false)
.setValue(SIZE, WhistleSize.MEDIUM));
}
@Override
public boolean canSurvive(BlockState pState, LevelReader pLevel, BlockPos pPos) {
return FluidTankBlock.isTank(pLevel.getBlockState(pPos.relative(getAttachedDirection(pState))));
}
@Override
public BlockState getRotatedBlockState(BlockState originalState, Direction targetedFace) {
return originalState.cycle(SIZE);
}
@Override
protected void createBlockStateDefinition(Builder<Block, BlockState> pBuilder) {
super.createBlockStateDefinition(pBuilder.add(FACING, POWERED, SIZE, WALL));
}
@Override
public BlockState getStateForPlacement(BlockPlaceContext pContext) {
Level level = pContext.getLevel();
BlockPos clickedPos = pContext.getClickedPos();
Direction face = pContext.getClickedFace();
boolean wall = true;
if (face.getAxis() == Axis.Y) {
face = pContext.getHorizontalDirection()
.getOpposite();
wall = false;
}
BlockState state = super.getStateForPlacement(pContext).setValue(FACING, face.getOpposite())
.setValue(POWERED, level.hasNeighborSignal(clickedPos))
.setValue(WALL, wall);
if (!canSurvive(state, level, clickedPos))
return null;
return state;
}
@Override
public InteractionResult use(BlockState pState, Level pLevel, BlockPos pPos, Player pPlayer, InteractionHand pHand,
BlockHitResult pHit) {
if (pPlayer == null)
return InteractionResult.PASS;
ItemStack heldItem = pPlayer.getItemInHand(pHand);
if (AllBlocks.STEAM_WHISTLE.isIn(heldItem)) {
incrementSize(pLevel, pPos);
return InteractionResult.SUCCESS;
}
return InteractionResult.PASS;
}
public static void incrementSize(LevelAccessor pLevel, BlockPos pPos) {
BlockState base = pLevel.getBlockState(pPos);
if (!base.hasProperty(SIZE))
return;
WhistleSize size = base.getValue(SIZE);
BlockPos currentPos = pPos.above();
for (int i = 1; i <= 12; i++) {
BlockState blockState = pLevel.getBlockState(currentPos);
if (AllBlocks.STEAM_WHISTLE_EXTENSION.has(blockState)) {
if (blockState.getValue(WhistleExtenderBlock.SHAPE) == WhistleExtenderShape.SINGLE) {
pLevel.setBlock(currentPos,
blockState.setValue(WhistleExtenderBlock.SHAPE, WhistleExtenderShape.DOUBLE), 3);
return;
}
currentPos = currentPos.above();
continue;
}
if (!blockState.getMaterial()
.isReplaceable())
return;
pLevel.setBlock(currentPos, AllBlocks.STEAM_WHISTLE_EXTENSION.getDefaultState()
.setValue(SIZE, size), 3);
return;
}
}
public static void queuePitchUpdate(LevelAccessor level, BlockPos pos) {
BlockState blockState = level.getBlockState(pos);
if (blockState.getBlock()instanceof WhistleBlock whistle && !level.getBlockTicks()
.hasScheduledTick(pos, whistle))
level.scheduleTick(pos, whistle, 1);
}
@Override
public void tick(BlockState pState, ServerLevel pLevel, BlockPos pPos, Random pRandom) {
withTileEntityDo(pLevel, pPos, WhistleTileEntity::updatePitch);
}
@Override
public void onPlace(BlockState pState, Level pLevel, BlockPos pPos, BlockState pOldState, boolean pIsMoving) {
FluidTankBlock.updateBoilerState(pState, pLevel, pPos.relative(getAttachedDirection(pState)));
if (pOldState.getBlock() != this || pOldState.getValue(SIZE) != pState.getValue(SIZE))
queuePitchUpdate(pLevel, pPos);
}
@Override
public void onRemove(BlockState pState, Level pLevel, BlockPos pPos, BlockState pNewState, boolean pIsMoving) {
if (pState.hasBlockEntity() && (!pState.is(pNewState.getBlock()) || !pNewState.hasBlockEntity()))
pLevel.removeBlockEntity(pPos);
FluidTankBlock.updateBoilerState(pState, pLevel, pPos.relative(getAttachedDirection(pState)));
}
@Override
public void neighborChanged(BlockState state, Level worldIn, BlockPos pos, Block blockIn, BlockPos fromPos,
boolean isMoving) {
if (worldIn.isClientSide)
return;
boolean previouslyPowered = state.getValue(POWERED);
if (previouslyPowered != worldIn.hasNeighborSignal(pos))
worldIn.setBlock(pos, state.cycle(POWERED), 2);
}
public BlockState updateShape(BlockState pState, Direction pFacing, BlockState pFacingState, LevelAccessor pLevel,
BlockPos pCurrentPos, BlockPos pFacingPos) {
return getAttachedDirection(pState) == pFacing && !pState.canSurvive(pLevel, pCurrentPos)
? Blocks.AIR.defaultBlockState()
: pState;
}
@Override
public VoxelShape getShape(BlockState pState, BlockGetter pLevel, BlockPos pPos, CollisionContext pContext) {
WhistleSize size = pState.getValue(SIZE);
if (!pState.getValue(WALL))
return size == WhistleSize.SMALL ? AllShapes.WHISTLE_SMALL_FLOOR
: size == WhistleSize.MEDIUM ? AllShapes.WHISTLE_MEDIUM_FLOOR : AllShapes.WHISTLE_LARGE_FLOOR;
Direction direction = pState.getValue(FACING);
return (size == WhistleSize.SMALL ? AllShapes.WHISTLE_SMALL_WALL
: size == WhistleSize.MEDIUM ? AllShapes.WHISTLE_MEDIUM_WALL : AllShapes.WHISTLE_LARGE_WALL).get(direction);
}
@Override
public boolean isPathfindable(BlockState state, BlockGetter reader, BlockPos pos, PathComputationType type) {
return false;
}
public static Direction getAttachedDirection(BlockState state) {
return state.getValue(WALL) ? state.getValue(FACING) : Direction.DOWN;
}
@Override
public Class<WhistleTileEntity> getTileEntityClass() {
return WhistleTileEntity.class;
}
@Override
public BlockEntityType<? extends WhistleTileEntity> getTileEntityType() {
return AllTileEntities.STEAM_WHISTLE.get();
}
@Override
public BlockState rotate(BlockState pState, Rotation pRotation) {
return pState.setValue(FACING, pRotation.rotate(pState.getValue(FACING)));
}
@Override
@SuppressWarnings("deprecation")
public BlockState mirror(BlockState pState, Mirror pMirror) {
return pMirror == Mirror.NONE ? pState : pState.rotate(pMirror.getRotation(pState.getValue(FACING)));
}
}

View file

@ -0,0 +1,186 @@
package com.simibubi.create.content.contraptions.components.steam.whistle;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.AllShapes;
import com.simibubi.create.content.contraptions.components.steam.whistle.WhistleBlock.WhistleSize;
import com.simibubi.create.content.contraptions.wrench.IWrenchable;
import com.simibubi.create.foundation.utility.Lang;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.core.Direction.Axis;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.util.StringRepresentable;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResult;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.context.UseOnContext;
import net.minecraft.world.level.BlockGetter;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.LevelAccessor;
import net.minecraft.world.level.LevelReader;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.block.state.StateDefinition.Builder;
import net.minecraft.world.level.block.state.properties.EnumProperty;
import net.minecraft.world.phys.BlockHitResult;
import net.minecraft.world.phys.HitResult;
import net.minecraft.world.phys.shapes.CollisionContext;
import net.minecraft.world.phys.shapes.VoxelShape;
public class WhistleExtenderBlock extends Block implements IWrenchable {
public static final EnumProperty<WhistleExtenderShape> SHAPE =
EnumProperty.create("shape", WhistleExtenderShape.class);
public static final EnumProperty<WhistleSize> SIZE = WhistleBlock.SIZE;
public static enum WhistleExtenderShape implements StringRepresentable {
SINGLE, DOUBLE, DOUBLE_CONNECTED;
@Override
public String getSerializedName() {
return Lang.asId(name());
}
}
public WhistleExtenderBlock(Properties p_49795_) {
super(p_49795_);
registerDefaultState(defaultBlockState().setValue(SHAPE, WhistleExtenderShape.SINGLE)
.setValue(SIZE, WhistleSize.MEDIUM));
}
@Override
public InteractionResult onSneakWrenched(BlockState state, UseOnContext context) {
Level world = context.getLevel();
BlockPos pos = context.getClickedPos();
if (context.getClickLocation().y < context.getClickedPos()
.getY() + .5f || state.getValue(SHAPE) == WhistleExtenderShape.SINGLE)
return IWrenchable.super.onSneakWrenched(state, context);
if (!(world instanceof ServerLevel))
return InteractionResult.SUCCESS;
world.setBlock(pos, state.setValue(SHAPE, WhistleExtenderShape.SINGLE), 3);
playRemoveSound(world, pos);
return InteractionResult.SUCCESS;
}
protected UseOnContext relocateContext(UseOnContext context, BlockPos target) {
return new UseOnContext(context.getPlayer(), context.getHand(),
new BlockHitResult(context.getClickLocation(), context.getClickedFace(), target, context.isInside()));
}
@Override
public InteractionResult use(BlockState pState, Level pLevel, BlockPos pPos, Player pPlayer, InteractionHand pHand,
BlockHitResult pHit) {
if (pPlayer == null || !AllBlocks.STEAM_WHISTLE.isIn(pPlayer.getItemInHand(pHand)))
return InteractionResult.PASS;
Level level = pLevel;
BlockPos findRoot = findRoot(level, pPos);
BlockState blockState = level.getBlockState(findRoot);
if (blockState.getBlock()instanceof WhistleBlock whistle)
return whistle.use(blockState, pLevel, findRoot, pPlayer, pHand,
new BlockHitResult(pHit.getLocation(), pHit.getDirection(), findRoot, pHit.isInside()));
return InteractionResult.PASS;
}
@Override
public InteractionResult onWrenched(BlockState state, UseOnContext context) {
Level level = context.getLevel();
BlockPos findRoot = findRoot(level, context.getClickedPos());
BlockState blockState = level.getBlockState(findRoot);
if (blockState.getBlock()instanceof WhistleBlock whistle)
return whistle.onWrenched(blockState, relocateContext(context, findRoot));
return IWrenchable.super.onWrenched(state, context);
}
@Override
public ItemStack getCloneItemStack(BlockState state, HitResult target, BlockGetter level, BlockPos pos,
Player player) {
return AllBlocks.STEAM_WHISTLE.asStack();
}
public static BlockPos findRoot(LevelAccessor pLevel, BlockPos pPos) {
BlockPos currentPos = pPos.below();
while (true) {
BlockState blockState = pLevel.getBlockState(currentPos);
if (AllBlocks.STEAM_WHISTLE_EXTENSION.has(blockState)) {
currentPos = currentPos.below();
continue;
}
return currentPos;
}
}
@Override
public boolean canSurvive(BlockState pState, LevelReader pLevel, BlockPos pPos) {
BlockState below = pLevel.getBlockState(pPos.below());
return below.is(this) && below.getValue(SHAPE) != WhistleExtenderShape.SINGLE
|| AllBlocks.STEAM_WHISTLE.has(below);
}
public BlockState updateShape(BlockState pState, Direction pFacing, BlockState pFacingState, LevelAccessor pLevel,
BlockPos pCurrentPos, BlockPos pFacingPos) {
if (pFacing.getAxis() != Axis.Y)
return pState;
if (pFacing == Direction.UP) {
boolean connected = pState.getValue(SHAPE) == WhistleExtenderShape.DOUBLE_CONNECTED;
boolean shouldConnect = pLevel.getBlockState(pCurrentPos.above())
.is(this);
if (!connected && shouldConnect)
return pState.setValue(SHAPE, WhistleExtenderShape.DOUBLE_CONNECTED);
if (connected && !shouldConnect)
return pState.setValue(SHAPE, WhistleExtenderShape.DOUBLE);
return pState;
}
return !pState.canSurvive(pLevel, pCurrentPos) ? Blocks.AIR.defaultBlockState()
: pState.setValue(SIZE, pLevel.getBlockState(pCurrentPos.below())
.getValue(SIZE));
}
@Override
public void onPlace(BlockState pState, Level pLevel, BlockPos pPos, BlockState pOldState, boolean pIsMoving) {
if (pOldState.getBlock() != this || pOldState.getValue(SHAPE) != pState.getValue(SHAPE))
WhistleBlock.queuePitchUpdate(pLevel, findRoot(pLevel, pPos));
}
@Override
public void onRemove(BlockState pState, Level pLevel, BlockPos pPos, BlockState pNewState, boolean pIsMoving) {
if (pNewState.getBlock() != this)
WhistleBlock.queuePitchUpdate(pLevel, findRoot(pLevel, pPos));
}
@Override
protected void createBlockStateDefinition(Builder<Block, BlockState> pBuilder) {
super.createBlockStateDefinition(pBuilder.add(SHAPE, SIZE));
}
@Override
public VoxelShape getShape(BlockState pState, BlockGetter pLevel, BlockPos pPos, CollisionContext pContext) {
WhistleSize size = pState.getValue(SIZE);
switch (pState.getValue(SHAPE)) {
case DOUBLE:
return size == WhistleSize.LARGE ? AllShapes.WHISTLE_EXTENDER_LARGE_DOUBLE
: size == WhistleSize.MEDIUM ? AllShapes.WHISTLE_EXTENDER_MEDIUM_DOUBLE
: AllShapes.WHISTLE_EXTENDER_SMALL_DOUBLE;
case DOUBLE_CONNECTED:
return size == WhistleSize.LARGE ? AllShapes.WHISTLE_EXTENDER_LARGE_DOUBLE_CONNECTED
: size == WhistleSize.MEDIUM ? AllShapes.WHISTLE_EXTENDER_MEDIUM_DOUBLE_CONNECTED
: AllShapes.WHISTLE_EXTENDER_SMALL_DOUBLE_CONNECTED;
case SINGLE:
default:
return size == WhistleSize.LARGE ? AllShapes.WHISTLE_EXTENDER_LARGE
: size == WhistleSize.MEDIUM ? AllShapes.WHISTLE_EXTENDER_MEDIUM : AllShapes.WHISTLE_EXTENDER_SMALL;
}
}
@Override
public boolean hidesNeighborFace(BlockGetter level, BlockPos pos, BlockState state, BlockState neighborState,
Direction dir) {
return AllBlocks.STEAM_WHISTLE.has(neighborState) && dir == Direction.DOWN;
}
}

View file

@ -0,0 +1,42 @@
package com.simibubi.create.content.contraptions.components.steam.whistle;
import com.simibubi.create.Create;
import com.simibubi.create.foundation.data.AssetLookup;
import com.simibubi.create.foundation.data.SpecialBlockStateGen;
import com.tterrag.registrate.providers.DataGenContext;
import com.tterrag.registrate.providers.RegistrateBlockstateProvider;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraftforge.client.model.generators.ModelFile;
public class WhistleGenerator extends SpecialBlockStateGen {
@Override
protected int getXRotation(BlockState state) {
return 0;
}
@Override
protected int getYRotation(BlockState state) {
return horizontalAngle(state.getValue(WhistleBlock.FACING));
}
@Override
public <T extends Block> ModelFile getModel(DataGenContext<Block, T> ctx, RegistrateBlockstateProvider prov,
BlockState state) {
String wall = state.getValue(WhistleBlock.WALL) ? "wall" : "floor";
String size = state.getValue(WhistleBlock.SIZE)
.getSerializedName();
boolean powered = state.getValue(WhistleBlock.POWERED);
ModelFile model = AssetLookup.partialBaseModel(ctx, prov, size, wall);
if (!powered)
return model;
ResourceLocation parentLocation = model.getLocation();
return prov.models()
.withExistingParent(parentLocation.getPath() + "_powered", parentLocation)
.texture("2", Create.asResource("block/copper_redstone_plate_powered"));
}
}

View file

@ -0,0 +1,44 @@
package com.simibubi.create.content.contraptions.components.steam.whistle;
import com.jozufozu.flywheel.core.PartialModel;
import com.mojang.blaze3d.vertex.PoseStack;
import com.simibubi.create.AllBlockPartials;
import com.simibubi.create.content.contraptions.components.steam.whistle.WhistleBlock.WhistleSize;
import com.simibubi.create.foundation.render.CachedBufferer;
import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer;
import com.simibubi.create.foundation.utility.AngleHelper;
import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider;
import net.minecraft.core.Direction;
import net.minecraft.world.level.block.state.BlockState;
public class WhistleRenderer extends SafeTileEntityRenderer<WhistleTileEntity> {
public WhistleRenderer(BlockEntityRendererProvider.Context context) {}
@Override
protected void renderSafe(WhistleTileEntity te, float partialTicks, PoseStack ms, MultiBufferSource buffer,
int light, int overlay) {
BlockState blockState = te.getBlockState();
if (!(blockState.getBlock() instanceof WhistleBlock))
return;
Direction direction = blockState.getValue(WhistleBlock.FACING);
WhistleSize size = blockState.getValue(WhistleBlock.SIZE);
PartialModel mouth = size == WhistleSize.LARGE ? AllBlockPartials.WHISTLE_MOUTH_LARGE
: size == WhistleSize.MEDIUM ? AllBlockPartials.WHISTLE_MOUTH_MEDIUM : AllBlockPartials.WHISTLE_MOUTH_SMALL;
float offset = 0;
CachedBufferer.partial(mouth, blockState)
.centre()
.rotateY(AngleHelper.horizontalAngle(direction))
.unCentre()
.translate(0, offset * 4 / 16f, 0)
.light(light)
.renderInto(ms, buffer.getBuffer(RenderType.solid()));
}
}

View file

@ -0,0 +1,65 @@
package com.simibubi.create.content.contraptions.components.steam.whistle;
import java.util.List;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.content.contraptions.components.steam.whistle.WhistleExtenderBlock.WhistleExtenderShape;
import com.simibubi.create.content.contraptions.goggles.IHaveGoggleInformation;
import com.simibubi.create.foundation.tileEntity.SmartTileEntity;
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
import net.minecraft.core.BlockPos;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.TextComponent;
import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.state.BlockState;
public class WhistleTileEntity extends SmartTileEntity implements IHaveGoggleInformation {
protected int pitch = 0;
public WhistleTileEntity(BlockEntityType<?> type, BlockPos pos, BlockState state) {
super(type, pos, state);
}
@Override
public void addBehaviours(List<TileEntityBehaviour> behaviours) {}
public void updatePitch() {
BlockPos currentPos = worldPosition.above();
int prevPitch = pitch;
for (pitch = 0; pitch <= 24; pitch += 2) {
BlockState blockState = level.getBlockState(currentPos);
if (!AllBlocks.STEAM_WHISTLE_EXTENSION.has(blockState))
break;
if (blockState.getValue(WhistleExtenderBlock.SHAPE) == WhistleExtenderShape.SINGLE) {
pitch++;
break;
}
currentPos = currentPos.above();
}
if (prevPitch == pitch)
return;
notifyUpdate();
}
@Override
protected void write(CompoundTag tag, boolean clientPacket) {
tag.putInt("Pitch", pitch);
super.write(tag, clientPacket);
}
@Override
protected void read(CompoundTag tag, boolean clientPacket) {
pitch = tag.getInt("Pitch");
super.read(tag, clientPacket);
}
@Override
public boolean addToGoggleTooltip(List<Component> tooltip, boolean isPlayerSneaking) {
tooltip.add(new TextComponent(spacing + "Pitch: " + pitch));
return true;
}
}

View file

@ -6,6 +6,7 @@ import java.util.List;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.Create;
import com.simibubi.create.content.contraptions.components.steam.SteamEngineBlock;
import com.simibubi.create.content.contraptions.components.steam.whistle.WhistleBlock;
import com.simibubi.create.content.contraptions.goggles.IHaveGoggleInformation;
import com.simibubi.create.foundation.block.BlockStressValues;
import com.simibubi.create.foundation.fluid.FluidHelper;
@ -48,6 +49,7 @@ public class BoilerData {
public float waterSupply;
public int attachedEngines;
public int attachedWhistles;
public LerpedFloat gauge = LerpedFloat.linear();
@ -142,14 +144,6 @@ public class BoilerData {
Component w = levelComponent("Water ... ", forWaterSupply, minValue, maxValue);
Component s = levelComponent("Size ....... ", forBoilerSize, minValue, maxValue);
double totalSU = getEngineEfficiency(boilerSize) * 16 * Math.max(boilerLevel, attachedEngines)
* BlockStressValues.getCapacity(AllBlocks.STEAM_ENGINE.get());
Component capacity =
new TextComponent(IHaveGoggleInformation.format(totalSU)).append(Lang.translate("generic.unit.stress"))
.withStyle(ChatFormatting.AQUA);
Component engines =
new TextComponent(" via " + attachedEngines + " engine(s)").withStyle(ChatFormatting.DARK_GRAY);
Component indent = new TextComponent(spacing);
Component indent2 = new TextComponent(spacing + " ");
@ -160,6 +154,17 @@ public class BoilerData {
tooltip.add(indent2.plainCopy()
.append(h));
if (attachedEngines == 0)
return true;
double totalSU = getEngineEfficiency(boilerSize) * 16 * Math.max(boilerLevel, attachedEngines)
* BlockStressValues.getCapacity(AllBlocks.STEAM_ENGINE.get());
Component capacity =
new TextComponent(IHaveGoggleInformation.format(totalSU)).append(Lang.translate("generic.unit.stress"))
.withStyle(ChatFormatting.AQUA);
Component engines =
new TextComponent(" via " + attachedEngines + " engine(s)").withStyle(ChatFormatting.DARK_GRAY);
tooltip.add(indent);
tooltip.add(indent.plainCopy()
.append(Lang.translate("tooltip.capacityProvided")
@ -194,8 +199,10 @@ public class BoilerData {
public boolean evaluate(FluidTankTileEntity controller) {
BlockPos controllerPos = controller.getBlockPos();
Level level = controller.getLevel();
int prev = attachedEngines;
int prevEngines = attachedEngines;
int prevWhistles = attachedWhistles;
attachedEngines = 0;
attachedWhistles = 0;
for (int yOffset = 0; yOffset < controller.height; yOffset++) {
for (int xOffset = 0; xOffset < controller.width; xOffset++) {
@ -206,20 +213,21 @@ public class BoilerData {
if (!FluidTankBlock.isTank(blockState))
continue;
for (Direction d : Iterate.directions) {
BlockPos enginePos = pos.relative(d);
BlockState engineState = level.getBlockState(enginePos);
if (!AllBlocks.STEAM_ENGINE.has(engineState))
continue;
if (SteamEngineBlock.getFacing(engineState) != d)
continue;
BlockPos attachedPos = pos.relative(d);
BlockState attachedState = level.getBlockState(attachedPos);
if (AllBlocks.STEAM_ENGINE.has(attachedState) && SteamEngineBlock.getFacing(attachedState) == d)
attachedEngines++;
if (AllBlocks.STEAM_WHISTLE.has(attachedState)
&& WhistleBlock.getAttachedDirection(attachedState)
.getOpposite() == d)
attachedWhistles++;
}
}
}
}
needsHeatLevelUpdate = true;
return prev != attachedEngines;
return prevEngines != attachedEngines || prevWhistles != attachedWhistles;
}
public boolean updateTemperature(FluidTankTileEntity controller) {
@ -251,7 +259,7 @@ public class BoilerData {
}
public boolean isActive() {
return attachedEngines > 0;
return attachedEngines > 0 || attachedWhistles > 0;
}
public void clear() {
@ -268,6 +276,7 @@ public class BoilerData {
nbt.putInt("ActiveHeat", activeHeat);
nbt.putBoolean("PassiveHeat", passiveHeat);
nbt.putInt("Engines", attachedEngines);
nbt.putInt("Whistles", attachedWhistles);
nbt.putBoolean("Update", needsHeatLevelUpdate);
return nbt;
}
@ -277,6 +286,7 @@ public class BoilerData {
activeHeat = nbt.getInt("ActiveHeat");
passiveHeat = nbt.getBoolean("PassiveHeat");
attachedEngines = nbt.getInt("Engines");
attachedWhistles = nbt.getInt("Whistles");
needsHeatLevelUpdate = nbt.getBoolean("Update");
Arrays.fill(supplyOverTime, (int) waterSupply);

View file

@ -330,4 +330,17 @@ public class FluidTankBlock extends Block implements IWrenchable, ITE<FluidTankT
.orElse(0);
}
public static void updateBoilerState(BlockState pState, Level pLevel, BlockPos tankPos) {
BlockState tankState = pLevel.getBlockState(tankPos);
if (!FluidTankBlock.isTank(tankState))
return;
FluidTankTileEntity tankTE = FluidTankConnectivityHandler.anyTankAt(pLevel, tankPos);
if (tankTE == null)
return;
FluidTankTileEntity controllerTE = tankTE.getControllerTE();
if (controllerTE == null)
return;
controllerTE.updateBoilerState();
}
}

View file

@ -13,7 +13,11 @@ import org.apache.commons.lang3.tuple.Pair;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.simibubi.create.Create;
import com.simibubi.create.content.contraptions.base.DirectionalAxisKineticBlock;
import com.simibubi.create.content.contraptions.components.steam.whistle.WhistleBlock.WhistleSize;
import com.simibubi.create.content.contraptions.components.steam.whistle.WhistleExtenderBlock;
import com.simibubi.create.content.contraptions.components.steam.whistle.WhistleExtenderBlock.WhistleExtenderShape;
import com.simibubi.create.content.contraptions.components.structureMovement.chassis.LinearChassisBlock;
import com.simibubi.create.content.contraptions.components.structureMovement.chassis.RadialChassisBlock;
import com.simibubi.create.content.contraptions.components.structureMovement.mounted.CartAssembleRailType;
@ -36,8 +40,10 @@ import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.block.state.properties.BlockStateProperties;
import net.minecraft.world.level.block.state.properties.BooleanProperty;
import net.minecraft.world.level.block.state.properties.RailShape;
import net.minecraftforge.client.model.generators.BlockModelProvider;
import net.minecraftforge.client.model.generators.ConfiguredModel;
import net.minecraftforge.client.model.generators.ModelFile;
import net.minecraftforge.client.model.generators.ModelFile.ExistingModelFile;
import net.minecraftforge.client.model.generators.MultiPartBlockStateBuilder;
public class BlockStateGen {
@ -339,6 +345,41 @@ public class BlockStateGen {
};
}
public static <P extends WhistleExtenderBlock> NonNullBiConsumer<DataGenContext<Block, P>, RegistrateBlockstateProvider> whistleExtender() {
return (c, p) -> {
BlockModelProvider models = p.models();
String basePath = "block/steam_whistle/extension/";
MultiPartBlockStateBuilder builder = p.getMultipartBuilder(c.get());
for (WhistleSize size : WhistleSize.values()) {
String basePathSize = basePath + size.getSerializedName() + "_";
ExistingModelFile topRim = models.getExistingFile(Create.asResource(basePathSize + "top_rim"));
ExistingModelFile single = models.getExistingFile(Create.asResource(basePathSize + "single"));
ExistingModelFile double_ = models.getExistingFile(Create.asResource(basePathSize + "double"));
builder.part()
.modelFile(topRim)
.addModel()
.condition(WhistleExtenderBlock.SIZE, size)
.condition(WhistleExtenderBlock.SHAPE, WhistleExtenderShape.DOUBLE)
.end()
.part()
.modelFile(single)
.addModel()
.condition(WhistleExtenderBlock.SIZE, size)
.condition(WhistleExtenderBlock.SHAPE, WhistleExtenderShape.SINGLE)
.end()
.part()
.modelFile(double_)
.addModel()
.condition(WhistleExtenderBlock.SIZE, size)
.condition(WhistleExtenderBlock.SHAPE, WhistleExtenderShape.DOUBLE,
WhistleExtenderShape.DOUBLE_CONNECTED)
.end();
}
};
}
public static <P extends FluidPipeBlock> NonNullBiConsumer<DataGenContext<Block, P>, RegistrateBlockstateProvider> pipe() {
return (c, p) -> {
String path = "block/" + c.getName();

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,102 @@
{
"credit": "Made with Blockbench",
"textures": {
"0": "create:block/whistle",
"1": "create:block/engine",
"2": "create:block/copper_redstone_plate",
"particle": "create:block/whistle_particle"
},
"elements": [
{
"name": "Base",
"from": [1, 0, 1],
"to": [15, 3, 15],
"faces": {
"north": {"uv": [1, 13, 15, 16], "texture": "#2"},
"east": {"uv": [1, 13, 15, 16], "texture": "#2"},
"south": {"uv": [1, 13, 15, 16], "texture": "#2"},
"west": {"uv": [1, 13, 15, 16], "texture": "#2"},
"up": {"uv": [1, 0, 15, 14], "texture": "#2"},
"down": {"uv": [8.5, 8.5, 15.5, 15.5], "texture": "#1"}
}
},
{
"name": "Pipe Large",
"from": [4, 3, 4],
"to": [12, 12, 12],
"faces": {
"north": {"uv": [2, 2, 6, 6.5], "texture": "#1"},
"east": {"uv": [2, 2, 6, 6.5], "texture": "#1"},
"south": {"uv": [2, 2, 6, 6.5], "texture": "#1"},
"west": {"uv": [2, 2, 6, 6.5], "texture": "#1"},
"up": {"uv": [7, 0.5, 11, 4.5], "texture": "#1"}
}
},
{
"name": "Whistle Large Base",
"from": [3, 4, 3],
"to": [13, 16, 13],
"faces": {
"north": {"uv": [4.75, 0.5, 7.25, 3.5], "texture": "#0"},
"east": {"uv": [8.75, 0.5, 11.25, 3.5], "texture": "#0"},
"south": {"uv": [8.75, 0.5, 11.25, 3.5], "texture": "#0"},
"west": {"uv": [8.75, 0.5, 11.25, 3.5], "texture": "#0"},
"down": {"uv": [13, 13, 15, 15], "texture": "#0"}
}
},
{
"name": "Whistle Large Cap",
"from": [2, 16, 2],
"to": [14, 18, 14],
"faces": {
"north": {"uv": [12.5, 0.75, 15.5, 1.25], "texture": "#0", "cullface": "up"},
"east": {"uv": [12.5, 0.75, 15.5, 1.25], "texture": "#0", "cullface": "up"},
"south": {"uv": [12.5, 0.75, 15.5, 1.25], "texture": "#0", "cullface": "up"},
"west": {"uv": [12.5, 0.75, 15.5, 1.25], "texture": "#0", "cullface": "up"},
"up": {"uv": [0.5, 12.5, 3.5, 15.5], "texture": "#0", "cullface": "up"},
"down": {"uv": [12.5, 12.5, 15.5, 15.5], "texture": "#0", "cullface": "up"}
}
}
],
"groups": [
{
"name": "Bases",
"origin": [0, 0, 0],
"color": 0,
"children": [
{
"name": "Base Flat",
"origin": [0, 0, 0],
"color": 3,
"children": [0, 1]
}
]
},
{
"name": "Whistle Large",
"origin": [8, 8, 8],
"color": 0,
"children": [2]
},
{
"name": "large_top_rim",
"origin": [8, 8, 8],
"color": 0,
"children": [
{
"name": "Whistle Large",
"origin": [8, 8, 8],
"color": 0,
"children": [
{
"name": "Extension",
"origin": [8, 8, 8],
"color": 0,
"children": [3]
}
]
}
]
}
]
}

View file

@ -0,0 +1,104 @@
{
"credit": "Made with Blockbench",
"textures": {
"0": "create:block/whistle",
"1": "create:block/engine",
"2": "create:block/copper_redstone_plate",
"particle": "create:block/whistle_particle"
},
"elements": [
{
"name": "Base",
"from": [1, 1, 13],
"to": [15, 15, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]},
"faces": {
"north": {"uv": [1, 0, 15, 14], "rotation": 180, "texture": "#2"},
"east": {"uv": [1, 13, 15, 16], "rotation": 90, "texture": "#2"},
"south": {"uv": [8.5, 8.5, 15.5, 15.5], "texture": "#1"},
"west": {"uv": [1, 13, 15, 16], "rotation": 270, "texture": "#2"},
"up": {"uv": [1, 13, 15, 16], "texture": "#2"},
"down": {"uv": [1, 13, 15, 16], "rotation": 180, "texture": "#2"}
}
},
{
"name": "Pipe Large",
"from": [4, 5, 4],
"to": [12, 13, 13],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]},
"faces": {
"north": {"uv": [7, 0.5, 11, 4.5], "rotation": 180, "texture": "#1"},
"east": {"uv": [2, 2, 6, 6.5], "rotation": 90, "texture": "#1"},
"west": {"uv": [2, 2, 6, 6.5], "rotation": 270, "texture": "#1"},
"up": {"uv": [2, 2, 6, 6.5], "texture": "#1"},
"down": {"uv": [2, 2, 6, 6.5], "rotation": 180, "texture": "#1"}
}
},
{
"name": "Whistle Large Base",
"from": [3, 4, 3],
"to": [13, 16, 13],
"faces": {
"north": {"uv": [4.75, 0.5, 7.25, 3.5], "texture": "#0"},
"east": {"uv": [8.75, 0.5, 11.25, 3.5], "texture": "#0"},
"south": {"uv": [8.75, 0.5, 11.25, 3.5], "texture": "#0"},
"west": {"uv": [8.75, 0.5, 11.25, 3.5], "texture": "#0"},
"down": {"uv": [13, 13, 15, 15], "texture": "#0"}
}
},
{
"name": "Whistle Large Cap",
"from": [2, 16, 2],
"to": [14, 18, 14],
"faces": {
"north": {"uv": [12.5, 0.75, 15.5, 1.25], "texture": "#0", "cullface": "up"},
"east": {"uv": [12.5, 0.75, 15.5, 1.25], "texture": "#0", "cullface": "up"},
"south": {"uv": [12.5, 0.75, 15.5, 1.25], "texture": "#0", "cullface": "up"},
"west": {"uv": [12.5, 0.75, 15.5, 1.25], "texture": "#0", "cullface": "up"},
"up": {"uv": [0.5, 12.5, 3.5, 15.5], "texture": "#0", "cullface": "up"},
"down": {"uv": [12.5, 12.5, 15.5, 15.5], "texture": "#0", "cullface": "up"}
}
}
],
"groups": [
{
"name": "Bases",
"origin": [0, 0, 0],
"color": 0,
"children": [
{
"name": "Base Wall",
"origin": [0, 0, 0],
"color": 0,
"children": [0, 1]
}
]
},
{
"name": "Whistle Large",
"origin": [8, 8, 8],
"color": 0,
"children": [2]
},
{
"name": "large_top_rim",
"origin": [8, 8, 8],
"color": 0,
"children": [
{
"name": "Whistle Large",
"origin": [8, 8, 8],
"color": 0,
"children": [
{
"name": "Extension",
"origin": [8, 8, 8],
"color": 0,
"children": [3]
}
]
}
]
}
]
}

View file

@ -0,0 +1,95 @@
{
"credit": "Made with Blockbench",
"textures": {
"0": "create:block/whistle",
"1": "create:block/engine",
"2": "create:block/copper_redstone_plate",
"particle": "create:block/whistle_particle"
},
"elements": [
{
"name": "Base",
"from": [1, 0, 1],
"to": [15, 3, 15],
"faces": {
"north": {"uv": [1, 13, 15, 16], "texture": "#2"},
"east": {"uv": [1, 13, 15, 16], "texture": "#2"},
"south": {"uv": [1, 13, 15, 16], "texture": "#2"},
"west": {"uv": [1, 13, 15, 16], "texture": "#2"},
"up": {"uv": [1, 0, 15, 14], "texture": "#2"},
"down": {"uv": [8.5, 8.5, 15.5, 15.5], "texture": "#1"}
}
},
{
"name": "Pipe Medium",
"from": [5, 3, 5],
"to": [11, 11, 11],
"faces": {
"north": {"uv": [2.5, 2.5, 5.5, 6.5], "texture": "#1"},
"east": {"uv": [2.5, 2.5, 5.5, 6.5], "texture": "#1"},
"south": {"uv": [2.5, 2.5, 5.5, 6.5], "texture": "#1"},
"west": {"uv": [2.5, 2.5, 5.5, 6.5], "texture": "#1"},
"up": {"uv": [7.5, 1, 10.5, 4], "texture": "#1"}
}
},
{
"name": "Whistle Medium Base",
"from": [4, 4, 4],
"to": [12, 16, 12],
"faces": {
"north": {"uv": [5, 4.5, 7, 7.5], "texture": "#0"},
"east": {"uv": [9, 4.5, 11, 7.5], "texture": "#0"},
"south": {"uv": [9, 4.5, 11, 7.5], "texture": "#0"},
"west": {"uv": [9, 4.5, 11, 7.5], "texture": "#0"},
"down": {"uv": [13, 13, 15, 15], "texture": "#0"}
}
},
{
"name": "Whistle Medium Cap",
"from": [3, 16, 3],
"to": [13, 18, 13],
"faces": {
"north": {"uv": [12.75, 4.75, 15.25, 5.25], "texture": "#0", "cullface": "up"},
"east": {"uv": [12.75, 4.75, 15.25, 5.25], "texture": "#0", "cullface": "up"},
"south": {"uv": [12.75, 4.75, 15.25, 5.25], "texture": "#0", "cullface": "up"},
"west": {"uv": [12.75, 4.75, 15.25, 5.25], "texture": "#0", "cullface": "up"},
"up": {"uv": [4.75, 12.75, 7.25, 15.25], "texture": "#0", "cullface": "up"},
"down": {"uv": [12.75, 12.75, 15.25, 15.25], "texture": "#0", "cullface": "up"}
}
}
],
"groups": [
{
"name": "Bases",
"origin": [0, 0, 0],
"color": 0,
"children": [
{
"name": "Base Flat",
"origin": [0, 0, 0],
"color": 3,
"children": [0, 1]
}
]
},
{
"name": "Whistle Medium",
"origin": [8, 8, 8],
"color": 0,
"children": [2]
},
{
"name": "medium_top_rim",
"origin": [8, 8, 8],
"color": 0,
"children": [
{
"name": "Whistle Medium",
"origin": [8, 8, 8],
"color": 0,
"children": [3]
}
]
}
]
}

View file

@ -0,0 +1,97 @@
{
"credit": "Made with Blockbench",
"textures": {
"0": "create:block/whistle",
"1": "create:block/engine",
"2": "create:block/copper_redstone_plate",
"particle": "create:block/whistle_particle"
},
"elements": [
{
"name": "Base",
"from": [1, 1, 13],
"to": [15, 15, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]},
"faces": {
"north": {"uv": [1, 0, 15, 14], "rotation": 180, "texture": "#2"},
"east": {"uv": [1, 13, 15, 16], "rotation": 90, "texture": "#2"},
"south": {"uv": [8.5, 8.5, 15.5, 15.5], "texture": "#1"},
"west": {"uv": [1, 13, 15, 16], "rotation": 270, "texture": "#2"},
"up": {"uv": [1, 13, 15, 16], "texture": "#2"},
"down": {"uv": [1, 13, 15, 16], "rotation": 180, "texture": "#2"}
}
},
{
"name": "Pipe Medium",
"from": [5, 5, 5],
"to": [11, 11, 13],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]},
"faces": {
"north": {"uv": [7.5, 1, 10.5, 4], "rotation": 180, "texture": "#1"},
"east": {"uv": [2.5, 2.5, 5.5, 6.5], "rotation": 90, "texture": "#1"},
"west": {"uv": [2.5, 2.5, 5.5, 6.5], "rotation": 270, "texture": "#1"},
"up": {"uv": [2.5, 2.5, 5.5, 6.5], "texture": "#1"},
"down": {"uv": [2.5, 2.5, 5.5, 6.5], "rotation": 180, "texture": "#1"}
}
},
{
"name": "Whistle Medium Base",
"from": [4, 4, 4],
"to": [12, 16, 12],
"faces": {
"north": {"uv": [5, 4.5, 7, 7.5], "texture": "#0"},
"east": {"uv": [9, 4.5, 11, 7.5], "texture": "#0"},
"south": {"uv": [9, 4.5, 11, 7.5], "texture": "#0"},
"west": {"uv": [9, 4.5, 11, 7.5], "texture": "#0"},
"down": {"uv": [13, 13, 15, 15], "texture": "#0"}
}
},
{
"name": "Whistle Medium Cap",
"from": [3, 16, 3],
"to": [13, 18, 13],
"faces": {
"north": {"uv": [12.75, 4.75, 15.25, 5.25], "texture": "#0", "cullface": "up"},
"east": {"uv": [12.75, 4.75, 15.25, 5.25], "texture": "#0", "cullface": "up"},
"south": {"uv": [12.75, 4.75, 15.25, 5.25], "texture": "#0", "cullface": "up"},
"west": {"uv": [12.75, 4.75, 15.25, 5.25], "texture": "#0", "cullface": "up"},
"up": {"uv": [4.75, 12.75, 7.25, 15.25], "texture": "#0", "cullface": "up"},
"down": {"uv": [12.75, 12.75, 15.25, 15.25], "texture": "#0", "cullface": "up"}
}
}
],
"groups": [
{
"name": "Bases",
"origin": [0, 0, 0],
"color": 0,
"children": [
{
"name": "Base Wall",
"origin": [0, 0, 0],
"color": 0,
"children": [0, 1]
}
]
},
{
"name": "Whistle Medium",
"origin": [8, 8, 8],
"color": 0,
"children": [2]
},
{
"name": "medium_top_rim",
"origin": [8, 8, 8],
"color": 0,
"children": [
{
"name": "Whistle Medium",
"origin": [8, 8, 8],
"color": 0,
"children": [3]
}
]
}
]
}

View file

@ -0,0 +1,102 @@
{
"credit": "Made with Blockbench",
"textures": {
"0": "create:block/whistle",
"1": "create:block/engine",
"2": "create:block/copper_redstone_plate",
"particle": "create:block/whistle_particle"
},
"elements": [
{
"name": "Base",
"from": [1, 0, 1],
"to": [15, 3, 15],
"faces": {
"north": {"uv": [1, 13, 15, 16], "texture": "#2"},
"east": {"uv": [1, 13, 15, 16], "texture": "#2"},
"south": {"uv": [1, 13, 15, 16], "texture": "#2"},
"west": {"uv": [1, 13, 15, 16], "texture": "#2"},
"up": {"uv": [1, 0, 15, 14], "texture": "#2"},
"down": {"uv": [8.5, 8.5, 15.5, 15.5], "texture": "#1"}
}
},
{
"name": "Pipe Small",
"from": [6, 3, 6],
"to": [10, 10, 10],
"faces": {
"north": {"uv": [3, 3, 5, 6.5], "texture": "#1"},
"east": {"uv": [3, 3, 5, 6.5], "texture": "#1"},
"south": {"uv": [3, 3, 5, 6.5], "texture": "#1"},
"west": {"uv": [3, 3, 5, 6.5], "texture": "#1"},
"up": {"uv": [8, 1.5, 10, 3.5], "texture": "#1"}
}
},
{
"name": "Whistle Small Base",
"from": [5, 4, 5],
"to": [11, 16, 11],
"faces": {
"north": {"uv": [5.25, 8.5, 6.75, 11.5], "texture": "#0"},
"east": {"uv": [9.25, 8.5, 10.75, 11.5], "texture": "#0"},
"south": {"uv": [9.25, 8.5, 10.75, 11.5], "texture": "#0"},
"west": {"uv": [9.25, 8.5, 10.75, 11.5], "texture": "#0"},
"down": {"uv": [13, 13, 15, 15], "texture": "#0"}
}
},
{
"name": "Whistle Small Cap",
"from": [4, 16, 4],
"to": [12, 18, 12],
"faces": {
"north": {"uv": [13, 8.75, 15, 9.25], "texture": "#0", "cullface": "up"},
"east": {"uv": [13, 8.75, 15, 9.25], "texture": "#0", "cullface": "up"},
"south": {"uv": [13, 8.75, 15, 9.25], "texture": "#0", "cullface": "up"},
"west": {"uv": [13, 8.75, 15, 9.25], "texture": "#0", "cullface": "up"},
"up": {"uv": [9, 13, 11, 15], "texture": "#0", "cullface": "up"},
"down": {"uv": [13, 13, 15, 15], "texture": "#0", "cullface": "up"}
}
}
],
"groups": [
{
"name": "Bases",
"origin": [0, 0, 0],
"color": 0,
"children": [
{
"name": "Base Flat",
"origin": [0, 0, 0],
"color": 3,
"children": [0, 1]
}
]
},
{
"name": "Whistle Small",
"origin": [8, 8, 8],
"color": 0,
"children": [2]
},
{
"name": "small_top_rim",
"origin": [8, 8, 8],
"color": 0,
"children": [
{
"name": "Whistle Small",
"origin": [8, 8, 8],
"color": 0,
"children": [
{
"name": "Extension",
"origin": [8, 8, 8],
"color": 0,
"children": [3]
}
]
}
]
}
]
}

View file

@ -0,0 +1,104 @@
{
"credit": "Made with Blockbench",
"textures": {
"0": "create:block/whistle",
"1": "create:block/engine",
"2": "create:block/copper_redstone_plate",
"particle": "create:block/whistle_particle"
},
"elements": [
{
"name": "Base",
"from": [1, 1, 13],
"to": [15, 15, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]},
"faces": {
"north": {"uv": [1, 0, 15, 14], "rotation": 180, "texture": "#2"},
"east": {"uv": [1, 13, 15, 16], "rotation": 90, "texture": "#2"},
"south": {"uv": [8.5, 8.5, 15.5, 15.5], "texture": "#1"},
"west": {"uv": [1, 13, 15, 16], "rotation": 270, "texture": "#2"},
"up": {"uv": [1, 13, 15, 16], "texture": "#2"},
"down": {"uv": [1, 13, 15, 16], "rotation": 180, "texture": "#2"}
}
},
{
"name": "Pipe Small",
"from": [6, 6, 6],
"to": [10, 10, 13],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]},
"faces": {
"north": {"uv": [8, 1.5, 10, 3.5], "rotation": 180, "texture": "#1"},
"east": {"uv": [3, 3, 5, 6.5], "rotation": 90, "texture": "#1"},
"west": {"uv": [3, 3, 5, 6.5], "rotation": 270, "texture": "#1"},
"up": {"uv": [3, 3, 5, 6.5], "texture": "#1"},
"down": {"uv": [3, 3, 5, 6.5], "rotation": 180, "texture": "#1"}
}
},
{
"name": "Whistle Small Base",
"from": [5, 4, 5],
"to": [11, 16, 11],
"faces": {
"north": {"uv": [5.25, 8.5, 6.75, 11.5], "texture": "#0"},
"east": {"uv": [9.25, 8.5, 10.75, 11.5], "texture": "#0"},
"south": {"uv": [9.25, 8.5, 10.75, 11.5], "texture": "#0"},
"west": {"uv": [9.25, 8.5, 10.75, 11.5], "texture": "#0"},
"down": {"uv": [13, 13, 15, 15], "texture": "#0"}
}
},
{
"name": "Whistle Small Cap",
"from": [4, 16, 4],
"to": [12, 18, 12],
"faces": {
"north": {"uv": [13, 8.75, 15, 9.25], "texture": "#0", "cullface": "up"},
"east": {"uv": [13, 8.75, 15, 9.25], "texture": "#0", "cullface": "up"},
"south": {"uv": [13, 8.75, 15, 9.25], "texture": "#0", "cullface": "up"},
"west": {"uv": [13, 8.75, 15, 9.25], "texture": "#0", "cullface": "up"},
"up": {"uv": [9, 13, 11, 15], "texture": "#0", "cullface": "up"},
"down": {"uv": [13, 13, 15, 15], "texture": "#0", "cullface": "up"}
}
}
],
"groups": [
{
"name": "Bases",
"origin": [0, 0, 0],
"color": 0,
"children": [
{
"name": "Base Wall",
"origin": [0, 0, 0],
"color": 0,
"children": [0, 1]
}
]
},
{
"name": "Whistle Small",
"origin": [8, 8, 8],
"color": 0,
"children": [2]
},
{
"name": "small_top_rim",
"origin": [8, 8, 8],
"color": 0,
"children": [
{
"name": "Whistle Small",
"origin": [8, 8, 8],
"color": 0,
"children": [
{
"name": "Extension",
"origin": [8, 8, 8],
"color": 0,
"children": [3]
}
]
}
]
}
]
}

View file

@ -0,0 +1,31 @@
{
"credit": "Made with Blockbench",
"textures": {
"0": "create:block/whistle",
"particle": "create:block/whistle_particle"
},
"elements": [
{
"name": "Whistle large Cap",
"from": [2, 0, 2],
"to": [14, 2, 14],
"faces": {
"north": {"uv": [12.5, 0.75, 15.5, 1.25], "texture": "#0"},
"east": {"uv": [12.5, 0.75, 15.5, 1.25], "texture": "#0"},
"south": {"uv": [12.5, 0.75, 15.5, 1.25], "texture": "#0"},
"west": {"uv": [12.5, 0.75, 15.5, 1.25], "texture": "#0"},
"up": {"uv": [0.5, 12.5, 3.5, 15.5], "texture": "#0"},
"down": {"uv": [12.5, 12.5, 15.5, 15.5], "texture": "#0"}
}
}
],
"display": {},
"groups": [
{
"name": "Whistle Large",
"origin": [8, 8, 8],
"color": 0,
"children": [0]
}
]
}

View file

@ -0,0 +1,47 @@
{
"credit": "Made with Blockbench",
"textures": {
"0": "create:block/whistle",
"particle": "create:block/whistle_particle"
},
"elements": [
{
"name": "Whistle large Extension",
"from": [3, 0, 3],
"to": [13, 8, 13],
"faces": {
"north": {"uv": [12.75, 1.5, 15.25, 3.5], "texture": "#0"},
"east": {"uv": [12.75, 1.5, 15.25, 3.5], "texture": "#0"},
"south": {"uv": [12.75, 1.5, 15.25, 3.5], "texture": "#0"},
"west": {"uv": [12.75, 1.5, 15.25, 3.5], "texture": "#0"}
}
},
{
"name": "Whistle large Extension",
"from": [3, 8, 3],
"to": [13, 16, 13],
"faces": {
"north": {"uv": [12.75, 1.5, 15.25, 3.5], "texture": "#0"},
"east": {"uv": [12.75, 1.5, 15.25, 3.5], "texture": "#0"},
"south": {"uv": [12.75, 1.5, 15.25, 3.5], "texture": "#0"},
"west": {"uv": [12.75, 1.5, 15.25, 3.5], "texture": "#0"}
}
}
],
"display": {},
"groups": [
{
"name": "Whistle Large",
"origin": [8, 8, 8],
"color": 0,
"children": [
{
"name": "Extension",
"origin": [8, 8, 8],
"color": 0,
"children": [0, 1]
}
]
}
]
}

View file

@ -0,0 +1,49 @@
{
"credit": "Made with Blockbench",
"textures": {
"0": "create:block/whistle",
"particle": "create:block/whistle_particle"
},
"elements": [
{
"name": "Whistle Large Cap",
"from": [2, 8, 2],
"to": [14, 10, 14],
"faces": {
"north": {"uv": [12.5, 0.75, 15.5, 1.25], "texture": "#0"},
"east": {"uv": [12.5, 0.75, 15.5, 1.25], "texture": "#0"},
"south": {"uv": [12.5, 0.75, 15.5, 1.25], "texture": "#0"},
"west": {"uv": [12.5, 0.75, 15.5, 1.25], "texture": "#0"},
"up": {"uv": [0.5, 12.5, 3.5, 15.5], "texture": "#0"},
"down": {"uv": [12.5, 12.5, 15.5, 15.5], "texture": "#0"}
}
},
{
"name": "Whistle large Extension",
"from": [3, 0, 3],
"to": [13, 8, 13],
"faces": {
"north": {"uv": [12.75, 1.5, 15.25, 3.5], "texture": "#0"},
"east": {"uv": [12.75, 1.5, 15.25, 3.5], "texture": "#0"},
"south": {"uv": [12.75, 1.5, 15.25, 3.5], "texture": "#0"},
"west": {"uv": [12.75, 1.5, 15.25, 3.5], "texture": "#0"}
}
}
],
"display": {},
"groups": [
{
"name": "Whistle Large",
"origin": [8, 8, 8],
"color": 0,
"children": [
{
"name": "Extension",
"origin": [8, 8, 8],
"color": 0,
"children": [0, 1]
}
]
}
]
}

View file

@ -0,0 +1,37 @@
{
"credit": "Made with Blockbench",
"textures": {
"0": "create:block/whistle",
"particle": "create:block/whistle_particle"
},
"elements": [
{
"name": "Whistle Large Cap",
"from": [2, 16, 2],
"to": [14, 18, 14],
"faces": {
"north": {"uv": [12.5, 0.75, 15.5, 1.25], "texture": "#0", "cullface": "up"},
"east": {"uv": [12.5, 0.75, 15.5, 1.25], "texture": "#0", "cullface": "up"},
"south": {"uv": [12.5, 0.75, 15.5, 1.25], "texture": "#0", "cullface": "up"},
"west": {"uv": [12.5, 0.75, 15.5, 1.25], "texture": "#0", "cullface": "up"},
"up": {"uv": [0.5, 12.5, 3.5, 15.5], "texture": "#0", "cullface": "up"},
"down": {"uv": [12.5, 12.5, 15.5, 15.5], "texture": "#0", "cullface": "up"}
}
}
],
"groups": [
{
"name": "Whistle Large",
"origin": [8, 8, 8],
"color": 0,
"children": [
{
"name": "Extension",
"origin": [8, 8, 8],
"color": 0,
"children": [0]
}
]
}
]
}

View file

@ -0,0 +1,31 @@
{
"credit": "Made with Blockbench",
"textures": {
"0": "create:block/whistle",
"particle": "create:block/whistle_particle"
},
"elements": [
{
"name": "Whistle Medium Cap",
"from": [3, 0, 3],
"to": [13, 2, 13],
"faces": {
"north": {"uv": [12.75, 4.75, 15.25, 5.25], "texture": "#0"},
"east": {"uv": [12.75, 4.75, 15.25, 5.25], "texture": "#0"},
"south": {"uv": [12.75, 4.75, 15.25, 5.25], "texture": "#0"},
"west": {"uv": [12.75, 4.75, 15.25, 5.25], "texture": "#0"},
"up": {"uv": [4.75, 12.75, 7.25, 15.25], "texture": "#0"},
"down": {"uv": [12.75, 12.75, 15.25, 15.25], "texture": "#0"}
}
}
],
"display": {},
"groups": [
{
"name": "Whistle Medium",
"origin": [8, 8, 8],
"color": 0,
"children": [0]
}
]
}

View file

@ -0,0 +1,47 @@
{
"credit": "Made with Blockbench",
"textures": {
"0": "create:block/whistle",
"particle": "create:block/whistle_particle"
},
"elements": [
{
"name": "Whistle Medium Extension",
"from": [4, 0, 4],
"to": [12, 8, 12],
"faces": {
"north": {"uv": [13, 5.5, 15, 7.5], "texture": "#0"},
"east": {"uv": [13, 5.5, 15, 7.5], "texture": "#0"},
"south": {"uv": [13, 5.5, 15, 7.5], "texture": "#0"},
"west": {"uv": [13, 5.5, 15, 7.5], "texture": "#0"}
}
},
{
"name": "Whistle Medium Extension",
"from": [4, 8, 4],
"to": [12, 16, 12],
"faces": {
"north": {"uv": [13, 5.5, 15, 7.5], "texture": "#0"},
"east": {"uv": [13, 5.5, 15, 7.5], "texture": "#0"},
"south": {"uv": [13, 5.5, 15, 7.5], "texture": "#0"},
"west": {"uv": [13, 5.5, 15, 7.5], "texture": "#0"}
}
}
],
"display": {},
"groups": [
{
"name": "Whistle Medium",
"origin": [8, 8, 8],
"color": 0,
"children": [
{
"name": "Extension",
"origin": [8, 8, 8],
"color": 0,
"children": [0, 1]
}
]
}
]
}

View file

@ -0,0 +1,49 @@
{
"credit": "Made with Blockbench",
"textures": {
"0": "create:block/whistle",
"particle": "create:block/whistle_particle"
},
"elements": [
{
"name": "Whistle Medium Cap",
"from": [3, 8, 3],
"to": [13, 10, 13],
"faces": {
"north": {"uv": [12.75, 4.75, 15.25, 5.25], "texture": "#0"},
"east": {"uv": [12.75, 4.75, 15.25, 5.25], "texture": "#0"},
"south": {"uv": [12.75, 4.75, 15.25, 5.25], "texture": "#0"},
"west": {"uv": [12.75, 4.75, 15.25, 5.25], "texture": "#0"},
"up": {"uv": [4.75, 12.75, 7.25, 15.25], "texture": "#0"},
"down": {"uv": [12.75, 12.75, 15.25, 15.25], "texture": "#0"}
}
},
{
"name": "Whistle Medium Extension",
"from": [4, 0, 4],
"to": [12, 8, 12],
"faces": {
"north": {"uv": [13, 5.5, 15, 7.5], "texture": "#0"},
"east": {"uv": [13, 5.5, 15, 7.5], "texture": "#0"},
"south": {"uv": [13, 5.5, 15, 7.5], "texture": "#0"},
"west": {"uv": [13, 5.5, 15, 7.5], "texture": "#0"}
}
}
],
"display": {},
"groups": [
{
"name": "Whistle Medium",
"origin": [8, 8, 8],
"color": 0,
"children": [
{
"name": "Extension",
"origin": [8, 8, 8],
"color": 0,
"children": [0, 1]
}
]
}
]
}

View file

@ -0,0 +1,30 @@
{
"credit": "Made with Blockbench",
"textures": {
"0": "create:block/whistle",
"particle": "create:block/whistle_particle"
},
"elements": [
{
"name": "Whistle Medium Cap",
"from": [3, 16, 3],
"to": [13, 18, 13],
"faces": {
"north": {"uv": [12.75, 4.75, 15.25, 5.25], "texture": "#0", "cullface": "up"},
"east": {"uv": [12.75, 4.75, 15.25, 5.25], "texture": "#0", "cullface": "up"},
"south": {"uv": [12.75, 4.75, 15.25, 5.25], "texture": "#0", "cullface": "up"},
"west": {"uv": [12.75, 4.75, 15.25, 5.25], "texture": "#0", "cullface": "up"},
"up": {"uv": [4.75, 12.75, 7.25, 15.25], "texture": "#0", "cullface": "up"},
"down": {"uv": [12.75, 12.75, 15.25, 15.25], "texture": "#0", "cullface": "up"}
}
}
],
"groups": [
{
"name": "Whistle Medium",
"origin": [8, 8, 8],
"color": 0,
"children": [0]
}
]
}

View file

@ -0,0 +1,31 @@
{
"credit": "Made with Blockbench",
"textures": {
"0": "create:block/whistle",
"particle": "create:block/whistle_particle"
},
"elements": [
{
"name": "Whistle Small Cap",
"from": [4, 0, 4],
"to": [12, 2, 12],
"faces": {
"north": {"uv": [13, 8.75, 15, 9.25], "texture": "#0"},
"east": {"uv": [13, 8.75, 15, 9.25], "texture": "#0"},
"south": {"uv": [13, 8.75, 15, 9.25], "texture": "#0"},
"west": {"uv": [13, 8.75, 15, 9.25], "texture": "#0"},
"up": {"uv": [9, 13, 11, 15], "texture": "#0"},
"down": {"uv": [13, 13, 15, 15], "texture": "#0"}
}
}
],
"display": {},
"groups": [
{
"name": "Whistle Small",
"origin": [8, 8, 8],
"color": 0,
"children": [0]
}
]
}

View file

@ -0,0 +1,47 @@
{
"credit": "Made with Blockbench",
"textures": {
"0": "create:block/whistle",
"particle": "create:block/whistle_particle"
},
"elements": [
{
"name": "Whistle Small Extension",
"from": [5, 0, 5],
"to": [11, 8, 11],
"faces": {
"north": {"uv": [13.25, 9.5, 14.75, 11.5], "texture": "#0"},
"east": {"uv": [13.25, 9.5, 14.75, 11.5], "texture": "#0"},
"south": {"uv": [13.25, 9.5, 14.75, 11.5], "texture": "#0"},
"west": {"uv": [13.25, 9.5, 14.75, 11.5], "texture": "#0"}
}
},
{
"name": "Whistle Small Extension",
"from": [5, 8, 5],
"to": [11, 16, 11],
"faces": {
"north": {"uv": [13.25, 9.5, 14.75, 11.5], "texture": "#0"},
"east": {"uv": [13.25, 9.5, 14.75, 11.5], "texture": "#0"},
"south": {"uv": [13.25, 9.5, 14.75, 11.5], "texture": "#0"},
"west": {"uv": [13.25, 9.5, 14.75, 11.5], "texture": "#0"}
}
}
],
"display": {},
"groups": [
{
"name": "Whistle Small",
"origin": [8, 8, 8],
"color": 0,
"children": [
{
"name": "Extension",
"origin": [8, 8, 8],
"color": 0,
"children": [0, 1]
}
]
}
]
}

View file

@ -0,0 +1,49 @@
{
"credit": "Made with Blockbench",
"textures": {
"0": "create:block/whistle",
"particle": "create:block/whistle_particle"
},
"elements": [
{
"name": "Whistle Small Cap",
"from": [4, 8, 4],
"to": [12, 10, 12],
"faces": {
"north": {"uv": [13, 8.75, 15, 9.25], "texture": "#0"},
"east": {"uv": [13, 8.75, 15, 9.25], "texture": "#0"},
"south": {"uv": [13, 8.75, 15, 9.25], "texture": "#0"},
"west": {"uv": [13, 8.75, 15, 9.25], "texture": "#0"},
"up": {"uv": [9, 13, 11, 15], "texture": "#0"},
"down": {"uv": [13, 13, 15, 15], "texture": "#0"}
}
},
{
"name": "Whistle Small Extension",
"from": [5, 0, 5],
"to": [11, 8, 11],
"faces": {
"north": {"uv": [13.25, 9.5, 14.75, 11.5], "texture": "#0"},
"east": {"uv": [13.25, 9.5, 14.75, 11.5], "texture": "#0"},
"south": {"uv": [13.25, 9.5, 14.75, 11.5], "texture": "#0"},
"west": {"uv": [13.25, 9.5, 14.75, 11.5], "texture": "#0"}
}
}
],
"display": {},
"groups": [
{
"name": "Whistle Small",
"origin": [8, 8, 8],
"color": 0,
"children": [
{
"name": "Extension",
"origin": [8, 8, 8],
"color": 0,
"children": [0, 1]
}
]
}
]
}

View file

@ -0,0 +1,37 @@
{
"credit": "Made with Blockbench",
"textures": {
"0": "create:block/whistle",
"particle": "create:block/whistle_particle"
},
"elements": [
{
"name": "Whistle Small Cap",
"from": [4, 16, 4],
"to": [12, 18, 12],
"faces": {
"north": {"uv": [13, 8.75, 15, 9.25], "texture": "#0", "cullface": "up"},
"east": {"uv": [13, 8.75, 15, 9.25], "texture": "#0", "cullface": "up"},
"south": {"uv": [13, 8.75, 15, 9.25], "texture": "#0", "cullface": "up"},
"west": {"uv": [13, 8.75, 15, 9.25], "texture": "#0", "cullface": "up"},
"up": {"uv": [9, 13, 11, 15], "texture": "#0", "cullface": "up"},
"down": {"uv": [13, 13, 15, 15], "texture": "#0", "cullface": "up"}
}
}
],
"groups": [
{
"name": "Whistle Small",
"origin": [8, 8, 8],
"color": 0,
"children": [
{
"name": "Extension",
"origin": [8, 8, 8],
"color": 0,
"children": [0]
}
]
}
]
}

View file

@ -0,0 +1,178 @@
{
"credit": "Made with Blockbench",
"textures": {
"0": "create:block/whistle",
"1": "create:block/engine",
"2": "create:block/copper_redstone_plate",
"particle": "create:block/whistle_particle"
},
"elements": [
{
"name": "Base",
"from": [1, 0, 1],
"to": [15, 3, 15],
"faces": {
"north": {"uv": [1, 13, 15, 16], "texture": "#2"},
"east": {"uv": [1, 13, 15, 16], "texture": "#2"},
"south": {"uv": [1, 13, 15, 16], "texture": "#2"},
"west": {"uv": [1, 13, 15, 16], "texture": "#2"},
"up": {"uv": [1, 0, 15, 14], "texture": "#2"},
"down": {"uv": [8.5, 8.5, 15.5, 15.5], "texture": "#1"}
}
},
{
"name": "Pipe Medium",
"from": [5, 3, 5],
"to": [11, 11, 11],
"faces": {
"north": {"uv": [2.5, 2.5, 5.5, 6.5], "texture": "#1"},
"east": {"uv": [2.5, 2.5, 5.5, 6.5], "texture": "#1"},
"south": {"uv": [2.5, 2.5, 5.5, 6.5], "texture": "#1"},
"west": {"uv": [2.5, 2.5, 5.5, 6.5], "texture": "#1"},
"up": {"uv": [7.5, 1, 10.5, 4], "texture": "#1"}
}
},
{
"name": "Whistle Medium Base",
"from": [4, 4, 4],
"to": [12, 16, 12],
"faces": {
"north": {"uv": [5, 4.5, 7, 7.5], "texture": "#0"},
"east": {"uv": [9, 4.5, 11, 7.5], "texture": "#0"},
"south": {"uv": [9, 4.5, 11, 7.5], "texture": "#0"},
"west": {"uv": [9, 4.5, 11, 7.5], "texture": "#0"},
"down": {"uv": [13, 13, 15, 15], "texture": "#0"}
}
},
{
"name": "Whistle Medium Cap",
"from": [3, 16, 3],
"to": [13, 18, 13],
"faces": {
"north": {"uv": [12.75, 4.75, 15.25, 5.25], "texture": "#0"},
"east": {"uv": [12.75, 4.75, 15.25, 5.25], "texture": "#0"},
"south": {"uv": [12.75, 4.75, 15.25, 5.25], "texture": "#0"},
"west": {"uv": [12.75, 4.75, 15.25, 5.25], "texture": "#0"},
"up": {"uv": [4.75, 12.75, 7.25, 15.25], "texture": "#0"},
"down": {"uv": [12.75, 12.75, 15.25, 15.25], "texture": "#0"}
}
},
{
"name": "Centre",
"from": [6, 7, 3.5],
"to": [10, 12, 5],
"faces": {
"north": {"uv": [1.5, 4, 2.5, 5.25], "texture": "#0"},
"up": {"uv": [13.5, 14.5, 14.5, 15], "rotation": 180, "texture": "#0"},
"down": {"uv": [5, 5.5, 5.5, 6], "texture": "#0"}
}
},
{
"name": "Back",
"from": [6, 5, 5],
"to": [10, 12, 12.5],
"faces": {
"north": {"uv": [5, 5.5, 5.5, 6], "texture": "#0"},
"south": {"uv": [1.5, 6, 2.5, 7.75], "texture": "#0"},
"up": {"uv": [13.5, 12.75, 14.5, 14.75], "rotation": 180, "texture": "#0"},
"down": {"uv": [5, 5.5, 5.5, 6], "texture": "#0"}
}
},
{
"name": "Left",
"from": [3.5, 5, 3.5],
"to": [6, 12, 12.5],
"faces": {
"north": {"uv": [2.5, 4, 3, 5.75], "texture": "#0"},
"east": {"uv": [5, 5.5, 5.5, 6], "texture": "#0"},
"south": {"uv": [1, 6, 1.5, 7.75], "texture": "#0"},
"west": {"uv": [1, 6, 3, 7.75], "texture": "#0"},
"up": {"uv": [14.5, 13, 15, 15], "rotation": 180, "texture": "#0"},
"down": {"uv": [5, 5.5, 5.5, 6], "texture": "#0"}
}
},
{
"name": "Right",
"from": [10, 5, 3.5],
"to": [12.5, 12, 12.5],
"faces": {
"north": {"uv": [1, 4, 1.5, 5.75], "texture": "#0"},
"east": {"uv": [1, 6, 3, 7.75], "texture": "#0"},
"south": {"uv": [2.5, 6, 3, 7.75], "texture": "#0"},
"west": {"uv": [5.5, 1.5, 5, 2], "texture": "#0"},
"up": {"uv": [13, 13, 13.5, 15], "rotation": 180, "texture": "#0"},
"down": {"uv": [5, 1.5, 5.5, 2], "texture": "#0"}
}
}
],
"display": {
"thirdperson_righthand": {
"rotation": [75, 45, 0],
"translation": [0, 2.5, 0],
"scale": [0.375, 0.375, 0.375]
},
"thirdperson_lefthand": {
"rotation": [75, 45, 0],
"translation": [0, 2.5, 0],
"scale": [0.375, 0.375, 0.375]
},
"firstperson_righthand": {
"rotation": [0, 45, 0],
"scale": [0.4, 0.4, 0.4]
},
"firstperson_lefthand": {
"rotation": [0, 225, 0],
"scale": [0.4, 0.4, 0.4]
},
"ground": {
"translation": [0, 3, 0],
"scale": [0.25, 0.25, 0.25]
},
"gui": {
"rotation": [30, 225, 0],
"scale": [0.625, 0.625, 0.625]
},
"head": {
"translation": [0, 13, 0]
},
"fixed": {
"scale": [0.5, 0.5, 0.5]
}
},
"groups": [
{
"name": "Bases",
"origin": [0, 0, 0],
"color": 0,
"children": [
{
"name": "Base Flat",
"origin": [0, 0, 0],
"color": 3,
"children": [0, 1]
}
]
},
{
"name": "Whistle Medium",
"origin": [8, 8, 8],
"color": 0,
"children": [
2,
3,
{
"name": "Whistle Medium Mouth",
"origin": [8, 8, 8],
"color": 0,
"children": [4, 5, 6, 7]
},
{
"name": "Extension",
"origin": [8, 8, 8],
"color": 0,
"children": []
}
]
}
]
}

View file

@ -0,0 +1,71 @@
{
"credit": "Made with Blockbench",
"textures": {
"0": "create:block/whistle",
"particle": "create:block/whistle"
},
"elements": [
{
"name": "Centre",
"from": [6, 7, 2.5],
"to": [10, 12, 5],
"faces": {
"north": {"uv": [1.5, 0, 2.5, 1.25], "texture": "#0"},
"up": {"uv": [13.5, 14.5, 14.5, 15], "rotation": 180, "texture": "#0"},
"down": {"uv": [5, 5.5, 5.5, 6], "texture": "#0"}
}
},
{
"name": "Back",
"from": [6, 5, 5],
"to": [10, 12, 13.5],
"faces": {
"north": {"uv": [5, 5.5, 5.5, 6], "texture": "#0"},
"south": {"uv": [1.5, 2, 2.5, 3.75], "texture": "#0"},
"up": {"uv": [13.5, 12.75, 14.5, 14.75], "rotation": 180, "texture": "#0"},
"down": {"uv": [5, 5.5, 5.5, 6], "texture": "#0"}
}
},
{
"name": "Left",
"from": [2.5, 5, 2.5],
"to": [6, 12, 13.5],
"faces": {
"north": {"uv": [2.5, 0, 3.25, 1.75], "texture": "#0"},
"east": {"uv": [5, 5.5, 5.5, 6], "texture": "#0"},
"south": {"uv": [0.75, 2, 1.5, 3.75], "texture": "#0"},
"west": {"uv": [0.75, 2, 3.25, 3.75], "texture": "#0"},
"up": {"uv": [14.5, 12.75, 15.25, 15.25], "rotation": 180, "texture": "#0"},
"down": {"uv": [5, 5.5, 5.5, 6], "texture": "#0"}
}
},
{
"name": "Right",
"from": [10, 5, 2.5],
"to": [13.5, 12, 13.5],
"faces": {
"north": {"uv": [0.75, 0, 1.5, 1.75], "texture": "#0"},
"east": {"uv": [0.75, 2, 3.25, 3.75], "texture": "#0"},
"south": {"uv": [2.5, 2, 3.25, 3.75], "texture": "#0"},
"west": {"uv": [5.5, 1.5, 5, 2], "texture": "#0"},
"up": {"uv": [12.75, 12.75, 13.5, 15.25], "rotation": 180, "texture": "#0"},
"down": {"uv": [5, 1.5, 5.5, 2], "texture": "#0"}
}
}
],
"groups": [
{
"name": "Whistle Large",
"origin": [8, 8, 8],
"color": 0,
"children": [
{
"name": "Whistle Large Mouth",
"origin": [8, 8, 8],
"color": 0,
"children": [0, 1, 2, 3]
}
]
}
]
}

View file

@ -0,0 +1,71 @@
{
"credit": "Made with Blockbench",
"textures": {
"0": "create:block/whistle",
"particle": "create:block/whistle"
},
"elements": [
{
"name": "Centre",
"from": [6, 7, 3.5],
"to": [10, 12, 5],
"faces": {
"north": {"uv": [1.5, 4, 2.5, 5.25], "texture": "#0"},
"up": {"uv": [13.5, 14.5, 14.5, 15], "rotation": 180, "texture": "#0"},
"down": {"uv": [5, 5.5, 5.5, 6], "texture": "#0"}
}
},
{
"name": "Back",
"from": [6, 5, 5],
"to": [10, 12, 12.5],
"faces": {
"north": {"uv": [5, 5.5, 5.5, 6], "texture": "#0"},
"south": {"uv": [1.5, 6, 2.5, 7.75], "texture": "#0"},
"up": {"uv": [13.5, 12.75, 14.5, 14.75], "rotation": 180, "texture": "#0"},
"down": {"uv": [5, 5.5, 5.5, 6], "texture": "#0"}
}
},
{
"name": "Left",
"from": [3.5, 5, 3.5],
"to": [6, 12, 12.5],
"faces": {
"north": {"uv": [2.5, 4, 3, 5.75], "texture": "#0"},
"east": {"uv": [5, 5.5, 5.5, 6], "texture": "#0"},
"south": {"uv": [1, 6, 1.5, 7.75], "texture": "#0"},
"west": {"uv": [1, 6, 3, 7.75], "texture": "#0"},
"up": {"uv": [14.5, 13, 15, 15], "rotation": 180, "texture": "#0"},
"down": {"uv": [5, 5.5, 5.5, 6], "texture": "#0"}
}
},
{
"name": "Right",
"from": [10, 5, 3.5],
"to": [12.5, 12, 12.5],
"faces": {
"north": {"uv": [1, 4, 1.5, 5.75], "texture": "#0"},
"east": {"uv": [1, 6, 3, 7.75], "texture": "#0"},
"south": {"uv": [2.5, 6, 3, 7.75], "texture": "#0"},
"west": {"uv": [5.5, 1.5, 5, 2], "texture": "#0"},
"up": {"uv": [13, 13, 13.5, 15], "rotation": 180, "texture": "#0"},
"down": {"uv": [5, 1.5, 5.5, 2], "texture": "#0"}
}
}
],
"groups": [
{
"name": "Whistle Medium",
"origin": [8, 8, 8],
"color": 0,
"children": [
{
"name": "Whistle Medium Mouth",
"origin": [8, 8, 8],
"color": 0,
"children": [0, 1, 2, 3]
}
]
}
]
}

View file

@ -0,0 +1,71 @@
{
"credit": "Made with Blockbench",
"textures": {
"0": "create:block/whistle",
"particle": "create:block/whistle"
},
"elements": [
{
"name": "Centre",
"from": [7, 6, 4.5],
"to": [9, 12, 5],
"faces": {
"north": {"uv": [1.75, 8, 2.25, 9.5], "texture": "#0"},
"up": {"uv": [13.75, 14.5, 14.25, 15], "rotation": 180, "texture": "#0"},
"down": {"uv": [5, 5.5, 5.5, 6], "texture": "#0"}
}
},
{
"name": "Back",
"from": [7, 5, 6],
"to": [9, 12, 11.5],
"faces": {
"north": {"uv": [5, 5.5, 5.5, 6], "texture": "#0"},
"south": {"uv": [1.75, 10, 2.25, 11.75], "texture": "#0"},
"up": {"uv": [13.75, 12.75, 14.25, 14.75], "rotation": 180, "texture": "#0"},
"down": {"uv": [5, 5.5, 5.5, 6], "texture": "#0"}
}
},
{
"name": "Left",
"from": [4.5, 5, 4.5],
"to": [7, 12, 11.5],
"faces": {
"north": {"uv": [2.25, 8, 2.75, 9.75], "texture": "#0"},
"east": {"uv": [5, 5.5, 5.5, 6], "texture": "#0"},
"south": {"uv": [1.25, 10, 1.75, 11.75], "texture": "#0"},
"west": {"uv": [1.25, 10, 2.75, 11.75], "texture": "#0"},
"up": {"uv": [14.25, 13.25, 14.75, 14.75], "rotation": 180, "texture": "#0"},
"down": {"uv": [5, 5.5, 5.5, 6], "texture": "#0"}
}
},
{
"name": "Right",
"from": [9, 5, 4.5],
"to": [11.5, 12, 11.5],
"faces": {
"north": {"uv": [1.25, 8, 1.75, 9.75], "texture": "#0"},
"east": {"uv": [1.25, 10, 2.75, 11.75], "texture": "#0"},
"south": {"uv": [2.25, 10, 2.75, 11.75], "texture": "#0"},
"west": {"uv": [5.5, 1.5, 5, 2], "texture": "#0"},
"up": {"uv": [13.25, 13.25, 13.75, 14.75], "rotation": 180, "texture": "#0"},
"down": {"uv": [5, 1.5, 5.5, 2], "texture": "#0"}
}
}
],
"groups": [
{
"name": "Whistle Small",
"origin": [8, 8, 8],
"color": 0,
"children": [
{
"name": "Whistle Small Mouth",
"origin": [8, 8, 8],
"color": 0,
"children": [0, 1, 2, 3]
}
]
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 634 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 379 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 255 B