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  
ShadowyCZ

[Help] Encounter in progress

Recommended Posts

Zdravim lidi , chtěl bych poradit v C++ . Potřeboval bych vypnout " Encounter in progress " . Vim , že to je schovaný v core souborech " Map a InstanceData " ale nevím jak to změnit aby mohli lidi chodit do dungu , když sou zrovna v combatu s bossem . Jedná se o OregonCore 2.4.3

Edited by ShadowyCZ

Share this post


Link to post
Share on other sites

Je to určitě v "Map" / "InstanceData"? Já bych řekl, že to má co dočinění s portování, tj. když hráč vtsoupí do porátlu, tak se zavolá player->isInCombat něbo něco podobnýho...

 

Zdrojáky nemám, takže ti víc neřeknu, problém to ale najít nebude... Řekl bych, otázka deseti minut.

Share this post


Link to post
Share on other sites

InstanceData.cpp obsahuje metodu:

bool InstanceData::IsEncounterInProgress() const
{
   for (std::vector<BossInfo>::const_iterator itr = bosses.begin(); itr != bosses.end(); ++itr)
       if (itr->state == IN_PROGRESS)
           return true;

   return false;
}

 

Stačí jí přepsat na:

bool InstanceData::IsEncounterInProgress() const
{
   return false;
}

Share this post


Link to post
Share on other sites

To jdeš z druhé strany a IMHO tím něco mužeš rozbít - lepší bude smazat podmínku na straně playera, než takhle odstřihnout celou funkci a ovlivnit XY dalších věcí.

Ta metoda je v podstatě jako šablona pro scripty a vlastně se nepoužívá. Proto se nic nerozhodí a pravděpodobně se ani nic nestane (nic to neovlivní). V každým instance scriptu je vlastní (přetěžuje se?), v některých je dokonce napsaná stejně jak jsem jí tu popsal (pouze vrací false). Bude nejspíš třeba projít všechny instance scripty a patřičně je upravit - vyhledat IsEncounterInProgress a přepsat dle vzoru (viz. výše).

Edited by Wolf Officious

Share this post


Link to post
Share on other sites

Pravděpodobně? Na tom by programátor nic základat neměl...

 

A přesně to co popisuješ (že je potřeba upravit i přetížené metody) je další fail, protože upravuješ "druhý konec". Přestaň upravovat API a uprav radši podmínku, kde se tohle API používá - kde se hráč portuje a ověřuje, zda tam může. Bude to méně psaní, bude to naprosto bezpečné a budeš mít pod kontrolou, co si vypnul a co ne.

Edited by Tomáš Kolinger
  • Downvote 1

Share this post


Link to post
Share on other sites

Stáhni si zdroják, koukni se do něj a navrhni lepší řešení, ty chytráku.

Hlavně ať je konkrétní. Kecat o tom by ti šlo, ale činy jsou ty tam. :rolleyes:

 

Další možností je upravit metody CanEnter, ale to se tady panu chytrákovi opět líbit nebude.

Díky takovýmhle lidem tu ztrácí všichni motivaci se o čemkoliv normálně bavit. ;)

 

PS: IsEncounterInProgress není v žádné podmínce. Je to nevyužitý pahýl. Když se podíváme na TC, používá se to. Zvláštní, jak tu meleš o upravování API a ani si neprověříš fakta. Říct mi že se to tam nepoužívá by bylo relevantnější.

Edited by Wolf Officious

Share this post


Link to post
Share on other sites

InstanceData.cpp obsahuje metodu:

bool InstanceData::IsEncounterInProgress() const
{
for (std::vector<BossInfo>::const_iterator itr = bosses.begin(); itr != bosses.end(); ++itr)
	if (itr->state == IN_PROGRESS)
		return true;

return false;
}

 

Stačí jí přepsat na:

bool InstanceData::IsEncounterInProgress() const
{
return false;
}

 

Tak sem to vyzkoušel , zakompiloval ale výsledek nulovej . Postava po vstupu zůstane freezlá , nejde chat ani commandy .

Share this post


Link to post
Share on other sites

No, to je proto, protože to v tom core není dodělaný. Alespoň já jsem nenašel nikde souvislost. Před chvilkou jsem o tom psal. :-/

 

Zkus se kouknout do Map.cpp na ty metody CanEnter. Jsou tam 2, jedna pro instance a druhá pro BG.

Edited by Wolf Officious

Share this post


Link to post
Share on other sites

