Restructure repository to include all source folders

Move git root from Client/ to src/ to track all source code:
- Client: Game client source (moved to Client/Client/)
- Server: Game server source
- GameTools: Development tools
- CryptoSource: Encryption utilities
- database: Database scripts
- Script: Game scripts
- rylCoder_16.02.2008_src: Legacy coder tools
- GMFont, Game: Additional resources

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

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-11-29 20:17:20 +09:00
parent 5d3cd64a25
commit dd97ddec92
11602 changed files with 1446576 additions and 0 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,32 @@
#ifndef _DBAGENT_SERVER_PARSE_CASTLE_H_
#define _DBAGENT_SERVER_PARSE_CASTLE_H_
class CSendStream;
struct PktBase;
namespace DBAgent
{
namespace ParseCastle
{
bool CastleCmd(CSendStream& SendStream, PktBase* lpPktBase);
bool SiegeArmsCmd(CSendStream& SendStream, PktBase* lpPktBase);
bool SetCastleRight(CSendStream& SendStream, PktBase* lpPktBase);
bool SetCampRight(CSendStream& SendStream, PktBase* lpPktBase);
bool CreateCamp(CSendStream& SendStream, PktBase* lpPktBase);
bool CreateSiegeArms(CSendStream& SendStream, PktBase* lpPktBase);
bool CampCmd(CSendStream& SendStream, PktBase* lpPktBase);
bool CampMessage(CSendStream& SendStream, PktBase* lpPktBase);
bool MiningCampMineralInfo(CSendStream& SendStream, PktBase* lpPktBase);
bool FertilityInfo(CSendStream& SendStream, PktBase* lpPktBase);
bool CampShopInfo(CSendStream& SendStream, PktBase* lpPktBase);
bool CastleTaxMove(CSendStream& SendStream, PktBase* lpPktBase);
bool CastleMineralInfo(CSendStream& SendStream, PktBase* lpPktBase);
bool WarOnOff(CSendStream& SendStream, PktBase* lpPktBase);
bool StatueCmd(CSendStream& SendSream, PktBase* lpPktBase);
bool RealmPoint(CSendStream& SendSream, PktBase* lpPktBase);
}
}
#endif

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,39 @@
#ifndef _DBAGENT_SERVER_PARSE_CHAR_MANAGE_H_
#define _DBAGENT_SERVER_PARSE_CHAR_MANAGE_H_
// forward decl;
class CSendStream;
struct PktDD;
struct PktBase;
namespace DBAgent
{
namespace DataStorage
{
// forward decl.
class CItemSerialMgr;
}
namespace ParseCharManage
{
// --------------------------------------------------------------------
// 캐릭터 관리 및 세션 메소드
bool Parse(CSendStream& SendStream, unsigned long dwServerID,
Item::CItemSerialMgr& itemSerialMgr, PktDD* lpPktDD);
// --------------------------------------------------------------------
// 배틀그라운드 서버군 관련 메소드.
// 배섭 게임서버가 중계서버로 캐릭터 슬롯 정보 요청.
bool BGServerCharSlot(CSendStream& SendStream, PktBase* lpPktBase);
// 서버통합 관련 메소드
bool UnifiedCharSelect(CSendStream& SendStream, PktBase* lpPktBase);
}
}
#endif

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,62 @@
#ifndef _DBAGENT_SERVER_PARSE_CHAR_UPDATE_H_
#define _DBAGENT_SERVER_PARSE_CHAR_UPDATE_H_
#include <Network/Packet/PacketStruct/CharLoginOutPacket.h>
// forward delc.
class CSendStream;
namespace Item
{
// forward decl.
class CItemSerialMgr;
};
namespace DBAgent
{
namespace ParseCharUpdate
{
// ------------------------------------------------------------------------
// 캐릭터 업데이트 데이터 파싱
bool Parse(CSendStream& SendStream, unsigned long dwServerID,
Item::CItemSerialMgr& itemSerialMgr, PktDBUpdate* lpPktDBUpdate);
// ------------------------------------------------------------------------
// 데이터 업데이트 메서드
bool UpdateDeposit(CSendStream& SendStream, PktBase* lpPktBase);
bool UpdateDepositDB(CSendStream& SendStream, PktBase* lpPktBase);
bool UpdateFriendDB(CSendStream& SendStream, PktBase* lpPktBase);
bool UpdateQuestDB(CSendStream& SendStream, PktBase* lpPktBase);
bool UpdateConfigInfoDB(CSendStream& SendStream, PktBase* lpPktBase);
//--------------------------------------------------------------------------
// 듀얼 관련 정보 저장.
bool SaveEnemy(CSendStream& SendStream, PktBase* lpPktBase);
//--------------------------------------------------------------------------
// 조이스틱 키 관련.
bool UpdateKeyInfo(CSendStream& SendStream, PktBase* lpPktBase);
// 캐쉬아이템 사용
bool UseCashItem(CSendStream& SendStream, PktBase* lpPktBase);
// 엑스트라 이벤트
bool ExtraEvent(CSendStream& SendStream, PktBase* lpPktBase);
}
namespace ParseCharAdmin
{
bool AdminCommandLog(CSendStream& SendStream, PktBase* lpPktBase);
}
}
#endif

View File

