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:
File diff suppressed because it is too large
Load Diff
@@ -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
@@ -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
@@ -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
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user