bool InstanceMap::CanEnter(Player *player)
{
if (player->GetMapRef().getTarget() == this)
{
	sLog.outError("InstanceMap::CanEnter - player %s(%u) already in map %d,%d,%d!", player->GetName(), player->GetGUIDLow(), GetId(), GetInstanceId(), GetSpawnMode());
	ASSERT(false);
	return false;
}
// cannot enter if the instance is full (player cap), GMs don't count
InstanceTemplate const* iTemplate = objmgr.GetInstanceTemplate(GetId());
if (!player->isGameMaster() && GetPlayersCountExceptGMs() >= iTemplate->maxPlayers)
{
	sLog.outDetail("MAP: Instance '%u' of map '%s' cannot have more than '%u' players. Player '%s' rejected", GetInstanceId(), GetMapName(), iTemplate->maxPlayers, player->GetName());
	player->SendTransferAborted(GetId(), TRANSFER_ABORT_MAX_PLAYERS);
	return false;
}
// cannot enter while players in the instance are in combat
  Group *pGroup = player->GetGroup();
if (!player->isGameMaster() && pGroup && pGroup->InCombatToInstance(GetInstanceId()) && player->GetMapId() != GetId())
{
	player->SendTransferAborted(GetId(), TRANSFER_ABORT_ZONE_IN_COMBAT);
	return false;
}
return Map::CanEnter(player);
}

 

Teprv s C++ začínám , ale našel sem tohle . Snad se z toho dá něco vyzkoumat . :D

 

 

EDIT : Nešlo by jednoduše smazat

player->SendTransferAborted(GetId(), TRANSFER_ABORT_ZONE_IN_COMBAT);

Edited by ShadowyCZ

Share this post


Link to post
Share on other sites

@Wolf Officious

Já radši popišu řešení a ať si to tazatel dotáhne a něčemu se přiučí. Napsat něco jako "na řádku 299 v souboru XY.cpp přidej dvě lomítka na začátek" je špatné řešení, ten člověk se to nenaučí hledat/řešit a bude podobná témata opakovat dokola.

 

Já uvažuji jen na teoretické rovině, do zdrojáků jsem se ani nepodíval - ani nemusím, je to logické a každý programátor by to řešil stejně. Každopádně ty si nakonec našel to, co jsem myslel a na co jsem poukazoval. Metoda `InstanceMap::CanEnter` je přesně to pravé místo, kde to ošetřit. Jediná odchylka od mé rady je umístění, je to opravdu na straně instancí, což nedává smysl a je to z hlediska objektového návrhu chyba. Jelikož do instance vstupuje hráč, nikoliv instance (natož nějaká mapa instance) - správně by bylo `Player::CanEnterToInstance(Instance *instance)`.

 

@ShadowyCZ

Ne, nejdůležitější je co metoda vrací (což je plyne z názvu `CanEnter` - může vstoupit?). Tj. řádek `return false` zařídí, že tam nemůžeš. `player->SendTransferAborted` je jen hláška...

Zakomentuj/odstraň celou podmínku a máš vyřešené, co potřebuješ.

Edited by Tomáš Kolinger
  • Upvote 1

Share this post


Link to post
Share on other sites

No, u TC platí, že to můžeš zakázat jen v určitých instancích na základě jejich scriptů (přímo ve scriptech, jak jsem zmiňoval). Když jsi nechtěl upravovat API, teď do něj lezeš a upravuješ podmínku. Já jenom že si hodně protiřečíš; jako bys nevěděl o čem mluvíš.

 

Jen tak mimochodem, je zvláštní, že metoda Map::CanEnter má v těle jenom return true; Že by další pahýl?

 

ShadowyCZ: Musíš zapoznámkovat celou tu podmínku, včetně vnření (obsahu mezi { a } .. )

PS: ... jak psal Tom, koukám že dřív.

Edited by Wolf Officious

Share this post


Link to post
Share on other sites

Netuším co třída `Map` reprezentuje. Dle toho co píšeš to bude nějaká abstraktní mapa, popřípadě obyčejná mapa ve světě, kde žádná omezení nejsou - tudíž `return true` je logické.

 

Já nevím o čem mluvím? Prosímtě mohl by sis přečíst co k tomu píšu? Onu kolizi jsem ti ihned vysvětlil, tak nechápu, proč tvrdíš podobné hlouposti. A pokud se ti nezdá to co píšu, tak by sis měl přečíst něco o objektovém modelování a návrhu objektových aplikací.

Edited by Tomáš Kolinger

Share this post


Link to post
Share on other sites

Netuším co třída `Map` reprezentuje. Dle toho co píšeš to bude nějaká abstraktní mapa, popřípadě obyčejná mapa ve světě, kde žádná omezení nejsou - tudíž `return true` je logické.

Jo, pravda.

virtual bool CanEnter(Player* /*player*/) { return true; }

 

A ještě něco (abys pochopil z čeho jsem vycházel).

