meleylair.cpp

Închis
Avatar utilizator
marsavu123
Nou Venit

Nou Venit
Mesaje: 36
Membru din: 07 Sep 2016, 15:36
Server: OldKings
Regat: Jinno
Aprecieri: 49  
Mulţumiri: 0
Medalii

Buna seara J4 caut si eu un meleylair.cpp functional in care sa meargă puse inelele pe statui !
Eu le am setate la 10 % sa intre in stadiul 3
Am sa las si meleylair meu .

Cod: Selectaţi tot

#include "stdafx.h"
#include "MeleyLair.h"

#ifdef __MELEY_LAIR_DUNGEON__
#include "db.h"
#include "log.h"
#include "item.h"
#include "char.h"
#include "utils.h"
#include "party.h"
#include "regen.h"
#include "config.h"
#include "packet.h"
#include "motion.h"
#include "item_manager.h"
#include "guild_manager.h"
#include "start_position.h"
#include "locale_service.h"
#include <boost/lexical_cast.hpp> 

namespace MeleyLair
{
	int stoneSpawnPos[MOBCOUNT_RESPAWN_STONE_STEP2][2] =
	{
		{140, 131},
		{130, 122},
		{121, 128},
		{128, 140}
	};
	
	int monsterSpawnPos[MOBCOUNT_RESPAWN_COMMON_STEP][2] =
	{
		{140, 131},
		{130, 122},
		{121, 128},
		{128, 140},
		{128, 142},
		{128, 131},
		{135, 130},
		{141, 126},
		{128, 122},
		{117, 127},
		{118, 136},
		{126, 142}
	};
	
	struct FNotice
	{
		FNotice(const char * psz) : m_psz(psz) {}
		void operator() (LPENTITY ent)
		{
			if (ent->IsType(ENTITY_CHARACTER))
			{
				LPCHARACTER pkChar = (LPCHARACTER) ent;
				pkChar->ChatPacket(CHAT_TYPE_NOTICE, "%s", m_psz);
			}
		}
		
		const char * m_psz;
	};
	
	struct FExitAndGoTo
	{
		FExitAndGoTo() {};
		void operator()(LPENTITY ent)
		{
			if (ent->IsType(ENTITY_CHARACTER))
			{
				LPCHARACTER pkChar = (LPCHARACTER) ent;
				if (pkChar->IsPC())
				{
					PIXEL_POSITION posSub = CMgr::instance().GetSubXYZ();
					if (!posSub.x)
						pkChar->WarpSet(EMPIRE_START_X(pkChar->GetEmpire()), EMPIRE_START_Y(pkChar->GetEmpire()));
					else
						pkChar->WarpSet(posSub.x, posSub.y);
				}
			}
		}
	};
	
	EVENTINFO(r_meleystatues_info)
	{
		bool	bFirst;
		CMgrMap*	pMap;
	};
	
	EVENTFUNC(r_meleystatues_event)
	{
		r_meleystatues_info* pEventInfo = dynamic_cast<r_meleystatues_info*>(event->info);
		if (pEventInfo)
		{
			if (pEventInfo->bFirst)
			{
				CMgrMap* pMap = pEventInfo->pMap;
				if (pMap)
					pMap->DungeonResult();
			}
			else
			{
				pEventInfo->bFirst = true;
				return PASSES_PER_SEC((DWORD)(MeleyLair::TIME_LIMIT_TO_KILL_STATUE));
			}
		}
		
		return 0;
	}
	
	EVENTINFO(r_meleylimit_info)
	{
		bool	bWarp;
		CMgrMap*	pMap;
	};
	
	EVENTFUNC(r_meleylimit_event)
	{
		r_meleylimit_info* pEventInfo = dynamic_cast<r_meleylimit_info*>(event->info);
		if (pEventInfo)
		{
			CMgrMap* pMap = pEventInfo->pMap;
			if (pMap)
			{
				if (pEventInfo->bWarp)
					pMap->EndDungeonWarp();
				else
					pMap->EndDungeon(false, false);
			}
		}
		
		return 0;
	}
	
	EVENTINFO(r_meleyspawn_info)
	{
		CMgrMap*	pMap;
		bool	bFirst;
		BYTE	bStep;
		DWORD	dwTimeReload, dwMobVnum, dwMobCount;
	};
	
	EVENTFUNC(r_meleyspawn_event)
	{
		r_meleyspawn_info* pEventInfo = dynamic_cast<r_meleyspawn_info*>(event->info);
		if (!pEventInfo)
			return 0;
		
		CMgrMap* pMap = pEventInfo->pMap;
		if (!pMap)
			return 0;
		
		if (!pMap->GetMapSectree())
			return 0;
		
		DWORD dwTimeReload = pEventInfo->dwTimeReload, dwMobVnum = pEventInfo->dwMobVnum, dwMobCount = pEventInfo->dwMobCount;
		size_t mob_count = SECTREE_MANAGER::instance().GetMonsterCountInMap(pMap->GetMapIndex(), dwMobVnum, true);
		bool bRespawnCommon = dwMobCount > mob_count ? true : false;
		if (bRespawnCommon)
		{
			DWORD dwDiff = dwMobCount - mob_count;
			for (DWORD i = 0; i < dwDiff; ++i)
			{
				DWORD dwRandom = number(3, 10);
				pMap->Spawn(dwMobVnum, monsterSpawnPos[i][0], monsterSpawnPos[i][1] + dwRandom, 0);
			}
		}
		
		if ((pEventInfo->bStep == 2) || (pEventInfo->bStep == 3))
		{
			size_t stones_count = SECTREE_MANAGER::instance().GetMonsterCountInMap(pMap->GetMapIndex(), (DWORD)(MeleyLair::MOBVNUM_RESPAWN_STONE_STEP2), true);
			if (stones_count == 0)
			{
				DWORD dwTime = get_global_time();
				if (dwTime >= pMap->GetLastStoneKilledTime())
				{
					for (DWORD i = 0; i < MOBCOUNT_RESPAWN_STONE_STEP2; ++i)
					{
						DWORD dwRandom = number(3, 10);
						pMap->Spawn((DWORD)(MeleyLair::MOBVNUM_RESPAWN_STONE_STEP2), stoneSpawnPos[i][0], stoneSpawnPos[i][1] + dwRandom, 0);
					}
					
					if (pEventInfo->bStep == 3)
					{
						if (!pMap->GetStatue1Char()->IsAffectFlag(AFF_STATUE3))
							pMap->GetStatue1Char()->AddAffect(AFFECT_STATUE, POINT_NONE, 0, AFF_STATUE1, 3600, 0, true);
						
						if (!pMap->GetStatue2Char()->IsAffectFlag(AFF_STATUE3))
							pMap->GetStatue2Char()->AddAffect(AFFECT_STATUE, POINT_NONE, 0, AFF_STATUE1, 3600, 0, true);
						
						if (!pMap->GetStatue3Char()->IsAffectFlag(AFF_STATUE3))
							pMap->GetStatue3Char()->AddAffect(AFFECT_STATUE, POINT_NONE, 0, AFF_STATUE1, 3600, 0, true);
						
						if (!pMap->GetStatue4Char()->IsAffectFlag(AFF_STATUE3))
							pMap->GetStatue4Char()->AddAffect(AFFECT_STATUE, POINT_NONE, 0, AFF_STATUE1, 3600, 0, true);
						
						pMap->SetKillCountStones(0);
					}
					else
					{
						if (!pMap->GetStatue1Char()->IsAffectFlag(AFF_STATUE2))
							pMap->GetStatue1Char()->AddAffect(AFFECT_STATUE, POINT_NONE, 0, AFF_STATUE1, 3600, 0, true);
						
						if (!pMap->GetStatue2Char()->IsAffectFlag(AFF_STATUE2))
							pMap->GetStatue2Char()->AddAffect(AFFECT_STATUE, POINT_NONE, 0, AFF_STATUE1, 3600, 0, true);
						
						if (!pMap->GetStatue3Char()->IsAffectFlag(AFF_STATUE2))
							pMap->GetStatue3Char()->AddAffect(AFFECT_STATUE, POINT_NONE, 0, AFF_STATUE1, 3600, 0, true);
						
						if (!pMap->GetStatue4Char()->IsAffectFlag(AFF_STATUE2))
							pMap->GetStatue4Char()->AddAffect(AFFECT_STATUE, POINT_NONE, 0, AFF_STATUE1, 3600, 0, true);
					}
				}
			}
			
			if ((pEventInfo->bStep == 3) && (pEventInfo->bFirst))
			{
				for (DWORD i = 0; i < MOBCOUNT_RESPAWN_BOSS_STEP3; ++i)
				{
					DWORD dwRandom = number(3, 10);
					pMap->Spawn((DWORD)(MeleyLair::MOBVNUM_RESPAWN_BOSS_STEP3), stoneSpawnPos[i][0], stoneSpawnPos[i][1] + dwRandom, 0);
					pMap->Spawn((DWORD)(MeleyLair::MOBVNUM_RESPAWN_SUBBOSS_STEP3), stoneSpawnPos[i][0], stoneSpawnPos[i][1] + dwRandom, 0);
					pMap->Spawn((DWORD)(MeleyLair::MOBVNUM_RESPAWN_SUBBOSS_STEP3), stoneSpawnPos[i][0], stoneSpawnPos[i][1] + dwRandom, 0);
				}
				
				pEventInfo->bFirst = false;
			}
		}
		
		return PASSES_PER_SEC(dwTimeReload);
	}
	
