Broken Thoughts

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

View file

@ -578,8 +578,8 @@ bf2b0310500213ff853c748c236eb5d01f61658e assets/create/blockstates/yellow_toolbo
5616dda664dd106d576848124fc0fc1de18d0fd3 assets/create/blockstates/yellow_valve_handle.json
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

View file

@ -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",

View file

@ -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",

View file

@ -39,8 +39,6 @@ import com.simibubi.create.content.curiosities.armor.BacktankItem;
import com.simibubi.create.content.curiosities.armor.BacktankItem.BacktankBlockItem;
import com.simibubi.create.content.curiosities.armor.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<FilterItem> FILTER = REGISTRATE.item("filter", FilterItem::regular)
.lang("List Filter")
.register(), ATTRIBUTE_FILTER =
REGISTRATE.item("attribute_filter", FilterItem::attribute)
.register();

View file

@ -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)

View file

@ -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();

View file

@ -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);

View file

@ -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;
}

View file

@ -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;

View file

@ -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)

View file

@ -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)

View file

@ -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) {

View file

@ -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);

View file

@ -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);
}
}

View file

@ -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();

View file

@ -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))

View file

@ -30,14 +30,18 @@ import com.simibubi.create.foundation.fluid.CombinedTankWrapper;
import com.simibubi.create.foundation.item.ItemHelper;
import com.simibubi.create.foundation.item.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<Component> 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 {

View file

@ -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;
}

View file

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

View file

@ -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)

View file

@ -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);

View file

@ -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;

View file

@ -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)

View file

@ -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()

View file

@ -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();
};

View file

@ -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();
}

View file

@ -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)

View file

@ -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

View file

@ -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;
}

View file

@ -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);
}

View file

@ -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)

View file

@ -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);
}

View file

@ -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);

View file

@ -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<Boolean> 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);
}

View file

@ -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 <T extends BlockEntity> void modifyBlockEntity(BlockPos position, Class<T> beType, Consumer<T> consumer) {
public <T extends BlockEntity> void modifyBlockEntity(BlockPos position, Class<T> beType,
Consumer<T> consumer) {
addInstruction(scene -> {
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));
}
}

View file

@ -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");
}

View file

@ -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);

View file

@ -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);

View file

@ -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);

View file

@ -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)

View file

@ -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()

View file

@ -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)

View file

@ -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<WorldSectionElement> 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");
}
}

View file

@ -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

View file

@ -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<WorldSectionElement> water = scene.world.makeSectionIndependent(util.select.fromTo(3, 1, 1, 3, 3, 1)
.add(util.select.fromTo(3, 3, 2, 3, 3, 3)));
ElementLink<WorldSectionElement> wheelElement = scene.world.makeSectionIndependent(util.select.position(wheel));
scene.world.moveSection(water, util.vector.of(1, 0.5, -0.5), 15);
scene.idle(5);
scene.world.setKineticSpeed(util.select.everywhere(), 0);
scene.world.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<WorldSectionElement> strip =
scene.world.showIndependentSection(util.select.fromTo(1, 0, 0, 1, 0, 4), Direction.UP);
scene.world.moveSection(strip, util.vector.of(2, 0, 0), 0);
scene.idle(10);
scene.world.showSection(util.select.fromTo(3, 1, 3, 3, 2, 3), Direction.DOWN);
scene.world.setKineticSpeed(util.select.everywhere(), 0);
BlockPos gaugePos = util.grid.at(1, 1, 2);
for (int i = 0; i < 4; i++) {
scene.idle(5);
if (i == 0)
scene.world.hideIndependentSection(strip, Direction.DOWN);
scene.world.showSection(util.select.position(gaugePos.east(i)), Direction.DOWN);
}
scene.idle(10);
for (int i = 0; i < 3; i++) {
scene.idle(5);
scene.world.showSection(util.select.position(3, 3, 3 - i), Direction.DOWN);
}
scene.world.setKineticSpeed(util.select.everywhere(), -4);
scene.effects.indicateSuccess(gaugePos);
BlockPos wheel = util.grid.at(3, 1, 2);
scene.effects.rotationSpeedIndicator(wheel);
scene.overlay.showText(60)
.text("Large Water Wheels draw force from adjacent Water Currents")
.placeNearTarget()
.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<WorldSectionElement> water = scene.world.makeSectionIndependent(util.select.fromTo(3, 0, 0, 3, 3, 0)
.add(util.select.fromTo(3, 3, 1, 3, 3, 3)));
scene.world.moveSection(water, util.vector.of(1, 0.5, -0.5), 15);
scene.idle(5);
scene.world.setKineticSpeed(util.select.everywhere(), 0);
scene.world.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<WorldSectionElement> contraption = scene.world.showIndependentSection(armS, Direction.NORTH);
scene.idle(3);
ElementLink<WorldSectionElement> valve =
scene.world.showIndependentSection(util.select.position(valvePos), Direction.SOUTH);
scene.world.rotateSection(valve, 0, 0, 45, 0);
scene.idle(20);
scene.overlay.showText(70)
.text("Valve handles can be used to rotate components by a precise angle")
.placeNearTarget()
.pointAt(sideOf);
scene.idle(20);
scene.world.rotateSection(valve, 0, 0, 45, 15);
scene.world.rotateSection(contraption, 0, 0, 45, 15);
scene.world.rotateBearing(bearing, 45, 15);
scene.world.setKineticSpeed(util.select.everywhere(), 16);
scene.idle(15);
scene.world.setKineticSpeed(util.select.everywhere(), 0);
scene.idle(60);
Vec3 blockSurface = util.vector.centerOf(valvePos)
.add(0, 0, 4 / 16f);
AABB point = new AABB(blockSurface, blockSurface);
AABB expanded = point.inflate(1 / 8f, 1 / 8f, 1 / 16f);
scene.overlay.chaseBoundingBoxOutline(PonderPalette.WHITE, blockSurface, point, 1);
scene.idle(1);
scene.overlay.chaseBoundingBoxOutline(PonderPalette.WHITE, blockSurface, expanded, 80);
scene.overlay.showControls(new InputWindowElement(blockSurface, Pointing.DOWN).rightClick(), 60);
scene.idle(10);
scene.overlay.showText(60)
.text("The angle can be configured on the input panel")
.attachKeyFrame()
.placeNearTarget()
.pointAt(blockSurface);
scene.idle(70);
scene.overlay.showControls(new InputWindowElement(topOf, Pointing.DOWN).rightClick(), 40);
scene.idle(7);
scene.world.rotateSection(valve, 0, 0, 90, 30);
scene.world.rotateSection(contraption, 0, 0, 90, 30);
scene.world.rotateBearing(bearing, 90, 30);
scene.world.setKineticSpeed(util.select.everywhere(), 16);
scene.idle(10);
scene.overlay.showText(40)
.text("Right-Click to activate one rotation")
.attachKeyFrame()
.placeNearTarget()
.pointAt(sideOf);
scene.idle(20);
scene.world.setKineticSpeed(util.select.everywhere(), 0);
scene.idle(25);
scene.overlay.showControls(new InputWindowElement(topOf, Pointing.DOWN).rightClick()
.whileSneaking(), 40);
scene.idle(7);
scene.world.rotateSection(valve, 0, 0, -90, 30);
scene.world.rotateSection(contraption, 0, 0, -90, 30);
scene.world.rotateBearing(bearing, -90, 30);
scene.world.setKineticSpeed(util.select.everywhere(), -16);
scene.idle(10);
scene.overlay.showText(50)
.text("Sneak-Right-Click to activate it in the opposite direction")
.placeNearTarget()
.pointAt(sideOf);
scene.idle(15);
scene.world.setKineticSpeed(util.select.everywhere(), 0);
scene.idle(40);
blockSurface = util.vector.topOf(bearing)
.add(0, 0, -1 / 8f);
point = new AABB(blockSurface, blockSurface);
expanded = point.inflate(1 / 8f, 0, 1 / 8f);
scene.overlay.chaseBoundingBoxOutline(PonderPalette.WHITE, blockSurface, point, 1);
scene.idle(1);
scene.overlay.chaseBoundingBoxOutline(PonderPalette.WHITE, blockSurface, expanded, 80);
scene.idle(10);
scene.overlay.showText(70)
.text("Mind that Bearings have to be specifically told not to disassemble")
.placeNearTarget()
.pointAt(blockSurface);
scene.idle(90);
scene.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<WorldSectionElement> 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")

