O lecție pentru începători dota 2 scripting

Această lecție are scopul de a explica elementele de bază ale programării jocurilor personalizate Dota 2 (mods, addons, maps).

Scripting (scripturi)

Pentru început, veți avea nevoie de un joc personalizat deja creat, unde puteți merge. Este timpul să începeți să învățați să programați pe Lua și, în general, să vă ocupați de toate acestea.







Accesați dota 2 beta \ game \ dota_addons \ your_name \ scripts. Cele două foldere principale cu scripturi sunt NPC-uri și vscripts. Primul poate avea următoarele fișiere cu extensia .txt (dacă acestea nu există, puteți crea unul):

  • npc_abilities _custom.txt - conține toate abilitățile schimbate și create în jocul utilizatorului.
  • npc_heroes _custom.txt - eroi cu abilitățile și statisticile.
  • npc_items _custom.txt - abilitățile elementelor care sunt purtate în inventar.
  • npc_units _custom.txt - toate datele pentru non-eroii unităților, clădirilor sau creaturilor.
  • npc_abilities _override.txt - abilități / detalii modificate Dota 2 cu valori modificate.
  • herolist .txt - lista eroilor disponibili pentru selecție.

Aceste fișiere utilizează sistemul KeyValues ​​(KV, cheie-valoare) și sunt nucleul sistemului DataDriven. Acestea sunt tabele care conțin toate tipurile de date și ajută motorul Source 2 să înțeleagă ce este. Aceste fișiere au o sintaxă foarte simplă. Tot ceea ce există există tabele (încep și terminând cu paranteze curbate), care conțin cheia și parametrul (valoarea).

KV a stabilit parametrii de bază ai abilităților, obiectelor, unităților, dar cu Lua. va fi un pic mai complicat.

Fiecare fișier .txt conține propriile sale kvs speciale, iar atunci când începe jocul, motorul Source 2 le va descărca, de exemplu, pentru a vedea ce unitate cu ceea ce ar trebui să zaspavnen parametri. Modificări în aceste fișiere nu vor intra în vigoare până la momentul până când începe jocul din nou (după repornire), astfel încât să fie foarte atent cu sintaxa, în cazul unei paranteze în plus lipsește " <>. toate KeyValues. care merg după această eroare nu vor fi luate în considerare. KV are sensibilitate la litere mici, deci rețineți că scrieți totul în mod corect, iar motorul nu va produce o eroare.

Acesta va fi doar un exemplu introductiv al sistemului DataDriven. Pentru a înțelege ce se întâmplă, unde și cum să-l extindeți.

Crearea unui nou document în Sublime Text Editor și asigurați-vă că utilizați Dota sintaxa KV (apăsați pe Ctrl + Shift + P și introduceți Dota KV, pentru ao selecta rapid).

Vom face o abilitate foarte simplă, care face un singur prejudiciu pentru un singur scop. Începeți prin a scrie numele capacității între "" și fără spații. Apoi scrieți BaseClass. și apăsați Enter pentru a insera completarea automată (de aceea au fost necesare fragmentele de mai sus). Navigați cu tasta Tab.

"BaseClass" este important pentru fiecare definiție DataDriven, determină jocul să interpreteze că este capacitatea DataDriven. Elementele, unitățile și eroii au propriile clase de bază (BaseClass).

AbilityTextureName poate fi pictograma dvs. de capacitate sau orice nume intern al abilității DotA, de exemplu lina_laguna_blade.

Un alt KV important este Abilitatea Comportamentului. înregistrați AbilityB și utilizați completarea automată

O lecție pentru începători dota 2 scripting

O lecție pentru începători dota 2 scripting

Apoi, avem nevoie de un eveniment de capacitate - este un declanșator când un anumit eveniment se întâmplă cu proprietarul abilității. Cel mai de bază dintre ele este OnSpellStart. adăugați unul cu autocomplete și veți vedea un nou nivel creat în <>. acest lucru se numește bloc. În [ACTION], scrieți acțiunea "Damage", unele chei și% AbilityDamage. Semnul% reprezintă o valoare care va fi acceptată în altă parte, în acest caz, în valoarea cheie a AbilityDamage. Adăugați această ultimă cheie, iar prima vrajă majore ar trebui să arate astfel:

Acum, această abilitate trebuie adăugată fișierului npc_abilities_custom.txt pentru ca eroul sau unitatea să poată fi utilizat.

După adăugarea capacității de testare. pe care tocmai ați creat-o, este timpul să adăugați abilitatea și eroul. În dosarul modului tău există un erou de dosar, care are diverse fișiere cu descrierea abilităților eroului. Deschideți orice erou și schimbați capacitatea standard de a verifica capacitatea.

Ori de câte ori trebuie să creați un "manechin" (în jocuri este o unitate dummy), utilizați inamicul -createhero (nume_unitate) în consola.