	EVENTINFO(r_meleyeffect_info)
	{
		CMgrMap*	pMap;
		BYTE	bStep;
		BYTE	bEffectStep;
	};
	
	EVENTFUNC(r_meleyeffect_event)
	{
		r_meleyeffect_info* pEventInfo = dynamic_cast<r_meleyeffect_info*>(event->info);
		if (!pEventInfo)
			return 0;
		
		CMgrMap* pMap = pEventInfo->pMap;
		if (!pMap)
			return 0;
		
		if ((!pMap->GetBossChar()) || (!pMap->GetStatue1Char()) || (!pMap->GetStatue2Char()) || (!pMap->GetStatue3Char()) || (!pMap->GetStatue4Char()))
			return 0;
		
		BYTE bStep = pEventInfo->bStep, bEffectStep = pEventInfo->bEffectStep;
		if (bStep == 1)
		{
			if (bEffectStep == 1)
			{
				#ifdef __LASER_EFFECT_ON_75HP__
				time_t timeNow = static_cast<time_t>(get_dword_time());
				
				if (pMap->GetMapSectree())
				{
					PIXEL_POSITION pos = MeleyLair::CMgr::instance().GetXYZ();
					pos.x = pMap->GetMapSectree()->m_setting.iBaseX + 130 * 100;
					pos.y = pMap->GetMapSectree()->m_setting.iBaseY + 77 * 100;
					pos.z = 0;
					pMap->GetStatue1Char()->SetRotationToXY(pos.x, pos.y);
					pMap->GetStatue2Char()->SetRotationToXY(pos.x, pos.y);
					pMap->GetStatue3Char()->SetRotationToXY(pos.x, pos.y);
					pMap->GetStatue4Char()->SetRotationToXY(pos.x, pos.y);
				}
				
				pMap->GetStatue1Char()->SendMovePacket(FUNC_MOB_SKILL, 0, pMap->GetStatue1Char()->GetX(), pMap->GetStatue1Char()->GetY(), 0, timeNow);
				pMap->GetStatue2Char()->SendMovePacket(FUNC_MOB_SKILL, 0, pMap->GetStatue2Char()->GetX(), pMap->GetStatue2Char()->GetY(), 0, timeNow);
				pMap->GetStatue3Char()->SendMovePacket(FUNC_MOB_SKILL, 0, pMap->GetStatue3Char()->GetX(), pMap->GetStatue3Char()->GetY(), 0, timeNow);
				pMap->GetStatue4Char()->SendMovePacket(FUNC_MOB_SKILL, 0, pMap->GetStatue4Char()->GetX(), pMap->GetStatue4Char()->GetY(), 0, timeNow);
				#endif
				
				pEventInfo->bEffectStep = 2;
			}
			else
			{
				pMap->StartDungeonStep(2);
				return 0;
			}
		}
		else if (bStep == 2)
		{
			if (bEffectStep == 1)
			{
				#ifdef __LASER_EFFECT_ON_75HP__
				time_t timeNow = static_cast<time_t>(get_dword_time());
				
				if (pMap->GetMapSectree())
				{
					PIXEL_POSITION pos = MeleyLair::CMgr::instance().GetXYZ();
					pos.x = pMap->GetMapSectree()->m_setting.iBaseX + 130 * 100;
					pos.y = pMap->GetMapSectree()->m_setting.iBaseY + 77 * 100;
					pos.z = 0;
					pMap->GetStatue1Char()->SetRotationToXY(pos.x, pos.y);
					pMap->GetStatue2Char()->SetRotationToXY(pos.x, pos.y);
					pMap->GetStatue3Char()->SetRotationToXY(pos.x, pos.y);
					pMap->GetStatue4Char()->SetRotationToXY(pos.x, pos.y);
				}
				
				pMap->GetStatue1Char()->SendMovePacket(FUNC_MOB_SKILL, 0, pMap->GetStatue1Char()->GetX(), pMap->GetStatue1Char()->GetY(), 0, timeNow);
				pMap->GetStatue2Char()->SendMovePacket(FUNC_MOB_SKILL, 0, pMap->GetStatue2Char()->GetX(), pMap->GetStatue2Char()->GetY(), 0, timeNow);
				pMap->GetStatue3Char()->SendMovePacket(FUNC_MOB_SKILL, 0, pMap->GetStatue3Char()->GetX(), pMap->GetStatue3Char()->GetY(), 0, timeNow);
				pMap->GetStatue4Char()->SendMovePacket(FUNC_MOB_SKILL, 0, pMap->GetStatue4Char()->GetX(), pMap->GetStatue4Char()->GetY(), 0, timeNow);
				#endif
				
				pEventInfo->bEffectStep = 2;
			}
			else
			{
				pMap->StartDungeonStep(3);
				return 0;
			}
		}
		
		return PASSES_PER_SEC(5);
	}
	
	CMgrMap::CMgrMap(long lMapIndex, DWORD dwGuildID)
	{
		e_pEndEvent = NULL;
		e_pWarpEvent = NULL;
		e_SpawnEvent = NULL;
		e_SEffectEvent = NULL;
		e_DestroyStatues = NULL;
		v_Partecipants.clear();
		v_Already.clear();
		v_Rewards.clear();
		map_index = lMapIndex;
		guild_id = dwGuildID;
		dungeon_step = 0;
		reward = 0;
		pkSectreeMap = SECTREE_MANAGER::instance().GetMap(map_index);
		pkMainNPC = NULL, pkGate = NULL, pkBoss = NULL, pkStatue1 = NULL, pkStatue2 = NULL, pkStatue3 = NULL, pkStatue4 = NULL;
		Start();
	}
	
	CMgrMap::~CMgrMap()
	{
		if (e_pEndEvent != NULL)
			event_cancel(&e_pEndEvent);
		
		if (e_pWarpEvent != NULL)
			event_cancel(&e_pWarpEvent);
		
		if (e_SpawnEvent != NULL)
			event_cancel(&e_SpawnEvent);
		
		if (e_SEffectEvent != NULL)
			event_cancel(&e_SEffectEvent);
		
		if (e_DestroyStatues != NULL)
			event_cancel(&e_DestroyStatues);
	}
	
