From 9f2c51164734e66cbd821a3ff48ff4659f7c2ae3 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Wed, 3 May 2023 15:14:14 +0200 Subject: [PATCH] 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 --- src/generated/resources/.cache/cache | 4 +- .../resources/assets/create/lang/en_ud.json | 2 +- .../resources/assets/create/lang/en_us.json | 277 +++++----- .../java/com/simibubi/create/AllItems.java | 3 +- .../java/com/simibubi/create/AllShapes.java | 3 +- .../PortableStorageInterfaceBlockEntity.java | 2 +- .../components/actors/RollerBlockEntity.java | 4 +- .../ContraptionControlsBlockEntity.java | 6 +- .../deployer/DeployerFilterSlot.java | 4 +- .../motor/CreativeMotorBlockEntity.java | 4 +- .../components/saw/SawFilterSlot.java | 4 +- .../components/steam/SteamEngineValueBox.java | 4 +- .../DirectionalExtenderScrollOptionSlot.java | 4 +- .../mounted/CartAssemblerBlockEntity.java | 2 +- .../waterwheel/WaterWheelBlockEntity.java | 2 +- .../pipes/SmartFluidPipeBlockEntity.java | 6 +- .../processing/BasinBlockEntity.java | 48 +- .../burner/BlazeBurnerBlockEntity.java | 2 + .../advanced/SpeedControllerBlockEntity.java | 2 +- .../contraptions/relays/belt/BeltBlock.java | 6 +- .../SmartChuteFilterSlotPositioning.java | 2 +- .../block/depot/EjectorBlockEntity.java | 4 +- .../block/diodes/BrassDiodeScrollSlot.java | 4 +- .../funnel/FunnelFilterSlotPositioning.java | 4 +- .../inventories/CreativeCrateBlockEntity.java | 6 +- .../block/mechanicalArm/ArmBlockEntity.java | 4 +- .../redstone/FilteredDetectorFilterSlot.java | 2 +- .../block/redstone/RedstoneContactBlock.java | 4 +- .../redstone/RedstoneLinkFrequencySlot.java | 6 +- .../observer/TrackObserverBlockEntity.java | 4 +- .../behaviour/ValueBoxTransform.java | 12 +- .../EdgeInteractionRenderer.java | 4 +- .../behaviour/linked/LinkHandler.java | 23 +- .../mixin/WaterWheelFluidSpreadMixin.java | 8 +- .../foundation/ponder/SceneBuilder.java | 37 +- .../foundation/ponder/content/ArmScenes.java | 27 +- .../ponder/content/BearingScenes.java | 41 +- .../ponder/content/CartAssemblerScenes.java | 9 +- .../ponder/content/ChassisScenes.java | 8 +- .../ponder/content/ChuteScenes.java | 63 ++- .../ponder/content/DeployerScenes.java | 21 +- .../ponder/content/DisplayScenes.java | 24 +- .../ponder/content/EjectorScenes.java | 39 +- .../ponder/content/FunnelScenes.java | 23 +- .../ponder/content/KineticsScenes.java | 476 +++++++++++++----- .../ponder/content/MechanicalSawScenes.java | 32 +- .../ponder/content/MovementActorScenes.java | 15 +- .../ponder/content/PistonScenes.java | 12 +- .../ponder/content/PonderIndex.java | 4 + .../ponder/content/ProcessingScenes.java | 13 +- .../ponder/content/PulleyScenes.java | 6 +- .../ponder/content/RedstoneScenes.java | 69 +-- .../foundation/ponder/content/SharedText.java | 4 +- .../ponder/content/SteamScenes.java | 7 +- .../ponder/content/TunnelScenes.java | 19 +- .../fluid/FluidMovementActorScenes.java | 13 +- .../ponder/content/fluid/FluidTankScenes.java | 22 +- .../content/fluid/HosePulleyScenes.java | 42 +- .../ponder/content/fluid/PipeScenes.java | 31 +- .../ponder/content/fluid/PumpScenes.java | 43 +- .../ponder/content/fluid/SpoutScenes.java | 3 + .../content/trains/TrackObserverScenes.java | 3 +- .../content/trains/TrainSignalScenes.java | 2 +- .../ponder/element/TextWindowElement.java | 45 +- .../HighlightValueBoxInstruction.java | 4 +- .../assets/create/lang/default/interface.json | 1 + .../assets/create/lang/default/tooltips.json | 185 ++++--- .../models/block/mechanical_pump/cog.json | 16 +- .../create/models/block/millstone/block.json | 25 +- .../create/models/block/millstone/inner.json | 16 +- .../create/models/block/millstone/item.json | 28 +- .../models/block/track_observer/block.json | 3 +- .../block/track_observer/block_powered.json | 3 +- .../create/ponder/fluid_tank/storage.nbt | Bin 1642 -> 1638 bytes .../create/ponder/large_water_wheel.nbt | Bin 0 -> 721 bytes .../create/ponder/mechanical_arm/setup.nbt | Bin 1042 -> 1102 bytes .../assets/create/ponder/valve_handle.nbt | Bin 480 -> 587 bytes .../assets/create/ponder/water_wheel.nbt | Bin 734 -> 740 bytes .../block/cart_assembler_side_off.png | Bin 299 -> 420 bytes .../textures/block/cart_assembler_side_on.png | Bin 305 -> 425 bytes .../create/textures/block/millstone.png | Bin 634 -> 639 bytes .../textures/block/train_observer_top.png | Bin 0 -> 424 bytes 82 files changed, 1117 insertions(+), 793 deletions(-) create mode 100644 src/main/resources/assets/create/ponder/large_water_wheel.nbt create mode 100644 src/main/resources/assets/create/textures/block/train_observer_top.png diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index 9242273a8..a637eb415 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -578,8 +578,8 @@ bf2b0310500213ff853c748c236eb5d01f61658e assets/create/blockstates/yellow_toolbo 5616dda664dd106d576848124fc0fc1de18d0fd3 assets/create/blockstates/yellow_valve_handle.json 7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json -a4e6b545d4b9fac623de034ab8d063b2c621742c assets/create/lang/en_ud.json -aac2ef619ff4e427e50aa8d2e635c311f1780b6f assets/create/lang/en_us.json +b04b22fd6e7941c2b2559fbb4e28f31cf54657af assets/create/lang/en_ud.json +a4e2558314ebba2f5ff3b121672ed3f8f57b0278 assets/create/lang/en_us.json 487a511a01b2a4531fb672f917922312db78f958 assets/create/models/block/acacia_window.json b48060cba1a382f373a05bf0039054053eccf076 assets/create/models/block/acacia_window_pane_noside.json 3066db1bf03cffa1a9c7fbacf47ae586632f4eb3 assets/create/models/block/acacia_window_pane_noside_alt.json diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index 01df8f8fc..bad92e60a 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -635,7 +635,7 @@ "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.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.goggles": "s\u01DD\u05DFbbo\u2141 s,\u0279\u01DD\u01DDu\u0131bu\u018E", "item.create.golden_sheet": "\u0287\u01DD\u01DD\u0265S u\u01DDp\u05DFo\u2141", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index 937ca32a8..79b43b999 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -642,7 +642,7 @@ "item.create.empty_schematic": "Empty Schematic", "item.create.experience_nugget": "Nugget of Experience", "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.goggles": "Engineer's Goggles", "item.create.golden_sheet": "Golden Sheet", @@ -1121,6 +1121,7 @@ "create.gui.goggles.kinetic_stats": "Kinetic Stats:", "create.gui.goggles.at_current_speed": "at current speed", "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.capacity": "Capacity: ", "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.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.condition1": "When in Hotbar", - "item.create.wand_of_symmetry.tooltip.behaviour1": "Stays Active", - "item.create.wand_of_symmetry.tooltip.control1": "R-Click on Ground", - "item.create.wand_of_symmetry.tooltip.action1": "_Creates_ or _Moves_ the 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.wand_of_symmetry.tooltip.summary": "_Mirrors Block placement_ while present in any _Hotbar Slot_.", + "item.create.wand_of_symmetry.tooltip.condition1": "When used on a Surface", + "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.condition2": "When used with no target", + "item.create.wand_of_symmetry.tooltip.behaviour2": "_Removes_ the active Mirror", "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.control1": "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.control2": "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.control3": "R-Click while Sneaking", - "item.create.handheld_worldshaper.tooltip.action3": "Opens the _Configuration Interface_", + "item.create.handheld_worldshaper.tooltip.summary": "_Creative mode_ tool for large-scale _landscaping_ from a distance.", + "item.create.handheld_worldshaper.tooltip.condition1": "L-Click at Block", + "item.create.handheld_worldshaper.tooltip.behaviour1": "_Targeted block_ will become the _material_ placed by the shaper.", + "item.create.handheld_worldshaper.tooltip.condition2": "R-Click at Block", + "item.create.handheld_worldshaper.tooltip.behaviour2": "Applies currently selected _Brush_ and _Tool_ at the targeted location.", + "item.create.handheld_worldshaper.tooltip.condition3": "R-Click while Sneaking", + "item.create.handheld_worldshaper.tooltip.behaviour3": "Opens the _Configuration Interface_", "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.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.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.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.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.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.behaviour1": "_Shoots_ a suitable item from your _Inventory_.", "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.filter.tooltip": "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.condition1": "When in filter slot", - "item.create.filter.tooltip.behaviour1": "_Controls_ item flow according to its _configuration_.", - "item.create.filter.tooltip.condition2": "When R-Clicked", - "item.create.filter.tooltip.behaviour2": "Opens the _configuration interface_.", + "item.create.filter.tooltip": "LIST FILTER", + "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 R-Clicked", + "item.create.filter.tooltip.behaviour1": "Opens the _configuration interface_.", "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.condition1": "When in filter slot", - "item.create.attribute_filter.tooltip.behaviour1": "_Controls_ item flow according to its _configuration_.", - "item.create.attribute_filter.tooltip.condition2": "When R-Clicked", - "item.create.attribute_filter.tooltip.behaviour2": "Opens the _configuration interface_.", + "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 R-Clicked", + "item.create.attribute_filter.tooltip.behaviour1": "Opens the _configuration interface_.", "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_.", @@ -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.condition1": "When Held", "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.action1": "Opens an _Interface_ for entering exact _Coordinates_.", + "item.create.schematic.tooltip.condition2": "R-Click while Sneaking", + "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.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.behaviour1": "Select two corner points using R-Click.", - "item.create.schematic_and_quill.tooltip.condition2": "Step 2", - "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.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.", + "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": "Creating a selection", + "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": "Adjusting and Saving", + "item.create.schematic_and_quill.tooltip.behaviour2": "_Ctrl-Scroll_ on the faces to adjust the size, then R-Click again to Save.", "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.", @@ -2011,20 +1998,16 @@ "block.create.schematic_table.tooltip.behaviour1": "Uploads a chosen File from your Schematics Folder.", "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.condition1": "When worn", - "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.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.goggles.tooltip.summary": "Augments your HUD with _miscellaneous information_ about placed components.", + "item.create.goggles.tooltip.condition1": "When looking at blocks", + "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.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.control1": "Right-Click a kinetic block", - "item.create.wrench.tooltip.action1": "_Rotates components_ toward or away from the face with which you interacted.", - "item.create.wrench.tooltip.control2": "R-Click while Sneaking", - "item.create.wrench.tooltip.action2": "_Disassembles Kinetic components_ and places them back in _your inventory_.", + "item.create.wrench.tooltip.summary": "Multi-purpose tool for working with your kinetic contraptions.", + "item.create.wrench.tooltip.condition1": "When used on Blocks", + "item.create.wrench.tooltip.behaviour1": "_Rotates components_ around the clicked face. _Sneak_ while interacting to _dismantle_ components.", + "item.create.wrench.tooltip.condition2": "When used on Contraptions", + "item.create.wrench.tooltip.behaviour2": "_Relocates_ assembled minecart- and train-based contraptions.", "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_.", @@ -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.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.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.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.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.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.condition1": "When Used", "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.summary": "A _uni-directional powered rail_ capable of _fine control_ over a minecarts' _movement speed_.", - "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.", + "block.create.controller_rail.tooltip.summary": "A _uni-directional_ powered rail with _variable speed_, controlled by the _signal strength_ supplied to it.", "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.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.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.summary": "Grants _handheld_ _control_ over _Redstone Link_ frequencies assigned to its _six_ _buttons_.", "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.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.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.diving_helmet.tooltip.behaviour1": "Provides the _Water Breathing_ effect, slowly draining _Air Pressure_ from the Backtank.", + "item.create.copper_diving_helmet.tooltip": "COPPER DIVING HELMET", + "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.copper_diving_helmet.tooltip.condition1": "When Worn", + "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.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.behaviour1": "Starts spinning.", - "item.create.diving_boots.tooltip": "DIVING BOOTS", - "item.create.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.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": "COPPER DIVING BOOTS", + "item.create.copper_diving_boots.tooltip.summary": "A pair of _heavy_ _boots_, allowing for better traversal of the Ocean floor.", + "item.create.copper_diving_boots.tooltip.condition1": "When Worn", + "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.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.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.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.minecart_coupling.tooltip.summary": "_Chains_ together individual _Minecarts_, causing them to move as a group.", "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.behaviour1": "_Redeems_ _Experience_ points contained within.", "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.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.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 [------------------------<-", @@ -2185,14 +2171,14 @@ "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.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.sneak_and": "Sneak +", "create.ponder.shared.rpm8": "8 RPM", "create.ponder.shared.ctrl_and": "Ctrl +", "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.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.description": "Components which help with redstone engineering", "create.ponder.tag.contraption_assembly": "Block Attachment Utility", @@ -2293,7 +2279,7 @@ "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_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_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_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_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", @@ -2357,7 +2343,8 @@ "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_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.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.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", @@ -2456,8 +2443,8 @@ "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_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_4": "...or through the use of Display Links", + "create.ponder.display_board.text_3": "Static text can be applied using written Clipboards", + "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_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.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_3": "Its conveyed speed is relatively high", - "create.ponder.hand_crank.text_4": "Sneak and Hold Right-Click to rotate it Clockwise", + "create.ponder.hand_crank.text_3": "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.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_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.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_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_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_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_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_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_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", @@ -2758,18 +2751,18 @@ "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_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_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_6": "Use a Wrench to reverse the orientation of pumps manually", + "create.ponder.mechanical_pump_flow.text_5": "The pumps direction is unaffected by the input rotation", + "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.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_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_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.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.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_2": "Using name tags edited with an anvil, custom text can be displayed", + "create.ponder.nixie_tube.text_1": "When powered by Redstone, Nixie Tubes will display the signal strength", + "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.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_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_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", @@ -2841,13 +2834,13 @@ "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_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_5": "The configured duration can range up to 30 minutes", + "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 an hour", "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_2": "Using the mouse wheel, 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_1": "Pulse Repeaters emit a short pulse after a delay", + "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 an hour", "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", @@ -2895,7 +2888,7 @@ "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_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.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.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_3": "Use the Mouse Wheel to specify the extracted stack size", + "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 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_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.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_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.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.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_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.text_1": "Valve Handles can be used by players to apply rotational force manually", - "create.ponder.valve_handle.text_2": "Hold Right-Click to rotate it Counter-Clockwise", - "create.ponder.valve_handle.text_3": "Its conveyed speed is slow and precise", - "create.ponder.valve_handle.text_4": "Sneak and Hold Right-Click to rotate it Clockwise", - "create.ponder.valve_handle.text_5": "Valve handles can be dyed for aesthetic purposes", + "create.ponder.valve_handle.header": "Precise rotation using Valve Handles", + "create.ponder.valve_handle.text_1": "Valve handles can be used to rotate components by a precise angle", + "create.ponder.valve_handle.text_2": "The angle can be configured on the input panel", + "create.ponder.valve_handle.text_3": "Right-Click to activate one rotation", + "create.ponder.valve_handle.text_4": "Sneak-Right-Click to activate it in the opposite direction", + "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.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.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_3": "The Wheels' blades should be oriented against the flow", - "create.ponder.water_wheel.text_4": "Facing the opposite way, they will not be as effective", + "create.ponder.water_wheel.text_2": "Covering additional sides will not improve its kinetic output further", + "create.ponder.water_wheel.text_3": "Use wood planks on the wheel to change its appearance", "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_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_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", @@ -3107,11 +3100,11 @@ "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_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.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.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_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_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_structure.header": "Windmill Contraptions", diff --git a/src/main/java/com/simibubi/create/AllItems.java b/src/main/java/com/simibubi/create/AllItems.java index 011fa66cd..f367359a8 100644 --- a/src/main/java/com/simibubi/create/AllItems.java +++ b/src/main/java/com/simibubi/create/AllItems.java @@ -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.DivingBootsItem; 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.tools.BlueprintItem; import com.simibubi.create.content.curiosities.tools.ExtendoGripItem; @@ -355,6 +353,7 @@ public class AllItems { // Logistics public static final ItemEntry FILTER = REGISTRATE.item("filter", FilterItem::regular) + .lang("List Filter") .register(), ATTRIBUTE_FILTER = REGISTRATE.item("attribute_filter", FilterItem::attribute) .register(); diff --git a/src/main/java/com/simibubi/create/AllShapes.java b/src/main/java/com/simibubi/create/AllShapes.java index 0df89e703..45220463a 100644 --- a/src/main/java/com/simibubi/create/AllShapes.java +++ b/src/main/java/com/simibubi/create/AllShapes.java @@ -253,8 +253,7 @@ public class AllShapes { .build(), SPOUT = shape(1, 2, 1, 15, 14, 15).add(2, 0, 2, 14, 16, 14) .build(), - MILLSTONE = shape(0, 0, 0, 16, 6, 16).add(2, 6, 2, 14, 12, 14) - .add(3, 12, 3, 13, 16, 13) + MILLSTONE = shape(0, 0, 0, 16, 6, 16).add(2, 6, 2, 14, 16, 14) .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) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceBlockEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceBlockEntity.java index da30c9f61..9a054b101 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceBlockEntity.java @@ -89,7 +89,7 @@ public abstract class PortableStorageInterfaceBlockEntity extends SmartBlockEnti boolean timerCanDecrement = transferTimer > ANIMATION || transferTimer > 0 && keepAlive == 0 && (isVirtual() || !level.isClientSide || transferTimer != ANIMATION); - if (timerCanDecrement && (!isVirtual() || transferTimer != timeUnit)) { + if (timerCanDecrement && (!isVirtual() || transferTimer != ANIMATION)) { transferTimer--; if (transferTimer == ANIMATION - 1) sendData(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/RollerBlockEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/RollerBlockEntity.java index a9e3fea6b..09ad60007 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/RollerBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/RollerBlockEntity.java @@ -179,7 +179,7 @@ public class RollerBlockEntity extends SmartBlockEntity { } @Override - protected void rotate(BlockState state, PoseStack ms) { + public void rotate(BlockState state, PoseStack ms) { Direction facing = state.getValue(RollerBlock.FACING); float yRot = AngleHelper.horizontalAngle(facing) + 180; TransformStack.cast(ms) @@ -196,7 +196,7 @@ public class RollerBlockEntity extends SmartBlockEntity { } @Override - protected Vec3 getLocalOffset(BlockState state) { + public Vec3 getLocalOffset(BlockState state) { Direction facing = state.getValue(RollerBlock.FACING); float stateAngle = AngleHelper.horizontalAngle(facing) + 180; return VecHelper.rotateCentered(VecHelper.voxelSpace(8 + hOffset, 15.5f, 11), stateAngle, Axis.Y); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/controls/ContraptionControlsBlockEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/controls/ContraptionControlsBlockEntity.java index fd03b2cef..e6ac8628d 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/controls/ContraptionControlsBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/controls/ContraptionControlsBlockEntity.java @@ -123,14 +123,14 @@ public class ContraptionControlsBlockEntity extends SmartBlockEntity { public static class ControlsSlot extends ValueBoxTransform.Sided { @Override - protected Vec3 getLocalOffset(BlockState state) { + public Vec3 getLocalOffset(BlockState state) { Direction facing = state.getValue(ControlsBlock.FACING); float yRot = AngleHelper.horizontalAngle(facing); return VecHelper.rotateCentered(VecHelper.voxelSpace(8, 12f, 5.5f), yRot, Axis.Y); } @Override - protected void rotate(BlockState state, PoseStack ms) { + public void rotate(BlockState state, PoseStack ms) { Direction facing = state.getValue(ControlsBlock.FACING); float yRot = AngleHelper.horizontalAngle(facing); TransformStack.cast(ms) @@ -139,7 +139,7 @@ public class ContraptionControlsBlockEntity extends SmartBlockEntity { } @Override - protected float getScale() { + public float getScale() { return .5f; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerFilterSlot.java b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerFilterSlot.java index de6177f51..96da5a956 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerFilterSlot.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerFilterSlot.java @@ -14,7 +14,7 @@ import net.minecraft.world.phys.Vec3; public class DeployerFilterSlot extends ValueBoxTransform.Sided { @Override - protected Vec3 getLocalOffset(BlockState state) { + public Vec3 getLocalOffset(BlockState state) { Direction facing = state.getValue(DeployerBlock.FACING); Vec3 vec = VecHelper.voxelSpace(8f, 8f, 15.5f); @@ -37,7 +37,7 @@ public class DeployerFilterSlot extends ValueBoxTransform.Sided { } @Override - protected void rotate(BlockState state, PoseStack ms) { + public void rotate(BlockState state, PoseStack ms) { Direction facing = getSide(); float xRot = facing == Direction.UP ? 90 : facing == Direction.DOWN ? 270 : 0; float yRot = AngleHelper.horizontalAngle(facing) + 180; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/motor/CreativeMotorBlockEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/motor/CreativeMotorBlockEntity.java index 35516b3ce..a352dfae5 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/motor/CreativeMotorBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/motor/CreativeMotorBlockEntity.java @@ -65,14 +65,14 @@ public class CreativeMotorBlockEntity extends GeneratingKineticBlockEntity { } @Override - protected Vec3 getLocalOffset(BlockState state) { + public Vec3 getLocalOffset(BlockState state) { Direction facing = state.getValue(CreativeMotorBlock.FACING); return super.getLocalOffset(state).add(Vec3.atLowerCornerOf(facing.getNormal()) .scale(-1 / 16f)); } @Override - protected void rotate(BlockState state, PoseStack ms) { + public void rotate(BlockState state, PoseStack ms) { super.rotate(state, ms); Direction facing = state.getValue(CreativeMotorBlock.FACING); if (facing.getAxis() == Axis.Y) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawFilterSlot.java b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawFilterSlot.java index b78786c59..17420b93b 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawFilterSlot.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawFilterSlot.java @@ -12,7 +12,7 @@ import net.minecraft.world.phys.Vec3; public class SawFilterSlot extends ValueBoxTransform { @Override - protected Vec3 getLocalOffset(BlockState state) { + public Vec3 getLocalOffset(BlockState state) { if (state.getValue(SawBlock.FACING) != Direction.UP) return null; int offset = state.getValue(SawBlock.FLIPPED) ? -3 : 3; @@ -22,7 +22,7 @@ public class SawFilterSlot extends ValueBoxTransform { } @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) + (state.getValue(SawBlock.FLIPPED) ? 0 : 180); TransformStack.cast(ms) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/steam/SteamEngineValueBox.java b/src/main/java/com/simibubi/create/content/contraptions/components/steam/SteamEngineValueBox.java index 600ea336a..e83dbbbec 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/steam/SteamEngineValueBox.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/steam/SteamEngineValueBox.java @@ -36,7 +36,7 @@ public class SteamEngineValueBox extends ValueBoxTransform.Sided { } @Override - protected Vec3 getLocalOffset(BlockState state) { + public Vec3 getLocalOffset(BlockState state) { Direction side = getSide(); Direction engineFacing = SteamEngineBlock.getFacing(state); @@ -59,7 +59,7 @@ public class SteamEngineValueBox extends ValueBoxTransform.Sided { } @Override - protected void rotate(BlockState state, PoseStack ms) { + public void rotate(BlockState state, PoseStack ms) { Direction facing = SteamEngineBlock.getFacing(state); if (facing.getAxis() == Axis.Y) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/DirectionalExtenderScrollOptionSlot.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/DirectionalExtenderScrollOptionSlot.java index d3aeae54e..a7edffe6c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/DirectionalExtenderScrollOptionSlot.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/DirectionalExtenderScrollOptionSlot.java @@ -19,13 +19,13 @@ public class DirectionalExtenderScrollOptionSlot extends CenteredSideValueBoxTra } @Override - protected Vec3 getLocalOffset(BlockState state) { + public Vec3 getLocalOffset(BlockState state) { return super.getLocalOffset(state) .add(Vec3.atLowerCornerOf(state.getValue(BlockStateProperties.FACING).getNormal()).scale(-2 / 16f)); } @Override - protected void rotate(BlockState state, PoseStack ms) { + public void rotate(BlockState state, PoseStack ms) { if (!getSide().getAxis().isHorizontal()) TransformStack.cast(ms) .rotateY(AngleHelper.horizontalAngle(state.getValue(BlockStateProperties.FACING)) + 180); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/CartAssemblerBlockEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/CartAssemblerBlockEntity.java index 4c7320bbf..ff5a6844a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/CartAssemblerBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/CartAssemblerBlockEntity.java @@ -276,7 +276,7 @@ public class CartAssemblerBlockEntity extends SmartBlockEntity implements IDispl @Override protected Vec3 getSouthLocation() { - return VecHelper.voxelSpace(8, 8, 17.5); + return VecHelper.voxelSpace(8, 7, 17.5); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/waterwheel/WaterWheelBlockEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/waterwheel/WaterWheelBlockEntity.java index c0076de3b..a2ff0b580 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/waterwheel/WaterWheelBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/waterwheel/WaterWheelBlockEntity.java @@ -92,7 +92,7 @@ public class WaterWheelBlockEntity extends GeneratingKineticBlockEntity { return InteractionResult.PASS; if (!material.is(BlockTags.PLANKS)) return InteractionResult.PASS; - if (level.isClientSide()) + if (level.isClientSide() && !isVirtual()) return InteractionResult.SUCCESS; this.material = material; notifyUpdate(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/SmartFluidPipeBlockEntity.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/SmartFluidPipeBlockEntity.java index 12af35a72..646bbe90b 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/SmartFluidPipeBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/SmartFluidPipeBlockEntity.java @@ -68,7 +68,7 @@ public class SmartFluidPipeBlockEntity extends SmartBlockEntity { class SmartPipeFilterSlot extends ValueBoxTransform { @Override - protected Vec3 getLocalOffset(BlockState state) { + public Vec3 getLocalOffset(BlockState state) { AttachFace face = state.getValue(SmartFluidPipeBlock.FACE); 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; @@ -76,12 +76,12 @@ public class SmartFluidPipeBlockEntity extends SmartBlockEntity { } @Override - protected float getScale() { + public float getScale() { return super.getScale() * 1.02f; } @Override - protected void rotate(BlockState state, PoseStack ms) { + public void rotate(BlockState state, PoseStack ms) { AttachFace face = state.getValue(SmartFluidPipeBlock.FACE); TransformStack.cast(ms) .rotateY(angleY(state)) diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinBlockEntity.java b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinBlockEntity.java index 4ff7e8e8f..d58ade291 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinBlockEntity.java @@ -30,14 +30,18 @@ import com.simibubi.create.foundation.fluid.CombinedTankWrapper; import com.simibubi.create.foundation.item.ItemHelper; import com.simibubi.create.foundation.item.SmartInventory; 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.IntAttached; 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.VecHelper; import com.simibubi.create.foundation.utility.animation.LerpedFloat; import com.simibubi.create.foundation.utility.animation.LerpedFloat.Chaser; +import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; 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.IFluidHandler; import net.minecraftforge.fluids.capability.IFluidHandler.FluidAction; +import net.minecraftforge.fluids.capability.templates.FluidTank; import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.IItemHandlerModifiable; import net.minecraftforge.items.ItemHandlerHelper; +import net.minecraftforge.items.ItemStackHandler; import net.minecraftforge.items.wrapper.CombinedInvWrapper; public class BasinBlockEntity extends SmartBlockEntity implements IHaveGoggleInformation { @@ -731,8 +737,46 @@ public class BasinBlockEntity extends SmartBlockEntity implements IHaveGoggleInf @Override public boolean addToGoggleTooltip(List tooltip, boolean isPlayerSneaking) { - return containedFluidTooltip(tooltip, isPlayerSneaking, - getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY)); + Lang.translate("gui.goggles.basin_contents") + .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 { diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerBlockEntity.java b/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerBlockEntity.java index d029c7db0..5adc128ee 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerBlockEntity.java @@ -266,6 +266,8 @@ public class BlazeBurnerBlockEntity extends SmartBlockEntity { } public boolean isValidBlockAbove() { + if (isVirtual()) + return false; BlockState blockState = level.getBlockState(worldPosition.above()); return AllBlocks.BASIN.has(blockState) || blockState.getBlock() instanceof FluidTankBlock; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerBlockEntity.java b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerBlockEntity.java index 48519a129..28f5c8368 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerBlockEntity.java @@ -141,7 +141,7 @@ public class SpeedControllerBlockEntity extends KineticBlockEntity { } @Override - protected float getScale() { + public float getScale() { return 0.5f; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltBlock.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltBlock.java index e98dc5b64..3877eed18 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltBlock.java @@ -303,13 +303,13 @@ public class BeltBlock extends HorizontalKineticBlock if (AllBlocks.BRASS_CASING.isIn(heldItem)) { withBlockEntityDo(world, pos, be -> be.setCasingType(CasingType.BRASS)); - updateCoverProperty(world, pos, state); + updateCoverProperty(world, pos, world.getBlockState(pos)); return InteractionResult.SUCCESS; } if (AllBlocks.ANDESITE_CASING.isIn(heldItem)) { withBlockEntityDo(world, pos, be -> be.setCasingType(CasingType.ANDESITE)); - updateCoverProperty(world, pos, state); + updateCoverProperty(world, pos, world.getBlockState(pos)); return InteractionResult.SUCCESS; } @@ -517,6 +517,8 @@ public class BeltBlock extends HorizontalKineticBlock return false; if (bounds.minY > 0) return false; + if (AllBlocks.CRUSHING_WHEEL_CONTROLLER.has(blockState)) + return false; if (FunnelBlock.isFunnel(blockState) && FunnelBlock.getFunnelFacing(blockState) != Direction.UP) return false; if (blockState.getBlock() instanceof BeltTunnelBlock) diff --git a/src/main/java/com/simibubi/create/content/logistics/block/chute/SmartChuteFilterSlotPositioning.java b/src/main/java/com/simibubi/create/content/logistics/block/chute/SmartChuteFilterSlotPositioning.java index d90d673c0..268800b30 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/chute/SmartChuteFilterSlotPositioning.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/chute/SmartChuteFilterSlotPositioning.java @@ -12,7 +12,7 @@ import net.minecraft.world.phys.Vec3; public class SmartChuteFilterSlotPositioning extends ValueBoxTransform.Sided { @Override - protected Vec3 getLocalOffset(BlockState state) { + public Vec3 getLocalOffset(BlockState state) { Direction side = getSide(); float horizontalAngle = AngleHelper.horizontalAngle(side); Vec3 southLocation = VecHelper.voxelSpace(8, 11, 15.5f); diff --git a/src/main/java/com/simibubi/create/content/logistics/block/depot/EjectorBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/depot/EjectorBlockEntity.java index e4fe9c943..61932b88c 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/depot/EjectorBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/depot/EjectorBlockEntity.java @@ -618,14 +618,14 @@ public class EjectorBlockEntity extends KineticBlockEntity { private class EjectorSlot extends ValueBoxTransform.Sided { @Override - protected Vec3 getLocalOffset(BlockState state) { + public Vec3 getLocalOffset(BlockState state) { if (direction != Direction.UP) return super.getLocalOffset(state); return new Vec3(.5, 10.5 / 16f, .5).add(VecHelper.rotate(VecHelper.voxelSpace(0, 0, -5), angle(state), Axis.Y)); } @Override - protected void rotate(BlockState state, PoseStack ms) { + public void rotate(BlockState state, PoseStack ms) { if (direction != Direction.UP) { super.rotate(state, ms); return; diff --git a/src/main/java/com/simibubi/create/content/logistics/block/diodes/BrassDiodeScrollSlot.java b/src/main/java/com/simibubi/create/content/logistics/block/diodes/BrassDiodeScrollSlot.java index c68cbb2ce..6da51eda1 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/diodes/BrassDiodeScrollSlot.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/diodes/BrassDiodeScrollSlot.java @@ -13,12 +13,12 @@ import net.minecraft.world.phys.Vec3; public class BrassDiodeScrollSlot extends ValueBoxTransform { @Override - protected Vec3 getLocalOffset(BlockState state) { + public Vec3 getLocalOffset(BlockState state) { return VecHelper.voxelSpace(8, 2.6f, 8); } @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; TransformStack.cast(ms) .rotateY(yRot) diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelFilterSlotPositioning.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelFilterSlotPositioning.java index 4065cbdbd..0f152d657 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelFilterSlotPositioning.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelFilterSlotPositioning.java @@ -15,7 +15,7 @@ import net.minecraft.world.phys.Vec3; public class FunnelFilterSlotPositioning extends ValueBoxTransform.Sided { @Override - protected Vec3 getLocalOffset(BlockState state) { + public Vec3 getLocalOffset(BlockState state) { Direction side = getSide(); float horizontalAngle = AngleHelper.horizontalAngle(side); Direction funnelFacing = FunnelBlock.getFunnelFacing(state); @@ -45,7 +45,7 @@ public class FunnelFilterSlotPositioning extends ValueBoxTransform.Sided { } @Override - protected void rotate(BlockState state, PoseStack ms) { + public void rotate(BlockState state, PoseStack ms) { Direction facing = FunnelBlock.getFunnelFacing(state); if (facing.getAxis() diff --git a/src/main/java/com/simibubi/create/content/logistics/block/inventories/CreativeCrateBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/inventories/CreativeCrateBlockEntity.java index 3777ca445..dea5bae67 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/inventories/CreativeCrateBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/inventories/CreativeCrateBlockEntity.java @@ -55,17 +55,17 @@ public class CreativeCrateBlockEntity extends CrateBlockEntity { return new FilteringBehaviour(this, new ValueBoxTransform() { @Override - protected void rotate(BlockState state, PoseStack ms) { + public void rotate(BlockState state, PoseStack ms) { TransformStack.cast(ms) .rotateX(90); } @Override - protected Vec3 getLocalOffset(BlockState state) { + public Vec3 getLocalOffset(BlockState state) { return new Vec3(0.5, 13.5 / 16d, 0.5); } - protected float getScale() { + public float getScale() { return super.getScale(); }; diff --git a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmBlockEntity.java index ef8893ce1..42c8659a4 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmBlockEntity.java @@ -607,7 +607,7 @@ public class ArmBlockEntity extends KineticBlockEntity implements ITransformable } @Override - protected Vec3 getLocalOffset(BlockState state) { + public Vec3 getLocalOffset(BlockState state) { int yPos = state.getValue(ArmBlock.CEILING) ? 16 - 3 : 3; Vec3 location = VecHelper.voxelSpace(8, yPos, 15.5); location = VecHelper.rotateCentered(location, AngleHelper.horizontalAngle(getSide()), Direction.Axis.Y); @@ -615,7 +615,7 @@ public class ArmBlockEntity extends KineticBlockEntity implements ITransformable } @Override - protected float getScale() { + public float getScale() { return super.getScale(); } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/redstone/FilteredDetectorFilterSlot.java b/src/main/java/com/simibubi/create/content/logistics/block/redstone/FilteredDetectorFilterSlot.java index 9238af5b6..e298e29d7 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/redstone/FilteredDetectorFilterSlot.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/redstone/FilteredDetectorFilterSlot.java @@ -40,7 +40,7 @@ public class FilteredDetectorFilterSlot extends ValueBoxTransform.Sided { } @Override - protected void rotate(BlockState state, PoseStack ms) { + public void rotate(BlockState state, PoseStack ms) { super.rotate(state, ms); Direction facing = state.getValue(DirectedDirectionalBlock.FACING); if (facing.getAxis() == Axis.Y) diff --git a/src/main/java/com/simibubi/create/content/logistics/block/redstone/RedstoneContactBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/redstone/RedstoneContactBlock.java index d5623e291..7c6143445 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/redstone/RedstoneContactBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/redstone/RedstoneContactBlock.java @@ -131,9 +131,7 @@ public class RedstoneContactBlock extends WrenchableDirectionalBlock { @Override public boolean canConnectRedstone(BlockState state, BlockGetter world, BlockPos pos, @Nullable Direction side) { - if (side == null) - return true; - return state.getValue(FACING) != side.getOpposite(); + return side != null && state.getValue(FACING) != side.getOpposite(); } @Override diff --git a/src/main/java/com/simibubi/create/content/logistics/block/redstone/RedstoneLinkFrequencySlot.java b/src/main/java/com/simibubi/create/content/logistics/block/redstone/RedstoneLinkFrequencySlot.java index 82bad3d6f..0e6a41ab4 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/redstone/RedstoneLinkFrequencySlot.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/redstone/RedstoneLinkFrequencySlot.java @@ -21,7 +21,7 @@ public class RedstoneLinkFrequencySlot extends ValueBoxTransform.Dual { Vec3 vertical = VecHelper.voxelSpace(10f, 2.5f, 5.5f); @Override - protected Vec3 getLocalOffset(BlockState state) { + public Vec3 getLocalOffset(BlockState state) { Direction facing = state.getValue(RedstoneLinkBlock.FACING); Vec3 location = VecHelper.voxelSpace(8f, 3.01f, 5.5f); @@ -40,7 +40,7 @@ public class RedstoneLinkFrequencySlot extends ValueBoxTransform.Dual { } @Override - protected void rotate(BlockState state, PoseStack ms) { + public void rotate(BlockState state, PoseStack ms) { Direction facing = state.getValue(RedstoneLinkBlock.FACING); float yRot = facing.getAxis() .isVertical() ? 0 : AngleHelper.horizontalAngle(facing) + 180; @@ -51,7 +51,7 @@ public class RedstoneLinkFrequencySlot extends ValueBoxTransform.Dual { } @Override - protected float getScale() { + public float getScale() { return .4975f; } diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/observer/TrackObserverBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/observer/TrackObserverBlockEntity.java index 431720763..5138c0a2b 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/observer/TrackObserverBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/observer/TrackObserverBlockEntity.java @@ -97,13 +97,13 @@ public class TrackObserverBlockEntity extends SmartBlockEntity implements ITrans return new FilteringBehaviour(this, new ValueBoxTransform() { @Override - protected void rotate(BlockState state, PoseStack ms) { + public void rotate(BlockState state, PoseStack ms) { TransformStack.cast(ms) .rotateX(90); } @Override - protected Vec3 getLocalOffset(BlockState state) { + public Vec3 getLocalOffset(BlockState state) { return new Vec3(0.5, 15.5 / 16d, 0.5); } diff --git a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueBoxTransform.java b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueBoxTransform.java index e449b0fcc..65f30cca5 100644 --- a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueBoxTransform.java +++ b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueBoxTransform.java @@ -20,9 +20,9 @@ public abstract class ValueBoxTransform { 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) { Vec3 offset = getLocalOffset(state); @@ -57,11 +57,11 @@ public abstract class ValueBoxTransform { return VecHelper.rotateCentered(vec, yRot, Axis.Y); } - protected float getScale() { + public float getScale() { return .5f; } - protected float getFontScale() { + public float getFontScale() { return 1 / 64f; } @@ -100,7 +100,7 @@ public abstract class ValueBoxTransform { } @Override - protected Vec3 getLocalOffset(BlockState state) { + public Vec3 getLocalOffset(BlockState state) { Vec3 location = getSouthLocation(); location = VecHelper.rotateCentered(location, AngleHelper.horizontalAngle(getSide()), Axis.Y); location = VecHelper.rotateCentered(location, AngleHelper.verticalAngle(getSide()), Axis.X); @@ -110,7 +110,7 @@ public abstract class ValueBoxTransform { protected abstract Vec3 getSouthLocation(); @Override - protected void rotate(BlockState state, PoseStack ms) { + public void rotate(BlockState state, PoseStack ms) { float yRot = AngleHelper.horizontalAngle(getSide()) + 180; float xRot = getSide() == Direction.UP ? 90 : getSide() == Direction.DOWN ? 270 : 0; TransformStack.cast(ms) diff --git a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/edgeInteraction/EdgeInteractionRenderer.java b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/edgeInteraction/EdgeInteractionRenderer.java index 0705eaace..312de95b7 100644 --- a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/edgeInteraction/EdgeInteractionRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/edgeInteraction/EdgeInteractionRenderer.java @@ -106,12 +106,12 @@ public class EdgeInteractionRenderer { } @Override - protected Vec3 getLocalOffset(BlockState state) { + public Vec3 getLocalOffset(BlockState state) { return add; } @Override - protected void rotate(BlockState state, PoseStack ms) { + public void rotate(BlockState state, PoseStack ms) { super.rotate(state, ms); } diff --git a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/linked/LinkHandler.java b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/linked/LinkHandler.java index 443a9309d..bdb3fafef 100644 --- a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/linked/LinkHandler.java +++ b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/linked/LinkHandler.java @@ -14,7 +14,10 @@ import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; 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.Vec3; +import net.minecraftforge.common.util.FakePlayer; import net.minecraftforge.event.entity.player.PlayerInteractEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.LogicalSide; @@ -29,7 +32,7 @@ public class LinkHandler { BlockPos pos = event.getPos(); Player player = event.getPlayer(); InteractionHand hand = event.getHand(); - + if (player.isShiftKeyDown() || player.isSpectator()) return; @@ -46,9 +49,23 @@ public class LinkHandler { if (AllItems.WRENCH.isIn(heldItem)) 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)) { - if (behaviour.testHit(first, ray.getLocation())) { - if (event.getSide() != LogicalSide.CLIENT) + if (behaviour.testHit(first, ray.getLocation()) || fakePlayer && fakePlayerChoice == first) { + if (event.getSide() != LogicalSide.CLIENT) behaviour.setFrequency(first, heldItem); event.setCanceled(true); event.setCancellationResult(InteractionResult.SUCCESS); diff --git a/src/main/java/com/simibubi/create/foundation/mixin/WaterWheelFluidSpreadMixin.java b/src/main/java/com/simibubi/create/foundation/mixin/WaterWheelFluidSpreadMixin.java index c7652bc23..3b124d539 100644 --- a/src/main/java/com/simibubi/create/foundation/mixin/WaterWheelFluidSpreadMixin.java +++ b/src/main/java/com/simibubi/create/foundation/mixin/WaterWheelFluidSpreadMixin.java @@ -21,9 +21,9 @@ import net.minecraft.world.level.material.FluidState; @Mixin(FlowingFluid.class) 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") - protected void canSpreadToOnWaterWheel(BlockGetter pLevel, BlockPos pFromPos, BlockState pFromBlockState, - Direction pDirection, BlockPos pToPos, BlockState pToBlockState, FluidState pToFluidState, Fluid pFluid, + @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 canPassThroughOnWaterWheel(BlockGetter pLevel, Fluid pFluid, BlockPos pFromPos, BlockState p_75967_, + Direction pDirection, BlockPos p_75969_, BlockState p_75970_, FluidState p_75971_, CallbackInfoReturnable cir) { if (pDirection.getAxis() == Axis.Y) @@ -39,7 +39,7 @@ public class WaterWheelFluidSpreadMixin { } else if (!AllBlocks.WATER_WHEEL.has(belowState)) return; - if (belowState.getBlock()instanceof IRotate irotate + if (belowState.getBlock() instanceof IRotate irotate && irotate.getRotationAxis(belowState) == pDirection.getAxis()) cir.setReturnValue(false); } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/SceneBuilder.java b/src/main/java/com/simibubi/create/foundation/ponder/SceneBuilder.java index a48cd5a18..5012f7d28 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/SceneBuilder.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/SceneBuilder.java @@ -369,7 +369,7 @@ public class SceneBuilder { } 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) { @@ -381,17 +381,15 @@ public class SceneBuilder { } public void showRepeaterScrollInput(BlockPos pos, int duration) { - float s = 1 / 16f; - float q = 1 / 6f; - Vec3 expands = new Vec3(q, s, q); - addInstruction( - new HighlightValueBoxInstruction(scene.getSceneBuildingUtil().vector.blockSurface(pos, Direction.DOWN) - .add(0, 3 / 16f, 0), expands, duration)); + showFilterSlotInput(scene.getSceneBuildingUtil().vector.blockSurface(pos, Direction.DOWN) + .add(0, 3 / 16f, 0), Direction.UP, duration); } - public void showFilterSlotInput(Vec3 location, int duration) { - float s = .1f; - Vec3 expands = new Vec3(s, s, s); + public void showFilterSlotInput(Vec3 location, Direction side, int duration) { + location = location.add(Vec3.atLowerCornerOf(side.getNormal()) + .scale(-3 / 128f)); + Vec3 expands = VecHelper.axisAlingedPlaneOf(side) + .scale(11 / 128f); addInstruction(new HighlightValueBoxInstruction(location, expands, duration)); } @@ -794,7 +792,8 @@ public class SceneBuilder { modifyBlockEntityNBT(selection, beType, consumer, false); } - public void modifyBlockEntity(BlockPos position, Class beType, Consumer consumer) { + public void modifyBlockEntity(BlockPos position, Class beType, + Consumer consumer) { addInstruction(scene -> { BlockEntity blockEntity = scene.getWorld() .getBlockEntity(position); @@ -813,12 +812,13 @@ public class SceneBuilder { public void instructArm(BlockPos armLocation, ArmBlockEntity.Phase phase, ItemStack heldItem, int targetedPoint) { - modifyBlockEntityNBT(scene.getSceneBuildingUtil().select.position(armLocation), ArmBlockEntity.class, compound -> { - NBTHelper.writeEnum(compound, "Phase", phase); - compound.put("HeldItem", heldItem.serializeNBT()); - compound.putInt("TargetPointIndex", targetedPoint); - compound.putFloat("MovementProgress", 0); - }); + modifyBlockEntityNBT(scene.getSceneBuildingUtil().select.position(armLocation), ArmBlockEntity.class, + compound -> { + NBTHelper.writeEnum(compound, "Phase", phase); + compound.put("HeldItem", heldItem.serializeNBT()); + compound.putInt("TargetPointIndex", targetedPoint); + compound.putFloat("MovementProgress", 0); + }); } public void flapFunnel(BlockPos position, boolean outward) { @@ -865,7 +865,8 @@ public class SceneBuilder { } public void flashDisplayLink(BlockPos position) { - modifyBlockEntity(position, DisplayLinkBlockEntity.class, linkBlockEntity -> linkBlockEntity.glow.setValue(2)); + modifyBlockEntity(position, DisplayLinkBlockEntity.class, + linkBlockEntity -> linkBlockEntity.glow.setValue(2)); } } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/ArmScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/ArmScenes.java index 52b340d01..957ea284e 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/ArmScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/ArmScenes.java @@ -123,12 +123,12 @@ public class ArmScenes { scene.world.setKineticSpeed(armSel, -48); 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.world.removeItemsFromBelt(inputDepot); scene.world.instructArm(armPos, Phase.SEARCH_OUTPUTS, copper, -1); 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.world.createItemOnBeltLike(outputDepot, Direction.UP, copper); scene.world.instructArm(armPos, Phase.SEARCH_INPUTS, ItemStack.EMPTY, -1); @@ -166,7 +166,7 @@ public class ArmScenes { scene.world.removeItemsFromBelt(inputDepot); scene.world.instructArm(armPos, Phase.SEARCH_OUTPUTS, copper, -1); 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.world.createItemOnBeltLike(outputDepot, Direction.UP, copper); 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.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.world.removeItemsFromBelt(inputDepot); scene.world.instructArm(armPos, Phase.SEARCH_OUTPUTS, sword, -1); 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.world.flapFunnel(util.grid.at(0, 2, 2), false); 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); - scene.overlay.showFilterSlotInput(filterSlot, 80); + scene.overlay.showFilterSlotInput(filterSlot, Direction.NORTH, 80); scene.idle(10); scene.overlay.showText(80) .attachKeyFrame() @@ -428,19 +428,18 @@ public class ArmScenes { .colored(PonderPalette.OUTPUT); scene.idle(70); - Vec3 scrollSlot = util.vector.of(3.5, 1.25, 4); - scene.overlay.showFilterSlotInput(scrollSlot, 120); + Vec3 scrollSlot = util.vector.of(3.5, 1 + 3 / 16f, 4); + scene.overlay.showFilterSlotInput(scrollSlot, Direction.NORTH, 120); scene.overlay.showText(50) .text("...it will act according to its setting") .pointAt(scrollSlot) .placeNearTarget(); scene.idle(60); - scene.overlay.showControls(new InputWindowElement(scrollSlot, Pointing.RIGHT).scroll() - .withWrench(), 40); + scene.overlay.showControls(new InputWindowElement(scrollSlot, Pointing.RIGHT).rightClick(), 40); scene.idle(10); 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) .placeNearTarget(); scene.idle(60); @@ -561,7 +560,7 @@ public class ArmScenes { scene.overlay.showText(60) .colored(PonderPalette.RED) .attachKeyFrame() - .pointAt(util.vector.topOf(armPos.above())) + .pointAt(util.vector.topOf(armPos)) .placeNearTarget() .text("When powered by Redstone, Mechanical Arms will not activate"); scene.idle(70); @@ -586,7 +585,7 @@ public class ArmScenes { scene.world.toggleRedstonePower(redstone); scene.effects.indicateRedstone(leverPos); scene.overlay.showText(60) - .pointAt(util.vector.topOf(armPos.above())) + .pointAt(util.vector.topOf(armPos)) .placeNearTarget() .text("Before stopping, it will finish any started cycles"); } @@ -597,7 +596,7 @@ public class ArmScenes { scene.overlay.showText(100) .colored(PonderPalette.GREEN) .attachKeyFrame() - .pointAt(util.vector.topOf(armPos.above())) + .pointAt(util.vector.topOf(armPos)) .placeNearTarget() .text("Thus, a negative pulse can be used to trigger exactly one activation cycle"); } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/BearingScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/BearingScenes.java index 317cc8b39..7add1d1b5 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/BearingScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/BearingScenes.java @@ -123,7 +123,8 @@ public class BearingScenes { scene.rotateCameraY(-90); 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.world.rotateBearing(windmill, 360, 200); scene.world.rotateSection(structure, 0, 0, 360, 200); @@ -135,7 +136,8 @@ public class BearingScenes { scene.idle(10); scene.overlay.showText(60) - .pointAt(util.vector.topOf(windmill)) + .pointAt(util.vector.topOf(windmill) + .subtract(.5, 0, 0)) .placeNearTarget() .attachKeyFrame() .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"); scene.idle(90); - Vec3 surface = util.vector.blockSurface(windmill, Direction.WEST); - scene.overlay.showControls(new InputWindowElement(surface, Pointing.DOWN).scroll() - .withWrench(), 60); - scene.overlay.showCenteredScrollInput(windmill, Direction.WEST, 50); + Vec3 surface = util.vector.blockSurface(windmill, Direction.WEST) + .add(0, 0, 2 / 16f); + scene.overlay.showControls(new InputWindowElement(surface, Pointing.DOWN).rightClick(), 60); + scene.overlay.showFilterSlotInput(surface, Direction.WEST, 50); scene.overlay.showText(60) .pointAt(surface) .attachKeyFrame() .placeNearTarget() - .text("Use a Wrench to configure its rotation direction"); + .text("Use the value panel to configure its rotation direction"); scene.idle(36); scene.world.rotateBearing(windmill, -90 - 45, 75); @@ -166,7 +168,8 @@ public class BearingScenes { scene.effects.rotationDirectionIndicator(windmill.south()); 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.world.rotateBearing(windmill, -45, 0); scene.world.rotateSection(structure, 0, 0, -45, 0); @@ -174,7 +177,8 @@ public class BearingScenes { scene.world.setKineticSpeed(kinetics, 0); scene.idle(10); scene.overlay.showText(60) - .pointAt(util.vector.topOf(windmill)) + .pointAt(util.vector.topOf(windmill) + .subtract(.5, 0, 0)) .placeNearTarget() .text("Right-click the Bearing anytime to stop and edit the Structure again"); scene.idle(30); @@ -229,7 +233,8 @@ public class BearingScenes { scene.world.modifyBlockEntity(util.grid.at(2, 1, 5), HarvesterBlockEntity.class, hte -> hte.setAnimatedSpeed(-150)); 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) { @@ -372,24 +377,24 @@ public class BearingScenes { scene.idle(50); scene.overlay.showText(100) - .pointAt(util.vector.blockSurface(bearingPos, Direction.WEST)) + .pointAt(util.vector.topOf(util.grid.at(5, 0, 4))) .placeNearTarget() .colored(PonderPalette.RED) .attachKeyFrame() .text("When Stopped, the Bearing will place the structure at the nearest grid-aligned Angle"); scene.idle(110); - scene.overlay.showCenteredScrollInput(bearingPos, Direction.NORTH, 60); - scene.overlay.showControls( - new InputWindowElement(util.vector.blockSurface(bearingPos, Direction.NORTH), Pointing.DOWN).scroll() - .withWrench(), - 60); + Vec3 blockSurface = util.vector.blockSurface(bearingPos, Direction.NORTH) + .add(0, 2 / 16f, 0); + scene.overlay.showFilterSlotInput(blockSurface, Direction.NORTH, 60); + scene.overlay.showControls(new InputWindowElement(blockSurface, Pointing.DOWN).scroll() + .withWrench(), 60); scene.idle(10); scene.overlay.showText(60) - .pointAt(util.vector.blockSurface(bearingPos, Direction.WEST)) + .pointAt(blockSurface) .placeNearTarget() .attachKeyFrame() - .sharedText("behaviour_modify_wrench"); + .sharedText("behaviour_modify_value_panel"); scene.idle(70); scene.world.modifyKineticSpeed(util.select.everywhere(), f -> -f); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/CartAssemblerScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/CartAssemblerScenes.java index 90351ed32..9cbe2378d 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/CartAssemblerScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/CartAssemblerScenes.java @@ -256,15 +256,14 @@ public class CartAssemblerScenes { scene.idle(25); Vec3 blockSurface = util.vector.blockSurface(assemblerPos, Direction.NORTH) - .add(0, 0, -2 / 16f); - scene.overlay.showScrollInput(blockSurface, Direction.NORTH, 60); - scene.overlay.showControls(new InputWindowElement(blockSurface, Pointing.DOWN).scroll() - .withWrench(), 60); + .add(0, -1 / 16f, -2 / 16f); + scene.overlay.showFilterSlotInput(blockSurface, Direction.NORTH, 60); + scene.overlay.showControls(new InputWindowElement(blockSurface, Pointing.DOWN).rightClick(), 60); scene.idle(10); scene.overlay.showText(60) .pointAt(util.vector.of(3, 1.5, 3)) .placeNearTarget() - .sharedText("behaviour_modify_wrench"); + .sharedText("behaviour_modify_value_panel"); scene.idle(70); contraption = scene.world.showIndependentSection(util.select.fromTo(3, 2, 3, 2, 2, 3), Direction.DOWN); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/ChassisScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/ChassisScenes.java index f1fcde366..0bddd3d7b 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/ChassisScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/ChassisScenes.java @@ -182,7 +182,7 @@ public class ChassisScenes { Vec3 blockSurface = util.vector.blockSurface(chassisPos, Direction.NORTH); 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); scene.idle(10); @@ -215,7 +215,7 @@ public class ChassisScenes { scene.overlay.showCenteredScrollInput(chassisPos, Direction.NORTH, 50); scene.overlay.showControls(new InputWindowElement(blockSurface, Pointing.UP).whileCTRL() - .scroll() + .rightClick() .withWrench(), 50); column1 = util.select.fromTo(1, 3, 2, 3, 3, 2); @@ -234,7 +234,7 @@ public class ChassisScenes { scene.overlay.showText(80) .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(); scene.idle(90); @@ -441,7 +441,7 @@ public class ChassisScenes { scene.addKeyframe(); blockSurface = util.vector.topOf(chassisPos); 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); scene.idle(10); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/ChuteScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/ChuteScenes.java index 9e322de8a..6af13f8f6 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/ChuteScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/ChuteScenes.java @@ -66,15 +66,29 @@ public class ChuteScenes { .withWrench(), 40); 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) .attachKeyFrame() .pointAt(util.vector.blockSurface(util.grid.at(2, 3, 2), Direction.WEST)) .placeNearTarget() .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.world.modifyBlock(util.grid.at(3, 2, 3), s -> s.setValue(SHAPE, Shape.WINDOW), false); for (int i = 0; i < 8; i++) { scene.idle(10); @@ -84,9 +98,11 @@ public class ChuteScenes { scene.world.hideIndependentSection(bottom, Direction.EAST); scene.world.hideIndependentSection(top, Direction.EAST); scene.idle(15); + scene.addKeyframe(); 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, 3, 2), s -> s.setValue(SHAPE, Shape.INTERSECTION), false); scene.world.showSection(util.select.fromTo(2, 1, 1, 2, 2, 1), Direction.DOWN); scene.idle(30); ItemStack chuteItem = AllBlocks.CHUTE.asStack(); @@ -98,7 +114,8 @@ public class ChuteScenes { scene.idle(7); scene.world.showSection(util.select.position(2, 3, 2), Direction.NORTH); scene.world.restoreBlocks(util.select.position(2, 2, 1)); - scene.idle(35); + scene.idle(15); + scene.idle(20); scene.overlay.showControls( new InputWindowElement(util.vector.blockSurface(util.grid.at(2, 3, 2), Direction.SOUTH), Pointing.LEFT) .rightClick() @@ -106,7 +123,9 @@ public class ChuteScenes { 30); scene.idle(7); 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) .attachKeyFrame() @@ -122,7 +141,8 @@ public class ChuteScenes { for (int i = 0; i < 3; i++) { remove = scene.world.createItemEntity(util.vector.centerOf(util.grid.at(2, 6, 3) .relative(offset)), util.vector.of(0, 0.1, 0) - .add(Vec3.atLowerCornerOf(offset.getNormal()).scale(-.1)), + .add(Vec3.atLowerCornerOf(offset.getNormal()) + .scale(-.1)), stack); scene.idle(12); 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.idle(10); 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) .text("Smart Chutes are vertical chutes with additional control") @@ -213,32 +231,37 @@ public class ChuteScenes { scene.idle(70); Vec3 filter = util.vector.blockSurface(smarty, Direction.NORTH) - .add(0, 0.25, 0); - scene.overlay.showFilterSlotInput(filter, 60); - 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); + .add(0, 3 / 16f, 0); + scene.overlay.showFilterSlotInput(filter, Direction.NORTH, 70); scene.idle(10); scene.rotateCameraY(20); 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() - .pointAt(filter) + .pointAt(filter.add(0, 0, 0.125)) .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++) { scene.idle(10); scene.world.createItemOnBeltLike(util.grid.at(2, 2, 2), Direction.UP, copper); if (i == 8) { 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) - .text("Use the Mouse Wheel to specify the extracted stack size") + .text("Use the value panel to specify the extracted stack size") .attachKeyFrame() - .pointAt(filter) + .pointAt(filter.add(0, 0, 0.125)) .placeNearTarget(); } if (i == 13) diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/DeployerScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/DeployerScenes.java index 68924fd08..12932087c 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/DeployerScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/DeployerScenes.java @@ -1,6 +1,7 @@ package com.simibubi.create.foundation.ponder.content; 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.curiosities.tools.SandPaperItem; 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.idle(20); - Vec3 filterSlot = frontVec.add(0.375, 0.25, 0); - scene.overlay.showFilterSlotInput(filterSlot, 80); + Vec3 filterSlot = util.vector.topOf(deployerPos) + .add(2 / 16f, 0, 0); + scene.overlay.showFilterSlotInput(filterSlot, Direction.UP, 80); scene.overlay.showText(40) .attachKeyFrame() .placeNearTarget() @@ -279,7 +281,8 @@ public class DeployerScenes { scene.overlay.showControls(new InputWindowElement(frontVec, Pointing.LEFT).rightClick() .withWrench(), 40); 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.overlay.showText(60) @@ -338,7 +341,8 @@ public class DeployerScenes { scene.overlay.showControls(new InputWindowElement(util.vector.blockSurface(pressPos.below(), Direction.EAST) .add(0, 0.15, 0), Pointing.RIGHT).withItem(tool), 30); 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); Vec3 pressSide = util.vector.blockSurface(pressPos, Direction.WEST); @@ -500,6 +504,8 @@ public class DeployerScenes { BlockPos deployerPos = util.grid.at(4, 1, 3); Selection deployerSelection = util.select.position(deployerPos); + scene.world.cycleBlockProperty(deployerPos, DeployerBlock.AXIS_ALONG_FIRST_COORDINATE); + scene.world.showSection(util.select.layer(0) .add(flowers), Direction.UP); scene.idle(5); @@ -546,10 +552,9 @@ public class DeployerScenes { scene.world.replaceBlocks(flowers, Blocks.AIR.defaultBlockState(), false); scene.world.showSection(flowers, Direction.UP); - Vec3 frontVec = util.vector.blockSurface(deployerPos.west(3), Direction.NORTH) - .add(0, 0, -.125); - Vec3 filterSlot = frontVec.add(0, 0.25, 0.375); - scene.overlay.showFilterSlotInput(filterSlot, 80); + Vec3 filterSlot = util.vector.blockSurface(deployerPos.west(3), Direction.WEST) + .add(0, 0, 2 / 16f); + scene.overlay.showFilterSlotInput(filterSlot, Direction.WEST, 80); scene.overlay.showText(60) .attachKeyFrame() .placeNearTarget() diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/DisplayScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/DisplayScenes.java index fa09e1135..41f8d7572 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/DisplayScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/DisplayScenes.java @@ -2,6 +2,8 @@ package com.simibubi.create.foundation.ponder.content; import com.simibubi.create.AllBlocks; 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.PonderPalette; import com.simibubi.create.foundation.ponder.SceneBuilder; @@ -278,26 +280,22 @@ public class DisplayScenes { scene.rotateCameraY(-60); 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); - scene.overlay - .showControls(new InputWindowElement(target, Pointing.RIGHT).withItem(new ItemStack(Items.NAME_TAG)) - .rightClick(), 40); + ItemStack clipboard = AllBlocks.CLIPBOARD.asStack(); + ClipboardOverrides.switchTo(ClipboardType.WRITTEN, clipboard); + scene.overlay.showControls(new InputWindowElement(target, Pointing.RIGHT).withItem(clipboard) + .rightClick(), 40); scene.idle(6); scene.world.setDisplayBoardText(board, 0, Components.literal("Create")); scene.idle(25); 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)) .attachKeyFrame() .placeNearTarget(); - scene.idle(40); - scene.world.hideSection(util.select.position(0, 1, 2), Direction.WEST); - scene.idle(20); - + scene.idle(80); + scene.world.showSection(depot, Direction.DOWN); scene.idle(10); scene.world.showSection(link, Direction.EAST); @@ -308,8 +306,8 @@ public class DisplayScenes { .deflate(0, 0, 3 / 16f), 60); scene.idle(20); - scene.overlay.showText(50) - .text("...or through the use of Display Links") + scene.overlay.showText(70) + .text("And dynamic text through the use of Display Links") .pointAt(target.add(-2, 0, 0)) .attachKeyFrame() .colored(PonderPalette.OUTPUT) diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/EjectorScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/EjectorScenes.java index 6373bb419..e8e2588d9 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/EjectorScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/EjectorScenes.java @@ -151,16 +151,16 @@ public class EjectorScenes { scene.world.setBlock(targetPos, AllBlocks.ANDESITE_CASING.getDefaultState(), false); 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); - scene.overlay.showControls(new InputWindowElement(topOfSlot, Pointing.DOWN).scroll() - .withWrench(), 60); - scene.overlay.showFilterSlotInput(input, 80); + scene.overlay.showControls(new InputWindowElement(topOfSlot, Pointing.DOWN).rightClick(), 60); + scene.overlay.showFilterSlotInput(input, Direction.WEST, 80); scene.idle(10); scene.overlay.showText(80) .attachKeyFrame() - .text("Using the Wrench, a required Stack Size can be configured") - .pointAt(topOfSlot) + .text("Using the value panel, a required Stack Size can be configured") + .pointAt(input.add(0, 0, 0.125)) .placeNearTarget(); scene.world.modifyBlockEntityNBT(ejectorS, EjectorBlockEntity.class, nbt -> { nbt.putInt("ScrollValue", 10); @@ -206,7 +206,7 @@ public class EjectorScenes { scene.idle(15); scene.special.changeBirbPose(birb, ParrotElement.FaceCursorPose::new); 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)) .placeNearTarget(); scene.idle(50); @@ -215,6 +215,7 @@ public class EjectorScenes { public static void splitY(SceneBuilder scene, SceneBuildingUtil util) { 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.world.showSection(util.select.layer(0), Direction.UP); scene.idle(5); @@ -224,8 +225,7 @@ public class EjectorScenes { scene.idle(10); scene.world.showSection(util.select.position(2, 1, 2), Direction.SOUTH); scene.idle(5); - scene.world.showSection(util.select.fromTo(4, 1, 2, 3, 1, 1), Direction.SOUTH); - scene.world.showSection(util.select.fromTo(2, 1, 1, 2, 1, 0), Direction.SOUTH); + scene.world.showSection(util.select.fromTo(4, 1, 2, 3, 1, 2), Direction.SOUTH); scene.idle(10); BlockPos ejectorPos = util.grid.at(2, 1, 2); @@ -238,12 +238,10 @@ public class EjectorScenes { scene.idle(90); 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( - new InputWindowElement(util.vector.topOf(tunnel), Pointing.UP).showing(AllIcons.I_TUNNEL_PREFER_NEAREST), - 60); + new InputWindowElement(util.vector.topOf(tunnel), Pointing.DOWN).showing(AllIcons.I_TUNNEL_PREFER_NEAREST), + 80); + scene.idle(10); scene.overlay.showCenteredScrollInput(tunnel, Direction.UP, 100); scene.idle(10); scene.overlay.showText(100) @@ -254,11 +252,10 @@ public class EjectorScenes { .placeNearTarget(); 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); - scene.overlay.showControls(new InputWindowElement(topOfSlot, Pointing.DOWN).scroll() - .withWrench(), 60); - scene.overlay.showFilterSlotInput(input, 80); + scene.overlay.showFilterSlotInput(input, Direction.NORTH, 80); scene.idle(10); scene.overlay.showText(80) .attachKeyFrame() @@ -272,6 +269,8 @@ public class EjectorScenes { scene.overlay.showControls(new InputWindowElement(util.vector.topOf(util.grid.at(4, 1, 3)), Pointing.DOWN) .withItem(new ItemStack(Items.COPPER_INGOT)), 20); + scene.world.showSection(coverbelt, Direction.SOUTH); + scene.idle(7); scene.world.createItemOnBelt(util.grid.at(4, 1, 3), Direction.UP, new ItemStack(Items.COPPER_INGOT, 64)); scene.idle(40); @@ -337,7 +336,7 @@ public class EjectorScenes { nbt -> nbt.putBoolean("Powered", false)); scene.idle(5); scene.world.hideSection(redstone, Direction.WEST); - scene.idle(10); + scene.idle(30); ElementLink observer = 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); @@ -366,7 +365,7 @@ public class EjectorScenes { .attachKeyFrame() .pointAt(util.vector.blockSurface(util.grid.at(4, 1, 1), Direction.NORTH)) .placeNearTarget() - .text("Furthermore, Observers can detect when Ejectors activate"); + .text("Observers can detect when Ejectors activate"); } } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/FunnelScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/FunnelScenes.java index 2490018f6..6fab18c56 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/FunnelScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/FunnelScenes.java @@ -384,10 +384,11 @@ public class FunnelScenes { scene.world.flapFunnel(andesiteFunnel, true); scene.idle(60); + Vec3 filter = util.vector.topOf(brassFunnel); scene.overlay.showText(60) .text("Brass Funnels can extract up to a full stack.") .attachKeyFrame() - .pointAt(util.vector.topOf(brassFunnel)) + .pointAt(filter) .placeNearTarget(); scene.idle(10); scene.world.createItemOnBeltLike(brassFunnel.below() @@ -395,15 +396,14 @@ public class FunnelScenes { scene.world.flapFunnel(brassFunnel, true); scene.idle(60); - AABB filterSlot = new AABB(brassFunnel).inflate(-.35, -.35, -.35) - .move(0, 0.2, 0); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.WHITE, filterSlot, filterSlot, 80); - scene.overlay.showControls(new InputWindowElement(util.vector.topOf(brassFunnel), Pointing.DOWN).scroll(), 60); + filter = filter.add(0, -5 / 16f, -1.5 / 16f); + scene.overlay.showFilterSlotInput(filter, Direction.NORTH, 80); + scene.overlay.showControls(new InputWindowElement(filter, Pointing.DOWN).rightClick(), 60); scene.idle(10); 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() - .pointAt(filterSlot.getCenter()) + .pointAt(filter) .placeNearTarget(); scene.idle(90); @@ -439,15 +439,14 @@ public class FunnelScenes { }); if (i == 2) { - scene.overlay.chaseBoundingBoxOutline(PonderPalette.WHITE, filterSlot, filterSlot, 80); - scene.overlay - .showControls(new InputWindowElement(util.vector.topOf(brassFunnel), Pointing.DOWN).rightClick() - .withItem(emerald), 60); + scene.overlay.showFilterSlotInput(filter, Direction.NORTH, 40); + scene.overlay.showControls(new InputWindowElement(filter, Pointing.DOWN).rightClick() + .withItem(emerald), 60); scene.idle(10); scene.overlay.showText(80) .text("Using items on the filter slot will restrict the funnel to only transfer matching stacks.") .attachKeyFrame() - .pointAt(filterSlot.getCenter()) + .pointAt(filter) .placeNearTarget(); scene.world.setFilterData(util.select.position(brassFunnel), FunnelBlockEntity.class, emerald); } else diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/KineticsScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/KineticsScenes.java index 46eb1ddde..f1e528d90 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/KineticsScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/KineticsScenes.java @@ -4,7 +4,7 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.AllItems; 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.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.elementary.CogWheelBlock; 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.gauge.GaugeBlock; 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.foundation.ponder.ElementLink; import com.simibubi.create.foundation.ponder.PonderPalette; @@ -62,6 +63,7 @@ public class KineticsScenes { scene.effects.indicateSuccess(gaugePos); scene.idle(10); scene.overlay.showText(1000) + .placeNearTarget() .text("Shafts will relay rotation in a straight line.") .pointAt(util.vector.of(3, 1.5, 2.5)); @@ -72,7 +74,7 @@ public class KineticsScenes { public static void shaftsCanBeEncased(SceneBuilder scene, SceneBuildingUtil util) { scene.title("shaft_casing", "Encasing Shafts"); 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 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); 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") .colored(PonderPalette.GREEN) .attachKeyFrame() .placeNearTarget() .pointAt(util.vector.blockSurface(util.grid.at(1, 2, 3), Direction.NORTH)); - scene.idle(10); + scene.idle(30); scene.effects.rotationSpeedIndicator(upperCog); scene.idle(60); @@ -594,32 +596,25 @@ public class KineticsScenes { .text("Creative motors are a compact and configurable source of Rotational Force") .placeNearTarget() .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); - Vec3 blockSurface = util.vector.blockSurface(motor, Direction.EAST); - AABB point = new AABB(blockSurface, blockSurface); - 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") + scene.overlay.showText(60) + .text("The generated speed can be configured on its input panels") .attachKeyFrame() .placeNearTarget() .pointAt(blockSurface); scene.idle(10); - scene.world.modifyKineticSpeed(util.select.fromTo(1, 1, 2, 3, 1, 2), f -> 4 * f); 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.rotateCameraY(-90); } public static void waterWheel(SceneBuilder scene, SceneBuildingUtil util) { @@ -627,11 +622,10 @@ public class KineticsScenes { scene.configureBasePlate(0, 0, 5); scene.world.showSection(util.select.layer(0), Direction.UP); scene.idle(5); - scene.world.showSection(util.select.fromTo(4, 1, 1, 4, 3, 3) - .add(util.select.fromTo(3, 1, 3, 3, 2, 3)), Direction.DOWN); + 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(0, 2, 2); + BlockPos gaugePos = util.grid.at(1, 2, 2); for (int i = 0; i < 4; i++) { scene.idle(5); @@ -641,121 +635,223 @@ public class KineticsScenes { scene.idle(10); - for (int i = 0; i < 3; i++) { + for (int i = 0; i < 2; i++) { scene.idle(5); 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); + + 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++) { scene.idle(5); scene.world.showSection(util.select.position(3, 2 - i, 1), Direction.DOWN); } - BlockPos wheel = util.grid.at(3, 2, 2); - scene.effects.rotationSpeedIndicator(wheel); + scene.idle(10); 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() - .pointAt(util.vector.topOf(wheel)); - 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)); + .pointAt(util.vector.blockSurface(wheel, Direction.NORTH)); scene.idle(80); - scene.rotateCameraY(-30); - scene.overlay.showText(70) - .text("The Wheels' blades should be oriented against the flow") - .attachKeyFrame() - .placeNearTarget() - .pointAt(util.vector.topOf(wheel)); - scene.idle(80); + + scene.addKeyframe(); ElementLink water = scene.world.makeSectionIndependent(util.select.fromTo(3, 1, 1, 3, 3, 1) .add(util.select.fromTo(3, 3, 2, 3, 3, 3))); - ElementLink 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.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.rotateSection(wheelElement, 0, 180, 0, 5); - scene.idle(10); - scene.world.modifyBlock(wheel, s -> s.setValue(WaterWheelBlock.FACING, Direction.WEST), 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(5); + ItemStack crimsonPlanks = new ItemStack(Items.CRIMSON_PLANKS); + scene.overlay.showControls(new InputWindowElement(util.vector.topOf(wheel), 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(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.world.setKineticSpeed(util.select.everywhere(), -8); + scene.effects.indicateSuccess(gaugePos); + } - scene.overlay.showText(70) - .colored(PonderPalette.RED) - .text("Facing the opposite way, they will not be as effective") - .attachKeyFrame() + public static void largeWaterWheel(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("large_water_wheel", "Generating Rotational Force using Large Water Wheels"); + scene.configureBasePlate(0, 0, 5); + scene.world.showSection(util.select.layer(0) + .substract(util.select.position(3, 0, 0)), Direction.UP); + ElementLink 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() .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(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 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.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.rotateCameraY(30); - 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.world.setKineticSpeed(util.select.everywhere(), -4); scene.effects.indicateSuccess(gaugePos); } public static void handCrank(SceneBuilder scene, SceneBuildingUtil util) { - manualSource(scene, util, true); - } - - 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.title("hand_crank", "Generating Rotational Force using Hand Cranks"); scene.configureBasePlate(0, 0, 5); scene.world.showSection(util.select.layer(0), Direction.UP); scene.idle(5); @@ -771,15 +867,17 @@ public class KineticsScenes { scene.idle(20); Vec3 centerOf = util.vector.centerOf(handlePos); + Vec3 sideOf = centerOf.add(-0.5, 0, 0); + 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() - .pointAt(centerOf); + .pointAt(sideOf); scene.idle(80); scene.overlay.showControls(new InputWindowElement(centerOf, Pointing.DOWN).rightClick(), 40); 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.effects.rotationDirectionIndicator(handlePos); scene.effects.indicateSuccess(gaugePos); @@ -788,22 +886,16 @@ public class KineticsScenes { .text("Hold Right-Click to rotate it Counter-Clockwise") .attachKeyFrame() .placeNearTarget() - .pointAt(centerOf); - 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); + .pointAt(sideOf); + scene.idle(35); scene.world.setKineticSpeed(util.select.everywhere(), 0); - scene.idle(10); + scene.idle(15); scene.overlay.showControls(new InputWindowElement(centerOf, Pointing.DOWN).rightClick() .whileSneaking(), 40); 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.effects.rotationDirectionIndicator(handlePos); scene.effects.indicateSuccess(gaugePos); @@ -812,8 +904,133 @@ public class KineticsScenes { .text("Sneak and Hold Right-Click to rotate it Clockwise") .attachKeyFrame() .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 contraption = scene.world.showIndependentSection(armS, Direction.NORTH); + scene.idle(3); + ElementLink 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.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) { @@ -930,6 +1147,9 @@ public class KineticsScenes { BlockPos wire = util.grid.at(5, 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 comparator = 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); @@ -1010,17 +1230,17 @@ public class KineticsScenes { .text("Rot. Speed Controllers relay rotation from their axis to a Large Cogwheel above them"); scene.idle(100); - Vec3 inputVec = util.vector.of(1.5, 1.75, 1); - scene.overlay.showFilterSlotInput(inputVec, 60); + Vec3 inputVec = util.vector.of(1.5, 1.75 - 1 / 16f, 1); + scene.overlay.showFilterSlotInput(inputVec, Direction.NORTH, 60); scene.overlay.showText(70) .placeNearTarget() .attachKeyFrame() .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); - InputWindowElement input = new InputWindowElement(inputVec, Pointing.UP).scroll(); + InputWindowElement input = new InputWindowElement(inputVec, Pointing.UP).rightClick(); scene.overlay.showControls(input, 40); scene.idle(15); scene.world.multiplyKineticSpeed(util.select.fromTo(1, 2, 1, 1, 2, 3), 4); @@ -1073,7 +1293,7 @@ public class KineticsScenes { scene.overlay.showText(80) .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() .pointAt(util.vector.topOf(gaugePos)) .placeNearTarget(); @@ -1106,7 +1326,7 @@ public class KineticsScenes { Vec3 blockSurface = util.vector.blockSurface(gaugePos, Direction.NORTH); 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.overlay.showText(80) .text("When wearing Engineers' Goggles, the player can get more detailed information from the Gauge") diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/MechanicalSawScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/MechanicalSawScenes.java index 976c4e5f9..4081357b9 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/MechanicalSawScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/MechanicalSawScenes.java @@ -109,6 +109,8 @@ public class MechanicalSawScenes { scene.idle(3); scene.addKeyframe(); + scene.world.multiplyKineticSpeed(util.select.everywhere(), .5f); + ElementLink beltSection = scene.world.showIndependentSection(belt, Direction.EAST); scene.world.moveSection(beltSection, util.vector.of(0, 100, 0), 0); scene.idle(1); @@ -132,24 +134,16 @@ public class MechanicalSawScenes { ItemStack stone = new ItemStack(Blocks.STONE); BlockPos firstBelt = util.grid.at(0, 1, 2); - scene.world.createItemOnBelt(firstBelt, Direction.WEST, stone); scene.overlay.showText(60) .text("Saws can work in-line with Mechanical Belts") .pointAt(util.vector.blockSurface(firstBelt, Direction.WEST)) .placeNearTarget(); - scene.idle(60); - scene.rotateCameraY(-90); - 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); + scene.world.createItemOnBelt(firstBelt, Direction.WEST, stone); + 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) .attachKeyFrame() .text("When an ingredient has multiple possible outcomes, the filter slot can specify it") @@ -157,9 +151,14 @@ public class MechanicalSawScenes { .placeNearTarget(); 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.idle(20); + scene.idle(50); scene.markAsFinished(); scene.overlay.showText(100) @@ -251,7 +250,8 @@ public class MechanicalSawScenes { } 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 z = 2; z <= 3; z++) { Vec3 dropPos = util.vector.centerOf(x, i + 1, z); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/MovementActorScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/MovementActorScenes.java index afd381948..76b1b15e4 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/MovementActorScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/MovementActorScenes.java @@ -51,7 +51,7 @@ public class MovementActorScenes { .colored(PonderPalette.RED) .placeNearTarget() .attachKeyFrame() - .text("Inventories on moving contraptions cannot be accessed by players."); + .text("Moving inventories can be tricky to access with automation."); scene.idle(70); BlockPos psi = util.grid.at(4, 2, 2); @@ -84,17 +84,17 @@ public class MovementActorScenes { .placeNearTarget() .pointAt(util.vector.of(3, 3, 2.5)) .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); Class psiClass = PortableItemInterfaceBlockEntity.class; scene.world.modifyBlockEntityNBT(both, psiClass, nbt -> { 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.idle(10); @@ -154,7 +154,7 @@ public class MovementActorScenes { .placeNearTarget() .pointAt(util.vector.topOf(psi2)) .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.markAsFinished(); @@ -171,7 +171,7 @@ public class MovementActorScenes { Selection psis = util.select.fromTo(1, 1, 3, 1, 3, 3); scene.world.modifyBlockEntityNBT(psis, psiClass, nbt -> { nbt.putFloat("Distance", 1); - nbt.putFloat("Timer", 40); + nbt.putFloat("Timer", 12); }); scene.world.showSection(util.select.layer(0), Direction.UP); @@ -184,8 +184,7 @@ public class MovementActorScenes { BlockPos bearing = util.grid.at(3, 1, 3); scene.world.configureCenterOfRotation(contraption, util.vector.topOf(bearing)); scene.idle(20); - scene.world.modifyBlockEntityNBT(psis, psiClass, nbt -> nbt.putFloat("Timer", 9)); - scene.idle(20); + scene.world.modifyBlockEntityNBT(psis, psiClass, nbt -> nbt.putFloat("Timer", 2)); scene.world.rotateBearing(bearing, 360 * 3 + 270, 240 + 60); scene.world.rotateSection(contraption, 0, 360 * 3 + 270, 0, 240 + 60); scene.idle(20); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/PistonScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/PistonScenes.java index a561f1ff8..5cccc6f18 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/PistonScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/PistonScenes.java @@ -21,6 +21,7 @@ import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.DoublePlantBlock; import net.minecraft.world.level.block.state.properties.DoubleBlockHalf; import net.minecraft.world.level.block.state.properties.PistonType; +import net.minecraft.world.phys.Vec3; public class PistonScenes { @@ -270,14 +271,15 @@ public class PistonScenes { scene.world.setBlock(util.grid.at(0, 2, 2), Blocks.ROSE_BUSH.defaultBlockState() .setValue(DoublePlantBlock.HALF, DoubleBlockHalf.UPPER), false); scene.world.showIndependentSection(rose, Direction.DOWN); - scene.overlay.showCenteredScrollInput(piston, Direction.UP, 60); - scene.overlay.showControls(new InputWindowElement(util.vector.topOf(piston), Pointing.DOWN).scroll() - .withWrench(), 60); + Vec3 filter = util.vector.topOf(piston) + .add(.125, 0, 0); + 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) - .pointAt(util.vector.topOf(piston)) + .pointAt(filter.add(-.125, 0, 0)) .placeNearTarget() .attachKeyFrame() - .sharedText("behaviour_modify_wrench"); + .sharedText("behaviour_modify_value_panel"); scene.idle(80); scene.effects.indicateRedstone(leverPos); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/PonderIndex.java b/src/main/java/com/simibubi/create/foundation/ponder/content/PonderIndex.java index f0465a76a..b729686cc 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/PonderIndex.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/PonderIndex.java @@ -77,6 +77,9 @@ public class PonderIndex { .addStoryBoard("creative_motor_mojang", KineticsScenes::creativeMotorMojang); HELPER.addStoryBoard(AllBlocks.WATER_WHEEL, "water_wheel", KineticsScenes::waterWheel, 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.COPPER_VALVE_HANDLE, "valve_handle", KineticsScenes::valveHandle, @@ -368,6 +371,7 @@ public class PonderIndex { .add(AllBlocks.HAND_CRANK) .add(AllBlocks.COPPER_VALVE_HANDLE) .add(AllBlocks.WATER_WHEEL) + .add(AllBlocks.LARGE_WATER_WHEEL) .add(AllBlocks.WINDMILL_BEARING) .add(AllBlocks.STEAM_ENGINE) .add(AllBlocks.CREATIVE_MOTOR); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/ProcessingScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/ProcessingScenes.java index 018636dd7..812f24053 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/ProcessingScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/ProcessingScenes.java @@ -450,7 +450,7 @@ public class ProcessingScenes { scene.idle(60); 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) .pointAt(filterPos) .placeNearTarget() @@ -551,7 +551,7 @@ public class ProcessingScenes { scene.idle(60); 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) .pointAt(filterPos) .placeNearTarget() @@ -679,11 +679,6 @@ public class ProcessingScenes { 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.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.idle(20); @@ -905,8 +900,8 @@ public class ProcessingScenes { .placeNearTarget(); scene.idle(80); - Vec3 filter = util.vector.of(2.5, 2.85, 2.5); - scene.overlay.showFilterSlotInput(filter, 80); + Vec3 filter = util.vector.of(2.5, 2.825, 2.5); + scene.overlay.showFilterSlotInput(filter, Direction.EAST, 80); scene.overlay.showText(70) .text("A Filter might be necessary to avoid pulling out un-processed items") .pointAt(filter) diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/PulleyScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/PulleyScenes.java index 482c4f36e..5f188bf24 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/PulleyScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/PulleyScenes.java @@ -164,13 +164,13 @@ public class PulleyScenes { scene.world.setBlock(flowerPos, Blocks.BLUE_ORCHID.defaultBlockState(), false); scene.world.showSection(util.select.position(flowerPos), Direction.DOWN); scene.overlay.showCenteredScrollInput(pulleyPos, Direction.UP, 60); - scene.overlay.showControls(new InputWindowElement(util.vector.topOf(pulleyPos), Pointing.DOWN).scroll() - .withWrench(), 60); + scene.overlay.showControls(new InputWindowElement(util.vector.topOf(pulleyPos), Pointing.DOWN).rightClick(), + 60); scene.overlay.showText(70) .pointAt(util.vector.topOf(pulleyPos)) .placeNearTarget() .attachKeyFrame() - .sharedText("behaviour_modify_wrench"); + .sharedText("behaviour_modify_value_panel"); scene.idle(80); scene.world.toggleRedstonePower(redstoneStuff); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/RedstoneScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/RedstoneScenes.java index 8648fae58..92f479493 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/RedstoneScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/RedstoneScenes.java @@ -3,6 +3,8 @@ package com.simibubi.create.foundation.ponder.content; import com.simibubi.create.AllBlocks; 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.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.PoweredLatchBlock; import com.simibubi.create.content.logistics.block.diodes.PulseExtenderBlockEntity; @@ -244,10 +246,10 @@ public class RedstoneScenes { scene.idle(50); 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.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() .placeNearTarget() .pointAt(circuitTop); @@ -264,7 +266,7 @@ public class RedstoneScenes { scene.world.toggleRedstonePower(util.select.fromTo(4, 1, 2, 2, 1, 2)); scene.idle(15); 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() .pointAt(circuitTop); scene.idle(70); @@ -308,7 +310,7 @@ public class RedstoneScenes { scene.idle(15); 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() .placeNearTarget() .pointAt(circuitTop); @@ -317,10 +319,10 @@ public class RedstoneScenes { scene.idle(70); 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.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() .placeNearTarget() .pointAt(circuitTop); @@ -332,7 +334,7 @@ public class RedstoneScenes { scene.world.toggleRedstonePower(util.select.fromTo(4, 1, 2, 2, 1, 2)); scene.idle(60); scene.overlay.showText(50) - .text("Configured delays can range up to 30 minutes") + .text("Configured delays can range up to an hour") .placeNearTarget() .pointAt(circuitTop); scene.idle(60); @@ -536,7 +538,8 @@ public class RedstoneScenes { for (int i = 0; i < 7; i++) { scene.idle(2); 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.effects.indicateRedstone(wireLocations[i]); } @@ -613,7 +616,7 @@ public class RedstoneScenes { scene.overlay.showText(60) .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() .pointAt(util.vector.blockSurface(util.grid.at(2, 1, 3), Direction.WEST)); scene.idle(70); @@ -626,8 +629,10 @@ public class RedstoneScenes { scene.world.showSection(tubes, Direction.DOWN); 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() - .withItem(new ItemStack(Items.NAME_TAG)), 40); + .withItem(clipboard), 40); scene.idle(7); Component component = Components.literal("CREATE"); @@ -649,7 +654,7 @@ public class RedstoneScenes { scene.overlay.showText(80) .attachKeyFrame() .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)) .add(-.75, -.05f, 0)); scene.idle(90); @@ -754,17 +759,17 @@ public class RedstoneScenes { scene.world.toggleRedstonePower(util.select.fromTo(3, 2, 3, 1, 2, 2)); scene.idle(20); - Vec3 frontSlot = link1Vec.add(.18, -.05, -.15); - Vec3 backSlot = link1Vec.add(.18, -.05, .15); - Vec3 top2Slot = link2Vec.add(-.09, .15, 0); - Vec3 bottom2Slot = link2Vec.add(-.09, -.2, 0); - Vec3 top3Slot = link3Vec.add(-.09, .15, 0); - Vec3 bottom3Slot = link3Vec.add(-.09, -.2, 0); + Vec3 frontSlot = link1Vec.add(0, .025, -.15); + Vec3 backSlot = link1Vec.add(0, .025, .15); + Vec3 top2Slot = link2Vec.add(0, .15, 0); + Vec3 bottom2Slot = link2Vec.add(0, -.2, 0); + Vec3 top3Slot = link3Vec.add(0, .15, 0); + Vec3 bottom3Slot = link3Vec.add(0, -.2, 0); scene.addKeyframe(); scene.idle(10); - scene.overlay.showFilterSlotInput(frontSlot, 100); - scene.overlay.showFilterSlotInput(backSlot, 100); + scene.overlay.showFilterSlotInput(frontSlot, Direction.UP, 100); + scene.overlay.showFilterSlotInput(backSlot, Direction.UP, 100); scene.idle(10); scene.overlay.showText(50) @@ -777,9 +782,9 @@ public class RedstoneScenes { ItemStack gold = new ItemStack(Items.GOLD_INGOT); 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.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, nbt -> nbt.put("FrequencyLast", iron.save(new CompoundTag()))); scene.idle(7); @@ -787,9 +792,9 @@ public class RedstoneScenes { nbt -> nbt.put("FrequencyFirst", sapling.save(new CompoundTag()))); 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.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, nbt -> nbt.put("FrequencyLast", iron.save(new CompoundTag()))); scene.idle(7); @@ -797,9 +802,9 @@ public class RedstoneScenes { nbt -> nbt.put("FrequencyFirst", sapling.save(new CompoundTag()))); 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.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, nbt -> nbt.put("FrequencyLast", gold.save(new CompoundTag()))); scene.idle(7); @@ -809,15 +814,23 @@ public class RedstoneScenes { scene.world.toggleRedstonePower(redstone); scene.effects.indicateRedstone(leverPos); - scene.idle(5); + scene.idle(2); scene.world.toggleRedstonePower(util.select.fromTo(1, 2, 2, 1, 2, 3)); - scene.effects.indicateRedstone(link2Pos); scene.overlay.showText(90) .attachKeyFrame() .text("Only the links with matching Frequencies will communicate") .placeNearTarget() .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); + } } } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/SharedText.java b/src/main/java/com/simibubi/create/foundation/ponder/content/SharedText.java index aa04c28aa..3b1399616 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/SharedText.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/SharedText.java @@ -18,8 +18,8 @@ public class SharedText { add("rpm16_source", "Source: 16 RPM"); add("rpm32", "32 RPM"); - 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("movement_anchors", "With the help of Super Glue, larger structures can be moved"); + 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"); } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/SteamScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/SteamScenes.java index bce07dd0f..78fc1d0f4 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/SteamScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/SteamScenes.java @@ -4,6 +4,7 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.AllItems; 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.fluids.PumpBlock; 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.relays.elementary.ShaftBlock; @@ -220,7 +221,11 @@ public class SteamScenes { Selection pump1 = util.select.fromTo(5, 2, 2, 4, 1, 1); Selection pump2 = util.select.fromTo(5, 2, 7, 4, 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); ElementLink tankElement = scene.world.showIndependentSection(tank, Direction.DOWN); scene.world.moveSection(tankElement, util.vector.of(0, -1, 0), 0); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/TunnelScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/TunnelScenes.java index ea222d0d4..e25482929 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/TunnelScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/TunnelScenes.java @@ -156,7 +156,7 @@ public class TunnelScenes { if (d == Direction.SOUTH) continue; Vec3 filter = getTunnelFilterVec(tunnelPos, d); - scene.overlay.showFilterSlotInput(filter, 40); + scene.overlay.showFilterSlotInput(filter, d, 40); scene.idle(3); } @@ -171,7 +171,7 @@ public class TunnelScenes { scene.idle(20); Vec3 tunnelFilterVec = getTunnelFilterVec(tunnelPos, Direction.EAST); - scene.overlay.showFilterSlotInput(tunnelFilterVec, 40); + scene.overlay.showFilterSlotInput(tunnelFilterVec, Direction.EAST, 10); scene.overlay.showText(60) .attachKeyFrame() .pointAt(tunnelFilterVec) @@ -194,9 +194,9 @@ public class TunnelScenes { .setFilter(Direction.EAST, ItemStack.EMPTY)); tunnelFilterVec = getTunnelFilterVec(tunnelPos, Direction.NORTH); - scene.overlay.showFilterSlotInput(tunnelFilterVec, 40); + scene.overlay.showFilterSlotInput(tunnelFilterVec, Direction.NORTH, 40); tunnelFilterVec = getTunnelFilterVec(tunnelPos, Direction.WEST); - scene.overlay.showFilterSlotInput(tunnelFilterVec, 40); + scene.overlay.showFilterSlotInput(tunnelFilterVec, Direction.WEST, 40); scene.overlay.showText(60) .attachKeyFrame() .pointAt(tunnelFilterVec) @@ -227,9 +227,6 @@ public class TunnelScenes { scene.idle(10); 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.showText(120) .attachKeyFrame() @@ -340,7 +337,8 @@ public class TunnelScenes { protected static Vec3 getTunnelFilterVec(BlockPos pos, Direction d) { return VecHelper.getCenterOf(pos) - .add(Vec3.atLowerCornerOf(d.getNormal()).scale(.5)) + .add(Vec3.atLowerCornerOf(d.getNormal()) + .scale(.5)) .add(0, 0.3, 0); } @@ -360,15 +358,14 @@ public class TunnelScenes { } Vec3 tunnelTop = util.vector.topOf(util.grid.at(2, 2, 3)); - scene.overlay.showControls(new InputWindowElement(tunnelTop, Pointing.DOWN).scroll() - .withWrench(), 80); + scene.overlay.showControls(new InputWindowElement(tunnelTop, Pointing.DOWN).rightClick(), 80); scene.idle(7); scene.overlay.showCenteredScrollInput(util.grid.at(2, 2, 3), Direction.UP, 120); scene.overlay.showText(120) .attachKeyFrame() .pointAt(tunnelTop) .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); Class tunnelClass = BrassTunnelBlockEntity.class; diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/fluid/FluidMovementActorScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/fluid/FluidMovementActorScenes.java index dc685b561..167b45029 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/fluid/FluidMovementActorScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/fluid/FluidMovementActorScenes.java @@ -2,6 +2,7 @@ package com.simibubi.create.foundation.ponder.content.fluid; import com.simibubi.create.AllFluids; 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.foundation.fluid.FluidHelper; import com.simibubi.create.foundation.ponder.ElementLink; @@ -47,6 +48,8 @@ public class FluidMovementActorScenes { ItemStack bucket = AllFluids.CHOCOLATE.get() .getAttributes() .getBucket(chocolate); + + scene.world.modifyBlock(pumpPos, s -> s.setValue(PumpBlock.FACING, Direction.NORTH), false); scene.world.modifyBlockEntity(st, type, be -> be.getCapability(fhc) .ifPresent(ifh -> ifh.fill(FluidHelper.copyStackWithAmount(chocolate, 10000), FluidAction.EXECUTE))); @@ -98,17 +101,17 @@ public class FluidMovementActorScenes { .placeNearTarget() .pointAt(util.vector.of(3, 3, 2.5)) .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); Class psiClass = PortableFluidInterfaceBlockEntity.class; scene.world.modifyBlockEntityNBT(both, psiClass, nbt -> { 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.idle(10); @@ -160,7 +163,7 @@ public class FluidMovementActorScenes { .placeNearTarget() .pointAt(util.vector.topOf(pumpPos)) .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.idle(30); @@ -188,7 +191,7 @@ public class FluidMovementActorScenes { .attachKeyFrame() .pointAt(util.vector.topOf(psi2)) .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.world.rotateBearing(bearing, 270, 120); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/fluid/FluidTankScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/fluid/FluidTankScenes.java index b3320bdfb..347d0967e 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/fluid/FluidTankScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/fluid/FluidTankScenes.java @@ -4,6 +4,7 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.AllFluids; import com.simibubi.create.Create; 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.tank.CreativeFluidTankBlockEntity; import com.simibubi.create.content.contraptions.fluids.tank.CreativeFluidTankBlockEntity.CreativeSmartFluidTank; @@ -91,20 +92,16 @@ public class FluidTankScenes { scene.idle(5); scene.world.setKineticSpeed(pump, 0); scene.world.showSection(pipe, Direction.EAST); + scene.world.modifyBlock(pumpPos, s -> s.setValue(PumpBlock.FACING, Direction.SOUTH), false); scene.idle(10); scene.world.showSection(largeCog1, Direction.UP); scene.world.showSection(kinetics1, Direction.WEST); scene.idle(10); 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); - 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.effects.rotationDirectionIndicator(pumpPos); scene.world.modifyBlockEntity(util.grid.at(2, 0, 5), FluidTankBlockEntity.class, be -> be.getTankInventory() .fill(content, FluidAction.EXECUTE)); scene.idle(20); @@ -122,10 +119,8 @@ public class FluidTankScenes { .pointAt(util.vector.centerOf(1, 1, 2)); scene.idle(40); - scene.world.toggleRedstonePower(pumpRedstone); - scene.world.multiplyKineticSpeed(pumpCogs, -1); + scene.world.modifyBlock(pumpPos, s -> s.setValue(PumpBlock.FACING, Direction.NORTH), true); scene.world.propagatePipeChange(pumpPos); - scene.effects.rotationDirectionIndicator(pumpPos); for (int i = 0; i < 4; i++) { scene.world.modifyBlockEntity(tankPos, FluidTankBlockEntity.class, be -> be.getTankInventory() .fill(FluidHelper.copyStackWithAmount(content, 2000), FluidAction.EXECUTE)); @@ -395,25 +390,24 @@ public class FluidTankScenes { scene.idle(7); scene.world.showSection(tank, Direction.DOWN); scene.idle(5); + + scene.rotateCameraY(-30); scene.world.showSection(largeCog, Direction.UP); scene.world.showSection(cog, 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.effects.rotationDirectionIndicator(pumpPos); scene.idle(40); scene.overlay.showText(70) .text("Pipe Networks can now endlessly draw the assigned fluid from the tank") .attachKeyFrame() - .placeNearTarget() .pointAt(util.vector.blockSurface(util.grid.at(3, 1, 2), Direction.WEST)); 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.effects.rotationDirectionIndicator(pumpPos); scene.idle(40); scene.overlay.showText(70) diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/fluid/HosePulleyScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/fluid/HosePulleyScenes.java index eea561dab..fdd8b92a0 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/fluid/HosePulleyScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/fluid/HosePulleyScenes.java @@ -4,8 +4,10 @@ import java.util.Collections; import java.util.LinkedList; 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.HosePulleyFluidHandler; +import com.simibubi.create.content.contraptions.fluids.tank.FluidTankBlockEntity; import com.simibubi.create.foundation.ponder.ElementLink; import com.simibubi.create.foundation.ponder.PonderPalette; import com.simibubi.create.foundation.ponder.SceneBuilder; @@ -120,14 +122,15 @@ public class HosePulleyScenes { 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 .getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY) .ifPresent( 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.idle(16); scene.world.setKineticSpeed(kinetics, 0); @@ -206,6 +209,7 @@ public class HosePulleyScenes { .pointAt(util.vector.blockSurface(hosePos.below(), Direction.UP)); 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); scene.world.setKineticSpeed(kinetics, 32); scene.idle(50); @@ -220,11 +224,10 @@ public class HosePulleyScenes { scene.world.showSectionAndMerge(cogs, Direction.NORTH, 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, be -> be - .getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY) - .ifPresent( - fh -> ((HosePulleyFluidHandler) fh).fill(new FluidStack(Fluids.WATER, 100), FluidAction.EXECUTE))); + scene.world.modifyBlockEntity(util.grid.at(1, 6, 1), HosePulleyBlockEntity.class, + be -> be.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY) + .ifPresent( + fh -> ((HosePulleyFluidHandler) fh).fill(new FluidStack(Fluids.WATER, 100), FluidAction.EXECUTE))); scene.world.propagatePipeChange(util.grid.at(3, 2, 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)); 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.world.hideSection(water, Direction.SOUTH); scene.idle(15); @@ -263,6 +263,8 @@ public class HosePulleyScenes { scene.world.showSection(water, Direction.UP); scene.idle(15); 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.world.setKineticSpeed(kinetics, 0); @@ -313,6 +315,9 @@ public class HosePulleyScenes { Selection hose = util.select.fromTo(1, 3, 2, 0, 3, 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.idle(5); scene.world.showSection(tank, Direction.DOWN); @@ -333,10 +338,13 @@ public class HosePulleyScenes { .pointAt(entryPoint); 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.multiplyKineticSpeed(util.select.everywhere(), -1); + scene.world.modifyBlock(pumpPos, s -> s.setValue(PumpBlock.FACING, Direction.DOWN), true); scene.world.propagatePipeChange(pumpPos); - scene.effects.rotationDirectionIndicator(pumpPos); scene.idle(30); Selection pulleyPos = util.select.position(1, 3, 2); @@ -347,7 +355,13 @@ public class HosePulleyScenes { .placeNearTarget() .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) .text("Pipe networks can limitlessly take fluids from/to such pulleys") .attachKeyFrame() diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/fluid/PipeScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/fluid/PipeScenes.java index c6fd711dc..4da1146f8 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/fluid/PipeScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/fluid/PipeScenes.java @@ -138,7 +138,8 @@ public class PipeScenes { scene.world.showSection(largeCog, Direction.UP); scene.world.showSection(kinetics, Direction.SOUTH); 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.overlay.showText(70) @@ -151,7 +152,7 @@ public class PipeScenes { .colored(PonderPalette.RED) .placeNearTarget() .text("No fluid is being extracted at first"); - scene.idle(90); + scene.idle(70); scene.overlay.showOutline(PonderPalette.GREEN, new Object(), tank, 100); scene.idle(5); @@ -216,7 +217,8 @@ public class PipeScenes { scene.idle(5); scene.world.showSection(kinetics, Direction.NORTH); 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); scene.world.modifyBlockEntity(drainPos, ItemDrainBlockEntity.class, 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() .setValue(AxisPipeBlock.AXIS, Axis.Z), false); scene.idle(10); - scene.world.multiplyKineticSpeed(util.select.everywhere(), 2); +// scene.world.multiplyKineticSpeed(util.select.everywhere(), 2); scene.world.propagatePipeChange(pumpPos); ElementLink water = scene.world.showIndependentSection(waterSourceS, Direction.DOWN); scene.world.moveSection(water, util.vector.of(0, 0, 1), 0); @@ -427,11 +429,13 @@ public class PipeScenes { .attachKeyFrame() .pointAt(util.vector.topOf(valvePos)); scene.idle(60); - scene.world.showSection(util.select.position(handlePos), Direction.DOWN); + ElementLink handleLink = + scene.world.showIndependentSection(util.select.position(handlePos), Direction.DOWN); scene.idle(15); Selection valveKinetics = util.select.fromTo(2, 1, 1, 2, 2, 1); scene.world.setKineticSpeed(valveKinetics, 16); + scene.world.rotateSection(handleLink, 0, 90, 0, 22); scene.effects.rotationSpeedIndicator(handlePos); scene.world.modifyBlockEntity(valvePos, FluidValveBlockEntity.class, be -> be.onSpeedChanged(0)); scene.idle(22); @@ -455,6 +459,7 @@ public class PipeScenes { scene.idle(40); scene.world.setKineticSpeed(valveKinetics, -16); + scene.world.rotateSection(handleLink, 0, -90, 0, 22); scene.effects.rotationSpeedIndicator(handlePos); scene.world.modifyBlockEntity(valvePos, FluidValveBlockEntity.class, be -> be.onSpeedChanged(0)); scene.idle(22); @@ -513,7 +518,6 @@ public class PipeScenes { scene.overlay.showText(50) .placeNearTarget() .text("Smart pipes can help control flows by fluid type") - .attachKeyFrame() .pointAt(filterVec); scene.idle(60); @@ -543,17 +547,16 @@ public class PipeScenes { scene.idle(50); scene.world.showSection(kinetics2, Direction.WEST); - scene.world.setKineticSpeed(kinetics2, 64); + scene.world.setKineticSpeed(kinetics2, 24); scene.idle(5); scene.world.showSection(kinetics1, Direction.EAST); - scene.world.setKineticSpeed(kinetics1, -64); + scene.world.setKineticSpeed(kinetics1, -24); scene.idle(10); - scene.world.setKineticSpeed(pump, 128); + scene.world.setKineticSpeed(pump, 48); scene.world.propagatePipeChange(pumpPos); - scene.idle(120); + scene.idle(100); scene.world.setKineticSpeed(util.select.everywhere(), 0); scene.world.propagatePipeChange(pumpPos); - scene.effects.rotationSpeedIndicator(pumpPos); scene.idle(15); scene.world.showSection(tank2, Direction.DOWN); 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.idle(30); - scene.world.setKineticSpeed(kinetics2, 64); - scene.world.setKineticSpeed(kinetics1, -64); - scene.world.setKineticSpeed(pump, 128); + scene.world.setKineticSpeed(kinetics2, 24); + scene.world.setKineticSpeed(kinetics1, -24); + scene.world.setKineticSpeed(pump, 48); scene.world.propagatePipeChange(pumpPos); scene.effects.rotationSpeedIndicator(pumpPos); scene.idle(40); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/fluid/PumpScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/fluid/PumpScenes.java index 52b5ecfb1..f45a966c2 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/fluid/PumpScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/fluid/PumpScenes.java @@ -76,7 +76,7 @@ public class PumpScenes { scene.idle(15); scene.overlay.showText(60) - .text("When powered, their arrow indicates the direction of flow") + .text("Their arrow indicates the direction of flow") .attachKeyFrame() .placeNearTarget() .pointAt(util.vector.topOf(pumpPos) @@ -124,23 +124,17 @@ public class PumpScenes { scene.world.propagatePipeChange(pumpPos); scene.idle(15); - scene.overlay.showText(70) - .text("Reversing the input rotation reverses the direction of flow") + scene.overlay.showText(60) + .text("The pumps direction is unaffected by the input rotation") + .colored(PonderPalette.RED) .placeNearTarget() .attachKeyFrame() .pointAt(util.vector.topOf(pumpPos) .subtract(0.5f, 0.125f, 0)); scene.idle(25); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.INPUT, in, bb1.move(util.vector.centerOf(1, 1, 3)), 3); - scene.idle(2); - 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.chaseBoundingBoxOutline(PonderPalette.RED, in, new AABB(leverPos.below()), 30); + scene.idle(45); scene.overlay.showControls(new InputWindowElement(util.vector.topOf(pumpPos), Pointing.DOWN).rightClick() .withWrench(), 40); @@ -150,7 +144,7 @@ public class PumpScenes { .attachKeyFrame() .pointAt(util.vector.centerOf(2, 1, 1)) .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.idle(40); @@ -182,9 +176,11 @@ public class PumpScenes { Selection tank2 = util.select.fromTo(0, 1, 2, 0, 2, 2); Selection megapipe1 = util.select.fromTo(0, 3, 5, 1, 4, 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() .drain(3000, FluidAction.EXECUTE)); + scene.world.multiplyKineticSpeed(util.select.everywhere(), 0.125f); BlockPos east = pumpPos.east(); scene.world.setBlock(east, Blocks.AIR.defaultBlockState(), false); @@ -194,7 +190,7 @@ public class PumpScenes { scene.world.setBlock(pumpPos.south(), AllBlocks.COGWHEEL.getDefaultState() .setValue(CogWheelBlock.AXIS, Axis.X), false); Selection southPump = util.select.position(pumpPos.south()); - scene.world.setKineticSpeed(southPump, 32); + scene.world.setKineticSpeed(southPump, 4); scene.world.setKineticSpeed(pump, 0); scene.world.showSection(pump, Direction.DOWN); @@ -231,12 +227,12 @@ public class PumpScenes { scene.world.showSection(largeCog, Direction.UP); scene.world.showSection(cogs, Direction.SOUTH); scene.idle(10); - scene.world.setKineticSpeed(util.select.position(pumpPos), -32); + scene.world.setKineticSpeed(util.select.position(pumpPos), -4); scene.effects.rotationSpeedIndicator(pumpPos); scene.world.propagatePipeChange(pumpPos); scene.idle(40); - scene.world.multiplyKineticSpeed(util.select.everywhere(), 4); + scene.world.multiplyKineticSpeed(util.select.everywhere(), 8); scene.effects.rotationSpeedIndicator(pumpPos); scene.world.propagatePipeChange(pumpPos); scene.idle(20); @@ -251,7 +247,7 @@ public class PumpScenes { scene.overlay.showText(50) .pointAt(util.vector.blockSurface(util.grid.at(0, 1, 2), Direction.WEST)) .placeNearTarget() - .text("...aswell as how quickly fluids are transferred"); + .text("...and the speed at which fluids are transferred"); scene.idle(60); 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.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.showSection(northPump, Direction.DOWN); 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"); 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.overlay .showControls(new InputWindowElement(util.vector.topOf(pumpPos.north()), Pointing.DOWN).rightClick() @@ -317,10 +308,10 @@ public class PumpScenes { .pointAt(util.vector.topOf(pumpPos.north()) .subtract(0.5f, 0.125f, 0)) .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.world.multiplyKineticSpeed(util.select.everywhere(), 8); + scene.world.multiplyKineticSpeed(util.select.everywhere(), 4); scene.effects.rotationSpeedIndicator(pumpPos); scene.effects.rotationSpeedIndicator(pumpPos.north()); scene.effects.rotationSpeedIndicator(pumpPos.south()); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/fluid/SpoutScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/fluid/SpoutScenes.java index 3002654b7..2a881ec36 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/fluid/SpoutScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/fluid/SpoutScenes.java @@ -3,6 +3,7 @@ package com.simibubi.create.foundation.ponder.content.fluid; import com.simibubi.create.AllFluids; import com.simibubi.create.Create; 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.foundation.fluid.FluidHelper; 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.moveSection(depot, util.vector.of(0, 0, 1), 0); 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 kinetics = util.select.fromTo(2, 1, 5, 2, 2, 3); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/trains/TrackObserverScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/trains/TrackObserverScenes.java index 0742889fb..dafc3bd91 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/trains/TrackObserverScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/trains/TrackObserverScenes.java @@ -107,8 +107,7 @@ public class TrackObserverScenes { target = util.vector.topOf(5, 1, 4); bb = new AABB(target, target); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.WHITE, bb, bb, 1); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.WHITE, bb, bb.inflate(.2f, 0, .2f), 60); + scene.overlay.showCenteredScrollInput(util.grid.at(5, 1, 4), Direction.UP, 60); scene.overlay.showText(80) .pointAt(util.vector.topOf(5, 1, 4)) diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/trains/TrainSignalScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/trains/TrainSignalScenes.java index 74f8575cb..a72ce7be8 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/trains/TrainSignalScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/trains/TrainSignalScenes.java @@ -539,7 +539,7 @@ public class TrainSignalScenes { .pointAt(util.vector.blockSurface(util.grid.at(3, 2, 3), Direction.WEST)) .attachKeyFrame() .placeNearTarget() - .text("Reversely, red signals emit a comparator output"); + .text("Conversely, red signals emit a comparator output"); scene.idle(40); scene.world.toggleControls(util.grid.at(6, 3, 5)); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/element/TextWindowElement.java b/src/main/java/com/simibubi/create/foundation/ponder/element/TextWindowElement.java index 6d792a8af..41d89f8c2 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/element/TextWindowElement.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/element/TextWindowElement.java @@ -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.PonderPalette; 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.utility.Color; @@ -94,35 +95,44 @@ public class TextWindowElement extends AnimatedOverlayElement { bakedText = textGetter.get(); if (fade < 1 / 16f) return; - Vec2 sceneToScreen = vec != null ? scene.getTransform() - .sceneToScreen(vec, partialTicks) : new Vec2(screen.width / 2, (screen.height - 200) / 2 + y - 8); + SceneTransform transform = scene.getTransform(); + 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; - 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) - 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 lines = screen.getFontRenderer().getSplitter().splitLines(bakedText, textWidth, Style.EMPTY); + List lines = screen.getFontRenderer() + .getSplitter() + .splitLines(bakedText, textWidth, Style.EMPTY); int boxWidth = 0; for (FormattedText line : lines) - boxWidth = Math.max(boxWidth, screen.getFontRenderer().width(line)); + boxWidth = Math.max(boxWidth, screen.getFontRenderer() + .width(line)); int boxHeight = screen.getFontRenderer() .wordWrapHeight(bakedText, boxWidth); ms.pushPose(); - ms.translate(0, sceneToScreen.y, 400); + ms.translate(0, pY, 400); - new BoxElement() - .withBackground(Theme.c(Theme.Key.PONDER_BACKGROUND_FLAT)) - .gradientBorder(Theme.p(Theme.Key.TEXT_WINDOW_BORDER)) - .at(targetX - 10, 3, 100) - .withBounds(boxWidth, boxHeight - 1) - .render(ms); + new BoxElement().withBackground(Theme.c(Theme.Key.PONDER_BACKGROUND_FLAT)) + .gradientBorder(Theme.p(Theme.Key.TEXT_WINDOW_BORDER)) + .at(targetX - 10, 3, 100) + .withBounds(boxWidth, boxHeight - 1) + .render(ms); //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); double lineTarget = (targetX - sceneToScreen.x) * fade; 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, 1, 1, 2, 0xFF494949, 0xFF393939); ms.popPose(); @@ -143,7 +154,9 @@ public class TextWindowElement extends AnimatedOverlayElement { for (int i = 0; i < lines.size(); i++) { screen.getFontRenderer() .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(); } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instruction/HighlightValueBoxInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instruction/HighlightValueBoxInstruction.java index 0af8b6ad7..8b0e38c64 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/instruction/HighlightValueBoxInstruction.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/instruction/HighlightValueBoxInstruction.java @@ -23,8 +23,8 @@ public class HighlightValueBoxInstruction extends TickingInstruction { AABB point = new AABB(vec, vec); AABB expanded = point.inflate(expands.x, expands.y, expands.z); scene.getOutliner() - .chaseAABB(vec, remainingTicks == totalTicks ? point : expanded) - .lineWidth(1 / 32f) + .chaseAABB(vec, remainingTicks + 1 >= totalTicks ? point : expanded) + .lineWidth(1 / 15f) .colored(PonderPalette.WHITE.getColor()); } diff --git a/src/main/resources/assets/create/lang/default/interface.json b/src/main/resources/assets/create/lang/default/interface.json index ad29e976a..5288441cb 100644 --- a/src/main/resources/assets/create/lang/default/interface.json +++ b/src/main/resources/assets/create/lang/default/interface.json @@ -251,6 +251,7 @@ "create.gui.goggles.kinetic_stats": "Kinetic Stats:", "create.gui.goggles.at_current_speed": "at current speed", "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.capacity": "Capacity: ", diff --git a/src/main/resources/assets/create/lang/default/tooltips.json b/src/main/resources/assets/create/lang/default/tooltips.json index be7e4a106..fa5951e41 100644 --- a/src/main/resources/assets/create/lang/default/tooltips.json +++ b/src/main/resources/assets/create/lang/default/tooltips.json @@ -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.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.condition1": "When in Hotbar", - "item.create.wand_of_symmetry.tooltip.behaviour1": "Stays Active", - "item.create.wand_of_symmetry.tooltip.control1": "R-Click on Ground", - "item.create.wand_of_symmetry.tooltip.action1": "_Creates_ or _Moves_ the 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.wand_of_symmetry.tooltip.summary": "_Mirrors Block placement_ while present in any _Hotbar Slot_.", + "item.create.wand_of_symmetry.tooltip.condition1": "When used on a Surface", + "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.condition2": "When used with no target", + "item.create.wand_of_symmetry.tooltip.behaviour2": "_Removes_ the active Mirror", "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.control1": "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.control2": "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.control3": "R-Click while Sneaking", - "item.create.handheld_worldshaper.tooltip.action3": "Opens the _Configuration Interface_", + "item.create.handheld_worldshaper.tooltip.summary": "_Creative mode_ tool for large-scale _landscaping_ from a distance.", + "item.create.handheld_worldshaper.tooltip.condition1": "L-Click at Block", + "item.create.handheld_worldshaper.tooltip.behaviour1": "_Targeted block_ will become the _material_ placed by the shaper.", + "item.create.handheld_worldshaper.tooltip.condition2": "R-Click at Block", + "item.create.handheld_worldshaper.tooltip.behaviour2": "Applies currently selected _Brush_ and _Tool_ at the targeted location.", + "item.create.handheld_worldshaper.tooltip.condition3": "R-Click while Sneaking", + "item.create.handheld_worldshaper.tooltip.behaviour3": "Opens the _Configuration Interface_", "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.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.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.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.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.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.behaviour1": "_Shoots_ a suitable item from your _Inventory_.", "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.filter.tooltip": "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.condition1": "When in filter slot", - "item.create.filter.tooltip.behaviour1": "_Controls_ item flow according to its _configuration_.", - "item.create.filter.tooltip.condition2": "When R-Clicked", - "item.create.filter.tooltip.behaviour2": "Opens the _configuration interface_.", + "item.create.filter.tooltip": "LIST FILTER", + "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 R-Clicked", + "item.create.filter.tooltip.behaviour1": "Opens the _configuration interface_.", "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.condition1": "When in filter slot", - "item.create.attribute_filter.tooltip.behaviour1": "_Controls_ item flow according to its _configuration_.", - "item.create.attribute_filter.tooltip.condition2": "When R-Clicked", - "item.create.attribute_filter.tooltip.behaviour2": "Opens the _configuration interface_.", + "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 R-Clicked", + "item.create.attribute_filter.tooltip.behaviour1": "Opens the _configuration interface_.", "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_.", @@ -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.condition1": "When Held", "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.action1": "Opens an _Interface_ for entering exact _Coordinates_.", + "item.create.schematic.tooltip.condition2": "R-Click while Sneaking", + "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.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.behaviour1": "Select two corner points using R-Click.", - "item.create.schematic_and_quill.tooltip.condition2": "Step 2", - "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.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.", + "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": "Creating a selection", + "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": "Adjusting and Saving", + "item.create.schematic_and_quill.tooltip.behaviour2": "_Ctrl-Scroll_ on the faces to adjust the size, then R-Click again to Save.", "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.", @@ -110,20 +96,16 @@ "block.create.schematic_table.tooltip.behaviour1": "Uploads a chosen File from your Schematics Folder.", "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.condition1": "When worn", - "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.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.goggles.tooltip.summary": "Augments your HUD with _miscellaneous information_ about placed components.", + "item.create.goggles.tooltip.condition1": "When looking at blocks", + "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.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.control1": "Right-Click a kinetic block", - "item.create.wrench.tooltip.action1": "_Rotates components_ toward or away from the face with which you interacted.", - "item.create.wrench.tooltip.control2": "R-Click while Sneaking", - "item.create.wrench.tooltip.action2": "_Disassembles Kinetic components_ and places them back in _your inventory_.", + "item.create.wrench.tooltip.summary": "Multi-purpose tool for working with your kinetic contraptions.", + "item.create.wrench.tooltip.condition1": "When used on Blocks", + "item.create.wrench.tooltip.behaviour1": "_Rotates components_ around the clicked face. _Sneak_ while interacting to _dismantle_ components.", + "item.create.wrench.tooltip.condition2": "When used on Contraptions", + "item.create.wrench.tooltip.behaviour2": "_Relocates_ assembled minecart- and train-based contraptions.", "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_.", @@ -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.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.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.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.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.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.condition1": "When Used", "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.summary": "A _uni-directional powered rail_ capable of _fine control_ over a minecarts' _movement speed_.", - "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.", + "block.create.controller_rail.tooltip.summary": "A _uni-directional_ powered rail with _variable speed_, controlled by the _signal strength_ supplied to it.", "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.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.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.summary": "Grants _handheld_ _control_ over _Redstone Link_ frequencies assigned to its _six_ _buttons_.", "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.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.diving_helmet.tooltip": "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.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": "COPPER DIVING HELMET", + "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.copper_diving_helmet.tooltip.condition1": "When Worn", + "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.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.behaviour1": "Starts spinning.", - "item.create.diving_boots.tooltip": "DIVING BOOTS", - "item.create.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.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": "COPPER DIVING BOOTS", + "item.create.copper_diving_boots.tooltip.summary": "A pair of _heavy_ _boots_, allowing for better traversal of the Ocean floor.", + "item.create.copper_diving_boots.tooltip.condition1": "When Worn", + "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.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.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.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.minecart_coupling.tooltip.summary": "_Chains_ together individual _Minecarts_, causing them to move as a group.", "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.behaviour1": "_Redeems_ _Experience_ points contained within.", "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.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.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." } diff --git a/src/main/resources/assets/create/models/block/mechanical_pump/cog.json b/src/main/resources/assets/create/models/block/mechanical_pump/cog.json index 799107bb8..d9f2d4c46 100644 --- a/src/main/resources/assets/create/models/block/mechanical_pump/cog.json +++ b/src/main/resources/assets/create/models/block/mechanical_pump/cog.json @@ -13,9 +13,9 @@ "to": [9.5, 17, 11], "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 6.5]}, "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"}, - "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"}, "up": {"uv": [9, 10, 10.5, 13], "rotation": 180, "texture": "#5"}, "down": {"uv": [9, 10, 10.5, 13], "texture": "#5"} @@ -27,9 +27,9 @@ "to": [9.5, 17, 11], "rotation": {"angle": 45, "axis": "z", "origin": [8, 8, 6.5]}, "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"}, - "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"}, "up": {"uv": [9, 10, 10.5, 13], "rotation": 180, "texture": "#5"}, "down": {"uv": [9, 10, 10.5, 13], "texture": "#5"} @@ -41,9 +41,9 @@ "to": [17, 9.5, 11], "rotation": {"angle": 45, "axis": "z", "origin": [8, 8, 6.5]}, "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"}, - "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"}, "up": {"uv": [0, 10, 9, 13], "rotation": 180, "texture": "#5"}, "down": {"uv": [0, 10, 9, 13], "texture": "#5"} @@ -55,9 +55,9 @@ "to": [17, 9.5, 11], "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 6.5]}, "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"}, - "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"}, "up": {"uv": [0, 10, 9, 13], "rotation": 180, "texture": "#5"}, "down": {"uv": [0, 10, 9, 13], "texture": "#5"} diff --git a/src/main/resources/assets/create/models/block/millstone/block.json b/src/main/resources/assets/create/models/block/millstone/block.json index 073d639d5..1bdb262ba 100644 --- a/src/main/resources/assets/create/models/block/millstone/block.json +++ b/src/main/resources/assets/create/models/block/millstone/block.json @@ -4,7 +4,6 @@ "textures": { "0": "create:block/gearbox", "5": "create:block/millstone", - "8": "create:block/andesite_casing", "particle": "create:block/palettes/stone_types/cap/andesite_cut_cap" }, "elements": [ @@ -17,7 +16,7 @@ "east": {"uv": [7, 13, 8, 16], "texture": "#5"}, "south": {"uv": [0, 13, 8, 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"} } }, @@ -30,7 +29,7 @@ "east": {"uv": [8, 13, 7, 16], "texture": "#5"}, "south": {"uv": [8, 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"} } }, @@ -40,7 +39,7 @@ "faces": { "east": {"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"} } }, @@ -50,7 +49,7 @@ "faces": { "east": {"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"} } }, @@ -63,15 +62,15 @@ } }, { - "from": [3, 12, 3], - "to": [13, 16, 13], + "from": [2, 12, 2], + "to": [14, 16, 14], "faces": { - "north": {"uv": [11, 9, 16, 11], "texture": "#5"}, - "east": {"uv": [11, 9, 16, 11], "texture": "#5"}, - "south": {"uv": [11, 9, 16, 11], "texture": "#5"}, - "west": {"uv": [11, 9, 16, 11], "texture": "#5"}, - "up": {"uv": [16, 11, 11, 16], "texture": "#5"}, - "down": {"uv": [16, 11, 11, 16], "texture": "#5"} + "north": {"uv": [10, 8, 16, 10], "texture": "#5"}, + "east": {"uv": [10, 8, 16, 10], "texture": "#5"}, + "south": {"uv": [10, 8, 16, 10], "texture": "#5"}, + "west": {"uv": [10, 8, 16, 10], "texture": "#5"}, + "up": {"uv": [16, 2, 10, 8], "texture": "#5"}, + "down": {"uv": [16, 2, 10, 8], "texture": "#5"} } } ], diff --git a/src/main/resources/assets/create/models/block/millstone/inner.json b/src/main/resources/assets/create/models/block/millstone/inner.json index 65af3b42b..c68026361 100644 --- a/src/main/resources/assets/create/models/block/millstone/inner.json +++ b/src/main/resources/assets/create/models/block/millstone/inner.json @@ -19,8 +19,8 @@ "east": {"uv": [0, 10, 9, 13], "texture": "#5"}, "south": {"uv": [9, 10, 10.5, 13], "texture": "#5"}, "west": {"uv": [0, 10, 9, 13], "texture": "#5"}, - "up": {"uv": [6, 3, 15, 4.5], "rotation": 90, "texture": "#5"}, - "down": {"uv": [6, 3, 15, 4.5], "rotation": 90, "texture": "#5"} + "up": {"uv": [0, 8.5, 9, 10], "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"}, "south": {"uv": [9, 10, 10.5, 13], "texture": "#5"}, "west": {"uv": [0, 10, 9, 13], "texture": "#5"}, - "up": {"uv": [6, 3, 15, 4.5], "rotation": 90, "texture": "#5"}, - "down": {"uv": [6, 3, 15, 4.5], "rotation": 90, "texture": "#5"} + "up": {"uv": [0, 8.5, 9, 10], "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"}, "south": {"uv": [0, 10, 9, 13], "texture": "#5"}, "west": {"uv": [9, 10, 10.5, 13], "texture": "#5"}, - "up": {"uv": [6, 3, 15, 4.5], "texture": "#5"}, - "down": {"uv": [6, 3, 15, 4.5], "rotation": 180, "texture": "#5"} + "up": {"uv": [0, 8.5, 9, 10], "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"}, "south": {"uv": [0, 10, 9, 13], "texture": "#5"}, "west": {"uv": [9, 10, 10.5, 13], "texture": "#5"}, - "up": {"uv": [6, 3, 15, 4.5], "texture": "#5"}, - "down": {"uv": [6, 3, 15, 4.5], "rotation": 180, "texture": "#5"} + "up": {"uv": [0, 8.5, 9, 10], "texture": "#5"}, + "down": {"uv": [0, 8.5, 9, 10], "rotation": 180, "texture": "#5"} } }, { diff --git a/src/main/resources/assets/create/models/block/millstone/item.json b/src/main/resources/assets/create/models/block/millstone/item.json index 37c07bdd9..eff5cf81d 100644 --- a/src/main/resources/assets/create/models/block/millstone/item.json +++ b/src/main/resources/assets/create/models/block/millstone/item.json @@ -3,8 +3,8 @@ "parent": "block/block", "textures": { "0": "create:block/gearbox", + "4": "create:block/crushing_wheel_plates", "5": "create:block/millstone", - "8": "create:block/andesite_casing", "particle": "create:block/palettes/stone_types/cap/andesite_cut_cap" }, "elements": [ @@ -95,11 +95,11 @@ "from": [0, 0, 0], "to": [16, 6, 2], "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"}, "south": {"uv": [0, 13, 8, 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"} } }, @@ -112,7 +112,7 @@ "east": {"uv": [8, 13, 7, 16], "texture": "#5"}, "south": {"uv": [8, 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"} } }, @@ -122,7 +122,7 @@ "faces": { "east": {"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"} } }, @@ -132,7 +132,7 @@ "faces": { "east": {"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"} } }, @@ -145,15 +145,15 @@ } }, { - "from": [3, 12, 3], - "to": [13, 16, 13], + "from": [2, 12, 2], + "to": [14, 16, 14], "faces": { - "north": {"uv": [11, 9, 16, 11], "texture": "#5"}, - "east": {"uv": [11, 9, 16, 11], "texture": "#5"}, - "south": {"uv": [11, 9, 16, 11], "texture": "#5"}, - "west": {"uv": [11, 9, 16, 11], "texture": "#5"}, - "up": {"uv": [16, 11, 11, 16], "texture": "#5"}, - "down": {"uv": [16, 11, 11, 16], "texture": "#5"} + "north": {"uv": [10, 8, 16, 10], "texture": "#5"}, + "east": {"uv": [10, 8, 16, 10], "texture": "#5"}, + "south": {"uv": [10, 8, 16, 10], "texture": "#5"}, + "west": {"uv": [10, 8, 16, 10], "texture": "#5"}, + "up": {"uv": [16, 2, 10, 8], "texture": "#5"}, + "down": {"uv": [16, 2, 10, 8], "texture": "#5"} } } ], diff --git a/src/main/resources/assets/create/models/block/track_observer/block.json b/src/main/resources/assets/create/models/block/track_observer/block.json index 17334b8cc..78d6d650f 100644 --- a/src/main/resources/assets/create/models/block/track_observer/block.json +++ b/src/main/resources/assets/create/models/block/track_observer/block.json @@ -4,6 +4,7 @@ "textures": { "0": "create:block/signal_box_top", "1": "create:block/observer_box", + "2": "create:block/train_observer_top", "particle": "create:block/observer_box" }, "elements": [ @@ -15,7 +16,7 @@ "east": {"uv": [0, 0, 16, 16], "texture": "#1"}, "south": {"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"} } } diff --git a/src/main/resources/assets/create/models/block/track_observer/block_powered.json b/src/main/resources/assets/create/models/block/track_observer/block_powered.json index fd5e39949..0dbb56e91 100644 --- a/src/main/resources/assets/create/models/block/track_observer/block_powered.json +++ b/src/main/resources/assets/create/models/block/track_observer/block_powered.json @@ -4,6 +4,7 @@ "textures": { "0": "create:block/signal_box_top", "1": "create:block/observer_box_powered", + "2": "create:block/train_observer_top", "particle": "create:block/observer_box_powered" }, "elements": [ @@ -15,7 +16,7 @@ "east": {"uv": [0, 0, 16, 16], "texture": "#1"}, "south": {"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"} } } diff --git a/src/main/resources/assets/create/ponder/fluid_tank/storage.nbt b/src/main/resources/assets/create/ponder/fluid_tank/storage.nbt index 9192a5beabc61e54faf05a7d84d4e19edabe7405..c9da0c1617b33206217f36a678d6354e25d305a3 100644 GIT binary patch literal 1638 zcmV-s2ATOEiwFP!00000|IJxjZrer_9lj)5a%-o}YX$8`AIWz101&l$2QPe+H~nGZMt-pHeEVPn=YN}cy!=M zn=YNDO_$Enrb}mO)1|X(ptH2;(plPc=`3x!be1+XyA`;;7^~8Eo}Py@eT8* ziQ}}`SRFQ&0gh#WBlD-vA2sf}wfb-@100z@eg3F%*R9ouV;SJc{OR*Yjk|8GJ{(Jn zGeS;s#74-)LC#=&ImmFH7a1-)%)VG2tn4CHuks7~m3KCY(3LR5fO_XRE=V*yeTRSk=rzFN1c(fNX@(kYxu!@oYbVhO(S0j~&28TtO#xGEbI6esSTv}Ub@N*h* zU)F}a8~FYWj&A{gdk6zw zCD-U-F((Pl342j_G`Nq+bjIDYblh2xoQ%-;F?`*n34@8yM_c#!rANUWqa6UlVHO;- zJ9wV57l5}nr$xdldGymlQ#4PA<{|Ge#W?!+lvCV&1pnsciAn_^JA8!Mf@UWk^6v&| z5CVhyr>Mbh;3E4$gwSVja_0>fm+=taU553Vpq7()8so_c_|8ZO@j9eM7Gj~`Yem7^ zZ4*S3$3W$QHs;|A9-o6^|GeFt$6tcSTfyTCmB&Evurxecs;I7$5!^xxHft@jH42G; znmfu+(el4mEqi=0Ng5B0_o4_#mB`h{@#Aa(idO-_ITAgq4p;>Vw;e&&Ae}cqd zG{HPl$&}4jS5C-tf+wsvQrX!8xw+en1#$&(b=l%VI!}WvU=&*W_KyWi3wB7RNf5U* zJ4-39ZR6r{7r0{!s~o!_xJ_f&Hzuv|la4ei>?5VZ_BZcV=hb!9V)(jE&}K1weEE6Y zYU9zYr=82kL)`^id3c(5Y$1JRzBw&NpT|Kq#pRq}A@3fAl`XJ% z62t`-{cF>y!$CU-84ZCoNv4lUc#^L+1j6uq5@i8NG@HBH5O$UD?47Q+A#pfG`TgBDn?WgBAT%Xra`bS@iNgh^5n{Thb560t9 zr9H0j@H%*0>=R;lfxK%Jh*A~pg)rhpkkPnwxuxDTS#K*@fA#XkvA5;9f`>kit#e%2 zfY+RU>!z)d(ov+mc1d?ykn-&Prk1C$C2B-61w#h1SUUQRu*OhUO zl5xJl1DBXEw2uzTJka~lCw*w9+zqf9ra_Du!#v$?`p7MluAWR*tC!&2D#u#~YrvWrw=m8B~#EGeuCs#3^j0h}Ey z$|=T24x=^X;D|Ct=ha~gCU3+lrk0i)JSRD_Ue-9W5yrd?Ky0Rq83r*o)k~Q4%2i+4 zOfRhqgJUS>WGWYzXf2herzo+^Im*DFH$`)QlpHm5s4Ja}B_Bt$ID-8Xl*e!~rZii| zq4Gdoq4BasWjv=5M#Jho3V;t&y1>DtVy2eH^BTAH70O11wj+B| zONp7G)cfWP=&oqncy3**VBXi$uwb-3tA;+mrnSPod=T2CgLc-S&YSb!Cf2OMm9UrN k(uH&iaj;3}a?tp@fCW!*mJ^yFH2xd?53WW~jyog(0MvIQbN~PV literal 1642 zcmV-w29^0AiwFP!000000L@ujZ`(E$rX)*toNP(9-mqV>$6kP8X^Nr6imqt7uG@>J z$h0j)76pl#+dk!|?eZhKt$SK``4vNUD3P*4lN94R!vYw#q{E~0ef-Wv$`GL~)GOjw z*h2`hPam;U2nAbcfKwXN7#9dtCxhdJL?^`%4xVozFC&Fm)ckqKFK9?HU!k&bS~iZx z#BI*G4YIqUCYMR*f<6o$HI?e;fMYC5_XlJ zE*qEInBoyOUGW4K@pRd^+@>p@z#^W$MLbdY#f7)W8ufK@FO(V6_2b9)xEm>I2L|{#=7E>wV}FKmmkN%kI-0GJhC=a z_v-TFDE$nPmmbq0>fx}UFycJUaZ!{xuBy=8)8_teJVyIbj$z&HNm9n+Q5I)-h}<%h zSFr`vO7J=+i&WRx{Z=4855z&iS8)ofoFUqI2qAr*f``X!vGW}4euwX`;rkYRe{*(r z_69umj$mA?fejy)^Ef3%OkdV)1ov?~ol$mGg@K0Y$q;Qng|9=BQkd@sXzMd}=}|bx zXcwH}C=Vy}HlAnnCHOm-lQN|>0Cn$g!wNVoANfZa#^WDP8T`FR@Uy5+e3^~GlE-$H z$5zDiEWx7_xH*lZAqtL2nMasY@K&PWH@HXt5vB{0pY)LXV2sesv$KD`zvZLBVVH#x zkn!LYwTKFQa7o#g-BaN36gc`4jvvswaD02Sh2#D?9D@eOp#n$1 zaX1Pb8of8l)$83aNJ(efL;-`8j-JO#p&J zA8j9u$9P;b^yw+f_BGTY5UIF2T-JtboU1vGW?>pfVKU0fc_weV$lu$1(|^$s)t>&g zI8pDsE86|m1krA_!_FY8Vz==a+G)7WWAM=46A%d{DP}vBPMP3j)u!=_7>{Uqj1`5d zs=+PKJLk|{S=POX%(E~LDak#w^F>Lsk{-p=G)xp3Cmgpk?!9HkEwG`(*k$B(j%}KR zMKM~EuL-1`ZSPCj_R|JRn5^bsFIIY(C*`$M6fbWr%&VPq*%?ynBw_poQE+~2%pUx)oUYX?coE; z$wO!g32^us3Sn&DDDf=Bf4f84Hql%)(%Ozl6+LeRT_1n?GGOat?(Z!m)sf->h z3x#Dn`a@FxYaLOJq8)Y3s&6IdKU>eL?q$!a0#>^~e$Z5EUgz(YlL^jSI|0gl05Yy$ ze{!OCc#LD55vq7gBdhE~d6Lwq>>|1U=gKZ_c9Il0977q_Wy?iy{3X?}P2=zlI9Bv% z*7Ti5(|V~6nM`w%Buqq_j8N#(m2`RK5}01i`^_uH)iAA@gsK8o6R(_v4tPa1Ka1<0 zxf^m@0bSL$FJR>Ce0modl==Td=j!qAc1^ivSyNh_%h7eNrjPt*ovZ1UYjv(Wy3Qqt zQgyB_2^t=>)DVO=H8HeRcO7i{S(so-F%!~_0qRw%xv^BuVg}>VC?Y9D0E>i0>#?MO zvNWpx{nlLFUtT>9^E}2mdu9V=XEC;1VI)!hasj%^AZnG09PRa z>g;R0wzQlu?Z`fTb~ZuI$IS{caz`@~k%WPk!>De+@4CGJi##FIDMaE=!lZzcwKSK9 z^(zH&SnXYN#FC!-sx!a7u%u;W7grz@vk=Y(i)xq|Adiy9WpGR=CG+}FwG7B4CsjQC2**i9ubFPeyAK)JoQyH}t6pp1Rux$BT;o&Jp5-eMD`j|LLgf^A z(fHNA(O4^?c17*cq>^0oRvfInFIb^=`5oy|*0BSKhRR910 diff --git a/src/main/resources/assets/create/ponder/large_water_wheel.nbt b/src/main/resources/assets/create/ponder/large_water_wheel.nbt new file mode 100644 index 0000000000000000000000000000000000000000..43d107378076fd8a3e2490ab8054f453fd238411 GIT binary patch literal 721 zcmV;?0xta@iwFP!00000|E*R{Z__{!9e*WG(n5tm6p0fYxB@4Hgb-?l#DNMaqM}@^ ztvyMsY`oU)1{Y4;;K)DVuOR+Ie+`E)PP3`8vW}}_$+Dfi_h#Ok?8be79{4K#f*t^r zXF#W4UV9K?rc<4wg7WA==ah?hs`~Wss0Usylp(DT4+5o`#uZ}|#;IT&3&w4sNO z{1*8bOjAAv)0B_FH05J3+wyU0{rDD4lXo+ZZ8~nvS75<-TQFYDSI081>MXhzU)wNl z3yfF8gceLSpPmI%&8Kg{c>iGf;AN*efMA#-CcnOxzV?pjRxLkxpC^PYOCJa>B%CZx z`p`W>T?jc1AUt3>i&Opia4GH&X+tjWd~n|+01v36m*)X=hFYS!*p8{xG2?T5G5`G| z1UF6KRxFW&arVIH&7JdVaWR6LM++3|gAIrlAWH zcZ`X2mUE1zX@)wD>ps43^WkprvGX5&1hD%mNiZ>AA1oJ})mtCJwiXfipSAs3^%%F+t?C>|b+H3}YdY68K|TQB~u+gz4st zqt;mddEYQS>|gd!Oj30_ z_gDQ_I**hlpL#CQCJd7@Vl$c*v!%sw!wUjWZdzVQiOim-gre>nGDgnn&$iaEG z=H9H#p)6u!JiRjG$(0$8TQe$S4`Gj;r7B`vWaDU*N~OW4h%V#VusPNB2Fog3jK`Qj zFk)OGu}fWW&elRZMrcBf)g^j(rZH2g$m{~vl|^f3aL6<}M!8gg!B6-LKy$BZAPWEh DPOeua literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/ponder/mechanical_arm/setup.nbt b/src/main/resources/assets/create/ponder/mechanical_arm/setup.nbt index 9b257d38fc6bffb3db5868538c1affec649bc85c..11268d5de5b4f5164c61aee3499dac949e365545 100644 GIT binary patch literal 1102 zcmV-U1hM-ciwFP!00000|IJs+j^jiWy?*7{t?5C45bRkXAvOr1+0c(^m;loqk@N`I zMAi09VzuM4s>-CB6`ugCkXXPE@DGSz82A+=Hq+d4TuIt-Jf<~3N3t9{=bk$ERNY&Z z4nP}R8Gelp0O-r3%cZN)h8D&uR3S>xpEfkkBko_w4n4fx1}EXt1T8-fcv3Nic|;k; zTEkddFm??drv{H(!DE$ZF7g8^ zg2!O0d^VUWpADwUXM?Ho*{$KT!BqKdFjYPqOqI_DQ{{7}rNCpC@H`J=c-HfBO4h1X z&{M>?HF@j}o(?$ix$?jpB#6P`zQ*mH&{vtgI7<@JR;`;jfDc!%M=a;tCino@Bo9D3@XeS>iz=W#~?3|`5N!4LG9-~+ZZneSd zDV)iiuiW+ZRp}Mn`fZC_UGPrlF$yj0{oTL5`_p;%)1SY6@5f)>`u^hO7p2)l#h zgU^m0jd~~jv*Dl(_j|EI!F(0+xX;5_Wxc=A0(W?oU@<4Bucc;&+1jv$(#$YzxBHj} zNRbDh97BBuOEZx5*Z+(`N8}84uED-F1LPW>Eg6~*kNc;C-mnJAv#p72knH9p<1~&j z+Rk#r&?U>ZMf*n{vPX#4Ba8yQz!r;gcSh^o7i_E^uuxdw9q}|)bcemi{41Q%{@)jT zqHE@ZZ}hrqe#9q}hzgzT9&`_a0E0y>?q`* zZXm@x?$CVv{=7WAl005q<2PHWUDEhp+$do3DH%oAyI`>-x+Bh`fY0May*EA#BibXX z`-uZP3)sO-zgU&=&5mb*dzK9OHeKu4w{l%K5?XNHTZ!HT%y>v^w z?A+Q*_doH{GNaw_vJK6IMW__&Gf9`W!xJ_`cx|P4J`EL)d>)eq3Nnb7R|pyN`6&BS zyZrUlTri_8O=j^-hVew3L|b8kLjNBoFfww(jd_eM=*}rZM6@;1#^a4yBBF7p4>UEqU|&RSBZ3`@bxu?iZG*d5&9RSIg6sAj?$rBb{R^ru9k#m7UYyTYfx+i zX46*;Z2A~R+M7a9`QCgx<@a(fpHJpf#CrKRll%~1UNpwEM`)qhEKu*jOO+jKH^pzv z|Dv2~jawYXRr*xd(Ca5!jj&Nuw@S&Qxg_#tlFBLZ7YARC_C_(EbBvTpicVJ#nPN{+ UNIKzD75xN%0}TI6B@q$;02@ao^#A|> literal 1042 zcmV+t1nv7DiwFP!00000|IJt1Zrer>9o}@ajkrKt1noEU2l5hM;vzy2N2r{j&5N)i zM-pL*OYANyyHEL({7TVZNb@^YXGyL^Qxr`HX<-6{B=YQ;GiP>ZR|9}PxH9|$9RSd` zN4HCNrw=`hRj5Lgpszl3rV;nA<$!+t)CVWw(hS;M4tP>Ag~f=r&7Oq0(B)8wvv`Rumv*<*uwze z=?8%4pFHS{l|U)a{-k$3u)_ep^92&wGZ`+E2q)KJj4Jd8gygC4sVQ2&5_U?TzpdBn zPxSddmtMaPyiy)+kw+frum}`j!qor{-=r!@)mb{5q1X!U^}!n|T*`v4-u3dV^eS%s zMFtF@_Y$K(6Xn5=mXwz-*i1cRp|HR^=V`3;;N#c)cU)4R9|=C!-aP+M?{*Ko(Sk{Y zqw&S*FXt~O!^_dztFZ&eS4_-Njd&QVVI1I%7TBgX9vqwo0S0+ZPBO>#R?C5du`hTO zy<<^|xi#MmV}*kGD&%n%KHHf(J#epX6RbM!jI@ziIc;6ed}dnjsjO?74DM?lAdNhI zbph=epqLQwFa{m7V6Y1Y`@szV?9HP4;$rk>JiK}+$(=+VK(a2op-JmV%ByXO{({A! z&!PzvOAERqzCwWk>|1!B3wc)E!m}z3w)1!!$mdP9_vBG-%-x!${mAmDZG_d0p_<1d zs>k2=<>A%j@%0+I*&^+lhW_=UfXSyOitgWn#ggdGIgbLqiu3;6`8kZJyEg3~7O@}Z zu+wF}p_nQh6|!e(9AmUcPdV#eq32E_IoFeIaDRbP?O`jgoc@1OsmJ7@TjSy2i#>Gz z7Y{8H?T&|i=q4;erBLtQ2eflsvL(XPt>V=pR57gfisul*~#awKE zxhvd`w$lV$CDN_JA4&=pVJ1@%`qz^ci=wKI+R!e$2_;y!8$weBxggG+r&(>P#9bf5 zNGG0?ZU)tF#a|}tNx|jw`D%faNtI*y8v;J}|lp8$z-Zy+vQDn!y=t%*HJ zR^9AcyPKxvWq4J_iPxmASuC&=#j(Hr?Kj_yvN^yMCRY5Q1OS>(>c6Luk#fQbvd~;p zI9p0x-r1agTuvdWwe^d-D}mHHbkwdG(nKek=ntBB1Sc86nFKh|fagBPYoZaHcmyXI z!I=a&@razgCX}<+gmU(pP|jWx%DL-Dfa5ixoV_NLv)6=j_L@-6lMy+4O(;n+QWmJx?&WkHd~-sll!FBl8#yD zbBE^iLHboO^LXE@;KQ+kS8WCNDDSD*psIN7^I+m$qb6+`e{;$2J3A4af8Qx3)cUy_ zIJ$Y;y4eyZsziyhSQ46M$*`x>W~KktEKeM2*1r*xLE;q7Yn0?1HRr%t29s;t61>?8 zMWw-&yV`GrqoUM`>Ac7*UjJ5DrT4|*FkyrFH=}DZ%{i07Y|r}`sn=`nNxDL5DTAyM zyuT_5qK_G$LfSdKZQpkI_iZga0c0Bkw#3y+%c=>#x66ffJf@Gu6B2{)fkTKMGRRwj z({+EJ%XS}2Tw#Ugv5;IBn!<-TrlPYImW{7eY2!8>`;{!Y_b_(X9Rl006BQE0_QP literal 480 zcmV<60U!P!iwFP!000000JW9DYTPgohR2q?@ooxDOADokK1i; z?&^kqhW^2Ax24Lggj{doeeIF%u7f^w2CKcc7^VINMY^?L!>66K!d<0xrL( WsP51Q?JT_nzu^z~#ma@J2LJ#~Q}6!( diff --git a/src/main/resources/assets/create/ponder/water_wheel.nbt b/src/main/resources/assets/create/ponder/water_wheel.nbt index 8c45937dd040b505a3f66cb5d481e743521bc9c4..692512c1602e55f1c052b865e6be8bb5280cb5b9 100644 GIT binary patch literal 740 zcmVJLOhC)SWqEFRFsW1 zwQtfQ(^ zc$}J^t2`Ftbl`D2@OT|~{1zU!L(Ue{mb1mQN_pOk2(t)0VTvwB_u=at)RHacjIg6<<}1-;u|y^z7C2<5e(qJYL0D zT|XD`IIFXqv)|yo>?>%%bm8$Xz_=Z>yb7k*fGPL0)qpAY6T$$z^wT59iYjjngkH;vy8>ueBM7R$o(OGAPNZ|+&2lpz31RQ zI}e~YGz#_d^FUIEOw91Gc`iU!qyO5{w%^tEw5P|+D(kLL6F zIbA=}{r$R^qFV`|-_hJZ8d{pTVNLL9CNP@t6b+B7KE7V$!>#c#_>VpUxbh-NFtNig z7mKpd+W^A1M6EazA@~Puig0U6)?&p*h9*qSVvI7u(usz@Co?a~qWlC=&;$Qk$b1+} zh2;Hr!!uB}yiJ&`j0rRbi*3Y?RlmJa&ri6)D3&QHQjtYmFZGwoJX-8U)}wbeqX|=! zNV3VM|0U$+$^lCg)C&owc{(np;hmBhs$!=T!uG57M!uGs5b(HqfnBYW;F z3t^X?avd=t({VK7N*nNvnr#BAc_DO4-!FKl{a-{B8r!L64N3jhG~R%qn_ literal 734 zcmV<40wMh$iwFP!000000L@n2ZqqOnK8c++%|MJl2?=-yKwM0lggOl&aZ`aNCdN(W zCa0~nG>&YS46gQ6T*LG55a4Wa7osHf1Q%FJo!Z~|&iQ*Blj;Z3Kf^D&jL0nLjT_Kysn1(WVgylx7+$i#o<@!FUaf@4!PGc&HF3RuSXYkz}V(Hea2sZ`jt;r#!`NI9hg|gW*hU@p z1$EdLeLTd0hdS_B?X*Wbalp`4OavsG=>US`95MMZE@RxCm{)Z<@F7nOvOH>zL@Fel z{yL3dI6++qc@{u;#BvsM{pDy}lG9^z8I>+5_-_+{;TQ(vg8&A{TB5qTij1ohmag&D z-us^+_&kAou|(r!UzHBU3N^~en25EE&CTY0G)9k2e`@*z(|H#Bt=_m_gM zL_D-2_$p6vdd4%5X$uTGnXL zaS+!p`(X#qHVkQC!VXM5o>2#;e#k}!Gt60vT4VWrxf24Nuoc3im8qUsvbo+bmR#dB z7MWQ$V`LEzt`RB|#q{zcbu)YSdUnR76}ZGV5;T%I+B({sL8i;ne0?77MMUVXQ@JCUGjo=z9G70 ziIyhru8^*(u<5&2OijZe#m{Ec+uIo3sVy#RiPl=YxUt3a8(TcNS%Lht0G|-oZQHi>_4VcF=SN0HnlmuCGcrXmGP=3BMMp^gXF>dlJl zEtzlFo}cB}C=uesp{teVX?%kD*Q||p2WO?_D1Cce(Ro85FVdQ&MBb@054*#W&i*H delta 272 zcmV+r0q_2#1FHg%B!5v*OjJbx006eOwvLXDZ*Ol~TU%LKSyWV1M@L6SMn*+NMMFbF zLPA18K|xbE8azBaPcj%uFBd{96fQ0MA}Gvsrx5@E zN>%k|QmL<#q*b+~Ql+abuRK4NROPwP<8InkU21Dane}7VUgj>X@b;{lT9kI&T<7}b zcCZO=87-`eZi^UcOsMD>$NkDx+j2WbKusW)B!BNG@%TPxXT<5Oz)1iA_yNS%Lh_0G|-oZQHi>_4VcF=SN0HRxmKEV_-PTz%Y}6!OhJrIy&0f*;!p(JtQPV zPfyR))z!wv#@^1Usl8>^lDS(B?(p>RC@3um2o6k0j(2o)baHYsRphr;6LfcX_cxMo z(iZX57dMdOvr-WR+QuAm8fY?ua!HV1@PC4UAx*P+8c;cBfk$L90|Vb-5N14{zaj-F zILp(;F+?Lcw*RD1vjLBDql03f^NmAc+n)Wm-&AyR;o6!@vnL+&Iy8UMge5aib+h}W zYUVVA%g1X8G9Z+piJ)v^iAFIFelI%U7P!Sd#KA=eFtCtqJ%eE-|E{`8Ko gttUi}|J7(QuiGlv_98@KKhTv7p00i_>zopr04tQPU;qFB delta 278 zcmV+x0qOp!1F-^-B!5&;OjJbx006eOwvLXDZ*Ol~TU%LKSyWV1M@L6SMn*+NMMFbF zLPA18K|##`08=;`JUl#4G8joO7p?#RLMs$5E-sk>06QiTIwTP%Cnq%_4|o6oFdhyy zPj+(v0004WQchCa%6c zkh6pF*50000X zbW%=Jk+B<*zy*H*pTW=}00009a7bBm000id000id0mpBsWB>pGcu7P-R5(v{l8c&x zAP`0eRslCuat%Sd`2J71{~%ggov#bdoQ7eDfDlp&fyE4dic)DQ$W*^4ekL*?e{$dm zQc9ITsV{;siZ>9XjL5Ma5XvM7{S<7?*z`q`Ae>G@D3X6UKi5smIOm!q2yqnLTA;1D z2O)7z`LYFsa|h1f1ncVVufxkiAfx%1T1i8iPmC4fT%gOsb5IqAiUU`5YZn2F-KZ;r zHHOSW+M;%E0$^cn($zW0nChj%GOI=47E%+{)I00000NkvXXu0mjfKT!VS delta 573 zcmV-D0>b_O1o{M!B!6;HOjJd4d3k()fPaFB84(E|77J=^a|8eY0002AvaE`bkei*H zC>#%@rJRO{hgw})Z*g#CXlap@m57XpT0|sOIv;RSE`nh?dRjDyWjSF>E?{F{f`^2f zq@AdVe*gdgCXuluk_nK|Ry)_5*j7CJR=ZZ|7IXIU7nHP zX&9$@TBdm!$7xx{HEuK^&j^Hd7=}OiAg1t<1t0Q^gocL42p;LedaO?&&qxO$?JNuS zHt#9)c}6<)fcn!gJkJvXn)npDE`-qco<7#~@4Dsy{$-)rkIDQ0vJgguDfh%}00000 LNkvXXu0mjfKHvVu diff --git a/src/main/resources/assets/create/textures/block/train_observer_top.png b/src/main/resources/assets/create/textures/block/train_observer_top.png new file mode 100644 index 0000000000000000000000000000000000000000..bc0032f3c50f05c5c31e112e7f77bc5d6b972b71 GIT binary patch literal 424 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%LhD0G|+7dre^{eKAi1i2!q%C>NDbEBQokJzoo%IA@hG8-=PUlY$_<#ste8 zf8FidH@2r(qR79Aid1-c}T87%lyBo_$M*80Yx`DI6BeIx*f$uN~Gak=hkpdLl z>FMGaq7kg>-(7TAfycPl_khJh&j{;lc{i0a|NrM#54sy!kglSl^xUsOnZcbsP3&05 zhUfPJ#TP9Tzw$^xlP~$)w6i+TZRV-ZdX~JhV%e@K=0$s-GchkPh+p?5F6%5$=+i%i zyX!AqPgs_e?GbeOd*xDz1=B>rgs;xO5cqxeH2ZZwniF^Xy4adu7F)C7edn^=o8M(6 z1zbfZ9XF5@l)AaYb&{o$>a?{Eb6W3k-re*4xJUNitbXt0?|;~5igBHrze)W&&=U-v Lu6{1-oD!M