Merge remote-tracking branch 'concealed/mc1.20.1/feature-dev' into mc1.20.1/feature-dev

This commit is contained in:
IThundxr 2025-01-12 16:06:57 -05:00
commit d506625266
Failed to generate hash of commit
9 changed files with 901 additions and 388 deletions

View file

@ -2128,7 +2128,7 @@
"create.ponder.nixie_tube.text_1": "ɥʇbuǝɹʇs ןɐubıs ǝɥʇ ʎɐןdsıp ןןıʍ sǝqn⟘ ǝıxıN 'ǝuoʇspǝᴚ ʎq pǝɹǝʍod uǝɥM",
"create.ponder.nixie_tube.text_2": "pǝʎɐןdsıp ǝq uɐɔ ʇxǝʇ ɯoʇsnɔ 'spɹɐoqdıןƆ uǝʇʇıɹʍ buıs∩",
"create.ponder.nixie_tube.text_3": "ɹnoןoɔ ʎɐןdsıp ɹıǝɥʇ ǝbuɐɥɔ oʇ ǝʎᗡ ɥʇıʍ ʞɔıןƆ-ʇɥbıᴚ",
"create.ponder.package_frogport.header": "sʇɹodboɹℲ ɥʇıʍ sǝbɐʞɔɐd buıʇɹodsuɐɹ⟘",
"create.ponder.package_frogport.header": "sʇɹodboɹℲ uǝǝʍʇǝq sǝbɐʞɔɐd buıʇɹodsuɐɹ⟘",
"create.ponder.package_frogport.text_1": "ʎqɹɐǝu ʇɹodboɹℲ ǝɥʇ ǝɔɐןd puɐ ɹoʎǝʌuoƆ uıɐɥƆ ɐ ʞɔıןɔ-ʇɥbıᴚ",
"create.ponder.package_frogport.text_10": "ʞɹoʍʇǝu uıɐɥɔ ǝɥʇ uo boɹɟ buıɥɔʇɐɯ ɐ oʇ ɥʇɐd ɹıǝɥʇ puıɟ sǝbɐʞɔɐԀ",
"create.ponder.package_frogport.text_11": "ɹǝʇǝԀ",
@ -2140,8 +2140,8 @@
"create.ponder.package_frogport.text_17": ",ɹǝʇǝԀ, oʇ sǝbɐʞɔɐd sǝssǝɹppⱯ",
"create.ponder.package_frogport.text_18": "ssǝɹppɐ ɹıǝɥʇ ʇɔǝןןoɔ oʇ pɹɐoqdıןɔ ɐ ɥʇıʍ sʇɹodboɹℲ ʞɔıןɔ-ʇɥbıᴚ",
"create.ponder.package_frogport.text_19": "sI∩ ɹǝɥʇo uı sʇnduı ssǝɹppɐ ǝʇǝןdɯoɔ-oʇnɐ dןǝɥ uɐɔ sǝɯɐu pǝʇɔǝןןoɔ ɥʇıʍ spɹɐoqdıןƆ",
"create.ponder.package_frogport.text_2": "I∩ ʎɹoʇuǝʌuı ɹıǝɥʇ uı ǝɯɐu ɐ uǝʌıb ǝq uɐɔ ʎǝɥ⟘",
"create.ponder.package_frogport.text_3": "˙˙ǝɯɐu ʇuǝɹǝɟɟıp ɐ oʇ pǝssǝɹppɐ sı ǝbɐʞɔɐd ɐ ɟI",
"create.ponder.package_frogport.text_2": "I∩ ʎɹoʇuǝʌuı ǝɥʇ uı ssǝɹppɐ uɐ ʇı ubıssⱯ",
"create.ponder.package_frogport.text_3": "˙˙ʇı ɥɔʇɐɯ ʇou sǝop ǝbɐʞɔɐd pǝʇɹǝsuı uɐ ɟo ssǝɹppɐ ǝɥʇ ɟI",
"create.ponder.package_frogport.text_4": "ʇɹǝqןⱯ",
"create.ponder.package_frogport.text_5": "ɹǝʇǝԀ →",
"create.ponder.package_frogport.text_6": "ɹoʎǝʌuoɔ ǝɥʇ uo ǝbɐʞɔɐd ǝɥʇ ǝɔɐןd ןןıʍ ʇɹodboɹℲ ǝɥʇ˙˙",
@ -2191,6 +2191,19 @@
"create.ponder.portable_storage_interface.text_8": "ʎɐʍ sʇı uo ǝnuıʇuoɔ ןןıʍ uoıʇdɐɹʇuoɔ ǝɥʇ 'ǝןıɥʍ ɐ ɹoɟ pǝbuɐɥɔxǝ uǝǝq ǝʌɐɥ sɯǝʇı ou ɹǝʇɟⱯ",
"create.ponder.portable_storage_interface_redstone.header": "ןoɹʇuoƆ ǝuoʇspǝᴚ",
"create.ponder.portable_storage_interface_redstone.text_1": "buıbɐbuǝ ɯoɹɟ ǝɔɐɟɹǝʇuı ʎɹɐuoıʇɐʇs ǝɥʇ ʇuǝʌǝɹd ןןıʍ ɹǝʍod ǝuoʇspǝᴚ",
"create.ponder.postbox.header": "sǝxoqʇsoԀ uǝǝʍʇǝq sǝbɐʞɔɐd buıʇɹodsuɐɹ⟘",
"create.ponder.postbox.text_1": "ʎqɹɐǝu xoqʇsoԀ ǝɥʇ ǝɔɐןd puɐ uoıʇɐʇS uıɐɹ⟘ ɐ ʞɔıןɔ-ʇɥbıᴚ",
"create.ponder.postbox.text_10": "ǝsnoɥǝɹɐM →",
"create.ponder.postbox.text_11": "sʞunɥɔ pǝpɐoןun uı ɹnoıʌɐɥǝq ɹıǝɥʇ uıɐʇuıɐɯ sǝxoqʇsoԀ 'suıɐɹʇ ǝʞıן ʇsnſ",
"create.ponder.postbox.text_12": "ʎɹoʇuǝʌuı ɹıǝɥʇ oʇ ɹo ɯoɹɟ pǝɹǝʌıןǝp ǝq ןןıʇs uɐɔ sǝbɐʞɔɐԀ",
"create.ponder.postbox.text_2": "I∩ ʎɹoʇuǝʌuı ǝɥʇ uı ssǝɹppɐ uɐ ʇı ubıssⱯ",
"create.ponder.postbox.text_3": "˙˙ʇı ɥɔʇɐɯ ʇou sǝop ǝbɐʞɔɐd pǝʇɹǝsuı uɐ ɟo ssǝɹppɐ ǝɥʇ ɟI",
"create.ponder.postbox.text_4": "ǝsnoɥǝɹɐM",
"create.ponder.postbox.text_5": "ʇsodʇnO →",
"create.ponder.postbox.text_6": "obɹɐɔ sɐ ʇı ʇɔǝןןoɔ ןןıʍ uoıʇɐʇs ǝɥʇ ʇɐ buıddoʇs suıɐɹʇ˙˙",
"create.ponder.postbox.text_7": "ɟɟo pǝddoɹp ǝq ןןıʍ ssǝɹppɐ ǝɥʇ buıɥɔʇɐɯ sǝbɐʞɔɐd 'ʎןǝsɹǝʌuoƆ",
"create.ponder.postbox.text_8": "xoqʇsoԀ ǝɥʇ ɯoɹɟ pǝʇɔɐɹʇxǝ ǝq uɐɔ uıɐɹʇ ʎq pǝʌıɹɹɐ ʇɐɥʇ sǝbɐʞɔɐԀ",
"create.ponder.postbox.text_9": "ǝsnoɥǝɹɐM",
"create.ponder.powered_latch.header": "ɥɔʇɐꞀ pǝɹǝʍoԀ ǝɥʇ buısn sןɐubıs buıןןoɹʇuoƆ",
"create.ponder.powered_latch.text_1": "sɹǝʌǝꞀ ǝןןןoɹʇuoɔ ǝuoʇspǝɹ ǝɹɐ sǝɥɔʇɐꞀ pǝɹǝʍoԀ",
"create.ponder.powered_latch.text_2": "uo ʇı ɥɔʇıʍs ʞɔɐq ǝɥʇ ʇɐ sןɐubıS",