	void CMgrMap::Destroy()
	{
		if (e_pEndEvent != NULL)
			event_cancel(&e_pEndEvent);
		
		if (e_pWarpEvent != NULL)
			event_cancel(&e_pWarpEvent);
		
		if (e_SpawnEvent != NULL)
			event_cancel(&e_SpawnEvent);
		
		if (e_SEffectEvent != NULL)
			event_cancel(&e_SEffectEvent);
		
		if (e_DestroyStatues != NULL)
			event_cancel(&e_DestroyStatues);
		
		e_pEndEvent = NULL;
		e_pWarpEvent = NULL;
		e_SpawnEvent = NULL;
		e_SEffectEvent = NULL;
		e_DestroyStatues = NULL;
		v_Partecipants.clear();
		v_Already.clear();
		v_Rewards.clear();
		map_index = 0;
		guild_id = 0;
		dungeon_step = 0;
		reward = 0;
		pkSectreeMap = NULL;
		pkMainNPC = NULL, pkGate = NULL, pkBoss = NULL, pkStatue1 = NULL, pkStatue2 = NULL, pkStatue3 = NULL, pkStatue4 = NULL;
	}
	
	DWORD CMgrMap::GetPartecipantsCount() const
	{
		return v_Partecipants.size();
	}
	
	void CMgrMap::Partecipant(bool bInsert, DWORD dwPlayerID)
	{
		if (bInsert)
		{
			bool bCheck = std::find(v_Partecipants.begin(), v_Partecipants.end(), dwPlayerID) != v_Partecipants.end();
			if (!bCheck)
				v_Partecipants.push_back(dwPlayerID);
		}
		else
			v_Partecipants.erase(std::remove(v_Partecipants.begin(), v_Partecipants.end(), dwPlayerID), v_Partecipants.end());
	}
	
	bool CMgrMap::IsPartecipant(DWORD dwPlayerID)
	{
		bool bCheck = std::find(v_Partecipants.begin(), v_Partecipants.end(), dwPlayerID) != v_Partecipants.end();
		return bCheck;
	}
	
	LPCHARACTER CMgrMap::Spawn(DWORD dwVnum, int iX, int iY, int iDir, bool bSpawnMotion)
	{
		if (!pkSectreeMap)
			return NULL;
		
		LPCHARACTER pkMob = CHARACTER_MANAGER::instance().SpawnMob(dwVnum, GetMapIndex(), pkSectreeMap->m_setting.iBaseX + iX * 100, pkSectreeMap->m_setting.iBaseY + iY * 100, 0, bSpawnMotion, iDir == 0 ? -1 : (iDir - 1) * 45);
		if (pkMob)
			sys_log(0, "<MeleyLair> Spawn: %s (map index: %d).", pkMob->GetName(), GetMapIndex());
		
		return pkMob;
	}
	
	void CMgrMap::SetDungeonStep(BYTE bStep)
	{
		if (bStep == dungeon_step)
			return;
		
		dungeon_step = bStep;
		
		if (e_SpawnEvent != NULL)
			event_cancel(&e_SpawnEvent);
		
		e_SpawnEvent = NULL;
		
		if (bStep == 1)
		{
			SetDungeonTimeStart(get_global_time());
			SetKillCountStones(0);
			r_meleyspawn_info* pEventInfo = AllocEventInfo<r_meleyspawn_info>();
			pEventInfo->pMap = this;
			pEventInfo->bFirst = false;
			pEventInfo->bStep = bStep;
			pEventInfo->dwTimeReload = (DWORD)(TIME_RESPAWN_COMMON_STEP1);
			pEventInfo->dwMobVnum = (DWORD)(MOBVNUM_RESPAWN_COMMON_STEP1);
			pEventInfo->dwMobCount = (DWORD)(MOBCOUNT_RESPAWN_COMMON_STEP);
			e_SpawnEvent = event_create(r_meleyspawn_event, pEventInfo, PASSES_PER_SEC(1));
		}
		else if (bStep == 2)
		{
			if ((!pkBoss) || (!pkStatue1) || (!pkStatue2) || (!pkStatue3) || (!pkStatue4))
				EndDungeon(false, true);
			
			if (e_SEffectEvent != NULL)
				event_cancel(&e_SEffectEvent);
			
			e_SEffectEvent = NULL;
			
			r_meleyeffect_info* pEventInfo = AllocEventInfo<r_meleyeffect_info>();
			pEventInfo->pMap = this;
			pEventInfo->bStep = 1;
			pEventInfo->bEffectStep = 1;
			e_SEffectEvent = event_create(r_meleyeffect_event, pEventInfo, PASSES_PER_SEC(5));
		}
		else if (bStep == 3)
		{
			if ((!pkBoss) || (!pkStatue1) || (!pkStatue2) || (!pkStatue3) || (!pkStatue4))
				EndDungeon(false, true);
			
			if (e_SEffectEvent != NULL)
				event_cancel(&e_SEffectEvent);
			
			e_SEffectEvent = NULL;
			
			r_meleyeffect_info* pEventInfo = AllocEventInfo<r_meleyeffect_info>();
			pEventInfo->pMap = this;
			pEventInfo->bStep = 2;
			pEventInfo->bEffectStep = 1;
			e_SEffectEvent = event_create(r_meleyeffect_event, pEventInfo, PASSES_PER_SEC(5));
		}
		else if (bStep == 4)
		{
			if ((!pkBoss) || (!pkStatue1) || (!pkStatue2) || (!pkStatue3) || (!pkStatue4))
				EndDungeon(false, true);
			
			if (e_SEffectEvent != NULL)
				event_cancel(&e_SEffectEvent);
			
			if (e_DestroyStatues != NULL)
				event_cancel(&e_DestroyStatues);
			
			e_SEffectEvent = NULL;
			e_DestroyStatues = NULL;
			
			v_Already.clear();
			
			pkStatue1->SetArmada();
			pkStatue2->SetArmada();
			pkStatue3->SetArmada();
			pkStatue4->SetArmada();
			
			char szBuf[512];
			#ifdef __MULTI_LANGUAGE_SYSTEM__
			snprintf(szBuf, sizeof(szBuf), LC_TEXT(ENGLISH, "You have %d second(s) to destroy the statues, hurry up!"), TIME_LIMIT_TO_KILL_STATUE);
			#else
			snprintf(szBuf, sizeof(szBuf), LC_TEXT("You have %d second(s) to destroy the statues, hurry up!"), TIME_LIMIT_TO_KILL_STATUE);
			#endif
			FNotice f(szBuf);
			GetMapSectree()->for_each(f);
			
			r_meleystatues_info* pEventInfo = AllocEventInfo<r_meleystatues_info>();
			pEventInfo->bFirst = false;
			pEventInfo->pMap = this;
			e_DestroyStatues = event_create(r_meleystatues_event, pEventInfo, PASSES_PER_SEC(3));
		}
	}
	
	void CMgrMap::StartDungeonStep(BYTE bStep)
	{
		if (e_SpawnEvent != NULL)
			event_cancel(&e_SpawnEvent);
		
		if (e_SEffectEvent != NULL)
			event_cancel(&e_SEffectEvent);
		
		e_SpawnEvent = NULL;
		e_SEffectEvent = NULL;
		
		if (bStep == 2)
		{
			SetLastStoneKilledTime(0);
			r_meleyspawn_info* pEventInfo = AllocEventInfo<r_meleyspawn_info>();
			pEventInfo->pMap = this;
			pEventInfo->bFirst = false;
			pEventInfo->bStep = bStep;
			pEventInfo->dwTimeReload = (DWORD)(TIME_RESPAWN_COMMON_STEP2);
			pEventInfo->dwMobVnum = (DWORD)(MOBVNUM_RESPAWN_COMMON_STEP2);
			pEventInfo->dwMobCount = (DWORD)(MOBCOUNT_RESPAWN_COMMON_STEP);
			e_SpawnEvent = event_create(r_meleyspawn_event, pEventInfo, PASSES_PER_SEC(1));
		}
		else if (bStep == 3)
		{
			SetLastStoneKilledTime(0);
			SetKillCountStones(0);
			SetKillCountBosses(0);
			r_meleyspawn_info* pEventInfo = AllocEventInfo<r_meleyspawn_info>();
			pEventInfo->pMap = this;
			pEventInfo->bFirst = true;
			pEventInfo->bStep = bStep;
			pEventInfo->dwTimeReload = (DWORD)(TIME_RESPAWN_COMMON_STEP3);
			pEventInfo->dwMobVnum = (DWORD)(MOBVNUM_RESPAWN_COMMON_STEP3);
			pEventInfo->dwMobCount = (DWORD)(MOBCOUNT_RESPAWN_COMMON_STEP);
			e_SpawnEvent = event_create(r_meleyspawn_event, pEventInfo, PASSES_PER_SEC(1));
		}
	}
	
