Co k tomu budeme potřebovat ?
NPC
Zdrojový kód emulátoru TrinityCore
Visual Studio 2008 / Visual C++ 2008
Klávesnici
Monitor
Bednu
Pokud máme všechny potřebné věci, můžeme začít !
Otevřeme si projekt TrinityCore&Script VC90 ve Visual Studio 2008 / Visual C++, a najedeme si do game>>Scripting>>Custom (ale můžete si vytvořit vlastní Filtr, je v podstatě jedno kam to dáte ale je v tom aspoň pořádek)
Nascriptujeme třeba General Marcus Jonathan
a vytvoříme si zde nový soubor ADD>>New Item>>C++ File(.cpp) a název dáme General_Marcus_Jonathan.cpp
takže, na začátek si naincludujeme scripty TrinityCore:
#include "ScriptPCH.h"
nyní si můžeme nadefinovat nějaké spely třeba Bone Slice od Lorda Marrowgara a Holy Light od Paladinů
#define BoneSlice 69055
#define HolyLight 48782
Definice jsou pouze taková malá pomůcka aby si programátor nemusel pořád pamatovat čísla ale aby místo nich psal "jména" (BoneSlice místo 69055, HolyLight místo 48782)
nyní si nadefinujeme ID našeho NPC
#define GeMaJo 466
definice máme zasebou, teď se putíme do scriptování
takže musíme vytvořit struktůru (scriptovou) našeho NPC a do ní budeme psat, co naše NPC bude dělat.
struct boss_GeMaJo : public BossAI
{
boss_GeMaJo(Creature* c) : BossAI(c, GeMaJo)
{}
//nyní si nadefinujeme timery, vpodstatě jsou to neoznačené čisla (uint32) max 32-bitové
uint32 t_holylight;
uint32 t_boneslice;
//teď reset, což znamená, že když se dostane do kombatu, tak aby se nejdřív resetovaly všechny věci (aby hned nekastil všechny spely... a rovnou si nadefinujeme, co kdy má kastit ( v milisekundách 1 sekunda = 1000 milisekund)
void Reset()
{
t_holylight = 10000;
t_boneslice = 3000;
}
// teď můžeme udělat, co udělá naše NPC když se dostane do kombatu ? nic mě nenapadá
void EnterCombat(Unit * target)
{
me->MonsterYell("Za Alianci !!",LANG_UNIVERSAL,NULL);
}
// nebo, když někoho zabije co udělá, nic mě nenapadá
void KilledUnit(Unit * victim)
{
me->MonsterYell("Kdo další chce okusit hňěv aliance ?!",LANG_UNIVERSAL,NULL);
}
// nebo, když zmře, nic mě nenapadá
void JustDied(Unit * killer)
{
me->MonsterYell("Padnout za Alianci !",LANG_UNIVERSAL,NULL);
}
// a nakonec zprovoznit ty timery, to uiDiff je takovej timer, kterej je napsanej v configách jako MapUpdateInterval
void UpdateAI(const uint32 uiDiff)
{
if (!UpdateVictim())
return;
// musíme vytvořit podmínku, že pokud je náš timer menší nebo se rovná uiDiff tak se daná věc provede
if(t_holylight <= uiDiff)
{
DoCast(me, HolyLight, false);
//to znamená že, DoCast - Casti, "me" je cíl, což znamená nasebe, HolyLight je ID toho spelu a false to je jestli je to triggered
// a znovu nastavíme odpočítávání timeru
t_holylight = 10000;
// a nebo pokud není náš timer mentší nebo se rovná uiDiff tak budeme odpočítávat
}else
t_holylight -= uiDiff;
// a to samé s druhým spelem ( me->getVictim() znamená že to použije na cíl (na co právě utočí))
if(t_boneslice <= uiDiff)
{
DoCast(me->getVictim(), BoneSlice, false);
t_boneslice = 3000;
}else
t_boneslice -= uiDiff;
// a nakonec aby potom normálně útočil
DoMeleeAttackIfReady();
} // tady tou závorkou zavíráme UpdateAI
}; // a tadytou celou strukturu
//nyní zaregistrovat NPC
CreatureAI* GetAI_boss_GeMaJo(Creature* c)
{
return new boss_GeMaJo (c);
}
// a registrace scriptu
void AddSC_boss_GeMaJo()
{
Script *newscript;
newscript = new Script;
newscript->Name = "boss_GeMaJo"; // to boss_GeMaJo budeme potřebovat do databáze
newscript->GetAI = &GetAI_boss_GeMaJo;
newscript->RegisterSelf();
}
takže script našeho NPC máme, ale musíme ho ještě přidat do scriptloaderu takže: game>>Scripting>>System
a otevřeme si ScriptLoader.cpp
najdeme si řádek
//custom
a pod něj vložíme
void AddSC_boss_GeMaJo();
potom si najdeme
#ifdef DO_SCRIPTS
//custom
a pod //custom vložíme:
AddSC_boss_GeMaJo();
a C++ sekci máme zasebou, teď musíme náš script dat NPC do databáze takže:
UPDATE `creature_template` SET ScriptName = "boss_GeMaJo" WHERE entry = 466;
a máme hotovo !
Doufám že vám to pomůže.
Edit 1 : už mě neco napadlo
Edit 2 : bLuma: zapomněl jsem, jsem jenom člověk a k tomu BossAI, napadlo mě na bosa tak dělám na bosa
Edit 3 : odkazyyy