A leckét kezdőknek dota 2 scripting

Ez a lecke célja a Dota 2 egyéni játékok (modok, kiegészítők, térképek) programozásának alapjai.

Scripting (scriptek)

Először is szükséged lesz egy már létrehozott egyéni játékra, ahol sétálhatsz. Itt az ideje, hogy elkezdjük tanulni a Lua programot, és általában foglalkozunk ezzel.

Menj a dota 2 béta \ játék \ dota_addons \ your_name \ scriptekhez. A két fő mappát szkriptekkel NPC és vscript. Az első fájlok a .txt kiterjesztéssel rendelkezhetnek (ha nem léteznek, létrehozhat egyet):

  • npc_abilities _custom.txt - tartalmazza a megváltozott és létrehozott képességeket a felhasználói játékban.
  • npc_heroes _custom.txt - képességek és statisztikák hősök.
  • npc_items _custom.txt - a készletben viselt elemek képességei.
  • npc_units _custom.txt - az egységek, épületek vagy lények nem hősökre vonatkozó összes adata.
  • npc_abilities _override.txt - módosított Dota 2 képességek / részletek változott értékekkel.
  • herolist .txt - a kiválasztott hősök listája.

Ezek a fájlok a KeyValues ​​(KV, kulcsérték) rendszert használják, és a DataDriven rendszer központi elemei. Ezek olyan táblázatok, amelyek mindenféle adatot tartalmaznak, és segítenek a Source 2 motorban megérteni, mi az ami. Ezek a fájlok nagyon egyszerű szintaxissal rendelkeznek. Minden, ami van táblákkal (kezdő és záró gömbölyű zárójelekkel), amelyek tartalmazzák a kulcsot és annak paraméterét (értékét).

A KV meghatározza a képességek, tárgyak, egységek alapvető paramétereit, de a Lua-val. kicsit bonyolultabb lesz.

Minden .txt fájl tartalmazza a saját speciális kvs, és amikor a játék elindul, a Source motor 2 letölti őket, például, hogy melyik egység milyen paramétereket kell zaspavnen. Változások ezek a fájlok nem lépnek érvénybe, amíg amíg a játék újra indul (újraindítás után), ezért legyen nagyon óvatos a szintaxis, abban az esetben egy extra vagy hiányzó zárójelek " <>. minden KeyValues. amelyek ezt a hibát követik, nem veszik figyelembe. A KV kis-és nagybetűket érzékel, ezért vegye figyelembe, hogy mindent jól ír, és a motor nem fog hibát okozni.

Ez csak egy bevezető példája a DataDriven rendszernek. Megérteni, hogy mi történik, hol és hogyan bővíthető.

Hozzon létre egy új dokumentumot a Sublime szövegszerkesztőben, és győződjön meg róla, hogy használja a Dota KV szintaxist (nyomja meg a Ctrl + Shift + P billentyűkombinációt, és írja be a Dota KV parancsot, hogy gyorsan kiválassza).

Nagyon egyszerű képességet fogunk tenni, amely egyetlen célt károsít. Kezdje el írni a képesség nevét "" és szóköz nélkül. Ezután írja meg a BaseClassot. és nyomja meg az Enter billentyűt az automatikus befejezés befejezéséhez (ezért szükséges a fenti töredékek). Navigáljon a Tab billentyűvel.

A "BaseClass" minden DataDriven definícióhoz fontos, ezért a játék értelmezi, hogy ez a DataDriven képesség. Az elemek, egységek és hősök saját alaptanfolyamuk van (BaseClass).

Az AbilityTextureName lehet a képesség ikon vagy a DotA képesség bármely belső neve, például lina_laguna_blade.

Egy másik fontos KV az Ability Behavior. rekord AbilityB és az automatikus kiegészítés használata

A leckét kezdőknek dota 2 scripting

A leckét kezdőknek dota 2 scripting