Într-un chat, nume_unitar este unul dintre numele de erou disponibil pentru vârf sau orice nume de bloc care este disponibil. De asemenea, acceptă nume abreviate, de exemplu "vechi", și nu "ancient_apparition". Un inamic rapid de comandă - creathero kobold creează inamicul implicit neutru kobold. Numele complet al unității este "npc_dota_neutral_kobold", dar comanda scurtă va funcționa. De asemenea, puteți dezactiva abilitățile de reîncărcare scriind -wtf (și -unwtf îl va include).

Documentația extensivă și exemplele detaliate ale sistemului DataDriven pot fi găsite pe Dota 2 Workshop Tools Wiki.

Lua scripting (scripturi)

Iată patru evoluții majore despre Lua în Dota:

  • Joc logic
  • DataDriven RunScript
  • Inserție / ieșire ciocan
  • Event Interface utilizator

Logica jocului - Structura

În fiecare joc de utilizator, fișierul numit addon_game_mode.lua trebuie să fie prezent. Cel puțin, atâta timp cât logica jocului este în acest fișier (și, de fapt, Valve a făcut la fel de bine în exemplul meu), este recomandat ca ati rezervat acest fișier numai pentru aceste 3 funcții:

  • Necesită (cerută), aici am pus toate fișierele necesare care vor fi folosite în logica jocului, sunt localizate ca biblioteci, adică toate funcțiile din interiorul acestor fișiere pot fi folosite în orice moment.
  • Precache (pre-cache), când jocul începe și jucătorii își iau eroii, motorul va încerca să descarce modelele / particulele / sunetele asociate acestor caractere. Dacă folosim dinamic resursele în Lua. înainte de preîncărcare - probabil că vor exista unele erori.
  • Activați. Creează baza jocului utilizatorului și apelează funcția de inițializare.






O lecție pentru începători dota 2 scripting

Funcția Precache a fost restrânsă în editorul de text sublim (unde este eliapsa).

După ce rulează în addon_game_mode Precache și Activare. Prima funcție care trebuie executată în fișierul lua este GameMode: InitGameMode ().

Și aici începe jocul cu inițializarea tuturor tipurilor de reguli și funcții care sunt înregistrate în toate fișierele GameRules și GameMode. Pentru aceasta, multe variabile sunt definite la începutul fișierului pentru a organiza în mod normal parametrii, cum ar fi setările de aur, kills, nivelurile personalizate etc.

Aceasta este sintaxa unei funcții aplicate la GameRules, cu un parametru BOOL:

La fel ca KV, Lua are sensibilitatea la litere mici. Locația funcției în fișierul principal Lua nu contează în general. Toate liniile scriptului din interiorul apelului pentru funcții vor fi executate unul după altul, potențial în același cadru; un cadru în Dota - 1/30 secundă.

Rețineți utilizarea: colon înaintea funcției. În Lua. accesul la funcția API a jocului depinde de aceasta. Spunem că GameRules este HScript sau mâner (un descriptor este un număr cu care poți identifica un obiect). Descriptorii sunt în esență mese uriașe, cu toate informațiile relevante. În pagina Scripting API, veți vedea multe tipuri diferite de funcții pe care le puteți utiliza descriptori diferiți.

Funcțiile globale nu necesită prefixe: în descriptori. Heroes, unități, abilități și elemente au diferite clase de descriptori lor și încercarea de a apela o funcție incompatibilă clasa cauza VScript eroare - text roz în consolă, iar textul roșu pe ecranul de joc.

