Jump to content
  • Announcements

    • Xmat

      Pravidlo pro postování v TTT

      Do sekce Tipy, triky, tutoriály nepatří žádné dotazy.   Postujte sem vaše návody, tipy a různé další věci jež uznáte za vhodné sdělit zdejšímu osazenstvu, ale veškeré dotazy směřujte do sekce Všeobecná diskuse.
    • Replik

      Seznam návodů a důležitých témat v této sekci

      Pro lepší přehlednost jsem vytvořil tento seznam, který vás, méně zkušené, lépe provede touto sekcí. Věřím, že zde najdete, co hledáte. Vypsané jsou návody, které jsou oficiálně uznané jako návody. Běžné diskuze, které neposkytují postupy a rady zvěřejněny nejsou.   Instalace vlastního MaNGOS Serveru Díky těmto návodům budete (měli by jste být) schopni vytvořit a následně spustit váš vlastní server. Nastavení je pro verze s i bez datadisku.   Instalace MaNGOS Serveru (bez datadisku TBC) - Autor Benny Instalace MaNGOS Serveru (s datadiskem TBC) - Autor Malfik Instalace MaNGOS Serveru v prostředí Linux - Autor charlie Instalace MaNGOS Serveru v prostředí Linux - Autor kupkoid   Chyby a jejich řešení při přihlašování k serveru - Autor Cybe   Zálohování uživatelských dat   Dávkový soubor (BAT soubor) pro vytvoření SQL záloh - Autor Replik   Kompilování - tvoření vlastních release (revizí)   Tvorba kompilací pro Win32 (MangoScript) - Autor bLuma   Ostatní - těžko zařaditelné, ale neznamená to, že nejsou dobré   VIP Systém - Autor charlie Tvorba Webových stránek pro MaNGOS - Autor zahuba Tvorba teleportačních NPC (MangoScript) - Autor Replik Registrační web (původně předělaná SPORA) Funkční pro Antrix i MaNGOS - Autor Replik Nastavení a spuštění Minimanager pro MaNGOS - Autor BlackMartin Nastavení MaNGOS Website - Autor Artorius   Samozřejmě jsou zde i jiné návody, ale tyto jsou nejvíce používané, proto věřím, že vám budou nápomocné. Tuto sekci budeme upravovat podle potřeby. Pokud by jste něco nenašli nebo si nevěděli rady, hledejte na fóru a teprve potom založte vlastní topik. Pokud nějaký autor vytvoří kvalitní návod a chtěl by ho zveřejnit i v tomto seznamu, doporučuji, aby mi napsal zprávu skrze PM.   Díky a přeji hezký den na WoWResource   Replik
    • Aristo

      Příspěvky tam, kde nemají co dělat

      Dodržujte zákaz přispívání do topiků s repaky pokud si to zakladatelé nepřejí!! Opakované psaní příspěvků bude trestáno warnem.
    • Aristo

      Používání spoilerů

      Poslední dobou má většina uživatelů fora zvláštní nutkání postovat extrémně dlouhé texty nebo kódy, které zabírají v nejedenom případu i 80% obsahu celé stránky a hodně tak zvedají nepřehlednost v topiku. Chtěl bych všechny uživatele požádat, aby při postování citací, jakýchkoliv kódů, errorů, atp... delších než 30 řádků používali funkci spoileru.   Funkci vyvoláte příkazem [spoiler] text [/spoiler]   Ukázka:  
Sign in to follow this  
charlie

[SCript] Silvestrove NPC

Recommended Posts

Tak jsem se tak trochu nudil a zkusil sem udelat ScriptDev2 script... Chtel bych aby mob delal asi toto, vypil naky pivo.. choval se jak opilej (Jako hrac kdyz pouzije item beer) , pote Yeelnul neco jako "Happy new year". Pak hraci co je u nej dal item.. a pak zase ohnostroj...

 

#include "../sc_defines.h"
#include "../../../../game/Player.h"
#include <map>

