4059 lines
125 KiB
C++
4059 lines
125 KiB
C++
#include "stdafx.h"
|
||
#include "Handler_FromClient.h"
|
||
|
||
#include "PacketHandler.Shared.h"
|
||
#include "Handler_FromGameServer.h"
|
||
|
||
#include "SolarDateTime.h"
|
||
#include "../SolarShop/ShopDefine.h"
|
||
#include <fstream>
|
||
#ifdef _NA_0_20100929_LANGUAGE_OF_FILTER
|
||
#include <ServerOptionParserEx.h>
|
||
#endif
|
||
#include "BattleOpenTimeManager.h"
|
||
|
||
#ifdef _NA_20100307_BETAKEY_SYSTEM
|
||
#include <BetaKeyImpl.h>
|
||
#endif
|
||
|
||
#ifdef _NA_0_20110329_GAMEOPTION_SETTING
|
||
#include "Function/GameOptionManager.h"
|
||
#endif //_NA_0_20110329_GAMEOPTION_SETTING
|
||
|
||
//_NA_20110630_BATTLE_ZONE_RENEWAL
|
||
#include "AgentParty/AgentPartyManager.h"
|
||
#include "Party/PartyRoom.h"
|
||
|
||
#ifdef _NA_004707_20120416_1202_DELETE_RESERVATION_ROOM_LIST
|
||
#include "AgentParty/PartyRoomFinder.h"
|
||
#endif // _NA_004707_20120416_1202_DELETE_RESERVATION_ROOM_LIST
|
||
// _NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND
|
||
#include "ChaosZoneSystem/BattleGroundManager.h"
|
||
#include <ChaosZoneSystem/BattleGroundMatchingSystem.h>
|
||
|
||
#include <Function/GuildRanking/GuildRanking.h>
|
||
|
||
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||
|
||
#undef ADD_HANDLER_INFO_EOR
|
||
#undef ADD_HANDLER_INFO
|
||
#define ADD_HANDLER_INFO_EOR() { MAKEWORD(0, 0), PHASE_NOACTION, (PH_fnHandler)NULL }
|
||
#define ADD_HANDLER_INFO(c, p, accptablePHASE) \
|
||
{ MAKEWORD(c, p), (ePHASE_SHIFT)(accptablePHASE), (PH_fnHandler)&Handler_CG::On##p }
|
||
|
||
|
||
|
||
sPACKET_HANDLER_INFO* Handler_CG::GetHandlerInfo_Event()
|
||
{
|
||
static sPACKET_HANDLER_INFO s_pHandlerInfo[] =
|
||
{
|
||
ADD_HANDLER_INFO(CG_EVENT, CG_EVENT_INVITATEFRIEND_REWARD_LIST_SYN, PHASE_UNLIMITED),
|
||
|
||
ADD_HANDLER_INFO_EOR(),
|
||
};
|
||
|
||
return s_pHandlerInfo;
|
||
};
|
||
|
||
sPACKET_HANDLER_INFO* Handler_CG::GetHandlerInfo_CHARINFO()
|
||
{
|
||
static sPACKET_HANDLER_INFO s_pHandlerInfo[] =
|
||
{
|
||
ADD_HANDLER_INFO(CG_CHARINFO, CG_CHARINFO_CREATE_SYN, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO(CG_CHARINFO, CG_CHARINFO_DESTROY_SYN, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO(CG_CHARINFO, CG_CHARINFO_RECOVER_SYN, PHASE_UNLIMITED),
|
||
#ifdef __NA_001044_ADD_CUSTOM_UI
|
||
ADD_HANDLER_INFO(CG_CHARINFO, CG_CHARINFO_CHARACTERID_CHECK_SYN, PHASE_UNLIMITED),
|
||
#endif
|
||
ADD_HANDLER_INFO_EOR(),
|
||
};
|
||
|
||
return s_pHandlerInfo;
|
||
};
|
||
|
||
sPACKET_HANDLER_INFO* Handler_CG::GetHandlerInfo_SYNC()
|
||
{
|
||
static sPACKET_HANDLER_INFO s_pHandlerInfo[] =
|
||
{
|
||
ADD_HANDLER_INFO(CG_SYNC, CG_SYNC_PLAYER_ENTER_SYN, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO_EOR(),
|
||
};
|
||
|
||
return s_pHandlerInfo;
|
||
};
|
||
|
||
sPACKET_HANDLER_INFO* Handler_CG::GetHandlerInfo_ZONE()
|
||
{
|
||
static sPACKET_HANDLER_INFO s_pHandlerInfo[] =
|
||
{
|
||
// 任务大厅列表请求
|
||
ADD_HANDLER_INFO(CG_ZONE, CG_ZONE_LIST_MISSIONLOBBY_SYN, PHASE_UNLIMITED),
|
||
// 请求猎人大厅列表
|
||
ADD_HANDLER_INFO(CG_ZONE, CG_ZONE_LIST_HUNTINGLOBBY_SYN, PHASE_UNLIMITED),
|
||
// 请求进行的猎人列表
|
||
ADD_HANDLER_INFO(CG_ZONE, CG_ZONE_LIST_HUNTING_SYN, PHASE_UNLIMITED),
|
||
|
||
ADD_HANDLER_INFO(CG_ZONE, CG_ZONE_LIST_PVPLOBBY_SYN, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO(CG_ZONE, CG_ZONE_LIST_CHUNTINGLOBBY_SYN, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO(CG_ZONE, CG_ZONE_LIST_CHUNTING_SYN, PHASE_UNLIMITED),
|
||
|
||
// 刷新特定房间列表
|
||
ADD_HANDLER_INFO(CG_ZONE, CG_ZONE_LIST_REFRESH_SYN, PHASE_UNLIMITED),
|
||
|
||
ADD_HANDLER_INFO(CG_ZONE, CG_ZONE_SHORTCUT_SYN, PHASE_UNLIMITED),
|
||
// 找到用户名的房间
|
||
ADD_HANDLER_INFO(CG_ZONE, CG_ZONE_FIND_ROOM_FROM_CHARID_SYN, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO(CG_ZONE, CG_ZONE_FIND_ROOM_FROM_NO_SYN, PHASE_UNLIMITED),
|
||
// 房主设大厅
|
||
ADD_HANDLER_INFO(CG_ZONE, CG_ZONE_LOBBY_CREATE_SYN, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO(CG_ZONE, CG_ZONE_CHUNTINGLOBBY_CREATE_SYN, PHASE_UNLIMITED),
|
||
// 参加游说
|
||
ADD_HANDLER_INFO(CG_ZONE, CG_ZONE_LOBBY_JOIN_SYN, PHASE_UNLIMITED),
|
||
// [成员权限]
|
||
// 成员按准备按钮.
|
||
ADD_HANDLER_INFO(CG_ZONE, CG_ZONE_LOBBY_READY_SYN, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO(CG_ZONE, CG_ZONE_LOBBY_READY_CANCEL_SYN, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO(CG_ZONE, CG_ZONE_LOBBY_REQUEST_INFO_SYN, PHASE_UNLIMITED),
|
||
// [房主的权限]
|
||
// 变更人数
|
||
ADD_HANDLER_INFO(CG_ZONE, CG_ZONE_LOBBY_NONBLOCKSLOTNUM_SYN, PHASE_UNLIMITED),
|
||
// 玩家强退
|
||
ADD_HANDLER_INFO(CG_ZONE, CG_ZONE_LOBBY_KICKPLAYER_SYN, PHASE_UNLIMITED),
|
||
// 更改大厅限制设置
|
||
ADD_HANDLER_INFO(CG_ZONE, CG_ZONE_LOBBY_HUNTING_CONFIG_SYN, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO(CG_ZONE, CG_ZONE_LOBBY_PVP_CONFIG_SYN, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO(CG_ZONE, CG_ZONE_LOBBY_CHUNTING_CONFIG_SYN, PHASE_UNLIMITED),
|
||
|
||
ADD_HANDLER_INFO(CG_ZONE, CG_ZONE_HUNTING_CREATE_SYN, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO(CG_ZONE, CG_ZONE_MISSION_CREATE_SYN, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO(CG_ZONE, CG_ZONE_PVP_CREATE_SYN, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO(CG_ZONE, CG_ZONE_CHUNTING_CREATE_SYN, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO(CG_ZONE, CG_ZONE_CHUNTING_MIGRATE_SYN, PHASE_UNLIMITED),
|
||
|
||
ADD_HANDLER_INFO(CG_ZONE, CG_ZONE_HUNTING_JOIN_SYN, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO(CG_ZONE, CG_ZONE_LOBBY_LEAVE_SYN, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO(CG_ZONE, CG_ZONE_MISSION_LEAVE_SYN, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO(CG_ZONE, CG_ZONE_HUNTING_LEAVE_SYN, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO(CG_ZONE, CG_ZONE_PVP_LEAVE_SYN, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO(CG_ZONE, CG_ZONE_CHUNTING_LEAVE_SYN, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO(CG_ZONE, CG_ZONE_HUNTING_RELAY_CREATE_SYN, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO(CG_ZONE, CG_ZONE_HUNTING_RELAY_JOIN_SYN, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO(CG_ZONE, CG_ZONE_LOBBY_CHANGE_TEAM_SYN, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO(CG_ZONE, CG_ZONE_LOBBY_CHANGE_MAP_SYN, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO(CG_ZONE, CG_ZONE_PORTAL_FIELD_MOVE_SYN, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO(CG_ZONE, CG_ZONE_RETURN_VILLAGE_SYN, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO(CG_ZONE, CG_ZONE_MISSION_RELAY_CREATE_SYN, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO(CG_ZONE, CG_ZONE_MISSION_RELAY_JOIN_SYN, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO(CG_ZONE, CG_ZONE_INSTANCE_DUNGEON_REQUEST_SYN, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO(CG_ZONE, CG_ZONE_INSTANCE_DUNGEON_LEAVE_SYN, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO(CG_ZONE_EX, CG_ZONE_EX_LOBBY_NAME_CHANGE_SYN, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO(CG_ZONE_EX, CG_ZONE_EX_TUTORIAL_FIELD_LEAVE_SYN, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO(CG_ZONE_EX, CG_ZONE_EX_TUTORIAL_MISSION_LEAVE_SYN, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO(CG_ZONE_EX, CG_ZONE_EX_CAN_CREATE_100LEVEL_QUEST_MISSION_SYN, PHASE_UNLIMITED),
|
||
|
||
ADD_HANDLER_INFO(CG_ZONE_EX, CG_ZONE_EX_SSQ_JOIN_INFO_SYN, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO(CG_ZONE_EX, CG_ZONE_EX_SSQ_JOIN_SYN, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO(CG_ZONE_EX, CG_ZONE_EX_SSQ_ROOM_INFO_SYN, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO(CG_ZONE_EX, CG_ZONE_EX_SSQ_OBSERVER_SYN, PHASE_UNLIMITED),
|
||
//__NA1279_1281_090209_TIMELINE_QUEST_BASED_MISSION__
|
||
ADD_HANDLER_INFO(CG_ZONE_EX, CG_ZONE_EX_QUEST_PORTAL_ENTER_SYN, PHASE_UNLIMITED),
|
||
//_NA003129_QUEST_PORTAL_CONVENIENCE_EXTENTION
|
||
ADD_HANDLER_INFO(CG_ZONE_EX, CG_ZONE_EX_QUEST_PORTAL_WITHDRAW_MEMBER_SYN, PHASE_UNLIMITED),
|
||
|
||
#ifdef _NA_008069_20150210_ADD_SPA_SYSTEM
|
||
ADD_HANDLER_INFO(CG_ZONE_EX, CG_ZONE_EX_SPA_ENTER_SYN, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO(CG_ZONE_EX, CG_ZONE_EX_SPA_LEAVE_SYN, PHASE_UNLIMITED),
|
||
#endif //_NA_008069_20150210_ADD_SPA_SYSTEM
|
||
//
|
||
ADD_HANDLER_INFO_EOR(),
|
||
};
|
||
|
||
return s_pHandlerInfo;
|
||
};
|
||
|
||
sPACKET_HANDLER_INFO* Handler_CG::GetHandlerInfo_PARTY()
|
||
{
|
||
static sPACKET_HANDLER_INFO s_pHandlerInfo[] =
|
||
{
|
||
// CG_PARTY
|
||
ADD_HANDLER_INFO(CG_PARTY, CG_PARTY_JOIN_SYN, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO(CG_PARTY, CG_PARTY_JOIN_RESPONSE_ACK, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO(CG_PARTY, CG_PARTY_JOIN_RESPONSE_NAK, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO(CG_PARTY, CG_PARTY_LEAVE_SYN, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO(CG_PARTY, CG_PARTY_FORCED_EXPULSION_SYN, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO(CG_PARTY, CG_PARTY_CHANGE_MASTER_SYN, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO(CG_PARTY, CG_PARTY_DESTROY_SYN, PHASE_UNLIMITED),
|
||
|
||
ADD_HANDLER_INFO(CG_PARTY, CG_PARTY_SELECT_TARGET_SYN, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO(CG_PARTY, CG_PARTY_MINIMAP_POINTING_SYN, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO(CG_PARTY, CG_PARTY_ITEM_DISTRIBUTION_CHANGE_SYN, PHASE_UNLIMITED),
|
||
|
||
//ADD_HANDLER_INFO(CG_PARTY, CG_PARTY_RETURN_G2C_LEADER_QUERY_CMD, PHASE_UNLIMITED), // 向队长发送是否邀请队员的信息,取消队员一次时
|
||
//ADD_HANDLER_INFO(CG_PARTY, CG_PARTY_RETURN_G2C_MEMBER_QUERY_CMD, PHASE_UNLIMITED), // 邀请
|
||
ADD_HANDLER_INFO(CG_PARTY, CG_PARTY_RETURN_C2G_MEMBER_QUERY_ACK, PHASE_UNLIMITED), // 与队员拒绝相关
|
||
//_NA_20110630_BATTLE_ZONE_RENEWAL
|
||
ADD_HANDLER_INFO(CG_PARTY, CG_PARTY_CREATE_ROOM_SYN, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO(CG_PARTY, CG_PARTY_CHECK_ROOM_SYN, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO(CG_PARTY, CG_PARTY_BATTLE_ZONE_INFO_SYN, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO(CG_PARTY, CG_PARTY_LEAVE_ROOM_SYN, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO(CG_PARTY, CG_PARTY_ROOM_LIST_SYN, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO(CG_PARTY, CG_PARTY_CHANGE_ROOM_OPTION_SYN, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO(CG_PARTY, CG_PARTY_CHANGE_MAX_PLAYER_COUNT_SYN, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO(CG_PARTY, CG_PARTY_JOIN_ROOM_SYN, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO(CG_PARTY, CG_PARTY_STANDBY_ROOM_SYN, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO(CG_PARTY, CG_PARTY_READY_STATE_SYN, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO(CG_PARTY, CG_PARTY_ROOM_FORCE_LEAVE_SYN, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO(CG_PARTY, CG_PARTY_ROOM_START_SYN, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO(CG_PARTY, CG_PARTY_SELECT_TEAM_SYN, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO(CG_PARTY, CG_PARTY_REQUEST_MEMBER_INFO_SYN, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO(CG_PARTY, CG_PARTY_FIND_ROOM_BY_CHARID_SYN, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO(CG_PARTY, CG_PARTY_STANDBY_PAUSE_SYN, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO(CG_PARTY, CG_PARTY_REQUEST_RENDER_INFO_SYN, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO(CG_PARTY, CG_PARTY_FIND_ROOM_BY_ROOMNUMBER_SYN, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO(CG_PARTY, CG_PARTY_FIND_WAITING_ROOM_SYN, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO(CG_PARTY, CG_PARTY_FIND_ROOM_BY_MISSION_NAME_SYN, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO(CG_PARTY, CG_PARTY_INVITE_PARTY_ROOM_ANS, PHASE_UNLIMITED),
|
||
#ifdef _NA_20111220_CHANGE_DISCONNECTED_USER_PROCESS
|
||
ADD_HANDLER_INFO(CG_PARTY, CG_PARTY_RETURN_G2C_MEMBER_REMOVE_SYN, PHASE_UNLIMITED),
|
||
#endif
|
||
// _NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND
|
||
ADD_HANDLER_INFO(CG_PARTY, CG_CHAOS_ZONE_PACKET, PHASE_UNLIMITED),
|
||
|
||
ADD_HANDLER_INFO_EOR(),
|
||
};
|
||
|
||
return s_pHandlerInfo;
|
||
};
|
||
|
||
sPACKET_HANDLER_INFO* Handler_CG::GetHandlerInfo_GM()
|
||
{
|
||
static sPACKET_HANDLER_INFO s_pHandlerInfo[] =
|
||
{
|
||
//GM指令(频道信息请求)
|
||
ADD_HANDLER_INFO(CG_GM, CG_GM_CHANNELINFO_SYN, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO(CG_GM, CG_GM_WARP_SYN, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO_EOR(),
|
||
};
|
||
|
||
return s_pHandlerInfo;
|
||
};
|
||
|
||
sPACKET_HANDLER_INFO* Handler_CG::GetHandlerInfo_SECURE()
|
||
{
|
||
static sPACKET_HANDLER_INFO s_pHandlerInfo[] =
|
||
{
|
||
ADD_HANDLER_INFO(CG_ARMORKIT, CG_ARMORKIT_FINDHACK, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO(CG_CRYPTOGRAPHY, CG_CRYPTOGRAPHY_ACK, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO(CG_CRYPTOGRAPHY, CG_CRYPTOGRAPHY_NAK, PHASE_UNLIMITED),
|
||
#define ADD_HANDLER_INFO_MOLA(c, p, accptablePHASE) \
|
||
{ MAKEWORD(c, p), (ePHASE_SHIFT)(accptablePHASE), (PH_fnHandler)&Handler_CG::OnCG_SECURE_MOLACONTROL }
|
||
|
||
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
|
||
ADD_HANDLER_INFO_MOLA(CG_SYNC, CG_SECURE_POLICY_PATTERN01_SIMPLEX_SNK_ACK, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO_MOLA(CG_SYNC, CG_SECURE_POLICY_PATTERN02_SIMPLEX_SNK_ACK, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO_MOLA(CG_ITEM, CG_SECURE_POLICY_PATTERN03_SIMPLEX_SNK_ACK, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO_MOLA(CG_TRADE, CG_SECURE_POLICY_PATTERN04_SIMPLEX_SNK_ACK, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO_MOLA(CG_VENDOR, CG_SECURE_POLICY_PATTERN05_QUERY_MOLA_ACK, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO_MOLA(CG_WAREHOUSE, CG_SECURE_POLICY_PATTERN06_CONFIGURE_MOLA_ACK, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO_MOLA(CG_PARTY, CG_SECURE_POLICY_PATTERN07_CONFIGURE_HEARTBEAT_ACK, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO_MOLA(CG_STATUS, CG_SECURE_POLICY_PATTERN08_DUPLEX_SNK_ACK, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO_MOLA(CG_CONNECTION, CG_SECURE_QUERY_BUILTIN_CHK_ACK, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO_MOLA(CG_CONNECTION, CG_SECURE_QUERY_RESOURCE_CHK_T1_ACK, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO_MOLA(CG_CHARINFO, CG_SECURE_QUERY_RESOURCE_CHK_T2_ACK, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO_MOLA(CG_MAP, CG_SECURE_QUERY_RESOURCE_CHK_NTF1_SYN, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO_MOLA(CG_BATTLE, CG_SECURE_QUERY_RESOURCE_CHK_T3_ACK, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO_MOLA(CG_STYLE, CG_SECURE_QUERY_RESOURCE_CHK_T4_ACK, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO_MOLA(CG_STYLE, CG_SECURE_QUERY_RESOURCE_CHK_NTF2_SYN, PHASE_UNLIMITED),
|
||
#if USING_HACKSHIELD
|
||
ADD_HANDLER_INFO(CG_ARMORKIT, CG_HACKSHIELD_SERVER_EX_QUERY_ACK, PHASE_UNLIMITED),
|
||
#elif USING_XIGNCODE
|
||
ADD_HANDLER_INFO(CG_ARMORKIT, CG_XIGNCODE_SERVER_QUERY_ACK, PHASE_UNLIMITED),
|
||
#elif USING_GAMEGUARD
|
||
ADD_HANDLER_INFO(CG_ARMORKIT, CG_GAMEGUARD_SERVER_QUERY_ACK, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO(CG_ARMORKIT, CG_GAMEGUARD_HACKDATA_CMD, PHASE_UNLIMITED),
|
||
#elif USING_FROST
|
||
#endif
|
||
|
||
ADD_HANDLER_INFO_EOR(),
|
||
};
|
||
|
||
return s_pHandlerInfo;
|
||
};
|
||
|
||
sPACKET_HANDLER_INFO* Handler_CG::GetHandlerInfo()
|
||
{
|
||
static sPACKET_HANDLER_INFO s_pHandlerInfo[] =
|
||
{
|
||
// CG_CONNECTION
|
||
ADD_HANDLER_INFO(CG_CONNECTION, CG_CONNECTION_BACKTOCHARSELECT_SYN, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO(CG_CONNECTION, CG_CONNECTION_HEARTBEAT_SYN, PHASE_UNLIMITED),
|
||
#ifdef _NA_20100802_SPEED_HACK_DETECTION
|
||
ADD_HANDLER_INFO(CG_CONNECTION, CG_CONNECTION_TICK_QUERY_ACK, PHASE_UNLIMITED),
|
||
#endif
|
||
ADD_HANDLER_INFO(CG_CONNECTION, CG_CONNECTION_REENTERSERVER_SYN, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO(CG_CONNECTION, CG_CONNECTION_ENTERVILLAGEREQ_SYN, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO(CG_CONNECTION, CG_PREPARE_WORLD_CONNECT_SYN, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO(CG_CONNECTION, CG_CONNECTION_NOTIFY_LOGOUT_SYN, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO(CG_CONNECTION, CG_CONNECTION_CRASH_REPORT_SYN, PHASE_UNLIMITED),
|
||
#ifdef __NA001334_090420_SERVER_SELECT_FACILITY__
|
||
ADD_HANDLER_INFO(CG_CONNECTION, CG_CONNECTION_SERVER_SELECT_REQUEST_SYN, PHASE_UNLIMITED),
|
||
#endif
|
||
#ifdef _JP_20110222_INGAME_CHARNAME_CHANGE
|
||
ADD_HANDLER_INFO(CG_CONNECTION, CG_CHARNAME_CHANGE_SYN, PHASE_UNLIMITED),
|
||
#endif
|
||
ADD_HANDLER_INFO(CG_CONNECTION, CG_CONNECTION_HACKER_SYN, PHASE_UNLIMITED), //添加外挂检测 by:十里坡剑神 2021-07-01
|
||
ADD_HANDLER_INFO_EOR(),
|
||
};
|
||
|
||
return s_pHandlerInfo;
|
||
};
|
||
|
||
sPACKET_HANDLER_INFO* Handler_CG::GetHandlerInfo_ETC()
|
||
{
|
||
static sPACKET_HANDLER_INFO s_pHandlerInfo[] =
|
||
{
|
||
ADD_HANDLER_INFO(CG_ETC, CG_ETC_GET_BATTLE_OPEN_TIME_SYN, PHASE_UNLIMITED),
|
||
|
||
#if !defined _NA_0_20110613_GAME_SHOP_RENEWAL
|
||
#ifdef __NA000000_SHOP_USERID_50_PASSING_PROC__
|
||
ADD_HANDLER_INFO(CG_SHOP, CG_SHOP_SEND_GIFT_SYN, PHASE_UNLIMITED),
|
||
#endif
|
||
#endif //#if !defined _NA_0_20110613_GAME_SHOP_RENEWAL
|
||
|
||
#ifdef _NA_0_20110329_GAMEOPTION_SETTING
|
||
ADD_HANDLER_INFO(CG_ETC, CG_ETC_GAMEOPTION_LOAD_SYN, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO(CG_ETC, CG_ETC_GAMEOPTION_SAVE_SYN, PHASE_UNLIMITED),
|
||
#endif //_NA_0_20110329_GAMEOPTION_SETTING
|
||
#ifdef _NA004034_20120102_GUILD_POINT_SYSTEM
|
||
ADD_HANDLER_INFO(CG_ETC, CG_ETC_GUILD_RANKINGINFO_SYN, PHASE_UNLIMITED),
|
||
ADD_HANDLER_INFO(CG_ETC, CG_ETC_GUILDINFO_SYN, PHASE_UNLIMITED),
|
||
#endif //_NA004034_20120102_GUILD_POINT_SYSTEM
|
||
|
||
//_NA_000000_20120410_SPEEDHACK
|
||
ADD_HANDLER_INFO(CG_ETC, CG_ETC_MEMORY_HACK_CMD, PHASE_UNLIMITED),
|
||
|
||
ADD_HANDLER_INFO_EOR(),
|
||
};
|
||
|
||
return s_pHandlerInfo;
|
||
};
|
||
|
||
#pragma pack(push, 1)
|
||
struct AcceptCategoryNode
|
||
{
|
||
BYTE Category;
|
||
BOOLEAN Delimeter;
|
||
};
|
||
#pragma pack(pop)
|
||
#define ACCEPT_CATEGORY(category) { category, 1 },
|
||
#define ACCEPT_CATEGORY_EOR() { 0, 0 }
|
||
|
||
VOID Handler_CG::RegisterHandler_ALL(PACKET_HANDLER_DELEGATOR pInstance)
|
||
{
|
||
static const AcceptCategoryNode kAcceptFilters[] =
|
||
{
|
||
ACCEPT_CATEGORY(CG_CONNECTION)
|
||
ACCEPT_CATEGORY(CG_CHARINFO)
|
||
ACCEPT_CATEGORY(CG_MAP)
|
||
ACCEPT_CATEGORY(CG_SYNC)
|
||
ACCEPT_CATEGORY(CG_BATTLE)
|
||
ACCEPT_CATEGORY(CG_STYLE)
|
||
ACCEPT_CATEGORY(CG_SKILL)
|
||
ACCEPT_CATEGORY(CG_CONVERSATION)
|
||
ACCEPT_CATEGORY(CG_ZONE)
|
||
ACCEPT_CATEGORY(CG_ITEM)
|
||
ACCEPT_CATEGORY(CG_TRADE)
|
||
ACCEPT_CATEGORY(CG_PARTY)
|
||
ACCEPT_CATEGORY(CG_TRIGGER)
|
||
ACCEPT_CATEGORY(CG_GM)
|
||
ACCEPT_CATEGORY(CG_ETC)
|
||
ACCEPT_CATEGORY(CG_STATUS)
|
||
ACCEPT_CATEGORY(CG_VENDOR)
|
||
ACCEPT_CATEGORY(CG_WAREHOUSE)
|
||
ACCEPT_CATEGORY(CG_PVP)
|
||
ACCEPT_CATEGORY(CG_SUMMON)
|
||
ACCEPT_CATEGORY(CG_GUILD)
|
||
ACCEPT_CATEGORY(CG_EVENT)
|
||
ACCEPT_CATEGORY(CG_QUEST)
|
||
ACCEPT_CATEGORY(CG_CRYPTOGRAPHY)
|
||
ACCEPT_CATEGORY(CG_ARMORKIT)
|
||
ACCEPT_CATEGORY(CG_CHUNTING)
|
||
ACCEPT_CATEGORY(CG_AREACONQUEST)
|
||
ACCEPT_CATEGORY(CG_MISSION)
|
||
ACCEPT_CATEGORY(CG_ZONE_EX)
|
||
ACCEPT_CATEGORY(CG_WAYPOINT)
|
||
ACCEPT_CATEGORY(CG_CHAO)
|
||
ACCEPT_CATEGORY(CG_SHOP)
|
||
ACCEPT_CATEGORY(CG_ZONE_EX)
|
||
ACCEPT_CATEGORY(CG_COLLECT)
|
||
//
|
||
ACCEPT_CATEGORY_EOR()
|
||
};
|
||
#ifdef _NA000000_CW_PROTOCOL_UNIFICATION
|
||
static const AcceptCategoryNode kAcceptFilters_CW[] =
|
||
{
|
||
ACCEPT_CATEGORY(CW_CONNECTION)
|
||
ACCEPT_CATEGORY(CW_CHAT)
|
||
ACCEPT_CATEGORY(CW_GM)
|
||
ACCEPT_CATEGORY(CW_VIEWPORT)
|
||
ACCEPT_CATEGORY(CW_ARMORKIT)
|
||
ACCEPT_CATEGORY(CW_FRIEND)
|
||
ACCEPT_CATEGORY(CW_GUILD)
|
||
ACCEPT_CATEGORY(CW_CRYPTOGRAPHY)
|
||
ACCEPT_CATEGORY(CW_COMMUNITY)
|
||
ACCEPT_CATEGORY(CW_REVENGE)
|
||
ACCEPT_CATEGORY(CW_MEMO)
|
||
ACCEPT_CATEGORY(CW_GROUP)
|
||
ACCEPT_CATEGORY(CW_LOTTO)
|
||
ACCEPT_CATEGORY(CW_PARTY)
|
||
//
|
||
ACCEPT_CATEGORY_EOR()
|
||
};
|
||
BOOST_STATIC_ASSERT(CATEGORY_GENERATOR_065 == CG_MAX);
|
||
BOOST_STATIC_ASSERT(CATEGORY_GENERATOR_165 == CG_MAX_PACK);
|
||
for (const AcceptCategoryNode* node_it = kAcceptFilters; node_it->Delimeter; ++node_it) {
|
||
pInstance->RegisterFowardHandlerGroupCG(UPT_USER, node_it->Category);
|
||
};
|
||
for (const AcceptCategoryNode* node_it = kAcceptFilters_CW; node_it->Delimeter; ++node_it) {
|
||
pInstance->RegisterFowardHandlerGroupCW(UPT_USER, node_it->Category);
|
||
};
|
||
#else
|
||
BOOST_STATIC_ASSERT(CATEGORY_GENERATOR_037 == CG_MAX);
|
||
BOOST_STATIC_ASSERT(CATEGORY_GENERATOR_136 == CG_MAX_PACK);
|
||
for (const AcceptCategoryNode* node_it = kAcceptFilters; node_it->Delimeter; ++node_it) {
|
||
pInstance->RegisterFowardHandlerGroupCG(UPT_USER, node_it->Category);
|
||
};
|
||
#endif
|
||
|
||
pInstance->RegisterHandlerCA_<UPT_USER>(GetHandlerInfo());
|
||
pInstance->RegisterHandlerCA_<UPT_USER>(GetHandlerInfo_CHARINFO());
|
||
pInstance->RegisterHandlerCA_<UPT_USER>(GetHandlerInfo_SYNC());
|
||
pInstance->RegisterHandlerCA_<UPT_USER>(GetHandlerInfo_ZONE());
|
||
pInstance->RegisterHandlerCA_<UPT_USER>(GetHandlerInfo_PARTY());
|
||
pInstance->RegisterHandlerCA_<UPT_USER>(GetHandlerInfo_GM());
|
||
pInstance->RegisterHandlerCA_<UPT_USER>(GetHandlerInfo_SECURE());
|
||
pInstance->RegisterHandlerCA_<UPT_USER>(GetHandlerInfo_ETC());
|
||
|
||
pInstance->RegisterHandlerCA_<UPT_USER>(GetHandlerInfo_Event());
|
||
#if !defined _NA_0_20110613_GAME_SHOP_RENEWAL
|
||
#ifdef __NA000000_SHOP_USERID_50_PASSING_PROC__
|
||
// Block-以后这个也要分开拿吗?不,例外事项很少,就这样放着吧...
|
||
static sPACKET_HANDLER_INFO s_pHandlerInfo[] =
|
||
{
|
||
{ MAKEWORD(CG_SHOP, CG_SHOP_SEND_GIFT_RELAY_SYN),
|
||
PHASE_UNLIMITED, (PH_fnHandler)&PacketHandlerShared::OnUSER_EMPTY_HANDLER },
|
||
ADD_HANDLER_INFO_EOR(),
|
||
};
|
||
pInstance->RegisterHandlerCA_<UPT_USER>(s_pHandlerInfo);
|
||
#endif
|
||
#endif //#if !defined _NA_0_20110613_GAME_SHOP_RENEWAL
|
||
|
||
#ifdef __NA000000_081104_REGISTERED_PROTOCOL_NAMES__
|
||
pInstance->RegisterHandlerNames();
|
||
#endif
|
||
}
|
||
|
||
//
|
||
//
|
||
//
|
||
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||
//
|
||
//
|
||
//
|
||
|
||
#include <PacketStruct_AG.h>
|
||
#include <PacketStruct_AD.h>
|
||
#include <PacketStruct_CG.h>
|
||
#include <PacketStruct_AZ.h>
|
||
#include <PacketStruct_AW.h>
|
||
#include <PacketStruct_AM.h>
|
||
#include <Protocol_AW.h>
|
||
#include <ResultCode.h>
|
||
#include <SolarLog.h>
|
||
#include <UserSessions/User.h>
|
||
#include <UserSessions/UserManager.h>
|
||
#include <Zone/LobbyRoom.h>
|
||
#include <Zone/HuntingRoom.h>
|
||
#include <Zone/MissionRoom.h>
|
||
#include <Zone/CharSelect.h>
|
||
#include <Zone/PVPRoom.h>
|
||
#include <Zone/Village.h>
|
||
#include <TimeCheck/HeartbeatManager.h>
|
||
#include <AgentServer.h>
|
||
#include <ServerSessions/ServerSessionManager.h>
|
||
#include <ServerSessions/ServerSessionEx.h>
|
||
#include <Zone/ZoneManager.h>
|
||
#include <Party/PartyManager.h>
|
||
#include "MapInfoParser.h"
|
||
#include <Zone/CHuntingRoom.h>
|
||
#include <Zone/HuntingField.h>
|
||
#include <Zone/PortalManager.h>
|
||
|
||
#include <ProhibitionWordParser.h>
|
||
|
||
#include <CurseTowerTimeParser.h>
|
||
|
||
#include <SSQ/SSQInfoParser.h>
|
||
#include <Zone/WarControlManager.h>
|
||
|
||
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||
|
||
HANDLER_CG_IMPL(CG_PREPARE_WORLD_CONNECT_SYN)
|
||
{
|
||
__TOUCHED((pUser, pMsg, wSize));
|
||
#ifdef _NA002676_WORLD_SERVER_RENEWAL
|
||
ASSERT(!"does not support anymore");
|
||
return;
|
||
#else
|
||
MSG_CG_PREPARE_WORLD_CONNECT_SYN* pRecvMsg = (MSG_CG_PREPARE_WORLD_CONNECT_SYN *)pMsg;
|
||
|
||
// 需要检查是否与世界服务器连接
|
||
WorldServerSession* pWorldServer = AgentServer::GetInstance()->SessionWorldServer();
|
||
if (!(pWorldServer && pWorldServer->IsConnected()))
|
||
{
|
||
MSG_CG_PREPARE_WORLD_CONNECT_NAK nmsg;
|
||
pUser->SendPacket(&nmsg, sizeof(nmsg));
|
||
return;
|
||
}
|
||
|
||
// 恢复分组传输
|
||
MSG_AW_USER_RESTORE_CMD cmsg;
|
||
|
||
cmsg.dwAuthUserID = pUser->GetAuthID();
|
||
cmsg.dwUserGUID = pUser->GetUserGUID();
|
||
cmsg.dwZoneKey = pUser->GetZoneKey();
|
||
cmsg.byZoneType = pUser->GetZoneType();
|
||
cmsg.m_dwKey = pUser->GetUserKey();
|
||
cmsg.byGMGrade = pUser->GetSts();
|
||
cmsg.m_CharClass = pUser->GetCharClass();
|
||
|
||
if (cmsg.byZoneType != eZONETYPE_CHARSELECT)
|
||
{
|
||
cmsg.CharGuid = pUser->GetSelectedCharGuid();
|
||
memset(cmsg.tszCharName, 0, sizeof(TCHAR)*MAX_CHARNAME_LENGTH);
|
||
_tcsncpy(cmsg.tszCharName, pUser->GetSelectedCharName(), MAX_CHARNAME_LENGTH);
|
||
}
|
||
else
|
||
{
|
||
cmsg.CharGuid = 0;
|
||
memset(cmsg.tszCharName, 0, sizeof(TCHAR)*MAX_CHARNAME_LENGTH);
|
||
}
|
||
|
||
// 加入队伍时恢复队伍信息
|
||
if (pUser->GetPlayerKey())
|
||
{
|
||
cmsg.wPartyKey = pUser->GetPartyState().GetPartyKey();
|
||
}
|
||
else
|
||
{
|
||
cmsg.wPartyKey = 0;
|
||
}
|
||
|
||
cmsg.dwPCRoomID = pUser->GetReservedValue(); // 设置是否为网吧
|
||
cmsg.m_GuildGuid = pUser->GetSelectedCharGuildGuid();
|
||
CHECK_ID_LENGTH_BUFFER(cmsg.ptszAccountID);
|
||
_tcsncpy(cmsg.ptszAccountID, pUser->GetUserID(), _countof(cmsg.ptszAccountID));
|
||
cmsg.ptszAccountID[_countof(cmsg.ptszAccountID) - 1] = '\0';
|
||
memcpy(cmsg.pszClientIP, pUser->GetClientIP(), IP_MAX_LEN);
|
||
cmsg.m_CharLevel = pUser->GetCharLV();
|
||
pWorldServer->SendPacket(&cmsg, sizeof(MSG_AW_USER_RESTORE_CMD));
|
||
|
||
SUNLOG(eFULL_LOG, "[Guid:%u] User Restore To World[ZT:%u][ZK:%u]", pUser->GetUserGUID(), cmsg.byZoneType, cmsg.dwZoneKey);
|
||
/*
|
||
// 告诉玩家进入世界服务器~
|
||
MSG_CG_PREPARE_WORLD_CONNECT_ACK amsg;
|
||
amsg.m_byCategory = CG_CONNECTION;
|
||
amsg.m_byProtocol = CG_PREPARE_WORLD_CONNECT_ACK;
|
||
|
||
if(g_AgentServer.GetServerEnv()->bGetServerInfoFromFile == 1)
|
||
{
|
||
// 从文件读取的地址
|
||
strncpy(amsg.szWorldServerIP, g_AgentServer.GetServerEnv()->pszWorldServerClientIP, IP_MAX_LEN);
|
||
amsg.wWorldServerPort = g_AgentServer.GetServerEnv()->wWorldServerClientPort;
|
||
}
|
||
else
|
||
{
|
||
strncpy(amsg.szWorldServerIP, g_AgentServer.GetWorldServerClientIP().c_str(), IP_MAX_LEN);
|
||
amsg.wWorldServerPort = g_AgentServer.GetWorldServerClientPort();
|
||
}
|
||
|
||
pUser->SendPacket(&amsg, sizeof(amsg));
|
||
MessageOut(eFULL_LOG, "[Guid:%u] User Restore Msg To Client", pUser->GetUserGUID());
|
||
*/
|
||
|
||
/*
|
||
MSG_AW_PREPARE_NEW_USER_SYN msg;
|
||
msg.m_byCategory = AW_CONNECTION;
|
||
msg.m_byProtocol = AW_PREPARE_NEW_USER_SYN;
|
||
msg.m_dwKey = pUser->GetUserKey();
|
||
msg.dwAuthUserID = pUser->GetAuthID();
|
||
msg.dwUserGuid = pUser->GetUserGUID();
|
||
msg.byUserStatus = pUser->GetZoneType();
|
||
|
||
strncpy(msg.szClientIP, pUser->GetClientIP(), IP_MAX_LEN);
|
||
if(strcmp(pUser->>GetSelectedCharName(), "") == 0)
|
||
{
|
||
strcpy(msg.szCharName, "");
|
||
}
|
||
else
|
||
{
|
||
strncpy(msg.szCharName, pUser->GetSelectedCharName(), MAX_CHARNAME_LENGTH);
|
||
}
|
||
|
||
//printf("从Clara那里收到CG_PREPARE_WORLD_CONNECT_SYN(%d)\n", pUser->GetUserKey());
|
||
|
||
if(!pUser->SendToWorldServer(&msg, sizeof(msg)))
|
||
{
|
||
MSG_CG_PREPARE_WORLD_CONNECT_NAK nmsg;
|
||
pUser->SendPacket(&nmsg, sizeof(nmsg));
|
||
return;
|
||
}
|
||
*/
|
||
#endif //if !defined(_NA002676_WORLD_SERVER_RENEWAL)
|
||
}
|
||
|
||
HANDLER_CG_IMPL(CG_SYNC_PLAYER_ENTER_SYN)
|
||
{
|
||
__TOUCHED((pMsg, wSize));
|
||
MSG_CG_SYNC_PLAYER_ENTER_SYN* pRecvMsg = (MSG_CG_SYNC_PLAYER_ENTER_SYN *)pMsg;
|
||
|
||
BOOL bIsValidSize = (BOOL)(sizeof(MSG_CG_SYNC_PLAYER_ENTER_SYN) == wSize);
|
||
if (!bIsValidSize)
|
||
{
|
||
SUNLOG(eDEV_LOG, _T("[RNDPROTOCOL_REPORT][SIZE] MSG_CG_SYNC_PLAYER_ENTER_SYN"));
|
||
return;
|
||
}
|
||
|
||
if (pUser->IsBeginTransaction())
|
||
{
|
||
MSG_CG_SYNC_PLAYER_ENTER_NAK nmsg;
|
||
nmsg.m_dwErrorCode = RC::RC_ROOM_ALREADY_DOING_TRANSACTION;
|
||
pUser->SendPacket(&nmsg, sizeof(nmsg));
|
||
return;
|
||
}
|
||
|
||
eZONE_STATE zsSTATE = pUser->GetZoneState();
|
||
|
||
// 1)除了ePRS_BEFORE_ENTER_LOBBY | ePRS_AT_LOBBY的情况外,PLAYER_ENTER_SYN中
|
||
// STATUS:TRANSACTION状态,QUERYBUILTIN的Transaction必须解决。
|
||
// 2)离开这个条件的满足与否,直接通过.
|
||
if (ePRS_BEFORE_ENTER_LOBBY != zsSTATE)
|
||
{
|
||
SecurePackNode4User& rSECURE = pUser->GetSecureNode();
|
||
sSECURE_FLAG& rSECURE_FLAG = rSECURE.SECURE_FLAG();
|
||
if (rSECURE_FLAG.QUERYBUILTIN.IsTransaction())
|
||
{
|
||
// Notify to MASTER
|
||
SECURELOG(SECURELOG_USERINFO(pUser, eABUSE_LOGIC_VIOLATION, eABUSE_SUB_LOGIC_VIOLATION_ASSERTION_FLOW)
|
||
, "Assertion Flow Violation : Transaction Tic-Toc { %u }", zsSTATE);
|
||
}
|
||
}
|
||
|
||
switch (zsSTATE)
|
||
{
|
||
case ePRS_BEFORE_ENTER_VILLAGE:
|
||
case ePRS_BEFORE_ENTER_FIELD:
|
||
case ePRS_BEFORE_ENTER_LOBBY:
|
||
case ePRS_BEFORE_ENTER_HUNTING:
|
||
case ePRS_BEFORE_ENTER_MISSION:
|
||
case ePRS_BEFORE_ENTER_CHUNTING:
|
||
case ePRS_BEFORE_ENTER_PVP:
|
||
case ePRS_BEFORE_ENTER_INSTNACE:
|
||
case ePRS_BEFORE_ENTER_DOMINATION_FIELD:
|
||
case ePRS_BEFORE_ENTER_SPA_FIELD:
|
||
{
|
||
MSG_AG_SYNC_PLAYER_ENTER_SYN msg;
|
||
ZeroMemory(&msg.checksum_list_, sizeof(msg.checksum_list_));
|
||
msg.checksum_list_.checksum_map = pRecvMsg->m_dwCheckSum;
|
||
msg.checksum_list_.checksum_wmo = pRecvMsg->checksum_wmo_;
|
||
// NOTE:f100916.2L, 支持代理服务器虚拟客户端
|
||
msg.is_dummy_client_test_ = USING_DUMMY_CLIENT;
|
||
msg.tail_guard_ = -1;
|
||
// 发送同一分组
|
||
pUser->SendToLinkedServer(&msg, sizeof(msg));
|
||
}
|
||
break;
|
||
case ePRS_AT_VILLAGE:
|
||
case ePRS_AT_LOBBY:
|
||
case ePRS_AT_HUNTING:
|
||
case ePRS_AT_MISSION:
|
||
case ePRS_AT_PVP:
|
||
case ePRS_AT_CHUNTING:
|
||
case ePRS_AT_INSTANCE:
|
||
case ePRS_AT_DOMINATION_FIELD:
|
||
case ePRS_AT_SPA_FIELD:
|
||
{
|
||
// 迁移到同一区域中的其他内部字段
|
||
MSG_AG_SYNC_PLAYER_WARP_SYN msg;
|
||
ZeroMemory(&msg.checksum_list_, sizeof(msg.checksum_list_));
|
||
msg.checksum_list_.checksum_map = pRecvMsg->m_dwCheckSum;
|
||
msg.checksum_list_.checksum_wmo = pRecvMsg->checksum_wmo_;
|
||
// NOTE:f100916.2L, 支持代理服务器虚拟客户端
|
||
msg.is_dummy_client_test_ = USING_DUMMY_CLIENT;
|
||
msg.tail_guard_ = -1;
|
||
// 发送同一分组
|
||
pUser->SendToLinkedServer(&msg, sizeof(msg));
|
||
}
|
||
break;
|
||
default:
|
||
{
|
||
MSG_CG_SYNC_PLAYER_ENTER_NAK nmsg;
|
||
nmsg.m_dwErrorCode = 8787878;
|
||
pUser->SendPacket(&nmsg, sizeof(nmsg));
|
||
SUNLOG(eCRITICAL_LOG, "MSG_CG_SYNC_PLAYER_ENTER_SYN:[?%u???.]", pUser->GetZoneState());
|
||
return;
|
||
}
|
||
}
|
||
|
||
pUser->GetSecureNode().EnableHeartbeats(true);
|
||
}
|
||
|
||
HANDLER_CG_IMPL(CG_CONNECTION_REENTERSERVER_SYN)
|
||
{
|
||
__TOUCHED((pMsg, wSize));
|
||
MSG_CG_CONNECTION_REENTERSERVER_SYN* pRecvMsg = (MSG_CG_CONNECTION_REENTERSERVER_SYN *)pMsg;
|
||
|
||
BOOL bIsValidSize = (BOOL)((WORD)sizeof(MSG_CG_CONNECTION_REENTERSERVER_SYN) == wSize);
|
||
if (!bIsValidSize)
|
||
{
|
||
SUNLOG(eDEV_LOG, _T("[RNDPROTOCOL_REPORT][SIZE] CG_CONNECTION_REENTERSERVER_SYN"));
|
||
return;
|
||
}
|
||
|
||
pUser->GetSecureNode().EnableHeartbeats(true);
|
||
|
||
if (pUser->IsBeginTransaction())
|
||
{
|
||
MSG_CG_CONNECTION_ENTERSERVER_NAK nmsg;
|
||
nmsg.m_dwErrorCode = RC::RC_ROOM_ALREADY_DOING_TRANSACTION;
|
||
pUser->SendPacket(&nmsg, sizeof(nmsg));
|
||
return;
|
||
}
|
||
|
||
pUser->BeginTransaction(TR_CHARACTER_LIST);
|
||
|
||
MSG_AD_CHARINFO_CHARLISTREQ_SYN msg;
|
||
msg.m_dwKey = pUser->GetUserKey();
|
||
msg.m_UserGuid = pUser->GetUserGUID();
|
||
msg.m_bIsPCRoom = !!pUser->GetReservedValue(); //确认是否是网吧玩家, (WAVERIX) (090820) (CHANGES)
|
||
#ifdef __CN_OO0510__FATIGUE_MATCHING_UPDATE
|
||
msg.m_LoginTime = pUser->GetLoginTime_t();
|
||
if ((pUser->GetAge() >= 18) && (pUser->GetRealNameAuth() == 1))
|
||
msg.m_bFatigueUser = FALSE;
|
||
else
|
||
msg.m_bFatigueUser = TRUE;
|
||
#endif
|
||
#ifdef _JP_0_20100723_GAMECHU_AUTHFLOW_
|
||
msg.gamechu_usn_ = pUser->GetGameChuUSN();
|
||
#endif
|
||
#ifdef _NA_20100307_BETAKEY_SYSTEM
|
||
msg.betakey_ = pUser->GetBetaKeyInfo()->GetBetaKey();
|
||
#endif
|
||
|
||
msg.m_bBackToSelect = true;
|
||
msg.m_ChannelID = AgentServer::GetInstance()->GetKey().GetChannelID();
|
||
|
||
if (FALSE == pUser->SendToDBPServer(&msg, sizeof(msg)))
|
||
{
|
||
MSG_CG_CONNECTION_ENTERSERVER_NAK nmsg;
|
||
nmsg.m_dwErrorCode = 77;
|
||
pUser->SendPacket(&nmsg, sizeof(nmsg));
|
||
SUNLOG(eFULL_LOG, "[HANDLER_FROMCLIENT_IMPL(CG_CONNECTION_REENTERSERVER_SYN)] [U:%d]无法获得角色列表而断开.77", pUser->GetUserKey());
|
||
pUser->SetDisconnectCode(RC::RC_DISCONNECT_DBP_CONNETION_ERROR);
|
||
pUser->DisconnectUser();
|
||
|
||
pUser->EndTransaction();
|
||
return;
|
||
}
|
||
}
|
||
|
||
HANDLER_CG_IMPL(CG_CHARINFO_CREATE_SYN)
|
||
{
|
||
__TOUCHED((pMsg, wSize));
|
||
MSG_CG_CHARINFO_CREATE_SYN* pRecvMsg = (MSG_CG_CHARINFO_CREATE_SYN *)pMsg;
|
||
|
||
BOOL bIsValidSize = (BOOL)(sizeof(MSG_CG_CHARINFO_CREATE_SYN) == wSize);
|
||
if (!bIsValidSize)
|
||
{
|
||
SUNLOG(eDEV_LOG, _T("[RNDPROTOCOL_REPORT][SIZE] CHAR CREATE"));
|
||
return;
|
||
}
|
||
// CHANGES: f110825.1L, 恢复到原始过滤顺序.
|
||
// 逻辑上是内容过滤器的BetaKeyImpl不是基本的对象控制逻辑.
|
||
if (pUser->IsBeginTransaction())
|
||
{
|
||
MSG_CG_CHARINFO_CREATE_NAK msg_nak;
|
||
msg_nak.m_dwErrorCode = RC::RC_CHAR_CREATE_ALREADY_DOING_TRANSACTION;
|
||
pUser->SendPacket(&msg_nak, sizeof(msg_nak));
|
||
return;
|
||
};
|
||
// CHANGES: f110825.1L,防止意外的数据包流
|
||
if (pUser->GetZoneState() != ePRS_AT_CHARSELECT)
|
||
{
|
||
MSG_CG_CHARINFO_CREATE_NAK msg_nak;
|
||
msg_nak.m_dwErrorCode = RC::RC_CHAR_CREATE_ALREADY_DOING_TRANSACTION;
|
||
pUser->SendPacket(&msg_nak, sizeof(msg_nak));
|
||
return;
|
||
};
|
||
#if defined(_NA_20100307_BETAKEY_SYSTEM) && defined(_NA_002050_20110216_ADD_GENDER)
|
||
if (!BetaKeyImpl::CanCreateCharacter(pUser->GetBetaKeyInfo(), pRecvMsg->m_byClass, pRecvMsg->gender))
|
||
{
|
||
MSG_CG_CHARINFO_CREATE_NAK nmsg;
|
||
nmsg.m_dwErrorCode = RC::RC_CHAR_CREATE_CANNOT_BETAKEY;
|
||
pUser->SendPacket(&nmsg, sizeof(nmsg));
|
||
return;
|
||
}
|
||
#endif
|
||
|
||
const DWORD ACCEPTABLE_CHARMASK = (1 << eCHAR_BERSERKER) |
|
||
(1 << eCHAR_SHADOW) |
|
||
(1 << eCHAR_DRAGON) |
|
||
(1 << eCHAR_VALKYRIE) |
|
||
(1 << eCHAR_ELEMENTALIST) |
|
||
(1 << eCHAR_HELLROID) | //_NA_000000_20130812_NEW_CHARACTER_HELLROID
|
||
#ifdef _NA_007514_20140828_NEW_CHARACTER_WITCHBLADE
|
||
(1 << eCHAR_WITCHBLADE) |
|
||
#endif //_NA_007514_20140828_NEW_CHARACTER_WITCHBLADE
|
||
(1 << eCHAR_MYSTIC); // _NA_004965_20120613_NEW_CHARACTER_MYSTIC
|
||
|
||
DWORD dwClassBit = (1 << (DWORD)pRecvMsg->m_byClass);
|
||
|
||
if (!(ACCEPTABLE_CHARMASK & dwClassBit)
|
||
|| pUser->GetState() < CHARACTER_LIST_STATE
|
||
|| pUser->GetNumberOfCreatedChars() >= MAX_CHARACTER_SLOT_NUM)
|
||
{
|
||
MSG_CG_CHARINFO_CREATE_NAK nmsg;
|
||
nmsg.m_dwErrorCode = RC::RC_CHAR_CREATE_INVALID_PARAM;
|
||
pUser->SendPacket(&nmsg, sizeof(nmsg));
|
||
return;
|
||
}
|
||
|
||
util::cSTRING_REF strCharNameRD(pRecvMsg->m_pszCharName, sizeof(pRecvMsg->m_pszCharName));
|
||
util::cSTRING_REF_RW_WITH_BUFFER<sizeof(TCHAR)*(MAX_CHARNAME_LENGTH + 1)> strCharNameRW;
|
||
|
||
strCharNameRW.CopyFrom(strCharNameRD);
|
||
strCharNameRW.MakeSafeString();
|
||
|
||
// 韩文2字,英文2字以上
|
||
//是独角兽的时候小心!!!韩文是2字是2
|
||
if (strCharNameRW.GetSTRING_LENGTH() < 4)
|
||
{
|
||
MSG_CG_CHARINFO_CREATE_NAK nmsg;
|
||
nmsg.m_dwErrorCode = RC::RC_CHAR_CREATE_MINIMUM_CHARACTER;
|
||
pUser->SendPacket(&nmsg, sizeof(nmsg));
|
||
return;
|
||
}
|
||
|
||
//20070131_特殊文字使用 NAK
|
||
#ifdef _NA_0_20100929_LANGUAGE_OF_FILTER
|
||
BYTE Language = ServerOptionParserEx::Instance()->GetServerOption().m_byLanguageOfFilter;
|
||
if (!ProhibitionWordParser::Instance()->VerifyCharName(strCharNameRW, Language))
|
||
#else
|
||
if (!ProhibitionWordParser::Instance()->VerifyCharName(strCharNameRW))
|
||
#endif
|
||
{
|
||
//需要客户端消息
|
||
MSG_CG_CHARINFO_CREATE_NAK nmsg;
|
||
nmsg.m_dwErrorCode = RC::RC_CHAR_CREATE_CHARNAME_BAN_WORD;
|
||
pUser->SendPacket(&nmsg, sizeof(nmsg));
|
||
return;
|
||
}
|
||
|
||
MSG_AD_CHARINFO_CREATE_SYN msg;
|
||
msg.m_dwKey = pUser->GetUserKey();
|
||
msg.m_UserGuid = pUser->GetUserGUID();
|
||
_tcsncpy(msg.m_tszUserID, pUser->GetUserID(), ID_MAX_LEN);
|
||
msg.m_tszUserID[ID_MAX_LEN] = '\0';
|
||
msg.m_byClass = pRecvMsg->m_byClass;
|
||
_tcsncpy(msg.m_tszCharName, strCharNameRW.GetBUFFER(), MAX_CHARNAME_LENGTH);
|
||
msg.m_tszCharName[MAX_CHARNAME_LENGTH] = '\0';
|
||
msg.m_byHeight = pRecvMsg->m_byHeight;
|
||
msg.m_byFace = pRecvMsg->m_byFace;
|
||
msg.m_byHair = pRecvMsg->m_byHair;
|
||
#ifdef _NA_002050_20110216_ADD_GENDER
|
||
msg.gender = pRecvMsg->gender;
|
||
#endif
|
||
if (FALSE == pUser->SendToDBPServer(&msg, sizeof(msg)))
|
||
{
|
||
MSG_CG_CHARINFO_CREATE_NAK nmsg;
|
||
nmsg.m_dwErrorCode = RC::RC_CHAR_CREATE_DISCONNECTED_DBPROXY;
|
||
pUser->SendPacket(&nmsg, sizeof(nmsg));
|
||
pUser->EndTransaction();
|
||
return;
|
||
}
|
||
|
||
pUser->BeginTransaction(TR_CHARACTER_CREATION);
|
||
}
|
||
|
||
HANDLER_CG_IMPL(CG_CHARINFO_DESTROY_SYN)
|
||
{
|
||
__TOUCHED((pMsg, wSize));
|
||
MSG_CG_CHARINFO_DESTROY_SYN* pRecvMsg = (MSG_CG_CHARINFO_DESTROY_SYN *)pMsg;
|
||
|
||
if (pUser->IsBeginTransaction())
|
||
{
|
||
MSG_CG_CHARINFO_DESTROY_NAK nmsg;
|
||
nmsg.m_dwErrorCode = RC::RC_CHAR_DESTROY_ALREADY_DOING_TRANSACTION;
|
||
pUser->SendPacket(&nmsg, sizeof(nmsg));
|
||
return;
|
||
}
|
||
// CHANGES: f110825.1L, 防止意外的数据包流
|
||
if (pUser->GetZoneState() != ePRS_AT_CHARSELECT)
|
||
{
|
||
MSG_CG_CHARINFO_DESTROY_NAK msg_nak;
|
||
msg_nak.m_dwErrorCode = RC::RC_CHAR_DESTROY_ALREADY_DOING_TRANSACTION;
|
||
pUser->SendPacket(&msg_nak, sizeof(msg_nak));
|
||
return;
|
||
};
|
||
|
||
BYTE CharIndex = pRecvMsg->m_bySelectedCharSlotIndex;
|
||
if (pUser->GetState() < CHARACTER_LIST_STATE ||
|
||
pUser->GetNumberOfCreatedChars() == 0 ||
|
||
CharIndex >= MAX_CHARACTER_SLOT_NUM ||
|
||
!pUser->IsValidSlot(CharIndex))
|
||
{
|
||
MSG_CG_CHARINFO_DESTROY_NAK nmsg;
|
||
nmsg.m_dwErrorCode = RC::RC_CHAR_DESTROY_INVALID_PARAM;
|
||
pUser->SendPacket(&nmsg, sizeof(nmsg));
|
||
return;
|
||
}
|
||
|
||
if (pUser->IsCharDelete(CharIndex))
|
||
{
|
||
MSG_CG_CHARINFO_DESTROY_NAK nmsg;
|
||
nmsg.m_dwErrorCode = RC::RC_CHAR_DESTROY_DESTROIED;
|
||
pUser->SendPacket(&nmsg, sizeof(nmsg));
|
||
return;
|
||
}
|
||
|
||
//#if !(defined(_USA) || defined(_GLOBAL) || defined(_RUSSIA))
|
||
// //NorthA、GSP version不使用居民号码.
|
||
// // 身份证号码确认
|
||
// if(!pUser->IsEqualLastSSN(pRecvMsg->m_LastSocialSecurityNumber))
|
||
// {
|
||
// MSG_CG_CHARINFO_DESTROY_NAK nmsg;
|
||
// nmsg.m_dwErrorCode = RC::RC_CHAR_DESTROY_INCORRECT_SSN;
|
||
// pUser->SendPacket(&nmsg, sizeof(nmsg));
|
||
// return;
|
||
// }
|
||
//#endif
|
||
|
||
MSG_AD_CHARINFO_DESTROY_SYN msg;
|
||
msg.m_dwKey = pUser->GetUserKey();
|
||
msg.m_CharGuid = pUser->GetCharGUID(CharIndex);
|
||
if (FALSE == pUser->SendToDBPServer(&msg, sizeof(msg)))
|
||
{
|
||
MSG_CG_CHARINFO_DESTROY_NAK nmsg;
|
||
nmsg.m_dwErrorCode = RC::RC_CHAR_DESTROY_DISCONNECTED_DBPROXY;
|
||
pUser->SendPacket(&nmsg, sizeof(nmsg));
|
||
return;
|
||
}
|
||
pUser->BeginTransaction(TR_CHARACTER_DESTRUCTION);
|
||
}
|
||
|
||
HANDLER_CG_IMPL(CG_CHARINFO_RECOVER_SYN)
|
||
{
|
||
__TOUCHED((pMsg, wSize));
|
||
MSG_CG_CHARINFO_RECOVER_SYN* pRecvMsg = (MSG_CG_CHARINFO_RECOVER_SYN *)pMsg;
|
||
|
||
if (pUser->IsBeginTransaction())
|
||
{
|
||
MSG_CG_CHARINFO_RECOVER_NAK nmsg;
|
||
nmsg.m_dwErrorCode = RC::RC_CHAR_RECOVER_ALREADY_DOING_TRANSACTION;
|
||
pUser->SendPacket(&nmsg, sizeof(nmsg));
|
||
return;
|
||
}
|
||
// CHANGES: f110825.1L, 防止意外的数据包流
|
||
if (pUser->GetZoneState() != ePRS_AT_CHARSELECT)
|
||
{
|
||
MSG_CG_CHARINFO_RECOVER_NAK msg_nak;
|
||
msg_nak.m_dwErrorCode = RC::RC_CHAR_RECOVER_ALREADY_DOING_TRANSACTION;
|
||
pUser->SendPacket(&msg_nak, sizeof(msg_nak));
|
||
return;
|
||
};
|
||
BYTE CharIndex = pRecvMsg->m_bySelectedCharSlotIndex;
|
||
if (pUser->GetState() < CHARACTER_LIST_STATE ||
|
||
CharIndex >= MAX_CHARACTER_SLOT_NUM)
|
||
{
|
||
MSG_CG_CHARINFO_RECOVER_NAK nmsg;
|
||
nmsg.m_dwErrorCode = RC::RC_CHAR_RECOVER_INVALID_PARAM;
|
||
pUser->SendPacket(&nmsg, sizeof(nmsg));
|
||
return;
|
||
}
|
||
|
||
if (FALSE == pUser->IsCharDelete(CharIndex))
|
||
{
|
||
MSG_CG_CHARINFO_RECOVER_NAK nmsg;
|
||
nmsg.m_dwErrorCode = RC::RC_CHAR_RECOVER_NOTDESTROYED;
|
||
pUser->SendPacket(&nmsg, sizeof(nmsg));
|
||
return;
|
||
}
|
||
|
||
MSG_AD_CHARINFO_RECOVER_SYN msg;
|
||
msg.m_dwKey = pUser->GetUserKey();
|
||
msg.m_CharGuid = pUser->GetCharGUID(CharIndex);
|
||
if (FALSE == pUser->SendToDBPServer(&msg, sizeof(msg)))
|
||
{
|
||
MSG_CG_CHARINFO_RECOVER_NAK nmsg;
|
||
nmsg.m_dwErrorCode = RC::RC_CHAR_RECOVER_DISCONNECTED_DBPROXY;
|
||
pUser->SendPacket(&nmsg, sizeof(nmsg));
|
||
return;
|
||
}
|
||
|
||
pUser->BeginTransaction(TR_CHARACTER_RECOVERY);
|
||
}
|
||
|
||
#ifdef __NA_001044_ADD_CUSTOM_UI
|
||
HANDLER_CG_IMPL(CG_CHARINFO_CHARACTERID_CHECK_SYN)
|
||
{
|
||
__TOUCHED((pMsg, wSize));
|
||
MSG_CG_CHARINFO_CHARACTERID_CHECK_SYN* pRecvMsg = (MSG_CG_CHARINFO_CHARACTERID_CHECK_SYN *)pMsg;
|
||
|
||
if (pUser->IsBeginTransaction())
|
||
{
|
||
MSG_CG_CHARINFO_CHARACTERID_CHECK_NAK nmsg;
|
||
nmsg.m_dwErrorCode = RC::RC_CHAR_IDCHECK_ALREADY_DOING_TRANSACTION;
|
||
pUser->SendPacket(&nmsg, sizeof(nmsg));
|
||
return;
|
||
}
|
||
|
||
MSG_AD_CHARINFO_CHECK_CHARACTERID_SYN msg_syn;
|
||
msg_syn.m_dwKey = pUser->GetUserKey();
|
||
strncpy(msg_syn.m_szCharName, pRecvMsg->m_szCharName, _countof(msg_syn.m_szCharName));
|
||
msg_syn.m_szCharName[_countof(msg_syn.m_szCharName) - 1] = '\0';
|
||
if (FALSE == pUser->SendToDBPServer(&msg_syn, sizeof(msg_syn)))
|
||
{
|
||
MSG_CG_CHARINFO_CHARACTERID_CHECK_NAK nmsg;
|
||
nmsg.m_dwErrorCode = RC::RC_CHAR_IDCHECK_DISCONNECTED_DBPROXY;
|
||
pUser->SendPacket(&nmsg, sizeof(nmsg));
|
||
return;
|
||
}
|
||
|
||
pUser->BeginTransaction(TR_CHARACTER_IDCHECK);
|
||
}
|
||
#endif
|
||
|
||
HANDLER_CG_IMPL(CG_CONNECTION_BACKTOCHARSELECT_SYN)
|
||
{
|
||
__TOUCHED((pMsg, wSize));
|
||
MSG_CG_CONNECTION_BACKTOCHARSELECT_SYN* pRecvMsg = (MSG_CG_CONNECTION_BACKTOCHARSELECT_SYN *)pMsg;
|
||
|
||
if (pUser->IsBeginTransaction())
|
||
{
|
||
MSG_CG_CONNECTION_BACKTOCHARSELECT_NAK nmsg;
|
||
nmsg.m_dwErrorCode = 129;
|
||
pUser->SendPacket(&nmsg, sizeof(nmsg));
|
||
return;
|
||
}
|
||
|
||
// lobby,charselect状态阻止.
|
||
const DWORD blockFilter = (ePRS_AT_CHARSELECT | ePRS_AT_LOBBY) & ~ePRS_AT_ROOM;
|
||
|
||
// (WAVERIX) (090518) (BUG-FIX) 角色选择窗口返回状态检查错误修正
|
||
eZONE_STATE zoneState = pUser->GetZoneState();
|
||
//if(!(pUser->GetZoneState() & ePRS_AT_ZONE))
|
||
if ((zoneState & ePRS_AT_ZONE) != ePRS_AT_ZONE || (zoneState & blockFilter) != 0)
|
||
{
|
||
MSG_CG_CONNECTION_BACKTOCHARSELECT_NAK nmsg;
|
||
nmsg.m_dwErrorCode = 130;
|
||
pUser->SendPacket(&nmsg, sizeof(nmsg));
|
||
return;
|
||
}
|
||
|
||
#ifdef _NA_004707_20120416_1202_DELETE_RESERVATION_ROOM_LIST
|
||
AgentPartyManager* const party_manager = AgentPartyManager::Instance();
|
||
PartyRoomFinder* room_finder = party_manager->GetPartyRoomFinder();
|
||
if (room_finder != NULL)
|
||
{
|
||
room_finder->DeleteAllCharGuidFromMissionList(pUser->GetSelectedCharGuid());
|
||
}
|
||
#endif // _NA_004707_20120416_1202_DELETE_RESERVATION_ROOM_LIST
|
||
// _NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND
|
||
BattleGroundManager::Instance()->ProcessDisconnectUser(pUser, pUser->GetTRRoomKey(),
|
||
eREASON_LEAVE_PARTY_INTEND);
|
||
|
||
ZoneInterface* pZone = g_ZoneManager.FindZone(pUser->GetZoneKey());
|
||
if (!pZone) return;
|
||
|
||
// 任务进行中有意识地出去的话耐久度减少
|
||
if (pZone->GetUserNum() >= 2 && pZone->GetType() == eZONETYPE_MISSION)
|
||
{
|
||
MSG_AG_STATUS_DECREASE_DURA_CMD msg;
|
||
pUser->SendToLinkedServer(&msg, sizeof(msg));
|
||
}
|
||
|
||
CharSelect* pCharSelect = g_ZoneManager.FindCharSelect(1);
|
||
DWORD ToLinkServerIndex = pCharSelect != NULL ? pCharSelect->GetLinkedServerIndex() : 0;
|
||
|
||
pZone->LeaveUser(pUser, eSEND_SYN, eZONETYPE_CHARSELECT, ToLinkServerIndex);
|
||
|
||
pUser->BeginTransaction(TR_BACKTOSELECT);
|
||
|
||
// status chage (STAT_CRYPED && !STAT_CRYPTING) -> USERINIT
|
||
//连接不断地进入。
|
||
//发生难以判断的情况。如果是存在延迟的安全查询,状态将不满足。
|
||
//首先进入这里是至少到村子的情况,所以不是BUILTIN QUERY状态.
|
||
SecurePackNode4User& rSECURE = pUser->GetSecureNode();
|
||
sSECURE_FLAG& rSECURE_FLAG = rSECURE.SECURE_FLAG();
|
||
if (!rSECURE_FLAG.STATUS.IsTransaction()) // 是否已进入事务状态?
|
||
rSECURE_FLAG.STATUS.TransEnter();
|
||
}
|
||
|
||
HANDLER_CG_IMPL(CG_CONNECTION_NOTIFY_LOGOUT_SYN)
|
||
{
|
||
__TOUCHED((pMsg, wSize));
|
||
MSG_CG_CONNECTION_NOTIFY_LOGOUT_SYN *pRecvMsg = (MSG_CG_CONNECTION_NOTIFY_LOGOUT_SYN*)pMsg;
|
||
|
||
// 克拉拉试图按下退出按钮.
|
||
pUser->SetLogOutWait();
|
||
|
||
ZoneInterface* pZone = g_ZoneManager.FindZone(pUser->GetZoneKey());
|
||
if (!pZone) return;
|
||
|
||
// 任务进行中有意识地出去的话耐久度减少
|
||
if (pZone->GetUserNum() >= 2 && pZone->GetType() == eZONETYPE_MISSION)
|
||
{
|
||
MSG_AG_STATUS_DECREASE_DURA_CMD msg;
|
||
pUser->SendToLinkedServer(&msg, sizeof(msg));
|
||
}
|
||
}
|
||
HANDLER_CG_IMPL(CG_CONNECTION_HACKER_SYN)
|
||
{//添加外挂检测 by:十里坡剑神 2021-07-01
|
||
__TOUCHED((pMsg, wSize));
|
||
MSG_CG_CONNECTION_HACKER_SYN* pRecvMsg = (MSG_CG_CONNECTION_HACKER_SYN *)pMsg;
|
||
char buff[2048]={0};
|
||
char path[512]={0};
|
||
char sTime[256]={0};
|
||
|
||
SYSTEMTIME systime;
|
||
GetLocalTime(&systime);
|
||
sprintf(sTime,"%d-%d-%d %d:%d:%d",systime.wYear,systime.wMonth,systime.wDay,systime.wHour,systime.wMinute,systime.wSecond);
|
||
sprintf(path,"./HackerLog/%s.txt",pRecvMsg->pszUserID);
|
||
sprintf(buff,"角色:%s\t 外挂名:%s\t执行路径:%s\t%s\n",pRecvMsg->pszCharName,pRecvMsg->pszProgramName,pRecvMsg->pszProgramPath,sTime);
|
||
SUNLOG(eFULL_LOG, "[外挂检测]角色名:[%s]账号:[%s]外挂名:[%s]",pRecvMsg->pszCharName,pRecvMsg->pszUserID,pRecvMsg->pszProgramName);
|
||
std::fstream OutFile;
|
||
OutFile.open(path,std::ios::app);
|
||
if(OutFile.is_open())
|
||
{
|
||
OutFile<<buff;
|
||
OutFile.close();
|
||
}
|
||
//屏蔽自动封号 by:十里坡剑神 2021-07-01
|
||
/*User* pFindUser = UserManager::Instance()->FindUserForCharName(pRecvMsg->pszCharName);
|
||
if(!pFindUser)
|
||
{
|
||
return;
|
||
}
|
||
|
||
GAMELOG->DisconnectCmd(pUser, pFindUser);
|
||
|
||
pFindUser->SetDisconnectCode(RC::RC_DISCONNECT_SPEED_HACK_SUSPECTED);
|
||
pFindUser->DisconnectUser();*/
|
||
}
|
||
HANDLER_CG_IMPL(CG_CONNECTION_ENTERVILLAGEREQ_SYN)
|
||
{
|
||
__TOUCHED((pMsg, wSize));
|
||
MSG_CG_CONNECTION_ENTERVILLAGEREQ_SYN* pRecvMsg = (MSG_CG_CONNECTION_ENTERVILLAGEREQ_SYN *)pMsg;
|
||
|
||
BOOL bIsValidSize = (BOOL)(sizeof(MSG_CG_CONNECTION_ENTERVILLAGEREQ_SYN) == wSize);
|
||
if (!bIsValidSize)
|
||
{
|
||
SUNLOG(eDEV_LOG, _T("[RNDPROTOCOL_REPORT][SIZE] ENTERVILLAGEREQ"));
|
||
return;
|
||
}
|
||
|
||
MSG_CG_CONNECTION_ENTERVILLAGEREQ_NAK nmsg;
|
||
|
||
if (pUser->IsBeginTransaction())
|
||
{
|
||
nmsg.m_dwErrorCode = RC::RC_CONNECTION_ROOM_ALREADY_DOING_TRANSACTION;
|
||
pUser->SendPacket(&nmsg, sizeof(nmsg));
|
||
return;
|
||
}
|
||
|
||
BYTE CharIndex = pRecvMsg->m_bySelectedCharIndex;
|
||
if (pUser->GetState() < CHARACTER_LIST_STATE
|
||
|| CharIndex >= MAX_CHARACTER_SLOT_NUM
|
||
|| !pUser->IsValidSlot(CharIndex)
|
||
)
|
||
{
|
||
nmsg.m_dwErrorCode = RC::RC_CHARSELECT_OUTOFRANGEINDEX;
|
||
pUser->SendPacket(&nmsg, sizeof(nmsg));
|
||
return;
|
||
}
|
||
|
||
if (pUser->IsCharDelete(CharIndex))
|
||
{
|
||
nmsg.m_dwErrorCode = RC::RC_CONNECTION_DEL_CHAR;
|
||
pUser->SendPacket(&nmsg, sizeof(nmsg));
|
||
return;
|
||
}
|
||
|
||
// 选择的角色&
|
||
//链接字段服务器
|
||
if (!ServerSessionManager::Instance()->GetFieldServer())
|
||
{
|
||
nmsg.m_dwErrorCode = RC::RC_CONNECTION_DONOTEXIST_LINKSERVER;
|
||
pUser->SendPacket(&nmsg, sizeof(nmsg));
|
||
return;
|
||
}
|
||
|
||
if (pUser->GetZoneState() != ePRS_AT_CHARSELECT)
|
||
{
|
||
nmsg.m_dwErrorCode = RC::RC_CONNECTION_INVALID_CHAR_STATE;
|
||
pUser->SendPacket(&nmsg, sizeof(nmsg));
|
||
return;
|
||
}
|
||
|
||
// 调试用!!!!
|
||
User* pPreUser = UserManager::Instance()->FindUserForCharName(pUser->GetSelectedCharName());
|
||
if (pPreUser)
|
||
{
|
||
SUNLOG(eFULL_LOG, "[HANDLER_FROMCLIENT_IMPL(CG_CONNECTION_ENTERVILLAGEREQ_SYN)] 存在角色名称(%s)的玩家.", pUser->GetSelectedCharName());
|
||
pPreUser->SetDisconnectCode(RC::RC_DISCONNECT_DUPLICATE_CHARNAME);
|
||
pPreUser->DisconnectUser();
|
||
|
||
nmsg.m_dwErrorCode = RC::RC_CONNECTION_DUPLICATED_CHAR_NAME;
|
||
pUser->SendPacket(&nmsg, sizeof(nmsg));
|
||
pUser->SetDisconnectCode(RC::RC_DISCONNECT_DUPLICATE_CHARNAME);
|
||
pUser->DisconnectUser();
|
||
return;
|
||
}
|
||
|
||
pUser->SelectChar(CharIndex);
|
||
|
||
// 确认是否已锁定账户
|
||
if (pUser->GetSelectedCharState() == DBCHAR_STATE_CHAR_BLOCK)
|
||
{
|
||
nmsg.m_dwErrorCode = RC::RC_CONNECTION_CHAR_BLOCK;
|
||
pUser->SendPacket(&nmsg, sizeof(nmsg));
|
||
return;
|
||
}
|
||
|
||
//移动到村子?移动到场景…要移动的区域设置..
|
||
eZONETYPE zoneType;
|
||
sMAPINFO* pMapInfo = (sMAPINFO*)MapInfoParser::Instance()->FindMapInfo(pUser->GetSelectedCharMapCode());
|
||
if (!pMapInfo)
|
||
{
|
||
SUNLOG(eFULL_LOG, "[CG_CONNECTION_ENTERVILLAGEREQ_SYN]DB不存在相应地图.(%u)", pUser->GetSelectedCharMapCode());
|
||
|
||
nmsg.m_dwErrorCode = RC::RC_CHARSELECT_MAPCODE_WRONG;
|
||
pUser->SendPacket(&nmsg, sizeof(nmsg));
|
||
return;
|
||
}
|
||
|
||
MSG_GA_AUTH_PC_NAME_NTF loginNTF;
|
||
loginNTF.m_dwAuthUserID = pUser->GetAuthID();
|
||
|
||
CHECK_ID_LENGTH_BUFFER(loginNTF.m_szAccountID);
|
||
strncpy(loginNTF.m_szAccountID, pUser->GetUserID(), _countof(loginNTF.m_szAccountID));
|
||
loginNTF.m_szAccountID[_countof(loginNTF.m_szAccountID) - 1] = '\0';
|
||
// NOTE: loginNTF.m_szPCName, not null-terminated string
|
||
strncpy(loginNTF.m_szPCName, pUser->GetSelectedCharName(), _countof(loginNTF.m_szPCName));
|
||
#ifdef _NA000000_091005_EXTENDED_LOG_
|
||
loginNTF.m_CharClass = pUser->GetSelectedCharClass();
|
||
loginNTF.m_CharLevel = pUser->GetSelectedCharLV();
|
||
#endif
|
||
AgentServer::GetInstance()->SendToAuthAgentServer((BYTE*)&loginNTF, (WORD)sizeof(loginNTF));
|
||
|
||
// 传递到世界服务器
|
||
MSG_AW_USER_SET_CHARNAME_SYN wmsg;
|
||
wmsg.m_byCategory = AW_USER_STATUS;
|
||
wmsg.m_byProtocol = AW_USER_SET_CHARNAME_SYN;
|
||
wmsg.m_dwKey = pUser->GetUserKey();
|
||
wmsg.dwCharGuid = pUser->GetCharGUID(CharIndex);
|
||
wmsg.m_CharClass = pUser->GetCharClass();
|
||
#ifdef _NA_006642_20120416_COMMUNITY_INFO_BUG_MODIFY
|
||
wmsg.gender = pUser->GetSelectedCharGender();
|
||
#endif // _NA_006642_20120416_COMMUNITY_INFO_BUG_MODIFY
|
||
|
||
strncpy(wmsg.szCharName, pUser->GetSelectedCharName(), _countof(wmsg.szCharName));
|
||
wmsg.szCharName[_countof(wmsg.szCharName) - 1] = '\0';
|
||
wmsg.m_GuildGuid = pUser->GetSelectedCharGuildGuid();
|
||
wmsg.m_CharLevel = pUser->GetCharLV(CharIndex);
|
||
pUser->SendToWorldServer(&wmsg, sizeof(wmsg));
|
||
|
||
const MAPCODE entry_map_code = pUser->GetSelectedCharMapCode();
|
||
|
||
ZoneInterface* pZone = (ZoneInterface*)g_ZoneManager.FindStaticZone(entry_map_code);
|
||
if (!pZone)
|
||
{
|
||
SUNLOG(eCRITICAL_LOG, "没有村庄或场景.[%d]", pUser->GetSelectedCharMapCode());
|
||
return;
|
||
}
|
||
|
||
UserManager::Instance()->AddUserForSelectedCharInfoHashes(pUser);
|
||
|
||
zoneType = (eZONETYPE)pMapInfo->GetZoneType4SharedCode();
|
||
|
||
CharSelect* pCharSelect = g_ZoneManager.FindCharSelect(pUser->GetZoneKey());
|
||
|
||
pCharSelect->LeaveUser(pUser, eSEND_NONE, zoneType, pZone->GetLinkedServerIndex());
|
||
|
||
// NOTE: f110509.2L, 映射调用的第一个可输入字段与一个字段代码匹配
|
||
//在自定义逻辑的服务器字段中。所以地图代码等于字段代码
|
||
//就像下面的逻辑.
|
||
MAPCODE enter_field_code = entry_map_code;
|
||
#ifdef __NA002642_TUTORIAL_LOAD_BALANCE_SUPPORT
|
||
// NOTE: f110509.2L, waverix,field server的字段已采用1对1匹配方法。
|
||
//为了精确地支持教程映射的负载平衡,有基于自定义逻辑的
|
||
//很难,因此waverix在教程字段中使用相同的输入字段代码
|
||
//例如任务子字段。20206(教程)地图代码仅用于
|
||
//很多字段,比如20206、20207、20208等等。
|
||
//结论:从客户机和代理机的角度来看,只有一个map码是可以控制的
|
||
//战地服务器像战地服务器一样控制地图上的多个战地.
|
||
if (pMapInfo->byMKind == eZONETYPE_TUTORIAL_FIELD) {
|
||
MapInfoParser* map_parser = MapInfoParser::Instance();
|
||
enter_field_code = map_parser->GetRandomFieldCodeInZone(entry_map_code);
|
||
};
|
||
#endif
|
||
pUser->BeginTransaction(TR_JOIN_VILLAGE);
|
||
pZone->ReadyUser(pUser, eSEND_SYN, enter_field_code, 0, NULL, true);
|
||
|
||
pUser->BeginCharLoginTime();
|
||
//角色连接日志
|
||
GAMELOG->ConnectChar(pUser);
|
||
}
|
||
|
||
#ifdef __NA001334_090420_SERVER_SELECT_FACILITY__
|
||
HANDLER_CG_IMPL(CG_CONNECTION_SERVER_SELECT_REQUEST_SYN)
|
||
{
|
||
__TOUCHED((pMsg, wSize));
|
||
const MSG_CG_CONNECTION_SERVER_SELECT_REQUEST_SYN* pRecvMsg =
|
||
static_cast<MSG_CG_CONNECTION_SERVER_SELECT_REQUEST_SYN*>(pMsg);
|
||
|
||
MSG_CG_CONNECTION_SERVER_SELECT_REQUEST_ACK msgACK;
|
||
BOOLEAN bValidState = TRUE;
|
||
BOOLEAN bStartTrans = pRecvMsg->m_bQueryType == pRecvMsg->eQuery_StartTransaction;
|
||
if (bStartTrans)
|
||
{
|
||
if (bValidState && pUser->IsBeginTransaction() != 0)
|
||
bValidState = FALSE, msgACK.m_Result = RC::RC_ROOM_ALREADY_DOING_TRANSACTION;
|
||
|
||
const DWORD blockFilter = (ePRS_AT_CHARSELECT | ePRS_AT_LOBBY) & ~ePRS_AT_ROOM;
|
||
|
||
eZONE_STATE zoneState = pUser->GetZoneState();
|
||
if (bValidState)
|
||
{
|
||
if ((zoneState & ePRS_AT_ZONE) != ePRS_AT_ZONE || (zoneState & blockFilter) != 0)
|
||
bValidState = FALSE, msgACK.m_Result = RC::RC_ROOM_INVALID_PLAYER_STATE;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if (bValidState && pUser->IsBeginTransaction() == 0)
|
||
bValidState = FALSE, msgACK.m_Result = RC::RC_ROOM_INVALID_PLAYER_STATE;
|
||
if (bValidState && pUser->GetTransactionState() != TR_QUERY_SERVER_SELECT_TRANSACTION)
|
||
bValidState = FALSE, msgACK.m_Result = RC::RC_ROOM_ALREADY_DOING_TRANSACTION;
|
||
}
|
||
|
||
// 现有信息初始化必要可能性其他...
|
||
if (bValidState == 0)
|
||
{
|
||
pUser->SendPacket(&msgACK, msgACK.GetSize());
|
||
return;
|
||
}
|
||
|
||
const nsPacket::ReAuthInfo& rReAuthInfo = pUser->GetReAuthInfo();
|
||
if (bStartTrans)
|
||
pUser->OnServerSelectQueryResult(rReAuthInfo.eReAuthSlot_AllSide,
|
||
rReAuthInfo.eReAuthStep_Requested, 0);
|
||
else
|
||
pUser->OnServerSelectQueryResult(rReAuthInfo.eReAuthSlot_AllSide,
|
||
rReAuthInfo.eReAuthStep_Canceled, 0);
|
||
|
||
// Query to GameServer (Check Current State & Fix IdleState until Timeout)
|
||
// Query to AuthServer (Get ReAuthToken)
|
||
{
|
||
MSG_AG_CONNECTION_SERVER_SELECT_CONTROL_SYN msgSYN;
|
||
msgSYN.m_Control = bStartTrans ? msgSYN.eControl_StartTransaction
|
||
: msgSYN.eControl_StopTransaction;
|
||
pUser->SendToLinkedServer(&msgSYN, sizeof(msgSYN));
|
||
if (bStartTrans)
|
||
pUser->BeginTransaction(TR_QUERY_SERVER_SELECT_TRANSACTION);
|
||
else
|
||
pUser->EndTransaction();
|
||
}
|
||
{
|
||
MSG_AU_AUTH_SERVER_SELECT_SYN msgSYN;
|
||
msgSYN.m_AuthUserID = pUser->GetAuthID();
|
||
msgSYN.m_Request = bStartTrans ? msgSYN.eRequest_QueryStart
|
||
: msgSYN.eRequest_Cancel;
|
||
AgentServer::GetInstance()->SendToAuthAgentServer((BYTE*)&msgSYN, sizeof(msgSYN));
|
||
}
|
||
|
||
if (bStartTrans == 0)
|
||
{
|
||
msgACK.m_Result = RC::RC_ROOM_SERVER_SELECT_TRANSACTION_CANCELED;
|
||
pUser->SendPacket(&msgACK, msgACK.GetSize());
|
||
}
|
||
}
|
||
#endif
|
||
|
||
#ifdef _JP_20110222_INGAME_CHARNAME_CHANGE
|
||
|
||
HANDLER_CG_IMPL(CG_CHARNAME_CHANGE_SYN)
|
||
{
|
||
const MSG_CG_CHARNAME_CHANGE_SYN* pRecvMsg =
|
||
static_cast<MSG_CG_CHARNAME_CHANGE_SYN*>(pMsg);
|
||
|
||
if (!pUser->IsValidSlot(pRecvMsg->slot_index_))
|
||
{
|
||
MSG_CG_CHARNAME_CHANGE_NAK nak;
|
||
nak.slot_index_ = pRecvMsg->slot_index_;
|
||
nak.result_ = MSG_CG_CHARNAME_CHANGE_NAK::INDEX_INVALID;
|
||
pUser->SendPacket(&nak, sizeof(nak));
|
||
return;
|
||
}
|
||
|
||
MSG_AD_CHARNAME_CHANGE_SYN msg;
|
||
msg.m_dwKey = pUser->GetUserKey();
|
||
msg.character_guid_ = pUser->GetCharGUID(pRecvMsg->slot_index_);
|
||
msg.slot_index_ = pRecvMsg->slot_index_;
|
||
_tcsncpy(msg.character_name_, pRecvMsg->character_name_, _countof(msg.character_name_));
|
||
msg.character_name_[MAX_CHARNAME_LENGTH] = '\0';
|
||
|
||
if (FALSE == pUser->SendToDBPServer(&msg, sizeof(msg)))
|
||
{
|
||
MSG_CG_CHARNAME_CHANGE_NAK nak;
|
||
nak.slot_index_ = pRecvMsg->slot_index_;
|
||
nak.result_ = MSG_CG_CHARNAME_CHANGE_NAK::SEND_FAIL;
|
||
pUser->SendPacket(&nak, sizeof(nak));
|
||
}
|
||
}
|
||
|
||
#endif //_JP_20110222_INGAME_CHARNAME_CHANGE
|
||
|
||
// 任务大厅列表请求
|
||
HANDLER_CG_IMPL(CG_ZONE_LIST_MISSIONLOBBY_SYN)
|
||
{
|
||
__TOUCHED((pMsg, wSize));
|
||
MSG_CG_ZONE_LIST_MISSIONLOBBY_SYN* receive_message = static_cast<MSG_CG_ZONE_LIST_MISSIONLOBBY_SYN*>(pMsg);
|
||
|
||
// (CHANGES)(20100318)(hukim)(REQ_0038) 检查房间目录是否可以进入后
|
||
//通过的房间请求游戏服务器检查任务.
|
||
|
||
MSG_AG_ZONE_CHECK_MISSION_ROOM_LIST_SYN msg_syn;
|
||
g_ZoneManager.GetMissionLobbyRoomList(pUser,
|
||
receive_message->m_Count,
|
||
MSG_AG_ZONE_CHECK_MISSION_ROOM_LIST_SYN::kMaxRoomCount,
|
||
msg_syn.current_room_count_,
|
||
msg_syn.room_info_list_);
|
||
pUser->SendToLinkedServer(&msg_syn, msg_syn.GetSize());
|
||
}
|
||
|
||
// 请求猎人大厅列表
|
||
HANDLER_CG_IMPL(CG_ZONE_LIST_HUNTINGLOBBY_SYN)
|
||
{
|
||
__TOUCHED((pMsg, wSize));
|
||
MSG_CG_ZONE_LIST_HUNTINGLOBBY_SYN* pRecvMsg = (MSG_CG_ZONE_LIST_HUNTINGLOBBY_SYN *)pMsg;
|
||
|
||
MSG_CG_ZONE_LIST_HUNTINGLOBBY_ACK msg;
|
||
g_ZoneManager.GetHuntingLobbyRoomList(pUser, pRecvMsg->m_Count, MSG_CG_ZONE_LIST_HUNTINGLOBBY_ACK::_MAX_ROOM_NUM, msg.m_Count, msg.m_RoomInfo);
|
||
pUser->SendPacket(&msg, msg.GetSize());
|
||
}
|
||
|
||
// 请求进行的猎人列表
|
||
HANDLER_CG_IMPL(CG_ZONE_LIST_HUNTING_SYN)
|
||
{
|
||
__TOUCHED((pMsg, wSize));
|
||
MSG_CG_ZONE_LIST_HUNTING_SYN* pRecvMsg = (MSG_CG_ZONE_LIST_HUNTING_SYN *)pMsg;
|
||
|
||
MSG_CG_ZONE_LIST_HUNTING_ACK msg;
|
||
g_ZoneManager.GetHuntingRoomList(pUser, pRecvMsg->m_Count, MSG_CG_ZONE_LIST_HUNTING_ACK::_MAX_ROOM_NUM, msg.m_Count, msg.m_RoomInfo);
|
||
pUser->SendPacket(&msg, msg.GetSize());
|
||
}
|
||
|
||
// PVP房间列表请求
|
||
HANDLER_CG_IMPL(CG_ZONE_LIST_PVPLOBBY_SYN)
|
||
{
|
||
__TOUCHED((pMsg, wSize));
|
||
MSG_CG_ZONE_LIST_PVPLOBBY_SYN* pRecvMsg = (MSG_CG_ZONE_LIST_PVPLOBBY_SYN *)pMsg;
|
||
|
||
MSG_CG_ZONE_LIST_PVPLOBBY_ACK msg;
|
||
g_ZoneManager.GetPVPLobbyRoomList(pUser, pRecvMsg->m_Count, MSG_CG_ZONE_LIST_PVPLOBBY_ACK::_MAX_ROOM_NUM, msg.m_Count, msg.m_RoomInfo);
|
||
pUser->SendPacket(&msg, msg.GetSize());
|
||
}
|
||
|
||
// 竞争猎人列表请求
|
||
HANDLER_CG_IMPL(CG_ZONE_LIST_CHUNTINGLOBBY_SYN)
|
||
{
|
||
__TOUCHED((pMsg, wSize));
|
||
MSG_CG_ZONE_LIST_CHUNTINGLOBBY_SYN* pRecvMsg = (MSG_CG_ZONE_LIST_CHUNTINGLOBBY_SYN*)pMsg;
|
||
|
||
MSG_CG_ZONE_LIST_CHUNTINGLOBBY_ACK msg;
|
||
g_ZoneManager.GetCHuntingLobbyRoomList(pUser, pRecvMsg->m_Count, MSG_CG_ZONE_LIST_CHUNTINGLOBBY_ACK::_MAX_ROOM_NUM, msg.m_Count, msg.m_RoomInfo);
|
||
pUser->SendPacket(&msg, msg.GetSize());
|
||
}
|
||
|
||
HANDLER_CG_IMPL(CG_ZONE_LIST_CHUNTING_SYN)
|
||
{
|
||
__TOUCHED((pMsg, wSize));
|
||
MSG_CG_ZONE_LIST_CHUNTING_SYN* pRecvMsg = (MSG_CG_ZONE_LIST_CHUNTING_SYN*)pMsg;
|
||
|
||
MSG_CG_ZONE_LIST_CHUNTING_ACK msg;
|
||
#ifdef __NA_000000_20070528_TAIWAN_GUILD_PVP
|
||
g_ZoneManager.GetGuildPVPRoomList(pUser, pRecvMsg->m_Count, MSG_CG_ZONE_LIST_CHUNTING_ACK::_MAX_ROOM_NUM, msg.m_Count, msg.m_RoomInfo);
|
||
#else
|
||
g_ZoneManager.GetCHuntingRoomList(pUser, pRecvMsg->m_Count, MSG_CG_ZONE_LIST_CHUNTING_ACK::_MAX_ROOM_NUM, msg.m_Count, msg.m_RoomInfo);
|
||
#endif
|
||
pUser->SendPacket(&msg, msg.GetSize());
|
||
}
|
||
|
||
// 刷新特定房间列表
|
||
HANDLER_CG_IMPL(CG_ZONE_LIST_REFRESH_SYN)
|
||
{
|
||
__TOUCHED((pMsg, wSize));
|
||
MSG_CG_ZONE_LIST_REFRESH_SYN* pRecvMsg = (MSG_CG_ZONE_LIST_REFRESH_SYN *)pMsg;
|
||
|
||
ZoneInterface* pZone = g_ZoneManager.FindZone(pRecvMsg->m_RoomKey);
|
||
if (!pZone)
|
||
{
|
||
MSG_CG_ZONE_LIST_REFRESH_NAK msg;
|
||
msg.m_dwErrorCode = RC::RC_ROOM_NOT_EXIST_ROOM;
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
return;
|
||
}
|
||
switch (pZone->GetType())
|
||
{
|
||
case eZONETYPE_LOBBY:
|
||
{
|
||
// 猎人or任务
|
||
LobbyRoom* pRoom = (LobbyRoom *)pZone;
|
||
switch (pRoom->GetLobbyType())
|
||
{
|
||
case eZONETYPE_HUNTING:
|
||
{
|
||
MSG_CG_ZONE_LIST_REFRESH_HUNTINGLOBBY_ACK amsg;
|
||
pRoom->SerializeLoad(amsg.m_RoomInfo);
|
||
pUser->SendPacket(&amsg, sizeof(amsg));
|
||
}break;
|
||
case eZONETYPE_MISSION:
|
||
{
|
||
MSG_CG_ZONE_LIST_REFRESH_MISSIONLOBBY_ACK amsg;
|
||
pRoom->SerializeLoad(amsg.m_RoomInfo);
|
||
pUser->SendPacket(&amsg, sizeof(amsg));
|
||
}break;
|
||
case eZONETYPE_PVP:
|
||
{
|
||
MSG_CG_ZONE_LIST_REFRESH_PVPLOBBY_ACK amsg;
|
||
pRoom->SerializeLoad(amsg.m_RoomInfo);
|
||
pUser->SendPacket(&amsg, sizeof(amsg));
|
||
}break;
|
||
case eZONETYPE_CHUNTING:
|
||
{
|
||
MSG_CG_ZONE_LIST_REFRESH_CHUNTINGLOBBY_ACK amsg;
|
||
pRoom->SerializeLoad(amsg.m_RoomInfo);
|
||
pUser->SendPacket(&amsg, sizeof(amsg));
|
||
}break;
|
||
default:
|
||
{
|
||
SUNLOG(eFULL_LOG, "错误的游说类型.\n");
|
||
}
|
||
}
|
||
}
|
||
break;
|
||
case eZONETYPE_HUNTING:
|
||
{
|
||
HuntingRoom* pRoom = (HuntingRoom *)pZone;
|
||
MSG_CG_ZONE_LIST_REFRESH_HUNTING_ACK amsg;
|
||
pRoom->SerializeLoad(amsg.m_RoomInfo);
|
||
pUser->SendPacket(&amsg, sizeof(amsg));
|
||
}
|
||
break;
|
||
case eZONETYPE_CHUNTING:
|
||
{
|
||
CHuntingRoom* pRoom = (CHuntingRoom *)pZone;
|
||
MSG_CG_ZONE_LIST_REFRESH_CHUNTING_ACK amsg;
|
||
pRoom->SerializeLoad(amsg.m_RoomInfo);
|
||
pUser->SendPacket(&amsg, sizeof(amsg));
|
||
}
|
||
break;
|
||
default:
|
||
{
|
||
MSG_CG_ZONE_LIST_REFRESH_NAK msg;
|
||
msg.m_dwErrorCode = RC::RC_ROOM_INVALIDROOMTYPE;
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
}
|
||
}
|
||
}
|
||
|
||
// 立即前往
|
||
HANDLER_CG_IMPL(CG_ZONE_SHORTCUT_SYN)
|
||
{
|
||
__TOUCHED((pMsg, wSize));
|
||
MSG_CG_ZONE_SHORTCUT_SYN* pRecvMsg = (MSG_CG_ZONE_SHORTCUT_SYN *)pMsg;
|
||
|
||
RoomInterface* pRoom = g_ZoneManager.FindRecommendRoom(pUser, (eZONETYPE)pRecvMsg->m_byRoomType);
|
||
if (!pRoom)
|
||
{
|
||
MSG_CG_ZONE_SHORTCUT_NAK msg;
|
||
msg.m_dwErrorCode = RC::RC_ROOM_NOT_EXIST_ROOM;
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
return;
|
||
}
|
||
|
||
switch (pRoom->GetType())
|
||
{
|
||
case eZONETYPE_LOBBY:
|
||
{
|
||
LobbyRoom* pLobbyRoom = (LobbyRoom *)pRoom;
|
||
switch (pLobbyRoom->GetLobbyType())
|
||
{
|
||
case eZONETYPE_HUNTING:
|
||
{
|
||
MSG_CG_ZONE_SHORTCUT_HUNTINGLOBBY_ACK msg;
|
||
pLobbyRoom->SerializeLoad(msg.m_RoomInfo);
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
}break;
|
||
case eZONETYPE_MISSION:
|
||
{
|
||
MSG_CG_ZONE_SHORTCUT_MISSIONLOBBY_ACK msg;
|
||
pLobbyRoom->SerializeLoad(msg.m_RoomInfo);
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
}break;
|
||
case eZONETYPE_PVP:
|
||
{
|
||
MSG_CG_ZONE_SHORTCUT_PVPLOBBY_ACK msg;
|
||
pLobbyRoom->SerializeLoad(msg.m_RoomInfo);
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
}break;
|
||
case eZONETYPE_CHUNTING:
|
||
{
|
||
MSG_CG_ZONE_SHORTCUT_CHUNTINGLOBBY_ACK msg;
|
||
pLobbyRoom->SerializeLoad(msg.m_RoomInfo);
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
}break;
|
||
default:
|
||
{
|
||
SUNLOG(eFULL_LOG, "错误的游说类型.\n");
|
||
}
|
||
}
|
||
}break;
|
||
case eZONETYPE_HUNTING:
|
||
{
|
||
HuntingRoom* pHunting = (HuntingRoom *)pRoom;
|
||
MSG_CG_ZONE_SHORTCUT_HUNTING_ACK msg;
|
||
pHunting->SerializeLoad(msg.m_RoomInfo);
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
}break;
|
||
default:
|
||
{
|
||
MSG_CG_ZONE_SHORTCUT_NAK msg;
|
||
msg.m_dwErrorCode = RC::RC_ROOM_INVALIDROOMTYPE;
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
}
|
||
}
|
||
}
|
||
|
||
// 找到用户名的房间
|
||
HANDLER_CG_IMPL(CG_ZONE_FIND_ROOM_FROM_CHARID_SYN)
|
||
{
|
||
__TOUCHED((pMsg, wSize));
|
||
MSG_CG_ZONE_FIND_ROOM_FROM_CHARID_SYN* pRecvMsg = (MSG_CG_ZONE_FIND_ROOM_FROM_CHARID_SYN *)pMsg;
|
||
|
||
TCHAR tszCharName[MAX_CHARNAME_LENGTH + 1];
|
||
memcpy(tszCharName, pRecvMsg->m_pszCharName, sizeof(TCHAR)*MAX_CHARNAME_LENGTH);
|
||
tszCharName[MAX_CHARNAME_LENGTH] = '\0';
|
||
User* pFindUser = UserManager::Instance()->FindUserForCharName(tszCharName);
|
||
if (!pFindUser)
|
||
{
|
||
MSG_CG_ZONE_FIND_ROOM_FROM_CHARID_NAK msg;
|
||
msg.m_dwErrorCode = 5601;
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
return;
|
||
}
|
||
ZoneInterface* pZone = g_ZoneManager.FindZone(pFindUser->GetZoneKey());
|
||
if (!pZone)
|
||
{
|
||
MSG_CG_ZONE_FIND_ROOM_FROM_CHARID_NAK msg;
|
||
msg.m_dwErrorCode = 5602;
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
return;
|
||
}
|
||
switch (pZone->GetType())
|
||
{
|
||
case eZONETYPE_LOBBY:
|
||
{
|
||
LobbyRoom* pLobbyRoom = (LobbyRoom *)pZone;
|
||
switch (pLobbyRoom->GetLobbyType())
|
||
{
|
||
case eZONETYPE_HUNTING:
|
||
{
|
||
MSG_CG_ZONE_HUNTINGLOBBY_ROOM_FROM_CHARID_ACK msg;
|
||
pLobbyRoom->SerializeLoad(msg.m_RoomInfo);
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
}break;
|
||
case eZONETYPE_MISSION:
|
||
{
|
||
MSG_CG_ZONE_MISSIONLOBBY_ROOM_FROM_CHARID_ACK msg;
|
||
pLobbyRoom->SerializeLoad(msg.m_RoomInfo);
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
}break;
|
||
case eZONETYPE_PVP:
|
||
{
|
||
MSG_CG_ZONE_PVPLOBBY_ROOM_FROM_CHARID_ACK msg;
|
||
pLobbyRoom->SerializeLoad(msg.m_RoomInfo);
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
}break;
|
||
case eZONETYPE_CHUNTING:
|
||
{
|
||
MSG_CG_ZONE_CHUNTINGLOBBY_ROOM_FROM_CHARID_ACK msg;
|
||
pLobbyRoom->SerializeLoad(msg.m_RoomInfo);
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
}break;
|
||
default:
|
||
{
|
||
SUNLOG(eFULL_LOG, "错误的游说类型.\n");
|
||
}
|
||
}
|
||
}break;
|
||
case eZONETYPE_HUNTING:
|
||
{
|
||
HuntingRoom* pHunting = (HuntingRoom *)pZone;
|
||
MSG_CG_ZONE_HUNTING_ROOM_FROM_CHARID_ACK msg;
|
||
pHunting->SerializeLoad(msg.m_RoomInfo);
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
}break;
|
||
case eZONETYPE_CHUNTING:
|
||
{
|
||
CHuntingRoom* pCHunting = (CHuntingRoom *)pZone;
|
||
MSG_CG_ZONE_CHUNTING_ROOM_FROM_CHARID_ACK msg;
|
||
pCHunting->SerializeLoad(msg.m_RoomInfo);
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
}break;
|
||
default:
|
||
{
|
||
MSG_CG_ZONE_FIND_ROOM_FROM_CHARID_NAK msg;
|
||
msg.m_dwErrorCode = RC::RC_ROOM_INVALIDROOMTYPE;
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
}
|
||
}
|
||
}
|
||
|
||
// 找到用户名的房间
|
||
HANDLER_CG_IMPL(CG_ZONE_FIND_ROOM_FROM_NO_SYN)
|
||
{
|
||
__TOUCHED((pMsg, wSize));
|
||
MSG_CG_ZONE_FIND_ROOM_FROM_NO_SYN* pRecvMsg = (MSG_CG_ZONE_FIND_ROOM_FROM_NO_SYN *)pMsg;
|
||
|
||
ZoneInterface* pZone = g_ZoneManager.FindZone(pRecvMsg->m_RoomNo);
|
||
if (!pZone)
|
||
{
|
||
MSG_CG_ZONE_FIND_ROOM_FROM_CHARID_NAK msg;
|
||
msg.m_dwErrorCode = 5602;
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
return;
|
||
}
|
||
switch (pZone->GetType())
|
||
{
|
||
case eZONETYPE_LOBBY:
|
||
{
|
||
LobbyRoom* pLobbyRoom = (LobbyRoom *)pZone;
|
||
switch (pLobbyRoom->GetLobbyType())
|
||
{
|
||
case eZONETYPE_HUNTING:
|
||
{
|
||
MSG_CG_ZONE_HUNTINGLOBBY_ROOM_FROM_CHARID_ACK msg;
|
||
pLobbyRoom->SerializeLoad(msg.m_RoomInfo);
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
}break;
|
||
case eZONETYPE_MISSION:
|
||
{
|
||
MSG_CG_ZONE_MISSIONLOBBY_ROOM_FROM_CHARID_ACK msg;
|
||
pLobbyRoom->SerializeLoad(msg.m_RoomInfo);
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
}break;
|
||
case eZONETYPE_PVP:
|
||
{
|
||
MSG_CG_ZONE_PVPLOBBY_ROOM_FROM_CHARID_ACK msg;
|
||
pLobbyRoom->SerializeLoad(msg.m_RoomInfo);
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
}break;
|
||
case eZONETYPE_CHUNTING:
|
||
{
|
||
MSG_CG_ZONE_CHUNTINGLOBBY_ROOM_FROM_CHARID_ACK msg;
|
||
pLobbyRoom->SerializeLoad(msg.m_RoomInfo);
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
}break;
|
||
default:
|
||
{
|
||
SUNLOG(eFULL_LOG, "错误的游说类型.\n");
|
||
}
|
||
}
|
||
}break;
|
||
case eZONETYPE_HUNTING:
|
||
{
|
||
HuntingRoom* pHunting = (HuntingRoom *)pZone;
|
||
MSG_CG_ZONE_HUNTING_ROOM_FROM_CHARID_ACK msg;
|
||
pHunting->SerializeLoad(msg.m_RoomInfo);
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
}break;
|
||
case eZONETYPE_CHUNTING:
|
||
{
|
||
CHuntingRoom* pCHunting = (CHuntingRoom *)pZone;
|
||
MSG_CG_ZONE_CHUNTING_ROOM_FROM_CHARID_ACK msg;
|
||
pCHunting->SerializeLoad(msg.m_RoomInfo);
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
}break;
|
||
default:
|
||
{
|
||
MSG_CG_ZONE_FIND_ROOM_FROM_CHARID_NAK msg;
|
||
msg.m_dwErrorCode = RC::RC_ROOM_INVALIDROOMTYPE;
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
}
|
||
}
|
||
}
|
||
|
||
// 房主设大厅
|
||
HANDLER_CG_IMPL(CG_ZONE_LOBBY_CREATE_SYN)
|
||
{
|
||
__TOUCHED((pMsg, wSize));
|
||
MSG_CG_ZONE_LOBBY_CREATE_SYN* pRecvMsg = (MSG_CG_ZONE_LOBBY_CREATE_SYN *)pMsg;
|
||
|
||
MSG_CG_ZONE_LOBBY_CREATE_SYN pSafeBuffer[1];
|
||
memcpy(pSafeBuffer, pRecvMsg, sizeof(MSG_CG_ZONE_LOBBY_CREATE_SYN));
|
||
pRecvMsg = pSafeBuffer;
|
||
pRecvMsg->Decode();
|
||
|
||
if (pUser->IsBeginTransaction())
|
||
{
|
||
MSG_CG_ZONE_LOBBY_CREATE_NAK msg;
|
||
msg.m_dwErrorCode = RC::RC_ROOM_ALREADY_DOING_TRANSACTION;
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
return;
|
||
}
|
||
|
||
// (WAVERIX) (090829) (CHANGES) _PCBANG_POLICY_CHANGE_POST_EXPIRED
|
||
BASE_ROOMINFO roomInfo_modified;
|
||
g_ZoneManager.CheckRuleForRoom(pUser, pRecvMsg->m_RoomInfo, &roomInfo_modified);
|
||
|
||
eZONETYPE zoneType = eZONETYPE(pRecvMsg->m_byRoomType);
|
||
if (zoneType == eZONETYPE_MISSION)
|
||
{
|
||
MSG_AG_ZONE_LOBBY_CREATE_SYN msg;
|
||
|
||
msg.m_MapCode = pRecvMsg->m_MapCode;
|
||
msg.m_byMaxLimitUserNum = pRecvMsg->m_byMaxLimitUserNum;
|
||
msg.m_byRoomType = pRecvMsg->m_byRoomType; // eZONETYPE
|
||
msg.m_byRoomPublic = pRecvMsg->m_byRoomPublic; //< eZONEPUBLIC
|
||
strncpy(msg.m_pszRoomTitle, pRecvMsg->m_pszRoomTitle, _countof(msg.m_pszRoomTitle)); // no null-check
|
||
msg.m_RoomInfo = roomInfo_modified;
|
||
if (msg.m_byRoomPublic != eZONEPUBLIC_PUBLIC)
|
||
strncpy(msg.m_pszRoomPWD, pRecvMsg->m_pszRoomPWD, _countof(msg.m_pszRoomPWD)); // no null-check
|
||
else
|
||
ZeroMemory(msg.m_pszRoomPWD, sizeof(msg.m_pszRoomPWD));
|
||
pUser->SendToLinkedServer(&msg, sizeof(msg));
|
||
}
|
||
else
|
||
{
|
||
pUser->BeginTransaction(TR_CREATELOBBY);
|
||
|
||
LobbyRoom* pLobbyRoom = NULL;
|
||
BYTE byMaxLimitUserNum = pRecvMsg->m_byMaxLimitUserNum;
|
||
|
||
RC::eROOM_RESULT rt = g_ZoneManager.CreateLobbyRoom(pUser->GetZoneKey(), pUser, pRecvMsg->m_MapCode,
|
||
(eZONETYPE)pRecvMsg->m_byRoomType, (eZONEPUBLIC)pRecvMsg->m_byRoomPublic,
|
||
pRecvMsg->m_pszRoomTitle, pRecvMsg->m_pszRoomPWD, roomInfo_modified, byMaxLimitUserNum, 0, pLobbyRoom);
|
||
|
||
if (RC::RC_ROOM_SUCCESS == rt)
|
||
{
|
||
MSG_CG_ZONE_LOBBY_CREATE_ACK msg;
|
||
msg.m_LobbyKey = pLobbyRoom->GetKey();
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
}
|
||
else
|
||
{
|
||
// 路费生诚实牌
|
||
MSG_CG_ZONE_LOBBY_CREATE_NAK msg;
|
||
msg.m_dwErrorCode = rt;
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
}
|
||
|
||
pUser->EndTransaction();
|
||
}
|
||
}
|
||
|
||
// 生成竞争猎人大厅
|
||
HANDLER_CG_IMPL(CG_ZONE_CHUNTINGLOBBY_CREATE_SYN)
|
||
{
|
||
__TOUCHED((pMsg, wSize));
|
||
MSG_CG_ZONE_CHUNTINGLOBBY_CREATE_SYN* pRecvMsg = (MSG_CG_ZONE_CHUNTINGLOBBY_CREATE_SYN*)pMsg;
|
||
|
||
MSG_CG_ZONE_CHUNTINGLOBBY_CREATE_NAK msg;
|
||
msg.m_byErrorCode = RC::RC_ROOM_CANNOT_JOIN_ROOMTYPE;
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
return;
|
||
#if SUN_CODE_BACKUP
|
||
MSG_CG_ZONE_CHUNTINGLOBBY_CREATE_SYN pSafeBuffer[1];
|
||
memcpy(pSafeBuffer, pRecvMsg, sizeof(MSG_CG_ZONE_CHUNTINGLOBBY_CREATE_SYN));
|
||
pRecvMsg = pSafeBuffer;
|
||
//BOOL bIsValidSize = (BOOL) !(sizeof(MSG_CG_ZONE_CHUNTINGLOBBY_CREATE_SYN) < wSize);
|
||
//if(!bIsValidSize)
|
||
//{
|
||
// SUNLOG(eDEV_LOG, _T("[RNDPROTOCOL_REPORT][SIZE] MSG_CG_ZONE_CHUNTINGLOBBY_CREATE_SYN"));
|
||
// return;
|
||
//}
|
||
pRecvMsg->Decode();
|
||
|
||
// 检查是否有要链接的竞争猎房
|
||
CHuntingRoom *pCHunting = g_ZoneManager.FindCHunting(pRecvMsg->m_LinkHuntingKey);
|
||
if (!pCHunting)
|
||
{
|
||
MSG_CG_ZONE_CHUNTINGLOBBY_CREATE_NAK msg;
|
||
msg.m_byErrorCode = RC::RC_ROOM_INVALID_CHUNTING_LINK_KEY;
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
return;
|
||
}
|
||
|
||
if (pUser->IsBeginTransaction())
|
||
{
|
||
MSG_CG_ZONE_CHUNTINGLOBBY_CREATE_NAK msg;
|
||
msg.m_byErrorCode = RC::RC_ROOM_ALREADY_DOING_TRANSACTION;
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
return;
|
||
}
|
||
|
||
// (WAVERIX) (090829) (CHANGES) _PCBANG_POLICY_CHANGE_POST_EXPIRED
|
||
BASE_ROOMINFO roomInfo_modified;
|
||
g_ZoneManager.CheckRuleForRoom(pUser, pRecvMsg->m_RoomInfo, &roomInfo_modified);
|
||
|
||
pUser->BeginTransaction(TR_CREATELOBBY);
|
||
|
||
LobbyRoom *pLobbyRoom = NULL;
|
||
|
||
RC::eROOM_RESULT rt = g_ZoneManager.CreateLobbyRoom(pUser->GetZoneKey(), pUser, pCHunting->GetMapCode(),
|
||
eZONETYPE_CHUNTING, (eZONEPUBLIC)pRecvMsg->m_byRoomPublic, pRecvMsg->m_pszRoomTitle,
|
||
pRecvMsg->m_pszRoomPWD, roomInfo_modified, 0, pRecvMsg->m_LinkHuntingKey, pLobbyRoom);
|
||
|
||
if (RC::RC_ROOM_SUCCESS == rt)
|
||
{
|
||
MSG_CG_ZONE_CHUNTINGLOBBY_CREATE_ACK msg;
|
||
msg.m_LobbyKey = pLobbyRoom->GetKey();
|
||
msg.m_MapCode = pCHunting->GetMapCode();
|
||
msg.m_AdditionalCHuntingInfo = *pCHunting->GetAdditionalCHuntingInfo();
|
||
msg.m_NonBlockNum = pLobbyRoom->GetLimitMaxUserNum();
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
}
|
||
else
|
||
{
|
||
// 路费生诚实牌
|
||
MSG_CG_ZONE_CHUNTINGLOBBY_CREATE_NAK msg;
|
||
msg.m_byErrorCode = rt;
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
}
|
||
|
||
pUser->EndTransaction();
|
||
#endif //SUN_CODE_BACKUP
|
||
}
|
||
|
||
// 参加游说
|
||
HANDLER_CG_IMPL(CG_ZONE_LOBBY_JOIN_SYN)
|
||
{
|
||
__TOUCHED((pMsg, wSize));
|
||
MSG_CG_ZONE_LOBBY_JOIN_SYN* pRecvMsg = (MSG_CG_ZONE_LOBBY_JOIN_SYN *)pMsg;
|
||
|
||
LobbyRoom* pLobby = g_ZoneManager.FindLobby(pRecvMsg->m_LobbyKey);
|
||
if (pLobby == 0)
|
||
{
|
||
MSG_CG_ZONE_LOBBY_JOIN_NAK msg;
|
||
msg.m_dwErrorCode = RC::RC_ROOM_NOTEXISTLOBBY;
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
return;
|
||
}
|
||
|
||
if (pUser->IsBeginTransaction())
|
||
{
|
||
MSG_CG_ZONE_LOBBY_JOIN_NAK msg;
|
||
msg.m_dwErrorCode = RC::RC_ROOM_ALREADY_DOING_TRANSACTION;
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
return;
|
||
}
|
||
|
||
if (pLobby->GetLobbyType() == eZONETYPE_MISSION)
|
||
{
|
||
MSG_AG_ZONE_LOBBY_JOIN_SYN msg;
|
||
msg.m_LobbyKey = pRecvMsg->m_LobbyKey;
|
||
msg.m_byRoomPublic = pRecvMsg->m_byRoomPublic;
|
||
if (msg.m_byRoomPublic != eZONEPUBLIC_PUBLIC)
|
||
strncpy(msg.m_pszRoomPWD, pRecvMsg->m_pszRoomPWD, _countof(msg.m_pszRoomPWD)); // no null-check
|
||
else
|
||
ZeroMemory(msg.m_pszRoomPWD, sizeof(msg.m_pszRoomPWD));
|
||
msg.m_MapCode = pLobby->GetMapCode();
|
||
pUser->SendToLinkedServer(&msg, sizeof(msg));
|
||
}
|
||
else
|
||
{
|
||
pUser->BeginTransaction(TR_JOINLOBBY);
|
||
|
||
CheckMoveZonePolicy* const pCheckMoveZonePolicy =
|
||
MoveZonePolicy<MZTF_VILLAGE_TO_LOBBY>::AlignInfo(
|
||
pUser
|
||
//{ From | To }
|
||
, eZONETYPE_VILLAGE, eZONETYPE_LOBBY // eZONETYPE
|
||
, pUser->GetZoneKey(), pRecvMsg->m_LobbyKey // ZoneKey
|
||
);
|
||
RoomArgument args(
|
||
(eZONEPUBLIC)pRecvMsg->m_byRoomPublic
|
||
, ((pRecvMsg->m_byRoomPublic == eZONEPUBLIC_PRIVATE) ? pRecvMsg->m_pszRoomPWD : NULL)
|
||
);
|
||
const RC::eROOM_RESULT rt = g_ZoneManager.MoveZone(pCheckMoveZonePolicy, args);
|
||
if (RC::RC_ROOM_SUCCESS == rt)
|
||
{
|
||
LobbyRoom* pLobby = g_ZoneManager.FindLobby(pRecvMsg->m_LobbyKey);
|
||
if (!pLobby) return;
|
||
|
||
MSG_CG_ZONE_LOBBY_JOIN_ACK msg;
|
||
msg.m_dwMasterKey = pLobby->GetMaster()->GetPlayerKey();
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
}
|
||
else
|
||
{
|
||
MSG_CG_ZONE_LOBBY_JOIN_NAK msg;
|
||
msg.m_dwErrorCode = rt;
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
}
|
||
|
||
pUser->EndTransaction();
|
||
}
|
||
}
|
||
|
||
HANDLER_CG_IMPL(CG_ZONE_LOBBY_READY_SYN)
|
||
{
|
||
__TOUCHED((pMsg, wSize));
|
||
MSG_CG_ZONE_LOBBY_READY_SYN* pRecvMsg = (MSG_CG_ZONE_LOBBY_READY_SYN *)pMsg;
|
||
|
||
|
||
if (pUser->IsBeginTransaction())
|
||
{
|
||
MSG_CG_ZONE_LOBBY_READY_NAK msg;
|
||
msg.m_dwErrorCode = RC::RC_ROOM_ALREADY_DOING_TRANSACTION;
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
return;
|
||
}
|
||
|
||
RC::eROOM_RESULT rt = g_ZoneManager.UserReadyInLobby(pUser, TRUE);
|
||
if (RC::RC_ROOM_SUCCESS == rt)
|
||
{
|
||
MSG_CG_ZONE_LOBBY_READY_ACK amsg;
|
||
pUser->SendPacket(&amsg, sizeof(amsg));
|
||
|
||
LobbyRoom* pLobby = g_ZoneManager.FindLobby(pUser->GetZoneKey());
|
||
if (!pLobby) return;
|
||
|
||
MSG_CG_ZONE_LOBBY_READY_BRD bmsg;
|
||
bmsg.m_PlayerKey = pUser->GetPlayerKey();
|
||
pLobby->SendToAll(&bmsg, sizeof(bmsg), pUser->GetUserKey());
|
||
}
|
||
else
|
||
{
|
||
MSG_CG_ZONE_LOBBY_READY_NAK msg;
|
||
msg.m_dwErrorCode = rt;
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
}
|
||
}
|
||
|
||
HANDLER_CG_IMPL(CG_ZONE_LOBBY_READY_CANCEL_SYN)
|
||
{
|
||
__TOUCHED((pMsg, wSize));
|
||
MSG_CG_ZONE_LOBBY_READY_CANCEL_SYN* pRecvMsg = (MSG_CG_ZONE_LOBBY_READY_CANCEL_SYN *)pMsg;
|
||
|
||
|
||
if (pUser->IsBeginTransaction())
|
||
{
|
||
MSG_CG_ZONE_LOBBY_READY_CANCEL_NAK msg;
|
||
msg.m_dwErrorCode = RC::RC_ROOM_ALREADY_DOING_TRANSACTION;
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
return;
|
||
}
|
||
|
||
RC::eROOM_RESULT rt = g_ZoneManager.UserReadyInLobby(pUser, FALSE);
|
||
if (RC::RC_ROOM_SUCCESS == rt)
|
||
{
|
||
MSG_CG_ZONE_LOBBY_READY_CANCEL_ACK amsg;
|
||
pUser->SendPacket(&amsg, sizeof(amsg));
|
||
|
||
LobbyRoom* pLobby = g_ZoneManager.FindLobby(pUser->GetZoneKey());
|
||
if (!pLobby) return;
|
||
|
||
MSG_CG_ZONE_LOBBY_READY_CANCEL_BRD bmsg;
|
||
bmsg.m_PlayerKey = pUser->GetPlayerKey();
|
||
pLobby->SendToAll(&bmsg, sizeof(bmsg), pUser->GetUserKey());
|
||
}
|
||
else
|
||
{
|
||
MSG_CG_ZONE_LOBBY_READY_CANCEL_NAK msg;
|
||
msg.m_dwErrorCode = rt;
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
}
|
||
}
|
||
|
||
HANDLER_CG_IMPL(CG_ZONE_LOBBY_REQUEST_INFO_SYN)
|
||
{
|
||
__TOUCHED((pMsg, wSize));
|
||
MSG_CG_ZONE_LOBBY_REQUEST_INFO_SYN* pRecvMsg = (MSG_CG_ZONE_LOBBY_REQUEST_INFO_SYN *)pMsg;
|
||
|
||
#ifdef __NA_PACKETFLOW_TEST
|
||
SUNLOG(eFULL_LOG, "HANDLER_FROMCLIENT_IMPL(CG_ZONE_LOBBY_REQUEST_INFO_SYN)");
|
||
#endif
|
||
|
||
|
||
if (pUser->IsBeginTransaction())
|
||
{
|
||
MSG_CG_ZONE_LOBBY_REQUEST_INFO_NAK msg;
|
||
msg.m_dwErrorCode = RC::RC_ROOM_ALREADY_DOING_TRANSACTION;
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
return;
|
||
}
|
||
// CHANGES: f110609.1L, f110608.6L, 此更改响应了SendLobbyInfoForRequest方法
|
||
if (pUser->GetZoneType() == eZONETYPE_LOBBY)
|
||
{
|
||
LobbyRoom* const lobby = g_ZoneManager.FindLobby(pUser->GetZoneKey());
|
||
if (lobby == NULL) {
|
||
return;
|
||
};
|
||
if (lobby->SendLobbyInfoForRequest(pUser))
|
||
{
|
||
// success
|
||
return;
|
||
}
|
||
};
|
||
//
|
||
MSG_CG_ZONE_LOBBY_REQUEST_INFO_NAK msg_nak;
|
||
msg_nak.m_dwErrorCode = RC::RC_ROOM_INVALIDROOMTYPE;
|
||
pUser->SendPacket(&msg_nak, sizeof(msg_nak));
|
||
}
|
||
|
||
HANDLER_CG_IMPL(CG_ZONE_LOBBY_NONBLOCKSLOTNUM_SYN)
|
||
{
|
||
__TOUCHED((pMsg, wSize));
|
||
MSG_CG_ZONE_LOBBY_NONBLOCKSLOTNUM_SYN* pRecvMsg = (MSG_CG_ZONE_LOBBY_NONBLOCKSLOTNUM_SYN *)pMsg;
|
||
|
||
if (pUser->IsBeginTransaction())
|
||
{
|
||
MSG_CG_ZONE_LOBBY_NONBLOCKSLOTNUM_NAK msg;
|
||
msg.m_dwErrorCode = RC::RC_ROOM_ALREADY_DOING_TRANSACTION;
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
return;
|
||
}
|
||
|
||
RC::eROOM_RESULT rt = g_ZoneManager.SetNonblockSlotNumInLobby(pUser, pRecvMsg->m_NonBlockSlotNum);
|
||
if (RC::RC_ROOM_SUCCESS == rt)
|
||
{
|
||
MSG_CG_ZONE_LOBBY_NONBLOCKSLOTNUM_ACK amsg;
|
||
pUser->SendPacket(&amsg, sizeof(amsg));
|
||
|
||
LobbyRoom* pLobby = g_ZoneManager.FindLobby(pUser->GetZoneKey());
|
||
if (!pLobby) return;
|
||
|
||
MSG_CG_ZONE_LOBBY_NONBLOCKSLOTNUM_BRD bmsg;
|
||
bmsg.m_NonBlockSlotNum = pRecvMsg->m_NonBlockSlotNum;
|
||
pLobby->SendToAll(&bmsg, sizeof(bmsg), pUser->GetUserKey());
|
||
}
|
||
else
|
||
{
|
||
MSG_CG_ZONE_LOBBY_NONBLOCKSLOTNUM_NAK msg;
|
||
msg.m_dwErrorCode = rt;
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
}
|
||
}
|
||
|
||
HANDLER_CG_IMPL(CG_ZONE_LOBBY_KICKPLAYER_SYN)
|
||
{
|
||
__TOUCHED((pMsg, wSize));
|
||
MSG_CG_ZONE_LOBBY_KICKPLAYER_SYN* pRecvMsg = (MSG_CG_ZONE_LOBBY_KICKPLAYER_SYN *)pMsg;
|
||
|
||
|
||
if (pUser->IsBeginTransaction())
|
||
{
|
||
MSG_CG_ZONE_LOBBY_KICKPLAYER_NAK msg;
|
||
msg.m_dwErrorCode = RC::RC_ROOM_ALREADY_DOING_TRANSACTION;
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
return;
|
||
}
|
||
|
||
User* pTargetUser = NULL;
|
||
RC::eROOM_RESULT rt = g_ZoneManager.KickUserFromLobby(pUser, pRecvMsg->m_PlayerKey, pTargetUser);
|
||
if (RC::RC_ROOM_SUCCESS == rt)
|
||
{
|
||
MSG_CG_ZONE_LOBBY_KICKPLAYER_ACK amsg;
|
||
pUser->SendPacket(&amsg, sizeof(amsg));
|
||
|
||
MSG_CG_ZONE_LOBBY_LEAVE_ACK msg;
|
||
pTargetUser->SendPacket(&msg, sizeof(msg));
|
||
|
||
}
|
||
else
|
||
{
|
||
MSG_CG_ZONE_LOBBY_KICKPLAYER_NAK msg;
|
||
msg.m_dwErrorCode = rt;
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
}
|
||
}
|
||
|
||
HANDLER_CG_IMPL(CG_ZONE_LOBBY_CHANGE_TEAM_SYN)
|
||
{
|
||
__TOUCHED((pMsg, wSize));
|
||
MSG_CG_ZONE_LOBBY_CHANGE_TEAM_SYN* pRecvMsg = (MSG_CG_ZONE_LOBBY_CHANGE_TEAM_SYN *)pMsg;
|
||
|
||
#ifdef __NA_PACKETFLOW_TEST
|
||
SUNLOG(eFULL_LOG, "HANDLER_FROMCLIENT_IMPL(CG_ZONE_LOBBY_CHANGE_TEAM_SYN)");
|
||
#endif
|
||
|
||
if (pUser->IsBeginTransaction())
|
||
{
|
||
MSG_CG_ZONE_LOBBY_CHANGE_TEAM_NAK msg;
|
||
msg.m_dwErrorCode = RC::RC_ROOM_ALREADY_DOING_TRANSACTION;
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
return;
|
||
}
|
||
|
||
RC::eROOM_RESULT rt = g_ZoneManager.ChangeTeamInLobby(pUser, pRecvMsg->m_Team);
|
||
if (RC::RC_ROOM_SUCCESS == rt)
|
||
{
|
||
MSG_CG_ZONE_LOBBY_CHANGE_TEAM_ACK amsg;
|
||
pUser->SendPacket(&amsg, sizeof(amsg));
|
||
|
||
LobbyRoom* pLobby = g_ZoneManager.FindPVPLobby(pUser->GetZoneKey());
|
||
if (!pLobby) return;
|
||
|
||
MSG_CG_ZONE_LOBBY_CHANGE_TEAM_BRD bmsg;
|
||
bmsg.m_dwPlayerKey = pUser->GetPlayerKey();
|
||
bmsg.m_Team = pRecvMsg->m_Team;
|
||
pLobby->SendToAll(&bmsg, sizeof(bmsg), pUser->GetUserKey());
|
||
}
|
||
else
|
||
{
|
||
MSG_CG_ZONE_LOBBY_CHANGE_TEAM_NAK msg;
|
||
msg.m_dwErrorCode = rt;
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
}
|
||
}
|
||
|
||
HANDLER_CG_IMPL(CG_ZONE_LOBBY_CHANGE_MAP_SYN)
|
||
{
|
||
__TOUCHED((pMsg, wSize));
|
||
MSG_CG_ZONE_LOBBY_CHANGE_MAP_SYN* pRecvMsg = (MSG_CG_ZONE_LOBBY_CHANGE_MAP_SYN *)pMsg;
|
||
|
||
#ifdef __NA_PACKETFLOW_TEST
|
||
SUNLOG(eFULL_LOG, "HANDLER_FROMCLIENT_IMPL(CG_ZONE_LOBBY_CHANGE_MAP_SYN)");
|
||
#endif
|
||
|
||
if (pUser->IsBeginTransaction())
|
||
{
|
||
MSG_CG_ZONE_LOBBY_CHANGE_MAP_NAK msg;
|
||
msg.m_dwErrorCode = RC::RC_ROOM_ALREADY_DOING_TRANSACTION;
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
return;
|
||
}
|
||
|
||
RC::eROOM_RESULT rt = g_ZoneManager.ChangeMapInLobby(pUser, pRecvMsg->m_MapCode);
|
||
if (RC::RC_ROOM_SUCCESS == rt)
|
||
{
|
||
MSG_CG_ZONE_LOBBY_CHANGE_MAP_ACK amsg;
|
||
pUser->SendPacket(&amsg, sizeof(amsg));
|
||
|
||
LobbyRoom* pLobby = g_ZoneManager.FindLobby(pUser->GetZoneKey());
|
||
if (!pLobby) return;
|
||
|
||
MSG_CG_ZONE_LOBBY_CHANGE_MAP_BRD bmsg;
|
||
bmsg.m_MapCode = pRecvMsg->m_MapCode;
|
||
pLobby->SendToAll(&bmsg, sizeof(bmsg), pUser->GetUserKey());
|
||
}
|
||
else
|
||
{
|
||
MSG_CG_ZONE_LOBBY_CHANGE_MAP_NAK msg;
|
||
msg.m_dwErrorCode = rt;
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
}
|
||
}
|
||
|
||
HANDLER_CG_IMPL(CG_ZONE_LOBBY_HUNTING_CONFIG_SYN)
|
||
{
|
||
__TOUCHED((pMsg, wSize));
|
||
MSG_CG_ZONE_LOBBY_HUNTING_CONFIG_SYN* pRecvMsg = (MSG_CG_ZONE_LOBBY_HUNTING_CONFIG_SYN *)pMsg;
|
||
|
||
#ifdef __NA_PACKETFLOW_TEST
|
||
SUNLOG(eFULL_LOG, "HANDLER_FROMCLIENT_IMPL(CG_ZONE_LOBBY_HUNTING_CONFIG_SYN)");
|
||
#endif
|
||
|
||
if (pUser->IsBeginTransaction())
|
||
{
|
||
MSG_CG_ZONE_LOBBY_HUNTING_CONFIG_NAK msg;
|
||
msg.m_dwErrorCode = RC::RC_ROOM_ALREADY_DOING_TRANSACTION;
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
return;
|
||
}
|
||
|
||
RC::eROOM_RESULT rt = g_ZoneManager.ConfigHuntingRoomInLobby(pUser, pRecvMsg->m_AdditionalInfo);
|
||
if (RC::RC_ROOM_SUCCESS == rt)
|
||
{
|
||
MSG_CG_ZONE_LOBBY_HUNTING_CONFIG_ACK amsg;
|
||
pUser->SendPacket(&amsg, sizeof(amsg));
|
||
|
||
LobbyRoom* pLobby = g_ZoneManager.FindHuntingLobby(pUser->GetZoneKey());
|
||
if (!pLobby) return;
|
||
|
||
MSG_CG_ZONE_LOBBY_HUNTING_CONFIG_BRD bmsg;
|
||
bmsg.m_AdditionalInfo = pRecvMsg->m_AdditionalInfo;
|
||
pLobby->SendToAll(&bmsg, sizeof(bmsg), pUser->GetUserKey());
|
||
}
|
||
else
|
||
{
|
||
MSG_CG_ZONE_LOBBY_HUNTING_CONFIG_NAK msg;
|
||
msg.m_dwErrorCode = rt;
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
}
|
||
}
|
||
|
||
HANDLER_CG_IMPL(CG_ZONE_LOBBY_PVP_CONFIG_SYN)
|
||
{
|
||
__TOUCHED((pMsg, wSize));
|
||
MSG_CG_ZONE_LOBBY_PVP_CONFIG_SYN* pRecvMsg = (MSG_CG_ZONE_LOBBY_PVP_CONFIG_SYN *)pMsg;
|
||
|
||
#ifdef __NA_PACKETFLOW_TEST
|
||
SUNLOG(eFULL_LOG, "HANDLER_FROMCLIENT_IMPL(CG_ZONE_LOBBY_PVP_CONFIG_SYN)");
|
||
#endif
|
||
|
||
if (pUser->IsBeginTransaction())
|
||
{
|
||
MSG_CG_ZONE_LOBBY_PVP_CONFIG_NAK msg;
|
||
msg.m_dwErrorCode = RC::RC_ROOM_ALREADY_DOING_TRANSACTION;
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
return;
|
||
}
|
||
|
||
RC::eROOM_RESULT rt = g_ZoneManager.ConfigPVPRoomInLobby(pUser, pRecvMsg->m_AdditionalPVPInfo);
|
||
if (RC::RC_ROOM_SUCCESS == rt)
|
||
{
|
||
LobbyRoom* pLobby = g_ZoneManager.FindPVPLobby(pUser->GetZoneKey());
|
||
if (!pLobby) return;
|
||
|
||
MSG_CG_ZONE_LOBBY_PVP_CONFIG_BRD msg_brd;
|
||
msg_brd.m_AdditionalPVPInfo = pRecvMsg->m_AdditionalPVPInfo;
|
||
// NOTE: f110609.3L
|
||
ns_functor::PvPLobbyChangedStatusNotificationFilter filter;
|
||
msg_brd.m_Count = pLobby->GetListMemberInfo(
|
||
filter.GetRedirectedArray(msg_brd.m_PlayerInfo), NULL);
|
||
// CHANGES: f110608.6L, 广播从每次打包和发送都改变了
|
||
//一次包装和重复使用的发送方式.
|
||
pLobby->SendToAll(&msg_brd, msg_brd.GetSize(), 0);
|
||
}
|
||
else
|
||
{
|
||
MSG_CG_ZONE_LOBBY_PVP_CONFIG_NAK msg;
|
||
msg.m_dwErrorCode = rt;
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
}
|
||
}
|
||
|
||
HANDLER_CG_IMPL(CG_ZONE_LOBBY_CHUNTING_CONFIG_SYN)
|
||
{
|
||
__TOUCHED((pMsg, wSize));
|
||
MSG_CG_ZONE_LOBBY_CHUNTING_CONFIG_SYN* pRecvMsg = (MSG_CG_ZONE_LOBBY_CHUNTING_CONFIG_SYN *)pMsg;
|
||
|
||
#ifdef __NA_PACKETFLOW_TEST
|
||
SUNLOG(eFULL_LOG, "HANDLER_FROMCLIENT_IMPL(CG_ZONE_LOBBY_CHUNTING_CONFIG_SYN)");
|
||
#endif
|
||
|
||
if (pUser->IsBeginTransaction())
|
||
{
|
||
MSG_CG_ZONE_LOBBY_CHUNTING_CONFIG_NAK msg;
|
||
msg.m_dwErrorCode = RC::RC_ROOM_ALREADY_DOING_TRANSACTION;
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
return;
|
||
}
|
||
|
||
RC::eROOM_RESULT rt = g_ZoneManager.ConfigCHuntingRoomInLobby(pUser, pRecvMsg->m_AdditionalInfo);
|
||
if (RC::RC_ROOM_SUCCESS == rt)
|
||
{
|
||
MSG_CG_ZONE_LOBBY_CHUNTING_CONFIG_ACK amsg;
|
||
pUser->SendPacket(&amsg, sizeof(amsg));
|
||
|
||
LobbyRoom *pLobby = g_ZoneManager.FindCHuntingLobby(pUser->GetZoneKey());
|
||
if (!pLobby) return;
|
||
|
||
MSG_CG_ZONE_LOBBY_CHUNTING_CONFIG_BRD bmsg;
|
||
bmsg.m_AdditionalInfo = pRecvMsg->m_AdditionalInfo;
|
||
pLobby->SendToAll(&bmsg, sizeof(bmsg), pUser->GetUserKey());
|
||
}
|
||
else
|
||
{
|
||
MSG_CG_ZONE_LOBBY_CHUNTING_CONFIG_NAK msg;
|
||
msg.m_dwErrorCode = rt;
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
}
|
||
}
|
||
|
||
HANDLER_CG_IMPL(CG_ZONE_HUNTING_CREATE_SYN)
|
||
{
|
||
__TOUCHED((pUser, pMsg, wSize));
|
||
ASSERT("Function Not Suported!!");
|
||
return;
|
||
}
|
||
|
||
HANDLER_CG_IMPL(CG_ZONE_MISSION_CREATE_SYN)
|
||
{
|
||
__TOUCHED((pMsg, wSize));
|
||
MSG_CG_ZONE_MISSION_CREATE_SYN* pRecvMsg = (MSG_CG_ZONE_MISSION_CREATE_SYN *)pMsg;
|
||
|
||
#ifdef __NA_PACKETFLOW_TEST
|
||
SUNLOG(eFULL_LOG, "HANDLER_FROMCLIENT_IMPL(CG_ZONE_MISSION_CREATE_SYN)");
|
||
#endif
|
||
|
||
BOOL bIsValidSize = (BOOL)(sizeof(MSG_CG_ZONE_MISSION_CREATE_SYN) == wSize);
|
||
if (!bIsValidSize)
|
||
{
|
||
SUNLOG(eDEV_LOG, _T("[RNDPROTOCOL_REPORT][SIZE] MSG_CG_ZONE_MISSION_CREATE_SYN"));
|
||
return;
|
||
}
|
||
|
||
MSG_CG_ZONE_MISSION_CREATE_NAK msgNak;
|
||
if (pUser->IsBeginTransaction())
|
||
{
|
||
msgNak.m_dwErrorCode = RC::RC_ROOM_ALREADY_DOING_TRANSACTION;
|
||
pUser->SendPacket(&msgNak, sizeof(msgNak));
|
||
return;
|
||
}
|
||
|
||
//{__NA001281_BATTLEZONE_ENTER_CONSTRAINTS_CHANGE_IN_LOBBY__
|
||
KEYTYPE lobbyKey = pUser->GetZoneKey();
|
||
LobbyRoom* pLobbyRoom = g_ZoneManager.FindMissionLobby(lobbyKey);
|
||
if (pLobbyRoom == NULL)
|
||
{
|
||
msgNak.m_dwErrorCode = RC::RC_ROOM_INVALID_ROOM_TYPE;
|
||
pUser->SendPacket(&msgNak, sizeof(msgNak));
|
||
return;
|
||
}
|
||
|
||
typedef MSG_AG_ZONE_CAN_CREATE_ROOM_SYN SynPacket;
|
||
MSG_AG_ZONE_CAN_CREATE_ROOM_SYN msg;
|
||
msg.Clear();
|
||
msg.m_CheckMethod = msg.eCheck_Members;
|
||
msg.m_MapCode = pLobbyRoom->GetMapCode();
|
||
|
||
SynPacket::CheckArgMembers& rMemberList = msg.m_CheckArgMembers;
|
||
rMemberList.partyKey = 0;
|
||
rMemberList.roomKey = lobbyKey;
|
||
|
||
DWORD memberNumber = 0;
|
||
const ZoneInterface::ZONE_USER_LIST& rUserList = pLobbyRoom->GetUserList();
|
||
FOREACH_CONTAINER(const ZoneInterface::ZONE_USER_LIST::value_type& rUser, rUserList,
|
||
ZoneInterface::ZONE_USER_LIST)
|
||
{
|
||
User* pMember = rUser.second;
|
||
if (memberNumber >= _countof(rMemberList.members))
|
||
break;
|
||
SynPacket::MemberInfo& rMemberInfo = rMemberList.members[memberNumber++];
|
||
rMemberInfo.objectKey = (WORD)pMember->GetPlayerKey();
|
||
rMemberInfo.status = msg.eStatus_PartialOk;
|
||
}
|
||
|
||
pUser->SendToLinkedServer(&msg, msg.GetSize());
|
||
//}__NA001281_BATTLEZONE_ENTER_CONSTRAINTS_CHANGE_IN_LOBBY__
|
||
}
|
||
|
||
HANDLER_CG_IMPL(CG_ZONE_PVP_CREATE_SYN)
|
||
{
|
||
__TOUCHED((pMsg, wSize));
|
||
MSG_CG_ZONE_PVP_CREATE_SYN* pRecvMsg = (MSG_CG_ZONE_PVP_CREATE_SYN *)pMsg;
|
||
|
||
#ifdef __NA_PACKETFLOW_TEST
|
||
SUNLOG(eFULL_LOG, "HANDLER_FROMCLIENT_IMPL(CG_ZONE_PVP_CREATE_SYN)");
|
||
#endif
|
||
|
||
if (pUser->IsBeginTransaction())
|
||
{
|
||
MSG_CG_ZONE_PVP_CREATE_NAK msg;
|
||
msg.m_dwErrorCode = RC::RC_ROOM_ALREADY_DOING_TRANSACTION;
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
return;
|
||
}
|
||
|
||
pUser->BeginTransaction(TR_LEAVE_LOBBY_FOR_PVP);
|
||
|
||
KEYTYPE LobbyKey = pUser->GetZoneKey();
|
||
PVPRoom* pRoom = NULL;
|
||
|
||
RC::eROOM_RESULT rt = g_ZoneManager.CreatePVPRoom(LobbyKey, pUser, pRoom);
|
||
|
||
if (RC::RC_ROOM_SUCCESS == rt)
|
||
{
|
||
pUser->SetTRRoomKey(pRoom->GetKey());
|
||
|
||
LobbyRoom* pLobby = g_ZoneManager.FindLobby(LobbyKey);
|
||
if (!pLobby) return;
|
||
|
||
RoomMigrater<LobbyRoom, PVPRoom, TR_LEAVE_LOBBY_FOR_PVP> op(pLobby, pRoom);
|
||
pLobby->Foreach(op);
|
||
}
|
||
else
|
||
{
|
||
pUser->EndTransaction();
|
||
|
||
MSG_CG_ZONE_PVP_CREATE_NAK msg;
|
||
msg.m_dwErrorCode = rt;
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
}
|
||
}
|
||
|
||
HANDLER_CG_IMPL(CG_ZONE_CHUNTING_CREATE_SYN)
|
||
{
|
||
__TOUCHED((pMsg, wSize));
|
||
MSG_CG_ZONE_CHUNTING_CREATE_SYN* pRecvMsg = (MSG_CG_ZONE_CHUNTING_CREATE_SYN*)pMsg;
|
||
|
||
#ifdef __NA_PACKETFLOW_TEST
|
||
SUNLOG(eFULL_LOG, "HANDLER_FROMCLIENT_IMPL(CG_ZONE_CHUNTING_CREATE_SYN)");
|
||
#endif
|
||
|
||
BOOL bIsValidSize = (BOOL)(sizeof(MSG_CG_ZONE_CHUNTING_CREATE_SYN) == wSize);
|
||
if (!bIsValidSize)
|
||
{
|
||
SUNLOG(eDEV_LOG, _T("[RNDPROTOCOL_REPORT][SIZE] MSG_CG_ZONE_CHUNTING_CREATE_SYN"));
|
||
return;
|
||
}
|
||
|
||
if (pUser->IsBeginTransaction())
|
||
{
|
||
MSG_CG_ZONE_CHUNTING_CREATE_NAK msg;
|
||
msg.m_byErrorCode = RC::RC_ROOM_ALREADY_DOING_TRANSACTION;
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
return;
|
||
}
|
||
|
||
KEYTYPE LobbyKey = pUser->GetZoneKey();
|
||
CHuntingRoom* pCHuntingRoom = NULL;
|
||
|
||
if (g_ZoneManager.AutoMatching(LobbyKey, pUser, pCHuntingRoom))
|
||
{
|
||
RC::eROOM_RESULT rt = g_ZoneManager.MigrateCHuntingRoom(pUser, LobbyKey, pCHuntingRoom);
|
||
|
||
if (RC::RC_ROOM_SUCCESS != rt)
|
||
{
|
||
MSG_CG_ZONE_CHUNTING_CREATE_NAK msg;
|
||
msg.m_byErrorCode = rt;
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
}
|
||
}
|
||
else
|
||
{
|
||
pUser->BeginTransaction(TR_LEAVE_LOBBY_FOR_CHUNTING);
|
||
|
||
RC::eROOM_RESULT rt = g_ZoneManager.CreateCHuntingRoom(LobbyKey, pUser, pCHuntingRoom);
|
||
|
||
if (RC::RC_ROOM_SUCCESS == rt)
|
||
{
|
||
pUser->SetTRRoomKey(pCHuntingRoom->GetKey());
|
||
|
||
LobbyRoom* pLobby = g_ZoneManager.FindLobby(LobbyKey);
|
||
if (!pLobby) return;
|
||
|
||
RoomMigrater<LobbyRoom, CHuntingRoom, TR_LEAVE_LOBBY_FOR_CHUNTING> op(pLobby, pCHuntingRoom);
|
||
pLobby->Foreach(op);
|
||
}
|
||
else
|
||
{
|
||
pUser->EndTransaction();
|
||
MSG_CG_ZONE_CHUNTING_CREATE_NAK msg;
|
||
msg.m_byErrorCode = rt;
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
}
|
||
}
|
||
}
|
||
|
||
HANDLER_CG_IMPL(CG_ZONE_CHUNTING_MIGRATE_SYN)
|
||
{
|
||
__TOUCHED((pMsg, wSize));
|
||
MSG_CG_ZONE_CHUNTING_MIGRATE_SYN* pRecvMsg = (MSG_CG_ZONE_CHUNTING_MIGRATE_SYN*)pMsg;
|
||
|
||
#ifdef __NA_PACKETFLOW_TEST
|
||
SUNLOG(eFULL_LOG, "HANDLER_FROMCLIENT_IMPL(CG_ZONE_CHUNTING_MIGRATE_SYN)");
|
||
#endif
|
||
|
||
if (pUser->IsBeginTransaction())
|
||
{
|
||
MSG_CG_ZONE_CHUNTING_JOIN_NAK msg;
|
||
msg.m_byErrorCode = RC::RC_ROOM_ALREADY_DOING_TRANSACTION;
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
return;
|
||
}
|
||
|
||
//#ifndef _SUSUNLOVE_AUTO_MATCHING_
|
||
// CHuntingRoom* pRoom = NULL;
|
||
// RC::eROOM_RESULT rt = g_ZoneManager.MigrateCHuntingRoom(pUser, pUser->GetZoneKey(), pRecvMsg->m_CHuntingKey, pRoom);
|
||
//
|
||
// if(RC::RC_ROOM_SUCCESS != rt)
|
||
// {
|
||
// MSG_CG_ZONE_CHUNTING_JOIN_NAK msg;
|
||
// msg.m_byErrorCode = rt;
|
||
// pUser->SendPacket(&msg, sizeof(msg));
|
||
// }
|
||
//#endif
|
||
}
|
||
|
||
HANDLER_CG_IMPL(CG_ZONE_HUNTING_JOIN_SYN)
|
||
{
|
||
__TOUCHED((pUser, pMsg, wSize));
|
||
// (WAVERIX) (090624) (CHANGES) Remove unused section 'Hunting'
|
||
ASSERT("Function Not Suported!!");
|
||
return;
|
||
// MSG_CG_ZONE_HUNTING_JOIN_SYN* pRecvMsg = (MSG_CG_ZONE_HUNTING_JOIN_SYN *)pMsg;
|
||
//
|
||
//#ifdef __NA_PACKETFLOW_TEST
|
||
// SUNLOG(eFULL_LOG, "HANDLER_FROMCLIENT_IMPL(CG_ZONE_HUNTING_JOIN_SYN)");
|
||
//#endif
|
||
//
|
||
//
|
||
// if(pUser->IsBeginTransaction())
|
||
// {
|
||
// MSG_CG_ZONE_HUNTING_JOIN_NAK msg;
|
||
// msg.m_dwErrorCode = RC::RC_ROOM_ALREADY_DOING_TRANSACTION;
|
||
// pUser->SendPacket(&msg, sizeof(msg));
|
||
// return;
|
||
// }
|
||
//
|
||
// if(pUser->GetZoneType() != eZONETYPE_VILLAGE)
|
||
// {
|
||
// MSG_CG_ZONE_HUNTING_JOIN_NAK msg;
|
||
// msg.m_dwErrorCode = RC::RC_ROOM_INVALIDROOMTYPE;
|
||
// pUser->SendPacket(&msg, sizeof(msg));
|
||
// return;
|
||
// }
|
||
//
|
||
// pUser->BeginTransaction(TR_LEAVE_LOBBY_FOR_HUNTING);
|
||
//
|
||
// CheckMoveZonePolicy* const pCheckMoveZonePolicy =
|
||
// MoveZonePolicy<MZTF_VILLAGE_TO_HUNTING>::AlignInfo(
|
||
// pUser
|
||
// //{ From | To }
|
||
// , eZONETYPE_VILLAGE, eZONETYPE_HUNTING // eZONETYPE
|
||
// , pUser->GetZoneKey(), pRecvMsg->m_HuntingKey // ZoneKey
|
||
// );
|
||
// RoomArgument args(
|
||
// (eZONEPUBLIC)pRecvMsg->m_byRoomPublic
|
||
// , ((pRecvMsg->m_byRoomPublic==eZONEPUBLIC_PRIVATE) ? pRecvMsg->m_pszRoomPWD : NULL)
|
||
// );
|
||
// const RC::eROOM_RESULT rt = g_ZoneManager.MoveZone(pCheckMoveZonePolicy, args);
|
||
// if(RC::RC_ROOM_SUCCESS == rt)
|
||
// {
|
||
// pUser->SetTRRoomKey(pRecvMsg->m_HuntingKey);
|
||
// }
|
||
// else
|
||
// {
|
||
// pUser->EndTransaction();
|
||
//
|
||
// MSG_CG_ZONE_HUNTING_JOIN_NAK msg;
|
||
// msg.m_dwErrorCode = rt;
|
||
// pUser->SendPacket(&msg, sizeof(msg));
|
||
// }
|
||
}
|
||
|
||
HANDLER_CG_IMPL(CG_ZONE_LOBBY_LEAVE_SYN)
|
||
{
|
||
__TOUCHED((pMsg, wSize));
|
||
MSG_CG_ZONE_LOBBY_LEAVE_SYN* pRecvMsg = (MSG_CG_ZONE_LOBBY_LEAVE_SYN *)pMsg;
|
||
|
||
#ifdef __NA_PACKETFLOW_TEST
|
||
SUNLOG(eFULL_LOG, "HANDLER_FROMCLIENT_IMPL(CG_ZONE_LOBBY_LEAVE_SYN)");
|
||
#endif
|
||
|
||
if (pUser->IsBeginTransaction())
|
||
{
|
||
MSG_CG_ZONE_LOBBY_LEAVE_NAK msg;
|
||
msg.m_dwErrorCode = RC::RC_ROOM_ALREADY_DOING_TRANSACTION;
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
return;
|
||
}
|
||
|
||
if (pUser->GetZoneType() != eZONETYPE_LOBBY)
|
||
{
|
||
MSG_CG_ZONE_LOBBY_LEAVE_NAK msg;
|
||
msg.m_dwErrorCode = RC::RC_ROOM_INVALIDROOMTYPE;
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
return;
|
||
}
|
||
|
||
const MAPCODE currentMapCode = pUser->GetSelectedCharMapCode();
|
||
ZoneInterface* pZone = g_ZoneManager.FindStaticZone(currentMapCode);
|
||
MSG_CG_ZONE_LOBBY_LEAVE_NAK msgNAK;
|
||
|
||
if (pZone)
|
||
{
|
||
eZONETYPE staticZoneType = pZone->GetType();
|
||
BOOLEAN isAcceptableStatus = (staticZoneType == eZONETYPE_VILLAGE ||
|
||
currentMapCode == HardCode::MAPCODE_for_TUTORIAL_FIELD);
|
||
|
||
if (isAcceptableStatus)
|
||
{
|
||
KEYTYPE toZoneKey = pZone->GetKey();
|
||
|
||
CheckMoveZonePolicy* const pCheckMoveZonePolicy =
|
||
MoveZonePolicy<MZTF_LOBBY_TO_VILLAGE>::AlignInfo(
|
||
pUser,
|
||
//{ From | To }
|
||
eZONETYPE_LOBBY, staticZoneType,// eZONETYPE
|
||
pUser->GetZoneKey(), toZoneKey // ZoneKey
|
||
);
|
||
const RC::eROOM_RESULT rt =
|
||
g_ZoneManager.MoveZone(pCheckMoveZonePolicy, RoomArgument::GetEmpty());
|
||
if (RC::RC_ROOM_SUCCESS == rt)
|
||
{
|
||
pUser->SetTRRoomKey(toZoneKey);
|
||
|
||
MSG_CG_ZONE_LOBBY_LEAVE_ACK msgACK;
|
||
pUser->SendPacket(&msgACK, sizeof(msgACK));
|
||
|
||
return;
|
||
}
|
||
else
|
||
msgNAK.m_dwErrorCode = rt;
|
||
}
|
||
else
|
||
msgNAK.m_dwErrorCode = RC::RC_ROOM_NOTEXISTVILLAGE;
|
||
}
|
||
else
|
||
msgNAK.m_dwErrorCode = RC::RC_ROOM_NOTEXISTVILLAGE;
|
||
|
||
pUser->SendPacket(&msgNAK, sizeof(msgNAK));
|
||
return;
|
||
}
|
||
|
||
HANDLER_CG_IMPL(CG_ZONE_MISSION_LEAVE_SYN)
|
||
{
|
||
__TOUCHED((pMsg, wSize));
|
||
MSG_CG_ZONE_MISSION_LEAVE_SYN* pRecvMsg = (MSG_CG_ZONE_MISSION_LEAVE_SYN *)pMsg;
|
||
|
||
#ifdef __NA_PACKETFLOW_TEST
|
||
SUNLOG(eFULL_LOG, "HANDLER_FROMCLIENT_IMPL(CG_ZONE_MISSION_LEAVE_SYN)");
|
||
#endif
|
||
|
||
if (pUser->IsBeginTransaction())
|
||
{
|
||
MSG_CG_ZONE_MISSION_LEAVE_NAK msg;
|
||
msg.m_dwErrorCode = RC::RC_ROOM_ALREADY_DOING_TRANSACTION;
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
return;
|
||
}
|
||
|
||
if (pUser->GetZoneType() != eZONETYPE_MISSION)
|
||
{
|
||
MSG_CG_ZONE_MISSION_LEAVE_NAK msg;
|
||
msg.m_dwErrorCode = RC::RC_ROOM_INVALIDROOMTYPE;
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
return;
|
||
}
|
||
|
||
ZoneInterface* pPrevZone = g_ZoneManager.FindStaticZone(pUser->GetSelectedCharMapCode());
|
||
if (!pPrevZone)
|
||
{
|
||
MSG_CG_ZONE_MISSION_LEAVE_NAK msg;
|
||
msg.m_dwErrorCode = RC::RC_ROOM_NOTEXISTVILLAGE;
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
return;
|
||
}
|
||
|
||
const eZONETYPE prevZoneType = pPrevZone->GetType();
|
||
const DWORD AcceptablePrevZoneType =
|
||
(1 << eZONETYPE_VILLAGE) |
|
||
(1 << eZONETYPE_FIELD) |
|
||
(1 << eZONETYPE_DOMINATION_FIELD);
|
||
|
||
BOOLEAN enableAccept = !!(AcceptablePrevZoneType & (1 << prevZoneType));
|
||
ZoneInterface* pZone = NULL;
|
||
|
||
if (enableAccept == 0 || !(pZone = g_ZoneManager.FindZone(pUser->GetZoneKey())))
|
||
{
|
||
MSG_CG_ZONE_MISSION_LEAVE_NAK msg;
|
||
msg.m_dwErrorCode = RC::RC_ROOM_NOTEXISTROOM;
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
return;
|
||
}
|
||
|
||
if (pZone->GetUserNum() >= 2 && pRecvMsg->m_Reason == MSG_CG_ZONE_MISSION_LEAVE_SYN::REASON_INTEND)
|
||
{
|
||
MSG_AG_STATUS_DECREASE_DURA_CMD msg;
|
||
pUser->SendToLinkedServer(&msg, sizeof(msg));
|
||
}
|
||
|
||
WORD wFromMapCode = pZone->GetMapCode();
|
||
|
||
//Village* pVillage = (Village*)pPrevZone;
|
||
CheckMoveZonePolicy* const pCheckMoveZonePolicy =
|
||
MoveZonePolicy<MZTF_ROOM_TO_STATIC>::AlignInfo(
|
||
pUser,
|
||
//{ From | To }
|
||
eZONETYPE_MISSION, prevZoneType, // eZONETYPE
|
||
pUser->GetZoneKey(), pPrevZone->GetKey()); // ZoneKey
|
||
RC::eROOM_RESULT rt = g_ZoneManager.MoveZone(pCheckMoveZonePolicy, RoomArgument::GetEmpty());
|
||
if (RC::RC_ROOM_SUCCESS == rt)
|
||
{
|
||
pUser->BeginTransaction(TR_LEAVE_MISSION_FOR_VILLAGE);
|
||
|
||
pUser->SetTRRoomKey(pPrevZone->GetKey());
|
||
//if(eZONETYPE_VILLAGE == ztZONE)
|
||
|
||
GAMELOG->MoveVillage(pUser, wFromMapCode, pUser->GetSelectedCharMapCode(), TRUE);
|
||
}
|
||
else
|
||
{
|
||
MSG_CG_ZONE_MISSION_LEAVE_NAK msg;
|
||
msg.m_dwErrorCode = rt;
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
}
|
||
}
|
||
|
||
HANDLER_CG_IMPL(CG_ZONE_HUNTING_LEAVE_SYN)
|
||
{
|
||
__TOUCHED((pUser, pMsg, wSize));
|
||
// (WAVERIX) (090624) (CHANGES) Remove unused section 'Hunting'
|
||
ASSERT("Function Not Suported!!");
|
||
return;
|
||
// MSG_CG_ZONE_HUNTING_LEAVE_SYN* pRecvMsg = (MSG_CG_ZONE_HUNTING_LEAVE_SYN *)pMsg;
|
||
//
|
||
//#ifdef __NA_PACKETFLOW_TEST
|
||
// SUNLOG(eFULL_LOG, "HANDLER_FROMCLIENT_IMPL(CG_ZONE_HUNTING_LEAVE_SYN)");
|
||
//#endif
|
||
//
|
||
// if(pUser->IsBeginTransaction())
|
||
// {
|
||
// MSG_CG_ZONE_HUNTING_LEAVE_NAK msg;
|
||
// msg.m_dwErrorCode = RC::RC_ROOM_ALREADY_DOING_TRANSACTION;
|
||
// pUser->SendPacket(&msg, sizeof(msg));
|
||
// return;
|
||
// }
|
||
//
|
||
// if(pUser->GetZoneType() != eZONETYPE_HUNTING)
|
||
// {
|
||
// MSG_CG_ZONE_HUNTING_LEAVE_NAK msg;
|
||
// msg.m_dwErrorCode = RC::RC_ROOM_INVALIDROOMTYPE;
|
||
// pUser->SendPacket(&msg, sizeof(msg));
|
||
// return;
|
||
// }
|
||
//
|
||
// Village* pVillage = g_ZoneManager.FindVillage(pUser->GetSelectedCharMapCode());
|
||
// if(!pVillage)
|
||
// {
|
||
// MSG_CG_ZONE_HUNTING_LEAVE_NAK msg;
|
||
// msg.m_dwErrorCode = RC::RC_ROOM_NOTEXISTVILLAGE;
|
||
// pUser->SendPacket(&msg, sizeof(msg));
|
||
// return;
|
||
// }
|
||
//
|
||
// WORD wFromMapCode = pVillage->GetMapCode();
|
||
//
|
||
// CheckMoveZonePolicy* const pCheckMoveZonePolicy =
|
||
// MoveZonePolicy<MZTF_ROOM_TO_STATIC>::AlignInfo(
|
||
// pUser
|
||
// //{ From | To }
|
||
// , eZONETYPE_HUNTING, eZONETYPE_VILLAGE // eZONETYPE
|
||
// , pUser->GetZoneKey(), pVillage->GetKey() // ZoneKey
|
||
// );
|
||
// const RC::eROOM_RESULT rt = g_ZoneManager.MoveZone(pCheckMoveZonePolicy, RoomArgument::GetEmpty());
|
||
// if(RC::RC_ROOM_SUCCESS == rt)
|
||
// {
|
||
// pUser->BeginTransaction(TR_LEAVE_HUNTING_FOR_VILLAGE);
|
||
// pUser->SetTRRoomKey(pVillage->GetKey());
|
||
//
|
||
// GAMELOG->MoveVillage(pUser, wFromMapCode, pUser->GetSelectedCharMapCode(), TRUE);
|
||
//
|
||
// }
|
||
// else
|
||
// {
|
||
// MSG_CG_ZONE_HUNTING_LEAVE_NAK msg;
|
||
// msg.m_dwErrorCode = rt;
|
||
// pUser->SendPacket(&msg, sizeof(msg));
|
||
// }
|
||
}
|
||
|
||
HANDLER_CG_IMPL(CG_ZONE_PVP_LEAVE_SYN)
|
||
{
|
||
__TOUCHED((pMsg, wSize));
|
||
MSG_CG_ZONE_PVP_LEAVE_SYN* pRecvMsg = (MSG_CG_ZONE_PVP_LEAVE_SYN *)pMsg;
|
||
|
||
#ifdef __NA_PACKETFLOW_TEST
|
||
SUNLOG(eFULL_LOG, "HANDLER_FROMCLIENT_IMPL(CG_ZONE_PVP_LEAVE_SYN)");
|
||
#endif
|
||
|
||
|
||
if (pUser->IsBeginTransaction())
|
||
{
|
||
MSG_CG_ZONE_PVP_LEAVE_NAK msg;
|
||
msg.m_dwErrorCode = RC::RC_ROOM_ALREADY_DOING_TRANSACTION;
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
return;
|
||
}
|
||
|
||
if (pUser->GetZoneType() != eZONETYPE_PVP)
|
||
{
|
||
MSG_CG_ZONE_PVP_LEAVE_NAK msg;
|
||
msg.m_dwErrorCode = RC::RC_ROOM_INVALIDROOMTYPE;
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
return;
|
||
}
|
||
|
||
Village* pVillage = g_ZoneManager.FindVillage(pUser->GetSelectedCharMapCode());
|
||
if (!pVillage)
|
||
{
|
||
MSG_CG_ZONE_PVP_LEAVE_NAK msg;
|
||
msg.m_dwErrorCode = RC::RC_ROOM_NOTEXISTVILLAGE;
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
return;
|
||
}
|
||
|
||
CheckMoveZonePolicy* const pCheckMoveZonePolicy =
|
||
MoveZonePolicy<MZTF_ROOM_TO_STATIC>::AlignInfo(
|
||
pUser
|
||
//{ From | To }
|
||
, eZONETYPE_PVP, eZONETYPE_VILLAGE // eZONETYPE
|
||
, pUser->GetZoneKey(), pVillage->GetKey() // ZoneKey
|
||
);
|
||
const RC::eROOM_RESULT rt = g_ZoneManager.MoveZone(pCheckMoveZonePolicy, RoomArgument::GetEmpty());
|
||
if (RC::RC_ROOM_SUCCESS == rt)
|
||
{
|
||
pUser->BeginTransaction(TR_LEAVE_PVP_FOR_VILLAGE);
|
||
pUser->SetTRRoomKey(pVillage->GetKey());
|
||
}
|
||
else
|
||
{
|
||
MSG_CG_ZONE_PVP_LEAVE_NAK msg;
|
||
msg.m_dwErrorCode = rt;
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
}
|
||
}
|
||
|
||
HANDLER_CG_IMPL(CG_ZONE_CHUNTING_LEAVE_SYN)
|
||
{
|
||
__TOUCHED((pMsg, wSize));
|
||
MSG_CG_ZONE_CHUNTING_LEAVE_SYN* pRecvMsg = (MSG_CG_ZONE_CHUNTING_LEAVE_SYN *)pMsg;
|
||
|
||
#ifdef __NA_PACKETFLOW_TEST
|
||
SUNLOG(eFULL_LOG, "HANDLER_FROMCLIENT_IMPL(CG_ZONE_CHUNTING_LEAVE_SYN)");
|
||
#endif
|
||
|
||
|
||
if (pUser->IsBeginTransaction())
|
||
{
|
||
MSG_CG_ZONE_CHUNTING_LEAVE_NAK msg;
|
||
msg.m_dwErrorCode = RC::RC_ROOM_ALREADY_DOING_TRANSACTION;
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
return;
|
||
}
|
||
|
||
if (pUser->GetZoneType() != eZONETYPE_CHUNTING)
|
||
{
|
||
MSG_CG_ZONE_CHUNTING_LEAVE_NAK msg;
|
||
msg.m_dwErrorCode = RC::RC_ROOM_INVALIDROOMTYPE;
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
return;
|
||
}
|
||
|
||
Village* pVillage = g_ZoneManager.FindVillage(pUser->GetSelectedCharMapCode());
|
||
if (!pVillage)
|
||
{
|
||
MSG_CG_ZONE_CHUNTING_LEAVE_NAK msg;
|
||
msg.m_dwErrorCode = RC::RC_ROOM_NOTEXISTVILLAGE;
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
return;
|
||
}
|
||
|
||
WORD wFromMapCode = pVillage->GetMapCode();
|
||
|
||
CheckMoveZonePolicy* const pCheckMoveZonePolicy =
|
||
MoveZonePolicy<MZTF_CHUNTING_TO_VILLAGE>::AlignInfo(
|
||
pUser
|
||
//{ From | To }
|
||
, eZONETYPE_CHUNTING, eZONETYPE_VILLAGE // eZONETYPE
|
||
, pUser->GetZoneKey(), pVillage->GetKey() // ZoneKey
|
||
);
|
||
const RC::eROOM_RESULT rt = g_ZoneManager.MoveZone(pCheckMoveZonePolicy, RoomArgument::GetEmpty());
|
||
if (RC::RC_ROOM_SUCCESS == rt)
|
||
{
|
||
pUser->BeginTransaction(TR_LEAVE_CHUNTING_FOR_VILLAGE);
|
||
pUser->SetTRRoomKey(pVillage->GetKey());
|
||
|
||
GAMELOG->MoveVillage(pUser, wFromMapCode, pUser->GetSelectedCharMapCode(), TRUE);
|
||
}
|
||
else
|
||
{
|
||
MSG_CG_ZONE_CHUNTING_LEAVE_NAK msg;
|
||
msg.m_dwErrorCode = rt;
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
}
|
||
}
|
||
|
||
HANDLER_CG_IMPL(CG_ZONE_INSTANCE_DUNGEON_LEAVE_SYN)
|
||
{
|
||
__TOUCHED((pMsg, wSize));
|
||
MSG_CG_ZONE_INSTANCE_DUNGEON_LEAVE_SYN* pRecvMsg = (MSG_CG_ZONE_INSTANCE_DUNGEON_LEAVE_SYN *)pMsg;
|
||
|
||
#ifdef __NA_PACKETFLOW_TEST
|
||
SUNLOG(eFULL_LOG, "HANDLER_FROMCLIENT_IMPL(CG_ZONE_INSTANCE_DUNGEON_LEAVE_SYN)");
|
||
#endif
|
||
|
||
if (pUser->IsBeginTransaction())
|
||
{
|
||
MSG_CG_ZONE_INSTANCE_DUNGEON_LEAVE_NAK msg;
|
||
msg.m_dwErrorCode = RC::RC_ROOM_ALREADY_DOING_TRANSACTION;
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
return;
|
||
}
|
||
|
||
if (pUser->GetZoneType() != eZONETYPE_INSTANCE)
|
||
{
|
||
MSG_CG_ZONE_INSTANCE_DUNGEON_LEAVE_NAK msg;
|
||
msg.m_dwErrorCode = RC::RC_ROOM_INVALIDROOMTYPE;
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
return;
|
||
}
|
||
|
||
ZoneInterface* pPreZone = NULL;
|
||
pPreZone = (ZoneInterface*)g_ZoneManager.FindVillage(pUser->GetSelectedCharMapCode());
|
||
if (!pPreZone)
|
||
{
|
||
pPreZone = (ZoneInterface*)g_ZoneManager.FindHuntingField(pUser->GetSelectedCharMapCode());
|
||
if (!pPreZone)
|
||
{
|
||
MSG_CG_ZONE_INSTANCE_DUNGEON_LEAVE_NAK msg;
|
||
msg.m_dwErrorCode = RC::RC_ROOM_NOTEXISTVILLAGE;
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
return;
|
||
}
|
||
}
|
||
|
||
|
||
WORD wFromMapCode = pPreZone->GetMapCode();
|
||
|
||
CheckMoveZonePolicy* const pCheckMoveZonePolicy =
|
||
MoveZonePolicy<MZTF_ROOM_TO_STATIC>::AlignInfo(
|
||
pUser
|
||
//{ From | To }
|
||
, eZONETYPE_INSTANCE, pPreZone->GetType() // eZONETYPE
|
||
, pUser->GetZoneKey(), pPreZone->GetKey() // ZoneKey
|
||
);
|
||
const RC::eROOM_RESULT rt = g_ZoneManager.MoveZone(pCheckMoveZonePolicy, RoomArgument::GetEmpty());
|
||
|
||
if (RC::RC_ROOM_SUCCESS == rt)
|
||
{
|
||
pUser->BeginTransaction(TR_LEAVE_INSTANCE_DUNGEON);
|
||
pUser->SetTRRoomKey(pPreZone->GetKey());
|
||
|
||
GAMELOG->MoveVillage(pUser, wFromMapCode, pUser->GetSelectedCharMapCode(), TRUE);
|
||
}
|
||
else
|
||
{
|
||
MSG_CG_ZONE_INSTANCE_DUNGEON_LEAVE_NAK msg;
|
||
msg.m_dwErrorCode = rt;
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
}
|
||
}
|
||
|
||
HANDLER_CG_IMPL(CG_ZONE_HUNTING_RELAY_CREATE_SYN)
|
||
{
|
||
__TOUCHED((pUser, pMsg, wSize));
|
||
// (WAVERIX) (090624) (CHANGES) Remove unused section 'Hunting'
|
||
ASSERT("Function Not Suported!!");
|
||
return;
|
||
}
|
||
|
||
HANDLER_CG_IMPL(CG_ZONE_HUNTING_RELAY_JOIN_SYN)
|
||
{
|
||
__TOUCHED((pUser, pMsg, wSize));
|
||
// (WAVERIX) (090624) (CHANGES) Remove unused section 'Hunting'
|
||
ASSERT("Function Not Suported!!");
|
||
return;
|
||
// MSG_CG_ZONE_HUNTING_RELAY_JOIN_SYN* pRecvMsg = (MSG_CG_ZONE_HUNTING_RELAY_JOIN_SYN *)pMsg;
|
||
//
|
||
//#ifdef __NA_PACKETFLOW_TEST
|
||
// SUNLOG(eFULL_LOG, "HANDLER_FROMCLIENT_IMPL(CG_ZONE_HUNTING_RELAY_JOIN_SYN)");
|
||
//#endif
|
||
//
|
||
//
|
||
// if(pUser->IsBeginTransaction())
|
||
// {
|
||
// MSG_CG_ZONE_HUNTING_RELAY_JOIN_NAK msg;
|
||
// msg.m_dwErrorCode = RC::RC_ROOM_ALREADY_DOING_TRANSACTION;
|
||
// pUser->SendPacket(&msg, sizeof(msg));
|
||
// return;
|
||
// }
|
||
//
|
||
// eROOMSTATE_TYPE OldRoomState = eROOMSTATE_NONE;
|
||
// HuntingRoom* pHuntingRoom = g_ZoneManager.FindHunting(pRecvMsg->m_HuntingKey);
|
||
// if(pHuntingRoom)
|
||
// {
|
||
// OldRoomState = pHuntingRoom->GetRoomState();
|
||
// pHuntingRoom->SetRoomState(eROOMSTATE_GENERNAL);
|
||
// }
|
||
//
|
||
// CheckMoveZonePolicy* const pCheckMoveZonePolicy =
|
||
// MoveZonePolicy<MZTF_HUNTING_TO_HUNTING>::AlignInfo(
|
||
// pUser
|
||
// //{ From | To }
|
||
// , eZONETYPE_HUNTING, eZONETYPE_HUNTING // eZONETYPE
|
||
// , pUser->GetZoneKey(), pRecvMsg->m_HuntingKey // ZoneKey
|
||
// );
|
||
// RoomArgument args((eZONEPUBLIC)pRecvMsg->m_byRoomPublic, (pRecvMsg->m_byRoomPublic==eZONEPUBLIC_PUBLIC?NULL:pRecvMsg->m_pszRoomPWD));
|
||
// const RC::eROOM_RESULT rt = g_ZoneManager.MoveZone(pCheckMoveZonePolicy, args);
|
||
// if(RC::RC_ROOM_SUCCESS == rt)
|
||
// {
|
||
// pUser->SetTRRoomKey(pRecvMsg->m_HuntingKey);
|
||
// MSG_CG_ZONE_HUNTING_RELAY_JOIN_ACK jmsg;
|
||
// pUser->SendPacket(&jmsg, sizeof(jmsg));
|
||
// }
|
||
// else
|
||
// {
|
||
// MSG_CG_ZONE_HUNTING_RELAY_JOIN_NAK msg;
|
||
// msg.m_dwErrorCode = rt;
|
||
// pUser->SendPacket(&msg, sizeof(msg));
|
||
// }
|
||
//
|
||
// if(pHuntingRoom) pHuntingRoom->SetRoomState(OldRoomState);
|
||
}
|
||
|
||
|
||
HANDLER_CG_IMPL(CG_ZONE_PORTAL_FIELD_MOVE_SYN)
|
||
{
|
||
__TOUCHED((pMsg, wSize));
|
||
MSG_CG_ZONE_PORTAL_FIELD_MOVE_SYN* pRecvMsg = (MSG_CG_ZONE_PORTAL_FIELD_MOVE_SYN *)pMsg;
|
||
|
||
#ifdef __NA_PACKETFLOW_TEST
|
||
SUNLOG(eFULL_LOG, "HANDLER_FROMCLIENT_IMPL(CG_ZONE_PORTAL_FIELD_MOVE_SYN)");
|
||
#endif
|
||
|
||
BOOL bIsValidSize = (BOOL)(sizeof(MSG_CG_ZONE_PORTAL_FIELD_MOVE_SYN) == wSize);
|
||
if (!bIsValidSize)
|
||
{
|
||
SUNLOG(eDEV_LOG, _T("[RNDPROTOCOL_REPORT][SIZE] MSG_CG_ZONE_PORTAL_FIELD_MOVE_SYN"));
|
||
return;
|
||
}
|
||
WORD wPortalIndex = pRecvMsg->m_wIndex;
|
||
|
||
//_NA_20110630_BATTLE_ZONE_RENEWAL
|
||
WORD party_key = pUser->GetPartyState().GetPartyKey();
|
||
AgentPartyManager* const party_manager = AgentPartyManager::Instance();
|
||
const PartyRoom* party_room = party_manager->FindPartyRoom(party_key);
|
||
if (party_room && party_room->IsStartWaitingRoom() == true)
|
||
{
|
||
return;
|
||
}
|
||
|
||
if (pUser->IsBeginTransaction())
|
||
{
|
||
MSG_CG_ZONE_PORTAL_FIELD_MOVE_NAK msg;
|
||
msg.m_byErrorCode = RC::RC_ROOM_ALREADY_DOING_TRANSACTION;
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
return;
|
||
}
|
||
|
||
if (pUser->GetBehaveState() != PLAYER_BEHAVE_IDLE_STATE)
|
||
{
|
||
MSG_CG_ZONE_PORTAL_FIELD_MOVE_NAK msg;
|
||
//_NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND
|
||
if (pUser->GetBehaveState() == PLAYER_BEHAVE_RESERVATION_BATTLE_GROUND_ZONE)
|
||
msg.m_byErrorCode = RC::RC_ROOM_BATTLE_GROUND_RESERVATION;
|
||
else
|
||
msg.m_byErrorCode = RC::RC_ROOM_CANNOT_WAYPOINT_PLAYERSTATE;
|
||
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
return;
|
||
}
|
||
|
||
sMAP_ENTERENCE_PORTAL* pFromInfo = MapInfoParser::Instance()->GetMapPortal(wPortalIndex);
|
||
if (!pFromInfo)
|
||
{
|
||
MSG_CG_ZONE_PORTAL_FIELD_MOVE_NAK msg;
|
||
msg.m_byErrorCode = RC::RC_ROOM_INVALID_MAPCODE;
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
return;
|
||
}
|
||
|
||
ZoneInterface* pFromZone = g_ZoneManager.FindStaticZone(pFromInfo->wWorldFrom);
|
||
ZoneInterface* pToZone = g_ZoneManager.FindStaticZone(pFromInfo->wWorldTo);
|
||
if (!pFromZone || !pToZone)
|
||
{
|
||
MSG_CG_ZONE_PORTAL_FIELD_MOVE_NAK msg;
|
||
msg.m_byErrorCode = RC::RC_ROOM_NOTEXISTVILLAGE;
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
return;
|
||
}
|
||
|
||
RC::eROOM_RESULT rt = pToZone->CanJoin(pUser, (eZONEPUBLIC)0, NULL);
|
||
if (RC::RC_ROOM_SUCCESS != rt)
|
||
{
|
||
MSG_CG_ZONE_PORTAL_FIELD_MOVE_NAK msg;
|
||
msg.m_byErrorCode = rt;
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
return;
|
||
}
|
||
|
||
MSG_AG_ZONE_PORTAL_FIELD_MOVE_SYN msg;
|
||
msg.m_wIndex = wPortalIndex;
|
||
pUser->SendToLinkedServer(&msg, sizeof(msg));
|
||
}
|
||
|
||
//{__NA1279_1281_090209_TIMELINE_QUEST_BASED_MISSION__
|
||
HANDLER_CG_IMPL(CG_ZONE_EX_QUEST_PORTAL_ENTER_SYN)
|
||
{
|
||
__TOUCHED((pMsg, wSize));
|
||
typedef MSG_CG_ZONE_EX_QUEST_PORTAL_ENTER_SYN RECEIVED_PACKET;
|
||
const MSG_CG_ZONE_EX_QUEST_PORTAL_ENTER_SYN* pRecvMsg =
|
||
static_cast<MSG_CG_ZONE_EX_QUEST_PORTAL_ENTER_SYN*>(pMsg);
|
||
|
||
//_NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND
|
||
if (BattleGroundManager::Instance()->IsValidReservationMember(pUser->GetUserKey()))
|
||
{
|
||
MSG_CG_ZONE_EX_QUEST_PORTAL_ENTER_NAK msg;
|
||
msg.errorType = msg.eRESULT_ROOM;
|
||
msg.errorCode = RC::RC_ROOM_BATTLE_GROUND_RESERVATION;
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
return;
|
||
}
|
||
|
||
//_NA_20110630_BATTLE_ZONE_RENEWAL
|
||
WORD party_key = pUser->GetPartyState().GetPartyKey();
|
||
AgentPartyManager* const party_manager = AgentPartyManager::Instance();
|
||
const PartyRoom* party_room = party_manager->FindPartyRoom(party_key);
|
||
if (party_room && party_room->IsStartWaitingRoom() == true)
|
||
{
|
||
return;
|
||
}
|
||
|
||
const RECEIVED_PACKET::eSYNC syncType = RECEIVED_PACKET::eSYNC(pRecvMsg->syncType);
|
||
{ // check integrity
|
||
BOOLEAN requestCheck = syncType == pRecvMsg->eSYNC_TEMP_PORTAL ||
|
||
syncType == pRecvMsg->eSYNC_FIXED_PORTAL;
|
||
|
||
if (requestCheck == FALSE || pRecvMsg->GetSize() != wSize)
|
||
return;
|
||
};
|
||
|
||
const eZONE_STATE zoneState = pUser->GetZoneState();
|
||
const BOOLEAN acceptableState =
|
||
(ePRS_AT_ZONE & zoneState) && (ePRS_AT_CHARSELECT != zoneState);
|
||
if (!acceptableState)
|
||
{ // irregular
|
||
return;
|
||
}
|
||
|
||
RC::eROOM_RESULT result = RC::RC_ROOM_SUCCESS;
|
||
if (syncType == pRecvMsg->eSYNC_TEMP_PORTAL)
|
||
{ // Sub Mission, etc...
|
||
result = PortalManager::RequestEnterZoneTempPortal(pUser, pRecvMsg->portalKey);
|
||
}
|
||
|
||
if (syncType == pRecvMsg->eSYNC_FIXED_PORTAL)
|
||
{ // Main Mission, etc...
|
||
result = PortalManager::RequestEnterZoneFixedPortal(pUser,
|
||
pRecvMsg->mapEnterancePortalIndex);
|
||
}
|
||
|
||
if (result != RC::RC_ROOM_SUCCESS)
|
||
{
|
||
MSG_CG_ZONE_EX_QUEST_PORTAL_ENTER_NAK msg;
|
||
msg.errorType = msg.eRESULT_ROOM;
|
||
msg.errorCode = (WORD)result;
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
}
|
||
}
|
||
//}__NA1279_1281_090209_TIMELINE_QUEST_BASED_MISSION__
|
||
|
||
//_NA003129_QUEST_PORTAL_CONVENIENCE_EXTENTION
|
||
HANDLER_CG_IMPL(CG_ZONE_EX_QUEST_PORTAL_WITHDRAW_MEMBER_SYN)
|
||
{
|
||
#if !defined(_NA003129_QUEST_PORTAL_CONVENIENCE_EXTENTION)
|
||
__UNUSED((pUser, pMsg, wSize));
|
||
ASSERT(!"function not supported in this version");
|
||
return;
|
||
#endif
|
||
#ifdef _NA003129_QUEST_PORTAL_CONVENIENCE_EXTENTION
|
||
const MSG_CG_ZONE_EX_QUEST_PORTAL_WITHDRAW_MEMBER_SYN* const recv_msg = \
|
||
static_cast<MSG_CG_ZONE_EX_QUEST_PORTAL_WITHDRAW_MEMBER_SYN*>(pMsg);
|
||
//
|
||
MSG_CG_ZONE_EX_QUEST_PORTAL_WITHDRAW_MEMBER_NAK msg_nak;
|
||
if (PortalManager::RequestWithdrawPortalMember(pUser, &msg_nak.error_code) == false)
|
||
{
|
||
pUser->SendPacket(&msg_nak, sizeof(msg_nak));
|
||
};
|
||
#endif
|
||
}
|
||
|
||
HANDLER_CG_IMPL(CG_GM_CHANNELINFO_SYN)
|
||
{
|
||
__TOUCHED((pMsg, wSize));
|
||
MSG_CG_GM_CHANNELINFO_SYN* pRecvMsg = (MSG_CG_GM_CHANNELINFO_SYN*)pMsg;
|
||
|
||
|
||
MSG_CG_GM_CHANNELINFO_ACK AckMsg;
|
||
AckMsg.m_dwChannelUserNum = UserManager::Instance()->GetNumberOfUsers();
|
||
AckMsg.m_wHuntingRoomCount = (WORD)g_ZoneManager.GetNumberOfHuntingRooms();
|
||
|
||
|
||
AckMsg.m_wMissionRoomCount = (WORD)g_ZoneManager.GetNumberOfMissionRooms();
|
||
|
||
pUser->SendPacket(&AckMsg, sizeof(AckMsg));
|
||
}
|
||
|
||
HANDLER_CG_IMPL(CG_GM_WARP_SYN)
|
||
{
|
||
__TOUCHED((pUser, pMsg, wSize));
|
||
MSG_CG_GM_WARP_SYN* pRecvMsg = (MSG_CG_GM_WARP_SYN*)pMsg;
|
||
|
||
}
|
||
|
||
HANDLER_CG_IMPL(CG_ARMORKIT_FINDHACK)
|
||
{ //OnCG_ARMORKIT_FINDHACK_SYN(User *pUser, MSG_BASE *pMsg, WORD wSize);
|
||
__TOUCHED((pMsg, wSize));
|
||
MSG_CG_ARMORKIT_FINDHACK_SYN* pRecvMsg = (MSG_CG_ARMORKIT_FINDHACK_SYN*)pMsg;
|
||
|
||
MSG_AM_ARMORKIT_FINDHACK_SYN sendMsg;
|
||
|
||
//memset(sendMsg.szIP, 0, sizeof(sendMsg.szIP));
|
||
memcpy(sendMsg.szIP, pUser->GetIP(), sizeof(sendMsg.szIP));
|
||
sendMsg.HackType = pRecvMsg->HackType;
|
||
sendMsg.Size = pRecvMsg->Size;
|
||
sendMsg.dwGuid = pUser->GetUserGUID();
|
||
//memset(sendMsg.Buf, 0, sizeof(sendMsg.Buf));
|
||
memcpy(sendMsg.Buf, pRecvMsg->Buf, sizeof(sendMsg.Buf));
|
||
|
||
AgentServer* pAgentServer = AgentServer::GetInstance();
|
||
ServerSession* pMasterServer = pAgentServer->SessionMasterServer();
|
||
if (!pMasterServer)
|
||
{
|
||
//MessageOut(eCRITICAL_LOG, "ArmorKit FindHack Error - No Master(User %s)", pUser->GetCharName().c_str());
|
||
return;
|
||
}
|
||
pMasterServer->Send((BYTE*)&sendMsg, sizeof(sendMsg));
|
||
|
||
//MessageOut(eFULL_LOG, "ArmorKit Find Hacking tool(User %u/%s)", pUser->GetGUID(), pUser->GetCharName().c_str());
|
||
}
|
||
|
||
HANDLER_CG_IMPL(CG_ZONE_RETURN_VILLAGE_SYN)
|
||
{
|
||
__TOUCHED((pMsg, wSize));
|
||
MSG_CG_ZONE_RETURN_VILLAGE_SYN* pRecvMsg = (MSG_CG_ZONE_RETURN_VILLAGE_SYN*)pMsg;
|
||
|
||
#ifdef __NA_PACKETFLOW_TEST
|
||
SUNLOG(eFULL_LOG, "HANDLER_FROMCLIENT_IMPL(CG_ZONE_RETURN_VILLAGE_SYN)");
|
||
#endif
|
||
|
||
BOOL bIsValidSize = (BOOL)(sizeof(MSG_CG_ZONE_RETURN_VILLAGE_SYN) == wSize);
|
||
if (!bIsValidSize)
|
||
{
|
||
SUNLOG(eDEV_LOG, _T("[RNDPROTOCOL_REPORT][SIZE] MSG_CG_ZONE_RETURN_VILLAGE_SYN"));
|
||
return;
|
||
}
|
||
|
||
if (pUser->IsBeginTransaction())
|
||
{
|
||
MSG_CG_ZONE_RETURN_VILLAGE_NAK nmsg;
|
||
nmsg.m_byErrorCode = RC::RC_CONNECTION_ROOM_ALREADY_DOING_TRANSACTION;
|
||
pUser->SendPacket(&nmsg, sizeof(nmsg));
|
||
return;
|
||
}
|
||
|
||
if (pUser->GetZoneType() != eZONETYPE_FIELD &&
|
||
pUser->GetZoneType() != eZONETYPE_DOMINATION_FIELD &&
|
||
pUser->GetZoneType() != eZONETYPE_SPA_FIELD) //_NA_008069_20150210_ADD_SPA_SYSTEM
|
||
{
|
||
MSG_CG_ZONE_RETURN_VILLAGE_NAK nmsg;
|
||
nmsg.m_byErrorCode = RC::RC_ROOM_INVALID_ROOM_TYPE;
|
||
pUser->SendPacket(&nmsg, sizeof(nmsg));
|
||
return;
|
||
}
|
||
|
||
MSG_AG_ZONE_RETURN_VILLAGE_SYN msg;
|
||
pUser->SendToLinkedServer(&msg, sizeof(msg));
|
||
}
|
||
|
||
HANDLER_CG_IMPL(CG_ZONE_MISSION_RELAY_CREATE_SYN)
|
||
{
|
||
__TOUCHED((pMsg, wSize));
|
||
MSG_CG_ZONE_MISSION_RELAY_CREATE_SYN* pRecvMsg = (MSG_CG_ZONE_MISSION_RELAY_CREATE_SYN*)pMsg;
|
||
|
||
#ifdef __NA_PACKETFLOW_TEST
|
||
SUNLOG(eFULL_LOG, "HANDLER_FROMCLIENT_IMPL(CG_ZONE_MISSION_RELAY_CREATE_SYN)");
|
||
#endif
|
||
|
||
|
||
MSG_CG_ZONE_MISSION_RELAY_CREATE_NAK NakMsg;
|
||
|
||
if (pUser->IsBeginTransaction())
|
||
{
|
||
NakMsg.m_ErrorCode = RC::RC_ROOM_ALREADY_DOING_TRANSACTION;
|
||
pUser->SendPacket(&NakMsg, sizeof(NakMsg));
|
||
return;
|
||
}
|
||
|
||
// (WAVERIX) (090610) (BUG-FIX) AgentServer downfall problem, loop hole protector
|
||
//MissionRoom* pMissionRoom = (MissionRoom*)g_ZoneManager.FindZone(pUser->GetZoneKey());
|
||
MissionRoom* pMissionRoom = 0;
|
||
{
|
||
ZoneInterface* pZoneInterface = g_ZoneManager.FindZone(pUser->GetZoneKey());
|
||
if (pZoneInterface && pZoneInterface->GetType() == eZONETYPE_MISSION)
|
||
pMissionRoom = static_cast<MissionRoom*>(pZoneInterface);
|
||
}
|
||
|
||
if (pMissionRoom == 0)
|
||
{
|
||
NakMsg.m_ErrorCode = RC::RC_ROOM_NOTEXISTROOM;
|
||
pUser->SendPacket(&NakMsg, sizeof(NakMsg));
|
||
return;
|
||
}
|
||
|
||
PolicymentForRoom& rPolicyment = pMissionRoom->RoomPolicyment;
|
||
if (rPolicyment.FIELD & rPolicyment.QUEST_PORTAL_CONTROL)
|
||
{
|
||
NakMsg.m_ErrorCode = RC::RC_ROOM_CANNOT_CREATE_RELAY_ROOM_BY_PORTAL_ENTERED;
|
||
pUser->SendPacket(&NakMsg, sizeof(NakMsg));
|
||
return;
|
||
}
|
||
|
||
LobbyRoom* pLobbyRoom = NULL;
|
||
RC::eROOM_RESULT rt = g_ZoneManager.CreateRelayMissionLobbyRoom(pMissionRoom, pUser, pLobbyRoom);
|
||
|
||
if (RC::RC_ROOM_SUCCESS == rt)
|
||
{
|
||
pUser->BeginTransaction(TR_LEAVE_MISSION_FOR_LOBBY);
|
||
pUser->SetTRRoomKey(pLobbyRoom->GetKey());
|
||
|
||
MSG_CG_ZONE_MISSION_RELAY_CREATE_BRD BrdMsg;
|
||
BrdMsg.m_LobbyKey = pLobbyRoom->GetKey();
|
||
pMissionRoom->SendToAll(&BrdMsg, sizeof(BrdMsg), pUser->GetUserKey());
|
||
}
|
||
else
|
||
{
|
||
NakMsg.m_ErrorCode = rt;
|
||
pUser->SendPacket(&NakMsg, sizeof(NakMsg));
|
||
}
|
||
}
|
||
|
||
HANDLER_CG_IMPL(CG_ZONE_MISSION_RELAY_JOIN_SYN)
|
||
{
|
||
__TOUCHED((pMsg, wSize));
|
||
MSG_CG_ZONE_MISSION_RELAY_JOIN_SYN* pRecvMsg = (MSG_CG_ZONE_MISSION_RELAY_JOIN_SYN*)pMsg;
|
||
|
||
#ifdef __NA_PACKETFLOW_TEST
|
||
SUNLOG(eFULL_LOG, "HANDLER_FROMCLIENT_IMPL(CG_ZONE_MISSION_RELAY_JOIN_SYN)");
|
||
#endif
|
||
|
||
|
||
MSG_CG_ZONE_LOBBY_JOIN_NAK NakMsg;
|
||
|
||
if (pUser->IsBeginTransaction())
|
||
{
|
||
NakMsg.m_dwErrorCode = RC::RC_ROOM_ALREADY_DOING_TRANSACTION;
|
||
pUser->SendPacket(&NakMsg, sizeof(NakMsg));
|
||
return;
|
||
}
|
||
|
||
MissionRoom *pMissionRoom = (MissionRoom*)g_ZoneManager.FindZone(pUser->GetZoneKey());
|
||
if (!pMissionRoom)
|
||
{
|
||
NakMsg.m_dwErrorCode = RC::RC_ROOM_NOTEXISTROOM;
|
||
pUser->SendPacket(&NakMsg, sizeof(NakMsg));
|
||
return;
|
||
}
|
||
|
||
CheckMoveZonePolicy* const pCheckMoveZonePolicy =
|
||
MoveZonePolicy<MZTF_ROOM_TO_LOBBY>::AlignInfo(
|
||
pUser
|
||
//{ From | To }
|
||
, eZONETYPE_MISSION, eZONETYPE_LOBBY // eZONETYPE
|
||
, pUser->GetZoneKey(), pRecvMsg->m_LobbyKey // ZoneKey
|
||
);
|
||
RoomArgument args(pMissionRoom->GetZonePublic(), pMissionRoom->GetRoomPWD());
|
||
const RC::eROOM_RESULT rt = g_ZoneManager.MoveZone(pCheckMoveZonePolicy, args);
|
||
|
||
if (RC::RC_ROOM_SUCCESS == rt)
|
||
{
|
||
pUser->BeginTransaction(TR_LEAVE_MISSION_FOR_LOBBY);
|
||
pUser->SetTRRoomKey(pRecvMsg->m_LobbyKey);
|
||
}
|
||
else
|
||
{
|
||
NakMsg.m_dwErrorCode = rt;
|
||
pUser->SendPacket(&NakMsg, sizeof(NakMsg));
|
||
}
|
||
}
|
||
|
||
|
||
HANDLER_CG_IMPL(CG_ZONE_INSTANCE_DUNGEON_REQUEST_SYN)
|
||
{
|
||
__TOUCHED((pMsg, wSize));
|
||
MSG_CG_ZONE_INSTANCE_DUNGEON_REQUEST_SYN* pRecvMsg = (MSG_CG_ZONE_INSTANCE_DUNGEON_REQUEST_SYN*)pMsg;
|
||
|
||
#ifdef _NA_LEAVE_PARTY_AT_USE_ITEM_TO_MISSION
|
||
if (pUser->GetPartyState().IsPartyMember() == true)
|
||
{
|
||
AgentPartyManager * const party_manager = AgentPartyManager::Instance();
|
||
RC::ePARTY_RESULT result_code;
|
||
result_code = party_manager->LeaveParty(pUser, eREASON_LEAVE_PARTY_INTEND);
|
||
|
||
if (result_code != RC::RC_PARTY_SUCCESS)
|
||
{
|
||
SUNLOG(eCRITICAL_LOG,
|
||
__FUNCTION__" : Fail levave party : code : %d",
|
||
result_code);
|
||
}
|
||
}
|
||
#endif
|
||
|
||
if (pUser->GetLockItemPosForInstanceDungeon() != INVALID_POSTYPE_VALUE)
|
||
return;
|
||
|
||
pUser->SetLockItemPosForInstanceDungeon(pRecvMsg->m_ItemPos);
|
||
|
||
MSG_AG_ZONE_CAN_CREATE_INSTANCE_DUNGEON_SYN msg;
|
||
msg.m_ItemPos = pRecvMsg->m_ItemPos;
|
||
pUser->SendToLinkedServer(&msg, sizeof(msg));
|
||
}
|
||
|
||
HANDLER_CG_IMPL(CG_CONNECTION_CRASH_REPORT_SYN)
|
||
{
|
||
__TOUCHED((pMsg, wSize));
|
||
MSG_CG_CONNECTION_CRASH_REPORT_SYN* pRecvMsg = (MSG_CG_CONNECTION_CRASH_REPORT_SYN*)pMsg;
|
||
//if(!pUser) return;
|
||
// (CHANGES) (f100607.4L) fix up a buffer overrun problem
|
||
//BuildVer
|
||
TCHAR szBuildVer[MAX_BUILD_VERSION_SIZE + 1];
|
||
strncpy(szBuildVer, pRecvMsg->m_CrashInfo.m_szBuildVer, _countof(szBuildVer));
|
||
szBuildVer[_countof(szBuildVer) - 1] = '\0';
|
||
//ModuleName
|
||
TCHAR szModuleName[MAX_MODULE_NAME_SIZE + 1];
|
||
strncpy(szModuleName, pRecvMsg->m_CrashInfo.m_szModuleName, _countof(szModuleName));
|
||
szModuleName[_countof(szModuleName) - 1] = '\0';
|
||
//OS
|
||
TCHAR szOS[MAX_OS_NAME_SIZE + 1];
|
||
strncpy(szOS, pRecvMsg->m_ComputerInfo.m_szOS, _countof(szOS));
|
||
szOS[_countof(szOS) - 1] = '\0';
|
||
//Process
|
||
TCHAR szProcess[MAX_PROCESS_NAME_SIZE + 1];
|
||
strncpy(szProcess, pRecvMsg->m_ComputerInfo.m_szProcess, _countof(szProcess));
|
||
szProcess[_countof(szProcess) - 1] = '\0';
|
||
//PhysicalMemory
|
||
TCHAR szPhysicalMemory[MAX_PHYSICAL_MEMORY_SIZE + 1];
|
||
strncpy(szPhysicalMemory, pRecvMsg->m_ComputerInfo.m_szPhysicalMemory, _countof(szPhysicalMemory));
|
||
szPhysicalMemory[_countof(szPhysicalMemory) - 1] = '\0';
|
||
//DirectX
|
||
TCHAR szDirectXVersion[MAX_DIRECTX_NAME_SIZE + 1];
|
||
strncpy(szDirectXVersion, pRecvMsg->m_ComputerInfo.m_szDirectXVersion, _countof(szDirectXVersion));
|
||
szDirectXVersion[_countof(szDirectXVersion) - 1] = '\0';
|
||
//Description
|
||
TCHAR szDescription[MAX_DESCRIPT_SIZE + 1];
|
||
strncpy(szDescription, pRecvMsg->m_ComputerInfo.m_szDescription, _countof(szDescription));
|
||
szDescription[_countof(szDescription) - 1] = '\0';
|
||
//DisplayMemory
|
||
TCHAR szDisplayMemory[MAX_DISPLAY_MEMORY_SIZE + 1];
|
||
strncpy(szDisplayMemory, pRecvMsg->m_ComputerInfo.m_szDisplayMemory, _countof(szDisplayMemory));
|
||
szDisplayMemory[_countof(szDisplayMemory) - 1] = '\0';
|
||
//Driver
|
||
TCHAR szDriverVersion[MAX_DRIVER_VERSION_SIZE + 1];
|
||
strncpy(szDriverVersion, pRecvMsg->m_ComputerInfo.m_szDriverVersion, _countof(szDriverVersion));
|
||
szDriverVersion[_countof(szDriverVersion) - 1] = '\0';
|
||
|
||
SYSTEMTIME time;
|
||
util::YYYYMMDDHHMMSSToSYSTEMTIME(pRecvMsg->m_CrashInfo.m_dw64CrashTime, time);
|
||
|
||
SECURELOG(SECURELOG_USERINFO(pUser, eABUSE_CRASH_REPORT, eABUSE_SUB_CRASH_REPORT),
|
||
"CrashAddress = %u, "
|
||
"ModuleStartAddress = %u, "
|
||
"ModuleEndAddress = %u, "
|
||
"ModuleCrashOffset = %u, "
|
||
"ModuleName = %s, "
|
||
"BuildVer = %s, "
|
||
"CrashTime = %d/%d/%d-%d:%d:%d, "
|
||
"OS = %s, "
|
||
"Processor = %s, "
|
||
"PhysicalMemory = %s , "
|
||
"DirectXVersion = %s , "
|
||
"Description = %s, "
|
||
"DisplayMemory = %s, "
|
||
"DriverVersion = %s ",
|
||
pRecvMsg->m_CrashInfo.m_dwCrahAddress,
|
||
pRecvMsg->m_CrashInfo.m_dwModuleStartAddress,
|
||
pRecvMsg->m_CrashInfo.m_dwModuleEndAddress,
|
||
pRecvMsg->m_CrashInfo.m_dwModuleCrashOffset,
|
||
szModuleName,
|
||
szBuildVer,
|
||
time.wYear, time.wMonth, time.wDay, time.wHour, time.wMinute, time.wSecond,
|
||
szOS,
|
||
szProcess,
|
||
szPhysicalMemory,
|
||
szDirectXVersion,
|
||
szDescription,
|
||
szDisplayMemory,
|
||
szDriverVersion);
|
||
}
|
||
|
||
#include "Party\Party.h"
|
||
HANDLER_CG_IMPL(CG_ZONE_EX_LOBBY_NAME_CHANGE_SYN)
|
||
{
|
||
__TOUCHED((pMsg, wSize));
|
||
MSG_CG_ZONE_EX_LOBBY_NAME_CHANGE_SYN* pRecvMsg = (MSG_CG_ZONE_EX_LOBBY_NAME_CHANGE_SYN *)pMsg;
|
||
|
||
if (sizeof(*pRecvMsg) != wSize)
|
||
return;
|
||
|
||
MSG_CG_ZONE_EX_LOBBY_NAME_CHANGE_NAK nmsg;
|
||
|
||
ZoneInterface *pZone = g_ZoneManager.FindZone(pUser->GetZoneKey());
|
||
if (!pZone)
|
||
{
|
||
nmsg.m_dwErrorCode = RC::RC_ROOM_FAILED;
|
||
pUser->SendPacket(&nmsg, sizeof(nmsg));
|
||
return;
|
||
}
|
||
|
||
if (pUser->IsBeginTransaction())
|
||
{
|
||
nmsg.m_dwErrorCode = RC::RC_ROOM_ALREADY_DOING_TRANSACTION;
|
||
pUser->SendPacket(&nmsg, sizeof(nmsg));
|
||
return;
|
||
}
|
||
|
||
if (pZone->GetType() != eZONETYPE_LOBBY)
|
||
{
|
||
nmsg.m_dwErrorCode = RC::RC_ROOM_FAILED;
|
||
pUser->SendPacket(&nmsg, sizeof(nmsg));
|
||
return;
|
||
}
|
||
|
||
RoomInterface* pRoom = (RoomInterface*)pZone;
|
||
|
||
if (pRoom->GetMaster() != pUser)
|
||
{
|
||
nmsg.m_dwErrorCode = RC::RC_ROOM_ISNOTMATERPLAYER;
|
||
pUser->SendPacket(&nmsg, sizeof(nmsg));
|
||
return;
|
||
}
|
||
|
||
if (((LobbyRoom*)pZone)->ChangeRoomTitle(pRecvMsg->m_pszRoomTitle) == FALSE)
|
||
{
|
||
nmsg.m_dwErrorCode = RC::RC_ROOM_CANNOT_USE_ROOM_TITLE;
|
||
pUser->SendPacket(&nmsg, sizeof(nmsg));
|
||
return;
|
||
}
|
||
|
||
ChangeRoomName Op(pRecvMsg->m_pszRoomTitle);
|
||
pZone->Foreach(Op);
|
||
}
|
||
|
||
HANDLER_CG_IMPL(CG_ZONE_EX_TUTORIAL_FIELD_LEAVE_SYN)
|
||
{
|
||
__TOUCHED((pMsg, wSize));
|
||
// (WAVERIX) (090114) add ZoneType Check Constraints
|
||
// case: 虽然有可能是故意的,但是根据时间差,用“选择角色”按钮
|
||
// (选择教程字段->角色)离开时按“教程退出”按钮,
|
||
// 修改“如果有Zone,就应该存在MapCode”的断言被打破的情况.
|
||
ZoneInterface* zone = g_ZoneManager.FindZone(pUser->GetZoneKey());
|
||
// old code "if(!zone)"
|
||
//if(FALSE == (zone && zone->GetType() == eZONETYPE_FIELD))
|
||
// return;
|
||
const sMAPINFO* map_info = 0;
|
||
BOOLEAN isAcceptable = zone && !!(map_info = zone->GetMapInfo());
|
||
if (isAcceptable == 0)
|
||
return;
|
||
|
||
eZONETYPE zoneType = eZONETYPE(map_info->byMKind);
|
||
if (eZONETYPE_TUTORIAL_FIELD == zoneType)
|
||
{ // SendTo GameServer, Action: Leave Tutorial Field,
|
||
MSG_AG_ZONE_TUTORIAL_SKIP_SYN msgSYN;
|
||
pUser->SendToLinkedServer(&msgSYN, sizeof(msgSYN));
|
||
}
|
||
}
|
||
|
||
HANDLER_CG_IMPL(CG_ZONE_EX_TUTORIAL_MISSION_LEAVE_SYN)
|
||
{
|
||
__TOUCHED((pMsg, wSize));
|
||
const MAPCODE HARDCODED_TUTORIAL_MISSION_MAPCODE = 31;
|
||
const DWORD CHAR_VILLAGE_TRINGGEL_BITMAP = (1 << eCHAR_BERSERKER | 1 << eCHAR_ELEMENTALIST);
|
||
const DWORD CHAR_VILLAGE_VALDCHEN_BITMAP = (1 << eCHAR_DRAGON | 1 << eCHAR_VALKYRIE |
|
||
1 << eCHAR_SHADOW);
|
||
|
||
ZoneInterface* pZone = g_ZoneManager.FindZone(pUser->GetZoneKey());
|
||
if (!pZone)
|
||
{
|
||
return;
|
||
}
|
||
|
||
MAPCODE mapCode = pZone->GetMapCode();
|
||
|
||
if (HARDCODED_TUTORIAL_MISSION_MAPCODE == mapCode)
|
||
{
|
||
// SendTo GameServer
|
||
DWORD charClass = pUser->GetCharClass();
|
||
charClass = 1 << charClass;
|
||
|
||
MAPCODE returnMapCode
|
||
= CHAR_VILLAGE_TRINGGEL_BITMAP & charClass ? HardCode::MAPCODE_for_TRINGGEL
|
||
: CHAR_VILLAGE_VALDCHEN_BITMAP & charClass ? HardCode::MAPCODE_for_VALDCHEN
|
||
: 0;
|
||
|
||
if (returnMapCode)
|
||
{
|
||
pUser->SetSelectedCharMapCode(returnMapCode);
|
||
MSG_CG_ZONE_EX_TUTORIAL_MISSION_LEAVE_CMD msgCMD;
|
||
msgCMD.m_MapCode = returnMapCode;
|
||
pUser->SendPacket(&msgCMD, sizeof(msgCMD));
|
||
|
||
MSG_CG_ZONE_MISSION_LEAVE_SYN msgSYN;
|
||
msgSYN.m_Reason = MSG_CG_ZONE_MISSION_LEAVE_SYN::REASON_EXPULSION;
|
||
OnCG_ZONE_MISSION_LEAVE_SYN(pUser, &msgSYN, sizeof(msgSYN));
|
||
}
|
||
}
|
||
}
|
||
|
||
HANDLER_CG_IMPL(CG_ETC_GET_BATTLE_OPEN_TIME_SYN)
|
||
{
|
||
__TOUCHED((pMsg, wSize));
|
||
#if !defined(__000000_20080811_BUG_FIX_VIEW_JOIN_TOP_TIME)
|
||
#error "Impossible Build!! - Reason: Violation Dependency Chain"
|
||
#endif
|
||
|
||
MSG_CG_ETC_GET_BATTLE_OPEN_TIME_ACK msgACK;
|
||
msgACK.m_eJoinState = eJION_TOP_STATE_NONE;
|
||
msgACK.m_JoinOverTime = INFINITE;
|
||
ZeroMemory(&msgACK.m_SSQTicketInfo, sizeof(msgACK.m_SSQTicketInfo));
|
||
|
||
FLOWCONTROL_START()
|
||
{
|
||
#if __ITIMERBASE_VERSION_CRTL >= 0x0120
|
||
//----------------------------------------------------------------------------------------------
|
||
if (g_BattleOpenTimeMng.is_loaded() == false) {
|
||
break;
|
||
}
|
||
util::TimeInfoPerFrame time_info;
|
||
util::TimeSync::UpdateTimeInfoPerFrame(&time_info);
|
||
g_BattleOpenTimeMng.SetupMessage(time_info, &msgACK);
|
||
//----------------------------------------------------------------------------------------------
|
||
#else // __ITIMERBASE_VERSION_CRTL < 0x0120
|
||
//----------------------------------------------------------------------------------------------
|
||
|
||
typedef CurseTowerTimeParser CTTParser;
|
||
CurseTowerTimeParser* const pCurseTowerTimeParser = CurseTowerTimeParser::Instance();
|
||
BATTLE_OPEN_TIME_LIST_HASH* const pListHash = pCurseTowerTimeParser->GetListHash();
|
||
if (!pListHash)
|
||
break;
|
||
|
||
BATTLE_OPEN_TIME_LIST_HASH::const_iterator hash_it = pListHash->find(CTTParser::TIME_CHECK_CURSE_TOWER);
|
||
if (hash_it == pListHash->end())
|
||
break;
|
||
|
||
st_BattleOpenTimeList* const pList = (*pListHash)[CTTParser::TIME_CHECK_CURSE_TOWER];
|
||
if (!pList)
|
||
{
|
||
SUNLOG(eCRITICAL_LOG, "[HANDLER_CG_IMPL(CG_ETC_GET_BATTLE_OPEN_TIME_SYN)] st_BattleOpenTimeList is null ");
|
||
break;
|
||
}
|
||
|
||
DWORD minV = INFINITE;
|
||
BATTLE_OPEN_TIME_LIST::const_iterator it = pList->m_List.begin(), itend = pList->m_List.end();
|
||
while (it != itend)
|
||
{
|
||
typedef st_BattleOpenTimeNode stBOTN;
|
||
stBOTN* const pBOTN = *it;
|
||
const WORD nOpenState = pBOTN->OpenState;
|
||
if (nOpenState == stBOTN::STATE_BEFORE_OPEN_5MIN
|
||
|| nOpenState == stBOTN::STATE_BEFORE_OPEN_1MIN
|
||
|| nOpenState == stBOTN::STATE_CLOSE
|
||
)
|
||
{
|
||
minV = min(minV, pBOTN->dwOpenTick);
|
||
msgACK.m_eJoinState = eJION_TOP_STATE_NONADMISSION;
|
||
}
|
||
else
|
||
{
|
||
minV = pBOTN->dwCloseTick;
|
||
msgACK.m_eJoinState = eJION_TOP_STATE_ADMISSION;
|
||
break;
|
||
}
|
||
|
||
++it;
|
||
}
|
||
|
||
if (INFINITE == minV)
|
||
{
|
||
ASSERT(FALSE);
|
||
msgACK.m_eJoinState = eJION_TOP_STATE_NONE;
|
||
break;
|
||
}
|
||
|
||
const DWORD curTick = GetTickCount();
|
||
msgACK.m_JoinOverTime = minV - curTick;
|
||
//----------------------------------------------------------------------------------------------
|
||
#endif //__ITIMERBASE_VERSION_CRTL
|
||
}
|
||
FLOWCONTROL_END;
|
||
|
||
FLOWCONTROL_START()
|
||
{
|
||
|
||
WarControlManager* const pSSQControlManager = WarControlManager::Instance();
|
||
msgACK.m_SSQTicketInfo = pSSQControlManager->GetTicketInfo();
|
||
|
||
}
|
||
FLOWCONTROL_END;
|
||
|
||
pUser->SendPacket(&msgACK, sizeof(msgACK));
|
||
|
||
return;
|
||
}
|
||
|
||
HANDLER_CG_IMPL(CG_ZONE_EX_CAN_CREATE_100LEVEL_QUEST_MISSION_SYN)
|
||
{
|
||
__TOUCHED((pMsg, wSize));
|
||
MSG_CG_ZONE_EX_CAN_CREATE_100LEVEL_QUEST_MISSION_SYN* pRecvMsg = (MSG_CG_ZONE_EX_CAN_CREATE_100LEVEL_QUEST_MISSION_SYN*)pMsg;
|
||
if (!pUser)
|
||
return;
|
||
|
||
SUNLOG(eFULL_LOG, _T("%s\n"), __FUNCTION__);
|
||
|
||
POSTYPE posOfItem = pRecvMsg->m_ItemPos;
|
||
|
||
if (pUser->GetLockItemPosForInstanceDungeon() != INVALID_POSTYPE_VALUE)
|
||
return;
|
||
|
||
pUser->SetLockItemPosForInstanceDungeon(posOfItem);
|
||
|
||
MSG_AG_ZONE_CAN_CREATE_100LEVEL_QUEST_MISSION_SYN msgSYN;
|
||
msgSYN.m_ItemPos = posOfItem;
|
||
pUser->SendToLinkedServer(&msgSYN, sizeof(msgSYN));
|
||
}
|
||
|
||
HANDLER_CG_IMPL(CG_ZONE_EX_SSQ_JOIN_INFO_SYN)
|
||
{
|
||
__TOUCHED((pUser, pMsg, wSize));
|
||
WarControlManager* const pSSQControlManager = WarControlManager::Instance();
|
||
pSSQControlManager->OnRecv(pMsg, wSize, SSQSessionCmd::FromClient(pUser));
|
||
}
|
||
|
||
#ifdef __WAVERIX_TEST_LOGIC_TASK_MACRO__
|
||
extern void __WAVERIX_TESTUNIT_OnRecvCG_ZONE_EX_SSQ_JOIN_SYN(User* pUser, MAPCODE mapCode);
|
||
#endif
|
||
|
||
HANDLER_CG_IMPL(CG_ZONE_EX_SSQ_JOIN_SYN)
|
||
{
|
||
__TOUCHED((pUser, pMsg, wSize));
|
||
WarControlManager* const pSSQControlManager = WarControlManager::Instance();
|
||
pSSQControlManager->OnRecv(pMsg, wSize, SSQSessionCmd::FromClient(pUser));
|
||
}
|
||
|
||
HANDLER_CG_IMPL(CG_ZONE_EX_SSQ_ROOM_INFO_SYN)
|
||
{
|
||
__TOUCHED((pUser, pMsg, wSize));
|
||
WarControlManager* const pSSQControlManager = WarControlManager::Instance();
|
||
pSSQControlManager->OnRecv(pMsg, wSize, SSQSessionCmd::FromClient(pUser));
|
||
}
|
||
|
||
HANDLER_CG_IMPL(CG_ZONE_EX_SSQ_OBSERVER_SYN)
|
||
{
|
||
__TOUCHED((pUser, pMsg, wSize));
|
||
WarControlManager* const pSSQControlManager = WarControlManager::Instance();
|
||
pSSQControlManager->OnRecv(pMsg, wSize, SSQSessionCmd::FromClient(pUser));
|
||
}
|
||
|
||
#ifdef _NA_008069_20150210_ADD_SPA_SYSTEM
|
||
HANDLER_CG_IMPL(CG_ZONE_EX_SPA_ENTER_SYN)
|
||
{
|
||
__TOUCHED((pUser, pMsg, wSize));
|
||
MSG_CG_ZONE_EX_SPA_ENTER_SYN* recv_msg = static_cast<MSG_CG_ZONE_EX_SPA_ENTER_SYN*>(pMsg);
|
||
|
||
if (pUser->IsBeginTransaction())
|
||
{
|
||
MSG_CG_ZONE_EX_SPA_ENTER_NAK nak_packet;
|
||
nak_packet.error_code = RC::RC_SPA_USER_ALREADY_DOING_TRANSACTION;
|
||
pUser->SendPacket(&nak_packet, sizeof(nak_packet));
|
||
return;
|
||
}
|
||
|
||
{
|
||
MSG_AG_ZONE_SPA_ENTER_SYN syn_msg;
|
||
syn_msg.item_code = recv_msg->item_code;
|
||
pUser->SendToLinkedServer(&syn_msg, sizeof(syn_msg));
|
||
}
|
||
}
|
||
|
||
HANDLER_CG_IMPL(CG_ZONE_EX_SPA_LEAVE_SYN)
|
||
{
|
||
__TOUCHED(pUser, pMsg, wSize);
|
||
MSG_CG_ZONE_EX_SPA_LEAVE_SYN* recv_msg = static_cast<MSG_CG_ZONE_EX_SPA_LEAVE_SYN*>(pMsg);
|
||
|
||
if (pUser->IsBeginTransaction())
|
||
{
|
||
MSG_CG_ZONE_EX_SPA_LEAVE_NAK nak_packet;
|
||
nak_packet.error_code = RC::RC_SPA_USER_ALREADY_DOING_TRANSACTION;
|
||
pUser->SendPacket(&nak_packet, sizeof(nak_packet));
|
||
return;
|
||
}
|
||
|
||
if (pUser->GetZoneType() != eZONETYPE_SPA_FIELD)
|
||
{
|
||
MSG_CG_ZONE_EX_SPA_LEAVE_NAK nak_msg;
|
||
nak_msg.error_code = RC::RC_SPA_INVALID_ZONE;
|
||
pUser->SendPacket(&nak_msg, sizeof(nak_msg));
|
||
return;
|
||
}
|
||
|
||
{
|
||
MSG_AG_ZONE_SPA_LEAVE_SYN syn_packet;
|
||
pUser->SendToLinkedServer(&syn_packet, sizeof(syn_packet));
|
||
}
|
||
}
|
||
#endif //_NA_008069_20150210_ADD_SPA_SYSTEM
|
||
|
||
HANDLER_CG_IMPL(CG_EVENT_INVITATEFRIEND_REWARD_LIST_SYN)
|
||
{
|
||
__TOUCHED((pMsg, wSize));
|
||
SUNLOG(eFULL_LOG, "Recv CG_EVENT_INVITATEFRIEND_REWARD_LIST_SYN");
|
||
|
||
MSG_AD_EVENT_INVITATEFRIEND_REWARD_LIST_SYN msg;
|
||
|
||
msg.m_dwKey = pUser->GetUserKey();
|
||
msg.CharGUID = pUser->GetSelectedCharGuid();
|
||
|
||
if (!pUser->SendToDBPServer(&msg, sizeof(msg)))
|
||
{
|
||
MSG_CG_EVENT_INVITATEFRIEND_REWARD_LIST_NAK nmsg;
|
||
nmsg.byErrorCode = 2;
|
||
pUser->SendPacket(&nmsg, sizeof(nmsg));
|
||
SUNLOG(eFULL_LOG, "MSG_AD_EVENT_INVITATEFRIEND_REWARD_LIST_SYN Send Fail (%u, %u)", pUser->GetUserKey(), msg.CharGUID);
|
||
}
|
||
}
|
||
|
||
|
||
#ifdef _NA_0_20110329_GAMEOPTION_SETTING
|
||
HANDLER_CG_IMPL(CG_ETC_GAMEOPTION_LOAD_SYN)
|
||
{
|
||
MSG_CG_ETC_GAMEOPTION_LOAD_SYN* recv_message =
|
||
static_cast<MSG_CG_ETC_GAMEOPTION_LOAD_SYN*>(pMsg);
|
||
GameOptionManager::Instance()->Load_GameOption(pUser, recv_message);
|
||
}
|
||
HANDLER_CG_IMPL(CG_ETC_GAMEOPTION_SAVE_SYN)
|
||
{
|
||
MSG_CG_ETC_GAMEOPTION_SAVE_SYN* recv_message =
|
||
static_cast<MSG_CG_ETC_GAMEOPTION_SAVE_SYN*>(pMsg);
|
||
GameOptionManager::Instance()->Save_GameOption(pUser, recv_message);
|
||
}
|
||
#endif //_NA_0_20110329_GAMEOPTION_SETTING
|
||
|
||
|
||
//_NA_000000_20120410_SPEEDHACK
|
||
HANDLER_CG_IMPL(CG_ETC_MEMORY_HACK_CMD)
|
||
{
|
||
MSG_CG_ETC_MEMORY_HACK_CMD* recv_message = static_cast<MSG_CG_ETC_MEMORY_HACK_CMD*>(pMsg);
|
||
if (pUser != NULL && recv_message != NULL)
|
||
{
|
||
SUNLOG(eCRITICAL_LOG, TEXT("Memory Hack | char_name = %s | char_level = %d"),
|
||
pUser->GetSelectedCharName(),
|
||
pUser->GetSelectedCharLV());
|
||
}
|
||
}
|
||
|
||
#ifdef _NA004034_20120102_GUILD_POINT_SYSTEM
|
||
HANDLER_CG_IMPL(CG_ETC_GUILD_RANKINGINFO_SYN)
|
||
{
|
||
MSG_CG_ETC_GUILD_RANKINGINFO_SYN* packet = \
|
||
static_cast<MSG_CG_ETC_GUILD_RANKINGINFO_SYN*>(pMsg);
|
||
|
||
MSG_CG_ETC_GUILD_RANKINGINFO_ACK msg;
|
||
msg.init();
|
||
g_GuildRankingSystem.SerializeGuildRanking(\
|
||
msg.guild_ranking_info_, \
|
||
msg.guild_ranking_info_count_, \
|
||
SERIALIZE_STORE);
|
||
pUser->SendPacket(&msg, sizeof(msg));
|
||
}
|
||
|
||
HANDLER_CG_IMPL(CG_ETC_GUILDINFO_SYN)
|
||
{
|
||
MSG_CG_ETC_GUILDINFO_SYN* packet = \
|
||
static_cast<MSG_CG_ETC_GUILDINFO_SYN*>(pMsg);
|
||
|
||
MSG_AD_ETC_GUILDINFO_SYN msg;
|
||
msg.guid_ = packet->guid_;
|
||
pUser->SendToDBPServer(&msg, sizeof(msg));
|
||
}
|
||
#endif //_NA004034_20120102_GUILD_POINT_SYSTEM
|
||
|
||
#if !defined _NA_0_20110613_GAME_SHOP_RENEWAL
|
||
|
||
#ifdef __NA000000_SHOP_USERID_50_PASSING_PROC__
|
||
HANDLER_CG_IMPL(CG_SHOP_SEND_GIFT_SYN)
|
||
{
|
||
__TOUCHED((pMsg, wSize));
|
||
MSG_CG_SHOP_SEND_GIFT_SYN* pRecvMsg = static_cast<MSG_CG_SHOP_SEND_GIFT_SYN*>(pMsg);
|
||
BYTE item_type = pRecvMsg->m_ItemType;
|
||
if (wSize != sizeof(*pRecvMsg)) // no check 'item_type' -> unused value
|
||
//|| (item_type != pRecvMsg->SINGLEITEM && item_type != pRecvMsg->PACKAGEITEM))
|
||
return; //corrupt message, no answer
|
||
|
||
BOOLEAN success = true;
|
||
BYTE error_code = RC::RC_SHOP_SUCCESS;
|
||
ShopUserQuerySlot& query_slot = pUser->GetShopUserQuerySlot();
|
||
|
||
if (success && query_slot.IsTransaction() != 0)
|
||
{
|
||
success = false, error_code = RC::RC_SHOP_ALREADY_BUYING_TRANSACTION;
|
||
}
|
||
|
||
#ifdef _USA
|
||
char recv_char_name[MAX_CHARNAME_LENGTH + 1];
|
||
CopyMemory(recv_char_name, pRecvMsg->m_tszCharName, sizeof(recv_char_name));
|
||
recv_char_name[_countof(recv_char_name) - 1] = '\0';
|
||
strupr(recv_char_name);
|
||
|
||
char char_name_in_account[MAX_CHARNAME_LENGTH + 1];
|
||
for (int i = 0; i < MAX_CHARACTER_SLOT_NUM; ++i) {
|
||
if (pUser->IsValidSlot(i) == 0)
|
||
continue;
|
||
|
||
const char* char_name = pUser->GetCharName(i);
|
||
strncpy(char_name_in_account, char_name, _countof(char_name_in_account));
|
||
char_name_in_account[_countof(char_name_in_account) - 1] = '\0';
|
||
strupr(char_name_in_account);
|
||
|
||
if (strncmp(recv_char_name, char_name_in_account, _countof(recv_char_name)) == 0) {
|
||
success = false, error_code = RC::RC_SHOP_CANNOT_SEND_GIFT_MYACCOUNT;
|
||
break;
|
||
}
|
||
}
|
||
#endif
|
||
|
||
if (success && query_slot.QueryStart(pRecvMsg) == 0)
|
||
{
|
||
success = false, error_code = RC::RC_SHOP_ALREADY_BUYING_TRANSACTION;
|
||
}
|
||
|
||
// fail process...
|
||
if (success == false) {
|
||
//query_slot.QueryEnd();
|
||
MSG_CG_SHOP_SEND_GIFT_NAK msgNAK;
|
||
msgNAK.m_byErrorCode = error_code;
|
||
pUser->SendPacket(&msgNAK, sizeof(msgNAK));
|
||
return;
|
||
}
|
||
|
||
// success status...
|
||
// (current status list) #1 query slot alloced
|
||
if (success) {
|
||
MSG_SERVERCOMMON_QUERY_CHARINFO_SYN msgSYN;
|
||
msgSYN.Clear();
|
||
msgSYN.action_type_ = eCHARNAME_ACTION_SHOP_SEND_GIFT;
|
||
|
||
const MSG_CG_SHOP_SEND_GIFT_SYN* backuped_msg = query_slot.GetMessage();
|
||
QueryUserIdInfo& user_info = msgSYN.user_info_;
|
||
#ifdef _RU_20110801_SEND_GIFT_FRIEND_CHECK
|
||
user_info.from_char_guid_ = pUser->GetSelectedCharGuid();
|
||
#endif
|
||
user_info.requester_user_key_ = pUser->GetUserKey();
|
||
// conversioned to uppercase
|
||
strncpy(user_info.char_name_, backuped_msg->m_tszCharName, _countof(user_info.char_name_));
|
||
user_info.char_name_[_countof(user_info.char_name_) - 1] = '\0';
|
||
|
||
AgentServer* pAgentServer = AgentServer::GetInstance();
|
||
pAgentServer->SendToDBPServer(&msgSYN, msgSYN.GetSize());
|
||
return;
|
||
}
|
||
}
|
||
#endif
|
||
|
||
#endif //#if !defined _NA_0_20110613_GAME_SHOP_RENEWAL
|