Ezután egy képesség eseményre van szükségünk - ez egy kiváltó ok, amikor egy bizonyos esemény történik a képesség tulajdonosával. A legegyszerűbb az OnSpellStart. adj hozzá egyet az automatikus kiegészítéssel, és megjelenik egy új "szint" létrehozva <>. Ezt blokknak hívják. A [ACTION] -ben írja meg a "Damage" műveletet, néhány kulcsot és% AbilityDamage. A% jel olyan értéket jelent, amelyet máshol, ebben az esetben az AbilityDamage kulcsértékében elfogadunk. Adja hozzá az utolsó kulcsot, és az első nagy varázslatnak így kell kinéznie:

Ezt a képességet hozzá kell adni a npc_abilities_custom.txt fájlhoz ahhoz, hogy a hero vagy az egység használhassa azt.

Test_abilitás hozzáadása után. amit most teremtett, ideje felvenni a képességet és a hős. A mod könyvtárában van egy mappa hősök, melynek különböző fájljai vannak a hős képességek leírásával. Nyissa meg a hősöket, és változtassa meg a szabványos képességet test_ability-re.

Minden alkalommal, amikor létre kell hoznod a "maniken" -t (a játékban egy próbabábu), használja a -createhero (unit_name) ellenséget a konzolban.

Csevegésben a unit_name az egyik elérhető hősnév, vagy csak a rendelkezésre álló blokknév. Rövid neveket is elfogad, például "ősi", és nem "régi_paraméter". Egy gyors parancs létrehozása kobold ellenség létrehozza az alapértelmezett ellenséges semleges koboldot. Az egység teljes neve "npc_dota_neutral_kobold", de a rövid parancs fog működni. A -wtf (és a -unwtf tartalmazza azt is) letiltja a feltöltési képességeket.

A Dada 2 Workshop Tools Wiki széleskörű dokumentációt és részletes adatokat tartalmaz a DataDriven rendszerről.

Lua szkriptek (szkriptek)

Itt van négy nagy fejlesztés a Lua Dota-ban:

  • Játék logika
  • DataDriven RunScript
  • Hammer bemenet / kimenet
  • Esemény felhasználói felület

Játék logika - struktúra

Minden egyes felhasználói játékban az addon_game_mode.lua nevű fájlnak jelen kell lennie. Legalábbis addig, amíg a játék logika ebben a fájlban (és valóban, a Valve nem ugyanúgy az én például), azt javasoljuk, hogy előjegyzett ezt a fájlt csak a 3 funkció:

  • A szükséges (szükséges), itt minden szükséges fájlt fel kell használni a játék logikájába, könyvtárakként helyezkednek el, vagyis minden fájlon belüli függvény bármely ponton használható.
  • A Precache (előgyorsított), amikor a játék elindul és a játékosok elveszik hősöket, a motor megpróbálja letölteni a hozzájuk tartozó modelleket / részeket / hangokat. Ha dinamikusan használunk erőforrásokat a Lua-ban. előtöltés előtt - akkor valószínűleg lesz néhány hiba.
  • Aktiválása. Létrehozza a felhasználó játék alapját és felhívja az inicializáló funkciót.

A leckét kezdőknek dota 2 scripting

A Precache funkció összeomlott a Sublime Text Editor-ban (ahol az ellipszis van).

Futtatás után addon_game_mode Precache és Activate. A lua fájlban végrehajtandó első funkció a GameMode: InitGameMode ().

És itt kezdődik a játék az inicializálása mindenféle szabályok és funkciók regisztrált minden GameRules és GameMode fájlokat. Ehhez számos változót definiálnak a fájl elején, hogy rendszerint megszervezzék a paramétereket, például arany beállításokat, öléseket, egyedi szinteket stb.

Ez a GameRules-hez tartozó funkció szintaxisa, egy BOOL paraméterrel:

Mint a KV, Lua a kis-és nagybetűkre érzékeny. A funkció helye a fő Lua fájlban általában nem számít. A szkript összes vonala a függvényhívásban belül kerül végrehajtásra egymás után, potenciálisan ugyanabban a keretben; egy keret Dota-ban - 1/30 másodperc.