	void CMgrMap::Start()
	{
		if (!pkSectreeMap)
			EndDungeon(false, true);
		else
			pkMainNPC = Spawn((DWORD)(NPC_VNUM), 135, 179, 8), pkGate = Spawn((DWORD)(GATE_VNUM), 129, 175, 5), pkBoss = Spawn((DWORD)(BOSS_VNUM), 130, 77, 1), pkStatue1 = Spawn((DWORD)(STATUE_VNUM), 123, 137, 5, true), pkStatue2 = Spawn((DWORD)(STATUE_VNUM), 123, 124, 5, true), pkStatue3 = Spawn((DWORD)(STATUE_VNUM), 136, 123, 5, true), pkStatue4 = Spawn((DWORD)(STATUE_VNUM), 137, 137, 5, true);
	}
	
	void CMgrMap::StartDungeon(LPCHARACTER pkChar)
	{
		if (!IsPartecipant(pkChar->GetPlayerID()))
			return;
		else if (e_pEndEvent != NULL)
		{
			EndDungeon(false, true);
			return;
		}
		else if ((!pkMainNPC) || (!pkGate) || (!pkBoss) || (!pkStatue1) || (!pkStatue2) || (!pkStatue3) || (!pkStatue4))
		{
			EndDungeon(false, true);
			return;
		}
		
		CGuild* pkGuild = CGuildManager::instance().FindGuild(GetGuildID());
		if (!pkGuild)
			return;
		
		char szBuf1[512], szBuf2[512];
		#ifdef __MULTI_LANGUAGE_SYSTEM__
		snprintf(szBuf1, sizeof(szBuf1), LC_TEXT(ENGLISH, "<Guild> The fight against %s just start."), pkBoss->GetName());
		snprintf(szBuf2, sizeof(szBuf2), LC_TEXT(ENGLISH, "<Guild> The shelter's doors are now opened. The time limit is %d hour(s)."), (int)(TIME_LIMIT_DUNGEON / 3600));
		#else
		snprintf(szBuf1, sizeof(szBuf1), LC_TEXT("<Guild> The fight against %s just start."), pkBoss->GetName());
		snprintf(szBuf2, sizeof(szBuf2), LC_TEXT("<Guild> The shelter's doors are now opened. The time limit is %d hour(s)."), (int)(TIME_LIMIT_DUNGEON / 3600));
		#endif
		pkGuild->Chat(szBuf1);
		pkGuild->Chat(szBuf2);
		
		pkChar->SetQuestNPCID(0);
		pkGate->Dead();
		pkGate = NULL;
		
		SetDungeonStep(1);
		if (e_pEndEvent != NULL)
			event_cancel(&e_pEndEvent);
		
		r_meleylimit_info* pEventInfo = AllocEventInfo<r_meleylimit_info>();
		pEventInfo->pMap = this;
		pEventInfo->bWarp = false;
		e_pEndEvent = event_create(r_meleylimit_event, pEventInfo, PASSES_PER_SEC(TIME_LIMIT_DUNGEON));
	}
	
	void CMgrMap::EndDungeon(bool bSuccess, bool bGiveBack)
	{
		int iWarpTime = 0, iReturn = 0;
		CGuild* pkGuild = CGuildManager::instance().FindGuild(GetGuildID());
		if (pkGuild)
		{
			char szBuf1[512], szBuf2[512];
			if (bGiveBack)
			{
				if (bSuccess)
				{
					std::string time;
					DWORD dwNecessaryTime = get_global_time() - GetDungeonTimeStart();
					LogManager::instance().MeleyLog(GetGuildID(), GetPartecipantsCount(), dwNecessaryTime);
					int iM = (dwNecessaryTime / 60) % 60, iS = dwNecessaryTime % 60;
					if (iM > 0)
						#ifdef __MULTI_LANGUAGE_SYSTEM__
						time.append(boost::lexical_cast<std::string>(iM) + LC_TEXT(ENGLISH, " minute(s)"));
						#else
						time.append(boost::lexical_cast<std::string>(iM) + LC_TEXT(" minute(s)"));
						#endif
					
					if (iS > 0)
					{
						if (iM > 0)
							time.append(", ");
						
						#ifdef __MULTI_LANGUAGE_SYSTEM__
						time.append(boost::lexical_cast<std::string>(iS) + LC_TEXT(ENGLISH, " second(s)"));
						#else
						time.append(boost::lexical_cast<std::string>(iS) + LC_TEXT(" second(s)"));
						#endif
					}
					
					DWORD dwCoolDownTime = get_global_time() + COOLDOWN_DUNGEON + 5;
					pkGuild->SetDungeonCooldown(dwCoolDownTime);
					
					iWarpTime = 60;
					iReturn = (int)(LADDER_POINTS_COST);
					#ifdef __MULTI_LANGUAGE_SYSTEM__
					snprintf(szBuf1, sizeof(szBuf1), LC_TEXT(ENGLISH, "<Guild> Compliments, you defeated Meley, the Queen of the Dragons."));
					snprintf(szBuf2, sizeof(szBuf2), LC_TEXT(ENGLISH, "<Guild> Necessary time: %s."), time.c_str());
					#else
					snprintf(szBuf1, sizeof(szBuf1), LC_TEXT("<Guild> Compliments, you defeat Meley."));
					snprintf(szBuf2, sizeof(szBuf2), LC_TEXT("<Guild> Necessary time: %s."), time.c_str());
					#endif
				}
				else
				{
					iWarpTime = 10;
					iReturn = (int)(LADDER_POINTS_COST);
					#ifdef __MULTI_LANGUAGE_SYSTEM__
					snprintf(szBuf1, sizeof(szBuf1), LC_TEXT(ENGLISH, "<Guild> The dungeon can't be started, please contact our staff."));
					snprintf(szBuf2, sizeof(szBuf2), LC_TEXT(ENGLISH, "<Guild> %d ladder points will be returned."), iReturn);
					#else
					snprintf(szBuf1, sizeof(szBuf1), LC_TEXT("<Guild> The dungeon can't be started, please contact our staff."));
					snprintf(szBuf2, sizeof(szBuf2), LC_TEXT("<Guild> %d ladder points will be returned."), iReturn);
					#endif
				}
			}
			else
			{
				DWORD dwCoolDownTime = get_global_time() + COOLDOWN_DUNGEON + 5;
				pkGuild->SetDungeonCooldown(dwCoolDownTime);
				
				iWarpTime = 10;
				iReturn = (int)(LADDER_POINTS_RETURN);
				#ifdef __MULTI_LANGUAGE_SYSTEM__
				snprintf(szBuf1, sizeof(szBuf1), LC_TEXT(ENGLISH, "<Guild> The time limit to fight %s has ended."), pkBoss->GetName());
				snprintf(szBuf2, sizeof(szBuf2), ".");
				#else
				snprintf(szBuf1, sizeof(szBuf1), LC_TEXT("<Guild> The time limit to fight %s has ended."), pkBoss->GetName());
				snprintf(szBuf2, sizeof(szBuf2), ".");
				#endif
			}
			
			pkGuild->Chat(szBuf1);
			if (strlen(szBuf2) > 1)
				pkGuild->Chat(szBuf2);
			
			if (pkSectreeMap)
			{
				char szBuf[512];
				#ifdef __MULTI_LANGUAGE_SYSTEM__
				if (iWarpTime == 60)
					snprintf(szBuf, sizeof(szBuf), LC_TEXT(ENGLISH, "<Guild> For your safety, you will be teleported out of the refuge in %d second(s)."), iWarpTime);
				else
					snprintf(szBuf, sizeof(szBuf), LC_TEXT(ENGLISH, "<Guild> All the partecipants will be teleported out in %d seconds."), iWarpTime);
				#else
				if (iWarpTime == 60)
					snprintf(szBuf, sizeof(szBuf), LC_TEXT("<Guild> For your safety, you will be teleported out of the refuge in %d second(s)."), iWarpTime);
				else
					snprintf(szBuf, sizeof(szBuf), LC_TEXT("<Guild> All the partecipants will be teleported out in %d seconds."), iWarpTime);
				#endif
				
				pkGuild->Chat(szBuf);
			}
			
			if (iReturn)
			{
				DWORD dwCost = iReturn;
				pkGuild->ChangeLadderPoint(+dwCost);
				pkGuild->SetLadderPoint(pkGuild->GetLadderPoint() + dwCost);
			}
			
			pkGuild->RequestDungeon(0, 0);
		}
		
		if (!iWarpTime)
			EndDungeonWarp();
		else
		{
			if (e_pEndEvent != NULL)
				event_cancel(&e_pEndEvent);
			
			e_pEndEvent = NULL;
			
			if (e_pWarpEvent != NULL)
				event_cancel(&e_pWarpEvent);
			
			r_meleylimit_info* pEventInfo = AllocEventInfo<r_meleylimit_info>();
			pEventInfo->pMap = this;
			pEventInfo->bWarp = true;
			e_pWarpEvent = event_create(r_meleylimit_event, pEventInfo, PASSES_PER_SEC(iWarpTime));
		}
	}
	
