Item Manipulation Triggers
Z Moriawiki
Verze z 00:36, 25. 10. 2007 Tartaros (Diskuse | příspěvky) (uprava) ← Předchozí porovnání |
Verze z 02:35, 28. 10. 2007 Tartaros (Diskuse | příspěvky) (zobrazeni warningu) Následující porovnání → |
||
Řádka 23: | Řádka 23: | ||
|- | |- | ||
| @Dupe || DupeArgs( <br/> Thing model, <br/> Thing copy ) || Volán při duplikaci itemu (i charu) na vzoru (copy) i předloze (model)... Je volan po zavolani odpovidajicich @Enter triggeru. | | @Dupe || DupeArgs( <br/> Thing model, <br/> Thing copy ) || Volán při duplikaci itemu (i charu) na vzoru (copy) i předloze (model)... Je volan po zavolani odpovidajicich @Enter triggeru. | ||
- | Pokud je item implementací tohoto triggeru přesunut jinam, bude po skončeni opět vrácen (protože použití Dupe() musí garantovat očekávaný výsledek) | + | Pokud je item implementací tohoto triggeru přesunut jinam, bude po skončeni opět vrácen a bude zobrazen Warning (protože použití Dupe() musí garantovat očekávaný výsledek) |
|- | |- | ||
| @(Item)Enter(Item) || ItemInItemArgs( <br/> Item manipulatedItem, <br/> Container cont ) || Volán po vložení itemu do kontejneru. V názvu je "Item", nikoli "Cont" nebo "Container", aby to nebylo zavádějící (protože Cont můze být i Character...) | | @(Item)Enter(Item) || ItemInItemArgs( <br/> Item manipulatedItem, <br/> Container cont ) || Volán po vložení itemu do kontejneru. V názvu je "Item", nikoli "Cont" nebo "Container", aby to nebylo zavádějící (protože Cont můze být i Character...) | ||
- | Pokud je item implementací tohoto triggeru přesunut jinam, bude po skončeni opět vrácen (protože použití Cont= musí garantovat očekávaný výsledek) | + | Pokud je item implementací tohoto triggeru přesunut jinam, bude po skončeni opět vrácen a bude zobrazen Warning (protože použití Cont= musí garantovat očekávaný výsledek) |
|- | |- | ||
| @(Item)Enter(Char) || ItemInCharArgs( <br/> Item manipulatedItem, <br/> Character cont, <br/> byte layer ) || Volán po equipnutí. | | @(Item)Enter(Char) || ItemInCharArgs( <br/> Item manipulatedItem, <br/> Character cont, <br/> byte layer ) || Volán po equipnutí. | ||
- | Pokud je item implementací tohoto triggeru přesunut jinam, bude po skončeni opět vrácen (protože použití Cont= musí garantovat očekaváný výsledek) | + | Pokud je item implementací tohoto triggeru přesunut jinam, bude po skončeni opět vrácen a bude zobrazen Warning (protože použití Cont= musí garantovat očekaváný výsledek) |
|- | |- | ||
| @(Item)Enter(Region) || ItemOnGroundArgs( <br/> Item manipulatedItem, <br/> Region region, <br/> Point4D point ) || Volán po položení na zem. | | @(Item)Enter(Region) || ItemOnGroundArgs( <br/> Item manipulatedItem, <br/> Region region, <br/> Point4D point ) || Volán po položení na zem. | ||
- | Pokud je item implementací tohoto triggeru přesunut jinam, bude po skončeni opět vrácen (protože použití P(...) musí garantovat očekaváný výsledek) | + | Pokud je item implementací tohoto triggeru přesunut jinam, bude po skončeni opět vrácen a bude zobrazen Warning (protože použití P(...) musí garantovat očekaváný výsledek) |
|- | |- | ||
| @(Item)Leave(Item) || ItemInItemArgs( <br/> Item manipulatedItem, <br/> Container cont ) || Volán těsně před opuštěním kontejneru (tedy platí, že cont == manipulatedItem.Cont). | | @(Item)Leave(Item) || ItemInItemArgs( <br/> Item manipulatedItem, <br/> Container cont ) || Volán těsně před opuštěním kontejneru (tedy platí, že cont == manipulatedItem.Cont). | ||
- | Pokud je item implementací tohoto triggeru přesunut jinam, je tato sekvence volání triggeru přerušena a spuštěna znovu. Nicméně přesunu tím zabráněno nebude. | + | Pokud je item implementací tohoto triggeru přesunut jinam, je tato sekvence volání triggeru přerušena a spuštěna znovu a bude zobrazen Warning. Nicméně přesunu tím zabráněno nebude. |
|- | |- | ||
| @(Item)Leave(Char) || ItemInCharArgs( <br/> Item manipulatedItem, <br/> Character cont, <br/> byte layer ) || Volán těsně před unequipnutím. Pozor - za unequipnutí (a znovuequipnutí) se považuje i "jen" změna layeru. | | @(Item)Leave(Char) || ItemInCharArgs( <br/> Item manipulatedItem, <br/> Character cont, <br/> byte layer ) || Volán těsně před unequipnutím. Pozor - za unequipnutí (a znovuequipnutí) se považuje i "jen" změna layeru. | ||
- | Pokud je item implementací tohoto triggeru přesunut jinam, bude po skončení opět vrácen (protože použití Cont= musí garantovat očekávaný výsledek) | + | Pokud je item implementací tohoto triggeru přesunut jinam, bude po skončení opět vrácen a bude zobrazen Warning (protože použití Cont= musí garantovat očekávaný výsledek) |
|- | |- | ||
| @(Item)Leave(Region) || ItemOnGroundArgs( <br/> Item manipulatedItem, <br/> Region region, <br/> Point4D point ) || Volán před opuštěním pozice na mapě. Pozor - za opuštění se považuje i přesunutí ze země na zem. | | @(Item)Leave(Region) || ItemOnGroundArgs( <br/> Item manipulatedItem, <br/> Region region, <br/> Point4D point ) || Volán před opuštěním pozice na mapě. Pozor - za opuštění se považuje i přesunutí ze země na zem. | ||
- | Pokud je item implementací tohoto triggeru přesunut jinam, bude po skončení opět vrácen (protože použití Cont= musí garantovat očekávaný výsledek) | + | Pokud je item implementací tohoto triggeru přesunut jinam, bude po skončení opět vrácen a bude zobrazen Warning (protože použití Cont= musí garantovat očekávaný výsledek) |
|- | |- | ||
| ! @(Item)StackOn(Item) || ItemStackArgs( <br/> Item manipulatedItem, <br/> Item waitingStack ) || Volán těsně před stacknutím dvou itemů na obou z nich. V okamžiku volání byl manipulatedItem právě položen na stejné místo jako waitingStack (ať už v kontejneru nebo na zemi), a čeká se na to, jestli tento trigger povolí jejich stacknutí. V případě že ano, bude manipulatedItem smazán a amount waitingstacku zvětšen. Jádro se pokouší o stacknutí pouze v případě, že oba itemy mají stejný ItemDef, Model, Color a jsou Stackable. | | ! @(Item)StackOn(Item) || ItemStackArgs( <br/> Item manipulatedItem, <br/> Item waitingStack ) || Volán těsně před stacknutím dvou itemů na obou z nich. V okamžiku volání byl manipulatedItem právě položen na stejné místo jako waitingStack (ať už v kontejneru nebo na zemi), a čeká se na to, jestli tento trigger povolí jejich stacknutí. V případě že ano, bude manipulatedItem smazán a amount waitingstacku zvětšen. Jádro se pokouší o stacknutí pouze v případě, že oba itemy mají stejný ItemDef, Model, Color a jsou Stackable. | ||
- | Pokud je item implementací tohoto triggeru přesunut jinam, bude po skončení opět vrácen, případně rovnou smazán (protože použití Cont= musí garantovat očekávaný výsledek) | + | Pokud je item implementací tohoto triggeru přesunut jinam, bude po skončení opět vrácen, případně rovnou smazán a bude zobrazen Warning (protože použití Cont= musí garantovat očekávaný výsledek) |
|- | |- | ||
|} | |} |
Verze z 02:35, 28. 10. 2007
Item Manipulation Triggers jsou triggery, které se spouští při manipulaci s itemy. Aktuální (a brzy minulý) stav těchto triggerů je založen na zpětné kompatibilitě se sphereserverem. Když jsem je dělal, tak mi na kompatibilitě záleželo víc než teď :) To mě ale mezitím přešlo, takže přišel čas udělat to po svém, kompletně a lépe.
Ve sphere jsou to všelijaké ty @equip, @pickup a @dropon triggery. Nic proti nim, ale jsou lehce nekonzistentní - například @pickup se volá, jen když je item zvednut přímo klientem, zatimco @equip se spouští i při equipnutí itemu ze skriptu... Špatně se tedy rozlišuje, jestli je akce přímo provedena klientem, nebo až "druhotně" nějakým skriptem. Proto jsem se rozhodl udělat dvě množiny triggerů - jedny volané při (resp. těsně před) každém pokusu klienta něco zvednout/položit/stacknout (a ty budou vesměs Cancellable a budou mít jasně daného původce, tj. hráče) a druhou, která se bude volat při každé změně lokace/stavu itemu (a ty vesměs Cancellable nebudou, nýbrž budou spis "oznamovací" s tím, že původce může být nejasný). Tyto dvě skupiny se pochopitelně budou částečně překrývat, resp. doplňovat, a to znamená spustu volání triggerů při každé manipulaci s itemem... ale dokud se neukáže opak, tak si myslím, že si to můzeme dovolit.
Pořadí parametrů zde popsané budiž závazné, tj. platí i pro LScript. V některých případech mohou být parametry "obalené" do potomka ScriptArgs, pak budou parametry vypsány jako NazevTridyPotomkaScriptArgs(A param1, B param2, C param3, ...) a znamená to, že v C# lze trigger v Triggergroupe/pluginu deklarovat buď s dvěma parametry - z toho druhý bude NazevTridyPotomkaScriptArgs - nebo s vypsáním jednotlivých A param1, B param2, C param3, ...
Vykřičníkem označené triggery jsou Cancellable (tedy return 1/true z nich způsobí zastavení akce/sekvence triggeru).
Obsah |
Lowlevel triggery
Tyto triggery budiž volány při každé změně vlastnosti Cont nebo P. Při každém volání triggeru platí, že musí být dodržovány všechny běžné invarianty, tj. nikdy není item někde "ve vzduchu", ale je přesně definováno, jestli oznamovaná akce (změna stavu) už proběhla nebo právě proběhne.
Fakt, že tyto triggery jsou "oznamovací", podtrhuje i to, že pokud je trigger někam přemístí, budou opět vráceny na sve místo (už vidím ten opruz tohle programovat, co jsem si to na sebe vymyslel :)
Ohledne nazvu tech triggeru plati ze se na samotnem manipulovanem itemu vola trigger s tou casti nazvu ve druhe zavorce (napr. @EnterItem), a na cilovem objektu se vola ten s casti nazvu v prvni zavorce (@ItemEnter). Parametry jsou nicmene stejne.
Název triggeru | Parametry | Stav při volání a popis |
---|---|---|
@Create | Volán po vytvoření (ne při loadu!), těsně po umístění do světa. Tento trigger sem až tak úplně nezapadá, píšu ho sem spíše pro úplnost... Potom je zavolán i trigger oznamující toto umístění. | |
@Dupe | DupeArgs( Thing model, Thing copy ) | Volán při duplikaci itemu (i charu) na vzoru (copy) i předloze (model)... Je volan po zavolani odpovidajicich @Enter triggeru.
Pokud je item implementací tohoto triggeru přesunut jinam, bude po skončeni opět vrácen a bude zobrazen Warning (protože použití Dupe() musí garantovat očekávaný výsledek) |
@(Item)Enter(Item) | ItemInItemArgs( Item manipulatedItem, Container cont ) | Volán po vložení itemu do kontejneru. V názvu je "Item", nikoli "Cont" nebo "Container", aby to nebylo zavádějící (protože Cont můze být i Character...)
Pokud je item implementací tohoto triggeru přesunut jinam, bude po skončeni opět vrácen a bude zobrazen Warning (protože použití Cont= musí garantovat očekávaný výsledek) |
@(Item)Enter(Char) | ItemInCharArgs( Item manipulatedItem, Character cont, byte layer ) | Volán po equipnutí.
Pokud je item implementací tohoto triggeru přesunut jinam, bude po skončeni opět vrácen a bude zobrazen Warning (protože použití Cont= musí garantovat očekaváný výsledek) |
@(Item)Enter(Region) | ItemOnGroundArgs( Item manipulatedItem, Region region, Point4D point ) | Volán po položení na zem.
Pokud je item implementací tohoto triggeru přesunut jinam, bude po skončeni opět vrácen a bude zobrazen Warning (protože použití P(...) musí garantovat očekaváný výsledek) |
@(Item)Leave(Item) | ItemInItemArgs( Item manipulatedItem, Container cont ) | Volán těsně před opuštěním kontejneru (tedy platí, že cont == manipulatedItem.Cont).
Pokud je item implementací tohoto triggeru přesunut jinam, je tato sekvence volání triggeru přerušena a spuštěna znovu a bude zobrazen Warning. Nicméně přesunu tím zabráněno nebude. |
@(Item)Leave(Char) | ItemInCharArgs( Item manipulatedItem, Character cont, byte layer ) | Volán těsně před unequipnutím. Pozor - za unequipnutí (a znovuequipnutí) se považuje i "jen" změna layeru.
Pokud je item implementací tohoto triggeru přesunut jinam, bude po skončení opět vrácen a bude zobrazen Warning (protože použití Cont= musí garantovat očekávaný výsledek) |
@(Item)Leave(Region) | ItemOnGroundArgs( Item manipulatedItem, Region region, Point4D point ) | Volán před opuštěním pozice na mapě. Pozor - za opuštění se považuje i přesunutí ze země na zem.
Pokud je item implementací tohoto triggeru přesunut jinam, bude po skončení opět vrácen a bude zobrazen Warning (protože použití Cont= musí garantovat očekávaný výsledek) |
! @(Item)StackOn(Item) | ItemStackArgs( Item manipulatedItem, Item waitingStack ) | Volán těsně před stacknutím dvou itemů na obou z nich. V okamžiku volání byl manipulatedItem právě položen na stejné místo jako waitingStack (ať už v kontejneru nebo na zemi), a čeká se na to, jestli tento trigger povolí jejich stacknutí. V případě že ano, bude manipulatedItem smazán a amount waitingstacku zvětšen. Jádro se pokouší o stacknutí pouze v případě, že oba itemy mají stejný ItemDef, Model, Color a jsou Stackable.
Pokud je item implementací tohoto triggeru přesunut jinam, bude po skončení opět vrácen, případně rovnou smazán a bude zobrazen Warning (protože použití Cont= musí garantovat očekávaný výsledek) |
Highlevel triggery
Pokud projde @Pickup, je výsledkem equipnuti itemu do dragging layeru.
Pokud projde @Dropon, je výsledkem unequipnutí itemu z dragging layeru.
Každý tento trigger má svoji odpovídající @Item_* verzi triggeru volanou na charu.
To be continued...
Název triggeru | Parametry | Stav při volání a popis |
---|---|---|
! @(Item)Pickup | Character pickingChar, ushort amount | |
! @(Item)DropOnGround | Character droppingChar, Point4D point | |
! @(Item)DropOnItem | Character droppingChar, Item target | |
! @(Item)DropOnChar | Character droppingChar, Character cont, byte layer |
Character manipulation
Sice to sem jakoby nezapada ale tak nejak vyplynulo pri tech upravach u Itemu ze je zahodno udelat jiste upravy i u charu. Character nema zadnej cont, je vzdy na nejakych souradnicich na mape, takze o to je to jednodussi.
Lowlevel triggery
Dupe ChangeLocation (Char)Enter(Region) (Char)Leave(Region)
Highlevel triggery
Step(In/Out) TeleportStep?