Files
Sun1602/Server/GuildServer/PacketHandler/Handler_FromGameServer.cpp
T
2022-10-26 12:25:11 +08:00

1945 lines
74 KiB
C++

#include "stdafx.h"
#include "Handler_FromGameServer.h"
#include "PacketHandler.Shared.h"
#include <PacketStruct_DZ.h>
#include <PacketStruct_GZ.h>
#include <PacketStruct_WZ.h>
#include <GuildRankInfoParser.h>
#include <GuildServer.h>
#include "DominationManager.h"
// GUILD
#include <Guild/GuildManager.h>
#include <Guild/Guild.h>
#include <Guild/GuildMember.h>
#include <Guild/GuildRelation.h>
#include <Guild/GuildSmallContentEntry.h>
//
//
#define ADD_HANDLER_INFO_EOR() { MAKEWORD(0, 0), PHASE_NOACTION, (PH_fnHandler)NULL }
#define ADD_HANDLER_INFO( c, p, accptablePHASE ) \
{ MAKEWORD(c, p), accptablePHASE, (PH_fnHandler)&Handler_FromGameServer::On##p }
sPACKET_HANDLER_INFO* Handler_FromGameServer::GetHandlerInfo()
{
static sPACKET_HANDLER_INFO s_pHandlerInfo[] =
{
//
//ADD_HANDLER_INFO(AM_OPERATION, AM_OPERATION_USERCOUNT_SYN, PHASE_UNLIMITED),
ADD_HANDLER_INFO( GZ_GUILD, GZ_GUILD_CREATE_SYN, PHASE_UNLIMITED),
ADD_HANDLER_INFO( GZ_GUILD, GZ_GUILD_DESTROY_SYN, PHASE_UNLIMITED),
ADD_HANDLER_INFO( GZ_GUILD, GZ_GUILD_JOIN_SYN, PHASE_UNLIMITED),
ADD_HANDLER_INFO( GZ_GUILD, GZ_GUILD_WITHDRAW_SYN, PHASE_UNLIMITED),
ADD_HANDLER_INFO( GZ_GUILD, GZ_GUILD_KICKPLAYER_SYN, PHASE_UNLIMITED),
ADD_HANDLER_INFO( GZ_GUILD, GZ_GUILD_DONATE_UP_SYN, PHASE_UNLIMITED),
ADD_HANDLER_INFO( GZ_GUILD, GZ_GUILD_CONVERT_UP2GP_SYN, PHASE_UNLIMITED),
ADD_HANDLER_INFO( GZ_GUILD, GZ_GUILD_RANKUP_SYN, PHASE_UNLIMITED),
#ifdef __NA_000000_20070528_TAIWAN_GUILD_PVP
ADD_HANDLER_INFO( GZ_GUILD, GZ_GUILD_CHUNTING_PVP_RESULT_CMD, PHASE_UNLIMITED),
#endif
ADD_HANDLER_INFO( GZ_GUILD, GZ_GUILD_CHANGE_DUTY_SYN, PHASE_UNLIMITED ), //길드 직책 설정
ADD_HANDLER_INFO( GZ_GUILD, GZ_GUILD_RIGHT_DELEGATION_LIST_SYN, PHASE_UNLIMITED ), //길드 위임 권한 목록 요청
ADD_HANDLER_INFO( GZ_GUILD, GZ_GUILD_RIGHT_DELEGATION_SYN, PHASE_UNLIMITED ), //길드 권한 위임
ADD_HANDLER_INFO( GZ_GUILD, GZ_GUILD_CHANGE_MASTER_SYN, PHASE_UNLIMITED ), //길드장변경
ADD_HANDLER_INFO( GZ_GUILD, GZ_GUILD_CREATE_CORPS_SYN, PHASE_UNLIMITED ), //길드 군단 생성
ADD_HANDLER_INFO( GZ_GUILD, GZ_GUILD_DESTROY_CORPS_SYN, PHASE_UNLIMITED ), //길드 군단 해산
ADD_HANDLER_INFO( GZ_GUILD, GZ_GUILD_EMPTY_COMMANDER_INFO_SYN, PHASE_UNLIMITED ), //길드 빈 군단장 정보 요청.
ADD_HANDLER_INFO( GZ_GUILD, GZ_GUILD_CHANGE_COMMANDER_SYN, PHASE_UNLIMITED ), //길드 군단장 변경.
ADD_HANDLER_INFO( GZ_GUILD, GZ_GUILD_CHANGE_CORPS_SYN, PHASE_UNLIMITED ), //길드 군단 변경.
ADD_HANDLER_INFO( GZ_GUILD, GZ_GUILD_CREATE_REAR_CAMP_SYN, PHASE_UNLIMITED ), //길드 육성캠프 생성.
ADD_HANDLER_INFO( GZ_GUILD, GZ_GUILD_DESTROY_REAR_CAMP_SYN, PHASE_UNLIMITED ), //길드 육성캠프 해산.
ADD_HANDLER_INFO( GZ_GUILD, GZ_GUILD_INVITE_SYN, PHASE_UNLIMITED ), //길드 초대.
ADD_HANDLER_INFO( GZ_GUILD, GZ_GUILD_LOGIN_CHAR_SYN, PHASE_UNLIMITED ), //길드 멤버 로그인.
ADD_HANDLER_INFO( GZ_GUILD, GZ_GUILD_LOGOUT_CHAR_SYN, PHASE_UNLIMITED ), //길드 멤버 로그아웃.
ADD_HANDLER_INFO( GZ_GUILD, GZ_GUILD_CHAR_LEVELUP_SYN, PHASE_UNLIMITED ), //길드원 레벨업.
ADD_HANDLER_INFO( GZ_GUILD, GZ_GUILD_TOTALINFO_REQ_SYN, PHASE_UNLIMITED ), //길드원 정보요청.
ADD_HANDLER_INFO( GZ_GUILD, GZ_GUILD_GM_GUILD_POINT_SYN, PHASE_UNLIMITED ), //길드원 포인트 변경 요청.
ADD_HANDLER_INFO( GZ_GUILD, GZ_GUILD_CHANGE_CHAOSTATE_SYN, PHASE_UNLIMITED), //길드원 카오상태 변경.
ADD_HANDLER_INFO( GZ_GUILD, GZ_GUILD_ENTER_SERVER_SYN, PHASE_UNLIMITED), //길드원이 게임서버간을 이동할 때.
ADD_HANDLER_INFO( GZ_GUILD, GZ_GUILD_PRE_LOGIN_CMD, PHASE_UNLIMITED), //길드원이 로그인 사전 준비.
ADD_HANDLER_INFO( GZ_GUILD, GZ_GUILD_RELATION_SYN, PHASE_UNLIMITED),
ADD_HANDLER_INFO( GZ_GUILD, GZ_GUILD_RELATION_DELETE_SYN, PHASE_UNLIMITED),
ADD_HANDLER_INFO( GZ_GUILD, GZ_GUILD_RELATION_BOTH_AGAINST_SYN, PHASE_UNLIMITED),
ADD_HANDLER_INFO( GZ_GUILD, GZ_GUILD_RELATION_ALLIENCE_SYN, PHASE_UNLIMITED),
ADD_HANDLER_INFO( GZ_GUILD, GZ_GUILD_RECOVERY_GUILD_SYN, PHASE_UNLIMITED),
ADD_HANDLER_INFO( GZ_GUILD, GZ_GUILD_GUILDMARK_REGISTER_SYN, PHASE_UNLIMITED),
ADD_HANDLER_INFO( GZ_GUILD, GZ_GUILD_GUILDMARK_DELETE_SYN, PHASE_UNLIMITED),
ADD_HANDLER_INFO( GZ_GUILD, GZ_GUILD_WAREHOUSE_OPEN_SYN, PHASE_UNLIMITED),
ADD_HANDLER_INFO( GZ_GUILD, GZ_GUILD_WAREHOUSE_CLOSE_SYN, PHASE_UNLIMITED),
ADD_HANDLER_INFO( GZ_GUILD, GZ_GUILD_RELATION_INFO_SYN, PHASE_UNLIMITED),
ADD_HANDLER_INFO( GZ_GUILD, GZ_GUILD_NAME_CHANGE_SYN, PHASE_UNLIMITED),
//{ __KR_001385_20090907_DOMINATION_PACKET
ADD_HANDLER_INFO( GZ_GUILD, GZ_DOMINATION_INFO_SYN, PHASE_UNLIMITED),
ADD_HANDLER_INFO( GZ_GUILD, GZ_DOMINATION_AUCTION_INFO_SYN, PHASE_UNLIMITED),
ADD_HANDLER_INFO( GZ_GUILD, GZ_DOMINATION_UPDATE_INFO_SYN, PHASE_UNLIMITED),
ADD_HANDLER_INFO( GZ_GUILD, GZ_DOMINATION_ACCEP_HEIM_SYN, PHASE_UNLIMITED),
ADD_HANDLER_INFO( GZ_GUILD, GZ_DOMINATION_INIT_ACTIONINFO_SYN, PHASE_UNLIMITED),
ADD_HANDLER_INFO( GZ_GUILD, GZ_DOMINATION_RETURNHIME_SYN, PHASE_UNLIMITED),
ADD_HANDLER_INFO( GZ_GUILD, GZ_DOMINATION_BATTING_HEIM_SYN, PHASE_UNLIMITED),
//}
#ifdef _NA_20100604_BETTER_DOMINATION_MANAGER
ADD_HANDLER_INFO( GZ_GUILD, GZ_DOMINATION_UPDATE_GUILDINFO_SYN, PHASE_UNLIMITED),
#endif
//_NA_20100913_GUILD_WAREHOUSE_GM_COMMAND
ADD_HANDLER_INFO(GZ_GUILD, GZ_GUILD_GM_WAREHOUSE_FORCE_CLOSE_CMD, PHASE_UNLIMITED), // GM 명령에 의한 길드 창고 강제 닫기
#ifdef _NA_20110216_INCREASE_DOMINATION_DEFFENSEWALL_POINT
ADD_HANDLER_INFO(GZ_GUILD, GZ_DOMINATION_ADD_DEFFENSEWALL_POINT_SYN, PHASE_UNLIMITED),
#endif
#ifdef _NA_20110406_CHANGE_RULE_FOR_DOMINATION_JOIN
ADD_HANDLER_INFO(GZ_GUILD, GZ_DOMINATION_MEMBER_JOIN_SYN, PHASE_UNLIMITED),
ADD_HANDLER_INFO(GZ_GUILD, GZ_DOMINATION_MEMBER_LEAVE_SYN, PHASE_UNLIMITED),
ADD_HANDLER_INFO(GZ_GUILD, GZ_DOMINATION_MEMBERLIST_REQ, PHASE_UNLIMITED),
ADD_HANDLER_INFO(GZ_GUILD, GZ_DOMINATION_MEMBERLIST_INIT_CMD, PHASE_UNLIMITED),
#endif
ADD_HANDLER_INFO_EOR(),
};
return s_pHandlerInfo;
};
VOID Handler_FromGameServer::RegisterHandler_ALL( PACKET_HANDLER_DELEGATOR pInstance )
{
pInstance->RegisterHandler_<GAME_SERVER>( GetHandlerInfo() );
pInstance->RegisterHandler_<GAME_SERVER>( PacketHandlerShared::GetHandlerInfo() );
}
Handler_FromGameServer_IMPL(GZ_GUILD_CREATE_SYN)
{
MSG_GZ_GUILD_CREATE_SYN * pRecvMsg = (MSG_GZ_GUILD_CREATE_SYN *)pMsg;
RC::eGUILD_RESULT rt = g_GuildManager.CanCreateGuild( pRecvMsg->m_MasterCharGuid, pRecvMsg->m_MasterLV );
if( rt == RC::RC_GUILD_SUCCESS )
{
MSG_DZ_GUILD_CREATE_SYN msg;
msg.m_dwKey = pRecvMsg->m_dwKey;
msg.m_dwSessionIndex = pServerSession->GetSessionIndex();
msg.m_MasterCharGuid = pRecvMsg->m_MasterCharGuid;
_tcsncpy(msg.m_tszGuildName, pRecvMsg->m_tszGuildName, _countof(msg.m_tszGuildName));
msg.m_tszGuildName[_countof(msg.m_tszGuildName) - 1] = _T('\0');
_tcsncpy(msg.m_szMasterCharName, pRecvMsg->m_tszMasterCharName,
_countof(msg.m_szMasterCharName));
msg.m_szMasterCharName[_countof(msg.m_szMasterCharName) - 1] = _T('\0');
msg.m_byClass = pRecvMsg->m_byMasterClass;
msg.m_Level = pRecvMsg->m_MasterLV;
GuildServer::GetMainFrame()->ConnectSessions.SendToDBProxy( &msg, sizeof(msg) );
}
else
{
MSG_GZ_GUILD_CREATE_NAK msg;
msg.m_dwKey = pRecvMsg->m_dwKey;
msg.m_byErrorCode = rt;
pServerSession->SendPacket( &msg, sizeof(msg) );
}
}
Handler_FromGameServer_IMPL(GZ_GUILD_DESTROY_SYN)
{
const MSG_GZ_GUILD_DESTROY_SYN* receive_msg = static_cast<MSG_GZ_GUILD_DESTROY_SYN*>(pMsg);
#ifdef _USING_GUILD_DESTROY_LOGGING
SUNLOG(eCRITICAL_LOG,
_T("|길드해산신청|Handler_FromGameServer_IMPL(GZ_GUILD_DESTROY_SYN)|MSG_GZ_GUILD_DESTROY_SYN 받음|GuildGuid:%d, MasterCharGuid:%d|"),
receive_msg->m_GuildGuid,
receive_msg->m_MasterCharGuid);
#endif // _USING_GUILD_DESTROY_LOGGING
const RC::eGUILD_RESULT result = g_GuildManager.CanDestroyGuild(receive_msg->m_GuildGuid,
receive_msg->m_MasterCharGuid);
if (result == RC::RC_GUILD_SUCCESS)
{
MSG_DZ_GUILD_DESTROY_SYN msg;
msg.m_dwKey = receive_msg->m_dwKey;
msg.m_dwSessionIndex = pServerSession->GetSessionIndex();
msg.m_MasterCharGuid = receive_msg->m_MasterCharGuid;
msg.m_GuildGuid = receive_msg->m_GuildGuid;
msg.m_DestroyWaitTime = receive_msg->m_DestroyWaitTime;
#ifdef _USING_GUILD_DESTROY_LOGGING
SUNLOG(eCRITICAL_LOG,
_T("|길드해산신청|Handler_FromGameServer_IMPL(GZ_GUILD_DESTROY_SYN)|MSG_DZ_GUILD_DESTROY_SYN 보냄|Key:%u, SessionIndex:%u, MasterCharGuid:%u, GuildGuid:%d, DestroyWaitTime:%u|"),
msg.m_dwKey,
msg.m_dwSessionIndex,
msg.m_MasterCharGuid,
msg.m_GuildGuid,
msg.m_DestroyWaitTime);
#endif // _USING_GUILD_DESTROY_LOGGING
GuildServer::GetMainFrame()->ConnectSessions.SendToDBProxy(&msg, sizeof(msg));
}
else
{
MSG_GZ_GUILD_DESTROY_NAK nak_msg;
nak_msg.m_dwKey = receive_msg->m_dwKey;
nak_msg.m_byErrorCode = result;
#ifdef _USING_GUILD_DESTROY_LOGGING
SUNLOG(eCRITICAL_LOG,
_T("|길드해산신청|Handler_FromGameServer_IMPL(GZ_GUILD_DESTROY_SYN)|MSG_GZ_GUILD_DESTROY_NAK 보냄|Key:%u, ErrorCode:%d|"),
nak_msg.m_dwKey,
nak_msg.m_byErrorCode);
#endif // _USING_GUILD_DESTROY_LOGGING
pServerSession->SendPacket(&nak_msg, sizeof(nak_msg));
}
}
//탈퇴.
Handler_FromGameServer_IMPL(GZ_GUILD_WITHDRAW_SYN)
{
MSG_GZ_GUILD_WITHDRAW_SYN * pRecvMsg = (MSG_GZ_GUILD_WITHDRAW_SYN *)pMsg;
RC::eGUILD_RESULT rt = g_GuildManager.CanLeaveGuild( pRecvMsg->m_GuildGuid, pRecvMsg->m_CharGuid );
if( rt != RC::RC_GUILD_SUCCESS )
{
MSG_GZ_GUILD_WITHDRAW_NAK msgNAK;
msgNAK.m_dwKey = pRecvMsg->m_dwKey;
msgNAK.m_byErrorCode = rt;
pServerSession->SendPacket( &msgNAK, sizeof(msgNAK) );
return;
}
MSG_DZ_GUILD_WITHDRAW_SYN msgSYN;
msgSYN.m_dwKey = pRecvMsg->m_dwKey;
msgSYN.m_dwSessionIndex = pServerSession->GetSessionIndex();
msgSYN.m_GuildGuid = pRecvMsg->m_GuildGuid;
msgSYN.m_CharGuid = pRecvMsg->m_CharGuid;
msgSYN.m_byPenaltyType = 1; // 자기자신 탈퇴
if( !GuildServer::GetMainFrame()->ConnectSessions.SendToDBProxy( &msgSYN, sizeof(msgSYN) ) )
{
MSG_GZ_GUILD_WITHDRAW_NAK msgNAK;
msgNAK.m_dwKey = pRecvMsg->m_dwKey;
msgNAK.m_byErrorCode = RC::RC_GUILD_FAILED_BY_NOT_CONNECT_SERVER;
pServerSession->SendPacket( &msgNAK, sizeof(msgNAK) );
return;
}
}
// 길드원 강퇴
Handler_FromGameServer_IMPL(GZ_GUILD_KICKPLAYER_SYN)
{
MSG_GZ_GUILD_KICKPLAYER_SYN* pRecvMsg = (MSG_GZ_GUILD_KICKPLAYER_SYN*)pMsg;
if( _tcslen( pRecvMsg->m_ptszCharName ) > MAX_CHARNAME_LENGTH )
{
MSG_GZ_GUILD_KICKPLAYER_NAK nakMsg;
nakMsg.m_dwKey = pRecvMsg->m_dwKey;
nakMsg.m_dwErrorCode = RC::RC_GUILD_FAILED;
pServerSession->SendPacket( &nakMsg, sizeof(nakMsg) );
DISPMSG( "KICKPLAYER Error - KickCharName Overflow[GuildGuid:%u]\n", pRecvMsg->m_GuildGuid );
return;
}
RC::eGUILD_RESULT rt = g_GuildManager.CanKickMember( pRecvMsg->m_GuildGuid, pRecvMsg->m_OperCharGuid, pRecvMsg->m_ptszCharName );
if( rt != RC::RC_GUILD_SUCCESS )
{
MSG_GZ_GUILD_KICKPLAYER_NAK nakMsg;
nakMsg.m_dwKey = pRecvMsg->m_dwKey;
_tcsncpy( nakMsg.m_ptszCharName, pRecvMsg->m_ptszCharName, MAX_CHARNAME_LENGTH );
nakMsg.m_ptszCharName[MAX_CHARNAME_LENGTH] = '\0';
nakMsg.m_dwErrorCode = rt;
pServerSession->SendPacket( &nakMsg, sizeof(nakMsg) );
return;
}
GuildMember* pOperMember = g_GuildManager.FindGuildMember(pRecvMsg->m_GuildGuid,pRecvMsg->m_OperCharGuid);
if( !pOperMember ) return;
GuildMember* pTargetMember = g_GuildManager.FindGuildMemberByName( pRecvMsg->m_GuildGuid, pRecvMsg->m_ptszCharName );
if( !pTargetMember ) return; //왜 그냥 리턴하냐면... 위에서 검증되었기 때문이다. 반드시 존재한다.
MSG_DZ_GUILD_KICKPLAYER_SYN msg;
msg.m_dwKey = pRecvMsg->m_dwKey;
msg.m_GuildGuid = pRecvMsg->m_GuildGuid;
msg.m_OperCharGuid = pOperMember->GetCharGuid();
msg.m_TargetCharGuid = pTargetMember->GetCharGuid();
msg.m_byCorpsNum = pOperMember->GetCorpsNumber();
msg.m_dwSessionIndex = pServerSession->GetSessionIndex();
if( !GuildServer::GetMainFrame()->ConnectSessions.SendToDBProxy( &msg, sizeof(msg) ) )
{
MSG_GZ_GUILD_KICKPLAYER_NAK nakMsg;
nakMsg.m_dwKey = pRecvMsg->m_dwKey;
_tcsncpy( nakMsg.m_ptszCharName, pRecvMsg->m_ptszCharName, MAX_CHARNAME_LENGTH );
nakMsg.m_ptszCharName[MAX_CHARNAME_LENGTH] = '\0';
nakMsg.m_dwErrorCode = RC::RC_GUILD_FAILED_BY_NOT_CONNECT_SERVER;
pServerSession->SendPacket( &nakMsg, sizeof(nakMsg) );
return;
}
}
////////////////////
// 길드 포인트 관련
// UP 적립
Handler_FromGameServer_IMPL(GZ_GUILD_DONATE_UP_SYN)
{
MSG_GZ_GUILD_DONATE_UP_SYN* pRecvMsg = (MSG_GZ_GUILD_DONATE_UP_SYN*)pMsg;
RC::eGUILD_RESULT rt = g_GuildManager.CanDonateUP( pRecvMsg->m_GuildGuid, pRecvMsg->m_CharGuid );
if( rt != RC::RC_GUILD_SUCCESS )
{
MSG_GZ_GUILD_DONATE_UP_NAK nakMsg;
nakMsg.m_dwKey = pRecvMsg->m_dwKey;
nakMsg.m_GuildGuid = pRecvMsg->m_GuildGuid;
nakMsg.m_byErrorCode = rt;
pServerSession->SendPacket( &nakMsg, sizeof(nakMsg) );
return;
}
MSG_DZ_GUILD_DONATE_UP_SYN sendMsg;
sendMsg.m_dwKey = pRecvMsg->m_dwKey;
sendMsg.m_dwSessionIndex = pServerSession->GetSessionIndex(); // 게임서버의 세션을 저장한다.
sendMsg.m_GuildGuid = pRecvMsg->m_GuildGuid;
sendMsg.m_CharGuid = pRecvMsg->m_CharGuid;
sendMsg.m_GuildUP = pRecvMsg->m_DonateUP;
if( !GuildServer::GetMainFrame()->ConnectSessions.SendToDBProxy( &sendMsg, sizeof(sendMsg) ) )
{
SUNLOG( eCRITICAL_LOG, "DZ_GUILD_DONATE_UP Error - Can't send Packet![GuildGuid:%u]\n", pRecvMsg->m_GuildGuid );
MSG_DZ_GUILD_DONATE_UP_NAK nakMsg;
nakMsg.m_GuildGuid = pRecvMsg->m_GuildGuid;
nakMsg.m_byErrorCode = RC::RC_GUILD_FAILED;
pServerSession->SendPacket( &nakMsg, sizeof(nakMsg) );
return;
}
}
// UP->GP 변환
Handler_FromGameServer_IMPL(GZ_GUILD_CONVERT_UP2GP_SYN)
{
MSG_GZ_GUILD_CONVERT_UP2GP_SYN* pRecvMsg = (MSG_GZ_GUILD_CONVERT_UP2GP_SYN*)pMsg;
RC::eGUILD_RESULT rt = g_GuildManager.CanConvertUP2GP( pRecvMsg->m_GuildGuid, pRecvMsg->m_OperCharGuid, pRecvMsg->m_ConvertGP );
if( rt != RC::RC_GUILD_SUCCESS )
{
// 기본적인 권한 검사는 GameServer에서 했다고 판단하므로 따로 검사하지 않고 바로 DBProxy로 보낸다
MSG_GZ_GUILD_CONVERT_UP2GP_NAK nakMsg;
nakMsg.m_dwKey = pRecvMsg->m_dwKey;
nakMsg.m_GuildGuid = pRecvMsg->m_GuildGuid;
nakMsg.m_byErrorCode = rt;
pServerSession->SendPacket( &nakMsg, sizeof(nakMsg) );
return;
}
MSG_DZ_GUILD_CONVERT_UP2GP_SYN sendMsg;
sendMsg.m_dwKey = pRecvMsg->m_dwKey;
sendMsg.m_dwSessionIndex = pServerSession->GetSessionIndex();
sendMsg.m_GuildGuid = pRecvMsg->m_GuildGuid;
sendMsg.m_ConverGP = pRecvMsg->m_ConvertGP;
if( !GuildServer::GetMainFrame()->ConnectSessions.SendToDBProxy( &sendMsg, sizeof(sendMsg) ) )
{
MSG_GZ_GUILD_CONVERT_UP2GP_NAK nakMsg;
nakMsg.m_dwKey = pRecvMsg->m_dwKey;
nakMsg.m_GuildGuid = pRecvMsg->m_GuildGuid;
nakMsg.m_byErrorCode = RC::RC_GUILD_FAILED_BY_NOT_CONNECT_SERVER;
pServerSession->SendPacket( &nakMsg, sizeof(nakMsg) );
return;
}
}
// 길드 랭크업
Handler_FromGameServer_IMPL(GZ_GUILD_RANKUP_SYN)
{
MSG_GZ_GUILD_RANKUP_SYN* pRecvMsg = (MSG_GZ_GUILD_RANKUP_SYN*)pMsg;
GPTYPE UseGP = 0;
GuildRankInfo RankInfo;
RC::eGUILD_RESULT rt = g_GuildManager.CanRankUp( pRecvMsg->m_GuildGuid, pRecvMsg->m_OperCharGuid, RankInfo );
if( rt != RC::RC_GUILD_SUCCESS )
{
MSG_GZ_GUILD_RANKUP_NAK msg;
msg.m_dwKey = pRecvMsg->m_dwKey;
msg.m_GuildGuid = pRecvMsg->m_GuildGuid;
msg.m_byErrorCode = rt;
pServerSession->SendPacket( &msg, sizeof(msg) );
SUNLOG( eFULL_LOG, "[GZ_GUILD_RANKUP_SYN] RankUp Fail [GuildGuid:%u][ErrorCode:%u]", pRecvMsg->m_GuildGuid, rt );
return;
}
// 돈만 게임서버에서 체크하고 나머지는 여기서 체크한다.
MSG_DZ_GUILD_RANKUP_SYN sendMsg;
sendMsg.m_dwSessionIndex = pServerSession->GetSessionIndex();
sendMsg.m_dwKey = pRecvMsg->m_dwKey;
sendMsg.m_GuildGuid = pRecvMsg->m_GuildGuid;
sendMsg.m_UpdateGrade = RankInfo.m_byLevel;
//DB에 보내는 것은 랭크업에 필요한 정보이다.
sendMsg.m_UseUP = RankInfo.m_UP;
sendMsg.m_UseGP = RankInfo.m_GP;
if( !GuildServer::GetMainFrame()->ConnectSessions.SendToDBProxy( &sendMsg, sizeof(sendMsg) ) )
{
MSG_GZ_GUILD_RANKUP_NAK nakMsg;
nakMsg.m_GuildGuid = pRecvMsg->m_GuildGuid;
nakMsg.m_byErrorCode = RC::RC_GUILD_FAILED_BY_NOT_CONNECT_SERVER;
pServerSession->SendPacket( &nakMsg, sizeof(nakMsg) );
return;
}
}
// 길드원 카오상태 변경
Handler_FromGameServer_IMPL(GZ_GUILD_CHANGE_CHAOSTATE_SYN)
{
MSG_GZ_GUILD_CHANGE_CHAOSTATE_SYN* pRecvMsg = (MSG_GZ_GUILD_CHANGE_CHAOSTATE_SYN*)pMsg;
RC::eGUILD_RESULT rc = g_GuildManager.ChangeChaoState( pRecvMsg->m_GuildGuid, pRecvMsg->m_CharGuid, pRecvMsg->m_byChaoState );
if( rc != RC::RC_GUILD_SUCCESS )
{
SUNLOG( eCRITICAL_LOG, "[Handler_FromGameServer_IMPL(GZ_GUILD_CHANGE_CHAOSTATE_SYN)] Fail, GuildGuid = %u, CharGuid = %d, ChaoState = %d",
pRecvMsg->m_GuildGuid, pRecvMsg->m_CharGuid, pRecvMsg->m_byChaoState );
return;
}
MSG_GZ_GUILD_CHANGE_CHAOSTATE_BRD brdMsg;
brdMsg.m_GuildGuid = pRecvMsg->m_GuildGuid;
g_GuildManager.GetCharName( pRecvMsg->m_GuildGuid, pRecvMsg->m_CharGuid, brdMsg.m_szCharName, MAX_CHARNAME_LENGTH );
brdMsg.m_byChaoState = pRecvMsg->m_byChaoState;
GuildServer::GetMainFrame()->SendToAllGameServers( &brdMsg, sizeof(brdMsg) );
}
Handler_FromGameServer_IMPL(GZ_GUILD_ENTER_SERVER_SYN)
{
MSG_GZ_GUILD_ENTER_SERVER_SYN* pRecvMsg = (MSG_GZ_GUILD_ENTER_SERVER_SYN*)pMsg;
//Invite나 Join이나 조건은 똑같다.
RC::eGUILD_RESULT rt = g_GuildManager.CanMoveServer( pRecvMsg->m_GuildGuid, pRecvMsg->m_CharGuid );
if( rt != RC::RC_GUILD_SUCCESS )
{
MSG_GZ_GUILD_ENTER_SERVER_NAK nakMsg;
nakMsg.m_byErrorCode = rt;
pServerSession->SendPacket( &nakMsg, sizeof(nakMsg) );
return;
}
// 해당 게임서버에 길드 정보를 보낸다.
MSG_GZ_GUILD_ENTER_SERVER_ACK ackMsg;
ackMsg.m_dwKey = pRecvMsg->m_dwKey;
g_GuildManager.SerializeGameGuildInfo( pRecvMsg->m_GuildGuid, ackMsg.m_GameGuildInfo, SERIALIZE_LOAD );
g_GuildManager.GetGuildBaseMemberInfo( pRecvMsg->m_GuildGuid, pRecvMsg->m_CharGuid, ackMsg.m_BaseMemberInfo );
pServerSession->SendPacket( &ackMsg, sizeof(ackMsg) );
}
Handler_FromGameServer_IMPL(GZ_GUILD_PRE_LOGIN_CMD)
{
MSG_GZ_GUILD_PRE_LOGIN_CMD* pRecvMsg = (MSG_GZ_GUILD_PRE_LOGIN_CMD*)pMsg;
Guild* pGuild = g_GuildManager.FindGuild( pRecvMsg->m_GuildGuid );
if( !pGuild ) return;
GuildMember* pMember = pGuild->FindMember( pRecvMsg->m_CharGuid );
if( !pMember ) return;
if( pMember->IsLogIn() == TRUE )
{
SUNLOG( eCRITICAL_LOG, "[Handler_FromGameServer_IMPL(GZ_GUILD_PRE_LOGIN_CMD)] Already Loin Char And Init GuildGuid = %u, CharGuid = %u",
pRecvMsg->m_GuildGuid, pRecvMsg->m_CharGuid );
pMember->SetLogin( FALSE );
}
}
#ifdef __NA_000000_20070528_TAIWAN_GUILD_PVP
Handler_FromGameServer_IMPL(GZ_GUILD_CHUNTING_PVP_RESULT_CMD)
{
MSG_GZ_GUILD_CHUNTING_PVP_RESULT_CMD * pRecvMsg = (MSG_GZ_GUILD_CHUNTING_PVP_RESULT_CMD *)pMsg;
MSG_DZ_GUILD_CHUNTING_PVP_RESULT_SYN msg;
msg.m_dwKey = pRecvMsg->m_dwKey;
msg.m_dwSessionIndex = pServerSession->GetSessionIndex();
RC::eGUILD_RESULT rt = g_GuildManager.ChuntingPVPResult( pRecvMsg->m_WinGuildGuid, pRecvMsg->m_LoseGuildGuid, pRecvMsg->m_DisGuildGuid );
if( rt == RC::RC_GUILD_SUCCESS )
{
Guild *pWinGuild = g_GuildManager.FindGuild(pRecvMsg->m_WinGuildGuid);
if( pWinGuild )
{
msg.m_GuildGuid = pRecvMsg->m_WinGuildGuid;
msg.m_PVPInfo = *pWinGuild->GetChuntingPVPInfo();
GuildServer::GetMainFrame()->ConnectSessions.SendToDBProxy( &msg, sizeof(msg) );
}
if( pRecvMsg->m_DisGuildGuid ) msg.m_GuildGuid = pRecvMsg->m_DisGuildGuid;
else msg.m_GuildGuid = pRecvMsg->m_LoseGuildGuid;
Guild *pLoseGuild = g_GuildManager.FindGuild(msg.m_GuildGuid);
if( pLoseGuild )
{
msg.m_PVPInfo = *pLoseGuild->GetChuntingPVPInfo();
GuildServer::GetMainFrame()->ConnectSessions.SendToDBProxy( &msg, sizeof(msg) );
}
}
}
#endif
// 길드 직책 변경
Handler_FromGameServer_IMPL(GZ_GUILD_CHANGE_DUTY_SYN)
{
MSG_GZ_GUILD_CHANGE_DUTY_SYN *pRecvMsg = (MSG_GZ_GUILD_CHANGE_DUTY_SYN *)pMsg;
GuildMember* pTargerMember = g_GuildManager.FindGuildMemberByName( pRecvMsg->m_GuildGuid, pRecvMsg->m_szTargetCharName );
if( !pTargerMember )
{
//클라이언트한테 그런 타겟멤버 없다고 NAK보낸다.
MSG_GZ_GUILD_CHANGE_DUTY_NAK nakMSG;
nakMSG.m_dwKey = pRecvMsg->m_dwKey;
nakMSG.m_byErrorCode = RC::RC_GUILD_NOT_GUILD_MEMBER;
pServerSession->SendPacket(&nakMSG, sizeof(nakMSG));
return;
}
// 1. 여기서 길드의 권한을 체크한다.
RC::eGUILD_RESULT rt = g_GuildManager.CanChangeDuty( pRecvMsg->m_GuildGuid, pRecvMsg->m_OperCharGuid,
pTargerMember->GetCharGuid(), (eGUILD_DUTY)pRecvMsg->m_byDuty );
//모든 것은 DB에서 성공 ACK를 받고 진행한다.
if(rt != RC::RC_GUILD_SUCCESS)
{
MSG_GZ_GUILD_CHANGE_DUTY_NAK nakMSG;
nakMSG.m_dwKey = pRecvMsg->m_dwKey;
nakMSG.m_byErrorCode = rt;
pServerSession->SendPacket(&nakMSG, sizeof(nakMSG));
SUNLOG( eFULL_LOG, "[Handler_FromGameServer_IMPL(GZ_GUILD_CHANGE_DUTY_SYN)] Fail, [GUILDGUID:%d][OPERGUID:%d][Target:%s][ChangeDuty:%d] rt = %d",
pRecvMsg->m_GuildGuid, pRecvMsg->m_OperCharGuid, pRecvMsg->m_szTargetCharName, pRecvMsg->m_byDuty, rt );
return;
}
//DB로 전송
MSG_DZ_GUILD_CHANGE_DUTY_SYN sndMSG;
sndMSG.m_dwKey = pRecvMsg->m_dwKey;
sndMSG.m_dwSessionIndex = pServerSession->GetSessionIndex();
sndMSG.m_GuildGuid = pRecvMsg->m_GuildGuid;
sndMSG.m_OperGuid = pRecvMsg->m_OperCharGuid;
sndMSG.m_TargetGuid = pTargerMember->GetCharGuid();
sndMSG.m_eNewDuty = (eGUILD_DUTY)pRecvMsg->m_byDuty;
sndMSG.m_eOldDuty = pTargerMember->GetDuty();
if( !GuildServer::GetMainFrame()->ConnectSessions.SendToDBProxy(&sndMSG, sizeof(sndMSG)) )
{
MSG_GZ_GUILD_CHANGE_DUTY_NAK nakMSG;
nakMSG.m_dwKey = pRecvMsg->m_dwKey;
nakMSG.m_byErrorCode = RC::RC_GUILD_FAILED_BY_NOT_CONNECT_SERVER;
pServerSession->SendPacket(&nakMSG, sizeof(nakMSG));
SUNLOG( eCRITICAL_LOG, "[Handler_FromGameServer_IMPL(GZ_GUILD_CHANGE_DUTY_SYN)] Can't send Packet![GuildGuid:%u]\n", pRecvMsg->m_GuildGuid );
return;
}
}
//길드 위임 권한 목록 요청
Handler_FromGameServer_IMPL(GZ_GUILD_RIGHT_DELEGATION_LIST_SYN)
{
MSG_GZ_GUILD_RIGHT_DELEGATION_LIST_SYN* pRecvMsg = (MSG_GZ_GUILD_RIGHT_DELEGATION_LIST_SYN*)pMsg;
MSG_GZ_GUILD_RIGHT_DELEGATION_LIST_NAK nakMSG;
nakMSG.m_dwKey = pRecvMsg->m_dwKey;
//1. 길드가 있는지 체크
Guild* pGuild = g_GuildManager.FindGuild( pRecvMsg->m_GuildGuid );
if( !pGuild )
{
nakMSG.m_byErrorCode = RC::RC_GUILD_NOT_EXIST_GUILD;
pServerSession->SendPacket(&nakMSG, sizeof(nakMSG));
return;
}
//2. 리스트 요청자가 리스트를 요청해도 되는 사람인지 체크한다.
if( !g_GuildManager.CheckRight( pRecvMsg->m_GuildGuid, pRecvMsg->m_OperCharGuid, eGUILD_RIGHTS_VIEW_RIGHT ) )
{
nakMSG.m_byErrorCode = RC::RC_GUILD_HAVE_NOT_RIGHT;
pServerSession->SendPacket(&nakMSG, sizeof(nakMSG));
return;
}
//3. 권한위임대상이 위임대상이 되는지 체크.
RC::eGUILD_RESULT rc = g_GuildManager.IsDelegateChar( pRecvMsg->m_GuildGuid, pRecvMsg->m_szTargetCharName );
if( rc != RC::RC_GUILD_SUCCESS )
{
nakMSG.m_byErrorCode = rc;
pServerSession->SendPacket(&nakMSG, sizeof(nakMSG));
return;
}
//4. 위임할수 있는 권한 리스트를 불러온다. 불러올때는 현재 해당 유저의 위임된 권한까지 같이 가져온다.
MSG_GZ_GUILD_RIGHT_DELEGATION_LIST_ACK Ack;
Ack.m_dwKey = pRecvMsg->m_dwKey;
Ack.m_GuildGuid = pRecvMsg->m_GuildGuid;
g_GuildManager.GetDelegateRight( pRecvMsg->m_GuildGuid, pRecvMsg->m_szTargetCharName, Ack.m_DelegateRight );
strncpy( Ack.m_szTargetCharName, pRecvMsg->m_szTargetCharName, MAX_CHARNAME_LENGTH );
pServerSession->SendPacket( &Ack, sizeof(Ack) );
}
//길드 권한 위임
Handler_FromGameServer_IMPL(GZ_GUILD_RIGHT_DELEGATION_SYN)
{
MSG_GZ_GUILD_RIGHT_DELEGATION_SYN* pRecvMsg = (MSG_GZ_GUILD_RIGHT_DELEGATION_SYN*)pMsg;
RC::eGUILD_RESULT rc = g_GuildManager.CanRightDelegate( pRecvMsg->m_GuildGuid, pRecvMsg->m_OperCharGuid, pRecvMsg->m_szTargetCharName, pRecvMsg->m_DelegateRight );
if( rc != RC::RC_GUILD_SUCCESS )
{
MSG_GZ_GUILD_RIGHT_DELEGATION_NAK nakMSG;
nakMSG.m_byErrorCode = RC::RC_GUILD_INVALID_DELEGATE_RIGHT;
pServerSession->SendPacket(&nakMSG, sizeof(nakMSG));
return;
}
GuildMember* pTargetMember = g_GuildManager.FindGuildMemberByName( pRecvMsg->m_GuildGuid, pRecvMsg->m_szTargetCharName );
if( !pTargetMember )
return; //있을수 없다....
//5. DB에 보낸다.
MSG_DZ_GUILD_RIGHT_DELEGATION_SYN synMsg;
synMsg.m_dwKey = pRecvMsg->m_dwKey;
synMsg.m_dwSessionIndex = pServerSession->GetSessionIndex();
synMsg.m_GuildGuid = pRecvMsg->m_GuildGuid;
synMsg.m_TargetGuid = pTargetMember->GetCharGuid();
CopyMemory( synMsg.m_DelegateRight, pRecvMsg->m_DelegateRight, sizeof(synMsg.m_DelegateRight) );
if( !GuildServer::GetMainFrame()->ConnectSessions.SendToDBProxy( &synMsg, sizeof(synMsg) ) )
{
MSG_GZ_GUILD_RIGHT_DELEGATION_NAK nakMSG;
nakMSG.m_byErrorCode = RC::RC_GUILD_FAILED_BY_NOT_CONNECT_SERVER;
pServerSession->SendPacket(&nakMSG, sizeof(nakMSG));
return;
}
}
//길드장 변경
Handler_FromGameServer_IMPL(GZ_GUILD_CHANGE_MASTER_SYN)
{
MSG_GZ_GUILD_CHANGE_MASTER_SYN* pRecvMsg = (MSG_GZ_GUILD_CHANGE_MASTER_SYN*)pMsg;
RC::eGUILD_RESULT rc = g_GuildManager.CanChangeMaster( pRecvMsg->m_GuildGuid, pRecvMsg->m_OperCharGuid, pRecvMsg->m_szTargetCharName );
if( rc != RC::RC_GUILD_SUCCESS )
{
MSG_GZ_GUILD_CHANGE_MASTER_NAK nakMSG;
nakMSG.m_dwKey = pRecvMsg->m_dwKey;
nakMSG.m_byErrorCode = rc;
pServerSession->SendPacket(&nakMSG, sizeof(nakMSG));
return;
}
GuildMember* pTargetMember = g_GuildManager.FindGuildMemberByName( pRecvMsg->m_GuildGuid, pRecvMsg->m_szTargetCharName );
if( !pTargetMember ) return;
//5. DB에 보낸다.
MSG_DZ_GUILD_CHANGE_MASTER_SYN synMsg;
synMsg.m_dwKey = pRecvMsg->m_dwKey;
synMsg.m_dwSessionIndex = pServerSession->GetSessionIndex();
synMsg.m_GuildGuid = pRecvMsg->m_GuildGuid;
synMsg.m_OperCharGuid = pRecvMsg->m_OperCharGuid;
synMsg.m_TargetCharGuid = pTargetMember->GetCharGuid();
if( !GuildServer::GetMainFrame()->ConnectSessions.SendToDBProxy( &synMsg, sizeof(synMsg) ) )
{
MSG_GZ_GUILD_CHANGE_MASTER_NAK nakMSG;
nakMSG.m_byErrorCode = RC::RC_GUILD_FAILED;
pServerSession->SendPacket(&nakMSG, sizeof(nakMSG));
return;
}
}
//길드 군단 생성
Handler_FromGameServer_IMPL(GZ_GUILD_CREATE_CORPS_SYN)
{
MSG_GZ_GUILD_CREATE_CORPS_SYN *pRecvMsg = (MSG_GZ_GUILD_CREATE_CORPS_SYN *)pMsg;
BYTE byCorpsNum = 0;
RC::eGUILD_RESULT rt = g_GuildManager.CanCreateCorps( pRecvMsg->m_GuildGuid, pRecvMsg->m_OperCharGuid, pRecvMsg->m_szTargetCharName, byCorpsNum );
if( rt != RC::RC_GUILD_SUCCESS )
{
MSG_GZ_GUILD_CREATE_CORPS_NAK nakMSG;
nakMSG.m_dwKey = pRecvMsg->m_dwKey;
nakMSG.m_byErrorCode = rt;
pServerSession->SendPacket(&nakMSG, sizeof(nakMSG));
return;
}
//위에서 멤버에 대한 검증을 끝내고 온다.
GuildMember* pMember = g_GuildManager.FindGuildMemberByName( pRecvMsg->m_GuildGuid, pRecvMsg->m_szTargetCharName );
if( !pMember ) return;
MSG_DZ_GUILD_CREATE_CORPS_SYN synMSG;
synMSG.m_dwKey = pRecvMsg->m_dwKey;
synMSG.m_dwSessionIndex = pServerSession->GetSessionIndex();
synMSG.m_GuildGuid = pRecvMsg->m_GuildGuid;
synMSG.m_TargetCharGuid = pMember->GetCharGuid();
synMSG.m_byCorpsNum = byCorpsNum;
if( !GuildServer::GetMainFrame()->ConnectSessions.SendToDBProxy( &synMSG, sizeof(synMSG) ) )
{
MSG_GZ_GUILD_CREATE_CORPS_NAK nakMSG;
nakMSG.m_dwKey = pRecvMsg->m_dwKey;
nakMSG.m_byErrorCode = RC::RC_GUILD_CREATE_CORPS_FAILED;
pServerSession->SendPacket(&nakMSG, sizeof(nakMSG));
SUNLOG( eCRITICAL_LOG, "DZ_GUILD_CREATE_CORPS_SYN ERROR - Can't send Packet![GuildGuid:%u]\n", pRecvMsg->m_GuildGuid );
return;
}
}
Handler_FromGameServer_IMPL(GZ_GUILD_DESTROY_CORPS_SYN)
{
MSG_GZ_GUILD_DESTROY_CORPS_SYN* pRecvMsg = (MSG_GZ_GUILD_DESTROY_CORPS_SYN *)pMsg;
RC::eGUILD_RESULT rt = g_GuildManager.CanDestoryCorps( pRecvMsg->m_GuildGuid, pRecvMsg->m_OperCharGuid, pRecvMsg->m_byCorpsNum );
if( rt != RC::RC_GUILD_SUCCESS )
{
MSG_GZ_GUILD_DESTROY_CORPS_NAK nakMSG;
nakMSG.m_dwKey = pRecvMsg->m_dwKey;
nakMSG.m_byErrorCode = rt;
pServerSession->SendPacket(&nakMSG, sizeof(nakMSG));
SUNLOG( eFULL_LOG, "[GZ_GUILD_DESTROY_CORPS_SYN] ERROR, GuildGuid = %d, OperGuid = %u, CorpsNum = %d", pRecvMsg->m_GuildGuid, pRecvMsg->m_OperCharGuid, pRecvMsg->m_byCorpsNum );
return;
}
MSG_DZ_GUILD_DESTROY_CORPS_SYN synMsg;
synMsg.m_dwKey = pRecvMsg->m_dwKey;
synMsg.m_dwSessionIndex = pServerSession->GetSessionIndex();
synMsg.m_GuildGuid = pRecvMsg->m_GuildGuid;
synMsg.m_byCorpsNum = pRecvMsg->m_byCorpsNum;
synMsg.m_OperCharGuid = pRecvMsg->m_OperCharGuid;
if( !GuildServer::GetMainFrame()->ConnectSessions.SendToDBProxy( &synMsg, sizeof(synMsg) ) )
{
MSG_GZ_GUILD_DESTROY_CORPS_NAK nakMSG;
nakMSG.m_dwKey = pRecvMsg->m_dwKey;
nakMSG.m_byErrorCode = RC::RC_GUILD_FAILED_BY_NOT_CONNECT_SERVER;
pServerSession->SendPacket(&nakMSG, sizeof(nakMSG));
SUNLOG( eCRITICAL_LOG, "[MSG_GZ_GUILD_DESTROY_CORPS_SYN] ERROR - Can't send Packet![GuildGuid:%u]\n", pRecvMsg->m_GuildGuid );
return;
}
}
Handler_FromGameServer_IMPL(GZ_GUILD_EMPTY_COMMANDER_INFO_SYN)
{
MSG_GZ_GUILD_EMPTY_COMMANDER_INFO_SYN* pRecvMsg = (MSG_GZ_GUILD_EMPTY_COMMANDER_INFO_SYN*)pMsg;
//비어있는 군단정보를 보겠다는것은 결국 직책변경을 하겠다는 얘기다. 따라서 직책변경 권한을 본다.
BOOL bRight = g_GuildManager.CheckRight( pRecvMsg->m_GuildGuid, pRecvMsg->m_OperCharGuid, eGUILD_RIGHTS_CHANGE_DUTY );
if( !bRight )
{
MSG_GZ_GUILD_EMPTY_COMMANDER_INFO_NAK nakMSG;
nakMSG.m_dwKey = pRecvMsg->m_dwKey;
nakMSG.m_byErrorCode = RC::RC_GUILD_HAVE_NOT_RIGHT;
pServerSession->SendPacket(&nakMSG, sizeof(nakMSG));
return;
}
//권한이 있으면 현재 비어 있는 군단 정보를 가지고 온다.
MSG_GZ_GUILD_EMPTY_COMMANDER_INFO_ACK AckMsg;
AckMsg.m_dwKey = pRecvMsg->m_dwKey;
AckMsg.m_GuildGuid = pRecvMsg->m_GuildGuid;
AckMsg.m_byEmptyCommanderCount = g_GuildManager.GetEmptyCommanderInfo( pRecvMsg->m_GuildGuid, AckMsg.m_byCorpsNum );
pServerSession->SendPacket( &AckMsg, AckMsg.GetSize() );
}
Handler_FromGameServer_IMPL(GZ_GUILD_CHANGE_COMMANDER_SYN)
{
MSG_GZ_GUILD_CHANGE_COMMANDER_SYN* pRecvMsg = (MSG_GZ_GUILD_CHANGE_COMMANDER_SYN*)pMsg;
RC::eGUILD_RESULT rt = g_GuildManager.CanChangeCommander( pRecvMsg->m_GuildGuid, pRecvMsg->m_OperCharGuid, pRecvMsg->m_szTargetCharName, pRecvMsg->m_byCorpsNum );
if( rt != RC::RC_GUILD_SUCCESS )
{
MSG_GZ_GUILD_CHANGE_COMMANDER_NAK nakMSG;
nakMSG.m_dwKey = pRecvMsg->m_dwKey;
nakMSG.m_byErrorCode = rt;
pServerSession->SendPacket(&nakMSG, sizeof(nakMSG));
return;
}
GuildMember* pMember = g_GuildManager.FindGuildMemberByName( pRecvMsg->m_GuildGuid, pRecvMsg->m_szTargetCharName );
if( !pMember ) //위에서 검사했으므로 없을수 없다.
return;
MSG_DZ_GUILD_CHANGE_COMMANDER_SYN synMSG;
synMSG.m_dwKey = pRecvMsg->m_dwKey;
synMSG.m_dwSessionIndex = pServerSession->GetSessionIndex();
synMSG.m_GuildGuid = pRecvMsg->m_GuildGuid;
synMSG.m_TargetCharGuid = pMember->GetCharGuid();
synMSG.m_byCorpsNum = pRecvMsg->m_byCorpsNum;
if( !GuildServer::GetMainFrame()->ConnectSessions.SendToDBProxy( &synMSG, sizeof(synMSG) ) )
{
MSG_GZ_GUILD_CHANGE_COMMANDER_NAK nakMSG;
nakMSG.m_dwKey = pRecvMsg->m_dwKey;
nakMSG.m_byErrorCode = RC::RC_GUILD_FAILED_BY_NOT_CONNECT_SERVER;
pServerSession->SendPacket(&nakMSG, sizeof(nakMSG));
SUNLOG( eCRITICAL_LOG, "[Handler_FromGameServer_IMPL(GZ_GUILD_CHANGE_COMMANDER_SYN)] - Can't send Packet![GuildGuid:%u]\n", pRecvMsg->m_GuildGuid );
return;
}
}
Handler_FromGameServer_IMPL(GZ_GUILD_CHANGE_CORPS_SYN)
{
MSG_GZ_GUILD_CHANGE_CORPS_SYN* pRecvMsg = (MSG_GZ_GUILD_CHANGE_CORPS_SYN*)pMsg;
RC::eGUILD_RESULT rt = g_GuildManager.CanChangeCorps( pRecvMsg->m_GuildGuid, pRecvMsg->m_OperCharGuid, pRecvMsg->m_szTargetCharName, pRecvMsg->m_byCorpsNum );
if( rt != RC::RC_GUILD_SUCCESS )
{
MSG_GZ_GUILD_CHANGE_CORPS_NAK nakMSG;
nakMSG.m_dwKey = pRecvMsg->m_dwKey;
nakMSG.m_byErrorCode = rt;
pServerSession->SendPacket(&nakMSG, sizeof(nakMSG));
return;
}
GuildMember* pTargetMember = g_GuildManager.FindGuildMemberByName( pRecvMsg->m_GuildGuid, pRecvMsg->m_szTargetCharName );
if( !pTargetMember ) return;
MSG_DZ_GUILD_CHANGE_CORPS_SYN synMSG;
synMSG.m_dwKey = pRecvMsg->m_dwKey;
synMSG.m_dwSessionIndex = pServerSession->GetSessionIndex();
synMSG.m_GuildGuid = pRecvMsg->m_GuildGuid;
synMSG.m_bySourceCorpsNum = pTargetMember->GetCorpsNumber();
synMSG.m_byTargetCorpsNum = pRecvMsg->m_byCorpsNum;
synMSG.m_CharGuid = pTargetMember->GetCharGuid();
if( !GuildServer::GetMainFrame()->ConnectSessions.SendToDBProxy( &synMSG, sizeof(synMSG) ) )
{
MSG_GZ_GUILD_CHANGE_COMMANDER_NAK nakMSG;
nakMSG.m_dwKey = pRecvMsg->m_dwKey;
nakMSG.m_byErrorCode = RC::RC_GUILD_FAILED_BY_NOT_CONNECT_SERVER;
pServerSession->SendPacket(&nakMSG, sizeof(nakMSG));
SUNLOG( eCRITICAL_LOG, "[Handler_FromGameServer_IMPL(GZ_GUILD_CHANGE_COMMANDER_SYN)] - Can't send Packet![GuildGuid:%u]\n", pRecvMsg->m_GuildGuid );
return;
}
}
Handler_FromGameServer_IMPL(GZ_GUILD_CREATE_REAR_CAMP_SYN)
{
MSG_GZ_GUILD_CREATE_REAR_CAMP_SYN* pRecvMsg = (MSG_GZ_GUILD_CREATE_REAR_CAMP_SYN*)pMsg;
BYTE byCorpsNum = 0;
RC::eGUILD_RESULT rt = g_GuildManager.CanCreateRearCamp( pRecvMsg->m_GuildGuid, pRecvMsg->m_OperCharGuid, pRecvMsg->m_szTargetCharName, byCorpsNum );
if( rt != RC::RC_GUILD_SUCCESS )
{
MSG_GZ_GUILD_CREATE_REAR_CAMP_NAK nakMSG;
nakMSG.m_dwKey = pRecvMsg->m_dwKey;
nakMSG.m_byErrorCode = rt;
pServerSession->SendPacket(&nakMSG, sizeof(nakMSG));
return;
}
GuildMember* pTargetMember = g_GuildManager.FindGuildMemberByName( pRecvMsg->m_GuildGuid, pRecvMsg->m_szTargetCharName );
if( !pTargetMember ) return;
MSG_DZ_GUILD_CREATE_REAR_CAMP_SYN synMSG;
synMSG.m_dwKey = pRecvMsg->m_dwKey;
synMSG.m_dwSessionIndex = pServerSession->GetSessionIndex();
synMSG.m_GuildGuid = pRecvMsg->m_GuildGuid;
synMSG.m_TargetCharGuid = pTargetMember->GetCharGuid();
synMSG.m_byCorpsNum = byCorpsNum;
if( !GuildServer::GetMainFrame()->ConnectSessions.SendToDBProxy( &synMSG, sizeof(synMSG) ) )
{
MSG_GZ_GUILD_CREATE_REAR_CAMP_NAK nakMSG;
nakMSG.m_dwKey = pRecvMsg->m_dwKey;
nakMSG.m_byErrorCode = RC::RC_GUILD_FAILED_BY_NOT_CONNECT_SERVER;
pServerSession->SendPacket(&nakMSG, sizeof(nakMSG));
SUNLOG( eCRITICAL_LOG, "[Handler_FromGameServer_IMPL(GZ_GUILD_CREATE_REAR_CAMP_SYN)] - Can't send Packet![GuildGuid:%u]\n", pRecvMsg->m_GuildGuid );
return;
}
}
Handler_FromGameServer_IMPL(GZ_GUILD_DESTROY_REAR_CAMP_SYN)
{
MSG_GZ_GUILD_DESTROY_REAR_CAMP_SYN* pRecvMsg = (MSG_GZ_GUILD_DESTROY_REAR_CAMP_SYN *)pMsg;
RC::eGUILD_RESULT rt = g_GuildManager.CanDestroyRearCamp( pRecvMsg->m_GuildGuid, pRecvMsg->m_OperCharGuid, pRecvMsg->m_byCorpsNum );
if( rt != RC::RC_GUILD_SUCCESS )
{
MSG_GZ_GUILD_DESTROY_REAR_CAMP_NAK nakMSG;
nakMSG.m_dwKey = pRecvMsg->m_dwKey;
nakMSG.m_byErrorCode = rt;
pServerSession->SendPacket(&nakMSG, sizeof(nakMSG));
SUNLOG( eFULL_LOG, "[Handler_FromGameServer_IMPL(GZ_GUILD_DESTROY_REAR_CAMP_SYN)] ERROR, GuildGuid = %d, OperGuid = %u, CorpsNum = %d", pRecvMsg->m_GuildGuid, pRecvMsg->m_OperCharGuid, pRecvMsg->m_byCorpsNum );
return;
}
MSG_DZ_GUILD_DESTROY_REAR_CAMP_SYN synMsg;
synMsg.m_dwKey = pRecvMsg->m_dwKey;
synMsg.m_dwSessionIndex = pServerSession->GetSessionIndex();
synMsg.m_GuildGuid = pRecvMsg->m_GuildGuid;
synMsg.m_byCorpsNum = pRecvMsg->m_byCorpsNum;
synMsg.m_OperCharGuid = pRecvMsg->m_OperCharGuid;
if( !GuildServer::GetMainFrame()->ConnectSessions.SendToDBProxy( &synMsg, sizeof(synMsg) ) )
{
MSG_GZ_GUILD_DESTROY_REAR_CAMP_NAK nakMSG;
nakMSG.m_dwKey = pRecvMsg->m_dwKey;
nakMSG.m_byErrorCode = RC::RC_GUILD_FAILED_BY_NOT_CONNECT_SERVER;
pServerSession->SendPacket(&nakMSG, sizeof(nakMSG));
SUNLOG( eCRITICAL_LOG, "[Handler_FromGameServer_IMPL(GZ_GUILD_DESTROY_REAR_CAMP_SYN)] ERROR - Can't send Packet![GuildGuid:%u]\n", pRecvMsg->m_GuildGuid );
return;
}
}
//길드 초대.
Handler_FromGameServer_IMPL(GZ_GUILD_INVITE_SYN)
{
MSG_GZ_GUILD_INVITE_SYN* pRecvMsg = (MSG_GZ_GUILD_INVITE_SYN*)pMsg;
//Invite나 Join이나 조건은 똑같다.
RC::eGUILD_RESULT rt = g_GuildManager.CanInviteGuild( pRecvMsg->m_GuildGuid, pRecvMsg->m_OperCharGuid, pRecvMsg->m_TargetCharGuid, pRecvMsg->m_Level );
if( rt != RC::RC_GUILD_SUCCESS )
{
MSG_GZ_GUILD_INVITE_NAK nakMSG;
nakMSG.m_dwKey = pRecvMsg->m_dwKey;
nakMSG.m_byErrorCode = rt;
pServerSession->SendPacket(&nakMSG, sizeof(nakMSG));
SUNLOG( eFULL_LOG, "[Handler_FromGameServer_IMPL(GZ_GUILD_INVITE_SYN)] ERROR, GuildGuid = %d, OperGuid = %u, TargetGuid = %u, rt = %d",
pRecvMsg->m_GuildGuid, pRecvMsg->m_OperCharGuid, pRecvMsg->m_TargetCharGuid, rt );
return;
}
MSG_GZ_GUILD_INVITE_ACK ackMsg;
ackMsg.m_dwKey = pRecvMsg->m_dwKey;
ackMsg.m_TargetUserKey = pRecvMsg->m_TargetUserKey;
pServerSession->SendPacket(&ackMsg, sizeof(ackMsg));
}
//길드 멤버 로그인
Handler_FromGameServer_IMPL(GZ_GUILD_LOGIN_CHAR_SYN)
{
MSG_GZ_GUILD_LOGIN_CHAR_SYN* pRecvMsg = (MSG_GZ_GUILD_LOGIN_CHAR_SYN*)pMsg;
//Invite나 Join이나 조건은 똑같다.
RC::eGUILD_RESULT rt = g_GuildManager.CanLogin( pRecvMsg->m_GuildGuid, pRecvMsg->m_CharGuid );
if( rt == RC::RC_GUILD_NOT_EXIST_GUILD )
{
// 현재 길드서버에 길드가 존재 하지 않으면.. DB에 길드 정보를 요청한다.
MSG_DZ_GUILD_SELECT_SYN synMsg;
synMsg.m_dwKey = pRecvMsg->m_dwKey;
synMsg.m_dwSessionIndex = 0; // (WAVERIX) (090903) (CHANGES) ...-.-;...
synMsg.m_GuildGuid = pRecvMsg->m_GuildGuid;
synMsg.m_bySelectType = 1; //1은 로그인시 SELECT를 뜻한다.
synMsg.m_LoginCharGuid = pRecvMsg->m_CharGuid;
if( !GuildServer::GetMainFrame()->ConnectSessions.SendToDBProxy( &synMsg, sizeof(synMsg) ) )
{
MSG_GZ_GUILD_LOGIN_CHAR_NAK nakMsg;
nakMsg.m_byErrorCode = RC::RC_GUILD_FAILED_BY_NOT_CONNECT_SERVER;
pServerSession->SendPacket( &nakMsg, sizeof(nakMsg) );
return;
}
// CHANGES: f110627.2L, fixed the invalid acknowledgement answer
// that this status is pended.
return;
}
else if( rt == RC::RC_GUILD_SUCCESS )
{
GuildServer* pGuildServer = GuildServer::GetMainFrame();
// 길드 정보가 존재하고, 멤버가 길드 멤버이다. 리턴값 체크 하지 않고 바로 로그인 시킨다.
g_GuildManager.Login( pRecvMsg->m_GuildGuid, pRecvMsg->m_CharGuid );
MSG_GZ_GUILD_LOGIN_CHAR_BRD brdMsg;
brdMsg.m_dwKey = pRecvMsg->m_dwKey;
g_GuildManager.SerializeGuildInfo( pRecvMsg->m_GuildGuid, brdMsg.m_GuildInfo, SERIALIZE_LOAD );
g_GuildManager.SerializeCorpsInfo( pRecvMsg->m_GuildGuid, brdMsg.m_CorpsTotalInfo, SERIALIZE_LOAD );
g_GuildManager.GetGuildMemberInfo( pRecvMsg->m_GuildGuid, pRecvMsg->m_CharGuid, brdMsg.m_MemberInfo );
pGuildServer->SendToAllGameServers( &brdMsg, sizeof(brdMsg) );
MSG_WZ_GUILD_LOGIN_CHAR_CMD cmdMsg;
g_GuildManager.GetWorldGuildInfo( pRecvMsg->m_GuildGuid, cmdMsg.m_WorldGuildInfo );
g_GuildManager.GetGuildBaseMemberInfo( pRecvMsg->m_GuildGuid, pRecvMsg->m_CharGuid, cmdMsg.m_BaseMemberInfo );
pGuildServer->ConnectSessions.SendToWorld( &cmdMsg, sizeof(cmdMsg) );
return;
}
else if( rt == RC::RC_GUILD_ALREADY_LOGIN_MEMBER )
return;
//나머지 케이스는 실패 케이스다.
MSG_GZ_GUILD_LOGIN_CHAR_NAK nakMsg;
nakMsg.m_dwKey = pRecvMsg->m_dwKey; // (WAVERIX) (090903) (BUG-FIX) ...-.-+...
nakMsg.m_byErrorCode = rt;
pServerSession->SendPacket( &nakMsg, sizeof(nakMsg) );
}
//길드 멤버 로그아웃
Handler_FromGameServer_IMPL(GZ_GUILD_LOGOUT_CHAR_SYN)
{
MSG_GZ_GUILD_LOGOUT_CHAR_SYN* pRecvMsg = (MSG_GZ_GUILD_LOGOUT_CHAR_SYN*)pMsg;
GuildServer* pGuildServer = GuildServer::GetMainFrame();
if( !pGuildServer ) return;
//1. 길드서버의 해당 유저의 정보를 로그아웃으로 변경한다.
RC::eGUILD_RESULT rc = g_GuildManager.Logout( pRecvMsg->m_GuildGuid, pRecvMsg->m_CharGuid );
// 길드서버가 캐릭터 접속이후 뜨게 되면, 길드서버에는 현재 캐릭터에 대한 길드 정보가 없다.( 같은 길드원이 접속하지 않는 이상... )
// 따라서 게임서버에서는 길드GUID가 있어서 로그아웃 패킷을 보내고, 길드 서버에서는 해당 길드가 없다고 할 것이다.
if( rc == RC::RC_GUILD_NOT_EXIST_GUILD )
return;
if( rc != RC::RC_GUILD_SUCCESS )
{
SUNLOG( eCRITICAL_LOG, "Handler_FromGameServer_IMPL(GZ_GUILD_LOGOUT_CHAR_SYN) Fail, GuildGuid = %u, CharGuid = %u, rc = %d",
pRecvMsg->m_GuildGuid, pRecvMsg->m_CharGuid, rc );
return;
}
//2. 게임서버로 보낸다.
MSG_GZ_GUILD_LOGOUT_CHAR_BRD brdMsg;
brdMsg.m_GuildGuid = pRecvMsg->m_GuildGuid;
brdMsg.m_CharGuid = pRecvMsg->m_CharGuid;
g_GuildManager.GetCharName( pRecvMsg->m_GuildGuid, pRecvMsg->m_CharGuid, brdMsg.m_szCharName, MAX_CHARNAME_LENGTH );
pGuildServer->SendToAllGameServers( &brdMsg, sizeof(brdMsg) );
//3. 월드서버로 보낸다.
MSG_WZ_GUILD_LOGOUT_CHAR_CMD cmdMsg;
cmdMsg.m_GuildGuid = pRecvMsg->m_GuildGuid;
cmdMsg.m_CharGuid = pRecvMsg->m_CharGuid;
pGuildServer->ConnectSessions.SendToWorld( &cmdMsg, sizeof(cmdMsg) );
}
//길드 멤버 레벨업
Handler_FromGameServer_IMPL(GZ_GUILD_CHAR_LEVELUP_SYN)
{
MSG_GZ_GUILD_CHAR_LEVELUP_SYN* pRecvMsg = (MSG_GZ_GUILD_CHAR_LEVELUP_SYN*)pMsg;
RC::eGUILD_RESULT rt = g_GuildManager.LevelUpMember( pRecvMsg->m_GuildGuid, pRecvMsg->m_CharGuid, pRecvMsg->m_Level );
// 결과가 레벨업에 의한 길드 탈퇴이면..
if( rt == RC::RC_GUILD_KICK_GUILD_BY_LEVELUP )
{
RC::eGUILD_RESULT rt = g_GuildManager.CanLeaveGuild( pRecvMsg->m_GuildGuid, pRecvMsg->m_CharGuid );
if( rt != RC::RC_GUILD_SUCCESS )
{
MSG_GZ_GUILD_WITHDRAW_NAK msgNAK;
msgNAK.m_dwKey = pRecvMsg->m_dwKey;
msgNAK.m_byErrorCode = rt;
pServerSession->SendPacket( &msgNAK, sizeof(msgNAK) );
return;
}
MSG_DZ_GUILD_WITHDRAW_SYN msgSYN;
msgSYN.m_dwKey = pRecvMsg->m_dwKey;
msgSYN.m_dwSessionIndex = pServerSession->GetSessionIndex();
msgSYN.m_GuildGuid = pRecvMsg->m_GuildGuid;
msgSYN.m_CharGuid = pRecvMsg->m_CharGuid;
msgSYN.m_byPenaltyType = 3; // 레벨업에 의한 탈퇴.
if( !GuildServer::GetMainFrame()->ConnectSessions.SendToDBProxy( &msgSYN, sizeof(msgSYN) ) )
{
MSG_GZ_GUILD_WITHDRAW_NAK msgNAK;
msgNAK.m_dwKey = pRecvMsg->m_dwKey;
msgNAK.m_byErrorCode = RC::RC_GUILD_FAILED_BY_NOT_CONNECT_SERVER;
pServerSession->SendPacket( &msgNAK, sizeof(msgNAK) );
}
return;
}
if( rt != RC::RC_GUILD_SUCCESS )
{
SUNLOG( eCRITICAL_LOG, "[Handler_FromGameServer_IMPL(GZ_GUILD_CHAR_LEVELUP_SYN)] Fail, GuildGuid = %u, CharGuid = %u, Level = %u, rt = %d",
pRecvMsg->m_GuildGuid, pRecvMsg->m_CharGuid, pRecvMsg->m_Level, rt );
return;
}
MSG_GZ_GUILD_CHAR_LEVELUP_BRD brdMsg;
brdMsg.m_GuildGuid = pRecvMsg->m_GuildGuid;
g_GuildManager.GetCharName( pRecvMsg->m_GuildGuid, pRecvMsg->m_CharGuid, brdMsg.m_szCharName, MAX_CHARNAME_LENGTH );
brdMsg.m_Level = pRecvMsg->m_Level;
pServerSession->SendPacket( &brdMsg, sizeof(brdMsg) );
}
Handler_FromGameServer_IMPL( GZ_GUILD_TOTALINFO_REQ_SYN )
{
MSG_GZ_GUILD_TOTALINFO_REQ_SYN* pRecvMsg = (MSG_GZ_GUILD_TOTALINFO_REQ_SYN*)pMsg;
RC::eGUILD_RESULT rt = g_GuildManager.CanRequestTotalInfo( pRecvMsg->m_GuildGuid, pRecvMsg->m_CharGuid );
if( rt != RC::RC_GUILD_SUCCESS )
{
MSG_GZ_GUILD_TOTALINFO_REQ_NAK msgNAK;
msgNAK.m_dwKey = pRecvMsg->m_dwKey;
msgNAK.m_byErrorCode = rt;
pServerSession->SendPacket( &msgNAK, sizeof(msgNAK) );
return;
}
MSG_GZ_GUILD_TOTALINFO_REQ_ACK ackMsg;
ackMsg.m_dwKey = pRecvMsg->m_dwKey;
g_GuildManager.SerializeGuildInfo( pRecvMsg->m_GuildGuid, ackMsg.m_GuildInfo, SERIALIZE_LOAD );
g_GuildManager.SerializeCorpsInfo( pRecvMsg->m_GuildGuid, ackMsg.m_CropsTotalInfo, SERIALIZE_LOAD );
g_GuildManager.SerializeMemberTotalInfo( pRecvMsg->m_GuildGuid, ackMsg.m_MemberTotalInfo, SERIALIZE_LOAD );
pServerSession->SendPacket( &ackMsg, ackMsg.GetSize() );
}
//GM명령어 길드포인트 세팅
Handler_FromGameServer_IMPL(GZ_GUILD_GM_GUILD_POINT_SYN )
{
MSG_GZ_GUILD_GM_GUILD_POINT_SYN* pRecvMsg = (MSG_GZ_GUILD_GM_GUILD_POINT_SYN*)pMsg;
Guild* pGuild = g_GuildManager.FindGuild( pRecvMsg->m_GuildGuid );
if( !pGuild )
{
//만일 길드 서버에 정보가 없으면, 이상한 유저이거나 Agent서버로 로그인 하지 않은 유저이다.
MSG_GZ_GUILD_GM_GUILD_POINT_NAK nakMsg;
nakMsg.m_dwKey = pRecvMsg->m_dwKey;
nakMsg.m_byErrorCode = RC::RC_GUILD_NOT_EXIST_GUILD;
pServerSession->SendPacket( &nakMsg, sizeof(nakMsg) );
return;
}
GuildMember* pMember = pGuild->FindMember( pRecvMsg->m_CharGuid );
if( !pMember )
{
MSG_GZ_GUILD_GM_GUILD_POINT_NAK nakMsg;
nakMsg.m_dwKey = pRecvMsg->m_dwKey;
nakMsg.m_byErrorCode = RC::RC_GUILD_NOT_GUILD_MEMBER;
pServerSession->SendPacket( &nakMsg, sizeof(nakMsg) );
return;
}
MSG_DZ_GUILD_GM_GUILD_POINT_SYN synMsg;
synMsg.m_dwKey = pRecvMsg->m_dwKey;
synMsg.m_dwSessionIndex = pServerSession->GetSessionIndex();
synMsg.m_GuildGuid = pRecvMsg->m_GuildGuid;
synMsg.m_UP = pRecvMsg->m_UP;
synMsg.m_GP = pRecvMsg->m_GP;
if( !GuildServer::GetMainFrame()->ConnectSessions.SendToDBProxy( &synMsg, sizeof(synMsg) ) )
{
MSG_GZ_GUILD_GM_GUILD_POINT_NAK nakMsg;
nakMsg.m_dwKey = pRecvMsg->m_dwKey;
nakMsg.m_byErrorCode = RC::RC_GUILD_FAILED_BY_NOT_CONNECT_SERVER;
pServerSession->SendPacket( &nakMsg, sizeof(nakMsg) );
return;
}
}
Handler_FromGameServer_IMPL(GZ_GUILD_RELATION_INFO_SYN)
{
MSG_GZ_GUILD_RELATION_INFO_SYN* pRecvMsg = (MSG_GZ_GUILD_RELATION_INFO_SYN*)pMsg;
MSG_DZ_GUILD_RELATION_INFO_SYN msg;
msg.m_dwKey = pMsg->m_dwKey;
msg.m_dwSessionIndex = pServerSession->GetSessionIndex(); // (WAVERIX) (090903) (BUG-FIX) ...-.-;...
msg.m_GuildGuid = pRecvMsg->m_GuildGuid;
if(!GuildServer::GetMainFrame()->ConnectSessions.SendToDBProxy( &msg, sizeof(msg)))
{
//MSG_GZ_GUILD_ADD_INFO_NAK nakMsg;
//nakMsg.m_dwKey = pRecvMsg->m_dwKey;
//strncpy( nakMsg.m_szTargetCharName, pRecvMsg->m_tszCharName, MAX_CHARNAME_LENGTH );
//nakMsg.m_byErrorCode = RC::RC_GUILD_FAILED_BY_NOT_CONNECT_SERVER;
//pServerSession->SendPacket( &nakMsg, sizeof(nakMsg) );
return;
}
//MSG_GZ_GUILD_RELATION_INFO_BRD SendToGameServer;
//SendToGameServer.m_dwKey = pRecvMsg->m_dwKey;
//SendToGameServer.m_AddInfo.m_GuildGuid = pRecvMsg->m_GuildGuid;
//LoadRelationInfo(&SendToGameServer.m_AddInfo);
//SendToGameServer.m_byRelCnt = SendToGameServer.m_AddInfo.m_byRelationGuildCnt;
//pServerSession->SendPacket( &SendToGameServer, SendToGameServer.GetSize());
}
Handler_FromGameServer_IMPL(GZ_GUILD_JOIN_SYN)
{
MSG_GZ_GUILD_JOIN_SYN * pRecvMsg = (MSG_GZ_GUILD_JOIN_SYN *)pMsg;
eGUILD_DUTY Duty = eGUILD_DUTY_NONE;
BYTE byCorpsNum = 0;
RC::eGUILD_RESULT rt = g_GuildManager.CanJoinGuild( pRecvMsg->m_GuildGuid, pRecvMsg->m_OperCharGuid, pRecvMsg->m_TargetCharGuid, pRecvMsg->m_Level, Duty, byCorpsNum );
if( rt != RC::RC_GUILD_SUCCESS )
{
MSG_GZ_GUILD_JOIN_NAK nakMsg;
nakMsg.m_dwKey = pRecvMsg->m_dwKey;
strncpy(nakMsg.m_szTargetCharName, pRecvMsg->m_tszCharName,
_countof(nakMsg.m_szTargetCharName));
nakMsg.m_szTargetCharName[_countof(nakMsg.m_szTargetCharName) - 1] = '\0';
strncpy( nakMsg.m_szTargetCharName, pRecvMsg->m_tszCharName, MAX_CHARNAME_LENGTH );
nakMsg.m_byErrorCode = rt;
pServerSession->SendPacket( &nakMsg, sizeof(nakMsg) );
return;
}
MSG_DZ_GUILD_JOIN_SYN msg;
msg.m_dwKey = pRecvMsg->m_dwKey;
msg.m_dwSessionIndex = pServerSession->GetSessionIndex(); //게임서버의 세션을 저장한다.
msg.m_GuildGuid = pRecvMsg->m_GuildGuid;
msg.m_OperCharGuid = pRecvMsg->m_OperCharGuid;
msg.m_TargetCharGuid = pRecvMsg->m_TargetCharGuid;
strncpy(msg.m_tszCharName, pRecvMsg->m_tszCharName, _countof(msg.m_tszCharName));
msg.m_tszCharName[_countof(msg.m_tszCharName) - 1] = '\0';
msg.m_byClass = pRecvMsg->m_byClass;
msg.m_Level = pRecvMsg->m_Level;
msg.m_Duty = Duty;
msg.m_byCorpsNum = byCorpsNum;
if( !GuildServer::GetMainFrame()->ConnectSessions.SendToDBProxy( &msg, sizeof(msg) ) )
{
MSG_GZ_GUILD_JOIN_NAK nakMsg;
nakMsg.m_dwKey = pRecvMsg->m_dwKey;
strncpy(nakMsg.m_szTargetCharName, pRecvMsg->m_tszCharName,
_countof(nakMsg.m_szTargetCharName));
nakMsg.m_szTargetCharName[_countof(nakMsg.m_szTargetCharName) - 1] = '\0';
nakMsg.m_byErrorCode = RC::RC_GUILD_FAILED_BY_NOT_CONNECT_SERVER;
pServerSession->SendPacket( &nakMsg, sizeof(nakMsg) );
return;
}
}
Handler_FromGameServer_IMPL(GZ_GUILD_RELATION_ALLIENCE_SYN)
{
PACKET_PTR_CONVERT(MSG_GZ_GUILD_RELATION_ALLIENCE_SYN, pRecvMsg, pMsg);
CHARGUID RightMemberIndex = 0;
GUILDGUID response_guild_index = 0;
RC::eGUILD_RESULT result = GuildSmallContentsEntry::RelationSystem::CanDoRelationChange(
pRecvMsg->m_GuildGuid, pRecvMsg->m_RequestPlayerIndex);
if(result == RC::RC_GUILD_SUCCESS)
{
response_guild_index = g_GuildManager.GetGuildGuidByGuildName(pRecvMsg->m_tszRelationGuildName);
if(0 != response_guild_index)
{
// (lst1024)(090402) 길드 삭제 대기 상태면 동맹 신청 할 수 없다.
Guild* pGuild = g_GuildManager.FindGuild(response_guild_index);
if( !pGuild )
result = RC::RC_GUILD_NOT_EXIST_GUILD;
else
{
if(eGUILD_DELCHK_DESTROY_WAIT == pGuild->CheckGuildDeleteState())
result = RC::RC_GUILD_DELCHK_DESTROY_WAIT;
else
{
// 요청 받은 길드에서 권한을 가진 길드 멤버 찾기
RightMemberIndex = g_GuildManager.GetGuildMasterByGuildName(pRecvMsg->m_tszRelationGuildName);
if(0 == RightMemberIndex) //길드 마스터가 없을 경우
{
result = RC::RC_GUILD_CURRENT_NONE_MASTER;
// 서브 마스터 권한 조사
RightMemberIndex = g_GuildManager.FindRightMember(response_guild_index, eGUILD_DUTY_SUBMASTER);
if(0 != RightMemberIndex)
{
result = GuildSmallContentsEntry::RelationSystem::CanDoRelationChange(
response_guild_index, RightMemberIndex);
if(result !=RC::RC_GUILD_SUCCESS)
{
// 군사 권한 조사
RightMemberIndex = g_GuildManager.FindRightMember(response_guild_index, eGUILD_DUTY_STRATEGIST);
if(0 != RightMemberIndex)
{
result = GuildSmallContentsEntry::RelationSystem::CanDoRelationChange(
response_guild_index, RightMemberIndex);
}
}
}
}
}
}
}
else
{
result = RC::RC_GUILD_CURRENT_NONE_MASTER;
}
}
//. 권한을 가진 멤버가 있으면~
if(RC::RC_GUILD_SUCCESS == result)
{
result = GuildSmallContentsEntry::RelationSystem::CanDoRelationShip(
pRecvMsg->m_GuildGuid, response_guild_index, eGUILD_RELATION_ALLIENCE);
if(RC::RC_GUILD_SUCCESS == result)
{
MSG_GZ_GUILD_RELATION_ALLIENCE_ACK msg;
msg.m_dwKey = pRecvMsg->m_dwKey;
msg.m_eRelationType = pRecvMsg->m_eRelationType;
msg.m_RequestGuildGuid = pRecvMsg->m_GuildGuid;
msg.m_ResponseGuildGuid = response_guild_index;
msg.m_ResponsePlayerIndex = RightMemberIndex;
msg.m_RequestPlayerIndex = pRecvMsg->m_RequestPlayerIndex;
pServerSession->SendPacket(&msg, sizeof(msg));
return;
}
}
MSG_GZ_GUILD_RELATION_NAK msg;
msg.m_dwKey = pRecvMsg->m_dwKey;
msg.m_byErrorCode = result;
pServerSession->SendPacket(&msg, sizeof(msg));
return;
}
Handler_FromGameServer_IMPL(GZ_GUILD_RELATION_SYN)
{
PACKET_PTR_CONVERT(MSG_GZ_GUILD_RELATION_SYN, pRecvMsg, pMsg);
//요청자의 권한 조사.
// (lst1024)(090408) 길드 권한 체크시 케릭터GUID 사용
if( !g_GuildManager.CheckRight( pRecvMsg->m_RequestGuildGuid, pRecvMsg->m_RequestCharGuid, eGUILD_RIGHTS_RELATION ) )
{
MSG_GZ_GUILD_RELATION_NAK msg;
msg.m_dwKey = pRecvMsg->m_dwKey;
msg.m_byErrorCode = RC::RC_GUILD_HAVE_NOT_RIGHT;;
pServerSession->SendPacket(&msg, sizeof(msg));
return;
}
Guild* pResponseGuild = NULL;
if(pRecvMsg->m_ResponseGuildGuid)
{
pResponseGuild = g_GuildManager.FindGuild(pRecvMsg->m_ResponseGuildGuid);
}
else
{
pResponseGuild = g_GuildManager.FindGuildName(pRecvMsg->m_tszRelationGuildName);
}
RC::eGUILD_RESULT result = RC::RC_GUILD_SUCCESS;
if(pResponseGuild)
{
GUILDGUID request_guild_index = pRecvMsg->m_RequestGuildGuid;
GUILDGUID response_guild_index = pResponseGuild->GetGuildGuid();
result = GuildSmallContentsEntry::RelationSystem::CanDoRelationShip(
request_guild_index, response_guild_index, pRecvMsg->m_eRelationType);
if(RC::RC_GUILD_SUCCESS == result)
{
MSG_DZ_GUILD_RELATION_SYN msg;
msg.m_dwKey = pRecvMsg->m_dwKey; /* AnswerPlayer 유저 키 */
msg.m_eRelationType = pRecvMsg->m_eRelationType;
msg.m_RequestGuildGuid = pRecvMsg->m_RequestGuildGuid;
msg.m_RequestUserKey = pRecvMsg->m_RequestUserKey; /* RequestPlayer 유저 키 */
msg.m_ResponseGuildGuid = pRecvMsg->m_ResponseGuildGuid;
msg.m_dwSessionIndex = pServerSession->GetSessionIndex();
util::GUILDNAMECOPY(msg.m_ResponseGuildName, pRecvMsg->m_tszRelationGuildName);
if(GuildServer::GetMainFrame()->ConnectSessions.SendToDBProxy(&msg, sizeof(msg)))
return;
result = RC::RC_GUILD_DISCONNECTED_GUILD_SERVER;
}
}
if(!pResponseGuild && eGUILD_RELATION_ALLIENCE != pRecvMsg->m_eRelationType)
{
MSG_DZ_GUILD_RELATION_SYN msg;
msg.m_dwKey = pRecvMsg->m_dwKey; /* AnswerPlayer 유저 키 */
msg.m_eRelationType = pRecvMsg->m_eRelationType;
msg.m_RequestGuildGuid = pRecvMsg->m_RequestGuildGuid;
msg.m_RequestUserKey = pRecvMsg->m_RequestUserKey; /* RequestPlayer 유저 키 */
msg.m_ResponseGuildGuid = pRecvMsg->m_ResponseGuildGuid;
msg.m_dwSessionIndex = pServerSession->GetSessionIndex();
util::GUILDNAMECOPY(msg.m_ResponseGuildName, pRecvMsg->m_tszRelationGuildName);
if(GuildServer::GetMainFrame()->ConnectSessions.SendToDBProxy(&msg, sizeof(msg)))
return;
result = RC::RC_GUILD_DISCONNECTED_GUILD_SERVER;
}
MSG_GZ_GUILD_RELATION_NAK msg;
msg.m_dwKey = pRecvMsg->m_dwKey;
msg.m_byErrorCode = result;
pServerSession->SendPacket(&msg, sizeof(msg));
}
Handler_FromGameServer_IMPL(GZ_GUILD_RELATION_BOTH_AGAINST_SYN)
{
PACKET_PTR_CONVERT(MSG_GZ_GUILD_RELATION_BOTH_AGAINST_SYN, pRecvMsg, pMsg);
GuildServer* pGuildServer = GuildServer::GetMainFrame();
if(!pGuildServer) return;
GUILDGUID requestGuildGuid = pRecvMsg->m_GuildGuid;
GUILDGUID responseGuildGuid = pRecvMsg->m_RelGuildGuid;
CHARGUID requestPlayerGuid = pRecvMsg->m_MasterCharGuid;
RC::eGUILD_RESULT result = GuildSmallContentsEntry::RelationSystem::CanDoRelationChange(
requestGuildGuid, requestPlayerGuid);
if(result != RC::RC_GUILD_SUCCESS)
{
MSG_GZ_GUILD_RELATION_BOTH_AGAINST_NAK msg;
msg.m_dwKey = pRecvMsg->m_dwKey;
msg.m_byErrorCode = result;
pServerSession->SendPacket(&msg, sizeof(msg));
return;
}
result = GuildSmallContentsEntry::RelationSystem::CanDoRelationBothHostility(
requestGuildGuid, requestPlayerGuid);
MSG_DZ_GUILD_RELATION_BOTH_AGAINST_SYN msg;
msg.m_dwKey = pRecvMsg->m_dwKey;
msg.m_GuildGuid = requestGuildGuid;
msg.m_RelGuildGuid = responseGuildGuid;
msg.m_MasterCharGuid = requestPlayerGuid;
msg.m_dwSessionIndex = pServerSession->GetSessionIndex();
if(!GuildServer::GetMainFrame()->ConnectSessions.SendToDBProxy(&msg, sizeof(msg)))
{
MSG_GZ_GUILD_RELATION_BOTH_AGAINST_NAK msg;
msg.m_dwKey = pRecvMsg->m_dwKey;
msg.m_byErrorCode = RC::RC_GUILD_DISCONNECTED_GUILD_SERVER;
pServerSession->SendPacket(&msg, sizeof(msg));
return;
}
}
Handler_FromGameServer_IMPL(GZ_GUILD_RELATION_DELETE_SYN)
{
PACKET_PTR_CONVERT(MSG_GZ_GUILD_RELATION_DELETE_SYN, pRecvMsg, pMsg);
GuildServer* pGuildServer = GuildServer::GetMainFrame();
if(!pGuildServer) return;
eGUILD_RELATION eType = pRecvMsg->m_eType;
GUILDGUID requestGuildGuid = pRecvMsg->m_GuildGuid;
GUILDGUID responseGuildGuid = pRecvMsg->m_RelGuildGuid;
CHARGUID requestPlayerGuid = pRecvMsg->m_RequestPlayerIndex;
RC::eGUILD_RESULT result = GuildSmallContentsEntry::RelationSystem::CanDoRelationChange(
requestGuildGuid, requestPlayerGuid);
if(result != RC::RC_GUILD_SUCCESS)
{
MSG_GZ_GUILD_RELATION_DELETE_NAK msg;
msg.m_dwKey = pRecvMsg->m_dwKey;
msg.m_byErrorCode = result;
pServerSession->SendPacket(&msg, sizeof(msg));
return;
}
result = GuildSmallContentsEntry::RelationSystem::CanDoRelationDelete(
requestGuildGuid, responseGuildGuid, pRecvMsg->m_eType);
if(RC::RC_GUILD_SUCCESS == result)
{
MSG_DZ_GUILD_RELATION_DELETE_SYN msg;
msg.m_dwKey = pRecvMsg->m_dwKey;
msg.m_eType = eType;
msg.m_GuildGuid = requestGuildGuid;
msg.m_RelGuildGuid = responseGuildGuid;
msg.m_dwSessionIndex = pServerSession->GetSessionIndex();
if(pGuildServer->ConnectSessions.SendToDBProxy(&msg, sizeof(msg)))
return;
result = RC::RC_GUILD_FAILED_BY_NOT_CONNECT_SERVER;
}
MSG_GZ_GUILD_RELATION_DELETE_NAK msg;
msg.m_dwKey = pRecvMsg->m_dwKey;
msg.m_byErrorCode = result;
pServerSession->SendPacket(&msg, sizeof(msg));
}
Handler_FromGameServer_IMPL(GZ_GUILD_RECOVERY_GUILD_SYN)
{
MSG_GZ_GUILD_RECOVERY_GUILD_SYN* pRecvMsg =
static_cast<MSG_GZ_GUILD_RECOVERY_GUILD_SYN*>(pMsg);
RC::eGUILD_RESULT result =
GuildSmallContentsEntry::GuildPenalty::CanRecoveryGuild(pRecvMsg->m_GuildGuid);
if(RC::RC_GUILD_SUCCESS == result)
{
MSG_DZ_GUILD_RECOVERY_GUILD_SYN msg;
msg.m_dwKey = pRecvMsg->m_dwKey;
msg.m_dwSessionIndex = pServerSession->GetSessionIndex(); // (WAVERIX) (090903) (CHANGES) ...-.-;...
msg.m_CharGuid = pRecvMsg->m_CharGuid;
msg.m_GuildGuid = pRecvMsg->m_GuildGuid;
if(GuildServer::GetMainFrame()->ConnectSessions.SendToDBProxy(&msg, sizeof(msg)))
return;
result = RC::RC_GUILD_RECOVERY_FAILED;
}
MSG_GZ_GUILD_RECOVERY_GUILD_NAK msg;
msg.m_dwKey = pRecvMsg->m_dwKey;
msg.m_CharGuid = pRecvMsg->m_CharGuid;
msg.m_byErrorCode = result;
pServerSession->SendPacket(&msg, sizeof(msg));
}
Handler_FromGameServer_IMPL(GZ_GUILD_GUILDMARK_REGISTER_SYN)
{
MSG_GZ_GUILD_GUILDMARK_REGISTER_SYN* pRecvMsg =
static_cast<MSG_GZ_GUILD_GUILDMARK_REGISTER_SYN*>(pMsg);
GuildSmallContentsEntry::GuildMark::GuildMarkInfo tempInfo;
tempInfo.guild_Index = pRecvMsg->m_GuildIndex;
tempInfo.pattern_index = pRecvMsg->m_PatternIndex;
tempInfo.background_index = pRecvMsg->m_BackGroundIndex;
tempInfo.request_player_index = pRecvMsg->m_RequestPlayerIndex;
RC::eGUILD_RESULT result = GuildSmallContentsEntry::GuildMark::CanModify(tempInfo);
if(RC::RC_GUILD_SUCCESS != result)
{
DWORD userKey = pRecvMsg->m_dwKey;
GuildSmallContentsEntry::GuildMark::ResultCastToGameServer(pServerSession, result, userKey);
return;
}
MSG_DZ_GUILD_GUILDMARK_REGISTER_SYN msg;
msg.m_dwKey = pRecvMsg->m_dwKey;
msg.m_dwSessionIndex = pServerSession->GetSessionIndex(); // (WAVERIX) (090903) (BUG-FIX) ...-.-;...
msg.m_GuildIndex = tempInfo.guild_Index;
msg.m_PatternIndex = tempInfo.pattern_index;
msg.m_BackGroundIndex = tempInfo.background_index;
msg.m_RequestPlayerIndex = tempInfo.request_player_index;
msg.m_SlotIdx = pRecvMsg->m_SlotIdx;
msg.m_SlotPos = pRecvMsg->m_SlotPos;
if(!GuildServer::GetMainFrame()->ConnectSessions.SendToDBProxy(&msg, sizeof(msg)))
MessageOut(eDEV_LOG, "RegisterCastToDBProxy Error");
}
Handler_FromGameServer_IMPL(GZ_GUILD_GUILDMARK_DELETE_SYN)
{
MSG_GZ_GUILD_GUILDMARK_DELETE_SYN* pRecvMsg =
static_cast<MSG_GZ_GUILD_GUILDMARK_DELETE_SYN*>(pMsg);
GuildSmallContentsEntry::GuildMark::GuildMarkInfo tempInfo;
tempInfo.guild_Index = pRecvMsg->m_GuildIndex;
tempInfo.pattern_index = pRecvMsg->m_PatternIndex;
tempInfo.background_index = pRecvMsg->m_BackGroundIndex;
tempInfo.request_player_index = pRecvMsg->m_RequestPlayerIndex;
RC::eGUILD_RESULT result = GuildSmallContentsEntry::GuildMark::CanModify(tempInfo);
if(RC::RC_GUILD_SUCCESS != result)
{
GuildSmallContentsEntry::GuildMark::ResultCastToGameServer(
pServerSession, result, pRecvMsg->m_dwKey);
return;
}
MSG_DZ_GUILD_GUILDMARK_DELETE_SYN msg;
msg.m_dwKey = pRecvMsg->m_dwKey;
msg.m_dwSessionIndex = pServerSession->GetSessionIndex(); // (WAVERIX) (090903) (BUG-FIX) ...-.-;...
msg.m_GuildIndex = tempInfo.guild_Index;
msg.m_PatternIndex = tempInfo.pattern_index;
msg.m_BackGroundIndex = tempInfo.background_index;
msg.m_RequestPlayerIndex = tempInfo.request_player_index;
if(!GuildServer::GetMainFrame()->ConnectSessions.SendToDBProxy(&msg, sizeof(msg)))
MessageOut(eDEV_LOG, "RegisterCastToDBProxy Error");
}
Handler_FromGameServer_IMPL(GZ_GUILD_WAREHOUSE_OPEN_SYN)
{
PACKET_PTR_CONVERT(MSG_GZ_GUILD_WAREHOUSE_OPEN_SYN,pRecvMsg, pMsg);
GuildServer* pGuildServer = GuildServer::GetMainFrame();
if(!pGuildServer || !g_GuildManager.CheckRight(pRecvMsg->m_GuildGuid,
pRecvMsg->m_OperCharGuid,
eGUILD_RIGHTS_WAREHOUSE_SAVE))
{
MSG_GZ_GUILD_WAREHOUSE_OPEN_NAK msg;
msg.m_dwKey = pRecvMsg->m_dwKey;
msg.m_bErrorCode = RC::RC_GUILD_WAREHOUSE_UNABLE_CURR_GRADE;
pServerSession->SendPacket(&msg, sizeof(msg));
return;
}
MSG_DZ_GUILD_WAREHOUSE_OPEN_SYN msg;
msg.m_dwKey = pRecvMsg->m_dwKey;
msg.m_dwSessionIndex = pServerSession->GetSessionIndex(); // (WAVERIX) (090903) (CHANGES) ...-.-;...
msg.m_GuildGuid = pRecvMsg->m_GuildGuid;
msg.m_OperCharGuid = pRecvMsg->m_OperCharGuid;
if(!pGuildServer->ConnectSessions.SendToDBProxy(&msg, sizeof(msg)))
SUNLOG(eDEV_LOG, "RegisterCastToDBProxy Error(%d)", pRecvMsg->m_GuildGuid);
}
Handler_FromGameServer_IMPL(GZ_GUILD_WAREHOUSE_CLOSE_SYN)
{
MSG_GZ_GUILD_WAREHOUSE_CLOSE_SYN* pRecvMsg =
static_cast<MSG_GZ_GUILD_WAREHOUSE_CLOSE_SYN*>(pMsg);
// (WAVERIX) (090903) (NOTE) 아무래도 길드는 그냥 보기에도 문제가 많을 것 같다.
// 도저히 정상적인 코드라 생각되지 않는다.
}
Handler_FromGameServer_IMPL(GZ_GUILD_NAME_CHANGE_SYN)
{
MSG_GZ_GUILD_NAME_CHANGE_SYN* pRecvMsg = (MSG_GZ_GUILD_NAME_CHANGE_SYN*)pMsg;
GuildServer* pGuildServer = GuildServer::GetMainFrame();
RC::eGUILD_RESULT result = g_GuildManager.CanChangeGuildName( pRecvMsg->m_GuildGuid, pRecvMsg->m_OperCharGuid );
if(RC::RC_GUILD_SUCCESS != result)
{
MSG_GZ_GUILD_NAME_CHANGE_NAK msg;
msg.m_dwKey = pRecvMsg->m_dwKey;
msg.m_TargetPos = pRecvMsg->m_TargetPos;
msg.m_byErrorCode = result;
pServerSession->SendPacket(&msg, sizeof(msg));
return;
}
//.//
MSG_DZ_GUILD_NAME_CHANGE_SYN msg;
msg.m_dwKey = pRecvMsg->m_dwKey;
msg.m_TargetPos = pRecvMsg->m_TargetPos;
msg.m_GuildGuid = pRecvMsg->m_GuildGuid;
msg.m_OperCharGuid = pRecvMsg->m_OperCharGuid;
msg.m_dwSessionIndex = pServerSession->GetSessionIndex();
memcpy( msg.m_tszGuildName, pRecvMsg->m_tszGuildName, MAX_GUILDNAME_LENGTH*sizeof(TCHAR) );
msg.m_tszGuildName[MAX_GUILDNAME_LENGTH] = '\0';
if(!pGuildServer->ConnectSessions.SendToDBProxy(&msg, sizeof(msg)))
{
MSG_GZ_GUILD_NAME_CHANGE_NAK msg;
msg.m_dwKey = pRecvMsg->m_dwKey;
msg.m_TargetPos = pRecvMsg->m_TargetPos;
msg.m_byErrorCode = RC::RC_GUILD_DISCONNECTED_DBP_SERVER;
pServerSession->SendPacket(&msg, sizeof(msg));
SUNLOG(eDEV_LOG, "RegisterCastToDBProxy Error(%d)", pRecvMsg->m_GuildGuid);
}
}
//지역 점령전 기본 정보 셋팅 관련 작업
Handler_FromGameServer_IMPL(GZ_DOMINATION_INFO_SYN)
{
const MSG_GZ_DOMINATION_INFO_SYN* recv_msg =
static_cast<MSG_GZ_DOMINATION_INFO_SYN*>(pMsg);
//기본 정보 로드가 성공한 상태이면 게임 서버에 응답해 준다
if (DominationManager::Instance()-> GetLoadDominationInfo() == true)
{
DominationManager::Instance()->SendDominationInfo(pServerSession, recv_msg->m_MapCode);
}
}
Handler_FromGameServer_IMPL(GZ_DOMINATION_AUCTION_INFO_SYN)
{
const MSG_GZ_DOMINATION_AUCTION_INFO_SYN* pRecvMsg =
static_cast<MSG_GZ_DOMINATION_AUCTION_INFO_SYN*>(pMsg);
//경매 정보 로드가 성공한 상태이면 게임 서버에 응답해 준다
if (DominationManager::Instance()->GetLoadDominationAuctionInfo() == true)
{
DominationManager::Instance()->SendActionList(pServerSession, pRecvMsg->m_MapCode);
}
}
//DB로 기본 정보 Update요청을 한다.
Handler_FromGameServer_IMPL(GZ_DOMINATION_UPDATE_INFO_SYN)
{
const MSG_GZ_DOMINATION_UPDATE_INFO_SYN* pRecvMsg =
static_cast<MSG_GZ_DOMINATION_UPDATE_INFO_SYN*>(pMsg);
MSG_DZ_DOMINATION_UPDATE_INFO_SYN sendMsg;
sendMsg.m_eSetType = pRecvMsg->m_eSetType;
sendMsg.m_DominationInfo = pRecvMsg->m_DominationInfo;
switch(pRecvMsg->m_eSetType)
{
case DOMINATION_GM_OFFENCE_GUILD_SET:
case DOMINATION_GM_DEFENCE_GUILD_SET:
{
DOMINATION_BASIC_GUILD_INFO* guild_info = NULL;
if (pRecvMsg->m_eSetType == DOMINATION_GM_OFFENCE_GUILD_SET)
guild_info = &sendMsg.m_DominationInfo.m_disGuildInfo;
else
guild_info = &sendMsg.m_DominationInfo.m_inGuildInfo;
Guild* pGuild = g_GuildManager.FindGuildName(guild_info->m_tszGuildName);
if (!pGuild)
return;
guild_info->m_GuildGuid = pGuild->GetGuildGuid();
pGuild->AcquireGuildMark(guild_info->m_BackGroundIndex, guild_info->m_PatternIndex);
GuildMember* master = pGuild->FindMaster();
guild_info->m_GuildMasterGuid = master->GetCharGuid();
_tcsncpy(guild_info->m_tszGuildMaster, master->GetCharName(), MAX_CHARNAME_LENGTH);
guild_info->m_tszGuildMaster[MAX_CHARNAME_LENGTH] = '\0';
sendMsg.m_eSetType = DOMINATION_INIT;
}
break;
}
GuildServer* pGuildServer = GuildServer::GetMainFrame();
if( pGuildServer == NULL )
{
SUNLOG( eCRITICAL_LOG, "["__FUNCTION__"] - Not Fount pGuildServer\n" );
return;
}
pGuildServer->ConnectSessions.SendToDBProxy(&sendMsg, sizeof(sendMsg));
}
Handler_FromGameServer_IMPL(GZ_DOMINATION_ACCEP_HEIM_SYN)
{
const MSG_GZ_DOMINATION_ACCEP_HEIM_SYN* recv_msg =
static_cast<MSG_GZ_DOMINATION_ACCEP_HEIM_SYN*>(pMsg);
GuildServer* guild_server = GuildServer::GetMainFrame();
if (guild_server == NULL)
{
SUNLOG( eCRITICAL_LOG, "["__FUNCTION__"]Not Fount guild_server" );
return;
}
MSG_DZ_DOMINATION_ACCEP_HEIM_SYN send_msg;
#ifdef _CH_20100420_CHANGE_DOMINATION_APPLY_WAY
send_msg.m_TokenPos = recv_msg->m_TokenPos;
send_msg.number_of_betting_item = recv_msg->number_of_betting_item;
#endif//_CH_20100420_CHANGE_DOMINATION_APPLY_WAY
send_msg.m_dwKey = recv_msg->m_dwKey;
send_msg.m_DominationActionInfo = recv_msg->m_DominationActionInfo;
guild_server->ConnectSessions.SendToDBProxy(&send_msg, sizeof(send_msg));
}
Handler_FromGameServer_IMPL(GZ_DOMINATION_INIT_ACTIONINFO_SYN)
{
const MSG_GZ_DOMINATION_INIT_ACTIONINFO_SYN* pRecvMsg =
static_cast<MSG_GZ_DOMINATION_INIT_ACTIONINFO_SYN*>(pMsg);
GuildServer* pGuildServer = GuildServer::GetMainFrame();
if( pGuildServer == NULL )
{
SUNLOG( eCRITICAL_LOG, "["__FUNCTION__"]Not Fount pGuildServer\n" );
return;
}
MSG_DZ_DOMINATION_INIT_AUCTIONINFO_SYN sendMsg;
sendMsg.m_MapCode = pRecvMsg->m_MapCode;
pGuildServer->ConnectSessions.SendToDBProxy(&sendMsg, sizeof(sendMsg));
}
//하임을 돌려줄 길드 마스터의 Guid리스트를 작성하여 WorldServer로 보낸다.
Handler_FromGameServer_IMPL(GZ_DOMINATION_RETURNHIME_SYN)
{
const MSG_GZ_DOMINATION_RETURNHIME_SYN* pRecvMsg =
static_cast<MSG_GZ_DOMINATION_RETURNHIME_SYN*>(pMsg);
GuildServer* pGuildServer = GuildServer::GetMainFrame();
if( pGuildServer == NULL )
{
SUNLOG( eCRITICAL_LOG, "["__FUNCTION__"] - Not Fount pGuildServer\n" );
return;
}
DOMINATION_RETURNMONEY_INFO ReturnInfo[MAX_DOMINATION_AUCTION];
ZeroMemory( ReturnInfo, sizeof(ReturnInfo) );
const DOMINATION_INFO& dominationInfo = pRecvMsg->m_DominationInfo;
INT countData = 0;
//경매에 당첨 되지 않은 길드 리스트 작성
DominationManager::Instance()->SetListForReturnHeim( dominationInfo.m_FieldCode,
ReturnInfo, MAX_DOMINATION_AUCTION, countData );
#ifndef _CH_20100420_CHANGE_DOMINATION_APPLY_WAY
//마지막에 지역 점령 길드 마스터이름과 금액을 넣는다.(지역 점령전 경매 보상 하임)
{
ReturnInfo[countData].m_TenderCost = dominationInfo.m_BestCost;
ReturnInfo[countData].m_CostType = SYSMEMO_DOMINATION_REWARD_MONEY;
memcpy( ReturnInfo[countData].m_tszMaster,
dominationInfo.m_inGuildInfo.m_tszGuildMaster, sizeof(TCHAR)*MAX_CHARNAME_LENGTH );
ReturnInfo[countData].m_tszMaster[MAX_CHARNAME_LENGTH] = '\0';
++countData;
}
#endif//_CH_20100420_CHANGE_DOMINATION_APPLY_WAY
//WorldServer에 하임 쪽지를 돌리도록 요청
MSG_WZ_GUILD_DOMINATION_RETURNHIME_CMD sendMsg;
sendMsg.m_MapCode = dominationInfo.m_FieldCode;
memcpy( sendMsg.m_tszGuild, dominationInfo.m_disGuildInfo.m_tszGuildName, sizeof(TCHAR)*MAX_GUILDNAME_LENGTH );
sendMsg.m_tszGuild[MAX_GUILDNAME_LENGTH] = '\0';
memcpy( sendMsg.m_ReturnInfo, ReturnInfo, sizeof(sendMsg.m_ReturnInfo) );
sendMsg.m_DataCount = countData;
pGuildServer->ConnectSessions.SendToWorld(&sendMsg, sendMsg.GetSize());
//GameServer에 완료 응답을 한다.
MSG_GZ_DOMINATION_RETURNHIME_ACK ackMsg;
ackMsg.m_MapCode = dominationInfo.m_FieldCode;
pServerSession->SendPacket(&ackMsg, sizeof(ackMsg));
}
Handler_FromGameServer_IMPL(GZ_DOMINATION_BATTING_HEIM_SYN)
{
const MSG_GZ_DOMINATION_BATTING_HEIM_SYN* pRecvMsg =
static_cast<MSG_GZ_DOMINATION_BATTING_HEIM_SYN*>(pMsg);
MSG_GZ_DOMINATION_BATTING_HEIM_ACK sendMsg;
Guild* pGuild = g_GuildManager.FindGuild( pRecvMsg->m_guildGuid );
if( pGuild == NULL )
{
sendMsg.m_ResultCode = RC::DOMINATION_RESULT_NOT_GUILDMEMBER;
}
else if( pGuild->CheckGuildDeleteState() == eGUILD_DELCHK_DESTROY_WAIT )
{
sendMsg.m_ResultCode = RC::DOMINATION_RESULT_GUILDSTAT_DESTROYWAIT;
}
else
{
//현재 길드는 경매 신청을 해도 되는 길드이다.(해산 신청건에 있어서)
sendMsg.m_ResultCode = RC::DOMINATION_RESULT_SUCCESS;
}
sendMsg.m_dwKey = pRecvMsg->m_dwKey;
#ifdef _CH_20100420_CHANGE_DOMINATION_APPLY_WAY
sendMsg.m_mapCode = pRecvMsg->m_mapCode;
#endif
pServerSession->SendPacket( &sendMsg, sizeof(sendMsg) );
}
#ifdef _NA_20100604_BETTER_DOMINATION_MANAGER
Handler_FromGameServer_IMPL(GZ_DOMINATION_UPDATE_GUILDINFO_SYN)
{
const MSG_GZ_DOMINATION_UPDATE_GUILDINFO_SYN* recv_msg =
static_cast<MSG_GZ_DOMINATION_UPDATE_GUILDINFO_SYN*>(pMsg);
GuildServer* guild_server = GuildServer::GetMainFrame();
if (guild_server == NULL)
{
SUNLOG(eCRITICAL_LOG, "["__FUNCTION__"]Not Fount pGuildServer\n");
return;
}
MSG_DZ_DOMINATION_UPDATE_GUILDINFO_SYN send_msg;
{
send_msg.guild_guid_ = recv_msg->guild_guid_;
send_msg.domination_join_count_ = recv_msg->domination_join_count_;
send_msg.domination_defense_count_ = recv_msg->domination_defense_count_;
send_msg.domination_hunting_count_ = recv_msg->domination_hunting_count_;
}
guild_server->ConnectSessions.SendToDBProxy(&send_msg, sizeof(send_msg));
}
#endif//_NA_20100604_BETTER_DOMINATION_MANAGER
//_NA_20100913_GUILD_WAREHOUSE_GM_COMMAND
// GM 명령에 의한 길드 창고 강제 닫기
Handler_FromGameServer_IMPL(GZ_GUILD_GM_WAREHOUSE_FORCE_CLOSE_CMD)
{
const MSG_GZ_GUILD_GM_WAREHOUSE_FORCE_CLOSE_CMD* msg =
static_cast<MSG_GZ_GUILD_GM_WAREHOUSE_FORCE_CLOSE_CMD*>(pMsg);
Guild* guild = g_GuildManager.FindGuildName(msg->guild_name);
if (guild == NULL)
{
SUNLOG(eFULL_LOG, "[GZ_GUILD_GM_WAREHOUSE_FORCE_CLOSE_CMD] Guild name '%s' not found!", msg->guild_name);
return;
}
// DBProxy와 게임 서버들로 전달한다.
// 둘 중 가능한 곳에서 성공하기를 기대하므로 타이밍 고려나 응답 대기 없이 바로 양방향으로 뿌린다.
// DBProxy로 강제 닫기 명령을 전달하고
MSG_DZ_GUILD_GM_WAREHOUSE_FORCE_CLOSE_CMD cmd;
cmd.gm_player_key = msg->gm_player_key;
cmd.guild_guid = guild->GetGuildGuid();
GuildServer::GetMainFrame()->ConnectSessions.SendToDBProxy(&cmd, sizeof(cmd));
// 게임 서버들에 공지한다.
MSG_GZ_GUILD_GM_WAREHOUSE_FORCE_CLOSE_BRD brd;
brd.gm_player_key = msg->gm_player_key;
brd.guild_guid = guild->GetGuildGuid();
GuildServer::GetMainFrame()->SendToAllGameServers(&brd, sizeof(brd));
}
//gamelulu_dev_not : 점령전 정보 저장 기본 구조가 Game <-> Guild <-> DBP 이다.
//하지만 대부분은 Game->DBP->Guild->Game 의 구조로써 해결이 가능하다.
#ifdef _NA_20110216_INCREASE_DOMINATION_DEFFENSEWALL_POINT
Handler_FromGameServer_IMPL(GZ_DOMINATION_ADD_DEFFENSEWALL_POINT_SYN)
{
const MSG_GZ_DOMINATION_ADD_DEFFENSEWALL_POINT_SYN* recv_msg =
static_cast<MSG_GZ_DOMINATION_ADD_DEFFENSEWALL_POINT_SYN*>(pMsg);
MSG_DZ_DOMINATION_ADD_DEFFENSEWALL_POINT_SYN send_msg;
send_msg.item_code_ = recv_msg->item_code_;
send_msg.m_dwKey = recv_msg->m_dwKey;
send_msg.domination_info_ = recv_msg->domination_info_;
GuildServer* guild_server = GuildServer::GetMainFrame();
if (guild_server == NULL)
{
SUNLOG(eCRITICAL_LOG,"["__FUNCTION__"]Not connected to guild server");
return;
}
guild_server->ConnectSessions.SendToDBProxy(&send_msg, sizeof(send_msg));
}
#endif//_NA_20110216_INCREASE_DOMINATION_DEFFENSEWALL_POINT
#ifdef _NA_20110406_CHANGE_RULE_FOR_DOMINATION_JOIN
Handler_FromGameServer_IMPL(GZ_DOMINATION_MEMBER_JOIN_SYN)
{
const MSG_GZ_DOMINATION_MEMBER_JOIN_SYN* recv_msg =
static_cast<MSG_GZ_DOMINATION_MEMBER_JOIN_SYN*>(pMsg);
MSG_DZ_DOMINATION_MEMBER_JOIN_SYN send_msg;
send_msg.map_code_ = recv_msg->map_code_;
send_msg.member_info_ = recv_msg->member_info_;
GuildServer* guild_server = GuildServer::GetMainFrame();
if (guild_server == NULL)
{
SUNLOG(eCRITICAL_LOG, __FUNCTION__":Not connected to guild server");
return;
}
guild_server->ConnectSessions.SendToDBProxy(&send_msg, sizeof(send_msg));
}
Handler_FromGameServer_IMPL(GZ_DOMINATION_MEMBER_LEAVE_SYN)
{
const MSG_GZ_DOMINATION_MEMBER_LEAVE_SYN* recv_msg =
static_cast<MSG_GZ_DOMINATION_MEMBER_LEAVE_SYN*>(pMsg);
MSG_DZ_DOMINATION_MEMBER_LEAVE_SYN send_msg;
send_msg.map_code_ = recv_msg->map_code_;
send_msg.member_guid_ = recv_msg->member_guid_;
send_msg.requester_guid = recv_msg->requester_guid;
GuildServer* guild_server = GuildServer::GetMainFrame();
if (guild_server == NULL)
{
SUNLOG(eCRITICAL_LOG, __FUNCTION__":Not connected to guild server");
return;
}
guild_server->ConnectSessions.SendToDBProxy(&send_msg, sizeof(send_msg));
}
Handler_FromGameServer_IMPL(GZ_DOMINATION_MEMBERLIST_REQ)
{
const MSG_GZ_DOMINATION_MEMBERLIST_REQ* recv_msg =
static_cast<MSG_GZ_DOMINATION_MEMBERLIST_REQ*>(pMsg);
if (DominationManager::Instance()->GetLoadDominationMemberInfo() == true)
{
DominationManager::Instance()->SendMemberList(pServerSession, recv_msg->map_code_);
}
}
Handler_FromGameServer_IMPL(GZ_DOMINATION_MEMBERLIST_INIT_CMD)
{
const MSG_GZ_DOMINATION_MEMBERLIST_INIT_CMD* recv_msg =
static_cast<MSG_GZ_DOMINATION_MEMBERLIST_INIT_CMD*>(pMsg);
MSG_DZ_DOMINATION_MEMBERLIST_INIT_SYN send_msg;
GuildServer* guild_server = GuildServer::GetMainFrame();
if (guild_server == NULL)
{
SUNLOG(eCRITICAL_LOG, __FUNCTION__":Not connected to guild server");
return;
}
guild_server->ConnectSessions.SendToDBProxy(&send_msg, sizeof(send_msg));
}
#endif//_NA_20110406_CHANGE_RULE_FOR_DOMINATION_JOIN