/* * 몬스터 AI 함수들을 BattleAI 클래스로 수정 */ int OnIdleDefault(TRIGGERPARAM) { if (ch->OnIdle()) return PASSES_PER_SEC(1); return PASSES_PER_SEC(1); }
void CItem::StartUniqueExpireEvent() { if (GetType() != ITEM_UNIQUE) return; if (m_pkUniqueExpireEvent) return; //±â°£Á¦ ¾ÆÀÌÅÛÀÏ °æ¿ì ½Ã°£Á¦ ¾ÆÀÌÅÛÀº µ¿ÀÛÇÏÁö ¾Ê´Â´Ù if (IsRealTimeItem()) return; // HARD CODING if (GetVnum() == UNIQUE_ITEM_HIDE_ALIGNMENT_TITLE) m_pOwner->ShowAlignment(false); int iSec = GetSocket(ITEM_SOCKET_UNIQUE_SAVE_TIME); if (iSec == 0) iSec = 60; else iSec = MIN(iSec, 60); SetSocket(ITEM_SOCKET_UNIQUE_SAVE_TIME, 0); item_event_info* info = AllocEventInfo<item_event_info>(); info->item = this; SetUniqueExpireEvent(event_create(unique_expire_event, info, PASSES_PER_SEC(iSec))); }
// ЅГ°Ј ИДєТБ¦ // timer_based_on_wear_expire_event јіён ВьБ¶ void CItem::StartTimerBasedOnWearExpireEvent() { if (m_pkTimerBasedOnWearExpireEvent) return; //±в°ЈБ¦ ѕЖАМЕЫАП °жїм ЅГ°ЈБ¦ ѕЖАМЕЫАє µїАЫЗПБц ѕКґВґЩ if (IsRealTimeItem()) return; if (-1 == GetProto()->cLimitTimerBasedOnWearIndex) return; int iSec = GetSocket(0); // іІАє ЅГ°ЈА» єРґЬА§·О Іч±в А§ЗШ... if (0 != iSec) { iSec %= 60; if (0 == iSec) iSec = 60; } item_event_info* info = AllocEventInfo<item_event_info>(); info->item = this; SetTimerBasedOnWearExpireEvent(event_create(timer_based_on_wear_expire_event, info, PASSES_PER_SEC(iSec))); }
void CWarMap::CheckWarEnd() { if (m_bEnded) return; if (m_TeamData[0].iMemberCount == 0 || m_TeamData[1].iMemberCount == 0) { if (m_bTimeout) return; if (m_pkTimeoutEvent) return; Notice(LC_TEXT("길드전에 참가한 상대방 길드원이 아무도 없습니다.")); Notice(LC_TEXT("1분 이내에 아무도 접속하지 않으면 길드전이 자동 종료됩니다.")); sys_log(0, "CheckWarEnd: Timeout begin %u vs %u", m_TeamData[0].dwID, m_TeamData[1].dwID); war_map_info* info = AllocEventInfo<war_map_info>(); info->pWarMap = this; SetTimeoutEvent(event_create(war_timeout_event, info, PASSES_PER_SEC(60))); } else CheckScore(); }
CWarMap::CWarMap(long lMapIndex, const TGuildWarInfo & r_info, TWarMapInfo * pkWarMapInfo, DWORD dwGuildID1, DWORD dwGuildID2) { m_kMapInfo = *pkWarMapInfo; m_kMapInfo.lMapIndex = lMapIndex; memcpy(&m_WarInfo, &r_info, sizeof(TGuildWarInfo)); m_TeamData[0].Initialize(); m_TeamData[0].dwID = dwGuildID1; m_TeamData[0].pkGuild = CGuildManager::instance().TouchGuild(dwGuildID1); m_TeamData[1].Initialize(); m_TeamData[1].dwID = dwGuildID2; m_TeamData[1].pkGuild = CGuildManager::instance().TouchGuild(dwGuildID2); m_iObserverCount = 0; war_map_info* info = AllocEventInfo<war_map_info>(); info->pWarMap = this; SetBeginEvent(event_create(war_begin_event, info, PASSES_PER_SEC(60))); m_pkEndEvent = NULL; m_pkTimeoutEvent = NULL; m_pkResetFlagEvent = NULL; m_bTimeout = false; m_dwStartTime = get_dword_time(); m_bEnded = false; if (GetType() == WAR_MAP_TYPE_FLAG) { AddFlagBase(0); AddFlagBase(1); AddFlag(0); AddFlag(1); } }
// ½Ã°£ ÈĺÒÁ¦ // timer_based_on_wear_expire_event ¼³¸í ÂüÁ¶ void CItem::StartTimerBasedOnWearExpireEvent() { if (m_pkTimerBasedOnWearExpireEvent) return; //±â°£Á¦ ¾ÆÀÌÅÛÀÏ °æ¿ì ½Ã°£Á¦ ¾ÆÀÌÅÛÀº µ¿ÀÛÇÏÁö ¾Ê´Â´Ù if (IsRealTimeItem()) return; if (-1 == GetProto()->cLimitTimerBasedOnWearIndex) return; int iSec = GetSocket(0); // ³²Àº ½Ã°£À» ºÐ´ÜÀ§·Î ²÷±â À§ÇØ... if (0 != iSec) { iSec %= 60; if (0 == iSec) iSec = 60; } item_event_info* info = AllocEventInfo<item_event_info>(); info->item = this; SetTimerBasedOnWearExpireEvent(event_create(timer_based_on_wear_expire_event, info, PASSES_PER_SEC(iSec))); }
void CItem::StartAccessorySocketExpireEvent() { if (!IsAccessoryForSocket()) return; if (m_pkAccessorySocketExpireEvent) return; if (GetAccessorySocketMaxGrade() == 0) return; if (GetAccessorySocketGrade() == 0) return; int iSec = GetAccessorySocketDownGradeTime(); SetAccessorySocketExpireEvent(NULL); if (iSec <= 1) iSec = 5; else iSec = MIN(iSec, 60); item_vid_event_info* info = AllocEventInfo<item_vid_event_info>(); info->item_vid = GetVID(); SetAccessorySocketExpireEvent(event_create(accessory_socket_expire_event, info, PASSES_PER_SEC(iSec))); }
void CParty::Link(LPCHARACTER pkChr) { TMemberMap::iterator it; if (pkChr->IsPC()) it = m_memberMap.find(pkChr->GetPlayerID()); else it = m_memberMap.find(pkChr->GetVID()); if (it == m_memberMap.end()) { sys_err("%s is not member of this party", pkChr->GetName()); return; } // 플레이어 파티일 경우 업데이트 이벤트 생성 if (m_bPCParty && !m_eventUpdate) { party_update_event_info* info = AllocEventInfo<party_update_event_info>(); info->pid = m_dwLeaderPID; m_eventUpdate = event_create(party_update_event, info, PASSES_PER_SEC(3)); } if (it->second.bRole == PARTY_ROLE_LEADER) m_pkChrLeader = pkChr; sys_log(2, "PARTY[%d] %s linked to party", GetLeaderPID(), pkChr->GetName()); it->second.pCharacter = pkChr; pkChr->SetParty(this); if (pkChr->IsPC()) { if (it->second.strName.empty()) { it->second.strName = pkChr->GetName(); } SendPartyJoinOneToAll(pkChr->GetPlayerID()); SendPartyJoinAllToOne(pkChr); SendPartyLinkOneToAll(pkChr); SendPartyLinkAllToOne(pkChr); SendPartyInfoAllToOne(pkChr); SendPartyInfoOneToAll(pkChr); SendParameter(pkChr); //sys_log(0, "PARTY-DUNGEON connect %p %p", this, GetDungeon()); if (GetDungeon() && GetDungeon()->GetMapIndex() == pkChr->GetMapIndex()) { pkChr->SetDungeon(GetDungeon()); } RequestSetMemberLevel(pkChr->GetPlayerID(), pkChr->GetLevel()); } }
void CItem::StartDestroyEvent(int iSec) { if (m_pkDestroyEvent) return; item_event_info* info = AllocEventInfo<item_event_info>(); info->item = this; SetDestroyEvent(event_create(item_destroy_event, info, PASSES_PER_SEC(iSec))); }
void ShutdownOnFatalError() { if (!g_bShutdown) { sys_err("ShutdownOnFatalError!!!!!!!!!!"); { char buf[256]; enhance_strlcpymt(buf, LC_TEXT("ј№цїЎ ДЎёнАыАО їА·щ°Ў №Я»эЗПї© АЪµїАё·О АзєОЖГµЛґПґЩ."), sizeof(buf)); SendNotice(buf); enhance_strlcpymt(buf, LC_TEXT("10ГКИД АЪµїАё·О БўјУАМ Бѕ·бµЗёз,"), sizeof(buf)); SendNotice(buf); enhance_strlcpymt(buf, LC_TEXT("5єР ИДїЎ Б¤»уАыАё·О БўјУЗПЅЗјц АЦЅАґПґЩ."), sizeof(buf)); SendNotice(buf); } g_bShutdown = true; g_bNoMoreClient = true; g_shutdown_disconnect_pulse = thecore_pulse() + PASSES_PER_SEC(10); g_shutdown_disconnect_force_pulse = thecore_pulse() + PASSES_PER_SEC(20); g_shutdown_core_pulse = thecore_pulse() + PASSES_PER_SEC(30); } }
void CItem::SetOwnership(LPCHARACTER ch, int iSec) { if (!ch) { if (m_pkOwnershipEvent) { event_cancel(&m_pkOwnershipEvent); m_dwOwnershipPID = 0; TPacketGCItemOwnership p; p.bHeader = HEADER_GC_ITEM_OWNERSHIP; p.dwVID = m_dwVID; p.szName[0] = '\0'; PacketAround(&p, sizeof(p)); } return; } if (m_pkOwnershipEvent) return; if (true == LC_IsEurope()) { if (iSec <= 10) iSec = 30; } m_dwOwnershipPID = ch->GetPlayerID(); item_event_info* info = AllocEventInfo<item_event_info>(); strlcpy(info->szOwnerName, ch->GetName(), sizeof(info->szOwnerName)); info->item = this; SetOwnershipEvent(event_create(ownership_event, info, PASSES_PER_SEC(iSec))); TPacketGCItemOwnership p; p.bHeader = HEADER_GC_ITEM_OWNERSHIP; p.dwVID = m_dwVID; strlcpy(p.szName, ch->GetName(), sizeof(p.szName)); PacketAround(&p, sizeof(p)); }
LPEVENT quest_create_server_timer_event(const char * name, double when, unsigned int timernpc, bool loop, unsigned int arg) { const int nameCapacity = strlen(name) + 1; long ltime_cycle = (long) (rint(PASSES_PER_SEC(when))); quest_server_event_info* info = AllocEventInfo<quest_server_event_info>(); info->npc_id = timernpc; info->time_cycle = loop ? ltime_cycle : 0; info->arg = arg; info->name = M2_NEW char[nameCapacity]; if (info->name) enhance_strlcpymt(info->name, name, nameCapacity); return event_create(quest_server_timer_event, info, ltime_cycle); }
void CItem::StartRealTimeExpireEvent() { if (m_pkRealTimeExpireEvent) return; for (int i=0 ; i < ITEM_LIMIT_MAX_NUM ; i++) { if (LIMIT_REAL_TIME == GetProto()->aLimits[i].bType || LIMIT_REAL_TIME_START_FIRST_USE == GetProto()->aLimits[i].bType) { item_vid_event_info* info = AllocEventInfo<item_vid_event_info>(); info->item_vid = GetVID(); m_pkRealTimeExpireEvent = event_create( real_time_expire_event, info, PASSES_PER_SEC(1)); sys_log(0, "REAL_TIME_EXPIRE: StartRealTimeExpireEvent"); return; } } }
LPEVENT quest_create_timer_event(const char * name, unsigned int player_id, double when, unsigned int npc_id, bool loop) { const int nameCapacity = strlen(name) + 1; long ltime_cycle = (int) (rint(PASSES_PER_SEC(when))); quest_event_info* info = AllocEventInfo<quest_event_info>(); info->player_id = player_id; info->npc_id = npc_id; info->name = M2_NEW char[nameCapacity]; if (info->name) enhance_strlcpymt(info->name, name, nameCapacity); sys_log(0, "QUEST timer name %s cycle %d pc %u npc %u loop? %d", name ? name : "<noname>", ltime_cycle, player_id, npc_id, loop ? 1 : 0); info->time_cycle = loop ? ltime_cycle : 0; return event_create(quest_timer_event, info, ltime_cycle); }
bool CWarMap::SetEnded() { sys_log(0, "WarMap::SetEnded %d", m_kMapInfo.lMapIndex); if (m_pkEndEvent) return false; if (m_TeamData[0].pkChrFlag) { M2_DESTROY_CHARACTER(m_TeamData[0].pkChrFlag); m_TeamData[0].pkChrFlag = NULL; } if (m_TeamData[0].pkChrFlagBase) { M2_DESTROY_CHARACTER(m_TeamData[0].pkChrFlagBase); m_TeamData[0].pkChrFlagBase = NULL; } if (m_TeamData[1].pkChrFlag) { M2_DESTROY_CHARACTER(m_TeamData[1].pkChrFlag); m_TeamData[1].pkChrFlag = NULL; } if (m_TeamData[1].pkChrFlagBase) { M2_DESTROY_CHARACTER(m_TeamData[1].pkChrFlagBase); m_TeamData[1].pkChrFlagBase = NULL; } event_cancel(&m_pkResetFlagEvent); m_bEnded = true; war_map_info* info = AllocEventInfo<war_map_info>(); info->pWarMap = this; info->iStep = 0; SetEndEvent(event_create(war_end_event, info, PASSES_PER_SEC(10))); return true; }
int horse_set_name(lua_State* L) { // 리턴값 // 0 : 소유한 말이 없다 // 1 : 잘못된 이름이다 // 2 : 이름 바꾸기 성공 if ( lua_isstring(L, -1) != true ) return 0; LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr(); if ( ch->GetHorseLevel() > 0 ) { const char* pHorseName = lua_tostring(L, -1); if ( pHorseName == NULL || check_name(pHorseName) == 0 ) { lua_pushnumber(L, 1); } else { int nHorseNameDuration = test_server == true ? 60*5 : 60*60*24*30; ch->SetQuestFlag("horse_name.valid_till", get_global_time() + nHorseNameDuration); ch->AddAffect(AFFECT_HORSE_NAME, 0, 0, 0, PASSES_PER_SEC(nHorseNameDuration), 0, true); CHorseNameManager::instance().UpdateHorseName(ch->GetPlayerID(), lua_tostring(L, -1), true); ch->HorseSummon(false, true); ch->HorseSummon(true, true); lua_pushnumber(L, 2); } } else { lua_pushnumber(L, 0); } return 1; }
void CDragonLairManager::OnDragonDead(LPCHARACTER pDragon, DWORD KillerGuildID) { if (NULL == pDragon) return; if (false == pDragon->IsMonster()) return; boost::unordered_map<DWORD, CDragonLair*>::iterator iter = LairMap_.find( KillerGuildID ); if (LairMap_.end() == iter) { return; } LPSECTREE_MAP pMap = SECTREE_MANAGER::instance().GetMap( pDragon->GetMapIndex() ); if (NULL == iter->second || NULL == pMap) { LairMap_.erase( iter ); return; } iter->second->OnDragonDead( pDragon ); // ѕЦµй ґЩ БэАё·О єёі»°н ёК ѕшѕЦ±в tag_DragonLair_Collapse_EventInfo* info; info = AllocEventInfo<tag_DragonLair_Collapse_EventInfo>(); info->step = 0; info->pLair = iter->second; info->InstanceMapIndex = pDragon->GetMapIndex(); event_create(DragonLair_Collapse_Event, info, PASSES_PER_SEC(10)); LairMap_.erase( iter ); }
void CWarMap::ResetFlag() { if (m_kMapInfo.bType != WAR_MAP_TYPE_FLAG) return; if (m_pkResetFlagEvent) return; if (m_bEnded) return; FRemoveFlagAffect f; std::for_each(m_set_pkChr.begin(), m_set_pkChr.end(), f); RemoveFlag(0); RemoveFlag(1); war_map_info* info = AllocEventInfo<war_map_info>(); info->pWarMap = this; info->iStep = 0; SetResetFlagEvent(event_create(war_reset_flag_event, info, PASSES_PER_SEC(10))); }
void CTargetManager::CreateTarget(DWORD dwPID, DWORD dwQuestIndex, const char * c_pszTargetName, int iType, int iArg1, int iArg2, int iMapIndex, const char * c_pszTargetDesc, int iSendFlag) { sys_log(0, "CreateTarget : target pid %u quest %u name %s arg %d %d %d", dwPID, dwQuestIndex, c_pszTargetName, iType, iArg1, iArg2); LPCHARACTER pkChr = CHARACTER_MANAGER::instance().FindByPID(dwPID); if (!pkChr) { sys_err("Cannot find character ptr by PID %u", dwPID); return; } if (pkChr->GetMapIndex() != iMapIndex) return; itertype(m_map_kListEvent) it = m_map_kListEvent.find(dwPID); if (it != m_map_kListEvent.end()) { std::list<LPEVENT>::const_iterator it2 = it->second.begin(); while (it2 != it->second.end()) { LPEVENT pkEvent = *(it2++); TargetInfo* existInfo = dynamic_cast<TargetInfo*>(pkEvent->info); if (NULL == existInfo) { sys_err("CreateTarget : event already exist, but have no info"); return; } if (existInfo->dwQuestIndex == dwQuestIndex && !strcmp(existInfo->szTargetName, c_pszTargetName)) { sys_log(0, "CreateTarget : same target will be replaced"); if (existInfo->bSendToClient) SendTargetDeletePacket(pkChr->GetDesc(), existInfo->iID); if (c_pszTargetDesc) { strlcpy(existInfo->szTargetDesc, c_pszTargetDesc, sizeof(existInfo->szTargetDesc)); } else { *existInfo->szTargetDesc = '\0'; } existInfo->iID = ++m_iID; existInfo->iType = iType; existInfo->iArg1 = iArg1; existInfo->iArg2 = iArg2; existInfo->iOldX = 0; existInfo->iOldY = 0; existInfo->bSendToClient = iSendFlag ? true : false; SendTargetCreatePacket(pkChr->GetDesc(), existInfo); return; } } } TargetInfo* newInfo = AllocEventInfo<TargetInfo>(); if (c_pszTargetDesc) { strlcpy(newInfo->szTargetDesc, c_pszTargetDesc, sizeof(newInfo->szTargetDesc)); } else { *newInfo->szTargetDesc = '\0'; } newInfo->iID = ++m_iID; // <Factor> Removed pkChr //newInfo->pkChr = pkChr; newInfo->dwPID = dwPID; newInfo->dwQuestIndex = dwQuestIndex; strlcpy(newInfo->szTargetName, c_pszTargetName, sizeof(newInfo->szTargetName)); newInfo->iType = iType; newInfo->iArg1 = iArg1; newInfo->iArg2 = iArg2; newInfo->iMapIndex = iMapIndex; newInfo->iOldX = 0; newInfo->iOldY = 0; newInfo->bSendToClient = iSendFlag ? true : false; LPEVENT event = event_create(target_event, newInfo, PASSES_PER_SEC(1)); if (NULL != event) { m_map_kListEvent[dwPID].push_back(event); SendTargetCreatePacket(pkChr->GetDesc(), newInfo); } }
void heartbeat(LPHEART ht, int pulse) { DWORD t; t = get_dword_time(); num_events_called += event_process(pulse); s_dwProfiler[PROF_EVENT] += (get_dword_time() - t); t = get_dword_time(); // 1ГКё¶ґЩ if (!(pulse % ht->passes_per_sec)) { #ifdef ENABLE_LIMIT_TIME if ((unsigned)get_global_time() >= GLOBAL_LIMIT_TIME) { g_bShutdown = true; } #endif if (!g_bAuthServer) { TPlayerCountPacket pack; pack.dwCount = DESC_MANAGER::instance().GetLocalUserCount(); db_clientdesc->DBPacket(HEADER_GD_PLAYER_COUNT, 0, &pack, sizeof(TPlayerCountPacket)); } else DESC_MANAGER::instance().ProcessExpiredLoginKey(); int count = 0; std::map<DWORD, CLoginSim *>::const_iterator it = g_sim.begin(); while (it != g_sim.end()) { if (!it->second->IsCheck()) { it->second->SendLogin(); if (++count > 50) { sys_log(0, "FLUSH_SENT"); break; } } it++; } if (save_idx < g_vec_save.size()) { count = MIN(100, g_vec_save.size() - save_idx); for (int i = 0; i < count; ++i, ++save_idx) db_clientdesc->DBPacket(HEADER_GD_PLAYER_SAVE, 0, &g_vec_save[save_idx], sizeof(TPlayerTable)); sys_log(0, "SAVE_FLUSH %d", count); } } // // 25 PPS(Pulse per second) ¶у°н °ЎБ¤ЗТ ¶§ // // ѕа 1.16ГКё¶ґЩ if (!(pulse % (passes_per_sec + 4))) CHARACTER_MANAGER::instance().ProcessDelayedSave(); //4ГК ё¶ґЩ #if defined (__FreeBSD__) && defined(__FILEMONITOR__) if (!(pulse % (passes_per_sec * 5))) { FileMonitorFreeBSD::Instance().Update(pulse); } #endif // ѕа 5.08ГКё¶ґЩ if (!(pulse % (passes_per_sec * 5 + 2))) { ITEM_MANAGER::instance().Update(); DESC_MANAGER::instance().UpdateLocalUserCount(); } s_dwProfiler[PROF_HEARTBEAT] += (get_dword_time() - t); DBManager::instance().Process(); AccountDB::instance().Process(); CPVPManager::instance().Process(); if (g_bShutdown) { if (thecore_pulse() > g_shutdown_disconnect_pulse) { const DESC_MANAGER::DESC_SET & c_set_desc = DESC_MANAGER::instance().GetClientSet(); std::for_each(c_set_desc.begin(), c_set_desc.end(), ::SendDisconnectFunc()); g_shutdown_disconnect_pulse = INT_MAX; } else if (thecore_pulse() > g_shutdown_disconnect_force_pulse) { const DESC_MANAGER::DESC_SET & c_set_desc = DESC_MANAGER::instance().GetClientSet(); std::for_each(c_set_desc.begin(), c_set_desc.end(), ::DisconnectFunc()); } else if (thecore_pulse() > g_shutdown_disconnect_force_pulse + PASSES_PER_SEC(5)) { thecore_shutdown(); } } }
void CThreeWayWar::onDead(LPCHARACTER pChar, LPCHARACTER pkKiller) { if (false == pChar->IsPC()) return; if (GM_PLAYER != pChar->GetGMLevel() && false == test_server) return; if (-1 == GetRegenFlag()) return; DecreaseReviveTokenForPlayer( pChar->GetPlayerID() ); if (false == IsSungZiMapIndex(pChar->GetMapIndex())) return; if (NULL == pkKiller || true != pkKiller->IsPC()) return; // °°Ає Б¦±№Ає °и»кЗПБц ѕКАЅ if (pChar->GetEmpire() == pkKiller->GetEmpire()) return; int nKillScore = GetKillScore(pkKiller->GetEmpire()); // Б¦±№ Еі ЅєДЪѕо°Ў -1АП°жїмґВ Е»¶ф±№°ЎА̱⶧№®їЎ БЎјц ГјЕ©ё¦ ЗПёй ѕИµИґЩ. if (nKillScore >= 0) { nKillScore += GetKillValue(pChar->GetLevel()); SetKillScore(pkKiller->GetEmpire(), nKillScore); } if (nKillScore != 0 && (test_server || (nKillScore % 5) == 0)) { char szBuf[64 + 1]; snprintf(szBuf, sizeof(szBuf), LC_TEXT("ЗцАз ЅєДЪѕо ЅЕјц±№:%d ГµБ¶±№:%d Бшіл±№:%d"), GetKillScore(1), GetKillScore(2), GetKillScore(3)); SendNoticeMap(szBuf, GetSungziMapIndex(), false); } const int nVictoryScore = quest::CQuestManager::instance().GetEventFlag("threeway_war_kill_count"); if (0 == GetRegenFlag()) { int nEliminatedEmpireCount = 0; BYTE bLoseEmpire = 0; for (int n = 1; n < 4; ++n) { if (nVictoryScore > GetKillScore(n)) { ++nEliminatedEmpireCount; bLoseEmpire = n; } } if (1 != nEliminatedEmpireCount) return; //---------------------- //Д«їоЖ® ГК±вИ //---------------------- SetKillScore(1, 0); SetKillScore(2, 0); SetKillScore(3, 0); SetKillScore(bLoseEmpire, -1); quest::warp_all_to_map_my_empire_event_info * info; //---------------------- //Е»¶ф±№°Ў ЕрАе ЅГЕ°±в : јєБцїЎј //---------------------- info = AllocEventInfo<quest::warp_all_to_map_my_empire_event_info>(); info->m_lMapIndexFrom = GetSungziMapIndex(); info->m_lMapIndexTo = EMPIRE_START_MAP(bLoseEmpire); info->m_x = EMPIRE_START_X(bLoseEmpire); info->m_y = EMPIRE_START_Y(bLoseEmpire); info->m_bEmpire = bLoseEmpire; event_create(quest::warp_all_to_map_my_empire_event, info, PASSES_PER_SEC(10)); //---------------------- //Е»¶ф±№°Ў ЕрАе ЅГЕ°±в : Ел·ОїЎј //---------------------- info = AllocEventInfo<quest::warp_all_to_map_my_empire_event_info>(); info->m_lMapIndexFrom = GetPassMapIndex(bLoseEmpire); info->m_lMapIndexTo = EMPIRE_START_MAP(bLoseEmpire); info->m_x = EMPIRE_START_X(bLoseEmpire); info->m_y = EMPIRE_START_Y(bLoseEmpire); info->m_bEmpire = bLoseEmpire; event_create(quest::warp_all_to_map_my_empire_event, info, PASSES_PER_SEC(10)); //---------------------- //јєБцїЎ ЖГ±вґВ ±№°ЎїЎ ґлЗС АМѕЯ±вё¦ ё¶їХАМ ЗФ! //---------------------- const std::string Nation(EMPIRE_NAME(bLoseEmpire)); const std::string Script( LC_TEXT("јєБцАЗ ё¶їХ: іКИс ") + Nation + LC_TEXT("іај®µйАє АМ°ч јєБцїЎ АЦА» АЪ°ЭА» АТѕъґЩ. ёрµО јєБцїЎј №°·ЇіЄ°Е¶у~~[ENTER][ENTER] 10ГК ИДїЎ ёрµО ё¶А»·О АМµїЗП°Ф µЛґПґЩ. ") + "[ENTER][DONE]" ); CHARACTER_MANAGER::instance().SendScriptToMap(pChar->GetMapIndex(), Script); //---------------------- // °шБц ЗС№ж іЇ·ББЬ. //---------------------- char szNotice[512+1]; snprintf(szNotice, sizeof(szNotice), LC_TEXT("»п°Её® АьЕхїЎј %s ±№°Ў°Ў °ЎАеёХАъ Е»¶фА» ЗПїґЅАґПґЩ"), Nation.c_str()); BroadcastNotice(szNotice); snprintf(szNotice, sizeof(szNotice), "First Step: %s exclusion", Nation.c_str()); LogManager::instance().CharLog(0, 0, 0, 0, "THREEWAY", szNotice, NULL); //---------------------- // ёчА» ё®БЁЗСґЩ. //---------------------- regen_mob_event_info* regen_info = AllocEventInfo<regen_mob_event_info>(); regen_info->dwMapIndex = pChar->GetMapIndex(); event_create(regen_mob_event, regen_info, PASSES_PER_SEC(10)); SetRegenFlag(1); } else if (1 == GetRegenFlag()) { int nVictoryEmpireIndex = 0; for (int n = 1; n < 4; ++n) { nKillScore = GetKillScore(n); if (nKillScore == -1) continue; if (nVictoryScore <= nKillScore) { nVictoryEmpireIndex = n; break; } } if (0 == nVictoryEmpireIndex) return; for (int n = 1; n < 4; ++n) { if (n != nVictoryEmpireIndex) { BYTE bLoseEmpire = n; quest::warp_all_to_map_my_empire_event_info * info; //---------------------- //Е»¶ф±№°Ў ЕрАе ЅГЕ°±в : јєБцїЎј //---------------------- info = AllocEventInfo<quest::warp_all_to_map_my_empire_event_info>(); info->m_lMapIndexFrom = GetSungziMapIndex(); info->m_lMapIndexTo = EMPIRE_START_MAP(bLoseEmpire); info->m_x = EMPIRE_START_X(bLoseEmpire); info->m_y = EMPIRE_START_Y(bLoseEmpire); info->m_bEmpire = bLoseEmpire; event_create(quest::warp_all_to_map_my_empire_event, info, PASSES_PER_SEC(5)); //---------------------- //Е»¶ф±№°Ў ЕрАе ЅГЕ°±в : Ел·ОїЎј //---------------------- info = AllocEventInfo<quest::warp_all_to_map_my_empire_event_info>(); info->m_lMapIndexFrom = GetPassMapIndex(bLoseEmpire); info->m_lMapIndexTo = EMPIRE_START_MAP(bLoseEmpire); info->m_x = EMPIRE_START_X(bLoseEmpire); info->m_y = EMPIRE_START_Y(bLoseEmpire); info->m_bEmpire = bLoseEmpire; event_create(quest::warp_all_to_map_my_empire_event, info, PASSES_PER_SEC(5)); } } //------------------------------ // ГЦБѕ ЅєДЪѕо ЗҐЅГ //------------------------------ { char szBuf[64 + 1]; snprintf(szBuf, sizeof(szBuf), LC_TEXT("ЗцАз ЅєДЪѕо ЅЕјц±№:%d ГµБ¶±№:%d Бшіл±№:%d"), GetKillScore(1), GetKillScore(2), GetKillScore(3)); SendNoticeMap(szBuf, GetSungziMapIndex(), false); } // ёЮјјБцё¦ ¶зїцБШґЩ. LPSECTREE_MAP pSecMap = SECTREE_MANAGER::instance().GetMap(pChar->GetMapIndex()); if (NULL != pSecMap) { const std::string EmpireName(EMPIRE_NAME(nVictoryEmpireIndex)); const std::string Script( EmpireName + LC_TEXT(". іКИс°Ў јєБцАЗ јцИЈАЪё¦ Ав°Ф µИґЩёй іКИсґВ јєБцАЗ БЦАОАМ µИґЩ.[ENTER][ENTER] ") + "[ENTER][DONE]"); struct packet_script pack_script; pack_script.header = HEADER_GC_SCRIPT; pack_script.skin = 1; pack_script.src_size = Script.size(); quest::FSendPacketToEmpire fSend; fSend.bEmpire = nVictoryEmpireIndex; pack_script.size = pack_script.src_size + sizeof(struct packet_script); fSend.buf.write(&pack_script, sizeof(struct packet_script)); fSend.buf.write(&Script[0], Script.size()); pSecMap->for_each(fSend); char szBuf[512]; snprintf(szBuf, sizeof(szBuf), "Second Step: %s remain", EMPIRE_NAME( nVictoryEmpireIndex )); LogManager::instance().CharLog(0, 0, 0, 0, "THREEWAY", szBuf, NULL); } //------------------------------ // ё¶Бцё· єё»у : Бш±ё№МИЈ јТИЇ //----------------------------- for (int n = 0; n < quest::CQuestManager::instance().GetEventFlag("threeway_war_boss_count");) { int x = pChar->GetX(); int y = pChar->GetY(); x = (thecore_random() & 1) ? x - number(200, 1000) : x + number(200, 1000); y = (thecore_random() & 1) ? y - number(200, 1000) : y + number(200, 1000); if (x < 0) x = pChar->GetX(); if (y < 0) y = pChar->GetY(); LPCHARACTER ch = CHARACTER_MANAGER::instance().SpawnMob( GetEventSungZiMapInfo().m_iBossMobVnum, pChar->GetMapIndex(), x, y, 0, false); if (NULL != ch) { ch->SetAggressive(); ++n; } } SetRegenFlag(-1); } }