@@ -0,0 +1,903 @@
#include "stdafx.h"
#include "ParseGuild.h"
#include <Network/Packet/WrapPacket.h>
#include <Network/Packet/PacketCommand.h>
#include <Network/Packet/PacketStruct/GuildPacket.h>
#include <Network/Stream/SendStream.h>
#include <Network/Dispatch/GameDispatch.h>
#include <Network/SendPacket/SendGuild.h>
#include <Community/Guild/GuildDB.h>
#include <Community/Guild/GuildDBMgr.h>
#include <DB/DBComponent.h>
#include <DB/GuildDBComponent.h>
#include <Log/ServerLog.h>
#include <DataStorage/SessionDataMgr.h>
#include <DataStorage/CharacterData.h>
#include <Network/Packet/PacketStruct/CastlePacket.h>
#include <GameTime/GameTimeConstants.h>
#include <GameTime/GameTimeDBMgr.h>
#include <DB/GameDBComponent.h>
namespace DBAgent
{
namespace ParseGuild
{
bool CreateGuild(CSendStream& SendStream, PktBase* lpPktBase)
{
PktCreateGuild* lpPktCreateGuild = static_cast<PktCreateGuild*>(lpPktBase);
unsigned short wError = PktBase::NO_SERVER_ERR;
CGuildDB* lpGuild = Guild::CGuildDBMgr::GetInstance().CreateGuild(
lpPktCreateGuild->m_dwCID, lpPktCreateGuild->m_cInclination,
lpPktCreateGuild->m_szGuildName, &wError);
PktCreateGuild pktGCAck;
memset(&pktGCAck, 0, sizeof(PktCreateGuild));
pktGCAck.m_dwCID = lpPktCreateGuild->m_dwCID;
pktGCAck.m_dwGID = (NULL != lpGuild) ? lpGuild->GetGID() : 0;
pktGCAck.m_cInclination = lpPktCreateGuild->m_cInclination;
strncpy(pktGCAck.m_szGuildName, lpPktCreateGuild->m_szGuildName, Guild::MAX_GUILD_NAME_LEN);
if(PacketWrap::WrapHeader(reinterpret_cast<char*>(&pktGCAck),
sizeof(PktCreateGuild), CmdCreateGuild, 0, wError))
{
if (PktBase::NO_SERVER_ERR == wError)
{
using namespace DBAgent::DataStorage;
CSessionData* lpSessionData = CSessionDataMgr::GetInstance().GetCharLoadedSession(lpPktCreateGuild->m_dwCID);
if(lpSessionData)
{
CCharacterData* lpCharacterData = lpSessionData->GetCharacterData();
if(lpCharacterData)
{
// edith 2008.11.24 길드생성시 전쟁 자동참가
lpCharacterData->SetGuildWarFlag(Creature::WAR_ON);
PktWarOnOff* lpPktWarOnOffAck = reinterpret_cast<PktWarOnOff*>(SendStream.GetBuffer(sizeof(PktWarOnOff)));
if (lpPktWarOnOffAck)
{
lpPktWarOnOffAck->m_dwCID = lpCharacterData->GetCID();
lpPktWarOnOffAck->m_cType = GameTime::GUILD;
lpPktWarOnOffAck->m_cFlag = Creature::WAR_ON;
SendStream.WrapHeader(sizeof(PktWarOnOff), CmdWarOnOff, 0, 0);
}
}
}
DBAgent::CGameDispatch::GetDispatchTable().Process(CSendPacketAllServer(
reinterpret_cast<char*>(&pktGCAck), sizeof(PktCreateGuild), CmdCreateGuild));
}
else
{
SendStream.PutBuffer(reinterpret_cast<char*>(&pktGCAck),
sizeof(PktCreateGuild), CmdCreateGuild);
}
return true;
}
return false;
}
bool GuildCmd(CSendStream& SendStream, PktBase* lpPktBase)
{
PktGuildCmd* lpPktGuildCmd = static_cast<PktGuildCmd*>(lpPktBase);
unsigned short wError = PktBase::NO_SERVER_ERR;
unsigned long dwGID = lpPktGuildCmd->m_dwGID;
unsigned long dwSenderID = lpPktGuildCmd->m_dwSenderID;
unsigned long dwReferenceID = lpPktGuildCmd->m_dwReferenceID;
unsigned short wCmd = lpPktGuildCmd->m_wCmd;
using namespace Guild;
CGuildDB* lpGuild = static_cast<CGuildDB*>(CGuildDBMgr::GetInstance().GetGuild(dwGID));
if (0 == lpGuild)
{
wError = PktBase::SERVER_ERROR;
}
else
{
switch (wCmd)
{
case PktGuildCmd::GC_JOIN:
{
// 가입한 멤버 정보를 뒤에 붙여 다른 크기의 패킷을 만들기 때문에 함수 내에서 독자적으로 패킷을 보낸다.
lpGuild->SendJoinMember(&SendStream, dwSenderID, static_cast<unsigned char>(dwReferenceID));
return true;
}
case PktGuildCmd::GC_TACTICS:
{
// 용병 가입 신청.
lpGuild->SendJoinTacticsMember(&SendStream, dwSenderID, static_cast<unsigned char>(dwReferenceID), PktGuildCmd::GC_TACTICS);
return true;
}
case PktGuildCmd::GC_TACTICS_JOIN:
{
// 용병 가입 신청.
lpGuild->SendJoinTacticsMember(&SendStream, dwSenderID, static_cast<unsigned char>(dwReferenceID), PktGuildCmd::GC_TACTICS_JOIN);
return true;
}
case PktGuildCmd::GC_TACTICS_TITLE:
case PktGuildCmd::GC_TACTICS_REQUEST:
{
using namespace DBAgent::DataStorage;
// 용병 허가.
unsigned char cTitle = static_cast<unsigned char>(dwReferenceID);
CSessionData* lpSessionData = CSessionDataMgr::GetInstance().GetCharLoadedSession(dwSenderID);
if(wCmd==PktGuildCmd::GC_TACTICS_REQUEST)
goto lb_request;
if(CGameTimeDBMgr::GetInstance().IsGuildWarTime())
{
if(lpSessionData)
{
CCharacterData* lpCharacterData = lpSessionData->GetCharacterData();
if(lpCharacterData)
{
SendPacket::GuildCmd(&SendStream, dwGID, dwSenderID, COMMON, PktGuildCmd::GC_TACTICS_REQUEST, NULL, NULL, wError);
}
else
{
goto lb_error;
}
}
else
{
lb_error:
PktGuildCmd pktGuildCmd;
memset(&pktGuildCmd, 0, sizeof(PktGuildCmd));
strcpy(pktGuildCmd.m_szSenderName, lpPktGuildCmd->m_szSenderName);
pktGuildCmd.m_dwGID = dwGID;
pktGuildCmd.m_dwSenderID = dwSenderID;
pktGuildCmd.m_dwReferenceID = COMMON;
pktGuildCmd.m_wCmd = PktGuildCmd::GC_TACTICS_TITLE;
SendStream.WrapCompress(reinterpret_cast<char*>(&pktGuildCmd), sizeof(PktGuildCmd), CmdGuildCmd, 0, PktGuildCmd::FAIL_TACTICS_LOGOUT);
}
}
else
{
lb_request:
lpGuild->SetTacticsMember(dwSenderID, Guild::TACTICS);
lpGuild->SetTitle(dwSenderID, COMMON);
SendPacket::GuildCmd(&SendStream, dwGID, dwSenderID, COMMON, PktGuildCmd::GC_TACTICS_TITLE, NULL, NULL, wError);
DBComponent::GuildDB::UpdateGuildMemberTactics(CDBSingleObject::GetInstance(), lpGuild->GetGID(), dwSenderID, Guild::TACTICS);
if(lpSessionData)
{
CCharacterData* lpCharacterData = lpSessionData->GetCharacterData();
if(lpCharacterData)
{
lpCharacterData->SetGuildWarFlag(Creature::WAR_ON);
PktWarOnOff* lpPktWarOnOffAck = reinterpret_cast<PktWarOnOff*>(SendStream.GetBuffer(sizeof(PktWarOnOff)));
if (lpPktWarOnOffAck)
{
lpPktWarOnOffAck->m_dwCID = lpCharacterData->GetCID();
lpPktWarOnOffAck->m_cType = GameTime::GUILD;
lpPktWarOnOffAck->m_cFlag = Creature::WAR_ON;
SendStream.WrapHeader(sizeof(PktWarOnOff), CmdWarOnOff, 0, 0);
}
}
}
else
{
DBComponent::GameDB::UpdateGuildWarFlag(CDBSingleObject::GetInstance(), dwSenderID, Creature::WAR_ON);
}
}
return true;
}
case PktGuildCmd::GC_TACTICS_KICK:
case PktGuildCmd::GC_TACTICS_LEAVE:
{
// 용병 퇴출 및 탈퇴.
if (false == lpGuild->LeaveMember(dwSenderID))
{
wError = PktBase::SERVER_ERROR;
}
SendPacket::GuildCmd(&SendStream, dwGID, dwSenderID, dwReferenceID, wCmd, NULL, NULL, wError);
using namespace DBAgent::DataStorage;
CSessionData* lpSessionData = CSessionDataMgr::GetInstance().GetCharLoadedSession(dwSenderID);
if(lpSessionData)
{
CCharacterData* lpCharacterData = lpSessionData->GetCharacterData();
if(lpCharacterData)
{
lpCharacterData->SetGuildWarFlag(Creature::WAR_OFF);
PktWarOnOff* lpPktWarOnOffAck = reinterpret_cast<PktWarOnOff*>(SendStream.GetBuffer(sizeof(PktWarOnOff)));
if (lpPktWarOnOffAck)
{
lpPktWarOnOffAck->m_dwCID = lpCharacterData->GetCID();
lpPktWarOnOffAck->m_cType = GameTime::GUILD;
lpPktWarOnOffAck->m_cFlag = Creature::WAR_OFF;
SendStream.WrapHeader(sizeof(PktWarOnOff), CmdWarOnOff, 0, 0);
}
}
}
else
{
DBComponent::GameDB::UpdateGuildWarFlag(CDBSingleObject::GetInstance(), dwSenderID, Creature::WAR_OFF);
}
return true;
}
case PktGuildCmd::GC_SETUP_TITLE:
{
unsigned char cTitle = static_cast<unsigned char>(dwReferenceID);
// 길드 마스터 탈퇴
if (dwSenderID == lpGuild->GetMaster().m_dwCID)
{
unsigned long dwNewMaster = lpGuild->SetNewMaster();
if (0 == dwNewMaster)
{
DETLOG1(g_Log, "GID:%10u 길드가 해체되었습니다. - 길드마스터 탈퇴", lpGuild->GetGID());
CGuildDBMgr::GetInstance().DissolveGuild(
lpGuild->GetGID(), PktCreateGuild::NONE_NEXT_GUILDMASTER_BY_GUILDMASTER_OUT);
break;
}
SendPacket::GuildCmd(&SendStream, dwGID, dwNewMaster, MASTER, PktGuildCmd::GC_SETUP_TITLE, NULL, NULL, wError);
DETLOG3(g_Log, "GID:%10u 길드마스터(이전:%10u, 현재:%10u)가 변경되었습니다. - 길드마스터 탈퇴",
lpGuild->GetGID(), dwSenderID, dwNewMaster);
}
// 길드 마스터 권한 양도
if (MASTER == cTitle)
{
MemberInfo PreMasterInfo = lpGuild->GetMaster();
lpGuild->SetTitle(PreMasterInfo.m_dwCID, COMMON);
SendPacket::GuildCmd(&SendStream, dwGID, PreMasterInfo.m_dwCID, COMMON, PktGuildCmd::GC_SETUP_TITLE, NULL, NULL, wError);
DETLOG3(g_Log, "GID:%10u 길드마스터(이전:%10u, 현재:%10u)가 변경되었습니다. - 길드마스터 권한 양도",
lpGuild->GetGID(), PreMasterInfo.m_dwCID, dwSenderID);
}
lpGuild->SetTitle(dwSenderID, cTitle);
if(cTitle==COMMON)
{
using namespace DBAgent::DataStorage;
// edith 2008.03.15 일반 길드원으로 타이틀을 변경하는데 SenderID가 아닌 dwGID 에서 얻어왔다 잘못됐다.
CSessionData* lpSessionData = CSessionDataMgr::GetInstance().GetCharLoadedSession(dwSenderID);
// CSessionData* lpSessionData = CSessionDataMgr::GetInstance().GetCharLoadedSession(dwGID);
if(lpSessionData)
{
CCharacterData* lpCharacterData = lpSessionData->GetCharacterData();
if(lpCharacterData)
{
// edith 2008.11.24 길드마스터가 될시에 전쟁 자동참가
// edith 2009.05.20 일반 길드원이 될때 전쟁자동참여 OFF 로 설정.
lpCharacterData->SetGuildWarFlag(Creature::WAR_OFF);
PktWarOnOff* lpPktWarOnOffAck = reinterpret_cast<PktWarOnOff*>(SendStream.GetBuffer(sizeof(PktWarOnOff)));
if (lpPktWarOnOffAck)
{
lpPktWarOnOffAck->m_dwCID = lpCharacterData->GetCID();
lpPktWarOnOffAck->m_cType = GameTime::GUILD;
lpPktWarOnOffAck->m_cFlag = Creature::WAR_OFF;
SendStream.WrapHeader(sizeof(PktWarOnOff), CmdWarOnOff, 0, 0);
}
}
}
}
break;
}
case PktGuildCmd::GC_KICK:
{
// 길드 마스터의 경우 삭제시 킥 명령이 온다.
if (dwSenderID == lpGuild->GetMaster().m_dwCID)
{
unsigned long dwNewMaster = lpGuild->SetNewMaster();
if (0 == dwNewMaster)
{
DETLOG1(g_Log, "GID:%10u 길드가 해체되었습니다. - 길드마스터 삭제", lpGuild->GetGID());
CGuildDBMgr::GetInstance().DissolveGuild(lpGuild->GetGID(),
PktCreateGuild::NONE_NEXT_GUILDMASTER_BY_GUILDMASTER_DELETED);
break;
}
SendPacket::GuildCmd(&SendStream, dwGID, dwNewMaster, MASTER, PktGuildCmd::GC_SETUP_TITLE, NULL, NULL, wError);
DETLOG3(g_Log, "GID:%10u 길드마스터(이전:%10u, 현재:%10u)가 변경되었습니다. - 길드마스터 삭제",
lpGuild->GetGID(), dwSenderID, dwNewMaster);
}
if (false == lpGuild->LeaveMember(dwSenderID))
{
wError = PktBase::SERVER_ERROR;
}
using namespace DBAgent::DataStorage;
CSessionData* lpSessionData = CSessionDataMgr::GetInstance().GetCharLoadedSession(dwSenderID);
if(lpSessionData)
{
CCharacterData* lpCharacterData = lpSessionData->GetCharacterData();
if(lpCharacterData)
{
lpCharacterData->SetGuildWarFlag(Creature::WAR_OFF);
PktWarOnOff* lpPktWarOnOffAck = reinterpret_cast<PktWarOnOff*>(SendStream.GetBuffer(sizeof(PktWarOnOff)));
if (lpPktWarOnOffAck)
{
lpPktWarOnOffAck->m_dwCID = lpCharacterData->GetCID();
lpPktWarOnOffAck->m_cType = GameTime::GUILD;
lpPktWarOnOffAck->m_cFlag = Creature::WAR_OFF;
SendStream.WrapHeader(sizeof(PktWarOnOff), CmdWarOnOff, 0, 0);
}
}
}
else
{
DBComponent::GameDB::UpdateGuildWarFlag(CDBSingleObject::GetInstance(), dwSenderID, Creature::WAR_OFF);
}
break;
}
}
}
return SendPacket::GuildCmd(&SendStream, dwGID, dwSenderID, dwReferenceID, wCmd, NULL, NULL, wError);
}
bool GuildMark(CSendStream& SendStream, PktBase* lpPktBase)
{
PktGuildMark* lpPktGuildMark = static_cast<PktGuildMark*>(lpPktBase);
unsigned short wError = PktBase::NO_SERVER_ERR;
unsigned long dwCID = lpPktGuildMark->m_dwCID;
unsigned long dwGID = lpPktGuildMark->m_dwGID;
unsigned long dwGold = 0;
CGuildDB* lpGuild = static_cast<CGuildDB*>(CGuildDBMgr::GetInstance().GetGuild(dwGID));
if (0 == lpGuild)
{
wError = PktBase::SERVER_ERROR;
}
else
{
lpGuild->SetMark(lpPktGuildMark->m_szMark);
dwGold = lpGuild->GetGold();
}
PktGuildMark pktGuildMark;
memset(&pktGuildMark, 0, sizeof(PktGuildMark));
pktGuildMark.m_dwCID = dwCID;
pktGuildMark.m_dwGID = dwGID;
pktGuildMark.m_dwGold = dwGold;
memcpy(pktGuildMark.m_szMark, lpPktGuildMark->m_szMark, MAX_MARK_SIZE);
if(PacketWrap::WrapHeader(reinterpret_cast<char*>(&pktGuildMark),
sizeof(PktGuildMark), CmdGuildMark, 0, wError))
{
if (PktBase::NO_SERVER_ERR == wError)
{
DBAgent::CGameDispatch::GetDispatchTable().Process(CSendPacketAllServer(
reinterpret_cast<char*>(&pktGuildMark), sizeof(PktGuildMark), CmdGuildMark));
}
else
{
SendStream.PutBuffer(reinterpret_cast<char*>(&pktGuildMark),
sizeof(PktGuildMark), CmdGuildMark);
}
return true;
}
return false;
}
bool GuildLevel(CSendStream& SendStream, PktBase* lpPktBase)
{
PktGuildLevel* lpPktGuildLevel = static_cast<PktGuildLevel*>(lpPktBase);
unsigned short wError = PktBase::NO_SERVER_ERR;
unsigned long dwGID = lpPktGuildLevel->m_dwUID;
unsigned char cLevel = lpPktGuildLevel->m_cLevel;
unsigned long dwGold = 0;
using namespace Guild;
CGuildDB* lpGuild = static_cast<CGuildDB*>(CGuildDBMgr::GetInstance().GetGuild(dwGID));
if (NULL == lpGuild)
{
wError = PktBase::SERVER_ERROR;
}
else
{
lpGuild->SetLevel(cLevel);
dwGold = lpGuild->GetGold();
}
PktGuildLevel pktGuildLevel;
memset(&pktGuildLevel, 0, sizeof(PktGuildLevel));
pktGuildLevel.m_dwUID = dwGID;
pktGuildLevel.m_cLevel = cLevel;
pktGuildLevel.m_dwGold = dwGold;
if(PacketWrap::WrapHeader(reinterpret_cast<char*>(&pktGuildLevel),
sizeof(PktGuildLevel), CmdGuildLevel, 0, wError))
{
if (PktBase::NO_SERVER_ERR == wError)
{
DBAgent::CGameDispatch::GetDispatchTable().Process(CSendPacketAllServer(
reinterpret_cast<char*>(&pktGuildLevel), sizeof(PktGuildLevel), CmdGuildLevel));
}
else
{
SendStream.PutBuffer(reinterpret_cast<char*>(&pktGuildLevel),
sizeof(PktGuildLevel), CmdGuildLevel);
}
return true;
}
return false;
}
bool GuildRelation(CSendStream& SendStream, PktBase* lpPktBase)
{
PktGuildRelation* lpPktGuildRelation = static_cast<PktGuildRelation*>(lpPktBase);
unsigned short wError = PktBase::NO_SERVER_ERR;
unsigned long dwCID = lpPktGuildRelation->m_dwCID;
unsigned long dwGID = lpPktGuildRelation->m_dwGID;
unsigned long dwTargetGID = lpPktGuildRelation->m_dwTargetGID;
unsigned long dwValue = lpPktGuildRelation->m_dwValue;
char cSubCmd = lpPktGuildRelation->m_cSubCmd;
CGuildDB* lpGuild = static_cast<CGuildDB*>(CGuildDBMgr::GetInstance().GetGuild(dwGID));
CGuildDB* lpTargetGuild = static_cast<CGuildDB*>(CGuildDBMgr::GetInstance().GetGuild(dwTargetGID));
if (NULL == lpGuild || NULL == lpTargetGuild)
{
wError = PktBase::SERVER_ERROR;
}
else
{
switch (cSubCmd)
{
case PktGuildRelation::GR_HOSTILITY:
{
if (!CGuildDBMgr::GetInstance().SetRelation(dwGID, dwTargetGID, Guild::HOSTILITY))
{
wError = PktGuildRelation::SERVER_ERROR;
}
break;
}
case PktGuildRelation::GR_PEACE:
{
if (!CGuildDBMgr::GetInstance().SetRelation(dwGID, dwTargetGID, Guild::NEUTRALITY))
{
wError = PktGuildRelation::SERVER_ERROR;
}
break;
}
case PktGuildRelation::GR_HOSTILITYDEL:
{
// 내가 TargetGuild에게 평화허락을 한다.
if (!CGuildDBMgr::GetInstance().SetRelation(dwGID, dwTargetGID, Guild::TARGET_NEUTRALITY))
{
wError = PktGuildRelation::SERVER_ERROR;
}
break;
}
case PktGuildRelation::GR_ALERT:
{
if (!CGuildDBMgr::GetInstance().SetRelation(dwGID, dwTargetGID, Guild::ALERT_HOSTILITY))
{
wError = PktGuildRelation::SERVER_ERROR;
}
break;
}
case PktGuildRelation::GR_COUNTER:
{
if (!CGuildDBMgr::GetInstance().SetRelation(dwGID, dwTargetGID, Guild::COUNTER_HOSTILITY))
{
wError = PktGuildRelation::SERVER_ERROR;
}
break;
}
case PktGuildRelation::GR_REQUEST:
{
CGuildDB* lpHostilityGuild = static_cast<CGuildDB*>(CGuildDBMgr::GetInstance().GetGuild(dwValue));
if (NULL == lpHostilityGuild)
{
wError = PktGuildRelation::SERVER_ERROR;
}
else
{
if (!CGuildDBMgr::GetInstance().SetRelation(dwGID, dwValue, Guild::NEUTRALITY))
{
wError = PktGuildRelation::SERVER_ERROR;
}
else
{
if (!CGuildDBMgr::GetInstance().SetRelation(dwGID, dwTargetGID, Guild::HOSTILITY))
{
wError = PktGuildRelation::SERVER_ERROR;
}
}
}
break;
}
}
}
PktGuildRelation pktGuildRelation;
memset(&pktGuildRelation, 0, sizeof(PktGuildRelation));
pktGuildRelation.m_dwCID = dwCID;
pktGuildRelation.m_dwGID = dwGID;
pktGuildRelation.m_dwTargetGID = dwTargetGID;
pktGuildRelation.m_dwValue = dwValue;
pktGuildRelation.m_cSubCmd = cSubCmd;
if(PacketWrap::WrapHeader(reinterpret_cast<char*>(&pktGuildRelation),
sizeof(PktGuildRelation), CmdGuildRelation, 0, wError))
{
if (PktBase::NO_SERVER_ERR == wError)
{
DBAgent::CGameDispatch::GetDispatchTable().Process(CSendPacketAllServer(
reinterpret_cast<char*>(&pktGuildRelation),
sizeof(PktGuildRelation), CmdGuildRelation));
}
else
{
SendStream.PutBuffer(reinterpret_cast<char*>(&pktGuildRelation),
sizeof(PktGuildRelation), CmdGuildRelation);
}
return true;
}
return false;
}
bool GuildInclination(CSendStream& SendStream, PktBase* lpPktBase)
{
// 더이상 길드 국적은 변경할 수 없습니다. (2004-11-22 by 로딘)
/*
PktGuildInclination* lpPktInclination = static_cast<PktGuildInclination*>(lpPktBase);
unsigned short wError = PktBase::NO_SERVER_ERR;
unsigned long dwGID = lpPktInclination->m_dwUID;
unsigned char cInclination = lpPktInclination->m_cInclination;
CGuildDB* lpGuild = static_cast<CGuildDB*>(CGuildDBMgr::GetInstance().GetGuild(dwGID));
if (NULL == lpGuild)
{
wError = PktBase::SERVER_ERROR;
}
else
{
lpGuild->SetInclination(cInclination);
}
PktGuildInclination pktGuildInclination;
memset(&pktGuildInclination, 0, sizeof(PktGuildInclination));
pktGuildInclination.m_dwUID = dwGID;
pktGuildInclination.m_cInclination = cInclination;
if(PacketWrap::WrapHeader(reinterpret_cast<char*>(&pktGuildInclination),
sizeof(PktGuildInclination), CmdGuildInclination, 0, wError))
{
if (PktBase::NO_SERVER_ERR == wError)
{
DBAgent::CGameDispatch::GetDispatchTable().Process(CSendPacketAllServer(
reinterpret_cast<char*>(&pktGuildInclination),
sizeof(PktGuildInclination), CmdGuildInclination));
}
else
{
SendStream.PutBuffer(reinterpret_cast<char*>(&pktGuildInclination),
sizeof(PktGuildInclination), CmdGuildInclination);
}
return true;
}
*/
return false;
}
bool SetGuildRight(CSendStream& SendStream, PktBase* lpPktBase)
{
using namespace Guild;
PktGuildRight* lpPktGuildRight = static_cast<PktGuildRight *>(lpPktBase);
unsigned short wError = PktBase::NO_SERVER_ERR;
unsigned long dwGID = lpPktGuildRight->m_dwUID;
GuildRight guildRight = lpPktGuildRight->m_GuildRight;
CGuildDB* lpGuild = static_cast<CGuildDB*>(CGuildDBMgr::GetInstance().GetGuild(dwGID));
if (NULL == lpGuild)
{
wError = PktBase::SERVER_ERROR;
}
else
{
lpGuild->SetRight(guildRight);
}
PktGuildRight pktGuildRight;
memset(&pktGuildRight, 0, sizeof(PktGuildRight));
pktGuildRight.m_dwUID = dwGID;
pktGuildRight.m_GuildRight = guildRight;
if(PacketWrap::WrapHeader(reinterpret_cast<char*>(&pktGuildRight),
sizeof(PktGuildRight), CmdGuildRight, 0, wError))
{
if (PktBase::NO_SERVER_ERR == wError)
{
DBAgent::CGameDispatch::GetDispatchTable().Process(CSendPacketAllServer(
reinterpret_cast<char*>(&pktGuildRight), sizeof(PktGuildRight), CmdGuildRight));
}
else
{
SendStream.PutBuffer(reinterpret_cast<char*>(&pktGuildRight),
sizeof(PktGuildRight), CmdGuildRight);
}
return true;
}
return false;
}
bool GuildSafe(CSendStream& SendStream, PktBase* lpPktBase)
{
PktGuildSafeAck* lpPktGuildSafe = reinterpret_cast<PktGuildSafeAck *>(lpPktBase);
unsigned wError = PktBase::NO_SERVER_ERR;
unsigned long dwCID = lpPktGuildSafe->m_dwCID;
unsigned long dwGID = lpPktGuildSafe->m_dwGID;
unsigned long dwSafeGold = lpPktGuildSafe->m_dwSafeGold;
unsigned long dwCharGold = lpPktGuildSafe->m_dwCharGold;
unsigned char cCmd = lpPktGuildSafe->m_cCmd;
using namespace DBAgent::DataStorage;
CSessionData* lpSessionData = CSessionDataMgr::GetInstance().GetCharLoadedSession(dwCID);
CCharacterData* lpCharacterData = NULL;
if(lpSessionData)
lpCharacterData = lpSessionData->GetCharacterData();
CGuildDB* lpGuild = static_cast<CGuildDB*>(CGuildDBMgr::GetInstance().GetGuild(dwGID));
if (NULL == lpGuild)
{
wError = PktBase::SERVER_ERROR;
}
else
{
switch (cCmd)
{
// 출금
case PktGuildSafe::SC_WITHDRAWAL:
{
if (false == lpGuild->DeductGold(dwCharGold))
{
wError = PktGuildSafe::FAIL_NOT_ENOUGH_MONEY;
}
dwSafeGold = dwCharGold;
break;
}
// 입금
case PktGuildSafe::SC_DEPOSIT:
{
// edith 2008.03.15 캐릭터의 골드를 뺀다.
if(false == lpCharacterData->DeductGold(dwCharGold))
{
wError = PktGuildSafe::FAIL_NOT_CHAR_MONEY;
}
else if (false == lpGuild->AddGold(dwCharGold))
{
// 되돌린다 금액을
lpCharacterData->AddGold(dwCharGold);
wError = PktGuildSafe::FAIL_NOT_GUILD_DEPOSIT;
}
dwSafeGold = dwCharGold;
break;
}
// 길드 보너스
case PktGuildSafe::SC_BONUS:
{
if (false == lpGuild->AddGold(dwCharGold))
{
wError = PktGuildSafe::FAIL_NOT_GUILD_DEPOSIT;
}
dwSafeGold = dwCharGold;
}
break;
// 분배
case PktGuildSafe::SC_RELEASE:
{
unsigned long dwPreSafeGold = lpGuild->GetGold();
dwCharGold = lpGuild->ReleaseGold(dwCharGold);
if (0 == dwCharGold)
{
wError = PktGuildSafe::FAIL_NOT_ENOUGH_MONEY;
break;
}
dwSafeGold = dwPreSafeGold - lpGuild->GetGold();
break;
}
default:
wError = PktBase::SERVER_ERROR;
break;
}
}
PktGuildSafeAck pktGuildSafeAck;
memset(&pktGuildSafeAck, 0, sizeof(PktGuildSafeAck));
pktGuildSafeAck.m_dwCID = dwCID;
pktGuildSafeAck.m_dwGID = dwGID;
pktGuildSafeAck.m_dwSafeGold = dwSafeGold;
pktGuildSafeAck.m_dwCharGold = dwCharGold;
pktGuildSafeAck.m_cCmd = cCmd;
strncpy(pktGuildSafeAck.m_szCharName,
lpPktGuildSafe->m_szCharName, Guild::MAX_MEMBER_NAME_LEN);
if (!DBComponent::GuildDB::UpdateGuildGold(
CDBSingleObject::GetInstance(), lpGuild->GetGID(), lpGuild->GetGold()))
{
wError = PktGuildSafe::FAIL_NOT_GUILD_UPDATE;
}
if(PacketWrap::WrapHeader(reinterpret_cast<char*>(&pktGuildSafeAck),
sizeof(PktGuildSafeAck), CmdGuildSafe, 0, wError))
{
if (PktBase::NO_SERVER_ERR == wError)
{
DBAgent::CGameDispatch::GetDispatchTable().Process(CSendPacketAllServer(
reinterpret_cast<char*>(&pktGuildSafeAck), sizeof(PktGuildSafeAck), CmdGuildSafe));
}
else
{
SendStream.PutBuffer(reinterpret_cast<char*>(&pktGuildSafeAck),
sizeof(PktGuildSafeAck), CmdGuildSafe);
}
return true;
}
return false;
}
bool GuildMemberInfoUpdate(CSendStream& SendStream, PktBase* lpPktBase)
{
PktGuildMemberInfoUpdate* lpPktGMIU = static_cast<PktGuildMemberInfoUpdate*>(lpPktBase);
unsigned short wError = PktBase::NO_SERVER_ERR;
unsigned long dwGID = lpPktGMIU->m_dwGID;
unsigned long dwCID = lpPktGMIU->m_dwCID;
CGuildDB* lpGuild = static_cast<CGuildDB*>(CGuildDBMgr::GetInstance().GetGuild(dwGID));
if (NULL == lpGuild)
{
wError = PktBase::SERVER_ERROR;
}
else
{
lpGuild->UpdateMemberInfo(dwCID,
lpPktGMIU->m_MemberListInfo, lpPktGMIU->m_MemberDetailInfo);
}
PktGuildMemberInfoUpdate pktGMIUAck;
memset(&pktGMIUAck, 0, sizeof(PktGuildMemberInfoUpdate));
pktGMIUAck.m_dwGID = dwGID;
pktGMIUAck.m_dwCID = dwCID;
pktGMIUAck.m_MemberListInfo = lpPktGMIU->m_MemberListInfo;
pktGMIUAck.m_MemberDetailInfo = lpPktGMIU->m_MemberDetailInfo;
if(PacketWrap::WrapHeader(reinterpret_cast<char*>(&pktGMIUAck),
sizeof(PktGuildMemberInfoUpdate), CmdGuildMemberInfoUpdate, 0, wError))
{
if (PktBase::NO_SERVER_ERR == wError)
{
DBAgent::CGameDispatch::GetDispatchTable().Process(CSendPacketAllServer(
reinterpret_cast<char*>(&pktGMIUAck),
sizeof(PktGuildMemberInfoUpdate), CmdGuildMemberInfoUpdate));
}
else
{
SendStream.PutBuffer(reinterpret_cast<char*>(&pktGMIUAck),
sizeof(PktGuildMemberInfoUpdate), CmdGuildMemberInfoUpdate);
}
return true;
}
return false;
}
}
}