// struktura silvestr_creature, odvozena od ScriptedAI
struct MANGOS_DLL_DECL silvestr_creature : public ScriptedAI
{
// konstruktor
silvestr_creature(Creature *c) : ScriptedAI© {EnterEvadeMode();}

uint32 GlobalCooldown; // vnitrni promenna na zpomaleni opakovani cinnosti
std::map<uint64, time_t> lastUserAccess; // pamatovak lidi, predchazi preplneni baglu hracu

// volano pri vytvoreni AI
void EnterEvadeMode()
{
GlobalCooldown = 0;
m_creature->RemoveAllAuras();
m_creature->DeleteThreatList();
m_creature->CombatStop();
m_creature->setFaction(35);
DoGoHome();
}

// nehodlame utocit...
void AttackStart(Unit *who) { return; }

// kdyz nekoho uvidim
void MoveInLineOfSight(Unit *who)
{
// neni to nikdo / neni to hrac
if (!who || who->GetTypeId() != TYPEID_PLAYER)
return;

time_t now = time(NULL); // aktualni cas (unix time, sekundy od 1.1.1970)

// zjisti zdali hrac tu uz byl a jestli ano tak, pokud to bylo drive
// nez pred 30sekundami nedelej nic
if (lastUserAccess.find(who->GetGUID()) != lastUserAccess.end())
if (lastUserAccess[who->GetGUID()] + 30000 > now)
return;

// aktualizuj posledni navstevu
lastUserAccess[who->GetGUID()] = now;

// pretypovani Unit na Player
Player* pl = (Player*)who;

// ulozeni itemu
uint16 dest;
// jeli pro item misto
if (pl->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, 19222, 1, false) == EQUIP_ERR_OK)
{
Item* item = pl->StoreNewItem(dest, 19222, 1, true); // uloz item
pl->SendNewItem(item, 1, true, false); // oznam vytvoreni
}
}

// opakovane volana metoda pro aktualizaci inteligence
void UpdateAI(const uint32 diff)
{
// Sniz globalCooldown
if (GlobalCooldown > diff)
GlobalCooldown -= diff;
else GlobalCooldown = 0;

// GlobalCooldown aktivni! nedelej zatim nic
if (GlobalCooldown)
return;

// rand vraci cislo v rozmeni 0-1, %4 = zbytek po deleni 4, tedy cislo muze byt 0,1,2 nebo 3
switch(rand()%4)
{
case 0:
DoYell("Happy new year !", LANG_UNIVERSAL, NULL);
break;

case 1:
DoCast(m_creature, 1543, true);
break;

case 2:
DoCast(m_creature, 11007, true);
break;

case 3:
m_creature->HandleEmoteCommand(10);
break;
}


// Pristi kolo bude za 1-5 sekund
GlobalCooldown = (rand()%4) * 1000 + 1000;
}
};
// definice funkce na ziskani AI
CreatureAI* GetAI_silvestr_creature(Creature *_Creature)
{
// vrati novou instanci tridy silvester_creature
return new silvestr_creature(_Creature);
}

// toto je volano skriptovacim systemem a zaradi predlohu skriptu do sve db
void AddSC_silvestr_creature()
{
// novy skript
Script *newscript;
// alokace pameti a zavolani konstruktoru tridy Script
newscript = new Script;
newscript->Name="silvestr_creature"; // nastaveni jeho jmena
newscript->GetAI = GetAI_silvestr_creature; // prirazeni funkce skriptu GetAI k funkci GetAI_silvestr_creature
m_scripts[nrscripts++] = newscript; // zapsani do pole funkci
}

Edited by charlie

Share this post


Link to post
Share on other sites

NO já to jdu zkusit ... musím říct že já dělal scripty taky a zrovna lehká záleživost to není ale jak to děláš tu chviličku tak to potom jede jak po másle :P

 

 

Share this post


Link to post
Share on other sites
NO já to jdu zkusit ... musím říct že já dělal scripty taky a zrovna lehká záleživost to není ale jak to děláš tu chviličku tak to potom jede jak po másle :P

Tak pak napis jak to dopadlo.. musis jeste v creature_template u nakyho moba nastavit scriptname na silvestrnpc a toho moba pak testovat.. mno pridelat to do scriptdev2 projektu atd..

Share this post


Link to post
Share on other sites

1) skriptu musí mít určitou strukturu, v "struct" musí být buď proměnné nebo funkce ve kterých je samotný výkonný kód

2) while(true) není možné nikdy použít, protože v důsledku volání této funkce ze stejného vlánka jako je obnovování světa mangosu by došlo k freezu

3) to co jsem zatím sesmolil: (netestováno, nejde mě sd2 grrrrch)

#include "../sc_defines.h"
#include "../../../../game/Player.h"
#include <map>