Ne feledje: kettőspont használata a funkció előtt. A Lua-ban. ettől függ a játék API funkciója. Azt mondjuk, hogy a GameRules HScript vagy handle (egy leíró egy olyan szám, amellyel egy objektumot azonosíthat). A leírók alapvetően hatalmas táblázatok, az összes lényeges információval. A Scripting API oldalán számos különféle funkciót láthat, amelyekkel különböző leírók használhatók.

A globális funkciók nem igényelnek előtagokat: a leíróban. Heroes, egységek, a képességek és tárgyak megvannak a különböző jellemzőket osztályok és próbálják meg a funkció összeférhetetlen osztály ok VScript hiba - rózsaszín szöveget a konzol és a piros szöveget a játék képernyőjén.

A játékkonzolt a `.

A leckét kezdőknek dota 2 scripting

A leckét kezdőknek dota 2 scripting

A leckét kezdőknek dota 2 scripting

A konzol értesíti a Lua szkript hibát, amikor a játék betöltődik (fordítási idő hiba) vagy futásidejű. Ebben a hibában írtam GameRules.SetHeroRespawnEnabled-t. helyett:

A vonal hibáját nyomon követheti, és megpróbálhatja megoldani, regisztrálja a script_reload parancsot a konzolon a betöltéshez és ellenőrizze, hogy javított-e.

Szintaktikai hiba DataDriven. mint általában:

Események a felhasználói játékban Forrás 2

Az InitGameMode funkció második szegmense (van?) Hallgatók:

A ListenToGameEvent szerkezete a következőképpen olvasható:

Ha a dota_player_gained_level esemény bekövetkezik, futtassa a szkripteket az OnPlayerLevelUp függvényben.

Az OnPlayerLevelUp és a GameMode csak a funkciók és a fő osztályok neve, általában nem kell aggódnia róluk, minden hallgatóról. A Dynamic_Wrap funkció a script_reload paranccsal újraindítja a hallgatókat. A script_reload újraindítja a Lua szkripteket futásidőben, ellentétben a DataDriven fájlokkal, amelyek a játék teljes újraindítását igénylik.

Az InitGameMode harmadik és utolsó fő eleme. amely maga határozza meg a változókat az információ nyomon követéséhez. Használják az előtagot .. ami helyi hivatkozás a GameMode-ra. a fő Lua fájlon belüli összes funkción keresztül. Információk hozzáadása az entitásokhoz. úgynevezett "indexelés", és lényegében egy további bejegyzést ad hozzá az objektum nagy táblájához. Ez nagyon hasznos, mert ez az információ tárolódik a kilincset a tárgy és látható mindenhol (használhatja mindenhol), és semmi sem fog változni, amíg nem hozzárendelése vagy elpusztítani.

Elég elmélet, lássuk, hogy ez hogyan történik. Hozzáadunk néhány egyszerű szkriptsorozatot az OnNPCSpawned függvénynek, amely az npc_spawned hallgatója, és minden egyes alkalommal meghív egy egységet vagy egy hős a térképen.

Az első sor egy "" karakterláncot nyomtat a VConsole-ban. A nyomtatási funkció a Lua-ban van natív, és több paramétert tartalmaz, vesszővel elválasztva, és a ".." karakterlánccal összefűzi a (z) összekötéseket. így:

A DeepPrintTable egy globális Valve-játék funkció, amely információkat jelenít meg egy táblázattal arról, mi történt. A kulcsok esetében ez esetben az .entindex és a .splitscreenplayer lesz. Az objektum index egy nagyon fontos hivatkozási szám az objektum számára. Hagyja figyelmen kívül a splitscreenplayert. ez csak a régi Source motor maradéka, és soha nem használt a Dota 2-ben.

A következő sor egy helyi változót határoz meg. A Lua-ban korlátozott a lokális változók mennyisége abban a blokkban, amelyben bejelentették őket. Ez jó programozási stílus, csak helyi változókat használ, ha szükséges. A helyi változók segítenek elkerülni a globális környezet zűrzavart szükségtelen nevekkel. Ezenkívül a helyi változókhoz való hozzáférés gyorsabb, mint a globálisaké.

Ez alapvetően elolvassa az eseményeken rendelkezésre álló információkat, és egy helyi változóban tárolja ezt a funkcióhívást. Ebben a példában az összes Hallgató és funkciója már feldolgozásra került, de az Ön referenciájához mindig ellenőrizheti az In_Engine_Events wiki oldalt. hogy pontosan tudjuk, melyik eseményt hordozzák.

Helyi változó npc HScript, típusleíró. Az NPC változó minden változása tükrözni fogja az alvó darabokat.

A következő sor először ellenőrzi, hogy az npc hős igaz-e (ez kizárja az illúziókat), és ellenőrzi, hogy nincs-e az .bFirstSpawned index. Ha mindkét feltétel teljesül, akkor a logikai érték változik igaznak, és az OnHeroInGame függvényt hívják.

Az alap lecke befejezéséhez, Dota Lua. változtassuk meg az OnNPCSpawned függvényt, tehát ha a npc_dota_neutral_kobold nevű blokk keletkezik, várjon 1 másodpercet, majd ölje meg magát:

Itt használjuk az Időzítők könyvtárat egy egyszerű 1,0 másodperces késleltetésre, sokféle időzítő funkcióval rendelkeznek a timers.lua magyarázatához. BOOL a ForceKill-en, hogy megismételje a halál animációját.

A táblák a legfontosabb struktúra, amelyet használni kellene. Mint korábban említettük, az objektumokra vonatkozó összes adat táblaként tekinthető (bár ez technikailag C ++ objektummutató), így a játék különféle API-funkcióihoz értékeket kaphat és beállíthat.

Az API-ban vannak olyan funkciók, amelyek visszaadják az objektumleíró táblázatot.

Tegyük fel, hogy meg akarja találni a koboldok közelében összes ültetett (zaspawnennyh) egységet és megöli őket. A FindUnitsInRadius funkció erre a célra használható, és sokféle paramétert tartalmaz, amelyeket meg kell magyarázni:

A paraméterek ebben a sorrendben legyenek. Ez a funkció globális, így nem szükséges a handle: (handle), de meg kell tartanunk a táblázatot olyan változókban, mint például:

Keresse meg a TeamNumber-ot - az objektumnak a sugárban való parancsát a GetTeamNumber () segítségével lehet megadni az NPC-leíróból származó információk felhasználásával. Ami a többi szűrő paramétert illeti, valós számok helyett egy csomó konstansot használunk. amelyek különböző számértékeket képviselnek. A wiki oldalon található állandók teljes listája.

A vektor vektor (x, y, z) koordinátáként jelenik meg. A GetAbsOrigin nevű blokk pozíciójának megszerzésére szolgáló funkció, és elfogad egy NPC-fogantyút.

Ami a gyorsítótár paramétereit illeti, egyszerűen tegyél zérót és hamisat, ezekből általában nem sok előny.

A befejezett függvény, amely a hősről a született (zaspaunenogo) koboldtól 500-as sugárban hívja a következőt:

Használjon további sortöréseket, hogy olvashatóbbá tegye. Most meg szeretnénk ismételni (újjáépíteni) az objektumokat ebben a táblázatban, ez a következőképpen történik:

Van még egy dolog, amit figyelni kell: a "várakozás egy keret" problémára. Mivel az összes egység valójában 0,0,0 koordinátákban született, majd a kívánt pozícióba költözött, sok esetben létre kell hoznia egy 0,03 másodperces késleltetésű (1 képkocka) időzítőt egyes forgatókönyvekhez úgy, hogy minden működjön.

Most, az OnNPCSpawned így néz ki:

Kapcsolódó cikkek