View File

@@ -0,0 +1,25 @@
#ifndef _DBAGENT_SERVER_PARSE_GUILD_H_
#define _DBAGENT_SERVER_PARSE_GUILD_H_
// forward delc.
class CSendStream;
struct PktBase;
namespace DBAgent
{
namespace ParseGuild
{
bool CreateGuild(CSendStream& SendStream, PktBase* lpPktBase);
bool GuildCmd(CSendStream& SendStream, PktBase* lpPktBase);
bool GuildMark(CSendStream& SendStream, PktBase* lpPktBase);
bool GuildLevel(CSendStream& SendStream, PktBase* lpPktBase);
bool GuildRelation(CSendStream& SendStream, PktBase* lpPktBase);
bool GuildInclination(CSendStream& SendStream, PktBase* lpPktBase);
bool SetGuildRight(CSendStream& SendStream, PktBase* lpPktBase);
bool GuildSafe(CSendStream& SendStream, PktBase* lpPktBase);
bool GuildMemberInfoUpdate(CSendStream& SendStream, PktBase* lpPktBase);
}
}
#endif

View File

@@ -0,0 +1,345 @@
#include "stdafx.h"
#include "ParseMoveZone.h"
#include <Creature/CreatureManager.h>
#include <Network/Dispatch/GameDispatch.h>
#include <Network/SendPacket/SendMoveZone.h>
#include <Network/Packet/PacketStruct/ServerInfo.h>
#include <Network/Packet/PacketStruct/ServerPacket.h>
#include <DataStorage/CharacterData.h>
#include <DataStorage/SessionData.h>
#include <DataStorage/SessionDataMgr.h>
#include <Log/ServerLog.h>
#include <Utility/Setup/ServerSetup.h>
#include <GameTime/GameTimeDBMgr.h>
namespace DBAgent
{
namespace ParseMoveZone
{
bool CharMoveZone(CSendStream& SendStream, PktSZMvD* lpPktSZMvD);
bool ServerZone(CSendStream& SendStream, PktSA* lpPktSA);
bool ServerZoneEnd(CSendStream& SendStream, PktDD* lpPktDD);
bool Parse(CSendStream& SendStream, PktBase* lpPktBase)
{
bool bResult = false;
PktDD* lpPktDD = static_cast<PktDD*>(lpPktBase);
switch (lpPktDD->m_wCmd)
{
case PktDD::SCmdCharMoveZone:
bResult = CharMoveZone(SendStream, static_cast<PktSZMvD*>(lpPktDD));
break;
case PktDD::SCmdServerZone:
bResult = ServerZone(SendStream, static_cast<PktSA*>(lpPktDD));
break;
case PktDD::SCmdServerZoneEnd:
bResult = ServerZoneEnd(SendStream, lpPktDD);
break;
default:
ERRLOG1(g_Log, "ZoneMove 패킷 처리 에러 : 알 수 없는 패킷 CMD:0x%02X를 받았습니다.",
lpPktDD->m_wCmd);
bResult = true;
break;
}
return bResult;
}
class CFindGameServerDispatch
{
public:
CFindGameServerDispatch(CGameDispatch*& lpGameDispatch, SERVER_ID serverID)
: m_lpGameDispatch(lpGameDispatch), m_serverID(serverID)
{
m_lpGameDispatch = 0;
}
bool operator() (unsigned long dwServerID, CPacketDispatch& packetDispatch)
{
if(0 == m_lpGameDispatch)
{
SERVER_ID serverID;
serverID.dwID = dwServerID;
// 서버 ID가 같으면 선택, 다르더라도, 채널만 -1이고 다른게 같으면 선택.
if ((serverID.dwID == m_serverID.dwID) ||
(-1 == m_serverID.GetChannel() &&
serverID.GetZone() == m_serverID.GetZone() &&
serverID.GetGroup() == m_serverID.GetGroup() &&
serverID.GetType() == m_serverID.GetType()))
{
m_lpGameDispatch = &static_cast<CGameDispatch&>(packetDispatch);
}
}
return true;
}
private:
CGameDispatch*& m_lpGameDispatch;
SERVER_ID m_serverID;
};
bool CharMoveZone(CSendStream& SendStream, PktSZMvD* lpPktSZMvD)
{
unsigned long dwRequestKey = lpPktSZMvD->m_dwRequestKey;
unsigned long dwUID = lpPktSZMvD->m_dwUserID;
const POS& Pos = lpPktSZMvD->m_NewPos;
char cZone = lpPktSZMvD->m_cZone;
char cChannel = lpPktSZMvD->m_cChannel;
#ifdef ENABLE_PACKET_LOG
DETLOG4(g_PacketLog, "ParseMoveZone::CharMoveZone : UID:%10u / CID:%10u / SessionID:%10u / ServerID:0x%08X / ",
dwUID, 0, 0, 0);
#endif
unsigned short usError = 0;
using namespace DataStorage;
CSessionData* lpSessionData = CSessionDataMgr::GetInstance().GetOpenSession(dwUID);
CCharacterData* lpCharacterData = 0;
SERVER_ID serverID;
serverID.sID.Type = CServerSetup::GameServer;
serverID.sID.Group = CServerSetup::GetInstance().GetServerGroup();
serverID.sID.Channel = cChannel;
serverID.sID.ID = cZone;
CGameDispatch* lpGameDispatch = 0;
CGameDispatch::GetDispatchTable().Process(
CFindGameServerDispatch(lpGameDispatch, serverID));
if (0 == lpSessionData)
{
ERRLOG1(g_Log, "UID:%10u / 캐릭터 이동 실패 : 세션이 열려 있지 않습니다.", dwUID);
usError = PktSZMvDAck::FAIL_INVALID_CHAR;
}
else if (0 == (lpCharacterData = lpSessionData->GetCharacterData()))
{
ERRLOG1(g_Log, "UID:%10u / 캐릭터 이동 실패 : 캐릭터 데이터가 로드되지 않았습니다.", dwUID);
usError = PktSZMvDAck::FAIL_INVALID_CHAR;
}
else if (0 == lpGameDispatch)
{
ERRLOG2(g_Log, "UID:%10u / ServerID:0x%08X / 캐릭터 이동 실패 : 서버가 없습니다.",
dwUID, serverID.dwID);
usError = PktSZMvDAck::FAIL_INVALID_ZONE;
}
else if (0 == lpSessionData->GetAdminLevel())
{
// edith 2009.06.13 석상전 유저 수 체크
if(SERVER_ID::STONE_WAR1 <= cZone && cZone <= SERVER_ID::STONE_WAR3)
{
if (CServerSetup::GetInstance().GetBattleLimit() < lpGameDispatch->GetCharNum())
{
// 사람이 너무 많다.
ERRLOG2(g_Log, "UID:%10u / ServerID:0x%08X / 캐릭터 이동 실패 : 사람이 너무 많습니다.",
dwUID, serverID.dwID);
usError = PktSZMvDAck::FAIL_PERSONNEL_OVER;
}
else
{
int maxDefaultUser = 10;
float limitPer = (float)CServerSetup::GetInstance().GetBattleLimitPer()/100.f;
if(limitPer < 1.0f)
limitPer = 1.0f;
int akhanUser = lpGameDispatch->GetCharNum(CClass::AKHAN);
int humanUser = lpGameDispatch->GetCharNum(CClass::HUMAN);
// 내가 인간이고, 인간이 아칸보다 1.5배 많은 상황이면 입장 불가.
if (CClass::HUMAN == lpCharacterData->GetRace())
{
int overCount = (int)((float)akhanUser * limitPer) - akhanUser;
if(overCount < maxDefaultUser)
overCount = maxDefaultUser;
int overUser = akhanUser + overCount;
if(overUser < lpGameDispatch->GetCharNum(CClass::HUMAN))
{
ERRLOG2(g_Log, "UID:%10u / ServerID:0x%08X / 캐릭터 이동 실패 : 인간종족 불균형.",
dwUID, serverID.dwID);
usError = PktSZMvDAck::FAIL_PERSONNEL_OVER;
}
}
// 내가 아칸이고, 아칸이 인간보다 1.5배 많은 상황이면 입장 불가.
else if (CClass::AKHAN == lpCharacterData->GetRace())
{
int overCount = (int)((float)humanUser * limitPer) - humanUser;
if(overCount < maxDefaultUser)
overCount = maxDefaultUser;
int overUser = humanUser + overCount;
if(overUser < lpGameDispatch->GetCharNum(CClass::AKHAN))
{
ERRLOG2(g_Log, "UID:%10u / ServerID:0x%08X / 캐릭터 이동 실패 : 아칸종족 불균형.",
dwUID, serverID.dwID);
usError = PktSZMvDAck::FAIL_PERSONNEL_OVER;
}
}
}
}
else if (SERVER_ID::ZONE3 == cZone)
{
// 배틀그라운드의 경우 인원 제한 체크
// 2008.10.12 ZONE3번 유저 설정 제거.
ERRLOG3(g_Log, "UID:%10u / 3번 존 접속 시도 : Zone(%d,%d)", dwUID, cZone, cChannel);
usError = PktSZMvDAck::FAIL_INVALID_CHAR;
/*
SYSTEMTIME systemTime;
GetSystemTime(&systemTime);
// 배틀 그라운드 휴식 시간동안에는 각 종족의 초기 존으로 이동 시켜준다.
if ((systemTime.wMinute >= STATUE_REST_TIME_1ST_START && systemTime.wMinute <= STATUE_REST_TIME_1ST_END) ||
(systemTime.wMinute >= STATUE_REST_TIME_2ND_START && systemTime.wMinute <= STATUE_REST_TIME_2ND_END))
{
cZone = lpDataSession->GetCharDataSession().GetCharStartZone(lpCharacterData->GetRace());
}
*/
/* SERVER_ID serverID;
serverID.sID.Type = CServerSetup::GameServer;
serverID.sID.Group = CServerSetup::GetInstance().GetServerGroup();
serverID.sID.Channel = cChannel;
serverID.sID.ID = cZone;
CGameDispatch* lpGameDispatch = 0;
CGameDispatch::GetDispatchTable().Process(
CFindGameServerDispatch(lpGameDispatch, serverID));
if (0 == lpGameDispatch)
{
ERRLOG2(g_Log, "UID:%10u / ServerID:0x%08X / 캐릭터 이동 실패 : 서버가 없습니다.",
dwUID, serverID.dwID);
usError = PktSZMvDAck::FAIL_INVALID_ZONE;
}
else if (CServerSetup::GetInstance().GetBattleLimit() > lpGameDispatch->GetCharNum())
{
// 내가 인간이고, 인간이 아칸보다 1.5배 많은 상황이면 입장 불가.
if (CClass::HUMAN == lpCharacterData->GetRace() &&
lpGameDispatch->GetCharNum(CClass::AKHAN) * 1.5 < lpGameDispatch->GetCharNum(CClass::HUMAN))
{
usError = PktSZMvDAck::FAIL_PERSONNEL_OVER;
}
// 내가 아칸이고, 아칸이 인간보다 1.5배 많은 상황이면 입장 불가.
else if (CClass::AKHAN == lpCharacterData->GetRace() &&
lpGameDispatch->GetCharNum(CClass::HUMAN ) * 1.5 < lpGameDispatch->GetCharNum(CClass::AKHAN))
{
usError = PktSZMvDAck::FAIL_PERSONNEL_OVER;
}
}
*/
}
}
// if(SERVER_ID::STONE_WAR1 <= cZone && cZone <= SERVER_ID::STONE_WAR3)
// usError = PktSZMvDAck::FAIL_PERSONNEL_OVER;
if(0 == usError && 0 != lpSessionData)
{
// 미리 갈 존 설정
if (!lpSessionData->SetMoveZone(cZone, Pos))
{
/*
if(SERVER_ID::ZONE5 == cZone && !CGameTimeDBMgr::GetInstance().IsEnterTime())
{
// 테섭용 신규존 진입제한에 걸렸음.
DETLOG5(g_Log, "UID:%10u / Zone:%2u / X:%f / Y:%f / Z:%f / 캐릭터 이동 실패 : 신규존 진입제한.",
dwUID, cZone, Pos.fPointX, Pos.fPointY, Pos.fPointZ);
}
else
{
ERRLOG5(g_Log, "UID:%10u / Zone:%2u / X:%f / Y:%f / Z:%f / 캐릭터 이동 실패 : 잘못된 존으로 이동 시도.",
dwUID, cZone, Pos.fPointX, Pos.fPointY, Pos.fPointZ);
}
*/
ERRLOG5(g_Log, "UID:%10u / Zone:%2u / X:%f / Y:%f / Z:%f / 캐릭터 이동 실패 : 잘못된 존으로 이동 시도.",
dwUID, cZone, Pos.fPointX, Pos.fPointY, Pos.fPointZ);
usError = PktSZMvDAck::FAIL_INVALID_ZONE;
}
}
// edith 2009.06.28 존이동실패시 전쟁 플래그를 꺼준다.
// gameserver에서 dbagnet로 패킷 전달하게 소스 수정함.
if(0 != usError)
{
if(SERVER_ID::STONE_WAR1 <= cZone && cZone <= SERVER_ID::STONE_WAR3)
lpCharacterData->SetRealmWarFlag(Creature::WAR_OFF);
else if(SERVER_ID::CAPITAL == cZone)
lpCharacterData->SetGuildWarFlag(Creature::WAR_OFF);
}
return (-1 == cChannel || 0 != usError) ?
// 채널이 -1이거나, 에러가 있는 경우 이 패킷을 보냄.
SendPacket::CharMoveZone(SendStream, dwRequestKey, cZone, usError)
: SendPacket::ServerZone(SendStream, dwRequestKey, cZone, cChannel);
}
bool ServerZone(CSendStream& SendStream, PktSA* lpPktSA)
{
unsigned long dwUID = lpPktSA->m_dwUserID;
unsigned short usError = 0;
#ifdef ENABLE_PACKET_LOG
DETLOG4(g_PacketLog, "ParseMoveZone::ServerZone : UID:%10u / CID:%10u / SessionID:%10u / ServerID:0x%08X / ",
dwUID, 0, 0, 0);
#endif
using namespace DataStorage;
CSessionData* lpSessionData = CSessionDataMgr::GetInstance().GetOpenSession(dwUID);
if (0 == lpSessionData)
{
ERRLOG1(g_Log, "UID:%10u / ServerZone 실패 : 세션이 열려 있지 않습니다.", dwUID);
usError = PktSAAck::SERVER_ERROR;
}
return SendPacket::ServerZone(SendStream,
lpPktSA->m_dwRequestKey, lpPktSA->m_cZone, lpPktSA->m_cChannel, usError);
}
bool ServerZoneEnd(CSendStream& SendStream, PktDD* lpPktDD)
{
#ifdef ENABLE_PACKET_LOG
DETLOG4(g_PacketLog, "ParseMoveZone::ServerZoneEnd : UID:%10u / CID:%10u / SessionID:%10u / ServerID:0x%08X / ",
0, 0, 0, 0);
#endif
return SendPacket::ServerZoneEnd(SendStream, lpPktDD->m_dwRequestKey);
}
}
}

