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>
2543 lines
78 KiB
C++
2543 lines
78 KiB
C++
#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;
|
||
}
|
||
} |