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>
828 lines
26 KiB
C++
828 lines
26 KiB
C++
#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;
|
||
}
|
||
|
||
}
|
||
|
||
|