No vehicle bays, no cross-entity property sharing, no mid-air spawn APIs, no async callbacks. Every mechanic required a custom workaround.
teleport_rider - no custom physics, no tick-precise tracking.crashLives, variant, fuel, fuelMax read from G-Square -> stored in c17_loaded_g_state_slot_1/2. On unload: fully restored to new G-Square instance. Legacy fuel fallback keys supported.c17_jump_request). 1-tick intentional delay ensures the tag lands before mount logic runs.
Click any step to expand. Three flows share the same attack input but route differently based on entity state properties.
q.is_on_ground && !q.property('aria:ground_mode') -> routes to ground_mode_on. Second ground attack while mode is active toggles it off and despawns Loader.
c17_loader_id on Cartogo, owner_c17_id on Loader. Orphan cleanup runs every 100 ticks across all dimensions.
aria:busy_until), G-Square within 3 blocks, loaded_g_count < 2 (max 2 slots).
mount_trigger == 1 -> mount_g state runs the ride command. teleport_rider snaps G-Square to Loader's frozen position instantly - directly inside the Cartogo cargo bay geometry.
crashLives, variant, fuel, fuelMax with legacy fallback keys. G-Square despawns. Cargo bay geo layer activates. loaded_g_count +1.
pending_unload_token UUID prevents duplicate spawns from racing timeouts. loaded_g_count -1 only after animation ends - keeps render controller in sync.
| Property | Entity | Purpose | Values |
|---|---|---|---|
| aria:loaded_g_count | Cartogo | Number of G-Squares in cargo bay - gates load/unload and cargo geo | 0 / 1 / 2 |
| aria:midair_unloading | Cartogo | Locks out second drop during ongoing animation | bool |
| aria:jump_to_g_ready | Cartogo | Routes attack to jump_to_g instead of new drop - the 40-tick gate | 0 / 1 |
| aria:ground_mode | Cartogo | Loader active - enables ground load/unload UI flow | bool |
| aria:autopilot_mode | Cartogo | No-rider state - prevents crash, enables clean refund sequence | bool |
| aria:is_midair_drop | G-Square | Activates parachute controller, parachute geo, blocks normal ride entry | bool |
| aria:fuel / aria:fuel_max | G-Square | Saved/restored per slot - legacy fallback keys supported | float |
| c17_loaded_g_state_slot_1/2 | Cartogo dyn. | Serialized G-Square state per cargo slot - JSON string in dynamic property | JSON |
| aria:pending_unload_token | Cartogo dyn. | UUID job token - only current holder may spawn on unload timeout | UUID string |
| aria:busy_until | Cartogo dyn. | Tick timestamp - blocks new UI actions while animation runs | tick number |
| c17_loader_id / owner_c17_id | Dyn. (both) | Bidirectional ID link - enables orphan detection and safe cross-reference | entity ID |
aria:busy_until timestamp blocks new UI actions until animation resolves. Communicated as "loader busy" actionbar message. No silent failures.aria:pending_unload_token UUID is validated before each spawn. Old timeouts carry stale tokens - they check, fail, and produce no G-Square. Exactly one spawn per unload action.c17_midair_drop_<id>. Old tags cleaned before spawn. Jump always targets exact entity.owner_c17_id on all Loader entities across all dimensions - removes any without valid owner.entityHitEntity to tag player. Mount logic runs same tick. 1-tick intentional delay ensures tag is set before script reads it - prevents missed jumps under Bedrock's event ordering.// attack_controller_c17 - single input entry point // Same 0-damage attack -> different action based on state "idle": { "transitions": [ // GROUND: toggle loader { "ground_mode_on": "q.property('aria:player_attack') == 1 && q.is_on_ground && !q.property('aria:ground_mode')" }, { "ground_mode_off": "q.property('aria:player_attack') == 1 && q.is_on_ground && q.property('aria:ground_mode')" }, // AIR: drop (no window open) { "midair_drop": "q.property('aria:player_attack') == 1 && !q.is_on_ground && q.property('aria:jump_to_g_ready') == 0" }, // AIR: jump into falling G-Square (window open) { "jump_to_g": "q.property('aria:player_attack') == 1 && !q.is_on_ground && q.property('aria:jump_to_g_ready') == 1" } ], "on_entry": [ "@s aria:set_property_player_attack_0" ] }, "midair_drop": { "animations": ["midair_drop_logic"], // keyframe-timed spawn trigger "on_entry": [ "/scriptevent aria_pp:c17_midair_drop", "@s aria:set_property_player_attack_0" ], "transitions": [{ "idle": "q.all_animations_finished" }] }, "jump_to_g": { "on_entry": [ "/scriptevent aria_pp:c17_jump_to_g", "@s aria:set_property_player_attack_0", "@s aria:set_jump_to_g_false" ], "transitions": [{ "idle": "1" }] // immediate }, "spawn_loader": { "animations": ["delay_300ms"], "on_exit": [ "/scriptevent aria_pp:c17_loader_spawn" ], "transitions": [{ "idle": "q.all_animations_finished" }] }
// c17_loader.main - the workaround distilled to its purest form // Frozen entity. Two states. One job. "idle": { "transitions": [{ "mount_g": "q.property('aria:mount_trigger') == 1" }], "on_entry": [ "@s aria:set_mount_trigger_0" ] }, "mount_g": { "animations": ["delay_10ms"], "on_entry": [ // Core workaround: Bedrock's rider system does all positioning. // Loader is frozen at ~29.75 block offset behind Cartogo. // teleport_rider snaps G-Square to that exact position instantly. "/ride @e[type=aria_pp:g_class,r=3,c=1] start_riding @s teleport_rider", "@s aria:set_mount_trigger_0" ], "transitions": [{ "idle": "q.all_animations_finished" }] } // No custom physics. No tick-precise tracking. // The engine does the work. The Loader just exists in the right place.
// g_class_midair - only active when is_midair_drop = true // Orthogonal to normal G-Square ride logic - zero interference "default": { "transitions": [{ "midair_start": "query.property('aria:is_midair_drop')" }] }, "glide": { "on_entry": [ "/playsound aria_pp.parachute_open @a[r=25]", "/effect @s slow_falling 100 1 true" // amplifier 1 = very slow descent // 100s covers any realistic drop altitude ], "transitions": [{ "landed": "query.is_on_ground" }] }, "landed": { "animations": ["midair_drop_landing"], "on_entry": [ "/effect @s clear slow_falling", "/playsound aria_pp.parachute_open @a[r=25] ~~~ 0.4 1.8" // 1.8 pitch = parachute collapsing // is_midair_drop set false by script before this -> g_class.rider takes over ] }
// c17.moving - full flight lifecycle (bonus) // Shows crash-lives system and diving/stall warnings "flying": { "transitions": [ { "not_moving": "query.is_on_ground" }, { "diving": "query.vertical_speed <= -40 && !q.property('aria:autopilot_mode')" }, { "falling_check": "!q.property('aria:autopilot_mode') && query.ground_speed < 2" } ], "on_entry": [ "/effect @s levitation 1 1 true", // 1-tick lift keeps plane airborne "/tag @s add aria_pp.liftoff" ] }, "diving": { // vertical_speed <= -40 = nose-down "transitions": [ { "transform_crash": "query.is_on_ground || query.is_in_water" }, { "flying": "query.is_baby && query.is_moving" } // pull-up escape ], "on_entry": [ "/playsound aria_pp.stalling.alert @a[r=35] ~ ~ ~ 1 0.5", "/titleraw @a[r=5] actionbar {\"rawtext\":[{\"translate\":\"aria_pp.all_planes.diving_pull_up\"}]}" ] }, "transform_crash": { "on_entry": [ // Configurable: -1 life (option 1) or -3 lives (option 2) "/execute if score aria_pp:crash_setting aria_pp.options matches 1 run event entity @s aria:crash_sub_1", "/execute if score aria_pp:crash_setting aria_pp.options matches 2 run event entity @s aria:crash_sub_3" ], "transitions": [ { "final_crash": "q.property('aria:crash_lives') == 0" }, { "not_moving": "q.is_on_ground && q.property('aria:crash_lives') > 0" } ] }, "final_crash2": { "on_entry": [ "/particle aria_pp:explosion ~ ~ ~", "/camerashake add @a[r=100] 0.15 0.5", "@s aria:add_transform_crash" ] }
ground_mode und jump_to_g_ready - ein einziger Eintrittspunkt für das gesamte System.pending_unload_token als UUID löst das elegant: nur der aktuelle Job-Inhaber darf spawnen. Ältere Timeouts lesen den falschen Token - kein doppeltes Fahrzeug, kein silenter Fehler.