Restructure repository to include all source folders
Move git root from Client/ to src/ to track all source code: - Client: Game client source (moved to Client/Client/) - Server: Game server source - GameTools: Development tools - CryptoSource: Encryption utilities - database: Database scripts - Script: Game scripts - rylCoder_16.02.2008_src: Legacy coder tools - GMFont, Game: Additional resources 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,485 @@
|
||||
|
||||
#include "stdafx.h"
|
||||
|
||||
#include <Item/Container/ItemContainer.h>
|
||||
#include <Item/Container/ContainerConstant.h>
|
||||
#include <Item/Container/ExchangeContainer.h>
|
||||
#include <Item/Container/EquipmentsContainer.h>
|
||||
|
||||
#include <Log/GameLog.h>
|
||||
#include <Log/CharacterLog.h>
|
||||
#include <Log/LogStruct.h>
|
||||
|
||||
#include <Utility/Setup/ServerSetup.h>
|
||||
|
||||
#include <Map/FieldMap/CellManager.h>
|
||||
#include <Map/FieldMap//VirtualArea/VirtualArea.h>
|
||||
#include <Map/FieldMap//VirtualArea/VirtualAreaMgr.h>
|
||||
#include <Map/DuelMap/DuelCellManager.h>
|
||||
|
||||
#include <Skill/SkillMgr.h>
|
||||
#include <Skill/SkillTable.h>
|
||||
|
||||
#include <Network/Dispatch/GameClient/GameClientDispatch.h>
|
||||
#include <Network/Dispatch/GameClient/SendCharEtc.h>
|
||||
#include <Network/Dispatch/Chat/ChatDispatch.h>
|
||||
|
||||
#include <Creature/CreatureManager.h>
|
||||
#include <Creature/NPC/NPC.h>
|
||||
#include <Creature/Siege/SiegeObject.h>
|
||||
#include <Creature/Siege/SiegeObjectMgr.h>
|
||||
#include <Creature/Siege/CampShop.h>
|
||||
|
||||
#include <Community/Guild/GuildMgr.h>
|
||||
#include <Community/Guild/Guild.h>
|
||||
|
||||
#include "Character.h"
|
||||
|
||||
CCharacter::CCharacter(unsigned long dwCID, unsigned long dwSessionID)
|
||||
: CAggresiveCreature(dwCID),
|
||||
m_dwUID(0), m_dwSessionID(dwSessionID),
|
||||
m_nLogoutCount(LOGOUT_COUNT), m_nDBUpdateCount(DBUPDATE_COUNT), m_cConsumeMPCount(0),
|
||||
m_lpGameClientDispatch(NULL), m_lpSummonee(NULL),
|
||||
m_cOperationFlags(0), m_cHandPos(0), m_cRidePos(0), m_friendList(dwCID, &CXRefFriends::GetInstance()), m_banList(dwCID, &CXRefBans::GetInstance()),
|
||||
m_dwLastUpdateExTime(0), m_cMoveUpdateExCount(0), m_dwRideArmsCID(0), m_dwRespawnSpeed(RESPAWN_PULSE),
|
||||
m_dwProtectGateCID(0), m_dwLastShoutTime(0),
|
||||
m_dwLastSendPartyAttackInfoTime(0), m_bChatBan(false),
|
||||
m_cAccountNation(0), // WORK_LIST 2.4 <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
m_cNameChangeCount(0),
|
||||
m_cGuildWarFlag(Creature::WAR_OFF),
|
||||
m_cRealmWarFlag(Creature::WAR_OFF),
|
||||
m_dwExchangeID(0),
|
||||
m_cGMModelFlag(0),
|
||||
m_cRealmPoint(0),
|
||||
m_dwPlayTime(0),
|
||||
m_lPremiumTime(0),
|
||||
m_cGuildSafe(-1),
|
||||
m_iAbilityPoint(0),
|
||||
m_iUseAbilityPoint(0),
|
||||
m_iAdminAbilityPoint(0),
|
||||
m_bRealmWarBuffer(FALSE),
|
||||
m_bDead(FALSE),
|
||||
m_eLastDeadType(DEAD_BY_NONE),
|
||||
m_dwRespawnTownID(0)
|
||||
{
|
||||
m_StartTime = CTime::GetCurrentTime();
|
||||
m_StartPremiumTime = CTime::GetCurrentTime();
|
||||
|
||||
memset(&m_FightInfo, 0, sizeof(CharacterFightInfo));
|
||||
memset(&m_DBData, 0, sizeof(m_DBData));
|
||||
memset(&m_CharacterStatus, 0, sizeof(m_CharacterStatus));
|
||||
memset(m_szAccountName, 0, sizeof(char) * CHAR_INFOST::MAX_ACCOUNT_LEN);
|
||||
|
||||
memset(m_AbilityValue, 0, sizeof(m_AbilityValue));
|
||||
|
||||
std::fill_n(m_wHistoryQuest, int(Quest::MAX_HISTORY_QUEST), 0);
|
||||
std::fill_n(m_cUsingMastery, int(MAX_USING_MASTERY), char(Skill::NONE_MASTERY));
|
||||
std::fill_n(m_bPadding, int(PAD_BYTE), 0x65);
|
||||
}
|
||||
|
||||
|
||||
CCharacter::~CCharacter()
|
||||
{
|
||||
for(int nCount = 0; nCount < PAD_BYTE; ++nCount)
|
||||
{
|
||||
if (0x65 != (unsigned char)m_bPadding[nCount])
|
||||
{
|
||||
SERLOG1(g_Log, "CID:0x%08x ij<><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>е<EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20>ٲ<EFBFBD><D9B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>. "
|
||||
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>÷ο찡 <20>Ͼ<CFBE><EEB3B5> <20><> <20>ֽ<EFBFBD><D6BD>ϴ<EFBFBD>.", m_dwCID);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
std::fill_n(m_bPadding, int(PAD_BYTE), 0x67);
|
||||
|
||||
SetDispatcher(NULL);
|
||||
|
||||
m_SpellMgr.GetAffectedInfo().ClearAll();
|
||||
}
|
||||
|
||||
|
||||
bool CCharacter::Initialize(CGameClientDispatch* lpGameClientDispatch)
|
||||
{
|
||||
SetDispatcher(lpGameClientDispatch);
|
||||
|
||||
if (!m_Inventory.Initialize(m_dwCID,
|
||||
ContainerConstant::INVENTORY_WIDTH,
|
||||
ContainerConstant::INVENTORY_HEIGHT,
|
||||
ContainerConstant::MAX_INVENTORY_TAB))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!m_Equipments.Initialize(this,
|
||||
Item::EquipmentPos::MAX_EQUPMENT_POS))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!m_ExtraSpace.Initialize(m_dwCID,
|
||||
Item::ExtraSpacePos::MAX_EXTRA_SPACE_NUM))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!m_Exchange.Initialize(this,
|
||||
ContainerConstant::EXCHANGE_WIDTH,
|
||||
ContainerConstant::EXCHANGE_HEIGHT))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!m_Deposit.Initialize(this,
|
||||
ContainerConstant::DEPOSIT_WIDTH,
|
||||
ContainerConstant::DEPOSIT_HEIGHT,
|
||||
ContainerConstant::MAX_DEPOSIT_TAB))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!m_Stall.Initialize(m_dwCID,
|
||||
ContainerConstant::STALL_WIDTH,
|
||||
ContainerConstant::STALL_HEIGHT))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!m_TempInven.Initialize(this, Item::MAX_TEMP_INVEN_ITEM_NUM))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
void CCharacter::SetDispatcher(CGameClientDispatch* lpGameClientDispatch)
|
||||
{
|
||||
DETLOG5(g_Log, "UID:%d/CID:0x%08x(0x%p)/DispatchPointer:0x%p<><70><EFBFBD><EFBFBD> -> 0x%p<><70> <20>ٲߴϴ<DFB4>.",
|
||||
m_dwUID, m_dwCID, this, m_lpGameClientDispatch, lpGameClientDispatch);
|
||||
|
||||
if (NULL != m_lpGameClientDispatch)
|
||||
{
|
||||
m_lpGameClientDispatch->SetCharacter(NULL);
|
||||
|
||||
if (false == IsOperationFlagSet(CHAR_ZONE_MOVED))
|
||||
{
|
||||
m_lpGameClientDispatch->Disconnect();
|
||||
}
|
||||
}
|
||||
|
||||
m_lpGameClientDispatch = lpGameClientDispatch;
|
||||
|
||||
if (NULL != m_lpGameClientDispatch)
|
||||
{
|
||||
m_bLogout = false;
|
||||
m_dwUID = m_lpGameClientDispatch->GetUID();
|
||||
m_lpGameClientDispatch->SetCharacter(this);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (false == m_bLogout)
|
||||
{
|
||||
CCharacter* lpCharacter = CCreatureManager::GetInstance().GetCharacter(m_Stall.GetOtherOwner());
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
if (0 != strcmp(m_Stall.GetStallName(), ""))
|
||||
{
|
||||
m_Stall.Close();
|
||||
m_Stall.SendCharStallOpen("");
|
||||
}
|
||||
|
||||
if (0 != m_Stall.GetOtherOwner())
|
||||
{
|
||||
if (Creature::CT_PC == Creature::GetCreatureType(m_Stall.GetOtherOwner()))
|
||||
{
|
||||
if (NULL != lpCharacter)
|
||||
{
|
||||
lpCharacter->GetStall().Leave(this);
|
||||
lpCharacter->GetStall().SendCharStallEnter(m_dwCID, 0);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
CCampShop* lpShop =
|
||||
reinterpret_cast<CCampShop*>(CCreatureManager::GetInstance().GetSiegeObject(m_Stall.GetOtherOwner()));
|
||||
if (NULL != lpShop)
|
||||
{
|
||||
lpShop->GetContainer().Leave(this);
|
||||
lpShop->GetContainer().SendCharStallEnter(m_dwCID, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
m_bLogout = true;
|
||||
CCreatureManager::GetInstance().EnqueueLogout(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
bool CCharacter::GetCharacterView(CHAR_VIEW& charView)
|
||||
{
|
||||
charView.CID = m_dwCID;
|
||||
|
||||
memcpy(charView.Name, m_DBData.m_Info.Name, CHAR_INFOST::MAX_NAME_LEN); // ij<><C4B3><EFBFBD><EFBFBD> <20≯<EFBFBD>
|
||||
|
||||
charView.Sex = m_DBData.m_Info.Sex; // ij<><C4B3><EFBFBD><EFBFBD> <20><>
|
||||
charView.Hair = m_DBData.m_Info.Hair; // ij<><C4B3><EFBFBD><EFBFBD> <20>Ӹ<EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
charView.Face = m_DBData.m_Info.Face; // ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
charView.Race = m_DBData.m_Info.Race; // ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
charView.Class = m_DBData.m_Info.Class; // ij<><C4B3><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD><EFBFBD>
|
||||
charView.Fame = m_DBData.m_Info.Fame; // <20><><EFBFBD><EFBFBD>
|
||||
charView.Mileage = m_DBData.m_Info.Mileage; // <20><><EFBFBD>ϸ<EFBFBD><CFB8><EFBFBD>
|
||||
charView.GID = m_DBData.m_Info.GID; // ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
charView.PID = m_DBData.m_Info.PID; // ij<><C4B3><EFBFBD><EFBFBD> <20><>Ƽ
|
||||
charView.Level = m_DBData.m_Info.Level; // ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
|
||||
m_Equipments.GetEquipmentView(charView.Equip); // <20><><EFBFBD><EFBFBD>(<28>Ѻ<EFBFBD><D1BA><EFBFBD>)
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool CCharacter::BindPositionToNPC(const unsigned long dwNPCID)
|
||||
{
|
||||
/*
|
||||
GAMELOG::ERRType eReturnCode = 0;
|
||||
|
||||
CNPC* pNPC = CCreatureManager::GetInstance().GetNPC(dwNPCID);
|
||||
if (NULL != pNPC&& true == pNPC->IsBindable() &&
|
||||
pNPC->GetCurrentPos().GetDistance(m_CurrentPos) < CNPC::MAX_CONTACT_RANGE)
|
||||
{
|
||||
int nZone = CServerSetup::GetInstance().GetServerZone();
|
||||
if (GetMapIndex() != 0)
|
||||
{
|
||||
VirtualArea::CVirtualArea* lpVirtualArea = VirtualArea::CVirtualAreaMgr::GetInstance().GetVirtualArea(GetMapIndex());
|
||||
if (NULL != lpVirtualArea)
|
||||
{
|
||||
nZone = static_cast<int>(lpVirtualArea->GetVirtualZone());
|
||||
}
|
||||
}
|
||||
|
||||
if (pNPC->GetZone() == nZone)
|
||||
{
|
||||
m_DBData.m_Pos.SavePoint.fPointX = m_CurrentPos.m_fPointX;
|
||||
m_DBData.m_Pos.SavePoint.fPointY = m_CurrentPos.m_fPointY;
|
||||
m_DBData.m_Pos.SavePoint.fPointZ = m_CurrentPos.m_fPointZ;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
eReturnCode = 1;
|
||||
}
|
||||
|
||||
// BindPosition<6F>α<CEB1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
GAMELOG::LogCharBindPos(*this, dwNPCID, eReturnCode);
|
||||
|
||||
return (0 == eReturnCode);
|
||||
*/
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CCharacter::ControlOption(const RejectOption Reject, bool bLogin)
|
||||
{
|
||||
m_RejectOption = Reject;
|
||||
|
||||
// TODO : Ű <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
return true;
|
||||
}
|
||||
|
||||
unsigned char CCharacter::GetNation(void) const
|
||||
{
|
||||
CGuild* lpGuild = CGuildMgr::GetInstance().GetGuild(GetGID());
|
||||
if (NULL != lpGuild)
|
||||
{
|
||||
if (Guild::JOIN_WAIT != lpGuild->GetTitle(m_dwCID))
|
||||
{
|
||||
return lpGuild->GetNation();
|
||||
}
|
||||
}
|
||||
|
||||
// WORK_LIST 2.4 <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
return m_cAccountNation;
|
||||
/*
|
||||
switch (m_DBData.m_Info.Race)
|
||||
{
|
||||
case CClass::HUMAN: return Creature::KARTERANT;
|
||||
case CClass::AKHAN: return Creature::MERKADIA;
|
||||
}
|
||||
|
||||
ERRLOG2(g_Log, "CID:0x%08x ij<><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̻<EFBFBD><CCBB>Ͽ<EFBFBD> <20><>3<EFBFBD><33><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>. <20><><EFBFBD><EFBFBD>:%d",
|
||||
m_dwCID, m_DBData.m_Info.Race);
|
||||
return Creature::ALMIGHTY_PIRATE;
|
||||
*/
|
||||
}
|
||||
|
||||
void CCharacter::SetPID(unsigned long dwPID)
|
||||
{
|
||||
m_DBData.m_Info.PID = dwPID;
|
||||
}
|
||||
|
||||
void CCharacter::SetGID(unsigned long dwGID)
|
||||
{
|
||||
m_DBData.m_Info.GID = dwGID;
|
||||
}
|
||||
|
||||
ChState CCharacter::GetState(void)
|
||||
{
|
||||
ChState state;
|
||||
|
||||
state.m_wIP = m_DBData.m_Info.IP;
|
||||
state.m_wSTR = m_DBData.m_Info.STR;
|
||||
state.m_wDEX = m_DBData.m_Info.DEX;
|
||||
state.m_wCON = m_DBData.m_Info.CON;
|
||||
state.m_wINT = m_DBData.m_Info.INT;
|
||||
state.m_wWIS = m_DBData.m_Info.WIS;
|
||||
|
||||
return state;
|
||||
}
|
||||
|
||||
void CCharacter::SetFame(unsigned long dwFame)
|
||||
{
|
||||
char cOldEliteBonus = GetEliteBonus();
|
||||
m_DBData.m_Info.Fame = dwFame;
|
||||
char cNewEliteBonus = GetEliteBonus();
|
||||
|
||||
if (cNewEliteBonus != cOldEliteBonus)
|
||||
{
|
||||
if (NULL != m_lpGameClientDispatch)
|
||||
{
|
||||
GameClientSendPacket::SendCharEliteBonus(
|
||||
m_lpGameClientDispatch->GetSendStream(), cNewEliteBonus);
|
||||
}
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ
|
||||
CGuild* lpGuild = Guild::CGuildMgr::GetInstance().GetGuild(GetGID());
|
||||
if (NULL != lpGuild)
|
||||
{
|
||||
lpGuild->UpdateMemberInfo(m_dwCID, m_DBData.m_Info.Fame, Guild::TYPE_FAME);
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD>Ʈ Ʈ<><C6AE><EFBFBD><EFBFBD> üũ
|
||||
CheckTrigger(Quest::TRIGGER_FAME, dwFame, GetCurrentPos(), 1);
|
||||
}
|
||||
|
||||
|
||||
bool CCharacter::SetDuelOpponent(CCharacter* lpCharacter)
|
||||
{
|
||||
const POS DuelPos1 = { 3099, 1137, 3215 }; // <20><><EFBFBD><EFBFBD> <20><>ŸƮ <20><>ġ
|
||||
const POS DuelPos2 = { 3156, 1137, 3209 };
|
||||
|
||||
if (CServerSetup::GetInstance().GetDuelModeCheck())
|
||||
{
|
||||
CCell* lpDuelCell = NULL;
|
||||
unsigned long Cell_ID = 0;
|
||||
|
||||
if (NULL == lpCharacter)
|
||||
{
|
||||
// <20> <20><>
|
||||
Cell_ID = m_FightInfo.m_dwCellID;
|
||||
|
||||
lpDuelCell = CDuelCellManager::GetInstance().GetCell(Cell_ID);
|
||||
if (NULL == lpDuelCell)
|
||||
{
|
||||
ERRLOG1(g_Log, "(CID:0x%08x) <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>.", GetCID());
|
||||
return false;
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
lpDuelCell->DeleteCreature(m_dwCID);
|
||||
if (0 == lpDuelCell->GetCharacterNum())
|
||||
{
|
||||
// <20><> <20><><EFBFBD><EFBFBD>
|
||||
CDuelCellManager::GetInstance().DestroyCell(Cell_ID);
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
m_FightInfo.m_pDuelOpponent = lpCharacter;
|
||||
m_FightInfo.m_dwCellID = 0;
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
m_CellPos.MoveTo(m_CurrentPos);
|
||||
if (NULL == m_CellPos.m_lpCell)
|
||||
{
|
||||
ERRLOG1(g_Log, "(CID:0x%08x) <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>.", GetCID());
|
||||
return false;
|
||||
}
|
||||
|
||||
m_CellPos.m_lpCell->SetCreature(m_dwCID, this);
|
||||
|
||||
GameClientSendPacket::SendCharBindPosition(*this, 0, 1,
|
||||
m_DBData.m_Pos.LastPoint, CServerSetup::GetInstance().GetServerZone(), 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
POS DuelPos = {0,};
|
||||
Cell_ID = lpCharacter->m_FightInfo.m_dwCellID;
|
||||
if (0 == Cell_ID)
|
||||
{
|
||||
Cell_ID = GetCID();
|
||||
|
||||
lpDuelCell = CDuelCellManager::GetInstance().CreateCell(Cell_ID);
|
||||
if (NULL == lpDuelCell)
|
||||
{
|
||||
ERRLOG0(g_Log, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>.");
|
||||
return false;
|
||||
}
|
||||
|
||||
DuelPos = DuelPos1;
|
||||
}
|
||||
else
|
||||
{
|
||||
lpDuelCell = CDuelCellManager::GetInstance().GetCell(Cell_ID);
|
||||
if (NULL == lpDuelCell)
|
||||
{
|
||||
ERRLOG0(g_Log, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>.");
|
||||
return false;
|
||||
}
|
||||
|
||||
DuelPos = DuelPos2;
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
if (NULL == m_CellPos.m_lpCell)
|
||||
{
|
||||
ERRLOG1(g_Log, "(CID:0x%08x) <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>.", GetCID());
|
||||
return false;
|
||||
}
|
||||
|
||||
m_CellPos.m_lpCell->DeleteCreature(GetCID());
|
||||
m_CellPos.m_lpCell = NULL;
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>߰<EFBFBD>
|
||||
lpDuelCell->SetCreature(m_dwCID, this);
|
||||
GameClientSendPacket::SendCharBindPosition(*this, 0, 1, DuelPos, 100, 0);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
m_FightInfo.m_pDuelOpponent = lpCharacter;
|
||||
m_FightInfo.m_dwCellID = Cell_ID;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
m_FightInfo.m_pDuelOpponent = lpCharacter;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
void CCharacter::SetGuildWarFlag(unsigned char cFlag)
|
||||
{
|
||||
if (cFlag >= Creature::WAR_OFF && cFlag <= Creature::WAR_INSTANCE)
|
||||
{
|
||||
m_cGuildWarFlag = cFlag;
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ
|
||||
CGuild* lpGuild = Guild::CGuildMgr::GetInstance().GetGuild(GetGID());
|
||||
if (NULL != lpGuild)
|
||||
{
|
||||
lpGuild->UpdateMemberInfo(m_dwCID, m_cGuildWarFlag, Guild::TYPE_WARFLAG);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user