View File

@@ -0,0 +1,17 @@
#ifndef _DBAGENT_SERVER_PARSE_MOVE_ZONE_H_
#define _DBAGENT_SERVER_PARSE_MOVE_ZONE_H_
// forward delc.
class CSendStream;
struct PktBase;
namespace DBAgent
{
namespace ParseMoveZone
{
bool Parse(CSendStream& SendStream, PktBase* lpPktBase);
}
}
#endif

View File

@@ -0,0 +1,386 @@
#include "stdafx.h"
#include "ParseParty.h"
#include <Community/Party/PartyDBInfo.h>
#include <Community/Party/PartyDBMgr.h>
#include <Community/Guild/Guild.h>
#include <Community/Guild/GuildMgr.h>
#include <Network/Stream/SendStream.h>
#include <Network/Packet/PacketCommand.h>
#include <Network/Packet/WrapPacket.h>
#include <Network/Packet/PacketStruct/PartyPacket.h>
#include <Network/Dispatch/GameDispatch.h>
#include <Network/SendPacket/SendParty.h>
#include <Log/ServerLog.h>
#include <DB/DBComponent.h>
#include <DataStorage/SessionData.h>
#include <DataStorage/CharacterData.h>
#include <DataStorage/SessionDataMgr.h>
#include <Community/Guild/Guild.h>
namespace DBAgent
{
namespace ParseParty
{
bool CreateParty(CSendStream& SendStream, PktCPD* lpPktCPD);
bool DeleteParty(CSendStream& SendStream, PktDPD* lpPktDPD);
bool GetPartyInfo(CSendStream& SendStream, PktPID* lpPktPID);
bool TransferLeader(CSendStream& SendStream, PktPMD* lpPktPMD);
bool InsertPartyMember(CSendStream& SendStream, PktPMD* lpPktPMD);
bool DeletePartyMember(CSendStream& SendStream, PktPMD* lpPktPMD);
bool AutoRoutingOn(CSendStream& SendStream, PktPMD* lpPktPMD);
bool AutoRoutingOff(CSendStream& SendStream, PktPMD* lpPktPMD);
bool RelayPacket(CSendStream& SendStream, PktDD* lpPktDD);
bool Parse(CSendStream& SendStream, PktBase* lpPktBase)
{
bool bResult = false;
PktDD* lpPktDD = static_cast<PktDD*>(lpPktBase);
switch (lpPktDD->m_wCmd)
{
case PktDD::SCmdCreateParty: bResult = CreateParty(SendStream, static_cast<PktCPD*>(lpPktDD)); break; // 파티 생성
case PktDD::SCmdDeleteParty: bResult = DeleteParty(SendStream, static_cast<PktDPD*>(lpPktDD)); break; // 파티 삭제
case PktDD::SCmdGetPartyInfo: bResult = GetPartyInfo(SendStream, static_cast<PktPID*>(lpPktDD)); break; // 파티 정보 얻기
case PktDD::SCmdTransferLeader: bResult = TransferLeader(SendStream, static_cast<PktPMD*>(lpPktDD)); break; // 파피 리더 양도
case PktDD::SCmdInsertPartyMem: bResult = InsertPartyMember(SendStream, static_cast<PktPMD*>(lpPktDD)); break; // 파티 멤버 추가
case PktDD::SCmdDeletePartyMem: bResult = DeletePartyMember(SendStream, static_cast<PktPMD*>(lpPktDD)); break; // 파티 멤버 삭제
case PktDD::SCmdDeadPartyMem:
case PktDD::SCmdMoveZonePartyMem:
case PktDD::SCmdLevelUpPartyMem:
case PktDD::SCmdChangeClassPartyMem:
case PktDD::SCmdChangeGuildPartyMem:
bResult = RelayPacket(SendStream, lpPktDD);
break;
case PktDD::SCmdAutoRoutingOn: bResult = AutoRoutingOn(SendStream, static_cast<PktPMD*>(lpPktDD)); break; // 파티 오토루팅 켜기
case PktDD::SCmdAutoRoutingOff: bResult = AutoRoutingOff(SendStream, static_cast<PktPMD*>(lpPktDD)); break; // 파티 오토루팅 끄기
default:
bResult = true;
ERRLOG1(g_Log, "파티 로그 : Cmd:0x%02x 알 수 없는 파티 명령임", lpPktDD->m_wCmd);
break;
}
if(!bResult)
{
ERRLOG1(g_Log, "파티 로그 : Cmd:0x%02x 명령 처리 실패.", lpPktDD->m_wCmd);
}
return true;
}
bool CreateParty(CSendStream& SendStream, PktCPD* lpPktCPD)
{
// 파티 생성
CPartyDBInfo* lpParty = CPartyDBMgr::GetInstance().CreateParty(CDBSingleObject::GetInstance(), lpPktCPD->m_dwLeaderID, lpPktCPD->m_cLeaderLevel,
lpPktCPD->m_wLeaderClass, lpPktCPD->m_dwLeaderGID, lpPktCPD->m_dwMemberID, lpPktCPD->m_cMemberLevel, lpPktCPD->m_wMemberClass, lpPktCPD->m_dwMemberGID);
char* lpBuffer = 0;
if (0 == lpParty)
{
ERRLOG2(g_Log, "파티 로그 : LeaderCID:%10u / MemberCID:%10u / 파티 생성 실패 : 파티 생성 실패",
lpPktCPD->m_dwLeaderID, lpPktCPD->m_dwMemberID);
}
else
{
PktCPDAck sPktCPDAck;
memset(&sPktCPDAck, 0, sizeof(PktCPDAck));
sPktCPDAck.m_wCmd = lpPktCPD->m_wCmd;
sPktCPDAck.m_Party = lpParty->GetParty();
sPktCPDAck.m_dwLeaderID = lpPktCPD->m_dwLeaderID;
sPktCPDAck.m_dwMemberID = lpPktCPD->m_dwMemberID;
sPktCPDAck.m_dwLeaderGID = lpPktCPD->m_dwLeaderGID;
sPktCPDAck.m_wLeaderClass = lpPktCPD->m_wLeaderClass;
sPktCPDAck.m_cLeaderLevel = lpPktCPD->m_cLeaderLevel;
sPktCPDAck.m_dwMemberGID = lpPktCPD->m_dwMemberGID;
sPktCPDAck.m_wMemberClass = lpPktCPD->m_wMemberClass;
sPktCPDAck.m_cMemberLevel = lpPktCPD->m_cMemberLevel;
// 캐릭터 정보 업데이트 //
lpParty->SetUserInfoLevel(lpPktCPD->m_dwLeaderID, lpPktCPD->m_cLeaderLevel);
lpParty->SetUserInfoClass(lpPktCPD->m_dwLeaderID, lpPktCPD->m_wLeaderClass);
lpParty->SetUserInfoGID(lpPktCPD->m_dwLeaderID, lpPktCPD->m_dwLeaderGID);
lpParty->SetUserInfoLevel(lpPktCPD->m_dwMemberID, lpPktCPD->m_cMemberLevel);
lpParty->SetUserInfoClass(lpPktCPD->m_dwMemberID, lpPktCPD->m_wMemberClass);
lpParty->SetUserInfoGID(lpPktCPD->m_dwMemberID, lpPktCPD->m_dwMemberGID);
if(PacketWrap::WrapHeader(reinterpret_cast<char*>(&sPktCPDAck), sizeof(PktCPDAck), CmdAgentParty, 0, 0))
{
// 게임 서버로 브로드캐스팅 //
DBAgent::CGameDispatch::GetDispatchTable().Process(CSendPacketAllServer(
reinterpret_cast<char*>(&sPktCPDAck), sizeof(PktCPDAck), CmdAgentParty));
return true;
}
}
return false;
}
bool DeleteParty(CSendStream& SendStream, PktDPD* lpPktDPD)
{
// 파티 삭제
if (!CPartyDBMgr::GetInstance().DestoryParty(
CDBSingleObject::GetInstance(), lpPktDPD->m_dwPartyID))
{
ERRLOG1(g_Log, "파티 로그 : PID:%10u / 파티 삭제 실패", lpPktDPD->m_dwPartyID);
}
return true;
}
bool GetPartyInfo(CSendStream& SendStream, PktPID* lpPktPID)
{
unsigned long dwPID = lpPktPID->m_dwPartyID;
unsigned long dwCID = lpPktPID->m_dwCharID;
// 파티 열기
CPartyDBInfo* lpParty = CPartyDBMgr::GetInstance().OpenParty(
CDBSingleObject::GetInstance(), dwPID);
if (0 == lpParty)
{
ERRLOG2(g_Log, "파티 로그 : PID:%10u / CID:%10u / 파티 정보 얻기 실패 : 파티 얻기 실패",
dwPID, dwCID);
}
else
{
unsigned long dwServerID = 0;
using namespace DataStorage;
CSessionData* lpSessionData = CSessionDataMgr::GetInstance().GetCharLoadedSession(dwCID);
if(0 != lpSessionData)
{
dwServerID = lpSessionData->GetServerID();
}
// lpParty->PartyMemAllLogout();
// lpParty->PartyMemLogin(dwCID, dwSID);
// lpParty->SetLeader(dwCID);
DETLOG2(g_Log, "파티 로그 : PID:%10u / CID:%10u / 파티 정보 얻기", dwPID, dwCID);
// 패킷 보내기
PktPIDAck pktPIDAck;
memset(&pktPIDAck, 0, sizeof(PktPIDAck));
pktPIDAck.m_wCmd = lpPktPID->m_wCmd;
pktPIDAck.m_Party = lpParty->GetParty();
pktPIDAck.m_dwCharID = lpPktPID->m_dwCharID;
pktPIDAck.m_dwGID = lpPktPID->m_dwGID;
pktPIDAck.m_wClass = lpPktPID->m_wClass;
pktPIDAck.m_cLevel = lpPktPID->m_cLevel;
pktPIDAck.m_dwServerID = lpPktPID->m_dwServerID;
if(PacketWrap::WrapHeader(reinterpret_cast<char*>(&pktPIDAck),
sizeof(PktPIDAck), CmdAgentParty, 0, 0))
{
// 게임 서버로 브로드캐스팅 //
CGameDispatch::GetDispatchTable().Process(CSendPacketAllServer(
reinterpret_cast<char*>(&pktPIDAck), sizeof(PktPIDAck), CmdAgentParty));
return true;
}
}
return true;
}
bool TransferLeader(CSendStream& SendStream, PktPMD* lpPktPMD)
{
unsigned long dwPartyID = lpPktPMD->m_dwPartyID;
unsigned long dwSenderID = lpPktPMD->m_dwSenderID;
unsigned long dwReferenceID = lpPktPMD->m_dwGID;
using namespace DataStorage;
CSessionData* lpSessionData = CSessionDataMgr::GetInstance().GetCharLoadedSession(dwSenderID);
CCharacterData* lpCharacterData = 0;
CPartyDBInfo* lpParty = 0;
if(0 == lpSessionData)
{
ERRLOG2(g_Log, "파티 로그 : PID:%10u / CID:%10u / 리더 이양 실패 : 캐릭터 찾기 실패",
dwPartyID, dwSenderID);
}
else if(0 == (lpCharacterData = lpSessionData->GetCharacterData()))
{
ERRLOG2(g_Log, "파티 로그 : PID:%10u / CID:%10u / 리더 이양 실패 : 캐릭터 데이터 없음",
dwPartyID, dwSenderID);
}
else if(0 == (lpParty = CPartyDBMgr::GetInstance().FindPartyMap(dwPartyID)))
{
ERRLOG2(g_Log, "파티 로그 : PID:%10u / CID:%10u / 리더 이양 실패 : 파티 찾기 실패",
dwPartyID, dwSenderID);
}
else if(!lpParty->TransferLeader(dwReferenceID, dwSenderID))
{
ERRLOG3(g_Log, "파티 로그 : PID:%10u / OldLeaderCID:%10u / NewLeaderCID:%10u / 리더 이양 실패",
dwPartyID, dwReferenceID, dwSenderID);
}
else
{
DETLOG3(g_Log, "파티 로그 : PID:%10u / OldLeaderCID:%10u / NewLeaderCID:%10u / 리더 이양 성공",
dwPartyID, dwReferenceID, dwSenderID);
SendPacket::PartyCmd(PktDD::SCmdTransferLeader, lpParty->GetPID(), dwSenderID, 0, 0,
lpSessionData->GetServerID(), 0, lpCharacterData->GetName());
}
return true;
}
bool InsertPartyMember(CSendStream& SendStream, PktPMD* lpPktPMD)
{
unsigned long dwPartyID = lpPktPMD->m_dwPartyID;
unsigned long dwSenderID = lpPktPMD->m_dwSenderID;
unsigned long dwGID = lpPktPMD->m_dwGID;
unsigned short wClass = lpPktPMD->m_wClass;
char cLevel = lpPktPMD->m_cLevel;
// 파티원 추가
if (!CPartyDBMgr::GetInstance().InsertPartyMember(
CDBSingleObject::GetInstance(), dwPartyID, dwSenderID, dwGID, wClass, cLevel))
{
ERRLOG2(g_Log, "파티 로그 : PID:%10u / CID:%10u / 파티 멤버 추가 실패", dwPartyID, dwSenderID);
}
CPartyDBInfo* lpParty = CPartyDBMgr::GetInstance().OpenParty(CDBSingleObject::GetInstance(), dwPartyID);
if(lpParty)
{
// 캐릭터 정보 업데이트 //
lpParty->SetUserInfoLevel(dwSenderID, cLevel);
lpParty->SetUserInfoClass(dwSenderID, wClass);
lpParty->SetUserInfoGID(dwSenderID, dwGID);
}
return true;
}
bool DeletePartyMember(CSendStream& SendStream, PktPMD* lpPktPMD)
{
unsigned long dwPartyID = lpPktPMD->m_dwPartyID;
unsigned long dwSenderID = lpPktPMD->m_dwSenderID;
unsigned long dwReferenceID = lpPktPMD->m_dwGID;
// 킥의 경우
if (dwSenderID != dwReferenceID)
{
dwReferenceID = 0;
}
CPartyDBInfo* lpParty = CPartyDBMgr::GetInstance().OpenParty(CDBSingleObject::GetInstance(), dwPartyID);
if(lpParty)
{
// 캐릭터 정보 업데이트 //
lpParty->SetUserInfoLevel(dwSenderID, 0);
lpParty->SetUserInfoClass(dwSenderID, 0);
lpParty->SetUserInfoGID(dwSenderID, 0);
}
// 파티원 삭제
if (!CPartyDBMgr::GetInstance().DeletePartyMember(
CDBSingleObject::GetInstance(), dwPartyID, dwSenderID, dwReferenceID))
{
ERRLOG2(g_Log, "파티 로그 : PID:%10u / CID:%10u / 파티 멤버 삭제 실패", dwPartyID, dwSenderID);
}
return true;
}
bool AutoRoutingOn(CSendStream& SendStream, PktPMD* lpPktPMD)
{
unsigned long dwPartyID = lpPktPMD->m_dwPartyID;
unsigned long dwSenderID = lpPktPMD->m_dwSenderID;
unsigned long dwReferenceID = lpPktPMD->m_dwGID;
// 오토루팅 켜기
if (!CPartyDBMgr::GetInstance().AutoRoutingOn(
CDBSingleObject::GetInstance(), dwPartyID, dwSenderID))
{
ERRLOG2(g_Log, "파티 로그 : PID:%10u / CID:%10u / 캐릭터의 오토루팅 켜기 실패 (CID 가 0이면 ALL)",
dwPartyID, dwSenderID);
}
return true;
}
bool AutoRoutingOff(CSendStream& SendStream, PktPMD* lpPktPMD)
{
unsigned long dwPartyID = lpPktPMD->m_dwPartyID;
unsigned long dwSenderID = lpPktPMD->m_dwSenderID;
unsigned long dwReferenceID = lpPktPMD->m_dwGID;
// 오토루팅 끄기
if (!CPartyDBMgr::GetInstance().AutoRoutingOff(
CDBSingleObject::GetInstance(), dwPartyID, dwSenderID))
{
ERRLOG2(g_Log, "파티 로그 : PID:%10u / CID:%10u / 캐릭터의 오토루팅 끄기 실패 (CID 가 0이면 ALL)",
dwPartyID, dwSenderID);
}
return true;
}
bool RelayPacket(CSendStream& SendStream, PktDD* lpPktDD)
{
unsigned short usPacketSize = lpPktDD->GetLen();
switch(lpPktDD->m_wCmd)
{
case PktDD::SCmdLevelUpPartyMem:
case PktDD::SCmdChangeClassPartyMem:
case PktDD::SCmdChangeGuildPartyMem:
{
PktPMD* lpPktPMD = static_cast<PktPMD*>(lpPktDD);
CPartyDBInfo* lpParty = CPartyDBMgr::GetInstance().OpenParty(CDBSingleObject::GetInstance(), lpPktPMD->m_dwPartyID);
if(lpParty)
{
// 캐릭터 정보 업데이트 //
if(PktDD::SCmdLevelUpPartyMem)
{
lpParty->SetUserInfoLevel(lpPktPMD->m_dwSenderID, lpPktPMD->m_cLevel);
}
if(PktDD::SCmdChangeClassPartyMem)
{
lpParty->SetUserInfoClass(lpPktPMD->m_dwSenderID, lpPktPMD->m_wClass);
}
if(PktDD::SCmdChangeGuildPartyMem)
{
lpParty->SetUserInfoGID(lpPktPMD->m_dwSenderID, lpPktPMD->m_dwGID);
}
}
}
break;
}
if(PacketWrap::WrapHeader(reinterpret_cast<char*>(lpPktDD),
usPacketSize, CmdAgentParty, 0, 0))
{
CGameDispatch::GetDispatchTable().Process(CSendPacketAllServer(
reinterpret_cast<char*>(lpPktDD), usPacketSize, CmdAgentParty));
}
return true;
}
}
}

View File

@@ -0,0 +1,17 @@
#ifndef _DBAGENT_SERVER_PARSE_PARTY_H_
#define _DBAGENT_SERVER_PARSE_PARTY_H_
// forward delc.
class CSendStream;
struct PktBase;
namespace DBAgent
{
namespace ParseParty
{
bool Parse(CSendStream& SendStream, PktBase* lpPktBase);
}
}
#endif