ACID
Od revize 220, ScriptDev2 implementoval DB-based skriptovací systém, který dovoluje použití databázi (MySQL) pro vytvoření vlastních události. Systém se jmenuje ACID (Artificial Creature Intelligence Database), dříve známý pod názvem EventAI. .
A základní 2 věty eventAI zní: „Co dělat? Kdy to dělat?“. První věta (Co) se bude nazývat akci. Druhá věta (Kdy) se bude nazývat událost. Kdokoliv, kdo chce vytvořit eventAI skript potřebuje jen odpovědět na dvě otázky nahoře. Nějaké události se budou vyskytovat jen jednou, zatímco jiné mohou být časované tak, aby se spouštěla ve specifikovaném intervalu, který si určíme. Základní představa skriptu byla vysvětlena, popojdeme tedy dále. Událost může užívat tři různé parametry a tyto parametry ovládají různé věci v závislosti na události. Pokud parametr není výslovně pojmenovaný pro událost, nebude užívaný pro tu událost.
V databázi ScriptDev2 najděte tabulku `eventai_scripts` a `localized_texts`. Pouze v těchto dvou tabulkách se tyto události tvoří. Tabulka `eventai_scripts` slouží k deklarování události a tabulka `localized_texts` slouží k uložení vlastních Textů (Text ID). Zaměříme se nyní na tabulku `eventai_scripts`. Její první sloupec `id` je primary key, který nás vůbec nezajímá. Druhý sloupec `creature_id`. Jak už z názvu vychází, zde se bude zapisovat creature ID. Asi se ptáte „A jak to ovlivní tu creaturu?“. Tato creatura bude hlavním děním naší události. Další sloupec `event_type` je sloupec, do kterého zapisujeme typ události (Druhá věta).
Jednotlivé typy událostí (event_type) | |||||
---|---|---|---|---|---|
ID | Jméno | Parametr 1 | Parametr 2 | Parametr 3 | Popis |
0 | EVENT_T_TIMER_REPEAT | Čas | N | N | Událost se opakuje, když je creatura v boji. |
1 | EVENT_T_TIMER_SINGLE | Čas | N | N | Vyčká Čas po začátku boji, pak spustí událost. |
2 | EVENT_T_TIMER_OOC_REPEAT | Čas | N | N | Událost se opakuje, je-li creatura mimo boji. |
3 | EVENT_T_TIMER_OOC_SINGLE | Čas | N | N | Vyčká Čas po konci boje, pak spustí událost. |
4 | EVENT_T_HP | HP % | Čas * | N | Událost se spustí, jakmile HP creatury dosáhne HP (v procentech). Pokud Čas není nula opakuje se. |
5 | EVENT_T_MANA | MANA % | Čas * | N | Totéž, co u HP s výjímkou, že je místo HP mana. |
6 | EVENT_T_AGGRO | N | N | N | Událost se spustí, při nabrání aggra. |
7 | EVENT_T_KILL | Čas * | N | N | Událost se spustí, při zabití hráče, pokud není Čas = 0 vyčká a poté se spustí. |
8 | EVENT_T_DEATH | N | N | N | Událost se spustí, při zabití creatury. |
9 | EVENT_T_EVADE | N | N | N | Událost se spustí, při resetování creaturových AIček |
10 | EVENT_T_SPELLHIT | Spell ID * | Čas * | N | Událost se spustí, při úderu kouzla. Pokud je Spell ID = 0, událost se spustí, při úderu jakýmkoli kouzlem. Pokud není Čas = 0, po úderu kouzlem vyčká Čas a poté se spustí.a |
Další sloupec `event_param1` je typu parametru. To znamená, že do tohoto sloupce zapisujeme data, které vstupují
do události a ovlivňují ji. Mají své vlastní typy (Čas v ms, Procenta, Flags). Jak jste si mohli všimnout v tabulce jsou
popsány jednotlivé paramatery 1 2 3 k určitým událostním typům. Uvedeme si malinký příklad, ať nejste tak zmatení.
Zapíši do `creature_id` ID 123. Do `event_type` zapíši 4, což je EVENT_T_HP - znamená, že tato událost se spustí při dosažení určitého % HP. Určitého % HP je myšleno co? Hádejte :) ... Je to parametr 1 (z tabulky můžete vyčíst) no a kde najdu tuto hodnotu? V tabulce, konkrétně ve sloupci `event_param1`. Jednoduché, že? Nu, přejdeme dále. Další sloupec je `event_param2` má stejné vlastnosti jako parametr 1 (`event_param1`) akorát nemusí být vždy použit (parametr 1 také nemusí být vždy použit). Uvedeme si příklad. Představte si, že Vám maminka peče koláč a teďkom vytáhne tři koláčové formy, ale dělá jenom jeden koláč. Jenže, co kdyby přišla návštěva? Musela by uvařit tři koláče a použít tři koláčové formy. Tak stejně je to i s parametry. Např. při časovači Vám stačí čas (interval), za který se určitá akce opakuje, kdežto u EVENT_T_HP by se mohl hodit i další parametr např. k předání času jako zpoždění. Shrneme si zatím, co jsme zapsali: `creature_id` 123, `event_type` 4 (EVENT_T_HP), `event_param1` 90 (při 90% HP) `event_param2` 2000 (2000 milisekund spoždění). Nyní jsme si „zodpověděli“ druhou větu - událost (Kdy to dělat). No a co naše první věta? Když se na to podíváte z dálky na druhou větou (Kdy to dělat), je v ní napsáno, že se má něco dělat! A co? To nám řekne naše první věta. Nyní si to převedeme na eventAI. Další sloupec v tabulce `eventai_scripts` je `action1_type`. Do tohoto sloupce ukládáme jaký typ akce se má provést při naši události.
Jednotlivé typy akcí (action_type) | |||||
---|---|---|---|---|---|
ID | Jméno | Parametr 1 | Parametr 2 | Parametr 3 | Popis |
1 | ACTION_T_SAY | Text ID | N | N | Creatura řekne text s určitým Text ID /say |
2 | ACTION_T_YELL | Text ID | N | N | Creatura zařve text s určitým Text ID /yell |
3 | ACTION_T_TEXTEMOTE | Text ID | N | N | Creatura vyjádří textový cit. /e |
4 | ACTION_T_SOUND | Sound ID | N | N | Creatura pustí zvuk. |
5 | ACTION_T_EMOTE | Emote ID | N | N | Creatura vyjádří cit. /cry |
6 | ACTION_T_RANDOM_SAY | Text ID 1 | Text ID 2 | Text ID 3 | Vybere z těchto 3 Text ID jednu a řekne ji. Pokud je Text ID = -1 vynechá jej. |
7 | ACTION_T_RANDOM_YELL | Text ID 1 | Text ID 2 | Text ID 3 | Vybere z těchto 3 Text ID jednu a zařve ji. Pokud je Text ID = -1 vynechá jej. |
8 | ACTION_T_RANDOM_TEXTEMOTE | Text ID 1 | Text ID 2 | Text ID 3 | Vybere z těchto 3 Text ID jednu a vyjádří textový cit /e. Pokud je Text ID = -1 vynechá jej. |
9 | ACTION_T_RANDOM_SOUND | Sound ID 1 | Sound ID 2 | Sound ID 3 | Vybere z těchto 3 Sound ID jednu a pustí ji. Pokud je Sound ID = -1 vynechá ji. |
10 | ACTION_T_RANDOM_EMOTE | Emote ID 1 | Emote ID 2 | Emote ID 3 | Vybere z těchto 3 Emote ID jednu a emotuje ji. Pokud je Emote ID = -1 vynechá ji. |
11 | ACTION_T_CAST | Spell ID | T-Type | Interrupt * | Vrhnout kouzlo na cíl. Pokud je Interrupt = 1, kouzlo se může přerušit. |
12 | ACTION_T_SUMMON | Creature ID | T-Type | Duration * | Vyvolá kreaturu (peta). Duration čas za jak dlouho má pet zmizet. Pokud je Duration = 0 (výchozí), pet zmizí při zabití. |
13 | ACTION_T_THREAT_SINGLE_PCT | Threat % | T-Type | N | Modifikuje hrozbu cíle procentem Threat. |
14 | ACTION_T_THREAT_ALL_PCT | Threat % | NU | N | Modifikuje hrozbu každého v okolí procentem Threat. |
15 | ACTION_T_QUEST_COMPLETE | Quest ID | T-Type | N | Dokončí quest s ID Quest ID (Musí být hráč). |
16 | ACTION_T_QUEST_CASTCREATUREGO | Quest ID | Spell ID | T-Type | Emulates spell cast on the creature for the target (must be a player) |
17 | ACTION_T_SET_UNIT_FIELD | Index | Value | T-Type | Sets unit field at the index to the value given for the target |
18 | ACTION_T_SET_UNIT_FLAG | Flag(s) | T-Type | N | Nastaví flag(y) na cíli. |
19 | ACTION_T_REMOVE_UNIT_FLAG | Flag(s) | T-Type | N | Odstraní flag(y) na cíli. |
20 | ACTION_T_AUTO_ATTACK | Boolean | N | N | Pokud je Boolean 0 (false), zastaví se auto útok, jestli je Boolean 1 (true), útok bude pokračovat. |
21 | ACTION_T_COMBAT_MOVEMENT | Boolean | N | N | Pokud je Boolean 0 (false), zastaví se bojový pohyb, jestli je Boolean 1 (true), bude se pohybovat. |
22 | ACTION_T_SET_PHASE | Phase # | N | N | Sets current phase to number given |
23 | ACTION_T_INC_PHASE | Number | N | N | Increments (or decrements) the phase by given number. |
Opět máte tabulku s popisem. Opět, tyto akce pobírají parametry, které je ovlivňují. U parametrů akcí nám přibyl další typ parametru a to je TARGET (cíl).
Seznam všch možných TARGETů | ||
---|---|---|
ID | Name | Description |
0 | TARGET_T_SELF | Cíl je sám. |
1 | TARGET_T_HOSTILE | Cíl je stávající oběť (obvykle cíl s největším aggrem v okolí). |
2 | TARGET_T_HOSTILE_SECOND_AGGRO | Cíl je creatura s druhým největším aggrem. |
3 | TARGET_T_HOSTILE_LAST_AGGRO | Cíl je creatura s nejmenším aggrem. |
4 | TARGET_T_HOSTILE_RANDOM | Náhodné vybrání cíle (cíl v okolí). |
5 | TARGET_T_HOSTILE_RANDOM_NOT_TOP | Náhodné vybrání cíle, mimo creaturu s největším aggrem (cíl v okolí). |
Ukážeme si teď pár praktických příkladů...
INSERT INTO `eventai_scripts` ( `id`, `creature_id`, `event_type`, `event_param1`, `event_param2`, `action1_type`, `action1_param1`, `action2_type`, `action2_param1`, `comment` ) VALUES (NULL,'123','4','90','2000','1','1','4','1564', 'Popis neni povinny.. jen kvuli prehledu');
- event type - EVENT_T_HP
- event parametr 1 - 90 (procenta HP viz. tabulka)
- event parametr 2 - 2000 (čas (ms) viz. tabulka - TARGETy dole jsou vysvětlivky -> nepovinný parametr označován * )
- event parametr 3 - N (není žádný, viz. tabulka - TARGETy dole jsou vysvětlivky)
- action1 type - typ první akce - 1 - ACTION_T_SAY (promluví)
- action1 parametr 1 - 1 (text ID 1 viz. tabulka)
- action2 type - typ druhé akce - ACTION_T_SOUND (4)
- action2 parametr 1 - 1564 (sound ID viz. tabulka - creatura zahraje zvuk s ID)
- comment - nepovinný komentář pro developery
A co že se při tomto eventAI scriptu stane? Event type nám říka, že se to stane při dosažení určité hodnoty HP. Event parametr 1 nám ríká, že HP musí dosáhnout hodnoty 90%. Event parametr 2 nám říká, že po dosáhnutí určité hodnoty HP bude čekat 2000 milisekund. Action type1 nám říká, že první akce bude /say (creatura promluví) určitý text ID, nebo Váš text ID, který si sami vytvoříte a jeho data zapíšete do tabulky `localized_texts`. Action2 type nám říká, že se zahraje určitý zvuk. Action2 parametr 1 nám určuje ID zvuku, který se má zahrát....