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 | Parametr 4 | Popis |
0 | EVENT_T_TIMER | InitialMin | InitialMax | RepeatMin | RepeatMax | POUZE V BOJI - InitialMin/Max určuje za jak dlouho se událost spustí a RepeatMin/Max za jak dlouho se bude opakovat. |
1 | EVENT_T_TIMER_OOC | InitialMin | InitialMax | RepeatMin | RepeatMax | MIMO BOJ - InitialMin/Max určuje za jak dlouho se událost spustí a RepeatMin/Max za jak dlouho poté se bude opakovat. |
2 | EVENT_T_HP | HPMax% | HPMin% | RepeatMin | RepeatMax | HPMax/Min% určuje při kolika procentech HP se událost spustí a RepeatMin/Max za jak dlouho poté se bude opakovat. |
3 | EVENT_T_MANA | ManaMax% | ManaMin% | RepeatMin | RepeatMax | ManaMin/Max% určuje při kolika procentech many se událost spustí a RepeatMin/Max za jak dlouho poté se bude opakovat. |
4 | EVENT_T_AGGRO | N | N | N | N | Událost se spustí, jakmile creatura nabere aggro. |
5 | EVENT_T_KILL | RepeatMin | RepeatMax | N | N | Událost se spustí po zabití hráče a bude se opakovat každých RepeatMin/Max. |
6 | EVENT_T_DEATH | N | N | N | N | Událost se spustí po smrti creatury. |
7 | EVENT_T_EVADE | N | N | N | N | Událost se spustí pokud creatura vstoupí do EvadeMode. (když creatura opustí útok a vrátí se na pozici spawnu) |
8 | EVENT_T_SPELLHIT | SpellID | School | RepeatMin | RepeatMax | Událost se spustí po úderu kouzla, pokud je SpellID = 0, spustí se po úderu jakýmkoli kouzlem. Pokud je nastaven parametr school spustí se při úderu kouzel z dané skupiny. Událost se bude opakovat každých RepeatMin/Max. |
9 | EVENT_T_RANGE | MinDist | MaxDist | RepeatMin | RepeatMax | Událost je spuštěna pokud, hráč s nejvyšším threatem (ohrožením) je ve vzdálenosti Param1 až Param2 yardů. Bude se opakovat každých RepeatMin/Max. |
10 | EVENT_T_OOC_LOS | NoHostile | NoFriendly | RepeatMin | RepeatMax | Událost se spustí pokud se hráč dostane do oblasti viditelnosti creatury. Nespustí se pro Hostile hráče pokud parametr NoHostile není nastaven na 0, dále se nespustí pro Friendly hráče pokud parametr NoFriendly není nastaven na 0. Bude se opakovat každých RepeatMin/Max. nikdy se nespustí pro creatury/pety, a nebo pokud je creatura v souboji. |
11 | EVENT_T_SPAWNED | N | N | N | N | Událost se spustí při prvním spawnu creatury a při respawnu. |
12 | EVENT_T_TARGET_HP | HPMax% | HPMin% | RepeatMin | RepeatMax | Událost se spustí, pokud jsou HP aktuálního cíle creatury mezi HPMax/Min% a bude se opakovat každých RepeatMin/Max. |
13 | EVENT_T_TARGET_CASTING | RepeatMin | RepeatMax | N | N | Událost se spustí pokud aktuální cíl castí kouzlo. Bude se opakovat každých RepeatMin/Max. |
14 | EVENT_T_FRIENDLY_HP | HPDeficit | Radius | RepeatMin | RepeatMax | Událost se spustí pokud přátelské jednotce v okruhu (Param2) bude scháze (Param1) HP. Událost se opakuje každých RepeatMin/Max. |
15 | EVENT_T_FRIENDLY_IS_CC | DispelType | Radius | RepeatMin | RepeatMax | Událost se spustí, pokud je přátelská jednotka pod vlivem CC* v okruhu (param2). Bude se opakovat každých RepeatMin/Max. *CC = kouzla jako stun, sheep apod. |
16 | EVENT_T_MISSING_BUFF | SpellID | Radius | RepeatMin | RepeatMax | Událost se spustí pokud přátelksé jednotce v poloměru (Param2) yardů vyprší kouzlo (Param1). Bude se opakovat každých RepeatMin/Max. |
17 | EVENT_T_SUMMONED_UNIT | CreatureID | RepeatMin | RepeatMax | N | Událost se spustí pokud je spawnuta creatura (Param1), pro všechny spawny Param1 = 0. Bude se opakovat každých RepeatMin/Max. |
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_EVENT | Quest ID | T-Type | N | Splní speciální úkol questu (event - SpecialFlags = 2) pro cíl (musí být hráč). |
16 | ACTION_T_CASTCREATUREGO | Quest ID | Spell ID | T-Type | Simuluje kouzlení creatůry na cíl (musí být hráč) |
17 | ACTION_T_SET_UNIT_FIELD | Index | Value | T-Type | Nastaví pole Index na hodnotu Value u cíle. (Viz UpdateData, UpdateFields, data pole u charaterů) |
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 | Nastaví stav na fázi číslo 'Phase #' |
23 | ACTION_T_INC_PHASE | Number | N | N | Zvýší (nebo sníží) aktuální číslo fáze (phase) o udané číslo Number. |
24 | ACTION_T_EVADE | N | N | N | Přinutí creaturu, aby se resetovala - ukončí souboj a ztratí threat. |
25 | ACTION_T_FLEE | N | N | N | Přinutí creaturu uprchnout ze souboje. |
26 | ACTION_T_QUEST_EVENT_ALL | Quest ID | N | N | Splní speciální úkol questu (event - SpecialFlags = 2) pro všechny hráče v threat listu. |
27 | ACTION_T_CASTCREATUREGO_ALL | Quest ID | Spell ID | N | Simuluje kouzlení creatůry na všechny hráče v threat listu. |
28 | ACTION_T_REMOVEAURASFROMSPELL | T-Type | Spell ID | N | Odebere všechny aury (param2) z cíle. |
29 | ACTION_T_RANGED_MOVEMENT | Distance | Angle | N | Uses ranged movement generator keeping the creature at a distance. |
30 | ACTION_T_RANDOM_PHASE | Phase 1 | Phase 2 | Phase 3 | Náhodně vybere fázi ze seznamu tří fází. |
31 | ACTION_T_RANDOM_PHASE_RANGE | Min Phase | Max Phase | N | Vybere náhodnou fázi ze specifikovaného rozsahu. |
32 | ACTION_T_SUMMON | Creature ID | T-Type | Summon ID | Vyvolá creatůru na souřadnicích specifikovaných pro dané summon id. Vyvolaná creatůra zautočí na cíl. |
33 | ACTION_T_KILLED_MONSTER | Creature ID | T-Type | N | Simuluje zabití moba Creature ID pro hráče podle typu cíle. |
34 | ACTION_T_SET_INST_DATA | Field | Value | N | Nastaví novou hodnotu Value v poli Field dat instance (ovlivňuje skript instance). |
35 | ACTION_T_SET_INST_DATA64 | Field | T-Type | N | Nastaví GUID cíle do pole Field dat instance (ovlivňuje skript instance). |
36 | ACTION_T_DIE | N | N | N | Zabije creaturu. |
37 | ACTION_T_ZONE_COMBAT_PULSE | N | N | N | Nastaví všem hráčům v instanci bojový režim s creatůrou. Funguje pouze v boji a uvnitř instancí. |
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šech 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í). |
6 | TARGET_T_ACTION_INVOKER | Targets the unit that caused the event; only for certain events only. |
Seznam Cast Flagů | ||
---|---|---|
Bit / Value | Name | Description |
0 / 1 | CAST_INTURRUPT_PREVIOUS | Přeruší jakékoli přechozí castění. |
1 / 2 | CAST_TRIGGERED | Donutí castit okamžitě a ignoruje potřebnou manu/pomůcky. |
2 / 4 | CAST_FORCE_CAST | Donutí castit kouzlo i když se může zdát, že je cíl moc daleko, nebo že má creatura málo many. |
3 / 8 | CAST_NO_MELEE_IF_OOM | Zabrání creatuře začít melee útok, když jí došla mana, nebo je moc daleko. |
4 / 16 | CAST_FORCE_TARGET_SELF | Donutí cíl seslat tot kouzlo na sebe. |
Seznam Event Flagů | ||
---|---|---|
Bit / Value | Name | Description |
0 / 1 | EFLAG_REPEATABLE | Opakuje událost (Nebude se opakovat pokud není tento flag nastaven) |
7 / 128 | EFLAG_DEBUG_ONLY | Zatím neimplementováno. |
Pole event_inverse_phase_mask
Pole event_inverse_phase_mask slouží k odlišení různých eventů dle aktuální phase (fáze). V současnosti ACID podporuje 32 fází, výchozí fáze má číslo 0 a nejvyšší možná je 31 (při nastavení vyšší fáze bude zobrazována chyba a pole event_inverse_phase_mask nelze použít). Event_inverse_phase_mask slouží jako 32 bitová maska fází pro které event nenastane, každý bit představuje jednu fázi, pokud je daný bit v jedničče tak event při té fázi se nespustí. event_inverse_phase_mask si lze představit jako bity: (00000000 00000000 00000000 00000000)b = 0. Abychom mohli určit, při kterých fázích se event nespustí je nutné si spočítat hodnotu bitů na dané pozici a výsledek sečíst.
fáze: ...98 7 6 5 4 3 2 1 0 (číslo fáze, které bit odpovídá) eipm: 00000000 00000000 00000000 0 0 0 0 0 0 0 0 (jednotlivé bity čísla event_inverse_phase_mask) hodnoty bitů: 32 16 8 4 2 1 (hodnota bitu pro danou fázi)
V praxi to znamená, že fázi 0 odpovídá hodnota bitu 1
fáze | odpovídající hodnota bitu |
0 | 1 |
1 | 2 |
2 | 4 |
3 | 8 |
4 | 16 |
5 | 32 |
6 | 64 |
x | 2 na x-tou |
Pokud budeme chtít, aby event nenastal při fázích 1,2,3 tak nastavíme event_inverse_phase_mask na 2+4+8 = 14 (bitově si to lze představit jako (00000000 00000000 00000000 00001110)b = (1110)b. (Lze zde použít i kalkulátor dostupný ve Windows v režimu BIN a poté zpět převést na DEC)
Ukážeme si teď pár praktických příkladů...
INSERT INTO `eventai_scripts` ( `id`, `creature_id`, `event_type`, `event_inverse_phase_mask`, `event_chance`, `event_param1`, `event_param2`, `action1_type`, `action1_param1`, `action2_type`, `action2_param1`, `comment` ) VALUES (NULL,'123','4','0','100','90','2000','1','1','4','1564', 'Popis neni povinny.. jen kvuli prehledu');
- event type - EVENT_T_HP
- event inverse phase mase - nechte byt na nula
- event chance - sance na splneni udalosti
- 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....