	void CMgrMap::EndDungeonWarp()
	{
		if (pkSectreeMap)
		{
			FExitAndGoTo f;
			pkSectreeMap->for_each(f);
		}
		
		CMgr::instance().Remove(GetGuildID());
		SECTREE_MANAGER::instance().DestroyPrivateMap(GetMapIndex());
		Destroy();
		M2_DELETE(this);
	}
	
	bool CMgrMap::Damage(LPCHARACTER pkStatue)
	{
		BYTE bStep = GetDungeonStep();
		if ((!bStep) || ((pkStatue != pkStatue1) && (pkStatue != pkStatue2) && (pkStatue != pkStatue3) && (pkStatue != pkStatue4)))
			return false;
		else if ((pkStatue->IsAffectFlag(AFF_STATUE1)) || pkStatue->IsAffectFlag(AFF_STATUE2) || pkStatue->IsAffectFlag(AFF_STATUE3) || pkStatue->IsAffectFlag(AFF_STATUE4))
			return false;
		
		int iHPCalc = 0;
		if (bStep == 1)
			iHPCalc = pkStatue->GetMaxHP() * 75 / 100;
		else if (bStep == 2)
			iHPCalc = pkStatue->GetMaxHP() * 50 / 100;
		else if (bStep == 3)
			iHPCalc = pkStatue->GetMaxHP() * 10 / 100;
		
		if (pkStatue->GetHP() <= iHPCalc)
		{
			int iCalc = iHPCalc - pkStatue->GetHP();
			pkStatue->PointChange(POINT_HP, iCalc);
			if (bStep == 1)
			{
				if (!pkStatue->IsAffectFlag(AFF_STATUE1))
					pkStatue->AddAffect(AFFECT_STATUE, POINT_NONE, 0, AFF_STATUE1, 3600, 0, true);
				
				bool bNextStep = ((pkStatue1->IsAffectFlag(AFF_STATUE1)) && (pkStatue2->IsAffectFlag(AFF_STATUE1)) && (pkStatue3->IsAffectFlag(AFF_STATUE1)) && (pkStatue4->IsAffectFlag(AFF_STATUE1))) ? true : false;
				if (bNextStep)
					SetDungeonStep(2);
				
				return false;
			}
			else if (bStep == 2)
			{
				if (!pkStatue->IsAffectFlag(AFF_STATUE2))
					pkStatue->AddAffect(AFFECT_STATUE, POINT_NONE, 0, AFF_STATUE2, 3600, 0, true);
				
				bool bNextStep = ((pkStatue1->IsAffectFlag(AFF_STATUE2)) && (pkStatue2->IsAffectFlag(AFF_STATUE2)) && (pkStatue3->IsAffectFlag(AFF_STATUE2)) && (pkStatue4->IsAffectFlag(AFF_STATUE2))) ? true : false;
				if (bNextStep)
					SetDungeonStep(3);
				
				return false;
			}
			else if (bStep == 3)
			{
				if (!pkStatue->IsAffectFlag(AFF_STATUE3))
					pkStatue->AddAffect(AFFECT_STATUE, POINT_NONE, 0, AFF_STATUE3, 3600, 0, true);
				
				bool bNextStep = ((pkStatue1->IsAffectFlag(AFF_STATUE3)) && (pkStatue2->IsAffectFlag(AFF_STATUE3)) && (pkStatue3->IsAffectFlag(AFF_STATUE3)) && (pkStatue4->IsAffectFlag(AFF_STATUE3))) ? true : false;
				if (bNextStep)
					SetDungeonStep(4);
				
				return false;
			}
		}
		
		return true;
	}
	
	void CMgrMap::OnKill(DWORD dwVnum)
	{
		BYTE bStep = GetDungeonStep();
		if ((!bStep) || ((!pkStatue1) || (!pkStatue2) || (!pkStatue3) || (!pkStatue4)))
			return;
		
		if (((bStep == 2) || (bStep == 3)) && (dwVnum == (DWORD)(MOBVNUM_RESPAWN_STONE_STEP2)))
		{
			DWORD dwLimit = (DWORD)(MOBCOUNT_RESPAWN_STONE_STEP2) - 1;
			if (GetKillCountStones() >= dwLimit)
			{
				if (bStep == 2)
					SetKillCountStones(0);
				else
					SetKillCountStones(GetKillCountStones() + 1);
				
				DWORD dwRandomMin = number(2, 4);
				DWORD dwLastKilledTime = get_global_time() + (60 * dwRandomMin);
				SetLastStoneKilledTime(dwLastKilledTime);
				
				bool bDoAff = true;
				if (bStep == 3)
				{
					DWORD dwLimit2 = (DWORD)(MOBCOUNT_RESPAWN_BOSS_STEP3);
					if (GetKillCountBosses() >= dwLimit2)
						SetKillCountStones(0);
					else
						bDoAff = false;
				}
				
				if (bDoAff)
				{
					if ((pkStatue1->IsAffectFlag(AFF_STATUE1)) || ((bStep == 3) && (pkStatue1->IsAffectFlag(AFF_STATUE2))))
						pkStatue1->RemoveAffect(AFFECT_STATUE);
					
					if ((pkStatue2->IsAffectFlag(AFF_STATUE1)) || ((bStep == 3) && (pkStatue2->IsAffectFlag(AFF_STATUE2))))
						pkStatue2->RemoveAffect(AFFECT_STATUE);
					
					if ((pkStatue3->IsAffectFlag(AFF_STATUE1)) || ((bStep == 3) && (pkStatue3->IsAffectFlag(AFF_STATUE2))))
						pkStatue3->RemoveAffect(AFFECT_STATUE);
					
					if ((pkStatue4->IsAffectFlag(AFF_STATUE1)) || ((bStep == 3) && (pkStatue4->IsAffectFlag(AFF_STATUE2))))
						pkStatue4->RemoveAffect(AFFECT_STATUE);
				}
			}
			else
				SetKillCountStones(GetKillCountStones() + 1);
		}
		else if ((bStep == 3) && (dwVnum == (DWORD)(MOBVNUM_RESPAWN_BOSS_STEP3)))
		{
			DWORD dwLimit = (DWORD)(MOBCOUNT_RESPAWN_BOSS_STEP3) - 1;
			if (GetKillCountBosses() >= dwLimit)
			{
				SetKillCountBosses(GetKillCountBosses() + 1);
				
				bool bDoAff = true;
				DWORD dwLimit2 = (DWORD)(MOBCOUNT_RESPAWN_STONE_STEP2);
				if (GetKillCountStones() >= dwLimit2)
					SetKillCountStones(0);
				else
					bDoAff = false;
				
				if (bDoAff)
				{
					if ((pkStatue1->IsAffectFlag(AFF_STATUE1)) || (pkStatue1->IsAffectFlag(AFF_STATUE2)))
						pkStatue1->RemoveAffect(AFFECT_STATUE);
					
					if ((pkStatue2->IsAffectFlag(AFF_STATUE1)) || (pkStatue2->IsAffectFlag(AFF_STATUE2)))
						pkStatue2->RemoveAffect(AFFECT_STATUE);
					
					if ((pkStatue3->IsAffectFlag(AFF_STATUE1)) || (pkStatue3->IsAffectFlag(AFF_STATUE2)))
						pkStatue3->RemoveAffect(AFFECT_STATUE);
					
					if ((pkStatue4->IsAffectFlag(AFF_STATUE1)) || (pkStatue4->IsAffectFlag(AFF_STATUE2)))
						pkStatue4->RemoveAffect(AFFECT_STATUE);
				}
			}
			else
				SetKillCountBosses(GetKillCountBosses() + 1);
		}
	}
	
