server/game/src/arena.cpp

1135 lines
28 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "stdafx.h"
#include "constants.h"
#include "config.h"
#include "packet.h"
#include "desc.h"
#include "buffer_manager.h"
#include "start_position.h"
#include "questmanager.h"
#include "char.h"
#include "char_manager.h"
#include "arena.h"
CArena::CArena(WORD startA_X, WORD startA_Y, WORD startB_X, WORD startB_Y)
{
m_StartPointA.x = startA_X;
m_StartPointA.y = startA_Y;
m_StartPointA.z = 0;
m_StartPointB.x = startB_X;
m_StartPointB.y = startB_Y;
m_StartPointB.z = 0;
m_ObserverPoint.x = (startA_X + startB_X) / 2;
m_ObserverPoint.y = (startA_Y + startB_Y) / 2;
m_ObserverPoint.z = 0;
m_pEvent = NULL;
m_pTimeOutEvent = NULL;
Clear();
}
void CArena::Clear()
{
m_dwPIDA = 0;
m_dwPIDB = 0;
if (m_pEvent != NULL)
{
event_cancel(&m_pEvent);
}
if (m_pTimeOutEvent != NULL)
{
event_cancel(&m_pTimeOutEvent);
}
m_dwSetCount = 0;
m_dwSetPointOfA = 0;
m_dwSetPointOfB = 0;
}
bool CArenaManager::AddArena(DWORD mapIdx, WORD startA_X, WORD startA_Y, WORD startB_X, WORD startB_Y)
{
CArenaMap *pArenaMap = NULL;
itertype(m_mapArenaMap) iter = m_mapArenaMap.find(mapIdx);
if (iter == m_mapArenaMap.end())
{
pArenaMap = M2_NEW CArenaMap;
m_mapArenaMap.insert(std::make_pair(mapIdx, pArenaMap));
}
else
{
pArenaMap = iter->second;
}
if (pArenaMap->AddArena(mapIdx, startA_X, startA_Y, startB_X, startB_Y) == false)
{
sys_log(0, "CArenaManager::AddArena - AddMap Error MapID: %d", mapIdx);
return false;
}
return true;
}
bool CArenaMap::AddArena(DWORD mapIdx, WORD startA_X, WORD startA_Y, WORD startB_X, WORD startB_Y)
{
for (auto iter: m_listArena)
{
if (iter->CheckArea(startA_X, startA_Y, startB_X, startB_Y) == false)
{
sys_log(0, "CArenaMap::AddArena - Same Start Position set. stA(%d, %d) stB(%d, %d)", startA_X, startA_Y, startB_X, startB_Y);
return false;
}
}
m_dwMapIndex = mapIdx;
CArena * pArena = new CArena(startA_X, startA_Y, startB_X, startB_Y);
m_listArena.push_back(pArena);
return true;
}
void CArenaManager::Destroy()
{
itertype(m_mapArenaMap) iter = m_mapArenaMap.begin();
for (; iter != m_mapArenaMap.end(); iter++)
{
CArenaMap* pArenaMap = iter->second;
pArenaMap->Destroy();
M2_DELETE(pArenaMap);
}
m_mapArenaMap.clear();
}
void CArenaMap::Destroy()
{
itertype(m_listArena) iter = m_listArena.begin();
sys_log(0, "ARENA: ArenaMap will be destroy. mapIndex(%d)", m_dwMapIndex);
for (; iter != m_listArena.end(); iter++)
{
CArena* pArena = *iter;
pArena->EndDuel();
M2_DELETE(pArena);
}
m_listArena.clear();
}
bool CArena::CheckArea(WORD startA_X, WORD startA_Y, WORD startB_X, WORD startB_Y)
{
if (m_StartPointA.x == startA_X && m_StartPointA.y == startA_Y &&
m_StartPointB.x == startB_X && m_StartPointB.y == startB_Y)
return false;
return true;
}
void CArenaManager::SendArenaMapListTo(LPCHARACTER pChar)
{
itertype(m_mapArenaMap) iter = m_mapArenaMap.begin();
for (; iter != m_mapArenaMap.end(); iter++)
{
CArenaMap* pArena = iter->second;
pArena->SendArenaMapListTo(pChar, (iter->first));
}
}
void CArenaMap::SendArenaMapListTo(LPCHARACTER pChar, DWORD mapIdx)
{
if (pChar == nullptr) return;
for (auto& arena: m_listArena) {
pChar->ChatPacket(CHAT_TYPE_INFO, "ArenaMapInfo Map: %d stA(%d, %d) stB(%d, %d)", mapIdx,
arena->GetStartPointA().x, arena->GetStartPointA().y,
arena->GetStartPointB().x, arena->GetStartPointB().y
);
}
}
bool CArenaManager::StartDuel(LPCHARACTER pCharFrom, LPCHARACTER pCharTo, int nSetPoint, int nMinute)
{
if (pCharFrom == NULL || pCharTo == NULL) return false;
itertype(m_mapArenaMap) iter = m_mapArenaMap.begin();
for (; iter != m_mapArenaMap.end(); iter++)
{
CArenaMap* pArenaMap = iter->second;
if (pArenaMap->StartDuel(pCharFrom, pCharTo, nSetPoint, nMinute) == true)
{
return true;
}
}
return false;
}
bool CArenaMap::StartDuel(LPCHARACTER pCharFrom, LPCHARACTER pCharTo, int nSetPoint, int nMinute)
{
itertype(m_listArena) iter = m_listArena.begin();
for (; iter != m_listArena.end(); iter++)
{
CArena* pArena = *iter;
if (pArena->IsEmpty() == true)
{
return pArena->StartDuel(pCharFrom, pCharTo, nSetPoint, nMinute);
}
}
return false;
}
EVENTINFO(TArenaEventInfo)
{
CArena *pArena;
BYTE state;
TArenaEventInfo()
: pArena(0)
, state(0)
{
}
};
EVENTFUNC(ready_to_start_event)
{
if (event == NULL)
return 0;
if (event->info == NULL)
return 0;
TArenaEventInfo* info = dynamic_cast<TArenaEventInfo*>(event->info);
if ( info == NULL )
{
sys_err( "ready_to_start_event> <Factor> Null pointer" );
return 0;
}
CArena* pArena = info->pArena;
if (pArena == NULL)
{
sys_err("ARENA: Arena start event info is null.");
return 0;
}
LPCHARACTER chA = pArena->GetPlayerA();
LPCHARACTER chB = pArena->GetPlayerB();
if (chA == NULL || chB == NULL)
{
sys_err("ARENA: Player err in event func ready_start_event");
if (chA != NULL)
{
chA->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>."));
sys_log(0, "ARENA: Oppernent is disappered. MyPID(%d) OppPID(%d)", pArena->GetPlayerAPID(), pArena->GetPlayerBPID());
}
if (chB != NULL)
{
chB->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>."));
sys_log(0, "ARENA: Oppernent is disappered. MyPID(%d) OppPID(%d)", pArena->GetPlayerBPID(), pArena->GetPlayerAPID());
}
pArena->SendChatPacketToObserver(CHAT_TYPE_NOTICE, LC_TEXT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>."));
pArena->EndDuel();
return 0;
}
switch (info->state)
{
case 0:
{
chA->SetArena(pArena);
chB->SetArena(pArena);
int count = quest::CQuestManager::instance().GetEventFlag("arena_potion_limit_count");
if (count > 10000)
{
chA->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>."));
chB->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>."));
}
else
{
chA->SetPotionLimit(count);
chB->SetPotionLimit(count);
chA->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> %d <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>."), chA->GetPotionLimit());
chB->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> %d <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>."), chB->GetPotionLimit());
}
chA->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("10<EFBFBD>ʵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>۵˴ϴ<CBB4>."));
chB->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("10<EFBFBD>ʵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>۵˴ϴ<CBB4>."));
pArena->SendChatPacketToObserver(CHAT_TYPE_INFO, LC_TEXT("10<EFBFBD>ʵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>۵˴ϴ<CBB4>."));
info->state++;
return PASSES_PER_SEC(10);
}
break;
case 1:
{
chA->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>۵Ǿ<DBB5><C7BE><EFBFBD><EFBFBD>ϴ<EFBFBD>."));
chB->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>۵Ǿ<DBB5><C7BE><EFBFBD><EFBFBD>ϴ<EFBFBD>."));
pArena->SendChatPacketToObserver(CHAT_TYPE_INFO, LC_TEXT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>۵Ǿ<DBB5><C7BE><EFBFBD><EFBFBD>ϴ<EFBFBD>."));
TPacketGCDuelStart duelStart;
duelStart.header = HEADER_GC_DUEL_START;
duelStart.wSize = sizeof(TPacketGCDuelStart) + 4;
DWORD dwOppList[8]; // <20>ִ<EFBFBD> <20><>Ƽ<EFBFBD><C6BC> 8<><38> <20>̹Ƿ<CCB9>..
dwOppList[0] = (DWORD)chB->GetVID();
TEMP_BUFFER buf;
buf.write(&duelStart, sizeof(TPacketGCDuelStart));
buf.write(&dwOppList[0], 4);
chA->GetDesc()->Packet(buf.read_peek(), buf.size());
dwOppList[0] = (DWORD)chA->GetVID();
TEMP_BUFFER buf2;
buf2.write(&duelStart, sizeof(TPacketGCDuelStart));
buf2.write(&dwOppList[0], 4);
chB->GetDesc()->Packet(buf2.read_peek(), buf2.size());
return 0;
}
break;
case 2:
{
pArena->EndDuel();
return 0;
}
break;
case 3:
{
chA->Show(chA->GetMapIndex(), pArena->GetStartPointA().x * 100, pArena->GetStartPointA().y * 100);
chB->Show(chB->GetMapIndex(), pArena->GetStartPointB().x * 100, pArena->GetStartPointB().y * 100);
chA->GetDesc()->SetPhase(PHASE_GAME);
chA->StartRecoveryEvent();
chA->SetPosition(POS_STANDING);
chA->PointChange(POINT_HP, chA->GetMaxHP() - chA->GetHP());
chA->PointChange(POINT_SP, chA->GetMaxSP() - chA->GetSP());
chA->ViewReencode();
chB->GetDesc()->SetPhase(PHASE_GAME);
chB->StartRecoveryEvent();
chB->SetPosition(POS_STANDING);
chB->PointChange(POINT_HP, chB->GetMaxHP() - chB->GetHP());
chB->PointChange(POINT_SP, chB->GetMaxSP() - chB->GetSP());
chB->ViewReencode();
TEMP_BUFFER buf;
TEMP_BUFFER buf2;
DWORD dwOppList[8]; // <20>ִ<EFBFBD> <20><>Ƽ<EFBFBD><C6BC> 8<><38> <20>̹Ƿ<CCB9>..
TPacketGCDuelStart duelStart;
duelStart.header = HEADER_GC_DUEL_START;
duelStart.wSize = sizeof(TPacketGCDuelStart) + 4;
dwOppList[0] = (DWORD)chB->GetVID();
buf.write(&duelStart, sizeof(TPacketGCDuelStart));
buf.write(&dwOppList[0], 4);
chA->GetDesc()->Packet(buf.read_peek(), buf.size());
dwOppList[0] = (DWORD)chA->GetVID();
buf2.write(&duelStart, sizeof(TPacketGCDuelStart));
buf2.write(&dwOppList[0], 4);
chB->GetDesc()->Packet(buf2.read_peek(), buf2.size());
chA->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>۵Ǿ<DBB5><C7BE><EFBFBD><EFBFBD>ϴ<EFBFBD>."));
chB->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>۵Ǿ<DBB5><C7BE><EFBFBD><EFBFBD>ϴ<EFBFBD>."));
pArena->SendChatPacketToObserver(CHAT_TYPE_INFO, LC_TEXT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>۵Ǿ<DBB5><C7BE><EFBFBD><EFBFBD>ϴ<EFBFBD>."));
pArena->ClearEvent();
return 0;
}
break;
default:
{
chA->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ͽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>."));
chB->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ͽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>."));
pArena->SendChatPacketToObserver(CHAT_TYPE_INFO, LC_TEXT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ͽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>."));
sys_log(0, "ARENA: Something wrong in event func. info->state(%d)", info->state);
pArena->EndDuel();
return 0;
}
}
}
EVENTFUNC(duel_time_out)
{
if (event == NULL) return 0;
if (event->info == NULL) return 0;
TArenaEventInfo* info = dynamic_cast<TArenaEventInfo*>(event->info);
if ( info == NULL )
{
sys_err( "duel_time_out> <Factor> Null pointer" );
return 0;
}
CArena* pArena = info->pArena;
if (pArena == NULL)
{
sys_err("ARENA: Time out event error");
return 0;
}
LPCHARACTER chA = pArena->GetPlayerA();
LPCHARACTER chB = pArena->GetPlayerB();
if (chA == NULL || chB == NULL)
{
if (chA != NULL)
{
chA->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>."));
sys_log(0, "ARENA: Oppernent is disappered. MyPID(%d) OppPID(%d)", pArena->GetPlayerAPID(), pArena->GetPlayerBPID());
}
if (chB != NULL)
{
chB->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>."));
sys_log(0, "ARENA: Oppernent is disappered. MyPID(%d) OppPID(%d)", pArena->GetPlayerBPID(), pArena->GetPlayerAPID());
}
pArena->SendChatPacketToObserver(CHAT_TYPE_INFO, LC_TEXT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>."));
pArena->EndDuel();
return 0;
}
else
{
switch (info->state)
{
case 0:
pArena->SendChatPacketToObserver(CHAT_TYPE_NOTICE, LC_TEXT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ð<EFBFBD> <20>ʰ<EFBFBD><CAB0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ߴ<EFBFBD><DFB4>մϴ<D5B4>."));
pArena->SendChatPacketToObserver(CHAT_TYPE_NOTICE, LC_TEXT("10<EFBFBD>ʵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̵<EFBFBD><CCB5>մϴ<D5B4>."));
chA->ChatPacket(CHAT_TYPE_NOTICE, LC_TEXT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ð<EFBFBD> <20>ʰ<EFBFBD><CAB0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ߴ<EFBFBD><DFB4>մϴ<D5B4>."));
chA->ChatPacket(CHAT_TYPE_NOTICE, LC_TEXT("10<EFBFBD>ʵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̵<EFBFBD><CCB5>մϴ<D5B4>."));
chB->ChatPacket(CHAT_TYPE_NOTICE, LC_TEXT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ð<EFBFBD> <20>ʰ<EFBFBD><CAB0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ߴ<EFBFBD><DFB4>մϴ<D5B4>."));
chB->ChatPacket(CHAT_TYPE_NOTICE, LC_TEXT("10<EFBFBD>ʵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̵<EFBFBD><CCB5>մϴ<D5B4>."));
TPacketGCDuelStart duelStart;
duelStart.header = HEADER_GC_DUEL_START;
duelStart.wSize = sizeof(TPacketGCDuelStart);
chA->GetDesc()->Packet(&duelStart, sizeof(TPacketGCDuelStart));
chA->GetDesc()->Packet(&duelStart, sizeof(TPacketGCDuelStart));
info->state++;
sys_log(0, "ARENA: Because of time over, duel is end. PIDA(%d) vs PIDB(%d)", pArena->GetPlayerAPID(), pArena->GetPlayerBPID());
return PASSES_PER_SEC(10);
break;
case 1:
pArena->EndDuel();
break;
}
}
return 0;
}
bool CArena::StartDuel(LPCHARACTER pCharFrom, LPCHARACTER pCharTo, int nSetPoint, int nMinute)
{
this->m_dwPIDA = pCharFrom->GetPlayerID();
this->m_dwPIDB = pCharTo->GetPlayerID();
this->m_dwSetCount = nSetPoint;
pCharFrom->WarpSet(GetStartPointA().x * 100, GetStartPointA().y * 100);
pCharTo->WarpSet(GetStartPointB().x * 100, GetStartPointB().y * 100);
if (m_pEvent != NULL) {
event_cancel(&m_pEvent);
}
TArenaEventInfo* info = AllocEventInfo<TArenaEventInfo>();
info->pArena = this;
info->state = 0;
m_pEvent = event_create(ready_to_start_event, info, PASSES_PER_SEC(10));
if (m_pTimeOutEvent != NULL) {
event_cancel(&m_pTimeOutEvent);
}
info = AllocEventInfo<TArenaEventInfo>();
info->pArena = this;
info->state = 0;
m_pTimeOutEvent = event_create(duel_time_out, info, PASSES_PER_SEC(nMinute*60));
pCharFrom->PointChange(POINT_HP, pCharFrom->GetMaxHP() - pCharFrom->GetHP());
pCharFrom->PointChange(POINT_SP, pCharFrom->GetMaxSP() - pCharFrom->GetSP());
pCharTo->PointChange(POINT_HP, pCharTo->GetMaxHP() - pCharTo->GetHP());
pCharTo->PointChange(POINT_SP, pCharTo->GetMaxSP() - pCharTo->GetSP());
sys_log(0, "ARENA: Start Duel with PID_A(%d) vs PID_B(%d)", GetPlayerAPID(), GetPlayerBPID());
return true;
}
void CArenaManager::EndAllDuel()
{
itertype(m_mapArenaMap) iter = m_mapArenaMap.begin();
for (; iter != m_mapArenaMap.end(); iter++)
{
CArenaMap *pArenaMap = iter->second;
if (pArenaMap != NULL)
pArenaMap->EndAllDuel();
}
return;
}
void CArenaMap::EndAllDuel()
{
itertype(m_listArena) iter = m_listArena.begin();
for (; iter != m_listArena.end(); iter++)
{
CArena *pArena = *iter;
if (pArena != NULL)
pArena->EndDuel();
}
}
void CArena::EndDuel()
{
if (m_pEvent != NULL) {
event_cancel(&m_pEvent);
}
if (m_pTimeOutEvent != NULL) {
event_cancel(&m_pTimeOutEvent);
}
LPCHARACTER playerA = GetPlayerA();
LPCHARACTER playerB = GetPlayerB();
if (playerA != NULL)
{
playerA->SetPKMode(PK_MODE_PEACE);
playerA->StartRecoveryEvent();
playerA->SetPosition(POS_STANDING);
playerA->PointChange(POINT_HP, playerA->GetMaxHP() - playerA->GetHP());
playerA->PointChange(POINT_SP, playerA->GetMaxSP() - playerA->GetSP());
playerA->SetArena(NULL);
playerA->WarpSet(ARENA_RETURN_POINT_X(playerA->GetEmpire()), ARENA_RETURN_POINT_Y(playerA->GetEmpire()));
}
if (playerB != NULL)
{
playerB->SetPKMode(PK_MODE_PEACE);
playerB->StartRecoveryEvent();
playerB->SetPosition(POS_STANDING);
playerB->PointChange(POINT_HP, playerB->GetMaxHP() - playerB->GetHP());
playerB->PointChange(POINT_SP, playerB->GetMaxSP() - playerB->GetSP());
playerB->SetArena(NULL);
playerB->WarpSet(ARENA_RETURN_POINT_X(playerB->GetEmpire()), ARENA_RETURN_POINT_Y(playerB->GetEmpire()));
}
itertype(m_mapObserver) iter = m_mapObserver.begin();
for (; iter != m_mapObserver.end(); iter++)
{
LPCHARACTER pChar = CHARACTER_MANAGER::instance().FindByPID(iter->first);
if (pChar != NULL)
{
pChar->WarpSet(ARENA_RETURN_POINT_X(pChar->GetEmpire()), ARENA_RETURN_POINT_Y(pChar->GetEmpire()));
}
}
m_mapObserver.clear();
sys_log(0, "ARENA: End Duel PID_A(%d) vs PID_B(%d)", GetPlayerAPID(), GetPlayerBPID());
Clear();
}
void CArenaManager::GetDuelList(lua_State* L)
{
itertype(m_mapArenaMap) iter = m_mapArenaMap.begin();
int index = 1;
lua_newtable(L);
for (; iter != m_mapArenaMap.end(); iter++)
{
CArenaMap* pArenaMap = iter->second;
if (pArenaMap != NULL)
index = pArenaMap->GetDuelList(L, index);
}
}
int CArenaMap::GetDuelList(lua_State* L, int index)
{
itertype(m_listArena) iter = m_listArena.begin();
for (; iter != m_listArena.end(); iter++)
{
CArena* pArena = *iter;
if (pArena == NULL) continue;
if (pArena->IsEmpty() == false)
{
LPCHARACTER chA = pArena->GetPlayerA();
LPCHARACTER chB = pArena->GetPlayerB();
if (chA != NULL && chB != NULL)
{
lua_newtable(L);
lua_pushstring(L, chA->GetName());
lua_rawseti(L, -2, 1);
lua_pushstring(L, chB->GetName());
lua_rawseti(L, -2, 2);
lua_pushnumber(L, m_dwMapIndex);
lua_rawseti(L, -2, 3);
lua_pushnumber(L, pArena->GetObserverPoint().x);
lua_rawseti(L, -2, 4);
lua_pushnumber(L, pArena->GetObserverPoint().y);
lua_rawseti(L, -2, 5);
lua_rawseti(L, -2, index++);
}
}
}
return index;
}
bool CArenaManager::CanAttack(LPCHARACTER pCharAttacker, LPCHARACTER pCharVictim)
{
if (pCharAttacker == NULL || pCharVictim == NULL) return false;
if (pCharAttacker == pCharVictim) return false;
int mapIndex = pCharAttacker->GetMapIndex();
if (mapIndex != pCharVictim->GetMapIndex()) return false;
itertype(m_mapArenaMap) iter = m_mapArenaMap.find(mapIndex);
if (iter == m_mapArenaMap.end()) return false;
CArenaMap* pArenaMap = (CArenaMap*)(iter->second);
return pArenaMap->CanAttack(pCharAttacker, pCharVictim);
}
bool CArenaMap::CanAttack(LPCHARACTER pCharAttacker, LPCHARACTER pCharVictim)
{
if (pCharAttacker == NULL || pCharVictim == NULL) return false;
DWORD dwPIDA = pCharAttacker->GetPlayerID();
DWORD dwPIDB = pCharVictim->GetPlayerID();
itertype(m_listArena) iter = m_listArena.begin();
for (; iter != m_listArena.end(); iter++)
{
CArena* pArena = *iter;
if (pArena->CanAttack(dwPIDA, dwPIDB) == true)
{
return true;
}
}
return false;
}
bool CArena::CanAttack(DWORD dwPIDA, DWORD dwPIDB)
{
// 1:1 <20><><EFBFBD><EFBFBD> <20>ٴ<EFBFBD><D9B4><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʿ<EFBFBD>
if (m_dwPIDA == dwPIDA && m_dwPIDB == dwPIDB) return true;
if (m_dwPIDA == dwPIDB && m_dwPIDB == dwPIDA) return true;
return false;
}
bool CArenaManager::OnDead(LPCHARACTER pCharKiller, LPCHARACTER pCharVictim)
{
if (pCharKiller == NULL || pCharVictim == NULL) return false;
int mapIndex = pCharKiller->GetMapIndex();
if (mapIndex != pCharVictim->GetMapIndex()) return false;
itertype(m_mapArenaMap) iter = m_mapArenaMap.find(mapIndex);
if (iter == m_mapArenaMap.end()) return false;
CArenaMap* pArenaMap = (CArenaMap*)(iter->second);
return pArenaMap->OnDead(pCharKiller, pCharVictim);
}
bool CArenaMap::OnDead(LPCHARACTER pCharKiller, LPCHARACTER pCharVictim)
{
DWORD dwPIDA = pCharKiller->GetPlayerID();
DWORD dwPIDB = pCharVictim->GetPlayerID();
itertype(m_listArena) iter = m_listArena.begin();
for (; iter != m_listArena.end(); iter++)
{
CArena* pArena = *iter;
if (pArena->IsMember(dwPIDA) == true && pArena->IsMember(dwPIDB) == true)
{
pArena->OnDead(dwPIDA, dwPIDB);
return true;
}
}
return false;
}
bool CArena::OnDead(DWORD dwPIDA, DWORD dwPIDB)
{
bool restart = false;
LPCHARACTER pCharA = GetPlayerA();
LPCHARACTER pCharB = GetPlayerB();
if (pCharA == NULL && pCharB == NULL)
{
// <20>Ѵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ?!
SendChatPacketToObserver(CHAT_TYPE_NOTICE, LC_TEXT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ͽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ߴ<EFBFBD><DFB4>մϴ<D5B4>."));
restart = false;
}
else if (pCharA == NULL && pCharB != NULL)
{
pCharB->ChatPacket(CHAT_TYPE_NOTICE, LC_TEXT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ͽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>."));
SendChatPacketToObserver(CHAT_TYPE_NOTICE, LC_TEXT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ͽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>."));
restart = false;
}
else if (pCharA != NULL && pCharB == NULL)
{
pCharA->ChatPacket(CHAT_TYPE_NOTICE, LC_TEXT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ͽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>."));
SendChatPacketToObserver(CHAT_TYPE_NOTICE, LC_TEXT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ͽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>."));
restart = false;
}
else if (pCharA != NULL && pCharB != NULL)
{
if (m_dwPIDA == dwPIDA)
{
m_dwSetPointOfA++;
if (m_dwSetPointOfA >= m_dwSetCount)
{
pCharA->ChatPacket(CHAT_TYPE_NOTICE, LC_TEXT("%s <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD> <20>¸<EFBFBD><C2B8>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD>ϴ<EFBFBD>."), pCharA->GetName());
pCharB->ChatPacket(CHAT_TYPE_NOTICE, LC_TEXT("%s <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD> <20>¸<EFBFBD><C2B8>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD>ϴ<EFBFBD>."), pCharA->GetName());
SendChatPacketToObserver(CHAT_TYPE_NOTICE, LC_TEXT("%s <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD> <20>¸<EFBFBD><C2B8>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD>ϴ<EFBFBD>."), pCharA->GetName());
sys_log(0, "ARENA: Duel is end. Winner %s(%d) Loser %s(%d)",
pCharA->GetName(), GetPlayerAPID(), pCharB->GetName(), GetPlayerBPID());
}
else
{
restart = true;
pCharA->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%s <20><><EFBFBD><EFBFBD> <20>¸<EFBFBD><C2B8>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD>ϴ<EFBFBD>."), pCharA->GetName());
pCharA->ChatPacket(CHAT_TYPE_NOTICE, "%s %d : %d %s", pCharA->GetName(), m_dwSetPointOfA, m_dwSetPointOfB, pCharB->GetName());
pCharB->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%s <20><><EFBFBD><EFBFBD> <20>¸<EFBFBD><C2B8>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD>ϴ<EFBFBD>."), pCharA->GetName());
pCharB->ChatPacket(CHAT_TYPE_NOTICE, "%s %d : %d %s", pCharA->GetName(), m_dwSetPointOfA, m_dwSetPointOfB, pCharB->GetName());
SendChatPacketToObserver(CHAT_TYPE_NOTICE, "%s %d : %d %s", pCharA->GetName(), m_dwSetPointOfA, m_dwSetPointOfB, pCharB->GetName());
sys_log(0, "ARENA: %s(%d) won a round vs %s(%d)",
pCharA->GetName(), GetPlayerAPID(), pCharB->GetName(), GetPlayerBPID());
}
}
else if (m_dwPIDB == dwPIDA)
{
m_dwSetPointOfB++;
if (m_dwSetPointOfB >= m_dwSetCount)
{
pCharA->ChatPacket(CHAT_TYPE_NOTICE, LC_TEXT("%s <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD> <20>¸<EFBFBD><C2B8>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD>ϴ<EFBFBD>."), pCharB->GetName());
pCharB->ChatPacket(CHAT_TYPE_NOTICE, LC_TEXT("%s <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD> <20>¸<EFBFBD><C2B8>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD>ϴ<EFBFBD>."), pCharB->GetName());
SendChatPacketToObserver(CHAT_TYPE_NOTICE, LC_TEXT("%s <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD> <20>¸<EFBFBD><C2B8>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD>ϴ<EFBFBD>."), pCharB->GetName());
sys_log(0, "ARENA: Duel is end. Winner(%d) Loser(%d)", GetPlayerBPID(), GetPlayerAPID());
}
else
{
restart = true;
pCharA->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%s <20><><EFBFBD><EFBFBD> <20>¸<EFBFBD><C2B8>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD>ϴ<EFBFBD>."), pCharB->GetName());
pCharA->ChatPacket(CHAT_TYPE_NOTICE, "%s %d : %d %s", pCharA->GetName(), m_dwSetPointOfA, m_dwSetPointOfB, pCharB->GetName());
pCharB->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%s <20><><EFBFBD><EFBFBD> <20>¸<EFBFBD><C2B8>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD>ϴ<EFBFBD>."), pCharB->GetName());
pCharB->ChatPacket(CHAT_TYPE_NOTICE, "%s %d : %d %s", pCharA->GetName(), m_dwSetPointOfA, m_dwSetPointOfB, pCharB->GetName());
SendChatPacketToObserver(CHAT_TYPE_NOTICE, "%s %d : %d %s", pCharA->GetName(), m_dwSetPointOfA, m_dwSetPointOfB, pCharB->GetName());
sys_log(0, "ARENA : PID(%d) won a round. Opp(%d)", GetPlayerBPID(), GetPlayerAPID());
}
}
else
{
// wtf
sys_log(0, "ARENA : OnDead Error (%d, %d) (%d, %d)", m_dwPIDA, m_dwPIDB, dwPIDA, dwPIDB);
}
int potion = quest::CQuestManager::instance().GetEventFlag("arena_potion_limit_count");
pCharA->SetPotionLimit(potion);
pCharB->SetPotionLimit(potion);
}
else
{
// <20><><EFBFBD><EFBFBD> <20>ȵȴ<C8B5> ?!
}
if (restart == false)
{
if (pCharA != NULL)
pCharA->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("10<EFBFBD>ʵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ǵ<EFBFBD><C7B5>ư<EFBFBD><C6B0>ϴ<EFBFBD>."));
if ( pCharB != NULL)
pCharB->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("10<EFBFBD>ʵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ǵ<EFBFBD><C7B5>ư<EFBFBD><C6B0>ϴ<EFBFBD>."));
SendChatPacketToObserver(CHAT_TYPE_INFO, LC_TEXT("10<EFBFBD>ʵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ǵ<EFBFBD><C7B5>ư<EFBFBD><C6B0>ϴ<EFBFBD>."));
if (m_pEvent != NULL) {
event_cancel(&m_pEvent);
}
TArenaEventInfo* info = AllocEventInfo<TArenaEventInfo>();
info->pArena = this;
info->state = 2;
m_pEvent = event_create(ready_to_start_event, info, PASSES_PER_SEC(10));
}
else
{
if (pCharA != NULL)
pCharA->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("10<EFBFBD>ʵ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>."));
if (pCharB != NULL)
pCharB->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("10<EFBFBD>ʵ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>."));
SendChatPacketToObserver(CHAT_TYPE_INFO, LC_TEXT("10<EFBFBD>ʵ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>."));
if (m_pEvent != NULL) {
event_cancel(&m_pEvent);
}
TArenaEventInfo* info = AllocEventInfo<TArenaEventInfo>();
info->pArena = this;
info->state = 3;
m_pEvent = event_create(ready_to_start_event, info, PASSES_PER_SEC(10));
}
return true;
}
bool CArenaManager::AddObserver(LPCHARACTER pChar, DWORD mapIdx, WORD ObserverX, WORD ObserverY)
{
itertype(m_mapArenaMap) iter = m_mapArenaMap.find(mapIdx);
if (iter == m_mapArenaMap.end()) return false;
CArenaMap* pArenaMap = iter->second;
return pArenaMap->AddObserver(pChar, ObserverX, ObserverY);
}
bool CArenaMap::AddObserver(LPCHARACTER pChar, WORD ObserverX, WORD ObserverY)
{
itertype(m_listArena) iter = m_listArena.begin();
for (; iter != m_listArena.end(); iter++)
{
CArena* pArena = *iter;
if (pArena->IsMyObserver(ObserverX, ObserverY) == true)
{
pChar->SetArena(pArena);
return pArena->AddObserver(pChar);
}
}
return false;
}
bool CArena::IsMyObserver(WORD ObserverX, WORD ObserverY)
{
return ((ObserverX == m_ObserverPoint.x) && (ObserverY == m_ObserverPoint.y));
}
bool CArena::AddObserver(LPCHARACTER pChar)
{
DWORD pid = pChar->GetPlayerID();
m_mapObserver.insert(std::make_pair(pid, (LPCHARACTER)NULL));
pChar->SaveExitLocation();
pChar->WarpSet(m_ObserverPoint.x * 100, m_ObserverPoint.y * 100);
return true;
}
bool CArenaManager::IsArenaMap(DWORD dwMapIndex)
{
return m_mapArenaMap.find(dwMapIndex) != m_mapArenaMap.end();
}
MEMBER_IDENTITY CArenaManager::IsMember(DWORD dwMapIndex, DWORD PID)
{
itertype(m_mapArenaMap) iter = m_mapArenaMap.find(dwMapIndex);
if (iter != m_mapArenaMap.end())
{
CArenaMap* pArenaMap = iter->second;
return pArenaMap->IsMember(PID);
}
return MEMBER_NO;
}
MEMBER_IDENTITY CArenaMap::IsMember(DWORD PID)
{
itertype(m_listArena) iter = m_listArena.begin();
for (; iter != m_listArena.end(); iter++)
{
CArena* pArena = *iter;
if (pArena->IsObserver(PID) == true) return MEMBER_OBSERVER;
if (pArena->IsMember(PID) == true) return MEMBER_DUELIST;
}
return MEMBER_NO;
}
bool CArena::IsObserver(DWORD PID)
{
itertype(m_mapObserver) iter = m_mapObserver.find(PID);
return iter != m_mapObserver.end();
}
void CArena::OnDisconnect(DWORD pid)
{
if (m_dwPIDA == pid)
{
if (GetPlayerB() != NULL)
GetPlayerB()->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>."));
sys_log(0, "ARENA : Duel is end because of Opp(%d) is disconnect. MyPID(%d)", GetPlayerAPID(), GetPlayerBPID());
EndDuel();
}
else if (m_dwPIDB == pid)
{
if (GetPlayerA() != NULL)
GetPlayerA()->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>."));
sys_log(0, "ARENA : Duel is end because of Opp(%d) is disconnect. MyPID(%d)", GetPlayerBPID(), GetPlayerAPID());
EndDuel();
}
}
void CArena::RemoveObserver(DWORD pid)
{
itertype(m_mapObserver) iter = m_mapObserver.find(pid);
if (iter != m_mapObserver.end())
{
m_mapObserver.erase(iter);
}
}
void CArena::SendPacketToObserver(const void * c_pvData, int iSize)
{
/*
itertype(m_mapObserver) iter = m_mapObserver.begin();
for (; iter != m_mapObserver.end(); iter++)
{
LPCHARACTER pChar = iter->second;
if (pChar != NULL)
{
if (pChar->GetDesc() != NULL)
{
pChar->GetDesc()->Packet(c_pvData, iSize);
}
}
}
*/
}
void CArena::SendChatPacketToObserver(BYTE type, const char * format, ...)
{
/*
char chatbuf[CHAT_MAX_LEN + 1];
va_list args;
va_start(args, format);
vsnprintf(chatbuf, sizeof(chatbuf), format, args);
va_end(args);
itertype(m_mapObserver) iter = m_mapObserver.begin();
for (; iter != m_mapObserver.end(); iter++)
{
LPCHARACTER pChar = iter->second;
if (pChar != NULL)
{
if (pChar->GetDesc() != NULL)
{
pChar->ChatPacket(type, chatbuf);
}
}
}
*/
}
bool CArenaManager::EndDuel(DWORD pid)
{
itertype(m_mapArenaMap) iter = m_mapArenaMap.begin();
for (; iter != m_mapArenaMap.end(); iter++)
{
CArenaMap* pArenaMap = iter->second;
if (pArenaMap->EndDuel(pid) == true) return true;
}
return false;
}
bool CArenaMap::EndDuel(DWORD pid)
{
itertype(m_listArena) iter = m_listArena.begin();
for (; iter != m_listArena.end(); iter++)
{
CArena* pArena = *iter;
if (pArena->IsMember(pid) == true)
{
pArena->EndDuel();
return true;
}
}
return false;
}
bool CArenaManager::RegisterObserverPtr(LPCHARACTER pChar, DWORD mapIdx, WORD ObserverX, WORD ObserverY)
{
if (pChar == NULL) return false;
itertype(m_mapArenaMap) iter = m_mapArenaMap.find(mapIdx);
if (iter == m_mapArenaMap.end())
{
sys_log(0, "ARENA : Cannot find ArenaMap. %d %d %d", mapIdx, ObserverX, ObserverY);
return false;
}
CArenaMap* pArenaMap = iter->second;
return pArenaMap->RegisterObserverPtr(pChar, mapIdx, ObserverX, ObserverY);
}
bool CArenaMap::RegisterObserverPtr(LPCHARACTER pChar, DWORD mapIdx, WORD ObserverX, WORD ObserverY)
{
itertype(m_listArena) iter = m_listArena.begin();
for (; iter != m_listArena.end(); ++iter)
{
CArena* pArena = *iter;
if (pArena->IsMyObserver(ObserverX, ObserverY) == true)
{
return pArena->RegisterObserverPtr(pChar);
}
}
return false;
}
bool CArena::RegisterObserverPtr(LPCHARACTER pChar)
{
DWORD pid = pChar->GetPlayerID();
itertype(m_mapObserver) iter = m_mapObserver.find(pid);
if (iter == m_mapObserver.end())
{
sys_log(0, "ARENA : not in ob list");
return false;
}
m_mapObserver[pid] = pChar;
return true;
}
bool CArenaManager::IsLimitedItem( int lMapIndex, DWORD dwVnum )
{
if ( IsArenaMap( lMapIndex ) == true )
{
if ( LC_IsCanada() == true )
{
switch ( dwVnum )
{
case 50020:
case 50021:
case 50022:
case 50801:
case 50802:
case 50813:
case 50814:
case 50817:
case 50818:
case 50819:
case 50820:
case 50821:
case 50822:
case 50823:
case 50824:
case 50825:
case 50826:
case 71044:
case 71055:
return true;
}
}
}
return false;
}