View file

@ -2128,7 +2128,7 @@
"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.package_frogport.header": "Transporting packages with Frogports",
"create.ponder.package_frogport.header": "Transporting packages between Frogports",
"create.ponder.package_frogport.text_1": "Right-click a Chain Conveyor and place the Frogport nearby",
"create.ponder.package_frogport.text_10": "Packages find their path to a matching frog on the chain network",
"create.ponder.package_frogport.text_11": "Peter",
@ -2140,8 +2140,8 @@
"create.ponder.package_frogport.text_17": "Addresses packages to 'Peter'",
"create.ponder.package_frogport.text_18": "Right-click Frogports with a clipboard to collect their address",
"create.ponder.package_frogport.text_19": "Clipboards with collected names can help auto-complete address inputs in other UIs",
"create.ponder.package_frogport.text_2": "They can be given a name in their inventory UI",
"create.ponder.package_frogport.text_3": "If a package is addressed to a different name..",
"create.ponder.package_frogport.text_2": "Assign it an address in the inventory UI",
"create.ponder.package_frogport.text_3": "If the address of an inserted package does not match it..",
"create.ponder.package_frogport.text_4": "Albert",
"create.ponder.package_frogport.text_5": "→ Peter",
"create.ponder.package_frogport.text_6": "..the Frogport will place the package on the conveyor",
@ -2191,6 +2191,19 @@
"create.ponder.portable_storage_interface.text_8": "After no items have been exchanged for a while, the contraption will continue on its way",
"create.ponder.portable_storage_interface_redstone.header": "Redstone Control",
"create.ponder.portable_storage_interface_redstone.text_1": "Redstone power will prevent the stationary interface from engaging",
"create.ponder.postbox.header": "Transporting packages between Postboxes",
"create.ponder.postbox.text_1": "Right-click a Train Station and place the Postbox nearby",
"create.ponder.postbox.text_10": "→ Warehouse",
"create.ponder.postbox.text_11": "Just like trains, Postboxes maintain their behaviour in unloaded chunks",
"create.ponder.postbox.text_12": "Packages can still be delivered from or to their inventory",
"create.ponder.postbox.text_2": "Assign it an address in the inventory UI",
"create.ponder.postbox.text_3": "If the address of an inserted package does not match it..",
"create.ponder.postbox.text_4": "Warehouse",
"create.ponder.postbox.text_5": "→ Outpost",
"create.ponder.postbox.text_6": "..trains stopping at the station will collect it as cargo",
"create.ponder.postbox.text_7": "Conversely, packages matching the address will be dropped off",
"create.ponder.postbox.text_8": "Packages that arrived by train can be extracted from the Postbox",
"create.ponder.postbox.text_9": "Warehouse",
"create.ponder.powered_latch.header": "Controlling signals using the Powered Latch",
"create.ponder.powered_latch.text_1": "Powered Latches are redstone controllable Levers",
"create.ponder.powered_latch.text_2": "Signals at the back switch it on",