	void CMgrMap::OnKillStatue(LPITEM pkItem, LPCHARACTER pkChar, LPCHARACTER pkStatue)
	{
		BYTE bStep = GetDungeonStep();
		if ((!pkItem) || (!pkChar) || (!pkStatue) || (bStep != 4) || (!pkBoss) || ((!pkStatue1) || (!pkStatue2) || (!pkStatue3) || (!pkStatue4)))
			return;
		
		bool bNextStep = (((pkStatue1->IsAffectFlag(AFF_STATUE3)) || (pkStatue1->IsAffectFlag(AFF_STATUE4))) && ((pkStatue2->IsAffectFlag(AFF_STATUE3)) || (pkStatue2->IsAffectFlag(AFF_STATUE4))) && ((pkStatue3->IsAffectFlag(AFF_STATUE3)) || (pkStatue3->IsAffectFlag(AFF_STATUE4))) && ((pkStatue4->IsAffectFlag(AFF_STATUE3)) || (pkStatue4->IsAffectFlag(AFF_STATUE4)))) ? true : false;
		if (!bNextStep)
			return;
		
		if (pkStatue->IsAffectFlag(AFF_STATUE4))
			return;
		
		DWORD dwPlayerID = pkChar->GetPlayerID();
		bool bCheck = std::find(v_Already.begin(), v_Already.end(), dwPlayerID) != v_Already.end();
		#ifdef __DESTROY_INFINITE_STATUES_GM__
		if ((bCheck) && (pkChar->GetGMLevel() <= GM_PLAYER))
		#else
		if (bCheck)
		#endif
			return;
		else
		{
			#ifdef __DESTROY_INFINITE_STATUES_GM__
			if (!bCheck)
				v_Already.push_back(dwPlayerID);
			#else
			v_Already.push_back(dwPlayerID);
			#endif
		}
		
		ITEM_MANAGER::instance().RemoveItem(pkItem);
		pkStatue->RemoveAffect(AFFECT_STATUE);
		pkStatue->AddAffect(AFFECT_STATUE, POINT_NONE, 0, AFF_STATUE4, 3600, 0, true);
		bool bNextStepPass = ((pkStatue1->IsAffectFlag(AFF_STATUE4)) && (pkStatue2->IsAffectFlag(AFF_STATUE4)) && (pkStatue3->IsAffectFlag(AFF_STATUE4)) && (pkStatue4->IsAffectFlag(AFF_STATUE4))) ? true : false;
		if (bNextStepPass)
			DungeonResult();
	}
	
	void CMgrMap::DungeonResult()
	{
		if (e_DestroyStatues != NULL)
			event_cancel(&e_DestroyStatues);
		
		e_DestroyStatues = NULL;
		bool bNextStep = ((pkStatue1->IsAffectFlag(AFF_STATUE4)) && (pkStatue2->IsAffectFlag(AFF_STATUE4)) && (pkStatue3->IsAffectFlag(AFF_STATUE4)) && (pkStatue4->IsAffectFlag(AFF_STATUE4))) ? true : false;
		if (!bNextStep)
		{
			EndDungeon(false, false);
		}
		else
		{
			v_Rewards.clear();
			SetRewardTime(get_global_time() + 10);
			pkStatue1->Dead();
			pkStatue2->Dead();
			pkStatue3->Dead();
			pkStatue4->Dead();
			pkBoss->Dead();
			
			Spawn(CHEST_VNUM, 130, 130, 1);
			
			EndDungeon(true, true);
		}
	}
	
	bool CMgrMap::CheckRewarder(DWORD dwPlayerID)
	{
		bool bCheck = std::find(v_Rewards.begin(), v_Rewards.end(), dwPlayerID) != v_Rewards.end();
		return bCheck;
	}
	
	void CMgrMap::GiveReward(LPCHARACTER pkChar, BYTE bReward)
	{
		DWORD dwPlayerID = pkChar->GetPlayerID();
		if (!IsPartecipant(dwPlayerID))
			return;
		else if (CheckRewarder(dwPlayerID))
			return;
		
		v_Rewards.push_back(dwPlayerID);
		DWORD dwVnumReward = bReward == 1 ? REWARD_ITEMCHEST_VNUM_1 : REWARD_ITEMCHEST_VNUM_2;
		pkChar->AutoGiveItem(dwVnumReward, 1);
	}
	
	void CMgr::Initialize()
	{
		m_RegGuilds.clear();
		SetXYZ(0, 0, 0);
		SetSubXYZ(0, 0, 0);
	}
	
	void CMgr::Destroy()
	{
		itertype(m_RegGuilds) iter = m_RegGuilds.begin();
		for (; iter != m_RegGuilds.end(); ++iter)
		{
			CMgrMap* pMap = iter->second;
			SECTREE_MANAGER::instance().DestroyPrivateMap(pMap->GetMapIndex());
			pMap->Destroy();
			M2_DELETE(pMap);
		}
		
		m_RegGuilds.clear();
		SetXYZ(0, 0, 0);
		SetSubXYZ(0, 0, 0);
	}
	
	bool CMgr::isRegistered(CGuild* pkGuild, int & iCH)
	{
		iCH = 0;
		if (pkGuild)
		{
			long lMinIndex = MAP_INDEX * 10000, lMaxIndex = MAP_INDEX * 10000 + 10000;
			if ((pkGuild->GetDungeonMapIndex() >= lMinIndex) && (pkGuild->GetDungeonMapIndex() <= lMaxIndex))
			{
				iCH = pkGuild->GetDungeonCH();
				return true;
			}
		}
		
		return false;
	}
	
	void CMgr::Register(LPCHARACTER pkChar, int & iRes1, int & iRes2)
	{
		iRes1 = 0;
		iRes2 = 0;
		if (!pkChar)
			return;
		
		CGuild* pkGuild = pkChar->GetGuild();
		if (!pkGuild)
			return;
		else if (pkGuild->GetMasterPID() != pkChar->GetPlayerID())
			return;
		
		int iCH;
		if (isRegistered(pkGuild, iCH))
		{
			iRes1 = 1;
			iRes2 = iCH;
			return;
		}
		else if (pkGuild->GetDungeonCH())
		{
			iRes1 = 2;
			iRes2 = 0;
			return;
		}
		else if (pkGuild->GetLevel() < MIN_LVL)
		{
			iRes1 = 3;
			iRes2 = (int)(MIN_LVL);
			return;
		}
		else if (pkGuild->GetLadderPoint() < LADDER_POINTS_COST)
		{
			iRes1 = 4;
			iRes2 = (int)(LADDER_POINTS_COST);
			return;
		}
		
		DWORD dwTimeNow = get_global_time();
		if ((pkGuild->GetDungeonCooldown() > dwTimeNow) && (!pkGuild->GetDungeonCH()))
		{
			int iDif = pkGuild->GetDungeonCooldown() - dwTimeNow;
			iRes1 = 7;
			iRes2 = iDif;
			return;
		}
		
		long lNormalMapIndex = (long)(MAP_INDEX);
		long lMapIndex = SECTREE_MANAGER::instance().CreatePrivateMap(lNormalMapIndex);
		if (!lMapIndex)
		{
			iRes1 = 5;
			return;
		}
		
		DWORD dwCost = (DWORD)(LADDER_POINTS_COST);
		pkGuild->ChangeLadderPoint(-dwCost);
		pkGuild->SetLadderPoint(pkGuild->GetLadderPoint() - dwCost);
		
		PIXEL_POSITION pos = GetXYZ(), posSub = GetSubXYZ();
		if (!pos.x)
		{
			LPSECTREE_MAP pkSectreeMap = SECTREE_MANAGER::instance().GetMap((long)(MeleyLair::MAP_INDEX));
			if (pkSectreeMap)
				SetXYZ(pkSectreeMap->m_setting.iBaseX + 130 * 100, pkSectreeMap->m_setting.iBaseY + 130 * 100, 0);
		}
		
		if (!posSub.x)
		{
			LPSECTREE_MAP pkSectreeMap = SECTREE_MANAGER::instance().GetMap((long)(MeleyLair::SUBMAP_INDEX));
			if (pkSectreeMap)
				SetSubXYZ(pkSectreeMap->m_setting.iBaseX + 87 * 100, pkSectreeMap->m_setting.iBaseY + 853 * 100, 0);
		}
		
		pkGuild->RequestDungeon(g_bChannel, lMapIndex);
		pkGuild->SetDungeonCooldown(0);
		m_RegGuilds.insert(std::make_pair(pkGuild->GetID(), M2_NEW CMgrMap(lMapIndex, pkGuild->GetID())));
		
		iRes1 = 6;
		iRes2 = (int)(LADDER_POINTS_RETURN);
	}
	
