ACID

Z WoWResource Wiki
Přejít na: navigace, hledání

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....

Externí odkazy