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

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

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

828 lines
26 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "stdafx.h"
#include "GameDispatch.h"
#include <Log/ServerLog.h>
#include <Utility/Setup/ServerSetup.h>
#include <Network/Address/INET_Addr.h>
#include <Network/Stream/SendStream.h>
#include <Network/Packet/PacketDispatchTable.h>
#include <Network/Packet/PacketCommand.h>
#include <Network/Packet/WrapPacket.h>
#include <Network/Packet/PacketStruct/ServerInfo.h>
#include <Network/Packet/PacketStruct/ServerPacket.h>
#include <Network/Packet/PacketStruct/ServerLogPacket.h>
#include <Network/Packet/PacketStruct/CharAdminPacket.h>
#include <Network/ParsePacket/ParseMoveZone.h>
#include <Network/ParsePacket/ParseCharManage.h>
#include <Network/ParsePacket/ParseCharUpdate.h>
#include <Network/ParsePacket/ParseParty.h>
#include <Network/ParsePacket/ParseCastle.h>
#include <Network/ParsePacket/ParseGuild.h>
#include <Network/SendPacket/SendServerInfo.h>
#include <Network/Dispatch/GameClient/SendCharAdmin.h>
#include <Creature/Character/CharacterClass.h>
#include <Creature/StatueDBMgr.h>
#include <DB/DBComponent.h>
#include <DB/GameDBComponent.h>
#include <DataStorage/SessionData.h>
#include <DataStorage/SessionDataMgr.h>
#include <Castle/CastleDBMgr.h>
#include <GameTime/GameTimeDBMgr.h>
#include <Creature/Siege/SiegeObjectDBMgr.h>
#include <Community/Guild/GuildDBMgr.h>
#include <Ranking/RankingDBMgr.h>
#include <GameEvent/GiveItemMgr.h>
#include <DataStorage/SessionDataMgr.h>
#include <DataStorage/CharacterDataMgr.h>
#include <Map/FieldMap/MineralVeinDBMgr.h>
#include <Ranking/RankingMgr.h>
#include <Community/Party/PartyDBMgr.h>
namespace DBAgent
{
typedef bool (*GameDispatchFunc) (CSendStream& SendStream, PktBase* lpPktBase);
// forward delc.
bool ParseServerLog(CSendStream& SendStream, PktBase* lpPktBase);
class CGameDispatchTable : public CPacketDispatchTable<GameDispatchFunc>
{
public:
static CGameDispatchTable& GetInstance();
private:
CGameDispatchTable();
};
CGameDispatchTable& CGameDispatchTable::GetInstance()
{
static CGameDispatchTable gameDispatchTable;
return gameDispatchTable;
}
CGameDispatchTable::CGameDispatchTable()
: CPacketDispatchTable<GameDispatchFunc>(UCHAR_MAX)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD>
AddDispatch(CmdDepositUpdate, ParseCharUpdate::UpdateDepositDB);
AddDispatch(CmdDeposit, ParseCharUpdate::UpdateDeposit);
AddDispatch(CmdFriendDB, ParseCharUpdate::UpdateFriendDB);
AddDispatch(CmdQuestDB, ParseCharUpdate::UpdateQuestDB);
AddDispatch(CmdConfigInfoDB, ParseCharUpdate::UpdateConfigInfoDB);
// <20><><EFBFBD>̵<EFBFBD> <20><><EFBFBD><EFBFBD>
AddDispatch(CmdAgentZone, ParseMoveZone::Parse);
// <20><>Ƽ <20><><EFBFBD><EFBFBD>
AddDispatch(CmdAgentParty, ParseParty::Parse);
// <20><>Ʋ<EFBFBD>׶<EFBFBD><D7B6><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
AddDispatch(CmdBGServerCharSlot, ParseCharManage::BGServerCharSlot);
// <20>α<EFBFBD> <20><><EFBFBD><EFBFBD>
AddDispatch(CmdServerLog, ParseServerLog);
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
AddDispatch(CmdCreateGuild, ParseGuild::CreateGuild);
AddDispatch(CmdGuildCmd, ParseGuild::GuildCmd);
AddDispatch(CmdGuildMark, ParseGuild::GuildMark);
AddDispatch(CmdGuildLevel, ParseGuild::GuildLevel);
AddDispatch(CmdGuildRelation, ParseGuild::GuildRelation);
AddDispatch(CmdGuildInclination, ParseGuild::GuildInclination);
AddDispatch(CmdGuildRight, ParseGuild::SetGuildRight);
AddDispatch(CmdGuildSafe, ParseGuild::GuildSafe);
AddDispatch(CmdGuildMemberInfoUpdate, ParseGuild::GuildMemberInfoUpdate);
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
AddDispatch(CmdCreateCamp, ParseCastle::CreateCamp);
AddDispatch(CmdCreateSiegeArms, ParseCastle::CreateSiegeArms);
AddDispatch(CmdCastleCmd, ParseCastle::CastleCmd);
AddDispatch(CmdCampCmd, ParseCastle::CampCmd);
AddDispatch(CmdSiegeArmsCmd, ParseCastle::SiegeArmsCmd);
AddDispatch(CmdCastleRight, ParseCastle::SetCastleRight);
AddDispatch(CmdCampRight, ParseCastle::SetCampRight);
AddDispatch(CmdCampMessage, ParseCastle::CampMessage);
AddDispatch(CmdMiningCampMineralInfo, ParseCastle::MiningCampMineralInfo);
AddDispatch(CmdFertilityInfo, ParseCastle::FertilityInfo);
AddDispatch(CmdCampShopInfo, ParseCastle::CampShopInfo);
AddDispatch(CmdCastleTaxMove, ParseCastle::CastleTaxMove);
AddDispatch(CmdCastleMineralInfo, ParseCastle::CastleMineralInfo);
AddDispatch(CmdWarOnOff, ParseCastle::WarOnOff);
AddDispatch(CmdStatueCmd, ParseCastle::StatueCmd);
AddDispatch(CmdAdminCommandLog, ParseCharAdmin::AdminCommandLog);
AddDispatch(CmdRealmPoint, ParseCastle::RealmPoint);
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
AddDispatch(CmdSaveEnemy, ParseCharUpdate::SaveEnemy);
// <20><><EFBFBD>̽<EFBFBD>ƽ <20><><EFBFBD><EFBFBD>.
AddDispatch(CmdKeyInfo, ParseCharUpdate::UpdateKeyInfo);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
AddDispatch(CmdCharUseCashItem, ParseCharUpdate::UseCashItem);
AddDispatch(CmdExtraEvent, ParseCharUpdate::ExtraEvent);
}
CMultiDispatch& CGameDispatch::GetDispatchTable()
{
static CMultiDispatch gameDispatch;
return gameDispatch;
}
CGameDispatch::CGameDispatch(CSession& Session)
: CRylServerDispatch(Session, MAX_PACKET_DISPATCH_PER_PULSE),
m_nHumanNum(1),
m_nAkhanNum(1),
m_dwServerID(0)
{
}
CGameDispatch::~CGameDispatch()
{
}
void CGameDispatch::Connected()
{
DETLOG3(g_Log, "SS:0x%08x/DP:0x%08x/IP:%15s/GameServer Connected",
&GetSession(), this, GetRemoteAddr().get_addr_string());
}
void CGameDispatch::Disconnected()
{
DETLOG3(g_Log, "SS:0x%08x/DP:0x%08x/IP:%15s/GameServer Disconnected",
&GetSession(), this, GetRemoteAddr().get_addr_string());
if(0 != m_dwServerID)
{
GetDispatchTable().RemoveDispatch(m_dwServerID);
if(0LL != m_GameItemSerialMgr.GetItemSerial())
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ø<EFBFBD><C3B8><EFBFBD> DB<44><42> <20><><EFBFBD><EFBFBD>
m_GameItemSerialMgr.SaveItemSerial(
CDBSingleObject::GetInstance(), m_dwServerID);
}
// ä<><C3A4> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ
DBAgent::SendPacket::UpdateChannelAllServer();
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>α<EFBFBD><CEB1>ε<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
DataStorage::CSessionDataMgr::GetInstance().SessionCloseCurrentServer(m_dwServerID);
}
}
bool CGameDispatch::DispatchPacket(PktBase* lpPktBase)
{
// <20><><EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DBAgent<6E><74> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ŷ<EFBFBD><C5B6><EFBFBD><EFBFBD>
PktBase::CMDType cCmd =lpPktBase->GetCmd();
bool bResult = false;
GameDispatchFunc lpDispatchFunc = 0;
CSendStream& SendStream = GetSendStream();
switch(cCmd)
{
// <20>α<EFBFBD><CEB1><EFBFBD> / <20>α׾ƿ<D7BE> / <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ
case CmdDBUpdateData:
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>α<EFBFBD><CEB1><EFBFBD><EFBFBD>ϰų<CFB0> <20>α׾ƿ<D7BE><C6BF>Ҷ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>޽<EFBFBD><DEBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
// <20><><EFBFBD>⼭ Ÿ<><C5B8>DB<44><42> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20>ϰų<CFB0> <20>Ѵ<EFBFBD>.
bResult = ParseCharUpdate::Parse(SendStream, m_dwServerID,
m_GameItemSerialMgr, static_cast<PktDBUpdate*>(lpPktBase));
break;
case CmdSysServerLogin: bResult = ServerLogin(lpPktBase); break; // <20><><EFBFBD><EFBFBD> <20>α<EFBFBD><CEB1><EFBFBD>
case CmdSysServerLogout: bResult = ServerLogout(lpPktBase); break; // <20><><EFBFBD><EFBFBD> <20>α׾ƿ<D7BE>
case CmdUserKill: bResult = UserKillAck(lpPktBase); break; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD>̱<EFBFBD>
case CmdCharAdminCmd: bResult = CharAdminCmd(lpPktBase); break; // <20><EFBFBD><EEBFB5> <20><><EFBFBD><EFBFBD>
case CmdGiveItemToTempInven: bResult = GiveItemToTempInven(lpPktBase); break; // <20>ӽ<EFBFBD><D3BD>κ<EFBFBD><CEBA><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ֱ<EFBFBD>
case CmdCharNameChange: bResult = ChangeName(lpPktBase); break; // ij<><C4B3><EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> <20>ٲ۴<D9B2>
default:
// <20><>Ÿ <20><><EFBFBD><EFBFBD>(<28><><EFBFBD>̺<EFBFBD><CCBA><EFBFBD><EFBFBD><EFBFBD> <20>˻<EFBFBD>)
lpDispatchFunc = CGameDispatchTable::GetInstance().GetDispatch(cCmd);
if(0 != lpDispatchFunc)
{
bResult = lpDispatchFunc(SendStream, lpPktBase);
}
else
{
ERRLOG5(g_Log, "SS:0x%08x/DP:0x%08x/IP:%15s/Cmd:0x%02X/ServerID:0x%08X / "
"<EFBFBD><EFBFBD><EFBFBD>Ӽ<EFBFBD><EFBFBD><EFBFBD> <20><>Ŷ ó<><C3B3> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD> Ŀ<>ǵ<EFBFBD><C7B5>Դϴ<D4B4>",
&GetSession(), this, GetRemoteAddr().get_addr_string(), cCmd, m_dwServerID);
bResult = true;
}
break;
}
if(!bResult)
{
ERRLOG5(g_Log, "SS:0x%08x/DP:0x%08x/IP:%15s/Cmd:0x%02X/ServerID:0x%08X / <20><><EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD> <20><>Ŷ ó<><C3B3> <20><><EFBFBD><EFBFBD> : ó<><C3B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>",
&GetSession(), this, GetRemoteAddr().get_addr_string(), cCmd, m_dwServerID);
}
return true;
}
bool CGameDispatch::ServerLogin(PktBase* lpPktBase)
{
PktSL* lpPktSL = static_cast<PktSL*>(lpPktBase);
m_dwServerID = lpPktSL->m_dwServerID;
INFLOG4(g_Log, "SS:0x%08x/DP:0x%08x/IP:%15s/ServerID:0x%08X/<2F><><EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD> <20><><EFBFBD><EFBFBD> <20>õ<EFBFBD> : <20><>Ŷ <20><><EFBFBD><EFBFBD>",
&GetSession(), this, GetRemoteAddr().get_addr_string(), m_dwServerID);
GET_MULTI_DISPATCH(lpGameDispatch, m_dwServerID,
CGameDispatch, GetDispatchTable());
if(0 != lpGameDispatch)
{
ERRLOG4(g_Log, "SS:0x%08x/DP:0x%08x/IP:%15s/ServerID:0x%08X/<2F><><EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20>̹<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ֽ<EFBFBD><D6BD>ϴ<EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>.",
&GetSession(), this, GetRemoteAddr().get_addr_string(), m_dwServerID);
CloseSession();
}
else
{
// Dispatch <20><><EFBFBD><EFBFBD>.
GetDispatchTable().SetDispatch(m_dwServerID, this);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ø<EFBFBD><C3B8><EFBFBD> <20>ε<EFBFBD>.
if(!m_GameItemSerialMgr.LoadItemSerial(CDBSingleObject::GetInstance(), m_dwServerID))
{
ERRLOG4(g_Log, "SS:0x%08x/DP:0x%08x/IP:%15s/ServerID:0x%08X/<2F><><EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ø<EFBFBD><C3B8><EFBFBD> <20>ε<EFBFBD> <20><><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>.",
&GetSession(), this, GetRemoteAddr().get_addr_string(), m_dwServerID);
CloseSession();
return false;
}
CSendStream& SendStream = GetSendStream();
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ
Guild::CGuildDBMgr::GetInstance().SendGuildDBList(SendStream);
SERVER_ID serverID;
serverID.dwID = m_dwServerID;
/// <20><> <20><> ķ<><C4B7>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ.
Castle::CCastleDBMgr::GetInstance().SendCastleInfo(SendStream, serverID.GetZone(), serverID.GetChannel());
CGameTimeDBMgr::GetInstance().SendGameTimeInfo(GameTime::TYPE_GAMESERVER_LOGIN, true, true, true, true, true);
CSiegeObjectDBMgr::GetInstance().SendWorldWeaponInfo(SendStream, serverID.GetZone(), serverID.GetChannel());
CSiegeObjectDBMgr::GetInstance().SendCampInfo(SendStream, serverID.GetZone(), serverID.GetChannel());
CSiegeObjectDBMgr::GetInstance().SendSiegeArmsInfo(SendStream, serverID.GetZone(), serverID.GetChannel());
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> : <20><>ũ ī<><C4AB><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
if (true == CServerSetup::GetInstance().UseContents(GameRYL::STONE_BATTLE))
{
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ
// <20><><EFBFBD><EFBFBD> : <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.!!
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>æƮ ȿ<><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ޱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD>.!!
if (SERVER_ID::STONE_WAR1 <= serverID.GetZone() && serverID.GetZone() <= SERVER_ID::STONE_WAR3)
{
CStatueDBMgr::GetInstance().SendStatueInfo(SendStream, serverID.GetChannel());
}
}
/*
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> : <20>ű<EFBFBD><C5B1><EFBFBD>
if (true == CServerSetup::GetInstance().UseContents(GameRYL::NEWZONE_ZONE9))
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ
// <20><><EFBFBD><EFBFBD> : <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.!!
if (serverID.GetZone() == SERVER_ID::ZONE9)
{
CStatueDBMgr::GetInstance().SendStatueInfo(SendStream, serverID.GetChannel());
}
}
*/
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ
CMineralVeinDBMgr::GetInstance().SendFertilityInfo(SendStream, serverID.GetZone(), serverID.GetChannel());
// ä<><C3A4> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ
DBAgent::SendPacket::UpdateChannelAllServer();
// <20><>ŷ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ
CRankingDBMgr::GetInstance().SendRankingInfo(SendStream);
// <20><>Ƽ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD> //
CPartyDBMgr::GetInstance().SendToGameServerPartyData(SendStream);
// <20><><EFBFBD><EFBFBD> <20>α<EFBFBD><CEB1><EFBFBD> Ack<63><6B><EFBFBD><EFBFBD>.
return SendPacket::ServerLoginAck(m_SendStream,
m_dwServerID, m_GameItemSerialMgr.GetItemSerial());
}
return true;
}
bool CGameDispatch::ServerLogout(PktBase* lpPktBase)
{
// <20><><EFBFBD><EFBFBD> <20><>Ŷ <20>״<EFBFBD><D7B4><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ش<EFBFBD>.
char* lpBuffer = m_SendStream.GetBuffer(sizeof(PktBase));
if(0 != lpBuffer)
{
return m_SendStream.WrapHeader(sizeof(PktBase), CmdSysServerLogout, 0, 0);
}
return false;
}
bool CGameDispatch::UserKillAck(PktBase* lpPktBase)
{
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD>̱⸦ <20><><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD>, Ack<63><6B> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD>.
PktUK* lpPktUK = static_cast<PktUK*>(lpPktBase);
if(2 == lpPktUK->GetError())
{
using namespace DataStorage;
CSessionData* lpSessionData =
CSessionDataMgr::GetInstance().GetOpenSession(lpPktUK->m_dwUserID);
if(0 != lpSessionData &&
CSessionData::SE_CHAR_ENABLED == lpSessionData->GetSessionState())
{
if(lpSessionData->GetServerID() == lpPktUK->m_dwServerID)
{
CSessionDataMgr::GetInstance().SessionCloseWithLogout(
lpPktUK->m_dwUserID, lpPktUK->m_dwServerID);
ERRLOG2(g_Log, "UID:%10u / ServerID:0x%08X / <20><><EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD> <20><><EFBFBD>̱<EFBFBD> <20><><EFBFBD><EFBFBD>",
lpPktUK->m_dwUserID, lpPktUK->m_dwServerID);
}
else
{
ERRLOG3(g_Log, "UID:%10u / FromServerID:0x%08X / TargetServerID:0x%08X / "
"<EFBFBD><EFBFBD><EFBFBD>Ӽ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̱<EFBFBD> <20><>û <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٸ<EFBFBD>",
lpPktUK->m_dwUserID, lpPktUK->m_dwServerID, lpSessionData->GetServerID());
}
}
}
return true;
}
bool CGameDispatch::CharAdminCmd(PktBase* lpPktBase)
{
PktAdmin* lpPktAdmin = static_cast<PktAdmin*>(lpPktBase);
PktAdmin pktSendAdmin;
// <20><>Ŷ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>״<EFBFBD><D7B4><EFBFBD> <20><><EFBFBD><EFBFBD>.
memcpy(&pktSendAdmin, lpPktAdmin, sizeof(PktAdmin));
// <20>߰輭<DFB0><E8BCAD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
/*if(lpPktAdmin->m_usCmd == PktAdmin::DBAGENT_KILL)
{
int nZero = 0;
int nError = 10 / nZero;
*reinterpret_cast<int*>(nError) = 0xFFFFFFFF;
}*/
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ġ <20><>ǥ<EFBFBD><C7A5>, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>κ<EFBFBD><CEBA><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
if (lpPktAdmin->m_usCmd == PktAdmin::REQUEST_TRACE_POS)
{
// <20>ش<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ը<EFBFBD> TRACE <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
pktSendAdmin.m_usCmd = PktAdmin::TRACE_CHAR;
SERVER_ID serverID;
serverID.sID.Type = CServerSetup::GameServer;
serverID.sID.Group = CServerSetup::GetInstance().GetServerGroup();
serverID.sID.Channel = lpPktAdmin->m_ZoneInfo.m_cChannel;
serverID.sID.ID = lpPktAdmin->m_ZoneInfo.m_cZone;
GET_MULTI_DISPATCH(lpGameDispatch, serverID.dwID,
CGameDispatch, CGameDispatch::GetDispatchTable());
if(0 != lpGameDispatch)
{
serverID.dwID = m_dwServerID;
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> channel <20><> -1 <20>̾<EFBFBD><CCBE><EFBFBD> <20>Ѵ<EFBFBD>. -_-;
pktSendAdmin.m_ZoneInfo.m_cZone = serverID.GetZone();
pktSendAdmin.m_ZoneInfo.m_cChannel = -1;
if(PacketWrap::WrapHeader(reinterpret_cast<char*>(&pktSendAdmin),
sizeof(PktAdmin), CmdCharAdminCmd, 0, 0))
{
lpGameDispatch->GetSendStream().PutBuffer(
reinterpret_cast<char*>(&pktSendAdmin), sizeof(PktAdmin), CmdCharAdminCmd);
}
}
return true;
}
else if (lpPktAdmin->m_usCmd == PktAdmin::TRACE_CHAR)
{
using namespace DBAgent::DataStorage;
// ij<><C4B3><EFBFBD>Ͱ<EFBFBD> <20>α׾ƿ<D7BE><C6BF><EFBFBD> <20><><EFBFBD><EFBFBD><C2B6><EFBFBD>
if (false == CSessionDataMgr::GetInstance().IsLoadedChar(lpPktAdmin->m_stName))
{
// <20>ش<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ش<EFBFBD> ij<><C4B3><EFBFBD>Ͱ<EFBFBD> <20>α׾ƿ<D7BE> <20>ߴٴ<DFB4> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
pktSendAdmin.m_usCmd = PktAdmin::TRACE_CHAR;
GET_MULTI_DISPATCH(lpGameDispatch, m_dwServerID,
CGameDispatch, CGameDispatch::GetDispatchTable());
if(0 != lpGameDispatch)
{
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> channel <20><> -1 <20>̾<EFBFBD><CCBE><EFBFBD> <20>Ѵ<EFBFBD>. -_-;
pktSendAdmin.m_ZoneInfo.m_cChannel = -1;
pktSendAdmin.m_Position.fPointX = 0.0f;
pktSendAdmin.m_Position.fPointY = 0.0f;
pktSendAdmin.m_Position.fPointZ = 0.0f;
if(PacketWrap::WrapHeader(reinterpret_cast<char*>(&pktSendAdmin),
sizeof(PktAdmin), CmdCharAdminCmd, 0, PktAdmin::E_LOGOUT_CHAR))
{
lpGameDispatch->GetSendStream().PutBuffer(
reinterpret_cast<char*>(&pktSendAdmin), sizeof(PktAdmin), CmdCharAdminCmd);
}
}
}
else
{
pktSendAdmin.m_usCmd = PktAdmin::REQUEST_TRACE_POS;
SERVER_ID serverID;
serverID.dwID = m_dwServerID;
// TRACE <20><><EFBFBD>Ѿ<EFBFBD> <20><> ij<><C4B3><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ȣ<EFBFBD><C8A3> <20><><EFBFBD><EFBFBD><EFBFBD>صд<D8B5>.
pktSendAdmin.m_ZoneInfo.m_cZone = serverID.GetZone();
pktSendAdmin.m_ZoneInfo.m_cChannel = 0;
}
}
/*
else if (lpPktAdmin->m_usCmd == PktAdmin::INFO_CHAR)
{
using namespace DBAgent::DataStorage;
// ij<><C4B3><EFBFBD>Ͱ<EFBFBD> <20>α׾ƿ<D7BE><C6BF><EFBFBD> <20><><EFBFBD><EFBFBD><C2B6><EFBFBD>
if (false == CSessionDataMgr::GetInstance().IsLoadedChar(lpPktAdmin->m_stName))
{
pktSendAdmin.m_usCmd = PktAdmin::INFO_CHAR;
GET_MULTI_DISPATCH(lpGameDispatch, m_dwServerID,
CGameDispatch, CGameDispatch::GetDispatchTable());
if(0 != lpGameDispatch)
{
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> channel <20><> -1 <20>̾<EFBFBD><CCBE><EFBFBD> <20>Ѵ<EFBFBD>. -_-;
pktSendAdmin.m_ZoneInfo.m_cChannel = -1;
pktSendAdmin.m_Position.fPointX = 0.0f;
pktSendAdmin.m_Position.fPointY = 0.0f;
pktSendAdmin.m_Position.fPointZ = 0.0f;
if (PacketWrap::WrapHeader(reinterpret_cast<char*>(&pktSendAdmin),
sizeof(PktAdmin), CmdCharAdminCmd, 0, PktAdmin::E_LOGOUT_CHAR))
{
lpGameDispatch->GetSendStream().PutBuffer(
reinterpret_cast<char*>(&pktSendAdmin), sizeof(PktAdmin), CmdCharAdminCmd);
}
}
}
}
*/
if(PacketWrap::WrapHeader(reinterpret_cast<char*>(&pktSendAdmin),
sizeof(PktAdmin), CmdCharAdminCmd, 0, 0))
{
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
GetDispatchTable().Process(CSendPacketAllServer(
reinterpret_cast<char*>(&pktSendAdmin), sizeof(PktAdmin), CmdCharAdminCmd));
}
return true;
}
bool CGameDispatch::GiveItemToTempInven(PktBase* lpPktBase)
{
PktGiveItemToTempInven* lpPktGiveItemToTempInven =
static_cast<PktGiveItemToTempInven*>(lpPktBase);
GiveItemInfo* lpPos = lpPktGiveItemToTempInven->m_GiveItemInfo;
GiveItemInfo* lpEnd = lpPos + lpPktGiveItemToTempInven->m_cGiveItemNum;
CGiveItemMgr& giveItemMgr = CGiveItemMgr::GetInstance();
for(; lpPos != lpEnd; ++lpPos)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ֱ⿡ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ø<EFBFBD><C3B8><EFBFBD><EFBFBD><EFBFBD> ä<><C3A4><EFBFBD><EFBFBD> <20>ش<EFBFBD>. ä<><C3A4><EFBFBD><EFBFBD> <20><> <20>ø<EFBFBD><C3B8><EFBFBD><EFBFBD><EFBFBD> DB<44><42> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
if(0 != lpPos->m_dwItemUID)
{
giveItemMgr.UpdateItemSerial(
lpPos->m_dwCreateID, lpPos->m_dwItemUID);
}
}
return true;
}
bool CGameDispatch::ChangeName(PktBase* lpPktBase)
{
PktCharNameChange* lpCharNameChange =
reinterpret_cast<PktCharNameChange*>(lpPktBase);
unsigned long dwUID = lpCharNameChange->m_dwUID;
unsigned long dwCID = lpCharNameChange->m_dwCID;
const char* szChangeName = lpCharNameChange->m_szCharName;
Item::ItemPos ItemPos = lpCharNameChange->m_ItemPos; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E3B0A1> <20><>ġ
unsigned char cNameChangeCount = 0;
unsigned short usError = 0;
using namespace DBAgent::DataStorage;
CSessionData* lpSessionData =
CSessionDataMgr::GetInstance().GetCharLoadedSession(dwCID);
CCharacterData* lpCharacterData = 0;
if (0 != lpSessionData &&
lpSessionData->GetUID() == dwUID &&
lpSessionData->GetCID() == dwCID &&
(0 != (lpCharacterData = lpSessionData->GetCharacterData())) &&
dwCID == lpCharacterData->GetCID())
{
unsigned long dwResult = 0;
const char* szPrevName = lpCharacterData->GetName();
// ī<><C4AB>Ʈ<EFBFBD><C6AE> <20><><EFBFBD>δ<EFBFBD>.
CHAR_INFOEX infoEx = lpCharacterData->GetInfoEx();
/*
if (0 == infoEx.cNameChangeCount)
{
usError = PktCharNameChange::ERR_NAMECHANGE_COUNT;
}
else
*/
// <20>̻<EFBFBD><CCBB><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ҽ<EFBFBD>Ų<EFBFBD><C5B2>.
if (DBComponent::GameDB::ChangeCharName(
CDBSingleObject::GetInstance(), dwCID, szChangeName, dwResult))
{
if (0 == dwResult)
{
CHAR_INFOST charInfoST = lpCharacterData->GetInfo();
strncpy(charInfoST.Name, szChangeName, CHAR_INFOST::MAX_NAME_LEN);
charInfoST.Name[CHAR_INFOST::MAX_NAME_LEN - 1] = 0;
lpCharacterData->SetInfo(charInfoST, true);
infoEx.cNameChangeCount = 0;
// --infoEx.cNameChangeCount; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٲ<EFBFBD><D9B2><EFBFBD> <20>̺κ<CCBA><CEBA><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
cNameChangeCount = infoEx.cNameChangeCount;
lpCharacterData->SetInfoEx(infoEx);
// <20><>ŷ<EFBFBD><C5B7><EFBFBD><EFBFBD> ã<>´<EFBFBD> //
if(CRankingMgr::GetInstance().GetRank(szPrevName, (unsigned char)lpCharacterData->GetClass()))
{
const CHAR_INFOST& charInfo = lpCharacterData->GetInfo();
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> //
CRankingDBMgr::GetInstance().DeleteRanking(RankingNode(szPrevName, charInfo.Fame,
static_cast<unsigned char>(charInfo.Level), static_cast<unsigned char>(charInfo.Class)));
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ //
CRankingDBMgr::GetInstance().UpdateRanking(RankingNode(szChangeName, charInfo.Fame,
static_cast<unsigned char>(charInfo.Level), static_cast<unsigned char>(charInfo.Class)));
}
}
else if(1 == dwResult)
{
ERRLOG3(g_Log, "UID:%10u / CID:%10u / ChangeName:%s / ij<><C4B3><EFBFBD><EFBFBD> <20≯<EFBFBD> <20>ٲٱ<D9B2> <20><><EFBFBD><EFBFBD> : <20≯<EFBFBD><CCB8><EFBFBD> <20>̹<EFBFBD> <20>ֽ<EFBFBD><D6BD>ϴ<EFBFBD>",
dwUID, dwCID, szChangeName);
usError = PktCharNameChange::ERR_ALREADY_USE_NAME;
}
else
{
ERRLOG4(g_Log, "UID:%10u / CID:%10u / ChangeName:%s / dwResult:%10u / ij<><C4B3><EFBFBD><EFBFBD> <20≯<EFBFBD> <20>ٲٱ<D9B2> <20><><EFBFBD><EFBFBD> : <20><> <20><> <20><><EFBFBD><EFBFBD> dwResult<6C><74><EFBFBD>Դϴ<D4B4>",
dwUID, dwCID, szChangeName, dwResult);
usError = PktCharNameChange::ERR_SERVER;
}
}
else
{
ERRLOG3(g_Log, "UID:%10u / CID:%10u / ChangeName:%s / ij<><C4B3><EFBFBD><EFBFBD> <20≯<EFBFBD> <20>ٲٱ<D9B2> <20><><EFBFBD><EFBFBD> : DBȣ<42><C8A3> <20><><EFBFBD><EFBFBD>",
dwUID, dwCID, szChangeName);
usError = PktCharNameChange::ERR_SERVER;
}
}
else
{
ERRLOG3(g_Log, "UID:%10u / CID:%10u / ChangeName:%s / "
"ij<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD> <20>ٲٱ<D9B2> <20><><EFBFBD><EFBFBD> : ij<><C4B3><EFBFBD>Ͱ<EFBFBD> Ȱ<><C8B0>ȭ <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>",
dwUID, dwCID, szChangeName);
usError = PktCharNameChange::ERR_CANNOT_FIND_CHARACTER;
}
GameClientSendPacket::SendCharNameChange(GetSendStream(), dwUID, dwCID,
szChangeName, cNameChangeCount, &ItemPos, usError);
return true;
}
void CGameDispatch::IncCharNum(int nRace)
{
switch(nRace)
{
case CClass::HUMAN: ++m_nHumanNum; break;
case CClass::AKHAN: ++m_nAkhanNum; break;
}
}
void CGameDispatch::DecCharNum(int nRace)
{
switch(nRace)
{
case CClass::HUMAN: --m_nHumanNum; break;
case CClass::AKHAN: --m_nAkhanNum; break;
}
}
int CGameDispatch::GetCharNum(int nRace) const
{
int nNum = -1;
switch(nRace)
{
case CClass::HUMAN: nNum = m_nHumanNum; break;
case CClass::AKHAN: nNum = m_nAkhanNum; break;
}
return (nNum < 1) ? 1 : nNum;
}
int CGameDispatch::GetCharNum() const
{
int nUserNumber = m_nHumanNum + m_nAkhanNum - 1;
return (nUserNumber < 1) ? 1 : nUserNumber;
}
// <20><><EFBFBD>߿<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>и<EFBFBD><D0B8><EFBFBD> <20><>..
bool ParseServerLog(CSendStream& SendStream, PktBase* lpPktBase)
{
PktServerLog* lpPktServerLog = static_cast<PktServerLog*>(lpPktBase);
switch(lpPktServerLog->m_cLogCmd)
{
case PktServerLog::ITEM_DUPLICATED_LOG:
{
PktItemDuplicated* lpPktItemDup = static_cast<PktItemDuplicated*>(lpPktServerLog);
if(!DBComponent::GameDB::InsertItemDuplicatedLog(CDBSingleObject::GetInstance(),
lpPktItemDup->m_dwItemSerial, lpPktItemDup->m_szName,
lpPktItemDup->m_dwUID, lpPktItemDup->m_dwCID, lpPktItemDup->m_dwQty))
{
ERRLOG5(g_Log, "UID:%10u / CID:%10u / CharName:%s / ItemSerial:0x%I64X / Qty:%u / <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><20>߰ߵǾ<DFB5><C7BE><EFBFBD><EFBFBD>ϴ<EFBFBD>",
lpPktItemDup->m_dwUID, lpPktItemDup->m_dwCID, lpPktItemDup->m_szName,
lpPktItemDup->m_dwItemSerial, lpPktItemDup->m_dwQty);
}
}
break;
}
return true;
}
// -----------------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD> <20>Լ<EFBFBD><D4BC><EFBFBD> <20>޼<EFBFBD><DEBC><EFBFBD>
CGetTotalCount::CGetTotalCount(unsigned short& usHumanCount,
unsigned short& usAkhanCount,
unsigned char& cChannelCount)
: m_usHumanCount(usHumanCount),
m_usAkhanCount(usAkhanCount),
m_cChannelCount(cChannelCount)
{
m_usHumanCount = 0;
m_usAkhanCount = 0;
m_cChannelCount = 0;
}
bool CGetTotalCount::operator () (unsigned long dwServerID, CPacketDispatch& packetDispatch)
{
CGameDispatch& gameDispatch = reinterpret_cast<CGameDispatch&>(packetDispatch);
int nCharNum = gameDispatch.GetCharNum(CClass::HUMAN);
m_usHumanCount += nCharNum;
nCharNum = gameDispatch.GetCharNum(CClass::AKHAN);
m_usAkhanCount += nCharNum;
++m_cChannelCount;
return true;
}
CUserPercentageInZone::CUserPercentageInZone(unsigned short* lpChannelUserNum,
unsigned char cZone, unsigned char cChannelNum)
: m_lpChannelUserNum(lpChannelUserNum),
m_cZone(cZone),
m_cChannelNum(cChannelNum),
m_nMaxUserNum(CServerSetup::GetInstance().GetUserLimit())
{
std::fill_n(m_lpChannelUserNum, m_cChannelNum, 0);
}
bool CUserPercentageInZone::operator () (unsigned long dwServerID, CPacketDispatch& packetDispatch)
{
CGameDispatch& gameDispatch = reinterpret_cast<CGameDispatch&>(packetDispatch);
SERVER_ID serverID;
serverID.dwID = dwServerID;
if(serverID.GetZone() == m_cZone)
{
if(serverID.GetChannel() < m_cChannelNum)
{
m_lpChannelUserNum[serverID.GetChannel()] =
gameDispatch.GetCharNum() * 100 / m_nMaxUserNum + 1;
}
}
return true;
}
CSendPacketToZone::CSendPacketToZone(const char* szData, unsigned long dwDataLen,
unsigned char cPacketCmd, unsigned char cZone)
: m_szData(szData), m_dwDataLen(dwDataLen),
m_cPacketCmd(cPacketCmd), m_cZone(cZone)
{
}
bool CSendPacketToZone::operator () (unsigned long dwServerID, CPacketDispatch& packetDispatch)
{
SERVER_ID serverID;
serverID.dwID = dwServerID;
if(serverID.GetZone() == m_cZone)
{
return reinterpret_cast<CRylServerDispatch&>(packetDispatch).GetSendStream().PutBuffer(
m_szData, m_dwDataLen, m_cPacketCmd);
}
return true;
}
}