	bool CMgr::Enter(CGuild* pkGuild, LPCHARACTER pkChar, int & iLimit)
	{
		iLimit = 0;
		if ((pkGuild) && (pkChar))
		{
			DWORD dwGuildID = pkGuild->GetID();
			if (m_RegGuilds.find(dwGuildID) == m_RegGuilds.end())
			{
				BYTE bCH = pkGuild->GetDungeonCH();
				if ((bCH) && (g_bChannel != bCH))
				{
					iLimit = pkGuild->GetDungeonCH();
					return false;
				}
				else if (g_bChannel != pkGuild->GetDungeonCH())
					return false;
				
				long lNormalMapIndex = (long)(MAP_INDEX);
				long lMapIndex = SECTREE_MANAGER::instance().CreatePrivateMap(lNormalMapIndex);
				if (!lMapIndex)
				{
					DWORD dwCost = (DWORD)(LADDER_POINTS_COST);
					pkGuild->ChangeLadderPoint(+dwCost);
					pkGuild->SetLadderPoint(pkGuild->GetLadderPoint() + dwCost);
					return false;
				}
				
				PIXEL_POSITION pos = GetXYZ(), posSub = GetSubXYZ();
				if (!pos.x)
				{
					LPSECTREE_MAP pkSectreeMap = SECTREE_MANAGER::instance().GetMap((long)(MeleyLair::MAP_INDEX));
					if (pkSectreeMap)
						SetXYZ(pkSectreeMap->m_setting.iBaseX + 130 * 100, pkSectreeMap->m_setting.iBaseY + 130 * 100, 0);
				}
				
				if (!posSub.x)
				{
					LPSECTREE_MAP pkSectreeMap = SECTREE_MANAGER::instance().GetMap((long)(MeleyLair::SUBMAP_INDEX));
					if (pkSectreeMap)
						SetSubXYZ(pkSectreeMap->m_setting.iBaseX + 87 * 100, pkSectreeMap->m_setting.iBaseY + 853 * 100, 0);
				}
				
				pkGuild->RequestDungeon(g_bChannel, lMapIndex);
				m_RegGuilds.insert(std::make_pair(dwGuildID, M2_NEW CMgrMap(lMapIndex, dwGuildID)));
			}
			
			CMgrMap* pMap = m_RegGuilds.find(dwGuildID)->second;
			if (!pMap)
				return false;
			else if (pMap->GetPartecipantsCount() >= PARTECIPANTS_LIMIT)
			{
				iLimit = 1;
				return true;
			}
			else if (pMap->GetDungeonStep() >= 4)
			{
				iLimit = 3;
				return true;
			}
			else if (pkChar->GetPKMode() != PK_MODE_GUILD)
			{
				iLimit = 4;
				return true;
			}
			
			PIXEL_POSITION mPos;
			if (!SECTREE_MANAGER::instance().GetRecallPositionByEmpire((int)(MAP_INDEX), 0, mPos))
			{
				iLimit = 2;
				return true;
			}
			
			pMap->Partecipant(true, pkChar->GetPlayerID());
			pkChar->SaveExitLocation();
			pkChar->WarpSet(mPos.x, mPos.y, pMap->GetMapIndex());
			return true;
		}
		
		return false;
	}
	
	void CMgr::Leave(CGuild* pkGuild, LPCHARACTER pkChar, bool bSendOut)
	{
		if (!pkChar)
			return;
		
		if (pkGuild)
		{
			DWORD dwGuildID = pkGuild->GetID();
			if (m_RegGuilds.find(dwGuildID) != m_RegGuilds.end())
			{
				CMgrMap* pMap = m_RegGuilds.find(dwGuildID)->second;
				if (pMap)
				{
					if (!bSendOut)
					{
						if (pkChar->GetMapIndex() == pMap->GetMapIndex())
							pMap->Partecipant(false, pkChar->GetPlayerID());
					}
					else if (!pMap->IsPartecipant(pkChar->GetPlayerID()))
						WarpOut(pkChar);
				}
				else
					WarpOut(pkChar);
			}
			else
				WarpOut(pkChar);
		}
		else if (bSendOut)
			WarpOut(pkChar);
	}
	
	void CMgr::LeaveRequest(CGuild* pkGuild, LPCHARACTER pkChar)
	{
		if (!pkChar)
			return;
		
		if (pkGuild)
		{
			DWORD dwGuildID = pkGuild->GetID();
			if (m_RegGuilds.find(dwGuildID) != m_RegGuilds.end())
			{
				CMgrMap* pMap = m_RegGuilds.find(dwGuildID)->second;
				if (pMap)
				{
					if (pMap->IsPartecipant(pkChar->GetPlayerID()))
						pMap->Partecipant(false, pkChar->GetPlayerID());
					
					WarpOut(pkChar);
				}
				else
					WarpOut(pkChar);
			}
			else
				WarpOut(pkChar);
		}
		else
			WarpOut(pkChar);
	}
	
	bool CMgr::IsMeleyMap(long lMapIndex)
	{
		long lMinIndex = (long)(MAP_INDEX) * 10000, lMaxIndex = (long)(MAP_INDEX) * 10000 + 10000;
		if (((lMapIndex >= lMinIndex) && (lMapIndex <= lMaxIndex)) || (lMapIndex == (long)(MAP_INDEX)))
			return true;
		
		return false;
	}
	
	void CMgr::Check(CGuild* pkGuild, LPCHARACTER pkChar)
	{
		if (!pkChar)
			return;
		
		if (pkGuild)
		{
			DWORD dwGuildID = pkGuild->GetID();
			if (m_RegGuilds.find(dwGuildID) != m_RegGuilds.end())
			{
				CMgrMap* pMap = m_RegGuilds.find(dwGuildID)->second;
				if (pMap)
				{
					if (!pMap->IsPartecipant(pkChar->GetPlayerID()))
						WarpOut(pkChar);
				}
				else
					WarpOut(pkChar);
			}
			else
				WarpOut(pkChar);
		}
		else
			WarpOut(pkChar);
	}
	
	void CMgr::WarpOut(LPCHARACTER pkChar)
	{
		if (!pkChar)
			return;
		
		PIXEL_POSITION posSub = GetSubXYZ();
		if (!posSub.x)
			pkChar->WarpSet(EMPIRE_START_X(pkChar->GetEmpire()), EMPIRE_START_Y(pkChar->GetEmpire()));
		else
			pkChar->WarpSet(posSub.x, posSub.y);
	}
	
