Files
LGram16 dd97ddec92 Restructure repository to include all source folders
Move git root from Client/ to src/ to track all source code:
- Client: Game client source (moved to Client/Client/)
- Server: Game server source
- GameTools: Development tools
- CryptoSource: Encryption utilities
- database: Database scripts
- Script: Game scripts
- rylCoder_16.02.2008_src: Legacy coder tools
- GMFont, Game: Additional resources

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-29 20:17:20 +09:00

2543 lines
78 KiB
C++
Raw Permalink 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 <Map/FieldMap/Cell.h>
#include <Map/FieldMap/VirtualArea/VirtualArea.h>
#include <Map/FieldMap/VirtualArea/VirtualAreaMgr.h>
#include <Creature/CreatureManager.h>
#include <Creature/Character/ExpTable.h>
#include <Creature/Character/Character.h>
#include <Creature/Monster/Monster.h>
#include <Creature/Monster/VirtualMonsterMgr.h>
#include <Network/Packet/PacketStruct/ServerInfo.h>
#include <GameTime/GameTimeConstants.h>
#include <GameTime/GameTimeMgr.h>
#include <Network/Dispatch/ParseUtils.h>
#include <Network/Dispatch/DBAgent/DBAgentDispatch.h>
#include <Network/Dispatch/GameClient/GameClientDispatch.h>
#include <Network/Dispatch/GameClient/SendCharCommunity.h>
#include <Network/Dispatch/GameClient/SendCharLevelUp.h>
#include <Network/Dispatch/GameClient/SendCharAttack.h>
#include <Network/Dispatch/GameClient/SendCharEtc.h>
#include <Network/Dispatch/GameClient/SendCharItem.h>
#include <Network/Dispatch/GameClient/SendCharQuest.h>
#include <Network/Dispatch/Chat/ChatDispatch.h>
#include <Network/Packet/WrapPacket.h>
#include <Network/Packet/PacketCommand.h>
#include <Network/Packet/PacketStruct/CharAttackPacket.h>
#include <Network/Packet/PacketStruct/AddressPacket.h>
#include <Network/Packet/PacketStruct/PartyPacket.h>
#include <Network/Packet/PacketStruct/CharQuestPacket.h>
#include <Utility/Setup/ServerSetup.h>
#include <Utility/Math/Math.h>
#include <Quest/QuestStruct.h>
using namespace Quest;
#include "Party.h"
#include "PartyMgr.h"
#include <Log/CharacterLog.h>
#include <Log/LogStruct.h>
CParty::CParty(const PARTY& PartyInfo)
: m_Party(PartyInfo)
{
m_PartySpellMgr.SetOwner(this);
}
CParty::CParty()
{
}
CParty::~CParty()
{
CPartyMgr::GetInstance().DeleteFindMemberList(m_Party.m_dwPartyID);
}
void CParty::ChangeName(unsigned long dwCID, const char* szChangedName)
{
for (int nMemberIndex = 0; nMemberIndex < m_Party.m_cMemberNum; ++nMemberIndex)
{
if (m_Party.MemberCID[nMemberIndex] == dwCID)
{
strncpy(m_Party.Name[nMemberIndex], szChangedName, CHAR_INFOST::MAX_NAME_LEN);
m_Party.Name[nMemberIndex][CHAR_INFOST::MAX_NAME_LEN - 1] = 0;
break;
}
}
}
///////////////////////////////////////////////////////////////////////////////////
// Function : CParty::IsMember
//
// Description : <20><>Ƽ<EFBFBD><C6BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>θ<EFBFBD> <20>Ǻ<EFBFBD><C7BA><EFBFBD>
//
// Inputs : dwMemberCID - <20>Ǻ<EFBFBD><C7BA>Ϸ<EFBFBD><CFB7><EFBFBD> ij<><C4B3><EFBFBD><EFBFBD>
//
// Outputs : None.
//
// Returns : bool - <20><>Ƽ<EFBFBD><C6BC><EFBFBD≯<EFBFBD> true. <20>ƴϸ<C6B4> false.
///////////////////////////////////////////////////////////////////////////////////
bool CParty::IsMember(unsigned long dwMemberCID)
{
if (0 == dwMemberCID)
{
ERRLOG0(g_Log, "<EFBFBD><EFBFBD>Ƽ<EFBFBD>α<EFBFBD> : <20>߸<EFBFBD><DFB8><EFBFBD> CID<49>Դϴ<D4B4>.");
return false;
}
for (int nMemberIndex = 0; nMemberIndex < m_Party.m_cMemberNum; ++nMemberIndex)
{
if (m_Party.MemberCID[nMemberIndex] == dwMemberCID)
{
return true;
}
}
return false;
}
bool CParty::UpdatePartyMemberInfo(unsigned long dwCID, unsigned long dwGID, unsigned short wClass, char cLevel, bool bAutoRouting)
{
if (0 == dwCID)
{
ERRLOG0(g_Log, "<EFBFBD><EFBFBD>Ƽ<EFBFBD>α<EFBFBD> : <20>߸<EFBFBD><DFB8><EFBFBD> CID<49>Դϴ<D4B4>.");
return false;
}
for (int nMemberIndex = 0; nMemberIndex < m_Party.m_cMemberNum; ++nMemberIndex)
{
if (m_Party.MemberCID[nMemberIndex] == dwCID)
{
// <20><>Ƽ<EFBFBD><C6BC> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ //
m_Party.m_cLevel[nMemberIndex] = cLevel;
m_Party.m_wClass[nMemberIndex] = wClass;
m_Party.m_bAutoRouting[nMemberIndex] = bAutoRouting;
m_Party.m_dwGID[nMemberIndex] = dwGID;
return true;
}
}
return false;
}
bool CParty::UpdatePartyMemberServer(unsigned long dwCID, unsigned long dwServerID)
{
if (0 == dwCID)
{
ERRLOG0(g_Log, "<EFBFBD><EFBFBD>Ƽ<EFBFBD>α<EFBFBD> : <20>߸<EFBFBD><DFB8><EFBFBD> CID<49>Դϴ<D4B4>.");
return false;
}
for (int nMemberIndex = 0; nMemberIndex < m_Party.m_cMemberNum; ++nMemberIndex)
{
if (m_Party.MemberCID[nMemberIndex] == dwCID)
{
// <20><>Ƽ<EFBFBD><C6BC> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ //
m_Party.ServerID[nMemberIndex] = dwServerID;
return true;
}
}
return false;
}
bool CParty::UpdatePartyMemberAutoRouting(unsigned long dwCID, bool bAutoRouting)
{
if (0 == dwCID)
{
ERRLOG0(g_Log, "<EFBFBD><EFBFBD>Ƽ<EFBFBD>α<EFBFBD> : <20>߸<EFBFBD><DFB8><EFBFBD> CID<49>Դϴ<D4B4>.");
return false;
}
for (int nMemberIndex = 0; nMemberIndex < m_Party.m_cMemberNum; ++nMemberIndex)
{
if (m_Party.MemberCID[nMemberIndex] == dwCID)
{
// <20><>Ƽ<EFBFBD><C6BC> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ //
m_Party.m_bAutoRouting[nMemberIndex] = bAutoRouting;
return true;
}
}
return false;
}
bool CParty::UpdatePartyMemberLevel(unsigned long dwCID, char cLevel)
{
if (0 == dwCID)
{
ERRLOG0(g_Log, "<EFBFBD><EFBFBD>Ƽ<EFBFBD>α<EFBFBD> : <20>߸<EFBFBD><DFB8><EFBFBD> CID<49>Դϴ<D4B4>.");
return false;
}
for (int nMemberIndex = 0; nMemberIndex < m_Party.m_cMemberNum; ++nMemberIndex)
{
if (m_Party.MemberCID[nMemberIndex] == dwCID)
{
// <20><>Ƽ<EFBFBD><C6BC> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ //
m_Party.m_cLevel[nMemberIndex] = cLevel;
return true;
}
}
return false;
}
bool CParty::UpdatePartyMemberClass(unsigned long dwCID, unsigned short wClass)
{
if (0 == dwCID)
{
ERRLOG0(g_Log, "<EFBFBD><EFBFBD>Ƽ<EFBFBD>α<EFBFBD> : <20>߸<EFBFBD><DFB8><EFBFBD> CID<49>Դϴ<D4B4>.");
return false;
}
for (int nMemberIndex = 0; nMemberIndex < m_Party.m_cMemberNum; ++nMemberIndex)
{
if (m_Party.MemberCID[nMemberIndex] == dwCID)
{
// <20><>Ƽ<EFBFBD><C6BC> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ //
m_Party.m_wClass[nMemberIndex] = wClass;
return true;
}
}
return false;
}
bool CParty::UpdatePartyMemberGuild(unsigned long dwCID, unsigned long dwGID)
{
if (0 == dwCID)
{
ERRLOG0(g_Log, "<EFBFBD><EFBFBD>Ƽ<EFBFBD>α<EFBFBD> : <20>߸<EFBFBD><DFB8><EFBFBD> CID<49>Դϴ<D4B4>.");
return false;
}
for (int nMemberIndex = 0; nMemberIndex < m_Party.m_cMemberNum; ++nMemberIndex)
{
if (m_Party.MemberCID[nMemberIndex] == dwCID)
{
// <20><>Ƽ<EFBFBD><C6BC> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ //
m_Party.m_dwGID[nMemberIndex] = dwGID;
return true;
}
}
return false;
}
CMonsterParty::CMonsterParty(const PARTY& PartyInfo, unsigned short wMapIndex)
: CParty(PartyInfo), m_fHelpRange(DEFAULT_HELP_RANGE)
{
std::fill_n(&m_pMemberPointer[0], int(PARTY::MAX_MEM), reinterpret_cast<CMonster *>(NULL));
CPartyMgr::GetInstance().AddParty(this);
for (int nMemberIndex = 0; nMemberIndex < m_Party.m_cMemberNum; ++nMemberIndex)
{
CMonster* lpMonster = NULL;
if (0 != wMapIndex)
{
VirtualArea::CVirtualArea* lpVirtualArea = VirtualArea::CVirtualAreaMgr::GetInstance().GetVirtualArea(wMapIndex);
if (lpVirtualArea)
{
CVirtualMonsterMgr* lpVirtualMonsterMgr = lpVirtualArea->GetMonsterManager();
if (lpVirtualMonsterMgr) lpMonster = lpVirtualMonsterMgr->GetMonster(m_Party.MemberCID[nMemberIndex]);
}
}
else
{
lpMonster = CCreatureManager::GetInstance().GetMonster(m_Party.MemberCID[nMemberIndex]);
}
if (NULL == lpMonster)
{
ERRLOG2(g_Log, "<EFBFBD><EFBFBD>Ƽ<EFBFBD>α<EFBFBD> : <20>߸<EFBFBD><DFB8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͱ<EFBFBD> <20><>Ƽ<EFBFBD><C6BC> <20><><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD>ϴ<EFBFBD>. PartyUID : 0x%08x, MonsterCID : 0x%08x(0x%08x)",
m_Party.m_dwPartyID, m_Party.MemberCID[nMemberIndex]);
continue;
}
LogChantBug(lpMonster, this, "<EFBFBD><EFBFBD>Ƽ<EFBFBD>α<EFBFBD> : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ƽ <20><><EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0><EFBFBD> <20>õ<EFBFBD><C3B5>մϴ<D5B4>.", LOG_FFLCHANT);
m_pMemberPointer[nMemberIndex] = lpMonster;
m_PartySpellMgr.AddMember(lpMonster);
}
}
CMonsterParty::CMonsterParty()
: CParty(), m_fHelpRange(DEFAULT_HELP_RANGE)
{
std::fill_n(&m_pMemberPointer[0], int(PARTY::MAX_MEM), reinterpret_cast<CMonster *>(NULL));
}
CMonsterParty::~CMonsterParty()
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ƽ Ż<><C5BB><EFBFBD><EFBFBD> CCreatureManager <20>Ҹ<EFBFBD><D2B8>ڿ<EFBFBD><DABF><EFBFBD> ó<><C3B3><EFBFBD>Ѵ<EFBFBD>.
}
unsigned short CMonsterParty::GetAvgLevel(void)
{
// <20><>Ƽ<EFBFBD><C6BC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
unsigned short wAvgLevel = 0;
for (int nMemberIndex = 0; nMemberIndex < m_Party.m_cMemberNum; ++nMemberIndex)
{
wAvgLevel += m_pMemberPointer[nMemberIndex]->GetStatus().m_nLevel;
}
wAvgLevel /= m_Party.m_cMemberNum;
return wAvgLevel;
}
unsigned short CMonsterParty::GetHighestLevel(void)
{
unsigned short wHighestLevel = 0;
for (int nMemberIndex = 0; nMemberIndex < m_Party.m_cMemberNum; ++nMemberIndex)
{
if (wHighestLevel < m_pMemberPointer[nMemberIndex]->GetStatus().m_nLevel)
{
wHighestLevel = m_pMemberPointer[nMemberIndex]->GetStatus().m_nLevel;
}
}
return wHighestLevel;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ƽ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ÿ<><C5B8> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
int CMonsterParty::GetMemberTypeNum()
{
std::set<int> typeSet;
for (int nMemberIndex = 0; nMemberIndex < m_Party.m_cMemberNum; ++nMemberIndex)
{
typeSet.insert( m_pMemberPointer[nMemberIndex]->GetPattern() );
}
return static_cast<int>(typeSet.size());
}
///////////////////////////////////////////////////////////////////////////////////
// Function : CMonsterParty::Join
//
// Description : <20><>Ƽ<EFBFBD><C6BC> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><><EFBFBD>Խ<EFBFBD>Ŵ
//
// Inputs : dwSenderCID - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̵<EFBFBD>
// dwReferenceID - <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
// strSenderName - <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
//
// Outputs : None.
//
// Returns : bool - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
///////////////////////////////////////////////////////////////////////////////////
bool CMonsterParty::Join(unsigned long dwSenderCID, unsigned long dwReferenceID, const char* strSenderName, unsigned short wMapIndex)
{
if (m_Party.m_cMemberNum >= PARTY::MAX_MEM)
{
ERRLOG0(g_Log, "<EFBFBD><EFBFBD>Ƽ<EFBFBD>α<EFBFBD> : <20><>Ƽ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> á<><C3A1><EFBFBD>ϴ<EFBFBD>.");
return false;
}
CMonster* lpMonster = NULL;
if (0 != wMapIndex)
{
VirtualArea::CVirtualArea* lpVirtualArea = VirtualArea::CVirtualAreaMgr::GetInstance().GetVirtualArea(wMapIndex);
if (lpVirtualArea)
{
CVirtualMonsterMgr* lpVirtualMonsterMgr = lpVirtualArea->GetMonsterManager();
if (lpVirtualMonsterMgr) lpMonster = lpVirtualMonsterMgr->GetMonster(dwSenderCID);
}
}
else
{
lpMonster = CCreatureManager::GetInstance().GetMonster(dwSenderCID);
}
if (NULL == lpMonster)
{
ERRLOG2(g_Log, "<EFBFBD><EFBFBD>Ƽ<EFBFBD>α<EFBFBD> : <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><>Ƽ<EFBFBD><C6BC> <20><><EFBFBD>Խ<EFBFBD>ų<EFBFBD><C5B3><EFBFBD><EFBFBD> <20>մϴ<D5B4>. PID:0x%08, CID:0x%08x", m_Party.m_dwPartyID, dwSenderCID);
return false;
}
for (int nMemberIndex = 0; nMemberIndex < m_Party.m_cMemberNum; ++nMemberIndex)
{
if (m_Party.MemberCID[nMemberIndex] == dwSenderCID)
{
ERRLOG0(g_Log, "<EFBFBD><EFBFBD>Ƽ<EFBFBD>α<EFBFBD> : <20>̹<EFBFBD> <20><> <20><>Ƽ<EFBFBD><C6BC> <20><><EFBFBD><EFBFBD><EFBFBD>Դϴ<D4B4>.");
return false;
}
}
m_Party.MemberCID[m_Party.m_cMemberNum] = dwSenderCID;
m_Party.ServerID[m_Party.m_cMemberNum] = dwReferenceID; // 0 <20><> <20><><EFBFBD><EFBFBD><EEB0A1><EFBFBD><EFBFBD>
LogChantBug(lpMonster, this, "<EFBFBD><EFBFBD>Ƽ<EFBFBD>α<EFBFBD> : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ƽ <20><><EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0><EFBFBD> <20>õ<EFBFBD><C3B5>մϴ<D5B4>.", LOG_FFLCHANT);
m_pMemberPointer[m_Party.m_cMemberNum] = lpMonster;
m_PartySpellMgr.AddMember(lpMonster);
++m_Party.m_cMemberNum;
return true;
}
///////////////////////////////////////////////////////////////////////////////////
// Function : CMonsterParty::Leave
//
// Description : <20><><EFBFBD><EFBFBD><EFBFBD>Ͱ<EFBFBD> <20>׾ <20><>Ƽ<EFBFBD><C6BC> <20><><EFBFBD>Ŵ<EFBFBD><C5B4><EFBFBD>
//
// Inputs : dwSenderCID - <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// dwReferenceID - <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
//
// Outputs : None.
//
// Returns : 1 - <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
// 0 - <20><><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ɶ<EFBFBD> <20><>Ƽ <20>Ŵ<EFBFBD><C5B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>.)
// -1 - Ż<><C5BB> <20><><EFBFBD><EFBFBD>(<28>α<EFBFBD> Ȯ<><C8AE>)
///////////////////////////////////////////////////////////////////////////////////
int CMonsterParty::Leave(unsigned long dwSenderCID, unsigned long dwReferenceID, unsigned short wMapIndex)
{
for (int nLoopIndex = 0; nLoopIndex < m_Party.m_cMemberNum; ++nLoopIndex)
{
CMonster* lpMonster = NULL;
if (m_Party.MemberCID[nLoopIndex] == dwSenderCID)
{
// <20>α<EFBFBD><CEB1>Ǿ<EFBFBD> <20>ִ<EFBFBD> <20><EFBFBD>̶<EFBFBD><CCB6><EFBFBD> <20><>ȣ<EFBFBD><C8A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
if (0 != wMapIndex)
{
VirtualArea::CVirtualArea* lpVirtualArea = VirtualArea::CVirtualAreaMgr::GetInstance().GetVirtualArea(wMapIndex);
if (lpVirtualArea)
{
CVirtualMonsterMgr* lpVirtualMonsterMgr = lpVirtualArea->GetMonsterManager();
if (lpVirtualMonsterMgr) lpMonster = lpVirtualMonsterMgr->GetMonster(dwSenderCID);
}
}
else
{
lpMonster = CCreatureManager::GetInstance().GetMonster(dwSenderCID);
}
if (NULL != lpMonster)
{
LogChantBug(lpMonster, this, "<EFBFBD><EFBFBD>Ƽ<EFBFBD>α<EFBFBD> : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ƽ <20><><EFBFBD><EFBFBD> <20><><EFBFBD>Ÿ<EFBFBD> <20>õ<EFBFBD><C3B5>մϴ<D5B4>.", LOG_FFLCHANT);
m_PartySpellMgr.RemoveMember(lpMonster);
if (lpMonster->GetPID() != m_Party.m_dwPartyID)
{
ERRLOG3(g_Log, "<EFBFBD><EFBFBD>Ƽ<EFBFBD>α<EFBFBD> : CID:0x%08x <20>߸<EFBFBD><DFB8><EFBFBD> <20><>Ƽ<EFBFBD><C6BC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>Ƽ<EFBFBD>Դϴ<D4B4>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> PID:0x%08x, <20><><EFBFBD>μ<EFBFBD><CEBC><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><>Ƽ<EFBFBD><C6BC> PID:0x%08x",
lpMonster->GetCID(), lpMonster->GetPID(), m_Party.m_dwPartyID);
}
else
{
lpMonster->SetParty(NULL);
}
}
--m_Party.m_cMemberNum;
for (int nMoveIndex = nLoopIndex; nMoveIndex < m_Party.m_cMemberNum; ++nMoveIndex)
{
m_Party.MemberCID[nMoveIndex] = m_Party.MemberCID[nMoveIndex+1];
m_Party.ServerID[nMoveIndex] = m_Party.ServerID[nMoveIndex+1]; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>̵<EFBFBD>
m_pMemberPointer[nMoveIndex] = m_pMemberPointer[nMoveIndex+1];
}
m_Party.MemberCID[m_Party.m_cMemberNum] = 0;
m_Party.ServerID[m_Party.m_cMemberNum] = 0;
m_pMemberPointer[m_Party.m_cMemberNum] = NULL;
return 0;
}
}
ERRLOG2(g_Log, "<EFBFBD><EFBFBD>Ƽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͱ<EFBFBD> Ż<><C5BB>(<28><>)<29>Ϸ<EFBFBD> <20>մϴ<D5B4>. PartyUID : 0x%08x, MonsterCID : 0x%08x",
m_Party.m_dwPartyID, dwSenderCID);
return -1;
}
///////////////////////////////////////////////////////////////////////////////////
// Function : CMonsterParty::Destory
//
// Description : <20><>Ƽ <20>ı<EFBFBD> (<28><>Ŷ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȣ<EFBFBD><C8A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. <20><>ü <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.)
//
// Inputs : dwSenderCID - <20>ƹ<EFBFBD><C6B9>ų<EFBFBD>
// dwReferenceID - <20>ƹ<EFBFBD><C6B9>ų<EFBFBD>
//
// Outputs : None.
//
// Returns : bool - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
///////////////////////////////////////////////////////////////////////////////////
bool CMonsterParty::Destory(unsigned long dwSenderCID, unsigned long dwReferenceID)
{
LogChantBug(0, this, "<EFBFBD><EFBFBD>Ƽ<EFBFBD>α<EFBFBD> : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ƽ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>Ÿ<EFBFBD> <20>õ<EFBFBD>.", LOG_FFLCHANT);
m_PartySpellMgr.ClearMember();
for (int nMemberIndex = 0; nMemberIndex < 2; ++nMemberIndex)
{
if (NULL != m_pMemberPointer[nMemberIndex])
{
if (m_pMemberPointer[nMemberIndex]->GetPID() != m_Party.m_dwPartyID)
{
ERRLOG3(g_Log, "<EFBFBD><EFBFBD>Ƽ<EFBFBD>α<EFBFBD> : CID:0x%08x <20>߸<EFBFBD><DFB8><EFBFBD> <20><>Ƽ<EFBFBD><C6BC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>Ƽ<EFBFBD>Դϴ<D4B4>. ij<><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> PID:0x%08x, <20><><EFBFBD>μ<EFBFBD><CEBC><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><>Ƽ<EFBFBD><C6BC> PID:0x%08x",
m_pMemberPointer[nMemberIndex]->GetCID(), m_pMemberPointer[nMemberIndex]->GetPID(), m_Party.m_dwPartyID);
continue;
}
m_pMemberPointer[nMemberIndex]->SetParty(NULL);
m_pMemberPointer[nMemberIndex]->SetPID(0);
}
}
return true;
}
bool CMonsterParty::Attack(AtType attackType, CAggresiveCreature** pDefenders, unsigned char* cDefenserJudges,
CAggresiveCreature* lpOffencer, float fDistance, unsigned char cTargetType)
{
unsigned char cDefenderNum = 0;
for (int nIndex = 0; nIndex < m_Party.m_cMemberNum; ++nIndex)
{
if (NULL != m_pMemberPointer[nIndex])
{
if (fDistance > pDefenders[0]->GetCurrentPos().GetDistance(m_pMemberPointer[nIndex]->GetCurrentPos()))
{
pDefenders[cDefenderNum] = m_pMemberPointer[nIndex];
++cDefenderNum;
if (AtNode::MAX_DEFENDER_NUM < cDefenderNum)
{
ERRLOG2(g_Log, "<EFBFBD><EFBFBD>Ƽ<EFBFBD>α<EFBFBD> : PID:0x%08x <20><>Ƽ <20><><EFBFBD>ݽ<EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ڼ<EFBFBD><DABC><EFBFBD> <20>ʰ<EFBFBD><CAB0>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD>ϴ<EFBFBD>. Num:%d",
m_Party.m_dwPartyID, cDefenderNum);
cDefenderNum = AtNode::MAX_DEFENDER_NUM;
break;
}
}
}
}
unsigned short wDefenserMPHeal[AtNode::MAX_DEFENDER_NUM] = {0, };
return lpOffencer->Attack(attackType, cDefenderNum, pDefenders, cDefenserJudges, wDefenserMPHeal);
}
CCharacterParty::CCharacterParty(const PARTY& PartyInfo, bool bCreate)
: CParty(PartyInfo), m_pHostileParty(NULL)
{
std::fill_n(&m_pMemberPointer[0], int(PARTY::MAX_MEM), reinterpret_cast<CCharacter *>(NULL));
std::fill_n(&m_bAutoRouting[0], int(PARTY::MAX_MEM), true);
std::fill_n(&m_pFightingMember[0], int(PARTY::MAX_MEM), reinterpret_cast<CCharacter *>(NULL));
memset(&m_partyMemberData, 0, sizeof(PartyMemberData) * PARTY::MAX_MEM);
if (!CPartyMgr::GetInstance().AddParty(this))
{
ERRLOG3(g_Log, "PID:0x%08x(0x%08x) / LeaderCID:0x%08x / <20><>Ƽ<EFBFBD>α<EFBFBD> : <20><>Ƽ <20><><EFBFBD><EFBFBD><EFBFBD>ڿ<EFBFBD> <20><>Ƽ <20>߰<EFBFBD> <20><><EFBFBD><EFBFBD>",
PartyInfo.m_dwPartyID, this, PartyInfo.m_dwLeaderID);
}
unsigned long dwServerID = CServerSetup::GetInstance().GetServerID();
for (int nMemberIndex = 0; nMemberIndex < m_Party.m_cMemberNum; ++nMemberIndex)
{
if (m_Party.ServerID[nMemberIndex] == dwServerID)
{
CCharacter *lpCharacter = CCreatureManager::GetInstance().GetCharacter(m_Party.MemberCID[nMemberIndex]);
if (NULL == lpCharacter)
{
ERRLOG4(g_Log, "<EFBFBD><EFBFBD>Ƽ<EFBFBD>α<EFBFBD> : (1)ij<><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ID<49><44> <20>߸<EFBFBD><DFB8>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD>ϴ<EFBFBD>. PartyUID:0x%08x, CharacterCID:0x%08x(0x%08x), ServerID:0x%08x",
m_Party.m_dwPartyID, m_Party.MemberCID[nMemberIndex], m_Party.ServerID[nMemberIndex], dwServerID);
continue;
}
LogChantBug(lpCharacter, this, "<EFBFBD><EFBFBD>Ƽ<EFBFBD>α<EFBFBD> : ij<><C4B3><EFBFBD><EFBFBD> <20><>Ƽ <20><><EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0><EFBFBD> <20>õ<EFBFBD><C3B5>մϴ<D5B4>.", LOG_FFLCHANT);
m_pMemberPointer[nMemberIndex] = lpCharacter;
m_PartySpellMgr.AddMember(lpCharacter);
SendPartyInfo(lpCharacter);
if (bCreate == true)
{
SendPartyCmdInfo(PktPC::PC_ACCEPT, lpCharacter);
}
}
}
}
CCharacterParty::CCharacterParty()
{
}
CCharacterParty::~CCharacterParty()
{
}
unsigned char CCharacterParty::GetRaceRate(void)
{
unsigned char cHumanNum = 0;
for (unsigned char cIndex = 0; cIndex < m_Party.m_cMemberNum; ++cIndex)
{
if (NULL != m_pMemberPointer[cIndex])
{
if (CClass::HUMAN == m_pMemberPointer[cIndex]->GetRace())
{
++cHumanNum;
}
}
}
return static_cast<unsigned char>(cHumanNum * 100.0f / m_Party.m_cMemberNum);
}
///////////////////////////////////////////////////////////////////////////////////
// Function : CCharacterParty::Join
//
// Description : <20><>Ƽ<EFBFBD><C6BC> ij<><C4B3><EFBFBD>͸<EFBFBD> <20><><EFBFBD>Խ<EFBFBD>Ŵ
//
// Inputs : dwSenderCID - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̵<EFBFBD>
// dwReferenceID - <20><><EFBFBD><EFBFBD> <20><><EFBFBD>̵<EFBFBD>
// strSenderName - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD>
//
// Outputs : None.
//
// Returns : bool - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
///////////////////////////////////////////////////////////////////////////////////
bool CCharacterParty::Join(unsigned long dwSenderCID, unsigned long dwReferenceID, const char* strSenderName, unsigned short wMapIndex)
{
if (m_Party.m_cMemberNum >= PARTY::MAX_MEM)
{
ERRLOG0(g_Log, "<EFBFBD><EFBFBD>Ƽ<EFBFBD>α<EFBFBD> : <20><>Ƽ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> á<><C3A1><EFBFBD>ϴ<EFBFBD>.");
return false;
}
CCharacter *lpCharacter = CCreatureManager::GetInstance().GetCharacter(dwSenderCID);
if (NULL != lpCharacter)
{
if (0 != strcmp(strSenderName, lpCharacter->GetCharacterName()))
{
ERRLOG4(g_Log, "<EFBFBD><EFBFBD>Ƽ<EFBFBD>α<EFBFBD> : PID:0x%08x <20><>Ƽ<EFBFBD><C6BC> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> ij<><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> <20>̻<EFBFBD><CCBB>մϴ<D5B4>. CID:0x%08x, <20><>¥<EFBFBD≯<EFBFBD>:%s, <20><><EFBFBD><EFBFBD><EFBFBD≯<EFBFBD>:%s",
m_Party.m_dwPartyID, dwSenderCID, lpCharacter->GetCharacterName(), strSenderName);
return false;
}
if (dwReferenceID != CServerSetup::GetInstance().GetServerID())
{
ERRLOG4(g_Log, "<EFBFBD><EFBFBD>Ƽ<EFBFBD>α<EFBFBD> : PID:0x%08x <20><>Ƽ<EFBFBD><C6BC> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> ij<><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>̵<EFBFBD><CCB5><EFBFBD> <20>̻<EFBFBD><CCBB>մϴ<D5B4>. CID:0x%08x, <20>̰<EFBFBD><CCB0><EFBFBD>SID:0x%08x, <20><><EFBFBD><EFBFBD>SID:0x%08x",
m_Party.m_dwPartyID, dwSenderCID, CServerSetup::GetInstance().GetServerID(), dwReferenceID);
return false;
}
}
for (int nMemberIndex = 0; nMemberIndex < m_Party.m_cMemberNum; ++nMemberIndex)
{
if (m_Party.MemberCID[nMemberIndex] == dwSenderCID)
{
ERRLOG0(g_Log, "<EFBFBD><EFBFBD>Ƽ<EFBFBD>α<EFBFBD> : <20>̹<EFBFBD> <20><> <20><>Ƽ<EFBFBD><C6BC> <20><><EFBFBD><EFBFBD><EFBFBD>Դϴ<D4B4>.");
return false;
}
}
SendPartyCommand(PktPC::PC_ACCEPT, strSenderName, dwSenderCID, dwReferenceID);
m_Party.MemberCID[m_Party.m_cMemberNum] = dwSenderCID;
::memcpy(m_Party.Name[m_Party.m_cMemberNum], strSenderName, CHAR_INFOST::MAX_NAME_LEN);
m_Party.ServerID[m_Party.m_cMemberNum] = dwReferenceID;
m_pMemberPointer[m_Party.m_cMemberNum] = lpCharacter;
++m_Party.m_cMemberNum;
if (lpCharacter)
{
LogChantBug(lpCharacter, this, "<EFBFBD><EFBFBD>Ƽ<EFBFBD>α<EFBFBD> : ij<><C4B3><EFBFBD><EFBFBD> <20><>Ƽ <20><><EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0><EFBFBD> <20>õ<EFBFBD><C3B5>մϴ<D5B4>.", LOG_FFLCHANT);
m_PartySpellMgr.AddMember(lpCharacter);
SendPartyInfo(lpCharacter);
SendPartyCmdInfo(PktPC::PC_ACCEPT, lpCharacter);
}
return true;
}
///////////////////////////////////////////////////////////////////////////////////
// Function : CCharacterParty::Leave
//
// Description : <20><>Ƽ<EFBFBD><C6BC><EFBFBD><EFBFBD> Ż<><C5BB>(<28><>)<29><>
//
// Inputs : dwSenderCID - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> or Ż<><C5BB><EFBFBD><EFBFBD>
// dwReferenceID - 0<≯<EFBFBD> ű. <20>׿ܿ<D7BF><DCBF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ż<><C5BB>(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ż<><C5BB><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD> Ż<><C5BB><EFBFBD>ÿ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD>)
//
// Outputs : None.
//
// Returns : 1 - <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>α<EFBFBD><CEB1>Ǿ<EFBFBD><C7BE>ִ<EFBFBD> <20><>Ƽ<EFBFBD><C6BC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>(<28><>Ƽ<EFBFBD>Ŵ<EFBFBD><C5B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
// 0 - <20><><EFBFBD><EFBFBD>
// -1 - Ż<><C5BB> <20><><EFBFBD><EFBFBD>(<28>α<EFBFBD> Ȯ<><C8AE>)
///////////////////////////////////////////////////////////////////////////////////
int CCharacterParty::Leave(unsigned long dwSenderCID, unsigned long dwReferenceID, unsigned short wMapIndex)
{
bool bSendPacket = false;
CCharacter* lpCharacter = NULL;
PktPC::PartyCmd partyCmd;
for (int nLoopIndex = 0; nLoopIndex < m_Party.m_cMemberNum; ++nLoopIndex)
{
if (m_Party.MemberCID[nLoopIndex] == dwSenderCID)
{
unsigned long dwServerID = CServerSetup::GetInstance().GetServerID();
partyCmd = (0 == dwReferenceID) ? PktPC::PC_BANISH : PktPC::PC_SECESSION;
SendPartyCommand(partyCmd, m_Party.Name[nLoopIndex], dwSenderCID, dwReferenceID);
// <20>α<EFBFBD><CEB1>Ǿ<EFBFBD> <20>ִ<EFBFBD> <20><EFBFBD>̶<EFBFBD><CCB6><EFBFBD> <20><>ȣ<EFBFBD><C8A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
lpCharacter = CCreatureManager::GetInstance().GetCharacter(dwSenderCID);
if (NULL != lpCharacter)
{
// <20><><EFBFBD><EFBFBD>Ʋ <20><><EFBFBD>̶<EFBFBD><CCB6><EFBFBD> <20><><EFBFBD><EFBFBD>
if (NULL != m_pHostileParty)
{
if (0 == DropMember(lpCharacter, PktDuC::DUC_DEAD))
{
m_pHostileParty->EndTeamBattle();
EndTeamBattle();
}
}
SendPartyCmdInfo(partyCmd, lpCharacter);
LogChantBug(lpCharacter, this, "ij<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ƽ <20><><EFBFBD><EFBFBD> <20><><EFBFBD>Ÿ<EFBFBD> <20>õ<EFBFBD><C3B5>մϴ<D5B4>.", LOG_FFLCHANT);
m_PartySpellMgr.RemoveMember(lpCharacter);
if (lpCharacter->GetPID() != m_Party.m_dwPartyID)
{
ERRLOG3(g_Log, "<EFBFBD><EFBFBD>Ƽ<EFBFBD>α<EFBFBD> : CID:0x%08x <20>߸<EFBFBD><DFB8><EFBFBD> <20><>Ƽ<EFBFBD><C6BC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>Ƽ<EFBFBD>Դϴ<D4B4>. ij<><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> PID:0x%08x, <20><><EFBFBD>μ<EFBFBD><CEBC><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><>Ƽ<EFBFBD><C6BC> PID:0x%08x",
lpCharacter->GetCID(), lpCharacter->GetPID(), m_Party.m_dwPartyID);
}
else
{
lpCharacter->SetParty(NULL);
lpCharacter->SetPID(0);
}
}
--m_Party.m_cMemberNum;
for (int nMoveIndex = nLoopIndex; nMoveIndex < m_Party.m_cMemberNum; ++nMoveIndex)
{
m_Party.MemberCID[nMoveIndex] = m_Party.MemberCID[nMoveIndex+1];
memcpy(m_Party.Name[nMoveIndex], m_Party.Name[nMoveIndex+1], CHAR_INFOST::MAX_NAME_LEN);
m_Party.ServerID[nMoveIndex] = m_Party.ServerID[nMoveIndex+1];
m_Party.m_wClass[nMoveIndex] = m_Party.m_wClass[nMoveIndex+1];
m_Party.m_cLevel[nMoveIndex] = m_Party.m_cLevel[nMoveIndex+1];
m_Party.m_dwGID[nMoveIndex] = m_Party.m_dwGID[nMoveIndex+1];
m_Party.m_bAutoRouting[nMoveIndex] = m_Party.m_bAutoRouting[nMoveIndex+1];
m_Party.m_Position[nMoveIndex] = m_Party.m_Position[nMoveIndex+1];
m_pMemberPointer[nMoveIndex] = m_pMemberPointer[nMoveIndex+1];
m_bAutoRouting[nMoveIndex] = m_bAutoRouting[nMoveIndex+1];
m_partyMemberData[nMoveIndex] = m_partyMemberData[nMoveIndex+1];
}
m_Party.MemberCID[m_Party.m_cMemberNum] = 0;
memset(m_Party.Name[m_Party.m_cMemberNum], NULL, CHAR_INFOST::MAX_NAME_LEN);
m_Party.ServerID[m_Party.m_cMemberNum] = 0;
m_Party.m_wClass[m_Party.m_cMemberNum] = 0;
m_Party.m_cLevel[m_Party.m_cMemberNum] = 0;
m_Party.m_dwGID[m_Party.m_cMemberNum] = 0;
m_Party.m_bAutoRouting[m_Party.m_cMemberNum] = true;
m_Party.m_Position[m_Party.m_cMemberNum].fPointX = 0.0f;
m_Party.m_Position[m_Party.m_cMemberNum].fPointY = 0.0f;
m_Party.m_Position[m_Party.m_cMemberNum].fPointZ = 0.0f;
m_pMemberPointer[m_Party.m_cMemberNum] = NULL;
m_bAutoRouting[m_Party.m_cMemberNum] = true;
memset(m_partyMemberData + m_Party.m_cMemberNum, 0, sizeof(PartyMemberData));
// <20>α<EFBFBD><CEB1><EFBFBD> <20><>Ƽ<EFBFBD><C6BC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ü <20><><EFBFBD><EFBFBD>
for (int nCheckIndex = 0; nCheckIndex < m_Party.m_cMemberNum; ++nCheckIndex)
{
if (m_Party.ServerID[nCheckIndex] == dwServerID)
{
return 0;
}
}
return 1;
}
}
ERRLOG2(g_Log, "<EFBFBD><EFBFBD>Ƽ<EFBFBD>α<EFBFBD> : <20><>Ƽ<EFBFBD><C6BC><EFBFBD><EFBFBD> <20>ƴ<EFBFBD> ij<><C4B3><EFBFBD>Ͱ<EFBFBD> Ż<><C5BB>(<28><>)<29>Ϸ<EFBFBD> <20>մϴ<D5B4>. PartyUID:0x%08x, CharacterCID:0x%08x",
m_Party.m_dwPartyID, dwSenderCID);
return -1;
}
///////////////////////////////////////////////////////////////////////////////////
// Function : CCharacterParty::Login
//
// Description : <20><>Ƽ<EFBFBD><C6BC><EFBFBD><EFBFBD> <20>α<EFBFBD><CEB1><EFBFBD>
//
// Inputs : dwSenderCID - <20>α<EFBFBD><CEB1><EFBFBD><EFBFBD><EFBFBD>
// dwReferenceID - <20><><EFBFBD><EFBFBD> <20><><EFBFBD>̵<EFBFBD>
//
// Outputs : None.
//
// Returns : bool - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
///////////////////////////////////////////////////////////////////////////////////
bool CCharacterParty::Login(unsigned long dwSenderCID, unsigned long dwReferenceID)
{
for (int nMemberIndex=0; nMemberIndex<m_Party.m_cMemberNum; ++nMemberIndex)
{
if (m_Party.MemberCID[nMemberIndex] == dwSenderCID)
{
m_Party.ServerID[nMemberIndex] = dwReferenceID;
if(!GetLeader())
{
SetLeader(dwSenderCID);
}
CCharacter *lpCharacter = CCreatureManager::GetInstance().GetCharacter(dwSenderCID);
if (NULL != lpCharacter)
{
SendPartyCommand(PktPC::PC_LOGIN, m_Party.Name[nMemberIndex], dwSenderCID, dwReferenceID);
LogChantBug(lpCharacter, this, "<EFBFBD><EFBFBD>Ƽ<EFBFBD>α<EFBFBD> : ij<><C4B3><EFBFBD><EFBFBD> <20><>Ƽ <20><><EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0><EFBFBD> <20>õ<EFBFBD><C3B5>մϴ<D5B4>.", LOG_FFLCHANT);
m_pMemberPointer[nMemberIndex] = lpCharacter;
m_PartySpellMgr.AddMember(lpCharacter);
SendPartyInfo(lpCharacter);
}
else
{
SendPartyCommand(PktPC::PC_LOGIN, m_Party.Name[nMemberIndex], dwSenderCID, dwReferenceID);
}
return true;
}
}
ERRLOG2(g_Log, "<EFBFBD><EFBFBD>Ƽ<EFBFBD>α<EFBFBD> : <20><>Ƽ<EFBFBD><C6BC><EFBFBD><EFBFBD> <20>ƴ<EFBFBD> ij<><C4B3><EFBFBD>͸<EFBFBD> <20><>Ƽ<EFBFBD><C6BC> <20>α<EFBFBD><CEB1><EFBFBD>Ű<EFBFBD><C5B0> <20>մϴ<D5B4>. PartyUID:0x%08x, CharacterCID:0x%08x",
m_Party.m_dwPartyID, dwSenderCID);
return false;
}
///////////////////////////////////////////////////////////////////////////////////
// Function : CCharacterParty::ReLogin
//
// Description : <20><>Ƽ<EFBFBD><C6BC><EFBFBD><EFBFBD> <20><><EFBFBD>α<EFBFBD><CEB1><EFBFBD>
//
// Inputs : llpCharacter - ij<><C4B3><EFBFBD><EFBFBD>
//
// Outputs : None.
//
// Returns : bool - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
///////////////////////////////////////////////////////////////////////////////////
bool CCharacterParty::ReLogin(CCharacter* lpCharacter)
{
if (NULL != lpCharacter)
{
SendPartyCommand(PktPC::PC_RELOGIN, lpCharacter->GetCharacterName(), lpCharacter->GetCID(), 0);
SendPartyInfo(lpCharacter);
return true;
}
return false;
}
///////////////////////////////////////////////////////////////////////////////////
// Function : CCharacterParty::Logout
//
// Description : <20><>Ƽ<EFBFBD><C6BC><EFBFBD><EFBFBD> <20>α׾ƿ<D7BE><C6BF><EFBFBD>
//
// Inputs : dwSenderCID - <20>α׾ƿ<D7BE><C6BF><EFBFBD>
// dwReferenceID - <20><><EFBFBD><EFBFBD> <20><><EFBFBD>̵<EFBFBD> // <20><><EFBFBD><EFBFBD> <20><><EFBFBD>̵<EFBFBD><CCB5><EFBFBD> <20>ƴϰ<C6B4> <20><><EFBFBD><EFBFBD> <20><>Ƽ<EFBFBD><C6BC> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>̵<EFBFBD> <20>ε<EFBFBD> (03/11/07) by <20><><EFBFBD><EFBFBD>
//
// Outputs : None.
//
// Returns : 1 - <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>α<EFBFBD><CEB1>Ǿ<EFBFBD><C7BE>ִ<EFBFBD> <20><>Ƽ<EFBFBD><C6BC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>(<28><>Ƽ<EFBFBD>Ŵ<EFBFBD><C5B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
// 0 - <20><><EFBFBD><EFBFBD>
// -1 - <20>α׾ƿ<D7BE> <20><><EFBFBD><EFBFBD>(<28>α<EFBFBD> Ȯ<><C8AE>)
///////////////////////////////////////////////////////////////////////////////////
int CCharacterParty::Logout(unsigned long dwSenderCID, unsigned long dwReferenceID)
{
unsigned long dwServerID = CServerSetup::GetInstance().GetServerID();
AddressInfo Address;
for (int nLoopIndex = 0; nLoopIndex < m_Party.m_cMemberNum; ++nLoopIndex)
{
if (m_Party.MemberCID[nLoopIndex] == dwSenderCID)
{
if (0 != m_pMemberPointer[nLoopIndex])
{
LogChantBug(m_pMemberPointer[nLoopIndex], this, "<EFBFBD><EFBFBD>Ƽ<EFBFBD>α<EFBFBD> : ij<><C4B3><EFBFBD><EFBFBD> <20><>Ƽ <20><><EFBFBD><EFBFBD> <20><><EFBFBD>Ÿ<EFBFBD> <20>õ<EFBFBD><C3B5>մϴ<D5B4>.", LOG_FFLCHANT);
m_PartySpellMgr.RemoveMember(m_pMemberPointer[nLoopIndex]);
}
m_Party.ServerID[nLoopIndex] = 0;
m_pMemberPointer[nLoopIndex] = 0;
m_bAutoRouting[nLoopIndex] = true;
// <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>α<EFBFBD><CEB1><EFBFBD> <20><>Ƽ<EFBFBD><C6BC><EFBFBD><EFBFBD> 1<><31> <20>̻<EFBFBD> <20>־<EFBFBD><D6BE><EFBFBD> <20><>Ŷ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ƽ <20><>ü<EFBFBD><C3BC> <20><><EFBFBD><EFBFBD>.
for (int nCheckIndex = 0; nCheckIndex < m_Party.m_cMemberNum; ++nCheckIndex)
{
if (m_Party.ServerID[nCheckIndex] == dwServerID)
{
SendPartyCommand(PktPC::PC_LOGOUT, m_Party.Name[nLoopIndex],
dwSenderCID, dwReferenceID);
return 0;
}
}
return 1;
}
}
ERRLOG2(g_Log, "<EFBFBD><EFBFBD>Ƽ<EFBFBD>α<EFBFBD> : <20><>Ƽ<EFBFBD><C6BC><EFBFBD><EFBFBD> <20>ƴ<EFBFBD> ij<><C4B3><EFBFBD>͸<EFBFBD> <20><>Ƽ<EFBFBD><C6BC><EFBFBD><EFBFBD> <20>α׾ƿ<D7BE><C6BF><EFBFBD>Ű<EFBFBD><C5B0> <20>մϴ<D5B4>. PartyUID:0x%08x, CharacterCID:0x%08x",
m_Party.m_dwPartyID, dwSenderCID);
return -1;
}
///////////////////////////////////////////////////////////////////////////////////
// Function : CCharacterParty::PrepareLogout
//
// Description : <20>߰<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20>α׾ƿ<D7BE><C6BF><EFBFBD> <20>˸<EFBFBD><CBB8><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20>ʱ<EFBFBD>ȭ<EFBFBD>Ѵ<EFBFBD>.
// (<28>߰<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ȯ<><C8AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>α׾ƿ<D7BE><C6BF>ؼ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD>)
//
// Returns : None.
///////////////////////////////////////////////////////////////////////////////////
void CCharacterParty::PrepareLogout(unsigned long dwMemberID)
{
for (int nLoopIndex = 0; nLoopIndex < m_Party.m_cMemberNum; ++nLoopIndex)
{
if (m_Party.MemberCID[nLoopIndex] == dwMemberID)
{
if (0 != m_pMemberPointer[nLoopIndex])
{
LogChantBug(m_pMemberPointer[nLoopIndex], this, "<EFBFBD><EFBFBD>Ƽ<EFBFBD>α<EFBFBD> : ij<><C4B3><EFBFBD><EFBFBD> <20><>Ƽ <20><><EFBFBD><EFBFBD> <20><><EFBFBD>Ÿ<EFBFBD> <20>õ<EFBFBD><C3B5>մϴ<D5B4>.", LOG_FFLCHANT);
m_PartySpellMgr.RemoveMember(m_pMemberPointer[nLoopIndex]);
}
m_pMemberPointer[nLoopIndex] = 0;
memset(m_partyMemberData + nLoopIndex, 0, sizeof(PartyMemberData));
return;
}
}
}
///////////////////////////////////////////////////////////////////////////////////
// Function : CCharacterParty::TransferLeader
//
// Description : <20><><EFBFBD><EFBFBD> <20>
//
// Inputs : dwLeaderCID - <20><> <20><><EFBFBD><EFBFBD>
//
// Outputs : None.
//
// Returns : bool - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
///////////////////////////////////////////////////////////////////////////////////
bool CCharacterParty::TransferLeader(unsigned long dwLeaderCID)
{
for (int nMemberIndex = 0; nMemberIndex < m_Party.m_cMemberNum; ++nMemberIndex)
{
if (m_Party.MemberCID[nMemberIndex] == dwLeaderCID)
{
SendPartyCommand(PktPC::PC_TRANSFER, m_Party.Name[nMemberIndex],
dwLeaderCID, m_Party.m_dwLeaderID);
m_Party.m_dwLeaderID = dwLeaderCID;
CPartyMgr::GetInstance().DeleteFindMemberList(m_Party.m_dwPartyID);
return true;
}
}
ERRLOG2(g_Log, "<EFBFBD><EFBFBD>Ƽ<EFBFBD>α<EFBFBD> : <20><>Ƽ<EFBFBD><C6BC><EFBFBD><EFBFBD> <20>ƴ<EFBFBD> ij<><C4B3><EFBFBD>Ϳ<EFBFBD><CDBF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD>Ϸ<EFBFBD> <20>մϴ<D5B4>. PartyUID:0x%08x, CharacterCID:0x%08x",
m_Party.m_dwPartyID, dwLeaderCID);
return false;
}
///////////////////////////////////////////////////////////////////////////////////
// Function : CCharacterParty::GetLoggedMemberAverageLevel
//
// Description : <20>α<EFBFBD><CEB1><EFBFBD><EFBFBD><EFBFBD> <20><>Ƽ<EFBFBD><C6BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
//
// Inputs : None.
//
// Outputs : None.
//
// Returns : unsigned char - <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
///////////////////////////////////////////////////////////////////////////////////
unsigned char CCharacterParty::GetLoggedMemberAverageLevel(void)
{
unsigned char aryMemberLevel[PARTY::MAX_MEM] = {0, };
unsigned short nSumLevel = 0;
unsigned char nLoggedMemberNum = 0;
for (int nMemberIndex = 0; nMemberIndex < m_Party.m_cMemberNum; ++nMemberIndex)
{
if (NULL != m_pMemberPointer[nMemberIndex])
{
nSumLevel += m_pMemberPointer[nMemberIndex]->GetStatus().m_nLevel;
++nLoggedMemberNum;
}
}
if (0 == nLoggedMemberNum)
{
ERRLOG0(g_Log, "<EFBFBD><EFBFBD>Ƽ<EFBFBD>α<EFBFBD> : <20>߸<EFBFBD><DFB8><EFBFBD> <20><>Ƽ <20><>ü<EFBFBD>Դϴ<D4B4>. <20>α<EFBFBD><CEB1><EFBFBD> <20><>Ƽ<EFBFBD><C6BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0<>Դϴ<D4B4>.");
return 0;
}
return static_cast<unsigned char>(nSumLevel / nLoggedMemberNum);
}
///////////////////////////////////////////////////////////////////////////////////
// Function : CCharacterParty::Destory
//
// Description : <20><>Ƽ <20>ı<EFBFBD> (<28><>Ŷ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȣ<EFBFBD><C8A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. <20><>ü <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.)
//
// Inputs : dwSenderCID - <20>ƹ<EFBFBD><C6B9>ų<EFBFBD>
// dwReferenceID - <20>ƹ<EFBFBD><C6B9>ų<EFBFBD>
//
// Outputs : None.
//
// Returns : bool - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
///////////////////////////////////////////////////////////////////////////////////
bool CCharacterParty::Destory(unsigned long dwSenderCID, unsigned long dwReferenceID)
{
if (2 != m_Party.m_cMemberNum)
{
ERRLOG2(g_Log, "<EFBFBD><EFBFBD>Ƽ<EFBFBD>α<EFBFBD> : <20><>Ƽ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 2<><32><EFBFBD><EFBFBD> <20>ƴѵ<C6B4> <20><>ü<EFBFBD>Ϸ<EFBFBD> <20>մϴ<D5B4>. PartyUID:0x%08x, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> %d<><64>.",
m_Party.m_dwPartyID, m_Party.m_cMemberNum);
return false;
}
SendPartyCommand(PktPC::PC_DESTROY, "<EFBFBD><EFBFBD>Ƽ<EFBFBD>ı<EFBFBD>", dwSenderCID, dwReferenceID);
LogChantBug(0, this, "<EFBFBD><EFBFBD>Ƽ<EFBFBD>α<EFBFBD> : ij<><C4B3><EFBFBD><EFBFBD> <20><>Ƽ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>Ÿ<EFBFBD> <20>õ<EFBFBD><C3B5>մϴ<D5B4>.", LOG_FFLCHANT);
m_PartySpellMgr.ClearMember();
for (int nMemberIndex = 0; nMemberIndex < 2; ++nMemberIndex)
{
if (NULL != m_pMemberPointer[nMemberIndex])
{
// <20><><EFBFBD><EFBFBD>Ʋ <20><><EFBFBD>̶<EFBFBD><CCB6><EFBFBD> <20><><EFBFBD><EFBFBD>
if (NULL != m_pHostileParty)
{
if (0 == DropMember(m_pMemberPointer[nMemberIndex], PktDuC::DUC_DEAD))
{
m_pHostileParty->EndTeamBattle();
EndTeamBattle();
}
}
SendPartyCmdInfo(PktPC::PC_DESTROY, m_pMemberPointer[nMemberIndex]);
if (m_pMemberPointer[nMemberIndex]->GetPID() != m_Party.m_dwPartyID)
{
ERRLOG3(g_Log, "<EFBFBD><EFBFBD>Ƽ<EFBFBD>α<EFBFBD> : CID:0x%08x <20>߸<EFBFBD><DFB8><EFBFBD> <20><>Ƽ<EFBFBD><C6BC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>Ƽ<EFBFBD>Դϴ<D4B4>. ij<><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> PID:0x%08x, <20><><EFBFBD>μ<EFBFBD><CEBC><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><>Ƽ<EFBFBD><C6BC> PID:0x%08x",
m_pMemberPointer[nMemberIndex]->GetCID(), m_pMemberPointer[nMemberIndex]->GetPID(), m_Party.m_dwPartyID);
continue;
}
m_pMemberPointer[nMemberIndex]->SetParty(NULL);
m_pMemberPointer[nMemberIndex]->SetPID(0);
}
}
return true;
}
///////////////////////////////////////////////////////////////////////////////////
// Function : CCharacterParty::GetNearMemberList
//
// Description : <20><>ó<EFBFBD><C3B3> <20><>Ƽ<EFBFBD><C6BC> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD>
//
// Inputs : pCell - <20><>ó<EFBFBD><C3B3> <20><>Ƽ<EFBFBD><C6BC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϴ<EFBFBD> <20>߽<EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// bAutoRouting - <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> üũ
//
// Outputs : aryNearCharacterList - <20><>ó<EFBFBD><C3B3> <20><>Ƽ<EFBFBD><C6BC> <20><><EFBFBD><EFBFBD>Ʈ
// cHighestLevel - <20><>ó<EFBFBD><C3B3> <20><>Ƽ<EFBFBD><C6BC> <20><> <20>ְ<EFBFBD> <20><><EFBFBD><EFBFBD>
//
// Returns : int - <20><>ó<EFBFBD><C3B3> <20><>Ƽ<EFBFBD><C6BC> <20><>
///////////////////////////////////////////////////////////////////////////////////
int CCharacterParty::GetNearMemberList(CCell *pCell, bool bAutoRouting, CCharacter **aryNearCharacterList, unsigned char &cHighestLevel)
{
if (NULL == pCell) { return 0; }
int nNearPartyMemberNum = 0;
for (int nIndex = 0; nIndex < m_Party.m_cMemberNum; ++nIndex)
{
if (NULL == m_pMemberPointer[nIndex])
{
continue;
}
if (0 == m_pMemberPointer[nIndex]->GetStatus().m_nNowHP)
{
continue;
}
if (true == bAutoRouting)
{
if (false == m_bAutoRouting[nIndex])
{
continue;
}
}
if (pCell->IsNearCell(m_pMemberPointer[nIndex]->GetCellPos().m_lpCell))
{
aryNearCharacterList[nNearPartyMemberNum] = m_pMemberPointer[nIndex];
const int nThisLevel = aryNearCharacterList[nNearPartyMemberNum]->GetStatus().m_nLevel;
cHighestLevel = max(cHighestLevel, unsigned char(nThisLevel));
++nNearPartyMemberNum;
}
}
return nNearPartyMemberNum;
}
///////////////////////////////////////////////////////////////////////////////////
// Function : CCharacterParty::AdjustAutoRouting
//
// Description : <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
//
// Params : dwTargetID[In] - <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
// bSwitch[In] - On/Off
//
// Returns : bool - <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
///////////////////////////////////////////////////////////////////////////////////
bool CCharacterParty::AdjustAutoRouting(unsigned long dwTargetID, bool bSwitch)
{
bool bResult = false;
for (int nIndex = 0; nIndex < PARTY::MAX_MEM; ++nIndex)
{
if (0 == dwTargetID)
{
m_bAutoRouting[nIndex] = bSwitch;
bResult = true;
continue;
}
if (m_Party.MemberCID[nIndex] == dwTargetID)
{
if (m_bAutoRouting[nIndex] == bSwitch)
{
ERRLOG2(g_Log, "<EFBFBD><EFBFBD>Ƽ<EFBFBD>α<EFBFBD> : CID:0x%08x <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ũ<EFBFBD><C5A9> <20><><EFBFBD><EFBFBD> <20>ʽ<EFBFBD><CABD>ϴ<EFBFBD>. PID:0x%08x",
dwTargetID, m_Party.m_dwPartyID);
}
m_bAutoRouting[nIndex] = bSwitch;
bResult = true;
break;
}
}
if (false == bResult)
{
ERRLOG2(g_Log, "<EFBFBD><EFBFBD>Ƽ<EFBFBD>α<EFBFBD> : CID:0x%08x <20><>Ƽ<EFBFBD><C6BC><EFBFBD><EFBFBD> <20>ƴ<EFBFBD> ij<><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ϸ<EFBFBD> <20>մϴ<D5B4>. PID:0x%08x",
dwTargetID, m_Party.m_dwPartyID);
}
else
{
PktPC::PartyCmd partyCmd = (true == bSwitch) ? PktPC::PC_AUTOROUTING_ON : PktPC::PC_AUTOROUTING_OFF;
SendPartyCommand(partyCmd, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", dwTargetID, m_Party.m_dwLeaderID);
}
return bResult;
}
///////////////////////////////////////////////////////////////////////////////////
// Function : CCharacterParty::AutoRouting
//
// Description : <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
//
// Params : lpPickkingCreature[In] - <20><><EFBFBD><EFBFBD> <20>
// lpItem[In] - <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// dwGold[InOut] - <20><><EFBFBD><EFBFBD> <20>ݾ<EFBFBD>
//
// Returns : bool - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õǾ<C3B5> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ٲ<EFBFBD><D9B2><EFBFBD><EFBFBD>°<EFBFBD>?
///////////////////////////////////////////////////////////////////////////////////
bool CCharacterParty::AutoRouting(CAggresiveCreature* lpPickkingCreature, Item::CItem* lpItem, unsigned long& dwGold)
{
CCharacter *aryNearCharacterList[PARTY::MAX_MEM];
unsigned char cHighestLevel = 0;
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ѿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ó <20><>Ƽ<EFBFBD><C6BC> <20><><EFBFBD>ο<EFBFBD><CEBF><EFBFBD> <20>й<EFBFBD>
const int nNearPartyMemberNum = GetNearMemberList(lpPickkingCreature->GetCellPos().m_lpCell,
(0 == dwGold) ? true : false, aryNearCharacterList, cHighestLevel);
if (0 == nNearPartyMemberNum) { return false; }
if (0 != dwGold)
{
unsigned long dwEachGold = dwGold / nNearPartyMemberNum;
dwGold = dwEachGold + (dwGold - dwEachGold * nNearPartyMemberNum);
for (int nIndex = 0; nIndex < nNearPartyMemberNum; ++nIndex)
{
CCharacter* lpNearCharacter = aryNearCharacterList[nIndex];
if (lpNearCharacter == lpPickkingCreature) { continue; }
lpNearCharacter->AddGold(dwEachGold, true);
}
return false;
}
else if (NULL != lpItem)
{
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
unsigned char cRandomNum =
static_cast<unsigned char>(Math::Random::ComplexRandom(nNearPartyMemberNum));
CCharacter* lpOrderCharacter = aryNearCharacterList[cRandomNum];
if (lpPickkingCreature == lpOrderCharacter)
{
return false;
}
else
{
if (true == lpOrderCharacter->GiveItem(lpItem))
{
SendAutoRouting(lpOrderCharacter->GetCID(), lpItem->GetPrototypeID(), PktAutoRouting::ARC_POSSIBLE);
// GiveItem <20><><EFBFBD><EFBFBD> <20><><EFBFBD>õ<EFBFBD> <20><><EFBFBD><EFBFBD>, AutoRouting() ȣ<><C8A3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Item <20><> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
return true;
}
}
}
return false;
}
bool CCharacterParty::Attack(AtType attackType, CAggresiveCreature** pDefenders, unsigned char* cDefenserJudges,
CAggresiveCreature* lpOffencer, float fDistance, unsigned char cTargetType)
{
unsigned char cDefenderNum = 0;
for (int nIndex = 0; nIndex < m_Party.m_cMemberNum; ++nIndex)
{
if (NULL != m_pMemberPointer[nIndex])
{
if (fDistance > pDefenders[0]->GetCurrentPos().GetDistance(m_pMemberPointer[nIndex]->GetCurrentPos()))
{
if (true == m_pMemberPointer[nIndex]->GetEnchantInfo().GetFlag(Skill::SpellID::Hide))
{
continue;
}
if (Skill::Target::FRIEND == cTargetType)
{
if (EnemyCheck::EC_FRIEND != lpOffencer->IsEnemy(m_pMemberPointer[nIndex]))
{
continue;
}
if (lpOffencer->GetMapIndex() != m_pMemberPointer[nIndex]->GetMapIndex())
{
continue;
}
}
pDefenders[cDefenderNum] = m_pMemberPointer[nIndex];
++cDefenderNum;
if (AtNode::MAX_DEFENDER_NUM < cDefenderNum)
{
ERRLOG2(g_Log, "<EFBFBD><EFBFBD>Ƽ<EFBFBD>α<EFBFBD> : PID:0x%08x <20><>Ƽ <20><><EFBFBD>ݽ<EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ڼ<EFBFBD><DABC><EFBFBD> <20>ʰ<EFBFBD><CAB0>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD>ϴ<EFBFBD>. Num:%d",
m_Party.m_dwPartyID, cDefenderNum);
cDefenderNum = AtNode::MAX_DEFENDER_NUM;
break;
}
}
}
}
unsigned short wDefenserMPHeal[AtNode::MAX_DEFENDER_NUM] = {0, };
return lpOffencer->Attack(attackType, cDefenderNum, pDefenders, cDefenserJudges, wDefenserMPHeal);
}
bool CCharacterParty::StartTeamBattle(CCharacterParty* pHostileParty)
{
if (NULL != m_pHostileParty) { return false; }
m_pHostileParty = pHostileParty;
int nFightingMemberNum = 0;
for (int nIndex = 0; nIndex < PARTY::MAX_MEM; ++nIndex)
{
if (NULL != m_pMemberPointer[nIndex])
{
m_pFightingMember[nFightingMemberNum] = m_pMemberPointer[nIndex];
++nFightingMemberNum;
}
}
const int MAX_BUFFER = sizeof(PktTBInfo) + PARTY::MAX_MEM * (sizeof(unsigned long) + sizeof(unsigned char));
char Buffer[MAX_BUFFER];
unsigned short dwBufferSize = 0;
if (true == pHostileParty->MakeTeamBattleInfo(Buffer, dwBufferSize, NULL, PktTBInfo::DUC_PARTY_READY))
{
SendAllLoggedMember(Buffer, dwBufferSize, 0, CmdCharTeamBattleInfo);
}
return true;
}
int CCharacterParty::DropMember(CCharacter* pDropMember, PktDuC::DuelCmd eCmd)
{
if (NULL == pDropMember) { return -1; }
for (int nIndex = 0; nIndex < PARTY::MAX_MEM; ++nIndex)
{
if (pDropMember == m_pFightingMember[nIndex])
{
CGameClientDispatch* lpDispatch = pDropMember->GetDispatcher();
if (NULL != lpDispatch)
{
GameClientSendPacket::SendCharDuelCmd(lpDispatch->GetSendStream(),
pDropMember->GetCID(), m_pHostileParty->GetLeader(), eCmd, PktDuC::NO_SERVER_ERR);
}
m_pHostileParty->SendDropMember(pDropMember, eCmd);
int nRemainMemberNum = 0;
for (nRemainMemberNum = nIndex; nRemainMemberNum < PARTY::MAX_MEM-1; ++nRemainMemberNum)
{
m_pFightingMember[nRemainMemberNum] = m_pFightingMember[nRemainMemberNum+1];
if (NULL == m_pFightingMember[nRemainMemberNum+1])
{
return nRemainMemberNum;
}
}
m_pFightingMember[PARTY::MAX_MEM-1] = NULL;
return PARTY::MAX_MEM-1;
}
}
return -1;
}
void CCharacterParty::EndTeamBattle(void)
{
if (NULL == m_pHostileParty)
{
ERRLOG0(g_Log, "<EFBFBD><EFBFBD>Ƽ<EFBFBD>α<EFBFBD> : <20><><EFBFBD><EFBFBD>Ʋ<EFBFBD><C6B2> <20>ϰ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʴ<EFBFBD> <20><>Ƽ<EFBFBD>Դϴ<D4B4>.");
}
for (int nIndex = 0; nIndex < PARTY::MAX_MEM; ++nIndex)
{
if (NULL == m_pFightingMember[nIndex]) { break; }
CGameClientDispatch* lpDispatch = m_pFightingMember[nIndex]->GetDispatcher();
if (NULL != lpDispatch)
{
GameClientSendPacket::SendCharDuelCmd(lpDispatch->GetSendStream(),
m_pFightingMember[nIndex]->GetCID(), m_pFightingMember[nIndex]->GetCID(), PktDuC::DUC_CANCEL, PktDuC::NO_SERVER_ERR);
}
}
m_pHostileParty = NULL;
std::fill_n(&m_pFightingMember[0], int(PARTY::MAX_MEM), reinterpret_cast<CCharacter *>(NULL));
}
bool CCharacterParty::MakeTeamBattleInfo(char* szPacket, unsigned short& dwPacketSize, CCharacter* pChallenger, unsigned char cCmd)
{
PktTBInfo* lpPktTBInfo = reinterpret_cast<PktTBInfo*>(szPacket);
dwPacketSize = sizeof(PktTBInfo);
if (NULL != pChallenger)
{
lpPktTBInfo->m_dwCharID = pChallenger->GetCID();
::strncpy(lpPktTBInfo->m_strChallengerName, pChallenger->GetCharacterName(), CHAR_INFOST::MAX_NAME_LEN);
}
lpPktTBInfo->m_cCmd = cCmd;
lpPktTBInfo->m_cMemberNum = 0;
unsigned long dwServerID = CServerSetup::GetInstance().GetServerID();
for (int nMemberIndex = 0; nMemberIndex < m_Party.m_cMemberNum; ++nMemberIndex)
{
CCharacter* lpCharacter = m_pMemberPointer[nMemberIndex];
if (NULL != lpCharacter)
{
if (m_Party.ServerID[nMemberIndex] == dwServerID)
{
unsigned long* dwCID = reinterpret_cast<unsigned long*>(szPacket + sizeof(PktTBInfo) +
lpPktTBInfo->m_cMemberNum * (sizeof(unsigned long) + sizeof(unsigned char)));
unsigned char* cLevel = reinterpret_cast<unsigned char*>(szPacket + sizeof(PktTBInfo) +
lpPktTBInfo->m_cMemberNum * (sizeof(unsigned long) + sizeof(unsigned char)) + sizeof(unsigned long));
*dwCID = lpCharacter->GetCID();
*cLevel = lpCharacter->GetStatus().m_nLevel;
++lpPktTBInfo->m_cMemberNum;
dwPacketSize += sizeof(unsigned long) + sizeof(unsigned char);
}
}
}
return PacketWrap::WrapCrypt(szPacket, dwPacketSize, CmdCharTeamBattleInfo, 0, 0);
}
void CCharacterParty::MovePos(POS NewPos, char cZone, const bool bSitDown)
{
for (int nMemberIndex = 0; nMemberIndex < m_Party.m_cMemberNum; ++nMemberIndex)
{
CCharacter* lpCharacter = m_pMemberPointer[nMemberIndex];
if (NULL != lpCharacter)
{
lpCharacter->MovePos(NewPos, cZone, bSitDown);
}
}
}
void CCharacterParty::MoveZone(POS NewPos, char Zone, char Channel)
{
for (int nMemberIndex = 0; nMemberIndex < m_Party.m_cMemberNum; ++nMemberIndex)
{
CCharacter* lpCharacter = m_pMemberPointer[nMemberIndex];
if (NULL != lpCharacter)
{
lpCharacter->MoveZone(NewPos, Zone, Channel);
}
}
}
// ----------------------------------------------------------------------------------------
// Send <20><><EFBFBD><EFBFBD> <20>޼ҵ<DEBC>
void CCharacterParty::SendPartyCommand(PktPC::PartyCmd Command, const char *SenderName_In,
unsigned long dwSenderCID, unsigned long dwReferenceID)
{
PktPCAck pktPCAck;
pktPCAck.m_cCmd = Command;
pktPCAck.m_dwPartyID = m_Party.m_dwPartyID;
strncpy(pktPCAck.m_strSenderName, SenderName_In, CHAR_INFOST::MAX_NAME_LEN);
pktPCAck.m_dwSenderID = dwSenderCID;
pktPCAck.m_dwReferenceID = dwReferenceID;
memset(&pktPCAck.m_SenderAddressInfo, 0, sizeof(AddressInfo));
char* szPacket = reinterpret_cast<char*>(&pktPCAck);
if (PacketWrap::WrapCrypt(szPacket, sizeof(PktPCAck), CmdCharPartyCmd, 0, 0))
{
const unsigned long dwExclusion = (Command == PktPC::PC_LOGIN) ? dwSenderCID : 0;
SendAllLoggedMember(szPacket, sizeof(PktPCAck), dwExclusion, CmdCharPartyCmd);
}
}
void CCharacterParty::SendPartyInfo(CCharacter *lpCharacter)
{
if (NULL != lpCharacter)
{
CPartyMgr::GetInstance().DeleteFindPartyList(lpCharacter->GetCID());
lpCharacter->SetParty(this);
lpCharacter->SetPID(m_Party.m_dwPartyID);
CGameClientDispatch* lpDispatch = lpCharacter->GetDispatcher();
if (NULL != lpDispatch)
{
CSendStream& SendStream = lpDispatch->GetSendStream();
char* lpBuffer = SendStream.GetBuffer(sizeof(PktPI));
if (NULL != lpBuffer)
{
PktPI* lpPktPI = reinterpret_cast<PktPI*>(lpBuffer);
PARTY_EX PartyEx(m_Party);
for (int nIndex = 0; nIndex < m_Party.m_cMemberNum; ++nIndex)
{
CCharacter* lpMember = 0;
if (0 != m_Party.MemberCID[nIndex] &&
(0 != (lpMember = CCreatureManager::GetInstance().GetCharacter(m_Party.MemberCID[nIndex]))))
{
m_pMemberPointer[nIndex] = lpMember;
PartyEx.m_cLevel[nIndex] = lpMember->GetStatus().m_nLevel;
PartyEx.m_wClass[nIndex] = lpMember->GetClass();
PartyEx.m_bAutoRouting[nIndex] = m_bAutoRouting[nIndex];
}
else
{
m_pMemberPointer[nIndex] = 0;
}
}
lpPktPI->m_Party = PartyEx;
SendStream.WrapCrypt(sizeof(PktPI), CmdCharPartyInfo, 0, 0);
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ѱ<EFBFBD><D1B1><EFBFBD>.
const unsigned short MAX_PACKET_SIZE = (sizeof(PartyMemberData) +
sizeof(unsigned long)) * PARTY::MAX_MEM * 2 + sizeof(PktBase);
char szPacket[MAX_PACKET_SIZE];
char* szPacketPos = szPacket + sizeof(PktBase);
unsigned long dwServerID = CServerSetup::GetInstance().GetServerID();
for (int nMemberIndex = 0; nMemberIndex < m_Party.m_cMemberNum; ++nMemberIndex)
{
if (m_Party.ServerID[nMemberIndex] == dwServerID &&
0 != m_Party.MemberCID[nMemberIndex] &&
0 != m_pMemberPointer[nMemberIndex])
{
// <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Flag<61><67> Set<65>Ѵ<EFBFBD>.
SetUpdateFlag(m_partyMemberData[nMemberIndex], *m_pMemberPointer[nMemberIndex], szPacketPos, true);
}
}
unsigned short usPacketSize = static_cast<unsigned short>(szPacketPos - szPacket);
if (sizeof(PktBase) < usPacketSize &&
PacketWrap::WrapCrypt(szPacket, usPacketSize, CmdCharPartyMemInfo, 0, 0))
{
SendStream.PutBuffer(szPacket, usPacketSize, CmdCharPartyMemInfo);
}
// <20><> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20>ٸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E9BFA1> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
for (int nMemberIndex = 0; nMemberIndex < m_Party.m_cMemberNum; ++nMemberIndex)
{
if (m_Party.MemberCID[nMemberIndex] == lpCharacter->GetCID())
{
szPacketPos = szPacket + sizeof(PktBase);
SetUpdateFlag(m_partyMemberData[nMemberIndex],
*m_pMemberPointer[nMemberIndex], szPacketPos, true);
break;
}
}
usPacketSize = static_cast<unsigned short>(szPacketPos - szPacket);
if (sizeof(PktBase) < usPacketSize &&
PacketWrap::WrapCrypt(szPacket, usPacketSize, CmdCharPartyMemInfo, 0, 0))
{
for (int nMemberIndex = 0; nMemberIndex < m_Party.m_cMemberNum; ++nMemberIndex)
{
if (m_Party.ServerID[nMemberIndex] == dwServerID &&
0 != m_Party.MemberCID[nMemberIndex] &&
0 != m_pMemberPointer[nMemberIndex] &&
lpCharacter != m_pMemberPointer[nMemberIndex])
{
// <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
CGameClientDispatch* lpDispatch =
m_pMemberPointer[nMemberIndex]->GetDispatcher();
if (0 != lpDispatch)
{
lpDispatch->GetSendStream().PutBuffer(
szPacket, usPacketSize, CmdCharPartyMemInfo);
}
}
}
}
}
}
}
void CCharacterParty::SendPartyCmdInfo(PktPC::PartyCmd Command, CCharacter* lpCharacter)
{
CCell* lpCell = 0;
if (0 != lpCharacter &&
0 != (lpCell = lpCharacter->GetCellPos().m_lpCell))
{
PktPCInfo pktPCInfo;
memset(&pktPCInfo, 0, sizeof(PktPCInfo));
pktPCInfo.m_cCmd = Command;
pktPCInfo.m_dwPartyID = m_Party.m_dwPartyID;
pktPCInfo.m_dwMemberID = lpCharacter->GetCID();
lpCell->SendAllNearCellCharacter(&pktPCInfo, sizeof(PktPCInfo), CmdCharPartyCmdInfo);
}
}
void CCharacterParty::SendAllLoggedMember(const char* szPacket, unsigned long dwPacketSize,
unsigned long dwExclusion, unsigned char cCMD_In)
{
unsigned long dwServerID = CServerSetup::GetInstance().GetServerID();
for (int nMemberIndex = 0; nMemberIndex < m_Party.m_cMemberNum; ++nMemberIndex)
{
if (0 != dwExclusion && dwExclusion == m_Party.MemberCID[nMemberIndex])
{
continue;
}
CCharacter* lpCharacter = m_pMemberPointer[nMemberIndex];
if (NULL != lpCharacter)
{
if (m_Party.ServerID[nMemberIndex] != dwServerID)
{
ERRLOG4(g_Log, "<EFBFBD><EFBFBD>Ƽ<EFBFBD>α<EFBFBD> : (2)ij<><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ID<49><44> <20>߸<EFBFBD><DFB8>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD>ϴ<EFBFBD>. PartyUID:0x%08x, CharacterCID:0x%08x(0x%08x), ServerID:0x%08x",
m_Party.m_dwPartyID, m_Party.MemberCID[nMemberIndex], m_Party.ServerID[nMemberIndex], dwServerID);
}
else
{
CGameClientDispatch* lpDispatch = lpCharacter->GetDispatcher();
if (NULL != lpDispatch)
{
lpDispatch->GetSendStream().PutBuffer(szPacket, dwPacketSize, cCMD_In);
}
}
}
}
}
bool CCharacterParty::SendMemberInfoOutNZone(unsigned long dwCID, unsigned short wCmd)
{
unsigned long dwGameServerID = CServerSetup::GetInstance().GetServerID();
for(int nMemberIndex = 0; nMemberIndex < m_Party.m_cMemberNum; ++nMemberIndex)
{
CCharacter* lpCharacter = m_pMemberPointer[nMemberIndex];
if(lpCharacter)
{
// ij<><C4B3><EFBFBD>Ϳ<EFBFBD><CDBF><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD> //
CGameClientDispatch* lpDispatch = lpCharacter->GetDispatcher();
if(lpDispatch)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>α׾ƿ<D7BE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> //
char* lpBuffer = lpDispatch->GetSendStream().GetBuffer(sizeof(PktPMD));
PktPMD* pktPMD = reinterpret_cast<PktPMD*>(lpBuffer);
pktPMD->m_dwPartyID = m_Party.m_dwPartyID;
pktPMD->m_dwSenderID = dwCID;
pktPMD->m_wCmd = wCmd;
if (!lpDispatch->GetSendStream().WrapCrypt(sizeof(PktPMD),
CmdCharPartyMemData, 0, PktBase::NO_SERVER_ERR))
{
return false;
}
}
}
}
return false;
}
bool CCharacterParty::SendMemberInfoAllNZone(unsigned long dwCID)
{
unsigned long dwGameServerID = CServerSetup::GetInstance().GetServerID();
for(int nMemberIndex = 0; nMemberIndex < m_Party.m_cMemberNum; ++nMemberIndex)
{
CCharacter* lpCharacter = m_pMemberPointer[nMemberIndex];
if(lpCharacter)
{
// ij<><C4B3><EFBFBD>Ϳ<EFBFBD><CDBF><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD> //
if(lpCharacter->GetCID()==dwCID)
{
CGameClientDispatch* lpDispatch = lpCharacter->GetDispatcher();
if(lpDispatch)
{
for(int nIndex = 0; nIndex < m_Party.m_cMemberNum; ++nIndex)
{
if(m_Party.MemberCID[nIndex])
{
if(dwGameServerID!=m_Party.ServerID[nIndex])
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
char* lpBuffer = lpDispatch->GetSendStream().GetBuffer(sizeof(PktPMD));
PktPMD* pktPMD = reinterpret_cast<PktPMD*>(lpBuffer);
pktPMD->m_dwPartyID = m_Party.m_dwPartyID;
pktPMD->m_dwSenderID = m_Party.MemberCID[nIndex];
pktPMD->m_dwGID = m_Party.m_dwGID[nIndex];
pktPMD->m_dwServerID = m_Party.ServerID[nIndex];
pktPMD->m_wClass = m_Party.m_wClass[nIndex];
pktPMD->m_cLevel = m_Party.m_cLevel[nIndex];
pktPMD->m_wCmd = PktDD::SCmdLoginPartyMem;
if (!lpDispatch->GetSendStream().WrapCrypt(sizeof(PktPMD),
CmdCharPartyMemData, 0, PktBase::NO_SERVER_ERR))
{
return false;
}
}
}
}
}
return true;
}
}
}
return false;
}
void CCharacterParty::SendMemberInfoNZone(const char* szPacket, unsigned long dwPacketSize, unsigned long dwSenderID, unsigned char cCMD_In)
{
unsigned long dwGameServerID = CServerSetup::GetInstance().GetServerID();
unsigned long dwServerID = 0;
for(int nIndex = 0; nIndex < m_Party.m_cMemberNum; ++nIndex)
{
if(dwSenderID==m_Party.MemberCID[nIndex])
{
dwServerID = m_Party.ServerID[nIndex];
break;
}
}
for(int nMemberIndex = 0; nMemberIndex < m_Party.m_cMemberNum; ++nMemberIndex)
{
CCharacter* lpCharacter = m_pMemberPointer[nMemberIndex];
if(lpCharacter)
{
// <20>ٸ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD> ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD><EFBFBD> //
if(dwGameServerID!=dwServerID)
{
CGameClientDispatch* lpDispatch = lpCharacter->GetDispatcher();
if(lpDispatch)
{
lpDispatch->GetSendStream().PutBuffer(szPacket, dwPacketSize, cCMD_In);
}
}
}
}
}
void CCharacterParty::SendNotNearCellMember(const char* szPacket, unsigned long dwPacketSize,
CCell* lpCell, unsigned char cCMD_In)
{
unsigned long dwServerID = CServerSetup::GetInstance().GetServerID();
for (int nMemberIndex = 0; nMemberIndex < m_Party.m_cMemberNum; ++nMemberIndex)
{
CCharacter* lpCharacter = m_pMemberPointer[nMemberIndex];
if (0 != m_Party.MemberCID[nMemberIndex] &&
dwServerID == m_Party.ServerID[nMemberIndex] &&
0 != lpCharacter)
{
CCell* lpMemberCell = lpCharacter->GetCellPos().m_lpCell;
CGameClientDispatch* lpDispatch = lpCharacter->GetDispatcher();
if (0 != lpDispatch && 0 != lpMemberCell && !lpMemberCell->IsNearCell(lpCell))
{
lpDispatch->GetSendStream().PutBuffer(
szPacket, dwPacketSize, cCMD_In);
}
}
}
}
void CCharacterParty::SendDivisionExp(CCharacter* lpCharacter, CAggresiveCreature* lpDeadCreature,
unsigned long dwExp, int nStandardLevel)
{
//Minotaurs <20><>Ƽ<EFBFBD><C6BC><EFBFBD><EFBFBD>ġ (?)(?)(?)(?)(?)(?)(?)(?)(?)(?)(?)(?)(?)(?)(?)(?)(?)(?)(?)(?)(?)(?)(?)(?)(?)
CCharacter *aryNearCharacterList[PARTY::MAX_MEM];
unsigned char cHighestLevel = 0;
const int nNearPartyMemberNum =
GetNearMemberList(lpDeadCreature->GetCellPos().m_lpCell, false, aryNearCharacterList, cHighestLevel);
if (0 == nNearPartyMemberNum)
{
ERRLOG1(g_Log, "<EFBFBD><EFBFBD>Ƽ<EFBFBD>α<EFBFBD> : <20><><EFBFBD><EFBFBD>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ƽ<EFBFBD><C6BC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. Party ID:0x%08x", m_Party.m_dwPartyID);
return;
}
for (int nIndex = 0; nIndex < nNearPartyMemberNum; ++nIndex)
{
CCharacter* lpNearCharacter = aryNearCharacterList[nIndex];
// <20><><EFBFBD><EFBFBD> <20>й<EFBFBD> : <20><>Ƽ <20><> <20><><EFBFBD><EFBFBD>ġ * (EXP_BALANCE_HANDLE - (<28><>Ƽ<EFBFBD><C6BC> <20><> <20>ְ<EFBFBD> <20><><EFBFBD><EFBFBD> - <20>ڽ<EFBFBD><DABD><EFBFBD> <20><><EFBFBD><EFBFBD>)) / (<28>ֺ<EFBFBD><D6BA><EFBFBD> <20>ִ<EFBFBD> <20><>Ƽ<EFBFBD><C6BC> <20><> * EXP_BALANCE_HANDLE) * <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int nFriendlyLevelGap = CThreat::EXP_BALANCE_HANDLE - (cHighestLevel - lpNearCharacter->GetStatus().m_nLevel);
nFriendlyLevelGap = (nFriendlyLevelGap < 0) ? 0 : nFriendlyLevelGap;
unsigned long dwIndividualExp = static_cast<unsigned long>( (dwExp * nFriendlyLevelGap) /
(nNearPartyMemberNum * CThreat::EXP_BALANCE_HANDLE) * lpDeadCreature->GetThreat().GetAggravation(lpNearCharacter) );
/*
// <20>յ<EFBFBD> <20>й<EFBFBD> : <20><>Ƽ <20><> <20><><EFBFBD><EFBFBD>ġ / <20>ֺ<EFBFBD><D6BA><EFBFBD> <20>ִ<EFBFBD> <20><>Ƽ<EFBFBD><C6BC> <20><>
unsigned long dwIndividualExp = dwExp / nNearPartyMemberNum;
*/
if (::abs(nStandardLevel - lpNearCharacter->GetStatus().m_nLevel) > CThreat::EXP_CONSENT_GAP || dwIndividualExp < 1)
{
dwIndividualExp = 1;
}
lpNearCharacter->GetHuntingExp(lpDeadCreature, dwIndividualExp, nNearPartyMemberNum);
}
}
void CCharacterParty::SendDropMember(CCharacter* pDropMember, PktDuC::DuelCmd eCmd)
{
for (int nIndex = 0; nIndex < PARTY::MAX_MEM; ++nIndex)
{
if (NULL == m_pFightingMember[nIndex]) { break; }
CGameClientDispatch* lpDispatch = m_pFightingMember[nIndex]->GetDispatcher();
if (NULL == lpDispatch) { continue; }
GameClientSendPacket::SendCharDuelCmd(lpDispatch->GetSendStream(),
pDropMember->GetCID(), m_pFightingMember[nIndex]->GetCID(), eCmd, PktDuC::NO_SERVER_ERR);
}
}
void CCharacterParty::SendRecall(CCharacter* lpCaster)
{
PktAPAck pktAPAck;
pktAPAck.m_dwCasterID = lpCaster->GetCID();
strncpy(pktAPAck.m_szCasterName, lpCaster->GetCharacterName(), CHAR_INFOST::MAX_NAME_LEN);
pktAPAck.m_cCmd = PktAP::AP_RECALL;
char* szPacket = reinterpret_cast<char*>(&pktAPAck);
if (PacketWrap::WrapCrypt(szPacket, sizeof(PktAPAck), CmdCharAuthorizePanel, 0, PktBase::NO_SERVER_ERR))
{
unsigned long dwServerID = CServerSetup::GetInstance().GetServerID();
for (int nMemberIndex = 0; nMemberIndex < m_Party.m_cMemberNum; ++nMemberIndex)
{
CCharacter* lpCharacter = m_pMemberPointer[nMemberIndex];
if (NULL != lpCharacter)
{
if (lpCaster == lpCharacter)
{
// <20>ڱ<EFBFBD> <20>ڽ<EFBFBD><DABD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ´<CAB4>.
continue;
}
// edith 2009.04.26 <20><><EFBFBD>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD><EFBFBD>, ij<><C4B3><EFBFBD>Ͱ<EFBFBD> <20>ǽ<EFBFBD><C7BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ÿ<><C5B8><EFBFBD><EFBFBD> <20>ǽ<EFBFBD><C7BD><EFBFBD><EFBFBD><20>ƴϸ<C6B4> <20><><EFBFBD>ݺҰ<DDBA>
if (true == lpCaster->IsPeaceMode() && false == lpCharacter->IsPeaceMode())
{
// ij<><C4B3><EFBFBD>Ͱ<EFBFBD> <20>ǽ<EFBFBD><C7BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ÿ<><C5B8><EFBFBD><EFBFBD> <20>ǽ<EFBFBD><C7BD><EFBFBD><EFBFBD><20>ƴϸ<C6B4> <20><><EFBFBD>ݺҰ<DDBA>
continue;
}
if (lpCharacter->IsRideArms())
{
// <20><><EFBFBD>⿡ ž<><C5BE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ´<CAB4>.
continue;
}
if (true == lpCharacter->GetEnchantInfo().GetFlag(Skill::SpellID::Hide))
{
// Hide <20><><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD>ʹ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ȵȴ<C8B5>.
continue;
}
if (lpCharacter->GetRejectOption().Reject.m_Recall == 1)
{
// <20><><EFBFBD>ݰźλ<C5BA><CEBB><EFBFBD>
continue;
}
if (EnemyCheck::EC_FRIEND != lpCaster->IsEnemy(lpCharacter))
{
// <20>Ʊ<EFBFBD><C6B1><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD> <20>Ѵ<EFBFBD>.
continue;
}
if (lpCaster->GetMapIndex() != lpCharacter->GetMapIndex())
{
// <20>ٸ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ұ<EFBFBD><D2B0><EFBFBD><EFBFBD>ϴ<EFBFBD>.
continue;
}
if (m_Party.ServerID[nMemberIndex] != dwServerID)
{
ERRLOG4(g_Log, "<EFBFBD><EFBFBD>Ƽ<EFBFBD>α<EFBFBD> : (3)ij<><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ID<49><44> <20>߸<EFBFBD><DFB8>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD>ϴ<EFBFBD>. PartyUID:0x%08x, CharacterCID:0x%08x(0x%08x), ServerID:0x%08x",
m_Party.m_dwPartyID, m_Party.MemberCID[nMemberIndex], m_Party.ServerID[nMemberIndex], dwServerID);
}
else
{
CGameClientDispatch* lpDispatch = lpCharacter->GetDispatcher();
if (NULL != lpDispatch)
{
lpDispatch->GetSendStream().PutBuffer(szPacket, sizeof(PktAPAck), CmdCharAuthorizePanel);
}
}
}
}
}
}
void CCharacterParty::SendAutoRouting(unsigned long dwCharID, unsigned short wItemID, unsigned char cCmd)
{
PktAutoRouting pktAR;
pktAR.m_dwCharID = dwCharID;
pktAR.m_nObjectID = 0;
pktAR.m_wItemID = wItemID;
pktAR.m_cNum = 0;
pktAR.m_cCmd = cCmd;
char* szPacket = reinterpret_cast<char*>(&pktAR);
if (PacketWrap::WrapCrypt(szPacket, sizeof(PktAutoRouting), CmdCharAutoRouting, 0, 0))
{
SendAllLoggedMember(szPacket, sizeof(PktAutoRouting), dwCharID, CmdCharAutoRouting);
}
}
void CCharacterParty::SendPartyMemberDataToDBAgent(unsigned long dwSenderID, unsigned long dwGID, unsigned short wClass, unsigned long dwServerID,
char cLevel, const char* strSenderName, unsigned short usCmd)
{
GET_SINGLE_DISPATCH(lpDBAgentDispatch,
CDBAgentDispatch, CDBAgentDispatch::GetDispatchTable());
if (0 == lpDBAgentDispatch)
{
ERRLOG0(g_Log, "<EFBFBD><EFBFBD>Ƽ<EFBFBD>α<EFBFBD> : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.");
}
else
{
GameClientSendPacket::SendPartyMemberData(lpDBAgentDispatch->GetSendStream(), GetUID(),
dwSenderID, dwGID, wClass, dwServerID, cLevel, strSenderName, usCmd);
}
}
void CCharacterParty::SendDivisionFame(CCharacter* lpWinnerCharacter, CCharacter* lpLoserCharacter,
unsigned char cCmd, unsigned char cAcquireAmount)
{
CCharacter* aryNearCharacterList[PARTY::MAX_MEM] = { 0, };
unsigned char cHighestLevel = 0;
const int nNearPartyMemberNum =
GetNearMemberList(lpWinnerCharacter->GetCellPos().m_lpCell, false, aryNearCharacterList, cHighestLevel);
if (0 == nNearPartyMemberNum)
{
ERRLOG1(g_Log, "<EFBFBD><EFBFBD>Ƽ<EFBFBD>α<EFBFBD> : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ƽ<EFBFBD><C6BC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. Party ID : 0x%08x", m_Party.m_dwPartyID);
return;
}
CCharacterParty* lpLoserParty = reinterpret_cast<CCharacterParty*>(lpLoserCharacter->GetParty());
CCharacterParty* lpWinnerParty = reinterpret_cast<CCharacterParty*>(lpWinnerCharacter->GetParty());
GAMELOG::ERRType eReturnCode = 0;
for (unsigned char cMemberIndex = 0; cMemberIndex < nNearPartyMemberNum; ++cMemberIndex)
{
unsigned char cCmdPerMember = cCmd;
CCharacter* lpCharacter = aryNearCharacterList[cMemberIndex];
if (NULL != lpCharacter)
{
// edith 2009.12.26 <20><><EFBFBD><EFBFBD> 20<32>̻<EFBFBD><CCBB≯<EFBFBD> <20>׾<EFBFBD><D7BE><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ó<EFBFBD><C3B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʴ´<CAB4>.
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>޴<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 20<32><30><EFBFBD>̻<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ʴ´<CAB4>.
unsigned char cWinCmd = cCmd;
int iLevelGap = lpCharacter->GetLevel() - lpLoserCharacter->GetLevel();
if (iLevelGap >= 20)
cWinCmd = PktFIAck::FAME_WIN_LEVELMIN;
unsigned long dwPrevFame = 0;
unsigned long dwNextFame = 0;
unsigned long dwPrevMileage = 0;
unsigned long dwNextMileage = 0;
// <20>Ҽ<EFBFBD><D2BC><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ø<EFBFBD>
unsigned long dwGetAward = static_cast<unsigned long>(ceil(cAcquireAmount / static_cast<float>(nNearPartyMemberNum)));
if(PktFIAck::FAME_WIN == cWinCmd)
{
unsigned long dwPrevFame = lpCharacter->GetFame();
unsigned long dwGetFame = std::min(dwGetAward * static_cast<unsigned long>(CServerSetup::GetInstance().GetFameDefault() / 100.0f),
UINT_MAX - lpCharacter->GetFame());
unsigned long dwNextFame = dwPrevFame + dwGetFame;
lpCharacter->SetFame(dwNextFame);
}
if (PktFIAck::FAME_WIN == cWinCmd || PktFIAck::FAME_WIN_LEVELMIN == cWinCmd )
{
unsigned long dwPrevMileage = lpCharacter->GetMileage();
unsigned long dwNextMileage = dwPrevMileage;
// edith 2009.06.27 <20>޴<EFBFBD><DEB4><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>϶<EFBFBD><CFB6><EFBFBD> <20><><EFBFBD>´<EFBFBD>.
if (SERVER_ID::CAPITAL == CServerSetup::GetInstance().GetServerZone())
{
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0≯<EFBFBD>
if (CGameTimeMgr::GetInstance().IsGuildWarTime())
{
unsigned long dwGetMileage = std::min(dwGetAward * static_cast<unsigned long>(CServerSetup::GetInstance().GetMileageDefault() / 100.0f),
UINT_MAX - lpCharacter->GetMileage());
dwNextMileage = dwPrevMileage + dwGetMileage;
}
}
else if (SERVER_ID::STONE_WAR1 <= CServerSetup::GetInstance().GetServerZone() && CServerSetup::GetInstance().GetServerZone() <= SERVER_ID::STONE_WAR3)
{
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD> <20>ƴ϶<C6B4><CFB6><EFBFBD>, <20><><EFBFBD><EFBFBD> <20><>æƮ ȿ<><C8BF><EFBFBD><EFBFBD> <20>ɾ<EFBFBD><C9BE>ش<EFBFBD>.
if (CGameTimeMgr::GetInstance().IsRealmWarTime())
{
unsigned long dwGetMileage = std::min(dwGetAward * static_cast<unsigned long>(CServerSetup::GetInstance().GetMileageDefault() / 100.0f),
UINT_MAX - lpCharacter->GetMileage());
dwNextMileage = dwPrevMileage + dwGetMileage;
}
}
lpCharacter->SetMileage(dwNextMileage);
GAMELOG::LogFameGetBattle(*lpCharacter, lpLoserCharacter, lpWinnerParty,
dwPrevFame, dwNextFame, dwPrevMileage, dwNextMileage, eReturnCode);
}
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ڰ<EFBFBD> <20>ƴ<EFBFBD> <20><>Ƽ<EFBFBD><C6BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>޼<EFBFBD><DEBC><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
if (lpWinnerCharacter != lpCharacter)
{
switch (cWinCmd)
{
case PktFIAck::FAME_LOSE: cCmdPerMember = PktFIAck::FAME_LOSE_MEMBER; break;
case PktFIAck::FAME_WIN_DUEL: cCmdPerMember = PktFIAck::FAME_WIN_MEMBER_DUEL; break;
case PktFIAck::FAME_WIN_LARGE_GAP: cCmdPerMember = PktFIAck::FAME_WIN_MEMBER_LARGE_GAP; break;
case PktFIAck::FAME_WIN_CONTINUE: cCmdPerMember = PktFIAck::FAME_WIN_MEMBER_CONTINUE; break;
case PktFIAck::FAME_WIN: cCmdPerMember = PktFIAck::FAME_WIN_MEMBER; break;
case PktFIAck::FAME_WIN_LEVELMIN: cCmdPerMember = PktFIAck::FAME_WIN_MEMBER_LEVELMIN; break;
}
}
CGameClientDispatch* lpDispatch = lpCharacter->GetDispatcher();
if (NULL != lpDispatch)
{
if (PktFIAck::FAME_LOSE_MEMBER == cCmdPerMember)
{
GameClientSendPacket::SendCharFameInfo(lpDispatch->GetSendStream(), lpCharacter,
lpWinnerCharacter->GetCharacterName(), lpLoserCharacter->GetCharacterName(),
lpWinnerCharacter->GetNation(), (unsigned char)lpWinnerCharacter->GetClass(),
cCmdPerMember, PktBase::NO_SERVER_ERR);
}
else
{
GameClientSendPacket::SendCharFameInfo(lpDispatch->GetSendStream(), lpCharacter,
lpWinnerCharacter->GetCharacterName(), lpLoserCharacter->GetCharacterName(),
lpLoserCharacter->GetNation(), (unsigned char)lpLoserCharacter->GetClass(),
cCmdPerMember, PktBase::NO_SERVER_ERR);
}
}
}
}
}
bool CCharacterParty::StartQuest(Quest::QuestNode* lpQuestNode, const Position& CenterPos, unsigned long dwNPCID)
{
if (!lpQuestNode) return false;
unsigned long dwServerID = CServerSetup::GetInstance().GetServerID();
unsigned short wError;
for (int nMemberIndex=0; nMemberIndex<m_Party.m_cMemberNum; ++nMemberIndex)
{
wError = PktStartQuest::NO_SERVER_ERR;
CCharacter* lpCharacter = m_pMemberPointer[nMemberIndex];
if (NULL != lpCharacter)
{
if (m_Party.ServerID[nMemberIndex] == dwServerID)
{
if (lpCharacter->GetCurrentPos().GetDistance(CenterPos) > Quest::PARTY_QUEST_DIST)
{
wError = PktStartQuest::FAIL_TOO_FAR_PARTY;
}
else
{
if (false == lpCharacter->CheckQuest(lpQuestNode, wError))
{
continue;
}
else
{
if (false == lpCharacter->GiveQuest(lpQuestNode))
{
wError = PktStartQuest::FAIL_FULL_QUEST;
}
}
}
CGameClientDispatch* lpDispatch = lpCharacter->GetDispatcher();
if (NULL != lpDispatch)
{
GameClientSendPacket::SendCharStartQuest(lpDispatch->GetSendStream(),
lpCharacter->GetCID(), dwNPCID,
lpQuestNode->m_wQuestID, wError);
if (PktStartQuest::NO_SERVER_ERR == wError)
{
lpCharacter->StartPhase(lpQuestNode->m_wQuestID, 1);
}
}
}
}
}
return true;
}
bool CCharacterParty::CheckTrigger(unsigned long dwExceptCID, unsigned char cTriggerKind, unsigned long dwReferenceID, Position Pos, short wCount)
{
unsigned long dwServerID = CServerSetup::GetInstance().GetServerID();
for (int nMemberIndex = 0; nMemberIndex < m_Party.m_cMemberNum; ++nMemberIndex)
{
// <20>̹<EFBFBD> <20>ڽ<EFBFBD><DABD><EFBFBD> Ʈ<><C6AE><EFBFBD>Ŵ<EFBFBD> <20>ߵ<EFBFBD><DFB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̹Ƿ<CCB9>, <20>Ѿ<D1BE><EEB0A3>.
if (dwExceptCID == m_Party.MemberCID[nMemberIndex])
{
continue;
}
CCharacter* lpCharacter = m_pMemberPointer[nMemberIndex];
if (NULL == lpCharacter || m_Party.ServerID[nMemberIndex] != dwServerID)
{
continue;
}
float fDX = fabs( lpCharacter->GetCurrentPos().m_fPointX - Pos.m_fPointX );
float fDZ = fabs( lpCharacter->GetCurrentPos().m_fPointZ - Pos.m_fPointZ );
float fDist = sqrtf( fDX * fDX + fDZ * fDZ );
if (fDist > Quest::PARTY_QUEST_DIST)
{
continue;
}
for (int nQuestIndex = 0; nQuestIndex < Quest::MAX_EXECUTING_QUEST; ++nQuestIndex)
{
Quest::ExecutingQuest* lpExecutingQuest = lpCharacter->GetExecutingQuest();
if (NULL != lpExecutingQuest[nQuestIndex].m_QuestNode && lpExecutingQuest[nQuestIndex].m_QuestNode->IsPartyQuest())
{
PhaseNode* phaseNode = lpExecutingQuest[nQuestIndex].m_QuestNode->m_lstPhase[lpExecutingQuest[nQuestIndex].m_cPhase - 1];
for (size_t nTriggerIndex = 0; nTriggerIndex < phaseNode->m_lstTrigger.size(); nTriggerIndex++)
{
if (cTriggerKind == phaseNode->m_lstTrigger[nTriggerIndex]->m_dwTriggerKind)
{
bool bOperateTrigger = false;
switch (cTriggerKind)
{
case TRIGGER_START:
break;
case TRIGGER_PUTON:
if (dwReferenceID == phaseNode->m_lstTrigger[nTriggerIndex]->m_dwTriggerID)
{
Position TriggerPos(phaseNode->m_lstTrigger[nTriggerIndex]->m_fPosX,
phaseNode->m_lstTrigger[nTriggerIndex]->m_fPosY,
phaseNode->m_lstTrigger[nTriggerIndex]->m_fPosZ);
if (Pos.GetDistance(TriggerPos) <= phaseNode->m_lstTrigger[nTriggerIndex]->m_fDistance)
{
bOperateTrigger = true;
}
}
break;
case TRIGGER_GETON:
case TRIGGER_TALK:
break;
case TRIGGER_KILL:
case TRIGGER_PICK:
if (dwReferenceID == phaseNode->m_lstTrigger[nTriggerIndex]->m_dwTriggerID)
{
bOperateTrigger = true;
}
break;
case TRIGGER_FAME:
if (lpCharacter->GetFame() >= phaseNode->m_lstTrigger[nTriggerIndex]->m_dwTriggerID)
{
bOperateTrigger = true;
}
break;
case TRIGGER_LEVEL_TALK:
if (lpCharacter->GetLevel() >= phaseNode->m_lstTrigger[nTriggerIndex]->m_dwLevel)
{
bOperateTrigger = true;
}
break;
case TRIGGER_FAME_TALK:
if (lpCharacter->GetFame() >= phaseNode->m_lstTrigger[nTriggerIndex]->m_dwLevel)
{
bOperateTrigger = true;
}
break;
case TRIGGER_ABILITY_TALK:
/*
if (lpCharacter->GetFame() >= phaseNode->m_lstTrigger[nTriggerIndex]->m_dwLevel)
{
bOperateTrigger = true;
}
*/
break;
}
if (true == bOperateTrigger)
{
lpExecutingQuest[nQuestIndex].m_cTriggerCount[nTriggerIndex] -= wCount;
lpCharacter->OperateTrigger(lpExecutingQuest[nQuestIndex].m_QuestNode->m_wQuestID,
lpExecutingQuest[nQuestIndex].m_cPhase, static_cast<unsigned char>(nTriggerIndex),
lpExecutingQuest[nQuestIndex].m_cTriggerCount[nTriggerIndex], Pos);
bOperateTrigger = false;
}
}
}
}
}
}
return true;
/*
unsigned long dwServerID = CServerSetup::GetInstance().GetServerID();
for (int nMemberIndex = 0; nMemberIndex < m_Party.m_cMemberNum; ++nMemberIndex)
{
CCharacter* lpCharacter = m_pMemberPointer[nMemberIndex];
if (NULL == lpCharacter || m_Party.ServerID[nMemberIndex] != dwServerID)
{
continue;
}
float fDX = fabs( lpCharacter->GetCurrentPos().m_fPointX - Pos.m_fPointX );
float fDZ = fabs( lpCharacter->GetCurrentPos().m_fPointZ - Pos.m_fPointZ );
float fDist = sqrtf( fDX * fDX + fDZ * fDZ );
if (fDist > Quest::PARTY_QUEST_DIST)
{
continue;
}
for (int nQuestIndex = 0; nQuestIndex < Quest::MAX_EXECUTING_QUEST; ++nQuestIndex)
{
Quest::ExecutingQuest* lpExecutingQuest = lpCharacter->GetExecutingQuest();
if (NULL != lpExecutingQuest[nQuestIndex].m_QuestNode &&
wQuestID == lpExecutingQuest[nQuestIndex].m_QuestNode->m_wQuestID)
{
PhaseNode* phaseNode = lpExecutingQuest[nQuestIndex].m_QuestNode->m_lstPhase[lpExecutingQuest[nQuestIndex].m_cPhase - 1];
for (size_t nTriggerIndex = 0; nTriggerIndex < phaseNode->m_lstTrigger.size(); nTriggerIndex++)
{
if (cTriggerKind == phaseNode->m_lstTrigger[nTriggerIndex]->m_dwTriggerKind)
{
bool bOperateTrigger = false;
switch (cTriggerKind)
{
case TRIGGER_START:
break;
case TRIGGER_PUTON:
if (dwReferenceID == phaseNode->m_lstTrigger[nTriggerIndex]->m_dwTriggerID)
{
Position TriggerPos(phaseNode->m_lstTrigger[nTriggerIndex]->m_fPosX,
phaseNode->m_lstTrigger[nTriggerIndex]->m_fPosY,
phaseNode->m_lstTrigger[nTriggerIndex]->m_fPosZ);
if (Pos.GetDistance(TriggerPos) <= phaseNode->m_lstTrigger[nTriggerIndex]->m_fDistance)
{
bOperateTrigger = true;
}
}
break;
case TRIGGER_GETON:
case TRIGGER_TALK:
break;
case TRIGGER_KILL:
case TRIGGER_PICK:
if (dwReferenceID == phaseNode->m_lstTrigger[nTriggerIndex]->m_dwTriggerID)
{
bOperateTrigger = true;
}
break;
case TRIGGER_FAME:
if (dwReferenceID >= phaseNode->m_lstTrigger[nTriggerIndex]->m_dwTriggerID)
{
bOperateTrigger = true;
}
break;
case TRIGGER_LEVEL_TALK:
break;
case TRIGGER_FAME_TALK:
break;
case TRIGGER_ABILITY_TALK:
break;
}
if (true == bOperateTrigger)
{
lpExecutingQuest[nQuestIndex].m_cTriggerCount[nTriggerIndex] -= wCount;
lpCharacter->OperateTrigger(lpExecutingQuest[nQuestIndex].m_QuestNode->m_wQuestID,
lpExecutingQuest[nQuestIndex].m_cPhase, static_cast<unsigned char>(nTriggerIndex),
lpExecutingQuest[nQuestIndex].m_cTriggerCount[nTriggerIndex], Pos);
bOperateTrigger = false;
}
}
}
}
}
}
return true;
*/
}
void CCharacterParty::OperateTrigger(unsigned short wQuestID, unsigned char cPhase, unsigned char cTrigger, unsigned char cCount, Position Pos)
{
unsigned long dwServerID = CServerSetup::GetInstance().GetServerID();
for (int nMemberIndex=0; nMemberIndex<m_Party.m_cMemberNum; ++nMemberIndex)
{
CCharacter* lpCharacter = m_pMemberPointer[nMemberIndex];
if (NULL != lpCharacter)
{
if (m_Party.ServerID[nMemberIndex] == dwServerID)
{
if (lpCharacter->GetCurrentPos().GetDistance(Pos) > Quest::PARTY_QUEST_DIST)
{
continue;
}
else
{
unsigned short wError = lpCharacter->OperateTrigger(wQuestID, cPhase, cTrigger, cCount, lpCharacter->GetCurrentPos());
if (PktOperateTrigger::NO_SERVER_ERR != wError)
{
ERRLOG3(g_Log, "<EFBFBD><EFBFBD>Ƽ<EFBFBD>α<EFBFBD> : CID:0x%08x Ʈ<><C6AE><EFBFBD><EFBFBD> <20>ߵ<EFBFBD><DFB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߻<EFBFBD><DFBB>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD>ϴ<EFBFBD>. <20><><EFBFBD><EFBFBD>Ʈ:%d, <20><><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>:%d", lpCharacter->GetCID(), wQuestID, wError);
}
}
}
}
}
}
void CCharacterParty::UpdateData()
{
unsigned long dwServerID = CServerSetup::GetInstance().GetServerID();
const unsigned short MAX_PACKET_SIZE = (sizeof(PartyMemberData) +
sizeof(unsigned long)) * PARTY::MAX_MEM + sizeof(PktBase);
char szPacket[MAX_PACKET_SIZE];
char* szPacketPos = szPacket + sizeof(PktBase);
for (int nMemberIndex = 0; nMemberIndex < m_Party.m_cMemberNum; ++nMemberIndex)
{
if (m_Party.ServerID[nMemberIndex] == dwServerID && 0 != m_Party.MemberCID[nMemberIndex])
{
CCharacter* lpCharacter = CCreatureManager::GetInstance().GetCharacter(m_Party.MemberCID[nMemberIndex]);
if (NULL != lpCharacter)
{
// <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Flag<61><67> Set<65>Ѵ<EFBFBD>.
SetUpdateFlag(m_partyMemberData[nMemberIndex], *lpCharacter, szPacketPos, false);
}
else
{
// <20><><EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD> ij<><C4B3><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ´<CAB4>.
m_pMemberPointer[nMemberIndex] = NULL;
}
}
}
unsigned short usPacketSize = static_cast<unsigned short>(szPacketPos - szPacket);
if (sizeof(PktBase) < usPacketSize &&
PacketWrap::WrapCrypt(szPacket, usPacketSize, CmdCharPartyMemInfo, 0, PktBase::NO_SERVER_ERR))
{
SendAllLoggedMember(szPacket, usPacketSize, 0, CmdCharPartyMemInfo);
}
}
inline void COPY_AND_ADVANCE(char*& szDst, const void* szSrc, size_t nSize)
{
memcpy(szDst, szSrc, nSize);
szDst += nSize;
}
void CCharacterParty::SetUpdateFlag(PartyMemberData& partyMemberData, CCharacter& character, char*& szPacket, bool bUpdateForce)
{
CreatureStatus& creatureStatus = character.GetStatus();
const Position& pos = character.GetCurrentPos();
unsigned char cClass = static_cast<unsigned char>(character.GetClass());
const EnchantInfo& enchantInfo = character.GetEnchantInfo();
partyMemberData.m_usDataChanged = 0;
// <20>ϴ<EFBFBD> CID<49><44> StatusFlag<61>ڸ<EFBFBD><DAB8><EFBFBD> Ȯ<><C8AE><EFBFBD>س<EFBFBD><D8B3>´<EFBFBD>.
char* szCIDPos = szPacket;
char* szDataChanged = szCIDPos + sizeof(unsigned long);
char* szPacketPos = szDataChanged + sizeof(unsigned short);
partyMemberData.m_dwCID = character.GetCID();
// ------------------------------------------------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٲ<EFBFBD><D9B2><EFBFBD> ġ<><C4A1><EFBFBD><EFBFBD><EFBFBD>Դϴ<D4B4>.
// X<><58>ġ
if (true == bUpdateForce || partyMemberData.m_fXPos != pos.m_fPointX)
{
partyMemberData.m_fXPos = pos.m_fPointX;
COPY_AND_ADVANCE(szPacketPos, &partyMemberData.m_fXPos, sizeof(float));
partyMemberData.m_usDataChanged |= PartyMemberData::CHANGED_XPOS;
}
// Y<><59>ġ
if (true == bUpdateForce || partyMemberData.m_fYPos != pos.m_fPointY)
{
partyMemberData.m_fYPos = pos.m_fPointY;
COPY_AND_ADVANCE(szPacketPos, &partyMemberData.m_fYPos, sizeof(float));
partyMemberData.m_usDataChanged |= PartyMemberData::CHANGED_YPOS;
}
// Z<><5A>ġ
if (true == bUpdateForce || partyMemberData.m_fZPos != pos.m_fPointZ)
{
partyMemberData.m_fZPos = pos.m_fPointZ;
COPY_AND_ADVANCE(szPacketPos, &partyMemberData.m_fZPos, sizeof(float));
partyMemberData.m_usDataChanged |= PartyMemberData::CHANGED_ZPOS;
}
// <20>ִ<EFBFBD> HP
if (true == bUpdateForce || partyMemberData.m_usMaxHP != creatureStatus.m_StatusInfo.m_nMaxHP)
{
partyMemberData.m_usMaxHP = creatureStatus.m_StatusInfo.m_nMaxHP;
COPY_AND_ADVANCE(szPacketPos, &partyMemberData.m_usMaxHP, sizeof(unsigned short));
partyMemberData.m_usDataChanged |= PartyMemberData::CHANGED_MAX_HP;
}
// <20>ִ<EFBFBD> MP
if (true == bUpdateForce || partyMemberData.m_usMaxMP != creatureStatus.m_StatusInfo.m_nMaxMP)
{
partyMemberData.m_usMaxMP = creatureStatus.m_StatusInfo.m_nMaxMP;
COPY_AND_ADVANCE(szPacketPos, &partyMemberData.m_usMaxMP, sizeof(unsigned short));
partyMemberData.m_usDataChanged |= PartyMemberData::CHANGED_MAX_MP;
}
// <20><><EFBFBD><EFBFBD> HP
if (true == bUpdateForce || partyMemberData.m_usCurHP != creatureStatus.m_nNowHP)
{
partyMemberData.m_usCurHP = creatureStatus.m_nNowHP;
COPY_AND_ADVANCE(szPacketPos, &partyMemberData.m_usCurHP, sizeof(unsigned short));
partyMemberData.m_usDataChanged |= PartyMemberData::CHANGED_CUR_HP;
}
// <20><><EFBFBD><EFBFBD> MP
if (true == bUpdateForce || partyMemberData.m_usCurMP != creatureStatus.m_nNowMP)
{
partyMemberData.m_usCurMP = creatureStatus.m_nNowMP;
COPY_AND_ADVANCE(szPacketPos, &partyMemberData.m_usCurMP, sizeof(unsigned short));
partyMemberData.m_usDataChanged |= PartyMemberData::CHANGED_CUR_MP;
}
// ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
if (true == bUpdateForce || partyMemberData.m_cLevel != creatureStatus.m_nLevel)
{
partyMemberData.m_cLevel = creatureStatus.m_nLevel;
COPY_AND_ADVANCE(szPacketPos, &partyMemberData.m_cLevel, sizeof(unsigned char));
partyMemberData.m_usDataChanged |= PartyMemberData::CHANGED_LEVEL;
}
// ij<><C4B3><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD><EFBFBD>
if (true == bUpdateForce || partyMemberData.m_cClass != cClass)
{
partyMemberData.m_cClass = cClass;
COPY_AND_ADVANCE(szPacketPos, &partyMemberData.m_cClass, sizeof(unsigned char));
partyMemberData.m_usDataChanged |= PartyMemberData::CHANGED_CLASS;
}
// <20><>æƮ <20><><EFBFBD><EFBFBD>
for (int nIndex = 0; nIndex < EnchantInfo::MAX_ARRAY && nIndex < PartyMemberData::MAX_ENCHANT_INFO_NUM; ++nIndex)
{
if (true == bUpdateForce || partyMemberData.m_dwEnchantInfo[nIndex] != enchantInfo.m_dwStatusFlag[nIndex])
{
partyMemberData.m_dwEnchantInfo[nIndex] = enchantInfo.m_dwStatusFlag[nIndex];
COPY_AND_ADVANCE(szPacketPos, &partyMemberData.m_dwEnchantInfo[nIndex], sizeof(unsigned long));
switch (nIndex)
{
case 0: partyMemberData.m_usDataChanged |= PartyMemberData::CHANGED_ENCHANT_INFO_0; break;
case 1: partyMemberData.m_usDataChanged |= PartyMemberData::CHANGED_ENCHANT_INFO_1; break;
case 2: partyMemberData.m_usDataChanged |= PartyMemberData::CHANGED_ENCHANT_INFO_2; break;
case 3: partyMemberData.m_usDataChanged |= PartyMemberData::CHANGED_ENCHANT_INFO_3; break;
}
}
}
// ------------------------------------------------------------------------------------------------------------------
// <20>ٲ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͱ<EFBFBD> <20>ִٸ<D6B4>, Ȯ<><C8AE><EFBFBD>س<EFBFBD><D8B3><EFBFBD> <20>ڸ<EFBFBD><DAB8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>. <20>ƴϸ<C6B4> Ȯ<><C8AE><EFBFBD>س<EFBFBD><D8B3><EFBFBD> <20>ڸ<EFBFBD><DAB8><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>´<EFBFBD>.
if (0 != partyMemberData.m_usDataChanged)
{
memcpy(szCIDPos, &partyMemberData.m_dwCID, sizeof(unsigned long));
memcpy(szDataChanged, &partyMemberData.m_usDataChanged, sizeof(unsigned short));
szPacket = szPacketPos;
}
}