Pomocné skripty · Penetrace těles

Stavy a události

Odlište průběžný stav od jednorázové události a reagujte až na skutečný vstup.

jolt_penetration_events() vrací struct {schema, dropped_total, events}, případně undefined. Čtení frontu vyprázdní. Jeden centrální consumer ji přečte po jolt_update a rozdělí výsledky audio, damage a dalším systémům; další consumer by dostal prázdné pole.

Veřejné stavy#

JoltPenetrationStateHodnotaVýznam
Idle0Bez aktivního spojení a bez aktuální blokující situace.
Candidate1Tip čeká na vhodné podmínky u povrchu.
Penetrating2Skutečný vstup již nastal; relationship je v aktivním režimu penetrace.
Embedded3Odvozený stav po dostatečně klidném pobytu uvnitř materiálu, nikoli další pevný weld.
Extracting4Pohyb ven nebo fáze uvolňování.
AtLimit5Dosažení oblasti efektivního max_depth.
Blocked6Agregovaný stav Tipu při odmítnutí; čtěte reject_reason.
Ended7Ukončené relationship v koncovém event snapshotu.
Captured8Vytvořené relationship před actual entry; has_entered=false.

Události#

JoltPenetrationEventHodnotaKdy vzniká
Start1První skutečný entry tohoto relationship; snapshot má has_entered=true.
Embedded2Přechod do odvozeného embedded stavu.
ExtractionStart3Přechod do vytahování. Může nastat znovu po opětovném zasunutí v témže relationship.
Extracted4Úplné vytažení relationship, které mělo actual entry.
AtLimit5Přechod k hloubkovému limitu.
End6Ukončení z libovolného důvodu; při normálním vytažení následuje po Extracted.

Koncové důvody#

JoltPenetrationEndReasonHodnotaVýznam
Extracted1Úplné vytažení.
PenetratorDestroyed2Zničen penetrator body.
TargetDestroyed3Zničen target body.
TipRemoved4Explicitně odstraněn Tip.
WorldStopped5Ukončení světa; fronta se při teardown také čistí.
CaptureCancelled6Capture skončil před actual entry; nečekejte Start ani Extracted.

Formát a zpracování#

Každá událost má sequence, type, end_reason a snapshot. sequence roste; end_reason je 0 u událostí bez koncového důvodu. Snapshot je samostatná kopie nativních dat relationship včetně handles, hloubky a geometrií; na rozdíl od rel.get_snapshot() neobsahuje GML target wrapper. Identifikujte target přes snapshot.target_handle a vlastní registry.

Před tímto Step kódem inicializujte last_dropped=0 v Create. Události neupravujte jako způsob řízení simulace.

GML
var batch = jolt_penetration_events();
if (is_struct(batch)) {
    if (batch.dropped_total > last_dropped) {
        show_debug_message("Penetration event loss detected");
    }
    last_dropped = batch.dropped_total;
    for (var i = 0; i < array_length(batch.events); ++i) {
        var event = batch.events[i];
        var snapshot = event.snapshot;
        switch (event.type) {
            case JoltPenetrationEvent.Start:
                show_debug_message("Entered " + string(snapshot.target_handle));
                break;
            case JoltPenetrationEvent.Extracted:
                show_debug_message("Extracted " + string(snapshot.handle));
                break;
            case JoltPenetrationEvent.End:
                show_debug_message("Ended: " + string(event.end_reason));
                break;
        }
    }
}

Ověřené kontrakty operací#

Následující kontrakty rozlišují jednotky, návratové hodnoty, chyby a životnost podle aktuální implementace. Nevynechávej kontrolu výsledku: false, 0 a undefined mohou mít u různých metod odlišný význam.

Symbol / vlastníkSignaturaKontrakt operace
jolt_penetration_eventsjolt_penetration_events()Aktuální schema:1 snapshot events/metrik managed světa, undefined při neplatném světě/transportu; není příkaz změny fyziky.