View file

@ -109,6 +109,8 @@ public class MechanicalSawScenes {
scene.idle(3);
scene.addKeyframe();
scene.world.multiplyKineticSpeed(util.select.everywhere(), .5f);
ElementLink<WorldSectionElement> 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);

View file

@ -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<PortableItemInterfaceBlockEntity> 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);

View file

@ -21,6 +21,7 @@ import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.DoublePlantBlock;
import net.minecraft.world.level.block.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);

View file

@ -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);

View file

@ -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)

View file

@ -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);

View file

@ -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);
}
}
}

View file

@ -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");
}

View file

@ -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<WorldSectionElement> tankElement = scene.world.showIndependentSection(tank, Direction.DOWN);
scene.world.moveSection(tankElement, util.vector.of(0, -1, 0), 0);

View file

@ -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<BrassTunnelBlockEntity> tunnelClass = BrassTunnelBlockEntity.class;

View file

@ -2,6 +2,7 @@ package com.simibubi.create.foundation.ponder.content.fluid;
import com.simibubi.create.AllFluids;
import com.simibubi.create.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<PortableFluidInterfaceBlockEntity> 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);

View file

@ -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)

View file

@ -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()

View file

@ -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<WorldSectionElement> 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<WorldSectionElement> 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);

View file

@ -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());

View file

@ -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);

View file

@ -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))

View file

@ -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));

View file

@ -10,6 +10,7 @@ import com.simibubi.create.foundation.gui.element.BoxElement;
import com.simibubi.create.foundation.ponder.PonderLocalization;
import com.simibubi.create.foundation.ponder.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<FormattedText> lines = screen.getFontRenderer().getSplitter().splitLines(bakedText, textWidth, Style.EMPTY);
List<FormattedText> 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();
}

View file

@ -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());
}

View file

@ -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: ",

View file

@ -24,57 +24,49 @@
"item.create.blaze_cake.tooltip.summary": "A Delicious treat for your hard-working _Blaze Burners_. Gets them all fired up!",
"item.create.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."
}

View file

@ -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"}

View file

@ -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"}
}
}
],

View file

@ -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"}
}
},
{

View file

@ -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"}
}
}
],

View file

@ -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"}
}
}

View file

@ -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"}
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 299 B

After

Width:  |  Height:  |  Size: 420 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 305 B

After

Width:  |  Height:  |  Size: 425 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 634 B

After

Width:  |  Height:  |  Size: 639 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 424 B