Tohle je dost zvláštní, protože v komentáři je napsáno že se to používá v CanEnter, přitom tomu tak není.

        //Used by the map's CanEnter function.
       //This is to prevent players from entering during boss encounters.
       virtual bool IsEncounterInProgress() const;

(ano, je taky viruální, používá se v instance scriptech...)

 

Oni tu metodu prostě nepoužívají. Trinity jí používá, nevím proč OC ne.

Úryvek z TC, metoda InstanceMap::CanEnter:

    // cannot enter while an encounter is in progress on raids
   /*Group* group = player->GetGroup();
   if (!player->isGameMaster() && group && group->InCombatToInstance(GetInstanceId()) && player->GetMapId() != GetId())*/
   if (IsRaid() && GetInstanceScript() && GetInstanceScript()->IsEncounterInProgress())
   {
       player->SendTransferAborted(GetId(), TRANSFER_ABORT_ZONE_IN_COMBAT);
       return false;
   }

 

Já nevím o čem mluvím? Prosímtě mohl by sis přečíst co k tomu píšu? Onu kolizi jsem ti ihned vysvětlil, tak nechápu, proč tvrdíš podobné hlouposti. A pokud se ti nezdá to co píšu, tak by sis měl přečíst něco o objektovém modelování a návrhu objektových aplikací.

Ne. Stalo se. Kolize - řešení ve scriptech s něčím snad koliduje? Psal jsi aby se nezasahovalo do API - že jsem našel metodu která tohle měla mít na starosti a je ve scriptech by přeci už od začátku řešilo daný problém. Kdo ale mohl tušit, že oni to tam sic mají, ale je to nedomrlý pahýl? Ze začátku jsem si toho nevšiml, vždyť jsme lidi. Pokud ani tohle nechápeš, pak se nemáme o čem bavit. Měl by sis přečíst něco o slušném chování.

 

 

Edited by Wolf Officious

Share this post


Link to post
Share on other sites

Tak kluci sem velice rád , že ste mi pomohli vyřešit můj problém :)

 

Zde je řešení :

 

bool InstanceMap::CanEnter(Player *player)
{
if (player->GetMapRef().getTarget() == this)
{
	sLog.outError("InstanceMap::CanEnter - player %s(%u) already in map %d,%d,%d!", player->GetName(), player->GetGUIDLow(), GetId(), GetInstanceId(), GetSpawnMode());
	ASSERT(false);
	return false;
}
// cannot enter if the instance is full (player cap), GMs don't count
InstanceTemplate const* iTemplate = objmgr.GetInstanceTemplate(GetId());
if (!player->isGameMaster() && GetPlayersCountExceptGMs() >= iTemplate->maxPlayers)
{
	sLog.outDetail("MAP: Instance '%u' of map '%s' cannot have more than '%u' players. Player '%s' rejected", GetInstanceId(), GetMapName(), iTemplate->maxPlayers, player->GetName());
	player->SendTransferAborted(GetId(), TRANSFER_ABORT_MAX_PLAYERS);
	return false;

}
return Map::CanEnter(player);
}

Edited by ShadowyCZ

Share this post


Link to post
Share on other sites

Hele, nemyslím si že je moudré to uplně odstranit. :) Já bych to tam nechal jako poznámku. :)

 

bool InstanceMap::CanEnter(Player *player)
{
       if (player->GetMapRef().getTarget() == this)
       {
               sLog.outError("InstanceMap::CanEnter - player %s(%u) already in map %d,%d,%d!", player->GetName(), player->GetGUIDLow(), GetId(), GetInstanceId(), GetSpawnMode());
               ASSERT(false);
               return false;
       }
       // cannot enter if the instance is full (player cap), GMs don't count
       InstanceTemplate const* iTemplate = objmgr.GetInstanceTemplate(GetId());
       if (!player->isGameMaster() && GetPlayersCountExceptGMs() >= iTemplate->maxPlayers)
       {
               sLog.outDetail("MAP: Instance '%u' of map '%s' cannot have more than '%u' players. Player '%s' rejected", GetInstanceId(), GetMapName(), iTemplate->maxPlayers, player->GetName());
               player->SendTransferAborted(GetId(), TRANSFER_ABORT_MAX_PLAYERS);
               return false;
       }
       // cannot enter while players in the instance are in combat
       /*Group *pGroup = player->GetGroup();
       if (!player->isGameMaster() && pGroup && pGroup->InCombatToInstance(GetInstanceId()) && player->GetMapId() != GetId())
       {
               player->SendTransferAborted(GetId(), TRANSFER_ABORT_ZONE_IN_COMBAT);
               return false;
       }*/
       return Map::CanEnter(player);
}

 

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  

×