View file

@ -25,6 +25,7 @@ public class PostboxBlockEntity extends PackagePortBlockEntity {
public WeakReference<GlobalStation> trackedGlobalStation;
public LerpedFloat flag;
public boolean forceFlag;
private boolean sendParticles;
@ -38,7 +39,7 @@ public class PostboxBlockEntity extends PackagePortBlockEntity {
@Override
public void tick() {
super.tick();
if (!level.isClientSide) {
if (!level.isClientSide && !isVirtual()) {
if (sendParticles)
sendData();
return;
@ -46,7 +47,7 @@ public class PostboxBlockEntity extends PackagePortBlockEntity {
float currentTarget = flag.getChaseTarget();
if (currentTarget == 0 || flag.settled()) {
int target = inventory.isEmpty() ? 0 : 1;
int target = (inventory.isEmpty() && !forceFlag) ? 0 : 1;
if (target != currentTarget) {
flag.chase(target, 0.1f, Chaser.LINEAR);
if (target == 1)

View file

@ -3,6 +3,8 @@ package com.simibubi.create.foundation.ponder;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.Create;
import com.simibubi.create.content.kinetics.crank.ValveHandleBlock;
import com.simibubi.create.content.logistics.packagePort.postbox.PostboxBlock;
import com.simibubi.create.content.logistics.tableCloth.TableClothBlock;
import com.simibubi.create.infrastructure.ponder.AllCreatePonderScenes;
import com.simibubi.create.infrastructure.ponder.AllCreatePonderTags;
@ -13,6 +15,7 @@ import net.createmod.ponder.api.registration.PonderSceneRegistrationHelper;
import net.createmod.ponder.api.registration.PonderTagRegistrationHelper;
import net.createmod.ponder.api.registration.SharedTextRegistrationHelper;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.item.DyeColor;
public class CreatePonderPlugin implements PonderPlugin {
@ -51,5 +54,7 @@ public class CreatePonderPlugin implements PonderPlugin {
@Override
public void indexExclusions(IndexExclusionHelper helper) {
helper.excludeBlockVariants(ValveHandleBlock.class, AllBlocks.COPPER_VALVE_HANDLE.get());
helper.excludeBlockVariants(PostboxBlock.class, AllBlocks.PACKAGE_POSTBOXES.get(DyeColor.WHITE).get());
helper.excludeBlockVariants(TableClothBlock.class, AllBlocks.TABLE_CLOTHS.get(DyeColor.WHITE).get());
}
}

View file

@ -43,6 +43,7 @@ import com.simibubi.create.infrastructure.ponder.scenes.fluid.PumpScenes;
import com.simibubi.create.infrastructure.ponder.scenes.fluid.SpoutScenes;
import com.simibubi.create.infrastructure.ponder.scenes.highLogistics.FrogAndConveyorScenes;
import com.simibubi.create.infrastructure.ponder.scenes.highLogistics.PackagerScenes;
import com.simibubi.create.infrastructure.ponder.scenes.highLogistics.PostboxScenes;
import com.simibubi.create.infrastructure.ponder.scenes.trains.TrackObserverScenes;
import com.simibubi.create.infrastructure.ponder.scenes.trains.TrackScenes;
import com.simibubi.create.infrastructure.ponder.scenes.trains.TrainScenes;
@ -54,6 +55,7 @@ import com.tterrag.registrate.util.entry.RegistryEntry;
import net.createmod.ponder.api.registration.PonderSceneRegistrationHelper;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.item.DyeColor;
import net.minecraftforge.registries.ForgeRegistries;
import net.minecraftforge.registries.RegistryObject;
@ -354,6 +356,8 @@ public class AllCreatePonderScenes {
.addStoryBoard("high_logistics/chain_conveyor", FrogAndConveyorScenes::conveyor);
HELPER.forComponents(AllBlocks.PACKAGE_FROGPORT)
.addStoryBoard("high_logistics/package_frogport", FrogAndConveyorScenes::frogPort);
HELPER.forComponents(AllBlocks.PACKAGE_POSTBOXES.toArray())
.addStoryBoard("high_logistics/package_postbox", PostboxScenes::postbox);
HELPER.forComponents(AllBlocks.PACKAGER)
.addStoryBoard("high_logistics/packager", PackagerScenes::packager)
.addStoryBoard("high_logistics/packager_address", PackagerScenes::packagerAddress);

View file

@ -376,7 +376,7 @@ public class FrogAndConveyorScenes {
public static void frogPort(SceneBuilder builder, SceneBuildingUtil util) {
CreateSceneBuilder scene = new CreateSceneBuilder(builder);
scene.title("package_frogport", "Transporting packages with Frogports");
scene.title("package_frogport", "Transporting packages between Frogports");
scene.configureBasePlate(0, 0, 9);
scene.scaleSceneView(.75f);
scene.setSceneOffsetY(-1);
@ -526,7 +526,7 @@ public class FrogAndConveyorScenes {
.position(fromFrog.below()), 70)
.attachKeyFrame()
.colored(PonderPalette.BLUE)
.text("They can be given a name in their inventory UI")
.text("Assign it an address in the inventory UI")
.pointAt(util.vector()
.topOf(fromFrog.below()))
.placeNearTarget();
@ -568,7 +568,7 @@ public class FrogAndConveyorScenes {
scene.overlay()
.showText(60)
.attachKeyFrame()
.text("If a package is addressed to a different name..")
.text("If the address of an inserted package does not match it..")
.pointAt(util.vector()
.topOf(5, 0, 3))
.placeNearTarget();

View file

@ -0,0 +1,477 @@
package com.simibubi.create.infrastructure.ponder.scenes.highLogistics;
import java.util.List;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.content.logistics.box.PackageItem;
import com.simibubi.create.content.logistics.box.PackageStyles;
import com.simibubi.create.content.logistics.packagePort.postbox.PostboxBlockEntity;
import com.simibubi.create.foundation.ponder.CreateSceneBuilder;
import net.createmod.catnip.utility.Pointing;
import net.createmod.ponder.api.PonderPalette;
import net.createmod.ponder.api.element.ElementLink;
import net.createmod.ponder.api.element.ParrotElement;
import net.createmod.ponder.api.element.ParrotPose.FacePointOfInterestPose;
import net.createmod.ponder.api.element.WorldSectionElement;
import net.createmod.ponder.api.scene.SceneBuilder;
import net.createmod.ponder.api.scene.SceneBuildingUtil;
import net.createmod.ponder.api.scene.Selection;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.world.item.DyeColor;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.phys.AABB;
import net.minecraft.world.phys.Vec3;
public class PostboxScenes {
public static void postbox(SceneBuilder builder, SceneBuildingUtil util) {
CreateSceneBuilder scene = new CreateSceneBuilder(builder);
scene.title("postbox", "Transporting packages between Postboxes");
scene.configureBasePlate(0, 1, 9);
scene.scaleSceneView(.875f);
scene.setSceneOffsetY(-0.5f);
BlockPos station = util.grid()
.at(1, 1, 8);
Selection stationS = util.select()
.position(1, 1, 8);
BlockPos box2 = util.grid()
.at(3, 1, 8);
Selection box2S = util.select()
.position(3, 1, 8);
Selection glass = util.select()
.fromTo(3, 1, 9, 1, 1, 9);
BlockPos box = util.grid()
.at(1, 2, 2);
Selection boxS = util.select()
.position(1, 2, 2);
Selection girder = util.select()
.position(1, 1, 2);
Selection belt = util.select()
.fromTo(4, 1, 2, 2, 1, 2);
Selection cog = util.select()
.fromTo(4, 1, 1, 4, 1, 0);
Selection largeCog = util.select()
.position(5, 0, 0);
Selection train1 = util.select()
.fromTo(0, 2, 4, 3, 3, 6);
Selection train2 = util.select()
.fromTo(4, 2, 4, 8, 3, 6);
BlockPos controls = util.grid()
.at(2, 3, 5);
Selection tracks = util.select()
.fromTo(9, 1, 5, 30, 1, 5);
BlockPos funnel = util.grid()
.at(2, 2, 2);
ItemStack boxItem2 = PackageItem.containing(List.of());
PackageItem.addAddress(boxItem2, "Peter");
scene.world()
.createItemOnBeltLike(util.grid()
.at(6, 2, 4), Direction.DOWN, boxItem2);
scene.world()
.toggleControls(controls);
ElementLink<WorldSectionElement> base = scene.world()
.showIndependentSection(util.select()
.fromTo(0, 0, 1, 8, 0, 9), Direction.UP);
scene.idle(10);
ElementLink<WorldSectionElement> tracksL = scene.world()
.showIndependentSection(util.select()
.position(8, 1, 5), Direction.DOWN);
scene.idle(1);
for (int i = 7; i >= 0; i--) {
scene.world()
.showSectionAndMerge(util.select()
.position(i, 1, 5), Direction.DOWN, tracksL);
scene.idle(1);
}
scene.idle(5);
scene.world()
.showSectionAndMerge(stationS, Direction.DOWN, base);
scene.idle(15);
Vec3 fromTarget = util.vector()
.topOf(station);
ItemStack postboxItem = AllBlocks.PACKAGE_POSTBOXES.get(DyeColor.WHITE)
.asStack();
scene.overlay()
.showControls(fromTarget, Pointing.DOWN, 50)
.rightClick()
.withItem(postboxItem);
scene.idle(5);
AABB bb1 = new AABB(fromTarget, fromTarget);
scene.overlay()
.chaseBoundingBoxOutline(PonderPalette.WHITE, box, bb1, 10);
scene.idle(1);
scene.overlay()
.chaseBoundingBoxOutline(PonderPalette.WHITE, box, bb1.inflate(0.025, 0.025, 0.025), 50);
scene.idle(26);
scene.overlay()
.showText(80)
.text("Right-click a Train Station and place the Postbox nearby")
.attachKeyFrame()
.placeNearTarget()
.pointAt(fromTarget);
scene.idle(40);
ElementLink<WorldSectionElement> postboxE = scene.world()
.showIndependentSection(boxS, Direction.DOWN);
scene.world()
.moveSection(postboxE, util.vector()
.of(0, -1, 0), 0);
scene.idle(15);
scene.overlay()
.chaseBoundingBoxOutline(PonderPalette.GREEN, box, bb1.inflate(0.025, 0.025, 0.025), 50);
AABB bb2 = new AABB(box.below()).deflate(0.125, 0, 0)
.contract(0, 0.125, 0);
scene.overlay()
.chaseBoundingBoxOutline(PonderPalette.GREEN, box2, bb2, 50);
scene.idle(10);
scene.overlay()
.showLine(PonderPalette.GREEN, util.vector()
.topOf(box.below()), fromTarget, 40);
scene.idle(45);
scene.overlay()
.showControls(util.vector()
.topOf(box.below()), Pointing.DOWN, 40)
.rightClick();
scene.idle(7);
scene.overlay()
.chaseBoundingBoxOutline(PonderPalette.BLUE, funnel, bb2, 70);
scene.overlay()
.showText(70)
.attachKeyFrame()
.colored(PonderPalette.BLUE)
.text("Assign it an address in the inventory UI")
.pointAt(util.vector()
.topOf(box.below()))
.placeNearTarget();
scene.idle(80);
scene.world()
.moveSection(postboxE, util.vector()
.of(0, 1, 0), 10);
scene.idle(10);
scene.world()
.showSectionAndMerge(girder, Direction.NORTH, base);
scene.idle(5);
scene.world()
.showSectionAndMerge(largeCog, Direction.UP, base);
scene.world()
.showSectionAndMerge(cog, Direction.DOWN, base);
scene.world()
.showSectionAndMerge(belt, Direction.WEST, base);
scene.idle(5);
scene.world()
.showSectionAndMerge(util.select()
.position(funnel), Direction.DOWN, base);
scene.idle(10);
ItemStack boxItem = PackageStyles.getDefaultBox()
.copy();
PackageItem.addAddress(boxItem, "Peter");
scene.world()
.createItemOnBelt(util.grid()
.at(3, 1, 2), Direction.EAST, boxItem);
scene.idle(5);
scene.world()
.multiplyKineticSpeed(util.select()
.everywhere(), 1 / 32f);
scene.overlay()
.showText(60)
.attachKeyFrame()
.text("If the address of an inserted package does not match it..")
.pointAt(util.vector()
.centerOf(3, 2, 2))
.placeNearTarget();
scene.idle(70);
scene.overlay()
.showText(40)
.colored(PonderPalette.BLUE)
.text("Warehouse")
.pointAt(util.vector()
.blockSurface(box, Direction.NORTH)
.add(-.5, 0, 0))
.placeNearTarget();
scene.idle(5);
scene.overlay()
.showText(40)
.colored(PonderPalette.OUTPUT)
.text("\u2192 Outpost")
.pointAt(util.vector()
.centerOf(3, 2, 2))
.placeNearTarget();
scene.idle(50);
scene.world()
.multiplyKineticSpeed(util.select()
.everywhere(), 32f);
scene.idle(17);
scene.world()
.removeItemsFromBelt(util.grid()
.at(2, 1, 2));
animatePostbox(scene, box, true);
scene.world()
.flapFunnel(funnel, false);
scene.idle(15);
ElementLink<WorldSectionElement> train1L = scene.world()
.showIndependentSection(train1, null);
ElementLink<ParrotElement> birbL = scene.special()
.createBirb(util.vector()
.of(9.5, 3.5, 5.5), FacePointOfInterestPose::new);
scene.special()
.movePointOfInterest(util.grid()
.at(-5, 4, 5));
scene.world()
.moveSection(train1L, util.vector()
.of(6, 0, 0), 0);
scene.idle(1);
scene.special()
.moveParrot(birbL, util.vector()
.of(-5, 0, 0), 25);
scene.world()
.moveSection(train1L, util.vector()
.of(-5, 0, 0), 25);
scene.world()
.animateBogey(util.grid()
.at(2, 2, 5), 6, 25);
scene.idle(14);
ElementLink<WorldSectionElement> train2L = scene.world()
.showIndependentSection(train2, null);
scene.world()
.moveSection(train2L, util.vector()
.of(3, 0, 0), 0);
scene.idle(1);
scene.world()
.moveSection(train2L, util.vector()
.of(-2, 0, 0), 10);
scene.world()
.animateBogey(util.grid()
.at(6, 2, 5), 2, 10);
scene.idle(10);
scene.special()
.moveParrot(birbL, util.vector()
.of(-1, 0, 0), 10);
scene.world()
.moveSection(train1L, util.vector()
.of(-1, 0, 0), 10);
scene.world()
.animateBogey(util.grid()
.at(2, 2, 5), 1, 10);
scene.world()
.moveSection(train2L, util.vector()
.of(-1, 0, 0), 10);
scene.world()
.animateBogey(util.grid()
.at(6, 2, 5), 1, 10);
scene.idle(10);
scene.world()
.animateTrainStation(station, true);
scene.idle(10);
scene.effects()
.indicateSuccess(box);
scene.effects()
.indicateSuccess(util.grid()
.at(5, 3, 4));
scene.world()
.createItemOnBeltLike(util.grid()
.at(5, 2, 4), Direction.DOWN, boxItem);
scene.idle(15);
animatePostbox(scene, box, false);
scene.overlay()
.showText(80)
.text("..trains stopping at the station will collect it as cargo")
.attachKeyFrame()
.pointAt(util.vector()
.topOf(5, 2, 4))
.placeNearTarget();
scene.idle(95);
scene.overlay()
.showText(80)
.text("Conversely, packages matching the address will be dropped off")
.attachKeyFrame()
.pointAt(util.vector()
.topOf(6, 2, 4))
.placeNearTarget();
scene.idle(50);
scene.world()
.removeItemsFromBelt(util.grid()
.at(6, 2, 4));
scene.effects()
.indicateSuccess(box);
scene.effects()
.indicateSuccess(util.grid()
.at(6, 2, 4));
animatePostbox(scene, box, true);
scene.idle(60);
scene.overlay()
.showText(100)
.text("Packages that arrived by train can be extracted from the Postbox")
.attachKeyFrame()
.pointAt(util.vector()
.blockSurface(box, Direction.NORTH))
.placeNearTarget();
scene.idle(60);
scene.world()
.multiplyKineticSpeed(util.select()
.everywhere(), -1);
scene.world()
.createItemOnBelt(util.grid()
.at(2, 1, 2), Direction.WEST, boxItem2);
animatePostbox(scene, box, false);
scene.idle(25);
scene.world()
.multiplyKineticSpeed(util.select()
.everywhere(), 0);
scene.idle(25);
scene.overlay()
.showText(40)
.colored(PonderPalette.BLUE)
.text("Warehouse")
.pointAt(util.vector()
.blockSurface(box, Direction.NORTH)
.add(-.5, 0, 0))
.placeNearTarget();
scene.idle(5);
scene.overlay()
.showText(40)
.colored(PonderPalette.OUTPUT)
.text("\u2192 Warehouse")
.pointAt(util.vector()
.centerOf(3, 2, 2)
.add(0, -.25, 0))
.placeNearTarget();
scene.idle(50);
ElementLink<WorldSectionElement> tracksL2 = scene.world()
.showIndependentSection(tracks, Direction.EAST);
scene.world()
.moveSection(tracksL2, util.vector()
.of(-31, 0, 0), 0);
scene.idle(15);
scene.world()
.animateTrainStation(station, false);
scene.world()
.moveSection(tracksL, util.vector()
.of(12, 0, 0), 120);
scene.world()
.moveSection(tracksL2, util.vector()
.of(12, 0, 0), 120);
scene.world()
.moveSection(postboxE, util.vector()
.of(12, 0, 0), 120);
scene.world()
.moveSection(base, util.vector()
.of(12, 0, 0), 120);
scene.world()
.animateBogey(util.grid()
.at(2, 2, 5), 12f, 120);
scene.world()
.animateBogey(util.grid()
.at(6, 2, 5), 12f, 120);
scene.idle(15);
scene.world()
.hideIndependentSection(base, null);
scene.world()
.hideIndependentSection(postboxE, null);
scene.idle(40);
scene.special()
.hideElement(birbL, null);
scene.world()
.hideIndependentSection(train1L, null);
scene.world()
.hideIndependentSection(train2L, null);
scene.idle(5);
scene.overlay()
.chaseBoundingBoxOutline(PonderPalette.BLUE, train1L, new AABB(util.grid()
.at(1, 3, 4)).inflate(1, .75f, .5f), 280);
scene.overlay()
.chaseBoundingBoxOutline(PonderPalette.BLUE, train2L, new AABB(util.grid()
.at(5, 3, 4)).inflate(1, .75f, .5f), 280);
scene.idle(19);
ElementLink<WorldSectionElement> outpostL = scene.world()
.showIndependentSection(glass, Direction.UP);
scene.world()
.moveSection(outpostL, util.vector()
.of(-4, -1, -1), 0);
scene.idle(1);
scene.world()
.moveSection(outpostL, util.vector()
.of(4, 0, 0), 40);
scene.idle(9);
ElementLink<WorldSectionElement> stationL = scene.world()
.showIndependentSection(stationS.add(box2S), Direction.DOWN);
scene.world()
.moveSection(stationL, util.vector()
.of(-3, 0, 0), 0);
scene.idle(1);
scene.world()
.moveSection(stationL, util.vector()
.of(3, 0, 0), 30);
scene.idle(30);
scene.world()
.animateTrainStation(util.grid()
.at(1, 1, 8), true);
scene.idle(10);
scene.overlay()
.showText(90)
.text("Just like trains, Postboxes maintain their behaviour in unloaded chunks")
.colored(PonderPalette.BLUE)
.attachKeyFrame()
.independent(30);
scene.idle(100);
scene.effects()
.indicateSuccess(util.grid()
.at(3, 1, 8));
animatePostbox(scene, util.grid()
.at(3, 1, 8), true);
scene.overlay()
.showText(90)
.text("Packages can still be delivered from or to their inventory")
.colored(PonderPalette.BLUE)
.placeNearTarget()
.pointAt(util.vector()
.blockSurface(util.grid()
.at(3, 1, 8), Direction.NORTH));
scene.idle(80);
}
public static void animatePostbox(CreateSceneBuilder scene, BlockPos box, boolean raise) {
scene.world()
.modifyBlockEntity(box, PostboxBlockEntity.class, be -> be.forceFlag = raise);
}
}