Files
Client/Server/AdminTool/AdminToolServer/RYL_AdminMgrDispatch.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

6619 lines
199 KiB
C++

#include "stdafx.h"
#include "RYL_AdminMgrDispatch.h"
#include "RYL_AgentServerDispatch.h"
#include "RYL_AgentServerTable.h"
#include "RYL_AdminManagerServer.h"
#include <DB/GameDBComponent.h>
#include <DBComponent/RYL_GameDB.h>
#include <DBComponent/BillingDB.h>
#include <DBComponent/RYL_AdminMgrDB.h>
#include <DBComponent/AuthDB.h>
#include <Network/Protocol/RYL_AdminMgrProtocol.h>
#include <Network/Session/Session.h>
#include <Network/Buffer/RYL_CumulateBuffer.h>
#include <Network/Packet/WrapPacket.h>
#include <Network/Packet/PacketCommand.h>
#include <Network/Packet/PacketStruct/ServerInfo.h>
#include <Network/Packet/PacketStruct/ServerPacket.h>
#include <Network/Packet/PacketStruct/GuildPacket.h>
#include <Network/Packet/PacketStruct/CastlePacket.h>
#include <Network/Packet/PacketStruct/ClientToLoginServer.h>
#include <Item/ItemMgr.h>
#include <Item/ItemFactory.h>
#include <Utility/Debug/DebugMacros.h>
#include <Parser/ServerInfo.h>
#include <Log/ServerLog.h>
#include "ClientDispatchTable.h"
CRylAdminMgrDispatch::CRylAdminMgrDispatch(CSession& Session)
: m_bLogin(false)
, m_MyAuthority(0)
, m_MyUID(0)
, CRylServerDispatch(Session, 10)
{
}
void CRylAdminMgrDispatch::Destroy()
{
}
void CRylAdminMgrDispatch::Connected()
{
CClientDispatchTable::GetInstance().insert(this);
m_nAgentType = atoi(CServerInfo::GetInstance().GetValue("AGENT_TYPE"));
m_nIPCheck = atoi(CServerInfo::GetInstance().GetValue("IP_CHECK"));
_snprintf(m_szToolNation, 256, "%s", CServerInfo::GetInstance().GetValue("NATION"));
}
void CRylAdminMgrDispatch::Disconnected()
{
CClientDispatchTable::GetInstance().erase(this);
CDBAdminTool::GetInstance().EndLog(m_MyUID); // DB에 Logout시간을 남긴다.
CAgentServerTable::GetInstance().RemoveAllModifyCharacter(this); // 수정 중이였던 캐릭터를 목록에서 모두 삭제
CAgentServerTable::GetInstance().RemoveAllDepositLock(this); // 수정 중이였던 창고의 독점권을 모두 해제
}
// 패킷 디스패치
bool CRylAdminMgrDispatch::DispatchPacket(PktBase* lpPktBase)
{
using namespace PktAdminMgr;
unsigned char cCmd = lpPktBase->GetCmd();
if(PktAdminMgr::AuthorityMask::AdminAuthority[cCmd] & m_MyAuthority) // 패킷 사용권한 체크
{
if(cCmd && cCmd < PktCMD::PktEnd)
{
// 어떤일을하는 패킷인지 확인후 Log쿼리를 미리 만들어놓자.
// (Before 데이터 수집을 위해 디스패치전에 데이터를 끌어오자)
m_DetailLog.PktLog[cCmd](lpPktBase, m_MyLogID);
}
bool bResult = false;
// 나중에 함수 포인터로 전환해보자..;
switch(cCmd)
{
case PktCMD::PktNewAdmin: bResult = PktNewAdmin (lpPktBase); break;
case PktCMD::PktAdminList: bResult = PktAdminList (lpPktBase); break;
case PktCMD::PktDelAdmin: bResult = PktDelAdmin (lpPktBase); break;
case PktCMD::PktUpdateLevel: bResult = PktUpdateLev (lpPktBase); break;
case PktCMD::PktUpdateIP: bResult = PktUpdateIP (lpPktBase); break;
case PktCMD::PktUpdatePasswd: bResult = PktUpdatePasswd (lpPktBase); break;
case PktCMD::PktLogList: bResult = PktLogList (lpPktBase); break;
case PktCMD::PktLogUseMessage: bResult = PktLogUseMessage (lpPktBase); break;
case PktCMD::PktDetailLog: bResult = PktDetailLog (lpPktBase); break;
case PktCMD::PktBeforeAfter: bResult = PktBeforAfter (lpPktBase); break;
case PktCMD::PktSearchID: bResult = PktSearchID (lpPktBase); break;
case PktCMD::PktSearchName: bResult = PktSearchName (lpPktBase); break;
case PktCMD::PktGetCharacter: bResult = PktGetCharacter (lpPktBase); break;
case PktCMD::PktSetCharacter: bResult = PktSetCharacter (lpPktBase); break;
case PktCMD::PktCloseCharacter: bResult = PktCloseCharacter (lpPktBase); break;
case PktCMD::PktUpdateStatus: bResult = PktUpdateStatus (lpPktBase); break;
case PktCMD::PktCreateItem: bResult = PktCreateItem (lpPktBase); break;
case PktCMD::PktUpdateItem: bResult = PktUpdateItem (lpPktBase); break;
case PktCMD::PktRemoveItem: bResult = PktRemoveItem (lpPktBase); break;
case PktCMD::PktItemReset: bResult = PktItemReset (lpPktBase); break;
case PktCMD::PktSkillEdit: bResult = PktSkillEdit (lpPktBase); break;
case PktCMD::PktAddBlockUser: bResult = PktAddBlockUser (lpPktBase); break;
case PktCMD::PktSearchBlock: bResult = PktSearchBlock (lpPktBase); break;
case PktCMD::PktDelBlockUser: bResult = PktDelBlockUser (lpPktBase); break;
case PktCMD::PktChangePos: bResult = PktChangePos (lpPktBase); break;
case PktCMD::PktSetZoneList: bResult = PktSetZoneList (lpPktBase); break;
case PktCMD::PktDepositPasswd: bResult = PktDepositPasswd (lpPktBase); break;
case PktCMD::PktCheckName: bResult = PktCheckName (lpPktBase); break;
case PktCMD::PktChangeName: bResult = PktChangeName (lpPktBase); break;
case PktCMD::PktDelCharList: bResult = PktDelCharList (lpPktBase); break;
case PktCMD::PktCharRestore: bResult = PktCharRestore (lpPktBase); break;
case PktCMD::PktAdminStoreInsert: bResult = PktAdminStoreInsert (lpPktBase); break;
case PktCMD::PktAdminStoreDelete: bResult = PktAdminStoreDelete (lpPktBase); break;
case PktCMD::PktGetAdminStoreItem: bResult = PktGetAdminStoreItem (lpPktBase); break;
case PktCMD::PktUpdateAdminStore: bResult = PktUpdateAdminStore (lpPktBase); break;
case PktCMD::PktDelCharacter: bResult = PktDelCharacter (lpPktBase); break;
case PktCMD::PktInvenGold: bResult = PktInvenGold (lpPktBase); break;
case PktCMD::PktForcedDis: bResult = PktForcedDis (lpPktBase); break;
case PktCMD::PktGuildSearch: bResult = PktGuildSearch (lpPktBase); break;
case PktCMD::PktRequestGuildMemberList: bResult = PktRequestGuildMemberList (lpPktBase); break;
case PktCMD::PktGuildRestoreDataList: bResult = PktGuildRestoreDataList (lpPktBase); break;
case PktCMD::PktFortSearch: bResult = PktFortSearch (lpPktBase); break;
case PktCMD::PktMiningCamp: bResult = PktMiningCamp (lpPktBase); break;
case PktCMD::PktShopCamp: bResult = PktShopCamp (lpPktBase); break;
case PktCMD::PktShopCampGold: bResult = PktShopCampGold (lpPktBase); break;
case PktCMD::PktShopCampTax: bResult = PktShopCampTax (lpPktBase); break;
case PktCMD::PktCastleSearch: bResult = PktCastleSearch (lpPktBase); break;
case PktCMD::PktCastleCreature: bResult = PktCastleCreature (lpPktBase); break;
case PktCMD::PktItemQtyControl: bResult = PktItemQtyControlData (lpPktBase); break;
case PktCMD::PktStoreGoldUpdate: bResult = PktStoreGoldUpdate (lpPktBase); break;
case PktCMD::PktUserBillingLog: bResult = PktUserBillingLogRequest (lpPktBase); break;
case PktCMD::PktGameAdmin: bResult = PktGameAdmin (lpPktBase); break;
case PktCMD::PktConnectAllServerz: bResult = PktConnectAllServerz (lpPktBase); break;
case PktCMD::PktRefreshConnectedList: bResult = SendConnectedServerIndex (); break;
case PktCMD::PktInterestedUser: bResult = PktInterestedUser (lpPktBase); break;
case PktCMD::PktConnectionChk: bResult = PktConnectionChk (lpPktBase); break;
case PktCMD::PktConnectedUserList: bResult = PktConnectedUserList (); break;
case PktCMD::PktDuplicatedItem: bResult = PktDuplicatedItem (lpPktBase); break;
case PktCMD::PktItemDistribute: bResult = PktItemDistribute (lpPktBase); break;
case PktCMD::PktGuildRight: bResult = PktGuildRight (lpPktBase); break;
case PktCMD::PktUnifiedCharInfo: bResult = PktUnifiedCharInfo (lpPktBase); break;
case PktCMD::PktUnifiedGuildInfo: bResult = PktUnifiedGuildInfo (lpPktBase); break;
case PktCMD::PktDetailCharInfo: bResult = PktDetailCharInfo (lpPktBase); break;
case PktCMD::PktCancelExecuteQuest: bResult = PktCancelExecuteQuest (lpPktBase); break;
case PktCMD::PktDeleteHistoryQuest: bResult = PktDeleteHistoryQuest (lpPktBase); break;
case PktCMD::PktUserNation: bResult = PktUserNation (lpPktBase); break;
case PktCMD::PktShiftToUID: bResult = PktShiftToUID (lpPktBase); break;
case PktCMD::PktStoreTabEdit: bResult = PktStoreTabEdit (lpPktBase); break;
case PktCMD::PktAmountOfGold: bResult = PktAmountOfGold (lpPktBase); break;
case PktCMD::PktGMLogMsg: bResult = PktGMLogMsg (lpPktBase); break;
case PktCMD::PktNameChangeCount: bResult = PktNameChangeCount (lpPktBase); break;
case PktCMD::PktGuildMemberEdit: bResult = PktGuildMemberEdit (lpPktBase); break;
case PktCMD::PktGetCharInfoTime: bResult = PktSearchCharInfoTime (lpPktBase); break;
default: bResult = PktUnkonwnPacket(); break;
}
if(bResult) m_DetailLog.UpdateDetailLog();
return bResult;
}
else // 클라이언트가 권한정보가 없거나 권한이 없을경우
{
switch(cCmd)
{
case PktCMD::PktLogin: return PktLogin(lpPktBase);
default: return PktAuthority();
}
}
return false;
}
// 캐릭터 스테이터스 정보 수정
bool CRylAdminMgrDispatch::PktUpdateStatus(PktBase* lpPktBase)
{
PktAdminMgr::PktUpdateStatus* lpPktStatus = static_cast<PktAdminMgr::PktUpdateStatus*>(lpPktBase);
CRylAgentServerDispatch* lpAgentDispatch =
CAgentServerTable::GetInstance().GetDispatch(lpPktStatus->m_dwServerGroup);
if(NULL == lpAgentDispatch)
{
SendResult(PktAdminMgr::PktResult::Err_NotFoundAgentDispatch);
return true;
}
CModifyCharacter* lpModifyCharacter =
lpAgentDispatch->GetModifyCharacterMgr().GetCharacter(lpPktStatus->m_dwCID);
if(NULL == lpModifyCharacter)
{
SendResult(PktAdminMgr::PktResult::Err_Invalid_Character);
return true;
}
PktAdminMgr::CHAR_STATUS_ST stBeforeStatus;
lpModifyCharacter->GetModifyCharStatus(stBeforeStatus);
if(!lpModifyCharacter->UpdataStatus(lpPktStatus->m_stStatus))
{
SendResult(PktAdminMgr::PktResult::Err_ChangeStatus);
}
else
{
lpModifyCharacter->OnChangedInfo(CModifyCharacter::MASK::ON_BASIC);
m_DetailLog.SetBefore("UID: %u\r\nCID: %u\r\nServerGroup: %u\r\n\r\nRace: %d\r\n"
"Level: %d\r\nExp: %I64d\r\nFame: %u\r\nMileage: %u\r\nClass: %u\r\nCON: %d\r\n"
"DEX: %d\r\nINT: %d\r\nSTR: %d\r\nWIS: %d\r\nIP: %d\r\nSex: %d\r\nFace: %d\r\nHair: %d\r\nChance: %d",
lpPktStatus->m_dwUID, lpPktStatus->m_dwCID, lpPktStatus->m_dwServerGroup, stBeforeStatus.m_cRace,
stBeforeStatus.m_cLevel, stBeforeStatus.m_dwExp, stBeforeStatus.m_dwFame, stBeforeStatus.m_dwMileage,
stBeforeStatus.m_nClass, stBeforeStatus.m_nCON, stBeforeStatus.m_nDEX, stBeforeStatus.m_nINT,
stBeforeStatus.m_nSTR, stBeforeStatus.m_nWIS, stBeforeStatus.m_nIP, stBeforeStatus.m_cSex,
stBeforeStatus.m_cFace, stBeforeStatus.m_cHair, stBeforeStatus.m_cChance);
m_DetailLog.SetAfter("Race: %d\r\nLevel: %d\r\nExp: %I64d\r\nFame: %u\r\nMileage: %u\r\n"
"Class: %d\r\nCON: %d\r\nDEX: %d\r\nINT: %d\r\nSTR: %d\r\nWIS: %d\r\nIP: %d\r\n"
"Sex: %d\r\nFace: %d\r\nHair: %d\r\nChance: %d",
lpPktStatus->m_stStatus.m_cRace, lpPktStatus->m_stStatus.m_cLevel, lpPktStatus->m_stStatus.m_dwExp,
lpPktStatus->m_stStatus.m_dwFame, lpPktStatus->m_stStatus.m_dwMileage, lpPktStatus->m_stStatus.m_nClass,
lpPktStatus->m_stStatus.m_nCON, lpPktStatus->m_stStatus.m_nDEX, lpPktStatus->m_stStatus.m_nINT,
lpPktStatus->m_stStatus.m_nSTR, lpPktStatus->m_stStatus.m_nWIS, lpPktStatus->m_stStatus.m_nIP,
lpPktStatus->m_stStatus.m_cSex, lpPktStatus->m_stStatus.m_cFace, lpPktStatus->m_stStatus.m_cHair,
lpPktStatus->m_stStatus.m_cChance);
m_DetailLog.InsertLog(m_MyLogID);
SendResult(PktAdminMgr::PktResult::Success_ChangeStatus);
}
return true;
}
// 캐릭터 정보 요청
bool CRylAdminMgrDispatch::PktGetCharacter(PktBase* lpPktBase)
{
PktAdminMgr::PktGetCharacter* lpPktGetChar = static_cast<PktAdminMgr::PktGetCharacter*>(lpPktBase);
CRylAgentServerDispatch* lpAgentDispatch =
CAgentServerTable::GetInstance().GetDispatch(lpPktGetChar->m_dwServerGroup);
if(NULL == lpAgentDispatch)
{
ERRLOG0(g_Log, "중계 서버 디스패치 얻기 실패");
SendResult(PktAdminMgr::PktResult::Err_NotFoundAgentDispatch);
return true;
}
ItemData::CDepositLock::DepositInfo Info;
if(lpAgentDispatch->GetDepositLock().GetLockInfo(lpPktGetChar->m_dwUID, Info))
{
CModifyCharacter* lpModifyCharacter =
lpAgentDispatch->GetModifyCharacterMgr().GetCharacter(Info.m_dwCID);
if(NULL != lpModifyCharacter)
{
if(lpModifyCharacter->GetSaveState())
{
// 요청한 UID내의 캐릭터가 정보 저장중인 상태
SendResultnRequestKey(
PktAdminMgr::PktResult::Err_StateisSave, lpPktGetChar->m_dwRequestKey);
return true;
}
}
}
CModifyCharacter* lpModifyCharacter =
lpAgentDispatch->GetModifyCharacterMgr().GetCharacter(lpPktGetChar->m_dwCID);
bool bRefresh = false;
if(NULL != lpModifyCharacter)
{
// 동일한 사용자가 캐릭터 정보 재 갱신 가능하도록
bRefresh = (lpModifyCharacter->GetDispatch() == this)
&& (lpModifyCharacter->GetClientKey() == lpPktGetChar->m_dwRequestKey);
}
if ((NULL == lpModifyCharacter) || bRefresh)
{
bool bIsReleased = true;
CBuffer* lpBuffer = CREATE_BUFFER(GetBufferFactory(), sizeof(PktAgentServer::PktAdminToolGetData));
if (NULL == lpBuffer)
{
ERRLOG0(g_Log, "버퍼 생성 실패");
return true;
}
PktAgentServer::PktAdminToolGetData* lpPktSGetChar =
reinterpret_cast<PktAgentServer::PktAdminToolGetData*>(lpBuffer->begin());
lpPktSGetChar->m_cType = PktAgentServer::PktAdminToolGetData::GET_CHAR_DATA;
lpPktSGetChar->m_dwUID = lpPktGetChar->m_dwUID;
lpPktSGetChar->m_dwCID = lpPktGetChar->m_dwCID;
lpPktSGetChar->m_cOldServerGroupID = lpPktGetChar->m_cOldServerGroupID;
lpPktSGetChar->m_dwRequestKey =
lpAgentDispatch->GetRequestKeeper().Push(this, lpPktGetChar->m_dwRequestKey);
strncpy(lpPktSGetChar->m_szName, lpPktGetChar->m_szCharName, 16);
if (false == PacketWrap::WrapHeader(lpBuffer,
sizeof(PktAgentServer::PktAdminToolGetData), PktAgentServer::PktCMD::CmdAdminToolGetData, 0, 0))
{
ERRLOG0(g_Log, "수동으로 패킷을 릴리스합니다.");
bIsReleased = false;
}
else
{
if (true == lpAgentDispatch->Send(lpBuffer))
{
CModifyCharacter* lpModifyCharacter =
lpAgentDispatch->GetModifyCharacterMgr().InsertChar(lpPktGetChar->m_dwCID);
lpModifyCharacter->SetUID(lpPktGetChar->m_dwUID);
lpModifyCharacter->SetCID(lpPktGetChar->m_dwCID);
lpModifyCharacter->SetModifyAdmin(m_szAccount, sizeof(m_szAccount));
lpModifyCharacter->SetServerGroup(lpPktGetChar->m_dwServerGroup);
lpModifyCharacter->SetOldServerGroup(lpPktGetChar->m_cOldServerGroupID);
lpModifyCharacter->SetDispatch(this);
lpModifyCharacter->SetClientKey(lpPktGetChar->m_dwRequestKey);
SendResult(PktAdminMgr::PktResult::Success_ModifyCharacter);
return true;
}
else
{
ERRLOG0(g_Log, "수동으로 패킷을 릴리스합니다.");
bIsReleased = false;
}
}
if (false == bIsReleased)
{
SAFE_RELEASE_BUFFER(lpBuffer);
}
}
else
{
SendResultnRequestKey(PktAdminMgr::PktResult::Err_ModifyCharacter, lpPktGetChar->m_dwRequestKey);
}
return true;
}
// 캐릭터 편집을 마치거나 캐릭터 세션을 닫고 저장
bool CRylAdminMgrDispatch::PktCloseCharacter(PktBase* lpPktBase)
{
PktAdminMgr::PktCloseCharacter* lpPktCloseChar = static_cast<PktAdminMgr::PktCloseCharacter*>(lpPktBase);
CRylAgentServerDispatch* lpAgentDispatch =
CAgentServerTable::GetInstance().GetDispatch(lpPktCloseChar->m_dwServerGroup);
if(NULL == lpAgentDispatch)
{
ERRLOG0(g_Log, "중계 서버 디스패치 얻기 실패");
SendResult(PktAdminMgr::PktResult::Err_NotFoundAgentDispatch);
return true;
}
CModifyCharacter* lpModifyCharacter =
lpAgentDispatch->GetModifyCharacterMgr().GetCharacter(lpPktCloseChar->m_dwCID);
if(NULL == lpModifyCharacter)
{
ERRLOG0(g_Log, "캐릭터 세션 얻기 실패");
return true;
}
// 캐릭터 정보가 변경되었으나 저장이 안된상태라면 저장할것인지 클라이언트에게 물어보자
//if(0 == lpModifyCharacter->m_byChangedInfo)
CPacketDispatch* lpPacketDispatch =
lpAgentDispatch->GetDepositLock().GetDispatch(lpModifyCharacter->GetUID());
if(this == lpPacketDispatch)
{
// 내가 창고 독점권을 소유하고 있으니 독점권 해지
lpAgentDispatch->GetDepositLock().DepositUnLock(lpModifyCharacter->GetUID());
}
// 내가 편집 중이던 캐릭터를 모두 지우기
if(!lpAgentDispatch->GetModifyCharacterMgr().EraseChar(lpPktCloseChar->m_dwCID))
{
SendResult(PktAdminMgr::PktResult::Err_CloseCharacter);
}
return true;
}
// 캐릭터의 정보가 변경된부분이 있으면 변경된 부분만 저장한다.
bool CRylAdminMgrDispatch::PktSetCharacter(PktBase* lpPktBase)
{
PktAdminMgr::PktSetCharacter* lpPktSetChar = static_cast<PktAdminMgr::PktSetCharacter*>(lpPktBase);
CRylAgentServerDispatch* lpAgentDispatch =
CAgentServerTable::GetInstance().GetDispatch(lpPktSetChar->m_dwServerGroup);
if (NULL == lpAgentDispatch)
{
ERRLOG0(g_Log, "중계 서버 디스패치 얻기 실패");
SendResult(PktAdminMgr::PktResult::Err_NotFoundAgentDispatch);
return true;
}
CModifyCharacter* lpChar =
lpAgentDispatch->GetModifyCharacterMgr().GetCharacter(lpPktSetChar->m_dwCID);
if (NULL == lpChar)
{
SendResult(PktAdminMgr::PktResult::Err_Invalid_Character);
return true;
}
// 캐릭터에 변경된 정보가 있으면
if ((0 != lpChar->m_byChangedInfo) && (0 == lpChar->GetSaveState()))
{
bool bIsReleased = true;
CBuffer* lpBuffer = CREATE_BUFFER(GetBufferFactory(), sizeof(PktAgentServer::PktAdminToolSetData));
if (NULL == lpBuffer)
{
ERRLOG0(g_Log, "버퍼 생성 실패");
return true;
}
PktAgentServer::PktAdminToolSetData* lpPktSSetData =
reinterpret_cast<PktAgentServer::PktAdminToolSetData*>(lpBuffer->begin());
// Character Parser에게 ServerDispatch Session을 매치
lpAgentDispatch->SetPaseSession();
// 저장중인 캐릭터 재 로딩 방지
lpChar->SetSaveState(true);
lpPktSSetData->m_dwSerial = Item::CItemFactory::GetInstance().GetItemUID();
lpPktSSetData->m_cType = PktAgentServer::PktAdminToolSetData::OPEN_UPDATE_DATA;
lpPktSSetData->m_dwUID = lpPktSetChar->m_dwUID;
lpPktSSetData->m_dwCID = lpPktSetChar->m_dwCID;
lpPktSSetData->m_dwRequestKey =
lpAgentDispatch->GetRequestKeeper().Push(this, lpPktSetChar->m_dwRequestKey);
lpPktSSetData->m_cOldServerGroupID = lpPktSetChar->m_cOldServerGroupID;
if (false == PacketWrap::WrapHeader(lpBuffer,
sizeof(PktAgentServer::PktAdminToolSetData), PktAgentServer::PktCMD::CmdAdminToolSetData, 0, 0))
{
ERRLOG0(g_Log, "수동으로 패킷을 릴리스합니다.");
bIsReleased = false;
}
else
{
if (true == lpAgentDispatch->Send(lpBuffer))
{
if (true == lpAgentDispatch->UpdateCharacter(lpChar, lpPktSSetData->m_dwSerial,
lpPktSSetData->m_dwUID, lpPktSSetData->m_dwCID, lpPktSSetData->m_dwRequestKey))
{
m_DetailLog.SetBefore("not exist contents");
m_DetailLog.SetAfter("[Apply Edited Data]\r\nUID: %u\r\nCID: %u\r\nServerGroup: %u",
lpPktSetChar->m_dwUID, lpPktSetChar->m_dwCID, lpPktSetChar->m_dwServerGroup);
m_DetailLog.InsertLog(m_MyLogID);
SendResult(PktAdminMgr::PktResult::Success_SaveCharacter);
return true;
}
else
{
ERRLOG0(g_Log, "캐릭터 세션 열기 실패");
}
}
else
{
ERRLOG0(g_Log, "수동으로 패킷을 릴리스합니다.");
bIsReleased = false;
}
}
if (false == bIsReleased)
{
SAFE_RELEASE_BUFFER(lpBuffer);
}
}
else
{
SendResult(PktAdminMgr::PktResult::Err_SkipCharacterSave);
}
return true;
}
// ID로 캐릭터 검색 CID, UID
bool CRylAdminMgrDispatch::PktSearchID(PktBase* lpPktBase)
{
PktAdminMgr::PktSearchID* lpPktSearch = static_cast<PktAdminMgr::PktSearchID*>(lpPktBase);
bool bResult = false;
if(lpPktSearch->m_SearchType == PktAdminMgr::PktSearchID::SearchUID)
{
PktSearchUIDAck(lpPktSearch->m_dwID, lpPktSearch->m_nOldServerID, lpPktSearch->m_dwRequestKey, bResult);
}
else if(lpPktSearch->m_SearchType == PktAdminMgr::PktSearchID::SearchCID)
{
PktSearchCIDAck(lpPktSearch->m_dwID, lpPktSearch->m_dwServerGroup, lpPktSearch->m_dwRequestKey, bResult);
}
PktSearchResultAck(bResult ? PktAdminMgr::PktSearchResultAck::Success : PktAdminMgr::PktSearchResultAck::NoData,
lpPktSearch->m_dwRequestKey);
return true;
}
// UID 검색은 모든 서버군의 DB에 전송하여 결과값을 얻어온다.
bool CRylAdminMgrDispatch::PktSearchUIDAck(unsigned long UID, unsigned int nOldServerID,
unsigned long dwKey, bool& bResult)
{
CAgentServerTable& ServerTable = CAgentServerTable::GetInstance();
CCumulateBuffer cBuffer(8129, &GetSession());
unsigned short SearchCount = 0;
// 모든 DB에서 검색하여 결과를 보내준다.
for(int Cnt = 0; Cnt < CAgentServerTable::MAX_AGENT_SERVER; Cnt++)
{
CGameDB* lpGameDB = ServerTable.GetGameDB(Cnt);
CRylAgentServerDispatch* lpAgentDispatch = ServerTable.GetDispatch(Cnt);
if((NULL != lpGameDB) && (NULL != lpAgentDispatch))
{
char In_Char[1024]; // 일단 넉넉하게 잡아주자
if(lpGameDB->UIDByCharacterList(UID, m_nAgentType, nOldServerID, In_Char))
{
unsigned char CharCount = In_Char[0];
if (0 == CharCount)
{
SendResult(PktAdminMgr::PktResult::Err_Invalid_Character);
}
else
{
int nSize = sizeof(PktAdminMgr::PktSearchAck) + (sizeof(CGameDB::Out_CharList) * CharCount);
char* lpBuffer = cBuffer.GetBuffer(nSize);
PktAdminMgr::PktSearchAck* lpPktSearch = reinterpret_cast<PktAdminMgr::PktSearchAck*>(lpBuffer);
char* lpCharBody = reinterpret_cast<char*>(lpPktSearch + 1);
lpPktSearch->m_dwServerGroup = Cnt; // 서버군 인덱스
lpPktSearch->m_CharCount = CharCount; // 등록되어있는 캐릭터 수
lpPktSearch->m_dwRequestKey = dwKey;
lpPktSearch->m_cOldServerGroup = nOldServerID;
// 캐릭터 이름및 UID CID 정보
CopyMemory(lpCharBody, In_Char + 1, sizeof(CGameDB::Out_CharList) * CharCount);
PacketWrap::WrapHeader(lpBuffer, nSize, PktAdminMgr::PktCMD::PktSearchAck, 0, 0);
++SearchCount;
}
}
}
}
if(0 == SearchCount)
{
// 검색된 정보가 없으면.
bResult = false;
cBuffer.ResizeLength(0);
}
else
{
bResult = true;
}
return true;
}
// CID 검색결과 Ack
bool CRylAdminMgrDispatch::PktSearchCIDAck(unsigned long CID, unsigned long dwGroup, unsigned long dwKey,
bool& bResult)
{
CAgentServerTable& ServerTable = CAgentServerTable::GetInstance();
CCumulateBuffer cBuffer(8192, &GetSession());
bResult = false;
CGameDB* lpGameDB = ServerTable.GetGameDB(dwGroup);
CRylAgentServerDispatch* lpAgentDispatch = ServerTable.GetDispatch(dwGroup);
if((NULL != lpGameDB) && (NULL != lpAgentDispatch))
{
char In_Char[1024];
if (true == lpGameDB->CIDByCharacterList(CID, In_Char))
{
unsigned char Count = In_Char[0];
int nSize = sizeof(PktAdminMgr::PktSearchAck) + sizeof(CGameDB::Out_CharList);
char* lpBuffer = cBuffer.GetBuffer(nSize);
PktAdminMgr::PktSearchAck* lpPktSearch = reinterpret_cast<PktAdminMgr::PktSearchAck*>(lpBuffer);
char* lpCharBody = reinterpret_cast<char*>(lpPktSearch + 1);
bResult = true;
lpPktSearch->m_dwServerGroup = dwGroup;
lpPktSearch->m_CharCount = Count;
lpPktSearch->m_dwRequestKey = dwKey;
lpPktSearch->m_cOldServerGroup = lpGameDB->GetOldServerGroupID(CID);
CopyMemory(lpCharBody, In_Char + 1, sizeof(CGameDB::Out_CharList));
PacketWrap::WrapHeader(lpBuffer, nSize, PktAdminMgr::PktCMD::PktSearchAck, 0, 0);
}
}
if(bResult == false)
{
cBuffer.ResizeLength(0);
}
return true;
}
// 계정명, 캐릭명으로 검색
bool CRylAdminMgrDispatch::PktSearchName(PktBase* lpPktBase)
{
PktAdminMgr::PktSearchName* lpPktSearch = static_cast<PktAdminMgr::PktSearchName*>(lpPktBase);
unsigned short wSearchCount = 0; // 캐릭명으로 검색한 경우 검색 수
bool bResult = false; // 계정명으로 검색한 경우 결과 값 존재 여부
// 우선 누적버퍼에 있는 값을 클라이언트로 전송
CCumulateBuffer cBuffer(8129, &GetSession());
if (PktAdminMgr::PktSearchName::Character == lpPktSearch->m_SearchType)
{
CGameDB* lpGameDB = CAgentServerTable::GetInstance().GetGameDB(lpPktSearch->m_dwServerGroup);
CRylAgentServerDispatch* lpAgentDispatch =
CAgentServerTable::GetInstance().GetDispatch(lpPktSearch->m_dwServerGroup);
if ((NULL != lpGameDB) && (NULL != lpAgentDispatch))
{
char In_Char[1024];
if (lpGameDB->CNameByCharacterList(lpPktSearch->m_szName, In_Char))
{
unsigned char Count = *In_Char;
int nSize = sizeof(PktAdminMgr::PktSearchAck) + sizeof(CGameDB::Out_CharList);
char* lpBuffer = cBuffer.GetBuffer(nSize);
PktAdminMgr::PktSearchAck* lpPktSearchAck =
reinterpret_cast<PktAdminMgr::PktSearchAck*>(lpBuffer);
char* lpCharBody = reinterpret_cast<char*>(lpPktSearchAck + 1);
lpPktSearchAck->m_CharCount = Count;
lpPktSearchAck->m_dwServerGroup = lpPktSearch->m_dwServerGroup;
lpPktSearchAck->m_dwRequestKey = lpPktSearch->m_dwRequestKey;
CopyMemory(lpCharBody, In_Char + 1, sizeof(CGameDB::Out_CharList));
++wSearchCount;
PacketWrap::WrapHeader(lpBuffer, nSize, PktAdminMgr::PktCMD::PktSearchAck, 0, 0);
}
}
}
else if(PktAdminMgr::PktSearchName::Account == lpPktSearch->m_SearchType)
{
unsigned long dwUID = 0;
CAuthDB* lpAuthDB = CAgentServerTable::GetInstance().GetAuthDB();
if (NULL != lpAuthDB)
{
dwUID = lpAuthDB->GetUIDFromAccount(lpPktSearch->m_szName);
}
else
{
ERRLOG0(g_Log, "계정명-> UID 변환 실패: 인증 디비 얻기 실패");
}
PktSearchUIDAck(dwUID, lpPktSearch->m_nOldServerID, lpPktSearch->m_dwRequestKey, bResult);
}
if((0 == wSearchCount) && (false == bResult))
{
cBuffer.ResizeLength(0);
PktSearchResultAck(PktAdminMgr::PktSearchResultAck::NoData, lpPktSearch->m_dwRequestKey);
}
else
{
cBuffer.SendAll();
PktSearchResultAck(PktAdminMgr::PktSearchResultAck::Success, lpPktSearch->m_dwRequestKey);
}
return true;
}
// 캐릭터 검색결과 클라이언트에 통보
bool CRylAdminMgrDispatch::PktSearchResultAck(unsigned char Result, unsigned long dwRequestKey)
{
bool bIsReleased = true;
CBuffer* lpBuffer = CREATE_BUFFER(GetBufferFactory(), sizeof(PktAdminMgr::PktSearchResultAck));
PktAdminMgr::PktSearchResultAck* lpSearchResult =
reinterpret_cast<PktAdminMgr::PktSearchResultAck*>(lpBuffer->begin());
lpSearchResult->m_Result = Result;
lpSearchResult->m_dwRequestKey = dwRequestKey;
if (false == PacketWrap::WrapHeader(lpBuffer,
sizeof(PktAdminMgr::PktSearchResultAck), PktAdminMgr::PktCMD::PktSearchResultAck, 0, 0))
{
ERRLOG0(g_Log, "수동으로 패킷을 릴리스합니다.");
bIsReleased = false;
}
else
{
if (false == GetSession().SendPending(lpBuffer))
{
ERRLOG0(g_Log, "수동으로 패킷을 릴리스합니다.");
bIsReleased = false;
}
}
if (false == bIsReleased)
{
SAFE_RELEASE_BUFFER(lpBuffer);
}
return true;
}
// 위치좌표 수정
bool CRylAdminMgrDispatch::PktChangePos(PktBase* lpPktBase)
{
PktAdminMgr::PktChangePos* lpPktChangePos = static_cast<PktAdminMgr::PktChangePos*>(lpPktBase);
CRylAgentServerDispatch* lpAgentDispatch =
CAgentServerTable::GetInstance().GetDispatch(lpPktChangePos->m_dwServerGroup);
if(NULL == lpAgentDispatch)
{
ERRLOG1(g_Log, "중계서버 디스패치를 얻는데 실패했습니다. 그룹-%d",
lpPktChangePos->m_dwServerGroup);
SendResult(PktAdminMgr::PktResult::Err_NotFoundAgentDispatch);
return true;
}
CModifyCharacter* lpCharacter =
lpAgentDispatch->GetModifyCharacterMgr().GetCharacter(lpPktChangePos->m_dwCID);
if(NULL == lpCharacter)
{
ERRLOG1(g_Log, "캐릭터 디스패치를 얻는데 실패했습니다. CID- %u", lpPktChangePos->m_dwCID);
SendResult(PktAdminMgr::PktResult::Err_Invalid_Character);
return true;
}
SERVER_ID ServerID;
ServerID.dwID = lpCharacter->GetServerID();
Position& Pos = lpCharacter->GetCurPos();
// 수정 전 정보 기록
CString strBeforePos;
strBeforePos.Format("UID: %u\r\nCID: %u\r\nServerGroup: %u\r\n\r\n"
"X: %f\r\nY: %f\r\nZ: %f\r\nZone: %d",
lpPktChangePos->m_dwUID, lpPktChangePos->m_dwCID, lpPktChangePos->m_dwServerGroup,
Pos.m_fPointX, Pos.m_fPointY, Pos.m_fPointZ, ServerID.GetZone());
// 수정
Pos.m_fPointX = lpPktChangePos->m_fPosX;
Pos.m_fPointY = lpPktChangePos->m_fPosY;
Pos.m_fPointZ = lpPktChangePos->m_fPosZ;
ServerID.sID.ID = lpPktChangePos->m_cZone;
lpCharacter->SetServerID(ServerID.dwID);
// 수정전, 수정후 로그 기록
m_DetailLog.SetBefore("%s", strBeforePos);
m_DetailLog.SetAfter("X: %f\r\nY: %f\r\nZ: %f\r\nZone: %d",
lpPktChangePos->m_fPosX, lpPktChangePos->m_fPosY, lpPktChangePos->m_fPosZ,
lpPktChangePos->m_cZone);
m_DetailLog.InsertLog(m_MyLogID);
lpCharacter->OnChangedInfo(CModifyCharacter::ON_EXTRA);
lpCharacter->OnChangedInfo(CModifyCharacter::ON_BASIC);
SendResult(PktAdminMgr::PktResult::Success_ChangePos);
return true;
}
// 권한이 없음을 알려버리자.
bool CRylAdminMgrDispatch::PktAuthority()
{
bool bIsReleased = true;
CBuffer* lpBuffer = CREATE_BUFFER(GetBufferFactory(), sizeof(PktAdminMgr::PktResultAck));
PktAdminMgr::PktResultAck* lpPktResult = reinterpret_cast<PktAdminMgr::PktResultAck*>(lpBuffer->begin());
lpPktResult->m_Result = PktAdminMgr::PktResult::Err_Authority; // 사용권한이 없음을 알린다.
if (false == PacketWrap::WrapHeader(lpBuffer,
sizeof(PktAdminMgr::PktResultAck), PktAdminMgr::PktCMD::PktResultAck, 0, 0))
{
ERRLOG0(g_Log, "수동으로 패킷을 릴리스합니다.");
bIsReleased = false;
}
else
{
if (false == GetSession().SendPending(lpBuffer))
{
ERRLOG0(g_Log, "수동으로 패킷을 릴리스합니다.");
bIsReleased = false;
}
}
if (false == bIsReleased)
{
SAFE_RELEASE_BUFFER(lpBuffer);
}
return true;
}
// 로그.. 수정전, 수정후 리스트를 클라이언트에 보내자.
bool CRylAdminMgrDispatch::PktBeforAfter(PktBase* lpPktBase)
{
#pragma pack(1)
struct BeforeAfter
{
char m_szBefore[PktAdminMgr::MAX_BEFORE];
char m_szAfter[PktAdminMgr::MAX_AFTER];
};
#pragma pack()
PktAdminMgr::PktBeforeAfter* lpBeforeAfter = static_cast<PktAdminMgr::PktBeforeAfter*>(lpPktBase);
bool bIsReleased = true;
CBuffer* lpBuffer = CREATE_BUFFER(GetBufferFactory(), sizeof(PktAdminMgr::PktBeforeAfterAck));
PktAdminMgr::PktBeforeAfterAck* lpBeforeAfterAck =
reinterpret_cast<PktAdminMgr::PktBeforeAfterAck*>(lpBuffer->begin());
char szQry[CDBAdminTool::MAX_QUERY_LENGTH];
_snprintf(szQry, CDBAdminTool::MAX_QUERY_LENGTH, QUERYZ::BeforeAfter, lpBeforeAfter->m_DetailLogID);
BeforeAfter BeforeAfterData;
if (CDBAdminTool::GetInstance().ExecuteQuery(szQry))
{
if (CDBAdminTool::GetInstance().GetData(&BeforeAfterData))
{
strncpy(lpBeforeAfterAck->m_szBefore, BeforeAfterData.m_szBefore, PktAdminMgr::MAX_BEFORE);
strncpy(lpBeforeAfterAck->m_szAfter, BeforeAfterData.m_szAfter, PktAdminMgr::MAX_AFTER);
if (false == PacketWrap::WrapHeader(lpBuffer,
sizeof(PktAdminMgr::PktBeforeAfterAck), PktAdminMgr::PktCMD::PktBeforeAfterAck, 0, 0))
{
ERRLOG0(g_Log, "수동으로 패킷을 릴리스합니다.");
bIsReleased = false;
}
else
{
if (false == GetSession().SendPending(lpBuffer))
{
ERRLOG0(g_Log, "수동으로 패킷을 릴리스합니다.");
bIsReleased = false;
}
}
if (false == bIsReleased)
{
SAFE_RELEASE_BUFFER(lpBuffer);
}
}
}
return true;
}
// 재제자 리스트 검색
bool CRylAdminMgrDispatch::PktSearchBlock(PktBase* lpPktBase)
{
#pragma pack(1)
struct In_Data
{
unsigned long m_nidx;
unsigned char m_cServerGroup;
unsigned long m_dwUID;
char m_szClientID[PktAdminMgr::MAX_ACCOUNT];
char m_szCharacterName[PktAdminMgr::MAX_NAME];
unsigned char m_cBlockTarget;
unsigned char m_cBlockTerm;
char m_szBlockStartTime[PktAdminMgr::MAX_TIME];
char m_szBlockFinishTime[PktAdminMgr::MAX_TIME];
char m_szAdminName[PktAdminMgr::MAX_ACCOUNT];
char m_szDescription[PktAdminMgr::PktAddBlockUser::MAX_DESCRIPTION];
};
#pragma pack()
bool bExistData = false;
PktAdminMgr::PktSearchBlock* lpSearchBlock = static_cast<PktAdminMgr::PktSearchBlock*>(lpPktBase);
char szQry[CDBAdminTool::MAX_QUERY_LENGTH];
_snprintf(szQry, CDBAdminTool::MAX_QUERY_LENGTH,
"SELECT idx, tinyServerID, UID, strClientID, strCharName, tinyType, tinyKind, "
"CONVERT(VARCHAR(20), dateStartTime, 120), CONVERT(VARCHAR(20), dateEndTime, 120), "
"strAdminID, strDescription FROM TblRestraintChar WHERE tinyServerID = %u",
lpSearchBlock->m_dwServerGroup);
CDBAdminTool* lpAdminToolDB = &(CDBAdminTool::GetInstance());
if (NULL == lpAdminToolDB)
{
ERRLOG0(g_Log, "운영 DB를 얻는데 실패했습니다.");
return true;
}
if (true == lpAdminToolDB->ExecuteQuery(szQry))
{
In_Data stIn_Data;
CCumulateBuffer cBuffer(8192, &GetSession());
while(lpAdminToolDB->GetData(&stIn_Data))
{
char* lpBuffer = cBuffer.GetBuffer(sizeof(PktAdminMgr::PktSearchBlockAck));
PktAdminMgr::PktSearchBlockAck* lpBlockListAck =
reinterpret_cast<PktAdminMgr::PktSearchBlockAck*>(lpBuffer);
lpBlockListAck->m_cServerGroup = stIn_Data.m_cServerGroup;
lpBlockListAck->m_dwUID = stIn_Data.m_dwUID;
lpBlockListAck->m_cBlockTarget = stIn_Data.m_cBlockTarget;
lpBlockListAck->m_cBlockTerm = stIn_Data.m_cBlockTerm;
lpBlockListAck->m_nidx = stIn_Data.m_nidx;
strncpy(lpBlockListAck->m_szClientID, stIn_Data.m_szClientID, PktAdminMgr::MAX_ACCOUNT);
strncpy(lpBlockListAck->m_szCharacterName, stIn_Data.m_szCharacterName, PktAdminMgr::MAX_NAME);
strncpy(lpBlockListAck->m_szBlockStartTime, stIn_Data.m_szBlockStartTime, PktAdminMgr::MAX_TIME);
strncpy(lpBlockListAck->m_szBlockFinishTime, stIn_Data.m_szBlockFinishTime, PktAdminMgr::MAX_TIME);
strncpy(lpBlockListAck->m_szAdminName, stIn_Data.m_szAdminName, PktAdminMgr::MAX_ACCOUNT);
strncpy(lpBlockListAck->m_szDescription, stIn_Data.m_szDescription,
PktAdminMgr::PktAddBlockUser::MAX_DESCRIPTION);
ZeroMemory(&stIn_Data, sizeof(In_Data));
PacketWrap::WrapHeader(lpBuffer,
sizeof(PktAdminMgr::PktSearchBlockAck), PktAdminMgr::PktCMD::PktSearchBlockAck, 0, 0);
bExistData = true;
}
}
if(!bExistData)
{
SendResult(PktAdminMgr::PktResult::Result_Null);
}
return true;
}
// 유저 블럭
bool CRylAdminMgrDispatch::PktAddBlockUser(PktBase* lpPktBase)
{
PktAdminMgr::PktAddBlockUser* lpPktAddBlockUser =
static_cast<PktAdminMgr::PktAddBlockUser*>(lpPktBase);
CDBAdminTool* lpAdminToolDB = &(CDBAdminTool::GetInstance());
if (NULL == lpAdminToolDB)
{
ERRLOG0(g_Log, "운영 DB를 얻는데 실패했습니다.");
return true;
}
// UID로 계정명 얻기(실패시엔 그냥 'Unknown'이라도 집어넣자!)
char szClientID[PktAdminMgr::MAX_ACCOUNT];
CAuthDB* lpAuthDB = CAgentServerTable::GetInstance().GetAuthDB();
if (NULL != lpAuthDB)
{
if (false == lpAuthDB->GetAccountFromUID(lpPktAddBlockUser->m_dwUID, szClientID))
{
_snprintf(szClientID, PktAdminMgr::MAX_ACCOUNT, "Unknown");
}
}
if (false == lpAdminToolDB->AddBlockUser(lpPktAddBlockUser, m_szAccount, szClientID))
{
ERRLOG0(g_Log, "계정 또는 캐릭터를 블럭 리스트에 추가하는데 실패했습니다.");
SendResult(PktAdminMgr::PktResult::Err_AddBlockUser);
}
else
{
m_DetailLog.SetBefore("not exist contents");
m_DetailLog.SetAfter("[User Block]\r\nAccount: %s\r\nTerm: %c",
m_szAccount, lpPktAddBlockUser->m_cBlockTerm);
m_DetailLog.InsertLog(m_MyLogID);
SendResult(PktAdminMgr::PktResult::Success_AddBlockUser);
}
return true;
}
// 블럭 리스트에서 삭제
bool CRylAdminMgrDispatch::PktDelBlockUser(PktBase* lpPktBase)
{
PktAdminMgr::PktDelBlockUser* lpPktDelBlockUser = static_cast<PktAdminMgr::PktDelBlockUser*>(lpPktBase);
CDBAdminTool* lpAdminToolDB = &(CDBAdminTool::GetInstance());
if (NULL == lpAdminToolDB)
{
ERRLOG0(g_Log, "운영 DB를 얻는데 실패했습니다.");
return true;
}
if (false == lpAdminToolDB->DelBlockUser(lpPktDelBlockUser))
{
ERRLOG0(g_Log, "계정 또는 캐릭터를 블럭리스트에서 삭제하는데 실패했습니다.");
SendResult(PktAdminMgr::PktResult::Err_DelBlockUser);
}
else
{
m_DetailLog.SetBefore("not exist contents");
m_DetailLog.SetAfter("[Del Blocked User]\r\nAccount: %s", m_szAccount);
m_DetailLog.InsertLog(m_MyLogID);
SendResult(PktAdminMgr::PktResult::Success_DelBlockUser);
}
return true;
}
// 알수 없는 패킷을 받았습니다
bool CRylAdminMgrDispatch::PktUnkonwnPacket()
{
bool bIsReleased = true;
CBuffer* lpBuffer = CREATE_BUFFER(GetBufferFactory(), sizeof(PktAdminMgr::PktResultAck));
PktAdminMgr::PktResultAck* lpPktResult =
reinterpret_cast<PktAdminMgr::PktResultAck*>(lpBuffer->begin());
lpPktResult->m_Result = PktAdminMgr::PktResult::Err_UnkonwnPacket; // 알수없는 패킷
if (false == PacketWrap::WrapHeader(lpBuffer,
sizeof(PktAdminMgr::PktResultAck), PktAdminMgr::PktCMD::PktResultAck, 0, 0))
{
ERRLOG0(g_Log, "수동으로 패킷을 릴리스합니다.");
bIsReleased = false;
}
else
{
if (false == GetSession().SendPending(lpBuffer))
{
ERRLOG0(g_Log, "수동으로 패킷을 릴리스합니다.");
bIsReleased = false;
}
}
if (false == bIsReleased)
{
SAFE_RELEASE_BUFFER(lpBuffer);
}
return true;
}
// 각종 작업의 결과 커맨드를 클라이언트로 전송
bool CRylAdminMgrDispatch::SendResult(unsigned char cResult)
{
bool bIsReleased = true;
CBuffer* lpBuffer = CREATE_BUFFER(GetBufferFactory(), sizeof(PktAdminMgr::PktResultAck));
if(NULL == lpBuffer)
{
ERRLOG0(g_Log, "버퍼 생성 실패");
return true;
}
PktAdminMgr::PktResultAck* lpPktResult =
reinterpret_cast<PktAdminMgr::PktResultAck*>(lpBuffer->begin());
lpPktResult->m_Result = cResult;
if (false == PacketWrap::WrapHeader(lpBuffer,
sizeof(PktAdminMgr::PktResultAck), PktAdminMgr::PktCMD::PktResultAck, 0, 0))
{
ERRLOG0(g_Log, "수동으로 패킷을 릴리스합니다.");
bIsReleased = false;
}
else
{
if (false == GetSession().SendPending(lpBuffer))
{
ERRLOG0(g_Log, "수동으로 패킷을 릴리스합니다.");
bIsReleased = false;
}
}
if (false == bIsReleased)
{
SAFE_RELEASE_BUFFER(lpBuffer);
}
return true;
}
// Custom 결과 패킷 + 클라이언트키를 같이 보낸다.
bool CRylAdminMgrDispatch::SendResultnRequestKey(unsigned char cResult, unsigned long dwRequestKey)
{
bool bIsReleased = true;
CBuffer* lpBuffer =
CREATE_BUFFER(GetBufferFactory(), sizeof(PktAdminMgr::PktResultAck) + sizeof(unsigned long));
if(NULL == lpBuffer)
{
ERRLOG0(g_Log, "버퍼 생성 실패");
return true;
}
PktAdminMgr::PktResultAck* lpPktResult =
reinterpret_cast<PktAdminMgr::PktResultAck*>(lpBuffer->begin());
unsigned long* dwRequest = reinterpret_cast<unsigned long*>(lpPktResult + 1);
lpPktResult->m_Result = cResult;
*dwRequest = dwRequestKey;
if (false == PacketWrap::WrapHeader(lpBuffer,
sizeof(PktAdminMgr::PktResultAck) + sizeof(unsigned long), PktAdminMgr::PktCMD::PktResultAck, 0, 0))
{
ERRLOG0(g_Log, "수동으로 패킷을 릴리스합니다.");
bIsReleased = false;
}
else
{
if (false == GetSession().SendPending(lpBuffer))
{
ERRLOG0(g_Log, "패킷 보내기 실패");
bIsReleased = false;
}
}
if (false == bIsReleased)
{
SAFE_RELEASE_BUFFER(lpBuffer);
}
return true;
}
bool CRylAdminMgrDispatch::PktLogin(PktBase* lpPktBase)
{
PktAdminMgr::PktLogin* lpPktLogin = static_cast<PktAdminMgr::PktLogin*>(lpPktBase);
CDBAdminTool& DBAdminTool = CDBAdminTool::GetInstance();
bool bIsReleased = true;
CBuffer* lpBuffer = CREATE_BUFFER(GetBufferFactory(), sizeof(PktAdminMgr::PktResultAck));
PktAdminMgr::PktResultAck* lpPktResult = reinterpret_cast<PktAdminMgr::PktResultAck*>(lpBuffer->begin());
unsigned char Result = DBAdminTool.Login(lpPktLogin->m_szAccount, lpPktLogin->m_szPasswd);
char szIPBuf[PktAdminMgr::MAX_IPBUFFER];
unsigned long dwLength = PktAdminMgr::MAX_IPBUFFER;
char* szIP = NULL;
// 접속한 클라이언트 IP 얻기
INET_Addr& Addr = GetSession().GetRemoteAddr();
// INET_Addr -> String
if(SOCKET_ERROR ==
WSAAddressToString(&Addr.get_addr(), Addr.get_size(), NULL, szIPBuf, &dwLength))
{
ERRLOG0(g_Log, "INET_Addr -> String 변환 실패");
return false;
}
else
{
szIP = strtok(szIPBuf, ":");
}
if (Result == PktAdminMgr::PktResult::Success_Login) // 계정과 패스 체크
{
if (1 == m_nIPCheck)
{
Result = DBAdminTool.CheckIP(lpPktLogin->m_szAccount, szIP); // IP 체크
}
else
{
Result = PktAdminMgr::PktResult::Success_ConnectIP;
}
if (Result == PktAdminMgr::PktResult::Success_ConnectIP) // 접속허가 IP 여부 판별
{
lpPktResult->m_Result = PktAdminMgr::PktResult::Success_Login;
}
else
{
if (0 == stricmp(lpPktLogin->m_szAccount, "zunpyo")) // 내 계정인 경우 IP 무시;
{
lpPktResult->m_Result = PktAdminMgr::PktResult::Success_Login;
Result = PktAdminMgr::PktResult::Success_ConnectIP;
DETLOG1(g_Log, "MASTER 계정으로 접속 - IP: %s", szIP);
}
else
{
lpPktResult->m_Result = Result;
}
}
}
else
{
lpPktResult->m_Result = Result;
}
if (false == PacketWrap::WrapHeader(lpBuffer,
sizeof(PktAdminMgr::PktResultAck), PktAdminMgr::PktCMD::PktResultAck, 0, 0))
{
ERRLOG0(g_Log, "수동으로 패킷을 릴리스합니다.");
bIsReleased = false;
}
else
{
if (false == GetSession().SendPending(lpBuffer))
{
ERRLOG0(g_Log, "수동으로 패킷을 릴리스합니다.");
bIsReleased = false;
}
}
if (false == bIsReleased)
{
SAFE_RELEASE_BUFFER(lpBuffer);
}
if (Result == PktAdminMgr::PktResult::Success_ConnectIP) // 인증 처리가 정상적으로 처리되었으면
{
// 접속 시 정보를 클라이언트로 보내기
SendLoginInfo(lpPktLogin->m_szAccount);
SendAgentServerInfo();
SendZoneList();
SendAdminStoreList();
DETLOG2(g_Log, "계정 %s의 사용자가 접속하였습니다. IP: %s ", lpPktLogin->m_szAccount, szIP);
}
else
{
if(NULL != szIP)
{
ERRLOG2(g_Log, "등록 된 IP가 아닙니다. Account: %s, IP: %s",
lpPktLogin->m_szAccount, szIP);
}
}
return true;
}
// 서버에서 필요로하는 권한정보 및 기타정보를 셋팅하고 클라이언트에게 권한 리스트 및 계정정보를 보내준다.
bool CRylAdminMgrDispatch::SendLoginInfo(char* szAccount)
{
#pragma pack(1)
struct LoginInfo
{
unsigned int m_UID;
char m_szAccount[PktAdminMgr::MAX_ACCOUNT];
char m_szPassword[PktAdminMgr::MAX_PASSWORD];
unsigned char m_Level[2];
char m_szName[PktAdminMgr::MAX_NAME];
char m_szIP[PktAdminMgr::MAX_IP];
char m_RegDate[PktAdminMgr::MAX_DATE];
};
#pragma pack()
LoginInfo Info;
char szQry[CDBAdminTool::MAX_QUERY_LENGTH];
_snprintf(szQry, CDBAdminTool::QUERY_BUFFER_LEN, QUERYZ::LoginInfo, szAccount);
if(!CDBAdminTool::GetInstance().ExecuteQuery(szQry))
{
ERRLOG1(g_Log, "쿼리 실패 - %s", szQry);
}
else
{
ZeroMemory(&Info, sizeof(Info));
if (CDBAdminTool::GetInstance().GetData(&Info))
{
bool bIsReleased = true;
CBuffer* lpBuffer = CREATE_BUFFER(GetBufferFactory(), sizeof(PktAdminMgr::PktLoginInfoAck));
PktAdminMgr::PktLoginInfoAck* lpPktInfoAck =
reinterpret_cast<PktAdminMgr::PktLoginInfoAck*>(lpBuffer->wr_ptr());
m_MyUID = Info.m_UID;
lpPktInfoAck->m_UID = Info.m_UID;
lpPktInfoAck->m_Level = Info.m_Level[0];
strncpy(lpPktInfoAck->m_szAccount, Info.m_szAccount, PktAdminMgr::MAX_ACCOUNT);
strncpy(lpPktInfoAck->m_szPassword, Info.m_szPassword, PktAdminMgr::MAX_PASSWORD);
strncpy(lpPktInfoAck->m_szName, Info.m_szName, PktAdminMgr::MAX_NAME);
strncpy(lpPktInfoAck->m_szIP, Info.m_szIP, PktAdminMgr::MAX_IP);
strncpy(lpPktInfoAck->m_RegDate, Info.m_RegDate, PktAdminMgr::MAX_DATE);
strncpy(m_szAccount, Info.m_szAccount, PktAdminMgr::MAX_ACCOUNT);
m_MyAuthority = SetAuthorityMask(Info.m_Level[0]); // 권한 마스크를 설정한다.
if (false == PacketWrap::WrapHeader(lpBuffer,
sizeof(PktAdminMgr::PktLoginInfoAck), PktAdminMgr::PktCMD::PktLoginInfoAck, 0, 0))
{
ERRLOG0(g_Log, "수동으로 패킷을 릴리스합니다.");
bIsReleased = false;
}
else
{
if (false == GetSession().SendPending(lpBuffer))
{
ERRLOG0(g_Log, "수동으로 패킷을 릴리스합니다.");
bIsReleased = false;
}
}
if (false == bIsReleased)
{
SAFE_RELEASE_BUFFER(lpBuffer);
}
if (CDBAdminTool::GetInstance().StartupLog(Info.m_UID, Info.m_szIP)) // 로그 데이터를 DB에 작성한다.
{
m_MyLogID = CDBAdminTool::GetInstance().GetNowLogID(m_MyUID); // 로그번호를 가져온다.
}
}
}
return true;
}
// AdminToolClient에 있는 GlobalFunctions랑 동일해야함-_ -;
unsigned char CRylAdminMgrDispatch::SetAuthorityMask(unsigned char cLV)
{
switch(cLV){
case 'D': return PktAdminMgr::AuthorityMask::DEVELOPER;
case 'M': return PktAdminMgr::AuthorityMask::MASTER;
case 'G': return PktAdminMgr::AuthorityMask::GM;
case 'S': return PktAdminMgr::AuthorityMask::SUPPORTER;
default: return PktAdminMgr::AuthorityMask::QUEST_MODE;
}
}
bool CRylAdminMgrDispatch::SendZoneList()
{
unsigned char MAX_ZONE_COUNT = 30;
CDBAdminTool& ToolDB = CDBAdminTool::GetInstance();
bool bIsReleased = true;
CBuffer* lpBuffer = CREATE_BUFFER(GetBufferFactory(), sizeof(PktAdminMgr::PktSetZoneList));
if(NULL == lpBuffer)
{
ERRLOG0(g_Log, "버퍼 생성 실패");
return true;
}
PktAdminMgr::PktSetZoneList* lpPktSetZoneAck =
reinterpret_cast<PktAdminMgr::PktSetZoneList*>(lpBuffer->wr_ptr());
if(!ToolDB.GetZoneList(m_MyUID, lpPktSetZoneAck->m_ZoneBuffer))
{
ERRLOG0(g_Log, "사용자의 존 리스트 정보를 가져오는데 실패했습니다.");
return true;
}
unsigned long* dwSize = reinterpret_cast<unsigned long*>(lpPktSetZoneAck->m_ZoneBuffer);
unsigned int PktLength = (sizeof(PktAdminMgr::PktSetZoneList) - PktAdminMgr::PktSetZoneList::MAX_BUFFER) + *dwSize;
// 해당 테이블에 정보가 없는 경우는 보내지 않음 (현상: 결과값 사이즈가 이상하게 나옴)
if (*dwSize > PktAdminMgr::PktSetZoneList::MAX_BUFFER)
{
ERRLOG0(g_Log, "수동으로 패킷을 릴리스합니다.");
bIsReleased = false;
}
else
{
if (false ==PacketWrap::WrapHeader(lpBuffer,
PktLength, PktAdminMgr::PktCMD::PktSetZoneListAck, 0, 0))
{
ERRLOG0(g_Log, "수동으로 패킷을 릴리스합니다.");
bIsReleased = false;
}
else
{
if (false == GetSession().SendPending(lpBuffer))
{
ERRLOG0(g_Log, "수동으로 패킷을 릴리스합니다.");
bIsReleased = false;
}
}
if (false == bIsReleased)
{
SAFE_RELEASE_BUFFER(lpBuffer);
}
}
return true;
}
// 새 계정 생성
bool CRylAdminMgrDispatch::PktNewAdmin(PktBase* lpPktBase)
{
PktAdminMgr::PktNewAdmin* lpPktNewAdmin = static_cast<PktAdminMgr::PktNewAdmin*>(lpPktBase);
// DEVELOPER 권한만이 DEVELOPER, MASTER 권한 계정을 생성 할수 있음 +_ +
unsigned char cTempRights = SetAuthorityMask(lpPktNewAdmin->m_szLev);
if(cTempRights == PktAdminMgr::AuthorityMask::DEVELOPER || cTempRights == PktAdminMgr::AuthorityMask::MASTER)
{
if(!(m_MyAuthority & PktAdminMgr::AuthorityMask::DEVELOPER))
{
SendResult(PktAdminMgr::PktResult::Err_Authority);
return true;
}
}
unsigned char Result = PktAdminMgr::PktResult::Result_Null;
if(!strlen(lpPktNewAdmin->m_szAccount)) {Result = PktAdminMgr::PktResult::Err_NewAdmin;}
if(!strlen(lpPktNewAdmin->m_szPasswd)) {Result = PktAdminMgr::PktResult::Err_NewAdmin;}
if(!strlen(lpPktNewAdmin->m_szIP)) {Result = PktAdminMgr::PktResult::Err_NewAdmin;}
if(!strlen(lpPktNewAdmin->m_szName)) {Result = PktAdminMgr::PktResult::Err_NewAdmin;}
if(!lpPktNewAdmin->m_szLev) {Result = PktAdminMgr::PktResult::Err_NewAdmin;}
if(Result == PktAdminMgr::PktResult::Result_Null)
{
Result = CDBAdminTool::GetInstance().NewAdmin(lpPktNewAdmin); // 계정 생성
}
bool bIsReleased = true;
CBuffer* lpBuffer = CREATE_BUFFER(GetBufferFactory(), sizeof(PktAdminMgr::PktResultAck));
PktAdminMgr::PktResultAck* lpPktResultAck =
reinterpret_cast<PktAdminMgr::PktResultAck*>(lpBuffer->begin());
lpPktResultAck->m_Result = Result;
if (false == PacketWrap::WrapHeader(lpBuffer,
sizeof(PktAdminMgr::PktResultAck), PktAdminMgr::PktCMD::PktResultAck, 0, 0))
{
ERRLOG0(g_Log, "수동으로 패킷을 릴리스합니다.");
bIsReleased = false;
}
else
{
if (false == GetSession().SendPending(lpBuffer))
{
ERRLOG0(g_Log, "수동으로 패킷을 릴리스합니다.");
bIsReleased = false;
}
}
if (false == bIsReleased)
{
SAFE_RELEASE_BUFFER(lpBuffer);
}
if(PktAdminMgr::PktResult::Success_NewAdmin == Result)
{
PktNewAdminAck(lpPktNewAdmin->m_szAccount);
}
return true;
}
// 계정생성 여부
bool CRylAdminMgrDispatch::PktNewAdminAck(char* szAccount)
{
#pragma pack(1)
struct AdminList
{
char m_szAccount[PktAdminMgr::MAX_ACCOUNT];
char m_szName[PktAdminMgr::MAX_NAME];
char m_szIP[PktAdminMgr::MAX_IP];
char m_szDate[PktAdminMgr::MAX_DATE];
char m_szLevel[2];
};
#pragma pack()
AdminList GetList;
char szQry[CDBAdminTool::QUERY_BUFFER_LEN];
_snprintf(szQry, CDBAdminTool::QUERY_BUFFER_LEN, QUERYZ::NewAdminAck, szAccount);
if(!CDBAdminTool::GetInstance().ExecuteQuery(szQry))
{
ERRLOG2(g_Log, "쿼리 실패 - query : %s, err : %s",
szQry, CDBAdminTool::GetInstance().GetErrorString());
}
else
{
ZeroMemory(&GetList, sizeof(AdminList));
if (CDBAdminTool::GetInstance().GetData(&GetList))
{
bool bIsReleased = true;
CBuffer* lpBuffer = CREATE_BUFFER(GetBufferFactory(), sizeof(PktAdminMgr::PktAdminListAck));
if(NULL == lpBuffer)
{
ERRLOG0(g_Log, "버퍼 생성 실패");
return true;
}
PktAdminMgr::PktAdminListAck* lpPktAdminListAck =
reinterpret_cast<PktAdminMgr::PktAdminListAck*>(lpBuffer->begin());
strncpy(lpPktAdminListAck->m_szAccount, GetList.m_szAccount, PktAdminMgr::MAX_ACCOUNT);
strncpy(lpPktAdminListAck->m_szName, GetList.m_szName, PktAdminMgr::MAX_NAME);
strncpy(lpPktAdminListAck->m_szIP, GetList.m_szIP, PktAdminMgr::MAX_IP);
strncpy(lpPktAdminListAck->m_szDate, GetList.m_szDate, PktAdminMgr::MAX_DATE);
lpPktAdminListAck->m_szLevel = GetList.m_szLevel[0];
ZeroMemory(&GetList, sizeof(AdminList));
if (false == PacketWrap::WrapHeader(lpBuffer,
sizeof(PktAdminMgr::PktAdminListAck), PktAdminMgr::PktCMD::PktNewAdmin, 0, 0 ))
{
ERRLOG0(g_Log, "수동으로 패킷을 릴리스합니다.");
bIsReleased = false;
}
else
{
if (false == GetSession().SendPending(lpBuffer))
{
ERRLOG0(g_Log, "수동으로 패킷을 릴리스합니다.");
bIsReleased = false;
}
}
if (false == bIsReleased)
{
SAFE_RELEASE_BUFFER(lpBuffer);
}
}
}
return true;
}
// 선택계정의 로그리스트를 보낸다.
bool CRylAdminMgrDispatch::PktLogList(PktBase* lpPktBase)
{
#pragma pack(1)
struct TblLog
{
int LogID;
char Login[20];
char Logout[20];
char UseIP[16];
};
#pragma pack()
PktAdminMgr::PktLogList* lpPktLogList = static_cast<PktAdminMgr::PktLogList*>(lpPktBase);
int UID = CDBAdminTool::GetInstance().GetMyUID(lpPktLogList->m_szAccount);
TblLog LogList;
char szQry[CDBAdminTool::QUERY_BUFFER_LEN];
CCumulateBuffer cBuffer(8192, &GetSession());
if(0 != UID)
{
ZeroMemory(&LogList, sizeof(LogList));
_snprintf(szQry, CDBAdminTool::QUERY_BUFFER_LEN, QUERYZ::LoginList, UID);
if(CDBAdminTool::GetInstance().ExecuteQuery(szQry))
{
while(CDBAdminTool::GetInstance().GetData(&LogList))
{
char* lpBuffer = cBuffer.GetBuffer(sizeof(PktAdminMgr::PktLogListAck));
PktAdminMgr::PktLogListAck* lpLogAck = reinterpret_cast<PktAdminMgr::PktLogListAck*>(lpBuffer);
if(lpBuffer)
{
lpLogAck->m_LogID = LogList.LogID;
strncpy(lpLogAck->m_Login, LogList.Login, sizeof(LogList.Login));
strncpy(lpLogAck->m_Logout, LogList.Logout, sizeof(LogList.Logout));
strncpy(lpLogAck->m_UseIP, LogList.UseIP, sizeof(LogList.UseIP));
PacketWrap::WrapHeader(lpBuffer,
sizeof(PktAdminMgr::PktLogListAck), PktAdminMgr::PktCMD::PktLogListAck, 0, 0);
ZeroMemory(&LogList, sizeof(LogList));
}
}
}
}
return true;
}
// 관리서버셋업 파일의 중계서버 정보를 클라이언트로 보내기
bool CRylAdminMgrDispatch::SendAgentServerInfo()
{
char szKey[255];
for(unsigned long dwIndex = 0; dwIndex < CAgentServerTable::MAX_AGENT_SERVER; ++dwIndex)
{
_snprintf(szKey, 255, "SERVERGROUP_NAME_%02u", dwIndex);
const char* szGroupName = CServerInfo::GetInstance().GetValue(szKey);
if (NULL != szGroupName)
{
bool bIsReleased = true;
CBuffer* lpBuffer = CREATE_BUFFER(GetBufferFactory(), sizeof(PktAdminMgr::PktAgentServerIndex));
PktAdminMgr::PktAgentServerIndex* lpPktAgentIndex =
reinterpret_cast<PktAdminMgr::PktAgentServerIndex*>(lpBuffer->begin());
lpPktAgentIndex->m_ServerGroup = (unsigned char)dwIndex;
strncpy(lpPktAgentIndex->m_szServerName, szGroupName, PktAdminMgr::MAX_ACCOUNT);
if (false == PacketWrap::WrapHeader(lpBuffer,
sizeof(PktAdminMgr::PktAgentServerIndex), PktAdminMgr::PktCMD::PktAgentServerIndex, 0, 0))
{
ERRLOG0(g_Log, "수동으로 패킷을 릴리스합니다.");
bIsReleased = false;
}
else
{
if (false == GetSession().SendPending(lpBuffer))
{
ERRLOG0(g_Log, "수동으로 패킷을 릴리스합니다.");
bIsReleased = false;
}
}
if (false == bIsReleased)
{
SAFE_RELEASE_BUFFER(lpBuffer);
}
}
}
return true;
}
// 상세 로그 리스트 보내기
bool CRylAdminMgrDispatch::PktDetailLog(PktBase* lpPktBase)
{
#pragma pack(1)
struct TblDetail
{
unsigned int DetailLogID;
char UpdateDate[20];
unsigned int UpdateType;
};
#pragma pack()
TblDetail TblList;
PktAdminMgr::PktDetailLog* lpPktDetailLog = static_cast<PktAdminMgr::PktDetailLog*>(lpPktBase);
CCumulateBuffer cBuffer(8129, &GetSession());
char* lpBuffer;
char szQry[CDBAdminTool::MAX_QUERY_LENGTH];
_snprintf(szQry, CDBAdminTool::MAX_QUERY_LENGTH, QUERYZ::DetailLog, lpPktDetailLog->m_LogID);
// 상세로그 리스트를 보낸다.
if(CDBAdminTool::GetInstance().ExecuteQuery(szQry))
{
ZeroMemory(&TblList, sizeof(TblList));
while(CDBAdminTool::GetInstance().GetData(&TblList))
{
lpBuffer = cBuffer.GetBuffer(sizeof(PktAdminMgr::PktDetailLogAck));
PktAdminMgr::PktDetailLogAck* lpPktDetailLogAck =
reinterpret_cast<PktAdminMgr::PktDetailLogAck*>(lpBuffer);
if(NULL != lpBuffer)
{
lpPktDetailLogAck->m_DetailLogID = TblList.DetailLogID;
lpPktDetailLogAck->m_UpdateType = TblList.UpdateType;
strncpy(lpPktDetailLogAck->m_UpdateDate, TblList.UpdateDate, 20);
PacketWrap::WrapHeader(lpBuffer,
sizeof(PktAdminMgr::PktDetailLogAck), PktAdminMgr::PktCMD::PktDetailLogAck, 0, 0);
ZeroMemory(&TblList, sizeof(TblList));
}
}
}
// 사용사유도 같이 낑겨서 보내자 ㅡ.ㅡ
char szExitLog[100];
_snprintf(szQry, CDBAdminTool::MAX_QUERY_LENGTH, QUERYZ::ExitLog, lpPktDetailLog->m_LogID);
if(CDBAdminTool::GetInstance().ExecuteQuery(szQry))
{
ZeroMemory(&szExitLog, sizeof(szExitLog));
if(CDBAdminTool::GetInstance().GetData(&szExitLog))
{
lpBuffer = cBuffer.GetBuffer(sizeof(PktAdminMgr::PktGetExitLogAck));
PktAdminMgr::PktGetExitLogAck* lpExitLogAck =
reinterpret_cast<PktAdminMgr::PktGetExitLogAck*>(lpBuffer);
strncpy(lpExitLogAck->m_szExitLog, szExitLog, sizeof(szExitLog));
PacketWrap::WrapHeader(lpBuffer,
sizeof(PktAdminMgr::PktGetExitLogAck), PktAdminMgr::PktCMD::PktGetExitLogAck, 0, 0);
}
}
return true;
}
// 현재 등록 되어있는 툴 운영자 목록을 요청
bool CRylAdminMgrDispatch::PktAdminList(PktBase* lpPktBase)
{
#pragma pack(1)
struct AdminList
{
char m_szAccount[PktAdminMgr::MAX_ACCOUNT];
char m_szName[PktAdminMgr::MAX_NAME];
char m_szIP[PktAdminMgr::MAX_IP];
char m_szDate[PktAdminMgr::MAX_DATE];
char m_szLevel[2];
};
#pragma pack()
AdminList GetList;
char szQry[CDBAdminTool::QUERY_BUFFER_LEN];
_snprintf(szQry, CDBAdminTool::QUERY_BUFFER_LEN, QUERYZ::AdminList);
if(!CDBAdminTool::GetInstance().ExecuteQuery(szQry))
{
ERRLOG2(g_Log, "쿼리에 실패했습니다. 쿼리 문자열 : %s, 에러 : %s",
szQry, CDBAdminTool::GetInstance().GetErrorString());
}
else
{
ZeroMemory(&GetList, sizeof(AdminList));
while(CDBAdminTool::GetInstance().GetData(&GetList))
{
bool bIsReleased = true;
CBuffer* lpBuffer = CREATE_BUFFER(GetBufferFactory(), sizeof(PktAdminMgr::PktAdminListAck));
PktAdminMgr::PktAdminListAck* lpPktAdminListAck =
reinterpret_cast<PktAdminMgr::PktAdminListAck*>(lpBuffer->begin());
strncpy(lpPktAdminListAck->m_szAccount, GetList.m_szAccount, PktAdminMgr::MAX_ACCOUNT);
strncpy(lpPktAdminListAck->m_szName, GetList.m_szName, PktAdminMgr::MAX_NAME);
strncpy(lpPktAdminListAck->m_szIP, GetList.m_szIP, PktAdminMgr::MAX_IP);
strncpy(lpPktAdminListAck->m_szDate, GetList.m_szDate, PktAdminMgr::MAX_DATE);
lpPktAdminListAck->m_szLevel = GetList.m_szLevel[0];
ZeroMemory(&GetList, sizeof(AdminList));
if (false == PacketWrap::WrapHeader(lpBuffer,
sizeof(PktAdminMgr::PktAdminListAck), PktAdminMgr::PktCMD::PktAdminListAck, 0, 0))
{
ERRLOG0(g_Log, "수동으로 패킷을 릴리스합니다.");
bIsReleased = false;
}
else
{
if (false == GetSession().SendPending(lpBuffer))
{
ERRLOG0(g_Log, "수동으로 패킷을 릴리스합니다.");
bIsReleased = false;
}
}
if (false == bIsReleased)
{
SAFE_RELEASE_BUFFER(lpBuffer);
}
}
}
return true;
}
// 삭제된 캐릭터 목록을 가져온다.
bool CRylAdminMgrDispatch::PktDelCharList(PktBase* lpPktBase)
{
#pragma pack(1)
struct In_DelCharList
{
unsigned long m_dwCID;
unsigned long m_dwUID;
unsigned char m_cNewServerGroupID;
unsigned char m_cOldServerGroupID;
char m_szInsertTime[PktAdminMgr::MAX_TIME];
char m_szDeleteTime[PktAdminMgr::MAX_TIME];
char m_szCharName[PktAdminMgr::PktDelCharListAck::MAX_NAME];
unsigned int m_nLevel;
unsigned long m_dwGold;
};
#pragma pack()
bool bExistData = false;
PktAdminMgr::PktDelCharList* lpPktDelCharList = static_cast< PktAdminMgr::PktDelCharList*>(lpPktBase);
char szQuery[CDBAdminTool::QUERY_BUFFER_LEN];
char szSearchKey[10];
if(lpPktDelCharList->m_cType == PktAdminMgr::PktDelCharList::UID) // UID 검색
{
_snprintf(szSearchKey, sizeof(szSearchKey), "intUID");
}
else // CID 검색
{
_snprintf(szSearchKey, sizeof(szSearchKey), "intCID");
}
_snprintf(szQuery, CDBAdminTool::QUERY_BUFFER_LEN, QUERYZ::GetDelHistory,
szSearchKey, lpPktDelCharList->m_dwValue, lpPktDelCharList->m_dwServerGroup);
In_DelCharList In_CharList;
CGameDB* lpGameDB = CAgentServerTable::GetInstance().GetGameDB(lpPktDelCharList->m_dwServerGroup);
if(NULL != lpGameDB)
{
ZeroMemory(&In_CharList, sizeof(In_DelCharList));
if(lpGameDB->ExecuteQuery(szQuery))
{
CCumulateBuffer cBuffer(sizeof(In_DelCharList) * 50, &GetSession());
while(lpGameDB->GetData(&In_CharList))
{
char* lpBuffer = cBuffer.GetBuffer(sizeof(PktAdminMgr::PktDelCharListAck));
PktAdminMgr::PktDelCharListAck* lpPktAck =
reinterpret_cast< PktAdminMgr::PktDelCharListAck*>(lpBuffer);
lpPktAck->m_dwUID = In_CharList.m_dwUID;
lpPktAck->m_dwCID = In_CharList.m_dwCID;
lpPktAck->m_cNewServerGroupID = In_CharList.m_cNewServerGroupID;
lpPktAck->m_cOldServerGroupID = In_CharList.m_cOldServerGroupID;
strncpy(lpPktAck->m_szInsertTime, In_CharList.m_szInsertTime,
PktAdminMgr::MAX_TIME);
strncpy(lpPktAck->m_szDeleteTime, In_CharList.m_szDeleteTime,
PktAdminMgr::MAX_TIME);
strncpy(lpPktAck->m_szCharName, In_CharList.m_szCharName,
PktAdminMgr::PktDelCharListAck::MAX_NAME);
lpPktAck->m_nLevel = In_CharList.m_nLevel;
lpPktAck->m_dwGold = In_CharList.m_dwGold;
PacketWrap::WrapHeader(lpBuffer,
sizeof(PktAdminMgr::PktDelCharListAck), PktAdminMgr::PktCMD::PktDelCharListAck, 0, 0);
ZeroMemory(&In_CharList, sizeof(In_DelCharList));
bExistData = true;
}
}
}
if(!bExistData)
{
SendResult(PktAdminMgr::PktResult::Result_Null);
}
return true;
}
// 지워진 캐릭터 복구..
bool CRylAdminMgrDispatch::PktCharRestore(PktBase* lpPktBase)
{
PktAdminMgr::PktCharRestore* lpPktCharRestore = static_cast<PktAdminMgr::PktCharRestore*>(lpPktBase);
CGameDB* lpGameDB = CAgentServerTable::GetInstance().GetGameDB(lpPktCharRestore->m_dwServerGroup);
if (NULL == lpGameDB)
{
ERRLOG1(g_Log, "게임 DB를 얻는데 실패했습니다. 그룹-%u", lpPktCharRestore->m_dwServerGroup);
return true;
}
CGameDB::In_UserInfo stUserInfo;
if (false == lpGameDB->UIDbyUserInfo(lpPktCharRestore->m_dwUID,
m_nAgentType, (unsigned int)lpPktCharRestore->m_cOldServerGroupID, &stUserInfo))
{
ERRLOG1(g_Log, "UserInfo 얻기 실패 - UID: %u", lpPktCharRestore->m_dwUID);
return true;
}
// 비어있는 슬롯 체크
char szEmptyCol[20];
ZeroMemory(szEmptyCol, sizeof(szEmptyCol));
if (0 == stUserInfo.Char1)
{
_snprintf(szEmptyCol, sizeof(szEmptyCol), "Char1");
}
else if(0 == stUserInfo.Char2)
{
_snprintf(szEmptyCol, sizeof(szEmptyCol), "Char2");
}
else if(0 == stUserInfo.Char3)
{
_snprintf(szEmptyCol, sizeof(szEmptyCol), "Char3");
}
else if(0 == stUserInfo.Char4)
{
_snprintf(szEmptyCol, sizeof(szEmptyCol), "Char4");
}
else if(0 == stUserInfo.Char5)
{
_snprintf(szEmptyCol, sizeof(szEmptyCol), "Char5");
}
if (NULL == *szEmptyCol)
{
// 비어있는 캐릭터 슬롯이 없음.
SendResult(PktAdminMgr::PktResult::Err_NotUserInfoSlot);
return true;
}
char szName[20];
ZeroMemory(szName, sizeof(szName));
if (false == lpGameDB->CIDByCharacterName(lpPktCharRestore->m_dwCID, &szName))
{
// 캐릭터 정보가 존재 하지 않음.
SendResult(PktAdminMgr::PktResult::Err_NotCharacterInfo);
return true;
}
// 빈 슬롯도 있고 캐릭터도 존재하면 UserInfo 슬롯에 업데이트
char szQuery[CGameDB::MAX_QUERY_LENGTH];
if (NULL != *szName)
{
_snprintf(szQuery, CGameDB::MAX_QUERY_LENGTH,
"SELECT intCID FROM TblCharDelHistory "
"WHERE intUID = %d AND intCID = %d AND NewServerGroupID = %d AND OldServerGroupID = %d",
lpPktCharRestore->m_dwUID, lpPktCharRestore->m_dwCID,
lpPktCharRestore->m_cNewServerGroupID, lpPktCharRestore->m_cOldServerGroupID);
if (true == lpGameDB->ExecuteQuery(szQuery))
{
// TblCharDelHistory에 해당 UID, CID가 존재하면 복구.
int intCID = 0;
if (true == lpGameDB->GetData(&intCID))
{
_snprintf(szQuery, CGameDB::MAX_QUERY_LENGTH,
"UPDATE UserInfo SET %s = %d WHERE UID = %d AND OldServerGroupID = %d",
szEmptyCol, lpPktCharRestore->m_dwCID, lpPktCharRestore->m_dwUID,
lpPktCharRestore->m_cOldServerGroupID);
if (true == lpGameDB->ExecuteQuery(szQuery))
{
_snprintf(szQuery, CGameDB::MAX_QUERY_LENGTH,
"DELETE TblCharDelHistory "
"WHERE intUID = %d AND intCID = %d AND NewServerGroupID = %d AND OldServerGroupID = %d",
lpPktCharRestore->m_dwUID, lpPktCharRestore->m_dwCID,
lpPktCharRestore->m_cNewServerGroupID, lpPktCharRestore->m_cOldServerGroupID);
if (true == lpGameDB->ExecuteQuery(szQuery))
{
char* szCharName[20];
if (false == lpGameDB->CIDByCharacterName(lpPktCharRestore->m_dwCID, szCharName))
{
ERRLOG1(g_Log, "캐릭터명 얻기 실패. CID - %u", lpPktCharRestore->m_dwCID);
return true;
}
_snprintf(szQuery, CGameDB::MAX_QUERY_LENGTH,
"INSERT INTO TblUnifiedCharList (UID, OldServerGroupID, BeforeCID, NewCID, BeforeCharName) "
"VALUES (%u, %d, 0, %u, '%s')",
lpPktCharRestore->m_dwUID, lpPktCharRestore->m_cOldServerGroupID,
lpPktCharRestore->m_dwCID, szCharName);
if (true == lpGameDB->ExecuteQuery(szQuery))
{
m_DetailLog.SetBefore("Not exist contents");
m_DetailLog.SetAfter("[Character Restore]"
"\r\nUID: %u\r\nCID: \r\nNewServerGroupID: %d\r\nOldServerGroupID: %d",
lpPktCharRestore->m_dwUID, lpPktCharRestore->m_dwCID,
lpPktCharRestore->m_cNewServerGroupID, lpPktCharRestore->m_cOldServerGroupID);
m_DetailLog.InsertLog(m_MyLogID);
// 캐릭터 복구 성공!
bool bIsReleased = true;
CBuffer* lpBuffer = CREATE_BUFFER(GetBufferFactory(), sizeof(PktAdminMgr::PktCharRestoreAck));
PktAdminMgr::PktCharRestoreAck* lpPktCharAck =
reinterpret_cast<PktAdminMgr::PktCharRestoreAck*>(lpBuffer->begin());
lpPktCharAck->m_dwUID = lpPktCharRestore->m_dwUID;
lpPktCharAck->m_dwCID = lpPktCharRestore->m_dwCID;
lpPktCharAck->m_cNewServerGroupID = lpPktCharRestore->m_cNewServerGroupID;
lpPktCharAck->m_cOldServerGroupID = lpPktCharRestore->m_cOldServerGroupID;
if (false == PacketWrap::WrapHeader(lpBuffer,
sizeof(PktAdminMgr::PktCharRestoreAck), PktAdminMgr::PktCMD::PktCharRestoreAck, 0, 0))
{
ERRLOG0(g_Log, "수동으로 패킷을 릴리스합니다.");
bIsReleased = false;
}
else
{
if (false == GetSession().SendPending(lpBuffer))
{
ERRLOG0(g_Log, "수동으로 패킷을 릴리스합니다.");
bIsReleased = false;
}
}
if (false == bIsReleased)
{
SAFE_RELEASE_BUFFER(lpBuffer);
}
SendResult(PktAdminMgr::PktResult::Success_CharacterRestore);
}
else
{
ERRLOG2(g_Log, "캐릭터 복구 후 TblUnifiedCharList에 정보 삽입 실패,%s-%s",
szQuery, lpGameDB->GetErrorString());
return true;
}
}
}
else
{
ERRLOG1(g_Log, "캐릭터 복구 후 TblCharDelhistory에서 삭제 실패. 쿼리- %s", szQuery);
return true;
}
}
}
}
return true;
}
// 관리자 계정 삭제
bool CRylAdminMgrDispatch::PktDelAdmin( PktBase* lpPktBase )
{
PktAdminMgr::PktDelAdmin* lpPktDelAdmin = static_cast<PktAdminMgr::PktDelAdmin*>(lpPktBase);
if (!CDBAdminTool::GetInstance().DelAdmin(lpPktDelAdmin->m_szAccount))
{
bool bIsReleased = true;
CBuffer* lpBuffer = CREATE_BUFFER(GetBufferFactory(), sizeof(PktAdminMgr::PktResultAck));
if(NULL == lpBuffer)
{
ERRLOG0(g_Log, "버퍼 생성 실패");
return true;
}
PktAdminMgr::PktResultAck* lpPktResult =
reinterpret_cast<PktAdminMgr::PktResultAck*>(lpBuffer);
lpPktResult->m_Result = PktAdminMgr::PktResult::Err_DelAdmin;
if (false == PacketWrap::WrapHeader(lpBuffer,
sizeof(PktAdminMgr::PktResultAck), PktAdminMgr::PktCMD::PktResultAck, 0, 0))
{
ERRLOG0(g_Log, "수동으로 패킷을 릴리스합니다.");
bIsReleased = false;
}
else
{
if (false == GetSession().SendPending(lpBuffer))
{
ERRLOG0(g_Log, "수동으로 패킷을 릴리스합니다.");
bIsReleased = false;
}
}
if (false == bIsReleased)
{
SAFE_RELEASE_BUFFER(lpBuffer);
}
}
else
{
PktDelAdminAck(lpPktDelAdmin->m_szAccount);
}
return true;
}
// 계정삭제가 성공했으면 Ack
bool CRylAdminMgrDispatch::PktDelAdminAck(char* szAccount)
{
bool bIsReleased = true;
CBuffer* lpBuffer = CREATE_BUFFER(GetBufferFactory(), sizeof(PktAdminMgr::PktDelAdmin));
PktAdminMgr::PktDelAdmin* lpDelAdminAck = reinterpret_cast<PktAdminMgr::PktDelAdmin*>(lpBuffer->begin());
strncpy(lpDelAdminAck->m_szAccount, szAccount, PktAdminMgr::MAX_ACCOUNT);
if (false == PacketWrap::WrapHeader(lpBuffer,
sizeof(PktAdminMgr::PktDelAdmin), PktAdminMgr::PktCMD::PktDelAdminAck, 0, 0))
{
ERRLOG0(g_Log, "수동으로 패킷을 릴리스합니다.");
bIsReleased = false;
}
else
{
if (false == GetSession().SendPending(lpBuffer))
{
ERRLOG0(g_Log, "수동으로 패킷을 릴리스합니다.");
bIsReleased = false;
}
}
if (false == bIsReleased)
{
SAFE_RELEASE_BUFFER(lpBuffer);
}
return true;
}
// 툴 계정 레벨변경
bool CRylAdminMgrDispatch::PktUpdateLev(PktBase* lpPktBase)
{
PktAdminMgr::PktUpdateLevel* lpPktLevel = static_cast<PktAdminMgr::PktUpdateLevel*>(lpPktBase);
// DEVELOPER 권한만이 DEVELOPER, MASTER로 레벨 변경 할 수 있음
unsigned char cTempRights = SetAuthorityMask(lpPktLevel->m_szLevel);
if(cTempRights == PktAdminMgr::AuthorityMask::DEVELOPER
|| cTempRights == PktAdminMgr::AuthorityMask::MASTER)
{
if(!(m_MyAuthority & PktAdminMgr::AuthorityMask::DEVELOPER))
{
SendResult(PktAdminMgr::PktResult::Err_Authority);
return true;
}
}
bool bIsReleased = true;
CBuffer* lpBuffer = CREATE_BUFFER(GetBufferFactory(), sizeof(PktAdminMgr::PktResultAck));
if(NULL == lpBuffer)
{
ERRLOG0(g_Log, "버퍼 생성 실패");
return true;
}
PktAdminMgr::PktResultAck* lpResult = reinterpret_cast<PktAdminMgr::PktResultAck*>(lpBuffer->begin());
if(!CDBAdminTool::GetInstance().UpdateLevel(lpPktLevel))
{
lpResult->m_Result = PktAdminMgr::PktResult::Err_UpdateLevel;
if (false == PacketWrap::WrapHeader(lpBuffer,
sizeof(PktAdminMgr::PktResultAck), PktAdminMgr::PktCMD::PktResultAck, 0, 0))
{
ERRLOG0(g_Log, "수동으로 패킷을 릴리스합니다.");
bIsReleased = false;
}
else
{
if (false == GetSession().SendPending(lpBuffer))
{
ERRLOG0(g_Log, "수동으로 패킷을 릴리스합니다.");
bIsReleased = false;
}
}
if (false == bIsReleased)
{
SAFE_RELEASE_BUFFER(lpBuffer);
}
}
else
{
PktUpdateLevAck(lpPktLevel->m_szAccount, lpPktLevel->m_szLevel);
}
return true;
}
// 계정 레벨변경의 성공했으면.. 보낸다.
bool CRylAdminMgrDispatch::PktUpdateLevAck(char* szAccount, unsigned char Level)
{
bool bIsReleased = true;
CBuffer* lpBuffer = CREATE_BUFFER(GetBufferFactory(), sizeof(PktAdminMgr::PktUpdateLevel));
if(NULL == lpBuffer)
{
ERRLOG0(g_Log, "버퍼 생성 실패");
return true;
}
PktAdminMgr::PktUpdateLevel* lpPktLevelAck = reinterpret_cast<PktAdminMgr::PktUpdateLevel*>(lpBuffer->begin());
strncpy(lpPktLevelAck->m_szAccount, szAccount, PktAdminMgr::MAX_ACCOUNT);
lpPktLevelAck->m_szLevel = Level;
if (false == PacketWrap::WrapHeader(lpBuffer,
sizeof(PktAdminMgr::PktUpdateLevel), PktAdminMgr::PktCMD::PktUpdateLevelAck, 0, 0))
{
ERRLOG0(g_Log, "수동으로 패킷을 릴리스합니다.");
bIsReleased = false;
}
else
{
if (false == GetSession().SendPending(lpBuffer))
{
ERRLOG0(g_Log, "수동으로 패킷을 릴리스합니다.");
bIsReleased = false;
}
}
if (false == bIsReleased)
{
SAFE_RELEASE_BUFFER(lpBuffer);
}
return true;
}
// Exit Log 사용사유를 남기고 클라이언트는 종료된다.
bool CRylAdminMgrDispatch::PktLogUseMessage(PktBase* lpPktBase)
{
PktAdminMgr::PktLogUseMessage* lpPktExitLog = static_cast<PktAdminMgr::PktLogUseMessage*>(lpPktBase);
if(!CDBAdminTool::GetInstance().UpdateExitLog(m_MyLogID, lpPktExitLog->m_UseMessage))
{
ERRLOG0(g_Log, "사용 사유 남기기 실패");
return true;
}
return true;
}
// 관리자 접속IP 변경
bool CRylAdminMgrDispatch::PktUpdateIP(PktBase* lpPktBase)
{
PktAdminMgr::PktUpdateIP* lpPktIP = static_cast<PktAdminMgr::PktUpdateIP*>(lpPktBase);
bool bIsReleased = true;
CBuffer* lpBuffer = CREATE_BUFFER(GetBufferFactory(), sizeof(PktAdminMgr::PktResultAck));
PktAdminMgr::PktResultAck* lpResult = reinterpret_cast<PktAdminMgr::PktResultAck*>(lpBuffer->begin());
if (!CDBAdminTool::GetInstance().UpdateIP(lpPktIP))
{
lpResult->m_Result = PktAdminMgr::PktResult::Err_UpdateIP;
if (false == PacketWrap::WrapHeader(lpBuffer,
sizeof(PktAdminMgr::PktResultAck), PktAdminMgr::PktCMD::PktResultAck, 0, 0))
{
ERRLOG0(g_Log, "수동으로 패킷을 릴리스합니다.");
bIsReleased = false;
}
else
{
if (false == GetSession().SendPending(lpBuffer))
{
ERRLOG0(g_Log, "수동으로 패킷을 릴리스합니다.");
bIsReleased = false;
}
}
if (false == bIsReleased)
{
SAFE_RELEASE_BUFFER(lpBuffer);
}
}
else
{
PktUpdateIPAck(lpPktIP->m_szAccount, lpPktIP->m_szIP);
}
return true;
}
// IP변경이 성공했으면
bool CRylAdminMgrDispatch::PktUpdateIPAck(char* szAccount, char* szIP)
{
bool bIsReleased = true;
CBuffer* lpBuffer = CREATE_BUFFER(GetBufferFactory(), sizeof(PktAdminMgr::PktUpdateIP));
PktAdminMgr::PktUpdateIP* lpPktUpdateIPAck = reinterpret_cast<PktAdminMgr::PktUpdateIP*>(lpBuffer->begin());
strncpy(lpPktUpdateIPAck->m_szAccount, szAccount, PktAdminMgr::MAX_ACCOUNT);
strncpy(lpPktUpdateIPAck->m_szIP, szIP, PktAdminMgr::MAX_IP);
if (false == PacketWrap::WrapHeader(lpBuffer,
sizeof(PktAdminMgr::PktUpdateIP), PktAdminMgr::PktCMD::PktUpdateIPAck, 0, 0))
{
ERRLOG0(g_Log, "수동으로 패킷을 릴리스합니다.");
bIsReleased = false;
}
else
{
if (false == GetSession().SendPending(lpBuffer))
{
ERRLOG0(g_Log, "수동으로 패킷을 릴리스합니다.");
bIsReleased = false;
}
}
if (false == bIsReleased)
{
SAFE_RELEASE_BUFFER(lpBuffer);
}
return true;
}
// 관리자 패스워드 변경
bool CRylAdminMgrDispatch::PktUpdatePasswd(PktBase* lpPktBase)
{
PktAdminMgr::PktUpdatePasswd* lpPktPasswd = static_cast<PktAdminMgr::PktUpdatePasswd*>(lpPktBase);
bool bIsReleased = true;
CBuffer* lpBuffer = CREATE_BUFFER(GetBufferFactory(), sizeof(PktAdminMgr::PktResultAck));
PktAdminMgr::PktResultAck* lpResult = reinterpret_cast<PktAdminMgr::PktResultAck*>(lpBuffer->begin());
if (!CDBAdminTool::GetInstance().UpdatePasswd(lpPktPasswd))
{
lpResult->m_Result = PktAdminMgr::PktResult::Err_UpdatePasswd;
if (false == PacketWrap::WrapHeader(lpBuffer,
sizeof(PktAdminMgr::PktResultAck), PktAdminMgr::PktCMD::PktResultAck, 0, 0))
{
ERRLOG0(g_Log, "수동으로 패킷을 릴리스합니다.");
bIsReleased = false;
}
else
{
if (false == GetSession().SendPending(lpBuffer))
{
ERRLOG0(g_Log, "수동으로 패킷을 릴리스합니다.");
bIsReleased = false;
}
}
if (false == bIsReleased)
{
SAFE_RELEASE_BUFFER(lpBuffer);
}
}
return true;
}
CBuffer* CRylAdminMgrDispatch::MakeRemoveItemAck(unsigned long dwRequestKey, unsigned long dwCID,
unsigned __int64 ItemID, unsigned short PrototypeID,
PktAdminMgr::PktRemoveItem* lpRemoveItem)
{
CBuffer* lpBuffer = CREATE_BUFFER(GetBufferFactory(), sizeof(PktAdminMgr::PktRemoveItemAck));
PktAdminMgr::PktRemoveItemAck* lpRemoveItemAck =
reinterpret_cast<PktAdminMgr::PktRemoveItemAck*>(lpBuffer->begin());
CopyMemory(lpRemoveItemAck, lpRemoveItem, sizeof(PktAdminMgr::PktRemoveItemAck));
lpRemoveItemAck->m_dwCID = dwCID;
lpRemoveItemAck->m_ItemUID = ItemID;
lpRemoveItemAck->m_ItemPrototypeID = PrototypeID;
lpRemoveItemAck->m_dwRequestKey = dwRequestKey;
if (false == PacketWrap::WrapHeader(lpBuffer,
sizeof(PktAdminMgr::PktRemoveItemAck), PktAdminMgr::PktCMD::PktRemoveItemAck, 0, 0))
{
SAFE_RELEASE_BUFFER(lpBuffer);
return NULL;
}
return lpBuffer;
}
// 각종 아이템 컨테이터 리셋
bool CRylAdminMgrDispatch::PktItemReset(PktBase* lpPktBase)
{
PktAdminMgr::PktItemReset* lpItemReset =
static_cast<PktAdminMgr::PktItemReset*>(lpPktBase);
CRylAgentServerDispatch* lpAgentDispatch =
CAgentServerTable::GetInstance().GetDispatch(lpItemReset->m_dwServerGroup);
if(NULL == lpAgentDispatch)
{
ERRLOG0(g_Log, "중계서버 디스패치 얻기 실패");
SendResult(PktAdminMgr::PktResult::Err_NotFoundAgentDispatch);
return true;
}
CModifyCharacter* lpCharacter =
lpAgentDispatch->GetModifyCharacterMgr().GetCharacter(lpItemReset->m_dwCID);
if(NULL == lpCharacter)
{
ERRLOG0(g_Log, "캐릭터 세션 얻기 실패");
return true;
}
if(lpItemReset->m_cTakePos != TakeType::TS_DEPOSIT)
{
switch(lpItemReset->m_cTakePos)
{
case TakeType::TS_INVEN:
lpCharacter->GetInventory().ClearItems(); break; // 인벤토리
case TakeType::TS_EQUIP:
lpCharacter->GetEquipments().ClearItems(); break; // 장비
case TakeType::TS_TEMPINVEN:
lpCharacter->GetTempInven().ClearItems(); break; // 임시 인벤토리
case TakeType::TS_EXTRA:
lpCharacter->GetExtra().ClearItems(); break; // 기타 위치(대장장이, 옵션이식, 보상판매)
}
lpCharacter->OnChangedInfo(CModifyCharacter::ON_BASIC);
CBuffer* lpBuffer =
MakeItemResetAck(lpCharacter->GetClientKey(), lpCharacter->GetCID(), lpItemReset);
if (NULL == lpBuffer)
{
ERRLOG0(g_Log, "버퍼 생성 실패");
return true;
}
if (false == GetSession().SendPending(lpBuffer))
{
SAFE_RELEASE_BUFFER(lpBuffer);
}
}
else
{
if(false == DepositCheckIt(
lpAgentDispatch->GetDepositLock(), lpItemReset->m_dwUID, lpItemReset->m_dwCID))
{
SendResult(PktAdminMgr::PktResult::Err_NotUseDeposit);
return true;
}
lpCharacter->OnChangedInfo(CModifyCharacter::ON_STROE12);
lpCharacter->OnChangedInfo(CModifyCharacter::ON_STORE34);
CModifyCharacterMgr& CharMgr = lpAgentDispatch->GetModifyCharacterMgr();
CModifyCharacterMgr::iterator Pos = CharMgr.begin();
for(;Pos != CharMgr.end(); ++Pos)
{
CModifyCharacter* lpModifyCharacter = Pos->second;
if(NULL != (lpModifyCharacter->GetCheckSession(lpItemReset->m_dwUID)))
{
Item::CDepositContainer& Deposit = lpModifyCharacter->GetDeposit();
for(int TabNum = 0; TabNum < Deposit.GetMaxTabNum(); ++TabNum)
{
Item::CItemContainer* lpDepositTab = Deposit.GetTab(TabNum);
lpDepositTab->ClearItems();
m_DetailLog.SetBefore("not exist contents");
m_DetailLog.SetAfter("[Character ItemInfo Clear]\r\nUID: %u\r\nCID: %u\r\nServerGroup: %u"
"\r\nTakePos: %c",
lpItemReset->m_dwUID, lpItemReset->m_dwCID,
lpItemReset->m_dwServerGroup, lpItemReset->m_cTakePos);
m_DetailLog.InsertLog(m_MyLogID);
}
CBuffer* lpBuffer =
MakeItemResetAck(lpModifyCharacter->GetClientKey(), lpModifyCharacter->GetCID(), lpItemReset);
if (NULL == lpBuffer)
{
ERRLOG0(g_Log, "버퍼 생성 실패");
return true;
}
if (false == GetSession().SendPending(lpBuffer))
{
SAFE_RELEASE_BUFFER(lpBuffer);
}
}
}
}
return true;
}
// 아이템 수정정보 Ack
CBuffer* CRylAdminMgrDispatch::MakeUpdateItemAck(unsigned long dwRequestKey, unsigned long dwCID,
unsigned __int64 dwItemID, unsigned short PrototypeID,
PktAdminMgr::PktUpdateItem* lpUpdateItem)
{
CBuffer* lpBuffer = CREATE_BUFFER(GetBufferFactory(), sizeof(PktAdminMgr::PktUpdateItemAck));
PktAdminMgr::PktUpdateItemAck* lpUpdateItemAck =
reinterpret_cast<PktAdminMgr::PktUpdateItemAck*>(lpBuffer->begin());
lpUpdateItemAck->m_dwUID = lpUpdateItem->m_dwUID;
lpUpdateItemAck->m_dwCID = dwCID;
lpUpdateItemAck->m_dwRequestKey = dwRequestKey;
lpUpdateItemAck->m_dwServerGroup = lpUpdateItem->m_dwServerGroup;
lpUpdateItemAck->m_ItemUID = dwItemID;
lpUpdateItemAck->m_ItemPrototypeID = PrototypeID;
CopyMemory(&lpUpdateItemAck->m_UpdataItemInfo, &lpUpdateItem->m_UpdataItemInfo,
sizeof(PktAdminMgr::CreateItemInfo));
if (false == PacketWrap::WrapHeader(lpBuffer,
sizeof(PktAdminMgr::PktUpdateItemAck), PktAdminMgr::PktCMD::PktUpdateItemAck, 0, 0))
{
SAFE_RELEASE_BUFFER(lpBuffer);
return NULL;
}
return lpBuffer;
}
// 창고 독점권한및 획득 체크~~
bool CRylAdminMgrDispatch::DepositCheckIt( ItemData::CDepositLock& DepositLock, unsigned long dwUID, unsigned long dwCID )
{
bool isLock;
// 현재 다른사용자가 사용하고 있으면
if( !DepositLock.isUse( dwUID, dwCID, this, isLock ) )
{
// 리턴결과가 검색실패인지 창고가 락이 걸려있는지 판별
// isLock이 false면 검색실패닷 내가 사용해버리자..
if( !isLock )
{
// 창고독점권을 아무도 가지고 있지 않다 내소유로 만들어버리자..
DepositLock.DepositLock( dwUID, dwCID, this );
return true;
}
}
else
{
// 창고 독접권이 내 소유닷~~
return true;
}
return false;
}
// 아이템 생성
bool CRylAdminMgrDispatch::PktCreateItem(PktBase* lpPktBase)
{
PktAdminMgr::PktCreateItem* lpPktCreateItem = static_cast<PktAdminMgr::PktCreateItem*>(lpPktBase);
CRylAgentServerDispatch* lpAgentDispatch =
CAgentServerTable::GetInstance().GetDispatch(lpPktCreateItem->m_dwServerGroup);
if (NULL == lpAgentDispatch)
{
SendResult(PktAdminMgr::PktResult::Err_NotFoundAgentDispatch);
return true;
}
PktAdminMgr::CreateItemInfo& CreateItem = lpPktCreateItem->m_CreateItemInfo;
CreateItem.m_szItemName[PktAdminMgr::MAX_ITEM_NAME - 1] = 0;
const Item::ItemInfo* lpItemInfo =
Item::CItemMgr::GetInstance().GetItemInfoFromItemName(CreateItem.m_szItemName);
const unsigned long dwUID = lpPktCreateItem->m_dwUID;
const unsigned long dwCID = lpPktCreateItem->m_dwCID;
ItemData::CDepositLock& DepositLock = lpAgentDispatch->GetDepositLock();
CModifyCharacter* lpModifyCharacter = lpAgentDispatch->GetModifyCharacterMgr().GetCharacter(dwCID);
if ((NULL == lpItemInfo) || (NULL == lpModifyCharacter))
{
SendResult(PktAdminMgr::PktResult::Err_CreateItem1);
return true;
}
else
{
if (CreateItem.m_cTakePos == TakeType::TS_DEPOSIT)
{
if (false == DepositCheckIt(lpAgentDispatch->GetDepositLock(), dwUID, dwCID))
{
SendResult(PktAdminMgr::PktResult::Err_NotUseDeposit);
return true;
}
}
Item::CItem* lpItem =
Item::CItemFactory::GetInstance().CreateItem(lpItemInfo->m_usProtoTypeID);
if (NULL == lpItem)
{
SendResult(PktAdminMgr::PktResult::Err_CreateItem2);
}
else
{
lpItem->SetNumOrDurability(CreateItem.m_cNumOrDurability);
Item::CEquipment* lpEquipment = Item::CEquipment::DowncastToEquipment(lpItem);
if (NULL != lpEquipment)
{
// 아이템 장비 및 속성 데이터 변경
CModifyEquipment* lpModifyEquipment = static_cast<CModifyEquipment*>(lpEquipment);
lpModifyEquipment->AdjustData(CreateItem);
}
Item::ItemPos ItemPos = ItemData::MakeItemPos(
CreateItem.m_cTakePos, CreateItem.m_cXPos, CreateItem.m_cYPos, CreateItem.m_cZPos);
lpModifyCharacter->GetInventory().SetAdminTool();
if (false == lpModifyCharacter->SetItem(ItemPos, lpItem))
{
SendResult(PktAdminMgr::PktResult::Err_CreateItem3);
return true;
}
if (CreateItem.m_cTakePos == TakeType::TS_DEPOSIT)
{
if ((CreateItem.m_cZPos == 0) || (CreateItem.m_cZPos == 1)) // 창고 1,2 탭정보를 변경했음
{
lpModifyCharacter->OnChangedInfo(CModifyCharacter::ON_STROE12);
}
else if ((CreateItem.m_cZPos == 2) || (CreateItem.m_cZPos == 3)) // 창고 3,4 탭정보를 변경했음
{
lpModifyCharacter->OnChangedInfo(CModifyCharacter::ON_STORE34);
}
}
else
{
lpModifyCharacter->OnChangedInfo(CModifyCharacter::ON_BASIC); // 인벤토리 정보를 변경했음
}
// 사용내역 기록
m_DetailLog.SetBefore("not exist contents");
m_DetailLog.SetAfter(
"[Item Create]\r\nUID: %u\r\nCID : %d\r\nServerGroup : %d\r\nPosition : %s\r\n"
"PrototypeID : %d\r\nItemUID : 0x%016I64X\r\nName : %s\r\nX:%d Y:%d Z:%d",
lpPktCreateItem->m_dwUID, lpModifyCharacter->GetCID(), lpModifyCharacter->GetServerGroup(),
GetItemState(CreateItem.m_cTakePos), lpItemInfo->m_usProtoTypeID, lpItem->GetUID(),
lpItemInfo->m_SpriteData.m_szName, ItemPos.GetXIndex(), ItemPos.GetYIndex(), ItemPos.GetZIndex());
// 같은 UID의 캐릭터의 정보를 열람중인 다른 사용자에게 새 창고 정보 전송.
if(CreateItem.m_cTakePos == TakeType::TS_DEPOSIT)
{
CModifyCharacterMgr& CharMgr = lpAgentDispatch->GetModifyCharacterMgr();
CModifyCharacterMgr::iterator Pos = CharMgr.begin();
for(;Pos != CharMgr.end(); ++Pos)
{
CModifyCharacter* lpCharacter = Pos->second;
CSession* lpSession = lpCharacter->GetCheckSession(dwUID);
if((NULL != lpSession) && (dwCID != lpCharacter->GetCID()))
{
Item::CItem* lpCloneItem = ItemData::CloneItem(lpItem, CreateItem);
if(NULL != lpCloneItem)
{
if(lpCharacter->SetItem(ItemPos, lpCloneItem))
{
CBuffer* lpBuffer =
MakeCreateItemAck(lpCharacter->GetClientKey(), lpCharacter->GetCID(),
lpCloneItem->GetUID(), lpCloneItem->GetPrototypeID(), lpPktCreateItem);
if (NULL == lpBuffer)
{
ERRLOG0(g_Log, "Ack 버퍼 생성 실패");
return true;
}
if (false == GetSession().SendPending(lpBuffer))
{
SAFE_RELEASE_BUFFER(lpBuffer);
}
}
else
{
ERRLOG0(g_Log, "복사 아이템 장착이 실패했습니다.");
return true;
}
}
else
{
ERRLOG0(g_Log, "복사 아이템 생성을 실패했습니다.");
return true;
}
}
}
CBuffer* lpBuffer = MakeCreateItemAck(lpPktCreateItem->m_dwRequestKey,
dwCID, lpItem->GetUID(), lpItem->GetPrototypeID(), lpPktCreateItem);
if (NULL == lpBuffer)
{
ERRLOG0(g_Log, "Ack 버퍼 생성 실패");
return true;
}
if (false == GetSession().SendPending(lpBuffer))
{
SAFE_RELEASE_BUFFER(lpBuffer);
}
}
else
{
CBuffer* lpBuffer = MakeCreateItemAck(lpPktCreateItem->m_dwRequestKey,
dwCID, lpItem->GetUID(), lpItem->GetPrototypeID(), lpPktCreateItem);
if (NULL == lpBuffer)
{
ERRLOG0(g_Log, "Ack 버퍼 생성 실패");
return true;
}
if (false == GetSession().SendPending(lpBuffer))
{
SAFE_RELEASE_BUFFER(lpBuffer);
}
}
}
}
m_DetailLog.InsertLog(m_MyLogID);
return true;
}
// 인벤토리, 장비, 창고등등의 모든 아이템데이터를 변경한다 cTakePos로 판별
bool CRylAdminMgrDispatch::PktUpdateItem(PktBase* lpPktBase)
{
PktAdminMgr::PktUpdateItem* lpPktUpdateItem = static_cast<PktAdminMgr::PktUpdateItem*>(lpPktBase);
PktAdminMgr::CreateItemInfo& UpdateItem = lpPktUpdateItem->m_UpdataItemInfo;
CRylAgentServerDispatch* lpAgentDispatch =
CAgentServerTable::GetInstance().GetDispatch(lpPktUpdateItem->m_dwServerGroup);
if(NULL == lpAgentDispatch)
{
return true;
}
const unsigned long dwUID = lpPktUpdateItem->m_dwUID;
const unsigned long dwCID = lpPktUpdateItem->m_dwCID;
ItemData::CDepositLock& DepositLock = lpAgentDispatch->GetDepositLock();
CModifyCharacter* lpModifyCharacter = lpAgentDispatch->GetModifyCharacterMgr().GetCharacter(dwCID);
if(NULL != lpModifyCharacter)
{
if(UpdateItem.m_cTakePos == TakeType::TS_DEPOSIT)
{
if(!DepositCheckIt(lpAgentDispatch->GetDepositLock(), dwUID, dwCID))
{
// 창고 독점권 획득 실패 혹은 접근불가
SendResult(PktAdminMgr::PktResult::Err_NotUseDeposit); // 창고 정보 변경 불가
return true;
}
}
Item::ItemPos ItemPos =
ItemData::MakeItemPos(UpdateItem.m_cTakePos, UpdateItem.m_cXPos, UpdateItem.m_cYPos, UpdateItem.m_cZPos);
Item::CItem* lpItem = lpModifyCharacter->GetItem(ItemPos);
if(NULL != lpItem)
{
unsigned short uPrototypeID = lpPktUpdateItem->m_ItemPrototypeID;
unsigned __int64 ItemUID = lpPktUpdateItem->m_ItemUID;
// 안전빵으로 ItemprototypeID, ItemUID를 한번더 비교해보자. ㅡ.ㅡ;
if((uPrototypeID == lpItem->GetPrototypeID()) && (ItemUID == lpItem->GetUID()))
{
lpItem->SetNumOrDurability(UpdateItem.m_cNumOrDurability); // 현재 내구도 또는 개수 셋팅
Item::CEquipment* lpEquipment = Item::CEquipment::DowncastToEquipment(lpItem);
if(NULL != lpEquipment)
{
CModifyEquipment* lpEquip = static_cast<CModifyEquipment*>(lpEquipment);
if (NULL != lpEquip)
{
lpEquip->AdjustData(UpdateItem);
}
}
m_DetailLog.SetBefore("not exist contents");
m_DetailLog.SetAfter("[Item Attribute Edit]\r\nUID: %u\r\nCID : %d\r\nServerGroup : %d\r\nPosition : %s\r\nPrototypeID : %d\r\nItemUID : 0x%016I64X\r\nName : %s\r\nX:%d Y:%d Z:%d",
lpPktUpdateItem->m_dwUID, lpModifyCharacter->GetCID(), lpModifyCharacter->GetServerGroup(), GetItemState(UpdateItem.m_cTakePos),
lpItem->GetItemInfo().m_usProtoTypeID, lpItem->GetUID(), lpItem->GetItemInfo().m_SpriteData.m_szName,
ItemPos.GetXIndex(), ItemPos.GetYIndex(), ItemPos.GetZIndex());
m_DetailLog.InsertLog(m_MyLogID);
// 아이템 정보변경 성공
// 캐릭터 데이터 수정을 체크 ------------------------------------------------------------------------
if(UpdateItem.m_cTakePos == TakeType::TS_DEPOSIT)
{
if((UpdateItem.m_cZPos == 0) || (UpdateItem.m_cZPos == 1)) // 창고 1,2 탭정보를 변경
lpModifyCharacter->OnChangedInfo(CModifyCharacter::ON_STROE12);
else if((UpdateItem.m_cZPos == 2) || (UpdateItem.m_cZPos == 3)) // 창고 3,4 탭정보를 변경
lpModifyCharacter->OnChangedInfo(CModifyCharacter::ON_STORE34);
}
else
{
lpModifyCharacter->OnChangedInfo(CModifyCharacter::ON_BASIC);
}
//-------------------------------------------------------------------------------------------------------
// UpdateItem Ack를 클라이언트에게 보내자..
if(UpdateItem.m_cTakePos == TakeType::TS_DEPOSIT)
{
CModifyCharacterMgr& CharMgr = lpAgentDispatch->GetModifyCharacterMgr();
CModifyCharacterMgr::iterator Pos = CharMgr.begin();
for(;Pos != CharMgr.end(); ++Pos)
{
CModifyCharacter* lpCharacter = Pos->second;
CSession* lpSession = lpCharacter->GetCheckSession(dwUID);
if((NULL != lpSession) && (dwCID != lpCharacter->GetCID()))
{
Item::CItem* lpCloneItem = lpCharacter->GetItem(ItemPos);
if(NULL != lpCloneItem)
{
if(lpCharacter->RemoveItem(ItemPos))
{
DELETE_ITEM(lpCloneItem);
lpCloneItem = ItemData::CloneItem( lpItem, UpdateItem );
if( NULL != lpCloneItem )
{
if( !lpCharacter->SetItem( ItemPos, lpCloneItem ) )
{
CBuffer* lpBuffer =
MakeUpdateItemAck(lpCharacter->GetClientKey(),
lpCharacter->GetCID(), lpItem->GetUID(), lpItem->GetPrototypeID(),
lpPktUpdateItem);
if (NULL == lpBuffer)
{
ERRLOG0(g_Log, "Ack 버퍼 생성 실패");
return true;
}
if (false == GetSession().SendPending(lpBuffer))
{
SAFE_RELEASE_BUFFER(lpBuffer);
}
}
else
{
ERRLOG0(g_Log, "복사 아이템 장착이 실패했습니다." );
}
}
else
{
ERRLOG0(g_Log, "복사 아이템 생성을 실패했습니다." );
}
}
else
{
ERRLOG0(g_Log, "복사아이템을 장착하기 위해 기존아이템을 지우는데 실패했습니다." );
}
}
else
{
ERRLOG0(g_Log, "UID간 창고 아이템 동기화가 정확하지 않습니다. (아이템을 찾을수 없습니다.)");
}
}
}
CBuffer* lpBuffer = MakeUpdateItemAck(lpPktUpdateItem->m_dwRequestKey,
lpPktUpdateItem->m_dwCID, lpItem->GetUID(), lpItem->GetPrototypeID(), lpPktUpdateItem);
if (NULL == lpBuffer)
{
ERRLOG0(g_Log, "Ack 버퍼 생성 실패");
return true;
}
if (false == GetSession().SendPending(lpBuffer))
{
SAFE_RELEASE_BUFFER(lpBuffer);
}
}
else
{
CBuffer* lpBuffer = MakeUpdateItemAck(lpPktUpdateItem->m_dwRequestKey,
lpPktUpdateItem->m_dwCID, lpItem->GetUID(), lpItem->GetPrototypeID(), lpPktUpdateItem);
if (NULL == lpBuffer)
{
ERRLOG0(g_Log, "Ack 버퍼 생성 실패");
return true;
}
if (false == GetSession().SendPending(lpBuffer))
{
SAFE_RELEASE_BUFFER(lpBuffer);
}
}
}
else
{
// 아이템 식별번호가 일치하지 안습니다.
SendResult(PktAdminMgr::PktResult::Err_Invalid_ItemID);
}
}
else
{
//아이템이 존재 하지 안는다
SendResult(PktAdminMgr::PktResult::Err_Invalid_Item);
}
}
else
{
// 캐릭터가 존재하지 않는다.
SendResult(PktAdminMgr::PktResult::Err_Invalid_Character);
}
return true;
}
// 아이템 삭제
bool CRylAdminMgrDispatch::PktRemoveItem(PktBase* lpPktBase)
{
PktAdminMgr::PktRemoveItem* lpPktRemoveItem = static_cast<PktAdminMgr::PktRemoveItem*>(lpPktBase);
CRylAgentServerDispatch* lpAgentDispatch =
CAgentServerTable::GetInstance().GetDispatch(lpPktRemoveItem->m_dwServerGroup);
if(NULL == lpAgentDispatch)
{
ERRLOG0(g_Log, "중계서버 디스패치 얻기 실패");
SendResult(PktAdminMgr::PktResult::Err_NotFoundAgentDispatch);
return true;
}
CModifyCharacter* lpModifyCharacter =
lpAgentDispatch->GetModifyCharacterMgr().GetCharacter(lpPktRemoveItem->m_dwCID);
if(NULL == lpModifyCharacter)
{
ERRLOG0(g_Log, "캐릭터 세션 얻기 실패");
return true;
}
const unsigned long dwUID = lpPktRemoveItem->m_dwUID;
const unsigned long dwCID = lpPktRemoveItem->m_dwCID;
const unsigned char cTakePos = lpPktRemoveItem->m_cTakePos;
const unsigned char cXPos = lpPktRemoveItem->m_cXPos;
const unsigned char cYPos = lpPktRemoveItem->m_cYPos;
const unsigned char cZPos = lpPktRemoveItem->m_cZPos;
const unsigned __int64 ItemUID = lpPktRemoveItem->m_ItemUID;
const unsigned short PrototypeID = lpPktRemoveItem->m_ItemPrototypeID;
if(cTakePos == TakeType::TS_DEPOSIT)
{
if(!DepositCheckIt(lpAgentDispatch->GetDepositLock(), dwUID, dwCID))
{
SendResult(PktAdminMgr::PktResult::Err_NotUseDeposit);
return true;
}
}
Item::ItemPos ItemPos = ItemData::MakeItemPos(cTakePos, cXPos, cYPos, cZPos);
Item::CItem* lpItem = lpModifyCharacter->GetItem(ItemPos);
// 인벤토리 컨테이너안의 RemoveItem, SetItem 메소드내에서 CheckTrigger 사용안하도록!
lpModifyCharacter->GetInventory().SetAdminTool();
if ((NULL != lpItem) && (lpItem->GetUID() == ItemUID) && (lpItem->GetPrototypeID() == PrototypeID))
{
if (false == lpModifyCharacter->RemoveItem(ItemPos))
{
ERRLOG0(g_Log, "아이템 삭제 실패");
SendResult(PktAdminMgr::PktResult::Err_RemoveItem);
}
else
{
m_DetailLog.SetBefore("not exist contents");
m_DetailLog.SetAfter("[Item Delete]\r\nUID: %u\r\nCID : %d\r\nServerGroup : %d\r\n"
"Position : %s\r\nPrototypeID : %d\r\nItemUID : 0x%016I64X\r\nName : %s\r\nX:%d Y:%d Z:%d",
lpPktRemoveItem->m_dwUID, lpModifyCharacter->GetCID(), lpModifyCharacter->GetServerGroup(),
GetItemState(cTakePos), lpItem->GetItemInfo().m_usProtoTypeID, lpItem->GetUID(),
lpItem->GetItemInfo().m_SpriteData.m_szName, ItemPos.GetXIndex(), ItemPos.GetYIndex(), ItemPos.GetZIndex());
m_DetailLog.InsertLog(m_MyLogID);
DELETE_ITEM(lpItem);
if(cTakePos == TakeType::TS_DEPOSIT)
{
if((0 == cZPos) || (1 == cZPos))
{
lpModifyCharacter->OnChangedInfo(CModifyCharacter::ON_STROE12);
}
else if((cZPos == 2) || (cZPos == 3))
{
lpModifyCharacter->OnChangedInfo(CModifyCharacter::ON_STORE34);
}
}
else
{
lpModifyCharacter->OnChangedInfo(CModifyCharacter::ON_BASIC);
}
// RemoveItem Ack를 클라이언트로 전송
if(cTakePos == TakeType::TS_DEPOSIT)
{
CModifyCharacterMgr& CharMgr = lpAgentDispatch->GetModifyCharacterMgr();
CModifyCharacterMgr::iterator Pos = CharMgr.begin();
for(;Pos != CharMgr.end(); ++Pos)
{
CModifyCharacter* lpCharacter = Pos->second;
if(NULL == lpCharacter)
{
ERRLOG0(g_Log, "널 세션");
return true;
}
if((NULL != lpCharacter->GetCheckSession(dwUID)) && (dwCID != lpCharacter->GetCID()))
{
Item::CItem* CloneItem = lpCharacter->GetItem(ItemPos);
if(lpCharacter->RemoveItem(ItemPos)) // 아이템 삭제
{
if(NULL != CloneItem)
{
DELETE_ITEM(CloneItem);
}
CBuffer* lpBuffer = MakeRemoveItemAck(lpCharacter->GetClientKey(),
lpCharacter->GetCID(), ItemUID, PrototypeID, lpPktRemoveItem);
if (NULL == lpBuffer)
{
ERRLOG0(g_Log, "ACK 버퍼 생성 실패");
return true;
}
if (false == GetSession().SendPending(lpBuffer))
{
SAFE_RELEASE_BUFFER(lpBuffer);
}
}
}
}
CBuffer* lpBuffer = MakeRemoveItemAck(lpPktRemoveItem->m_dwRequestKey,
dwCID, ItemUID, PrototypeID, lpPktRemoveItem);
if (NULL == lpBuffer)
{
ERRLOG0(g_Log, "ACK 버퍼 생성 실패");
return true;
}
if (false == GetSession().SendPending(lpBuffer))
{
SAFE_RELEASE_BUFFER(lpBuffer);
}
}
else
{
CBuffer* lpBuffer = MakeRemoveItemAck(lpPktRemoveItem->m_dwRequestKey,
dwCID, ItemUID, PrototypeID, lpPktRemoveItem);
if (NULL == lpBuffer)
{
ERRLOG0(g_Log, "ACK 버퍼 생성 실패");
return true;
}
if (false == GetSession().SendPending(lpBuffer))
{
SAFE_RELEASE_BUFFER(lpBuffer);
}
}
}
}
return true;
}
// 인벤토리 골드 수정
bool CRylAdminMgrDispatch::PktInvenGold(PktBase* lpPktBase)
{
PktAdminMgr::PktInvenGold* lpInvenGold = static_cast<PktAdminMgr::PktInvenGold*>(lpPktBase);
CRylAgentServerDispatch* lpAgentDispatch =
CAgentServerTable::GetInstance().GetDispatch(lpInvenGold->m_dwServerGroup);
if(NULL != lpAgentDispatch)
{
CModifyCharacter* lpCharacter = lpAgentDispatch->GetModifyCharacterMgr().GetCharacter(lpInvenGold->m_dwCID);
if(NULL != lpCharacter)
{
m_DetailLog.SetBefore("UID: %u\r\nCID: %u\r\nServerGroup: %u\r\n\r\nInventory Gold : %u",
lpInvenGold->m_dwUID, lpInvenGold->m_dwCID, lpInvenGold->m_dwServerGroup, lpCharacter->GetGold());
if (lpCharacter->SetGold(lpInvenGold->m_dwGold))
{
bool bIsReleased = true;
CBuffer* lpBuffer = CREATE_BUFFER(GetBufferFactory(), sizeof(PktAdminMgr::PktInvenGold));
PktAdminMgr::PktInvenGold* lpPktInvenGold =
reinterpret_cast<PktAdminMgr::PktInvenGold*>(lpBuffer->begin());
CopyMemory(lpPktInvenGold, lpInvenGold, sizeof(PktAdminMgr::PktInvenGold));
if (false == PacketWrap::WrapHeader(lpBuffer,
sizeof(PktAdminMgr::PktInvenGold), PktAdminMgr::PktCMD::PktInvenGold, 0, 0))
{
ERRLOG0(g_Log, "수동으로 패킷을 릴리스합니다.");
bIsReleased = false;
}
else
{
lpCharacter->OnChangedInfo(CModifyCharacter::ON_BASIC);
if (false == GetSession().SendPending(lpBuffer))
{
ERRLOG0(g_Log, "수동으로 패킷을 릴리스합니다.");
bIsReleased = false;
}
m_DetailLog.SetAfter("Inventory Gold : %u", lpCharacter->GetGold());
m_DetailLog.InsertLog(m_MyLogID);
}
if (false == bIsReleased)
{
SAFE_RELEASE_BUFFER(lpBuffer);
}
}
else
{
SendResult(PktAdminMgr::PktResult::Err_SetInventoryGold);
}
}
else
{
SendResult(PktAdminMgr::PktResult::Err_Invalid_Character);
}
}
else
{
SendResult(PktAdminMgr::PktResult::Err_NotFoundAgentDispatch);
}
return true;
}
// 아이템 만들기 Ack
CBuffer* CRylAdminMgrDispatch::MakeCreateItemAck(unsigned long dwRequestKey, unsigned long dwCID,
unsigned __int64 dwItemID, unsigned short dwPrototypeID,
PktAdminMgr::PktCreateItem* lpCreateItem)
{
CBuffer* lpBuffer = CREATE_BUFFER(GetBufferFactory(), sizeof(PktAdminMgr::PktCreateItemAck));
PktAdminMgr::PktCreateItemAck* lpPktCreateItemAck =
reinterpret_cast<PktAdminMgr::PktCreateItemAck*>(lpBuffer->begin());
lpPktCreateItemAck->m_dwCID = dwCID;
lpPktCreateItemAck->m_dwUID = lpCreateItem->m_dwUID;
lpPktCreateItemAck->m_dwRequestKey = dwRequestKey;
lpPktCreateItemAck->m_dwServerGroup = lpCreateItem->m_dwServerGroup;
lpPktCreateItemAck->m_ItemID = dwItemID;
lpPktCreateItemAck->m_PrototypeID = dwPrototypeID;
CopyMemory(&lpPktCreateItemAck->m_CreateItemInfo, &lpCreateItem->m_CreateItemInfo,
sizeof(PktAdminMgr::CreateItemInfo));
if (false == PacketWrap::WrapHeader(lpBuffer,
sizeof(PktAdminMgr::PktCreateItemAck), PktAdminMgr::PktCMD::PktCreateItemAck, 0, 0))
{
SAFE_RELEASE_BUFFER(lpBuffer);
return NULL;
}
return lpBuffer;
}
// 각종 아이템 컨테이너 리셋 ACK
CBuffer* CRylAdminMgrDispatch::MakeItemResetAck(unsigned long dwRequestKey, unsigned long dwCID,
PktAdminMgr::PktItemReset* lpPktItemReset)
{
CBuffer* lpBuffer = CREATE_BUFFER(GetBufferFactory(), sizeof(PktAdminMgr::PktItemReset));
PktAdminMgr::PktItemResetAck* lpItemReset =
reinterpret_cast<PktAdminMgr::PktItemResetAck*>(lpBuffer->begin());
lpItemReset->m_dwCID = dwCID;
lpItemReset->m_dwUID = lpPktItemReset->m_dwUID;
lpItemReset->m_cTakePos = lpPktItemReset->m_cTakePos;
lpItemReset->m_dwRequest = dwRequestKey;
lpItemReset->m_dwServerGroup = lpPktItemReset->m_dwServerGroup;
if (false == PacketWrap::WrapHeader(lpBuffer,
sizeof(PktAdminMgr::PktItemResetAck), PktAdminMgr::PktCMD::PktItemResetAck, 0, 0))
{
SAFE_RELEASE_BUFFER(lpBuffer);
return NULL;
}
return lpBuffer;
}
// 스킬 추가, 편집, 삭제
bool CRylAdminMgrDispatch::PktSkillEdit(PktBase* lpPktBase)
{
PktAdminMgr::PktSkillEdit* lpPktSkillEdit = static_cast<PktAdminMgr::PktSkillEdit*>(lpPktBase);
CRylAgentServerDispatch* lpAgentDispatch =
CAgentServerTable::GetInstance().GetDispatch(lpPktSkillEdit->m_dwServerGroup);
if(NULL == lpAgentDispatch)
{
ERRLOG0(g_Log, "중계 서버 디스패치 찾기 실패");
SendResult(PktAdminMgr::PktResult::Err_NotFoundAgentDispatch);
return true;
}
CModifyCharacter* lpCharacter =
lpAgentDispatch->GetModifyCharacterMgr().GetCharacter(lpPktSkillEdit->m_dwCID);
if(NULL == lpCharacter)
{
ERRLOG2(g_Log, "캐릭터 세션 얻기 실패. 그룹: %u, CID: %u",
lpPktSkillEdit->m_dwServerGroup, lpPktSkillEdit->m_dwCID);
return true;
}
unsigned short wSkillID = lpPktSkillEdit->m_wSkillID;
char cLevel = lpPktSkillEdit->m_SkillLevel;
char cLockCount = lpPktSkillEdit->m_SkillLockCount;
unsigned char cResult = 0;
CString strTemp;
strTemp.Format("[Skill");
if(NULL != lpCharacter)
{
switch(lpPktSkillEdit->m_cType)
{
case PktAdminMgr::PktSkillEdit::Create:
cResult = lpCharacter->AppendSkill(wSkillID, cLevel, cLockCount); // 스킬 추가
strTemp.AppendFormat(" Add]");
break;
case PktAdminMgr::PktSkillEdit::Edit:
cResult = lpCharacter->AppendSkill(wSkillID, cLevel, cLockCount); // 스킬 편집
strTemp.AppendFormat(" Edit]");
break;
case PktAdminMgr::PktSkillEdit::Delete:
cResult = lpCharacter->DeleteSkill(wSkillID, cLevel, cLockCount); // 스킬 삭제
strTemp.AppendFormat(" Del]");
break;
}
}
strTemp.AppendFormat("\r\nUID: %u\r\nCID: %u\r\n"
"ServerGroup: %u\r\n\r\nSkill ID: 0x%04d\r\nLevel: %d\r\nLockCount: %d",
lpPktSkillEdit->m_dwUID, lpPktSkillEdit->m_dwCID, lpPktSkillEdit->m_dwServerGroup,
wSkillID, cLevel, cLockCount);
if(cResult == PktAdminMgr::PktSkillEdit::SUCCESS)
{
m_DetailLog.SetBefore("not exist contents");
m_DetailLog.SetAfter("%s", strTemp);
m_DetailLog.InsertLog(m_MyLogID);
bool bIsReleased = true;
CBuffer* lpBuffer = CREATE_BUFFER(GetBufferFactory(), sizeof(PktAdminMgr::PktSkillEdit));
PktAdminMgr::PktSkillEdit* lpPktSkillEditAck =
reinterpret_cast<PktAdminMgr::PktSkillEdit*>(lpBuffer->begin());
lpCharacter->OnChangedInfo(CModifyCharacter::ON_BASIC);
CopyMemory(lpPktSkillEditAck, lpPktSkillEdit, sizeof(PktAdminMgr::PktSkillEdit));
if (false == PacketWrap::WrapHeader(lpBuffer,
sizeof(PktAdminMgr::PktSkillEdit), PktAdminMgr::PktCMD::PktSkillEditAck, 0, 0))
{
ERRLOG0(g_Log, "수동으로 패킷을 릴리스합니다.");
bIsReleased = false;
}
else
{
if (false == GetSession().SendPending(lpBuffer))
{
ERRLOG0(g_Log, "수동으로 패킷을 릴리스합니다.");
bIsReleased = false;
}
}
if (false == bIsReleased)
{
SAFE_RELEASE_BUFFER(lpBuffer);
}
}
else
{
switch(cResult)
{
case PktAdminMgr::PktSkillEdit::NOT_ENOUGH_STAT:
SendResult(PktAdminMgr::PktResult::Err_NOT_ENOUGH_STAT);
break;
case PktAdminMgr::PktSkillEdit::NOT_ENOUGH_SKILLSLOT:
SendResult(PktAdminMgr::PktResult::Err_NOT_ENOUGH_SKILLSLOT);
break;
case PktAdminMgr::PktSkillEdit::FAILED_TO_GET_SKILLPROTOTYPE:
SendResult(PktAdminMgr::PktResult::Err_FAILED_TO_GET_SKILLPROTOTYPE);
break;
case PktAdminMgr::PktSkillEdit::OVERED_MAX_LOCKCOUNT:
SendResult(PktAdminMgr::PktResult::Err_OVERED_MAX_LOCKCOUNT);
break;
case PktAdminMgr::PktSkillEdit::OVERED_MAX_SKILL_LEVEL:
SendResult(PktAdminMgr::PktResult::Err_OVERED_MAX_SKILL_LEVEL);
break;
case PktAdminMgr::PktSkillEdit::NOT_CURRENT_CLASS:
SendResult(PktAdminMgr::PktResult::Err_NOT_CURRENT_CLASS);
break;
case PktAdminMgr::PktSkillEdit::FAILED:
SendResult(PktAdminMgr::PktResult::Err_SkillEdit);
break;
default:
SendResult(PktAdminMgr::PktResult::Err_SkillEdit);
break;
}
}
return true;
}
// 관리자 존, 좌표 목록 디비에 저장
bool CRylAdminMgrDispatch::PktSetZoneList(PktBase* lpPktBase)
{
PktAdminMgr::PktSetZoneList* lpPktSetZone = static_cast< PktAdminMgr::PktSetZoneList* >(lpPktBase);
unsigned char* cZoneCount = reinterpret_cast< unsigned char* >( lpPktSetZone->m_ZoneBuffer );
CDBAdminTool& ToolDB = CDBAdminTool::GetInstance();
if(!ToolDB.UpdateZoneList(m_MyUID, lpPktSetZone->m_ZoneBuffer))
{
ERRLOG0(g_Log, "존 리스트정보를 디비에 저장하는데 실패했습니다");
}
return true;
}
// 창고 패스워드 변경
bool CRylAdminMgrDispatch::PktDepositPasswd(PktBase* lpPktBase)
{
PktAdminMgr::PktDepositPasswd* lpPktDepositPwd = static_cast<PktAdminMgr::PktDepositPasswd*>(lpPktBase);
CRylAgentServerDispatch* lpAgentDispatch =
CAgentServerTable::GetInstance().GetDispatch(lpPktDepositPwd->m_dwServerGroup);
if (NULL != lpAgentDispatch)
{
CModifyCharacter* lpCharacter =
lpAgentDispatch->GetModifyCharacterMgr().GetCharacter(lpPktDepositPwd->m_dwCID);
if ((NULL != lpCharacter) && (0 < strlen(lpPktDepositPwd->m_cPasswd)))
{
Item::CDepositContainer& DepositContainer = lpCharacter->GetDeposit();
m_DetailLog.SetBefore("UID: %u\r\nServerGroup: %u\r\n\r\nStore Password: %s",
lpPktDepositPwd->m_dwUID, lpPktDepositPwd->m_dwServerGroup, DepositContainer.GetPassword());
m_DetailLog.SetAfter("Store Password: %s", lpPktDepositPwd->m_cPasswd);
m_DetailLog.InsertLog(m_MyLogID);
DepositContainer.SetPassword(lpPktDepositPwd->m_cPasswd, lpPktDepositPwd->PASSWORD_LENGTH);
lpCharacter->OnChangedInfo(CModifyCharacter::ON_EXTRA);
SendResult(PktAdminMgr::PktResult::Success_DepositPasswd);
}
}
else
{
SendResult( PktAdminMgr::PktResult::Err_NotFoundAgentDispatch );
ERRLOG0(g_Log, "서버 디스 패치를 찾을 수 없습니다");
}
return true;
}
// 해당 캐릭터이름이 디비에 존재하는지 확인한다.
bool CRylAdminMgrDispatch::PktCheckName(PktBase* lpPktBase)
{
PktAdminMgr::PktCheckName* lpPktCheckName = static_cast<PktAdminMgr::PktCheckName*>(lpPktBase);
CGameDB* lpGameDB = CAgentServerTable::GetInstance().GetGameDB(lpPktCheckName->m_dwServerGroup);
if(NULL != lpGameDB)
{
bool bIsUse = lpGameDB->UseCharacterName( lpPktCheckName->m_szCharacterName );
if( bIsUse )
{
SendResult( PktAdminMgr::PktResult::Err_NotUseName ); // 사용할수 없는 캐릭터 이름
}
else
{
SendResult( PktAdminMgr::PktResult::Success_UseName ); // 사용할수 있는 캐릭터 이름.
}
}
return true;
}
// 캐릭터 이름바꾸기..
bool CRylAdminMgrDispatch::PktChangeName(PktBase* lpPktBase)
{
PktAdminMgr::PktChangeName* lpPktChangeName = static_cast<PktAdminMgr::PktChangeName*>(lpPktBase);
CRylAgentServerDispatch* lpAgentDispatch =
CAgentServerTable::GetInstance().GetDispatch(lpPktChangeName->m_dwServerGroup);
if (NULL != lpAgentDispatch)
{
CModifyCharacter* lpCharacter =
lpAgentDispatch->GetModifyCharacterMgr().GetCharacter(lpPktChangeName->m_dwCID);
if (NULL != lpCharacter)
{
CString strBefore;
strBefore.Format("UID: %u\r\nCID: %u\r\nServerGroup: %u\r\n\r\nCharacter Name: %s",
lpPktChangeName->m_dwUID, lpPktChangeName->m_dwCID,
lpPktChangeName->m_dwServerGroup, lpCharacter->GetCharacterName());
bool bIsReleased = true;
CBuffer* lpBuffer = CREATE_BUFFER(GetBufferFactory(), sizeof(PktAgentServer::PktAdminToolGetData));
PktAgentServer::PktAdminToolGetData* lpPktAdminToolGetData =
reinterpret_cast<PktAgentServer::PktAdminToolGetData*>(lpBuffer->begin());
lpPktAdminToolGetData->m_cType = PktAgentServer::PktAdminToolGetData::CHANGE_CHAR_NAME;
lpPktAdminToolGetData->m_dwUID = lpPktChangeName->m_dwUID;
lpPktAdminToolGetData->m_dwCID = lpPktChangeName->m_dwCID;
lpPktAdminToolGetData->m_dwRequestKey = lpPktChangeName->m_dwRequest;
strncpy(lpPktAdminToolGetData->m_szName,
lpPktChangeName->m_szCharacterName, PktAdminMgr::MAX_NAME);
if (false == PacketWrap::WrapHeader(lpBuffer,
sizeof(PktAgentServer::PktAdminToolGetData), CmdAdminToolGetData, 0, 0))
{
ERRLOG0(g_Log, "캐릭명 변경 패킷 랩핑 실패");
bIsReleased = false;
}
else
{
if (false == lpAgentDispatch->Send(lpBuffer))
{
ERRLOG0(g_Log, "캐릭명 변경 패킷 보내기 실패");
bIsReleased = false;
}
}
if (false == bIsReleased)
{
SAFE_RELEASE_BUFFER(lpBuffer);
}
}
else
{
SendResult(PktAdminMgr::PktResult::Err_Invalid_Character);
}
}
return true;
}
// 관리자 창고에 아이템을 추가한다.
bool CRylAdminMgrDispatch::PktAdminStoreInsert( PktBase* lpPktBase )
{
PktAdminMgr::PktAdminStoreInsert* lpPktAck = static_cast< PktAdminMgr::PktAdminStoreInsert* >( lpPktBase );
unsigned long dwUID = 0;
char szQuery[ CDBAdminTool::MAX_QUERY_LENGTH ];
char szName [ 20 ];
if( lpPktAck->m_cServerIdx == lpPktAck->EMPTY_SERVERID )
{
strncpy( szName, m_szAccount, 20 );
}
else
{
strncpy( szName, lpPktAck->m_szOwnerName, 20 );
}
_snprintf( szQuery, CDBAdminTool::MAX_QUERY_LENGTH, "INSERT INTO TblAdminStore( server, owner, ItemName ) VALUES( %d, '%s', '%s' )",
lpPktAck->m_cServerIdx, szName, lpPktAck->m_szItemName );
if( CDBAdminTool::GetInstance().ExecuteQuery( szQuery ) )
{ // 관리자 창고 기본정보를 채워놓고...
_snprintf( szQuery, CDBAdminTool::MAX_QUERY_LENGTH, "SELECT uid FROM TblAdminStore ORDER BY uid DESC" );
if( CDBAdminTool::GetInstance().ExecuteQueryGetData( szQuery, &dwUID ) )
{ // 지금 추가된 창고 uid를 가져온다.. 다른 좋은 방법있으면 바꿀것.. ㅡ.ㅡa
_snprintf( szQuery, CDBAdminTool::MAX_QUERY_LENGTH, "SELECT ItemInfo FROM TblAdminStore WHERE uid=%d", dwUID );
if( CDBAdminTool::GetInstance().ExecuteQuery( szQuery, OleDB::Rowset_Update ) )
{ // 얻어온 uid로 아이템 정보를 binary로 써넣자~~~
if( !CDBAdminTool::GetInstance().SetBinaryData( 1, ( OleDB::LPSET_BINARY )lpPktAck->m_binItemInfo ) )
{
SendResult( PktAdminMgr::PktResult::Err_AdminStore );
return true;
}
}
}
}
bool bIsReleased = true;
CBuffer* lpBuffer = CREATE_BUFFER(GetBufferFactory(), sizeof(PktAdminMgr::PktAdminStoreInsertAck));
PktAdminMgr::PktAdminStoreInsertAck* lpPktStore =
reinterpret_cast<PktAdminMgr::PktAdminStoreInsertAck*>(lpBuffer->begin());
lpPktStore->m_dwStoreUID = dwUID;
lpPktStore->m_cServerIdx = lpPktAck->m_cServerIdx;
strncpy(lpPktStore->m_szItemName, lpPktAck->m_szItemName, PktAdminMgr::MAX_ITEM_NAME);
strncpy(lpPktStore->m_szOwnerName, szName, PktAdminMgr::MAX_NAME);
if (false == PacketWrap::WrapHeader(lpBuffer,
sizeof(PktAdminMgr::PktAdminStoreInsertAck), PktAdminMgr::PktCMD::PktAdminStoreInsertAck, 0, 0))
{
ERRLOG0(g_Log, "수동으로 패킷을 릴리스합니다.");
bIsReleased = false;
}
else
{
if (false == GetSession().SendPending(lpBuffer))
{
ERRLOG0(g_Log, "수동으로 패킷을 릴리스합니다.");
bIsReleased = false;
}
}
if (false == bIsReleased)
{
SAFE_RELEASE_BUFFER(lpBuffer);
}
return true;
}
bool CRylAdminMgrDispatch::PktUpdateAdminStore( PktBase* lpPktBase )
{
PktAdminMgr::PktUpdateAdminStore* lpPktAck = static_cast< PktAdminMgr::PktUpdateAdminStore* >( lpPktBase );
char szQuery[ CDBAdminTool::MAX_QUERY_LENGTH ];
_snprintf( szQuery, CDBAdminTool::MAX_QUERY_LENGTH, "SELECT ItemInfo FROM TblAdminStore WHERE uid=%d", lpPktAck->m_dwStoreUID );
if( CDBAdminTool::GetInstance().ExecuteQuery( szQuery, OleDB::Rowset_Update ) )
{
if( !CDBAdminTool::GetInstance().SetBinaryData( 1, ( OleDB::LPSET_BINARY )lpPktAck->m_binItemInfo ) )
{
SendResult( PktAdminMgr::PktResult::Err_AdminStore );
return true;
}
}
SendResult(PktAdminMgr::PktResult::Success_UpdateAdminStore);
return true;
}
bool CRylAdminMgrDispatch::SendAdminStoreList()
{
#pragma pack(1)
struct In_Data
{
unsigned long m_dwStoreUID;
unsigned char m_cServerID;
char m_szOwnerName[PktAdminMgr::MAX_NAME];
char m_szItemName[PktAdminMgr::MAX_ITEM_NAME];
};
#pragma pack()
CCumulateBuffer cBuffer(sizeof(PktAdminMgr::PktAdminStoreInsertAck) * 20, &GetSession());
char szQuery[CDBAdminTool::MAX_QUERY_LENGTH];
_snprintf(szQuery,
CDBAdminTool::MAX_QUERY_LENGTH, "SELECT uid, server, Owner, ItemName FROM TblAdminStore");
if(CDBAdminTool::GetInstance().ExecuteQuery(szQuery))
{
In_Data In_Store;
while(CDBAdminTool::GetInstance().GetData(&In_Store))
{
char* lpBuffer = cBuffer.GetBuffer(sizeof(PktAdminMgr::PktAdminStoreInsertAck));
PktAdminMgr::PktAdminStoreInsertAck* lpPktAck =
reinterpret_cast<PktAdminMgr::PktAdminStoreInsertAck*>(lpBuffer);
lpPktAck->m_dwStoreUID = In_Store.m_dwStoreUID;
lpPktAck->m_cServerIdx = In_Store.m_cServerID;
strncpy(lpPktAck->m_szOwnerName, In_Store.m_szOwnerName, PktAdminMgr::MAX_NAME);
strncpy(lpPktAck->m_szItemName, In_Store.m_szItemName, PktAdminMgr::MAX_ITEM_NAME);
PacketWrap::WrapHeader(lpBuffer,
sizeof(PktAdminMgr::PktAdminStoreInsertAck), PktAdminMgr::PktCMD::PktAdminStoreInsertAck, 0, 0);
ZeroMemory(&In_Store, sizeof(In_Data));
}
}
return true;
}
bool CRylAdminMgrDispatch::PktAdminStoreDelete( PktBase* lpPktBase )
{
PktAdminMgr::PktAdminStoreDelete* lpPktStore = static_cast< PktAdminMgr::PktAdminStoreDelete* >( lpPktBase );
char szQuery[ CDBAdminTool::QUERY_BUFFER_LEN ];
_snprintf( szQuery, CDBAdminTool::QUERY_BUFFER_LEN, "DELETE TblAdminStore WHERE uid = %d", lpPktStore->m_dwStoreUID );
if( !CDBAdminTool::GetInstance().ExecuteQuery( szQuery ) )
{
SendResult( PktAdminMgr::PktResult::Err_AdminStoreDelete );
return true;
}
bool bIsReleased = true;
CBuffer* lpBuffer = CREATE_BUFFER(GetBufferFactory(), sizeof(PktAdminMgr::PktAdminStoreDelete));
PktAdminMgr::PktAdminStoreDelete* lpPktAck =
reinterpret_cast<PktAdminMgr::PktAdminStoreDelete*>(lpBuffer->begin());
lpPktAck->m_dwStoreUID = lpPktStore->m_dwStoreUID;
if (false == PacketWrap::WrapHeader(lpBuffer,
sizeof(PktAdminMgr::PktAdminStoreDelete), PktAdminMgr::PktCMD::PktAdminStoreDeleteAck, 0, 0))
{
ERRLOG0(g_Log, "수동으로 패킷을 릴리스합니다.");
bIsReleased = false;
}
else
{
if (false == GetSession().SendPending(lpBuffer))
{
ERRLOG0(g_Log, "수동으로 패킷을 릴리스합니다.");
bIsReleased = false;
}
}
if (false == bIsReleased)
{
SAFE_RELEASE_BUFFER(lpBuffer);
}
return true;
}
bool CRylAdminMgrDispatch::PktGetAdminStoreItem(PktBase* lpPktBase)
{
PktAdminMgr::PktGetAdminStoreItem* lpPktGetStoreItem =
static_cast<PktAdminMgr::PktGetAdminStoreItem*>(lpPktBase);
char szQuery[CDBAdminTool::QUERY_BUFFER_LEN];
bool bIsReleased = true;
CBuffer* lpBuffer = CREATE_BUFFER(GetBufferFactory(), sizeof(PktAdminMgr::PktGetAdminStoreItemAck));
if(NULL == lpBuffer)
{
ERRLOG0(g_Log, "버퍼 생성 실패");
return false;
}
PktAdminMgr::PktGetAdminStoreItemAck* lpPktAck =
reinterpret_cast<PktAdminMgr::PktGetAdminStoreItemAck*>(lpBuffer->begin());
_snprintf(szQuery, CDBAdminTool::QUERY_BUFFER_LEN,
"SELECT ItemInfo FROM TblAdminStore WHERE uid = %d", lpPktGetStoreItem->m_dwStoreUID);
if (CDBAdminTool::GetInstance().ExecuteQueryGetData(szQuery, lpPktAck->m_binItemInfo))
{
unsigned long dwInfoLength = *reinterpret_cast<unsigned long*>(lpPktAck->m_binItemInfo);
if (PktAdminMgr::PktGetAdminStoreItemAck::MAX_ITEM_INFO > dwInfoLength)
{
lpPktAck->m_cType = lpPktGetStoreItem->m_cType;
lpPktAck->m_dwStoreUID = lpPktGetStoreItem->m_dwStoreUID;
if (false == PacketWrap::WrapHeader(lpBuffer,
sizeof(PktAdminMgr::PktGetAdminStoreItemAck), PktAdminMgr::PktCMD::PktGetAdminStoreItemAck, 0, 0))
{
ERRLOG0(g_Log, "수동으로 패킷을 릴리스합니다.");
bIsReleased = false;
}
else
{
if (false == GetSession().SendPending(lpBuffer))
{
ERRLOG0(g_Log, "수동으로 패킷을 릴리스합니다.");
bIsReleased = false;
}
}
return true;
}
}
if (false == bIsReleased)
{
SAFE_RELEASE_BUFFER(lpBuffer);
}
return true;
}
bool CRylAdminMgrDispatch::PktForcedDis(PktBase *lpPktBase)
{
LPPktUK lpPktUK = static_cast<LPPktUK>(lpPktBase);
// 현재 운영서버와 연결된 중계서버로 강제 접속 끊기 커맨드 보내기
for(unsigned int nIndex = 0; nIndex < CAgentServerTable::MAX_AGENT_SERVER; ++nIndex)
{
CRylAgentServerDispatch* lpAgentDispatch =
CAgentServerTable::GetInstance().GetDispatch(nIndex);
if (NULL != lpAgentDispatch)
{
bool bIsReleased = true;
CBuffer* lpBuffer = CREATE_BUFFER(GetBufferFactory(), sizeof(LPPktUK));
*reinterpret_cast<LPPktUK>(lpBuffer->wr_ptr()) = *lpPktUK;
if (false == PacketWrap::WrapHeader(lpBuffer, sizeof(PktUK), CmdUserKill, 0, 0))
{
ERRLOG0(g_Log, "강제 접속 끊기 패킷 랩핑 실패");
bIsReleased = false;
}
else
{
if (false == lpAgentDispatch->Send(lpBuffer))
{
ERRLOG0(g_Log, "강제 접속 끊기 패킷 보내기 실패");
bIsReleased = false;
}
else
{
m_DetailLog.SetBefore("not exist contents");
m_DetailLog.SetAfter("[Forced Disconnect]\r\nUID: %u", lpPktUK->m_dwUserID);
m_DetailLog.InsertLog(m_MyLogID);
}
}
if (false == bIsReleased)
{
SAFE_RELEASE_BUFFER(lpBuffer);
}
}
}
return true;
}
bool CRylAdminMgrDispatch::PktGuildSearch(PktBase *lpPktBase)
{
#pragma pack(1)
struct In_GuildList
{
unsigned long m_dwGID;
unsigned int m_nOldServerID;
char m_szName[PktAdminMgr::MAX_NAME];
int m_nLevel;
unsigned long m_dwFame;
unsigned long m_dwGold;
int m_nNation;
int m_nMemberNum;
};
#pragma pack()
PktAdminMgr::PktGuildSearch* lpPktGuildSearch = static_cast<PktAdminMgr::PktGuildSearch*>(lpPktBase);
bool bExistData = false;
// 검색 타입에 맞는 쿼리 만들기
const int MAX_WHERE = 256;
char szQuery[CDBAdminTool::QUERY_BUFFER_LEN];
char szWHERE[MAX_WHERE];
switch(lpPktGuildSearch->m_cSearchType)
{
case PktAdminMgr::PktGuildSearch::ALLGROUP_ALLGUILD:
_snprintf(szWHERE, MAX_WHERE, "");
break;
case PktAdminMgr::PktGuildSearch::ALLGROUP_SPEGUILD_GID:
_snprintf(szWHERE, MAX_WHERE, "WHERE A.nGuildID = %s", lpPktGuildSearch->m_szSearchValue);
break;
case PktAdminMgr::PktGuildSearch::ALLGROUP_SPEGUILD_NAME:
_snprintf(szWHERE, MAX_WHERE, "WHERE A.strGuildName LIKE '%%%s%%'", lpPktGuildSearch->m_szSearchValue);
break;
case PktAdminMgr::PktGuildSearch::SPEGROUP_ALLGUILD:
_snprintf(szWHERE, MAX_WHERE, "");
break;
case PktAdminMgr::PktGuildSearch::SPEGROUP_SPEGUILD_GID:
_snprintf(szWHERE, MAX_WHERE, "WHERE A.nGuildID = %s", lpPktGuildSearch->m_szSearchValue);
break;
case PktAdminMgr::PktGuildSearch::SPEGROUP_SPEGUILD_NAME:
_snprintf(szWHERE, MAX_WHERE, "WHERE A.strGuildName LIKE '%%%s%%'", lpPktGuildSearch->m_szSearchValue);
break;
default:
break;
}
_snprintf(szQuery, CDBAdminTool::QUERY_BUFFER_LEN, QUERYZ::GetGuildInfo, szWHERE);
In_GuildList GuildList;
CGameDB* lpGameDB = CAgentServerTable::GetInstance().GetGameDB(lpPktGuildSearch->m_dwServerGroup);
if(NULL != lpGameDB)
{
ZeroMemory(&GuildList, sizeof(In_GuildList));
if(true == lpGameDB->ExecuteQuery(szQuery))
{
CCumulateBuffer cBuffer(sizeof(PktAdminMgr::PktGuildSearchAck) * 30, &GetSession());
while(lpGameDB->GetData(&GuildList))
{
char* lpBuffer = cBuffer.GetBuffer(sizeof(PktAdminMgr::PktGuildSearchAck));
PktAdminMgr::PktGuildSearchAck* lpPktAck =
reinterpret_cast<PktAdminMgr::PktGuildSearchAck*>(lpBuffer);
ZeroMemory(lpPktAck, sizeof(PktAdminMgr::PktGuildSearchAck));
lpPktAck->m_dwGID = GuildList.m_dwGID;
lpPktAck->m_nOldServerID = GuildList.m_nOldServerID;
lpPktAck->m_dwLevel = GuildList.m_nLevel;
lpPktAck->m_dwFame = GuildList.m_dwFame;
lpPktAck->m_dwGold = GuildList.m_dwGold;
lpPktAck->m_dwNation = GuildList.m_nNation;
lpPktAck->m_dwMemberNum = GuildList.m_nMemberNum;
lpPktAck->m_dwServerGroup = lpPktGuildSearch->m_dwServerGroup;
strncpy(lpPktAck->m_szName, GuildList.m_szName, PktAdminMgr::MAX_NAME);
PacketWrap::WrapHeader(lpBuffer,
sizeof(PktAdminMgr::PktGuildSearchAck), PktAdminMgr::PktCMD::PktGuildSearchAck, 0, 0);
ZeroMemory(&GuildList, sizeof(In_GuildList));
bExistData = true;
}
}
else
{
ERRLOG2(g_Log, "쿼리 실패. qry- %s, err- %s", szQuery, lpGameDB->GetErrorString());
}
}
if(!bExistData)
{
//SendResult(PktAdminMgr::PktResult::Result_Null);
}
return true;
}
bool CRylAdminMgrDispatch::PktRequestGuildMemberList(PktBase* lpPktBase)
{
#pragma pack(1)
struct In_GuildMemberInfo
{
unsigned long m_dwGID;
unsigned long m_dwCID;
int m_nPostion;
int m_nPositionInGuild;
char m_szLeaveGuildTime[PktAdminMgr::MAX_TIME];
char m_szCharName[PktAdminMgr::PktRequestGuildMemberListAck::MAX_NAME];
int m_nLevel;
unsigned long m_dwFame;
unsigned short m_nClass;
unsigned long m_dwGold;
};
#pragma pack()
PktAdminMgr::PktRequestGuildMemberList* lpPktGuildMemberList =
static_cast<PktAdminMgr::PktRequestGuildMemberList*>(lpPktBase);
char szQuery[CDBAdminTool::QUERY_BUFFER_LEN];
char szFormat[256];
sprintf(szFormat, "%u", lpPktGuildMemberList->m_dwGID);
_snprintf(szQuery, CDBAdminTool::QUERY_BUFFER_LEN, QUERYZ::GetGuildMemberList, szFormat);
In_GuildMemberInfo GuildMemberInfo;
ZeroMemory(&GuildMemberInfo, sizeof(In_GuildMemberInfo));
CGameDB* lpGameDB = CAgentServerTable::GetInstance().GetGameDB(lpPktGuildMemberList->m_dwServerGroup);
if(NULL != lpGameDB)
{
if(lpGameDB->ExecuteQuery(szQuery))
{
CCumulateBuffer cBuffer(sizeof(In_GuildMemberInfo) * 20, &GetSession());
while(lpGameDB->GetData(&GuildMemberInfo))
{
char* lpBuffer = cBuffer.GetBuffer(sizeof(PktAdminMgr::PktRequestGuildMemberListAck));
PktAdminMgr::PktRequestGuildMemberListAck* lpPktAck =
reinterpret_cast<PktAdminMgr::PktRequestGuildMemberListAck*>(lpBuffer);
ZeroMemory(lpPktAck, sizeof(lpPktAck));
lpPktAck->m_dwGID = GuildMemberInfo.m_dwGID;
lpPktAck->m_dwCID = GuildMemberInfo.m_dwCID;
lpPktAck->m_nPosition = GuildMemberInfo.m_nPostion;
lpPktAck->m_nPositionInGuild = GuildMemberInfo.m_nPositionInGuild;
strncpy(lpPktAck->m_szLeaveGuildTime,
GuildMemberInfo.m_szLeaveGuildTime, PktAdminMgr::MAX_TIME);
strncpy(lpPktAck->m_szCharName, GuildMemberInfo.m_szCharName,
PktAdminMgr::PktRequestGuildMemberListAck::MAX_NAME);
lpPktAck->m_nLevel = GuildMemberInfo.m_nLevel;
lpPktAck->m_dwFame = GuildMemberInfo.m_dwFame;
lpPktAck->m_nClass = GuildMemberInfo.m_nClass;
lpPktAck->m_dwGold = GuildMemberInfo.m_dwGold;
PacketWrap::WrapHeader(lpBuffer,sizeof(PktAdminMgr::PktRequestGuildMemberListAck),
PktAdminMgr::PktCMD::PktRequestGuildMemberListAck, 0, 0);
ZeroMemory(&GuildMemberInfo, sizeof(In_GuildMemberInfo));
}
}
}
return true;
}
bool CRylAdminMgrDispatch::PktGuildRestoreDataList(PktBase* lpPktBase)
{
#pragma pack(1)
struct In_GuildRestoreData
{
unsigned long m_dwGID;
char m_szGuildName[PktAdminMgr::MAX_NAME];
unsigned long m_dwGold;
char m_szDeleteDate[PktAdminMgr::MAX_TIME];
};
#pragma pack()
bool bExistData = false;
PktAdminMgr::PktGuildRestoreDataList* lpPktGuildRestoreDataList =
static_cast<PktAdminMgr::PktGuildRestoreDataList*>(lpPktBase);
char szQuery[CDBAdminTool::QUERY_BUFFER_LEN];
_snprintf(szQuery, CDBAdminTool::QUERY_BUFFER_LEN, QUERYZ::GetGuildRestoreData);
In_GuildRestoreData GuildRestoreData;
ZeroMemory(&GuildRestoreData, sizeof(In_GuildRestoreData));
CGameDB* lpGameDB = CAgentServerTable::GetInstance().GetGameDB(lpPktGuildRestoreDataList->m_dwServerGroup);
if(NULL != lpGameDB)
{
if(lpGameDB->ExecuteQuery(szQuery))
{
CCumulateBuffer cBuffer(sizeof(In_GuildRestoreData) * 20, &GetSession());
while(lpGameDB->GetData(&GuildRestoreData))
{
char* lpBuffer = cBuffer.GetBuffer(sizeof(PktAdminMgr::PktGuildRestoreDataListAck));
PktAdminMgr::PktGuildRestoreDataListAck* lpPktAck =
reinterpret_cast<PktAdminMgr::PktGuildRestoreDataListAck*>(lpBuffer);
ZeroMemory(lpPktAck, sizeof(lpPktAck));
lpPktAck->m_dwServerGroup = lpPktGuildRestoreDataList->m_dwServerGroup;
lpPktAck->m_dwGID = GuildRestoreData.m_dwGID;
strncpy(lpPktAck->m_szGuildName,
GuildRestoreData.m_szGuildName, PktAdminMgr::MAX_NAME);
lpPktAck->m_dwGold = GuildRestoreData.m_dwGold;
strncpy(lpPktAck->m_szDeleteDate,
GuildRestoreData.m_szDeleteDate, PktAdminMgr::MAX_TIME);
PacketWrap::WrapHeader(lpBuffer,sizeof(PktAdminMgr::PktGuildRestoreDataListAck),
PktAdminMgr::PktCMD::PktGuildRestoreDataListAck, 0, 0);
ZeroMemory(&GuildRestoreData, sizeof(In_GuildRestoreData));
bExistData = true;
}
}
}
if(!bExistData)
{
//SendResult(PktAdminMgr::PktResult::Result_Null);
}
return true;
}
bool CRylAdminMgrDispatch::PktFortSearch(PktBase *lpPktBase)
{
#pragma pack(1)
struct In_FortList
{
unsigned long m_dwCampID;
unsigned long m_dwGuildID;
char m_szGuildName[PktAdminMgr::MAX_NAME];
unsigned long m_dwHP;
unsigned char m_cZone;
unsigned char m_cChannel;
unsigned short m_usObjectType;
unsigned char m_cState;
unsigned char m_cSubState;
unsigned char m_cUpgradeStep;
char m_szRemainTime[PktAdminMgr::MAX_TIME];
char m_szLastUseTime[PktAdminMgr::MAX_TIME];
float m_fPosX;
float m_fPosY;
float m_fPosZ;
unsigned char m_cMaterial;
unsigned char m_cSiegeCount;
char m_aryRight[CastleRight::MAX_RIGHT_NUM];
};
#pragma pack()
PktAdminMgr::PktFortSearch* lpPktFortSearch = static_cast<PktAdminMgr::PktFortSearch*>(lpPktBase);
bool bExistData = false;
// 검색 타입에 맞는 쿼리 만들기
const int MAX_WHERE = 256;
char szQuery[CDBAdminTool::QUERY_BUFFER_LEN];
char szWHERE[MAX_WHERE];
switch(lpPktFortSearch->m_cSearchType)
{
case PktAdminMgr::PktFortSearch::ALLSERVER_ALLZONE_ALLGUILD:
_snprintf(szWHERE, MAX_WHERE, "WHERE A.tnZone = %u", lpPktFortSearch->m_dwZoneGroup);
break;
case PktAdminMgr::PktFortSearch::ALLSERVER_ALLZONE_SPEGUILD_GID:
_snprintf(szWHERE, MAX_WHERE, "WHERE A.nGuildID = %s AND A.tnZone = %u", lpPktFortSearch->m_szSearchValue, lpPktFortSearch->m_dwZoneGroup);
break;
case PktAdminMgr::PktFortSearch::ALLSERVER_ALLZONE_SPEGUILD_NAME:
_snprintf(szWHERE, MAX_WHERE, "WHERE B.strGuildName LIKE '%%%s%%' AND A.tnZone = %u", lpPktFortSearch->m_szSearchValue, lpPktFortSearch->m_dwZoneGroup);
break;
case PktAdminMgr::PktFortSearch::ALLSERVER_SPEZONE_ALLGUILD:
_snprintf(szWHERE, MAX_WHERE, "WHERE A.tnZone = %u", lpPktFortSearch->m_dwZoneGroup);
break;
case PktAdminMgr::PktFortSearch::ALLSERVER_SPEZONE_SPEGUILD_GID:
_snprintf(szWHERE, MAX_WHERE, "WHERE A.tnZone = %u AND A.nGuildID = %s", lpPktFortSearch->m_dwZoneGroup, lpPktFortSearch->m_szSearchValue);
break;
case PktAdminMgr::PktFortSearch::ALLSERVER_SPEZONE_SPEGUILD_NAME:
_snprintf(szWHERE, MAX_WHERE, "WHERE B.tnZone = %u AND A.strGuildName = %s", lpPktFortSearch->m_dwZoneGroup, lpPktFortSearch->m_szSearchValue);
break;
case PktAdminMgr::PktFortSearch::SPESERVER_ALLZONE_ALLGUILD:
_snprintf(szWHERE, MAX_WHERE, "WHERE A.tnZone = %u", lpPktFortSearch->m_dwZoneGroup);
break;
case PktAdminMgr::PktFortSearch::SPESERVER_ALLZONE_SPEGUILD_GID:
_snprintf(szWHERE, MAX_WHERE, "WHERE A.nGuildID = %s AND A.tnZone = %u", lpPktFortSearch->m_szSearchValue, lpPktFortSearch->m_dwZoneGroup);
break;
case PktAdminMgr::PktFortSearch::SPESERVER_ALLZONE_SPEGUILD_NAME:
_snprintf(szWHERE, MAX_WHERE, "WHERE B.strGuildName LIKE '%%%s%%' AND A.tnZone = %u", lpPktFortSearch->m_szSearchValue, lpPktFortSearch->m_dwZoneGroup);
break;
case PktAdminMgr::PktFortSearch::SPESERVER_SPEZONE_ALLGUILD:
_snprintf(szWHERE, MAX_WHERE, "WHERE A.tnZone = %u", lpPktFortSearch->m_dwZoneGroup);
break;
case PktAdminMgr::PktFortSearch::SPESERVER_SPEZONE_SPEGUILD_GID:
_snprintf(szWHERE, MAX_WHERE, "WHERE A.tnZone = %u AND A.nGuildID = %s", lpPktFortSearch->m_dwZoneGroup, lpPktFortSearch->m_szSearchValue);
break;
case PktAdminMgr::PktFortSearch::SPESERVER_SPEZONE_SPEGUILD_NAME:
_snprintf(szWHERE, MAX_WHERE, "WHERE B.tnZone = %u AND A.strGuildName = %s", lpPktFortSearch->m_dwZoneGroup, lpPktFortSearch->m_szSearchValue);
break;
default:
break;
}
_snprintf(szQuery, CDBAdminTool::QUERY_BUFFER_LEN, QUERYZ::GetFortInfo, szWHERE);
In_FortList FortList;
CGameDB* lpGameDB = CAgentServerTable::GetInstance().GetGameDB(lpPktFortSearch->m_dwServerGroup);
if(NULL != lpGameDB)
{
ZeroMemory(&FortList, sizeof(In_FortList));
if(true == lpGameDB->ExecuteQuery(szQuery))
{
CCumulateBuffer cBuffer(sizeof(PktAdminMgr::PktFortSearchAck) * 30, &GetSession());
while(lpGameDB->GetData(&FortList))
{
char* lpBuffer = cBuffer.GetBuffer(sizeof(PktAdminMgr::PktFortSearchAck));
PktAdminMgr::PktFortSearchAck* lpPktAck =
reinterpret_cast<PktAdminMgr::PktFortSearchAck*>(lpBuffer);
ZeroMemory(lpPktAck, sizeof(PktAdminMgr::PktFortSearchAck));
lpPktAck->m_dwCampID = FortList.m_dwCampID;
lpPktAck->m_dwGuildID = FortList.m_dwGuildID;
lpPktAck->m_dwHP = FortList.m_dwHP;
lpPktAck->m_cZone = FortList.m_cZone;
lpPktAck->m_cChannel = FortList.m_cChannel;
lpPktAck->m_usObjectType = FortList.m_usObjectType;
lpPktAck->m_cState = FortList.m_cState;
lpPktAck->m_cSubState = FortList.m_cSubState;
lpPktAck->m_cUpgradeStep = FortList.m_cUpgradeStep;
lpPktAck->m_fPosX = FortList.m_fPosX;
lpPktAck->m_fPosY = FortList.m_fPosY;
lpPktAck->m_fPosZ = FortList.m_fPosZ;
lpPktAck->m_cMaterial = FortList.m_cMaterial;
lpPktAck->m_cSiegeCount = FortList.m_cSiegeCount;
lpPktAck->m_dwServerGroup = lpPktFortSearch->m_dwServerGroup;
lpPktAck->m_cRight = FortList.m_aryRight[0];
strncpy(lpPktAck->m_szRemainTime, FortList.m_szRemainTime, PktAdminMgr::MAX_TIME);
strncpy(lpPktAck->m_szLastUseTime, FortList.m_szLastUseTime, PktAdminMgr::MAX_TIME);
strncpy(lpPktAck->m_szGuildName, FortList.m_szGuildName, PktAdminMgr::MAX_NAME);
PacketWrap::WrapHeader(lpBuffer,
sizeof(PktAdminMgr::PktFortSearchAck), PktAdminMgr::PktCMD::PktFortSearchAck, 0, 0);
ZeroMemory(&FortList, sizeof(In_FortList));
bExistData = true;
}
}
else
{
ERRLOG2(g_Log, "쿼리 실패. qry- %s, err- %s", szQuery, lpGameDB->GetErrorString());
}
}
if(!bExistData)
{
//SendResult(PktAdminMgr::PktResult::Result_Null);
}
return true;
}
bool CRylAdminMgrDispatch::PktMiningCamp(PktBase* lpPktBase)
{
#pragma pack(1)
struct In_MiningCampList
{
unsigned long m_dwCampID;
unsigned short m_sMineralID;
unsigned short m_sAmount;
char m_cFlag;
};
#pragma pack()
PktAdminMgr::PktMiningCamp* lpPktMiningCamp = static_cast<PktAdminMgr::PktMiningCamp*>(lpPktBase);
bool bExistData = false;
// 검색 타입에 맞는 쿼리 만들기
const int MAX_WHERE = 256;
char szQuery[CDBAdminTool::QUERY_BUFFER_LEN];
char szWHERE[MAX_WHERE];
_snprintf(szWHERE, MAX_WHERE, "WHERE nCampID = %u", lpPktMiningCamp->m_dwCampID);
_snprintf(szQuery, CDBAdminTool::QUERY_BUFFER_LEN, QUERYZ::GetMiningCamp, szWHERE);
In_MiningCampList MiningCampList;
CGameDB* lpGameDB = CAgentServerTable::GetInstance().GetGameDB(lpPktMiningCamp->m_dwServerGroup);
if(NULL != lpGameDB)
{
ZeroMemory(&MiningCampList, sizeof(In_MiningCampList));
if(true == lpGameDB->ExecuteQuery(szQuery))
{
CCumulateBuffer cBuffer(sizeof(PktAdminMgr::PktMiningCampAck) * 30, &GetSession());
while(lpGameDB->GetData(&MiningCampList))
{
char* lpBuffer = cBuffer.GetBuffer(sizeof(PktAdminMgr::PktMiningCampAck));
PktAdminMgr::PktMiningCampAck* lpPktAck =
reinterpret_cast<PktAdminMgr::PktMiningCampAck*>(lpBuffer);
ZeroMemory(lpPktAck, sizeof(PktAdminMgr::PktMiningCampAck));
lpPktAck->m_dwCampID = MiningCampList.m_dwCampID;
lpPktAck->m_sMineralID = MiningCampList.m_sMineralID;
lpPktAck->m_sAmount = MiningCampList.m_sAmount;
lpPktAck->m_cFlag = MiningCampList.m_cFlag;
PacketWrap::WrapHeader(lpBuffer,
sizeof(PktAdminMgr::PktMiningCampAck), PktAdminMgr::PktCMD::PktMiningCampAck, 0, 0);
ZeroMemory(&MiningCampList, sizeof(In_MiningCampList));
bExistData = true;
}
}
else
{
ERRLOG2(g_Log, "쿼리 실패. qry- %s, err- %s", szQuery, lpGameDB->GetErrorString());
}
}
if(!bExistData)
{
//SendResult(PktAdminMgr::PktResult::Result_Null);
}
return true;
}
bool CRylAdminMgrDispatch::PktShopCamp(PktBase* lpPktBase)
{
#pragma pack(1)
struct In_ShopCampList
{
unsigned long m_dwCampID;
char m_szItem[PktAdminMgr::MAX_ITEM_BUFFER];
unsigned long m_dwTempMoney;
char m_cTax;
};
#pragma pack()
PktAdminMgr::PktShopCamp* lpPktShopCamp = static_cast<PktAdminMgr::PktShopCamp*>(lpPktBase);
bool bExistData = false;
// 검색 타입에 맞는 쿼리 만들기
const int MAX_WHERE = 256;
char szQuery[CDBAdminTool::QUERY_BUFFER_LEN];
char szWHERE[MAX_WHERE];
_snprintf(szWHERE, MAX_WHERE, "WHERE CampID = %u", lpPktShopCamp->m_dwCampID);
_snprintf(szQuery, CDBAdminTool::QUERY_BUFFER_LEN, QUERYZ::GetShopCamp, szWHERE);
In_ShopCampList ShopCampList;
CGameDB* lpGameDB = CAgentServerTable::GetInstance().GetGameDB(lpPktShopCamp->m_dwServerGroup);
if(NULL != lpGameDB)
{
ZeroMemory(&ShopCampList, sizeof(In_ShopCampList));
if(true == lpGameDB->ExecuteQuery(szQuery))
{
CCumulateBuffer cBuffer(sizeof(PktAdminMgr::PktShopCampAck) * 30, &GetSession());
while(lpGameDB->GetData(&ShopCampList))
{
char* lpBuffer = cBuffer.GetBuffer(sizeof(PktAdminMgr::PktShopCampAck));
PktAdminMgr::PktShopCampAck* lpPktAck =
reinterpret_cast<PktAdminMgr::PktShopCampAck*>(lpBuffer);
ZeroMemory(lpPktAck, sizeof(PktAdminMgr::PktShopCampAck));
lpPktAck->m_dwCampID = ShopCampList.m_dwCampID;
lpPktAck->m_dwTempMoney = ShopCampList.m_dwTempMoney;
lpPktAck->m_cTax = ShopCampList.m_cTax;
lpPktAck->m_dwServerGroup = lpPktShopCamp->m_dwServerGroup;
memcpy(lpPktAck->m_szItem, ShopCampList.m_szItem, sizeof(char) * PktAdminMgr::MAX_ITEM_BUFFER);
PacketWrap::WrapHeader(lpBuffer,
sizeof(PktAdminMgr::PktShopCampAck), PktAdminMgr::PktCMD::PktShopCampAck, 0, 0);
ZeroMemory(&ShopCampList, sizeof(In_ShopCampList));
bExistData = true;
}
}
else
{
ERRLOG2(g_Log, "쿼리 실패. qry- %s, err- %s", szQuery, lpGameDB->GetErrorString());
}
}
if(!bExistData)
{
//SendResult(PktAdminMgr::PktResult::Result_Null);
}
return true;
}
bool CRylAdminMgrDispatch::PktShopCampGold(PktBase* lpPktBase)
{
PktAdminMgr::PktShopCampGold* lpPktShopCampGold = static_cast<PktAdminMgr::PktShopCampGold*>(lpPktBase);
bool bExistData = false;
// 검색 타입에 맞는 쿼리 만들기
char szQuery[CDBAdminTool::QUERY_BUFFER_LEN];
_snprintf(szQuery, CDBAdminTool::QUERY_BUFFER_LEN, "Update tblCampShopInfo Set TempMoney = %u where CampID = %u", lpPktShopCampGold->m_dwTempMoney, lpPktShopCampGold->m_dwCampID);
CGameDB* lpGameDB = CAgentServerTable::GetInstance().GetGameDB(lpPktShopCampGold->m_dwServerGroup);
if(NULL != lpGameDB)
{
if(false == lpGameDB->ExecuteQuery(szQuery))
{
ERRLOG2(g_Log, "쿼리 실패. qry- %s, err- %s", szQuery, lpGameDB->GetErrorString());
}
}
if(!bExistData)
{
//SendResult(PktAdminMgr::PktResult::Result_Null);
}
return true;
}
bool CRylAdminMgrDispatch::PktShopCampTax(PktBase* lpPktBase)
{
PktAdminMgr::PktShopCampTax* lpPktShopCampTax = static_cast<PktAdminMgr::PktShopCampTax*>(lpPktBase);
bool bExistData = false;
// 검색 타입에 맞는 쿼리 만들기
char szQuery[CDBAdminTool::QUERY_BUFFER_LEN];
_snprintf(szQuery, CDBAdminTool::QUERY_BUFFER_LEN, "Update tblCampShopInfo Set Tax = %u where CampID = %u", lpPktShopCampTax->m_dwTax, lpPktShopCampTax->m_dwCampID);
CGameDB* lpGameDB = CAgentServerTable::GetInstance().GetGameDB(lpPktShopCampTax->m_dwServerGroup);
if(NULL != lpGameDB)
{
if(false == lpGameDB->ExecuteQuery(szQuery))
{
ERRLOG2(g_Log, "쿼리 실패. qry- %s, err- %s", szQuery, lpGameDB->GetErrorString());
}
}
if(!bExistData)
{
//SendResult(PktAdminMgr::PktResult::Result_Null);
}
return true;
}
bool CRylAdminMgrDispatch::PktCastleSearch(PktBase* lpPktBase)
{
#pragma pack(1)
struct In_CastleList
{
unsigned long m_dwCastleID;
unsigned char m_cNation;
unsigned char m_cZone;
unsigned char m_cChannel;
unsigned char m_cName;
unsigned char m_cSiegeCount;
unsigned char m_cInvincibleCount;
unsigned short m_wTotalSiegeCount;
unsigned long m_dwTotalTaxMoney;
char m_aryRight[CastleRight::MAX_RIGHT_NUM];
float m_fPosInX;
float m_fPosInY;
float m_fPosInZ;
float m_fPosOutX;
float m_fPosOutY;
float m_fPosOutZ;
unsigned short m_wItemID;
unsigned char m_cItemNum;
};
#pragma pack()
PktAdminMgr::PktCastleSearch* lpPktCastleSearch = static_cast<PktAdminMgr::PktCastleSearch*>(lpPktBase);
bool bExistData = false;
// 검색 타입에 맞는 쿼리 만들기
const int MAX_WHERE = 256;
char szQuery[CDBAdminTool::QUERY_BUFFER_LEN];
char szWHERE[MAX_WHERE];
switch(lpPktCastleSearch->m_cSearchType)
{
case PktAdminMgr::PktCastleSearch::ALLSERVER_ALLZONE_ALLCASTLE:
_snprintf(szWHERE, MAX_WHERE, "WHERE tnZone = %u", lpPktCastleSearch->m_dwZoneGroup);
break;
case PktAdminMgr::PktCastleSearch::ALLSERVER_ALLZONE_SPECASTLE_ID:
_snprintf(szWHERE, MAX_WHERE, "WHERE tnZone = %u AND nCastleID = %s", lpPktCastleSearch->m_dwZoneGroup, lpPktCastleSearch->m_szSearchValue);
break;
case PktAdminMgr::PktCastleSearch::ALLSERVER_SPEZONE_ALLCASTLE:
_snprintf(szWHERE, MAX_WHERE, "WHERE tnZone = %u AND tnZone = %u", lpPktCastleSearch->m_dwZoneGroup, lpPktCastleSearch->m_dwZoneGroup);
break;
case PktAdminMgr::PktCastleSearch::ALLSERVER_SPEZONE_SPECASTLE_ID:
_snprintf(szWHERE, MAX_WHERE, "WHERE tnZone = %u AND nCastleID = %s", lpPktCastleSearch->m_dwZoneGroup, lpPktCastleSearch->m_szSearchValue);
break;
case PktAdminMgr::PktCastleSearch::SPESERVER_ALLZONE_ALLCASTLE:
_snprintf(szWHERE, MAX_WHERE, "WHERE tnZone = %u", lpPktCastleSearch->m_dwZoneGroup);
break;
case PktAdminMgr::PktCastleSearch::SPESERVER_ALLZONE_SPECASTLE_ID:
_snprintf(szWHERE, MAX_WHERE, "WHERE tnZone = %u AND nCastleID = %s", lpPktCastleSearch->m_dwZoneGroup, lpPktCastleSearch->m_szSearchValue);
break;
case PktAdminMgr::PktCastleSearch::SPESERVER_SPEZONE_ALLCASTLE:
_snprintf(szWHERE, MAX_WHERE, "WHERE tnZone = %u", lpPktCastleSearch->m_dwZoneGroup);
break;
case PktAdminMgr::PktCastleSearch::SPESERVER_SPEZONE_SPECASTLE_ID:
_snprintf(szWHERE, MAX_WHERE, "WHERE tnZone = %u AND nCastleID = %s", lpPktCastleSearch->m_dwZoneGroup, lpPktCastleSearch->m_szSearchValue);
break;
default:
break;
}
_snprintf(szQuery, CDBAdminTool::QUERY_BUFFER_LEN, QUERYZ::GetCastleInfo, szWHERE);
In_CastleList CastleList;
CGameDB* lpGameDB = CAgentServerTable::GetInstance().GetGameDB(lpPktCastleSearch->m_dwServerGroup);
if(NULL != lpGameDB)
{
ZeroMemory(&CastleList, sizeof(In_CastleList));
if(true == lpGameDB->ExecuteQuery(szQuery))
{
CCumulateBuffer cBuffer(sizeof(PktAdminMgr::PktCastleSearchAck) * 30, &GetSession());
while(lpGameDB->GetData(&CastleList))
{
char* lpBuffer = cBuffer.GetBuffer(sizeof(PktAdminMgr::PktCastleSearchAck));
PktAdminMgr::PktCastleSearchAck* lpPktAck =
reinterpret_cast<PktAdminMgr::PktCastleSearchAck*>(lpBuffer);
ZeroMemory(lpPktAck, sizeof(PktAdminMgr::PktCastleSearchAck));
lpPktAck->m_dwServerGroup = lpPktCastleSearch->m_dwServerGroup;
lpPktAck->m_dwCastleID = CastleList.m_dwCastleID;
lpPktAck->m_cNation = CastleList.m_cNation;
lpPktAck->m_cZone = CastleList.m_cZone;
lpPktAck->m_cChannel = CastleList.m_cChannel;
lpPktAck->m_cName = CastleList.m_cName;
lpPktAck->m_cSiegeCount = CastleList.m_cSiegeCount;
lpPktAck->m_cInvincibleCount = CastleList.m_cInvincibleCount;
lpPktAck->m_wTotalSiegeCount = CastleList.m_wTotalSiegeCount;
lpPktAck->m_dwTotalTaxMoney = CastleList.m_dwTotalTaxMoney;
lpPktAck->m_cRight = CastleList.m_aryRight[0];
lpPktAck->m_fPosInX = CastleList.m_fPosInX;
lpPktAck->m_fPosInY = CastleList.m_fPosInY;
lpPktAck->m_fPosInZ = CastleList.m_fPosInZ;
lpPktAck->m_fPosOutX = CastleList.m_fPosOutX;
lpPktAck->m_fPosOutY = CastleList.m_fPosOutY;
lpPktAck->m_fPosOutZ = CastleList.m_fPosOutZ;
lpPktAck->m_wItemID = CastleList.m_wItemID;
lpPktAck->m_cItemNum = CastleList.m_cItemNum;
PacketWrap::WrapHeader(lpBuffer,
sizeof(PktAdminMgr::PktCastleSearchAck), PktAdminMgr::PktCMD::PktCastleSearchAck, 0, 0);
ZeroMemory(&CastleList, sizeof(In_CastleList));
bExistData = true;
}
}
else
{
ERRLOG2(g_Log, "쿼리 실패. qry- %s, err- %s", szQuery, lpGameDB->GetErrorString());
}
}
if(!bExistData)
{
//SendResult(PktAdminMgr::PktResult::Result_Null);
}
return true;
}
bool CRylAdminMgrDispatch::PktCastleCreature(PktBase* lpPktBase)
{
#pragma pack(1)
struct In_CastleCreatureList
{
unsigned long m_dwCreatureID;
unsigned long m_dwCastleID;
unsigned long m_dwOwnerID;
unsigned long m_dwHP;
unsigned short m_wObjectType;
float m_fDirection;
unsigned char m_cState;
unsigned char m_cSubState;
unsigned char m_cUpgradeStep;
unsigned char m_cUpgradeType;
char m_szRemainTime[PktAdminMgr::MAX_TIME];
char m_szLastUseTime[PktAdminMgr::MAX_TIME];
float m_fPosX;
float m_fPosY;
float m_fPosZ;
};
#pragma pack()
PktAdminMgr::PktCastleCreature* lpPktCastleCreature = static_cast<PktAdminMgr::PktCastleCreature*>(lpPktBase);
bool bExistData = false;
// 검색 타입에 맞는 쿼리 만들기
const int MAX_WHERE = 256;
char szQuery[CDBAdminTool::QUERY_BUFFER_LEN];
char szWHERE[MAX_WHERE];
_snprintf(szWHERE, MAX_WHERE, "WHERE nCastleID = %u", lpPktCastleCreature->m_dwCastleID);
_snprintf(szQuery, CDBAdminTool::QUERY_BUFFER_LEN, QUERYZ::GetCastleCreatureInfo, szWHERE);
In_CastleCreatureList castleCreatureList;
CGameDB* lpGameDB = CAgentServerTable::GetInstance().GetGameDB(lpPktCastleCreature->m_dwServerGroup);
if(NULL != lpGameDB)
{
ZeroMemory(&castleCreatureList, sizeof(In_CastleCreatureList));
if(true == lpGameDB->ExecuteQuery(szQuery))
{
CCumulateBuffer cBuffer(sizeof(PktAdminMgr::PktCastleSearchAck) * 30, &GetSession());
while(lpGameDB->GetData(&castleCreatureList))
{
char* lpBuffer = cBuffer.GetBuffer(sizeof(PktAdminMgr::PktCastleCreatureAck));
PktAdminMgr::PktCastleCreatureAck* lpPktAck =
reinterpret_cast<PktAdminMgr::PktCastleCreatureAck*>(lpBuffer);
ZeroMemory(lpPktAck, sizeof(PktAdminMgr::PktCastleCreatureAck));
lpPktAck->m_dwCreatureID = castleCreatureList.m_dwCreatureID;
lpPktAck->m_dwCastleID = castleCreatureList.m_dwCastleID;
lpPktAck->m_dwOwnerID = castleCreatureList.m_dwOwnerID;
lpPktAck->m_dwHP = castleCreatureList.m_dwHP;
lpPktAck->m_wObjectType = castleCreatureList.m_wObjectType;
lpPktAck->m_fDirection = castleCreatureList.m_fDirection;
lpPktAck->m_cState = castleCreatureList.m_cState;
lpPktAck->m_cSubState = castleCreatureList.m_cSubState;
lpPktAck->m_cUpgradeStep = castleCreatureList.m_cUpgradeStep;
lpPktAck->m_cUpgradeType = castleCreatureList.m_cUpgradeType;
lpPktAck->m_fPosX = castleCreatureList.m_fPosX;
lpPktAck->m_fPosY = castleCreatureList.m_fPosY;
lpPktAck->m_fPosZ = castleCreatureList.m_fPosZ;
strncpy(lpPktAck->m_szRemainTime, castleCreatureList.m_szRemainTime, PktAdminMgr::MAX_TIME);
strncpy(lpPktAck->m_szLastUseTime, castleCreatureList.m_szLastUseTime, PktAdminMgr::MAX_TIME);
PacketWrap::WrapHeader(lpBuffer,
sizeof(PktAdminMgr::PktCastleCreatureAck), PktAdminMgr::PktCMD::PktCastleCreatureAck, 0, 0);
ZeroMemory(&castleCreatureList, sizeof(In_CastleCreatureList));
bExistData = true;
}
}
else
{
ERRLOG2(g_Log, "쿼리 실패. qry- %s, err- %s", szQuery, lpGameDB->GetErrorString());
}
}
if(!bExistData)
{
//SendResult(PktAdminMgr::PktResult::Result_Null);
}
return true;
}
bool CRylAdminMgrDispatch::PktItemQtyControlData(PktBase* lpPktBase)
{
PktAdminMgr::PktItemQtyControl* lpPktItemQtyControl =
static_cast<PktAdminMgr::PktItemQtyControl*>(lpPktBase);
CRylAgentServerDispatch* lpAgentDispatch =
CAgentServerTable::GetInstance().GetDispatch((unsigned long)lpPktItemQtyControl->m_cServerGroup);
bool bIsReleased = true;
CBuffer* lpBuffer = CREATE_BUFFER(GetBufferFactory(), sizeof(lpPktItemQtyControl));
*reinterpret_cast<PktAdminMgr::PktItemQtyControl*>(lpBuffer->wr_ptr()) = *lpPktItemQtyControl;
if (false == PacketWrap::WrapHeader(lpBuffer,
sizeof(PktAdminMgr::PktItemQtyControl), CmdItemQtyCheck, 0, 0))
{
ERRLOG0(g_Log, "아이템 수량 제어 패킷 랩핑 실패");
bIsReleased = false;
}
else
{
if (false == lpAgentDispatch->Send(lpBuffer))
{
ERRLOG0(g_Log, "아이템 수량 제어 패킷 보내기 실패");
bIsReleased = false;
}
else
{
m_DetailLog.SetBefore("not exist contents");
m_DetailLog.SetAfter("[ItemQty Packet Send]");
m_DetailLog.InsertLog(m_MyLogID);
}
}
if (false == bIsReleased)
{
SAFE_RELEASE_BUFFER(lpBuffer);
}
return true;
}
bool CRylAdminMgrDispatch::PktSetGold(PktBase* lpPktBase)
{
PktAdminMgr::PktInvenGold* lpPktInvenGold =
reinterpret_cast<PktAdminMgr::PktInvenGold*>(lpPktBase);
CRylAgentServerDispatch* lpAgentDispatch =
CAgentServerTable::GetInstance().GetDispatch(lpPktInvenGold->m_dwServerGroup);
if(NULL != lpAgentDispatch)
{
CModifyCharacter* lpCharacter =
lpAgentDispatch->GetModifyCharacterMgr().GetCharacter(lpPktInvenGold->m_dwCID);
CString strTemp;
strTemp.Format("UID: %u\r\nCID: %u\r\nServerGroup: %u\r\nInventory Gold: %u",
lpPktInvenGold->m_dwUID, lpPktInvenGold->m_dwCID, lpPktInvenGold->m_dwServerGroup, lpCharacter->GetGold());
if(NULL != lpCharacter)
{
if(!lpCharacter->SetGold(lpPktInvenGold->m_dwGold))
{
ERRLOG0(g_Log, "인벤토리 골드 수정 실패");
}
else
{
m_DetailLog.SetBefore("%s", strTemp);
m_DetailLog.SetAfter("Inventory Gold: %u", lpPktInvenGold->m_dwGold);
m_DetailLog.InsertLog(m_MyLogID);
lpCharacter->OnChangedInfo(CModifyCharacter::ON_BASIC);
}
}
else
{
ERRLOG1(g_Log, "CID : %u의 캐릭터 세션 얻기 실패", lpPktInvenGold->m_dwCID);
}
}
else
{
SendResult(PktAdminMgr::PktResult::Err_NotFoundAgentDispatch);
}
return true;
}
bool CRylAdminMgrDispatch::PktStoreGoldUpdate(PktBase* lpPktBase)
{
PktAdminMgr::PktStoreGoldUpdate* lpPktStoreGoldUpdate =
reinterpret_cast<PktAdminMgr::PktStoreGoldUpdate*>(lpPktBase);
CRylAgentServerDispatch* lpAgentDispatch =
CAgentServerTable::GetInstance().GetDispatch(lpPktStoreGoldUpdate->m_dwServerGroup);
if(NULL != lpAgentDispatch)
{
CModifyCharacter* lpCharacter =
lpAgentDispatch->GetModifyCharacterMgr().GetCharacter(lpPktStoreGoldUpdate->m_dwCID);
if(NULL != lpCharacter)
{
Item::CDepositContainer& Deposit = lpCharacter->GetDeposit();
if(lpPktStoreGoldUpdate->m_dwGold >= Deposit.GetGold())
{
Deposit.AddGold(lpPktStoreGoldUpdate->m_dwGold - Deposit.GetGold());
}
else
{
Deposit.DeductGold(Deposit.GetGold() - lpPktStoreGoldUpdate->m_dwGold);
}
lpCharacter->OnChangedInfo(CModifyCharacter::ON_EXTRA);
lpCharacter->OnChangedInfo(CModifyCharacter::ON_STROE12);
m_DetailLog.SetBefore("UID: %u\r\nServerGroup: %u\r\n\r\nStoreGold: %u",
lpPktStoreGoldUpdate->m_dwUID, lpPktStoreGoldUpdate->m_dwServerGroup, Deposit.GetGold());
m_DetailLog.SetAfter("StoreGold: %u", lpPktStoreGoldUpdate->m_dwGold);
m_DetailLog.InsertLog(m_MyLogID);
}
else
{
ERRLOG1(g_Log, "CID : %u의 캐릭터 세션 얻기 실패", lpPktStoreGoldUpdate->m_dwCID);
}
}
else
{
SendResult(PktAdminMgr::PktResult::Err_NotFoundAgentDispatch);
}
return true;
}
bool CRylAdminMgrDispatch::PktUserBillingLogRequest(PktBase* lpPktBase)
{
#pragma pack(1)
struct In_UserBillingLog
{
char m_szClientID[PktAdminMgr::MAX_ACCOUNT];
unsigned long m_dwUID;
unsigned int m_sServerIndex;
char m_szFirstLoginTime[PktAdminMgr::MAX_TIME];
char m_szLogoutTime[PktAdminMgr::MAX_TIME];
char m_szIP[PktAdminMgr::MAX_IP];
};
#pragma pack()
PktAdminMgr::PktUserBillingLog* lpPktUserBillingLog =
static_cast<PktAdminMgr::PktUserBillingLog*>(lpPktBase);
char szQuery[CDBAdminTool::QUERY_BUFFER_LEN];
char szFormat[256];
char szTimeFormat[256];
sprintf(szTimeFormat, "FirstLoginTime >= '%d-%d-%d' and FirstLoginTime <= '%d-%d-%d'",
lpPktUserBillingLog->m_tStartTime.GetYear(),
lpPktUserBillingLog->m_tStartTime.GetMonth(),
lpPktUserBillingLog->m_tStartTime.GetDay(),
lpPktUserBillingLog->m_tEndTime.GetYear(),
lpPktUserBillingLog->m_tEndTime.GetMonth(),
lpPktUserBillingLog->m_tEndTime.GetDay());
if(lpPktUserBillingLog->m_cSearchType == PktAdminMgr::PktUserBillingLog::ACCOUNT)
{
sprintf(szFormat, "strClientid = '%s' and %s", lpPktUserBillingLog->m_szSearchValue, szTimeFormat);
}
else if(lpPktUserBillingLog->m_cSearchType == PktAdminMgr::PktUserBillingLog::UID)
{
sprintf(szFormat, "UID = %s and %s", lpPktUserBillingLog->m_szSearchValue, szTimeFormat);
}
_snprintf(szQuery, CDBAdminTool::QUERY_BUFFER_LEN, QUERYZ::GetUserBillingLog, szFormat);
In_UserBillingLog UserBillingLog;
ZeroMemory(&UserBillingLog, sizeof(In_UserBillingLog));
CBillingDB* lpRYLBillingDB = NULL;
if (0 == strcmp(m_szToolNation, "JAPAN"))
{
lpRYLBillingDB = CAgentServerTable::GetInstance().GetBillingDB();
}
else
{
lpRYLBillingDB = CAgentServerTable::GetInstance().GetBillingLogDB();
}
bool bExistData = false;
if(NULL != lpRYLBillingDB)
{
if(lpRYLBillingDB->ExecuteQuery(szQuery))
{
CCumulateBuffer cBuffer(sizeof(In_UserBillingLog) * 40, &GetSession());
while(lpRYLBillingDB->GetData(&UserBillingLog))
{
char* lpBuffer = cBuffer.GetBuffer(sizeof(PktAdminMgr::PktUserBillingLogAck));
if(NULL == lpBuffer) return true;
PktAdminMgr::PktUserBillingLogAck* lpPktAck =
reinterpret_cast<PktAdminMgr::PktUserBillingLogAck*>(lpBuffer);
ZeroMemory(lpPktAck, sizeof(PktAdminMgr::PktUserBillingLogAck));
strncpy(lpPktAck->m_szClientID, UserBillingLog.m_szClientID, PktAdminMgr::MAX_ACCOUNT);
lpPktAck->m_dwUID = UserBillingLog.m_dwUID;
strncpy(lpPktAck->m_szIP, UserBillingLog.m_szIP, PktAdminMgr::MAX_IP);
lpPktAck->m_sServerIndex = UserBillingLog.m_sServerIndex;
strncpy(lpPktAck->m_szFirstLoginTime, UserBillingLog.m_szFirstLoginTime, PktAdminMgr::MAX_TIME);
strncpy(lpPktAck->m_szLogoutTime, UserBillingLog.m_szLogoutTime, PktAdminMgr::MAX_TIME);
PacketWrap::WrapHeader(lpBuffer,sizeof(PktAdminMgr::PktUserBillingLogAck),
PktAdminMgr::PktCMD::PktUserBillingLogAck, 0, 0);
ZeroMemory(&UserBillingLog, sizeof(In_UserBillingLog));
bExistData = true;
}
}
}
if (false == bExistData)
{
SendResult(PktAdminMgr::PktResult::Result_Null);
}
return true;
}
bool CRylAdminMgrDispatch::PktGameAdmin(PktBase* lpPktBase)
{
#pragma pack(1)
struct In_GameAdminInfo
{
unsigned long m_dwUID;
unsigned int m_nLevel;
char m_szIP_S[PktAdminMgr::MAX_IP];
char m_szIP_E[PktAdminMgr::MAX_IP];
};
#pragma pack()
PktAdminMgr::PktGameAdmin* lpPktGameAdmin = static_cast<PktAdminMgr::PktGameAdmin*>(lpPktBase);
CString strAfterLog;
char szQuery[CDBAdminTool::QUERY_BUFFER_LEN];
bool bDBReload = false; // 중계서버로 reloadadmin 명령을 내릴지 여부
bool bExistData = false; // 데이터를 요청한 경우 결과값 존재 여부
if(lpPktGameAdmin->m_cPktType == PktAdminMgr::PktGameAdmin::REG)
{
_snprintf(szQuery, CDBAdminTool::QUERY_BUFFER_LEN,
"INSERT INTO AdminList(UID, Level, IP_S, IP_E) VALUES(%u, %d, '%s', '%s')",
lpPktGameAdmin->m_dwUID, lpPktGameAdmin->m_nAdminLV,
lpPktGameAdmin->m_szStartIP, lpPktGameAdmin->m_szEndIP);
strAfterLog.Format("[Game Admin Add]\r\nUID: %d\r\nLV: %d\r\nIP_S: %s\r\nIP_E: %s",
lpPktGameAdmin->m_dwUID, lpPktGameAdmin->m_nAdminLV,
lpPktGameAdmin->m_szStartIP, lpPktGameAdmin->m_szEndIP);
}
else if(lpPktGameAdmin->m_cPktType == PktAdminMgr::PktGameAdmin::EDIT)
{
_snprintf(szQuery, CDBAdminTool::QUERY_BUFFER_LEN,
"UPDATE AdminList SET Level = %d, IP_S = '%s', IP_E = '%s' WHERE UID = %u",
lpPktGameAdmin->m_nAdminLV, lpPktGameAdmin->m_szStartIP,
lpPktGameAdmin->m_szEndIP, lpPktGameAdmin->m_dwUID);
strAfterLog.Format("[Game Admin Edit]\r\nUID: %d\r\nLV: %d\r\nIP_S: %s\r\nIP_E: %s",
lpPktGameAdmin->m_dwUID, lpPktGameAdmin->m_nAdminLV,
lpPktGameAdmin->m_szStartIP, lpPktGameAdmin->m_szEndIP);
}
else if(lpPktGameAdmin->m_cPktType == PktAdminMgr::PktGameAdmin::DEL)
{
_snprintf(szQuery, CDBAdminTool::QUERY_BUFFER_LEN,
"DELETE FROM AdminList WHERE UID = %u", lpPktGameAdmin->m_dwUID);
strAfterLog.Format("[Game Admin Del]\r\nUID: %d", lpPktGameAdmin->m_dwUID);
}
else if(lpPktGameAdmin->m_cPktType == PktAdminMgr::PktGameAdmin::SEARCH)
{
_snprintf(szQuery, CDBAdminTool::QUERY_BUFFER_LEN,
"SELECT UID, CAST(Level AS INT), IP_S, IP_E FROM AdminList");
}
else
{
SendResult(PktAdminMgr::PktResult::Err_GameAdminManage);
ERRLOG1(g_Log, "게임 운영자 관리 쿼리문 작성 실패 - 올바른 타입의 패킷이 아닙니다.(Type-%c)",
lpPktGameAdmin->m_cPktType);
}
CGameDB* lpGameDB = CAgentServerTable::GetInstance().GetGameDB(lpPktGameAdmin->m_dwServerGroup);
if(NULL != lpGameDB)
{
if(lpPktGameAdmin->m_cPktType == PktAdminMgr::PktGameAdmin::SEARCH)
{
In_GameAdminInfo GameAdminInfo;
ZeroMemory(&GameAdminInfo, sizeof(In_GameAdminInfo));
if(lpGameDB->ExecuteQuery(szQuery))
{
CCumulateBuffer cBuffer(sizeof(In_GameAdminInfo) * 20, &GetSession());
while(lpGameDB->GetData(&GameAdminInfo))
{
char* lpBuffer = cBuffer.GetBuffer(sizeof(PktAdminMgr::PktGameAdmin));
if(NULL == lpBuffer) return true;
PktAdminMgr::PktGameAdmin* lpPktAck =
reinterpret_cast<PktAdminMgr::PktGameAdmin*>(lpBuffer);
ZeroMemory(lpPktAck, sizeof(lpPktAck));
lpPktAck->m_dwServerGroup = lpPktGameAdmin->m_dwServerGroup;
lpPktAck->m_cPktType = PktAdminMgr::PktGameAdmin::ACK;
lpPktAck->m_dwUID = GameAdminInfo.m_dwUID;
lpPktAck->m_nAdminLV = GameAdminInfo.m_nLevel;
strncpy(lpPktAck->m_szStartIP, GameAdminInfo.m_szIP_S, PktAdminMgr::MAX_IP);
strncpy(lpPktAck->m_szEndIP, GameAdminInfo.m_szIP_E, PktAdminMgr::MAX_IP);
PacketWrap::WrapHeader(lpBuffer,sizeof(PktAdminMgr::PktGameAdmin),
PktAdminMgr::PktCMD::PktGameAdminAck, 0, 0);
ZeroMemory(&GameAdminInfo, sizeof(In_GameAdminInfo));
bExistData = true;
}
}
else
{
ERRLOG0(g_Log, "게임 운영자 리스트 검색 - 쿼리 실행 실패");
}
}
else
{
CCumulateBuffer cBuffer(sizeof(In_GameAdminInfo) * 20, &GetSession());
if(lpGameDB->ExecuteQuery(szQuery))
{
char* lpBuffer = cBuffer.GetBuffer(sizeof(PktAdminMgr::PktGameAdmin));
if(NULL == lpBuffer) return true;
PktAdminMgr::PktGameAdmin* lpPktAck =
reinterpret_cast<PktAdminMgr::PktGameAdmin*>(lpBuffer);
ZeroMemory(lpPktAck, sizeof(lpPktAck));
lpPktAck->m_cPktType = PktAdminMgr::PktGameAdmin::REFRESH;
PacketWrap::WrapHeader(lpBuffer,sizeof(PktAdminMgr::PktGameAdmin),
PktAdminMgr::PktCMD::PktGameAdminAck, 0, 0);
bDBReload = true;
m_DetailLog.SetBefore("not exist contents");
m_DetailLog.SetAfter("%s", strAfterLog);
m_DetailLog.InsertLog(m_MyLogID);
}
else
{
SendResult(PktAdminMgr::PktResult::Err_GameAdminManage);
ERRLOG0(g_Log, "게임 운영자 관리 - 쿼리 실행 실패");
}
}
}
if(bDBReload)
{
CRylAgentServerDispatch* lpAgentDispatch =
CAgentServerTable::GetInstance().GetDispatch(lpPktGameAdmin->m_dwServerGroup);
if (NULL != lpAgentDispatch)
{
PktAgentServer::PktAdminToolSetData* lpPktAdminToolSetData = new PktAgentServer::PktAdminToolSetData;
ZeroMemory(lpPktAdminToolSetData, sizeof(PktAgentServer::PktAdminToolSetData*));
lpPktAdminToolSetData->m_cType = PktAgentServer::PktAdminToolSetData::RELOAD_ADMINLIST;
bool bIsReleased = true;
CBuffer* lpCmdBuffer = CREATE_BUFFER(GetBufferFactory(), sizeof(PktAgentServer::PktAdminToolSetData));
if (NULL == lpCmdBuffer) return true;
*reinterpret_cast<PktAgentServer::PktAdminToolSetData*>(lpCmdBuffer->wr_ptr()) = *lpPktAdminToolSetData;
if (false == PacketWrap::WrapHeader(lpCmdBuffer,
sizeof(PktAgentServer::PktAdminToolSetData),CmdAdminToolSetData, 0, 0))
{
ERRLOG0(g_Log, "운영자 리스트 리로드 패킷 랩핑 실패");
bIsReleased = false;
}
else
{
if (false == lpAgentDispatch->Send(lpCmdBuffer))
{
ERRLOG0(g_Log, "운영자 리스트 리로드 패킷 보내기 실패");
bIsReleased = false;
}
}
if (false == bIsReleased)
{
SAFE_RELEASE_BUFFER(lpCmdBuffer);
}
delete lpPktAdminToolSetData;
}
else
{
ERRLOG1(g_Log, "중계서버 디스패치 얻기 실패 (Index - %u)", lpPktGameAdmin->m_dwServerGroup);
}
}
if (lpPktGameAdmin->m_cPktType == PktAdminMgr::PktGameAdmin::SEARCH)
{
if(!bExistData)
{
SendResult(PktAdminMgr::PktResult::Result_Null);
}
}
return true;
}
bool CRylAdminMgrDispatch::PktConnectAllServerz(PktBase* lpPktBase)
{
CAgentServerTable::GetInstance().InitAgentServerTable(
*CRylAdminManagerServer::GetInstance().GetIOCPNet());
SendConnectedServerIndex();
return true;
}
bool CRylAdminMgrDispatch::SendConnectedServerIndex(void)
{
bool bIsReleased = true;
CBuffer* lpBuffer = CREATE_BUFFER(GetBufferFactory(), sizeof(PktAdminMgr::PktConnectAllServerz));
if (NULL == lpBuffer) return true;
PktAdminMgr::PktConnectAllServerz* lpConnectAllServerz = new PktAdminMgr::PktConnectAllServerz;
ZeroMemory(lpConnectAllServerz->m_nConnectedServerIndex, sizeof(lpConnectAllServerz->m_nConnectedServerIndex));
int nArrayIndex = 0;
CAgentServerTable* lpAgentServerTable = &CAgentServerTable::GetInstance();
if (NULL == lpAgentServerTable) return true;
for(unsigned int nIndex = 0; nIndex < CAgentServerTable::MAX_AGENT_SERVER; ++nIndex)
{
if(NULL != lpAgentServerTable->GetDispatch(nIndex)) // 중계서버 연결 체크
{
// 배열 앞부분부터 차례대로 '연결된 서버 인덱스 + 1' 을 대입
lpConnectAllServerz->m_nConnectedServerIndex[nArrayIndex] = nIndex + 1;
++nArrayIndex;
}
}
*reinterpret_cast<PktAdminMgr::PktConnectAllServerz*>(lpBuffer->wr_ptr()) = *lpConnectAllServerz;
if (false == PacketWrap::WrapHeader(lpBuffer,
sizeof(PktAdminMgr::PktConnectAllServerz), PktAdminMgr::PktCMD::PktRefreshConnectedList, 0, 0))
{
ERRLOG0(g_Log, "수동으로 패킷을 릴리스합니다.");
bIsReleased = false;
}
else
{
if (false == GetSession().SendPending(lpBuffer))
{
ERRLOG0(g_Log, "수동으로 패킷을 릴리스합니다.");
bIsReleased = false;
}
}
if (false == bIsReleased)
{
SAFE_RELEASE_BUFFER(lpBuffer);
}
delete lpConnectAllServerz;
return true;
}
bool CRylAdminMgrDispatch::PktInterestedUser(PktBase* lpPktBase)
{
PktAdminMgr::PktInterestedUser* lpPktInterestedUser =
reinterpret_cast<PktAdminMgr::PktInterestedUser*>(lpPktBase);
bool bResult = true;
char szQuery[CDBAdminTool::MAX_QUERY_LENGTH];
switch(lpPktInterestedUser->m_cPktType)
{
case PktAdminMgr::PktInterestedUser::ADD_USER:
{
unsigned int* nCount = 0;
char szCountQuery[256];
_snprintf(szCountQuery, 256,
"SELECT COUNT(strAccount) FROM TblInterestedUser WHERE intUID = %d", m_MyUID);
if(!CDBAdminTool::GetInstance().ExecuteQuery(szCountQuery))
{
if(CDBAdminTool::GetInstance().GetData(nCount))
{
if(*nCount >= 30)
{
// 관심 유저는 30명 이상 등록 불가능
ERRLOG0(g_Log, "30명 이상의 관심유저를 등록하려 시도");
return true;
}
}
else
{
ERRLOG1(g_Log, "관심유저 수 카운트 쿼리 실패: %s", szCountQuery);
return true;
}
}
_snprintf(szQuery, CDBAdminTool::MAX_QUERY_LENGTH,
"INSERT INTO TblInterestedUser(intUID, strAccount, strReason) VALUES(%d, '%s', '%s')",
m_MyUID, lpPktInterestedUser->m_szAccount, lpPktInterestedUser->m_szReason);
if(!CDBAdminTool::GetInstance().ExecuteQuery(szQuery))
{
ERRLOG2(g_Log, "관심 유저 등록 실패: %s, err: %s",
szQuery, CDBAdminTool::GetInstance().GetErrorString());
SendResult(PktAdminMgr::PktResult::Err_InterestedUserManage);
}
}
break;
case PktAdminMgr::PktInterestedUser::REMOVE_USER:
{
_snprintf(szQuery, CDBAdminTool::MAX_QUERY_LENGTH,
"DELETE FROM TblInterestedUser WHERE strAccount = '%s'",
lpPktInterestedUser->m_szAccount);
if(!CDBAdminTool::GetInstance().ExecuteQuery(szQuery))
{
ERRLOG2(g_Log, "관심 유저 삭제 실패: %s, err: %s",
szQuery, CDBAdminTool::GetInstance().GetErrorString());
SendResult(PktAdminMgr::PktResult::Err_InterestedUserManage);
}
}
break;
case PktAdminMgr::PktInterestedUser::REQUEST_LIST:
{
_snprintf(szQuery, CDBAdminTool::MAX_QUERY_LENGTH,
"SELECT strAccount, strReason FROM TblInterestedUser WHERE intUID = %d", m_MyUID);
ReqInterestedUserList(szQuery);
}
break;
default:
{
ERRLOG1(g_Log, "알맞은 패킷 타입이 아닙니다: Type - %d", lpPktInterestedUser->m_cPktType);
}
break;
}
return true;
}
bool CRylAdminMgrDispatch::ReqInterestedUserList(char* szQuery)
{
#pragma pack(1)
struct InterestedUserList
{
char m_szAccount[PktAdminMgr::MAX_ACCOUNT];
char m_szReason[MAX_PATH];
};
#pragma pack()
InterestedUserList GetList;
if(!CDBAdminTool::GetInstance().ExecuteQuery(szQuery))
{
ERRLOG2(g_Log, "쿼리 실패: query-%s, err-%s",
szQuery, CDBAdminTool::GetInstance().GetErrorString());
SendResult(PktAdminMgr::PktResult::Err_InterestedUserManage);
}
else
{
ZeroMemory(&GetList, sizeof(InterestedUserList));
while(CDBAdminTool::GetInstance().GetData(&GetList))
{
bool bIsReleased = true;
CBuffer* lpBuffer = CREATE_BUFFER(GetBufferFactory(), sizeof(PktAdminMgr::PktInterestedUser));
if (NULL == lpBuffer) return true;
PktAdminMgr::PktInterestedUser* lpPktInterestedUser =
reinterpret_cast<PktAdminMgr::PktInterestedUser*>(lpBuffer->begin());
strncpy(lpPktInterestedUser->m_szAccount, GetList.m_szAccount, PktAdminMgr::MAX_ACCOUNT);
strncpy(lpPktInterestedUser->m_szReason, GetList.m_szReason, MAX_PATH);
ZeroMemory(&GetList, sizeof(InterestedUserList));
if (false == PacketWrap::WrapHeader(lpBuffer, sizeof(PktAdminMgr::PktInterestedUser),
PktAdminMgr::PktCMD::PktInterestedUser, 0, 0))
{
ERRLOG0(g_Log, "수동으로 패킷을 릴리스합니다.");
bIsReleased = false;
}
else
{
if (false == GetSession().SendPending(lpBuffer))
{
ERRLOG0(g_Log, "수동으로 패킷을 릴리스합니다.");
bIsReleased = false;
}
}
if (false == bIsReleased)
{
SAFE_RELEASE_BUFFER(lpBuffer);
}
}
}
return true;
}
bool CRylAdminMgrDispatch::PktConnectionChk(PktBase* lpPktBase)
{
#pragma pack(1)
struct ConnectionInfo
{
char m_szAccount[PktAdminMgr::MAX_ACCOUNT];
unsigned long m_dwUID;
char m_szIP[15];
unsigned int m_dwServerGroup;
char m_szFirstLoginTime[20];
};
#pragma pack()
PktAdminMgr::PktConnectionChk* lpPktConnectionChk =
reinterpret_cast<PktAdminMgr::PktConnectionChk*>(lpPktBase);
// edith 2009.08.14 관심유저 버그수정 (ROW_Activity DB사용)
char szQuery[CDBAdminTool::MAX_QUERY_LENGTH];
_snprintf(szQuery, CDBAdminTool::MAX_QUERY_LENGTH,
"SELECT strClientID, UID, strIP, CAST(tinyServerID AS INT), CONVERT(VARCHAR(20), FirstLoginTime, 120) "
"FROM TblCurrentUser WHERE strClientID = '%s'",
lpPktConnectionChk->m_szAccount);
CBillingDB* lpBillingDB = CAgentServerTable::GetInstance().GetBillingDB();
if(NULL != lpBillingDB)
{
ConnectionInfo GetInfo;
if(!lpBillingDB->ExecuteQuery(szQuery))
{
ERRLOG2(g_Log, "쿼리 실패: query-%s, err-%s",
szQuery, lpBillingDB->GetErrorString());
SendResult(PktAdminMgr::PktResult::Err_Database);
}
else
{
ZeroMemory(&GetInfo, sizeof(ConnectionInfo));
while(lpBillingDB->GetData(&GetInfo))
{
CSendStream& SendStream = GetSendStream();
char* lpBuffer = SendStream.GetBuffer(sizeof(PktAdminMgr::PktConnectionChk));
if(0 != lpBuffer)
{
PktAdminMgr::PktConnectionChk* lpPktConnectionChk =
reinterpret_cast<PktAdminMgr::PktConnectionChk*>(lpBuffer);
strncpy(lpPktConnectionChk->m_szAccount, GetInfo.m_szAccount, PktAdminMgr::MAX_ACCOUNT);
lpPktConnectionChk->m_dwUID = GetInfo.m_dwUID;
strncpy(lpPktConnectionChk->m_szLoginIP, GetInfo.m_szIP, 15);
lpPktConnectionChk->m_nServerGroup = GetInfo.m_dwServerGroup;
strncpy(lpPktConnectionChk->m_szLoginTime, GetInfo.m_szFirstLoginTime, 20);
ZeroMemory(&GetInfo, sizeof(ConnectionInfo));
SendStream.WrapCrypt(sizeof(PktAdminMgr::PktConnectionChk),
PktAdminMgr::PktCMD::PktConnectionChk, 0, 0);
}
}
}
}
else
{
ERRLOG0(g_Log, "빌링 디비 세션 얻기 실패");
}
return true;
}
bool CRylAdminMgrDispatch::PktConnectedUserList()
{
char szAccount[PktAdminMgr::MAX_ACCOUNT];
// 관심 유저 그룹 만들기 ex) 10923, 14152, 14131, 0
CString strUIDGroup;
char szTempQuery[MAX_PATH];
_snprintf(szTempQuery, MAX_PATH,
"SELECT strAccount FROM TblInterestedUser WHERE intUID = %d", m_MyUID);
if(CDBAdminTool::GetInstance().ExecuteQuery(szTempQuery))
{
ZeroMemory(szAccount, PktAdminMgr::MAX_ACCOUNT);
while(CDBAdminTool::GetInstance().GetData(szAccount))
{
strUIDGroup.AppendFormat("'%s', ", szAccount);
ZeroMemory(szAccount, PktAdminMgr::MAX_ACCOUNT);
}
if(strUIDGroup.IsEmpty()) return true; // 관심 유저가 없는 경우
strUIDGroup.Append("'0'");
}
else
{
ERRLOG2(g_Log, "쿼리 실패: query- %s, err- %s", szTempQuery,
CDBAdminTool::GetInstance().GetErrorString());
SendResult(PktAdminMgr::PktResult::Err_Database);
return true;
}
// edith 2009.08.14 관심유저 버그수정 (ROW_Activity DB사용)
// 접속한 관심 유저의 계정명 보내기
char szQuery[CDBAdminTool::MAX_QUERY_LENGTH];
_snprintf(szQuery, CDBAdminTool::MAX_QUERY_LENGTH,
"SELECT strClientID FROM TblCurrentUser WHERE strClientID IN (%s)", strUIDGroup);
CBillingDB* lpBillingDB = CAgentServerTable::GetInstance().GetBillingDB();
if(NULL != lpBillingDB)
{
if(!lpBillingDB->ExecuteQuery(szQuery))
{
ERRLOG2(g_Log, "쿼리 실패: query- %s, err- %s",
szQuery, lpBillingDB->GetErrorString());
SendResult(PktAdminMgr::PktResult::Err_Database);
}
else
{
const int MAX_NAME_NUM = 300;
const int MAX_NAME_BUFFER = PktAdminMgr::MAX_ACCOUNT * MAX_NAME_NUM;
if (MAX_NAME_BUFFER < 15000)
{
CBuffer* lpBuffer =
CREATE_BUFFER(GetBufferFactory(), sizeof(PktBase) + MAX_NAME_BUFFER);
if(0 != lpBuffer)
{
int nGetRowsNum = 0;
memset(lpBuffer->wr_ptr(), 0, lpBuffer->capacity());
PktBase* lpPktBase = reinterpret_cast<PktBase*>(lpBuffer->wr_ptr());
char* szWritePos = lpBuffer->wr_ptr() + sizeof(PktBase);
int nSendCount = 0;
while(lpBillingDB->GetData((void**)szWritePos,
PktAdminMgr::MAX_ACCOUNT, MAX_NAME_NUM, &nGetRowsNum))
{
if (0 == nGetRowsNum)
{
break;
}
++nSendCount;
GetSendStream().WrapCompress(lpBuffer->wr_ptr(),
static_cast<unsigned short>(sizeof(PktBase) + sizeof(char) *
PktAdminMgr::MAX_ACCOUNT * nGetRowsNum),
PktAdminMgr::PktCMD::PktConnectedUserList, 0, 0);
}
if (0 == nSendCount)
{
GetSendStream().WrapCompress(lpBuffer->wr_ptr(),
static_cast<unsigned short>(sizeof(PktBase)),
PktAdminMgr::PktCMD::PktConnectedUserList, 0, 0);
}
SAFE_RELEASE_BUFFER(lpBuffer);
}
}
}
}
else
{
ERRLOG0(g_Log, "빌링 디비 세션 얻기 실패");
}
return true;
}
bool CRylAdminMgrDispatch::PktDuplicatedItem(PktBase* lpPktBase)
{
#pragma pack(1)
struct In_DuplicatedItemData
{
char m_szInsertTime[PktAdminMgr::MAX_TIME];
char m_szUpdateTime[PktAdminMgr::MAX_TIME];
unsigned long m_dwUID;
unsigned long m_dwCID;
unsigned __int64 m_dwItemUID;
char m_szCharName[PktAdminMgr::MAX_NAME];
int m_nQty;
int m_nChk;
};
#pragma pack()
bool bExistData = false;
PktAdminMgr::PktDuplicatedItem* lpPktDuplicatedItem =
reinterpret_cast<PktAdminMgr::PktDuplicatedItem*>(lpPktBase);
unsigned long dwSearchGroup = lpPktDuplicatedItem->m_dwServerGroup;
if (PktAdminMgr::PktDuplicatedItem::SEARCH == lpPktDuplicatedItem->m_cPktType)
{
char szQuery[CDBAdminTool::MAX_QUERY_LENGTH];
_snprintf(szQuery, CDBAdminTool::MAX_QUERY_LENGTH,
"SELECT CONVERT(VARCHAR(20), InsertTime, 120), CONVERT(VARCHAR(20), UpdateTime, 120), "
"UID, CID, ItemSerial, CharName, Qty, CAST(CheckField AS INT) FROM TblItemLog WHERE CheckField = %d",
lpPktDuplicatedItem->m_bChk ? 0 : 1);
CGameDB* lpGameDB =
CAgentServerTable::GetInstance().GetGameDB(dwSearchGroup);
if (NULL != lpGameDB)
{
if (false == lpGameDB->ExecuteQuery(szQuery))
{
ERRLOG2(g_Log, "쿼리 실패: query-%s, err-%s",
szQuery, lpGameDB->GetErrorString());
SendResult(PktAdminMgr::PktResult::Err_Database);
}
else
{
In_DuplicatedItemData In_Data;
ZeroMemory(&In_Data, sizeof(In_DuplicatedItemData));
while(true == lpGameDB->GetData(&In_Data))
{
CSendStream& SendStream = GetSendStream();
char* lpBuffer = SendStream.GetBuffer(sizeof(PktAdminMgr::PktDuplicatedItem));
if(0 != lpBuffer)
{
PktAdminMgr::PktDuplicatedItem* lpPktDuplicatedItem =
reinterpret_cast<PktAdminMgr::PktDuplicatedItem*>(lpBuffer);
lpPktDuplicatedItem->m_cPktType = PktAdminMgr::PktDuplicatedItem::RESULT_LIST;
lpPktDuplicatedItem->m_dwServerGroup = dwSearchGroup;
strncpy(lpPktDuplicatedItem->m_szInsertTime,
In_Data.m_szInsertTime, PktAdminMgr::MAX_TIME);
strncpy(lpPktDuplicatedItem->m_szUpdateTime,
In_Data.m_szUpdateTime, PktAdminMgr::MAX_TIME);
lpPktDuplicatedItem->m_dwUID = In_Data.m_dwUID;
lpPktDuplicatedItem->m_dwCID = In_Data.m_dwCID;
lpPktDuplicatedItem->m_dwItemUID = In_Data.m_dwItemUID;
strncpy(lpPktDuplicatedItem->m_szCharName,
In_Data.m_szCharName, PktAdminMgr::MAX_NAME);
lpPktDuplicatedItem->m_nQty = In_Data.m_nQty;
lpPktDuplicatedItem->m_bChk = (1 == In_Data.m_nChk) ? true : false;
ZeroMemory(&In_Data, sizeof(In_DuplicatedItemData));
SendStream.WrapCrypt(sizeof(PktAdminMgr::PktDuplicatedItem),
PktAdminMgr::PktCMD::PktDuplicatedItem, 0, 0);
bExistData = true;
}
}
}
}
}
else if(lpPktDuplicatedItem->m_cPktType == PktAdminMgr::PktDuplicatedItem::CHK)
{
char szQuery[CDBAdminTool::MAX_QUERY_LENGTH];
_snprintf(szQuery, CDBAdminTool::MAX_QUERY_LENGTH,
"USP_UpdateCheckField_ItemLog %u, %u, %I64d",
lpPktDuplicatedItem->m_dwUID, lpPktDuplicatedItem->m_dwCID, lpPktDuplicatedItem->m_dwItemUID);
CGameDB* lpGameDB =
CAgentServerTable::GetInstance().GetGameDB(lpPktDuplicatedItem->m_dwServerGroup);
if (NULL != lpGameDB)
{
if (false == lpGameDB->ExecuteQuery(szQuery))
{
ERRLOG2(g_Log, "프로시저 실행 실패: query-%s, err-%s",
szQuery, lpGameDB->GetErrorString());
SendResult(PktAdminMgr::PktResult::Err_Database);
}
else
{
SendResult(PktAdminMgr::PktResult::Success_ChkDuplicatedItem);
}
}
}
if(lpPktDuplicatedItem->m_cPktType == PktAdminMgr::PktDuplicatedItem::SEARCH)
{
if(!bExistData)
{
SendResult(PktAdminMgr::PktResult::Result_Null);
}
}
return true;
}
bool CRylAdminMgrDispatch::PktItemDistribute(PktBase* lpPktBase)
{
PktAdminMgr::PktItemDistribute* lpPktItemDistribute =
reinterpret_cast<PktAdminMgr::PktItemDistribute*>(lpPktBase);
const unsigned char MAX_USER_NUM = lpPktItemDistribute->m_cUserNum;
PktAdminMgr::DstUserInfo* lpDstUserInfo =
reinterpret_cast<PktAdminMgr::DstUserInfo*>(lpPktItemDistribute + 1);
CCharacter tempChar(lpDstUserInfo->m_dwCID, 0);
TEMPINVEN tempInvenData;
Item::CTempInvenContainer tempInven;
Item::CItem* lpInsertItem = 0;
const Item::ItemInfo* lpItemInfo = 0;
unsigned char cError = 0;
if(!tempInven.Initialize(&tempChar, Item::MAX_TEMP_INVEN_ITEM_NUM))
{
cError = PktAdminMgr::PktItemDistributeAck::FALED_TO_CREATE_TEMPINVEN_OBJ;
ERRLOG0(g_Log, "임시 인벤 객체 초기화 실패");
}
else if(NULL == (lpItemInfo =
Item::CItemMgr::GetInstance().GetItemInfoFromItemName(
lpPktItemDistribute->m_stDistributeItem.m_szItemName)))
{
cError = PktAdminMgr::PktItemDistributeAck::FALED_TO_GET_ITEMINFO;
ERRLOG1(g_Log, "아이템 이름으로 아이템 정보 얻기 실패. 아이템 명: %s",
lpPktItemDistribute->m_stDistributeItem.m_szItemName);
}
else
{
for(unsigned char cUserCount = 0; cUserCount < MAX_USER_NUM; ++cUserCount, ++lpDstUserInfo)
{
CGameDB* lpGameDB =
CAgentServerTable::GetInstance().GetGameDB(lpDstUserInfo->m_dwServerGroup);
if(NULL == lpGameDB)
{
cError = PktAdminMgr::PktItemDistributeAck::FALED_TO_GET_GAMEDB;
ERRLOG1(g_Log, "게임 디비 얻기 실패. 서버그룹: %u", lpDstUserInfo->m_dwServerGroup);
}
else
{
memset(&tempInvenData, 0, sizeof(TEMPINVEN));
if(!DBComponent::GameDB::GetTempInven(*lpGameDB, lpDstUserInfo->m_dwCID, &tempInvenData))
{
cError = PktAdminMgr::PktItemDistributeAck::FALED_TO_GET_TEMPINVEN_OBJ;
ERRLOG3(g_Log, "임시 인벤 객체 얻기 실패. UID: %u, CID: %u, 서버그룹: %u",
lpDstUserInfo->m_dwUID, lpDstUserInfo->m_dwCID, lpDstUserInfo->m_dwServerGroup);
}
else if(!tempInven.SerializeIn(tempInvenData.Data, tempInvenData.dwSize))
{
cError = PktAdminMgr::PktItemDistributeAck::FALED_TO_SERIALIZE_IN;
ERRLOG3(g_Log, "임시 인벤 시리얼라이즈 인 실패. UID: %u, CID: %u, 서버그룹: %u",
lpDstUserInfo->m_dwUID, lpDstUserInfo->m_dwCID, lpDstUserInfo->m_dwServerGroup);
}
else if(0 == (lpInsertItem =
Item::CItemFactory::GetInstance().CreateItem(lpItemInfo->m_usProtoTypeID)))
{
cError = PktAdminMgr::PktItemDistributeAck::FALED_TO_CREATE_ITEM_OBJ;
ERRLOG3(g_Log, "새 아이템 객체 생성 실패. UID: %u, CID: %u, 서버그룹: %u",
lpDstUserInfo->m_dwUID, lpDstUserInfo->m_dwCID, lpDstUserInfo->m_dwServerGroup);
}
else
{
lpInsertItem->SetNumOrDurability(lpPktItemDistribute->m_stDistributeItem.m_cNumOrDurability);
Item::CEquipment* lpEquipment = Item::CEquipment::DowncastToEquipment(lpInsertItem);
if(NULL != lpEquipment)
{
CModifyEquipment* lpModifyEquipment = static_cast<CModifyEquipment*>(lpEquipment);
lpModifyEquipment->AdjustData(lpPktItemDistribute->m_stDistributeItem);
lpModifyEquipment->AddGemAttribute();
lpModifyEquipment->AddUpgradeAttribute();
}
memset(&tempInvenData, 0, sizeof(TEMPINVEN));
tempInvenData.dwSize = TEMPINVEN::MAX_TEMPINVEN_SIZE;
if(!tempInven.SetItem(Item::ItemPos(), lpInsertItem))
{
cError = PktAdminMgr::PktItemDistributeAck::FALED_TO_SET_ITEM;
ERRLOG3(g_Log, "임시 인벤 객체에 아이템 셋팅 실패. UID: %u, CID: %u, 서버그룹: %u",
lpDstUserInfo->m_dwUID, lpDstUserInfo->m_dwCID, lpDstUserInfo->m_dwServerGroup);
}
else if(!tempInven.SerializeOut(tempInvenData.Data, tempInvenData.dwSize))
{
cError = PktAdminMgr::PktItemDistributeAck::FALED_TO_SERIALIZE_OUT;
ERRLOG3(g_Log, "임시 인벤 시리얼라이즈 아웃 실패. UID: %u, CID: %u, 서버그룹: %u",
lpDstUserInfo->m_dwUID, lpDstUserInfo->m_dwCID, lpDstUserInfo->m_dwServerGroup);
}
else if(!DBComponent::GameDB::UpdateTempInven(*lpGameDB, lpDstUserInfo->m_dwCID, &tempInvenData))
{
cError = PktAdminMgr::PktItemDistributeAck::FALED_TO_UPDATE_TEMPINVEN;
ERRLOG3(g_Log, "임시 인벤 DB 업데이트 실패. UID: %u, CID: %u, 서버그룹: %u",
lpDstUserInfo->m_dwUID, lpDstUserInfo->m_dwCID, lpDstUserInfo->m_dwServerGroup);
}
else
{
cError = PktAdminMgr::PktItemDistributeAck::SUCCESS;
}
}
}
CSendStream& SendStream = GetSendStream();
char* lpBuffer = SendStream.GetBuffer(sizeof(PktAdminMgr::PktItemDistributeAck));
if(NULL != lpBuffer)
{
PktAdminMgr::PktItemDistributeAck* lpPktItemDistributeAck =
reinterpret_cast<PktAdminMgr::PktItemDistributeAck*>(lpBuffer);
memcpy(&lpPktItemDistributeAck->m_stUserInfo,
lpDstUserInfo, sizeof(PktAdminMgr::DstUserInfo));
lpPktItemDistributeAck->m_cResultType = cError;
SendStream.WrapCrypt(sizeof(PktAdminMgr::PktItemDistributeAck),
PktAdminMgr::PktCMD::PktItemDistributeAck, 0, 0);
}
}
}
return true;
}
bool CRylAdminMgrDispatch::PktGuildRight(PktBase* lpPktBase)
{
PktAdminMgr::PktGuildRight* lpPktGuildRight = reinterpret_cast<PktAdminMgr::PktGuildRight*>(lpPktBase);
CGameDB* lpGameDB = CAgentServerTable::GetInstance().GetGameDB(lpPktGuildRight->m_dwServerGroup);
if(NULL == lpGameDB)
{
ERRLOG1(g_Log, "게임 DB 얻기 실패. 그룹- %d", lpPktGuildRight->m_dwServerGroup);
return true;
}
char szQuery[256] = "";
_snprintf(szQuery, 256,
"SELECT bRight FROM TblGuildInfo WHERE nGuildID = %u", lpPktGuildRight->m_dwGID);
if(false == lpGameDB->ExecuteQuery(szQuery))
{
ERRLOG2(g_Log, "길드 권한 얻어오기 실패. Err-%s. GID-%d",
lpGameDB->GetErrorString(), lpPktGuildRight->m_dwGID);
return true;
}
char szRight[Guild::MAX_RIGHT_SIZE];
memset(szRight, 0, Guild::MAX_RIGHT_SIZE);
if(true == lpGameDB->GetData((void*)szRight))
{
bool bIsReleased = true;
CBuffer* lpBuffer = CREATE_BUFFER(GetBufferFactory(), sizeof(PktAdminMgr::PktGuildRight));
PktAdminMgr::PktGuildRight* lpPktAck =
reinterpret_cast<PktAdminMgr::PktGuildRight*>(lpBuffer->begin());
lpPktAck->m_dwServerGroup = lpPktGuildRight->m_dwServerGroup;
lpPktAck->m_dwGID = lpPktGuildRight->m_dwGID;
memcpy(lpPktAck->m_aryRight, szRight, sizeof(char) * Guild::MAX_RIGHT_SIZE);
if (false == PacketWrap::WrapHeader(lpBuffer,
sizeof(PktAdminMgr::PktGuildRight), PktAdminMgr::PktCMD::PktGuildRight, 0, 0))
{
ERRLOG0(g_Log, "수동으로 패킷을 릴리스합니다.");
bIsReleased = false;
}
else
{
if (false == GetSession().SendPending(lpBuffer))
{
ERRLOG0(g_Log, "수동으로 패킷을 릴리스합니다.");
bIsReleased = false;
}
}
if (false == bIsReleased)
{
SAFE_RELEASE_BUFFER(lpBuffer);
}
}
memset(szRight, 0, Guild::MAX_RIGHT_SIZE);
return true;
}
bool CRylAdminMgrDispatch::PktUnifiedCharInfo(PktBase* lpPktBase)
{
#pragma pack(1)
struct UnifiedCharInfo
{
unsigned long m_dwUID;
unsigned char m_cOldServerGroup;
unsigned long m_dwBeforeCID;
unsigned long m_dwNewCID;
char m_szBeforeCharName[PktAdminMgr::MAX_NAME];
};
#pragma pack()
PktAdminMgr::PktUnifiedCharInfo* lpPktUnifiedCharInfo =
reinterpret_cast<PktAdminMgr::PktUnifiedCharInfo*>(lpPktBase);
CAuthDB* lpAuthDB = CAgentServerTable::GetInstance().GetAuthDB();
CString strUID;
if (PktAdminMgr::PktUnifiedCharInfo::SEARCH_ACCOUNT == lpPktUnifiedCharInfo->m_cPktType)
{
if (NULL == lpAuthDB)
{
// 계정명으로 검색실패했다고 클라이언트로~
return true;
}
strUID.Format("%u", lpAuthDB->GetUIDFromAccount(lpPktUnifiedCharInfo->m_szSearchValue));
}
else if(PktAdminMgr::PktUnifiedCharInfo::SEARCH_UID == lpPktUnifiedCharInfo->m_cPktType)
{
strUID.Format("%s", lpPktUnifiedCharInfo->m_szSearchValue);
}
char szQuery[CDBAdminTool::MAX_QUERY_LENGTH];
_snprintf(szQuery, CDBAdminTool::MAX_QUERY_LENGTH,
"SELECT UID, OldServerGroupID, BeforeCID, NewCID, BeforeCharName "
"FROM TblUnifiedCharList WHERE UID = %s AND OldServerGroupID = %d",
strUID, lpPktUnifiedCharInfo->m_nOldServerGroup);
CGameDB* lpGameDB =
CAgentServerTable::GetInstance().GetGameDB(lpPktUnifiedCharInfo->m_dwServerGroup);
if (NULL == lpGameDB)
{
ERRLOG1(g_Log, "게임 DB를 얻는데 실패했습니다. 그룹-%u", lpPktUnifiedCharInfo->m_dwServerGroup);
return true;
}
if (true == lpGameDB->ExecuteQuery(szQuery))
{
UnifiedCharInfo GetInfo;
ZeroMemory(&GetInfo, sizeof(UnifiedCharInfo));
while(lpGameDB->GetData(&GetInfo))
{
CSendStream& SendStream = GetSendStream();
char* lpBuffer = SendStream.GetBuffer(sizeof(PktAdminMgr::PktUnifiedCharInfo));
if(NULL != lpBuffer)
{
PktAdminMgr::PktUnifiedCharInfo* lpPktUnifiedCharInfo =
reinterpret_cast<PktAdminMgr::PktUnifiedCharInfo*>(lpBuffer);
lpPktUnifiedCharInfo->m_dwUID = GetInfo.m_dwUID;
lpPktUnifiedCharInfo->m_nOldServerGroup = GetInfo.m_cOldServerGroup;
lpPktUnifiedCharInfo->m_dwBeforeCID = GetInfo.m_dwBeforeCID;
lpPktUnifiedCharInfo->m_dwNewCID = GetInfo.m_dwNewCID;
strncpy(lpPktUnifiedCharInfo->m_szBeforeCharName,
GetInfo.m_szBeforeCharName, PktAdminMgr::MAX_NAME);
ZeroMemory(&GetInfo, sizeof(UnifiedCharInfo));
SendStream.WrapCrypt(sizeof(PktAdminMgr::PktUnifiedCharInfo),
PktAdminMgr::PktCMD::PktUnifiedCharInfo, 0, 0);
}
}
}
else
{
ERRLOG1(g_Log, "쿼리 실패. 쿼리-%s", szQuery);
return true;
}
return true;
}
bool CRylAdminMgrDispatch::PktCancelExecuteQuest(PktBase* lpPktBase)
{
PktAdminMgr::PktCancelExecuteQuest* lpPktCancelExecuteQuest =
static_cast<PktAdminMgr::PktCancelExecuteQuest*>(lpPktBase);
CRylAgentServerDispatch* lpAgentDispatch =
CAgentServerTable::GetInstance().GetDispatch(lpPktCancelExecuteQuest->m_dwServerGroup);
if(NULL == lpAgentDispatch)
{
ERRLOG0(g_Log, "중계서버 디스패치 얻기 실패");
SendResult(PktAdminMgr::PktResult::Err_NotFoundAgentDispatch);
return true;
}
CModifyCharacter* lpCharacter =
lpAgentDispatch->GetModifyCharacterMgr().GetCharacter(lpPktCancelExecuteQuest->m_dwCID);
if(NULL == lpCharacter)
{
ERRLOG0(g_Log, "캐릭터 세션 얻기 실패");
return true;
}
if (true == lpCharacter->CancelQuest(lpPktCancelExecuteQuest->m_wQuestID, true))
{
lpCharacter->SetQuestData();
m_DetailLog.SetBefore("not exist contents");
m_DetailLog.SetAfter("[ExecuteQuest Cancel]\r\nQID: %u", lpPktCancelExecuteQuest->m_wQuestID);
m_DetailLog.InsertLog(m_MyLogID);
lpCharacter->OnChangedInfo(CModifyCharacter::ON_EXTRA);
CSendStream& SendStream = GetSendStream();
char* lpBuffer = SendStream.GetBuffer(sizeof(PktAdminMgr::PktCancelExecuteQuest));
if(NULL != lpBuffer)
{
PktAdminMgr::PktCancelExecuteQuest* lpAck =
reinterpret_cast<PktAdminMgr::PktCancelExecuteQuest*>(lpBuffer);
memcpy(lpAck, lpPktCancelExecuteQuest, sizeof(PktAdminMgr::PktCancelExecuteQuest));
SendStream.WrapCrypt(sizeof(PktAdminMgr::PktCancelExecuteQuest),
PktAdminMgr::PktCMD::PktCancelExecuteQuest, 0, 0);
}
SendResult(PktAdminMgr::PktResult::Success_DeleteQuest);
}
else
{
SendResult(PktAdminMgr::PktResult::Err_DeleteQuest);
}
return true;
}
bool CRylAdminMgrDispatch::PktDeleteHistoryQuest(PktBase* lpPktBase)
{
PktAdminMgr::PktDeleteHistoryQuest* lpPktDeleteHistoryQuest =
static_cast<PktAdminMgr::PktDeleteHistoryQuest*>(lpPktBase);
CRylAgentServerDispatch* lpAgentDispatch =
CAgentServerTable::GetInstance().GetDispatch(lpPktDeleteHistoryQuest->m_dwServerGroup);
if (NULL == lpAgentDispatch)
{
ERRLOG0(g_Log, "중계서버 디스패치 얻기 실패");
SendResult(PktAdminMgr::PktResult::Err_NotFoundAgentDispatch);
return true;
}
CModifyCharacter* lpCharacter =
lpAgentDispatch->GetModifyCharacterMgr().GetCharacter(lpPktDeleteHistoryQuest->m_dwCID);
if (NULL == lpCharacter)
{
ERRLOG0(g_Log, "캐릭터 세션 얻기 실패");
return true;
}
if (true == lpCharacter->DeleteHistoryQuest(lpPktDeleteHistoryQuest->m_wQuestID))
{
lpCharacter->SetQuestData();
m_DetailLog.SetBefore("not exist contents");
m_DetailLog.SetAfter("[HistoryQuest Cancel]\r\nQID: %u", lpPktDeleteHistoryQuest->m_wQuestID);
m_DetailLog.InsertLog(m_MyLogID);
lpCharacter->OnChangedInfo(CModifyCharacter::ON_EXTRA);
CSendStream& SendStream = GetSendStream();
char* lpBuffer = SendStream.GetBuffer(sizeof(PktAdminMgr::PktDeleteHistoryQuest));
if (NULL != lpBuffer)
{
PktAdminMgr::PktDeleteHistoryQuest* lpAck =
reinterpret_cast<PktAdminMgr::PktDeleteHistoryQuest*>(lpBuffer);
memcpy(lpAck, lpPktDeleteHistoryQuest, sizeof(PktAdminMgr::PktDeleteHistoryQuest));
SendStream.WrapCrypt(sizeof(PktAdminMgr::PktDeleteHistoryQuest),
PktAdminMgr::PktCMD::PktDeleteHistoryQuest, 0, 0);
}
SendResult(PktAdminMgr::PktResult::Success_DeleteQuest);
}
else
{
SendResult(PktAdminMgr::PktResult::Err_DeleteQuest);
}
return true;
}
bool CRylAdminMgrDispatch::PktUnifiedGuildInfo(PktBase* lpPktBase)
{
#pragma pack(1)
struct UnifiedGuildInfo
{
unsigned long m_dwBeforeGID;
unsigned char m_cOldServerGroupID;
unsigned long m_dwNewGID;
char m_szBeforeGName[PktAdminMgr::MAX_NAME];
char m_szNewGName[PktAdminMgr::MAX_NAME];
};
#pragma pack()
PktAdminMgr::PktUnifiedGuildInfo* lpPktUnifiedGuildInfo =
reinterpret_cast<PktAdminMgr::PktUnifiedGuildInfo*>(lpPktBase);
CGameDB* lpGameDB = CAgentServerTable::GetInstance().GetGameDB(lpPktUnifiedGuildInfo->m_dwServerGroup);
if (NULL == lpGameDB)
{
ERRLOG1(g_Log, "게임 DB를 얻는데 실패했습니다. 그룹-%u", lpPktUnifiedGuildInfo->m_dwServerGroup);
return true;
}
char szQuery[CDBAdminTool::MAX_QUERY_LENGTH];
_snprintf(szQuery, CDBAdminTool::MAX_QUERY_LENGTH,
"SELECT BeforeGuildID, OldServerGroupID, NewGuildID, BeforeGName, NewGName "
"FROM TblUnifiedGuildList WHERE OldServerGroupID = %d",
lpPktUnifiedGuildInfo->m_nOldServerGroupID);
if (true == lpGameDB->ExecuteQuery(szQuery))
{
UnifiedGuildInfo GetInfo;
ZeroMemory(&GetInfo, sizeof(UnifiedGuildInfo));
while(true == lpGameDB->GetData(&GetInfo))
{
CSendStream& SendStream = GetSendStream();
char* lpBuffer = SendStream.GetBuffer(sizeof(PktAdminMgr::PktUnifiedGuildInfo));
if(NULL != lpBuffer)
{
PktAdminMgr::PktUnifiedGuildInfo* lpPktUnifiedGuildInfo =
reinterpret_cast<PktAdminMgr::PktUnifiedGuildInfo*>(lpBuffer);
lpPktUnifiedGuildInfo->m_cPktType = PktAdminMgr::PktUnifiedGuildInfo::RESULT;
lpPktUnifiedGuildInfo->m_dwBeforeGID = GetInfo.m_dwBeforeGID;
lpPktUnifiedGuildInfo->m_nOldServerGroupID = GetInfo.m_cOldServerGroupID;
lpPktUnifiedGuildInfo->m_dwNewGID = GetInfo.m_dwNewGID;
strncpy(lpPktUnifiedGuildInfo->m_szBeforeGName,
GetInfo.m_szBeforeGName, PktAdminMgr::MAX_NAME);
strncpy(lpPktUnifiedGuildInfo->m_szNewGName,
GetInfo.m_szNewGName, PktAdminMgr::MAX_NAME);
ZeroMemory(&GetInfo, sizeof(UnifiedGuildInfo));
SendStream.WrapCrypt(sizeof(PktAdminMgr::PktUnifiedGuildInfo),
PktAdminMgr::PktCMD::PktUnifiedGuildInfo, 0, 0);
}
}
}
return true;
}
bool CRylAdminMgrDispatch::PktUserNation(PktBase* lpPktBase)
{
PktAdminMgr::PktUserNation* lpPktUserNation = reinterpret_cast<PktAdminMgr::PktUserNation*>(lpPktBase);
CGameDB* lpGameDB = CAgentServerTable::GetInstance().GetGameDB(lpPktUserNation->m_dwServerGroup);
if (NULL == lpGameDB)
{
ERRLOG1(g_Log, "게임 DB를 얻는데 실패했습니다. 그룹-%u", lpPktUserNation->m_dwServerGroup);
return true;
}
unsigned char cNation = 0;
if (true == lpGameDB->GetUserNation(
m_nAgentType, lpPktUserNation->m_dwUID, lpPktUserNation->m_dwCID, &cNation))
{
CSendStream& SendStream = GetSendStream();
char* lpBuffer = SendStream.GetBuffer(sizeof(PktAdminMgr::PktUserNation));
if(NULL != lpBuffer)
{
PktAdminMgr::PktUserNation* lpPktUserNationAck =
reinterpret_cast<PktAdminMgr::PktUserNation*>(lpBuffer);
lpPktUserNationAck->m_dwRequestKey = lpPktUserNation->m_dwRequestKey;
lpPktUserNationAck->m_dwUID = lpPktUserNation->m_dwUID;
lpPktUserNationAck->m_dwCID = lpPktUserNation->m_dwCID;
lpPktUserNationAck->m_cNation = cNation;
cNation = 0;
SendStream.WrapCrypt(sizeof(PktAdminMgr::PktUserNation),
PktAdminMgr::PktCMD::PktUserNation, 0, 0);
}
}
return true;
}
bool CRylAdminMgrDispatch::PktDetailCharInfo(PktBase* lpPktBase)
{
#pragma pack(1)
struct DetailCharInfo
{
unsigned long m_dwCID;
char m_szCharName[PktAdminMgr::MAX_CHARNAME];
unsigned short m_sClass;
unsigned long m_dwFame;
unsigned long m_dwMileage;
unsigned char m_cLevel;
unsigned long m_dwGold;
unsigned __int64 m_i64Exp;
};
#pragma pack()
PktAdminMgr::PktDetailCharInfo* lpPktDetailCharInfo =
reinterpret_cast<PktAdminMgr::PktDetailCharInfo*>(lpPktBase);
char szQuery[CDBAdminTool::MAX_QUERY_LENGTH];
_snprintf(szQuery, CDBAdminTool::MAX_QUERY_LENGTH,
"SELECT CID, Name, Class, Fame, Mileage, Level, Gold, Exp FROM CharInfo WHERE CID = %u",
lpPktDetailCharInfo->m_dwCID);
CGameDB* lpGameDB = CAgentServerTable::GetInstance().GetGameDB(lpPktDetailCharInfo->m_dwServerGroup);
if (NULL == lpGameDB)
{
ERRLOG1(g_Log, "게임 DB를 얻는데 실패했습니다. 그룹-%u", lpPktDetailCharInfo->m_dwServerGroup);
return true;
}
if (true == lpGameDB->ExecuteQuery(szQuery))
{
DetailCharInfo GetInfo;
ZeroMemory(&GetInfo, sizeof(DetailCharInfo));
while(true == lpGameDB->GetData(&GetInfo))
{
CSendStream& SendStream = GetSendStream();
char* lpBuffer = SendStream.GetBuffer(sizeof(PktAdminMgr::PktDetailCharInfo));
if (NULL != lpBuffer)
{
PktAdminMgr::PktDetailCharInfo* lpPktDetailCharInfo =
reinterpret_cast<PktAdminMgr::PktDetailCharInfo*>(lpBuffer);
lpPktDetailCharInfo->m_dwCID = GetInfo.m_dwCID;
lpPktDetailCharInfo->m_sClass = GetInfo.m_sClass;
lpPktDetailCharInfo->m_dwFame = GetInfo.m_dwFame;
lpPktDetailCharInfo->m_dwMileage = GetInfo.m_dwMileage;
lpPktDetailCharInfo->m_cLevel = GetInfo.m_cLevel;
lpPktDetailCharInfo->m_dwGold = GetInfo.m_dwGold;
lpPktDetailCharInfo->m_i64Exp = GetInfo.m_i64Exp;
strncpy(lpPktDetailCharInfo->m_szCharName, GetInfo.m_szCharName, PktAdminMgr::MAX_CHARNAME);
ZeroMemory(&GetInfo, sizeof(DetailCharInfo));
SendStream.WrapCrypt(sizeof(PktAdminMgr::PktDetailCharInfo),
PktAdminMgr::PktCMD::PktDetailCharInfo, 0, 0);
}
}
}
return true;
}
bool CRylAdminMgrDispatch::PktShiftToUID(PktBase* lpPktBase)
{
PktAdminMgr::PktShiftToUID* lpPktShiftToUID =
reinterpret_cast<PktAdminMgr::PktShiftToUID*>(lpPktBase);
bool IsGeted = false;
unsigned long dwUID = 0;
char szAccount[PktAdminMgr::MAX_ACCOUNT] = "";
CAuthDB* lpAuthDB = CAgentServerTable::GetInstance().GetAuthDB();
if (NULL != lpAuthDB)
{
if (PktAdminMgr::PktShiftToUID::UID_TO_ACCOUNT == lpPktShiftToUID->m_cPktType)
{
IsGeted = lpAuthDB->GetAccountFromUID(lpPktShiftToUID->m_dwUID, szAccount);
}
else if (PktAdminMgr::PktShiftToUID::ACCOUNT_TO_UID == lpPktShiftToUID->m_cPktType)
{
dwUID = lpAuthDB->GetUIDFromAccount(lpPktShiftToUID->m_szAccount);
}
}
CSendStream& SendStream = GetSendStream();
char* lpBuffer = SendStream.GetBuffer(sizeof(PktAdminMgr::PktShiftToUID));
if (NULL != lpBuffer)
{
PktAdminMgr::PktShiftToUID* lpPktShiftToUIDAck =
reinterpret_cast<PktAdminMgr::PktShiftToUID*>(lpBuffer);
lpPktShiftToUIDAck->m_cPktType = lpPktShiftToUID->m_cPktType;
lpPktShiftToUIDAck->m_dwUID = dwUID;
if (true == IsGeted)
{
strncpy(lpPktShiftToUIDAck->m_szAccount, szAccount, PktAdminMgr::MAX_ACCOUNT);
}
else
{
strncpy(lpPktShiftToUIDAck->m_szAccount, "Not exist", PktAdminMgr::MAX_ACCOUNT);
}
SendStream.WrapCrypt(sizeof(PktAdminMgr::PktShiftToUID),
PktAdminMgr::PktCMD::PktShiftToUID, 0, 0);
}
return true;
}
bool CRylAdminMgrDispatch::PktStoreTabEdit(PktBase* lpPktBase)
{
PktAdminMgr::PktStoreTabEdit* lpPktStoreEdit =
reinterpret_cast<PktAdminMgr::PktStoreTabEdit*>(lpPktBase);
CRylAgentServerDispatch* lpAgentDispatch =
CAgentServerTable::GetInstance().GetDispatch(lpPktStoreEdit->m_dwServerGroup);
if (NULL != lpAgentDispatch)
{
CModifyCharacter* lpCharacter =
lpAgentDispatch->GetModifyCharacterMgr().GetCharacter(lpPktStoreEdit->m_dwCID);
if ((NULL != lpCharacter) && (lpPktStoreEdit->m_nTabNum < 5))
{
Item::CDepositContainer& DepositContainer = lpCharacter->GetDeposit();
m_DetailLog.SetBefore("[Store Tab Edit]\nBefore Tab Num: %d", DepositContainer.GetMaxTabNum());
unsigned long dwTabFlag = 0;
switch(lpPktStoreEdit->m_nTabNum)
{
case 1:
dwTabFlag =
PktDepositUpdateDB::ITEM_TAB1 | PktDepositUpdateDB::USED_DEPOSIT;
case 2:
dwTabFlag =
PktDepositUpdateDB::ITEM_TAB1 | PktDepositUpdateDB::ITEM_TAB2
| PktDepositUpdateDB::USED_DEPOSIT;
break;
case 3:
dwTabFlag =
PktDepositUpdateDB::ITEM_TAB1 | PktDepositUpdateDB::ITEM_TAB2
| PktDepositUpdateDB::ITEM_TAB3 | PktDepositUpdateDB::USED_DEPOSIT;
break;
case 4:
dwTabFlag =
PktDepositUpdateDB::ITEM_TAB1 | PktDepositUpdateDB::ITEM_TAB2
| PktDepositUpdateDB::ITEM_TAB3 | PktDepositUpdateDB::ITEM_TAB4
| PktDepositUpdateDB::USED_DEPOSIT;
break;
default:
dwTabFlag =
PktDepositUpdateDB::ITEM_TAB1 | PktDepositUpdateDB::ITEM_TAB2
| PktDepositUpdateDB::ITEM_TAB3 | PktDepositUpdateDB::ITEM_TAB4
| PktDepositUpdateDB::USED_DEPOSIT;
break;
}
DepositContainer.SetTabFlag(dwTabFlag);
m_DetailLog.SetAfter("After Tab Num: %d", lpPktStoreEdit->m_nTabNum);
m_DetailLog.InsertLog(m_MyLogID);
// 성공 결과 보내기
SendResult(PktAdminMgr::PktResult::Success_StoreTabEdit);
lpCharacter->OnChangedInfo(CModifyCharacter::ON_EXTRA);
CSendStream& SendStream = GetSendStream();
char* lpBuffer = SendStream.GetBuffer(sizeof(PktAdminMgr::PktStoreTabEdit));
if (NULL != lpBuffer)
{
PktAdminMgr::PktStoreTabEdit* lpAck =
reinterpret_cast<PktAdminMgr::PktStoreTabEdit*>(lpBuffer);
lpAck->m_dwRequestKey = lpPktStoreEdit->m_dwRequestKey;
lpAck->m_dwServerGroup = dwTabFlag; // Ack일때 용도 변경;
lpAck->m_dwCID = lpPktStoreEdit->m_dwCID;
lpAck->m_nTabNum = lpPktStoreEdit->m_nTabNum;
SendStream.WrapCrypt(sizeof(PktAdminMgr::PktStoreTabEdit),
PktAdminMgr::PktCMD::PktStoreTabEdit, 0, 0);
}
}
else
{
ERRLOG2(g_Log, "캐릭터가 존재하지 않거나 잘못된 탭수입니다. CID: %u, Tab: %u",
lpPktStoreEdit->m_dwCID, lpPktStoreEdit->m_nTabNum);
}
}
return true;
}
bool CRylAdminMgrDispatch::PktAmountOfGold(PktBase* lpPktBase)
{
PktAdminMgr::PktAmountOfGold* lpPktAmountOfGold =
reinterpret_cast<PktAdminMgr::PktAmountOfGold*>(lpPktBase);
// 쿼리 시간이 너무 오래 걸려서 보류~
return true;
}
bool CRylAdminMgrDispatch::PktGMLogMsg(PktBase* lpPktBase)
{
#pragma pack(1)
struct GMLogMsgInfo
{
unsigned long m_dwLogID;
char m_szEditDate[PktAdminMgr::MAX_TIME];
char m_szLogMsg[PktAdminMgr::MAX_LOG];
char m_szAdminID[PktAdminMgr::MAX_ACCOUNT];
};
#pragma pack()
PktAdminMgr::PktGMLogMsg* lpPktGMLogMsg =
reinterpret_cast<PktAdminMgr::PktGMLogMsg*>(lpPktBase);
CDBAdminTool* lpAdminToolDB = &(CDBAdminTool::GetInstance());
if (NULL == lpAdminToolDB)
{
ERRLOG0(g_Log, "운영 DB를 얻는데 실패했습니다");
return true;
}
bool bListRefresh = false;
switch(lpPktGMLogMsg->m_cPktType)
{
case PktAdminMgr::PktGMLogMsg::LOG_CONFIRM:
{
if (true == lpAdminToolDB->IsExistLogMsg(lpPktGMLogMsg))
{
CSendStream& SendStream = GetSendStream();
char* lpBuffer = SendStream.GetBuffer(sizeof(PktAdminMgr::PktGMLogMsg));
if (NULL != lpBuffer)
{
PktAdminMgr::PktGMLogMsg* lpAck =
reinterpret_cast<PktAdminMgr::PktGMLogMsg*>(lpBuffer);
lpAck->m_cPktType = PktAdminMgr::PktGMLogMsg::LOG_CONFIRM;
lpAck->m_dwUID = lpPktGMLogMsg->m_dwUID;
lpAck->m_dwCID = lpPktGMLogMsg->m_dwCID;
lpAck->m_dwServerGroup = lpPktGMLogMsg->m_dwServerGroup;
SendStream.WrapCrypt(sizeof(PktAdminMgr::PktGMLogMsg),
PktAdminMgr::PktCMD::PktGMLogMsg, 0, 0);
}
}
}
break;
case PktAdminMgr::PktGMLogMsg::LOG_SELECT:
{
char szQuery[CDBAdminTool::MAX_QUERY_LENGTH];
if (0 == lpPktGMLogMsg->m_dwCID)
{
_snprintf(szQuery, CDBAdminTool::MAX_QUERY_LENGTH,
"SELECT LogID, CONVERT(VARCHAR(20), EditDate, 120), LogMsg, AdminID "
"FROM TblGMLogMsg WHERE UID = %u AND CID = 0", lpPktGMLogMsg->m_dwUID);
}
else
{
_snprintf(szQuery, CDBAdminTool::MAX_QUERY_LENGTH,
"SELECT LogID, CONVERT(VARCHAR(20), EditDate, 120), LogMsg, AdminID "
"FROM TblGMLogMsg WHERE CID = %u AND ServerGroupID = %u",
lpPktGMLogMsg->m_dwCID, lpPktGMLogMsg->m_dwServerGroup);
}
if (true == lpAdminToolDB->ExecuteQuery(szQuery))
{
GMLogMsgInfo stGMLogMsgInfo;
ZeroMemory(&stGMLogMsgInfo, sizeof(GMLogMsgInfo));
while(true == lpAdminToolDB->GetData(&stGMLogMsgInfo))
{
CSendStream& SendStream = GetSendStream();
char* lpBuffer = SendStream.GetBuffer(sizeof(PktAdminMgr::PktGMLogMsg));
if(NULL != lpBuffer)
{
PktAdminMgr::PktGMLogMsg* lpAck =
reinterpret_cast<PktAdminMgr::PktGMLogMsg*>(lpBuffer);
lpAck->m_dwLogID = stGMLogMsgInfo.m_dwLogID;
lpAck->m_cPktType = PktAdminMgr::PktGMLogMsg::LOG_SELECT;
lpAck->m_dwUID = lpPktGMLogMsg->m_dwUID;
lpAck->m_dwCID = lpPktGMLogMsg->m_dwCID;
lpAck->m_dwServerGroup = lpPktGMLogMsg->m_dwServerGroup;
strncpy(lpAck->m_szLogMsg, stGMLogMsgInfo.m_szLogMsg, PktAdminMgr::MAX_LOG);
strncpy(lpAck->m_szEditDate, stGMLogMsgInfo.m_szEditDate, PktAdminMgr::MAX_TIME);
strncpy(lpAck->m_szAdminID, stGMLogMsgInfo.m_szAdminID, PktAdminMgr::MAX_ACCOUNT);
ZeroMemory(&stGMLogMsgInfo, sizeof(GMLogMsgInfo));
SendStream.WrapCrypt(sizeof(PktAdminMgr::PktGMLogMsg),
PktAdminMgr::PktCMD::PktGMLogMsg, 0, 0);
}
}
}
else
{
ERRLOG1(g_Log, "GM 로그 셀렉트 실패. 쿼리- %s", lpAdminToolDB->GetErrorString());
}
}
break;
case PktAdminMgr::PktGMLogMsg::LOG_INSERT:
{
if (true == lpAdminToolDB->InsertGMLogMsg(lpPktGMLogMsg, m_szAccount))
{
bListRefresh = true;
}
else
{
ERRLOG0(g_Log, "GM 로그 삽입 실패");
}
}
break;
case PktAdminMgr::PktGMLogMsg::LOG_UPDATE:
{
if (true == lpAdminToolDB->UpdateGMLogMsg(lpPktGMLogMsg, m_szAccount))
{
bListRefresh = true;
}
else
{
ERRLOG0(g_Log, "GM 로그 업데이트 실패");
}
}
break;
case PktAdminMgr::PktGMLogMsg::LOG_DELETE:
{
if (true == lpAdminToolDB->DeleteGMLogMsg(lpPktGMLogMsg))
{
bListRefresh = true;
}
else
{
ERRLOG0(g_Log, "GM 로그 삭제 실패");
}
}
break;
default:
break;
}
// GM 로그 리스트 갱신 (LOG_INSERT, LOG_UPDATE, LOG_DELETE일 경우 Ack)
if (true == bListRefresh)
{
CSendStream& SendStream = GetSendStream();
char* lpBuffer = SendStream.GetBuffer(sizeof(PktAdminMgr::PktGMLogMsg));
if (NULL != lpBuffer)
{
PktAdminMgr::PktGMLogMsg* lpAck =
reinterpret_cast<PktAdminMgr::PktGMLogMsg*>(lpBuffer);
lpAck->m_cPktType = PktAdminMgr::PktGMLogMsg::LOG_REFRESH;
lpAck->m_dwServerGroup = lpPktGMLogMsg->m_dwServerGroup;
lpAck->m_dwUID = lpPktGMLogMsg->m_dwUID;
lpAck->m_dwCID = lpPktGMLogMsg->m_dwCID;
SendStream.WrapCrypt(sizeof(PktAdminMgr::PktGMLogMsg),
PktAdminMgr::PktCMD::PktGMLogMsg, 0, 0);
}
}
return true;
}
bool CRylAdminMgrDispatch::PktNameChangeCount(PktBase* lpPktBase)
{
PktAdminMgr::PktNameChangeCount* lpPktNameChangeCount =
reinterpret_cast<PktAdminMgr::PktNameChangeCount*>(lpPktBase);
CRylAgentServerDispatch* lpAgentDispatch =
CAgentServerTable::GetInstance().GetDispatch(lpPktNameChangeCount->m_dwServerGroup);
if(NULL == lpAgentDispatch)
{
SendResult(PktAdminMgr::PktResult::Err_NotFoundAgentDispatch);
return true;
}
CModifyCharacter* lpModifyCharacter =
lpAgentDispatch->GetModifyCharacterMgr().GetCharacter(lpPktNameChangeCount->m_dwCID);
if(NULL == lpModifyCharacter)
{
SendResult(PktAdminMgr::PktResult::Err_Invalid_Character);
return true;
}
m_DetailLog.SetBefore("[NameChange Chance]\r\nServerGroup: %u"
"\r\nCID: %u\r\nChance: %d", lpModifyCharacter->GetServerGroup(),
lpModifyCharacter->GetCID(), lpModifyCharacter->GetNameChangeChance());
lpModifyCharacter->SetNameChangeChance(lpPktNameChangeCount->m_cNameChangeCount);
lpModifyCharacter->OnChangedInfo(CModifyCharacter::MASK::ON_EXTRA);
m_DetailLog.SetAfter("Chance: %d", lpModifyCharacter->GetNameChangeCount());
m_DetailLog.InsertLog(m_MyLogID);
SendResult(PktAdminMgr::PktResult::Success_NameChangeCount);
return true;
}
bool CRylAdminMgrDispatch::PktGuildMemberEdit(PktBase* lpPktBase)
{
PktAdminMgr::PktGuildMemberEdit* lpPktGuildMemberEdit =
reinterpret_cast<PktAdminMgr::PktGuildMemberEdit*>(lpPktBase);
CRylAgentServerDispatch* lpAgentDispatch =
CAgentServerTable::GetInstance().GetDispatch(lpPktGuildMemberEdit->m_dwServerGroup);
if (NULL == lpAgentDispatch)
{
SendResult(PktAdminMgr::PktResult::Err_NotFoundAgentDispatch);
return true;
}
CBuffer* lpBuffer = CREATE_BUFFER(GetBufferFactory(), sizeof(PktGuildPosition));
PktGuildPosition* lpPktGuildPosition = reinterpret_cast<PktGuildPosition*>(lpBuffer->begin());
lpPktGuildPosition->m_dwGID = lpPktGuildMemberEdit->m_dwGID;
lpPktGuildPosition->m_dwCID = lpPktGuildMemberEdit->m_dwCID;
lpPktGuildPosition->m_cPosition = lpPktGuildMemberEdit->m_cPosition;
lpPktGuildPosition->m_cType = lpPktGuildMemberEdit->m_cType;
bool bIsReleased = true;
if (false == PacketWrap::WrapHeader(lpBuffer, sizeof(PktGuildPosition), CmdGuildPosition, 0, 0))
{
ERRLOG0(g_Log, "길드 멤버 관리 패킷 랩핑 실패");
bIsReleased = false;
}
else
{
if (false == lpAgentDispatch->Send(lpBuffer))
{
ERRLOG0(g_Log, "길드 멤버 관리 패킷 보내기 실패");
bIsReleased = false;
}
}
if (false == bIsReleased)
{
SAFE_RELEASE_BUFFER(lpBuffer);
}
return true;
}
// 추가 : 2005-11-17
bool CRylAdminMgrDispatch::PktSearchCharInfoTime(PktBase* lpPktBase)
{
#pragma pack(1)
struct In_DBRowData
{
char m_szCreateTime[PktAdminMgr::MAX_TIME];
char m_szUpdateTime[PktAdminMgr::MAX_TIME];
};
#pragma pack()
using namespace PktAdminMgr;
typedef PktAdminMgr::PktCharInfoTime PktSearchData;
PktSearchData* lpSearch = static_cast<PktSearchData*>(lpPktBase);
char szQuery[CDBAdminTool::MAX_QUERY_LENGTH];
ZeroMemory(szQuery, CDBAdminTool::MAX_QUERY_LENGTH);
CGameDB* lpGameDB = CAgentServerTable::GetInstance().GetGameDB(lpSearch->m_dwServerGroup);
if(NULL == lpGameDB)
{
ERRLOG0(g_Log, "게임DB 핸들 생성 실패");
SendResult(PktAdminMgr::PktResult::Err_Database);
return false;
}
// Query 생성
DWORD dwCID = 0;
if(PktAdminMgr::PktCharInfoTime::Type::SearchName == lpSearch->m_SearchType)
{
if(FALSE == lpGameDB->CharacterNameByCID(lpSearch->m_szName, &dwCID))
{
SendResult(PktAdminMgr::PktResult::Err_Invalid_Character);
return true;
}
}
else
{
char szDummy[PktAdminMgr::MAX_CHARNAME];
if(FALSE == lpGameDB->CIDByCharacterName(lpSearch->m_dwCID, szDummy))
{
SendResult(PktAdminMgr::PktResult::Err_Invalid_Character);
return true;
}
dwCID = lpSearch->m_dwCID;
}
_snprintf(szQuery, CDBAdminTool::MAX_QUERY_LENGTH,
"SELECT CONVERT(VARCHAR(20), CreateTime, 120), CONVERT(VARCHAR(20), UpdateTime, 120) "
"FROM CharInfo_Time WHERE CID = %d",
dwCID);
// Process
if(FALSE == lpGameDB->ExecuteQuery(szQuery))
{
ERRLOG2(g_Log, "쿼리 실패: query-%s, err-%s",
szQuery, lpGameDB->GetErrorString());
SendResult(PktAdminMgr::PktResult::Err_Database);
return false;
}
In_DBRowData In_Data;
ZeroMemory(&In_Data, sizeof(In_DBRowData));
while(TRUE == lpGameDB->GetData(&In_Data))
{
CSendStream& SendStream = GetSendStream();
char* lpBuffer = SendStream.GetBuffer(sizeof(PktAdminMgr::PktCharInfoTimeResultAck));
if(NULL == lpBuffer)
{
ERRLOG0(g_Log, "버퍼 생성 실패");
SendResult(PktAdminMgr::PktResult::Err_Unknown);
return false;
}
PktAdminMgr::PktCharInfoTimeResultAck* lpSendBuffer =
reinterpret_cast<PktAdminMgr::PktCharInfoTimeResultAck*>(lpBuffer);
strncpy(lpSendBuffer->m_CreateTime, In_Data.m_szCreateTime, PktAdminMgr::MAX_TIME);
strncpy(lpSendBuffer->m_UpdateTime, In_Data.m_szUpdateTime, PktAdminMgr::MAX_TIME);
SendStream.WrapCrypt(sizeof(PktAdminMgr::PktCharInfoTimeResultAck),
PktAdminMgr::PktCMD::PktGetCharInfoTimeAck, 0, 0);
ZeroMemory(&In_Data, sizeof(In_DBRowData));
}
return true;
}
// 아이템 인덱스로 이름 얻기;
char* CRylAdminMgrDispatch::GetItemState(unsigned char cTake)
{
switch(cTake)
{
case TakeType::TS_INVEN: return "Inventory";
case TakeType::TS_EQUIP: return "Equip";
case TakeType::TS_DEPOSIT: return "Deposit";
case TakeType::TS_EXCHANGE: return "Exchange";
case TakeType::TS_STALL: return "Stall";
case TakeType::TS_EXTRA: return "Extra";
case TakeType::TS_TEMP: return "Temp";
case TakeType::TS_TEMPINVEN: return "TempInven";
case TakeType::TS_NONE: return "None";
}
return "Unknown";
}
// 보류 코드 -----------------------------------------------------------------------------------------------------
bool CRylAdminMgrDispatch::PktDelCharacter(PktBase* lpPktBase)
{
return true;
}