Broken Thoughts

- Fixed and edited existing tooltips and ponder scenes to include behavioural changes in 0.5.1
- Fixed ponder overlay text rendering with wonky pixels
- Filter -> List Filter
- Deployers can now apply filters to a Redstone link with less required precision
This commit is contained in:
simibubi 2023-05-03 15:14:14 +02:00
parent c81e535a84
commit 9f2c511647
82 changed files with 1117 additions and 793 deletions

View file

@ -578,8 +578,8 @@ bf2b0310500213ff853c748c236eb5d01f61658e assets/create/blockstates/yellow_toolbo
5616dda664dd106d576848124fc0fc1de18d0fd3 assets/create/blockstates/yellow_valve_handle.json 5616dda664dd106d576848124fc0fc1de18d0fd3 assets/create/blockstates/yellow_valve_handle.json
7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json 7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json
b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json
a4e6b545d4b9fac623de034ab8d063b2c621742c assets/create/lang/en_ud.json b04b22fd6e7941c2b2559fbb4e28f31cf54657af assets/create/lang/en_ud.json
aac2ef619ff4e427e50aa8d2e635c311f1780b6f assets/create/lang/en_us.json a4e2558314ebba2f5ff3b121672ed3f8f57b0278 assets/create/lang/en_us.json
487a511a01b2a4531fb672f917922312db78f958 assets/create/models/block/acacia_window.json 487a511a01b2a4531fb672f917922312db78f958 assets/create/models/block/acacia_window.json
b48060cba1a382f373a05bf0039054053eccf076 assets/create/models/block/acacia_window_pane_noside.json b48060cba1a382f373a05bf0039054053eccf076 assets/create/models/block/acacia_window_pane_noside.json
3066db1bf03cffa1a9c7fbacf47ae586632f4eb3 assets/create/models/block/acacia_window_pane_noside_alt.json 3066db1bf03cffa1a9c7fbacf47ae586632f4eb3 assets/create/models/block/acacia_window_pane_noside_alt.json

View file

@ -635,7 +635,7 @@
"item.create.empty_schematic": "\u0254\u0131\u0287\u0250\u026F\u01DD\u0265\u0254S \u028E\u0287d\u026F\u018E", "item.create.empty_schematic": "\u0254\u0131\u0287\u0250\u026F\u01DD\u0265\u0254S \u028E\u0287d\u026F\u018E",
"item.create.experience_nugget": "\u01DD\u0254u\u01DD\u0131\u0279\u01DDdx\u018E \u025Fo \u0287\u01DDbbnN", "item.create.experience_nugget": "\u01DD\u0254u\u01DD\u0131\u0279\u01DDdx\u018E \u025Fo \u0287\u01DDbbnN",
"item.create.extendo_grip": "d\u0131\u0279\u2141 opu\u01DD\u0287x\u018E", "item.create.extendo_grip": "d\u0131\u0279\u2141 opu\u01DD\u0287x\u018E",
"item.create.filter": "\u0279\u01DD\u0287\u05DF\u0131\u2132", "item.create.filter": "\u0279\u01DD\u0287\u05DF\u0131\u2132 \u0287s\u0131\uA780",
"item.create.furnace_minecart_contraption": "uo\u0131\u0287d\u0250\u0279\u0287uo\u0186 \u0287\u0279\u0250\u0254\u01DDu\u0131W \u01DD\u0254\u0250u\u0279n\u2132", "item.create.furnace_minecart_contraption": "uo\u0131\u0287d\u0250\u0279\u0287uo\u0186 \u0287\u0279\u0250\u0254\u01DDu\u0131W \u01DD\u0254\u0250u\u0279n\u2132",
"item.create.goggles": "s\u01DD\u05DFbbo\u2141 s,\u0279\u01DD\u01DDu\u0131bu\u018E", "item.create.goggles": "s\u01DD\u05DFbbo\u2141 s,\u0279\u01DD\u01DDu\u0131bu\u018E",
"item.create.golden_sheet": "\u0287\u01DD\u01DD\u0265S u\u01DDp\u05DFo\u2141", "item.create.golden_sheet": "\u0287\u01DD\u01DD\u0265S u\u01DDp\u05DFo\u2141",

View file

@ -642,7 +642,7 @@
"item.create.empty_schematic": "Empty Schematic", "item.create.empty_schematic": "Empty Schematic",
"item.create.experience_nugget": "Nugget of Experience", "item.create.experience_nugget": "Nugget of Experience",
"item.create.extendo_grip": "Extendo Grip", "item.create.extendo_grip": "Extendo Grip",
"item.create.filter": "Filter", "item.create.filter": "List Filter",
"item.create.furnace_minecart_contraption": "Furnace Minecart Contraption", "item.create.furnace_minecart_contraption": "Furnace Minecart Contraption",
"item.create.goggles": "Engineer's Goggles", "item.create.goggles": "Engineer's Goggles",
"item.create.golden_sheet": "Golden Sheet", "item.create.golden_sheet": "Golden Sheet",
@ -1121,6 +1121,7 @@
"create.gui.goggles.kinetic_stats": "Kinetic Stats:", "create.gui.goggles.kinetic_stats": "Kinetic Stats:",
"create.gui.goggles.at_current_speed": "at current speed", "create.gui.goggles.at_current_speed": "at current speed",
"create.gui.goggles.pole_length": "Pole Length:", "create.gui.goggles.pole_length": "Pole Length:",
"create.gui.goggles.basin_contents": "Basin Contents:",
"create.gui.goggles.fluid_container": "Fluid Container Info:", "create.gui.goggles.fluid_container": "Fluid Container Info:",
"create.gui.goggles.fluid_container.capacity": "Capacity: ", "create.gui.goggles.fluid_container.capacity": "Capacity: ",
"create.gui.assembly.exception": "This Contraption was unable to assemble:", "create.gui.assembly.exception": "This Contraption was unable to assemble:",
@ -1925,57 +1926,49 @@
"item.create.blaze_cake.tooltip.summary": "A Delicious treat for your hard-working _Blaze Burners_. Gets them all fired up!", "item.create.blaze_cake.tooltip.summary": "A Delicious treat for your hard-working _Blaze Burners_. Gets them all fired up!",
"item.create.wand_of_symmetry.tooltip": "SYMMETRY WAND", "item.create.wand_of_symmetry.tooltip": "SYMMETRY WAND",
"item.create.wand_of_symmetry.tooltip.summary": "Perfectly mirrors Block placement across configured planes.", "item.create.wand_of_symmetry.tooltip.summary": "_Mirrors Block placement_ while present in any _Hotbar Slot_.",
"item.create.wand_of_symmetry.tooltip.condition1": "When in Hotbar", "item.create.wand_of_symmetry.tooltip.condition1": "When used on a Surface",
"item.create.wand_of_symmetry.tooltip.behaviour1": "Stays Active", "item.create.wand_of_symmetry.tooltip.behaviour1": "_Creates_ or _Moves_ its Mirror. _Sneak_ while using to open the _Configuration Interface_",
"item.create.wand_of_symmetry.tooltip.control1": "R-Click on Ground", "item.create.wand_of_symmetry.tooltip.condition2": "When used with no target",
"item.create.wand_of_symmetry.tooltip.action1": "_Creates_ or _Moves_ the Mirror", "item.create.wand_of_symmetry.tooltip.behaviour2": "_Removes_ the active Mirror",
"item.create.wand_of_symmetry.tooltip.control2": "R-Click in the Air",
"item.create.wand_of_symmetry.tooltip.action2": "_Removes_ the active Mirror",
"item.create.wand_of_symmetry.tooltip.control3": "R-Click while Sneaking",
"item.create.wand_of_symmetry.tooltip.action3": "Opens the _Configuration Interface_",
"item.create.handheld_worldshaper.tooltip": "HANDHELD WORLDSHAPER", "item.create.handheld_worldshaper.tooltip": "HANDHELD WORLDSHAPER",
"item.create.handheld_worldshaper.tooltip.summary": "Handy tool for creating _landscapes_ and _terrain features_.", "item.create.handheld_worldshaper.tooltip.summary": "_Creative mode_ tool for large-scale _landscaping_ from a distance.",
"item.create.handheld_worldshaper.tooltip.control1": "L-Click at Block", "item.create.handheld_worldshaper.tooltip.condition1": "L-Click at Block",
"item.create.handheld_worldshaper.tooltip.action1": "Sets blocks placed by the tool to the targeted block.", "item.create.handheld_worldshaper.tooltip.behaviour1": "_Targeted block_ will become the _material_ placed by the shaper.",
"item.create.handheld_worldshaper.tooltip.control2": "R-Click at Block", "item.create.handheld_worldshaper.tooltip.condition2": "R-Click at Block",
"item.create.handheld_worldshaper.tooltip.action2": "Applies the currently selected _Brush_ and _Tool_ at the targeted location.", "item.create.handheld_worldshaper.tooltip.behaviour2": "Applies currently selected _Brush_ and _Tool_ at the targeted location.",
"item.create.handheld_worldshaper.tooltip.control3": "R-Click while Sneaking", "item.create.handheld_worldshaper.tooltip.condition3": "R-Click while Sneaking",
"item.create.handheld_worldshaper.tooltip.action3": "Opens the _Configuration Interface_", "item.create.handheld_worldshaper.tooltip.behaviour3": "Opens the _Configuration Interface_",
"item.create.tree_fertilizer.tooltip": "TREE FERTILIZER", "item.create.tree_fertilizer.tooltip": "TREE FERTILIZER",
"item.create.tree_fertilizer.tooltip.summary": "A powerful combination of minerals suitable for speeding up the growth of common tree types.", "item.create.tree_fertilizer.tooltip.summary": "A powerful combination of minerals useful for _growing saplings_ in tight spaces.",
"item.create.tree_fertilizer.tooltip.condition1": "When used on a Sapling", "item.create.tree_fertilizer.tooltip.condition1": "When used on a Sapling",
"item.create.tree_fertilizer.tooltip.behaviour1": "Grows Trees _regardless_ of their _spacing conditions_", "item.create.tree_fertilizer.tooltip.behaviour1": "Creates a tree _regardless_ of its _spacing conditions_",
"item.create.extendo_grip.tooltip": "EXTENDO GRIP", "item.create.extendo_grip.tooltip": "EXTENDO GRIP",
"item.create.extendo_grip.tooltip.summary": "Boioioing! Greatly _increases reach distance_ of the wielder. Can be powered with Air Pressure from a _Backtank_", "item.create.extendo_grip.tooltip.summary": "Greatly _increases reach distance_ of the wielder. Can be powered with _Air_ _Pressure_ from a _Backtank_",
"item.create.extendo_grip.tooltip.condition1": "When in Off-Hand", "item.create.extendo_grip.tooltip.condition1": "When in Off-Hand",
"item.create.extendo_grip.tooltip.behaviour1": "Increases _reach distance_ of items used in the _Main-Hand_.", "item.create.extendo_grip.tooltip.behaviour1": "Increases _reach distance_ of items used in the _Main-Hand_.",
"item.create.extendo_grip.tooltip.condition2": "While wearing Backtank", "item.create.extendo_grip.tooltip.condition2": "While wearing Backtank",
"item.create.extendo_grip.tooltip.behaviour2": "_No_ _Durability_ will be used. Instead, _Air_ _pressure_ is drained from the Tank", "item.create.extendo_grip.tooltip.behaviour2": "_No_ _Durability_ will be used. Instead, _Air_ _pressure_ is drained from the Tank",
"item.create.potato_cannon.tooltip": "POTATO CANNON", "item.create.potato_cannon.tooltip": "POTATO CANNON",
"item.create.potato_cannon.tooltip.summary": "Fwoomp! Launch your home-grown vegetables at your Enemies. Can be powered with Air Pressure from a _Backtank_", "item.create.potato_cannon.tooltip.summary": "Launches your home-grown vegetables at Enemies. Can be powered with _Air_ _Pressure_ from a _Backtank_",
"item.create.potato_cannon.tooltip.condition1": "When R-Clicked", "item.create.potato_cannon.tooltip.condition1": "When R-Clicked",
"item.create.potato_cannon.tooltip.behaviour1": "_Shoots_ a suitable item from your _Inventory_.", "item.create.potato_cannon.tooltip.behaviour1": "_Shoots_ a suitable item from your _Inventory_.",
"item.create.potato_cannon.tooltip.condition2": "While wearing Backtank", "item.create.potato_cannon.tooltip.condition2": "While wearing Backtank",
"item.create.potato_cannon.tooltip.behaviour2": "_No_ _Durability_ will be used. Instead, _Air_ _pressure_ is drained from the Tank", "item.create.potato_cannon.tooltip.behaviour2": "_No_ _Durability_ will be used. Instead, _Air_ _pressure_ is drained from the Tank",
"item.create.filter.tooltip": "FILTER", "item.create.filter.tooltip": "LIST FILTER",
"item.create.filter.tooltip.summary": "_Controls outputs_ and _inputs_ of logistical devices with more _precision_, matching them against a _set of items_ or several _nested filters_.", "item.create.filter.tooltip.summary": "_Matches items_ against a collection of _items_ or _other filters_. Can be used in _Filter Slots_ of Create's Components",
"item.create.filter.tooltip.condition1": "When in filter slot", "item.create.filter.tooltip.condition1": "When R-Clicked",
"item.create.filter.tooltip.behaviour1": "_Controls_ item flow according to its _configuration_.", "item.create.filter.tooltip.behaviour1": "Opens the _configuration interface_.",
"item.create.filter.tooltip.condition2": "When R-Clicked",
"item.create.filter.tooltip.behaviour2": "Opens the _configuration interface_.",
"item.create.attribute_filter.tooltip": "ATTRIBUTE FILTER", "item.create.attribute_filter.tooltip": "ATTRIBUTE FILTER",
"item.create.attribute_filter.tooltip.summary": "_Controls outputs_ and _inputs_ of logistical devices with more _precision_, matching them against a _set of_ item _attributes_ and _categories_.", "item.create.attribute_filter.tooltip.summary": "_Matches items_ against a set of _attributes_ or _categories_. Can be used in _Filter Slots_ of Create's Components",
"item.create.attribute_filter.tooltip.condition1": "When in filter slot", "item.create.attribute_filter.tooltip.condition1": "When R-Clicked",
"item.create.attribute_filter.tooltip.behaviour1": "_Controls_ item flow according to its _configuration_.", "item.create.attribute_filter.tooltip.behaviour1": "Opens the _configuration interface_.",
"item.create.attribute_filter.tooltip.condition2": "When R-Clicked",
"item.create.attribute_filter.tooltip.behaviour2": "Opens the _configuration interface_.",
"item.create.empty_schematic.tooltip": "EMPTY SCHEMATIC", "item.create.empty_schematic.tooltip": "EMPTY SCHEMATIC",
"item.create.empty_schematic.tooltip.summary": "Used as a recipe ingredient and for writing at the _Schematic Table_.", "item.create.empty_schematic.tooltip.summary": "Used as a recipe ingredient and for writing at the _Schematic Table_.",
@ -1984,21 +1977,15 @@
"item.create.schematic.tooltip.summary": "Holds a structure to be positioned and placed into the world. Position the Hologram as desired and use a _Schematicannon_ to build it.", "item.create.schematic.tooltip.summary": "Holds a structure to be positioned and placed into the world. Position the Hologram as desired and use a _Schematicannon_ to build it.",
"item.create.schematic.tooltip.condition1": "When Held", "item.create.schematic.tooltip.condition1": "When Held",
"item.create.schematic.tooltip.behaviour1": "Can be positioned using the Tools on Screen.", "item.create.schematic.tooltip.behaviour1": "Can be positioned using the Tools on Screen.",
"item.create.schematic.tooltip.control1": "R-Click while Sneaking", "item.create.schematic.tooltip.condition2": "R-Click while Sneaking",
"item.create.schematic.tooltip.action1": "Opens an _Interface_ for entering exact _Coordinates_.", "item.create.schematic.tooltip.behaviour2": "Opens an _Interface_ for entering exact _Coordinates_.",
"item.create.schematic_and_quill.tooltip": "SCHEMATIC AND QUILL", "item.create.schematic_and_quill.tooltip": "SCHEMATIC AND QUILL",
"item.create.schematic_and_quill.tooltip.summary": "Used for saving a Structure in your world to a .nbt file.", "item.create.schematic_and_quill.tooltip.summary": "Used for _saving a Structure_ in your world to a _.nbt file_.",
"item.create.schematic_and_quill.tooltip.condition1": "Step 1", "item.create.schematic_and_quill.tooltip.condition1": "Creating a selection",
"item.create.schematic_and_quill.tooltip.behaviour1": "Select two corner points using R-Click.", "item.create.schematic_and_quill.tooltip.behaviour1": "Select two _corner points_ using _R-Click_. Hold _Ctrl_ and Scroll to select locations mid-air.",
"item.create.schematic_and_quill.tooltip.condition2": "Step 2", "item.create.schematic_and_quill.tooltip.condition2": "Adjusting and Saving",
"item.create.schematic_and_quill.tooltip.behaviour2": "_Ctrl-Scroll_ on the faces to adjust the size. R-Click again to Save.", "item.create.schematic_and_quill.tooltip.behaviour2": "_Ctrl-Scroll_ on the faces to adjust the size, then R-Click again to Save.",
"item.create.schematic_and_quill.tooltip.control1": "R-Click",
"item.create.schematic_and_quill.tooltip.action1": "Select a corner point / confirm save.",
"item.create.schematic_and_quill.tooltip.control2": "Ctrl Held",
"item.create.schematic_and_quill.tooltip.action2": "Select points in _mid-air_. _Scroll_ to adjust the distance.",
"item.create.schematic_and_quill.tooltip.control3": "R-Click while Sneaking",
"item.create.schematic_and_quill.tooltip.action3": "_Resets_ and removes the selection.",
"block.create.schematicannon.tooltip": "SCHEMATICANNON", "block.create.schematicannon.tooltip": "SCHEMATICANNON",
"block.create.schematicannon.tooltip.summary": "Shoots blocks to recreate a deployed _Schematic_ in the World. Uses items from adjacent Inventories and _Gunpowder_ as fuel.", "block.create.schematicannon.tooltip.summary": "Shoots blocks to recreate a deployed _Schematic_ in the World. Uses items from adjacent Inventories and _Gunpowder_ as fuel.",
@ -2011,20 +1998,16 @@
"block.create.schematic_table.tooltip.behaviour1": "Uploads a chosen File from your Schematics Folder.", "block.create.schematic_table.tooltip.behaviour1": "Uploads a chosen File from your Schematics Folder.",
"item.create.goggles.tooltip": "GOGGLES", "item.create.goggles.tooltip": "GOGGLES",
"item.create.goggles.tooltip.summary": "A pair of glasses to augment your vision with useful _kinetic information_.", "item.create.goggles.tooltip.summary": "Augments your HUD with _miscellaneous information_ about placed components.",
"item.create.goggles.tooltip.condition1": "When worn", "item.create.goggles.tooltip.condition1": "When looking at blocks",
"item.create.goggles.tooltip.behaviour1": "Shows _colored indicators_ corresponding to the _Speed Level_ of a placed kinetic component as well as _Stress Impact_ and _Capacity_ of individual components.", "item.create.goggles.tooltip.behaviour1": "_Kinetic components_ show added _Stress Impact_ or _Capacity_. _Stressometers_ show statistics of their _attached kinetic network_. Some other blocks reveal information such as item and fluid content.",
"item.create.goggles.tooltip.condition2": "When looking at gauge",
"item.create.goggles.tooltip.behaviour2": "Shows detailed information about _Speed_ or _Stress_ of the network to which the gauge is connected.",
"item.create.goggles.tooltip.condition3": "When looking at fluid containers",
"item.create.goggles.tooltip.behaviour3": "Shows detailed information about the _Capacity_ of the block and any _Fluids_ stored within.",
"item.create.wrench.tooltip": "WRENCH", "item.create.wrench.tooltip": "WRENCH",
"item.create.wrench.tooltip.summary": "A useful tool for working on kinetic contraptions. Can be used to _Rotate_, _Dismantle_ and to _Configure_ components.", "item.create.wrench.tooltip.summary": "Multi-purpose tool for working with your kinetic contraptions.",
"item.create.wrench.tooltip.control1": "Right-Click a kinetic block", "item.create.wrench.tooltip.condition1": "When used on Blocks",
"item.create.wrench.tooltip.action1": "_Rotates components_ toward or away from the face with which you interacted.", "item.create.wrench.tooltip.behaviour1": "_Rotates components_ around the clicked face. _Sneak_ while interacting to _dismantle_ components.",
"item.create.wrench.tooltip.control2": "R-Click while Sneaking", "item.create.wrench.tooltip.condition2": "When used on Contraptions",
"item.create.wrench.tooltip.action2": "_Disassembles Kinetic components_ and places them back in _your inventory_.", "item.create.wrench.tooltip.behaviour2": "_Relocates_ assembled minecart- and train-based contraptions.",
"block.create.nozzle.tooltip": "NOZZLE", "block.create.nozzle.tooltip": "NOZZLE",
"block.create.nozzle.tooltip.summary": "Attach to the front of an _Encased Fan_ to distribute its effect on Entities in _all directions_.", "block.create.nozzle.tooltip.summary": "Attach to the front of an _Encased Fan_ to distribute its effect on Entities in _all directions_.",
@ -2035,7 +2018,7 @@
"block.create.cuckoo_clock.tooltip.behaviour1": "Shows the _current time_ and plays a tune twice a day. _Activates_ once at _noon_ and at dusk, as soon as _players can sleep_.", "block.create.cuckoo_clock.tooltip.behaviour1": "Shows the _current time_ and plays a tune twice a day. _Activates_ once at _noon_ and at dusk, as soon as _players can sleep_.",
"block.create.turntable.tooltip": "TURNTABLE", "block.create.turntable.tooltip": "TURNTABLE",
"block.create.turntable.tooltip.summary": "Turns _Rotational Force_ into refined Motion Sickness.", "block.create.turntable.tooltip.summary": "Uses _Rotational Force_ to create Motion Sickness.",
"block.create.toolbox.tooltip": "TOOLBOX", "block.create.toolbox.tooltip": "TOOLBOX",
"block.create.toolbox.tooltip.summary": "Every Inventors' dearest Companion. Conveniently _holds_ a large amount of _8 Different_ item types.", "block.create.toolbox.tooltip.summary": "Every Inventors' dearest Companion. Conveniently _holds_ a large amount of _8 Different_ item types.",
@ -2046,51 +2029,29 @@
"block.create.toolbox.tooltip.condition3": "When R-Clicked", "block.create.toolbox.tooltip.condition3": "When R-Clicked",
"block.create.toolbox.tooltip.behaviour3": "Opens the _Container Interface_.", "block.create.toolbox.tooltip.behaviour3": "Opens the _Container Interface_.",
"block.create.stockpile_switch.tooltip": "STOCKPILE SWITCH",
"block.create.stockpile_switch.tooltip.summary": "Toggles a Redstone signal based on the amount of _Stored Items_ or _Fluids_ in the attached Container. Comes with a handy filter. As opposed to a _Comparator,_ the _Stockpile Switch_ allows configuration of _thresholds,_ at which signals are inverted.",
"block.create.stockpile_switch.tooltip.condition1": "When R-Clicked",
"block.create.stockpile_switch.tooltip.behaviour1": "Opens the _Configuration Interface_.",
"block.create.content_observer.tooltip": "CONTENT OBSERVER",
"block.create.content_observer.tooltip.summary": "_Detects Items_ or _Fluids_ inside _containers_, _pipes_ or _conveyors_ matching a configured _filter_.",
"block.create.content_observer.tooltip.condition1": "When observing a Container",
"block.create.content_observer.tooltip.behaviour1": "Emits a _Redstone Signal_ while the observed container has _matching_ _content_.",
"block.create.content_observer.tooltip.condition2": "When observing a Funnel",
"block.create.content_observer.tooltip.behaviour2": "Emits a _Redstone Pulse_ when a _matching_ Item is _transferred_.",
"block.create.creative_crate.tooltip": "CREATIVE CRATE", "block.create.creative_crate.tooltip": "CREATIVE CRATE",
"block.create.creative_crate.tooltip.summary": "This _Storage Container_ allows infinite replication of any item. Place next to a _Schematicannon_ to remove any material requirements.", "block.create.creative_crate.tooltip.summary": "This _Storage Container_ allows infinite replication of items.",
"block.create.creative_crate.tooltip.condition1": "When Item in Filter Slot", "block.create.creative_crate.tooltip.condition1": "When Item in Filter Slot",
"block.create.creative_crate.tooltip.behaviour1": "Anything _extracting_ from this container will provide an _endless supply_ of the item specified. Items _inserted_ into this crate will be _voided._", "block.create.creative_crate.tooltip.behaviour1": "Anything _extracting_ from this container will provide an _endless supply_ of the item specified. Items _inserted_ into this crate will be _voided._",
"block.create.creative_crate.tooltip.condition2": "When next to Schematicannon",
"block.create.creative_crate.tooltip.behaviour2": "Provides any material required by the Schematic.",
"item.create.creative_blaze_cake.tooltip": "CREATIVE CAKE", "item.create.creative_blaze_cake.tooltip": "CREATIVE BLAZE CAKE",
"item.create.creative_blaze_cake.tooltip.summary": "A very special treat for your _Blaze Burners_. After eating this cake, Blaze Burners will _never run out of fuel_.", "item.create.creative_blaze_cake.tooltip.summary": "A very special treat for your _Blaze Burners_. After eating this cake, Blaze Burners will _never run out of fuel_.",
"item.create.creative_blaze_cake.tooltip.condition1": "When Used", "item.create.creative_blaze_cake.tooltip.condition1": "When Used",
"item.create.creative_blaze_cake.tooltip.behaviour1": "_Cycles_ a Blaze Burner's heat level.", "item.create.creative_blaze_cake.tooltip.behaviour1": "_Cycles_ a Blaze Burner's heat level.",
"block.create.controller_rail.tooltip": "CONTROLLER RAIL", "block.create.controller_rail.tooltip": "CONTROLLER RAIL",
"block.create.controller_rail.tooltip.summary": "A _uni-directional powered rail_ capable of _fine control_ over a minecarts' _movement speed_.", "block.create.controller_rail.tooltip.summary": "A _uni-directional_ powered rail with _variable speed_, controlled by the _signal strength_ supplied to it.",
"block.create.controller_rail.tooltip.condition1": "When Powered by Redstone",
"block.create.controller_rail.tooltip.behaviour1": "_Accelerates_ or _Decelerates_ passing _minecarts_ corresponding to the _signal strength_. Propagates redstone power to adjacent controller rails. Powering two controller rails with different strengths will cause tracks between them to interpolate their signal.",
"item.create.sand_paper.tooltip": "SAND PAPER", "item.create.sand_paper.tooltip": "SAND PAPER",
"item.create.sand_paper.tooltip.summary": "A rough paper that can be used to _polish materials_. Can be automatically applied using the Deployer.", "item.create.sand_paper.tooltip.summary": "Can be used to _refine materials_. The process can be automated with a Deployer.",
"item.create.sand_paper.tooltip.condition1": "When Used", "item.create.sand_paper.tooltip.condition1": "When Used",
"item.create.sand_paper.tooltip.behaviour1": "Applies polish to items held in the _offhand_ or lying on the _floor_ when _looking at them_", "item.create.sand_paper.tooltip.behaviour1": "Applies polish to items held in the _offhand_ or lying on the _floor_ when _looking at them_",
"item.create.builders_tea.tooltip": "BUILDERS TEA", "item.create.builders_tea.tooltip": "BUILDERS TEA",
"item.create.builders_tea.tooltip.summary": "The perfect drink to get the day started- _Motivating_ and _Saturating._", "item.create.builders_tea.tooltip.summary": "The perfect drink to get the day started- _Motivating_ and _Saturating._",
"item.create.refined_radiance.tooltip": "REFINED RADIANCE",
"item.create.refined_radiance.tooltip.summary": "A Chromatic material forged from _absorbed light_.",
"item.create.refined_radiance.tooltip.condition1": "Work In Progress",
"item.create.refined_radiance.tooltip.behaviour1": "Usages for this material will be available in a future release.",
"item.create.shadow_steel.tooltip": "SHADOW STEEL",
"item.create.shadow_steel.tooltip.summary": "A Chromatic material forged _in the void_.",
"item.create.shadow_steel.tooltip.condition1": "Work In Progress",
"item.create.shadow_steel.tooltip.behaviour1": "Usages for this material will be available in a future release.",
"item.create.linked_controller.tooltip": "LINKED CONTROLLER", "item.create.linked_controller.tooltip": "LINKED CONTROLLER",
"item.create.linked_controller.tooltip.summary": "Grants _handheld_ _control_ over _Redstone Link_ frequencies assigned to its _six_ _buttons_.", "item.create.linked_controller.tooltip.summary": "Grants _handheld_ _control_ over _Redstone Link_ frequencies assigned to its _six_ _buttons_.",
"item.create.linked_controller.tooltip.condition1": "R-Click", "item.create.linked_controller.tooltip.condition1": "R-Click",
@ -2102,10 +2063,15 @@
"item.create.linked_controller.tooltip.condition4": "R-Click on Lectern", "item.create.linked_controller.tooltip.condition4": "R-Click on Lectern",
"item.create.linked_controller.tooltip.behaviour4": "Places the Controller into the Lectern for easy activation. (R-Click while Sneaking to retrieve it)", "item.create.linked_controller.tooltip.behaviour4": "Places the Controller into the Lectern for easy activation. (R-Click while Sneaking to retrieve it)",
"item.create.diving_helmet.tooltip": "DIVING HELMET", "item.create.copper_diving_helmet.tooltip": "COPPER DIVING HELMET",
"item.create.diving_helmet.tooltip.summary": "Together with a _Backtank_, allows the wielder to _breathe_ _underwater_ for an extended amount of time.", "item.create.copper_diving_helmet.tooltip.summary": "Together with a _Backtank_, allows the wielder to _breathe_ _underwater_ for an extended amount of time.",
"item.create.diving_helmet.tooltip.condition1": "When Worn", "item.create.copper_diving_helmet.tooltip.condition1": "When Worn",
"item.create.diving_helmet.tooltip.behaviour1": "Provides the _Water Breathing_ effect, slowly draining _Air Pressure_ from the Backtank.", "item.create.copper_diving_helmet.tooltip.behaviour1": "Provides the _Water Breathing_ effect, slowly draining _Air Pressure_ from the Backtank.",
"item.create.netherite_diving_helmet.tooltip": "NETHERITE DIVING HELMET",
"item.create.netherite_diving_helmet.tooltip.summary": "Together with a _Netherite Backtank_, this can protect you from _extreme heat_. To be effective, _Legs and Feet_ have to be covered in _Netherite_, too.",
"item.create.netherite_diving_helmet.tooltip.condition1": "When Worn (Full set)",
"item.create.netherite_diving_helmet.tooltip.behaviour1": "Provides immunity to _Fire_ and _Lava_, slowly draining _Air Pressure_ from the Backtank. Also grants _improved vision_ in Lava",
"item.create.copper_backtank.tooltip": "COPPER BACKTANK", "item.create.copper_backtank.tooltip": "COPPER BACKTANK",
"item.create.copper_backtank.tooltip.summary": "A _Wearable_ _Tank_ for carrying Pressurized Air.", "item.create.copper_backtank.tooltip.summary": "A _Wearable_ _Tank_ for carrying Pressurized Air.",
@ -2133,10 +2099,15 @@
"block.create.flywheel.tooltip.condition1": "When Powered by Kinetics", "block.create.flywheel.tooltip.condition1": "When Powered by Kinetics",
"block.create.flywheel.tooltip.behaviour1": "Starts spinning.", "block.create.flywheel.tooltip.behaviour1": "Starts spinning.",
"item.create.diving_boots.tooltip": "DIVING BOOTS", "item.create.copper_diving_boots.tooltip": "COPPER DIVING BOOTS",
"item.create.diving_boots.tooltip.summary": "A pair of _heavy_ _boots_, allowing for better traversal of the Ocean floor.", "item.create.copper_diving_boots.tooltip.summary": "A pair of _heavy_ _boots_, allowing for better traversal of the Ocean floor.",
"item.create.diving_boots.tooltip.condition1": "When Worn", "item.create.copper_diving_boots.tooltip.condition1": "When Worn",
"item.create.diving_boots.tooltip.behaviour1": "Wielder _sinks_ _faster_ and _cannot_ _swim_. Grants the ability to _walk_ and _jump_ underwater. Wielder also is no longer affected by _Mechanical_ _Belts_.", "item.create.copper_diving_boots.tooltip.behaviour1": "Wielder _sinks_ _faster_ and _cannot_ _swim_. Grants the ability to _walk_ and _jump_ underwater. Wielder also is no longer affected by _Mechanical_ _Belts_.",
"item.create.netherite_diving_boots.tooltip": "NETHERITE DIVING BOOTS",
"item.create.netherite_diving_boots.tooltip.summary": "A pair of _heavy_ _boots_, allowing for better traversal of the Ocean floor, including Oceans made of Lava.",
"item.create.netherite_diving_boots.tooltip.condition1": "When Worn",
"item.create.netherite_diving_boots.tooltip.behaviour1": "Wielder _sinks_ _faster_ and _cannot_ _swim_. Grants the ability to _walk_ and _jump_ underwater. Wielder also is no longer affected by _Mechanical_ _Belts_.",
"item.create.crafting_blueprint.tooltip": "CRAFTING BLUEPRINT", "item.create.crafting_blueprint.tooltip": "CRAFTING BLUEPRINT",
"item.create.crafting_blueprint.tooltip.summary": "_Placed_ on a wall, it can be used to _specify_ _ingredient_ _arrangements_ for easier manual crafting. Each slot represents a Recipe.", "item.create.crafting_blueprint.tooltip.summary": "_Placed_ on a wall, it can be used to _specify_ _ingredient_ _arrangements_ for easier manual crafting. Each slot represents a Recipe.",
@ -2146,23 +2117,38 @@
"item.create.crafting_blueprint.behaviour2": "_Applies_ the _configured_ _recipe_ with matching Ingredients found in your _Inventory_. _Sneak_ to craft up to a _Stack_ of items.", "item.create.crafting_blueprint.behaviour2": "_Applies_ the _configured_ _recipe_ with matching Ingredients found in your _Inventory_. _Sneak_ to craft up to a _Stack_ of items.",
"item.create.minecart_coupling.tooltip": "MINECART COUPLING", "item.create.minecart_coupling.tooltip": "MINECART COUPLING",
"item.create.minecart_coupling.tooltip.summary": "_Chains_ all your _Minecarts_ or _Carriage Contraptions_ together to form a majestic Train.", "item.create.minecart_coupling.tooltip.summary": "_Chains_ together individual _Minecarts_, causing them to move as a group.",
"item.create.minecart_coupling.tooltip.condition1": "When Used on Minecart",
"item.create.minecart_coupling.tooltip.behaviour1": "_Couples_ two Minecarts together, attempting to keep them at a _constant distance_ while moving.",
"item.create.experience_nugget.tooltip": "NUGGET OF EXPERIENCE", "item.create.experience_nugget.tooltip": "NUGGET OF EXPERIENCE",
"item.create.experience_nugget.tooltip.summary": "_Ding!_ A speck of _inspiration_ from your fantastic inventions.", "item.create.experience_nugget.tooltip.summary": "A speck of _inspiration_ from your fantastic inventions.",
"item.create.experience_nugget.tooltip.condition1": "When Used", "item.create.experience_nugget.tooltip.condition1": "When Used",
"item.create.experience_nugget.tooltip.behaviour1": "_Redeems_ _Experience_ points contained within.", "item.create.experience_nugget.tooltip.behaviour1": "_Redeems_ _Experience_ points contained within.",
"block.create.peculiar_bell.tooltip": "PECULIAR BELL", "block.create.peculiar_bell.tooltip": "PECULIAR BELL",
"block.create.peculiar_bell.tooltip.summary": "A decorative _Brass Bell_. Placing it right above open _Soul Fire_ may cause side-effects...", "block.create.peculiar_bell.tooltip.summary": "A decorative _Brass Bell_. Placing it right above open _Soul Fire_ may have side-effects...",
"block.create.haunted_bell.tooltip": "HAUNTED BELL", "block.create.haunted_bell.tooltip": "HAUNTED BELL",
"block.create.haunted_bell.tooltip.summary": "A _Cursed Bell_ haunted by lost souls of the Nether.", "block.create.haunted_bell.tooltip.summary": "A _Cursed Bell_ haunted by lost souls of the Nether.",
"block.create.haunted_bell.tooltip.condition1": "When Held or Rang", "block.create.haunted_bell.tooltip.condition1": "When Held or Rang",
"block.create.haunted_bell.tooltip.behaviour1": "Highlights nearby _Lightless Spots_ on which _Hostile Mobs_ can spawn.", "block.create.haunted_bell.tooltip.behaviour1": "Highlights nearby _Lightless Spots_ on which _Hostile Mobs_ can spawn.",
"block.create.copycat_panel.tooltip": "COPYCAT PANEL",
"block.create.copycat_panel.tooltip.summary": "_Converts_ any _full block_ into a decorative panel. Also accepts _Bars_ and _Trapdoors_.",
"block.create.copycat_panel.tooltip.condition1": "When R-Clicked",
"block.create.copycat_panel.tooltip.behaviour1": "Applies _held item_ as its _material_ if possible. _Click again_ to cycle _orientation_ or _powered_ state. Use a _Wrench_ to _reset_ the material.",
"block.create.copycat_step.tooltip": "COPYCAT STEP",
"block.create.copycat_step.tooltip.summary": "_Converts_ any _full block_ into a decorative step.",
"block.create.copycat_step.tooltip.condition1": "When R-Clicked",
"block.create.copycat_step.tooltip.behaviour1": "Applies _held item_ as its _material_ if possible. _Click again_ to cycle _orientation_ or _powered_ state. Use a _Wrench_ to _reset_ the material.",
"block.create.clipboard.tooltip": "CLIPBOARD",
"block.create.clipboard.tooltip.summary": "_Keeps your notes_ and makes you look more professional.",
"block.create.clipboard.tooltip.condition1": "When R-Clicked",
"block.create.clipboard.tooltip.behaviour1": "Opens the _Interface_. _Sneak-Click_ to _place_ it on a surface.",
"block.create.clipboard.tooltip.condition2": "When Used on Blocks",
"block.create.clipboard.tooltip.behaviour2": "Some blocks' _settings_, such as filters, can be _copied (R-Click)_ and _applied (L-Click)_ elsewhere.",
"_": "->------------------------] Ponder Content [------------------------<-", "_": "->------------------------] Ponder Content [------------------------<-",
@ -2185,14 +2171,14 @@
"create.ponder.index_description": "Click one of the icons to learn about its associated Items and Blocks", "create.ponder.index_description": "Click one of the icons to learn about its associated Items and Blocks",
"create.ponder.index_title": "Ponder Index", "create.ponder.index_title": "Ponder Index",
"create.ponder.shared.rpm16": "16 RPM", "create.ponder.shared.rpm16": "16 RPM",
"create.ponder.shared.behaviour_modify_wrench": "This behaviour can be modified using a Wrench",
"create.ponder.shared.storage_on_contraption": "Inventories attached to the Contraption will pick up their drops automatically", "create.ponder.shared.storage_on_contraption": "Inventories attached to the Contraption will pick up their drops automatically",
"create.ponder.shared.sneak_and": "Sneak +", "create.ponder.shared.sneak_and": "Sneak +",
"create.ponder.shared.rpm8": "8 RPM", "create.ponder.shared.rpm8": "8 RPM",
"create.ponder.shared.ctrl_and": "Ctrl +", "create.ponder.shared.ctrl_and": "Ctrl +",
"create.ponder.shared.rpm32": "32 RPM", "create.ponder.shared.rpm32": "32 RPM",
"create.ponder.shared.behaviour_modify_value_panel": "This behaviour can be modified using the value panel",
"create.ponder.shared.rpm16_source": "Source: 16 RPM", "create.ponder.shared.rpm16_source": "Source: 16 RPM",
"create.ponder.shared.movement_anchors": "With the help of Super Glue, larger structures can be moved.", "create.ponder.shared.movement_anchors": "With the help of Super Glue, larger structures can be moved",
"create.ponder.tag.redstone": "Logic Components", "create.ponder.tag.redstone": "Logic Components",
"create.ponder.tag.redstone.description": "Components which help with redstone engineering", "create.ponder.tag.redstone.description": "Components which help with redstone engineering",
"create.ponder.tag.contraption_assembly": "Block Attachment Utility", "create.ponder.tag.contraption_assembly": "Block Attachment Utility",
@ -2293,7 +2279,7 @@
"create.ponder.brass_funnel.header": "The Brass Funnel", "create.ponder.brass_funnel.header": "The Brass Funnel",
"create.ponder.brass_funnel.text_1": "Andesite Funnels can only ever extract single items.", "create.ponder.brass_funnel.text_1": "Andesite Funnels can only ever extract single items.",
"create.ponder.brass_funnel.text_2": "Brass Funnels can extract up to a full stack.", "create.ponder.brass_funnel.text_2": "Brass Funnels can extract up to a full stack.",
"create.ponder.brass_funnel.text_3": "Scrolling on the filter slot allows for precise control over the extracted stack size.", "create.ponder.brass_funnel.text_3": "The value panel allows for precise control over the extracted stack size.",
"create.ponder.brass_funnel.text_4": "Using items on the filter slot will restrict the funnel to only transfer matching stacks.", "create.ponder.brass_funnel.text_4": "Using items on the filter slot will restrict the funnel to only transfer matching stacks.",
"create.ponder.brass_tunnel.header": "Using Brass Tunnels", "create.ponder.brass_tunnel.header": "Using Brass Tunnels",
@ -2307,7 +2293,7 @@
"create.ponder.brass_tunnel.text_8": "For this, items can also be inserted into the Tunnel block directly", "create.ponder.brass_tunnel.text_8": "For this, items can also be inserted into the Tunnel block directly",
"create.ponder.brass_tunnel_modes.header": "Distribution Modes of the Brass Tunnel", "create.ponder.brass_tunnel_modes.header": "Distribution Modes of the Brass Tunnel",
"create.ponder.brass_tunnel_modes.text_1": "Using a Wrench, the distribution behaviour of Brass Tunnels can be configured", "create.ponder.brass_tunnel_modes.text_1": "The distribution behaviour of Brass Tunnels can be configured",
"create.ponder.brass_tunnel_modes.text_10": "'Synchronize Inputs' is a unique setting for Brass Tunnels", "create.ponder.brass_tunnel_modes.text_10": "'Synchronize Inputs' is a unique setting for Brass Tunnels",
"create.ponder.brass_tunnel_modes.text_11": "Items are only allowed past if every tunnel in the group has one waiting", "create.ponder.brass_tunnel_modes.text_11": "Items are only allowed past if every tunnel in the group has one waiting",
"create.ponder.brass_tunnel_modes.text_12": "This ensures that all affected belts supply items at the same rate", "create.ponder.brass_tunnel_modes.text_12": "This ensures that all affected belts supply items at the same rate",
@ -2357,7 +2343,8 @@
"create.ponder.chute.header": "Transporting Items downward via Chutes", "create.ponder.chute.header": "Transporting Items downward via Chutes",
"create.ponder.chute.text_1": "Chutes can transport items vertically from and to inventories", "create.ponder.chute.text_1": "Chutes can transport items vertically from and to inventories",
"create.ponder.chute.text_2": "Using the Wrench, a window can be created", "create.ponder.chute.text_2": "Using the Wrench, a window can be created",
"create.ponder.chute.text_3": "Placing chutes targeting the side faces of another will make it diagonal", "create.ponder.chute.text_3": "Using Industrial Iron Blocks, chutes can be encased",
"create.ponder.chute.text_4": "Placing chutes targeting the side faces of another will make it diagonal",
"create.ponder.chute_upward.header": "Transporting Items upward via Chutes", "create.ponder.chute_upward.header": "Transporting Items upward via Chutes",
"create.ponder.chute_upward.text_1": "Using Encased Fans at the top or bottom, a Chute can move items upward", "create.ponder.chute_upward.text_1": "Using Encased Fans at the top or bottom, a Chute can move items upward",
@ -2400,7 +2387,7 @@
"create.ponder.creative_motor.header": "Generating Rotational Force using Creative Motors", "create.ponder.creative_motor.header": "Generating Rotational Force using Creative Motors",
"create.ponder.creative_motor.text_1": "Creative motors are a compact and configurable source of Rotational Force", "create.ponder.creative_motor.text_1": "Creative motors are a compact and configurable source of Rotational Force",
"create.ponder.creative_motor.text_2": "Scrolling on the back panel changes the RPM of the motors' rotational output", "create.ponder.creative_motor.text_2": "The generated speed can be configured on its input panels",
"create.ponder.creative_motor_mojang.header": "Mojang's Enigma", "create.ponder.creative_motor_mojang.header": "Mojang's Enigma",
@ -2456,8 +2443,8 @@
"create.ponder.display_board.header": "Using Display Boards", "create.ponder.display_board.header": "Using Display Boards",
"create.ponder.display_board.text_1": "Display Boards are a scalable alternative to the sign", "create.ponder.display_board.text_1": "Display Boards are a scalable alternative to the sign",
"create.ponder.display_board.text_2": "They require Rotational Force to operate", "create.ponder.display_board.text_2": "They require Rotational Force to operate",
"create.ponder.display_board.text_3": "Text can be displayed using Name Tags...", "create.ponder.display_board.text_3": "Static text can be applied using written Clipboards",
"create.ponder.display_board.text_4": "...or through the use of Display Links", "create.ponder.display_board.text_4": "And dynamic text through the use of Display Links",
"create.ponder.display_board.text_5": "Dyes can be applied to individual lines of the board", "create.ponder.display_board.text_5": "Dyes can be applied to individual lines of the board",
"create.ponder.display_board.text_6": "Lines can be reset by clicking them with an empty hand", "create.ponder.display_board.text_6": "Lines can be reset by clicking them with an empty hand",
@ -2592,8 +2579,7 @@
"create.ponder.hand_crank.header": "Generating Rotational Force using Hand Cranks", "create.ponder.hand_crank.header": "Generating Rotational Force using Hand Cranks",
"create.ponder.hand_crank.text_1": "Hand Cranks can be used by players to apply rotational force manually", "create.ponder.hand_crank.text_1": "Hand Cranks can be used by players to apply rotational force manually",
"create.ponder.hand_crank.text_2": "Hold Right-Click to rotate it Counter-Clockwise", "create.ponder.hand_crank.text_2": "Hold Right-Click to rotate it Counter-Clockwise",
"create.ponder.hand_crank.text_3": "Its conveyed speed is relatively high", "create.ponder.hand_crank.text_3": "Sneak and Hold Right-Click to rotate it Clockwise",
"create.ponder.hand_crank.text_4": "Sneak and Hold Right-Click to rotate it Clockwise",
"create.ponder.hose_pulley.header": "Source Filling and Draining using Hose Pulleys", "create.ponder.hose_pulley.header": "Source Filling and Draining using Hose Pulleys",
"create.ponder.hose_pulley.text_1": "Hose Pulleys can be used to fill or drain large bodies of Fluid", "create.ponder.hose_pulley.text_1": "Hose Pulleys can be used to fill or drain large bodies of Fluid",
@ -2638,13 +2624,20 @@
"create.ponder.large_cogwheel.text_1": "Large cogwheels can connect to each other at right angles", "create.ponder.large_cogwheel.text_1": "Large cogwheels can connect to each other at right angles",
"create.ponder.large_cogwheel.text_2": "It will help relaying conveyed speed to other axes of rotation", "create.ponder.large_cogwheel.text_2": "It will help relaying conveyed speed to other axes of rotation",
"create.ponder.large_water_wheel.header": "Generating Rotational Force using Large Water Wheels",
"create.ponder.large_water_wheel.text_1": "Large Water Wheels draw force from adjacent Water Currents",
"create.ponder.large_water_wheel.text_2": "Covering additional sides will not improve its kinetic output further",
"create.ponder.large_water_wheel.text_3": "These rotate only at half the speed of regular water wheels...",
"create.ponder.large_water_wheel.text_4": "...but provide a substantially higher stress capacity",
"create.ponder.large_water_wheel.text_5": "Use wood planks on the wheel to change its appearance",
"create.ponder.linear_chassis_attachment.header": "Attaching blocks using Linear Chassis", "create.ponder.linear_chassis_attachment.header": "Attaching blocks using Linear Chassis",
"create.ponder.linear_chassis_attachment.text_1": "The open faces of a Linear Chassis can be made Sticky", "create.ponder.linear_chassis_attachment.text_1": "The open faces of a Linear Chassis can be made Sticky",
"create.ponder.linear_chassis_attachment.text_2": "Click again to make the opposite side sticky", "create.ponder.linear_chassis_attachment.text_2": "Click again to make the opposite side sticky",
"create.ponder.linear_chassis_attachment.text_3": "Sneak and Right-Click with an empty hand to remove the slime", "create.ponder.linear_chassis_attachment.text_3": "Sneak and Right-Click with an empty hand to remove the slime",
"create.ponder.linear_chassis_attachment.text_4": "Stickied faces of the Linear Chassis will attach a line of blocks in front of it", "create.ponder.linear_chassis_attachment.text_4": "Stickied faces of the Linear Chassis will attach a line of blocks in front of it",
"create.ponder.linear_chassis_attachment.text_5": "Using a Wrench, a precise Range can be specified for this chassis", "create.ponder.linear_chassis_attachment.text_5": "Using a Wrench, a precise Range can be specified for this chassis",
"create.ponder.linear_chassis_attachment.text_6": "Holding CTRL and scrolling adjusts the range of all attached Chassis Blocks", "create.ponder.linear_chassis_attachment.text_6": "Holding CTRL adjusts the range of all connected Chassis Blocks",
"create.ponder.linear_chassis_attachment.text_7": "Attaching blocks to any other side requires the use of Super Glue", "create.ponder.linear_chassis_attachment.text_7": "Attaching blocks to any other side requires the use of Super Glue",
"create.ponder.linear_chassis_attachment.text_8": "Using these mechanics, structures of any shape can move as a Contraption", "create.ponder.linear_chassis_attachment.text_8": "Using these mechanics, structures of any shape can move as a Contraption",
@ -2676,7 +2669,7 @@
"create.ponder.mechanical_arm_modes.text_2": "Outputs", "create.ponder.mechanical_arm_modes.text_2": "Outputs",
"create.ponder.mechanical_arm_modes.text_3": "Whenever an Arm has to choose between multiple valid outputs...", "create.ponder.mechanical_arm_modes.text_3": "Whenever an Arm has to choose between multiple valid outputs...",
"create.ponder.mechanical_arm_modes.text_4": "...it will act according to its setting", "create.ponder.mechanical_arm_modes.text_4": "...it will act according to its setting",
"create.ponder.mechanical_arm_modes.text_5": "Scrolling with a Wrench will allow you to configure it", "create.ponder.mechanical_arm_modes.text_5": "The value panel will allow you to configure it",
"create.ponder.mechanical_arm_modes.text_6": "Round Robin mode simply cycles through all outputs that are available", "create.ponder.mechanical_arm_modes.text_6": "Round Robin mode simply cycles through all outputs that are available",
"create.ponder.mechanical_arm_modes.text_7": "If an output is unable to take more items, it will be skipped", "create.ponder.mechanical_arm_modes.text_7": "If an output is unable to take more items, it will be skipped",
"create.ponder.mechanical_arm_modes.text_8": "Forced Round Robin mode will never skip outputs, and instead wait until they are free", "create.ponder.mechanical_arm_modes.text_8": "Forced Round Robin mode will never skip outputs, and instead wait until they are free",
@ -2758,18 +2751,18 @@
"create.ponder.mechanical_pump_flow.header": "Fluid Transportation using Mechanical Pumps", "create.ponder.mechanical_pump_flow.header": "Fluid Transportation using Mechanical Pumps",
"create.ponder.mechanical_pump_flow.text_1": "Mechanical Pumps govern the flow of their attached pipe networks", "create.ponder.mechanical_pump_flow.text_1": "Mechanical Pumps govern the flow of their attached pipe networks",
"create.ponder.mechanical_pump_flow.text_2": "When powered, their arrow indicates the direction of flow", "create.ponder.mechanical_pump_flow.text_2": "Their arrow indicates the direction of flow",
"create.ponder.mechanical_pump_flow.text_3": "The network behind is now pulling fluids...", "create.ponder.mechanical_pump_flow.text_3": "The network behind is now pulling fluids...",
"create.ponder.mechanical_pump_flow.text_4": "...while the network in front is transferring it outward", "create.ponder.mechanical_pump_flow.text_4": "...while the network in front is transferring it outward",
"create.ponder.mechanical_pump_flow.text_5": "Reversing the input rotation reverses the direction of flow", "create.ponder.mechanical_pump_flow.text_5": "The pumps direction is unaffected by the input rotation",
"create.ponder.mechanical_pump_flow.text_6": "Use a Wrench to reverse the orientation of pumps manually", "create.ponder.mechanical_pump_flow.text_6": "Instead, a Wrench can be used to reverse the direction",
"create.ponder.mechanical_pump_speed.header": "Throughput of Mechanical Pumps", "create.ponder.mechanical_pump_speed.header": "Throughput of Mechanical Pumps",
"create.ponder.mechanical_pump_speed.text_1": "Regardless of speed, Mechanical Pumps affect pipes connected up to 16 blocks away", "create.ponder.mechanical_pump_speed.text_1": "Regardless of speed, Mechanical Pumps affect pipes connected up to 16 blocks away",
"create.ponder.mechanical_pump_speed.text_2": "Speeding up the input rotation changes the speed of flow propagation...", "create.ponder.mechanical_pump_speed.text_2": "Speeding up the input rotation changes the speed of flow propagation...",
"create.ponder.mechanical_pump_speed.text_3": "...aswell as how quickly fluids are transferred", "create.ponder.mechanical_pump_speed.text_3": "...and the speed at which fluids are transferred",
"create.ponder.mechanical_pump_speed.text_4": "Pumps can combine their throughputs within shared pipe networks", "create.ponder.mechanical_pump_speed.text_4": "Pumps can combine their throughputs within shared pipe networks",
"create.ponder.mechanical_pump_speed.text_5": "Alternating their orientation can help align their flow directions", "create.ponder.mechanical_pump_speed.text_5": "Ensure that all of them are facing in the same direction",
"create.ponder.mechanical_saw_breaker.header": "Cutting Trees with the Mechanical Saw", "create.ponder.mechanical_saw_breaker.header": "Cutting Trees with the Mechanical Saw",
"create.ponder.mechanical_saw_breaker.text_1": "When given Rotational Force, a Mechanical Saw will cut trees directly in front of it", "create.ponder.mechanical_saw_breaker.text_1": "When given Rotational Force, a Mechanical Saw will cut trees directly in front of it",
@ -2794,8 +2787,8 @@
"create.ponder.millstone.text_5": "The outputs can also be extracted by automation", "create.ponder.millstone.text_5": "The outputs can also be extracted by automation",
"create.ponder.nixie_tube.header": "Using Nixie Tubes", "create.ponder.nixie_tube.header": "Using Nixie Tubes",
"create.ponder.nixie_tube.text_1": "When powered by Redstone, Nixie Tubes will display the redstone signals' strength", "create.ponder.nixie_tube.text_1": "When powered by Redstone, Nixie Tubes will display the signal strength",
"create.ponder.nixie_tube.text_2": "Using name tags edited with an anvil, custom text can be displayed", "create.ponder.nixie_tube.text_2": "Using written Clipboards, custom text can be displayed",
"create.ponder.nixie_tube.text_3": "Right-Click with Dye to change their display colour", "create.ponder.nixie_tube.text_3": "Right-Click with Dye to change their display colour",
"create.ponder.piston_pole.header": "Piston Extension Poles", "create.ponder.piston_pole.header": "Piston Extension Poles",
@ -2813,7 +2806,7 @@
"create.ponder.portable_fluid_interface.text_8": "After no contents have been exchanged for a while, the contraption will continue on its way", "create.ponder.portable_fluid_interface.text_8": "After no contents have been exchanged for a while, the contraption will continue on its way",
"create.ponder.portable_storage_interface.header": "Contraption Storage Exchange", "create.ponder.portable_storage_interface.header": "Contraption Storage Exchange",
"create.ponder.portable_storage_interface.text_1": "Inventories on moving contraptions cannot be accessed by players.", "create.ponder.portable_storage_interface.text_1": "Moving inventories can be tricky to access with automation.",
"create.ponder.portable_storage_interface.text_2": "This component can interact with storage without the need to stop the contraption.", "create.ponder.portable_storage_interface.text_2": "This component can interact with storage without the need to stop the contraption.",
"create.ponder.portable_storage_interface.text_3": "Place a second one with a gap of 1 or 2 blocks inbetween", "create.ponder.portable_storage_interface.text_3": "Place a second one with a gap of 1 or 2 blocks inbetween",
"create.ponder.portable_storage_interface.text_4": "Whenever they pass by each other, they will engage in a connection", "create.ponder.portable_storage_interface.text_4": "Whenever they pass by each other, they will engage in a connection",
@ -2841,13 +2834,13 @@
"create.ponder.pulse_extender.text_1": "Pulse Extenders can lengthen a signal passing through", "create.ponder.pulse_extender.text_1": "Pulse Extenders can lengthen a signal passing through",
"create.ponder.pulse_extender.text_2": "They activate after a short delay...", "create.ponder.pulse_extender.text_2": "They activate after a short delay...",
"create.ponder.pulse_extender.text_3": "...and cool down for the configured duration", "create.ponder.pulse_extender.text_3": "...and cool down for the configured duration",
"create.ponder.pulse_extender.text_4": "Using the mouse wheel, the discharge time can be configured", "create.ponder.pulse_extender.text_4": "Using the value panel, the discharge time can be configured",
"create.ponder.pulse_extender.text_5": "The configured duration can range up to 30 minutes", "create.ponder.pulse_extender.text_5": "The configured duration can range up to an hour",
"create.ponder.pulse_repeater.header": "Controlling signals using Pulse Repeaters", "create.ponder.pulse_repeater.header": "Controlling signals using Pulse Repeaters",
"create.ponder.pulse_repeater.text_1": "Pulse Repeaters emit a short pulse at a delay", "create.ponder.pulse_repeater.text_1": "Pulse Repeaters emit a short pulse after a delay",
"create.ponder.pulse_repeater.text_2": "Using the mouse wheel, the charge time can be configured", "create.ponder.pulse_repeater.text_2": "Using the value panel, the charge time can be configured",
"create.ponder.pulse_repeater.text_3": "Configured delays can range up to 30 minutes", "create.ponder.pulse_repeater.text_3": "Configured delays can range up to an hour",
"create.ponder.radial_chassis.header": "Attaching blocks using Radial Chassis", "create.ponder.radial_chassis.header": "Attaching blocks using Radial Chassis",
"create.ponder.radial_chassis.text_1": "Radial Chassis connect to identical Chassis blocks in a row", "create.ponder.radial_chassis.text_1": "Radial Chassis connect to identical Chassis blocks in a row",
@ -2895,7 +2888,7 @@
"create.ponder.rotation_speed_controller.header": "Using the Rotational Speed Controller", "create.ponder.rotation_speed_controller.header": "Using the Rotational Speed Controller",
"create.ponder.rotation_speed_controller.text_1": "Rot. Speed Controllers relay rotation from their axis to a Large Cogwheel above them", "create.ponder.rotation_speed_controller.text_1": "Rot. Speed Controllers relay rotation from their axis to a Large Cogwheel above them",
"create.ponder.rotation_speed_controller.text_2": "Using the scroll input on its side, the conveyed speed can be configured", "create.ponder.rotation_speed_controller.text_2": "Using the value panel on its side, the conveyed speed can be configured",
"create.ponder.sail.header": "Assembling Windmills using Sails", "create.ponder.sail.header": "Assembling Windmills using Sails",
"create.ponder.sail.text_1": "Sails are handy blocks to create Windmills with", "create.ponder.sail.text_1": "Sails are handy blocks to create Windmills with",
@ -2922,8 +2915,8 @@
"create.ponder.smart_chute.header": "Filtering Items using Smart Chutes", "create.ponder.smart_chute.header": "Filtering Items using Smart Chutes",
"create.ponder.smart_chute.text_1": "Smart Chutes are vertical chutes with additional control", "create.ponder.smart_chute.text_1": "Smart Chutes are vertical chutes with additional control",
"create.ponder.smart_chute.text_2": "Items in the filter slot specify what exactly they can extract and transfer", "create.ponder.smart_chute.text_2": "Items in the filter slot specify what to extract or transfer",
"create.ponder.smart_chute.text_3": "Use the Mouse Wheel to specify the extracted stack size", "create.ponder.smart_chute.text_3": "Use the value panel to specify the extracted stack size",
"create.ponder.smart_chute.text_4": "Redstone power will prevent Smart Chutes from acting.", "create.ponder.smart_chute.text_4": "Redstone power will prevent Smart Chutes from acting.",
"create.ponder.smart_pipe.header": "Controlling Fluid flow using Smart Pipes", "create.ponder.smart_pipe.header": "Controlling Fluid flow using Smart Pipes",
@ -2933,7 +2926,7 @@
"create.ponder.smart_pipe.text_4": "When placed further down a pipe network, smart pipes will only let matching fluids continue", "create.ponder.smart_pipe.text_4": "When placed further down a pipe network, smart pipes will only let matching fluids continue",
"create.ponder.speedometer.header": "Monitoring Kinetic information using the Speedometer", "create.ponder.speedometer.header": "Monitoring Kinetic information using the Speedometer",
"create.ponder.speedometer.text_1": "The Speedometer displays the current Speed of the attached components", "create.ponder.speedometer.text_1": "The Speedometer displays the current Speed of attached components",
"create.ponder.speedometer.text_2": "When wearing Engineers' Goggles, the player can get more detailed information from the Gauge", "create.ponder.speedometer.text_2": "When wearing Engineers' Goggles, the player can get more detailed information from the Gauge",
"create.ponder.speedometer.text_3": "Comparators can emit analog Restone Signals relative to the Speedometer's measurements", "create.ponder.speedometer.text_3": "Comparators can emit analog Restone Signals relative to the Speedometer's measurements",
@ -3064,7 +3057,7 @@
"create.ponder.train_signal_redstone.header": "Signals & Redstone", "create.ponder.train_signal_redstone.header": "Signals & Redstone",
"create.ponder.train_signal_redstone.text_1": "Signals can be forced red by a redstone signal", "create.ponder.train_signal_redstone.text_1": "Signals can be forced red by a redstone signal",
"create.ponder.train_signal_redstone.text_2": "Reversely, red signals emit a comparator output", "create.ponder.train_signal_redstone.text_2": "Conversely, red signals emit a comparator output",
"create.ponder.train_signal_signaling.header": "Collision Prevention with Signals", "create.ponder.train_signal_signaling.header": "Collision Prevention with Signals",
"create.ponder.train_signal_signaling.text_1": "Train Signals divide a track into segments", "create.ponder.train_signal_signaling.text_1": "Train Signals divide a track into segments",
@ -3077,12 +3070,13 @@
"create.ponder.train_signal_signaling.text_8": "...would not be able to leave the Segment immediately", "create.ponder.train_signal_signaling.text_8": "...would not be able to leave the Segment immediately",
"create.ponder.train_signal_signaling.text_9": "This helps keeping queued Trains out of a busy Segment", "create.ponder.train_signal_signaling.text_9": "This helps keeping queued Trains out of a busy Segment",
"create.ponder.valve_handle.header": "Generating Rotational Force using Valve Handles", "create.ponder.valve_handle.header": "Precise rotation using Valve Handles",
"create.ponder.valve_handle.text_1": "Valve Handles can be used by players to apply rotational force manually", "create.ponder.valve_handle.text_1": "Valve handles can be used to rotate components by a precise angle",
"create.ponder.valve_handle.text_2": "Hold Right-Click to rotate it Counter-Clockwise", "create.ponder.valve_handle.text_2": "The angle can be configured on the input panel",
"create.ponder.valve_handle.text_3": "Its conveyed speed is slow and precise", "create.ponder.valve_handle.text_3": "Right-Click to activate one rotation",
"create.ponder.valve_handle.text_4": "Sneak and Hold Right-Click to rotate it Clockwise", "create.ponder.valve_handle.text_4": "Sneak-Right-Click to activate it in the opposite direction",
"create.ponder.valve_handle.text_5": "Valve handles can be dyed for aesthetic purposes", "create.ponder.valve_handle.text_5": "Mind that Bearings have to be specifically told not to disassemble",
"create.ponder.valve_handle.text_6": "Valve handles can be dyed for aesthetic purposes",
"create.ponder.valve_pipe.header": "Controlling Fluid flow using Valves", "create.ponder.valve_pipe.header": "Controlling Fluid flow using Valves",
"create.ponder.valve_pipe.text_1": "Valve pipes help control fluids propagating through pipe networks", "create.ponder.valve_pipe.text_1": "Valve pipes help control fluids propagating through pipe networks",
@ -3092,14 +3086,13 @@
"create.ponder.water_wheel.header": "Generating Rotational Force using Water Wheels", "create.ponder.water_wheel.header": "Generating Rotational Force using Water Wheels",
"create.ponder.water_wheel.text_1": "Water Wheels draw force from adjacent Water Currents", "create.ponder.water_wheel.text_1": "Water Wheels draw force from adjacent Water Currents",
"create.ponder.water_wheel.text_2": "The more faces are powered, the faster the Water Wheel will rotate", "create.ponder.water_wheel.text_2": "Covering additional sides will not improve its kinetic output further",
"create.ponder.water_wheel.text_3": "The Wheels' blades should be oriented against the flow", "create.ponder.water_wheel.text_3": "Use wood planks on the wheel to change its appearance",
"create.ponder.water_wheel.text_4": "Facing the opposite way, they will not be as effective",
"create.ponder.weighted_ejector.header": "Using Weighted Ejectors", "create.ponder.weighted_ejector.header": "Using Weighted Ejectors",
"create.ponder.weighted_ejector.text_1": "Sneak and Right-Click holding an Ejector to select its target location", "create.ponder.weighted_ejector.text_1": "Sneak and Right-Click holding an Ejector to select its target location",
"create.ponder.weighted_ejector.text_10": "It is now limited to this stack size, and only activates when its held stack reaches this amount", "create.ponder.weighted_ejector.text_10": "It is now limited to this stack size, and only activates when its held stack reaches this amount",
"create.ponder.weighted_ejector.text_11": "Other Entities will always trigger an Ejector when stepping on it", "create.ponder.weighted_ejector.text_11": "Mobs and Players will always trigger an Ejector when stepping on it",
"create.ponder.weighted_ejector.text_2": "The placed ejector will now launch objects to the marked location", "create.ponder.weighted_ejector.text_2": "The placed ejector will now launch objects to the marked location",
"create.ponder.weighted_ejector.text_3": "A valid target can be at any height or distance within range", "create.ponder.weighted_ejector.text_3": "A valid target can be at any height or distance within range",
"create.ponder.weighted_ejector.text_4": "They cannot however be off to a side", "create.ponder.weighted_ejector.text_4": "They cannot however be off to a side",
@ -3107,11 +3100,11 @@
"create.ponder.weighted_ejector.text_6": "Supply Rotational Force in order to charge it up", "create.ponder.weighted_ejector.text_6": "Supply Rotational Force in order to charge it up",
"create.ponder.weighted_ejector.text_7": "Items placed on the ejector cause it to trigger", "create.ponder.weighted_ejector.text_7": "Items placed on the ejector cause it to trigger",
"create.ponder.weighted_ejector.text_8": "If Inventories are targeted, the ejector will wait until there is space", "create.ponder.weighted_ejector.text_8": "If Inventories are targeted, the ejector will wait until there is space",
"create.ponder.weighted_ejector.text_9": "Using the Wrench, a required Stack Size can be configured", "create.ponder.weighted_ejector.text_9": "Using the value panel, a required Stack Size can be configured",
"create.ponder.weighted_ejector_redstone.header": "Controlling Weighted Ejectors with Redstone", "create.ponder.weighted_ejector_redstone.header": "Controlling Weighted Ejectors with Redstone",
"create.ponder.weighted_ejector_redstone.text_1": "When powered by Redstone, Ejectors will not activate", "create.ponder.weighted_ejector_redstone.text_1": "When powered by Redstone, Ejectors will not activate",
"create.ponder.weighted_ejector_redstone.text_2": "Furthermore, Observers can detect when Ejectors activate", "create.ponder.weighted_ejector_redstone.text_2": "Observers can detect when Ejectors activate",
"create.ponder.weighted_ejector_tunnel.header": "Splitting item stacks using Weighted Ejectors", "create.ponder.weighted_ejector_tunnel.header": "Splitting item stacks using Weighted Ejectors",
"create.ponder.weighted_ejector_tunnel.text_1": "Combined with Brass Tunnels, Ejectors can split item stacks by specific amounts", "create.ponder.weighted_ejector_tunnel.text_1": "Combined with Brass Tunnels, Ejectors can split item stacks by specific amounts",
@ -3126,7 +3119,7 @@
"create.ponder.windmill_source.text_3": "If enough Sail-like blocks are included, this can act as a Windmill", "create.ponder.windmill_source.text_3": "If enough Sail-like blocks are included, this can act as a Windmill",
"create.ponder.windmill_source.text_4": "Activated with Right-Click, the Windmill Bearing will start providing Rotational Force", "create.ponder.windmill_source.text_4": "Activated with Right-Click, the Windmill Bearing will start providing Rotational Force",
"create.ponder.windmill_source.text_5": "The Amount of Sail Blocks determine its Rotation Speed", "create.ponder.windmill_source.text_5": "The Amount of Sail Blocks determine its Rotation Speed",
"create.ponder.windmill_source.text_6": "Use a Wrench to configure its rotation direction", "create.ponder.windmill_source.text_6": "Use the value panel to configure its rotation direction",
"create.ponder.windmill_source.text_7": "Right-click the Bearing anytime to stop and edit the Structure again", "create.ponder.windmill_source.text_7": "Right-click the Bearing anytime to stop and edit the Structure again",
"create.ponder.windmill_structure.header": "Windmill Contraptions", "create.ponder.windmill_structure.header": "Windmill Contraptions",

View file

@ -39,8 +39,6 @@ import com.simibubi.create.content.curiosities.armor.BacktankItem;
import com.simibubi.create.content.curiosities.armor.BacktankItem.BacktankBlockItem; import com.simibubi.create.content.curiosities.armor.BacktankItem.BacktankBlockItem;
import com.simibubi.create.content.curiosities.armor.DivingBootsItem; import com.simibubi.create.content.curiosities.armor.DivingBootsItem;
import com.simibubi.create.content.curiosities.armor.DivingHelmetItem; import com.simibubi.create.content.curiosities.armor.DivingHelmetItem;
import com.simibubi.create.content.curiosities.clipboard.ClipboardBlockItem;
import com.simibubi.create.content.curiosities.clipboard.ClipboardOverrides;
import com.simibubi.create.content.curiosities.symmetry.SymmetryWandItem; import com.simibubi.create.content.curiosities.symmetry.SymmetryWandItem;
import com.simibubi.create.content.curiosities.tools.BlueprintItem; import com.simibubi.create.content.curiosities.tools.BlueprintItem;
import com.simibubi.create.content.curiosities.tools.ExtendoGripItem; import com.simibubi.create.content.curiosities.tools.ExtendoGripItem;
@ -355,6 +353,7 @@ public class AllItems {
// Logistics // Logistics
public static final ItemEntry<FilterItem> FILTER = REGISTRATE.item("filter", FilterItem::regular) public static final ItemEntry<FilterItem> FILTER = REGISTRATE.item("filter", FilterItem::regular)
.lang("List Filter")
.register(), ATTRIBUTE_FILTER = .register(), ATTRIBUTE_FILTER =
REGISTRATE.item("attribute_filter", FilterItem::attribute) REGISTRATE.item("attribute_filter", FilterItem::attribute)
.register(); .register();

View file

@ -253,8 +253,7 @@ public class AllShapes {
.build(), .build(),
SPOUT = shape(1, 2, 1, 15, 14, 15).add(2, 0, 2, 14, 16, 14) SPOUT = shape(1, 2, 1, 15, 14, 15).add(2, 0, 2, 14, 16, 14)
.build(), .build(),
MILLSTONE = shape(0, 0, 0, 16, 6, 16).add(2, 6, 2, 14, 12, 14) MILLSTONE = shape(0, 0, 0, 16, 6, 16).add(2, 6, 2, 14, 16, 14)
.add(3, 12, 3, 13, 16, 13)
.build(), .build(),
CUCKOO_CLOCK = shape(1, 0, 1, 15, 19, 15).build(), CUCKOO_CLOCK = shape(1, 0, 1, 15, 19, 15).build(),
GAUGE_SHAPE_UP = shape(1, 0, 0, 15, 2, 16).add(2, 2, 1, 14, 14, 15) GAUGE_SHAPE_UP = shape(1, 0, 0, 15, 2, 16).add(2, 2, 1, 14, 14, 15)

View file

@ -89,7 +89,7 @@ public abstract class PortableStorageInterfaceBlockEntity extends SmartBlockEnti
boolean timerCanDecrement = transferTimer > ANIMATION || transferTimer > 0 && keepAlive == 0 boolean timerCanDecrement = transferTimer > ANIMATION || transferTimer > 0 && keepAlive == 0
&& (isVirtual() || !level.isClientSide || transferTimer != ANIMATION); && (isVirtual() || !level.isClientSide || transferTimer != ANIMATION);
if (timerCanDecrement && (!isVirtual() || transferTimer != timeUnit)) { if (timerCanDecrement && (!isVirtual() || transferTimer != ANIMATION)) {
transferTimer--; transferTimer--;
if (transferTimer == ANIMATION - 1) if (transferTimer == ANIMATION - 1)
sendData(); sendData();

View file

@ -179,7 +179,7 @@ public class RollerBlockEntity extends SmartBlockEntity {
} }
@Override @Override
protected void rotate(BlockState state, PoseStack ms) { public void rotate(BlockState state, PoseStack ms) {
Direction facing = state.getValue(RollerBlock.FACING); Direction facing = state.getValue(RollerBlock.FACING);
float yRot = AngleHelper.horizontalAngle(facing) + 180; float yRot = AngleHelper.horizontalAngle(facing) + 180;
TransformStack.cast(ms) TransformStack.cast(ms)
@ -196,7 +196,7 @@ public class RollerBlockEntity extends SmartBlockEntity {
} }
@Override @Override
protected Vec3 getLocalOffset(BlockState state) { public Vec3 getLocalOffset(BlockState state) {
Direction facing = state.getValue(RollerBlock.FACING); Direction facing = state.getValue(RollerBlock.FACING);
float stateAngle = AngleHelper.horizontalAngle(facing) + 180; float stateAngle = AngleHelper.horizontalAngle(facing) + 180;
return VecHelper.rotateCentered(VecHelper.voxelSpace(8 + hOffset, 15.5f, 11), stateAngle, Axis.Y); return VecHelper.rotateCentered(VecHelper.voxelSpace(8 + hOffset, 15.5f, 11), stateAngle, Axis.Y);

View file

@ -123,14 +123,14 @@ public class ContraptionControlsBlockEntity extends SmartBlockEntity {
public static class ControlsSlot extends ValueBoxTransform.Sided { public static class ControlsSlot extends ValueBoxTransform.Sided {
@Override @Override
protected Vec3 getLocalOffset(BlockState state) { public Vec3 getLocalOffset(BlockState state) {
Direction facing = state.getValue(ControlsBlock.FACING); Direction facing = state.getValue(ControlsBlock.FACING);
float yRot = AngleHelper.horizontalAngle(facing); float yRot = AngleHelper.horizontalAngle(facing);
return VecHelper.rotateCentered(VecHelper.voxelSpace(8, 12f, 5.5f), yRot, Axis.Y); return VecHelper.rotateCentered(VecHelper.voxelSpace(8, 12f, 5.5f), yRot, Axis.Y);
} }
@Override @Override
protected void rotate(BlockState state, PoseStack ms) { public void rotate(BlockState state, PoseStack ms) {
Direction facing = state.getValue(ControlsBlock.FACING); Direction facing = state.getValue(ControlsBlock.FACING);
float yRot = AngleHelper.horizontalAngle(facing); float yRot = AngleHelper.horizontalAngle(facing);
TransformStack.cast(ms) TransformStack.cast(ms)
@ -139,7 +139,7 @@ public class ContraptionControlsBlockEntity extends SmartBlockEntity {
} }
@Override @Override
protected float getScale() { public float getScale() {
return .5f; return .5f;
} }

View file

@ -14,7 +14,7 @@ import net.minecraft.world.phys.Vec3;
public class DeployerFilterSlot extends ValueBoxTransform.Sided { public class DeployerFilterSlot extends ValueBoxTransform.Sided {
@Override @Override
protected Vec3 getLocalOffset(BlockState state) { public Vec3 getLocalOffset(BlockState state) {
Direction facing = state.getValue(DeployerBlock.FACING); Direction facing = state.getValue(DeployerBlock.FACING);
Vec3 vec = VecHelper.voxelSpace(8f, 8f, 15.5f); Vec3 vec = VecHelper.voxelSpace(8f, 8f, 15.5f);
@ -37,7 +37,7 @@ public class DeployerFilterSlot extends ValueBoxTransform.Sided {
} }
@Override @Override
protected void rotate(BlockState state, PoseStack ms) { public void rotate(BlockState state, PoseStack ms) {
Direction facing = getSide(); Direction facing = getSide();
float xRot = facing == Direction.UP ? 90 : facing == Direction.DOWN ? 270 : 0; float xRot = facing == Direction.UP ? 90 : facing == Direction.DOWN ? 270 : 0;
float yRot = AngleHelper.horizontalAngle(facing) + 180; float yRot = AngleHelper.horizontalAngle(facing) + 180;

View file

@ -65,14 +65,14 @@ public class CreativeMotorBlockEntity extends GeneratingKineticBlockEntity {
} }
@Override @Override
protected Vec3 getLocalOffset(BlockState state) { public Vec3 getLocalOffset(BlockState state) {
Direction facing = state.getValue(CreativeMotorBlock.FACING); Direction facing = state.getValue(CreativeMotorBlock.FACING);
return super.getLocalOffset(state).add(Vec3.atLowerCornerOf(facing.getNormal()) return super.getLocalOffset(state).add(Vec3.atLowerCornerOf(facing.getNormal())
.scale(-1 / 16f)); .scale(-1 / 16f));
} }
@Override @Override
protected void rotate(BlockState state, PoseStack ms) { public void rotate(BlockState state, PoseStack ms) {
super.rotate(state, ms); super.rotate(state, ms);
Direction facing = state.getValue(CreativeMotorBlock.FACING); Direction facing = state.getValue(CreativeMotorBlock.FACING);
if (facing.getAxis() == Axis.Y) if (facing.getAxis() == Axis.Y)

View file

@ -12,7 +12,7 @@ import net.minecraft.world.phys.Vec3;
public class SawFilterSlot extends ValueBoxTransform { public class SawFilterSlot extends ValueBoxTransform {
@Override @Override
protected Vec3 getLocalOffset(BlockState state) { public Vec3 getLocalOffset(BlockState state) {
if (state.getValue(SawBlock.FACING) != Direction.UP) if (state.getValue(SawBlock.FACING) != Direction.UP)
return null; return null;
int offset = state.getValue(SawBlock.FLIPPED) ? -3 : 3; int offset = state.getValue(SawBlock.FLIPPED) ? -3 : 3;
@ -22,7 +22,7 @@ public class SawFilterSlot extends ValueBoxTransform {
} }
@Override @Override
protected void rotate(BlockState state, PoseStack ms) { public void rotate(BlockState state, PoseStack ms) {
int yRot = (state.getValue(SawBlock.AXIS_ALONG_FIRST_COORDINATE) ? 90 : 0) int yRot = (state.getValue(SawBlock.AXIS_ALONG_FIRST_COORDINATE) ? 90 : 0)
+ (state.getValue(SawBlock.FLIPPED) ? 0 : 180); + (state.getValue(SawBlock.FLIPPED) ? 0 : 180);
TransformStack.cast(ms) TransformStack.cast(ms)

View file

@ -36,7 +36,7 @@ public class SteamEngineValueBox extends ValueBoxTransform.Sided {
} }
@Override @Override
protected Vec3 getLocalOffset(BlockState state) { public Vec3 getLocalOffset(BlockState state) {
Direction side = getSide(); Direction side = getSide();
Direction engineFacing = SteamEngineBlock.getFacing(state); Direction engineFacing = SteamEngineBlock.getFacing(state);
@ -59,7 +59,7 @@ public class SteamEngineValueBox extends ValueBoxTransform.Sided {
} }
@Override @Override
protected void rotate(BlockState state, PoseStack ms) { public void rotate(BlockState state, PoseStack ms) {
Direction facing = SteamEngineBlock.getFacing(state); Direction facing = SteamEngineBlock.getFacing(state);
if (facing.getAxis() == Axis.Y) { if (facing.getAxis() == Axis.Y) {

View file

@ -19,13 +19,13 @@ public class DirectionalExtenderScrollOptionSlot extends CenteredSideValueBoxTra
} }
@Override @Override
protected Vec3 getLocalOffset(BlockState state) { public Vec3 getLocalOffset(BlockState state) {
return super.getLocalOffset(state) return super.getLocalOffset(state)
.add(Vec3.atLowerCornerOf(state.getValue(BlockStateProperties.FACING).getNormal()).scale(-2 / 16f)); .add(Vec3.atLowerCornerOf(state.getValue(BlockStateProperties.FACING).getNormal()).scale(-2 / 16f));
} }
@Override @Override
protected void rotate(BlockState state, PoseStack ms) { public void rotate(BlockState state, PoseStack ms) {
if (!getSide().getAxis().isHorizontal()) if (!getSide().getAxis().isHorizontal())
TransformStack.cast(ms) TransformStack.cast(ms)
.rotateY(AngleHelper.horizontalAngle(state.getValue(BlockStateProperties.FACING)) + 180); .rotateY(AngleHelper.horizontalAngle(state.getValue(BlockStateProperties.FACING)) + 180);

View file

@ -276,7 +276,7 @@ public class CartAssemblerBlockEntity extends SmartBlockEntity implements IDispl
@Override @Override
protected Vec3 getSouthLocation() { protected Vec3 getSouthLocation() {
return VecHelper.voxelSpace(8, 8, 17.5); return VecHelper.voxelSpace(8, 7, 17.5);
} }
} }

View file

@ -92,7 +92,7 @@ public class WaterWheelBlockEntity extends GeneratingKineticBlockEntity {
return InteractionResult.PASS; return InteractionResult.PASS;
if (!material.is(BlockTags.PLANKS)) if (!material.is(BlockTags.PLANKS))
return InteractionResult.PASS; return InteractionResult.PASS;
if (level.isClientSide()) if (level.isClientSide() && !isVirtual())
return InteractionResult.SUCCESS; return InteractionResult.SUCCESS;
this.material = material; this.material = material;
notifyUpdate(); notifyUpdate();

View file

@ -68,7 +68,7 @@ public class SmartFluidPipeBlockEntity extends SmartBlockEntity {
class SmartPipeFilterSlot extends ValueBoxTransform { class SmartPipeFilterSlot extends ValueBoxTransform {
@Override @Override
protected Vec3 getLocalOffset(BlockState state) { public Vec3 getLocalOffset(BlockState state) {
AttachFace face = state.getValue(SmartFluidPipeBlock.FACE); AttachFace face = state.getValue(SmartFluidPipeBlock.FACE);
float y = face == AttachFace.CEILING ? 0.55f : face == AttachFace.WALL ? 11.4f : 15.45f; float y = face == AttachFace.CEILING ? 0.55f : face == AttachFace.WALL ? 11.4f : 15.45f;
float z = face == AttachFace.CEILING ? 4.6f : face == AttachFace.WALL ? 0.55f : 4.625f; float z = face == AttachFace.CEILING ? 4.6f : face == AttachFace.WALL ? 0.55f : 4.625f;
@ -76,12 +76,12 @@ public class SmartFluidPipeBlockEntity extends SmartBlockEntity {
} }
@Override @Override
protected float getScale() { public float getScale() {
return super.getScale() * 1.02f; return super.getScale() * 1.02f;
} }
@Override @Override
protected void rotate(BlockState state, PoseStack ms) { public void rotate(BlockState state, PoseStack ms) {
AttachFace face = state.getValue(SmartFluidPipeBlock.FACE); AttachFace face = state.getValue(SmartFluidPipeBlock.FACE);
TransformStack.cast(ms) TransformStack.cast(ms)
.rotateY(angleY(state)) .rotateY(angleY(state))

View file

@ -30,14 +30,18 @@ import com.simibubi.create.foundation.fluid.CombinedTankWrapper;
import com.simibubi.create.foundation.item.ItemHelper; import com.simibubi.create.foundation.item.ItemHelper;
import com.simibubi.create.foundation.item.SmartInventory; import com.simibubi.create.foundation.item.SmartInventory;
import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.AnimationTickHolder;
import com.simibubi.create.foundation.utility.Components;
import com.simibubi.create.foundation.utility.Couple; import com.simibubi.create.foundation.utility.Couple;
import com.simibubi.create.foundation.utility.IntAttached; import com.simibubi.create.foundation.utility.IntAttached;
import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.Iterate;
import com.simibubi.create.foundation.utility.Lang;
import com.simibubi.create.foundation.utility.LangBuilder;
import com.simibubi.create.foundation.utility.NBTHelper; import com.simibubi.create.foundation.utility.NBTHelper;
import com.simibubi.create.foundation.utility.VecHelper; import com.simibubi.create.foundation.utility.VecHelper;
import com.simibubi.create.foundation.utility.animation.LerpedFloat; import com.simibubi.create.foundation.utility.animation.LerpedFloat;
import com.simibubi.create.foundation.utility.animation.LerpedFloat.Chaser; import com.simibubi.create.foundation.utility.animation.LerpedFloat.Chaser;
import net.minecraft.ChatFormatting;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction; import net.minecraft.core.Direction;
import net.minecraft.core.Direction.Axis; import net.minecraft.core.Direction.Axis;
@ -60,10 +64,12 @@ import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.capability.CapabilityFluidHandler; import net.minecraftforge.fluids.capability.CapabilityFluidHandler;
import net.minecraftforge.fluids.capability.IFluidHandler; import net.minecraftforge.fluids.capability.IFluidHandler;
import net.minecraftforge.fluids.capability.IFluidHandler.FluidAction; import net.minecraftforge.fluids.capability.IFluidHandler.FluidAction;
import net.minecraftforge.fluids.capability.templates.FluidTank;
import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.CapabilityItemHandler;
import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.IItemHandler;
import net.minecraftforge.items.IItemHandlerModifiable; import net.minecraftforge.items.IItemHandlerModifiable;
import net.minecraftforge.items.ItemHandlerHelper; import net.minecraftforge.items.ItemHandlerHelper;
import net.minecraftforge.items.ItemStackHandler;
import net.minecraftforge.items.wrapper.CombinedInvWrapper; import net.minecraftforge.items.wrapper.CombinedInvWrapper;
public class BasinBlockEntity extends SmartBlockEntity implements IHaveGoggleInformation { public class BasinBlockEntity extends SmartBlockEntity implements IHaveGoggleInformation {
@ -731,8 +737,46 @@ public class BasinBlockEntity extends SmartBlockEntity implements IHaveGoggleInf
@Override @Override
public boolean addToGoggleTooltip(List<Component> tooltip, boolean isPlayerSneaking) { public boolean addToGoggleTooltip(List<Component> tooltip, boolean isPlayerSneaking) {
return containedFluidTooltip(tooltip, isPlayerSneaking, Lang.translate("gui.goggles.basin_contents")
getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY)); .forGoggles(tooltip);
IItemHandlerModifiable items = itemCapability.orElse(new ItemStackHandler());
IFluidHandler fluids = fluidCapability.orElse(new FluidTank(0));
boolean isEmpty = true;
for (int i = 0; i < items.getSlots(); i++) {
ItemStack stackInSlot = items.getStackInSlot(i);
if (stackInSlot.isEmpty())
continue;
Lang.text("")
.add(Components.translatable(stackInSlot.getDescriptionId())
.withStyle(ChatFormatting.GRAY))
.add(Lang.text(" x" + stackInSlot.getCount())
.style(ChatFormatting.GREEN))
.forGoggles(tooltip, 1);
isEmpty = false;
}
LangBuilder mb = Lang.translate("generic.unit.millibuckets");
for (int i = 0; i < fluids.getTanks(); i++) {
FluidStack fluidStack = fluids.getFluidInTank(i);
if (fluidStack.isEmpty())
continue;
Lang.text("")
.add(Lang.fluidName(fluidStack)
.add(Lang.text(" "))
.style(ChatFormatting.GRAY)
.add(Lang.number(fluidStack.getAmount())
.add(mb)
.style(ChatFormatting.BLUE)))
.forGoggles(tooltip, 1);
isEmpty = false;
}
if (isEmpty)
tooltip.remove(0);
return true;
} }
class BasinValueBox extends ValueBoxTransform.Sided { class BasinValueBox extends ValueBoxTransform.Sided {

View file

@ -266,6 +266,8 @@ public class BlazeBurnerBlockEntity extends SmartBlockEntity {
} }
public boolean isValidBlockAbove() { public boolean isValidBlockAbove() {
if (isVirtual())
return false;
BlockState blockState = level.getBlockState(worldPosition.above()); BlockState blockState = level.getBlockState(worldPosition.above());
return AllBlocks.BASIN.has(blockState) || blockState.getBlock() instanceof FluidTankBlock; return AllBlocks.BASIN.has(blockState) || blockState.getBlock() instanceof FluidTankBlock;
} }

View file

@ -141,7 +141,7 @@ public class SpeedControllerBlockEntity extends KineticBlockEntity {
} }
@Override @Override
protected float getScale() { public float getScale() {
return 0.5f; return 0.5f;
} }

View file

@ -303,13 +303,13 @@ public class BeltBlock extends HorizontalKineticBlock
if (AllBlocks.BRASS_CASING.isIn(heldItem)) { if (AllBlocks.BRASS_CASING.isIn(heldItem)) {
withBlockEntityDo(world, pos, be -> be.setCasingType(CasingType.BRASS)); withBlockEntityDo(world, pos, be -> be.setCasingType(CasingType.BRASS));
updateCoverProperty(world, pos, state); updateCoverProperty(world, pos, world.getBlockState(pos));
return InteractionResult.SUCCESS; return InteractionResult.SUCCESS;
} }
if (AllBlocks.ANDESITE_CASING.isIn(heldItem)) { if (AllBlocks.ANDESITE_CASING.isIn(heldItem)) {
withBlockEntityDo(world, pos, be -> be.setCasingType(CasingType.ANDESITE)); withBlockEntityDo(world, pos, be -> be.setCasingType(CasingType.ANDESITE));
updateCoverProperty(world, pos, state); updateCoverProperty(world, pos, world.getBlockState(pos));
return InteractionResult.SUCCESS; return InteractionResult.SUCCESS;
} }
@ -517,6 +517,8 @@ public class BeltBlock extends HorizontalKineticBlock
return false; return false;
if (bounds.minY > 0) if (bounds.minY > 0)
return false; return false;
if (AllBlocks.CRUSHING_WHEEL_CONTROLLER.has(blockState))
return false;
if (FunnelBlock.isFunnel(blockState) && FunnelBlock.getFunnelFacing(blockState) != Direction.UP) if (FunnelBlock.isFunnel(blockState) && FunnelBlock.getFunnelFacing(blockState) != Direction.UP)
return false; return false;
if (blockState.getBlock() instanceof BeltTunnelBlock) if (blockState.getBlock() instanceof BeltTunnelBlock)

View file

@ -12,7 +12,7 @@ import net.minecraft.world.phys.Vec3;
public class SmartChuteFilterSlotPositioning extends ValueBoxTransform.Sided { public class SmartChuteFilterSlotPositioning extends ValueBoxTransform.Sided {
@Override @Override
protected Vec3 getLocalOffset(BlockState state) { public Vec3 getLocalOffset(BlockState state) {
Direction side = getSide(); Direction side = getSide();
float horizontalAngle = AngleHelper.horizontalAngle(side); float horizontalAngle = AngleHelper.horizontalAngle(side);
Vec3 southLocation = VecHelper.voxelSpace(8, 11, 15.5f); Vec3 southLocation = VecHelper.voxelSpace(8, 11, 15.5f);

View file

@ -618,14 +618,14 @@ public class EjectorBlockEntity extends KineticBlockEntity {
private class EjectorSlot extends ValueBoxTransform.Sided { private class EjectorSlot extends ValueBoxTransform.Sided {
@Override @Override
protected Vec3 getLocalOffset(BlockState state) { public Vec3 getLocalOffset(BlockState state) {
if (direction != Direction.UP) if (direction != Direction.UP)
return super.getLocalOffset(state); return super.getLocalOffset(state);
return new Vec3(.5, 10.5 / 16f, .5).add(VecHelper.rotate(VecHelper.voxelSpace(0, 0, -5), angle(state), Axis.Y)); return new Vec3(.5, 10.5 / 16f, .5).add(VecHelper.rotate(VecHelper.voxelSpace(0, 0, -5), angle(state), Axis.Y));
} }
@Override @Override
protected void rotate(BlockState state, PoseStack ms) { public void rotate(BlockState state, PoseStack ms) {
if (direction != Direction.UP) { if (direction != Direction.UP) {
super.rotate(state, ms); super.rotate(state, ms);
return; return;

View file

@ -13,12 +13,12 @@ import net.minecraft.world.phys.Vec3;
public class BrassDiodeScrollSlot extends ValueBoxTransform { public class BrassDiodeScrollSlot extends ValueBoxTransform {
@Override @Override
protected Vec3 getLocalOffset(BlockState state) { public Vec3 getLocalOffset(BlockState state) {
return VecHelper.voxelSpace(8, 2.6f, 8); return VecHelper.voxelSpace(8, 2.6f, 8);
} }
@Override @Override
protected void rotate(BlockState state, PoseStack ms) { public void rotate(BlockState state, PoseStack ms) {
float yRot = AngleHelper.horizontalAngle(state.getValue(BlockStateProperties.HORIZONTAL_FACING)) + 180; float yRot = AngleHelper.horizontalAngle(state.getValue(BlockStateProperties.HORIZONTAL_FACING)) + 180;
TransformStack.cast(ms) TransformStack.cast(ms)
.rotateY(yRot) .rotateY(yRot)

View file

@ -15,7 +15,7 @@ import net.minecraft.world.phys.Vec3;
public class FunnelFilterSlotPositioning extends ValueBoxTransform.Sided { public class FunnelFilterSlotPositioning extends ValueBoxTransform.Sided {
@Override @Override
protected Vec3 getLocalOffset(BlockState state) { public Vec3 getLocalOffset(BlockState state) {
Direction side = getSide(); Direction side = getSide();
float horizontalAngle = AngleHelper.horizontalAngle(side); float horizontalAngle = AngleHelper.horizontalAngle(side);
Direction funnelFacing = FunnelBlock.getFunnelFacing(state); Direction funnelFacing = FunnelBlock.getFunnelFacing(state);
@ -45,7 +45,7 @@ public class FunnelFilterSlotPositioning extends ValueBoxTransform.Sided {
} }
@Override @Override
protected void rotate(BlockState state, PoseStack ms) { public void rotate(BlockState state, PoseStack ms) {
Direction facing = FunnelBlock.getFunnelFacing(state); Direction facing = FunnelBlock.getFunnelFacing(state);
if (facing.getAxis() if (facing.getAxis()

View file

@ -55,17 +55,17 @@ public class CreativeCrateBlockEntity extends CrateBlockEntity {
return new FilteringBehaviour(this, new ValueBoxTransform() { return new FilteringBehaviour(this, new ValueBoxTransform() {
@Override @Override
protected void rotate(BlockState state, PoseStack ms) { public void rotate(BlockState state, PoseStack ms) {
TransformStack.cast(ms) TransformStack.cast(ms)
.rotateX(90); .rotateX(90);
} }
@Override @Override
protected Vec3 getLocalOffset(BlockState state) { public Vec3 getLocalOffset(BlockState state) {
return new Vec3(0.5, 13.5 / 16d, 0.5); return new Vec3(0.5, 13.5 / 16d, 0.5);
} }
protected float getScale() { public float getScale() {
return super.getScale(); return super.getScale();
}; };

View file

@ -607,7 +607,7 @@ public class ArmBlockEntity extends KineticBlockEntity implements ITransformable
} }
@Override @Override
protected Vec3 getLocalOffset(BlockState state) { public Vec3 getLocalOffset(BlockState state) {
int yPos = state.getValue(ArmBlock.CEILING) ? 16 - 3 : 3; int yPos = state.getValue(ArmBlock.CEILING) ? 16 - 3 : 3;
Vec3 location = VecHelper.voxelSpace(8, yPos, 15.5); Vec3 location = VecHelper.voxelSpace(8, yPos, 15.5);
location = VecHelper.rotateCentered(location, AngleHelper.horizontalAngle(getSide()), Direction.Axis.Y); location = VecHelper.rotateCentered(location, AngleHelper.horizontalAngle(getSide()), Direction.Axis.Y);
@ -615,7 +615,7 @@ public class ArmBlockEntity extends KineticBlockEntity implements ITransformable
} }
@Override @Override
protected float getScale() { public float getScale() {
return super.getScale(); return super.getScale();
} }

View file

@ -40,7 +40,7 @@ public class FilteredDetectorFilterSlot extends ValueBoxTransform.Sided {
} }
@Override @Override
protected void rotate(BlockState state, PoseStack ms) { public void rotate(BlockState state, PoseStack ms) {
super.rotate(state, ms); super.rotate(state, ms);
Direction facing = state.getValue(DirectedDirectionalBlock.FACING); Direction facing = state.getValue(DirectedDirectionalBlock.FACING);
if (facing.getAxis() == Axis.Y) if (facing.getAxis() == Axis.Y)

View file

@ -131,9 +131,7 @@ public class RedstoneContactBlock extends WrenchableDirectionalBlock {
@Override @Override
public boolean canConnectRedstone(BlockState state, BlockGetter world, BlockPos pos, @Nullable Direction side) { public boolean canConnectRedstone(BlockState state, BlockGetter world, BlockPos pos, @Nullable Direction side) {
if (side == null) return side != null && state.getValue(FACING) != side.getOpposite();
return true;
return state.getValue(FACING) != side.getOpposite();
} }
@Override @Override

View file

@ -21,7 +21,7 @@ public class RedstoneLinkFrequencySlot extends ValueBoxTransform.Dual {
Vec3 vertical = VecHelper.voxelSpace(10f, 2.5f, 5.5f); Vec3 vertical = VecHelper.voxelSpace(10f, 2.5f, 5.5f);
@Override @Override
protected Vec3 getLocalOffset(BlockState state) { public Vec3 getLocalOffset(BlockState state) {
Direction facing = state.getValue(RedstoneLinkBlock.FACING); Direction facing = state.getValue(RedstoneLinkBlock.FACING);
Vec3 location = VecHelper.voxelSpace(8f, 3.01f, 5.5f); Vec3 location = VecHelper.voxelSpace(8f, 3.01f, 5.5f);
@ -40,7 +40,7 @@ public class RedstoneLinkFrequencySlot extends ValueBoxTransform.Dual {
} }
@Override @Override
protected void rotate(BlockState state, PoseStack ms) { public void rotate(BlockState state, PoseStack ms) {
Direction facing = state.getValue(RedstoneLinkBlock.FACING); Direction facing = state.getValue(RedstoneLinkBlock.FACING);
float yRot = facing.getAxis() float yRot = facing.getAxis()
.isVertical() ? 0 : AngleHelper.horizontalAngle(facing) + 180; .isVertical() ? 0 : AngleHelper.horizontalAngle(facing) + 180;
@ -51,7 +51,7 @@ public class RedstoneLinkFrequencySlot extends ValueBoxTransform.Dual {
} }
@Override @Override
protected float getScale() { public float getScale() {
return .4975f; return .4975f;
} }

View file

@ -97,13 +97,13 @@ public class TrackObserverBlockEntity extends SmartBlockEntity implements ITrans
return new FilteringBehaviour(this, new ValueBoxTransform() { return new FilteringBehaviour(this, new ValueBoxTransform() {
@Override @Override
protected void rotate(BlockState state, PoseStack ms) { public void rotate(BlockState state, PoseStack ms) {
TransformStack.cast(ms) TransformStack.cast(ms)
.rotateX(90); .rotateX(90);
} }
@Override @Override
protected Vec3 getLocalOffset(BlockState state) { public Vec3 getLocalOffset(BlockState state) {
return new Vec3(0.5, 15.5 / 16d, 0.5); return new Vec3(0.5, 15.5 / 16d, 0.5);
} }

View file

@ -20,9 +20,9 @@ public abstract class ValueBoxTransform {
protected float scale = getScale(); protected float scale = getScale();
protected abstract Vec3 getLocalOffset(BlockState state); public abstract Vec3 getLocalOffset(BlockState state);
protected abstract void rotate(BlockState state, PoseStack ms); public abstract void rotate(BlockState state, PoseStack ms);
public boolean testHit(BlockState state, Vec3 localHit) { public boolean testHit(BlockState state, Vec3 localHit) {
Vec3 offset = getLocalOffset(state); Vec3 offset = getLocalOffset(state);
@ -57,11 +57,11 @@ public abstract class ValueBoxTransform {
return VecHelper.rotateCentered(vec, yRot, Axis.Y); return VecHelper.rotateCentered(vec, yRot, Axis.Y);
} }
protected float getScale() { public float getScale() {
return .5f; return .5f;
} }
protected float getFontScale() { public float getFontScale() {
return 1 / 64f; return 1 / 64f;
} }
@ -100,7 +100,7 @@ public abstract class ValueBoxTransform {
} }
@Override @Override
protected Vec3 getLocalOffset(BlockState state) { public Vec3 getLocalOffset(BlockState state) {
Vec3 location = getSouthLocation(); Vec3 location = getSouthLocation();
location = VecHelper.rotateCentered(location, AngleHelper.horizontalAngle(getSide()), Axis.Y); location = VecHelper.rotateCentered(location, AngleHelper.horizontalAngle(getSide()), Axis.Y);
location = VecHelper.rotateCentered(location, AngleHelper.verticalAngle(getSide()), Axis.X); location = VecHelper.rotateCentered(location, AngleHelper.verticalAngle(getSide()), Axis.X);
@ -110,7 +110,7 @@ public abstract class ValueBoxTransform {
protected abstract Vec3 getSouthLocation(); protected abstract Vec3 getSouthLocation();
@Override @Override
protected void rotate(BlockState state, PoseStack ms) { public void rotate(BlockState state, PoseStack ms) {
float yRot = AngleHelper.horizontalAngle(getSide()) + 180; float yRot = AngleHelper.horizontalAngle(getSide()) + 180;
float xRot = getSide() == Direction.UP ? 90 : getSide() == Direction.DOWN ? 270 : 0; float xRot = getSide() == Direction.UP ? 90 : getSide() == Direction.DOWN ? 270 : 0;
TransformStack.cast(ms) TransformStack.cast(ms)

View file

@ -106,12 +106,12 @@ public class EdgeInteractionRenderer {
} }
@Override @Override
protected Vec3 getLocalOffset(BlockState state) { public Vec3 getLocalOffset(BlockState state) {
return add; return add;
} }
@Override @Override
protected void rotate(BlockState state, PoseStack ms) { public void rotate(BlockState state, PoseStack ms) {
super.rotate(state, ms); super.rotate(state, ms);
} }

View file

@ -14,7 +14,10 @@ import net.minecraft.world.InteractionResult;
import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level; import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.BlockHitResult;
import net.minecraft.world.phys.Vec3;
import net.minecraftforge.common.util.FakePlayer;
import net.minecraftforge.event.entity.player.PlayerInteractEvent; import net.minecraftforge.event.entity.player.PlayerInteractEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.LogicalSide; import net.minecraftforge.fml.LogicalSide;
@ -29,7 +32,7 @@ public class LinkHandler {
BlockPos pos = event.getPos(); BlockPos pos = event.getPos();
Player player = event.getPlayer(); Player player = event.getPlayer();
InteractionHand hand = event.getHand(); InteractionHand hand = event.getHand();
if (player.isShiftKeyDown() || player.isSpectator()) if (player.isShiftKeyDown() || player.isSpectator())
return; return;
@ -46,9 +49,23 @@ public class LinkHandler {
if (AllItems.WRENCH.isIn(heldItem)) if (AllItems.WRENCH.isIn(heldItem))
return; return;
boolean fakePlayer = player instanceof FakePlayer;
boolean fakePlayerChoice = false;
if (fakePlayer) {
BlockState blockState = world.getBlockState(pos);
Vec3 localHit = ray.getLocation()
.subtract(Vec3.atLowerCornerOf(pos))
.add(Vec3.atLowerCornerOf(ray.getDirection()
.getNormal())
.scale(.25f));
fakePlayerChoice = localHit.distanceToSqr(behaviour.firstSlot.getLocalOffset(blockState)) > localHit
.distanceToSqr(behaviour.secondSlot.getLocalOffset(blockState));
}
for (boolean first : Arrays.asList(false, true)) { for (boolean first : Arrays.asList(false, true)) {
if (behaviour.testHit(first, ray.getLocation())) { if (behaviour.testHit(first, ray.getLocation()) || fakePlayer && fakePlayerChoice == first) {
if (event.getSide() != LogicalSide.CLIENT) if (event.getSide() != LogicalSide.CLIENT)
behaviour.setFrequency(first, heldItem); behaviour.setFrequency(first, heldItem);
event.setCanceled(true); event.setCanceled(true);
event.setCancellationResult(InteractionResult.SUCCESS); event.setCancellationResult(InteractionResult.SUCCESS);

View file

@ -21,9 +21,9 @@ import net.minecraft.world.level.material.FluidState;
@Mixin(FlowingFluid.class) @Mixin(FlowingFluid.class)
public class WaterWheelFluidSpreadMixin { public class WaterWheelFluidSpreadMixin {
@Inject(at = @At("HEAD"), cancellable = true, method = "canSpreadTo(Lnet/minecraft/world/level/BlockGetter;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/core/Direction;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/material/FluidState;Lnet/minecraft/world/level/material/Fluid;)Z") @Inject(at = @At("HEAD"), cancellable = true, method = "canPassThrough(Lnet/minecraft/world/level/BlockGetter;Lnet/minecraft/world/level/material/Fluid;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/core/Direction;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/material/FluidState;)Z")
protected void canSpreadToOnWaterWheel(BlockGetter pLevel, BlockPos pFromPos, BlockState pFromBlockState, protected void canPassThroughOnWaterWheel(BlockGetter pLevel, Fluid pFluid, BlockPos pFromPos, BlockState p_75967_,
Direction pDirection, BlockPos pToPos, BlockState pToBlockState, FluidState pToFluidState, Fluid pFluid, Direction pDirection, BlockPos p_75969_, BlockState p_75970_, FluidState p_75971_,
CallbackInfoReturnable<Boolean> cir) { CallbackInfoReturnable<Boolean> cir) {
if (pDirection.getAxis() == Axis.Y) if (pDirection.getAxis() == Axis.Y)
@ -39,7 +39,7 @@ public class WaterWheelFluidSpreadMixin {
} else if (!AllBlocks.WATER_WHEEL.has(belowState)) } else if (!AllBlocks.WATER_WHEEL.has(belowState))
return; return;
if (belowState.getBlock()instanceof IRotate irotate if (belowState.getBlock() instanceof IRotate irotate
&& irotate.getRotationAxis(belowState) == pDirection.getAxis()) && irotate.getRotationAxis(belowState) == pDirection.getAxis())
cir.setReturnValue(false); cir.setReturnValue(false);
} }

View file

@ -369,7 +369,7 @@ public class SceneBuilder {
} }
public void showCenteredScrollInput(BlockPos pos, Direction side, int duration) { public void showCenteredScrollInput(BlockPos pos, Direction side, int duration) {
showScrollInput(scene.getSceneBuildingUtil().vector.blockSurface(pos, side), side, duration); showFilterSlotInput(scene.getSceneBuildingUtil().vector.blockSurface(pos, side), side, duration);
} }
public void showScrollInput(Vec3 location, Direction side, int duration) { public void showScrollInput(Vec3 location, Direction side, int duration) {
@ -381,17 +381,15 @@ public class SceneBuilder {
} }
public void showRepeaterScrollInput(BlockPos pos, int duration) { public void showRepeaterScrollInput(BlockPos pos, int duration) {
float s = 1 / 16f; showFilterSlotInput(scene.getSceneBuildingUtil().vector.blockSurface(pos, Direction.DOWN)
float q = 1 / 6f; .add(0, 3 / 16f, 0), Direction.UP, duration);
Vec3 expands = new Vec3(q, s, q);
addInstruction(
new HighlightValueBoxInstruction(scene.getSceneBuildingUtil().vector.blockSurface(pos, Direction.DOWN)
.add(0, 3 / 16f, 0), expands, duration));
} }
public void showFilterSlotInput(Vec3 location, int duration) { public void showFilterSlotInput(Vec3 location, Direction side, int duration) {
float s = .1f; location = location.add(Vec3.atLowerCornerOf(side.getNormal())
Vec3 expands = new Vec3(s, s, s); .scale(-3 / 128f));
Vec3 expands = VecHelper.axisAlingedPlaneOf(side)
.scale(11 / 128f);
addInstruction(new HighlightValueBoxInstruction(location, expands, duration)); addInstruction(new HighlightValueBoxInstruction(location, expands, duration));
} }
@ -794,7 +792,8 @@ public class SceneBuilder {
modifyBlockEntityNBT(selection, beType, consumer, false); modifyBlockEntityNBT(selection, beType, consumer, false);
} }
public <T extends BlockEntity> void modifyBlockEntity(BlockPos position, Class<T> beType, Consumer<T> consumer) { public <T extends BlockEntity> void modifyBlockEntity(BlockPos position, Class<T> beType,
Consumer<T> consumer) {
addInstruction(scene -> { addInstruction(scene -> {
BlockEntity blockEntity = scene.getWorld() BlockEntity blockEntity = scene.getWorld()
.getBlockEntity(position); .getBlockEntity(position);
@ -813,12 +812,13 @@ public class SceneBuilder {
public void instructArm(BlockPos armLocation, ArmBlockEntity.Phase phase, ItemStack heldItem, public void instructArm(BlockPos armLocation, ArmBlockEntity.Phase phase, ItemStack heldItem,
int targetedPoint) { int targetedPoint) {
modifyBlockEntityNBT(scene.getSceneBuildingUtil().select.position(armLocation), ArmBlockEntity.class, compound -> { modifyBlockEntityNBT(scene.getSceneBuildingUtil().select.position(armLocation), ArmBlockEntity.class,
NBTHelper.writeEnum(compound, "Phase", phase); compound -> {
compound.put("HeldItem", heldItem.serializeNBT()); NBTHelper.writeEnum(compound, "Phase", phase);
compound.putInt("TargetPointIndex", targetedPoint); compound.put("HeldItem", heldItem.serializeNBT());
compound.putFloat("MovementProgress", 0); compound.putInt("TargetPointIndex", targetedPoint);
}); compound.putFloat("MovementProgress", 0);
});
} }
public void flapFunnel(BlockPos position, boolean outward) { public void flapFunnel(BlockPos position, boolean outward) {
@ -865,7 +865,8 @@ public class SceneBuilder {
} }
public void flashDisplayLink(BlockPos position) { public void flashDisplayLink(BlockPos position) {
modifyBlockEntity(position, DisplayLinkBlockEntity.class, linkBlockEntity -> linkBlockEntity.glow.setValue(2)); modifyBlockEntity(position, DisplayLinkBlockEntity.class,
linkBlockEntity -> linkBlockEntity.glow.setValue(2));
} }
} }

View file

@ -123,12 +123,12 @@ public class ArmScenes {
scene.world.setKineticSpeed(armSel, -48); scene.world.setKineticSpeed(armSel, -48);
scene.idle(20); scene.idle(20);
scene.world.instructArm(armPos, Phase.MOVE_TO_INPUT, ItemStack.EMPTY, 0); scene.world.instructArm(armPos, Phase.MOVE_TO_INPUT, ItemStack.EMPTY, 1);
scene.idle(24); scene.idle(24);
scene.world.removeItemsFromBelt(inputDepot); scene.world.removeItemsFromBelt(inputDepot);
scene.world.instructArm(armPos, Phase.SEARCH_OUTPUTS, copper, -1); scene.world.instructArm(armPos, Phase.SEARCH_OUTPUTS, copper, -1);
scene.idle(20); scene.idle(20);
scene.world.instructArm(armPos, Phase.MOVE_TO_OUTPUT, copper, 0); scene.world.instructArm(armPos, Phase.MOVE_TO_OUTPUT, copper, 1);
scene.idle(24); scene.idle(24);
scene.world.createItemOnBeltLike(outputDepot, Direction.UP, copper); scene.world.createItemOnBeltLike(outputDepot, Direction.UP, copper);
scene.world.instructArm(armPos, Phase.SEARCH_INPUTS, ItemStack.EMPTY, -1); scene.world.instructArm(armPos, Phase.SEARCH_INPUTS, ItemStack.EMPTY, -1);
@ -166,7 +166,7 @@ public class ArmScenes {
scene.world.removeItemsFromBelt(inputDepot); scene.world.removeItemsFromBelt(inputDepot);
scene.world.instructArm(armPos, Phase.SEARCH_OUTPUTS, copper, -1); scene.world.instructArm(armPos, Phase.SEARCH_OUTPUTS, copper, -1);
scene.idle(20); scene.idle(20);
scene.world.instructArm(armPos, Phase.MOVE_TO_OUTPUT, copper, 2); scene.world.instructArm(armPos, Phase.MOVE_TO_OUTPUT, copper, 0);
scene.idle(24); scene.idle(24);
scene.world.createItemOnBeltLike(outputDepot, Direction.UP, copper); scene.world.createItemOnBeltLike(outputDepot, Direction.UP, copper);
scene.world.instructArm(armPos, Phase.SEARCH_INPUTS, ItemStack.EMPTY, -1); scene.world.instructArm(armPos, Phase.SEARCH_INPUTS, ItemStack.EMPTY, -1);
@ -226,12 +226,12 @@ public class ArmScenes {
scene.world.createItemOnBeltLike(inputDepot, Direction.SOUTH, sword); scene.world.createItemOnBeltLike(inputDepot, Direction.SOUTH, sword);
scene.idle(20); scene.idle(20);
scene.world.instructArm(armPos, Phase.MOVE_TO_INPUT, ItemStack.EMPTY, 1); scene.world.instructArm(armPos, Phase.MOVE_TO_INPUT, ItemStack.EMPTY, 0);
scene.idle(24); scene.idle(24);
scene.world.removeItemsFromBelt(inputDepot); scene.world.removeItemsFromBelt(inputDepot);
scene.world.instructArm(armPos, Phase.SEARCH_OUTPUTS, sword, -1); scene.world.instructArm(armPos, Phase.SEARCH_OUTPUTS, sword, -1);
scene.idle(20); scene.idle(20);
scene.world.instructArm(armPos, Phase.MOVE_TO_OUTPUT, sword, 1); scene.world.instructArm(armPos, Phase.MOVE_TO_OUTPUT, sword, 2);
scene.idle(24); scene.idle(24);
scene.world.flapFunnel(util.grid.at(0, 2, 2), false); scene.world.flapFunnel(util.grid.at(0, 2, 2), false);
scene.world.instructArm(armPos, Phase.SEARCH_INPUTS, ItemStack.EMPTY, -1); scene.world.instructArm(armPos, Phase.SEARCH_INPUTS, ItemStack.EMPTY, -1);
@ -306,7 +306,7 @@ public class ArmScenes {
} }
Vec3 filterSlot = util.vector.of(3.5, 3.75, 2.6); Vec3 filterSlot = util.vector.of(3.5, 3.75, 2.6);
scene.overlay.showFilterSlotInput(filterSlot, 80); scene.overlay.showFilterSlotInput(filterSlot, Direction.NORTH, 80);
scene.idle(10); scene.idle(10);
scene.overlay.showText(80) scene.overlay.showText(80)
.attachKeyFrame() .attachKeyFrame()
@ -428,19 +428,18 @@ public class ArmScenes {
.colored(PonderPalette.OUTPUT); .colored(PonderPalette.OUTPUT);
scene.idle(70); scene.idle(70);
Vec3 scrollSlot = util.vector.of(3.5, 1.25, 4); Vec3 scrollSlot = util.vector.of(3.5, 1 + 3 / 16f, 4);
scene.overlay.showFilterSlotInput(scrollSlot, 120); scene.overlay.showFilterSlotInput(scrollSlot, Direction.NORTH, 120);
scene.overlay.showText(50) scene.overlay.showText(50)
.text("...it will act according to its setting") .text("...it will act according to its setting")
.pointAt(scrollSlot) .pointAt(scrollSlot)
.placeNearTarget(); .placeNearTarget();
scene.idle(60); scene.idle(60);
scene.overlay.showControls(new InputWindowElement(scrollSlot, Pointing.RIGHT).scroll() scene.overlay.showControls(new InputWindowElement(scrollSlot, Pointing.RIGHT).rightClick(), 40);
.withWrench(), 40);
scene.idle(10); scene.idle(10);
scene.overlay.showText(50) scene.overlay.showText(50)
.text("Scrolling with a Wrench will allow you to configure it") .text("The value panel will allow you to configure it")
.pointAt(scrollSlot) .pointAt(scrollSlot)
.placeNearTarget(); .placeNearTarget();
scene.idle(60); scene.idle(60);
@ -561,7 +560,7 @@ public class ArmScenes {
scene.overlay.showText(60) scene.overlay.showText(60)
.colored(PonderPalette.RED) .colored(PonderPalette.RED)
.attachKeyFrame() .attachKeyFrame()
.pointAt(util.vector.topOf(armPos.above())) .pointAt(util.vector.topOf(armPos))
.placeNearTarget() .placeNearTarget()
.text("When powered by Redstone, Mechanical Arms will not activate"); .text("When powered by Redstone, Mechanical Arms will not activate");
scene.idle(70); scene.idle(70);
@ -586,7 +585,7 @@ public class ArmScenes {
scene.world.toggleRedstonePower(redstone); scene.world.toggleRedstonePower(redstone);
scene.effects.indicateRedstone(leverPos); scene.effects.indicateRedstone(leverPos);
scene.overlay.showText(60) scene.overlay.showText(60)
.pointAt(util.vector.topOf(armPos.above())) .pointAt(util.vector.topOf(armPos))
.placeNearTarget() .placeNearTarget()
.text("Before stopping, it will finish any started cycles"); .text("Before stopping, it will finish any started cycles");
} }
@ -597,7 +596,7 @@ public class ArmScenes {
scene.overlay.showText(100) scene.overlay.showText(100)
.colored(PonderPalette.GREEN) .colored(PonderPalette.GREEN)
.attachKeyFrame() .attachKeyFrame()
.pointAt(util.vector.topOf(armPos.above())) .pointAt(util.vector.topOf(armPos))
.placeNearTarget() .placeNearTarget()
.text("Thus, a negative pulse can be used to trigger exactly one activation cycle"); .text("Thus, a negative pulse can be used to trigger exactly one activation cycle");
} }

View file

@ -123,7 +123,8 @@ public class BearingScenes {
scene.rotateCameraY(-90); scene.rotateCameraY(-90);
scene.idle(20); scene.idle(20);
scene.overlay.showControls(new InputWindowElement(util.vector.topOf(windmill), Pointing.DOWN).rightClick(), 60); scene.overlay.showControls(new InputWindowElement(util.vector.topOf(windmill)
.subtract(.5, 0, 0), Pointing.DOWN).rightClick(), 60);
scene.idle(7); scene.idle(7);
scene.world.rotateBearing(windmill, 360, 200); scene.world.rotateBearing(windmill, 360, 200);
scene.world.rotateSection(structure, 0, 0, 360, 200); scene.world.rotateSection(structure, 0, 0, 360, 200);
@ -135,7 +136,8 @@ public class BearingScenes {
scene.idle(10); scene.idle(10);
scene.overlay.showText(60) scene.overlay.showText(60)
.pointAt(util.vector.topOf(windmill)) .pointAt(util.vector.topOf(windmill)
.subtract(.5, 0, 0))
.placeNearTarget() .placeNearTarget()
.attachKeyFrame() .attachKeyFrame()
.text("Activated with Right-Click, the Windmill Bearing will start providing Rotational Force"); .text("Activated with Right-Click, the Windmill Bearing will start providing Rotational Force");
@ -148,15 +150,15 @@ public class BearingScenes {
.text("The Amount of Sail Blocks determine its Rotation Speed"); .text("The Amount of Sail Blocks determine its Rotation Speed");
scene.idle(90); scene.idle(90);
Vec3 surface = util.vector.blockSurface(windmill, Direction.WEST); Vec3 surface = util.vector.blockSurface(windmill, Direction.WEST)
scene.overlay.showControls(new InputWindowElement(surface, Pointing.DOWN).scroll() .add(0, 0, 2 / 16f);
.withWrench(), 60); scene.overlay.showControls(new InputWindowElement(surface, Pointing.DOWN).rightClick(), 60);
scene.overlay.showCenteredScrollInput(windmill, Direction.WEST, 50); scene.overlay.showFilterSlotInput(surface, Direction.WEST, 50);
scene.overlay.showText(60) scene.overlay.showText(60)
.pointAt(surface) .pointAt(surface)
.attachKeyFrame() .attachKeyFrame()
.placeNearTarget() .placeNearTarget()
.text("Use a Wrench to configure its rotation direction"); .text("Use the value panel to configure its rotation direction");
scene.idle(36); scene.idle(36);
scene.world.rotateBearing(windmill, -90 - 45, 75); scene.world.rotateBearing(windmill, -90 - 45, 75);
@ -166,7 +168,8 @@ public class BearingScenes {
scene.effects.rotationDirectionIndicator(windmill.south()); scene.effects.rotationDirectionIndicator(windmill.south());
scene.idle(69); scene.idle(69);
scene.overlay.showControls(new InputWindowElement(util.vector.topOf(windmill), Pointing.DOWN).rightClick(), 60); scene.overlay.showControls(new InputWindowElement(util.vector.topOf(windmill)
.subtract(.5, 0, 0), Pointing.DOWN).rightClick(), 60);
scene.idle(7); scene.idle(7);
scene.world.rotateBearing(windmill, -45, 0); scene.world.rotateBearing(windmill, -45, 0);
scene.world.rotateSection(structure, 0, 0, -45, 0); scene.world.rotateSection(structure, 0, 0, -45, 0);
@ -174,7 +177,8 @@ public class BearingScenes {
scene.world.setKineticSpeed(kinetics, 0); scene.world.setKineticSpeed(kinetics, 0);
scene.idle(10); scene.idle(10);
scene.overlay.showText(60) scene.overlay.showText(60)
.pointAt(util.vector.topOf(windmill)) .pointAt(util.vector.topOf(windmill)
.subtract(.5, 0, 0))
.placeNearTarget() .placeNearTarget()
.text("Right-click the Bearing anytime to stop and edit the Structure again"); .text("Right-click the Bearing anytime to stop and edit the Structure again");
scene.idle(30); scene.idle(30);
@ -229,7 +233,8 @@ public class BearingScenes {
scene.world.modifyBlockEntity(util.grid.at(2, 1, 5), HarvesterBlockEntity.class, scene.world.modifyBlockEntity(util.grid.at(2, 1, 5), HarvesterBlockEntity.class,
hte -> hte.setAnimatedSpeed(-150)); hte -> hte.setAnimatedSpeed(-150));
scene.idle(400); scene.idle(400);
scene.world.modifyBlockEntity(util.grid.at(2, 1, 5), HarvesterBlockEntity.class, hte -> hte.setAnimatedSpeed(0)); scene.world.modifyBlockEntity(util.grid.at(2, 1, 5), HarvesterBlockEntity.class,
hte -> hte.setAnimatedSpeed(0));
} }
public static void mechanicalBearing(SceneBuilder scene, SceneBuildingUtil util) { public static void mechanicalBearing(SceneBuilder scene, SceneBuildingUtil util) {
@ -372,24 +377,24 @@ public class BearingScenes {
scene.idle(50); scene.idle(50);
scene.overlay.showText(100) scene.overlay.showText(100)
.pointAt(util.vector.blockSurface(bearingPos, Direction.WEST)) .pointAt(util.vector.topOf(util.grid.at(5, 0, 4)))
.placeNearTarget() .placeNearTarget()
.colored(PonderPalette.RED) .colored(PonderPalette.RED)
.attachKeyFrame() .attachKeyFrame()
.text("When Stopped, the Bearing will place the structure at the nearest grid-aligned Angle"); .text("When Stopped, the Bearing will place the structure at the nearest grid-aligned Angle");
scene.idle(110); scene.idle(110);
scene.overlay.showCenteredScrollInput(bearingPos, Direction.NORTH, 60); Vec3 blockSurface = util.vector.blockSurface(bearingPos, Direction.NORTH)
scene.overlay.showControls( .add(0, 2 / 16f, 0);
new InputWindowElement(util.vector.blockSurface(bearingPos, Direction.NORTH), Pointing.DOWN).scroll() scene.overlay.showFilterSlotInput(blockSurface, Direction.NORTH, 60);
.withWrench(), scene.overlay.showControls(new InputWindowElement(blockSurface, Pointing.DOWN).scroll()
60); .withWrench(), 60);
scene.idle(10); scene.idle(10);
scene.overlay.showText(60) scene.overlay.showText(60)
.pointAt(util.vector.blockSurface(bearingPos, Direction.WEST)) .pointAt(blockSurface)
.placeNearTarget() .placeNearTarget()
.attachKeyFrame() .attachKeyFrame()
.sharedText("behaviour_modify_wrench"); .sharedText("behaviour_modify_value_panel");
scene.idle(70); scene.idle(70);
scene.world.modifyKineticSpeed(util.select.everywhere(), f -> -f); scene.world.modifyKineticSpeed(util.select.everywhere(), f -> -f);

View file

@ -256,15 +256,14 @@ public class CartAssemblerScenes {
scene.idle(25); scene.idle(25);
Vec3 blockSurface = util.vector.blockSurface(assemblerPos, Direction.NORTH) Vec3 blockSurface = util.vector.blockSurface(assemblerPos, Direction.NORTH)
.add(0, 0, -2 / 16f); .add(0, -1 / 16f, -2 / 16f);
scene.overlay.showScrollInput(blockSurface, Direction.NORTH, 60); scene.overlay.showFilterSlotInput(blockSurface, Direction.NORTH, 60);
scene.overlay.showControls(new InputWindowElement(blockSurface, Pointing.DOWN).scroll() scene.overlay.showControls(new InputWindowElement(blockSurface, Pointing.DOWN).rightClick(), 60);
.withWrench(), 60);
scene.idle(10); scene.idle(10);
scene.overlay.showText(60) scene.overlay.showText(60)
.pointAt(util.vector.of(3, 1.5, 3)) .pointAt(util.vector.of(3, 1.5, 3))
.placeNearTarget() .placeNearTarget()
.sharedText("behaviour_modify_wrench"); .sharedText("behaviour_modify_value_panel");
scene.idle(70); scene.idle(70);
contraption = scene.world.showIndependentSection(util.select.fromTo(3, 2, 3, 2, 2, 3), Direction.DOWN); contraption = scene.world.showIndependentSection(util.select.fromTo(3, 2, 3, 2, 2, 3), Direction.DOWN);

View file

@ -182,7 +182,7 @@ public class ChassisScenes {
Vec3 blockSurface = util.vector.blockSurface(chassisPos, Direction.NORTH); Vec3 blockSurface = util.vector.blockSurface(chassisPos, Direction.NORTH);
scene.overlay.showCenteredScrollInput(chassisPos, Direction.NORTH, 50); scene.overlay.showCenteredScrollInput(chassisPos, Direction.NORTH, 50);
scene.overlay.showControls(new InputWindowElement(blockSurface, Pointing.UP).scroll() scene.overlay.showControls(new InputWindowElement(blockSurface, Pointing.UP).rightClick()
.withWrench(), 50); .withWrench(), 50);
scene.idle(10); scene.idle(10);
@ -215,7 +215,7 @@ public class ChassisScenes {
scene.overlay.showCenteredScrollInput(chassisPos, Direction.NORTH, 50); scene.overlay.showCenteredScrollInput(chassisPos, Direction.NORTH, 50);
scene.overlay.showControls(new InputWindowElement(blockSurface, Pointing.UP).whileCTRL() scene.overlay.showControls(new InputWindowElement(blockSurface, Pointing.UP).whileCTRL()
.scroll() .rightClick()
.withWrench(), 50); .withWrench(), 50);
column1 = util.select.fromTo(1, 3, 2, 3, 3, 2); column1 = util.select.fromTo(1, 3, 2, 3, 3, 2);
@ -234,7 +234,7 @@ public class ChassisScenes {
scene.overlay.showText(80) scene.overlay.showText(80)
.pointAt(blockSurface) .pointAt(blockSurface)
.text("Holding CTRL and scrolling adjusts the range of all attached Chassis Blocks") .text("Holding CTRL adjusts the range of all connected Chassis Blocks")
.placeNearTarget(); .placeNearTarget();
scene.idle(90); scene.idle(90);
@ -441,7 +441,7 @@ public class ChassisScenes {
scene.addKeyframe(); scene.addKeyframe();
blockSurface = util.vector.topOf(chassisPos); blockSurface = util.vector.topOf(chassisPos);
scene.overlay.showCenteredScrollInput(chassisPos, Direction.UP, 50); scene.overlay.showCenteredScrollInput(chassisPos, Direction.UP, 50);
scene.overlay.showControls(new InputWindowElement(blockSurface, Pointing.DOWN).scroll() scene.overlay.showControls(new InputWindowElement(blockSurface, Pointing.DOWN).rightClick()
.withWrench(), 50); .withWrench(), 50);
scene.idle(10); scene.idle(10);

View file

@ -66,15 +66,29 @@ public class ChuteScenes {
.withWrench(), .withWrench(),
40); 40);
scene.idle(7); scene.idle(7);
scene.world.modifyBlock(util.grid.at(3, 3, 3), s -> s.setValue(ChuteBlock.SHAPE, ChuteBlock.Shape.WINDOW), false); scene.world.modifyBlock(util.grid.at(3, 3, 3), s -> s.setValue(ChuteBlock.SHAPE, ChuteBlock.Shape.WINDOW),
false);
scene.overlay.showText(50) scene.overlay.showText(50)
.attachKeyFrame() .attachKeyFrame()
.pointAt(util.vector.blockSurface(util.grid.at(2, 3, 2), Direction.WEST)) .pointAt(util.vector.blockSurface(util.grid.at(2, 3, 2), Direction.WEST))
.placeNearTarget() .placeNearTarget()
.text("Using the Wrench, a window can be created"); .text("Using the Wrench, a window can be created");
scene.idle(60);
scene.overlay.showControls(
new InputWindowElement(util.vector.blockSurface(util.grid.at(2, 2, 2), Direction.NORTH), Pointing.RIGHT)
.rightClick()
.withItem(AllBlocks.INDUSTRIAL_IRON_BLOCK.asStack()),
40);
scene.idle(7);
scene.world.modifyBlock(util.grid.at(3, 2, 3), s -> s.setValue(ChuteBlock.SHAPE, ChuteBlock.Shape.ENCASED),
false);
scene.overlay.showText(50)
.pointAt(util.vector.blockSurface(util.grid.at(2, 2, 2), Direction.WEST))
.placeNearTarget()
.text("Using Industrial Iron Blocks, chutes can be encased");
scene.idle(10); scene.idle(10);
scene.world.modifyBlock(util.grid.at(3, 2, 3), s -> s.setValue(SHAPE, Shape.WINDOW), false);
for (int i = 0; i < 8; i++) { for (int i = 0; i < 8; i++) {
scene.idle(10); scene.idle(10);
@ -84,9 +98,11 @@ public class ChuteScenes {
scene.world.hideIndependentSection(bottom, Direction.EAST); scene.world.hideIndependentSection(bottom, Direction.EAST);
scene.world.hideIndependentSection(top, Direction.EAST); scene.world.hideIndependentSection(top, Direction.EAST);
scene.idle(15); scene.idle(15);
scene.addKeyframe();
scene.rotateCameraY(-90); scene.rotateCameraY(-90);
scene.world.modifyBlock(util.grid.at(2, 2, 1), s -> s.setValue(SHAPE, Shape.NORMAL), false); scene.world.modifyBlock(util.grid.at(2, 2, 1), s -> s.setValue(SHAPE, Shape.NORMAL), false);
scene.world.modifyBlock(util.grid.at(2, 3, 2), s -> s.setValue(SHAPE, Shape.INTERSECTION), false);
scene.world.showSection(util.select.fromTo(2, 1, 1, 2, 2, 1), Direction.DOWN); scene.world.showSection(util.select.fromTo(2, 1, 1, 2, 2, 1), Direction.DOWN);
scene.idle(30); scene.idle(30);
ItemStack chuteItem = AllBlocks.CHUTE.asStack(); ItemStack chuteItem = AllBlocks.CHUTE.asStack();
@ -98,7 +114,8 @@ public class ChuteScenes {
scene.idle(7); scene.idle(7);
scene.world.showSection(util.select.position(2, 3, 2), Direction.NORTH); scene.world.showSection(util.select.position(2, 3, 2), Direction.NORTH);
scene.world.restoreBlocks(util.select.position(2, 2, 1)); scene.world.restoreBlocks(util.select.position(2, 2, 1));
scene.idle(35); scene.idle(15);
scene.idle(20);
scene.overlay.showControls( scene.overlay.showControls(
new InputWindowElement(util.vector.blockSurface(util.grid.at(2, 3, 2), Direction.SOUTH), Pointing.LEFT) new InputWindowElement(util.vector.blockSurface(util.grid.at(2, 3, 2), Direction.SOUTH), Pointing.LEFT)
.rightClick() .rightClick()
@ -106,7 +123,9 @@ public class ChuteScenes {
30); 30);
scene.idle(7); scene.idle(7);
scene.world.showSection(util.select.position(2, 4, 3), Direction.NORTH); scene.world.showSection(util.select.position(2, 4, 3), Direction.NORTH);
scene.idle(35); scene.idle(10);
scene.world.restoreBlocks(util.select.position(2, 3, 2));
scene.idle(25);
scene.overlay.showText(70) scene.overlay.showText(70)
.attachKeyFrame() .attachKeyFrame()
@ -122,7 +141,8 @@ public class ChuteScenes {
for (int i = 0; i < 3; i++) { for (int i = 0; i < 3; i++) {
remove = scene.world.createItemEntity(util.vector.centerOf(util.grid.at(2, 6, 3) remove = scene.world.createItemEntity(util.vector.centerOf(util.grid.at(2, 6, 3)
.relative(offset)), util.vector.of(0, 0.1, 0) .relative(offset)), util.vector.of(0, 0.1, 0)
.add(Vec3.atLowerCornerOf(offset.getNormal()).scale(-.1)), .add(Vec3.atLowerCornerOf(offset.getNormal())
.scale(-.1)),
stack); stack);
scene.idle(12); scene.idle(12);
scene.world.createItemOnBeltLike(util.grid.at(2, 4, 3), Direction.UP, stack); scene.world.createItemOnBeltLike(util.grid.at(2, 4, 3), Direction.UP, stack);
@ -202,8 +222,6 @@ public class ChuteScenes {
scene.world.showSection(util.select.fromTo(2, 1, 2, 2, 2, 2), Direction.DOWN); scene.world.showSection(util.select.fromTo(2, 1, 2, 2, 2, 2), Direction.DOWN);
scene.idle(10); scene.idle(10);
scene.world.showSection(util.select.position(2, 3, 2), Direction.DOWN); scene.world.showSection(util.select.position(2, 3, 2), Direction.DOWN);
scene.idle(5);
scene.world.showSection(util.select.position(2, 4, 2), Direction.DOWN);
scene.overlay.showText(60) scene.overlay.showText(60)
.text("Smart Chutes are vertical chutes with additional control") .text("Smart Chutes are vertical chutes with additional control")
@ -213,32 +231,37 @@ public class ChuteScenes {
scene.idle(70); scene.idle(70);
Vec3 filter = util.vector.blockSurface(smarty, Direction.NORTH) Vec3 filter = util.vector.blockSurface(smarty, Direction.NORTH)
.add(0, 0.25, 0); .add(0, 3 / 16f, 0);
scene.overlay.showFilterSlotInput(filter, 60); scene.overlay.showFilterSlotInput(filter, Direction.NORTH, 70);
ItemStack copper = new ItemStack(Items.IRON_INGOT);
scene.overlay.showControls(new InputWindowElement(filter, Pointing.DOWN).rightClick()
.withItem(copper), 40);
scene.idle(7);
scene.world.setFilterData(util.select.position(smarty), SmartChuteBlockEntity.class, copper);
scene.idle(10); scene.idle(10);
scene.rotateCameraY(20); scene.rotateCameraY(20);
scene.overlay.showText(60) scene.overlay.showText(60)
.text("Items in the filter slot specify what exactly they can extract and transfer") .text("Items in the filter slot specify what to extract or transfer")
.attachKeyFrame() .attachKeyFrame()
.pointAt(filter) .pointAt(filter.add(0, 0, 0.125))
.placeNearTarget(); .placeNearTarget();
scene.idle(10); scene.idle(60);
scene.world.showSection(util.select.position(2, 4, 2), Direction.DOWN);
scene.idle(15);
ItemStack copper = new ItemStack(Items.IRON_INGOT);
scene.overlay.showControls(new InputWindowElement(filter.add(0, 0.125, 0), Pointing.DOWN).rightClick()
.withItem(copper), 40);
scene.idle(7);
scene.world.setFilterData(util.select.position(smarty), SmartChuteBlockEntity.class, copper);
for (int i = 0; i < 18; i++) { for (int i = 0; i < 18; i++) {
scene.idle(10); scene.idle(10);
scene.world.createItemOnBeltLike(util.grid.at(2, 2, 2), Direction.UP, copper); scene.world.createItemOnBeltLike(util.grid.at(2, 2, 2), Direction.UP, copper);
if (i == 8) { if (i == 8) {
scene.rotateCameraY(-20); scene.rotateCameraY(-20);
scene.overlay.showControls(new InputWindowElement(filter, Pointing.DOWN).scroll(), 40); scene.overlay.showControls(new InputWindowElement(filter.add(0, 0.125, 0), Pointing.DOWN).rightClick(),
40);
scene.overlay.showText(50) scene.overlay.showText(50)
.text("Use the Mouse Wheel to specify the extracted stack size") .text("Use the value panel to specify the extracted stack size")
.attachKeyFrame() .attachKeyFrame()
.pointAt(filter) .pointAt(filter.add(0, 0, 0.125))
.placeNearTarget(); .placeNearTarget();
} }
if (i == 13) if (i == 13)

View file

@ -1,6 +1,7 @@
package com.simibubi.create.foundation.ponder.content; package com.simibubi.create.foundation.ponder.content;
import com.simibubi.create.AllItems; import com.simibubi.create.AllItems;
import com.simibubi.create.content.contraptions.components.deployer.DeployerBlock;
import com.simibubi.create.content.contraptions.components.deployer.DeployerBlockEntity; import com.simibubi.create.content.contraptions.components.deployer.DeployerBlockEntity;
import com.simibubi.create.content.curiosities.tools.SandPaperItem; import com.simibubi.create.content.curiosities.tools.SandPaperItem;
import com.simibubi.create.foundation.ponder.ElementLink; import com.simibubi.create.foundation.ponder.ElementLink;
@ -154,8 +155,9 @@ public class DeployerScenes {
scene.world.hideSection(util.select.position(deployerPos.above()), Direction.EAST); scene.world.hideSection(util.select.position(deployerPos.above()), Direction.EAST);
scene.idle(20); scene.idle(20);
Vec3 filterSlot = frontVec.add(0.375, 0.25, 0); Vec3 filterSlot = util.vector.topOf(deployerPos)
scene.overlay.showFilterSlotInput(filterSlot, 80); .add(2 / 16f, 0, 0);
scene.overlay.showFilterSlotInput(filterSlot, Direction.UP, 80);
scene.overlay.showText(40) scene.overlay.showText(40)
.attachKeyFrame() .attachKeyFrame()
.placeNearTarget() .placeNearTarget()
@ -279,7 +281,8 @@ public class DeployerScenes {
scene.overlay.showControls(new InputWindowElement(frontVec, Pointing.LEFT).rightClick() scene.overlay.showControls(new InputWindowElement(frontVec, Pointing.LEFT).rightClick()
.withWrench(), 40); .withWrench(), 40);
scene.idle(7); scene.idle(7);
scene.world.modifyBlockEntityNBT(deployerSelection, DeployerBlockEntity.class, nbt -> nbt.putString("Mode", "PUNCH")); scene.world.modifyBlockEntityNBT(deployerSelection, DeployerBlockEntity.class,
nbt -> nbt.putString("Mode", "PUNCH"));
scene.idle(45); scene.idle(45);
scene.overlay.showText(60) scene.overlay.showText(60)
@ -338,7 +341,8 @@ public class DeployerScenes {
scene.overlay.showControls(new InputWindowElement(util.vector.blockSurface(pressPos.below(), Direction.EAST) scene.overlay.showControls(new InputWindowElement(util.vector.blockSurface(pressPos.below(), Direction.EAST)
.add(0, 0.15, 0), Pointing.RIGHT).withItem(tool), 30); .add(0, 0.15, 0), Pointing.RIGHT).withItem(tool), 30);
scene.idle(7); scene.idle(7);
scene.world.modifyBlockEntityNBT(pressS, DeployerBlockEntity.class, nbt -> nbt.put("HeldItem", tool.serializeNBT())); scene.world.modifyBlockEntityNBT(pressS, DeployerBlockEntity.class,
nbt -> nbt.put("HeldItem", tool.serializeNBT()));
scene.idle(25); scene.idle(25);
Vec3 pressSide = util.vector.blockSurface(pressPos, Direction.WEST); Vec3 pressSide = util.vector.blockSurface(pressPos, Direction.WEST);
@ -500,6 +504,8 @@ public class DeployerScenes {
BlockPos deployerPos = util.grid.at(4, 1, 3); BlockPos deployerPos = util.grid.at(4, 1, 3);
Selection deployerSelection = util.select.position(deployerPos); Selection deployerSelection = util.select.position(deployerPos);
scene.world.cycleBlockProperty(deployerPos, DeployerBlock.AXIS_ALONG_FIRST_COORDINATE);
scene.world.showSection(util.select.layer(0) scene.world.showSection(util.select.layer(0)
.add(flowers), Direction.UP); .add(flowers), Direction.UP);
scene.idle(5); scene.idle(5);
@ -546,10 +552,9 @@ public class DeployerScenes {
scene.world.replaceBlocks(flowers, Blocks.AIR.defaultBlockState(), false); scene.world.replaceBlocks(flowers, Blocks.AIR.defaultBlockState(), false);
scene.world.showSection(flowers, Direction.UP); scene.world.showSection(flowers, Direction.UP);
Vec3 frontVec = util.vector.blockSurface(deployerPos.west(3), Direction.NORTH) Vec3 filterSlot = util.vector.blockSurface(deployerPos.west(3), Direction.WEST)
.add(0, 0, -.125); .add(0, 0, 2 / 16f);
Vec3 filterSlot = frontVec.add(0, 0.25, 0.375); scene.overlay.showFilterSlotInput(filterSlot, Direction.WEST, 80);
scene.overlay.showFilterSlotInput(filterSlot, 80);
scene.overlay.showText(60) scene.overlay.showText(60)
.attachKeyFrame() .attachKeyFrame()
.placeNearTarget() .placeNearTarget()

View file

@ -2,6 +2,8 @@ package com.simibubi.create.foundation.ponder.content;
import com.simibubi.create.AllBlocks; import com.simibubi.create.AllBlocks;
import com.simibubi.create.AllItems; import com.simibubi.create.AllItems;
import com.simibubi.create.content.curiosities.clipboard.ClipboardOverrides;
import com.simibubi.create.content.curiosities.clipboard.ClipboardOverrides.ClipboardType;
import com.simibubi.create.foundation.ponder.ElementLink; import com.simibubi.create.foundation.ponder.ElementLink;
import com.simibubi.create.foundation.ponder.PonderPalette; import com.simibubi.create.foundation.ponder.PonderPalette;
import com.simibubi.create.foundation.ponder.SceneBuilder; import com.simibubi.create.foundation.ponder.SceneBuilder;
@ -278,26 +280,22 @@ public class DisplayScenes {
scene.rotateCameraY(-60); scene.rotateCameraY(-60);
scene.idle(20); scene.idle(20);
scene.world.showSection(util.select.position(0, 1, 2), Direction.DOWN);
scene.idle(15);
Vec3 target = util.vector.of(3.95, 2.75, 3.25); Vec3 target = util.vector.of(3.95, 2.75, 3.25);
scene.overlay ItemStack clipboard = AllBlocks.CLIPBOARD.asStack();
.showControls(new InputWindowElement(target, Pointing.RIGHT).withItem(new ItemStack(Items.NAME_TAG)) ClipboardOverrides.switchTo(ClipboardType.WRITTEN, clipboard);
.rightClick(), 40); scene.overlay.showControls(new InputWindowElement(target, Pointing.RIGHT).withItem(clipboard)
.rightClick(), 40);
scene.idle(6); scene.idle(6);
scene.world.setDisplayBoardText(board, 0, Components.literal("Create")); scene.world.setDisplayBoardText(board, 0, Components.literal("Create"));
scene.idle(25); scene.idle(25);
scene.overlay.showText(50) scene.overlay.showText(50)
.text("Text can be displayed using Name Tags...") .text("Static text can be applied using written Clipboards")
.pointAt(target.add(-2, 0, 0)) .pointAt(target.add(-2, 0, 0))
.attachKeyFrame() .attachKeyFrame()
.placeNearTarget(); .placeNearTarget();
scene.idle(40); scene.idle(80);
scene.world.hideSection(util.select.position(0, 1, 2), Direction.WEST);
scene.idle(20);
scene.world.showSection(depot, Direction.DOWN); scene.world.showSection(depot, Direction.DOWN);
scene.idle(10); scene.idle(10);
scene.world.showSection(link, Direction.EAST); scene.world.showSection(link, Direction.EAST);
@ -308,8 +306,8 @@ public class DisplayScenes {
.deflate(0, 0, 3 / 16f), 60); .deflate(0, 0, 3 / 16f), 60);
scene.idle(20); scene.idle(20);
scene.overlay.showText(50) scene.overlay.showText(70)
.text("...or through the use of Display Links") .text("And dynamic text through the use of Display Links")
.pointAt(target.add(-2, 0, 0)) .pointAt(target.add(-2, 0, 0))
.attachKeyFrame() .attachKeyFrame()
.colored(PonderPalette.OUTPUT) .colored(PonderPalette.OUTPUT)

View file

@ -151,16 +151,16 @@ public class EjectorScenes {
scene.world.setBlock(targetPos, AllBlocks.ANDESITE_CASING.getDefaultState(), false); scene.world.setBlock(targetPos, AllBlocks.ANDESITE_CASING.getDefaultState(), false);
scene.world.showSection(targetS, Direction.NORTH); scene.world.showSection(targetS, Direction.NORTH);
Vec3 input = util.vector.of(4.8, 1 + 12 / 16f, 2.5); Vec3 input = util.vector.blockSurface(ejectorPos, Direction.WEST)
.add(0, -2 / 16f, 0);
Vec3 topOfSlot = input.add(0, 2 / 16f, 0); Vec3 topOfSlot = input.add(0, 2 / 16f, 0);
scene.overlay.showControls(new InputWindowElement(topOfSlot, Pointing.DOWN).scroll() scene.overlay.showControls(new InputWindowElement(topOfSlot, Pointing.DOWN).rightClick(), 60);
.withWrench(), 60); scene.overlay.showFilterSlotInput(input, Direction.WEST, 80);
scene.overlay.showFilterSlotInput(input, 80);
scene.idle(10); scene.idle(10);
scene.overlay.showText(80) scene.overlay.showText(80)
.attachKeyFrame() .attachKeyFrame()
.text("Using the Wrench, a required Stack Size can be configured") .text("Using the value panel, a required Stack Size can be configured")
.pointAt(topOfSlot) .pointAt(input.add(0, 0, 0.125))
.placeNearTarget(); .placeNearTarget();
scene.world.modifyBlockEntityNBT(ejectorS, EjectorBlockEntity.class, nbt -> { scene.world.modifyBlockEntityNBT(ejectorS, EjectorBlockEntity.class, nbt -> {
nbt.putInt("ScrollValue", 10); nbt.putInt("ScrollValue", 10);
@ -206,7 +206,7 @@ public class EjectorScenes {
scene.idle(15); scene.idle(15);
scene.special.changeBirbPose(birb, ParrotElement.FaceCursorPose::new); scene.special.changeBirbPose(birb, ParrotElement.FaceCursorPose::new);
scene.overlay.showText(80) scene.overlay.showText(80)
.text("Other Entities will always trigger an Ejector when stepping on it") .text("Mobs and Players will always trigger an Ejector when stepping on it")
.pointAt(util.vector.topOf(targetPos)) .pointAt(util.vector.topOf(targetPos))
.placeNearTarget(); .placeNearTarget();
scene.idle(50); scene.idle(50);
@ -215,6 +215,7 @@ public class EjectorScenes {
public static void splitY(SceneBuilder scene, SceneBuildingUtil util) { public static void splitY(SceneBuilder scene, SceneBuildingUtil util) {
scene.title("weighted_ejector_tunnel", "Splitting item stacks using Weighted Ejectors"); scene.title("weighted_ejector_tunnel", "Splitting item stacks using Weighted Ejectors");
Selection coverbelt = util.select.fromTo(3, 1, 1, 2, 1, 0);
scene.configureBasePlate(0, 0, 5); scene.configureBasePlate(0, 0, 5);
scene.world.showSection(util.select.layer(0), Direction.UP); scene.world.showSection(util.select.layer(0), Direction.UP);
scene.idle(5); scene.idle(5);
@ -224,8 +225,7 @@ public class EjectorScenes {
scene.idle(10); scene.idle(10);
scene.world.showSection(util.select.position(2, 1, 2), Direction.SOUTH); scene.world.showSection(util.select.position(2, 1, 2), Direction.SOUTH);
scene.idle(5); scene.idle(5);
scene.world.showSection(util.select.fromTo(4, 1, 2, 3, 1, 1), Direction.SOUTH); scene.world.showSection(util.select.fromTo(4, 1, 2, 3, 1, 2), Direction.SOUTH);
scene.world.showSection(util.select.fromTo(2, 1, 1, 2, 1, 0), Direction.SOUTH);
scene.idle(10); scene.idle(10);
BlockPos ejectorPos = util.grid.at(2, 1, 2); BlockPos ejectorPos = util.grid.at(2, 1, 2);
@ -238,12 +238,10 @@ public class EjectorScenes {
scene.idle(90); scene.idle(90);
BlockPos tunnel = util.grid.at(2, 2, 3); BlockPos tunnel = util.grid.at(2, 2, 3);
scene.overlay.showControls(new InputWindowElement(util.vector.topOf(tunnel), Pointing.DOWN).scroll()
.withWrench(), 70);
scene.idle(10);
scene.overlay.showControls( scene.overlay.showControls(
new InputWindowElement(util.vector.topOf(tunnel), Pointing.UP).showing(AllIcons.I_TUNNEL_PREFER_NEAREST), new InputWindowElement(util.vector.topOf(tunnel), Pointing.DOWN).showing(AllIcons.I_TUNNEL_PREFER_NEAREST),
60); 80);
scene.idle(10);
scene.overlay.showCenteredScrollInput(tunnel, Direction.UP, 100); scene.overlay.showCenteredScrollInput(tunnel, Direction.UP, 100);
scene.idle(10); scene.idle(10);
scene.overlay.showText(100) scene.overlay.showText(100)
@ -254,11 +252,10 @@ public class EjectorScenes {
.placeNearTarget(); .placeNearTarget();
scene.idle(110); scene.idle(110);
Vec3 input = util.vector.of(2.5, 1 + 12 / 16f, 2.8); Vec3 input = util.vector.blockSurface(ejectorPos, Direction.NORTH)
.subtract(0, 2 / 16f, 0);
Vec3 topOfSlot = input.add(0, 2 / 16f, 0); Vec3 topOfSlot = input.add(0, 2 / 16f, 0);
scene.overlay.showControls(new InputWindowElement(topOfSlot, Pointing.DOWN).scroll() scene.overlay.showFilterSlotInput(input, Direction.NORTH, 80);
.withWrench(), 60);
scene.overlay.showFilterSlotInput(input, 80);
scene.idle(10); scene.idle(10);
scene.overlay.showText(80) scene.overlay.showText(80)
.attachKeyFrame() .attachKeyFrame()
@ -272,6 +269,8 @@ public class EjectorScenes {
scene.overlay.showControls(new InputWindowElement(util.vector.topOf(util.grid.at(4, 1, 3)), Pointing.DOWN) scene.overlay.showControls(new InputWindowElement(util.vector.topOf(util.grid.at(4, 1, 3)), Pointing.DOWN)
.withItem(new ItemStack(Items.COPPER_INGOT)), 20); .withItem(new ItemStack(Items.COPPER_INGOT)), 20);
scene.world.showSection(coverbelt, Direction.SOUTH);
scene.idle(7); scene.idle(7);
scene.world.createItemOnBelt(util.grid.at(4, 1, 3), Direction.UP, new ItemStack(Items.COPPER_INGOT, 64)); scene.world.createItemOnBelt(util.grid.at(4, 1, 3), Direction.UP, new ItemStack(Items.COPPER_INGOT, 64));
scene.idle(40); scene.idle(40);
@ -337,7 +336,7 @@ public class EjectorScenes {
nbt -> nbt.putBoolean("Powered", false)); nbt -> nbt.putBoolean("Powered", false));
scene.idle(5); scene.idle(5);
scene.world.hideSection(redstone, Direction.WEST); scene.world.hideSection(redstone, Direction.WEST);
scene.idle(10); scene.idle(30);
ElementLink<WorldSectionElement> observer = ElementLink<WorldSectionElement> observer =
scene.world.showIndependentSection(util.select.position(4, 1, 1), Direction.SOUTH); scene.world.showIndependentSection(util.select.position(4, 1, 1), Direction.SOUTH);
scene.world.moveSection(observer, util.vector.of(0.5, 1.5, -0.5), 0); scene.world.moveSection(observer, util.vector.of(0.5, 1.5, -0.5), 0);
@ -366,7 +365,7 @@ public class EjectorScenes {
.attachKeyFrame() .attachKeyFrame()
.pointAt(util.vector.blockSurface(util.grid.at(4, 1, 1), Direction.NORTH)) .pointAt(util.vector.blockSurface(util.grid.at(4, 1, 1), Direction.NORTH))
.placeNearTarget() .placeNearTarget()
.text("Furthermore, Observers can detect when Ejectors activate"); .text("Observers can detect when Ejectors activate");
} }
} }

View file

@ -384,10 +384,11 @@ public class FunnelScenes {
scene.world.flapFunnel(andesiteFunnel, true); scene.world.flapFunnel(andesiteFunnel, true);
scene.idle(60); scene.idle(60);
Vec3 filter = util.vector.topOf(brassFunnel);
scene.overlay.showText(60) scene.overlay.showText(60)
.text("Brass Funnels can extract up to a full stack.") .text("Brass Funnels can extract up to a full stack.")
.attachKeyFrame() .attachKeyFrame()
.pointAt(util.vector.topOf(brassFunnel)) .pointAt(filter)
.placeNearTarget(); .placeNearTarget();
scene.idle(10); scene.idle(10);
scene.world.createItemOnBeltLike(brassFunnel.below() scene.world.createItemOnBeltLike(brassFunnel.below()
@ -395,15 +396,14 @@ public class FunnelScenes {
scene.world.flapFunnel(brassFunnel, true); scene.world.flapFunnel(brassFunnel, true);
scene.idle(60); scene.idle(60);
AABB filterSlot = new AABB(brassFunnel).inflate(-.35, -.35, -.35) filter = filter.add(0, -5 / 16f, -1.5 / 16f);
.move(0, 0.2, 0); scene.overlay.showFilterSlotInput(filter, Direction.NORTH, 80);
scene.overlay.chaseBoundingBoxOutline(PonderPalette.WHITE, filterSlot, filterSlot, 80); scene.overlay.showControls(new InputWindowElement(filter, Pointing.DOWN).rightClick(), 60);
scene.overlay.showControls(new InputWindowElement(util.vector.topOf(brassFunnel), Pointing.DOWN).scroll(), 60);
scene.idle(10); scene.idle(10);
scene.overlay.showText(80) scene.overlay.showText(80)
.text("Scrolling on the filter slot allows for precise control over the extracted stack size.") .text("The value panel allows for precise control over the extracted stack size.")
.attachKeyFrame() .attachKeyFrame()
.pointAt(filterSlot.getCenter()) .pointAt(filter)
.placeNearTarget(); .placeNearTarget();
scene.idle(90); scene.idle(90);
@ -439,15 +439,14 @@ public class FunnelScenes {
}); });
if (i == 2) { if (i == 2) {
scene.overlay.chaseBoundingBoxOutline(PonderPalette.WHITE, filterSlot, filterSlot, 80); scene.overlay.showFilterSlotInput(filter, Direction.NORTH, 40);
scene.overlay scene.overlay.showControls(new InputWindowElement(filter, Pointing.DOWN).rightClick()
.showControls(new InputWindowElement(util.vector.topOf(brassFunnel), Pointing.DOWN).rightClick() .withItem(emerald), 60);
.withItem(emerald), 60);
scene.idle(10); scene.idle(10);
scene.overlay.showText(80) scene.overlay.showText(80)
.text("Using items on the filter slot will restrict the funnel to only transfer matching stacks.") .text("Using items on the filter slot will restrict the funnel to only transfer matching stacks.")
.attachKeyFrame() .attachKeyFrame()
.pointAt(filterSlot.getCenter()) .pointAt(filter)
.placeNearTarget(); .placeNearTarget();
scene.world.setFilterData(util.select.position(brassFunnel), FunnelBlockEntity.class, emerald); scene.world.setFilterData(util.select.position(brassFunnel), FunnelBlockEntity.class, emerald);
} else } else

View file

@ -4,7 +4,7 @@ import com.simibubi.create.AllBlocks;
import com.simibubi.create.AllItems; import com.simibubi.create.AllItems;
import com.simibubi.create.content.contraptions.components.crank.ValveHandleBlock; import com.simibubi.create.content.contraptions.components.crank.ValveHandleBlock;
import com.simibubi.create.content.contraptions.components.crusher.CrushingWheelBlock; import com.simibubi.create.content.contraptions.components.crusher.CrushingWheelBlock;
import com.simibubi.create.content.contraptions.components.waterwheel.WaterWheelBlock; import com.simibubi.create.content.contraptions.components.waterwheel.WaterWheelBlockEntity;
import com.simibubi.create.content.contraptions.relays.advanced.sequencer.SequencedGearshiftBlock; import com.simibubi.create.content.contraptions.relays.advanced.sequencer.SequencedGearshiftBlock;
import com.simibubi.create.content.contraptions.relays.elementary.CogWheelBlock; import com.simibubi.create.content.contraptions.relays.elementary.CogWheelBlock;
import com.simibubi.create.content.contraptions.relays.elementary.ShaftBlock; import com.simibubi.create.content.contraptions.relays.elementary.ShaftBlock;
@ -12,6 +12,7 @@ import com.simibubi.create.content.contraptions.relays.encased.EncasedCogwheelBl
import com.simibubi.create.content.contraptions.relays.encased.EncasedShaftBlock; import com.simibubi.create.content.contraptions.relays.encased.EncasedShaftBlock;
import com.simibubi.create.content.contraptions.relays.gauge.GaugeBlock; import com.simibubi.create.content.contraptions.relays.gauge.GaugeBlock;
import com.simibubi.create.content.contraptions.relays.gauge.StressGaugeBlockEntity; import com.simibubi.create.content.contraptions.relays.gauge.StressGaugeBlockEntity;
import com.simibubi.create.content.logistics.block.redstone.NixieTubeBlock;
import com.simibubi.create.content.logistics.block.redstone.NixieTubeBlockEntity; import com.simibubi.create.content.logistics.block.redstone.NixieTubeBlockEntity;
import com.simibubi.create.foundation.ponder.ElementLink; import com.simibubi.create.foundation.ponder.ElementLink;
import com.simibubi.create.foundation.ponder.PonderPalette; import com.simibubi.create.foundation.ponder.PonderPalette;
@ -62,6 +63,7 @@ public class KineticsScenes {
scene.effects.indicateSuccess(gaugePos); scene.effects.indicateSuccess(gaugePos);
scene.idle(10); scene.idle(10);
scene.overlay.showText(1000) scene.overlay.showText(1000)
.placeNearTarget()
.text("Shafts will relay rotation in a straight line.") .text("Shafts will relay rotation in a straight line.")
.pointAt(util.vector.of(3, 1.5, 2.5)); .pointAt(util.vector.of(3, 1.5, 2.5));
@ -72,7 +74,7 @@ public class KineticsScenes {
public static void shaftsCanBeEncased(SceneBuilder scene, SceneBuildingUtil util) { public static void shaftsCanBeEncased(SceneBuilder scene, SceneBuildingUtil util) {
scene.title("shaft_casing", "Encasing Shafts"); scene.title("shaft_casing", "Encasing Shafts");
scene.configureBasePlate(0, 0, 5); scene.configureBasePlate(0, 0, 5);
scene.showBasePlate(); scene.world.showSection(util.select.layer(0), Direction.UP);
Selection shaft = util.select.cuboid(new BlockPos(0, 1, 2), new Vec3i(5, 0, 2)); Selection shaft = util.select.cuboid(new BlockPos(0, 1, 2), new Vec3i(5, 0, 2));
Selection andesite = util.select.position(3, 1, 2); Selection andesite = util.select.position(3, 1, 2);
@ -230,13 +232,13 @@ public class KineticsScenes {
Selection gaugesSelect = util.select.fromTo(0, 1, 2, 2, 2, 3); Selection gaugesSelect = util.select.fromTo(0, 1, 2, 2, 2, 3);
scene.world.showSection(gaugesSelect, Direction.DOWN); scene.world.showSection(gaugesSelect, Direction.DOWN);
scene.overlay.showText(60) scene.overlay.showText(80)
.text("Shifting from large to small cogs, the conveyed speed will be doubled") .text("Shifting from large to small cogs, the conveyed speed will be doubled")
.colored(PonderPalette.GREEN) .colored(PonderPalette.GREEN)
.attachKeyFrame() .attachKeyFrame()
.placeNearTarget() .placeNearTarget()
.pointAt(util.vector.blockSurface(util.grid.at(1, 2, 3), Direction.NORTH)); .pointAt(util.vector.blockSurface(util.grid.at(1, 2, 3), Direction.NORTH));
scene.idle(10); scene.idle(30);
scene.effects.rotationSpeedIndicator(upperCog); scene.effects.rotationSpeedIndicator(upperCog);
scene.idle(60); scene.idle(60);
@ -594,32 +596,25 @@ public class KineticsScenes {
.text("Creative motors are a compact and configurable source of Rotational Force") .text("Creative motors are a compact and configurable source of Rotational Force")
.placeNearTarget() .placeNearTarget()
.pointAt(util.vector.topOf(motor)); .pointAt(util.vector.topOf(motor));
scene.idle(50); scene.idle(70);
scene.rotateCameraY(90); Vec3 blockSurface = util.vector.blockSurface(motor, Direction.NORTH)
.add(1 / 16f, 0, 3 / 16f);
scene.overlay.showFilterSlotInput(blockSurface, Direction.NORTH, 80);
scene.overlay.showControls(new InputWindowElement(blockSurface, Pointing.DOWN).rightClick(), 60);
scene.idle(20); scene.idle(20);
Vec3 blockSurface = util.vector.blockSurface(motor, Direction.EAST); scene.overlay.showText(60)
AABB point = new AABB(blockSurface, blockSurface); .text("The generated speed can be configured on its input panels")
AABB expanded = point.inflate(1 / 16f, 1 / 5f, 1 / 5f);
scene.overlay.chaseBoundingBoxOutline(PonderPalette.WHITE, blockSurface, point, 1);
scene.idle(1);
scene.overlay.chaseBoundingBoxOutline(PonderPalette.WHITE, blockSurface, expanded, 60);
scene.overlay.showControls(new InputWindowElement(blockSurface, Pointing.DOWN).scroll(), 60);
scene.idle(20);
scene.overlay.showText(50)
.text("Scrolling on the back panel changes the RPM of the motors' rotational output")
.attachKeyFrame() .attachKeyFrame()
.placeNearTarget() .placeNearTarget()
.pointAt(blockSurface); .pointAt(blockSurface);
scene.idle(10); scene.idle(10);
scene.world.modifyKineticSpeed(util.select.fromTo(1, 1, 2, 3, 1, 2), f -> 4 * f);
scene.idle(50); scene.idle(50);
scene.world.modifyKineticSpeed(util.select.fromTo(1, 1, 2, 3, 1, 2), f -> 4 * f);
scene.idle(10);
scene.effects.rotationSpeedIndicator(motor); scene.effects.rotationSpeedIndicator(motor);
scene.rotateCameraY(-90);
} }
public static void waterWheel(SceneBuilder scene, SceneBuildingUtil util) { public static void waterWheel(SceneBuilder scene, SceneBuildingUtil util) {
@ -627,11 +622,10 @@ public class KineticsScenes {
scene.configureBasePlate(0, 0, 5); scene.configureBasePlate(0, 0, 5);
scene.world.showSection(util.select.layer(0), Direction.UP); scene.world.showSection(util.select.layer(0), Direction.UP);
scene.idle(5); scene.idle(5);
scene.world.showSection(util.select.fromTo(4, 1, 1, 4, 3, 3) scene.world.showSection(util.select.fromTo(3, 1, 3, 3, 2, 3), Direction.DOWN);
.add(util.select.fromTo(3, 1, 3, 3, 2, 3)), Direction.DOWN);
scene.world.setKineticSpeed(util.select.everywhere(), 0); scene.world.setKineticSpeed(util.select.everywhere(), 0);
BlockPos gaugePos = util.grid.at(0, 2, 2); BlockPos gaugePos = util.grid.at(1, 2, 2);
for (int i = 0; i < 4; i++) { for (int i = 0; i < 4; i++) {
scene.idle(5); scene.idle(5);
@ -641,121 +635,223 @@ public class KineticsScenes {
scene.idle(10); scene.idle(10);
for (int i = 0; i < 3; i++) { for (int i = 0; i < 2; i++) {
scene.idle(5); scene.idle(5);
scene.world.showSection(util.select.position(3, 3, 3 - i), Direction.DOWN); scene.world.showSection(util.select.position(3, 3, 3 - i), Direction.DOWN);
} }
scene.world.setKineticSpeed(util.select.everywhere(), -12); scene.world.setKineticSpeed(util.select.everywhere(), -8);
scene.effects.indicateSuccess(gaugePos); scene.effects.indicateSuccess(gaugePos);
BlockPos wheel = util.grid.at(3, 2, 2);
scene.effects.rotationSpeedIndicator(wheel);
scene.overlay.showText(60)
.text("Water Wheels draw force from adjacent Water Currents")
.placeNearTarget()
.pointAt(util.vector.topOf(wheel));
scene.idle(10);
AABB bb = new AABB(wheel).inflate(1 / 16f, 0, 0);
scene.overlay.chaseBoundingBoxOutline(PonderPalette.MEDIUM, new Object(), bb.move(0, 1, 0)
.contract(0, .75, 0), 80);
scene.idle(5);
scene.overlay.chaseBoundingBoxOutline(PonderPalette.MEDIUM, new Object(), bb.move(0, 0, -1)
.contract(0, 0, -.75), 75);
scene.idle(5);
scene.overlay.chaseBoundingBoxOutline(PonderPalette.MEDIUM, new Object(), bb.move(0, -1, 0)
.contract(0, -.75, 0), 70);
scene.idle(5);
scene.overlay.chaseBoundingBoxOutline(PonderPalette.MEDIUM, new Object(), bb.move(0, 0, 1)
.contract(0, 0, .75), 65);
scene.idle(75);
scene.addKeyframe();
scene.world.showSection(util.select.position(3, 3, 1), Direction.DOWN);
for (int i = 0; i < 2; i++) { for (int i = 0; i < 2; i++) {
scene.idle(5); scene.idle(5);
scene.world.showSection(util.select.position(3, 2 - i, 1), Direction.DOWN); scene.world.showSection(util.select.position(3, 2 - i, 1), Direction.DOWN);
} }
BlockPos wheel = util.grid.at(3, 2, 2); scene.idle(10);
scene.effects.rotationSpeedIndicator(wheel);
scene.overlay.showText(50) scene.overlay.showText(50)
.text("Water Wheels draw force from adjacent Water Currents") .text("Covering additional sides will not improve its kinetic output further")
.colored(PonderPalette.RED)
.placeNearTarget() .placeNearTarget()
.pointAt(util.vector.topOf(wheel)); .pointAt(util.vector.blockSurface(wheel, Direction.NORTH));
scene.idle(50);
AABB bb = new AABB(wheel).inflate(.125f, 0, 0);
scene.overlay.chaseBoundingBoxOutline(PonderPalette.MEDIUM, new Object(), bb.move(0, 1.2, 0)
.contract(0, .75, 0), 80);
scene.idle(5);
scene.overlay.chaseBoundingBoxOutline(PonderPalette.MEDIUM, new Object(), bb.move(0, 0, 1.2)
.contract(0, 0, .75), 80);
scene.idle(5);
scene.overlay.chaseBoundingBoxOutline(PonderPalette.MEDIUM, new Object(), bb.move(0, -1.2, 0)
.contract(0, -.75, 0), 80);
scene.idle(5);
scene.overlay.chaseBoundingBoxOutline(PonderPalette.MEDIUM, new Object(), bb.move(0, 0, -1.2)
.contract(0, 0, -.75), 80);
scene.idle(5);
scene.overlay.showText(50)
.text("The more faces are powered, the faster the Water Wheel will rotate")
.colored(PonderPalette.MEDIUM)
.placeNearTarget()
.pointAt(util.vector.topOf(wheel));
scene.idle(80); scene.idle(80);
scene.rotateCameraY(-30);
scene.overlay.showText(70) scene.addKeyframe();
.text("The Wheels' blades should be oriented against the flow")
.attachKeyFrame()
.placeNearTarget()
.pointAt(util.vector.topOf(wheel));
scene.idle(80);
ElementLink<WorldSectionElement> water = scene.world.makeSectionIndependent(util.select.fromTo(3, 1, 1, 3, 3, 1) ElementLink<WorldSectionElement> water = scene.world.makeSectionIndependent(util.select.fromTo(3, 1, 1, 3, 3, 1)
.add(util.select.fromTo(3, 3, 2, 3, 3, 3))); .add(util.select.fromTo(3, 3, 2, 3, 3, 3)));
ElementLink<WorldSectionElement> wheelElement = scene.world.makeSectionIndependent(util.select.position(wheel)); scene.world.moveSection(water, util.vector.of(1, 0.5, -0.5), 15);
scene.idle(5);
scene.world.setKineticSpeed(util.select.everywhere(), 0); scene.world.setKineticSpeed(util.select.everywhere(), 0);
scene.world.moveSection(water, util.vector.of(0, 2, -2), 10);
scene.world.moveSection(wheelElement, util.vector.of(0, 1, -1), 10); scene.idle(5);
scene.idle(10); ItemStack crimsonPlanks = new ItemStack(Items.CRIMSON_PLANKS);
scene.world.rotateSection(wheelElement, 0, 180, 0, 5); scene.overlay.showControls(new InputWindowElement(util.vector.topOf(wheel), Pointing.DOWN).rightClick()
scene.idle(10); .withItem(crimsonPlanks), 20);
scene.world.modifyBlock(wheel, s -> s.setValue(WaterWheelBlock.FACING, Direction.WEST), false); scene.idle(7);
scene.world.rotateSection(wheelElement, 0, -180, 0, 0); scene.world.modifyBlockEntity(wheel, WaterWheelBlockEntity.class, be -> be.applyMaterialIfValid(crimsonPlanks));
scene.idle(1); scene.overlay.showText(50)
scene.world.moveSection(water, util.vector.of(0, -2, 2), 10); .text("Use wood planks on the wheel to change its appearance")
scene.world.moveSection(wheelElement, util.vector.of(0, -1, 1), 10); .colored(PonderPalette.BLUE)
.placeNearTarget()
.pointAt(util.vector.blockSurface(wheel, Direction.WEST));
scene.idle(40);
ItemStack birchPlanks = new ItemStack(Items.BIRCH_PLANKS);
scene.overlay.showControls(new InputWindowElement(util.vector.topOf(wheel), Pointing.DOWN).rightClick()
.withItem(birchPlanks), 20);
scene.idle(7);
scene.world.modifyBlockEntity(wheel, WaterWheelBlockEntity.class, be -> be.applyMaterialIfValid(birchPlanks));
scene.idle(40);
ItemStack junglePlanks = new ItemStack(Items.JUNGLE_PLANKS);
scene.overlay.showControls(new InputWindowElement(util.vector.topOf(wheel), Pointing.DOWN).rightClick()
.withItem(junglePlanks), 20);
scene.idle(7);
scene.world.modifyBlockEntity(wheel, WaterWheelBlockEntity.class, be -> be.applyMaterialIfValid(junglePlanks));
scene.idle(20);
scene.world.moveSection(water, util.vector.of(-1, -0.5, 0.5), 15);
scene.idle(10); scene.idle(10);
scene.world.setKineticSpeed(util.select.everywhere(), -8); scene.world.setKineticSpeed(util.select.everywhere(), -8);
scene.effects.indicateSuccess(gaugePos);
}
scene.overlay.showText(70) public static void largeWaterWheel(SceneBuilder scene, SceneBuildingUtil util) {
.colored(PonderPalette.RED) scene.title("large_water_wheel", "Generating Rotational Force using Large Water Wheels");
.text("Facing the opposite way, they will not be as effective") scene.configureBasePlate(0, 0, 5);
.attachKeyFrame() scene.world.showSection(util.select.layer(0)
.substract(util.select.position(3, 0, 0)), Direction.UP);
ElementLink<WorldSectionElement> strip =
scene.world.showIndependentSection(util.select.fromTo(1, 0, 0, 1, 0, 4), Direction.UP);
scene.world.moveSection(strip, util.vector.of(2, 0, 0), 0);
scene.idle(10);
scene.world.showSection(util.select.fromTo(3, 1, 3, 3, 2, 3), Direction.DOWN);
scene.world.setKineticSpeed(util.select.everywhere(), 0);
BlockPos gaugePos = util.grid.at(1, 1, 2);
for (int i = 0; i < 4; i++) {
scene.idle(5);
if (i == 0)
scene.world.hideIndependentSection(strip, Direction.DOWN);
scene.world.showSection(util.select.position(gaugePos.east(i)), Direction.DOWN);
}
scene.idle(10);
for (int i = 0; i < 3; i++) {
scene.idle(5);
scene.world.showSection(util.select.position(3, 3, 3 - i), Direction.DOWN);
}
scene.world.setKineticSpeed(util.select.everywhere(), -4);
scene.effects.indicateSuccess(gaugePos);
BlockPos wheel = util.grid.at(3, 1, 2);
scene.effects.rotationSpeedIndicator(wheel);
scene.overlay.showText(60)
.text("Large Water Wheels draw force from adjacent Water Currents")
.placeNearTarget() .placeNearTarget()
.pointAt(util.vector.topOf(wheel)); .pointAt(util.vector.topOf(wheel));
scene.idle(10);
AABB bb = new AABB(wheel).inflate(.125, 1, 1);
scene.overlay.chaseBoundingBoxOutline(PonderPalette.MEDIUM, new Object(), bb.move(0, 3, 0)
.contract(0, 2.75, 0), 80);
scene.idle(5);
scene.overlay.chaseBoundingBoxOutline(PonderPalette.MEDIUM, new Object(), bb.move(0, 0, -3)
.contract(0, 0, -2.75), 75);
scene.idle(5);
scene.overlay.chaseBoundingBoxOutline(PonderPalette.MEDIUM, new Object(), bb.move(0, -3, 0)
.contract(0, -2.75, 0), 70);
scene.idle(5);
scene.overlay.chaseBoundingBoxOutline(PonderPalette.MEDIUM, new Object(), bb.move(0, 0, 3)
.contract(0, 0, 2.75), 65);
scene.idle(75);
scene.addKeyframe();
scene.world.showSection(util.select.position(3, 3, 0), Direction.DOWN);
for (int i = 0; i < 3; i++) {
scene.idle(5);
scene.world.showSection(util.select.position(3, 2 - i, 0), Direction.DOWN);
}
scene.idle(10);
scene.overlay.showText(50)
.text("Covering additional sides will not improve its kinetic output further")
.colored(PonderPalette.RED)
.placeNearTarget()
.pointAt(util.vector.blockSurface(wheel, Direction.NORTH));
scene.idle(80); scene.idle(80);
scene.idle(10);
scene.overlay.showText(70)
.attachKeyFrame()
.text("These rotate only at half the speed of regular water wheels...")
.colored(PonderPalette.WHITE)
.placeNearTarget()
.pointAt(util.vector.blockSurface(gaugePos, Direction.NORTH));
scene.idle(78);
scene.overlay.showText(60)
.text("...but provide a substantially higher stress capacity")
.colored(PonderPalette.WHITE)
.placeNearTarget()
.pointAt(util.vector.blockSurface(gaugePos, Direction.WEST));
scene.idle(80);
scene.addKeyframe();
ElementLink<WorldSectionElement> water = scene.world.makeSectionIndependent(util.select.fromTo(3, 0, 0, 3, 3, 0)
.add(util.select.fromTo(3, 3, 1, 3, 3, 3)));
scene.world.moveSection(water, util.vector.of(1, 0.5, -0.5), 15);
scene.idle(5);
scene.world.setKineticSpeed(util.select.everywhere(), 0); scene.world.setKineticSpeed(util.select.everywhere(), 0);
scene.world.moveSection(water, util.vector.of(0, 2, -2), 10);
scene.world.moveSection(wheelElement, util.vector.of(0, 1, -1), 10); BlockPos target = wheel.south()
.above();
scene.idle(5);
ItemStack crimsonPlanks = new ItemStack(Items.CRIMSON_PLANKS);
scene.overlay.showControls(new InputWindowElement(util.vector.topOf(target), Pointing.DOWN).rightClick()
.withItem(crimsonPlanks), 20);
scene.idle(7);
scene.world.modifyBlockEntity(wheel, WaterWheelBlockEntity.class, be -> be.applyMaterialIfValid(crimsonPlanks));
scene.overlay.showText(50)
.text("Use wood planks on the wheel to change its appearance")
.colored(PonderPalette.BLUE)
.placeNearTarget()
.pointAt(util.vector.blockSurface(target, Direction.WEST));
scene.idle(40);
ItemStack birchPlanks = new ItemStack(Items.BIRCH_PLANKS);
scene.overlay.showControls(new InputWindowElement(util.vector.topOf(target), Pointing.DOWN).rightClick()
.withItem(birchPlanks), 20);
scene.idle(7);
scene.world.modifyBlockEntity(wheel, WaterWheelBlockEntity.class, be -> be.applyMaterialIfValid(birchPlanks));
scene.idle(40);
ItemStack junglePlanks = new ItemStack(Items.JUNGLE_PLANKS);
scene.overlay.showControls(new InputWindowElement(util.vector.topOf(target), Pointing.DOWN).rightClick()
.withItem(junglePlanks), 20);
scene.idle(7);
scene.world.modifyBlockEntity(wheel, WaterWheelBlockEntity.class, be -> be.applyMaterialIfValid(junglePlanks));
scene.idle(20);
scene.world.moveSection(water, util.vector.of(-1, -0.5, 0.5), 15);
scene.idle(10); scene.idle(10);
scene.rotateCameraY(30); scene.world.setKineticSpeed(util.select.everywhere(), -4);
scene.world.rotateSection(wheelElement, 0, 180, 0, 5);
scene.idle(10);
scene.world.modifyBlock(wheel, s -> s.setValue(WaterWheelBlock.FACING, Direction.EAST), false);
scene.world.rotateSection(wheelElement, 0, -180, 0, 0);
scene.idle(1);
scene.world.moveSection(water, util.vector.of(0, -2, 2), 10);
scene.world.moveSection(wheelElement, util.vector.of(0, -1, 1), 10);
scene.idle(10);
scene.world.setKineticSpeed(util.select.everywhere(), -12);
scene.effects.indicateSuccess(gaugePos); scene.effects.indicateSuccess(gaugePos);
} }
public static void handCrank(SceneBuilder scene, SceneBuildingUtil util) { public static void handCrank(SceneBuilder scene, SceneBuildingUtil util) {
manualSource(scene, util, true); scene.title("hand_crank", "Generating Rotational Force using Hand Cranks");
}
public static void valveHandle(SceneBuilder scene, SceneBuildingUtil util) {
manualSource(scene, util, false);
scene.world.setKineticSpeed(util.select.everywhere(), 0);
scene.idle(20);
Vec3 centerOf = util.vector.centerOf(2, 2, 2);
scene.overlay.showControls(new InputWindowElement(centerOf, Pointing.DOWN).rightClick()
.withItem(new ItemStack(Items.BLUE_DYE)), 40);
scene.idle(7);
scene.world.modifyBlock(util.grid.at(2, 2, 2), s -> AllBlocks.DYED_VALVE_HANDLES.get(DyeColor.BLUE)
.getDefaultState()
.setValue(ValveHandleBlock.FACING, Direction.UP), true);
scene.idle(10);
scene.overlay.showText(70)
.text("Valve handles can be dyed for aesthetic purposes")
.placeNearTarget()
.pointAt(centerOf);
}
private static void manualSource(SceneBuilder scene, SceneBuildingUtil util, boolean handCrank) {
String name = handCrank ? "Hand Cranks" : "Valve Handles";
scene.title(handCrank ? "hand_crank" : "valve_handle", "Generating Rotational Force using " + name);
scene.configureBasePlate(0, 0, 5); scene.configureBasePlate(0, 0, 5);
scene.world.showSection(util.select.layer(0), Direction.UP); scene.world.showSection(util.select.layer(0), Direction.UP);
scene.idle(5); scene.idle(5);
@ -771,15 +867,17 @@ public class KineticsScenes {
scene.idle(20); scene.idle(20);
Vec3 centerOf = util.vector.centerOf(handlePos); Vec3 centerOf = util.vector.centerOf(handlePos);
Vec3 sideOf = centerOf.add(-0.5, 0, 0);
scene.overlay.showText(70) scene.overlay.showText(70)
.text(name + " can be used by players to apply rotational force manually") .text("Hand Cranks can be used by players to apply rotational force manually")
.placeNearTarget() .placeNearTarget()
.pointAt(centerOf); .pointAt(sideOf);
scene.idle(80); scene.idle(80);
scene.overlay.showControls(new InputWindowElement(centerOf, Pointing.DOWN).rightClick(), 40); scene.overlay.showControls(new InputWindowElement(centerOf, Pointing.DOWN).rightClick(), 40);
scene.idle(7); scene.idle(7);
scene.world.setKineticSpeed(util.select.everywhere(), handCrank ? 32 : 16); scene.world.setKineticSpeed(util.select.everywhere(), 32);
scene.world.modifyKineticSpeed(util.select.column(1, 3), f -> f * -2); scene.world.modifyKineticSpeed(util.select.column(1, 3), f -> f * -2);
scene.effects.rotationDirectionIndicator(handlePos); scene.effects.rotationDirectionIndicator(handlePos);
scene.effects.indicateSuccess(gaugePos); scene.effects.indicateSuccess(gaugePos);
@ -788,22 +886,16 @@ public class KineticsScenes {
.text("Hold Right-Click to rotate it Counter-Clockwise") .text("Hold Right-Click to rotate it Counter-Clockwise")
.attachKeyFrame() .attachKeyFrame()
.placeNearTarget() .placeNearTarget()
.pointAt(centerOf); .pointAt(sideOf);
scene.idle(70);
scene.overlay.showText(50)
.colored(handCrank ? PonderPalette.MEDIUM : PonderPalette.SLOW)
.text("Its conveyed speed is " + (handCrank ? "relatively high" : "slow and precise"))
.placeNearTarget()
.pointAt(centerOf);
scene.idle(70);
scene.idle(35);
scene.world.setKineticSpeed(util.select.everywhere(), 0); scene.world.setKineticSpeed(util.select.everywhere(), 0);
scene.idle(10); scene.idle(15);
scene.overlay.showControls(new InputWindowElement(centerOf, Pointing.DOWN).rightClick() scene.overlay.showControls(new InputWindowElement(centerOf, Pointing.DOWN).rightClick()
.whileSneaking(), 40); .whileSneaking(), 40);
scene.idle(7); scene.idle(7);
scene.world.setKineticSpeed(util.select.everywhere(), handCrank ? -32 : -16); scene.world.setKineticSpeed(util.select.everywhere(), -32);
scene.world.modifyKineticSpeed(util.select.column(1, 3), f -> f * -2); scene.world.modifyKineticSpeed(util.select.column(1, 3), f -> f * -2);
scene.effects.rotationDirectionIndicator(handlePos); scene.effects.rotationDirectionIndicator(handlePos);
scene.effects.indicateSuccess(gaugePos); scene.effects.indicateSuccess(gaugePos);
@ -812,8 +904,133 @@ public class KineticsScenes {
.text("Sneak and Hold Right-Click to rotate it Clockwise") .text("Sneak and Hold Right-Click to rotate it Clockwise")
.attachKeyFrame() .attachKeyFrame()
.placeNearTarget() .placeNearTarget()
.pointAt(centerOf); .pointAt(sideOf);
scene.idle(35);
scene.world.setKineticSpeed(util.select.everywhere(), 0);
scene.idle(45);
}
public static void valveHandle(SceneBuilder scene, SceneBuildingUtil util) {
scene.title("valve_handle", "Precise rotation using Valve Handles");
scene.configureBasePlate(0, 0, 5);
scene.world.showSection(util.select.layer(0), Direction.UP);
scene.idle(5);
Selection armS = util.select.fromTo(3, 2, 3, 1, 2, 3);
BlockPos bearing = util.grid.at(2, 2, 2);
BlockPos valvePos = util.grid.at(2, 2, 1);
Vec3 centerOf = util.vector.centerOf(valvePos);
Vec3 sideOf = centerOf.add(-0.5, 0, 0);
Vec3 topOf = centerOf.add(0, 0.5, 0);
scene.world.showSection(util.select.fromTo(bearing, bearing.below()), Direction.DOWN);
scene.idle(3);
ElementLink<WorldSectionElement> contraption = scene.world.showIndependentSection(armS, Direction.NORTH);
scene.idle(3);
ElementLink<WorldSectionElement> valve =
scene.world.showIndependentSection(util.select.position(valvePos), Direction.SOUTH);
scene.world.rotateSection(valve, 0, 0, 45, 0);
scene.idle(20);
scene.overlay.showText(70)
.text("Valve handles can be used to rotate components by a precise angle")
.placeNearTarget()
.pointAt(sideOf);
scene.idle(20);
scene.world.rotateSection(valve, 0, 0, 45, 15);
scene.world.rotateSection(contraption, 0, 0, 45, 15);
scene.world.rotateBearing(bearing, 45, 15);
scene.world.setKineticSpeed(util.select.everywhere(), 16);
scene.idle(15);
scene.world.setKineticSpeed(util.select.everywhere(), 0);
scene.idle(60);
Vec3 blockSurface = util.vector.centerOf(valvePos)
.add(0, 0, 4 / 16f);
AABB point = new AABB(blockSurface, blockSurface);
AABB expanded = point.inflate(1 / 8f, 1 / 8f, 1 / 16f);
scene.overlay.chaseBoundingBoxOutline(PonderPalette.WHITE, blockSurface, point, 1);
scene.idle(1);
scene.overlay.chaseBoundingBoxOutline(PonderPalette.WHITE, blockSurface, expanded, 80);
scene.overlay.showControls(new InputWindowElement(blockSurface, Pointing.DOWN).rightClick(), 60);
scene.idle(10);
scene.overlay.showText(60)
.text("The angle can be configured on the input panel")
.attachKeyFrame()
.placeNearTarget()
.pointAt(blockSurface);
scene.idle(70);
scene.overlay.showControls(new InputWindowElement(topOf, Pointing.DOWN).rightClick(), 40);
scene.idle(7);
scene.world.rotateSection(valve, 0, 0, 90, 30);
scene.world.rotateSection(contraption, 0, 0, 90, 30);
scene.world.rotateBearing(bearing, 90, 30);
scene.world.setKineticSpeed(util.select.everywhere(), 16);
scene.idle(10);
scene.overlay.showText(40)
.text("Right-Click to activate one rotation")
.attachKeyFrame()
.placeNearTarget()
.pointAt(sideOf);
scene.idle(20);
scene.world.setKineticSpeed(util.select.everywhere(), 0);
scene.idle(25);
scene.overlay.showControls(new InputWindowElement(topOf, Pointing.DOWN).rightClick()
.whileSneaking(), 40);
scene.idle(7);
scene.world.rotateSection(valve, 0, 0, -90, 30);
scene.world.rotateSection(contraption, 0, 0, -90, 30);
scene.world.rotateBearing(bearing, -90, 30);
scene.world.setKineticSpeed(util.select.everywhere(), -16);
scene.idle(10);
scene.overlay.showText(50)
.text("Sneak-Right-Click to activate it in the opposite direction")
.placeNearTarget()
.pointAt(sideOf);
scene.idle(15);
scene.world.setKineticSpeed(util.select.everywhere(), 0);
scene.idle(40);
blockSurface = util.vector.topOf(bearing)
.add(0, 0, -1 / 8f);
point = new AABB(blockSurface, blockSurface);
expanded = point.inflate(1 / 8f, 0, 1 / 8f);
scene.overlay.chaseBoundingBoxOutline(PonderPalette.WHITE, blockSurface, point, 1);
scene.idle(1);
scene.overlay.chaseBoundingBoxOutline(PonderPalette.WHITE, blockSurface, expanded, 80);
scene.idle(10);
scene.overlay.showText(70)
.text("Mind that Bearings have to be specifically told not to disassemble")
.placeNearTarget()
.pointAt(blockSurface);
scene.idle(90); scene.idle(90);
scene.addKeyframe();
scene.overlay.showControls(new InputWindowElement(topOf, Pointing.DOWN).rightClick()
.withItem(new ItemStack(Items.BLUE_DYE)), 40);
scene.idle(7);
scene.world.modifyBlock(valvePos, s -> AllBlocks.DYED_VALVE_HANDLES.get(DyeColor.BLUE)
.getDefaultState()
.setValue(ValveHandleBlock.FACING, Direction.NORTH), true);
scene.idle(10);
scene.overlay.showText(70)
.text("Valve handles can be dyed for aesthetic purposes")
.placeNearTarget()
.colored(PonderPalette.BLUE)
.pointAt(sideOf);
scene.idle(60);
} }
public static void sequencedGearshift(SceneBuilder scene, SceneBuildingUtil util) { public static void sequencedGearshift(SceneBuilder scene, SceneBuildingUtil util) {
@ -930,6 +1147,9 @@ public class KineticsScenes {
BlockPos wire = util.grid.at(5, 1, 0); BlockPos wire = util.grid.at(5, 1, 0);
Selection nixie = util.select.position(4, 1, 0); Selection nixie = util.select.position(4, 1, 0);
scene.world.cycleBlockProperty(util.grid.at(4, 1, 0), NixieTubeBlock.FACING);
scene.world.cycleBlockProperty(util.grid.at(4, 1, 0), NixieTubeBlock.FACING);
ElementLink<WorldSectionElement> comparator = ElementLink<WorldSectionElement> comparator =
scene.world.showIndependentSection(util.select.fromTo(5, 1, 1, 4, 1, 0), Direction.SOUTH); scene.world.showIndependentSection(util.select.fromTo(5, 1, 1, 4, 1, 0), Direction.SOUTH);
scene.world.moveSection(comparator, util.vector.of(-2, 0, 0), 0); scene.world.moveSection(comparator, util.vector.of(-2, 0, 0), 0);
@ -1010,17 +1230,17 @@ public class KineticsScenes {
.text("Rot. Speed Controllers relay rotation from their axis to a Large Cogwheel above them"); .text("Rot. Speed Controllers relay rotation from their axis to a Large Cogwheel above them");
scene.idle(100); scene.idle(100);
Vec3 inputVec = util.vector.of(1.5, 1.75, 1); Vec3 inputVec = util.vector.of(1.5, 1.75 - 1 / 16f, 1);
scene.overlay.showFilterSlotInput(inputVec, 60); scene.overlay.showFilterSlotInput(inputVec, Direction.NORTH, 60);
scene.overlay.showText(70) scene.overlay.showText(70)
.placeNearTarget() .placeNearTarget()
.attachKeyFrame() .attachKeyFrame()
.pointAt(inputVec) .pointAt(inputVec)
.text("Using the scroll input on its side, the conveyed speed can be configured"); .text("Using the value panel on its side, the conveyed speed can be configured");
scene.idle(80); scene.idle(80);
InputWindowElement input = new InputWindowElement(inputVec, Pointing.UP).scroll(); InputWindowElement input = new InputWindowElement(inputVec, Pointing.UP).rightClick();
scene.overlay.showControls(input, 40); scene.overlay.showControls(input, 40);
scene.idle(15); scene.idle(15);
scene.world.multiplyKineticSpeed(util.select.fromTo(1, 2, 1, 1, 2, 3), 4); scene.world.multiplyKineticSpeed(util.select.fromTo(1, 2, 1, 1, 2, 3), 4);
@ -1073,7 +1293,7 @@ public class KineticsScenes {
scene.overlay.showText(80) scene.overlay.showText(80)
.text("The " + component + " displays the current " + (speed ? "Speed" : "Stress Capacity") .text("The " + component + " displays the current " + (speed ? "Speed" : "Stress Capacity")
+ " of the attached " + (speed ? "components" : "kinetic network")) + (speed ? " of attached components" : " of the attached kinetic network"))
.attachKeyFrame() .attachKeyFrame()
.pointAt(util.vector.topOf(gaugePos)) .pointAt(util.vector.topOf(gaugePos))
.placeNearTarget(); .placeNearTarget();
@ -1106,7 +1326,7 @@ public class KineticsScenes {
Vec3 blockSurface = util.vector.blockSurface(gaugePos, Direction.NORTH); Vec3 blockSurface = util.vector.blockSurface(gaugePos, Direction.NORTH);
scene.overlay.showControls( scene.overlay.showControls(
new InputWindowElement(blockSurface, Pointing.RIGHT).withItem(AllItems.GOGGLES.asStack()), 40); new InputWindowElement(blockSurface, Pointing.RIGHT).withItem(AllItems.GOGGLES.asStack()), 80);
scene.idle(7); scene.idle(7);
scene.overlay.showText(80) scene.overlay.showText(80)
.text("When wearing Engineers' Goggles, the player can get more detailed information from the Gauge") .text("When wearing Engineers' Goggles, the player can get more detailed information from the Gauge")

View file

@ -109,6 +109,8 @@ public class MechanicalSawScenes {
scene.idle(3); scene.idle(3);
scene.addKeyframe(); scene.addKeyframe();
scene.world.multiplyKineticSpeed(util.select.everywhere(), .5f);
ElementLink<WorldSectionElement> beltSection = scene.world.showIndependentSection(belt, Direction.EAST); ElementLink<WorldSectionElement> beltSection = scene.world.showIndependentSection(belt, Direction.EAST);
scene.world.moveSection(beltSection, util.vector.of(0, 100, 0), 0); scene.world.moveSection(beltSection, util.vector.of(0, 100, 0), 0);
scene.idle(1); scene.idle(1);
@ -132,24 +134,16 @@ public class MechanicalSawScenes {
ItemStack stone = new ItemStack(Blocks.STONE); ItemStack stone = new ItemStack(Blocks.STONE);
BlockPos firstBelt = util.grid.at(0, 1, 2); BlockPos firstBelt = util.grid.at(0, 1, 2);
scene.world.createItemOnBelt(firstBelt, Direction.WEST, stone);
scene.overlay.showText(60) scene.overlay.showText(60)
.text("Saws can work in-line with Mechanical Belts") .text("Saws can work in-line with Mechanical Belts")
.pointAt(util.vector.blockSurface(firstBelt, Direction.WEST)) .pointAt(util.vector.blockSurface(firstBelt, Direction.WEST))
.placeNearTarget(); .placeNearTarget();
scene.idle(60); scene.idle(40);
scene.rotateCameraY(-90); scene.world.createItemOnBelt(firstBelt, Direction.WEST, stone);
scene.idle(20);
Vec3 filter = util.vector.of(2.5, 1 + 13 / 16f, 2.75);
scene.overlay.showFilterSlotInput(filter, 80);
ItemStack bricks = new ItemStack(Blocks.STONE_BRICKS);
scene.overlay.showControls(new InputWindowElement(filter, Pointing.DOWN).withItem(bricks), 80);
scene.world.modifyEntities(ItemEntity.class, Entity::discard);
scene.idle(7);
scene.world.setFilterData(util.select.position(sawPos), SawBlockEntity.class, bricks);
scene.idle(10);
scene.idle(40);
Vec3 filter = util.vector.of(2.5, 1 + 13 / 16f, 2 + 5 / 16f);
scene.overlay.showFilterSlotInput(filter, Direction.UP, 80);
scene.overlay.showText(80) scene.overlay.showText(80)
.attachKeyFrame() .attachKeyFrame()
.text("When an ingredient has multiple possible outcomes, the filter slot can specify it") .text("When an ingredient has multiple possible outcomes, the filter slot can specify it")
@ -157,9 +151,14 @@ public class MechanicalSawScenes {
.placeNearTarget(); .placeNearTarget();
scene.idle(90); scene.idle(90);
scene.rotateCameraY(90); ItemStack bricks = new ItemStack(Blocks.STONE_BRICKS);
scene.overlay.showControls(new InputWindowElement(filter, Pointing.DOWN).withItem(bricks), 30);
scene.world.modifyEntities(ItemEntity.class, Entity::discard);
scene.idle(7);
scene.world.setFilterData(util.select.position(sawPos), SawBlockEntity.class, bricks);
scene.idle(10);
scene.world.createItemOnBelt(firstBelt, Direction.WEST, stone); scene.world.createItemOnBelt(firstBelt, Direction.WEST, stone);
scene.idle(20); scene.idle(50);
scene.markAsFinished(); scene.markAsFinished();
scene.overlay.showText(100) scene.overlay.showText(100)
@ -251,7 +250,8 @@ public class MechanicalSawScenes {
} }
for (int i = 0; i < 30; i++) { for (int i = 0; i < 30; i++) {
scene.world.replaceBlocks(util.select.fromTo(2, i + 1, 2, 1, i + 1, 3), Blocks.AIR.defaultBlockState(), true); scene.world.replaceBlocks(util.select.fromTo(2, i + 1, 2, 1, i + 1, 3), Blocks.AIR.defaultBlockState(),
true);
for (int x = 1; x <= 2; x++) { for (int x = 1; x <= 2; x++) {
for (int z = 2; z <= 3; z++) { for (int z = 2; z <= 3; z++) {
Vec3 dropPos = util.vector.centerOf(x, i + 1, z); Vec3 dropPos = util.vector.centerOf(x, i + 1, z);

View file

@ -51,7 +51,7 @@ public class MovementActorScenes {
.colored(PonderPalette.RED) .colored(PonderPalette.RED)
.placeNearTarget() .placeNearTarget()
.attachKeyFrame() .attachKeyFrame()
.text("Inventories on moving contraptions cannot be accessed by players."); .text("Moving inventories can be tricky to access with automation.");
scene.idle(70); scene.idle(70);
BlockPos psi = util.grid.at(4, 2, 2); BlockPos psi = util.grid.at(4, 2, 2);
@ -84,17 +84,17 @@ public class MovementActorScenes {
.placeNearTarget() .placeNearTarget()
.pointAt(util.vector.of(3, 3, 2.5)) .pointAt(util.vector.of(3, 3, 2.5))
.text("Whenever they pass by each other, they will engage in a connection"); .text("Whenever they pass by each other, they will engage in a connection");
scene.idle(35); scene.idle(38);
Selection both = util.select.fromTo(2, 2, 2, 4, 2, 2); Selection both = util.select.fromTo(2, 2, 2, 4, 2, 2);
Class<PortableItemInterfaceBlockEntity> psiClass = PortableItemInterfaceBlockEntity.class; Class<PortableItemInterfaceBlockEntity> psiClass = PortableItemInterfaceBlockEntity.class;
scene.world.modifyBlockEntityNBT(both, psiClass, nbt -> { scene.world.modifyBlockEntityNBT(both, psiClass, nbt -> {
nbt.putFloat("Distance", 1); nbt.putFloat("Distance", 1);
nbt.putFloat("Timer", 40); nbt.putFloat("Timer", 12);
}); });
scene.idle(20); scene.idle(17);
scene.overlay.showOutline(PonderPalette.GREEN, psi, util.select.fromTo(5, 3, 2, 6, 3, 2), 80); scene.overlay.showOutline(PonderPalette.GREEN, psi, util.select.fromTo(5, 3, 2, 6, 3, 2), 80);
scene.idle(10); scene.idle(10);
@ -154,7 +154,7 @@ public class MovementActorScenes {
.placeNearTarget() .placeNearTarget()
.pointAt(util.vector.topOf(psi2)) .pointAt(util.vector.topOf(psi2))
.text("After no items have been exchanged for a while, the contraption will continue on its way"); .text("After no items have been exchanged for a while, the contraption will continue on its way");
scene.world.modifyBlockEntityNBT(both, psiClass, nbt -> nbt.putFloat("Timer", 9)); scene.world.modifyBlockEntityNBT(both, psiClass, nbt -> nbt.putFloat("Timer", 2));
scene.idle(15); scene.idle(15);
scene.markAsFinished(); scene.markAsFinished();
@ -171,7 +171,7 @@ public class MovementActorScenes {
Selection psis = util.select.fromTo(1, 1, 3, 1, 3, 3); Selection psis = util.select.fromTo(1, 1, 3, 1, 3, 3);
scene.world.modifyBlockEntityNBT(psis, psiClass, nbt -> { scene.world.modifyBlockEntityNBT(psis, psiClass, nbt -> {
nbt.putFloat("Distance", 1); nbt.putFloat("Distance", 1);
nbt.putFloat("Timer", 40); nbt.putFloat("Timer", 12);
}); });
scene.world.showSection(util.select.layer(0), Direction.UP); scene.world.showSection(util.select.layer(0), Direction.UP);
@ -184,8 +184,7 @@ public class MovementActorScenes {
BlockPos bearing = util.grid.at(3, 1, 3); BlockPos bearing = util.grid.at(3, 1, 3);
scene.world.configureCenterOfRotation(contraption, util.vector.topOf(bearing)); scene.world.configureCenterOfRotation(contraption, util.vector.topOf(bearing));
scene.idle(20); scene.idle(20);
scene.world.modifyBlockEntityNBT(psis, psiClass, nbt -> nbt.putFloat("Timer", 9)); scene.world.modifyBlockEntityNBT(psis, psiClass, nbt -> nbt.putFloat("Timer", 2));
scene.idle(20);
scene.world.rotateBearing(bearing, 360 * 3 + 270, 240 + 60); scene.world.rotateBearing(bearing, 360 * 3 + 270, 240 + 60);
scene.world.rotateSection(contraption, 0, 360 * 3 + 270, 0, 240 + 60); scene.world.rotateSection(contraption, 0, 360 * 3 + 270, 0, 240 + 60);
scene.idle(20); scene.idle(20);

View file

@ -21,6 +21,7 @@ import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.DoublePlantBlock; import net.minecraft.world.level.block.DoublePlantBlock;
import net.minecraft.world.level.block.state.properties.DoubleBlockHalf; import net.minecraft.world.level.block.state.properties.DoubleBlockHalf;
import net.minecraft.world.level.block.state.properties.PistonType; import net.minecraft.world.level.block.state.properties.PistonType;
import net.minecraft.world.phys.Vec3;
public class PistonScenes { public class PistonScenes {
@ -270,14 +271,15 @@ public class PistonScenes {
scene.world.setBlock(util.grid.at(0, 2, 2), Blocks.ROSE_BUSH.defaultBlockState() scene.world.setBlock(util.grid.at(0, 2, 2), Blocks.ROSE_BUSH.defaultBlockState()
.setValue(DoublePlantBlock.HALF, DoubleBlockHalf.UPPER), false); .setValue(DoublePlantBlock.HALF, DoubleBlockHalf.UPPER), false);
scene.world.showIndependentSection(rose, Direction.DOWN); scene.world.showIndependentSection(rose, Direction.DOWN);
scene.overlay.showCenteredScrollInput(piston, Direction.UP, 60); Vec3 filter = util.vector.topOf(piston)
scene.overlay.showControls(new InputWindowElement(util.vector.topOf(piston), Pointing.DOWN).scroll() .add(.125, 0, 0);
.withWrench(), 60); scene.overlay.showFilterSlotInput(filter, Direction.UP, 60);
scene.overlay.showControls(new InputWindowElement(filter.add(0, .125, 0), Pointing.DOWN).rightClick(), 60);
scene.overlay.showText(70) scene.overlay.showText(70)
.pointAt(util.vector.topOf(piston)) .pointAt(filter.add(-.125, 0, 0))
.placeNearTarget() .placeNearTarget()
.attachKeyFrame() .attachKeyFrame()
.sharedText("behaviour_modify_wrench"); .sharedText("behaviour_modify_value_panel");
scene.idle(80); scene.idle(80);
scene.effects.indicateRedstone(leverPos); scene.effects.indicateRedstone(leverPos);

View file

@ -77,6 +77,9 @@ public class PonderIndex {
.addStoryBoard("creative_motor_mojang", KineticsScenes::creativeMotorMojang); .addStoryBoard("creative_motor_mojang", KineticsScenes::creativeMotorMojang);
HELPER.addStoryBoard(AllBlocks.WATER_WHEEL, "water_wheel", KineticsScenes::waterWheel, HELPER.addStoryBoard(AllBlocks.WATER_WHEEL, "water_wheel", KineticsScenes::waterWheel,
PonderTag.KINETIC_SOURCES); PonderTag.KINETIC_SOURCES);
HELPER.addStoryBoard(AllBlocks.LARGE_WATER_WHEEL, "large_water_wheel", KineticsScenes::largeWaterWheel,
PonderTag.KINETIC_SOURCES);
HELPER.addStoryBoard(AllBlocks.HAND_CRANK, "hand_crank", KineticsScenes::handCrank, PonderTag.KINETIC_SOURCES); HELPER.addStoryBoard(AllBlocks.HAND_CRANK, "hand_crank", KineticsScenes::handCrank, PonderTag.KINETIC_SOURCES);
HELPER.addStoryBoard(AllBlocks.COPPER_VALVE_HANDLE, "valve_handle", KineticsScenes::valveHandle, HELPER.addStoryBoard(AllBlocks.COPPER_VALVE_HANDLE, "valve_handle", KineticsScenes::valveHandle,
@ -368,6 +371,7 @@ public class PonderIndex {
.add(AllBlocks.HAND_CRANK) .add(AllBlocks.HAND_CRANK)
.add(AllBlocks.COPPER_VALVE_HANDLE) .add(AllBlocks.COPPER_VALVE_HANDLE)
.add(AllBlocks.WATER_WHEEL) .add(AllBlocks.WATER_WHEEL)
.add(AllBlocks.LARGE_WATER_WHEEL)
.add(AllBlocks.WINDMILL_BEARING) .add(AllBlocks.WINDMILL_BEARING)
.add(AllBlocks.STEAM_ENGINE) .add(AllBlocks.STEAM_ENGINE)
.add(AllBlocks.CREATIVE_MOTOR); .add(AllBlocks.CREATIVE_MOTOR);

View file

@ -450,7 +450,7 @@ public class ProcessingScenes {
scene.idle(60); scene.idle(60);
Vec3 filterPos = util.vector.of(1, 2.75f, 2.5f); Vec3 filterPos = util.vector.of(1, 2.75f, 2.5f);
scene.overlay.showFilterSlotInput(filterPos, 100); scene.overlay.showFilterSlotInput(filterPos, Direction.WEST, 100);
scene.overlay.showText(100) scene.overlay.showText(100)
.pointAt(filterPos) .pointAt(filterPos)
.placeNearTarget() .placeNearTarget()
@ -551,7 +551,7 @@ public class ProcessingScenes {
scene.idle(60); scene.idle(60);
Vec3 filterPos = util.vector.of(1, 2.75f, 2.5f); Vec3 filterPos = util.vector.of(1, 2.75f, 2.5f);
scene.overlay.showFilterSlotInput(filterPos, 100); scene.overlay.showFilterSlotInput(filterPos, Direction.WEST, 100);
scene.overlay.showText(100) scene.overlay.showText(100)
.pointAt(filterPos) .pointAt(filterPos)
.placeNearTarget() .placeNearTarget()
@ -679,11 +679,6 @@ public class ProcessingScenes {
scene.overlay.showControls(new InputWindowElement(util.vector.topOf(burner), Pointing.DOWN).rightClick() scene.overlay.showControls(new InputWindowElement(util.vector.topOf(burner), Pointing.DOWN).rightClick()
.withItem(new ItemStack(Items.OAK_PLANKS)), 15); .withItem(new ItemStack(Items.OAK_PLANKS)), 15);
scene.idle(7); scene.idle(7);
scene.world.modifyBlock(burner, s -> s.setValue(BlazeBurnerBlock.HEAT_LEVEL, HeatLevel.FADING), false);
scene.idle(15);
scene.overlay.showControls(new InputWindowElement(util.vector.topOf(burner), Pointing.DOWN).rightClick()
.withItem(new ItemStack(Items.OAK_PLANKS)), 15);
scene.idle(7);
scene.world.modifyBlock(burner, s -> s.setValue(BlazeBurnerBlock.HEAT_LEVEL, HeatLevel.KINDLED), false); scene.world.modifyBlock(burner, s -> s.setValue(BlazeBurnerBlock.HEAT_LEVEL, HeatLevel.KINDLED), false);
scene.idle(20); scene.idle(20);
@ -905,8 +900,8 @@ public class ProcessingScenes {
.placeNearTarget(); .placeNearTarget();
scene.idle(80); scene.idle(80);
Vec3 filter = util.vector.of(2.5, 2.85, 2.5); Vec3 filter = util.vector.of(2.5, 2.825, 2.5);
scene.overlay.showFilterSlotInput(filter, 80); scene.overlay.showFilterSlotInput(filter, Direction.EAST, 80);
scene.overlay.showText(70) scene.overlay.showText(70)
.text("A Filter might be necessary to avoid pulling out un-processed items") .text("A Filter might be necessary to avoid pulling out un-processed items")
.pointAt(filter) .pointAt(filter)

View file

@ -164,13 +164,13 @@ public class PulleyScenes {
scene.world.setBlock(flowerPos, Blocks.BLUE_ORCHID.defaultBlockState(), false); scene.world.setBlock(flowerPos, Blocks.BLUE_ORCHID.defaultBlockState(), false);
scene.world.showSection(util.select.position(flowerPos), Direction.DOWN); scene.world.showSection(util.select.position(flowerPos), Direction.DOWN);
scene.overlay.showCenteredScrollInput(pulleyPos, Direction.UP, 60); scene.overlay.showCenteredScrollInput(pulleyPos, Direction.UP, 60);
scene.overlay.showControls(new InputWindowElement(util.vector.topOf(pulleyPos), Pointing.DOWN).scroll() scene.overlay.showControls(new InputWindowElement(util.vector.topOf(pulleyPos), Pointing.DOWN).rightClick(),
.withWrench(), 60); 60);
scene.overlay.showText(70) scene.overlay.showText(70)
.pointAt(util.vector.topOf(pulleyPos)) .pointAt(util.vector.topOf(pulleyPos))
.placeNearTarget() .placeNearTarget()
.attachKeyFrame() .attachKeyFrame()
.sharedText("behaviour_modify_wrench"); .sharedText("behaviour_modify_value_panel");
scene.idle(80); scene.idle(80);
scene.world.toggleRedstonePower(redstoneStuff); scene.world.toggleRedstonePower(redstoneStuff);

View file

@ -3,6 +3,8 @@ package com.simibubi.create.foundation.ponder.content;
import com.simibubi.create.AllBlocks; import com.simibubi.create.AllBlocks;
import com.simibubi.create.content.contraptions.components.structureMovement.chassis.StickerBlock; import com.simibubi.create.content.contraptions.components.structureMovement.chassis.StickerBlock;
import com.simibubi.create.content.contraptions.components.structureMovement.chassis.StickerBlockEntity; import com.simibubi.create.content.contraptions.components.structureMovement.chassis.StickerBlockEntity;
import com.simibubi.create.content.curiosities.clipboard.ClipboardOverrides;
import com.simibubi.create.content.curiosities.clipboard.ClipboardOverrides.ClipboardType;
import com.simibubi.create.content.logistics.block.diodes.BrassDiodeBlock; import com.simibubi.create.content.logistics.block.diodes.BrassDiodeBlock;
import com.simibubi.create.content.logistics.block.diodes.PoweredLatchBlock; import com.simibubi.create.content.logistics.block.diodes.PoweredLatchBlock;
import com.simibubi.create.content.logistics.block.diodes.PulseExtenderBlockEntity; import com.simibubi.create.content.logistics.block.diodes.PulseExtenderBlockEntity;
@ -244,10 +246,10 @@ public class RedstoneScenes {
scene.idle(50); scene.idle(50);
scene.overlay.showRepeaterScrollInput(circuitPos, 60); scene.overlay.showRepeaterScrollInput(circuitPos, 60);
scene.overlay.showControls(new InputWindowElement(circuitTop, Pointing.DOWN).scroll(), 60); scene.overlay.showControls(new InputWindowElement(circuitTop, Pointing.DOWN).rightClick(), 60);
scene.idle(10); scene.idle(10);
scene.overlay.showText(60) scene.overlay.showText(60)
.text("Using the mouse wheel, the discharge time can be configured") .text("Using the value panel, the discharge time can be configured")
.attachKeyFrame() .attachKeyFrame()
.placeNearTarget() .placeNearTarget()
.pointAt(circuitTop); .pointAt(circuitTop);
@ -264,7 +266,7 @@ public class RedstoneScenes {
scene.world.toggleRedstonePower(util.select.fromTo(4, 1, 2, 2, 1, 2)); scene.world.toggleRedstonePower(util.select.fromTo(4, 1, 2, 2, 1, 2));
scene.idle(15); scene.idle(15);
scene.overlay.showText(50) scene.overlay.showText(50)
.text("The configured duration can range up to 30 minutes") .text("The configured duration can range up to an hour")
.placeNearTarget() .placeNearTarget()
.pointAt(circuitTop); .pointAt(circuitTop);
scene.idle(70); scene.idle(70);
@ -308,7 +310,7 @@ public class RedstoneScenes {
scene.idle(15); scene.idle(15);
scene.overlay.showText(60) scene.overlay.showText(60)
.text("Pulse Repeaters emit a short pulse at a delay") .text("Pulse Repeaters emit a short pulse after a delay")
.attachKeyFrame() .attachKeyFrame()
.placeNearTarget() .placeNearTarget()
.pointAt(circuitTop); .pointAt(circuitTop);
@ -317,10 +319,10 @@ public class RedstoneScenes {
scene.idle(70); scene.idle(70);
scene.overlay.showRepeaterScrollInput(circuitPos, 60); scene.overlay.showRepeaterScrollInput(circuitPos, 60);
scene.overlay.showControls(new InputWindowElement(circuitTop, Pointing.DOWN).scroll(), 60); scene.overlay.showControls(new InputWindowElement(circuitTop, Pointing.DOWN).rightClick(), 60);
scene.idle(10); scene.idle(10);
scene.overlay.showText(60) scene.overlay.showText(60)
.text("Using the mouse wheel, the charge time can be configured") .text("Using the value panel, the charge time can be configured")
.attachKeyFrame() .attachKeyFrame()
.placeNearTarget() .placeNearTarget()
.pointAt(circuitTop); .pointAt(circuitTop);
@ -332,7 +334,7 @@ public class RedstoneScenes {
scene.world.toggleRedstonePower(util.select.fromTo(4, 1, 2, 2, 1, 2)); scene.world.toggleRedstonePower(util.select.fromTo(4, 1, 2, 2, 1, 2));
scene.idle(60); scene.idle(60);
scene.overlay.showText(50) scene.overlay.showText(50)
.text("Configured delays can range up to 30 minutes") .text("Configured delays can range up to an hour")
.placeNearTarget() .placeNearTarget()
.pointAt(circuitTop); .pointAt(circuitTop);
scene.idle(60); scene.idle(60);
@ -536,7 +538,8 @@ public class RedstoneScenes {
for (int i = 0; i < 7; i++) { for (int i = 0; i < 7; i++) {
scene.idle(2); scene.idle(2);
final int state = i + 1; final int state = i + 1;
scene.world.modifyBlockEntityNBT(leverSelection, AnalogLeverBlockEntity.class, nbt -> nbt.putInt("State", state)); scene.world.modifyBlockEntityNBT(leverSelection, AnalogLeverBlockEntity.class,
nbt -> nbt.putInt("State", state));
scene.world.modifyBlock(wireLocations[i], s -> s.setValue(power, 7 - state), false); scene.world.modifyBlock(wireLocations[i], s -> s.setValue(power, 7 - state), false);
scene.effects.indicateRedstone(wireLocations[i]); scene.effects.indicateRedstone(wireLocations[i]);
} }
@ -613,7 +616,7 @@ public class RedstoneScenes {
scene.overlay.showText(60) scene.overlay.showText(60)
.attachKeyFrame() .attachKeyFrame()
.text("When powered by Redstone, Nixie Tubes will display the redstone signals' strength") .text("When powered by Redstone, Nixie Tubes will display the signal strength")
.placeNearTarget() .placeNearTarget()
.pointAt(util.vector.blockSurface(util.grid.at(2, 1, 3), Direction.WEST)); .pointAt(util.vector.blockSurface(util.grid.at(2, 1, 3), Direction.WEST));
scene.idle(70); scene.idle(70);
@ -626,8 +629,10 @@ public class RedstoneScenes {
scene.world.showSection(tubes, Direction.DOWN); scene.world.showSection(tubes, Direction.DOWN);
scene.idle(20); scene.idle(20);
ItemStack clipboard = AllBlocks.CLIPBOARD.asStack();
ClipboardOverrides.switchTo(ClipboardType.WRITTEN, clipboard);
scene.overlay.showControls(new InputWindowElement(centerTube.add(1, .35, 0), Pointing.DOWN).rightClick() scene.overlay.showControls(new InputWindowElement(centerTube.add(1, .35, 0), Pointing.DOWN).rightClick()
.withItem(new ItemStack(Items.NAME_TAG)), 40); .withItem(clipboard), 40);
scene.idle(7); scene.idle(7);
Component component = Components.literal("CREATE"); Component component = Components.literal("CREATE");
@ -649,7 +654,7 @@ public class RedstoneScenes {
scene.overlay.showText(80) scene.overlay.showText(80)
.attachKeyFrame() .attachKeyFrame()
.placeNearTarget() .placeNearTarget()
.text("Using name tags edited with an anvil, custom text can be displayed") .text("Using written Clipboards, custom text can be displayed")
.pointAt(util.vector.topOf(util.grid.at(3, 1, 3)) .pointAt(util.vector.topOf(util.grid.at(3, 1, 3))
.add(-.75, -.05f, 0)); .add(-.75, -.05f, 0));
scene.idle(90); scene.idle(90);
@ -754,17 +759,17 @@ public class RedstoneScenes {
scene.world.toggleRedstonePower(util.select.fromTo(3, 2, 3, 1, 2, 2)); scene.world.toggleRedstonePower(util.select.fromTo(3, 2, 3, 1, 2, 2));
scene.idle(20); scene.idle(20);
Vec3 frontSlot = link1Vec.add(.18, -.05, -.15); Vec3 frontSlot = link1Vec.add(0, .025, -.15);
Vec3 backSlot = link1Vec.add(.18, -.05, .15); Vec3 backSlot = link1Vec.add(0, .025, .15);
Vec3 top2Slot = link2Vec.add(-.09, .15, 0); Vec3 top2Slot = link2Vec.add(0, .15, 0);
Vec3 bottom2Slot = link2Vec.add(-.09, -.2, 0); Vec3 bottom2Slot = link2Vec.add(0, -.2, 0);
Vec3 top3Slot = link3Vec.add(-.09, .15, 0); Vec3 top3Slot = link3Vec.add(0, .15, 0);
Vec3 bottom3Slot = link3Vec.add(-.09, -.2, 0); Vec3 bottom3Slot = link3Vec.add(0, -.2, 0);
scene.addKeyframe(); scene.addKeyframe();
scene.idle(10); scene.idle(10);
scene.overlay.showFilterSlotInput(frontSlot, 100); scene.overlay.showFilterSlotInput(frontSlot, Direction.UP, 100);
scene.overlay.showFilterSlotInput(backSlot, 100); scene.overlay.showFilterSlotInput(backSlot, Direction.UP, 100);
scene.idle(10); scene.idle(10);
scene.overlay.showText(50) scene.overlay.showText(50)
@ -777,9 +782,9 @@ public class RedstoneScenes {
ItemStack gold = new ItemStack(Items.GOLD_INGOT); ItemStack gold = new ItemStack(Items.GOLD_INGOT);
ItemStack sapling = new ItemStack(Items.OAK_SAPLING); ItemStack sapling = new ItemStack(Items.OAK_SAPLING);
scene.overlay.showControls(new InputWindowElement(backSlot, Pointing.DOWN).withItem(iron), 40); scene.overlay.showControls(new InputWindowElement(frontSlot, Pointing.UP).withItem(iron), 30);
scene.idle(7); scene.idle(7);
scene.overlay.showControls(new InputWindowElement(frontSlot, Pointing.UP).withItem(sapling), 40); scene.overlay.showControls(new InputWindowElement(backSlot, Pointing.DOWN).withItem(sapling), 30);
scene.world.modifyBlockEntityNBT(link1Select, RedstoneLinkBlockEntity.class, scene.world.modifyBlockEntityNBT(link1Select, RedstoneLinkBlockEntity.class,
nbt -> nbt.put("FrequencyLast", iron.save(new CompoundTag()))); nbt -> nbt.put("FrequencyLast", iron.save(new CompoundTag())));
scene.idle(7); scene.idle(7);
@ -787,9 +792,9 @@ public class RedstoneScenes {
nbt -> nbt.put("FrequencyFirst", sapling.save(new CompoundTag()))); nbt -> nbt.put("FrequencyFirst", sapling.save(new CompoundTag())));
scene.idle(20); scene.idle(20);
scene.overlay.showControls(new InputWindowElement(top2Slot, Pointing.DOWN).withItem(iron), 40); scene.overlay.showControls(new InputWindowElement(bottom2Slot, Pointing.UP).withItem(iron), 30);
scene.idle(7); scene.idle(7);
scene.overlay.showControls(new InputWindowElement(bottom2Slot, Pointing.UP).withItem(sapling), 40); scene.overlay.showControls(new InputWindowElement(top2Slot, Pointing.DOWN).withItem(sapling), 30);
scene.world.modifyBlockEntityNBT(link2Select, RedstoneLinkBlockEntity.class, scene.world.modifyBlockEntityNBT(link2Select, RedstoneLinkBlockEntity.class,
nbt -> nbt.put("FrequencyLast", iron.save(new CompoundTag()))); nbt -> nbt.put("FrequencyLast", iron.save(new CompoundTag())));
scene.idle(7); scene.idle(7);
@ -797,9 +802,9 @@ public class RedstoneScenes {
nbt -> nbt.put("FrequencyFirst", sapling.save(new CompoundTag()))); nbt -> nbt.put("FrequencyFirst", sapling.save(new CompoundTag())));
scene.idle(20); scene.idle(20);
scene.overlay.showControls(new InputWindowElement(top3Slot, Pointing.DOWN).withItem(gold), 40); scene.overlay.showControls(new InputWindowElement(bottom3Slot, Pointing.UP).withItem(gold), 30);
scene.idle(7); scene.idle(7);
scene.overlay.showControls(new InputWindowElement(bottom3Slot, Pointing.UP).withItem(sapling), 40); scene.overlay.showControls(new InputWindowElement(top3Slot, Pointing.DOWN).withItem(sapling), 30);
scene.world.modifyBlockEntityNBT(link3Select, RedstoneLinkBlockEntity.class, scene.world.modifyBlockEntityNBT(link3Select, RedstoneLinkBlockEntity.class,
nbt -> nbt.put("FrequencyLast", gold.save(new CompoundTag()))); nbt -> nbt.put("FrequencyLast", gold.save(new CompoundTag())));
scene.idle(7); scene.idle(7);
@ -809,15 +814,23 @@ public class RedstoneScenes {
scene.world.toggleRedstonePower(redstone); scene.world.toggleRedstonePower(redstone);
scene.effects.indicateRedstone(leverPos); scene.effects.indicateRedstone(leverPos);
scene.idle(5); scene.idle(2);
scene.world.toggleRedstonePower(util.select.fromTo(1, 2, 2, 1, 2, 3)); scene.world.toggleRedstonePower(util.select.fromTo(1, 2, 2, 1, 2, 3));
scene.effects.indicateRedstone(link2Pos);
scene.overlay.showText(90) scene.overlay.showText(90)
.attachKeyFrame() .attachKeyFrame()
.text("Only the links with matching Frequencies will communicate") .text("Only the links with matching Frequencies will communicate")
.placeNearTarget() .placeNearTarget()
.pointAt(link2Vec); .pointAt(link2Vec);
scene.idle(100);
scene.idle(30);
for (int i = 0; i < 4; i++) {
if (i % 2 == 1)
scene.effects.indicateRedstone(leverPos);
scene.world.toggleRedstonePower(redstone);
scene.idle(2);
scene.world.toggleRedstonePower(util.select.fromTo(1, 2, 2, 1, 2, 3));
scene.idle(20);
}
} }
} }

View file

@ -18,8 +18,8 @@ public class SharedText {
add("rpm16_source", "Source: 16 RPM"); add("rpm16_source", "Source: 16 RPM");
add("rpm32", "32 RPM"); add("rpm32", "32 RPM");
add("movement_anchors", "With the help of Super Glue, larger structures can be moved."); add("movement_anchors", "With the help of Super Glue, larger structures can be moved");
add("behaviour_modify_wrench", "This behaviour can be modified using a Wrench"); add("behaviour_modify_value_panel", "This behaviour can be modified using the value panel");
add("storage_on_contraption", "Inventories attached to the Contraption will pick up their drops automatically"); add("storage_on_contraption", "Inventories attached to the Contraption will pick up their drops automatically");
} }

View file

@ -4,6 +4,7 @@ import com.simibubi.create.AllBlocks;
import com.simibubi.create.AllItems; import com.simibubi.create.AllItems;
import com.simibubi.create.content.contraptions.components.steam.whistle.WhistleBlock; import com.simibubi.create.content.contraptions.components.steam.whistle.WhistleBlock;
import com.simibubi.create.content.contraptions.components.steam.whistle.WhistleExtenderBlock; import com.simibubi.create.content.contraptions.components.steam.whistle.WhistleExtenderBlock;
import com.simibubi.create.content.contraptions.fluids.PumpBlock;
import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock; import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock;
import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock.HeatLevel; import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock.HeatLevel;
import com.simibubi.create.content.contraptions.relays.elementary.ShaftBlock; import com.simibubi.create.content.contraptions.relays.elementary.ShaftBlock;
@ -220,7 +221,11 @@ public class SteamScenes {
Selection pump1 = util.select.fromTo(5, 2, 2, 4, 1, 1); Selection pump1 = util.select.fromTo(5, 2, 2, 4, 1, 1);
Selection pump2 = util.select.fromTo(5, 2, 7, 4, 1, 6); Selection pump2 = util.select.fromTo(5, 2, 7, 4, 1, 6);
Selection pump3 = util.select.fromTo(2, 3, 7, 1, 1, 6); Selection pump3 = util.select.fromTo(2, 3, 7, 1, 1, 6);
scene.world.modifyBlock(util.grid.at(4, 2, 7), s -> s.setValue(PumpBlock.FACING, Direction.SOUTH), false);
scene.world.modifyBlock(util.grid.at(1, 2, 7), s -> s.setValue(PumpBlock.FACING, Direction.SOUTH), false);
scene.world.modifyBlock(util.grid.at(2, 3, 7), s -> s.setValue(PumpBlock.FACING, Direction.SOUTH), false);
scene.idle(15); scene.idle(15);
ElementLink<WorldSectionElement> tankElement = scene.world.showIndependentSection(tank, Direction.DOWN); ElementLink<WorldSectionElement> tankElement = scene.world.showIndependentSection(tank, Direction.DOWN);
scene.world.moveSection(tankElement, util.vector.of(0, -1, 0), 0); scene.world.moveSection(tankElement, util.vector.of(0, -1, 0), 0);

View file

@ -156,7 +156,7 @@ public class TunnelScenes {
if (d == Direction.SOUTH) if (d == Direction.SOUTH)
continue; continue;
Vec3 filter = getTunnelFilterVec(tunnelPos, d); Vec3 filter = getTunnelFilterVec(tunnelPos, d);
scene.overlay.showFilterSlotInput(filter, 40); scene.overlay.showFilterSlotInput(filter, d, 40);
scene.idle(3); scene.idle(3);
} }
@ -171,7 +171,7 @@ public class TunnelScenes {
scene.idle(20); scene.idle(20);
Vec3 tunnelFilterVec = getTunnelFilterVec(tunnelPos, Direction.EAST); Vec3 tunnelFilterVec = getTunnelFilterVec(tunnelPos, Direction.EAST);
scene.overlay.showFilterSlotInput(tunnelFilterVec, 40); scene.overlay.showFilterSlotInput(tunnelFilterVec, Direction.EAST, 10);
scene.overlay.showText(60) scene.overlay.showText(60)
.attachKeyFrame() .attachKeyFrame()
.pointAt(tunnelFilterVec) .pointAt(tunnelFilterVec)
@ -194,9 +194,9 @@ public class TunnelScenes {
.setFilter(Direction.EAST, ItemStack.EMPTY)); .setFilter(Direction.EAST, ItemStack.EMPTY));
tunnelFilterVec = getTunnelFilterVec(tunnelPos, Direction.NORTH); tunnelFilterVec = getTunnelFilterVec(tunnelPos, Direction.NORTH);
scene.overlay.showFilterSlotInput(tunnelFilterVec, 40); scene.overlay.showFilterSlotInput(tunnelFilterVec, Direction.NORTH, 40);
tunnelFilterVec = getTunnelFilterVec(tunnelPos, Direction.WEST); tunnelFilterVec = getTunnelFilterVec(tunnelPos, Direction.WEST);
scene.overlay.showFilterSlotInput(tunnelFilterVec, 40); scene.overlay.showFilterSlotInput(tunnelFilterVec, Direction.WEST, 40);
scene.overlay.showText(60) scene.overlay.showText(60)
.attachKeyFrame() .attachKeyFrame()
.pointAt(tunnelFilterVec) .pointAt(tunnelFilterVec)
@ -227,9 +227,6 @@ public class TunnelScenes {
scene.idle(10); scene.idle(10);
Vec3 tunnelTop = util.vector.topOf(tunnelPos); Vec3 tunnelTop = util.vector.topOf(tunnelPos);
scene.overlay.showControls(new InputWindowElement(tunnelTop, Pointing.DOWN).scroll()
.withWrench(), 80);
scene.idle(7);
scene.overlay.showCenteredScrollInput(tunnelPos, Direction.UP, 120); scene.overlay.showCenteredScrollInput(tunnelPos, Direction.UP, 120);
scene.overlay.showText(120) scene.overlay.showText(120)
.attachKeyFrame() .attachKeyFrame()
@ -340,7 +337,8 @@ public class TunnelScenes {
protected static Vec3 getTunnelFilterVec(BlockPos pos, Direction d) { protected static Vec3 getTunnelFilterVec(BlockPos pos, Direction d) {
return VecHelper.getCenterOf(pos) return VecHelper.getCenterOf(pos)
.add(Vec3.atLowerCornerOf(d.getNormal()).scale(.5)) .add(Vec3.atLowerCornerOf(d.getNormal())
.scale(.5))
.add(0, 0.3, 0); .add(0, 0.3, 0);
} }
@ -360,15 +358,14 @@ public class TunnelScenes {
} }
Vec3 tunnelTop = util.vector.topOf(util.grid.at(2, 2, 3)); Vec3 tunnelTop = util.vector.topOf(util.grid.at(2, 2, 3));
scene.overlay.showControls(new InputWindowElement(tunnelTop, Pointing.DOWN).scroll() scene.overlay.showControls(new InputWindowElement(tunnelTop, Pointing.DOWN).rightClick(), 80);
.withWrench(), 80);
scene.idle(7); scene.idle(7);
scene.overlay.showCenteredScrollInput(util.grid.at(2, 2, 3), Direction.UP, 120); scene.overlay.showCenteredScrollInput(util.grid.at(2, 2, 3), Direction.UP, 120);
scene.overlay.showText(120) scene.overlay.showText(120)
.attachKeyFrame() .attachKeyFrame()
.pointAt(tunnelTop) .pointAt(tunnelTop)
.placeNearTarget() .placeNearTarget()
.text("Using a Wrench, the distribution behaviour of Brass Tunnels can be configured"); .text("The distribution behaviour of Brass Tunnels can be configured");
scene.idle(130); scene.idle(130);
Class<BrassTunnelBlockEntity> tunnelClass = BrassTunnelBlockEntity.class; Class<BrassTunnelBlockEntity> tunnelClass = BrassTunnelBlockEntity.class;

View file

@ -2,6 +2,7 @@ package com.simibubi.create.foundation.ponder.content.fluid;
import com.simibubi.create.AllFluids; import com.simibubi.create.AllFluids;
import com.simibubi.create.content.contraptions.components.actors.PortableFluidInterfaceBlockEntity; import com.simibubi.create.content.contraptions.components.actors.PortableFluidInterfaceBlockEntity;
import com.simibubi.create.content.contraptions.fluids.PumpBlock;
import com.simibubi.create.content.contraptions.fluids.tank.FluidTankBlockEntity; import com.simibubi.create.content.contraptions.fluids.tank.FluidTankBlockEntity;
import com.simibubi.create.foundation.fluid.FluidHelper; import com.simibubi.create.foundation.fluid.FluidHelper;
import com.simibubi.create.foundation.ponder.ElementLink; import com.simibubi.create.foundation.ponder.ElementLink;
@ -47,6 +48,8 @@ public class FluidMovementActorScenes {
ItemStack bucket = AllFluids.CHOCOLATE.get() ItemStack bucket = AllFluids.CHOCOLATE.get()
.getAttributes() .getAttributes()
.getBucket(chocolate); .getBucket(chocolate);
scene.world.modifyBlock(pumpPos, s -> s.setValue(PumpBlock.FACING, Direction.NORTH), false);
scene.world.modifyBlockEntity(st, type, be -> be.getCapability(fhc) scene.world.modifyBlockEntity(st, type, be -> be.getCapability(fhc)
.ifPresent(ifh -> ifh.fill(FluidHelper.copyStackWithAmount(chocolate, 10000), FluidAction.EXECUTE))); .ifPresent(ifh -> ifh.fill(FluidHelper.copyStackWithAmount(chocolate, 10000), FluidAction.EXECUTE)));
@ -98,17 +101,17 @@ public class FluidMovementActorScenes {
.placeNearTarget() .placeNearTarget()
.pointAt(util.vector.of(3, 3, 2.5)) .pointAt(util.vector.of(3, 3, 2.5))
.text("Whenever they pass by each other, they will engage in a connection"); .text("Whenever they pass by each other, they will engage in a connection");
scene.idle(35); scene.idle(38);
Selection both = util.select.fromTo(2, 2, 2, 4, 2, 2); Selection both = util.select.fromTo(2, 2, 2, 4, 2, 2);
Class<PortableFluidInterfaceBlockEntity> psiClass = PortableFluidInterfaceBlockEntity.class; Class<PortableFluidInterfaceBlockEntity> psiClass = PortableFluidInterfaceBlockEntity.class;
scene.world.modifyBlockEntityNBT(both, psiClass, nbt -> { scene.world.modifyBlockEntityNBT(both, psiClass, nbt -> {
nbt.putFloat("Distance", 1); nbt.putFloat("Distance", 1);
nbt.putFloat("Timer", 40); nbt.putFloat("Timer", 14);
}); });
scene.idle(20); scene.idle(17);
scene.overlay.showOutline(PonderPalette.GREEN, psi, util.select.fromTo(5, 3, 2, 6, 4, 2), 80); scene.overlay.showOutline(PonderPalette.GREEN, psi, util.select.fromTo(5, 3, 2, 6, 4, 2), 80);
scene.idle(10); scene.idle(10);
@ -160,7 +163,7 @@ public class FluidMovementActorScenes {
.placeNearTarget() .placeNearTarget()
.pointAt(util.vector.topOf(pumpPos)) .pointAt(util.vector.topOf(pumpPos))
.text("...or extracted from the contraption"); .text("...or extracted from the contraption");
scene.world.multiplyKineticSpeed(util.select.everywhere(), -1); scene.world.modifyBlock(pumpPos, s -> s.setValue(PumpBlock.FACING, Direction.SOUTH), true);
scene.world.propagatePipeChange(pumpPos); scene.world.propagatePipeChange(pumpPos);
scene.idle(30); scene.idle(30);
@ -188,7 +191,7 @@ public class FluidMovementActorScenes {
.attachKeyFrame() .attachKeyFrame()
.pointAt(util.vector.topOf(psi2)) .pointAt(util.vector.topOf(psi2))
.text("After no contents have been exchanged for a while, the contraption will continue on its way"); .text("After no contents have been exchanged for a while, the contraption will continue on its way");
scene.world.modifyBlockEntityNBT(both, psiClass, nbt -> nbt.putFloat("Timer", 9)); scene.world.modifyBlockEntityNBT(both, psiClass, nbt -> nbt.putFloat("Timer", 2));
scene.idle(15); scene.idle(15);
scene.world.rotateBearing(bearing, 270, 120); scene.world.rotateBearing(bearing, 270, 120);

View file

@ -4,6 +4,7 @@ import com.simibubi.create.AllBlocks;
import com.simibubi.create.AllFluids; import com.simibubi.create.AllFluids;
import com.simibubi.create.Create; import com.simibubi.create.Create;
import com.simibubi.create.content.contraptions.fluids.FluidFX; import com.simibubi.create.content.contraptions.fluids.FluidFX;
import com.simibubi.create.content.contraptions.fluids.PumpBlock;
import com.simibubi.create.content.contraptions.fluids.actors.SpoutBlockEntity; import com.simibubi.create.content.contraptions.fluids.actors.SpoutBlockEntity;
import com.simibubi.create.content.contraptions.fluids.tank.CreativeFluidTankBlockEntity; import com.simibubi.create.content.contraptions.fluids.tank.CreativeFluidTankBlockEntity;
import com.simibubi.create.content.contraptions.fluids.tank.CreativeFluidTankBlockEntity.CreativeSmartFluidTank; import com.simibubi.create.content.contraptions.fluids.tank.CreativeFluidTankBlockEntity.CreativeSmartFluidTank;
@ -91,20 +92,16 @@ public class FluidTankScenes {
scene.idle(5); scene.idle(5);
scene.world.setKineticSpeed(pump, 0); scene.world.setKineticSpeed(pump, 0);
scene.world.showSection(pipe, Direction.EAST); scene.world.showSection(pipe, Direction.EAST);
scene.world.modifyBlock(pumpPos, s -> s.setValue(PumpBlock.FACING, Direction.SOUTH), false);
scene.idle(10); scene.idle(10);
scene.world.showSection(largeCog1, Direction.UP); scene.world.showSection(largeCog1, Direction.UP);
scene.world.showSection(kinetics1, Direction.WEST); scene.world.showSection(kinetics1, Direction.WEST);
scene.idle(10); scene.idle(10);
scene.world.setBlock(util.grid.at(1, -1, 5), AllBlocks.FLUID_TANK.getDefaultState(), false); scene.world.setBlock(util.grid.at(1, -1, 5), AllBlocks.FLUID_TANK.getDefaultState(), false);
scene.world.setKineticSpeed(pump, 128); scene.world.setKineticSpeed(pump, -32);
scene.idle(5); scene.idle(5);
Selection pumpRedstone = util.select.fromTo(2, 1, 4, 2, 2, 4);
Selection pumpCogs = util.select.fromTo(2, 1, 3, 1, 1, 3);
scene.world.toggleRedstonePower(pumpRedstone);
scene.world.multiplyKineticSpeed(pumpCogs, -1);
scene.world.propagatePipeChange(pumpPos); scene.world.propagatePipeChange(pumpPos);
scene.effects.rotationDirectionIndicator(pumpPos);
scene.world.modifyBlockEntity(util.grid.at(2, 0, 5), FluidTankBlockEntity.class, be -> be.getTankInventory() scene.world.modifyBlockEntity(util.grid.at(2, 0, 5), FluidTankBlockEntity.class, be -> be.getTankInventory()
.fill(content, FluidAction.EXECUTE)); .fill(content, FluidAction.EXECUTE));
scene.idle(20); scene.idle(20);
@ -122,10 +119,8 @@ public class FluidTankScenes {
.pointAt(util.vector.centerOf(1, 1, 2)); .pointAt(util.vector.centerOf(1, 1, 2));
scene.idle(40); scene.idle(40);
scene.world.toggleRedstonePower(pumpRedstone); scene.world.modifyBlock(pumpPos, s -> s.setValue(PumpBlock.FACING, Direction.NORTH), true);
scene.world.multiplyKineticSpeed(pumpCogs, -1);
scene.world.propagatePipeChange(pumpPos); scene.world.propagatePipeChange(pumpPos);
scene.effects.rotationDirectionIndicator(pumpPos);
for (int i = 0; i < 4; i++) { for (int i = 0; i < 4; i++) {
scene.world.modifyBlockEntity(tankPos, FluidTankBlockEntity.class, be -> be.getTankInventory() scene.world.modifyBlockEntity(tankPos, FluidTankBlockEntity.class, be -> be.getTankInventory()
.fill(FluidHelper.copyStackWithAmount(content, 2000), FluidAction.EXECUTE)); .fill(FluidHelper.copyStackWithAmount(content, 2000), FluidAction.EXECUTE));
@ -395,25 +390,24 @@ public class FluidTankScenes {
scene.idle(7); scene.idle(7);
scene.world.showSection(tank, Direction.DOWN); scene.world.showSection(tank, Direction.DOWN);
scene.idle(5); scene.idle(5);
scene.rotateCameraY(-30);
scene.world.showSection(largeCog, Direction.UP); scene.world.showSection(largeCog, Direction.UP);
scene.world.showSection(cog, Direction.NORTH); scene.world.showSection(cog, Direction.NORTH);
scene.world.showSection(pipes, Direction.NORTH); scene.world.showSection(pipes, Direction.NORTH);
scene.world.multiplyKineticSpeed(util.select.everywhere(), -1); scene.world.modifyBlock(pumpPos, s -> s.setValue(PumpBlock.FACING, Direction.SOUTH), false);
scene.world.propagatePipeChange(pumpPos); scene.world.propagatePipeChange(pumpPos);
scene.effects.rotationDirectionIndicator(pumpPos);
scene.idle(40); scene.idle(40);
scene.overlay.showText(70) scene.overlay.showText(70)
.text("Pipe Networks can now endlessly draw the assigned fluid from the tank") .text("Pipe Networks can now endlessly draw the assigned fluid from the tank")
.attachKeyFrame() .attachKeyFrame()
.placeNearTarget()
.pointAt(util.vector.blockSurface(util.grid.at(3, 1, 2), Direction.WEST)); .pointAt(util.vector.blockSurface(util.grid.at(3, 1, 2), Direction.WEST));
scene.idle(120); scene.idle(120);
scene.world.multiplyKineticSpeed(util.select.everywhere(), -1); scene.world.modifyBlock(pumpPos, s -> s.setValue(PumpBlock.FACING, Direction.NORTH), true);
scene.world.propagatePipeChange(pumpPos); scene.world.propagatePipeChange(pumpPos);
scene.effects.rotationDirectionIndicator(pumpPos);
scene.idle(40); scene.idle(40);
scene.overlay.showText(70) scene.overlay.showText(70)

View file

@ -4,8 +4,10 @@ import java.util.Collections;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
import com.simibubi.create.content.contraptions.fluids.PumpBlock;
import com.simibubi.create.content.contraptions.fluids.actors.HosePulleyBlockEntity; import com.simibubi.create.content.contraptions.fluids.actors.HosePulleyBlockEntity;
import com.simibubi.create.content.contraptions.fluids.actors.HosePulleyFluidHandler; import com.simibubi.create.content.contraptions.fluids.actors.HosePulleyFluidHandler;
import com.simibubi.create.content.contraptions.fluids.tank.FluidTankBlockEntity;
import com.simibubi.create.foundation.ponder.ElementLink; import com.simibubi.create.foundation.ponder.ElementLink;
import com.simibubi.create.foundation.ponder.PonderPalette; import com.simibubi.create.foundation.ponder.PonderPalette;
import com.simibubi.create.foundation.ponder.SceneBuilder; import com.simibubi.create.foundation.ponder.SceneBuilder;
@ -120,14 +122,15 @@ public class HosePulleyScenes {
scene.idle(3); scene.idle(3);
} }
scene.world.multiplyKineticSpeed(util.select.fromTo(3, 1, 2, 3, 2, 1), -1);
scene.world.modifyBlockEntity(util.grid.at(1, 5, 1), HosePulleyBlockEntity.class, be -> be scene.world.modifyBlockEntity(util.grid.at(1, 5, 1), HosePulleyBlockEntity.class, be -> be
.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY) .getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY)
.ifPresent( .ifPresent(
ifh -> ((HosePulleyFluidHandler) ifh).fill(new FluidStack(Fluids.WATER, 100), FluidAction.EXECUTE))); ifh -> ((HosePulleyFluidHandler) ifh).fill(new FluidStack(Fluids.WATER, 100), FluidAction.EXECUTE)));
scene.world.propagatePipeChange(util.grid.at(3, 2, 1));
scene.idle(40); scene.idle(20);
scene.world.modifyBlock(util.grid.at(3, 2, 1), s -> s.setValue(PumpBlock.FACING, Direction.DOWN), true);
scene.world.propagatePipeChange(util.grid.at(3, 2, 1));
scene.idle(20);
scene.world.setKineticSpeed(kinetics, 32); scene.world.setKineticSpeed(kinetics, 32);
scene.idle(16); scene.idle(16);
scene.world.setKineticSpeed(kinetics, 0); scene.world.setKineticSpeed(kinetics, 0);
@ -206,6 +209,7 @@ public class HosePulleyScenes {
.pointAt(util.vector.blockSurface(hosePos.below(), Direction.UP)); .pointAt(util.vector.blockSurface(hosePos.below(), Direction.UP));
scene.idle(55); scene.idle(55);
scene.world.modifyBlock(util.grid.at(3, 2, 1), s -> s.setValue(PumpBlock.FACING, Direction.DOWN), false);
Selection kinetics = util.select.fromTo(1, 6, 1, 0, 6, 1); Selection kinetics = util.select.fromTo(1, 6, 1, 0, 6, 1);
scene.world.setKineticSpeed(kinetics, 32); scene.world.setKineticSpeed(kinetics, 32);
scene.idle(50); scene.idle(50);
@ -220,11 +224,10 @@ public class HosePulleyScenes {
scene.world.showSectionAndMerge(cogs, Direction.NORTH, hoselink); scene.world.showSectionAndMerge(cogs, Direction.NORTH, hoselink);
scene.world.showSectionAndMerge(pipes, Direction.WEST, hoselink); scene.world.showSectionAndMerge(pipes, Direction.WEST, hoselink);
scene.world.multiplyKineticSpeed(util.select.fromTo(3, 1, 2, 3, 2, 1), -1); scene.world.modifyBlockEntity(util.grid.at(1, 6, 1), HosePulleyBlockEntity.class,
scene.world.modifyBlockEntity(util.grid.at(1, 6, 1), HosePulleyBlockEntity.class, be -> be be -> be.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY)
.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY) .ifPresent(
.ifPresent( fh -> ((HosePulleyFluidHandler) fh).fill(new FluidStack(Fluids.WATER, 100), FluidAction.EXECUTE)));
fh -> ((HosePulleyFluidHandler) fh).fill(new FluidStack(Fluids.WATER, 100), FluidAction.EXECUTE)));
scene.world.propagatePipeChange(util.grid.at(3, 2, 1)); scene.world.propagatePipeChange(util.grid.at(3, 2, 1));
Vec3 surface = util.vector.topOf(1, 3, 1) Vec3 surface = util.vector.topOf(1, 3, 1)
@ -252,9 +255,6 @@ public class HosePulleyScenes {
.pointAt(util.vector.of(0, 2 - 1 / 8f, 1.5f)); .pointAt(util.vector.of(0, 2 - 1 / 8f, 1.5f));
scene.idle(30); scene.idle(30);
scene.idle(10);
scene.world.multiplyKineticSpeed(util.select.fromTo(3, 1, 2, 3, 2, 1), -1);
scene.world.propagatePipeChange(util.grid.at(3, 2, 1));
scene.idle(30); scene.idle(30);
scene.world.hideSection(water, Direction.SOUTH); scene.world.hideSection(water, Direction.SOUTH);
scene.idle(15); scene.idle(15);
@ -263,6 +263,8 @@ public class HosePulleyScenes {
scene.world.showSection(water, Direction.UP); scene.world.showSection(water, Direction.UP);
scene.idle(15); scene.idle(15);
scene.world.setKineticSpeed(kinetics, -32); scene.world.setKineticSpeed(kinetics, -32);
scene.world.modifyBlock(util.grid.at(3, 2, 1), s -> s.setValue(PumpBlock.FACING, Direction.UP), true);
scene.world.propagatePipeChange(util.grid.at(3, 2, 1));
scene.idle(16); scene.idle(16);
scene.world.setKineticSpeed(kinetics, 0); scene.world.setKineticSpeed(kinetics, 0);
@ -313,6 +315,9 @@ public class HosePulleyScenes {
Selection hose = util.select.fromTo(1, 3, 2, 0, 3, 2); Selection hose = util.select.fromTo(1, 3, 2, 0, 3, 2);
BlockPos pumpPos = util.grid.at(3, 2, 2); BlockPos pumpPos = util.grid.at(3, 2, 2);
scene.world.multiplyKineticSpeed(kinetics, 0.25f);
scene.world.multiplyKineticSpeed(util.select.position(pumpPos), 0.25f);
scene.world.showSection(hose, Direction.UP); scene.world.showSection(hose, Direction.UP);
scene.idle(5); scene.idle(5);
scene.world.showSection(tank, Direction.DOWN); scene.world.showSection(tank, Direction.DOWN);
@ -333,10 +338,13 @@ public class HosePulleyScenes {
.pointAt(entryPoint); .pointAt(entryPoint);
scene.idle(40); scene.idle(40);
scene.world.modifyBlockEntity(util.grid.at(1, 3, 2), HosePulleyBlockEntity.class,
be -> be.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY)
.ifPresent(
fh -> ((HosePulleyFluidHandler) fh).fill(new FluidStack(Fluids.WATER, 1000), FluidAction.EXECUTE)));
scene.world.setKineticSpeed(hose, 0); scene.world.setKineticSpeed(hose, 0);
scene.world.multiplyKineticSpeed(util.select.everywhere(), -1); scene.world.modifyBlock(pumpPos, s -> s.setValue(PumpBlock.FACING, Direction.DOWN), true);
scene.world.propagatePipeChange(pumpPos); scene.world.propagatePipeChange(pumpPos);
scene.effects.rotationDirectionIndicator(pumpPos);
scene.idle(30); scene.idle(30);
Selection pulleyPos = util.select.position(1, 3, 2); Selection pulleyPos = util.select.position(1, 3, 2);
@ -347,7 +355,13 @@ public class HosePulleyScenes {
.placeNearTarget() .placeNearTarget()
.pointAt(util.vector.topOf(util.grid.at(1, 3, 2))); .pointAt(util.vector.topOf(util.grid.at(1, 3, 2)));
scene.idle(80); scene.idle(60);
scene.world.modifyBlockEntity(util.grid.at(4, 1, 1), FluidTankBlockEntity.class, be -> be.getTankInventory()
.fill(new FluidStack(Fluids.WATER, 24000), FluidAction.EXECUTE));
scene.idle(20);
scene.overlay.showText(60) scene.overlay.showText(60)
.text("Pipe networks can limitlessly take fluids from/to such pulleys") .text("Pipe networks can limitlessly take fluids from/to such pulleys")
.attachKeyFrame() .attachKeyFrame()

View file

@ -138,7 +138,8 @@ public class PipeScenes {
scene.world.showSection(largeCog, Direction.UP); scene.world.showSection(largeCog, Direction.UP);
scene.world.showSection(kinetics, Direction.SOUTH); scene.world.showSection(kinetics, Direction.SOUTH);
scene.idle(10); scene.idle(10);
scene.world.setKineticSpeed(util.select.position(pumpPos), 32); scene.world.multiplyKineticSpeed(util.select.everywhere(), 0.25f);
scene.world.setKineticSpeed(util.select.position(pumpPos), 8);
scene.world.propagatePipeChange(pumpPos); scene.world.propagatePipeChange(pumpPos);
scene.overlay.showText(70) scene.overlay.showText(70)
@ -151,7 +152,7 @@ public class PipeScenes {
.colored(PonderPalette.RED) .colored(PonderPalette.RED)
.placeNearTarget() .placeNearTarget()
.text("No fluid is being extracted at first"); .text("No fluid is being extracted at first");
scene.idle(90); scene.idle(70);
scene.overlay.showOutline(PonderPalette.GREEN, new Object(), tank, 100); scene.overlay.showOutline(PonderPalette.GREEN, new Object(), tank, 100);
scene.idle(5); scene.idle(5);
@ -216,7 +217,8 @@ public class PipeScenes {
scene.idle(5); scene.idle(5);
scene.world.showSection(kinetics, Direction.NORTH); scene.world.showSection(kinetics, Direction.NORTH);
scene.idle(10); scene.idle(10);
scene.world.setKineticSpeed(util.select.position(pumpPos), 64); scene.world.multiplyKineticSpeed(util.select.everywhere(), 0.5f);
scene.world.setKineticSpeed(util.select.position(pumpPos), 32);
BlockPos drainPos = util.grid.at(1, 1, 2); BlockPos drainPos = util.grid.at(1, 1, 2);
scene.world.modifyBlockEntity(drainPos, ItemDrainBlockEntity.class, scene.world.modifyBlockEntity(drainPos, ItemDrainBlockEntity.class,
be -> be.getBehaviour(SmartFluidTankBehaviour.TYPE) be -> be.getBehaviour(SmartFluidTankBehaviour.TYPE)
@ -253,7 +255,7 @@ public class PipeScenes {
scene.world.setBlock(util.grid.at(3, 1, 3), AllBlocks.GLASS_FLUID_PIPE.getDefaultState() scene.world.setBlock(util.grid.at(3, 1, 3), AllBlocks.GLASS_FLUID_PIPE.getDefaultState()
.setValue(AxisPipeBlock.AXIS, Axis.Z), false); .setValue(AxisPipeBlock.AXIS, Axis.Z), false);
scene.idle(10); scene.idle(10);
scene.world.multiplyKineticSpeed(util.select.everywhere(), 2); // scene.world.multiplyKineticSpeed(util.select.everywhere(), 2);
scene.world.propagatePipeChange(pumpPos); scene.world.propagatePipeChange(pumpPos);
ElementLink<WorldSectionElement> water = scene.world.showIndependentSection(waterSourceS, Direction.DOWN); ElementLink<WorldSectionElement> water = scene.world.showIndependentSection(waterSourceS, Direction.DOWN);
scene.world.moveSection(water, util.vector.of(0, 0, 1), 0); scene.world.moveSection(water, util.vector.of(0, 0, 1), 0);
@ -427,11 +429,13 @@ public class PipeScenes {
.attachKeyFrame() .attachKeyFrame()
.pointAt(util.vector.topOf(valvePos)); .pointAt(util.vector.topOf(valvePos));
scene.idle(60); scene.idle(60);
scene.world.showSection(util.select.position(handlePos), Direction.DOWN); ElementLink<WorldSectionElement> handleLink =
scene.world.showIndependentSection(util.select.position(handlePos), Direction.DOWN);
scene.idle(15); scene.idle(15);
Selection valveKinetics = util.select.fromTo(2, 1, 1, 2, 2, 1); Selection valveKinetics = util.select.fromTo(2, 1, 1, 2, 2, 1);
scene.world.setKineticSpeed(valveKinetics, 16); scene.world.setKineticSpeed(valveKinetics, 16);
scene.world.rotateSection(handleLink, 0, 90, 0, 22);
scene.effects.rotationSpeedIndicator(handlePos); scene.effects.rotationSpeedIndicator(handlePos);
scene.world.modifyBlockEntity(valvePos, FluidValveBlockEntity.class, be -> be.onSpeedChanged(0)); scene.world.modifyBlockEntity(valvePos, FluidValveBlockEntity.class, be -> be.onSpeedChanged(0));
scene.idle(22); scene.idle(22);
@ -455,6 +459,7 @@ public class PipeScenes {
scene.idle(40); scene.idle(40);
scene.world.setKineticSpeed(valveKinetics, -16); scene.world.setKineticSpeed(valveKinetics, -16);
scene.world.rotateSection(handleLink, 0, -90, 0, 22);
scene.effects.rotationSpeedIndicator(handlePos); scene.effects.rotationSpeedIndicator(handlePos);
scene.world.modifyBlockEntity(valvePos, FluidValveBlockEntity.class, be -> be.onSpeedChanged(0)); scene.world.modifyBlockEntity(valvePos, FluidValveBlockEntity.class, be -> be.onSpeedChanged(0));
scene.idle(22); scene.idle(22);
@ -513,7 +518,6 @@ public class PipeScenes {
scene.overlay.showText(50) scene.overlay.showText(50)
.placeNearTarget() .placeNearTarget()
.text("Smart pipes can help control flows by fluid type") .text("Smart pipes can help control flows by fluid type")
.attachKeyFrame()
.pointAt(filterVec); .pointAt(filterVec);
scene.idle(60); scene.idle(60);
@ -543,17 +547,16 @@ public class PipeScenes {
scene.idle(50); scene.idle(50);
scene.world.showSection(kinetics2, Direction.WEST); scene.world.showSection(kinetics2, Direction.WEST);
scene.world.setKineticSpeed(kinetics2, 64); scene.world.setKineticSpeed(kinetics2, 24);
scene.idle(5); scene.idle(5);
scene.world.showSection(kinetics1, Direction.EAST); scene.world.showSection(kinetics1, Direction.EAST);
scene.world.setKineticSpeed(kinetics1, -64); scene.world.setKineticSpeed(kinetics1, -24);
scene.idle(10); scene.idle(10);
scene.world.setKineticSpeed(pump, 128); scene.world.setKineticSpeed(pump, 48);
scene.world.propagatePipeChange(pumpPos); scene.world.propagatePipeChange(pumpPos);
scene.idle(120); scene.idle(100);
scene.world.setKineticSpeed(util.select.everywhere(), 0); scene.world.setKineticSpeed(util.select.everywhere(), 0);
scene.world.propagatePipeChange(pumpPos); scene.world.propagatePipeChange(pumpPos);
scene.effects.rotationSpeedIndicator(pumpPos);
scene.idle(15); scene.idle(15);
scene.world.showSection(tank2, Direction.DOWN); scene.world.showSection(tank2, Direction.DOWN);
scene.world.showSection(additionalPipes, Direction.NORTH); scene.world.showSection(additionalPipes, Direction.NORTH);
@ -592,9 +595,9 @@ public class PipeScenes {
scene.world.setFilterData(util.select.position(2, 1, 3), SmartFluidPipeBlockEntity.class, bucket); scene.world.setFilterData(util.select.position(2, 1, 3), SmartFluidPipeBlockEntity.class, bucket);
scene.idle(30); scene.idle(30);
scene.world.setKineticSpeed(kinetics2, 64); scene.world.setKineticSpeed(kinetics2, 24);
scene.world.setKineticSpeed(kinetics1, -64); scene.world.setKineticSpeed(kinetics1, -24);
scene.world.setKineticSpeed(pump, 128); scene.world.setKineticSpeed(pump, 48);
scene.world.propagatePipeChange(pumpPos); scene.world.propagatePipeChange(pumpPos);
scene.effects.rotationSpeedIndicator(pumpPos); scene.effects.rotationSpeedIndicator(pumpPos);
scene.idle(40); scene.idle(40);

View file

@ -76,7 +76,7 @@ public class PumpScenes {
scene.idle(15); scene.idle(15);
scene.overlay.showText(60) scene.overlay.showText(60)
.text("When powered, their arrow indicates the direction of flow") .text("Their arrow indicates the direction of flow")
.attachKeyFrame() .attachKeyFrame()
.placeNearTarget() .placeNearTarget()
.pointAt(util.vector.topOf(pumpPos) .pointAt(util.vector.topOf(pumpPos)
@ -124,23 +124,17 @@ public class PumpScenes {
scene.world.propagatePipeChange(pumpPos); scene.world.propagatePipeChange(pumpPos);
scene.idle(15); scene.idle(15);
scene.overlay.showText(70) scene.overlay.showText(60)
.text("Reversing the input rotation reverses the direction of flow") .text("The pumps direction is unaffected by the input rotation")
.colored(PonderPalette.RED)
.placeNearTarget() .placeNearTarget()
.attachKeyFrame() .attachKeyFrame()
.pointAt(util.vector.topOf(pumpPos) .pointAt(util.vector.topOf(pumpPos)
.subtract(0.5f, 0.125f, 0)); .subtract(0.5f, 0.125f, 0));
scene.idle(25); scene.idle(25);
scene.overlay.chaseBoundingBoxOutline(PonderPalette.INPUT, in, bb1.move(util.vector.centerOf(1, 1, 3)), 3); scene.overlay.chaseBoundingBoxOutline(PonderPalette.RED, in, new AABB(leverPos.below()), 30);
scene.idle(2); scene.idle(45);
scene.overlay.chaseBoundingBoxOutline(PonderPalette.INPUT, in, bb2.move(util.vector.centerOf(1, 1, 2)), 30);
scene.idle(15);
scene.overlay.chaseBoundingBoxOutline(PonderPalette.OUTPUT, out, bb1.move(util.vector.centerOf(3, 1, 1)
.add(0, 0, -.5)), 3);
scene.idle(2);
scene.overlay.chaseBoundingBoxOutline(PonderPalette.OUTPUT, out, bb2.move(util.vector.centerOf(3, 1, 2)), 30);
scene.idle(55);
scene.overlay.showControls(new InputWindowElement(util.vector.topOf(pumpPos), Pointing.DOWN).rightClick() scene.overlay.showControls(new InputWindowElement(util.vector.topOf(pumpPos), Pointing.DOWN).rightClick()
.withWrench(), 40); .withWrench(), 40);
@ -150,7 +144,7 @@ public class PumpScenes {
.attachKeyFrame() .attachKeyFrame()
.pointAt(util.vector.centerOf(2, 1, 1)) .pointAt(util.vector.centerOf(2, 1, 1))
.placeNearTarget() .placeNearTarget()
.text("Use a Wrench to reverse the orientation of pumps manually"); .text("Instead, a Wrench can be used to reverse the direction");
scene.world.propagatePipeChange(pumpPos); scene.world.propagatePipeChange(pumpPos);
scene.idle(40); scene.idle(40);
@ -182,9 +176,11 @@ public class PumpScenes {
Selection tank2 = util.select.fromTo(0, 1, 2, 0, 2, 2); Selection tank2 = util.select.fromTo(0, 1, 2, 0, 2, 2);
Selection megapipe1 = util.select.fromTo(0, 3, 5, 1, 4, 2); Selection megapipe1 = util.select.fromTo(0, 3, 5, 1, 4, 2);
Selection megapipe2 = util.select.fromTo(3, 3, 1, 5, 6, 2); Selection megapipe2 = util.select.fromTo(3, 3, 1, 5, 6, 2);
scene.world.modifyBlock(pumpPos, s -> s.setValue(PumpBlock.FACING, Direction.WEST), false);
scene.world.modifyBlockEntity(util.grid.at(0, 1, 2), FluidTankBlockEntity.class, be -> be.getTankInventory() scene.world.modifyBlockEntity(util.grid.at(0, 1, 2), FluidTankBlockEntity.class, be -> be.getTankInventory()
.drain(3000, FluidAction.EXECUTE)); .drain(3000, FluidAction.EXECUTE));
scene.world.multiplyKineticSpeed(util.select.everywhere(), 0.125f);
BlockPos east = pumpPos.east(); BlockPos east = pumpPos.east();
scene.world.setBlock(east, Blocks.AIR.defaultBlockState(), false); scene.world.setBlock(east, Blocks.AIR.defaultBlockState(), false);
@ -194,7 +190,7 @@ public class PumpScenes {
scene.world.setBlock(pumpPos.south(), AllBlocks.COGWHEEL.getDefaultState() scene.world.setBlock(pumpPos.south(), AllBlocks.COGWHEEL.getDefaultState()
.setValue(CogWheelBlock.AXIS, Axis.X), false); .setValue(CogWheelBlock.AXIS, Axis.X), false);
Selection southPump = util.select.position(pumpPos.south()); Selection southPump = util.select.position(pumpPos.south());
scene.world.setKineticSpeed(southPump, 32); scene.world.setKineticSpeed(southPump, 4);
scene.world.setKineticSpeed(pump, 0); scene.world.setKineticSpeed(pump, 0);
scene.world.showSection(pump, Direction.DOWN); scene.world.showSection(pump, Direction.DOWN);
@ -231,12 +227,12 @@ public class PumpScenes {
scene.world.showSection(largeCog, Direction.UP); scene.world.showSection(largeCog, Direction.UP);
scene.world.showSection(cogs, Direction.SOUTH); scene.world.showSection(cogs, Direction.SOUTH);
scene.idle(10); scene.idle(10);
scene.world.setKineticSpeed(util.select.position(pumpPos), -32); scene.world.setKineticSpeed(util.select.position(pumpPos), -4);
scene.effects.rotationSpeedIndicator(pumpPos); scene.effects.rotationSpeedIndicator(pumpPos);
scene.world.propagatePipeChange(pumpPos); scene.world.propagatePipeChange(pumpPos);
scene.idle(40); scene.idle(40);
scene.world.multiplyKineticSpeed(util.select.everywhere(), 4); scene.world.multiplyKineticSpeed(util.select.everywhere(), 8);
scene.effects.rotationSpeedIndicator(pumpPos); scene.effects.rotationSpeedIndicator(pumpPos);
scene.world.propagatePipeChange(pumpPos); scene.world.propagatePipeChange(pumpPos);
scene.idle(20); scene.idle(20);
@ -251,7 +247,7 @@ public class PumpScenes {
scene.overlay.showText(50) scene.overlay.showText(50)
.pointAt(util.vector.blockSurface(util.grid.at(0, 1, 2), Direction.WEST)) .pointAt(util.vector.blockSurface(util.grid.at(0, 1, 2), Direction.WEST))
.placeNearTarget() .placeNearTarget()
.text("...aswell as how quickly fluids are transferred"); .text("...and the speed at which fluids are transferred");
scene.idle(60); scene.idle(60);
BlockState pipeState = AllBlocks.FLUID_PIPE.getDefaultState() BlockState pipeState = AllBlocks.FLUID_PIPE.getDefaultState()
@ -279,7 +275,7 @@ public class PumpScenes {
scene.world.showSection(util.select.position(west.south()), Direction.DOWN); scene.world.showSection(util.select.position(west.south()), Direction.DOWN);
scene.world.restoreBlocks(southPump); scene.world.restoreBlocks(southPump);
scene.world.modifyBlock(pumpPos.south(), s -> s.setValue(PumpBlock.FACING, Direction.EAST), false); scene.world.modifyBlock(pumpPos.south(), s -> s.setValue(PumpBlock.FACING, Direction.WEST), true);
scene.world.setKineticSpeed(util.select.everywhere(), 0); scene.world.setKineticSpeed(util.select.everywhere(), 0);
scene.world.showSection(northPump, Direction.DOWN); scene.world.showSection(northPump, Direction.DOWN);
scene.world.modifyBlock(pumpPos.north(), s -> s.setValue(PumpBlock.FACING, Direction.EAST), false); scene.world.modifyBlock(pumpPos.north(), s -> s.setValue(PumpBlock.FACING, Direction.EAST), false);
@ -299,11 +295,6 @@ public class PumpScenes {
.text("Pumps can combine their throughputs within shared pipe networks"); .text("Pumps can combine their throughputs within shared pipe networks");
scene.idle(70); scene.idle(70);
scene.overlay
.showControls(new InputWindowElement(util.vector.topOf(pumpPos.south()), Pointing.DOWN).rightClick()
.withWrench(), 30);
scene.idle(7);
scene.world.modifyBlock(pumpPos.south(), s -> s.setValue(PumpBlock.FACING, Direction.WEST), true);
scene.idle(30); scene.idle(30);
scene.overlay scene.overlay
.showControls(new InputWindowElement(util.vector.topOf(pumpPos.north()), Pointing.DOWN).rightClick() .showControls(new InputWindowElement(util.vector.topOf(pumpPos.north()), Pointing.DOWN).rightClick()
@ -317,10 +308,10 @@ public class PumpScenes {
.pointAt(util.vector.topOf(pumpPos.north()) .pointAt(util.vector.topOf(pumpPos.north())
.subtract(0.5f, 0.125f, 0)) .subtract(0.5f, 0.125f, 0))
.placeNearTarget() .placeNearTarget()
.text("Alternating their orientation can help align their flow directions"); .text("Ensure that all of them are facing in the same direction");
scene.idle(40); scene.idle(40);
scene.world.multiplyKineticSpeed(util.select.everywhere(), 8); scene.world.multiplyKineticSpeed(util.select.everywhere(), 4);
scene.effects.rotationSpeedIndicator(pumpPos); scene.effects.rotationSpeedIndicator(pumpPos);
scene.effects.rotationSpeedIndicator(pumpPos.north()); scene.effects.rotationSpeedIndicator(pumpPos.north());
scene.effects.rotationSpeedIndicator(pumpPos.south()); scene.effects.rotationSpeedIndicator(pumpPos.south());

View file

@ -3,6 +3,7 @@ package com.simibubi.create.foundation.ponder.content.fluid;
import com.simibubi.create.AllFluids; import com.simibubi.create.AllFluids;
import com.simibubi.create.Create; import com.simibubi.create.Create;
import com.simibubi.create.content.contraptions.fluids.FluidFX; import com.simibubi.create.content.contraptions.fluids.FluidFX;
import com.simibubi.create.content.contraptions.fluids.PumpBlock;
import com.simibubi.create.content.contraptions.fluids.actors.SpoutBlockEntity; import com.simibubi.create.content.contraptions.fluids.actors.SpoutBlockEntity;
import com.simibubi.create.foundation.fluid.FluidHelper; import com.simibubi.create.foundation.fluid.FluidHelper;
import com.simibubi.create.foundation.gui.AllIcons; import com.simibubi.create.foundation.gui.AllIcons;
@ -38,6 +39,8 @@ public class SpoutScenes {
scene.world.showIndependentSection(util.select.position(2, 1, 1), Direction.DOWN); scene.world.showIndependentSection(util.select.position(2, 1, 1), Direction.DOWN);
scene.world.moveSection(depot, util.vector.of(0, 0, 1), 0); scene.world.moveSection(depot, util.vector.of(0, 0, 1), 0);
scene.idle(10); scene.idle(10);
scene.world.modifyBlock(util.grid.at(2, 3, 3), s -> s.setValue(PumpBlock.FACING, Direction.NORTH), false);
Selection largeCog = util.select.position(3, 0, 5); Selection largeCog = util.select.position(3, 0, 5);
Selection kinetics = util.select.fromTo(2, 1, 5, 2, 2, 3); Selection kinetics = util.select.fromTo(2, 1, 5, 2, 2, 3);

View file

@ -107,8 +107,7 @@ public class TrackObserverScenes {
target = util.vector.topOf(5, 1, 4); target = util.vector.topOf(5, 1, 4);
bb = new AABB(target, target); bb = new AABB(target, target);
scene.overlay.chaseBoundingBoxOutline(PonderPalette.WHITE, bb, bb, 1); scene.overlay.showCenteredScrollInput(util.grid.at(5, 1, 4), Direction.UP, 60);
scene.overlay.chaseBoundingBoxOutline(PonderPalette.WHITE, bb, bb.inflate(.2f, 0, .2f), 60);
scene.overlay.showText(80) scene.overlay.showText(80)
.pointAt(util.vector.topOf(5, 1, 4)) .pointAt(util.vector.topOf(5, 1, 4))

View file

@ -539,7 +539,7 @@ public class TrainSignalScenes {
.pointAt(util.vector.blockSurface(util.grid.at(3, 2, 3), Direction.WEST)) .pointAt(util.vector.blockSurface(util.grid.at(3, 2, 3), Direction.WEST))
.attachKeyFrame() .attachKeyFrame()
.placeNearTarget() .placeNearTarget()
.text("Reversely, red signals emit a comparator output"); .text("Conversely, red signals emit a comparator output");
scene.idle(40); scene.idle(40);
scene.world.toggleControls(util.grid.at(6, 3, 5)); scene.world.toggleControls(util.grid.at(6, 3, 5));

View file

@ -10,6 +10,7 @@ import com.simibubi.create.foundation.gui.element.BoxElement;
import com.simibubi.create.foundation.ponder.PonderLocalization; import com.simibubi.create.foundation.ponder.PonderLocalization;
import com.simibubi.create.foundation.ponder.PonderPalette; import com.simibubi.create.foundation.ponder.PonderPalette;
import com.simibubi.create.foundation.ponder.PonderScene; import com.simibubi.create.foundation.ponder.PonderScene;
import com.simibubi.create.foundation.ponder.PonderScene.SceneTransform;
import com.simibubi.create.foundation.ponder.ui.PonderUI; import com.simibubi.create.foundation.ponder.ui.PonderUI;
import com.simibubi.create.foundation.utility.Color; import com.simibubi.create.foundation.utility.Color;
@ -94,35 +95,44 @@ public class TextWindowElement extends AnimatedOverlayElement {
bakedText = textGetter.get(); bakedText = textGetter.get();
if (fade < 1 / 16f) if (fade < 1 / 16f)
return; return;
Vec2 sceneToScreen = vec != null ? scene.getTransform() SceneTransform transform = scene.getTransform();
.sceneToScreen(vec, partialTicks) : new Vec2(screen.width / 2, (screen.height - 200) / 2 + y - 8); Vec2 sceneToScreen = vec != null ? transform.sceneToScreen(vec, partialTicks)
: new Vec2(screen.width / 2, (screen.height - 200) / 2 + y - 8);
boolean settled = transform.xRotation.settled() && transform.yRotation.settled();
float pY = settled ? (int) sceneToScreen.y : sceneToScreen.y;
float yDiff = (screen.height / 2f - sceneToScreen.y - 10) / 100f; float yDiff = (screen.height / 2f - sceneToScreen.y - 10) / 100f;
int targetX = (int) (screen.width * Mth.lerp(yDiff * yDiff, 6f / 8, 5f / 8)); float targetX = (screen.width * Mth.lerp(yDiff * yDiff, 6f / 8, 5f / 8));
if (nearScene) if (nearScene)
targetX = (int) Math.min(targetX, sceneToScreen.x + 50); targetX = Math.min(targetX, sceneToScreen.x + 50);
if (settled)
targetX = (int) targetX;
int textWidth = Math.min(screen.width - targetX, 180); int textWidth = (int) Math.min(screen.width - targetX, 180);
List<FormattedText> lines = screen.getFontRenderer().getSplitter().splitLines(bakedText, textWidth, Style.EMPTY); List<FormattedText> lines = screen.getFontRenderer()
.getSplitter()
.splitLines(bakedText, textWidth, Style.EMPTY);
int boxWidth = 0; int boxWidth = 0;
for (FormattedText line : lines) for (FormattedText line : lines)
boxWidth = Math.max(boxWidth, screen.getFontRenderer().width(line)); boxWidth = Math.max(boxWidth, screen.getFontRenderer()
.width(line));
int boxHeight = screen.getFontRenderer() int boxHeight = screen.getFontRenderer()
.wordWrapHeight(bakedText, boxWidth); .wordWrapHeight(bakedText, boxWidth);
ms.pushPose(); ms.pushPose();
ms.translate(0, sceneToScreen.y, 400); ms.translate(0, pY, 400);
new BoxElement() new BoxElement().withBackground(Theme.c(Theme.Key.PONDER_BACKGROUND_FLAT))
.withBackground(Theme.c(Theme.Key.PONDER_BACKGROUND_FLAT)) .gradientBorder(Theme.p(Theme.Key.TEXT_WINDOW_BORDER))
.gradientBorder(Theme.p(Theme.Key.TEXT_WINDOW_BORDER)) .at(targetX - 10, 3, 100)
.at(targetX - 10, 3, 100) .withBounds(boxWidth, boxHeight - 1)
.withBounds(boxWidth, boxHeight - 1) .render(ms);
.render(ms);
//PonderUI.renderBox(ms, targetX - 10, 3, boxWidth, boxHeight - 1, 0xaa000000, 0x30eebb00, 0x10eebb00); //PonderUI.renderBox(ms, targetX - 10, 3, boxWidth, boxHeight - 1, 0xaa000000, 0x30eebb00, 0x10eebb00);
@ -133,7 +143,8 @@ public class TextWindowElement extends AnimatedOverlayElement {
ms.translate(sceneToScreen.x, 0, 0); ms.translate(sceneToScreen.x, 0, 0);
double lineTarget = (targetX - sceneToScreen.x) * fade; double lineTarget = (targetX - sceneToScreen.x) * fade;
ms.scale((float) lineTarget, 1, 1); ms.scale((float) lineTarget, 1, 1);
Matrix4f model = ms.last().pose(); Matrix4f model = ms.last()
.pose();
GuiUtils.drawGradientRect(model, -100, 0, 0, 1, 1, brighterColor, brighterColor); GuiUtils.drawGradientRect(model, -100, 0, 0, 1, 1, brighterColor, brighterColor);
GuiUtils.drawGradientRect(model, -100, 0, 1, 1, 2, 0xFF494949, 0xFF393939); GuiUtils.drawGradientRect(model, -100, 0, 1, 1, 2, 0xFF494949, 0xFF393939);
ms.popPose(); ms.popPose();
@ -143,7 +154,9 @@ public class TextWindowElement extends AnimatedOverlayElement {
for (int i = 0; i < lines.size(); i++) { for (int i = 0; i < lines.size(); i++) {
screen.getFontRenderer() screen.getFontRenderer()
.draw(ms, lines.get(i) .draw(ms, lines.get(i)
.getString(), targetX - 10, 3 + 9 * i, new Color(brighterColor).scaleAlpha(fade).getRGB()); .getString(), targetX - 10, 3 + 9 * i,
new Color(brighterColor).scaleAlpha(fade)
.getRGB());
} }
ms.popPose(); ms.popPose();
} }

View file

@ -23,8 +23,8 @@ public class HighlightValueBoxInstruction extends TickingInstruction {
AABB point = new AABB(vec, vec); AABB point = new AABB(vec, vec);
AABB expanded = point.inflate(expands.x, expands.y, expands.z); AABB expanded = point.inflate(expands.x, expands.y, expands.z);
scene.getOutliner() scene.getOutliner()
.chaseAABB(vec, remainingTicks == totalTicks ? point : expanded) .chaseAABB(vec, remainingTicks + 1 >= totalTicks ? point : expanded)
.lineWidth(1 / 32f) .lineWidth(1 / 15f)
.colored(PonderPalette.WHITE.getColor()); .colored(PonderPalette.WHITE.getColor());
} }

View file

@ -251,6 +251,7 @@
"create.gui.goggles.kinetic_stats": "Kinetic Stats:", "create.gui.goggles.kinetic_stats": "Kinetic Stats:",
"create.gui.goggles.at_current_speed": "at current speed", "create.gui.goggles.at_current_speed": "at current speed",
"create.gui.goggles.pole_length": "Pole Length:", "create.gui.goggles.pole_length": "Pole Length:",
"create.gui.goggles.basin_contents": "Basin Contents:",
"create.gui.goggles.fluid_container": "Fluid Container Info:", "create.gui.goggles.fluid_container": "Fluid Container Info:",
"create.gui.goggles.fluid_container.capacity": "Capacity: ", "create.gui.goggles.fluid_container.capacity": "Capacity: ",

View file

@ -24,57 +24,49 @@
"item.create.blaze_cake.tooltip.summary": "A Delicious treat for your hard-working _Blaze Burners_. Gets them all fired up!", "item.create.blaze_cake.tooltip.summary": "A Delicious treat for your hard-working _Blaze Burners_. Gets them all fired up!",
"item.create.wand_of_symmetry.tooltip": "SYMMETRY WAND", "item.create.wand_of_symmetry.tooltip": "SYMMETRY WAND",
"item.create.wand_of_symmetry.tooltip.summary": "Perfectly mirrors Block placement across configured planes.", "item.create.wand_of_symmetry.tooltip.summary": "_Mirrors Block placement_ while present in any _Hotbar Slot_.",
"item.create.wand_of_symmetry.tooltip.condition1": "When in Hotbar", "item.create.wand_of_symmetry.tooltip.condition1": "When used on a Surface",
"item.create.wand_of_symmetry.tooltip.behaviour1": "Stays Active", "item.create.wand_of_symmetry.tooltip.behaviour1": "_Creates_ or _Moves_ its Mirror. _Sneak_ while using to open the _Configuration Interface_",
"item.create.wand_of_symmetry.tooltip.control1": "R-Click on Ground", "item.create.wand_of_symmetry.tooltip.condition2": "When used with no target",
"item.create.wand_of_symmetry.tooltip.action1": "_Creates_ or _Moves_ the Mirror", "item.create.wand_of_symmetry.tooltip.behaviour2": "_Removes_ the active Mirror",
"item.create.wand_of_symmetry.tooltip.control2": "R-Click in the Air",
"item.create.wand_of_symmetry.tooltip.action2": "_Removes_ the active Mirror",
"item.create.wand_of_symmetry.tooltip.control3": "R-Click while Sneaking",
"item.create.wand_of_symmetry.tooltip.action3": "Opens the _Configuration Interface_",
"item.create.handheld_worldshaper.tooltip": "HANDHELD WORLDSHAPER", "item.create.handheld_worldshaper.tooltip": "HANDHELD WORLDSHAPER",
"item.create.handheld_worldshaper.tooltip.summary": "Handy tool for creating _landscapes_ and _terrain features_.", "item.create.handheld_worldshaper.tooltip.summary": "_Creative mode_ tool for large-scale _landscaping_ from a distance.",
"item.create.handheld_worldshaper.tooltip.control1": "L-Click at Block", "item.create.handheld_worldshaper.tooltip.condition1": "L-Click at Block",
"item.create.handheld_worldshaper.tooltip.action1": "Sets blocks placed by the tool to the targeted block.", "item.create.handheld_worldshaper.tooltip.behaviour1": "_Targeted block_ will become the _material_ placed by the shaper.",
"item.create.handheld_worldshaper.tooltip.control2": "R-Click at Block", "item.create.handheld_worldshaper.tooltip.condition2": "R-Click at Block",
"item.create.handheld_worldshaper.tooltip.action2": "Applies the currently selected _Brush_ and _Tool_ at the targeted location.", "item.create.handheld_worldshaper.tooltip.behaviour2": "Applies currently selected _Brush_ and _Tool_ at the targeted location.",
"item.create.handheld_worldshaper.tooltip.control3": "R-Click while Sneaking", "item.create.handheld_worldshaper.tooltip.condition3": "R-Click while Sneaking",
"item.create.handheld_worldshaper.tooltip.action3": "Opens the _Configuration Interface_", "item.create.handheld_worldshaper.tooltip.behaviour3": "Opens the _Configuration Interface_",
"item.create.tree_fertilizer.tooltip": "TREE FERTILIZER", "item.create.tree_fertilizer.tooltip": "TREE FERTILIZER",
"item.create.tree_fertilizer.tooltip.summary": "A powerful combination of minerals suitable for speeding up the growth of common tree types.", "item.create.tree_fertilizer.tooltip.summary": "A powerful combination of minerals useful for _growing saplings_ in tight spaces.",
"item.create.tree_fertilizer.tooltip.condition1": "When used on a Sapling", "item.create.tree_fertilizer.tooltip.condition1": "When used on a Sapling",
"item.create.tree_fertilizer.tooltip.behaviour1": "Grows Trees _regardless_ of their _spacing conditions_", "item.create.tree_fertilizer.tooltip.behaviour1": "Creates a tree _regardless_ of its _spacing conditions_",
"item.create.extendo_grip.tooltip": "EXTENDO GRIP", "item.create.extendo_grip.tooltip": "EXTENDO GRIP",
"item.create.extendo_grip.tooltip.summary": "Boioioing! Greatly _increases reach distance_ of the wielder. Can be powered with Air Pressure from a _Backtank_", "item.create.extendo_grip.tooltip.summary": "Greatly _increases reach distance_ of the wielder. Can be powered with _Air_ _Pressure_ from a _Backtank_",
"item.create.extendo_grip.tooltip.condition1": "When in Off-Hand", "item.create.extendo_grip.tooltip.condition1": "When in Off-Hand",
"item.create.extendo_grip.tooltip.behaviour1": "Increases _reach distance_ of items used in the _Main-Hand_.", "item.create.extendo_grip.tooltip.behaviour1": "Increases _reach distance_ of items used in the _Main-Hand_.",
"item.create.extendo_grip.tooltip.condition2": "While wearing Backtank", "item.create.extendo_grip.tooltip.condition2": "While wearing Backtank",
"item.create.extendo_grip.tooltip.behaviour2": "_No_ _Durability_ will be used. Instead, _Air_ _pressure_ is drained from the Tank", "item.create.extendo_grip.tooltip.behaviour2": "_No_ _Durability_ will be used. Instead, _Air_ _pressure_ is drained from the Tank",
"item.create.potato_cannon.tooltip": "POTATO CANNON", "item.create.potato_cannon.tooltip": "POTATO CANNON",
"item.create.potato_cannon.tooltip.summary": "Fwoomp! Launch your home-grown vegetables at your Enemies. Can be powered with Air Pressure from a _Backtank_", "item.create.potato_cannon.tooltip.summary": "Launches your home-grown vegetables at Enemies. Can be powered with _Air_ _Pressure_ from a _Backtank_",
"item.create.potato_cannon.tooltip.condition1": "When R-Clicked", "item.create.potato_cannon.tooltip.condition1": "When R-Clicked",
"item.create.potato_cannon.tooltip.behaviour1": "_Shoots_ a suitable item from your _Inventory_.", "item.create.potato_cannon.tooltip.behaviour1": "_Shoots_ a suitable item from your _Inventory_.",
"item.create.potato_cannon.tooltip.condition2": "While wearing Backtank", "item.create.potato_cannon.tooltip.condition2": "While wearing Backtank",
"item.create.potato_cannon.tooltip.behaviour2": "_No_ _Durability_ will be used. Instead, _Air_ _pressure_ is drained from the Tank", "item.create.potato_cannon.tooltip.behaviour2": "_No_ _Durability_ will be used. Instead, _Air_ _pressure_ is drained from the Tank",
"item.create.filter.tooltip": "FILTER", "item.create.filter.tooltip": "LIST FILTER",
"item.create.filter.tooltip.summary": "_Controls outputs_ and _inputs_ of logistical devices with more _precision_, matching them against a _set of items_ or several _nested filters_.", "item.create.filter.tooltip.summary": "_Matches items_ against a collection of _items_ or _other filters_. Can be used in _Filter Slots_ of Create's Components",
"item.create.filter.tooltip.condition1": "When in filter slot", "item.create.filter.tooltip.condition1": "When R-Clicked",
"item.create.filter.tooltip.behaviour1": "_Controls_ item flow according to its _configuration_.", "item.create.filter.tooltip.behaviour1": "Opens the _configuration interface_.",
"item.create.filter.tooltip.condition2": "When R-Clicked",
"item.create.filter.tooltip.behaviour2": "Opens the _configuration interface_.",
"item.create.attribute_filter.tooltip": "ATTRIBUTE FILTER", "item.create.attribute_filter.tooltip": "ATTRIBUTE FILTER",
"item.create.attribute_filter.tooltip.summary": "_Controls outputs_ and _inputs_ of logistical devices with more _precision_, matching them against a _set of_ item _attributes_ and _categories_.", "item.create.attribute_filter.tooltip.summary": "_Matches items_ against a set of _attributes_ or _categories_. Can be used in _Filter Slots_ of Create's Components",
"item.create.attribute_filter.tooltip.condition1": "When in filter slot", "item.create.attribute_filter.tooltip.condition1": "When R-Clicked",
"item.create.attribute_filter.tooltip.behaviour1": "_Controls_ item flow according to its _configuration_.", "item.create.attribute_filter.tooltip.behaviour1": "Opens the _configuration interface_.",
"item.create.attribute_filter.tooltip.condition2": "When R-Clicked",
"item.create.attribute_filter.tooltip.behaviour2": "Opens the _configuration interface_.",
"item.create.empty_schematic.tooltip": "EMPTY SCHEMATIC", "item.create.empty_schematic.tooltip": "EMPTY SCHEMATIC",
"item.create.empty_schematic.tooltip.summary": "Used as a recipe ingredient and for writing at the _Schematic Table_.", "item.create.empty_schematic.tooltip.summary": "Used as a recipe ingredient and for writing at the _Schematic Table_.",
@ -83,21 +75,15 @@
"item.create.schematic.tooltip.summary": "Holds a structure to be positioned and placed into the world. Position the Hologram as desired and use a _Schematicannon_ to build it.", "item.create.schematic.tooltip.summary": "Holds a structure to be positioned and placed into the world. Position the Hologram as desired and use a _Schematicannon_ to build it.",
"item.create.schematic.tooltip.condition1": "When Held", "item.create.schematic.tooltip.condition1": "When Held",
"item.create.schematic.tooltip.behaviour1": "Can be positioned using the Tools on Screen.", "item.create.schematic.tooltip.behaviour1": "Can be positioned using the Tools on Screen.",
"item.create.schematic.tooltip.control1": "R-Click while Sneaking", "item.create.schematic.tooltip.condition2": "R-Click while Sneaking",
"item.create.schematic.tooltip.action1": "Opens an _Interface_ for entering exact _Coordinates_.", "item.create.schematic.tooltip.behaviour2": "Opens an _Interface_ for entering exact _Coordinates_.",
"item.create.schematic_and_quill.tooltip": "SCHEMATIC AND QUILL", "item.create.schematic_and_quill.tooltip": "SCHEMATIC AND QUILL",
"item.create.schematic_and_quill.tooltip.summary": "Used for saving a Structure in your world to a .nbt file.", "item.create.schematic_and_quill.tooltip.summary": "Used for _saving a Structure_ in your world to a _.nbt file_.",
"item.create.schematic_and_quill.tooltip.condition1": "Step 1", "item.create.schematic_and_quill.tooltip.condition1": "Creating a selection",
"item.create.schematic_and_quill.tooltip.behaviour1": "Select two corner points using R-Click.", "item.create.schematic_and_quill.tooltip.behaviour1": "Select two _corner points_ using _R-Click_. Hold _Ctrl_ and Scroll to select locations mid-air.",
"item.create.schematic_and_quill.tooltip.condition2": "Step 2", "item.create.schematic_and_quill.tooltip.condition2": "Adjusting and Saving",
"item.create.schematic_and_quill.tooltip.behaviour2": "_Ctrl-Scroll_ on the faces to adjust the size. R-Click again to Save.", "item.create.schematic_and_quill.tooltip.behaviour2": "_Ctrl-Scroll_ on the faces to adjust the size, then R-Click again to Save.",
"item.create.schematic_and_quill.tooltip.control1": "R-Click",
"item.create.schematic_and_quill.tooltip.action1": "Select a corner point / confirm save.",
"item.create.schematic_and_quill.tooltip.control2": "Ctrl Held",
"item.create.schematic_and_quill.tooltip.action2": "Select points in _mid-air_. _Scroll_ to adjust the distance.",
"item.create.schematic_and_quill.tooltip.control3": "R-Click while Sneaking",
"item.create.schematic_and_quill.tooltip.action3": "_Resets_ and removes the selection.",
"block.create.schematicannon.tooltip": "SCHEMATICANNON", "block.create.schematicannon.tooltip": "SCHEMATICANNON",
"block.create.schematicannon.tooltip.summary": "Shoots blocks to recreate a deployed _Schematic_ in the World. Uses items from adjacent Inventories and _Gunpowder_ as fuel.", "block.create.schematicannon.tooltip.summary": "Shoots blocks to recreate a deployed _Schematic_ in the World. Uses items from adjacent Inventories and _Gunpowder_ as fuel.",
@ -110,20 +96,16 @@
"block.create.schematic_table.tooltip.behaviour1": "Uploads a chosen File from your Schematics Folder.", "block.create.schematic_table.tooltip.behaviour1": "Uploads a chosen File from your Schematics Folder.",
"item.create.goggles.tooltip": "GOGGLES", "item.create.goggles.tooltip": "GOGGLES",
"item.create.goggles.tooltip.summary": "A pair of glasses to augment your vision with useful _kinetic information_.", "item.create.goggles.tooltip.summary": "Augments your HUD with _miscellaneous information_ about placed components.",
"item.create.goggles.tooltip.condition1": "When worn", "item.create.goggles.tooltip.condition1": "When looking at blocks",
"item.create.goggles.tooltip.behaviour1": "Shows _colored indicators_ corresponding to the _Speed Level_ of a placed kinetic component as well as _Stress Impact_ and _Capacity_ of individual components.", "item.create.goggles.tooltip.behaviour1": "_Kinetic components_ show added _Stress Impact_ or _Capacity_. _Stressometers_ show statistics of their _attached kinetic network_. Some other blocks reveal information such as item and fluid content.",
"item.create.goggles.tooltip.condition2": "When looking at gauge",
"item.create.goggles.tooltip.behaviour2": "Shows detailed information about _Speed_ or _Stress_ of the network to which the gauge is connected.",
"item.create.goggles.tooltip.condition3": "When looking at fluid containers",
"item.create.goggles.tooltip.behaviour3": "Shows detailed information about the _Capacity_ of the block and any _Fluids_ stored within.",
"item.create.wrench.tooltip": "WRENCH", "item.create.wrench.tooltip": "WRENCH",
"item.create.wrench.tooltip.summary": "A useful tool for working on kinetic contraptions. Can be used to _Rotate_, _Dismantle_ and to _Configure_ components.", "item.create.wrench.tooltip.summary": "Multi-purpose tool for working with your kinetic contraptions.",
"item.create.wrench.tooltip.control1": "Right-Click a kinetic block", "item.create.wrench.tooltip.condition1": "When used on Blocks",
"item.create.wrench.tooltip.action1": "_Rotates components_ toward or away from the face with which you interacted.", "item.create.wrench.tooltip.behaviour1": "_Rotates components_ around the clicked face. _Sneak_ while interacting to _dismantle_ components.",
"item.create.wrench.tooltip.control2": "R-Click while Sneaking", "item.create.wrench.tooltip.condition2": "When used on Contraptions",
"item.create.wrench.tooltip.action2": "_Disassembles Kinetic components_ and places them back in _your inventory_.", "item.create.wrench.tooltip.behaviour2": "_Relocates_ assembled minecart- and train-based contraptions.",
"block.create.nozzle.tooltip": "NOZZLE", "block.create.nozzle.tooltip": "NOZZLE",
"block.create.nozzle.tooltip.summary": "Attach to the front of an _Encased Fan_ to distribute its effect on Entities in _all directions_.", "block.create.nozzle.tooltip.summary": "Attach to the front of an _Encased Fan_ to distribute its effect on Entities in _all directions_.",
@ -134,7 +116,7 @@
"block.create.cuckoo_clock.tooltip.behaviour1": "Shows the _current time_ and plays a tune twice a day. _Activates_ once at _noon_ and at dusk, as soon as _players can sleep_.", "block.create.cuckoo_clock.tooltip.behaviour1": "Shows the _current time_ and plays a tune twice a day. _Activates_ once at _noon_ and at dusk, as soon as _players can sleep_.",
"block.create.turntable.tooltip": "TURNTABLE", "block.create.turntable.tooltip": "TURNTABLE",
"block.create.turntable.tooltip.summary": "Turns _Rotational Force_ into refined Motion Sickness.", "block.create.turntable.tooltip.summary": "Uses _Rotational Force_ to create Motion Sickness.",
"block.create.toolbox.tooltip": "TOOLBOX", "block.create.toolbox.tooltip": "TOOLBOX",
"block.create.toolbox.tooltip.summary": "Every Inventors' dearest Companion. Conveniently _holds_ a large amount of _8 Different_ item types.", "block.create.toolbox.tooltip.summary": "Every Inventors' dearest Companion. Conveniently _holds_ a large amount of _8 Different_ item types.",
@ -145,51 +127,29 @@
"block.create.toolbox.tooltip.condition3": "When R-Clicked", "block.create.toolbox.tooltip.condition3": "When R-Clicked",
"block.create.toolbox.tooltip.behaviour3": "Opens the _Container Interface_.", "block.create.toolbox.tooltip.behaviour3": "Opens the _Container Interface_.",
"block.create.stockpile_switch.tooltip": "STOCKPILE SWITCH",
"block.create.stockpile_switch.tooltip.summary": "Toggles a Redstone signal based on the amount of _Stored Items_ or _Fluids_ in the attached Container. Comes with a handy filter. As opposed to a _Comparator,_ the _Stockpile Switch_ allows configuration of _thresholds,_ at which signals are inverted.",
"block.create.stockpile_switch.tooltip.condition1": "When R-Clicked",
"block.create.stockpile_switch.tooltip.behaviour1": "Opens the _Configuration Interface_.",
"block.create.content_observer.tooltip": "CONTENT OBSERVER",
"block.create.content_observer.tooltip.summary": "_Detects Items_ or _Fluids_ inside _containers_, _pipes_ or _conveyors_ matching a configured _filter_.",
"block.create.content_observer.tooltip.condition1": "When observing a Container",
"block.create.content_observer.tooltip.behaviour1": "Emits a _Redstone Signal_ while the observed container has _matching_ _content_.",
"block.create.content_observer.tooltip.condition2": "When observing a Funnel",
"block.create.content_observer.tooltip.behaviour2": "Emits a _Redstone Pulse_ when a _matching_ Item is _transferred_.",
"block.create.creative_crate.tooltip": "CREATIVE CRATE", "block.create.creative_crate.tooltip": "CREATIVE CRATE",
"block.create.creative_crate.tooltip.summary": "This _Storage Container_ allows infinite replication of any item. Place next to a _Schematicannon_ to remove any material requirements.", "block.create.creative_crate.tooltip.summary": "This _Storage Container_ allows infinite replication of items.",
"block.create.creative_crate.tooltip.condition1": "When Item in Filter Slot", "block.create.creative_crate.tooltip.condition1": "When Item in Filter Slot",
"block.create.creative_crate.tooltip.behaviour1": "Anything _extracting_ from this container will provide an _endless supply_ of the item specified. Items _inserted_ into this crate will be _voided._", "block.create.creative_crate.tooltip.behaviour1": "Anything _extracting_ from this container will provide an _endless supply_ of the item specified. Items _inserted_ into this crate will be _voided._",
"block.create.creative_crate.tooltip.condition2": "When next to Schematicannon",
"block.create.creative_crate.tooltip.behaviour2": "Provides any material required by the Schematic.",
"item.create.creative_blaze_cake.tooltip": "CREATIVE CAKE", "item.create.creative_blaze_cake.tooltip": "CREATIVE BLAZE CAKE",
"item.create.creative_blaze_cake.tooltip.summary": "A very special treat for your _Blaze Burners_. After eating this cake, Blaze Burners will _never run out of fuel_.", "item.create.creative_blaze_cake.tooltip.summary": "A very special treat for your _Blaze Burners_. After eating this cake, Blaze Burners will _never run out of fuel_.",
"item.create.creative_blaze_cake.tooltip.condition1": "When Used", "item.create.creative_blaze_cake.tooltip.condition1": "When Used",
"item.create.creative_blaze_cake.tooltip.behaviour1": "_Cycles_ a Blaze Burner's heat level.", "item.create.creative_blaze_cake.tooltip.behaviour1": "_Cycles_ a Blaze Burner's heat level.",
"block.create.controller_rail.tooltip": "CONTROLLER RAIL", "block.create.controller_rail.tooltip": "CONTROLLER RAIL",
"block.create.controller_rail.tooltip.summary": "A _uni-directional powered rail_ capable of _fine control_ over a minecarts' _movement speed_.", "block.create.controller_rail.tooltip.summary": "A _uni-directional_ powered rail with _variable speed_, controlled by the _signal strength_ supplied to it.",
"block.create.controller_rail.tooltip.condition1": "When Powered by Redstone",
"block.create.controller_rail.tooltip.behaviour1": "_Accelerates_ or _Decelerates_ passing _minecarts_ corresponding to the _signal strength_. Propagates redstone power to adjacent controller rails. Powering two controller rails with different strengths will cause tracks between them to interpolate their signal.",
"item.create.sand_paper.tooltip": "SAND PAPER", "item.create.sand_paper.tooltip": "SAND PAPER",
"item.create.sand_paper.tooltip.summary": "A rough paper that can be used to _polish materials_. Can be automatically applied using the Deployer.", "item.create.sand_paper.tooltip.summary": "Can be used to _refine materials_. The process can be automated with a Deployer.",
"item.create.sand_paper.tooltip.condition1": "When Used", "item.create.sand_paper.tooltip.condition1": "When Used",
"item.create.sand_paper.tooltip.behaviour1": "Applies polish to items held in the _offhand_ or lying on the _floor_ when _looking at them_", "item.create.sand_paper.tooltip.behaviour1": "Applies polish to items held in the _offhand_ or lying on the _floor_ when _looking at them_",
"item.create.builders_tea.tooltip": "BUILDERS TEA", "item.create.builders_tea.tooltip": "BUILDERS TEA",
"item.create.builders_tea.tooltip.summary": "The perfect drink to get the day started- _Motivating_ and _Saturating._", "item.create.builders_tea.tooltip.summary": "The perfect drink to get the day started- _Motivating_ and _Saturating._",
"item.create.refined_radiance.tooltip": "REFINED RADIANCE",
"item.create.refined_radiance.tooltip.summary": "A Chromatic material forged from _absorbed light_.",
"item.create.refined_radiance.tooltip.condition1": "Work In Progress",
"item.create.refined_radiance.tooltip.behaviour1": "Usages for this material will be available in a future release.",
"item.create.shadow_steel.tooltip": "SHADOW STEEL",
"item.create.shadow_steel.tooltip.summary": "A Chromatic material forged _in the void_.",
"item.create.shadow_steel.tooltip.condition1": "Work In Progress",
"item.create.shadow_steel.tooltip.behaviour1": "Usages for this material will be available in a future release.",
"item.create.linked_controller.tooltip": "LINKED CONTROLLER", "item.create.linked_controller.tooltip": "LINKED CONTROLLER",
"item.create.linked_controller.tooltip.summary": "Grants _handheld_ _control_ over _Redstone Link_ frequencies assigned to its _six_ _buttons_.", "item.create.linked_controller.tooltip.summary": "Grants _handheld_ _control_ over _Redstone Link_ frequencies assigned to its _six_ _buttons_.",
"item.create.linked_controller.tooltip.condition1": "R-Click", "item.create.linked_controller.tooltip.condition1": "R-Click",
@ -200,11 +160,16 @@
"item.create.linked_controller.tooltip.behaviour3": "Enables _Bind Mode_, press one of the _six controls_ to bind it to the _Links' Frequency_.", "item.create.linked_controller.tooltip.behaviour3": "Enables _Bind Mode_, press one of the _six controls_ to bind it to the _Links' Frequency_.",
"item.create.linked_controller.tooltip.condition4": "R-Click on Lectern", "item.create.linked_controller.tooltip.condition4": "R-Click on Lectern",
"item.create.linked_controller.tooltip.behaviour4": "Places the Controller into the Lectern for easy activation. (R-Click while Sneaking to retrieve it)", "item.create.linked_controller.tooltip.behaviour4": "Places the Controller into the Lectern for easy activation. (R-Click while Sneaking to retrieve it)",
"item.create.diving_helmet.tooltip": "DIVING HELMET", "item.create.copper_diving_helmet.tooltip": "COPPER DIVING HELMET",
"item.create.diving_helmet.tooltip.summary": "Together with a _Backtank_, allows the wielder to _breathe_ _underwater_ for an extended amount of time.", "item.create.copper_diving_helmet.tooltip.summary": "Together with a _Backtank_, allows the wielder to _breathe_ _underwater_ for an extended amount of time.",
"item.create.diving_helmet.tooltip.condition1": "When Worn", "item.create.copper_diving_helmet.tooltip.condition1": "When Worn",
"item.create.diving_helmet.tooltip.behaviour1": "Provides the _Water Breathing_ effect, slowly draining _Air Pressure_ from the Backtank.", "item.create.copper_diving_helmet.tooltip.behaviour1": "Provides the _Water Breathing_ effect, slowly draining _Air Pressure_ from the Backtank.",
"item.create.netherite_diving_helmet.tooltip": "NETHERITE DIVING HELMET",
"item.create.netherite_diving_helmet.tooltip.summary": "Together with a _Netherite Backtank_, this can protect you from _extreme heat_. To be effective, _Legs and Feet_ have to be covered in _Netherite_, too.",
"item.create.netherite_diving_helmet.tooltip.condition1": "When Worn (Full set)",
"item.create.netherite_diving_helmet.tooltip.behaviour1": "Provides immunity to _Fire_ and _Lava_, slowly draining _Air Pressure_ from the Backtank. Also grants _improved vision_ in Lava",
"item.create.copper_backtank.tooltip": "COPPER BACKTANK", "item.create.copper_backtank.tooltip": "COPPER BACKTANK",
"item.create.copper_backtank.tooltip.summary": "A _Wearable_ _Tank_ for carrying Pressurized Air.", "item.create.copper_backtank.tooltip.summary": "A _Wearable_ _Tank_ for carrying Pressurized Air.",
@ -232,10 +197,15 @@
"block.create.flywheel.tooltip.condition1": "When Powered by Kinetics", "block.create.flywheel.tooltip.condition1": "When Powered by Kinetics",
"block.create.flywheel.tooltip.behaviour1": "Starts spinning.", "block.create.flywheel.tooltip.behaviour1": "Starts spinning.",
"item.create.diving_boots.tooltip": "DIVING BOOTS", "item.create.copper_diving_boots.tooltip": "COPPER DIVING BOOTS",
"item.create.diving_boots.tooltip.summary": "A pair of _heavy_ _boots_, allowing for better traversal of the Ocean floor.", "item.create.copper_diving_boots.tooltip.summary": "A pair of _heavy_ _boots_, allowing for better traversal of the Ocean floor.",
"item.create.diving_boots.tooltip.condition1": "When Worn", "item.create.copper_diving_boots.tooltip.condition1": "When Worn",
"item.create.diving_boots.tooltip.behaviour1": "Wielder _sinks_ _faster_ and _cannot_ _swim_. Grants the ability to _walk_ and _jump_ underwater. Wielder also is no longer affected by _Mechanical_ _Belts_.", "item.create.copper_diving_boots.tooltip.behaviour1": "Wielder _sinks_ _faster_ and _cannot_ _swim_. Grants the ability to _walk_ and _jump_ underwater. Wielder also is no longer affected by _Mechanical_ _Belts_.",
"item.create.netherite_diving_boots.tooltip": "NETHERITE DIVING BOOTS",
"item.create.netherite_diving_boots.tooltip.summary": "A pair of _heavy_ _boots_, allowing for better traversal of the Ocean floor, including Oceans made of Lava.",
"item.create.netherite_diving_boots.tooltip.condition1": "When Worn",
"item.create.netherite_diving_boots.tooltip.behaviour1": "Wielder _sinks_ _faster_ and _cannot_ _swim_. Grants the ability to _walk_ and _jump_ underwater. Wielder also is no longer affected by _Mechanical_ _Belts_.",
"item.create.crafting_blueprint.tooltip": "CRAFTING BLUEPRINT", "item.create.crafting_blueprint.tooltip": "CRAFTING BLUEPRINT",
"item.create.crafting_blueprint.tooltip.summary": "_Placed_ on a wall, it can be used to _specify_ _ingredient_ _arrangements_ for easier manual crafting. Each slot represents a Recipe.", "item.create.crafting_blueprint.tooltip.summary": "_Placed_ on a wall, it can be used to _specify_ _ingredient_ _arrangements_ for easier manual crafting. Each slot represents a Recipe.",
@ -245,21 +215,36 @@
"item.create.crafting_blueprint.behaviour2": "_Applies_ the _configured_ _recipe_ with matching Ingredients found in your _Inventory_. _Sneak_ to craft up to a _Stack_ of items.", "item.create.crafting_blueprint.behaviour2": "_Applies_ the _configured_ _recipe_ with matching Ingredients found in your _Inventory_. _Sneak_ to craft up to a _Stack_ of items.",
"item.create.minecart_coupling.tooltip": "MINECART COUPLING", "item.create.minecart_coupling.tooltip": "MINECART COUPLING",
"item.create.minecart_coupling.tooltip.summary": "_Chains_ all your _Minecarts_ or _Carriage Contraptions_ together to form a majestic Train.", "item.create.minecart_coupling.tooltip.summary": "_Chains_ together individual _Minecarts_, causing them to move as a group.",
"item.create.minecart_coupling.tooltip.condition1": "When Used on Minecart",
"item.create.minecart_coupling.tooltip.behaviour1": "_Couples_ two Minecarts together, attempting to keep them at a _constant distance_ while moving.",
"item.create.experience_nugget.tooltip": "NUGGET OF EXPERIENCE", "item.create.experience_nugget.tooltip": "NUGGET OF EXPERIENCE",
"item.create.experience_nugget.tooltip.summary": "_Ding!_ A speck of _inspiration_ from your fantastic inventions.", "item.create.experience_nugget.tooltip.summary": "A speck of _inspiration_ from your fantastic inventions.",
"item.create.experience_nugget.tooltip.condition1": "When Used", "item.create.experience_nugget.tooltip.condition1": "When Used",
"item.create.experience_nugget.tooltip.behaviour1": "_Redeems_ _Experience_ points contained within.", "item.create.experience_nugget.tooltip.behaviour1": "_Redeems_ _Experience_ points contained within.",
"block.create.peculiar_bell.tooltip": "PECULIAR BELL", "block.create.peculiar_bell.tooltip": "PECULIAR BELL",
"block.create.peculiar_bell.tooltip.summary": "A decorative _Brass Bell_. Placing it right above open _Soul Fire_ may cause side-effects...", "block.create.peculiar_bell.tooltip.summary": "A decorative _Brass Bell_. Placing it right above open _Soul Fire_ may have side-effects...",
"block.create.haunted_bell.tooltip": "HAUNTED BELL", "block.create.haunted_bell.tooltip": "HAUNTED BELL",
"block.create.haunted_bell.tooltip.summary": "A _Cursed Bell_ haunted by lost souls of the Nether.", "block.create.haunted_bell.tooltip.summary": "A _Cursed Bell_ haunted by lost souls of the Nether.",
"block.create.haunted_bell.tooltip.condition1": "When Held or Rang", "block.create.haunted_bell.tooltip.condition1": "When Held or Rang",
"block.create.haunted_bell.tooltip.behaviour1": "Highlights nearby _Lightless Spots_ on which _Hostile Mobs_ can spawn." "block.create.haunted_bell.tooltip.behaviour1": "Highlights nearby _Lightless Spots_ on which _Hostile Mobs_ can spawn.",
"block.create.copycat_panel.tooltip": "COPYCAT PANEL",
"block.create.copycat_panel.tooltip.summary": "_Converts_ any _full block_ into a decorative panel. Also accepts _Bars_ and _Trapdoors_.",
"block.create.copycat_panel.tooltip.condition1": "When R-Clicked",
"block.create.copycat_panel.tooltip.behaviour1": "Applies _held item_ as its _material_ if possible. _Click again_ to cycle _orientation_ or _powered_ state. Use a _Wrench_ to _reset_ the material.",
"block.create.copycat_step.tooltip": "COPYCAT STEP",
"block.create.copycat_step.tooltip.summary": "_Converts_ any _full block_ into a decorative step.",
"block.create.copycat_step.tooltip.condition1": "When R-Clicked",
"block.create.copycat_step.tooltip.behaviour1": "Applies _held item_ as its _material_ if possible. _Click again_ to cycle _orientation_ or _powered_ state. Use a _Wrench_ to _reset_ the material.",
"block.create.clipboard.tooltip": "CLIPBOARD",
"block.create.clipboard.tooltip.summary": "_Keeps your notes_ and makes you look more professional.",
"block.create.clipboard.tooltip.condition1": "When R-Clicked",
"block.create.clipboard.tooltip.behaviour1": "Opens the _Interface_. _Sneak-Click_ to _place_ it on a surface.",
"block.create.clipboard.tooltip.condition2": "When Used on Blocks",
"block.create.clipboard.tooltip.behaviour2": "Some blocks' _settings_, such as filters, can be _copied (R-Click)_ and _applied (L-Click)_ elsewhere."
} }

View file

@ -13,9 +13,9 @@
"to": [9.5, 17, 11], "to": [9.5, 17, 11],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 6.5]}, "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 6.5]},
"faces": { "faces": {
"north": {"uv": [6, 3, 15, 4.5], "rotation": 270, "texture": "#5"}, "north": {"uv": [0, 8.5, 9, 10], "rotation": 90, "texture": "#5"},
"east": {"uv": [0, 10, 9, 13], "rotation": 270, "texture": "#5"}, "east": {"uv": [0, 10, 9, 13], "rotation": 270, "texture": "#5"},
"south": {"uv": [6, 3, 15, 4.5], "rotation": 90, "texture": "#5"}, "south": {"uv": [0, 8.5, 9, 10], "rotation": 90, "texture": "#5"},
"west": {"uv": [0, 10, 9, 13], "rotation": 90, "texture": "#5"}, "west": {"uv": [0, 10, 9, 13], "rotation": 90, "texture": "#5"},
"up": {"uv": [9, 10, 10.5, 13], "rotation": 180, "texture": "#5"}, "up": {"uv": [9, 10, 10.5, 13], "rotation": 180, "texture": "#5"},
"down": {"uv": [9, 10, 10.5, 13], "texture": "#5"} "down": {"uv": [9, 10, 10.5, 13], "texture": "#5"}
@ -27,9 +27,9 @@
"to": [9.5, 17, 11], "to": [9.5, 17, 11],
"rotation": {"angle": 45, "axis": "z", "origin": [8, 8, 6.5]}, "rotation": {"angle": 45, "axis": "z", "origin": [8, 8, 6.5]},
"faces": { "faces": {
"north": {"uv": [6, 3, 15, 4.5], "rotation": 270, "texture": "#5"}, "north": {"uv": [0, 8.5, 9, 10], "rotation": 90, "texture": "#5"},
"east": {"uv": [0, 10, 9, 13], "rotation": 270, "texture": "#5"}, "east": {"uv": [0, 10, 9, 13], "rotation": 270, "texture": "#5"},
"south": {"uv": [6, 3, 15, 4.5], "rotation": 90, "texture": "#5"}, "south": {"uv": [0, 8.5, 9, 10], "rotation": 90, "texture": "#5"},
"west": {"uv": [0, 10, 9, 13], "rotation": 90, "texture": "#5"}, "west": {"uv": [0, 10, 9, 13], "rotation": 90, "texture": "#5"},
"up": {"uv": [9, 10, 10.5, 13], "rotation": 180, "texture": "#5"}, "up": {"uv": [9, 10, 10.5, 13], "rotation": 180, "texture": "#5"},
"down": {"uv": [9, 10, 10.5, 13], "texture": "#5"} "down": {"uv": [9, 10, 10.5, 13], "texture": "#5"}
@ -41,9 +41,9 @@
"to": [17, 9.5, 11], "to": [17, 9.5, 11],
"rotation": {"angle": 45, "axis": "z", "origin": [8, 8, 6.5]}, "rotation": {"angle": 45, "axis": "z", "origin": [8, 8, 6.5]},
"faces": { "faces": {
"north": {"uv": [6, 3, 15, 4.5], "texture": "#5"}, "north": {"uv": [0, 8.5, 9, 10], "texture": "#5"},
"east": {"uv": [9, 10, 10.5, 13], "rotation": 270, "texture": "#5"}, "east": {"uv": [9, 10, 10.5, 13], "rotation": 270, "texture": "#5"},
"south": {"uv": [6, 3, 15, 4.5], "texture": "#5"}, "south": {"uv": [0, 8.5, 9, 10], "texture": "#5"},
"west": {"uv": [9, 10, 10.5, 13], "rotation": 90, "texture": "#5"}, "west": {"uv": [9, 10, 10.5, 13], "rotation": 90, "texture": "#5"},
"up": {"uv": [0, 10, 9, 13], "rotation": 180, "texture": "#5"}, "up": {"uv": [0, 10, 9, 13], "rotation": 180, "texture": "#5"},
"down": {"uv": [0, 10, 9, 13], "texture": "#5"} "down": {"uv": [0, 10, 9, 13], "texture": "#5"}
@ -55,9 +55,9 @@
"to": [17, 9.5, 11], "to": [17, 9.5, 11],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 6.5]}, "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 6.5]},
"faces": { "faces": {
"north": {"uv": [6, 3, 15, 4.5], "texture": "#5"}, "north": {"uv": [0, 8.5, 9, 10], "texture": "#5"},
"east": {"uv": [9, 10, 10.5, 13], "rotation": 270, "texture": "#5"}, "east": {"uv": [9, 10, 10.5, 13], "rotation": 270, "texture": "#5"},
"south": {"uv": [6, 3, 15, 4.5], "texture": "#5"}, "south": {"uv": [0, 8.5, 9, 10], "texture": "#5"},
"west": {"uv": [9, 10, 10.5, 13], "rotation": 90, "texture": "#5"}, "west": {"uv": [9, 10, 10.5, 13], "rotation": 90, "texture": "#5"},
"up": {"uv": [0, 10, 9, 13], "rotation": 180, "texture": "#5"}, "up": {"uv": [0, 10, 9, 13], "rotation": 180, "texture": "#5"},
"down": {"uv": [0, 10, 9, 13], "texture": "#5"} "down": {"uv": [0, 10, 9, 13], "texture": "#5"}

View file

@ -4,7 +4,6 @@
"textures": { "textures": {
"0": "create:block/gearbox", "0": "create:block/gearbox",
"5": "create:block/millstone", "5": "create:block/millstone",
"8": "create:block/andesite_casing",
"particle": "create:block/palettes/stone_types/cap/andesite_cut_cap" "particle": "create:block/palettes/stone_types/cap/andesite_cut_cap"
}, },
"elements": [ "elements": [
@ -17,7 +16,7 @@
"east": {"uv": [7, 13, 8, 16], "texture": "#5"}, "east": {"uv": [7, 13, 8, 16], "texture": "#5"},
"south": {"uv": [0, 13, 8, 16], "texture": "#5"}, "south": {"uv": [0, 13, 8, 16], "texture": "#5"},
"west": {"uv": [0, 13, 1, 16], "texture": "#5"}, "west": {"uv": [0, 13, 1, 16], "texture": "#5"},
"up": {"uv": [0, 0, 16, 2], "texture": "#8"}, "up": {"uv": [0, 13, 8, 14], "texture": "#5"},
"down": {"uv": [0, 14, 16, 16], "texture": "#0"} "down": {"uv": [0, 14, 16, 16], "texture": "#0"}
} }
}, },
@ -30,7 +29,7 @@
"east": {"uv": [8, 13, 7, 16], "texture": "#5"}, "east": {"uv": [8, 13, 7, 16], "texture": "#5"},
"south": {"uv": [8, 13, 0, 16], "texture": "#5"}, "south": {"uv": [8, 13, 0, 16], "texture": "#5"},
"west": {"uv": [1, 13, 0, 16], "texture": "#5"}, "west": {"uv": [1, 13, 0, 16], "texture": "#5"},
"up": {"uv": [0, 0, 16, 2], "rotation": 180, "texture": "#8"}, "up": {"uv": [0, 13, 8, 14], "rotation": 180, "texture": "#5"},
"down": {"uv": [0, 16, 16, 14], "texture": "#0"} "down": {"uv": [0, 16, 16, 14], "texture": "#0"}
} }
}, },
@ -40,7 +39,7 @@
"faces": { "faces": {
"east": {"uv": [1, 13, 7, 16], "texture": "#5"}, "east": {"uv": [1, 13, 7, 16], "texture": "#5"},
"west": {"uv": [1, 13, 7, 16], "texture": "#5"}, "west": {"uv": [1, 13, 7, 16], "texture": "#5"},
"up": {"uv": [0, 14, 2, 2], "texture": "#8"}, "up": {"uv": [1, 13, 7, 14], "rotation": 270, "texture": "#5"},
"down": {"uv": [0, 2, 2, 14], "texture": "#0"} "down": {"uv": [0, 2, 2, 14], "texture": "#0"}
} }
}, },
@ -50,7 +49,7 @@
"faces": { "faces": {
"east": {"uv": [7, 13, 1, 16], "texture": "#5"}, "east": {"uv": [7, 13, 1, 16], "texture": "#5"},
"west": {"uv": [7, 13, 1, 16], "texture": "#5"}, "west": {"uv": [7, 13, 1, 16], "texture": "#5"},
"up": {"uv": [0, 14, 2, 2], "rotation": 180, "texture": "#8"}, "up": {"uv": [1, 13, 7, 14], "rotation": 90, "texture": "#5"},
"down": {"uv": [2, 2, 0, 14], "texture": "#0"} "down": {"uv": [2, 2, 0, 14], "texture": "#0"}
} }
}, },
@ -63,15 +62,15 @@
} }
}, },
{ {
"from": [3, 12, 3], "from": [2, 12, 2],
"to": [13, 16, 13], "to": [14, 16, 14],
"faces": { "faces": {
"north": {"uv": [11, 9, 16, 11], "texture": "#5"}, "north": {"uv": [10, 8, 16, 10], "texture": "#5"},
"east": {"uv": [11, 9, 16, 11], "texture": "#5"}, "east": {"uv": [10, 8, 16, 10], "texture": "#5"},
"south": {"uv": [11, 9, 16, 11], "texture": "#5"}, "south": {"uv": [10, 8, 16, 10], "texture": "#5"},
"west": {"uv": [11, 9, 16, 11], "texture": "#5"}, "west": {"uv": [10, 8, 16, 10], "texture": "#5"},
"up": {"uv": [16, 11, 11, 16], "texture": "#5"}, "up": {"uv": [16, 2, 10, 8], "texture": "#5"},
"down": {"uv": [16, 11, 11, 16], "texture": "#5"} "down": {"uv": [16, 2, 10, 8], "texture": "#5"}
} }
} }
], ],

View file

@ -19,8 +19,8 @@
"east": {"uv": [0, 10, 9, 13], "texture": "#5"}, "east": {"uv": [0, 10, 9, 13], "texture": "#5"},
"south": {"uv": [9, 10, 10.5, 13], "texture": "#5"}, "south": {"uv": [9, 10, 10.5, 13], "texture": "#5"},
"west": {"uv": [0, 10, 9, 13], "texture": "#5"}, "west": {"uv": [0, 10, 9, 13], "texture": "#5"},
"up": {"uv": [6, 3, 15, 4.5], "rotation": 90, "texture": "#5"}, "up": {"uv": [0, 8.5, 9, 10], "rotation": 90, "texture": "#5"},
"down": {"uv": [6, 3, 15, 4.5], "rotation": 90, "texture": "#5"} "down": {"uv": [0, 8.5, 9, 10], "rotation": 90, "texture": "#5"}
} }
}, },
{ {
@ -33,8 +33,8 @@
"east": {"uv": [0, 10, 9, 13], "texture": "#5"}, "east": {"uv": [0, 10, 9, 13], "texture": "#5"},
"south": {"uv": [9, 10, 10.5, 13], "texture": "#5"}, "south": {"uv": [9, 10, 10.5, 13], "texture": "#5"},
"west": {"uv": [0, 10, 9, 13], "texture": "#5"}, "west": {"uv": [0, 10, 9, 13], "texture": "#5"},
"up": {"uv": [6, 3, 15, 4.5], "rotation": 90, "texture": "#5"}, "up": {"uv": [0, 8.5, 9, 10], "rotation": 90, "texture": "#5"},
"down": {"uv": [6, 3, 15, 4.5], "rotation": 90, "texture": "#5"} "down": {"uv": [0, 8.5, 9, 10], "rotation": 90, "texture": "#5"}
} }
}, },
{ {
@ -47,8 +47,8 @@
"east": {"uv": [9, 10, 10.5, 13], "texture": "#5"}, "east": {"uv": [9, 10, 10.5, 13], "texture": "#5"},
"south": {"uv": [0, 10, 9, 13], "texture": "#5"}, "south": {"uv": [0, 10, 9, 13], "texture": "#5"},
"west": {"uv": [9, 10, 10.5, 13], "texture": "#5"}, "west": {"uv": [9, 10, 10.5, 13], "texture": "#5"},
"up": {"uv": [6, 3, 15, 4.5], "texture": "#5"}, "up": {"uv": [0, 8.5, 9, 10], "texture": "#5"},
"down": {"uv": [6, 3, 15, 4.5], "rotation": 180, "texture": "#5"} "down": {"uv": [0, 8.5, 9, 10], "rotation": 180, "texture": "#5"}
} }
}, },
{ {
@ -61,8 +61,8 @@
"east": {"uv": [9, 10, 10.5, 13], "texture": "#5"}, "east": {"uv": [9, 10, 10.5, 13], "texture": "#5"},
"south": {"uv": [0, 10, 9, 13], "texture": "#5"}, "south": {"uv": [0, 10, 9, 13], "texture": "#5"},
"west": {"uv": [9, 10, 10.5, 13], "texture": "#5"}, "west": {"uv": [9, 10, 10.5, 13], "texture": "#5"},
"up": {"uv": [6, 3, 15, 4.5], "texture": "#5"}, "up": {"uv": [0, 8.5, 9, 10], "texture": "#5"},
"down": {"uv": [6, 3, 15, 4.5], "rotation": 180, "texture": "#5"} "down": {"uv": [0, 8.5, 9, 10], "rotation": 180, "texture": "#5"}
} }
}, },
{ {

View file

@ -3,8 +3,8 @@
"parent": "block/block", "parent": "block/block",
"textures": { "textures": {
"0": "create:block/gearbox", "0": "create:block/gearbox",
"4": "create:block/crushing_wheel_plates",
"5": "create:block/millstone", "5": "create:block/millstone",
"8": "create:block/andesite_casing",
"particle": "create:block/palettes/stone_types/cap/andesite_cut_cap" "particle": "create:block/palettes/stone_types/cap/andesite_cut_cap"
}, },
"elements": [ "elements": [
@ -95,11 +95,11 @@
"from": [0, 0, 0], "from": [0, 0, 0],
"to": [16, 6, 2], "to": [16, 6, 2],
"faces": { "faces": {
"north": {"uv": [0, 13, 8, 16], "texture": "#5"}, "north": {"uv": [8, 13, 0, 16], "texture": "#5"},
"east": {"uv": [7, 13, 8, 16], "texture": "#5"}, "east": {"uv": [7, 13, 8, 16], "texture": "#5"},
"south": {"uv": [0, 13, 8, 16], "texture": "#5"}, "south": {"uv": [0, 13, 8, 16], "texture": "#5"},
"west": {"uv": [0, 13, 1, 16], "texture": "#5"}, "west": {"uv": [0, 13, 1, 16], "texture": "#5"},
"up": {"uv": [0, 0, 16, 2], "texture": "#8"}, "up": {"uv": [0, 0, 2, 16], "rotation": 90, "texture": "#4"},
"down": {"uv": [0, 14, 16, 16], "texture": "#0"} "down": {"uv": [0, 14, 16, 16], "texture": "#0"}
} }
}, },
@ -112,7 +112,7 @@
"east": {"uv": [8, 13, 7, 16], "texture": "#5"}, "east": {"uv": [8, 13, 7, 16], "texture": "#5"},
"south": {"uv": [8, 13, 0, 16], "texture": "#5"}, "south": {"uv": [8, 13, 0, 16], "texture": "#5"},
"west": {"uv": [1, 13, 0, 16], "texture": "#5"}, "west": {"uv": [1, 13, 0, 16], "texture": "#5"},
"up": {"uv": [0, 0, 16, 2], "rotation": 180, "texture": "#8"}, "up": {"uv": [0, 0, 2, 16], "rotation": 90, "texture": "#4"},
"down": {"uv": [0, 16, 16, 14], "texture": "#0"} "down": {"uv": [0, 16, 16, 14], "texture": "#0"}
} }
}, },
@ -122,7 +122,7 @@
"faces": { "faces": {
"east": {"uv": [1, 13, 7, 16], "texture": "#5"}, "east": {"uv": [1, 13, 7, 16], "texture": "#5"},
"west": {"uv": [1, 13, 7, 16], "texture": "#5"}, "west": {"uv": [1, 13, 7, 16], "texture": "#5"},
"up": {"uv": [0, 14, 2, 2], "texture": "#8"}, "up": {"uv": [0, 2, 2, 14], "texture": "#4"},
"down": {"uv": [0, 2, 2, 14], "texture": "#0"} "down": {"uv": [0, 2, 2, 14], "texture": "#0"}
} }
}, },
@ -132,7 +132,7 @@
"faces": { "faces": {
"east": {"uv": [7, 13, 1, 16], "texture": "#5"}, "east": {"uv": [7, 13, 1, 16], "texture": "#5"},
"west": {"uv": [7, 13, 1, 16], "texture": "#5"}, "west": {"uv": [7, 13, 1, 16], "texture": "#5"},
"up": {"uv": [0, 14, 2, 2], "rotation": 180, "texture": "#8"}, "up": {"uv": [0, 2, 2, 14], "rotation": 180, "texture": "#4"},
"down": {"uv": [2, 2, 0, 14], "texture": "#0"} "down": {"uv": [2, 2, 0, 14], "texture": "#0"}
} }
}, },
@ -145,15 +145,15 @@
} }
}, },
{ {
"from": [3, 12, 3], "from": [2, 12, 2],
"to": [13, 16, 13], "to": [14, 16, 14],
"faces": { "faces": {
"north": {"uv": [11, 9, 16, 11], "texture": "#5"}, "north": {"uv": [10, 8, 16, 10], "texture": "#5"},
"east": {"uv": [11, 9, 16, 11], "texture": "#5"}, "east": {"uv": [10, 8, 16, 10], "texture": "#5"},
"south": {"uv": [11, 9, 16, 11], "texture": "#5"}, "south": {"uv": [10, 8, 16, 10], "texture": "#5"},
"west": {"uv": [11, 9, 16, 11], "texture": "#5"}, "west": {"uv": [10, 8, 16, 10], "texture": "#5"},
"up": {"uv": [16, 11, 11, 16], "texture": "#5"}, "up": {"uv": [16, 2, 10, 8], "texture": "#5"},
"down": {"uv": [16, 11, 11, 16], "texture": "#5"} "down": {"uv": [16, 2, 10, 8], "texture": "#5"}
} }
} }
], ],

View file

@ -4,6 +4,7 @@
"textures": { "textures": {
"0": "create:block/signal_box_top", "0": "create:block/signal_box_top",
"1": "create:block/observer_box", "1": "create:block/observer_box",
"2": "create:block/train_observer_top",
"particle": "create:block/observer_box" "particle": "create:block/observer_box"
}, },
"elements": [ "elements": [
@ -15,7 +16,7 @@
"east": {"uv": [0, 0, 16, 16], "texture": "#1"}, "east": {"uv": [0, 0, 16, 16], "texture": "#1"},
"south": {"uv": [0, 0, 16, 16], "texture": "#1"}, "south": {"uv": [0, 0, 16, 16], "texture": "#1"},
"west": {"uv": [0, 0, 16, 16], "texture": "#1"}, "west": {"uv": [0, 0, 16, 16], "texture": "#1"},
"up": {"uv": [0, 0, 16, 16], "texture": "#0"}, "up": {"uv": [0, 0, 16, 16], "texture": "#2"},
"down": {"uv": [0, 0, 16, 16], "texture": "#0"} "down": {"uv": [0, 0, 16, 16], "texture": "#0"}
} }
} }

View file

@ -4,6 +4,7 @@
"textures": { "textures": {
"0": "create:block/signal_box_top", "0": "create:block/signal_box_top",
"1": "create:block/observer_box_powered", "1": "create:block/observer_box_powered",
"2": "create:block/train_observer_top",
"particle": "create:block/observer_box_powered" "particle": "create:block/observer_box_powered"
}, },
"elements": [ "elements": [
@ -15,7 +16,7 @@
"east": {"uv": [0, 0, 16, 16], "texture": "#1"}, "east": {"uv": [0, 0, 16, 16], "texture": "#1"},
"south": {"uv": [0, 0, 16, 16], "texture": "#1"}, "south": {"uv": [0, 0, 16, 16], "texture": "#1"},
"west": {"uv": [0, 0, 16, 16], "texture": "#1"}, "west": {"uv": [0, 0, 16, 16], "texture": "#1"},
"up": {"uv": [0, 0, 16, 16], "texture": "#0"}, "up": {"uv": [0, 0, 16, 16], "texture": "#2"},
"down": {"uv": [0, 0, 16, 16], "texture": "#0"} "down": {"uv": [0, 0, 16, 16], "texture": "#0"}
} }
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 299 B

After

Width:  |  Height:  |  Size: 420 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 305 B

After

Width:  |  Height:  |  Size: 425 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 634 B

After

Width:  |  Height:  |  Size: 639 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 424 B