#include "StdAfx.h" #ifdef _NA_007992_20150127_EVENT_MONSTER_INVASION #include "MonsterInvasionEvent.h" #include "GameZoneManager.h" #include "GameZone.h" #include "TriggerManagerEx.h" #include "ServerOptionParserEx.h" MonsterInvasionEvent::MonsterInvasionEvent() { insvasion_event_map.clear(); villages_state_map.clear(); } void MonsterInvasionEvent::Init() { SunEventInfoParser* eventinfo_parser = SunEventInfoParser::Instance(); EVENTINFO_MAP* event_map = eventinfo_parser->GetEventInfoMap(); EVENTINFO_MAP_ITER itend = event_map->end(); EVENTINFO_MAP_ITER it = event_map->begin(); while(it != itend) { EVENT_INFO& eventInfo = it->second; if (eEVENT_MONSTER_INVASION == eventInfo.m_byEventMode) { AddEvent(eventInfo); } ++it; } } BOOL MonsterInvasionEvent::AddEvent( EVENT_INFO& event_info ) { if (FindEvent(event_info) != NULL) { SUNLOG(eCRITICAL_LOG, "["__FUNCTION__"] Aready Exist Invasion Event!! [id:%d]", event_info.m_dwEventID); return FALSE; } insvasion_event_map.insert(EVENTINFO_PAIR(event_info.m_dwEventID, event_info)); //¿©±â¼± npccode¿¡ mapcode°¡ ÀԷµǾîÀÖ´Ù villages_state_map.insert(VILLAGE_EVENT_STATE_PAIR((MAPCODE)event_info.m_NpcCode, eVILLAGE_STATE_NORMAL)); return TRUE; } EVENT_INFO* MonsterInvasionEvent::FindEvent( const EVENT_INFO& event_info ) { EVENTINFO_MAP_ITER itr = insvasion_event_map.find(event_info.m_dwEventID); if (itr == insvasion_event_map.end()) { return NULL; } return &(itr->second); } BOOL MonsterInvasionEvent::EventUpdate(DWORD cur_time_hhmm) { EVENTINFO_MAP_ITER itr = insvasion_event_map.begin(); while (itr != insvasion_event_map.end()) { EVENT_INFO& event_info = itr->second; //PeakTime(´çÀÏ ½ÃÀÛ/Á¾·á½Ã°£) °Ë»ç if (event_info.CheckEvent() == TRUE && _isTimeToStartEvent(cur_time_hhmm, event_info) == TRUE) { StartMonsterInvasion(event_info.m_NpcCode); } else { _ChangeVillageEventState(event_info.m_NpcCode, eVILLAGE_STATE_NORMAL); } ++itr; } return TRUE; } BOOL MonsterInvasionEvent::_isTimeToStartEvent( DWORD cur_time_hhmm, EVENT_INFO& event_info ) { const DWORD startTime = event_info.m_wPeakTimeStart; const DWORD endTime = event_info.m_wPeakTimeEnd; return ( startTime <= cur_time_hhmm && cur_time_hhmm <= endTime ) ? TRUE : FALSE; } BOOL MonsterInvasionEvent::SendInvasionEventTriggerToVillage(const MAPCODE& map_code) { GameZone* village_zone = g_GameZoneManager.GetFieldVillageZone(map_code); if (village_zone == NULL) { return FALSE; } if (village_zone->GetZoneType() != eZONETYPE_VILLAGE) { //¸¶À»ÀÌ ¾Æ´Ï¸é ¸®ÅÏ return FALSE; } GameField* village_field = village_zone->GetEntryField(); if (village_field == NULL) { return FALSE; } //Æ®¸®°Å¸Þ½ÃÁöº¸³½´Ù TRIGGER_SERVER_EVENT trigger_msg; trigger_msg.event_id = 1; village_field->GetTriggerManager()->OnMsg(&trigger_msg); return TRUE; } VOID MonsterInvasionEvent::_ChangeVillageEventState( MAPCODE map_code, eVILLAGE_EVENT_STATE state ) { VILLAGE_EVENT_STATE_MAP_ITER itr = villages_state_map.find(map_code); if (itr == villages_state_map.end()) { return ; } if (itr->second != state) { itr->second = state; } } MonsterInvasionEvent::eVILLAGE_EVENT_STATE MonsterInvasionEvent::GetVillageEventState( const MAPCODE& map_code ) { VILLAGE_EVENT_STATE_MAP_ITER itr = villages_state_map.find(map_code); if (itr == villages_state_map.end()) { return eVILLAGE_STATE_NONE; } return itr->second; } BOOL MonsterInvasionEvent::StartMonsterInvasion( const CODETYPE& map_code, const BOOL& is_gm_command /*= FALSE*/ ) { BYTE channel_id = ServerOptionParserEx::Instance()->GetServerOption().monster_invasion_channel; if (is_gm_command == FALSE && g_pGameServer->GetKey().GetChannelID() != channel_id) { return FALSE; } MAPCODE village_map_code = (MAPCODE)map_code; eVILLAGE_EVENT_STATE state = GetVillageEventState(village_map_code); if (state != eVILLAGE_STATE_NORMAL) { //¸¸¾à ÇØ´ç ¸¶À»¿¡¼­ ÀÌ¹Ì À̺¥Æ®°¡ ÁøÇàÁßÀÌ¸é ½ÇÇà½ÃŰÁö¾Ê´Â´Ù return FALSE; } //¸ó½ºÅÍ Ä§°ø¿¡¼­´Â NPC code¸¦ ¸ÊÄÚµå(¸¶À»ÄÚµå)·Î »ç¿ëÇÑ´Ù if (SendInvasionEventTriggerToVillage(village_map_code) == TRUE && is_gm_command == FALSE) { _ChangeVillageEventState(map_code, eVILLAGE_STATE_EVENT_PROGRESS); return TRUE; } else if(is_gm_command == TRUE) { return TRUE; } return FALSE; } #endif //_NA_007992_20150127_EVENT_MONSTER_INVASION