Item Manipulation Triggers
Z Moriawiki
Verze z 16:07, 23. 10. 2007 Lu Tze (Diskuse | příspěvky) (doplnění diakritiky (což to psát rovnou s ní?) a stylistická úprava) ← Předchozí porovnání |
Verze z 20:57, 23. 10. 2007 Tartaros (Diskuse | příspěvky) (zmena) Následující porovnání → |
||
Řádka 12: | Řádka 12: | ||
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 :) | 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 delsi (@ItemEnter). Parametry jsou nicmene stejne. | ||
{| border="1" cellpadding="5" | {| border="1" cellpadding="5" | ||
Řádka 20: | Řádka 22: | ||
| @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í. | | @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 || Item copy,<br/>Item model,<br/>bool iAmCopy || Volán při duplikaci itemu na vzoru i předloze, pouze s rozdílným parametrem iAmCopy. iAmCopy = true pokud copy == this. Na duplikátu je volán těsně po @Create, tedy po té, co je umístěn na stejné místo jako vzor. Potom je zavolán i trigger oznamující toto umístění. | + | | @Dupe || DupeArgs( <br/> Item copy, <br/> Item model ) || Volán při duplikaci itemu na vzoru (copy) i předloze (model)... Na duplikátu je volán těsně po @Create, tedy po té, co je umístěn na stejné místo jako vzor. Potom je zavolán i trigger oznamující toto umístění. |
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 (protože použití Dupe() musí garantovat očekávaný výsledek) | ||
|- | |- | ||
- | | @EnterItem || Container cont || Volán po vložení do cont. 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 (protože použití Cont= musí garantovat očekávaný výsledek) | ||
|- | |- | ||
- | | @EnterChar || Character cont,<br/>byte layer || Volán po equipnutí na cont. | + | | @(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 (protože použití Cont= musí garantovat očekaváný výsledek) | ||
|- | |- | ||
- | | @EnterGround || Point4D point || Volán po položení na zem. "EnterGround" sice nezní nejpřirozeněji, ale zdá se mi to lepší než "LandOnGround" a podobně, a je to alespoň konzistentní. | + | | @(Item)Enter(Region) || ItemOnGroundArgs( <br/> Item manipulatedItem, <br/> Region targetRegion, <br/> Point4D targetPoint ) || 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 (protože použití P(...) musí garantovat očekaváný výsledek) | ||
|- | |- | ||
- | | @LeaveItem || Container cont || Volán těsně před opuštěním kontejneru (tedy platí, že cont == this.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. Nicméně přesunu tím zabráněno nebude. | ||
|- | |- | ||
- | | @LeaveChar || 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. | + | | @(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 (protože použití Cont= musí garantovat očekávaný výsledek) | ||
|- | |- | ||
- | | @LeaveGround || 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 targetRegion, <br/> Point4D targetPoint ) || 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) | ||
|- | |- | ||
- | | ! @Stack || Item addedStack,<br/>Item waitingStack,<br/>bool toBeDeleted || Volán těsně před stacknutím dvou itemů na obou z nich, pouze s rozdílnou hodnotou toBeDeleted. V okamžiku volání byl addedStack 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 addedStack smazán a amount waitingstacku zvětšen. Jádro se pokouší o stacknutí pouze v případě, že oba itemy mají stejný ItemDef 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 (protože použití Cont= musí garantovat očekávaný výsledek) | ||
|- | |- | ||
Řádka 46: | Řádka 49: | ||
===Klientské triggery=== | ===Klientské triggery=== | ||
- | Pokud projde ''@Pickup,'' je výsledkem equipnuti itemu do ''dragging layeru.''<br/> | + | Pokud projde ''@Pickup,'' je výsledkem equipnuti itemu do ''dragging layeru.'' <br/> |
Pokud projde ''@Dropon,'' je výsledkem unequipnutí itemu z ''dragging layeru.'' | Pokud projde ''@Dropon,'' je výsledkem unequipnutí itemu z ''dragging layeru.'' | ||
Řádka 58: | Řádka 61: | ||
! Stav při volání a popis | ! Stav při volání a popis | ||
|- | |- | ||
- | | ! @Pickup || Character pickingChar,<br/>ushort amount || | + | | ! @(Item)Pickup || Character pickingChar, <br/> ushort amount || |
|- | |- | ||
- | | ! @DropOnGround || Character droppingChar,<br/>Point4D point || | + | | ! @(Item)DropOnGround || Character droppingChar, <br/> Point4D point || |
|- | |- | ||
- | | ! @DropOnItem || Character droppingChar,<br/>Item target || | + | | ! @(Item)DropOnItem || Character droppingChar, <br/> Item target || |
|- | |- | ||
- | | ! @DropOnChar || Character droppingChar,<br/>Character cont,<br/>byte layer || | + | | ! @(Item)DropOnChar || Character droppingChar, <br/> Character cont, <br/> byte layer || |
|- | |- | ||
|} | |} |
Verze z 20:57, 23. 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).
Systémové 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 delsi (@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( Item copy, Item model ) | Volán při duplikaci itemu na vzoru (copy) i předloze (model)... Na duplikátu je volán těsně po @Create, tedy po té, co je umístěn na stejné místo jako vzor. Potom je zavolán i trigger oznamující toto umístění.
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) |
@(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 (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 (protože použití Cont= musí garantovat očekaváný výsledek) |
@(Item)Enter(Region) | ItemOnGroundArgs( Item manipulatedItem, Region targetRegion, Point4D targetPoint ) | 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) |
@(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. 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 (protože použití Cont= musí garantovat očekávaný výsledek) |
@(Item)Leave(Region) | ItemOnGroundArgs( Item manipulatedItem, Region targetRegion, Point4D targetPoint ) | 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) |
! @(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 (protože použití Cont= musí garantovat očekávaný výsledek) |
Klientské 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 |