From c1c6e5e04677387c06c27ccdad20a9dba4ccde71 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Wed, 3 Mar 2021 05:21:58 +0100 Subject: [PATCH] Controlled attachment - Added the Sticker, a redstone-driven block attachment component - Fixed lighting of TileEntities lowered by a pulley --- src/generated/resources/.cache/cache | 35 ++-- .../create/blockstates/radial_chassis.json | 72 ++++---- .../assets/create/blockstates/sticker.json | 108 ++++++++++++ .../resources/assets/create/lang/en_ud.json | 1 + .../resources/assets/create/lang/en_us.json | 1 + .../assets/create/lang/unfinished/de_de.json | 3 +- .../assets/create/lang/unfinished/es_es.json | 3 +- .../assets/create/lang/unfinished/es_mx.json | 3 +- .../assets/create/lang/unfinished/fr_fr.json | 3 +- .../assets/create/lang/unfinished/it_it.json | 3 +- .../assets/create/lang/unfinished/ja_jp.json | 3 +- .../assets/create/lang/unfinished/ko_kr.json | 3 +- .../assets/create/lang/unfinished/nl_nl.json | 3 +- .../assets/create/lang/unfinished/pt_br.json | 3 +- .../assets/create/lang/unfinished/ru_ru.json | 3 +- .../assets/create/lang/unfinished/zh_cn.json | 3 +- .../assets/create/lang/unfinished/zh_tw.json | 3 +- .../assets/create/models/item/sticker.json | 3 + .../crafting/kinetics/sticker.json | 32 ++++ .../create/loot_tables/blocks/sticker.json | 19 ++ .../recipes/crafting/kinetics/sticker.json | 24 +++ .../com/simibubi/create/AllBlockPartials.java | 2 + .../java/com/simibubi/create/AllBlocks.java | 10 ++ .../com/simibubi/create/AllTileEntities.java | 8 + .../category/animations/AnimatedKinetics.java | 2 +- .../category/animations/AnimatedMixer.java | 2 +- .../category/animations/AnimatedPress.java | 2 +- .../category/animations/AnimatedSpout.java | 2 +- .../base/KineticTileEntityRenderer.java | 2 +- .../components/actors/DrillRenderer.java | 2 +- .../components/actors/HarvesterRenderer.java | 2 +- .../components/deployer/DeployerRenderer.java | 4 +- .../components/fan/EncasedFanRenderer.java | 2 +- .../mixer/MechanicalMixerRenderer.java | 2 +- .../BlockMovementTraits.java | 7 + .../structureMovement/Contraption.java | 61 ++++--- .../ContraptionEntityRenderer.java | 2 +- .../chassis/StickerBlock.java | 162 ++++++++++++++++++ .../chassis/StickerRenderer.java | 48 ++++++ .../chassis/StickerTileEntity.java | 94 ++++++++++ .../gantry/GantryPinionRenderer.java | 2 +- .../processing/BasinRenderer.java | 2 +- .../burner/BlazeBurnerRenderer.java | 2 +- .../relays/belt/BeltRenderer.java | 2 +- .../relays/encased/SplitShaftRenderer.java | 2 +- .../relays/gearbox/GearboxRenderer.java | 2 +- .../wrench/WrenchItemRenderer.java | 2 +- .../curiosities/ChromaticCompoundColor.java | 2 +- .../curiosities/symmetry/SymmetryHandler.java | 2 +- .../client/SymmetryWandItemRenderer.java | 2 +- .../tools/DeforesterItemRenderer.java | 2 +- .../tools/ExtendoGripItemRenderer.java | 2 +- .../blockzapper/BlockzapperItemRenderer.java | 2 +- .../WorldshaperItemRenderer.java | 2 +- .../block/mechanicalArm/ArmRenderer.java | 2 +- .../data/recipe/StandardRecipeGen.java | 11 +- .../render/TileEntityRenderHelper.java | 1 + .../render/backend/gl/BasicProgram.java | 2 +- .../utility/AnimationTickHolder.java | 2 +- .../create/models/block/sticker/block.json | 71 ++++++++ .../models/block/sticker/block_powered.json | 6 + .../create/models/block/sticker/head.json | 41 +++++ .../create/models/block/sticker/item.json | 104 +++++++++++ .../models/block/sticker/sticker.bbmodel | 1 + .../assets/create/textures/block/sticker.png | Bin 0 -> 1509 bytes .../create/textures/block/sticker_side.png | Bin 0 -> 6761 bytes .../textures/block/sticker_side_powered.png | Bin 0 -> 6836 bytes 67 files changed, 902 insertions(+), 114 deletions(-) create mode 100644 src/generated/resources/assets/create/blockstates/sticker.json create mode 100644 src/generated/resources/assets/create/models/item/sticker.json create mode 100644 src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/sticker.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/sticker.json create mode 100644 src/generated/resources/data/create/recipes/crafting/kinetics/sticker.json create mode 100644 src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerBlock.java create mode 100644 src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerRenderer.java create mode 100644 src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerTileEntity.java create mode 100644 src/main/resources/assets/create/models/block/sticker/block.json create mode 100644 src/main/resources/assets/create/models/block/sticker/block_powered.json create mode 100644 src/main/resources/assets/create/models/block/sticker/head.json create mode 100644 src/main/resources/assets/create/models/block/sticker/item.json create mode 100644 src/main/resources/assets/create/models/block/sticker/sticker.bbmodel create mode 100644 src/main/resources/assets/create/textures/block/sticker.png create mode 100644 src/main/resources/assets/create/textures/block/sticker_side.png create mode 100644 src/main/resources/assets/create/textures/block/sticker_side_powered.png diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index 3f277f4a4..5edcb82e1 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -337,7 +337,7 @@ e8b0a401c10d1ba67ed71ba31bd5f9bc28571b65 assets/create/blockstates/powered_toggl d06cd9a1101b18d306a786320aab12018b1325d6 assets/create/blockstates/purple_sail.json 92957119abd5fbcca36a113b2a80255fd70fc303 assets/create/blockstates/purple_seat.json 61035f8afe75ff7bbd291da5d8690bcbebe679eb assets/create/blockstates/purple_valve_handle.json -6fa36883e76e9e403bb429c8f86b8c0d3bba0cff assets/create/blockstates/radial_chassis.json +4439fc83a8c7370ab44b211a3fd48abde20a4728 assets/create/blockstates/radial_chassis.json 45877c4d90a7185c2f304edbd67379d800920439 assets/create/blockstates/red_sail.json da1b08387af7afa0855ee8d040f620c01f20660a assets/create/blockstates/red_seat.json 722fc77bbf387af8a4016e42cbf9501d2b968881 assets/create/blockstates/red_valve_handle.json @@ -371,6 +371,7 @@ e815bfd854c2653f10828bb11950f7fb991d7efc assets/create/blockstates/speedometer.j 1cb7cdbefa0ff199263782809287854b9d85074c assets/create/blockstates/spout.json d62b7908119fa4f51715a186d0882b388bb25cab assets/create/blockstates/spruce_window.json 8d7dfa60630a8b4bae4e8eca5c66e1cfa34dda1f assets/create/blockstates/spruce_window_pane.json +5d7385d28a23dcfc95a221d36d82337908582726 assets/create/blockstates/sticker.json 3d93eabbb327aecc526beae9c62283f1d43eb710 assets/create/blockstates/sticky_mechanical_piston.json f385988cb6fa9c48b5d59a6942ec50ed2b60c8bf assets/create/blockstates/stockpile_switch.json e815bfd854c2653f10828bb11950f7fb991d7efc assets/create/blockstates/stressometer.json @@ -400,20 +401,20 @@ a3a11524cd3515fc01d905767b4b7ea782adaf03 assets/create/blockstates/yellow_seat.j 6801fa1f466f172700e573e5b8ee8ee5f9ca4583 assets/create/blockstates/yellow_valve_handle.json 7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json -00e2b77dcc86224cd5a33aefaac01f20c90bcb40 assets/create/lang/en_ud.json -55638abca6ffa48e1059f2578ea6d76b8327f496 assets/create/lang/en_us.json -374dd193cb26eb590a4a66bf5c8e13f9743ddbdb assets/create/lang/unfinished/de_de.json -84b205e2a8c9539ab6da68aa8f7c91f1dbec0702 assets/create/lang/unfinished/es_es.json -3397c2fed7517a4c9b3b41ee081abb120ddf9b3b assets/create/lang/unfinished/es_mx.json -e61eb3ca3d279c438275fb50333b135560574e62 assets/create/lang/unfinished/fr_fr.json -eaa202ec1821372b5f26d724e7c58d710fda7f5b assets/create/lang/unfinished/it_it.json -d1627e59cf6cf5ac2382397a7db416e75072ac31 assets/create/lang/unfinished/ja_jp.json -39f4258b8d9d56c5d7e5761065081d69ab07d4d8 assets/create/lang/unfinished/ko_kr.json -402c16cffdd530dfde3e016691720145cc66c7a1 assets/create/lang/unfinished/nl_nl.json -73f22223f6d30068ac2bc3f9be02e43f7fe4cae0 assets/create/lang/unfinished/pt_br.json -015a444814ec9982c35d08a3705df3861ce2545e assets/create/lang/unfinished/ru_ru.json -38ed221082ce3ce7b4f6c93ec28b7e89a95cab06 assets/create/lang/unfinished/zh_cn.json -e51b6bd8cd9696858a417d3d9472a263e9268dd8 assets/create/lang/unfinished/zh_tw.json +369f9c6fce0aa11d70efa2e73a4ba2ff12e57e37 assets/create/lang/en_ud.json +10f9c238cdc8b68246c5663bc9745942d1014927 assets/create/lang/en_us.json +c46eabdb4476c18f539c95c24259a3fe1ee9cbff assets/create/lang/unfinished/de_de.json +551cd06b553080815a129d6b113473efde3fb5ac assets/create/lang/unfinished/es_es.json +1bac8afa8f92030077db8d921fd9dda30c0e8a5a assets/create/lang/unfinished/es_mx.json +d62993dd6f73224cbc17f04ea96022c4ac385dc4 assets/create/lang/unfinished/fr_fr.json +749274555f9b3edc9d7799a7147d724fd7993c66 assets/create/lang/unfinished/it_it.json +7e9723798c1459780b2814145eb6a0dc681a2281 assets/create/lang/unfinished/ja_jp.json +2d1da43b76d2184df5b183641241478e1c101218 assets/create/lang/unfinished/ko_kr.json +9cea3a5a2fe4e2c6d966f3c91b24e9d6595a9cc6 assets/create/lang/unfinished/nl_nl.json +e7299620ca48f296d678c87470358816f23d7578 assets/create/lang/unfinished/pt_br.json +6fd3ef5962b10f83e5df7dd0fbdb50cadee1a06b assets/create/lang/unfinished/ru_ru.json +b0688d7e4c593c0ed4fc87ea0b4e52205dcdeec8 assets/create/lang/unfinished/zh_cn.json +ff1c97c854da7b7bfe6be829c9bf6a787f6dfacd assets/create/lang/unfinished/zh_tw.json 846200eb548d3bfa2e77b41039de159b4b6cfb45 assets/create/models/block/acacia_window.json 1930fa3a3c98d53dd19e4ee7f55bc27fd47aa281 assets/create/models/block/acacia_window_pane_noside.json 1763ea2c9b981d187f5031ba608f3d5d3be3986a assets/create/models/block/acacia_window_pane_noside_alt.json @@ -1544,6 +1545,7 @@ d6fb0d38b1b5bcc199b52ac8889eaecd167f6725 assets/create/models/item/speedometer.j b9abe1331d49871838231f3a8e5d2973634e9325 assets/create/models/item/spout.json b305e81f1dc5272634745b6e822af40955a2ef28 assets/create/models/item/spruce_window.json 5f622bca8386b8dd077310647e39ac3abb80c6a1 assets/create/models/item/spruce_window_pane.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 bab8f78c319b2a79ed55c5d2a94b521ddaa44996 assets/create/models/item/stressometer.json @@ -1816,6 +1818,7 @@ cd8cefee21a1690f9158b8e8661a92d20ad0f535 data/create/advancements/recipes/create e8a5d924ccf30b6eae4b9ec0a8040e31f0eb165b data/create/advancements/recipes/create.base/crafting/kinetics/speedometer.json 90ff137eb1533695d9d17296ed180c0a88ddd891 data/create/advancements/recipes/create.base/crafting/kinetics/speedometerfrom_conversion.json 44867af16ec6d960268747effcd578ab55e3a366 data/create/advancements/recipes/create.base/crafting/kinetics/spout.json +8c7fd72b8b4d414a61859dd08857e8538d84f88b data/create/advancements/recipes/create.base/crafting/kinetics/sticker.json 3859abc8839e92b01461d3e9ef853a4934c3256b data/create/advancements/recipes/create.base/crafting/kinetics/sticky_mechanical_piston.json 9a4dad31370d9e71308afe5c3f9349b67f749635 data/create/advancements/recipes/create.base/crafting/kinetics/stressometerfrom_conversion.json f3fc3d4fee0712906f833aa17185f0bacb21922f data/create/advancements/recipes/create.base/crafting/kinetics/super_glue.json @@ -2665,6 +2668,7 @@ b127cb6920e6d7d9c8b2402cb186402a9a8dd3fc data/create/loot_tables/blocks/shaft.js f6c497d625de67ea9377e840208b1be539d13b73 data/create/loot_tables/blocks/spout.json a23a1e332c9ba84474e3c0588e8a0857afe346e0 data/create/loot_tables/blocks/spruce_window.json 3ee2350936ea82fef716bc58e4cd088a384616f0 data/create/loot_tables/blocks/spruce_window_pane.json +111a3bb893abb899652a923b10ca7dc5ea424e5f data/create/loot_tables/blocks/sticker.json 8d2970acd61b96844a4308d87e858b1612d5862e data/create/loot_tables/blocks/sticky_mechanical_piston.json ec2889e712702644092197a4b41a682fb953817d data/create/loot_tables/blocks/stockpile_switch.json 3479775008a256bc35f98b31655975f7d5c836b2 data/create/loot_tables/blocks/stressometer.json @@ -2876,6 +2880,7 @@ a17db27e61baa45f8a6ecb46a6d2a5a464704f8b data/create/recipes/crafting/kinetics/s b1a74f0b51fa37ca1ed814266b3d69b8b7e69fa3 data/create/recipes/crafting/kinetics/speedometer.json 8d632845deeb723e1a56083536ee5f9d60de2fcb data/create/recipes/crafting/kinetics/speedometerfrom_conversion.json eea9d4066cd2fafef40b50b79323dcc603fa6388 data/create/recipes/crafting/kinetics/spout.json +e532a5c405e48b415e3fcd4f7c6183ea335cb915 data/create/recipes/crafting/kinetics/sticker.json 3be40664acfd150d0617bc138dc2dd9d54a21b3a data/create/recipes/crafting/kinetics/sticky_mechanical_piston.json af5854ee2fa3be195ad9abcdeebe6ed7306b651c data/create/recipes/crafting/kinetics/stressometerfrom_conversion.json 21f885a674603367b67e1e993c175638cbda9ea3 data/create/recipes/crafting/kinetics/super_glue.json diff --git a/src/generated/resources/assets/create/blockstates/radial_chassis.json b/src/generated/resources/assets/create/blockstates/radial_chassis.json index f97d8c8bc..8bd829ffc 100644 --- a/src/generated/resources/assets/create/blockstates/radial_chassis.json +++ b/src/generated/resources/assets/create/blockstates/radial_chassis.json @@ -89,8 +89,8 @@ }, { "when": { - "sticky_west": "true", - "axis": "x" + "axis": "x", + "sticky_west": "true" }, "apply": { "model": "create:block/radial_chassis_side_x_sticky", @@ -99,8 +99,8 @@ }, { "when": { - "sticky_west": "true", - "axis": "y" + "axis": "y", + "sticky_west": "true" }, "apply": { "model": "create:block/radial_chassis_side_y_sticky", @@ -109,8 +109,8 @@ }, { "when": { - "sticky_west": "true", - "axis": "z" + "axis": "z", + "sticky_west": "true" }, "apply": { "model": "create:block/radial_chassis_side_z_sticky", @@ -119,8 +119,8 @@ }, { "when": { - "sticky_west": "false", - "axis": "x" + "axis": "x", + "sticky_west": "false" }, "apply": { "model": "create:block/radial_chassis_side_x", @@ -129,8 +129,8 @@ }, { "when": { - "sticky_west": "false", - "axis": "y" + "axis": "y", + "sticky_west": "false" }, "apply": { "model": "create:block/radial_chassis_side_y", @@ -139,8 +139,8 @@ }, { "when": { - "sticky_west": "false", - "axis": "z" + "axis": "z", + "sticky_west": "false" }, "apply": { "model": "create:block/radial_chassis_side_z", @@ -149,8 +149,8 @@ }, { "when": { - "sticky_north": "true", - "axis": "x" + "axis": "x", + "sticky_north": "true" }, "apply": { "model": "create:block/radial_chassis_side_x_sticky" @@ -158,8 +158,8 @@ }, { "when": { - "sticky_north": "true", - "axis": "y" + "axis": "y", + "sticky_north": "true" }, "apply": { "model": "create:block/radial_chassis_side_y_sticky", @@ -168,8 +168,8 @@ }, { "when": { - "sticky_north": "true", - "axis": "z" + "axis": "z", + "sticky_north": "true" }, "apply": { "model": "create:block/radial_chassis_side_x_sticky", @@ -178,8 +178,8 @@ }, { "when": { - "sticky_north": "false", - "axis": "x" + "axis": "x", + "sticky_north": "false" }, "apply": { "model": "create:block/radial_chassis_side_x" @@ -187,8 +187,8 @@ }, { "when": { - "sticky_north": "false", - "axis": "y" + "axis": "y", + "sticky_north": "false" }, "apply": { "model": "create:block/radial_chassis_side_y", @@ -197,8 +197,8 @@ }, { "when": { - "sticky_north": "false", - "axis": "z" + "axis": "z", + "sticky_north": "false" }, "apply": { "model": "create:block/radial_chassis_side_x", @@ -207,8 +207,8 @@ }, { "when": { - "sticky_east": "true", - "axis": "x" + "axis": "x", + "sticky_east": "true" }, "apply": { "model": "create:block/radial_chassis_side_x_sticky", @@ -217,8 +217,8 @@ }, { "when": { - "sticky_east": "true", - "axis": "y" + "axis": "y", + "sticky_east": "true" }, "apply": { "model": "create:block/radial_chassis_side_y_sticky", @@ -227,8 +227,8 @@ }, { "when": { - "sticky_east": "true", - "axis": "z" + "axis": "z", + "sticky_east": "true" }, "apply": { "model": "create:block/radial_chassis_side_z_sticky" @@ -236,8 +236,8 @@ }, { "when": { - "sticky_east": "false", - "axis": "x" + "axis": "x", + "sticky_east": "false" }, "apply": { "model": "create:block/radial_chassis_side_x", @@ -246,8 +246,8 @@ }, { "when": { - "sticky_east": "false", - "axis": "y" + "axis": "y", + "sticky_east": "false" }, "apply": { "model": "create:block/radial_chassis_side_y", @@ -256,8 +256,8 @@ }, { "when": { - "sticky_east": "false", - "axis": "z" + "axis": "z", + "sticky_east": "false" }, "apply": { "model": "create:block/radial_chassis_side_z" diff --git a/src/generated/resources/assets/create/blockstates/sticker.json b/src/generated/resources/assets/create/blockstates/sticker.json new file mode 100644 index 000000000..1949f8b4e --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/sticker.json @@ -0,0 +1,108 @@ +{ + "variants": { + "extended=false,facing=down,powered=false": { + "model": "create:block/sticker/block", + "x": 180 + }, + "extended=true,facing=down,powered=false": { + "model": "create:block/sticker/block", + "x": 180 + }, + "extended=false,facing=up,powered=false": { + "model": "create:block/sticker/block" + }, + "extended=true,facing=up,powered=false": { + "model": "create:block/sticker/block" + }, + "extended=false,facing=north,powered=false": { + "model": "create:block/sticker/block", + "x": 90 + }, + "extended=true,facing=north,powered=false": { + "model": "create:block/sticker/block", + "x": 90 + }, + "extended=false,facing=south,powered=false": { + "model": "create:block/sticker/block", + "x": 90, + "y": 180 + }, + "extended=true,facing=south,powered=false": { + "model": "create:block/sticker/block", + "x": 90, + "y": 180 + }, + "extended=false,facing=west,powered=false": { + "model": "create:block/sticker/block", + "x": 90, + "y": 270 + }, + "extended=true,facing=west,powered=false": { + "model": "create:block/sticker/block", + "x": 90, + "y": 270 + }, + "extended=false,facing=east,powered=false": { + "model": "create:block/sticker/block", + "x": 90, + "y": 90 + }, + "extended=true,facing=east,powered=false": { + "model": "create:block/sticker/block", + "x": 90, + "y": 90 + }, + "extended=false,facing=down,powered=true": { + "model": "create:block/sticker/block_powered", + "x": 180 + }, + "extended=true,facing=down,powered=true": { + "model": "create:block/sticker/block_powered", + "x": 180 + }, + "extended=false,facing=up,powered=true": { + "model": "create:block/sticker/block_powered" + }, + "extended=true,facing=up,powered=true": { + "model": "create:block/sticker/block_powered" + }, + "extended=false,facing=north,powered=true": { + "model": "create:block/sticker/block_powered", + "x": 90 + }, + "extended=true,facing=north,powered=true": { + "model": "create:block/sticker/block_powered", + "x": 90 + }, + "extended=false,facing=south,powered=true": { + "model": "create:block/sticker/block_powered", + "x": 90, + "y": 180 + }, + "extended=true,facing=south,powered=true": { + "model": "create:block/sticker/block_powered", + "x": 90, + "y": 180 + }, + "extended=false,facing=west,powered=true": { + "model": "create:block/sticker/block_powered", + "x": 90, + "y": 270 + }, + "extended=true,facing=west,powered=true": { + "model": "create:block/sticker/block_powered", + "x": 90, + "y": 270 + }, + "extended=false,facing=east,powered=true": { + "model": "create:block/sticker/block_powered", + "x": 90, + "y": 90 + }, + "extended=true,facing=east,powered=true": { + "model": "create:block/sticker/block_powered", + "x": 90, + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index b9de24d4a..992efe5b8 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -372,6 +372,7 @@ "block.create.spout": "\u0287nodS", "block.create.spruce_window": "\u028Dopu\u0131M \u01DD\u0254n\u0279dS", "block.create.spruce_window_pane": "\u01DDu\u0250\u0500 \u028Dopu\u0131M \u01DD\u0254n\u0279dS", + "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", "block.create.stressometer": "\u0279\u01DD\u0287\u01DD\u026Foss\u01DD\u0279\u0287S", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index 50fec28fc..eff9c55ae 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -375,6 +375,7 @@ "block.create.spout": "Spout", "block.create.spruce_window": "Spruce Window", "block.create.spruce_window_pane": "Spruce Window Pane", + "block.create.sticker": "Sticker", "block.create.sticky_mechanical_piston": "Sticky Mechanical Piston", "block.create.stockpile_switch": "Stockpile Switch", "block.create.stressometer": "Stressometer", diff --git a/src/generated/resources/assets/create/lang/unfinished/de_de.json b/src/generated/resources/assets/create/lang/unfinished/de_de.json index 97b496027..e119df01b 100644 --- a/src/generated/resources/assets/create/lang/unfinished/de_de.json +++ b/src/generated/resources/assets/create/lang/unfinished/de_de.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 973", + "_": "Missing Localizations: 974", "_": "->------------------------] Game Elements [------------------------<-", @@ -376,6 +376,7 @@ "block.create.spout": "UNLOCALIZED: Spout", "block.create.spruce_window": "UNLOCALIZED: Spruce Window", "block.create.spruce_window_pane": "UNLOCALIZED: Spruce Window Pane", + "block.create.sticker": "UNLOCALIZED: Sticker", "block.create.sticky_mechanical_piston": "Klebriger Mechanischer Kolben", "block.create.stockpile_switch": "Vorratssensor", "block.create.stressometer": "UNLOCALIZED: Stressometer", diff --git a/src/generated/resources/assets/create/lang/unfinished/es_es.json b/src/generated/resources/assets/create/lang/unfinished/es_es.json index c2b82e6a5..ef8b92ed9 100644 --- a/src/generated/resources/assets/create/lang/unfinished/es_es.json +++ b/src/generated/resources/assets/create/lang/unfinished/es_es.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 15", + "_": "Missing Localizations: 16", "_": "->------------------------] Game Elements [------------------------<-", @@ -376,6 +376,7 @@ "block.create.spout": "Surtidor", "block.create.spruce_window": "Ventana de abeto", "block.create.spruce_window_pane": "Panel de ventana de abeto", + "block.create.sticker": "UNLOCALIZED: Sticker", "block.create.sticky_mechanical_piston": "Pistón mecánico pegajoso", "block.create.stockpile_switch": "Interruptor de acopio", "block.create.stressometer": "Estresómetro", diff --git a/src/generated/resources/assets/create/lang/unfinished/es_mx.json b/src/generated/resources/assets/create/lang/unfinished/es_mx.json index 6ba4f32e8..9b0d9f25f 100644 --- a/src/generated/resources/assets/create/lang/unfinished/es_mx.json +++ b/src/generated/resources/assets/create/lang/unfinished/es_mx.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 903", + "_": "Missing Localizations: 904", "_": "->------------------------] Game Elements [------------------------<-", @@ -376,6 +376,7 @@ "block.create.spout": "Canaleta", "block.create.spruce_window": "Ventana de Abeto", "block.create.spruce_window_pane": "Panel de Ventana de Abeto", + "block.create.sticker": "UNLOCALIZED: Sticker", "block.create.sticky_mechanical_piston": "Pistón Mecánico Pegajoso", "block.create.stockpile_switch": "Interruptor de Pila", "block.create.stressometer": "Estresómetro", diff --git a/src/generated/resources/assets/create/lang/unfinished/fr_fr.json b/src/generated/resources/assets/create/lang/unfinished/fr_fr.json index 6ad32e75f..ec6b5cb05 100644 --- a/src/generated/resources/assets/create/lang/unfinished/fr_fr.json +++ b/src/generated/resources/assets/create/lang/unfinished/fr_fr.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 685", + "_": "Missing Localizations: 686", "_": "->------------------------] Game Elements [------------------------<-", @@ -376,6 +376,7 @@ "block.create.spout": "UNLOCALIZED: Spout", "block.create.spruce_window": "UNLOCALIZED: Spruce Window", "block.create.spruce_window_pane": "UNLOCALIZED: Spruce Window Pane", + "block.create.sticker": "UNLOCALIZED: Sticker", "block.create.sticky_mechanical_piston": "Piston mécanique collant", "block.create.stockpile_switch": "Détecteur de stockage", "block.create.stressometer": "Stressomètre", diff --git a/src/generated/resources/assets/create/lang/unfinished/it_it.json b/src/generated/resources/assets/create/lang/unfinished/it_it.json index d13863bd4..74e8c9f8c 100644 --- a/src/generated/resources/assets/create/lang/unfinished/it_it.json +++ b/src/generated/resources/assets/create/lang/unfinished/it_it.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 20", + "_": "Missing Localizations: 21", "_": "->------------------------] Game Elements [------------------------<-", @@ -376,6 +376,7 @@ "block.create.spout": "Spruzzo", "block.create.spruce_window": "Finestra di abete", "block.create.spruce_window_pane": "Pannello di finestra di abete", + "block.create.sticker": "UNLOCALIZED: Sticker", "block.create.sticky_mechanical_piston": "Pistone meccanico appiccicoso", "block.create.stockpile_switch": "Interruttore accumulatore", "block.create.stressometer": "Stressometro", diff --git a/src/generated/resources/assets/create/lang/unfinished/ja_jp.json b/src/generated/resources/assets/create/lang/unfinished/ja_jp.json index 1a3e51cc8..b877a56ef 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ja_jp.json +++ b/src/generated/resources/assets/create/lang/unfinished/ja_jp.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 27", + "_": "Missing Localizations: 28", "_": "->------------------------] Game Elements [------------------------<-", @@ -376,6 +376,7 @@ "block.create.spout": "アイテム注液口", "block.create.spruce_window": "マツの窓", "block.create.spruce_window_pane": "マツの窓パネル", + "block.create.sticker": "UNLOCALIZED: Sticker", "block.create.sticky_mechanical_piston": "粘着メカニカルピストン", "block.create.stockpile_switch": "在庫スイッチ", "block.create.stressometer": "応力メーター", diff --git a/src/generated/resources/assets/create/lang/unfinished/ko_kr.json b/src/generated/resources/assets/create/lang/unfinished/ko_kr.json index 141d5a8fc..f6dbbfaba 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ko_kr.json +++ b/src/generated/resources/assets/create/lang/unfinished/ko_kr.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 74", + "_": "Missing Localizations: 75", "_": "->------------------------] Game Elements [------------------------<-", @@ -376,6 +376,7 @@ "block.create.spout": "수도꼭지", "block.create.spruce_window": "가문비나무 유리창", "block.create.spruce_window_pane": "가문비나무 유리판", + "block.create.sticker": "UNLOCALIZED: Sticker", "block.create.sticky_mechanical_piston": "끈끈이 기계식 피스톤", "block.create.stockpile_switch": "수량 스위치", "block.create.stressometer": "피로도 계측기", diff --git a/src/generated/resources/assets/create/lang/unfinished/nl_nl.json b/src/generated/resources/assets/create/lang/unfinished/nl_nl.json index 3703e1c17..1fd9f8c71 100644 --- a/src/generated/resources/assets/create/lang/unfinished/nl_nl.json +++ b/src/generated/resources/assets/create/lang/unfinished/nl_nl.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1172", + "_": "Missing Localizations: 1173", "_": "->------------------------] Game Elements [------------------------<-", @@ -376,6 +376,7 @@ "block.create.spout": "UNLOCALIZED: Spout", "block.create.spruce_window": "UNLOCALIZED: Spruce Window", "block.create.spruce_window_pane": "UNLOCALIZED: Spruce Window Pane", + "block.create.sticker": "UNLOCALIZED: Sticker", "block.create.sticky_mechanical_piston": "Mechanische Zuiger", "block.create.stockpile_switch": "Voorraad Schakelaar", "block.create.stressometer": "Stressmeter", diff --git a/src/generated/resources/assets/create/lang/unfinished/pt_br.json b/src/generated/resources/assets/create/lang/unfinished/pt_br.json index 4af028159..0536a2b6c 100644 --- a/src/generated/resources/assets/create/lang/unfinished/pt_br.json +++ b/src/generated/resources/assets/create/lang/unfinished/pt_br.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1238", + "_": "Missing Localizations: 1239", "_": "->------------------------] Game Elements [------------------------<-", @@ -376,6 +376,7 @@ "block.create.spout": "UNLOCALIZED: Spout", "block.create.spruce_window": "UNLOCALIZED: Spruce Window", "block.create.spruce_window_pane": "UNLOCALIZED: Spruce Window Pane", + "block.create.sticker": "UNLOCALIZED: Sticker", "block.create.sticky_mechanical_piston": "Pistão Mecânico Grudento", "block.create.stockpile_switch": "Disjuntor de Armazenamento", "block.create.stressometer": "UNLOCALIZED: Stressometer", diff --git a/src/generated/resources/assets/create/lang/unfinished/ru_ru.json b/src/generated/resources/assets/create/lang/unfinished/ru_ru.json index 90d8c8487..fc9de42f9 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ru_ru.json +++ b/src/generated/resources/assets/create/lang/unfinished/ru_ru.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 24", + "_": "Missing Localizations: 25", "_": "->------------------------] Game Elements [------------------------<-", @@ -376,6 +376,7 @@ "block.create.spout": "Дозатор", "block.create.spruce_window": "Еловое окно", "block.create.spruce_window_pane": "Панель из елового окна", + "block.create.sticker": "UNLOCALIZED: Sticker", "block.create.sticky_mechanical_piston": "Липкий механический поршень", "block.create.stockpile_switch": "Настраиваемый компаратор", "block.create.stressometer": "Динамометр", diff --git a/src/generated/resources/assets/create/lang/unfinished/zh_cn.json b/src/generated/resources/assets/create/lang/unfinished/zh_cn.json index 82f3fbf24..18a87a456 100644 --- a/src/generated/resources/assets/create/lang/unfinished/zh_cn.json +++ b/src/generated/resources/assets/create/lang/unfinished/zh_cn.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 22", + "_": "Missing Localizations: 23", "_": "->------------------------] Game Elements [------------------------<-", @@ -376,6 +376,7 @@ "block.create.spout": "注液器", "block.create.spruce_window": "云杉窗户", "block.create.spruce_window_pane": "云杉窗户板", + "block.create.sticker": "UNLOCALIZED: Sticker", "block.create.sticky_mechanical_piston": "黏性动力活塞", "block.create.stockpile_switch": "存量转换器", "block.create.stressometer": "应力表", diff --git a/src/generated/resources/assets/create/lang/unfinished/zh_tw.json b/src/generated/resources/assets/create/lang/unfinished/zh_tw.json index 991403374..d811d8311 100644 --- a/src/generated/resources/assets/create/lang/unfinished/zh_tw.json +++ b/src/generated/resources/assets/create/lang/unfinished/zh_tw.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 27", + "_": "Missing Localizations: 28", "_": "->------------------------] Game Elements [------------------------<-", @@ -376,6 +376,7 @@ "block.create.spout": "液體灌注器", "block.create.spruce_window": "雲杉木窗戶", "block.create.spruce_window_pane": "雲杉木窗戶片", + "block.create.sticker": "UNLOCALIZED: Sticker", "block.create.sticky_mechanical_piston": "黏性機械活塞", "block.create.stockpile_switch": "存量檢測器", "block.create.stressometer": "動能錶", diff --git a/src/generated/resources/assets/create/models/item/sticker.json b/src/generated/resources/assets/create/models/item/sticker.json new file mode 100644 index 000000000..b1367cf86 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/sticker.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/sticker/item" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/sticker.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/sticker.json new file mode 100644 index 000000000..65c58bb33 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/sticker.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/sticker" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:andesite_alloy" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/sticker" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/sticker.json b/src/generated/resources/data/create/loot_tables/blocks/sticker.json new file mode 100644 index 000000000..92ccdbe64 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/sticker.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "create:sticker" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/sticker.json b/src/generated/resources/data/create/recipes/crafting/kinetics/sticker.json new file mode 100644 index 000000000..71db9df8a --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/sticker.json @@ -0,0 +1,24 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "ISI", + "CRC" + ], + "key": { + "I": { + "item": "create:andesite_alloy" + }, + "C": { + "tag": "forge:cobblestone" + }, + "R": { + "tag": "forge:dusts/redstone" + }, + "S": { + "tag": "forge:slimeballs" + } + }, + "result": { + "item": "create:sticker" + } +} \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/AllBlockPartials.java b/src/main/java/com/simibubi/create/AllBlockPartials.java index bd23757e2..727ecf78f 100644 --- a/src/main/java/com/simibubi/create/AllBlockPartials.java +++ b/src/main/java/com/simibubi/create/AllBlockPartials.java @@ -93,6 +93,8 @@ public class AllBlockPartials { SYMMETRY_PLANE = get("symmetry_effect/plane"), SYMMETRY_CROSSPLANE = get("symmetry_effect/crossplane"), SYMMETRY_TRIPLEPLANE = get("symmetry_effect/tripleplane"), + + STICKER_HEAD = get("sticker/head"), PORTABLE_STORAGE_INTERFACE_MIDDLE = get("portable_storage_interface/block_middle"), PORTABLE_STORAGE_INTERFACE_MIDDLE_POWERED = get("portable_storage_interface/block_middle_powered"), diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index aea45c42e..ac22dda0c 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -54,6 +54,7 @@ import com.simibubi.create.content.contraptions.components.structureMovement.bea import com.simibubi.create.content.contraptions.components.structureMovement.chassis.LinearChassisBlock; import com.simibubi.create.content.contraptions.components.structureMovement.chassis.LinearChassisBlock.ChassisCTBehaviour; import com.simibubi.create.content.contraptions.components.structureMovement.chassis.RadialChassisBlock; +import com.simibubi.create.content.contraptions.components.structureMovement.chassis.StickerBlock; import com.simibubi.create.content.contraptions.components.structureMovement.gantry.GantryPinionBlock; import com.simibubi.create.content.contraptions.components.structureMovement.mounted.CartAssemblerBlock; import com.simibubi.create.content.contraptions.components.structureMovement.mounted.CartAssemblerBlock.MinecartAnchorBlock; @@ -846,6 +847,15 @@ public class AllBlocks { .build() .register(); + public static final BlockEntry STICKER = REGISTRATE.block("sticker", StickerBlock::new) + .initialProperties(SharedProperties::stone) + .properties(Block.Properties::nonOpaque) + .addLayer(() -> RenderType::getCutoutMipped) + .blockstate((c, p) -> p.directionalBlock(c.get(), AssetLookup.forPowered(c, p))) + .item() + .transform(customItemModel()) + .register(); + public static final BlockEntry MECHANICAL_DRILL = REGISTRATE.block("mechanical_drill", DrillBlock::new) .initialProperties(SharedProperties::stone) .blockstate(BlockStateGen.directionalBlockProvider(true)) diff --git a/src/main/java/com/simibubi/create/AllTileEntities.java b/src/main/java/com/simibubi/create/AllTileEntities.java index 7e24832ab..5b0c1e96b 100644 --- a/src/main/java/com/simibubi/create/AllTileEntities.java +++ b/src/main/java/com/simibubi/create/AllTileEntities.java @@ -51,6 +51,8 @@ import com.simibubi.create.content.contraptions.components.structureMovement.bea import com.simibubi.create.content.contraptions.components.structureMovement.bearing.MechanicalBearingTileEntity; import com.simibubi.create.content.contraptions.components.structureMovement.bearing.WindmillBearingTileEntity; import com.simibubi.create.content.contraptions.components.structureMovement.chassis.ChassisTileEntity; +import com.simibubi.create.content.contraptions.components.structureMovement.chassis.StickerRenderer; +import com.simibubi.create.content.contraptions.components.structureMovement.chassis.StickerTileEntity; import com.simibubi.create.content.contraptions.components.structureMovement.gantry.GantryPinionRenderer; import com.simibubi.create.content.contraptions.components.structureMovement.gantry.GantryPinionTileEntity; import com.simibubi.create.content.contraptions.components.structureMovement.mounted.CartAssemblerTileEntity; @@ -398,6 +400,12 @@ public class AllTileEntities { .validBlocks(AllBlocks.RADIAL_CHASSIS, AllBlocks.LINEAR_CHASSIS, AllBlocks.SECONDARY_LINEAR_CHASSIS) // .renderer(() -> renderer) .register(); + + public static final TileEntityEntry STICKER = Create.registrate() + .tileEntity("sticker", StickerTileEntity::new) + .validBlocks(AllBlocks.STICKER) + .renderer(() -> StickerRenderer::new) + .register(); public static final TileEntityEntry DRILL = Create.registrate() .tileEntity("drill", DrillTileEntity::new) diff --git a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedKinetics.java b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedKinetics.java index 2ff8f46ad..ef9e662ce 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedKinetics.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedKinetics.java @@ -12,7 +12,7 @@ import net.minecraft.util.Direction.Axis; public abstract class AnimatedKinetics implements IDrawable { public static float getCurrentAngle() { - return ((AnimationTickHolder.getRenderTick()) * 4f) % 360; + return ((AnimationTickHolder.getRenderTime()) * 4f) % 360; } protected BlockState shaft(Axis axis) { diff --git a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedMixer.java b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedMixer.java index a45e77ecd..2d3f78e12 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedMixer.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedMixer.java @@ -29,7 +29,7 @@ public class AnimatedMixer extends AnimatedKinetics { .scale(scale) .render(); - float animation = ((MathHelper.sin(AnimationTickHolder.getRenderTick() / 32f) + 1) / 5) + .5f; + float animation = ((MathHelper.sin(AnimationTickHolder.getRenderTime() / 32f) + 1) / 5) + .5f; GuiGameElement.of(AllBlockPartials.MECHANICAL_MIXER_POLE) .atLocal(0, animation, 0) diff --git a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedPress.java b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedPress.java index 849e95121..7cbf31cab 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedPress.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedPress.java @@ -48,7 +48,7 @@ public class AnimatedPress extends AnimatedKinetics { } private float getAnimatedHeadOffset() { - float cycle = (AnimationTickHolder.getRenderTick()) % 30; + float cycle = (AnimationTickHolder.getRenderTime()) % 30; if (cycle < 10) { float progress = cycle / 10; return -(progress * progress * progress); diff --git a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedSpout.java b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedSpout.java index d39255552..25db4f26a 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedSpout.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedSpout.java @@ -37,7 +37,7 @@ public class AnimatedSpout extends AnimatedKinetics { .scale(scale) .render(); - float cycle = AnimationTickHolder.getRenderTick() % 30; + float cycle = AnimationTickHolder.getRenderTime() % 30; float squeeze = cycle < 20 ? MathHelper.sin((float) (cycle / 20f * Math.PI)) : 0; squeeze *= 20; diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java index cc27ee7f8..f3814c3e3 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java @@ -58,7 +58,7 @@ public class KineticTileEntityRenderer extends SafeTileEntityRenderer ms.translate(0, isBlockItem ? 9 / 16f : 11 / 16f, 0); ms.scale(scale, scale, scale); transform = TransformType.GROUND; - ms.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(AnimationTickHolder.getRenderTick())); + ms.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(AnimationTickHolder.getRenderTime())); } else { float scale = punching ? .75f : isBlockItem ? .75f - 1 / 64f : .5f; @@ -176,7 +176,7 @@ public class DeployerRenderer extends SafeTileEntityRenderer double factor; if (context.contraption.stalled || context.position == null || context.data.contains("StationaryTimer")) { - factor = MathHelper.sin(AnimationTickHolder.getRenderTick() * .5f) * .25f + .25f; + factor = MathHelper.sin(AnimationTickHolder.getRenderTime() * .5f) * .25f + .25f; } else { Vec3d center = VecHelper.getCenterOf(new BlockPos(context.position)); double distance = context.position.distanceTo(center); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanRenderer.java index 5bf8b87d2..6421411d3 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanRenderer.java @@ -41,7 +41,7 @@ public class EncasedFanRenderer extends KineticTileEntityRenderer { SuperByteBuffer fanInner = AllBlockPartials.ENCASED_FAN_INNER.renderOnDirectionalSouth(te.getBlockState(), direction.getOpposite()); - float time = AnimationTickHolder.getRenderTick(); + float time = AnimationTickHolder.getRenderTime(); float speed = te.getSpeed() * 5; if (speed > 0) speed = MathHelper.clamp(speed, 80, 64 * 20); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerRenderer.java index 4220afa17..134b7b788 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerRenderer.java @@ -45,7 +45,7 @@ public class MechanicalMixerRenderer extends KineticTileEntityRenderer { int packedLightmapCoords = WorldRenderer.getLightmapCoordinates(te.getWorld(), blockState, pos); float renderedHeadOffset = mixer.getRenderedHeadOffset(partialTicks); float speed = mixer.getRenderedHeadRotationSpeed(partialTicks); - float time = AnimationTickHolder.getRenderTick(); + float time = AnimationTickHolder.getRenderTime(); float angle = (float) (((time * speed * 6 / 10f) % 360) / 180 * (float) Math.PI); SuperByteBuffer poleRender = AllBlockPartials.MECHANICAL_MIXER_POLE.renderOn(blockState); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/BlockMovementTraits.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/BlockMovementTraits.java index aaaef728b..c3566bad9 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/BlockMovementTraits.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/BlockMovementTraits.java @@ -14,6 +14,7 @@ import com.simibubi.create.content.contraptions.components.structureMovement.bea import com.simibubi.create.content.contraptions.components.structureMovement.bearing.MechanicalBearingTileEntity; import com.simibubi.create.content.contraptions.components.structureMovement.bearing.SailBlock; import com.simibubi.create.content.contraptions.components.structureMovement.chassis.AbstractChassisBlock; +import com.simibubi.create.content.contraptions.components.structureMovement.chassis.StickerBlock; import com.simibubi.create.content.contraptions.components.structureMovement.mounted.CartAssemblerBlock; import com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonBlock; import com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonBlock.PistonState; @@ -198,6 +199,10 @@ public class BlockMovementTraits { .getAxis(); if (state.getBlock() instanceof FluidTankBlock) return FluidTankConnectivityHandler.isConnected(world, pos, pos.offset(direction)); + if (AllBlocks.STICKER.has(state) && state.get(StickerBlock.EXTENDED)) { + return direction == state.get(StickerBlock.FACING) + && !notSupportive(world.getBlockState(pos.offset(direction)), direction.getOpposite()); + } return false; } @@ -231,6 +236,8 @@ public class BlockMovementTraits { if (AllBlocks.MECHANICAL_PISTON_HEAD.has(state)) return facing.getAxis() != state.get(BlockStateProperties.FACING) .getAxis(); + if (AllBlocks.STICKER.has(state) && !state.get(StickerBlock.EXTENDED)) + return facing == state.get(StickerBlock.FACING); return isBrittle(state); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/Contraption.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/Contraption.java index 09fbc01f4..44fb1523c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/Contraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/Contraption.java @@ -8,7 +8,6 @@ import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; -import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Objects; @@ -21,7 +20,6 @@ import java.util.stream.Collectors; import javax.annotation.Nullable; -import com.simibubi.create.foundation.utility.*; import org.apache.commons.lang3.tuple.MutablePair; import org.apache.commons.lang3.tuple.Pair; @@ -35,6 +33,7 @@ import com.simibubi.create.content.contraptions.components.structureMovement.bea import com.simibubi.create.content.contraptions.components.structureMovement.bearing.StabilizedContraption; import com.simibubi.create.content.contraptions.components.structureMovement.chassis.AbstractChassisBlock; import com.simibubi.create.content.contraptions.components.structureMovement.chassis.ChassisTileEntity; +import com.simibubi.create.content.contraptions.components.structureMovement.chassis.StickerBlock; import com.simibubi.create.content.contraptions.components.structureMovement.gantry.GantryPinionBlock; import com.simibubi.create.content.contraptions.components.structureMovement.glue.SuperGlueEntity; import com.simibubi.create.content.contraptions.components.structureMovement.glue.SuperGlueHandler; @@ -54,6 +53,12 @@ import com.simibubi.create.content.logistics.block.redstone.RedstoneContactBlock import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.fluid.CombinedTankWrapper; import com.simibubi.create.foundation.render.backend.light.EmptyLighter; +import com.simibubi.create.foundation.utility.BlockFace; +import com.simibubi.create.foundation.utility.Iterate; +import com.simibubi.create.foundation.utility.NBTHelper; +import com.simibubi.create.foundation.utility.NBTProcessors; +import com.simibubi.create.foundation.utility.UniqueLinkedList; +import com.simibubi.create.foundation.utility.VecHelper; import com.simibubi.create.foundation.utility.worldWrappers.WrappedWorld; import net.minecraft.block.AbstractButtonBlock; @@ -172,7 +177,8 @@ public abstract class Contraption { return contraption; } - public boolean searchMovedStructure(World world, BlockPos pos, @Nullable Direction forcedDirection) throws AssemblyException { + public boolean searchMovedStructure(World world, BlockPos pos, @Nullable Direction forcedDirection) + throws AssemblyException { initialPassengers.clear(); Queue frontier = new UniqueLinkedList<>(); Set visited = new HashSet<>(); @@ -293,6 +299,14 @@ public abstract class Contraption { if (AllBlocks.GANTRY_SHAFT.has(state)) moveGantryShaft(world, pos, frontier, visited, state); + if (AllBlocks.STICKER.has(state) && state.get(StickerBlock.EXTENDED)) { + Direction offset = state.get(StickerBlock.FACING); + BlockPos attached = pos.offset(offset); + if (!visited.contains(attached) + && !BlockMovementTraits.notSupportive(world.getBlockState(attached), offset.getOpposite())) + frontier.add(attached); + } + // Bearings potentially create stabilized sub-contraptions if (AllBlocks.MECHANICAL_BEARING.has(state)) moveBearing(pos, frontier, visited, state); @@ -348,7 +362,8 @@ public abstract class Contraption { boolean brittle = BlockMovementTraits.isBrittle(blockState); boolean canStick = !brittle && state.canStickTo(blockState) && blockState.canStickTo(state); if (canStick) { - if (state.getPushReaction() == PushReaction.PUSH_ONLY || blockState.getPushReaction() == PushReaction.PUSH_ONLY) { + if (state.getPushReaction() == PushReaction.PUSH_ONLY + || blockState.getPushReaction() == PushReaction.PUSH_ONLY) { canStick = false; } if (BlockMovementTraits.notSupportive(state, offset)) { @@ -359,7 +374,8 @@ public abstract class Contraption { } } - if (!wasVisited && (canStick || blockAttachedTowardsFace || faceHasGlue || (offset == forcedDirection && !BlockMovementTraits.notSupportive(state, forcedDirection)))) + if (!wasVisited && (canStick || blockAttachedTowardsFace || faceHasGlue + || (offset == forcedDirection && !BlockMovementTraits.notSupportive(state, forcedDirection)))) frontier.add(offsetPos); if (faceHasGlue) addGlue(superglue.get(offset)); @@ -499,7 +515,8 @@ public abstract class Contraption { } } - private boolean moveMechanicalPiston(World world, BlockPos pos, Queue frontier, Set visited, BlockState state) throws AssemblyException { + private boolean moveMechanicalPiston(World world, BlockPos pos, Queue frontier, Set visited, + BlockState state) throws AssemblyException { Direction direction = state.get(MechanicalPistonBlock.FACING); PistonState pistonState = state.get(MechanicalPistonBlock.STATE); if (pistonState == PistonState.MOVING) @@ -621,8 +638,9 @@ public abstract class Contraption { specialRenderedTileEntities.clear(); INBT blocks = nbt.get("Blocks"); - //used to differentiate between the 'old' and the paletted serialization - boolean usePalettedDeserialization = blocks != null && blocks.getId() == 10 && ((CompoundNBT) blocks).contains("Palette"); + // used to differentiate between the 'old' and the paletted serialization + boolean usePalettedDeserialization = + blocks != null && blocks.getId() == 10 && ((CompoundNBT) blocks).contains("Palette"); readBlocksCompound(blocks, world, usePalettedDeserialization); actors.clear(); @@ -713,7 +731,8 @@ public abstract class Contraption { for (Pair glueEntry : superglue) { CompoundNBT c = new CompoundNBT(); c.put("Pos", NBTUtil.writeBlockPos(glueEntry.getKey())); - c.putByte("Direction", (byte) glueEntry.getValue().getIndex()); + c.putByte("Direction", (byte) glueEntry.getValue() + .getIndex()); superglueNBT.add(c); } @@ -773,7 +792,9 @@ public abstract class Contraption { private CompoundNBT writeBlocksCompound() { CompoundNBT compound = new CompoundNBT(); - PaletteHashMap palette = new PaletteHashMap<>(GameData.getBlockStateIDMap(), 16, (i, s) -> {throw new IllegalStateException("Palette Map index exceeded maximum");}, NBTUtil::readBlockState, NBTUtil::writeBlockState); + PaletteHashMap palette = new PaletteHashMap<>(GameData.getBlockStateIDMap(), 16, (i, s) -> { + throw new IllegalStateException("Palette Map index exceeded maximum"); + }, NBTUtil::readBlockState, NBTUtil::writeBlockState); ListNBT blockList = new ListNBT(); for (BlockInfo block : this.blocks.values()) { @@ -799,7 +820,9 @@ public abstract class Contraption { ListNBT blockList; if (usePalettedDeserialization) { CompoundNBT c = ((CompoundNBT) compound); - palette = new PaletteHashMap<>(GameData.getBlockStateIDMap(), 16, (i, s) -> {throw new IllegalStateException("Palette Map index exceeded maximum");}, NBTUtil::readBlockState, NBTUtil::writeBlockState); + palette = new PaletteHashMap<>(GameData.getBlockStateIDMap(), 16, (i, s) -> { + throw new IllegalStateException("Palette Map index exceeded maximum"); + }, NBTUtil::readBlockState, NBTUtil::writeBlockState); palette.read(c.getList("Palette", 10)); blockList = c.getList("BlockList", 10); @@ -857,19 +880,15 @@ public abstract class Contraption { } private static BlockInfo readBlockInfo(CompoundNBT blockListEntry, PaletteHashMap palette) { - return new BlockInfo( - BlockPos.fromLong(blockListEntry.getLong("Pos")), - Objects.requireNonNull(palette.get(blockListEntry.getInt("State"))), - blockListEntry.contains("Data") ? blockListEntry.getCompound("Data") : null - ); + return new BlockInfo(BlockPos.fromLong(blockListEntry.getLong("Pos")), + Objects.requireNonNull(palette.get(blockListEntry.getInt("State"))), + blockListEntry.contains("Data") ? blockListEntry.getCompound("Data") : null); } private static BlockInfo legacyReadBlockInfo(CompoundNBT blockListEntry) { - return new BlockInfo( - NBTUtil.readBlockPos(blockListEntry.getCompound("Pos")), - NBTUtil.readBlockState(blockListEntry.getCompound("Block")), - blockListEntry.contains("Data") ? blockListEntry.getCompound("Data") : null - ); + return new BlockInfo(NBTUtil.readBlockPos(blockListEntry.getCompound("Pos")), + NBTUtil.readBlockState(blockListEntry.getCompound("Block")), + blockListEntry.contains("Data") ? blockListEntry.getCompound("Data") : null); } public void removeBlocksFromWorld(World world, BlockPos offset) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionEntityRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionEntityRenderer.java index b66008c4e..f3d1f4b44 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionEntityRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionEntityRenderer.java @@ -39,7 +39,7 @@ public class ContraptionEntityRenderer exte super.render(entity, yaw, partialTicks, ms, buffers, overlay); // Keep a copy of the transforms in order to determine correct lighting - MatrixStack msLocal = translateTo(entity, AnimationTickHolder.getRenderTick()); + MatrixStack msLocal = translateTo(entity, AnimationTickHolder.getPartialTicks()); MatrixStack[] matrixStacks = new MatrixStack[] { ms, msLocal }; ms.push(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerBlock.java new file mode 100644 index 000000000..74a3959a0 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerBlock.java @@ -0,0 +1,162 @@ +package com.simibubi.create.content.contraptions.components.structureMovement.chassis; + +import com.simibubi.create.AllBlocks; +import com.simibubi.create.AllTileEntities; +import com.simibubi.create.foundation.block.ITE; +import com.simibubi.create.foundation.block.ProperDirectionalBlock; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.entity.Entity; +import net.minecraft.entity.LivingEntity; +import net.minecraft.item.BlockItemUseContext; +import net.minecraft.particles.BlockParticleData; +import net.minecraft.particles.ParticleTypes; +import net.minecraft.state.BooleanProperty; +import net.minecraft.state.StateContainer.Builder; +import net.minecraft.state.properties.BlockStateProperties; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.IBlockReader; +import net.minecraft.world.IWorldReader; +import net.minecraft.world.World; +import net.minecraft.world.server.ServerWorld; + +public class StickerBlock extends ProperDirectionalBlock implements ITE { + + public static final BooleanProperty POWERED = BlockStateProperties.POWERED; + public static final BooleanProperty EXTENDED = BlockStateProperties.EXTENDED; + + public StickerBlock(Properties p_i48415_1_) { + super(p_i48415_1_); + setDefaultState(getDefaultState().with(POWERED, false) + .with(EXTENDED, false)); + } + + @Override + public BlockState getStateForPlacement(BlockItemUseContext context) { + Direction nearestLookingDirection = context.getNearestLookingDirection(); + boolean shouldPower = context.getWorld() + .isBlockPowered(context.getPos()); + Direction facing = context.getPlayer() != null && context.getPlayer() + .isSneaking() ? nearestLookingDirection : nearestLookingDirection.getOpposite(); + + return getDefaultState().with(FACING, facing) + .with(POWERED, shouldPower); + } + + @Override + protected void fillStateContainer(Builder builder) { + super.fillStateContainer(builder.add(POWERED, EXTENDED)); + } + + @Override + public void neighborChanged(BlockState state, World worldIn, BlockPos pos, Block blockIn, BlockPos fromPos, + boolean isMoving) { + if (worldIn.isRemote) + return; + + boolean previouslyPowered = state.get(POWERED); + if (previouslyPowered != worldIn.isBlockPowered(pos)) { + state = state.cycle(POWERED); + if (state.get(POWERED)) + state = state.cycle(EXTENDED); + worldIn.setBlockState(pos, state, 2); + } + } + + @Override + public boolean hasTileEntity(BlockState state) { + return true; + } + + @Override + public boolean shouldCheckWeakPower(BlockState state, IWorldReader world, BlockPos pos, Direction side) { + return false; + } + + @Override + public TileEntity createTileEntity(BlockState state, IBlockReader world) { + return AllTileEntities.STICKER.create(); + } + + @Override + public Class getTileEntityClass() { + return StickerTileEntity.class; + } + + // Slime block stuff + + private boolean isUprightSticker(IBlockReader world, BlockPos pos) { + BlockState blockState = world.getBlockState(pos); + return AllBlocks.STICKER.has(blockState) && blockState.get(FACING) == Direction.UP; + } + + @Override + public void onFallenUpon(World p_180658_1_, BlockPos p_180658_2_, Entity p_180658_3_, float p_180658_4_) { + if (!isUprightSticker(p_180658_1_, p_180658_2_) || p_180658_3_.bypassesLandingEffects()) { + super.onFallenUpon(p_180658_1_, p_180658_2_, p_180658_3_, p_180658_4_); + } else { + p_180658_3_.handleFallDamage(p_180658_4_, 0.0F); + } + } + + @Override + public void onLanded(IBlockReader p_176216_1_, Entity p_176216_2_) { + if (!isUprightSticker(p_176216_1_, p_176216_2_.getPosition() + .down()) || p_176216_2_.bypassesLandingEffects()) { + super.onLanded(p_176216_1_, p_176216_2_); + } else { + this.func_226946_a_(p_176216_2_); + } + } + + private void func_226946_a_(Entity p_226946_1_) { + Vec3d vec3d = p_226946_1_.getMotion(); + if (vec3d.y < 0.0D) { + double d0 = p_226946_1_ instanceof LivingEntity ? 1.0D : 0.8D; + p_226946_1_.setMotion(vec3d.x, -vec3d.y * d0, vec3d.z); + } + } + + @Override + public void onEntityWalk(World p_176199_1_, BlockPos p_176199_2_, Entity p_176199_3_) { + double d0 = Math.abs(p_176199_3_.getMotion().y); + if (d0 < 0.1D && !p_176199_3_.bypassesSteppingEffects() && isUprightSticker(p_176199_1_, p_176199_2_)) { + double d1 = 0.4D + d0 * 0.2D; + p_176199_3_.setMotion(p_176199_3_.getMotion() + .mul(d1, 1.0D, d1)); + } + super.onEntityWalk(p_176199_1_, p_176199_2_, p_176199_3_); + } + + @Override + public boolean addLandingEffects(BlockState state1, ServerWorld worldserver, BlockPos pos, BlockState state2, + LivingEntity entity, int numberOfParticles) { + if (isUprightSticker(worldserver, pos)) { + worldserver.spawnParticle(new BlockParticleData(ParticleTypes.BLOCK, Blocks.SLIME_BLOCK.getDefaultState()), + entity.getX(), entity.getY(), entity.getZ(), numberOfParticles, 0.0D, 0.0D, 0.0D, (double) 0.15F); + return true; + } + return super.addLandingEffects(state1, worldserver, pos, state2, entity, numberOfParticles); + } + + @Override + public boolean addRunningEffects(BlockState state, World world, BlockPos pos, Entity entity) { + if (state.get(FACING) == Direction.UP) { + Vec3d vec3d = entity.getMotion(); + world.addParticle( + new BlockParticleData(ParticleTypes.BLOCK, Blocks.SLIME_BLOCK.getDefaultState()).setPos(pos), + entity.getX() + ((double) world.rand.nextFloat() - 0.5D) * (double) entity.getWidth(), + entity.getY() + 0.1D, + entity.getZ() + ((double) world.rand.nextFloat() - 0.5D) * (double) entity.getWidth(), vec3d.x * -4.0D, + 1.5D, vec3d.z * -4.0D); + return true; + } + return super.addRunningEffects(state, world, pos, entity); + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerRenderer.java new file mode 100644 index 000000000..8e6ef665c --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerRenderer.java @@ -0,0 +1,48 @@ +package com.simibubi.create.content.contraptions.components.structureMovement.chassis; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.foundation.render.SuperByteBuffer; +import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; +import com.simibubi.create.foundation.utility.AngleHelper; +import com.simibubi.create.foundation.utility.AnimationTickHolder; +import com.simibubi.create.foundation.utility.MatrixStacker; + +import net.minecraft.block.BlockState; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.IRenderTypeBuffer; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; +import net.minecraft.util.Direction; + +public class StickerRenderer extends SafeTileEntityRenderer { + + public StickerRenderer(TileEntityRendererDispatcher dispatcher) { + super(dispatcher); + } + + @Override + protected void renderSafe(StickerTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, + int light, int overlay) { + BlockState state = te.getBlockState(); + SuperByteBuffer head = AllBlockPartials.STICKER_HEAD.renderOn(state); + float offset = te.piston.getValue(AnimationTickHolder.getPartialTicks()); + + if (te.getWorld() != Minecraft.getInstance().world) + offset = state.get(StickerBlock.EXTENDED) ? 1 : 0; + + Direction facing = state.get(StickerBlock.FACING); + ms.push(); + MatrixStacker.of(ms) + .nudge(te.hashCode()) + .centre() + .rotateY(AngleHelper.horizontalAngle(facing)) + .rotateX(AngleHelper.verticalAngle(facing) + 90) + .unCentre(); + ms.translate(0, (offset * offset) * 4 / 16f, 0); + head.light(light) + .renderInto(ms, buffer.getBuffer(RenderType.getSolid())); + ms.pop(); + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerTileEntity.java new file mode 100644 index 000000000..b79977b04 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerTileEntity.java @@ -0,0 +1,94 @@ +package com.simibubi.create.content.contraptions.components.structureMovement.chassis; + +import java.util.List; + +import com.simibubi.create.AllBlocks; +import com.simibubi.create.AllSoundEvents; +import com.simibubi.create.content.contraptions.components.structureMovement.glue.SuperGlueEntity; +import com.simibubi.create.content.contraptions.components.structureMovement.glue.SuperGlueItem; +import com.simibubi.create.foundation.tileEntity.SmartTileEntity; +import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; +import com.simibubi.create.foundation.utility.LerpedFloat; +import com.simibubi.create.foundation.utility.LerpedFloat.Chaser; + +import net.minecraft.block.BlockState; +import net.minecraft.client.Minecraft; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.tileentity.TileEntityType; +import net.minecraft.util.Direction; +import net.minecraft.util.SoundCategory; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.fml.DistExecutor; + +public class StickerTileEntity extends SmartTileEntity { + + LerpedFloat piston; + boolean update; + + public StickerTileEntity(TileEntityType tileEntityTypeIn) { + super(tileEntityTypeIn); + piston = LerpedFloat.linear(); + update = false; + } + + @Override + public void addBehaviours(List behaviours) {} + + @Override + public void initialize() { + super.initialize(); + if (!world.isRemote) + return; + piston.startWithValue(isBlockStateExtended() ? 1 : 0); + } + + public boolean isBlockStateExtended() { + BlockState blockState = getBlockState(); + boolean extended = AllBlocks.STICKER.has(blockState) && blockState.get(StickerBlock.EXTENDED); + return extended; + } + + @Override + public void tick() { + super.tick(); + if (!world.isRemote) + return; + piston.tickChaser(); + + if (isAttachedToBlock() && piston.getValue(0) != piston.getValue() && piston.getValue() == 1) { + SuperGlueItem.spawnParticles(world, pos, getBlockState().get(StickerBlock.FACING), true); + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> playSound(true)); + } + + if (!update) + return; + update = false; + int target = isBlockStateExtended() ? 1 : 0; + if (isAttachedToBlock() && target == 0 && piston.getChaseTarget() == 1) + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> playSound(false)); + piston.chase(target, .4f, Chaser.LINEAR); + } + + public boolean isAttachedToBlock() { + BlockState blockState = getBlockState(); + if (!AllBlocks.STICKER.has(blockState)) + return false; + Direction direction = blockState.get(StickerBlock.FACING); + return SuperGlueEntity.isValidFace(world, pos.offset(direction), direction.getOpposite()); + } + + @Override + protected void read(CompoundNBT compound, boolean clientPacket) { + super.read(compound, clientPacket); + if (clientPacket) + update = true; + } + + @OnlyIn(Dist.CLIENT) + public void playSound(boolean attach) { + world.playSound(Minecraft.getInstance().player, pos, AllSoundEvents.SLIME_ADDED.get(), SoundCategory.BLOCKS, + 0.35F, attach ? 0.75F : 0.2f); + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryPinionRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryPinionRenderer.java index 7772d70de..df2d3b49b 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryPinionRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryPinionRenderer.java @@ -72,7 +72,7 @@ public class GantryPinionRenderer extends KineticTileEntityRenderer { } public static float getAngleForTe(KineticTileEntity te, final BlockPos pos, Axis axis) { - float time = AnimationTickHolder.getRenderTick(); + float time = AnimationTickHolder.getRenderTime(); float offset = getRotationOffsetForPosition(te, pos, axis); return ((time * te.getSpeed() * 3f / 20 + offset) % 360) / 180 * (float) Math.PI; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinRenderer.java index e05fb6ee0..618816da2 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinRenderer.java @@ -72,7 +72,7 @@ public class BasinRenderer extends SmartTileEntityRenderer { if (fluidLevel > 0) { ms.translate(0, - (MathHelper.sin(AnimationTickHolder.getRenderTick() / 12f + anglePartition * itemCount) + 1.5f) * 1 + (MathHelper.sin(AnimationTickHolder.getRenderTime() / 12f + anglePartition * itemCount) + 1.5f) * 1 / 32f, 0); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerRenderer.java index a2b7abd5c..458035ec9 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerRenderer.java @@ -27,7 +27,7 @@ public class BlazeBurnerRenderer extends SafeTileEntityRenderer { MatrixStacker msr = MatrixStacker.of(ms); IVertexBuilder vb = buffer.getBuffer(RenderType.getSolid()); - float renderTick = AnimationTickHolder.getRenderTick(); + float renderTick = AnimationTickHolder.getRenderTime(); ms.push(); msr.centre(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java index 8aca8cccd..1d4531a36 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java @@ -32,7 +32,7 @@ public class SplitShaftRenderer extends KineticTileEntityRenderer { Block block = te.getBlockState().getBlock(); final Axis boxAxis = ((IRotate) block).getRotationAxis(te.getBlockState()); final BlockPos pos = te.getPos(); - float time = AnimationTickHolder.getRenderTick(); + float time = AnimationTickHolder.getRenderTime(); for (Direction direction : Iterate.directions) { Axis axis = direction.getAxis(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java index bd74bcdf8..601aedc49 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java @@ -30,7 +30,7 @@ public class GearboxRenderer extends KineticTileEntityRenderer { final Axis boxAxis = te.getBlockState().get(BlockStateProperties.AXIS); final BlockPos pos = te.getPos(); - float time = AnimationTickHolder.getRenderTick(); + float time = AnimationTickHolder.getRenderTime(); for (Direction direction : Iterate.directions) { final Axis axis = direction.getAxis(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/wrench/WrenchItemRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/wrench/WrenchItemRenderer.java index fc0828078..03cc04bdf 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/wrench/WrenchItemRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/wrench/WrenchItemRenderer.java @@ -16,7 +16,7 @@ public class WrenchItemRenderer extends CustomRenderedItemModelRenderer b.key('B', ItemTags.PLANKS) .key('S', I.cog()) @@ -669,6 +669,15 @@ public class StandardRecipeGen extends CreateRecipeProvider { LINEAR_CHASSIS_CYCLE = conversionCycle(ImmutableList.of(AllBlocks.LINEAR_CHASSIS, AllBlocks.SECONDARY_LINEAR_CHASSIS)), + STICKER = create(AllBlocks.STICKER).returns(1) + .unlockedBy(I::andesite) + .viaShaped(b -> b.key('I', I.andesite()) + .key('C', Tags.Items.COBBLESTONE) + .key('R', I.redstone()) + .key('S', Tags.Items.SLIMEBALLS) + .patternLine("ISI") + .patternLine("CRC")), + MINECART = create(() -> Items.MINECART).withSuffix("_from_contraption_cart") .unlockedBy(AllBlocks.CART_ASSEMBLER::get) .viaShapeless(b -> b.addIngredient(AllItems.MINECART_CONTRAPTION.get())), diff --git a/src/main/java/com/simibubi/create/foundation/render/TileEntityRenderHelper.java b/src/main/java/com/simibubi/create/foundation/render/TileEntityRenderHelper.java index 0af8bcff9..0b6e7ff62 100644 --- a/src/main/java/com/simibubi/create/foundation/render/TileEntityRenderHelper.java +++ b/src/main/java/com/simibubi/create/foundation/render/TileEntityRenderHelper.java @@ -7,6 +7,7 @@ import com.simibubi.create.Create; import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionRenderDispatcher; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.utility.AnimationTickHolder; +import com.simibubi.create.foundation.utility.Debug; import com.simibubi.create.foundation.utility.MatrixStacker; import com.simibubi.create.foundation.utility.worldWrappers.PlacementSimulationWorld; diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/gl/BasicProgram.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/BasicProgram.java index 8d6f71711..2201626c1 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/gl/BasicProgram.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/BasicProgram.java @@ -43,7 +43,7 @@ public class BasicProgram extends GlProgram { super.bind(); GL20.glUniform1i(uDebug, debugMode); - GL20.glUniform1f(uTime, AnimationTickHolder.getRenderTick()); + GL20.glUniform1f(uTime, AnimationTickHolder.getRenderTime()); uploadMatrixUniform(uViewProjection, viewProjection); GL20.glUniform3f(uCameraPos, (float) camX, (float) camY, (float) camZ); diff --git a/src/main/java/com/simibubi/create/foundation/utility/AnimationTickHolder.java b/src/main/java/com/simibubi/create/foundation/utility/AnimationTickHolder.java index 4b8f410c5..b86ac025a 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/AnimationTickHolder.java +++ b/src/main/java/com/simibubi/create/foundation/utility/AnimationTickHolder.java @@ -16,7 +16,7 @@ public class AnimationTickHolder { } } - public static float getRenderTick() { + public static float getRenderTime() { return getTicks() + getPartialTicks(); } diff --git a/src/main/resources/assets/create/models/block/sticker/block.json b/src/main/resources/assets/create/models/block/sticker/block.json new file mode 100644 index 000000000..1ece065f4 --- /dev/null +++ b/src/main/resources/assets/create/models/block/sticker/block.json @@ -0,0 +1,71 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "0": "block/piston_bottom", + "1": "block/piston_inner", + "3": "create:block/sticker", + "4": "create:block/sticker_side", + "particle": "block/piston_bottom" + }, + "elements": [ + { + "from": [0, 0, 0], + "to": [16, 8, 16], + "faces": { + "north": {"uv": [0, 8, 16, 16], "texture": "#4"}, + "east": {"uv": [0, 8, 16, 16], "texture": "#4"}, + "south": {"uv": [0, 8, 16, 16], "texture": "#4"}, + "west": {"uv": [0, 8, 16, 16], "texture": "#4"}, + "up": {"uv": [0, 0, 16, 16], "texture": "#1"}, + "down": {"uv": [0, 0, 16, 16], "texture": "#0"} + } + }, + { + "from": [0, 8, 0], + "to": [16, 16, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 16, 8]}, + "faces": { + "north": {"uv": [0, 0, 16, 8], "texture": "#4"}, + "east": {"uv": [0, 0, 16, 8], "texture": "#4"}, + "south": {"uv": [0, 0, 16, 8], "texture": "#4"}, + "west": {"uv": [0, 0, 16, 8], "texture": "#4"}, + "up": {"uv": [0, 0, 8, 8], "texture": "#3"} + } + }, + { + "from": [0, 8, -0.95], + "to": [16, 16, 0.05], + "faces": { + "south": {"uv": [0, 0, 16, 8], "texture": "#4"} + } + }, + { + "from": [0, 8, 15.95], + "to": [16, 16, 16.95], + "faces": { + "north": {"uv": [0, 0, 16, 8], "texture": "#4"} + } + }, + { + "from": [15.95, 8, 0], + "to": [16.95, 16, 16], + "faces": { + "west": {"uv": [0, 0, 16, 8], "texture": "#4"} + } + }, + { + "from": [-0.95, 8, 0], + "to": [0.05, 16, 16], + "faces": { + "east": {"uv": [16, 0, 0, 8], "texture": "#4"} + } + } + ], + "groups": [ + { + "name": "Piston Block", + "origin": [8, 8, 8], + "children": [0, 1, 2, 3, 4, 5] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/sticker/block_powered.json b/src/main/resources/assets/create/models/block/sticker/block_powered.json new file mode 100644 index 000000000..ee3244b46 --- /dev/null +++ b/src/main/resources/assets/create/models/block/sticker/block_powered.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/sticker/block", + "textures": { + "4": "create:block/sticker_side_powered" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/sticker/head.json b/src/main/resources/assets/create/models/block/sticker/head.json new file mode 100644 index 000000000..b2b808c18 --- /dev/null +++ b/src/main/resources/assets/create/models/block/sticker/head.json @@ -0,0 +1,41 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "2": "block/piston_side", + "3": "create:block/sticker", + "particle": "block/piston_bottom" + }, + "elements": [ + { + "from": [1, 8, 1], + "to": [15, 13, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [9, 16, 9]}, + "faces": { + "north": {"uv": [8.5, 0, 15.5, 2.5], "texture": "#3"}, + "east": {"uv": [8.5, 0, 15.5, 2.5], "texture": "#3"}, + "south": {"uv": [8.5, 0, 15.5, 2.5], "texture": "#3"}, + "west": {"uv": [8.5, 0, 15.5, 2.5], "texture": "#3"}, + "up": {"uv": [8.5, 8.5, 15.5, 15.5], "texture": "#3"}, + "down": {"uv": [0.5, 8.5, 7.5, 15.5], "texture": "#3"} + } + }, + { + "from": [6, 3, 6], + "to": [10, 8, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [14, 11, 14]}, + "faces": { + "north": {"uv": [0, 0, 5, 4], "rotation": 90, "texture": "#2"}, + "east": {"uv": [0, 0, 5, 4], "rotation": 90, "texture": "#2"}, + "south": {"uv": [0, 0, 5, 4], "rotation": 90, "texture": "#2"}, + "west": {"uv": [0, 0, 5, 4], "rotation": 90, "texture": "#2"} + } + } + ], + "groups": [ + { + "name": "Piston Head", + "origin": [14, 28, 14], + "children": [0, 1] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/sticker/item.json b/src/main/resources/assets/create/models/block/sticker/item.json new file mode 100644 index 000000000..c8c48ec47 --- /dev/null +++ b/src/main/resources/assets/create/models/block/sticker/item.json @@ -0,0 +1,104 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "0": "block/piston_bottom", + "1": "block/piston_inner", + "2": "block/piston_side", + "3": "create:block/sticker", + "4": "create:block/sticker_side", + "particle": "block/piston_bottom" + }, + "elements": [ + { + "from": [0, 0, 0], + "to": [16, 8, 16], + "faces": { + "north": {"uv": [0, 8, 16, 16], "texture": "#4"}, + "east": {"uv": [0, 8, 16, 16], "texture": "#4"}, + "south": {"uv": [0, 8, 16, 16], "texture": "#4"}, + "west": {"uv": [0, 8, 16, 16], "texture": "#4"}, + "up": {"uv": [0, 0, 16, 16], "texture": "#1"}, + "down": {"uv": [0, 0, 16, 16], "texture": "#0"} + } + }, + { + "from": [0, 8, 0], + "to": [16, 16, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 16, 8]}, + "faces": { + "north": {"uv": [0, 0, 16, 8], "texture": "#4"}, + "east": {"uv": [0, 0, 16, 8], "texture": "#4"}, + "south": {"uv": [0, 0, 16, 8], "texture": "#4"}, + "west": {"uv": [0, 0, 16, 8], "texture": "#4"}, + "up": {"uv": [0, 0, 8, 8], "texture": "#3"} + } + }, + { + "from": [0, 8, -0.95], + "to": [16, 16, 0.05], + "faces": { + "south": {"uv": [0, 0, 16, 8], "texture": "#4"} + } + }, + { + "from": [0, 8, 15.95], + "to": [16, 16, 16.95], + "faces": { + "north": {"uv": [0, 0, 16, 8], "texture": "#4"} + } + }, + { + "from": [16, 8, 0.05], + "to": [17, 16, 16.05], + "rotation": {"angle": 0, "axis": "y", "origin": [9, 8, 8]}, + "faces": { + "west": {"uv": [0, 0, 16, 8], "texture": "#4"} + } + }, + { + "from": [-1, 8, -0.05], + "to": [0, 16, 15.95], + "rotation": {"angle": 0, "axis": "y", "origin": [7, 8, 8]}, + "faces": { + "east": {"uv": [0, 0, 16, 8], "texture": "#4"} + } + }, + { + "from": [1, 9, 1], + "to": [15, 14, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [9, 17, 9]}, + "faces": { + "north": {"uv": [8.5, 0, 15.5, 2.5], "texture": "#3"}, + "east": {"uv": [8.5, 0, 15.5, 2.5], "texture": "#3"}, + "south": {"uv": [8.5, 0, 15.5, 2.5], "texture": "#3"}, + "west": {"uv": [8.5, 0, 15.5, 2.5], "texture": "#3"}, + "up": {"uv": [8.5, 8.5, 15.5, 15.5], "texture": "#3"}, + "down": {"uv": [0.5, 8.5, 7.5, 15.5], "texture": "#3"} + } + }, + { + "from": [6, 4, 6], + "to": [10, 9, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [14, 12, 14]}, + "faces": { + "north": {"uv": [0, 0, 5, 4], "rotation": 90, "texture": "#2"}, + "east": {"uv": [0, 0, 5, 4], "rotation": 90, "texture": "#2"}, + "south": {"uv": [0, 0, 5, 4], "rotation": 90, "texture": "#2"}, + "west": {"uv": [0, 0, 5, 4], "rotation": 90, "texture": "#2"} + } + } + ], + "groups": [ + { + "name": "Piston Block", + "origin": [8, 8, 8], + "children": [0, 1, 2, 3, 4, 5] + }, + { + "name": "Piston Head", + "origin": [14, 28, 14], + "children": [6, 7] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/sticker/sticker.bbmodel b/src/main/resources/assets/create/models/block/sticker/sticker.bbmodel new file mode 100644 index 000000000..0a341360e --- /dev/null +++ b/src/main/resources/assets/create/models/block/sticker/sticker.bbmodel @@ -0,0 +1 @@ +{"meta":{"format_version":"3.6","creation_time":1614729493,"model_format":"java_block","box_uv":false},"name":"","parent":"","ambientocclusion":true,"front_gui_light":false,"visible_box":[1,1,0],"resolution":{"width":16,"height":16},"elements":[{"name":"cube","from":[0,0,0],"to":[16,8,16],"autouv":0,"color":6,"locked":false,"origin":[8,8,8],"faces":{"north":{"uv":[0,8,16,16],"texture":4},"east":{"uv":[0,8,16,16],"texture":4},"south":{"uv":[0,8,16,16],"texture":4},"west":{"uv":[0,8,16,16],"texture":4},"up":{"uv":[0,0,16,16],"texture":1},"down":{"uv":[0,0,16,16],"texture":0}},"uuid":"9189c687-ec3f-0483-bb94-8eb1610bb0f7"},{"name":"cube","from":[0,8,0],"to":[16,16,16],"autouv":0,"color":6,"locked":false,"origin":[8,16,8],"faces":{"north":{"uv":[0,0,16,8],"texture":4},"east":{"uv":[0,0,16,8],"texture":4},"south":{"uv":[0,0,16,8],"texture":4},"west":{"uv":[0,0,16,8],"texture":4},"up":{"uv":[0,0,8,8],"texture":3},"down":{"uv":[0,0,0,0],"texture":null}},"uuid":"c915a8a9-e0c7-0d13-5267-953429b366f5"},{"name":"cube","from":[1,12,1],"to":[15,17,15],"autouv":0,"color":1,"locked":false,"origin":[9,20,9],"faces":{"north":{"uv":[8.5,0,15.5,2.5],"texture":3},"east":{"uv":[8.5,0,15.5,2.5],"texture":3},"south":{"uv":[8.5,0,15.5,2.5],"texture":3},"west":{"uv":[8.5,0,15.5,2.5],"texture":3},"up":{"uv":[8.5,8.5,15.5,15.5],"texture":3},"down":{"uv":[0.5,8.5,7.5,15.5],"texture":3}},"uuid":"838bfc74-3754-755e-97b9-dc8f49cb4cc4"},{"name":"cube","from":[6,7,6],"to":[10,12,10],"autouv":0,"color":6,"locked":false,"origin":[14,15,14],"faces":{"north":{"uv":[0,0,5,4],"rotation":90,"texture":2},"east":{"uv":[0,0,5,4],"rotation":90,"texture":2},"south":{"uv":[0,0,5,4],"rotation":90,"texture":2},"west":{"uv":[0,0,5,4],"rotation":90,"texture":2},"up":{"uv":[0,0,4,4],"texture":null},"down":{"uv":[0,0,4,4],"texture":null}},"uuid":"e380ceaa-57a4-7e47-45d8-238ff048b7cd"}],"outliner":[{"name":"Piston Block","origin":[8,8,8],"uuid":"d35280bd-4aab-971b-e553-24b5af733d45","export":true,"isOpen":false,"locked":false,"visibility":true,"autouv":0,"children":["9189c687-ec3f-0483-bb94-8eb1610bb0f7","c915a8a9-e0c7-0d13-5267-953429b366f5"]},{"name":"Piston Head","origin":[14,28,14],"uuid":"6c824c11-53c5-d20a-8857-1867915ba892","export":true,"isOpen":true,"locked":false,"visibility":true,"autouv":0,"children":["838bfc74-3754-755e-97b9-dc8f49cb4cc4","e380ceaa-57a4-7e47-45d8-238ff048b7cd"]}],"textures":[{"path":"F:\\Create\\Attacher\\Sticker Textures\\piston_bottom.png","name":"piston_bottom.png","folder":"Sticker Textures","namespace":"","id":"0","particle":true,"visible":true,"mode":"bitmap","saved":true,"uuid":"fd815e7a-cd5f-a1d8-9ed5-64cee6940ea0","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABZUlEQVQ4T4VTsYqDQBRcm1RGqyMgyRVBAlbCGdsjET/Y0s6QxibcBwSrMwjhKo2Vjce8u9HVC9xrdnk7Ozvz3lsjjuNe/UZd17Lruk7WxWKhbNvm8Z8VeAME9nKp3vZ7ATRNIysOv+535e52wx75l9VKSC3LUlmWKSMMwz6KIkmQoLheZa+Dy7IUQuY3m81IEASBsPJVXASAAVUg1dUAUxTFj4LX9XoAAwTw++Gg2rYVS7w8V/l5uynD9/3e3W4n0ngJr0A2Vs/zBFNV1aB0QoCX8YJpmhMQlDCgiLUAaZ7nYxdI8KwLjuOInXkhJwSsuN7CZzm9kGIBc3A8HtXH5SJe2SrOBfIMXSUKWz8eIwFAJOGg6HMxby2wAwHmAAWceySR3krd4mDBdV1RCfmQjk6cT6eJJU4gcbCTpunYBRzQ91w6lbAetJMkyTiJ+txDMsda/xMo3NPPBBC+ML4v4r8vrGO+ARsXKQWAtEm4AAAAAElFTkSuQmCC"},{"path":"F:\\Create\\Attacher\\Sticker Textures\\piston_inner.png","name":"piston_inner.png","folder":"Sticker Textures","namespace":"","id":"1","particle":false,"visible":true,"mode":"bitmap","saved":true,"uuid":"b94d7326-7db9-4e58-dfb6-169b5ecac9fd","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABs0lEQVQ4T4VTsWoCQRR81wiCelW00QhyCFZK1MImqFj4E8HfEC0sRPE3JD9gaaeksZFgLYdgFCGmOhUUG8O85D3vYkK22b13s7PzZmeNSqVyoe/hOI4sdTZN86bmxhsgMINBesjluL7b7XgG2cf7O1nJpK5Rv4tECKShUIhGoxEZ+Xz+Ui6XuSAEstkNXq1WTCgksVjsSpDNZplVNgIkioTUns89akBu2/aXgvtoVPuEZIAfi0U6HA4kJ6PuVgnM23pNRjqdvliJBPeGAWmBQIDC4TD5/X4lXi6XvN5sNqpUCQqFws3mXq/ncb9er9NisVBFOHAymRDfgmVZ7AEGpD3VatRqtfjb5/Px3Gw2aTgceoxUAlyjOA4jq9UqdTodVXA6najdbtNzv+8xkluAglKpRK/TKW+AWZlMhrrdrqeFRqNBs9mMjURWoNTZ768EQIMESlKpFMXjcSU4Ho+03W75VmQAqwTIAZh/hkUSJydCnTul2gJMxEDSECBc48t4zGokfZJAwYEMpupb+Ct97jiLT6ghL4PB4JpENxCS3bGWfzDu18eE08/ns975f08YeMF8ApBNGgW9XdHyAAAAAElFTkSuQmCC"},{"path":"F:\\Create\\Attacher\\Sticker Textures\\piston_side.png","name":"piston_side.png","folder":"Sticker Textures","namespace":"","id":"2","particle":false,"visible":true,"mode":"bitmap","saved":true,"uuid":"db3f52e8-b2d3-9368-ac4d-62cc93c62134","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAB0ElEQVQ4T4VSwWoaURQ9A8WmzTg2NNFENIIdEl0UIcZFFw2R+An5gf6BX+GfuHfpJijtQkiiELqx0iyMIlHTwowGEglMOc/c8U0J5G7evHvvnHvOeddot9tet9tFbHYGxgfrvToZxv43SE3Ps/bL+4JMJgOjWq16/X4fn0MXuJ062N6K+ADuzimk5icBvDM3cP7XRiqVglGpVLzJZILc5rXeg821N/i5KIC1k0Tfr909PKnvq7tPiEajMMrlssfE4/AHPlrrAZC5daDuptvBH/c+UHub+LqUWSqVFADDcRx1LhYLdYZCIUQiK0kBhOd+I5fLeXY6rWpbsRiSySRc18XvXk/dp+OxOrPZrOoZjUZqEPM3wyF8AHtvD5ZlwTTNQNPR8bE/eD6fYzAY+KCtVmspIRIOQwA4XeRwCvPxeBz6z8I2AECaolcovpQjYEACGRSLRXQuL33NnHBweKiYMC+hs6RHzmy2lEAAaZap9IOhG0qDJQjsA+TzeWWgGCQaKYl5ASED3R/1CmRg27Yq0DRS50t8bzYDkgRU+ghWr9dXr6Dr/p+6MBE/ZF9qtRqMQqHg7SYSappOWZzW5chySV+j0VgCsInry9VlvLa+es8/A5wUOjLC82gAAAAASUVORK5CYII="},{"path":"F:\\Create\\Attacher\\Sticker Textures\\sticker.png","name":"sticker.png","folder":"Sticker Textures","namespace":"","id":"3","particle":false,"visible":true,"mode":"bitmap","saved":true,"uuid":"d37f6ff6-f6ff-f4aa-4402-5bccef23d620","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAADh0lEQVRYR+1XPUxTURQ+TQu8wiu00ECJCkaJxhgwymRAY4IDYTNGBxiMJG4OEBclcTJBFwODmwmGAQYd3AiLiTEqgwECLtVUtETTgi0t5UEf8sgz3ymneW35Tetgwlneve/de853v3v+nu35wBNzYnaWhl6M2ugA0n2707zY1ER3eu/bOl+2mYpaQh7Vty8NMS1MurZOozff2GxQdFDjYkX2Tk5Omg8/PCBfg4NBKKpCuqbzMhir9fpI14kUhSgUCVM4YNCjlsfU3NxsO9CpdzreyMiIGQwG6b36lty+TV4WD9vZiN/vp5HocMb7Vu0K1dfXU1dXV2EA9Pf3m4uLi3TO+428ioMBOFUPLbjaCMAaiz/xPKnFKKIbNBM5SdXV1dTX11cYAD09PSaMqompNEnRxCodu3CdACz7fcnRS7xucHCwMAD25Xk7LCqIDxwCOGTgkIH/m4FCFKO8GChEOc4LQD6bC7GXU7FUs/aGGOtMbqyRs6iUphKneX7GOZ2qcEWl/BwPeNLVDPO8GhIoQDUrT0ywcl9lyojTrXLZhKDMiiTjGg+/Gue4mmHcPdZhSiMi61R7BQ+1zWXCGE8RNCtoVIY6xlLVcPzZLfPjlJ+utpzlNWvJVFORNrrFiMznfszTieN11H53mPffe9dtoguKL0XJ2NgkR5Gd1NIyMowMNemJdExPLw+lALweuGGGfkVYKejfTXANofgSucsUutb7Kg2AT7uaoJWVGNX66tMqcFKwEwoH+R2+5QAAA1Ba665kAAADwTVAhPbaI172AzCAsRWAKIVBiDSo6APJodD3wBeSxnVHBqAUMv15ns431mUQAVDyXdiyXoG3ooZ+/p4jpbgsYx8DIOKmVARrI8sLlL4CaxQIAzAWX03tAt0Y4wkGsqNAfECcCy239RqsiPQ/q+SurOKueV8AQD/ACAN7AbDeNQyLD1hBbHsFOKHVB4Ru2SgMYC5gsp0ww4iSSTuAwQecxa5cBrKjQJwwvLTGeUGcUa5guyiQMMz2AWFBwME5c3wAAKwM7BWG20bB1omzo0B0ye+Yy+Uhb1U5O2XaB6xhyGGXlXhESanTzklqtzCEkyEZqWXlnBfwxDuIJKkcJ0QqRrqFw4Fua7rFxlOOmRxSdkzFhp76D1QVIkMntaSGtPUFzgWY45mTirPDENasxai1JkDRxAqD2C4K8i5Gu935v/72F6SUUT/55o1qAAAAAElFTkSuQmCC"},{"path":"F:\\Create\\Attacher\\Sticker Textures\\sticker_side.png","name":"sticker_side.png","folder":"Sticker Textures","namespace":"","id":"4","particle":false,"visible":true,"mode":"bitmap","saved":true,"uuid":"b6008321-379a-f043-b8b9-8285c50d2ce8","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACGElEQVQ4T5WSS2gTYRSFz2wCgUxSayeToqMRxyqEPDQmqEVtJAgKAdfuFFxLcdOFIqKLbkRcC3YhuHXXneKDGghJGwYC2o5IOjHNODU2j1VARu4t/zStQfSufube8537GOn+3G3Xsh08X3gp4T/i5o3rrqYqkF69WHA3N220fji49+jxP0Ee3r3jRvYrmJhQIRHpZ28L++QxEPHB/NO/Qp49mXeLhgGh4Q6qtSrelpZx9LCGs4kEbs3OjYSIcb/ULcxkTyEVS0Ei4uLSe56+3e4xZFQnwpnE4+My11+dvgBp7xIvXjrvEuTIgUlvJzTz128bIPG7Nx+4O2+Jo64wDKHiveI/AIa5xu0L+vHYCTeiKjwOBTm3bAefa5/YnQxojIR+bOeMDXsDi68/smAwGODalRleEp2YckvlmveXTJ+O4aA6ufuMva0BdF2HpmnodruoVCo4pIVZtG59R6FQ4Hez2eScPObj00vJZNJVFAXpdBrBYBCBQICLOp0OTNNkkRD3+31YlgXHttHp9eA4DqR8Pu+GZBn61BQDyH37pG12oiB4NBr1xPRNUVUUi8UdAH0IhUIsIPdSqYTLxgqMXxJaJ1PIZrPsTEaUp/d6o7ENyOVyWC6XmUoJPl29jshKFWuQED53BpFweFeX5uoqj+EBSCQg1Inowu/3Ix6PM5QWLIJqGZDJZFxxOp/Px3kxilc99CDwcM1vBi4whPcwgQ8AAAAASUVORK5CYII="},{"path":"F:\\Create\\Attacher\\Sticker Textures\\sticker_side_powered.png","name":"sticker_side_powered.png","folder":"Sticker Textures","namespace":"","id":"5","particle":false,"visible":true,"mode":"bitmap","saved":true,"uuid":"1c9b6770-8e6d-ef0b-3c7b-a3e4be8da6a6","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACNElEQVQ4T5WSTWgTYRCG3zU0EM2P/Vk2NQaRNo00mLQmESVoG81FTzl7U+hZxEsPFhE99CIiHgv2IHj11ptilTQQQlujQZO2iEmadtk0Nj8ohMavzJTd1hpEv9O338z7zDszK92fvC2Kqobnsy8l/Me5dfOGcCsypFcvZkWlomJzS8PUo8f/BHl4765w9sro61MgEel7YxvdtuMg4oPpp3+FzDyZFslMBrqGHSxnl/E2tYiBU25c9PsxcWeyI0Rvd+1bEePnz2HENwKJiHOJd9x9tdpgSCcnemUS9/TYOP965DKkw0Mcu3JJEOS0q9+YCfX8dX0DJJ5/857dGUPstIWDEEo+LP4DkFldYfs63es7I5yKzO3QocqbqoZc9gtXpwLUhn/Qs7/GkrqBudcLLGi1WohfG+ch0Yoplkhnjb8kEvLhpNL/+xrbWz9xwuuF2+1GvV7H51QKAy55z8G6hqvxON/L5TLHTL0WXr0UCASELMsIBoOw2+2wWq2cVKvVUM7lWKSLm80misUiNFVFrdGApmmQYrGYcNhsGBwaYgBVp9NWVSSWlvgeGR1Ft8djiOlNVhQkk8l9AD04HA4WSJUK5tNpLHz4hKwkMOE/i7FQCCvVKhcid+SiUCrtAaLRKBbTaaZSwLqzg3yhgJnMR6wd+YVn4QtwyTKcw8OGy9V8ntswAFRZh5AT3cUxiwUhnw/bXV08YP1QLgPC4bDQV2c2mzmut3K03ebvHyaTIST7B3N2AQhkNoSNVX+GAAAAAElFTkSuQmCC"}]} \ No newline at end of file diff --git a/src/main/resources/assets/create/textures/block/sticker.png b/src/main/resources/assets/create/textures/block/sticker.png new file mode 100644 index 0000000000000000000000000000000000000000..75429c8afeec9968fb691653b77e393f2c02fe03 GIT binary patch literal 1509 zcmVEX>4Tx04R}tkv&MmKpe$iQ$>-AgBe5|GSuQ=K~%(1s#pXIrLEAagUO{|(4-+r zad8w}3l4rPRvlcNb#-tR1i=pwH#a9m7b)?7NufoI2gm(*ckglc4iFj@rdeGRfTr7K zDjt)vxmBs>6+s9PF@}iDEF+O#%)obi-6O!)yC~1{KlkV8SMwGF0uu2YGfbO!gLr1s zHaPDSi>xH8#OK80CS8#Dk?V@bZ=8!R3p`UaGpTuEkyt8ru+qV-WNO6I#9>v_DPPEX zta9GstW|2Pbx;1nP+nh2bDic0;#figNk~voLm3s=h|;Q)Vj)HQF(3c1>rawPAy*lU z91EyIgY5dj|KNAGR$*$=OA5t+?ia`T7zKKEfo9!tzK)BVfh)c3uQq_$Ptxmc zEqnwFYy%h9ZB5w&E_Z;TCqp)6R|?V;3I*W(jJ_!c4Bi5LYhG`yeVjf38R}~J1~@nb zB1Otx_jz}3XK(+WY4!I5jmC1ab>4+|00006VoOIv0Gj}h0Ekwf`q2OY010qNS#tmY zE+YT{E+YYWr9XB6000McNlirueSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{00X^AL_t(o!|j*BYa2%t#(%O_(yX+OB_k9Gw-v38OK5A8 z-a>jPvyt2H~ zj-^%A!)nJ`%Oy=3NDBTg%g)ZcH}k&ly*C@X_x*Q+&D~w@KiG)z9JqaJd2nN4fiJ%L zI=1}NCj()m$Qi|dwbpShq3jkq=h%+&K z6(V@I_I>Wm-UZ;f9bbg?_4R>in*3(`LblikplQYV=H|ClDizinKSstsazCbAF0-<- z64PGB229h$wrxK9D@DE=nAD9Nl}ZKEH2E@_K|jjjxej&dvs1U#+Ly8c+YSsqJ~-y_ zaIDd)^5%zg*tX5@tp?B-j<-p@F{{>G;u4p*#H+{cTg!u2u{OlSjfI65G8DGs|2<*= zYinx*+qPMna{%yq9rQ$+t=78$T+_FM4wpy+@Nhpzp-^CTbu|X?UoIqC*v+oAHhHuK z#p%F_o;9$CZL^e@K`%$*HC^VlDtq>#G8j4^y@(j`DFEF5F-Cj}w|}g@0O)wZ<)M@fBO=u4$xd_dq{`Bq!w;dsq4VZZ1HactOT_Wh65kKLOJpPh z!Vu&ro^8PEbtq1!>3Ds-UgyHFh2wf6jh;2e=1EuL_xhZiIFyQI<=k;Caz>GwWd?^T zmLu!5QKKPhhjm2*fY)?`#WQ*Jp3R7{Qvvh_9pyBjuLzn@RGo*4fY)^KhDNQU4%a_; zOHImVgxb_-Bt~Jxr)YK?7Yossk&_$oDMgD0@TYej+qZcq;V3!)nr*2z5Jp2!q}lTq zX|@UxA8!8`k<2KChYn?weq^^D5#+?PQYH+4_K+rw0wj(p5! zgyLH1q1Rzvt5VYQVraJObxWSUaq<{YRDBVO>#ikzhwf zD7)>m4asN}LIH|oM%9SOwS3fQsP@v#KhttP3-G1VKv)|XsS}|#+*nKfDMiw-IaH;d zNUKtO9%((Uiqv>M2|%JJC-Hm19Jk%V$Xr2o+vv$j5|e4PL|n~P8+f>%V=;fk!INrG zWQKI?`9Zmz*LKGI{c6rcLYyP0hQbfRFARYYV5F|%o<0qn`VusObft=v22dyz*s+6> z?DaZ9+9lE|)!x7QHjUPaicr{$MwRbisq#81N-3X)BkCE_@mk<-_;kcS%!$$n00000 LNkvXXu0mjfMw-B5 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/sticker_side.png b/src/main/resources/assets/create/textures/block/sticker_side.png new file mode 100644 index 0000000000000000000000000000000000000000..4e82caf62d6708a64e5eac1c4f455c00e3d2d8a3 GIT binary patch literal 6761 zcmeHKX;f3$vJQx%1SQQNlS2$n2q7T^GIT&OL5UD%5oFA8LIQ*nl0X6?iUX}8B7=&6 zGlK$(LaQx!5fDWiP#PSNNkmXY2GK??V(UE#sQ9k0?{lqp|CzN;l3n|&uWHw>s(tou z7pJwe)eO{NFxYImJZSUbda%Of`&a$nbt>9cZZ8v8yisP~xo{osSQC)*gM-pDX;BD2sfM zOpqBo=qTGI3KUS@d#g716P>7$q(6g+BTWb5c4zMAQM_d*(uSAOWwkNI2J?e%*jK0C zaI6V&nKg5j!6=O$a3^M@e&AGq?@I3n2XCjvmF~RYpt0FE=NC#$%Rq4pNF9v6_D6Kf zZJU;!jQGchotwC^cAR&w?$wS|1rJ&N*})A0Qo_ATS`)|)hnGm|uKS47uMZ4gUOpbR zw#{~#AM!}P#Fhqlpv;MboYQV6odo4@omKd@=BM?(74LZPPLxP#SfxDNq_5vL<^Ze@ z{ws?23=Xf4dYX04W$U2HiDg=Q|7f^><$g%dwYG)v(F@I~+1GnaI=fErD)j0Smqo`R z`dae>Js7%8J-rV@5GH{QP6Sm`?2D_89EZ!7IIk!tA9qraEpOP3hT9J?9dPkAMBGqsXc~S{lKK!^m1a z_?S#f8=qF_#XcMHpf&Im!>Mf-_W4yqJ~3+erq9sT(aN>Qwy9`^3M+p>u<2qJ?o&>nq`058;cKy7T24N&lA<1S!HuW+sAi!Nt%~i&x(B1{(^$?c!QAO zd&nGahTz=T+>N1UsKI`vFD{i0ZtA^|mvFJZ@8=NbXR&t;1P^4IOVl*BT!`lmCCxH; zQ9b8Qg`T1E(^xFb_D!dwDlT4CtnYg2{19@5>9m~r-5v&e<7}ID3Gx!kGOrX}HP-sD zix7*;n-TF*RUGUx8aSAG8B=)wf_~cV=Dn*ekK|8(qWascYnu6Hv1!CL1JuhL(?^o> zB*xoXpTGL9Yjm{#k%fWZD7-1Ti5j`s&sAMkB{+!Kl=a~Fa=RjyWll^<;fI-fir{KV zNdGq`v;7L^%sF#Oppuh4T_bLR$ z*ZsjHNB=s+Ynpm=>4gH~K9#G>?sB}{vi+#{KqmxbzE>(5xCMh_v}+Qz{q1Y_ z&s|)31tFC1q?q!5^hQ5(xD5X?n~z zo=Q72a+u4C?WUO=qBWUcT)e%#Eh{VW>{z;e%{D=v;oG|-=H1aYjj1V5;3KadFL~bR z^g?sv6N{9~y6u(y#Vx%3Ng92%j6>pe?Zww0Wm|J8*(L+@4!>lFWKU;}>UAaN^E*Mwzb>cUJ#!};K!IeKUmUgCiw+lInCUc-@<%Iu3V7TuSjGwGxYd1@;s$^DLU- zJpqH332gUJp*CaWT*8%rjFZ32Y*mX0 z706E3=45O8>#OG72ynMc-m_hwHV=2NE6~=X+BM%x1)g)ZA%FYroPdVxMfC7+ZD07D zSX0mWzF83wLLHS#4FrL(%ud&Mcnkf6-Cot2zhu&(@X&%_ zp>T0Q_4DedOa1o$Gx_D78Zaxt3{G*!TbzkvC3~%iJl|MZ$O*1)s%EZlG7h*ET`214 zDqJ627~%Y(%Edo`EQ`u{l4I_8APHA z%IaF`=#ckfIFi|*z>LWOS%8^LAcRr_2BWN$ z37PB=K!RieLHsal)KJ+q6q3)eMs2WUU>QOxz~kFTivag%Cl7XX2%E$~t+Y|2$jA_Z z0FW?|GC^pVm@KnKDR{}yf4LZgLMkAV5Nnhd!v#qNMF0|ShBw2a?PUB&9Lh!wNfB|l zWH;KHNeXCWjp9ipLNW#;l}gQ|7G|I*2xCqnkuX>s28TmK2(&mVOv03*!^B2%iU|%H zAZCl8eCC5;NI55y1x84$Q7C90IY}jpN@x;iOLX5c?79$XRr6HEsMSijOO%1UJ^sa?*1H@p2hz;09 z0$~!PsYZpN5#p&fBgBAQr0_eG!^J>ODJ)ObSxaZQeAbbNF^De^Dm3KisYnj{Gfo&G z3RPe@YzzRu5;T#?g(#RD08O-H;m}Mh0I&%-0*S!FPoZ!Y@u5m!hEDZLPQ`(! zh&W3QmQ6HA<4HK^%iI!&W|3GVG(cjpnK+gOfn-TiP|5d!Z0ka|M&Zn`UnDM}ObHhh z383=ghjBou_{)?BUjVpEnDVfhTbbhtI3mdkZ-uqAu(bRF@&rU;D9z=p=2$ZvPBFt_ zlh;6;Oeo#>0%j0^5rzdRCgdAKhL!_`mMO0eh*=?rRzs$W0Hy>Kd4OQ3HA?O+QckHT zDkNpHT*!_fTcM}`0~~q9P1f9MW)Ma(q+tFI{BKO|JWv|;f8+TA{mf!3l1M>Oh_lF< z6%4Q?f6wzR@Mk7BsN0DpqA2=*Sk(W(Q6>`B9?}IxQB&-@1K|^+iIx<~SA+_QRI~vy zlRXiBF*6e2D7FBKqof0D+1pI{*hfj!u4Gd_%85|?D~HTm)e&r zHxLHB_er4(bq0yn4_(G*upHLXV7p=AFwwchO)nwIETO%(7zQ&ll0QnaoRyJ~P*p-_ z*s1nRQ`R-tD=7S}6%y%7?7SpYP$0iW!6x6G5}(F6wTv zeB>37I=+uuK~o#kUvt)W&l24Y_nINumTemj&h0LL>SB6j@5b%guPtbO5pm)e8u_f7 z>6QMU=a@LaUrTSFJMC(ECA(?Go#CHGN|BOUGgGV%dxLX_V1S zUw!sL3)d$FAN`ai>s25tUCC(E=Do2c+X3(NTzbL% zs!M{w41JhQ>3X%D%CH`he(NRI)Nr@plwJ+}D9wZpR!mHm<5DUJV#VsyCG2)rh2;E&6*Ij;{tgVMs@quvBgB za*pP1#Nf-9@Q93DKTkw@Z+u)Xzc;?p2bpRQU8{{oP{bjAPx literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/sticker_side_powered.png b/src/main/resources/assets/create/textures/block/sticker_side_powered.png new file mode 100644 index 0000000000000000000000000000000000000000..04a2c1e23225b0efc07e02860a6d939e7590d6b1 GIT binary patch literal 6836 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 literal 0 HcmV?d00001