	void CMgr::Start(LPCHARACTER pkChar, CGuild* pkGuild)
	{
		if ((!pkChar) || (!pkGuild))
			return;
		
		CMgrMap* pMap = m_RegGuilds.find(pkGuild->GetID())->second;
		if (pMap)
			pMap->StartDungeon(pkChar);
	}
	
	bool CMgr::Damage(LPCHARACTER pkStatue, CGuild* pkGuild)
	{
		if ((!pkStatue) || (!pkGuild))
			return false;
		
		CMgrMap* pMap = m_RegGuilds.find(pkGuild->GetID())->second;
		if (!pMap)
			return false;
		
		return pMap->Damage(pkStatue);
	}
	
	void CMgr::Remove(DWORD dwGuildID)
	{
		itertype(m_RegGuilds) iter = m_RegGuilds.find(dwGuildID), iterEnd = m_RegGuilds.end();
		if (iter != iterEnd)
			m_RegGuilds.erase(iter, iterEnd);
	}
	
	void CMgr::OnKill(DWORD dwVnum, CGuild* pkGuild)
	{
		if ((!dwVnum) || (!pkGuild))
			return;
		
		CMgrMap* pMap = m_RegGuilds.find(pkGuild->GetID())->second;
		if (!pMap)
			return;
		
		pMap->OnKill(dwVnum);
	}
	
	void CMgr::OnKillStatue(LPITEM pkItem, LPCHARACTER pkChar, LPCHARACTER pkStatue, CGuild* pkGuild)
	{
		if ((!pkItem) || (!pkChar) || (!pkStatue) || (!pkGuild))
			return;
		
		if (pkItem->GetOriginalVnum() != (DWORD)(SEAL_VNUM_KILL_STATUE))
			return;
		
		CMgrMap* pMap = m_RegGuilds.find(pkGuild->GetID())->second;
		if (!pMap)
			return;
		else if (!pMap->IsPartecipant(pkChar->GetPlayerID()))
			return;
		
		pMap->OnKillStatue(pkItem, pkChar, pkStatue);
	}
	
	void CMgr::OnKillCommon(LPCHARACTER pkMonster, LPCHARACTER pkChar, CGuild* pkGuild)
	{
		if ((!pkMonster) || (!pkChar) || (!pkGuild))
			return;
		
		CMgrMap* pMap = m_RegGuilds.find(pkGuild->GetID())->second;
		if (!pMap)
			return;
		else if (!pMap->IsPartecipant(pkChar->GetPlayerID()))
			return;
		else if (pMap->GetDungeonStep() < 3)
			return;
		
		int iChance = number(1, 100);
		if (iChance > 70)
		{
			LPITEM pkItem = ITEM_MANAGER::instance().CreateItem(SEAL_VNUM_KILL_STATUE);
			if (!pkItem)
				return;
			
			PIXEL_POSITION mPos;
			mPos.x = pkMonster->GetX();
			mPos.y = pkMonster->GetY();
			
			pkItem->AddToGround(pMap->GetMapIndex(), mPos);
			pkItem->StartDestroyEvent();
			pkItem->SetOwnership(pkChar, 60);
		}
	}
	
	bool CMgr::CanGetReward(LPCHARACTER pkChar, CGuild* pkGuild)
	{
		if ((!pkChar) || (!pkGuild))
			return false;
		
		CMgrMap* pMap = m_RegGuilds.find(pkGuild->GetID())->second;
		if (!pMap)
			return false;
		else if (!pMap->IsPartecipant(pkChar->GetPlayerID()))
			return false;
		else if (pMap->GetDungeonStep() != 4)
			return false;
		
		DWORD dwTime = get_global_time();
		if (pMap->GetRewardTime() > dwTime)
			return false;
		else if (pMap->CheckRewarder(pkChar->GetPlayerID()))
			return false;
		
		return true;
	}
	
	void CMgr::Reward(LPCHARACTER pkChar, CGuild* pkGuild, BYTE bReward)
	{
		if ((!pkChar) || (!pkGuild))
			return;
		
		CMgrMap* pMap = m_RegGuilds.find(pkGuild->GetID())->second;
		if (!pMap)
			return;
		
		pMap->GiveReward(pkChar, bReward);
	}
	
	void CMgr::OpenRanking(LPCHARACTER pkChar)
	{
		if (!pkChar)
			return;
		
		std::auto_ptr<SQLMsg> pMsg(DBManager::Instance().DirectQuery("SELECT * FROM log.meley_dungeon%s ORDER BY time ASC, partecipants ASC, date ASC LIMIT 5;", get_table_postfix()));
		if (pMsg->Get()->uiNumRows == 0)
		{
			pkChar->ChatPacket(CHAT_TYPE_COMMAND, "meley_open");
			return;
		}
		else
		{
			pkChar->ChatPacket(CHAT_TYPE_COMMAND, "meley_open");
			int iLine = 0;
			MYSQL_ROW mRow;
			while (NULL != (mRow = mysql_fetch_row(pMsg->Get()->pSQLResult)))
			{
				int iCur = 0;
				DWORD dwGuildID = 0, dwPartecipants = 0, dwTime = 0;
				str_to_number(dwGuildID, mRow[iCur++]);
				str_to_number(dwPartecipants, mRow[iCur++]);
				str_to_number(dwTime, mRow[iCur]);
				CGuild* pkGuild = CGuildManager::instance().FindGuild(dwGuildID);
				if (!pkGuild)
					continue;
				
				pkChar->ChatPacket(CHAT_TYPE_COMMAND, "meley_rank #%d#%s#%d#%d#", iLine, pkGuild->GetName(), dwPartecipants, dwTime);
				iLine++;
			}
		}
	}
	
	void CMgr::MemberRemoved(LPCHARACTER pkChar, CGuild* pkGuild)
	{
		if ((!pkChar) || (!pkGuild))
			return;
		
		if (!MeleyLair::CMgr::instance().IsMeleyMap(pkChar->GetMapIndex()))
			return;
		
		DWORD dwGuildID = pkGuild->GetID();
		if (m_RegGuilds.find(dwGuildID) != m_RegGuilds.end())
		{
			CMgrMap* pMap = m_RegGuilds.find(dwGuildID)->second;
			if (pMap)
			{
				if (pMap->IsPartecipant(pkChar->GetPlayerID()))
					pMap->Partecipant(false, pkChar->GetPlayerID());
				
				WarpOut(pkChar);
			}
		}
	}
	
	void CMgr::GuildRemoved(CGuild* pkGuild)
	{
		if (!pkGuild)
			return;
		
		DWORD dwGuildID = pkGuild->GetID();
		if (m_RegGuilds.find(dwGuildID) != m_RegGuilds.end())
		{
			CMgrMap* pMap = m_RegGuilds.find(dwGuildID)->second;
			if (pMap)
				pMap->EndDungeonWarp();
		}
	}
};
#endif
Multumesc J4!
Avatar utilizator
[RaKu]
Membru Club

Membru Club
Mesaje: 2137
Membru din: 30 Noi 2016, 21:49
Regat: Jinno
Aprecieri: 202  
Mulţumiri: 424  
Discord: Copiază ID
Medalii

Incearca acesta rezolvare pusa de mine : post658062.html#p658062
Pentru acest mesaj, [RaKu] for the post:
marsavu123
Avatar utilizator
marsavu123
Nou Venit

Nou Venit
Mesaje: 36
Membru din: 07 Sep 2016, 15:36
Server: OldKings
Regat: Jinno
Aprecieri: 49  
Mulţumiri: 0
Medalii

Rezolvat Mersi Raku ! Cer T/C
Avatar utilizator
[Brahma]
Veteran

Veteran
Mesaje: 1526
Membru din: 16 Mai 2017, 22:18
Aprecieri: 0
Mulţumiri: 2309  
Medalii

Topic trimis la cereri rezolvate
Rezolvat de [RaKu]
Imagine
Afișează semnătura
Închis

Înapoi la “Cereri Rezolvate”

  • Informaţie
  • Cine este conectat

    Utilizatori ce ce navighează pe acest forum: Niciun utilizator înregistrat și 11 vizitatori