Puteți accesa consola de joc apăsând tasta `.

O lecție pentru începători dota 2 scripting

O lecție pentru începători dota 2 scripting

O lecție pentru începători dota 2 scripting

Consola va notifica când apare o eroare de script Lua, fie atunci când jocul este încărcat (eroare de compilare-timp), fie în timpul rulării. În această eroare, am scris GameRules.SetHeroRespawnEnabled cu. în loc de:

Puteți detecta eroarea acestei linii și încercați să o rezolvați, să înregistrați script_reload în consola pentru a reîncărca scriptul și a verifica dacă acesta a fost reprimat.

Eroare de sintaxă DataDriven. de regulă, arată astfel:

Evenimente în jocul utilizatorului Sursa 2

Al doilea segment al funcției InitGameMode este (sunt?) Ascultători:

Structura acestui ListenToGameEvent este citită ca:

Ori de câte ori are loc evenimentul dota_player_gained_level, executați scripturi în cadrul funcției OnPlayerLevelUp.

OnPlayerLevelUp și GameMode sunt doar numele funcțiilor și clasa principală, de regulă, nu trebuie să vă faceți griji pentru ei, toți ascultătorii. Dynamic_Wrap este o funcție pentru comanda script_reload pentru a reporni și ascultătorii. script_reload repornește scripturile Lua în timpul rulării, spre deosebire de fișierele DataDriven care necesită repornirea completă a jocului.

Al treilea și ultimul element principal din InitGameMode. care în sine definește variabilele pentru a urmări informațiile. Ei folosesc prefixul propriu .. care este o referință locală la GameMode. prin toate funcțiile din interiorul fișierului principal Lua. Adăugarea de informații entității. se numește "indexare" și, în principiu, adaugă încă o intrare la masa mare a acestui obiect. Acest lucru este foarte util, deoarece această informație este stocată în descriptorul de obiecte și este vizibilă peste tot (puteți să o folosiți peste tot) și nimic nu se va schimba până când nu îl vom reassigna sau nu-l distrugem.

Este suficientă teorie, să vedem cum totul se întâmplă. Vom adauga cateva linii simple de script la functia OnNPCSPawned, care este un ascultator pentru npc_spawned si apeleaza de fiecare data cand o unitate sau un erou in harta.

Prima linie va imprima un șir la "" în VConsole. Funcția de tipărire este nativă pentru Lua și ia mai mulți parametri, separate prin virgule, și leagă (coroborate) șirurile cu "..". astfel:

DeepPrintTable este o funcție globală de joc Valve care va afișa informații cu un tabel despre ceea ce sa întâmplat. Pentru cheile în acest caz, acesta va fi .entindex și .splitscreenplayer. Indexul de obiecte este un număr de referință foarte important pentru obiect. Ignorați jocul splitscreenplayer. este doar o rămășiță a motorului sursă vechi și niciodată folosit în Dota 2.

Următoarea linie definește o variabilă locală. În Lua, volumul variabilelor locale din blocul în care au fost declarate este limitat. Acesta este un stil bun de programare, folosiți variabilele locale numai atunci când este necesar. Variabilele locale vă vor ajuta să evitați aglomerația mediului global cu nume inutile. În plus, accesul la variabilele locale este mai rapid decât la cele globale.

Aceasta este, în principiu, citirea informațiilor furnizate în evenimente și stocate într-o variabilă locală în interiorul acestei funcții. În acest exemplu, toți ascultătorii și funcțiile lor au fost deja procesați, dar pentru referință, puteți verifica întotdeauna pagina wiki In_Engine_Events. să știm exact care sunt parametrii fiecărui eveniment.

Variabila locala nsc HScript, descriptor de tip. Toate modificările făcute la variabila NPC vor reflecta asupra bucăților adormite.

Următoarea linie verifică mai întâi pentru a vedea dacă NPC-uri adevaratul caracter (aceasta exclude iluzia), și controale pentru a vedea dacă indicele .bFirstSpawned nu este alocat. Dacă ambele condiții sunt adevărate, o valoare logică este schimbat = true și OnHeroInGame invocat funcția.

Pentru a termina această lecție de bază Dota Lua. să schimbe funcția OnNPCSpawned, astfel încât în ​​cazul în care blocul numit npc_dota_neutral_kobold generat, așteptați timp de 1 secundă, și apoi să se omoare:

Aici folosim biblioteca Timeri pentru o intarziere simpla de 1,0 secunde, existand multe functii de timer diferite pentru explicatia lor in timers.lua. BOOL pe ForceObțineți acest lucru pentru a reproduce animația morții.

Tabelul cea mai importantă structură, pe care ar trebui să folosim. Așa cum am menționat mai devreme, toate obiectele de date poate fi considerat ca un tabel (chiar dacă este punct de vedere tehnic C ++ obiectului indicator), astfel puteți obține și să setați valori pentru diferite funcții API ale jocului.

Există câteva funcții în API care returnează o tabelă descriptor de obiecte.

Să presupunem că doriți să găsiți toate unitățile spawned (zaspawnennyh) lângă kobolds și să-i omoare. Funcția FindUnitsInRadius poate fi utilizată în acest scop și include mai mulți parametri cu diferite tipuri care ar trebui explicați:

Parametrii ar trebui să fie în această ordine. Această funcție este globală, deci nu aveți nevoie de mâner: (mâner), dar trebuie să ținem tabelul în variabile cum ar fi:

Figura teamNumber - care se opune comanda se află în raza se poate face cu GetTeamNumber (), cu ajutorul NPC informații descriptor. În ceea ce privește ceilalți parametri ai filtrului, în loc de numere reale, vom folosi o grămadă de constante. care reprezintă diferite valori numerice. Lista completă a constantelor pe aceasta pagina wiki.

Vectorul este reprezentat ca coordonate vector (x, y, z). O funcție pentru a obține poziția unui bloc numit GetAbsOrigin și acceptă un mâner NPC.

În ceea ce privește parametrii cache-ului, puneți doar zero și false, din care nu beneficiați în general.

Funcția completă care cheamă eroul pe o rază de 500 de la koboldul născut (zaspaunenogo) va arăta astfel:

Utilizați pauze suplimentare pentru a le face mai ușor de citit. Acum vrem să iterăm (reconstrui) obiecte în acest tabel, aceasta se face după cum urmează:

Există încă un lucru pe care ar trebui să acorde o atenție: problema „așteptați un cadru.“ Deoarece toate unitățile sunt, de fapt, născut în (0,0,0) coordonează, iar apoi sa mutat în poziția dorită, în multe cazuri, va trebui să creați un al doilea temporizator cu o întârziere de 0,03 secunde (1 cadru) pentru unele script-uri pentru a obține totul de lucru.

Acum, OnNPCSpawned arată astfel:







Articole similare

Trimiteți-le prietenilor: