Item Manipulation Triggers
Z Moriawiki
Verze z 12:31, 23. 10. 2007 Tartaros (Diskuse | příspěvky) (→Systemove triggery - chybejici kus, fuj nemam rad psani neceho znova) ← Předchozí porovnání |
Verze z 12:35, 23. 10. 2007 Tartaros (Diskuse | příspěvky) (→Klientske triggery - zmena) Následující porovnání → |
||
Řádka 48: | Řádka 48: | ||
===Klientske triggery=== | ===Klientske triggery=== | ||
- | Pokud projde @Pickup*, je vysledkem equipnuti itemu do dragging layeru | + | Pokud projde @Pickup, je vysledkem equipnuti itemu do dragging layeru |
- | Pokud projde @Dropon*, je vysledkem unequipnuti itemu z dragging layeru | + | Pokud projde @Dropon, je vysledkem unequipnuti itemu z dragging layeru |
Kazdy tento trigger ma svoji odpovidajici @Item_* verzi triggeru volanou na charu. | Kazdy tento trigger ma svoji odpovidajici @Item_* verzi triggeru volanou na charu. | ||
Řádka 62: | Řádka 62: | ||
! Stav pri volani, Popis | ! Stav pri volani, Popis | ||
|- | |- | ||
- | | ! @PickupFromGround || Character pickingChar, Point4D point || | + | | ! @Pickup || Character pickingChar, ushort amount || |
- | |- | + | |
- | | ! @PickupFromItem || Character pickingChar, Container cont || | + | |
- | |- | + | |
- | | ! @PickupFromChar || Character pickingChar, Character cont, byte layer || | + | |
|- | |- | ||
| ! @DropOnGround || Character droppingChar, Point4D point || | | ! @DropOnGround || Character droppingChar, Point4D point || | ||
|- | |- | ||
- | | ! @DropOnItem || Character droppingChar, Container cont || | + | | ! @DropOnItem || Character droppingChar, Item target || |
|- | |- | ||
| ! @DropOnChar || Character droppingChar, Character cont, byte layer || | | ! @DropOnChar || Character droppingChar, Character cont, byte layer || | ||
|- | |- | ||
|} | |} |
Verze z 12:35, 23. 10. 2007
Item Manipulation Triggers = triggery ktery se prekvapive poustej pri manipulaci s itemama. Aktualni (a brzo minuly) stav techto triggeru je zalozen na zpetne kompatibilite se sphereserverem. Kdyz sem to delal tak mi na ty kompatibilite zalezelo jaksi vic nez ted :) To mne ale mezitim preslo, takze je cas to udelat po svem a kompletne a lepe.
Ve sphere jsou toto vselijake ty @equip a @pickup a @dropon triggery. Nic proti nim ale jsou lehce nekonzistentni - napriklad @pickup se vola jen kdyz je item zvednut primo klientem, zatimco @equip se vola i pri equipnuti itemu ze skriptu... Tedy spatne se rozlisuje jestli je akce primo provadena klientem nebo az "druhotne" nejakym skriptem. Proto jsem se rozhodl udelat ve mnoziny triggeru - jedny volane pri (resp. tesne pred) kazdym pokusu klienta neco zvednout/polozit/stacknout (a ty budou vesmes Cancellable, a budou mit jasne danyho puvodce, tj. toho hrace), a druhou ktera se bude volat pri kazdy zmene lokace/stavu itemu (a ty vesmes cancellable nebudou, nybrz budou spis "oznamovaci", s tim ze puvodce muze byt nejasny). Tyto dve skupiny se pochopitelne budou castecne prekryvat, resp. doplnovat, a faktem je ze to znamena spustu volani triggeru pri kazdy manipulaci s itemem... Ale dokud se neukaze opak tak si myslim ze si to muzeme dovolit :)
Poradi parametru zde popsane budiz zavazne, tj. plati i pro LScript. V nekterych pripadech muzou byt parametry "obalene" do potomka ScriptArgs, pak budou parametry vypsany jako NazevTridyPotomkaScriptArgs(A param1, B param2, C param3, ...) a znamena to ze v C# lze trigger v Triggergroupe/pluginu deklarovat bud s 2 parametry - z toho druhy bude NazevTridyPotomkaScriptArgs, nebo s vypsanim jednotlivych A param1, B param2, C param3, ...
Vykricnikem oznacene triggery jsou Cancellable (tedy return 1/true z nich zpusobi zastaveni akce/sekvence triggeru)
Systemove triggery
Tyto triggery budiz volany pri kazde zmene vlastnosti Cont nebo P. Pri kazdem volani triggeru plati ze musi byt dodrzovany vsechny bezne invarianty, tj. nikdy neni item nekde "ve vzduchu", ale je presne definovano jestli oznamovana akce (zmena stavu) uz probehla nebo prave probehne.
Fakt ze tyto triggery jsou "oznamovaci" podtrhuje i to ze pokud je trigger nekam premisti, budou opet vraceny na sve misto (uz vidim ten vopruz tohle programovat, co sem si to na sebe vymyslel :) )
Nazev triggeru | Parametry | Stav pri volani, Popis |
---|---|---|
@Create | Volan po vytvoreni (ne pri loadu!), tesne po umisteni do sveta. Tento trigger sem az tak uplne nezapada, pisu ho sem spise pro uplnost... Potom je zavolan i trigger oznamujici toto umisteni. | |
@Dupe | Item copy, Item model, bool iAmCopy | Volan pri duplikaci itemu na vzoru i predloze, pouze s rozdilnym parametrem iAmCopy. iAmCopy = true pokud copy == this. Na duplikatu je volan tesne po @Create, tedy po te co je umisten na stejne misto jako vzor. Potom je zavolan i trigger oznamujici toto umisteni.
Pokud je item implementaci tohoto triggeru presunut jinam, bude po skonceni opet vracen (protoze pouziti Dupe() musi garantovat ocekavany vysledek) |
@EnterItem | Container cont | Volan po vlozeni do cont. V nazvu je "Item", nikoliv "Cont" nebo "Container" aby to nebylo zavadejici (protoze Cont muze bejt i Character...)
Pokud je item implementaci tohoto triggeru presunut jinam, bude po skonceni opet vracen (protoze pouziti Cont= musi garantovat ocekavany vysledek) |
@EnterChar | Character cont, byte layer | Volan po equipnuti na cont.
Pokud je item implementaci tohoto triggeru presunut jinam, bude po skonceni opet vracen (protoze pouziti Cont= musi garantovat ocekavany vysledek) |
@EnterGround | Point4D point | Volan po polozeni na zem. "Enter ground" sice nezni nejprirozeneji ale zda se mi to lepsi nez "LandOnGround" a podobne, a je to aspon konzistentni.
Pokud je item implementaci tohoto triggeru presunut jinam, bude po skonceni opet vracen (protoze pouziti P(...) musi garantovat ocekavany vysledek) |
@LeaveItem | Container cont | Volan tesne pred opustenim kontejneru (tedy plati ze cont == this.Cont).
Pokud je item implementaci tohoto triggeru presunut jinam, je tato sekvence volani triggeru prerusena a bude zacata znova. Nicmene presunu tim nebude zabraneno. |
@LeaveChar | Character cont, byte layer | Volan tesne pred unequipnuti. Pozor - za unequipnuti(a znovuequipnuti) se povazuje i "jen" zmena layeru.
Pokud je item implementaci tohoto triggeru presunut jinam, bude po skonceni opet vracen (protoze pouziti Cont= musi garantovat ocekavany vysledek) |
@LeaveGround | Point4D point | Volan pred opustenim pozice na mape. Pozor - za opusteni se povazuje i presunuti ze zeme na zem. |
! @Stack | Item addedStack, Item waitingStack, bool toBeDeleted | Volan tesne pred stacknutim dvou itemu, na obou z nich, pouze s rozdilnou hodnotou toBeDeleted. V okamziku volani byl addedStack prave polozen na stejne misto jako waitingStack (at uz v kontejneru nebo na zemi), a ceka se na to jestli tento trigger povoli jejich stacknuti. V pripade ze ano, bude addedStack smazan a amount waitingstacku zvetsen. Jadro se pokousi o stacknuti pouze v pripade ze oba itemy maji stejny ItemDef a jsou Stackable.
Pokud je item implementaci tohoto triggeru presunut jinam, bude po skonceni opet vracen, pripadne rovnou smazan (protoze pouziti Cont= musi garantovat ocekavany vysledek) |
Klientske triggery
Pokud projde @Pickup, je vysledkem equipnuti itemu do dragging layeru
Pokud projde @Dropon, je vysledkem unequipnuti itemu z dragging layeru
Kazdy tento trigger ma svoji odpovidajici @Item_* verzi triggeru volanou na charu.
To be continued...
Nazev triggeru | Parametry | Stav pri volani, Popis |
---|---|---|
! @Pickup | Character pickingChar, ushort amount | |
! @DropOnGround | Character droppingChar, Point4D point | |
! @DropOnItem | Character droppingChar, Item target | |
! @DropOnChar | Character droppingChar, Character cont, byte layer |