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  
ariczek

Potřebuji radu - IsWithinCombatRange

Recommended Posts

Ahojte... potřeboval bych poradit, co dělám špatně...

 

tahle funkce je default v core...

 

bool Unit::IsWithinCombatRange(const Unit *obj, float dist2compare) const
{
   if (!obj || !IsInMap(obj)) return false;

   float dx = GetPositionX() - obj->GetPositionX();
   float dy = GetPositionY() - obj->GetPositionY();
   float dz = GetPositionZ() - obj->GetPositionZ();
   float distsq = dx*dx + dy*dy + dz*dz;

   float sizefactor = GetCombatReach() + obj->GetCombatReach();
   float maxdist = dist2compare + sizefactor;

   return distsq < maxdist * maxdist;
}

 

 

zajima me proc kdyz ji zavolam kdykoliv... vraci false ? :(

 

nasleduje priklad volani:

 

for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i)
       {
		   if ( i->getSource()->GetTypeId()==TYPEID_PLAYER && me->IsWithinCombatRange(i->getSource(),10))
			  targetList.push_back(i->getSource());
	   }

 

 

i kdyz ingame stoji 5 hracu primo na stejne pozici kde je creature, je targetList prazdny... :(

jedna se o toto NPC... http://www.wowhead.com/npc=16286

 

podotykam ze ten script byl na TC2 pro 3.1.3 funkcni... nyni nefunguje a netusim proc :(

Edited by ariczek

Share this post


Link to post
Share on other sites

Ta funkce ti vrací false právem. Protože:

if (!obj || !IsInMap(obj)) return false;

 

Chyba bude ve volání funkce. Nechce to game objekt? Třeba duelovou vlajku? Unitů je hodně.

Share this post


Link to post
Share on other sites

Zkusim si to jeste zrekompilovat core s debug vypisama... ale neni mi jasne proc by to melo failovat zrovna na tomhle...

 

if (!obj || !IsInMap(obj)) return false;

 

to prvni je chek zda Unit* obj neni null.

To druhy pomoci

bool WorldObject::IsInMap(const WorldObject* obj) const

porovnava dva Unit* jestli jsou na stejny mape...

 

Player je podtrida Unit, takze muzes davat ukazatel na Player, kde ocekavas ukazatel na Unit.

Stejne tak Unit je podtrida WorldObject, takze muzes pouzivat ukazatel na Unit, tam kde ocekavas WorldObject.

 

 

Nechce to game objekt? Třeba duelovou vlajku? Unitů je hodně.

 

tohle mi neni jasny proc ? kde jsi prisel ze objekt ? krom toho ze je tam promenna pojmenovana Unit* obj.

 

porad tapu... treba budu po debug vypisech do konzole chytrejsi...

Share this post


Link to post
Share on other sites

Ale né, tys mě zase nepochopil. Ono to nefailuje na tomhle:

if (!obj || !IsInMap(obj)) return false;

Tohle prostě MOŽNÁ může za to, že ti to vrací FALSE. Protože pokud je blbě předanej ten Unit obj, nebo pokud není v mapě, tak právě tahle podmínka ti vrátí false. Chápeš? Ale můžeš do tý funkce IsWithinCombatRange přidat za tu podmínku nějakej výpis do logu. Pak uvidíš, jestli to dosáhne až za tuhle podmínku, nebo ne.

bool Unit::IsWithinCombatRange(const Unit *obj, float dist2compare) const
{
   sLog.outString("Unit::IsWithinCombatRange - START"); // WLK - TOHLE PRIDEJ

   if (!obj || !IsInMap(obj)) return false;

   sLog.outString("Unit::IsWithinCombatRange - PODMINKA OK"); // WLK - TOHLE TAKY PRIDEJ

   float dx = GetPositionX() - obj->GetPositionX();
   float dy = GetPositionY() - obj->GetPositionY();
   float dz = GetPositionZ() - obj->GetPositionZ();
   float distsq = dx*dx + dy*dy + dz*dz;

   float sizefactor = GetCombatReach() + obj->GetCombatReach();
   float maxdist = dist2compare + sizefactor;

   return distsq < maxdist * maxdist;
}

 

Takovýmhle způsobem můžeš sledovat různý věci v core.. Bude se to psát do logu a do konzole.

 

No hele, a co když false je v klidu a TRUE znamená že neni v rozsahu?

 

Další věc.. Na co prověřuješ všechny hráče iterátorem v mapě? (nemyslím mapu jako mapu, ale Map::PlayerList::const_iterator).. Co vlastně děláš? Co z toho má bejt? Možná by to mohlo jít udělat i jinak.

 

Funkce IsInMap

 

        bool IsInMap(const WorldObject* obj) const
       {
           if (obj)
               return IsInWorld() && obj->IsInWorld() && (GetMap() == obj->GetMap()) && InSamePhase(obj);
           else
               return false;
       }

 

Těžko říct takhle z hlavy jak to je. Každopádně já ze zkušennosti vím, že spoustu věcí jde udělat jinak, hodně toho jde obejít.. Nevyhovuje ti daná funkce? Udělej si vlastní (nebo zkopíruj původní, dej jí jiný jméno a co potřebuješ, to uprav). :D

Edited by Wolf Officious
  • Upvote 1

Share this post


Link to post
Share on other sites

Tak ve vysledku byla chyba jinde :D podle debug vypisu tohle vse funguje jak ma... jen v docast... se nechtel zacastit spell dokud jsem nezvolil true pro triggered :D diky za pomoc i tak.

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  

×