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  
Verin

[C++] Vlastní skill pro kouzla

Recommended Posts

Zdravím,

snazím se udelat vlastní skill pro takový muj systém kouzel ale asi na to jdu blbe.

Potreboval bych aby hrác mel promennou "skill" a ta se pri kazdým pouzití príkazu zvedla o 1.

zkousel sem to takto ale to nefunguje:

 

Player.cpp

void Player::Update(uint32 p_time)
{
int skill;
   if (!IsInWorld())
       return;

hp_kouzla.cpp

static bool HandleMdlobyCommand(ChatHandler* handler, const char* args)
{
	Unit* target = handler->getSelectedUnit();
	Player *chr =handler->GetSession()->GetPlayer();
	int skill = skill + 1;
if (skill > 20)
{
	handler->GetSession()->GetPlayer()->Say("Mdloby na tebe",LANG_UNIVERSAL);
}
if (skill < 20)
{
	handler->SendSysMessage("nemas na to dostatecne znalosti");
}

   if (chr->isInFlight())
   {
       handler->SendSysMessage(LANG_YOU_IN_FLIGHT);
       handler->SetSentErrorMessage(true);
       return false;
   }

   // cast spell Stuck
   handler->GetSession()->GetPlayer()->CastSpell(target, 133, false);
   return true;
}

 

jsou to jen ukazky ze scriptů. Díky za pomoc. Vím ze to urcite bude neco jednoduchýho ale tohle me nefunguje

Share this post


Link to post
Share on other sites

ma tam urcite bejt ten handler?

ja bych to vymenil za target a chr

 

handler->GetSession()->GetPlayer()->Say("Mdloby na tebe",LANG_UNIVERSAL); bych vymenil za chr->Say("Mdloby na tebe",LANG_UNIVERSAL);

 

v tyhle casti ziskas hrace co to zavolal a jeho cil do promenejch target a chr

 

                Unit *target = handler->getSelectedUnit();
               Player *chr = GetPlayer();

 

pak bych rek ze kdyz to napise 20x naprazdno tak tenhle radek mu zaruci ze to vycasti vzdycky :D int skill = skill + 1;

 

pak mas porovnani jestli je skill vetsi nebo mensi nez 20 na tom asi neni co rozbit akorat v pripade neuspechu bych tam dal return false

 

if (skill < 20)

{

handler->SendSysMessage("nemas na to dostatecne znalosti");

return false;

}

 

kontrola if (chr->isInFlight()) je snad v poradku akorat se mi tam zase nezda ten handler :D (melo by tam bejt asi chr)

a konec by mel bejt zase chr->GetSession()->GetPlayer()->CastSpell(target, 133, false);

 

 

takze moje verze by vypadala nejak takhle

 

static bool HandleMdlobyCommand(ChatHandler* handler, const char* args)
{
   Unit *target = handler->getSelectedUnit();
   Player *chr = GetPlayer();

       if (skill > 20 && !chr->isInFlight())
       {
            chr->Say("Mdloby na tebe",LANG_UNIVERSAL);
       }
       if (skill < 20)
       {
            chr->SendSysMessage("nemas na to dostatecne znalosti");
            return false;
       }
       if (chr->isInFlight())
       {
           chr->SendSysMessage(LANG_YOU_IN_FLIGHT);
           chr->SetSentErrorMessage(true);
           return false;
       }

   // cast spell Stuck
   chr->CastSpell(target, 133, false);
   int skill = skill + 1;
   return true;
       }

 

neco je tam urcite jeste blbe lepsi programatori poradej (ja se v tom furt nejak patlam to je des :D) jinak pokud chces aby to ten skill ulozilo do databaze tak to bude komplikovanejsi

Edited by OneB1t

Share this post


Link to post
Share on other sites

Takže Harry Potter in World of Warcraft?

Share this post


Link to post
Share on other sites

Pokud je hp_kouzla.cpp CommandScript, pak by to podle me melo vypadat asi takhle:

hp_kouzla.cpp:

static bool HandleMdlobyCommand(ChatHandler* handler, const char* args)
{
   Unit* target = handler->getSelectedUnit();
   Player* chr = handler->GetSession()->GetPlayer();

   if (chr->isInFlight())
   {
       handler->SendSysMessage(LANG_YOU_IN_FLIGHT);
       handler->SetSentErrorMessage(true);
       return false;
   }

   if (chr->skill < 20)
   {
       handler->SendSysMessage("Nemas na to dostatecne znalosti");
       handler->SetSentErrorMessage(true);
       return false;
   }

   chr->Say("Mdloby na tebe",LANG_UNIVERSAL);

   // cast spell Stuck
   chr->CastSpell(target, 133, false);
   chr->skill++;
   return true;
}

player.h:

         bool isAlwaysDetectableFor(WorldObject const* seer) const;
+
+        int skill;
    private:

To, co jsi pridal do Player::Update smaz.

 

Snad to bude funkcni.

Edited by brseker

Share this post


Link to post
Share on other sites

V první řadě jsou první dvě verze nefunkční. Pokud tu proměnnou chceš uchovat musíš ji dát do třídy Player a ne do metody Player::Update. Vhodné je k ní vytvořit gettry a settry, případně ji můžeš dát jako veřejnou, ale to z principu OOP není vhodné. Poté ta proměnná bude dostupná, když bude hráč online, ale stále je nutné vyřešit zachování skillu po případném odhlášení. Pokud to chceš zachovat musíš rovněž upravit metody, které se starají o ukládání do db a poté vytváření charakteru při načtení z db.

 

int skill = skill + 1;

Je maximální možná kravina, vytváříš si novou proměnnou skill, kterou chceš plnit z proměnné skill (kterou jsi teď udělal a nemá definovanou hodnotu) + 1. Pokud použiješ gettry a settry musíš přistoupit k tomu hráči a získat obsah proměnné...

int skill = chr->GetMySkillValue();
skill++;
chr->SetMySkillValue(skill);

 

Případně pokud použiješ public přístup k proměnné...

chr->myskill++;
if (chr->myskill > 123)

Edited by bLuma

Share this post


Link to post
Share on other sites

on to stejne jeste bude potrebovat ukladat do databaze takze to bude muset predelat jinak budou mit po restartu vsichni 0 skill :D

Share this post


Link to post
Share on other sites

hmm tak to asi nedam...

 

Edit: Kazdopadne kdyby se tu nasel nekdo kdo by mi s tím pomohl nebo poradíl nejak víc, byl bych moc vdecný.

Edited by Verin

Share this post


Link to post
Share on other sites

kdyz to udelas tak jak psal bluma tak se to pak do databaze da ulozit celkem jednoduse jen pridas dalsi sloupec treba v characters a ulozis/nactes to z nej

Share this post


Link to post
Share on other sites

problem je ze sem nikdy nacitaní a ukladaní do db nescriptoval ale dobre zkusim to v jadru nekde dohledat.

 

Edit: Nedal by mi nekdo kontakt ze bych to s ním projednal? Nebo by mi pomohl?

Edited by Verin

Share this post


Link to post
Share on other sites

Pomuze mi tedy nekdo? Sam to asi nezvladnu.

 

Edit: hmm tak díky...:(

Edited by Verin

Share this post


Link to post
Share on other sites

Dobře, tak aspoň, porádí mi někdo jak něco načíst a následně uložit do DB? Díky moc

Share this post


Link to post
Share on other sites

CharacterDatabase.PExecute("UPDATE character_skill SET value = 'skill_int' WHERE guid = '%u',skill = 'id_skilu'",GUID_LOPART(GetOwnerGUID());

Možná nějak tekhle ale musiš si to upravit :D

 

Jinak hledej

void Player::SaveToDB()

To je systém ukládání myslim že tam toho dost vyčteš.

Edited by KoblizekX2

Share this post


Link to post
Share on other sites

CharacterDatabase.PExecute("UPDATE character_skill SET value = 'skill_int' WHERE guid = '%u',skill = 'id_skilu'",GUID_LOPART(GetOwnerGUID());

 

Mě zajímá jak tohle může fungovat, tohle není PHP

 

Mělo by to být snad takhle ne?

int skill_int;
int id_skillu;

 

CharacterDatabase.PExecute("UPDATE character_skill SET value = '%u' WHERE guid = '%u', skill = '%u'", skill_int ,GUID_LOPART(GetOwnerGUID(), id_skillu);

 

EDIT:Jestli to funguje jak psal koblih, tak se omlouvám, ale takhle jsem to ještě v C++ nikdy neviděl napsaný.

Edited by Nex

Share this post


Link to post
Share on other sites

Mě zajímá jak tohle může fungovat, tohle není PHP

 

Mělo by to být snad takhle ne?

int skill_int;
int id_skillu;

 

CharacterDatabase.PExecute("UPDATE character_skill SET value = '%u' WHERE guid = '%u', skill = '%u'", skill_int ,GUID_LOPART(GetOwnerGUID(), id_skillu);

 

EDIT:Jestli to funguje jak psal koblih, tak se omlouvám, ale takhle jsem to ještě v C++ nikdy neviděl napsaný.

 

Funguje to, resp odešleš tak požadavek do databáze. Já jsem takhle hodně neohrabaně řešil statistiku kdo vyhrával a prohrával BGčka. :)

Share this post


Link to post
Share on other sites

Už na to píšu WinAPI program mi to nedalo věřit....

Share this post


Link to post
Share on other sites

Moc vam dekuji za informace a napady. Zapis v SaveToDB() mam. ale pak kdyz to volam z toho prikazu napíse mi to chybu

 

Error 1 error C2248: 'Player::myskill' : cannot access protected member declared in class 'Player'

 

Player.cpp

 

+ uint32 myskill;
CharacterDatabase.CommitTransaction(trans);
+ CharacterDatabase.PExecute("UPDATE character SET skill = '%u' WHERE guid = '%u'",myskill,GUID_LOPART(GetOwnerGUID()));

 

Player.H

uint32 myskill;

 

hp_kouzla_test.cpp

static bool HandleMdlobyCommand(ChatHandler* handler, const char* args)
{
	Unit* target = handler->getSelectedUnit();
	Player *chr =handler->GetSession()->GetPlayer();
	chr->myskill++;
	handler->GetSession()->GetPlayer()->Say("Mdloby na tebe!!!!",LANG_UNIVERSAL);
   if (chr->isInFlight())
   {
       handler->SendSysMessage(LANG_YOU_IN_FLIGHT);
       handler->SetSentErrorMessage(true);
       return false;
   }

   //cast spell
if (chr->myskill>20)
{
   handler->GetSession()->GetPlayer()->CastSpell(target, 41484, false);
handler->GetSession()->GetPlayer()->CastSpell(target, 8646, false);
handler->GetSession()->GetPlayer()->AddAura(34510,target);
}
else
{
handler->SendSysMessage("nemas na to dostatecne znalosti");
}
   return true;
}

 

Prosím, nevíte co mam spatne? Díky za vasi pomoc.

Edited by Verin

Share this post


Link to post
Share on other sites

Chybu jsem vyresil, byla to uplna blbost ale pak sem to zkousel i s tím Get Set a to me vyhodilo dalsí chybu kterou se mi nedarí odstranit a ani nevím co znamená

 

Error 1 error LNK2019: unresolved external symbol "public: bool __thiscall Player::SetMySkill(unsigned int)" (?SetMySkill@Player@@QAE_NI@Z) referenced in function "public: bool __thiscall Player::LoadFromDB(unsigned int,class SQLQueryHolder *)" (?LoadFromDB@Player@@QAE_NIPAVSQLQueryHolder@@@Z)

 

Díky za pripadnou pomoc.. :(

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  

×