// struktura silvestr_creature, odvozena od ScriptedAI
struct MANGOS_DLL_DECL silvestr_creature : public ScriptedAI
{
   // konstruktor
   silvestr_creature(Creature *c) : ScriptedAI© {EnterEvadeMode();}

   uint32 GlobalCooldown; // vnitrni promenna na zpomaleni opakovani cinnosti
   std::map<uint64, time_t> lastUserAccess; // pamatovak lidi, predchazi preplneni baglu hracu

   // volano pri vytvoreni AI
   void EnterEvadeMode()
   {
       GlobalCooldown = 0;
       m_creature->RemoveAllAuras();
       m_creature->DeleteThreatList();
       m_creature->CombatStop();
       m_creature->setFaction(35);
       DoGoHome();
   }

   // nehodlame utocit...
   void AttackStart(Unit *who) { return; }

   // kdyz nekoho uvidim
   void MoveInLineOfSight(Unit *who)
   {
       // neni to nikdo / neni to hrac
       if (!who || who->GetTypeId() != TYPEID_PLAYER)
           return;

       time_t now = time(NULL); // aktualni cas (unix time, sekundy od 1.1.1970)

       // zjisti zdali hrac tu uz byl a jestli ano tak, pokud to bylo drive
       // nez pred 30sekundami nedelej nic
       if (lastUserAccess.find(who->GetGUID()) != lastUserAccess.end())
           if (lastUserAccess[who->GetGUID()] + 30000 > now)
               return;

       // aktualizuj posledni navstevu
       lastUserAccess[who->GetGUID()] = now;

       // pretypovani Unit na Player
       Player* pl = (Player*)who;

       // ulozeni itemu
       uint16 dest;
       // jeli pro item misto
       if (pl->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, 19222, 1, false) == EQUIP_ERR_OK)
       {
           Item* item = pl->StoreNewItem(dest, 19222, 1, true); // uloz item
           pl->SendNewItem(item, 1, true, false); // oznam vytvoreni
       }
   }

   // opakovane volana metoda pro aktualizaci inteligence
   void UpdateAI(const uint32 diff)
   {
       // Sniz globalCooldown
       if (GlobalCooldown > diff)
           GlobalCooldown -= diff;
       else GlobalCooldown = 0;

       // GlobalCooldown aktivni! nedelej zatim nic
       if (GlobalCooldown)
           return;

       // rand vraci cislo v rozmeni 0-1, %4 = zbytek po deleni 4, tedy cislo muze byt 0,1,2 nebo 3
       switch(rand()%4)
       {
           case 0:
               DoYell("Happy new year !", LANG_UNIVERSAL, NULL);
               break;

           case 1:
               DoCast(m_creature, 1543, true);
               break;

           case 2:
               DoCast(m_creature, 11007, true);
               break;

           case 3:
               m_creature->HandleEmoteCommand(10);
               break;
       }


       // Pristi kolo bude za 1-5 sekund
       GlobalCooldown = (rand()%4) * 1000 + 1000;
   }
}; 
// definice funkce na ziskani AI
CreatureAI* GetAI_silvestr_creature(Creature *_Creature)
{
   // vrati novou instanci tridy silvester_creature
   return new silvestr_creature(_Creature);
}

// toto je volano skriptovacim systemem a zaradi predlohu skriptu do sve db
void AddSC_silvestr_creature()
{
   // novy skript
   Script *newscript;
   // alokace pameti a zavolani konstruktoru tridy Script
   newscript = new Script;
   newscript->Name="silvestr_creature"; // nastaveni jeho jmena
   newscript->GetAI = GetAI_silvestr_creature; // prirazeni funkce skriptu GetAI k funkci GetAI_silvestr_creature
   m_scripts[nrscripts++] = newscript; // zapsani do pole funkci
}

 

funkčnost neověřena...

Share this post


Link to post
Share on other sites

Mne to hadze toto

 

 

.\silvestr_creature.cpp(9) : error C2059: syntax error : '{'

1>.\silvestr_creature.cpp(9) : error C2512: 'ScriptedAI' : no appropriate default constructor available

Share this post


Link to post
Share on other sites

normalne napise © ale ked das ( potm c potom ) a tuto zatvorku zmazes a znovu ju tam das tak ti to nebude robit

Edited by marcel

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this  

×