399 lines
10 KiB
C++
399 lines
10 KiB
C++
#include "stdafx.h"
|
|
|
|
#include <Object/WiseCharacter.h>
|
|
#include <Sessions/UserSessionMgr.h>
|
|
#include <Information/Zone/ZoneManager.h>
|
|
|
|
//
|
|
#include <ScriptLogic/ScriptLogic.Interfaces.h>
|
|
//
|
|
#include <SinTable.h>
|
|
#include <SCPlayer.h>
|
|
#include <MapInfoParser.h>
|
|
//
|
|
//
|
|
|
|
#define COMMON_REF_BLOCK \
|
|
WiseUser* pUser = pDelegator->GetWiseUser(); \
|
|
WiseCharacter* pCHAR = pUser->GetSelectedCharacter(); \
|
|
UserSessionMgr& rMGR = pUser->GetSessionMgr(); \
|
|
ZoneControl& rZONE = pUser->ZoneController(); \
|
|
SEND_MESSAGE_BLOCK& rSENDMSG = pUser->SEND_MSG()
|
|
|
|
|
|
LF_ACTIVE_HANDLER_IMPL(S_001010_DECIDE_SELECT_CHARACTER_LF)
|
|
{
|
|
WiseUser* pUser = pDelegator->GetWiseUser();
|
|
UserSessionMgr& rMGR = pUser->GetSessionMgr();
|
|
SEND_MESSAGE_BLOCK& rSENDMSG = pUser->SEND_MSG();
|
|
|
|
pUser->SelectCharacter(HARDCODING_SELECT_CHAR);
|
|
WiseCharacter* pCHAR = pUser->GetSelectedCharacter();
|
|
|
|
// NULL이면 캐릭터 생성으로 해결하자.
|
|
if(!pCHAR)
|
|
{
|
|
DEBUGGING_CODE_L3("Empty Character");
|
|
return LFRET_FAIL;
|
|
}
|
|
|
|
return LFRET_SUCCESS_DEFAULT;
|
|
}
|
|
|
|
LF_ACTIVE_HANDLER_IMPL(S_001020_DECIDE_ACTION_PLAY_LF)
|
|
{
|
|
DEBUGGING_CODE_L3("");
|
|
|
|
return LFRET_SUCCESS_DEFAULT;
|
|
}
|
|
|
|
LF_ACTIVE_HANDLER_IMPL(S_001030_CHECK_CURRENT_ZONE_LF)
|
|
{
|
|
//DEBUGGING_CODE_L3("");
|
|
|
|
LF_RESULT lfRET = SHARED_LF::ZONE::CHECK_CURRENT_ZONE_n_JUMP_ROUTINE(pDelegator, NULL, arguments);
|
|
|
|
return lfRET;
|
|
}
|
|
|
|
|
|
LF_ACTIVE_HANDLER_IMPL(S_001040_SEND_ENTERVILLAGE_REQ_LF)
|
|
{
|
|
DEBUGGING_CODE_L3("");
|
|
|
|
WiseUser* pUser = pDelegator->GetWiseUser();
|
|
UserSessionMgr& rMGR = pUser->GetSessionMgr();
|
|
SEND_MESSAGE_BLOCK& rSENDMSG = pUser->SEND_MSG();
|
|
ZoneControl& rZONE = pUser->ZoneController();
|
|
AccountInfo& rACCOUNT = pUser->AccountController();
|
|
sACCOUNT rACCOUNT_INFO;
|
|
rACCOUNT.GetAccountInfo(rACCOUNT_INFO);
|
|
|
|
pUser->SelectCharacter(rACCOUNT_INFO.SELECT_CHAR);
|
|
WiseCharacter* pCHAR = pUser->GetSelectedCharacter();
|
|
CLIENT_CHARACTER_PART& rCHARPART = pCHAR->CHAR_INFO();
|
|
|
|
MSG_CG_CONNECTION_ENTERVILLAGEREQ_SYN& rMsgSYN = rSENDMSG.InstanceOf<MSG_CG_CONNECTION_ENTERVILLAGEREQ_SYN>();
|
|
rMsgSYN.m_bySelectedCharIndex = pCHAR->IDXofSLOT();
|
|
rMGR.SendPacket(AGENT_SESSION, &rMsgSYN, sizeof(rMsgSYN));
|
|
|
|
sZONE_MOVINFO_ARG rARG;
|
|
rZONE.ZoneMoveCmd(ZoneControl::CMD_ZONE_GET_CUR_INFO, &rARG);
|
|
|
|
//
|
|
MapInfoParser* pPARSER = MapInfoParser::Instance();
|
|
MAPCODE mcCODE = (MAPCODE)rCHARPART.m_iRegion;
|
|
const sMAPINFO* pMAPINFO = pPARSER->FindMapInfo((MAPCODE)mcCODE);
|
|
eZONETYPE ztTYPE = (eZONETYPE)pMAPINFO->byMKind;
|
|
//
|
|
|
|
rARG.ZONETYPE_NEXT = ztTYPE;
|
|
rARG.FIELDCODE_NEXT = (FIELDCODE)mcCODE;
|
|
rZONE.ZoneMoveCmd(ZoneControl::CMD_ZONE_MOV_START, &rARG);
|
|
|
|
return LFRET_SUCCESS_DEFAULT;
|
|
}
|
|
|
|
LF_ACTIVE_HANDLER_IMPL(S_001050_WAIT_ENTERVILLAGE_REQ_ACK_LF)
|
|
{
|
|
DEBUGGING_CODE_L3("");
|
|
|
|
return LFRET_PENDING_UNTIL_PASSIVE;
|
|
}
|
|
|
|
|
|
|
|
LF_ACTIVE_HANDLER_IMPL(S_001100_CHECK_CURRENT_ZONE_LF)
|
|
{
|
|
DEBUGGING_CODE_L3("");
|
|
|
|
// 3DEngine을 통해 맵 정보를 로딩할 필요가 있나?
|
|
// 일단 최소한 CheckSum값은 필요해진다.
|
|
WiseUser* pUser = pDelegator->GetWiseUser();
|
|
UserSessionMgr& rMGR = pUser->GetSessionMgr();
|
|
SEND_MESSAGE_BLOCK& rSENDMSG = pUser->SEND_MSG();
|
|
|
|
WiseCharacter* pCHAR = pUser->GetSelectedCharacter();
|
|
//INT iRegion = pCHAR->CHAR_INFO().m_iRegion;
|
|
|
|
return LFRET_SUCCESS_DEFAULT;
|
|
}
|
|
|
|
LF_ACTIVE_HANDLER_IMPL(S_001110_SEND_CG_SYNC_PLAYER_ENTER_SYN_LF)
|
|
{
|
|
DEBUGGING_CODE_L3("");
|
|
|
|
WiseUser* pUser = pDelegator->GetWiseUser();
|
|
UserSessionMgr& rMGR = pUser->GetSessionMgr();
|
|
SEND_MESSAGE_BLOCK& rSENDMSG = pUser->SEND_MSG();
|
|
ZoneControl& rZONE = pUser->ZoneController();
|
|
|
|
WiseCharacter* pCHAR = pUser->GetSelectedCharacter();
|
|
|
|
sZONE_MOVINFO_ARG rARG;
|
|
rZONE.ZoneMoveCmd(ZoneControl::CMD_ZONE_GET_CUR_INFO, &rARG);
|
|
FIELDCODE fcNEXTCODE = rARG.FIELDCODE_NEXT;
|
|
|
|
DWORD dwCheckSum = ZoneManager::GetMapCheckSum(fcNEXTCODE);
|
|
|
|
MSG_CG_SYNC_PLAYER_ENTER_SYN& rMsgSYN = rSENDMSG.InstanceOf<MSG_CG_SYNC_PLAYER_ENTER_SYN>();
|
|
rMsgSYN.m_dwCheckSum = dwCheckSum;
|
|
rMGR.SendPacket(AGENT_SESSION, &rMsgSYN, sizeof(rMsgSYN));
|
|
|
|
return LFRET_SUCCESS_DEFAULT;
|
|
}
|
|
|
|
LF_ACTIVE_HANDLER_IMPL(S_001120_WAIT_CG_SYNC_PLAYER_ENTER_ACK_LF)
|
|
{
|
|
DEBUGGING_CODE_L3("");
|
|
|
|
//WiseUser* pUser = pDelegator->GetWiseUser();
|
|
//UserSessionMgr& rMGR = pUser->GetSessionMgr();
|
|
//SEND_MESSAGE_BLOCK& rSENDMSG = pUser->SEND_MSG();
|
|
//ZoneControl& rZONE = pUser->ZoneController();
|
|
//WiseCharacter* pCHAR = pUser->GetSelectedCharacter();
|
|
//rZONE.ZoneMoveCmd(ZoneControl::CMD_ZONE_MOV_END, NULL);
|
|
|
|
return LFRET_PENDING_UNTIL_PASSIVE;
|
|
}
|
|
|
|
LF_ACTIVE_HANDLER_IMPL(S_001130_EOL_FLOW_CONTROL_LF)
|
|
{
|
|
DEBUGGING_CODE_L3("");
|
|
|
|
WiseUser* pUser = pDelegator->GetWiseUser();
|
|
WiseCharacter* pCHAR = pUser->GetSelectedCharacter();
|
|
|
|
UserSessionMgr& rMGR = pUser->GetSessionMgr();
|
|
ZoneControl& rZONE = pUser->ZoneController();
|
|
SEND_MESSAGE_BLOCK& rSENDMSG = pUser->SEND_MSG();
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
// PLAYER_ENTER_ACK이후 여기에 도착시 현재 위치에서 정해진 역할을 수행할 수
|
|
// 있도록 처리하자. 일종의 로직 점프를 수행해야 한다.
|
|
rZONE.ZoneMoveCmd(ZoneControl::CMD_ZONE_MOV_END, NULL);
|
|
|
|
//// ---TEST---
|
|
//// 이동 관련 테스트 목적
|
|
//sSIG_STEP& rSIGNAL = sSIGNAL_BUFFER::InstanceOf<sSIG_STEP>();
|
|
//rSIGNAL.SUBTYPE() = sSIG_STEP::ACTIVATE_JUMP_STEP;
|
|
//sSIG_STEP_ARG& rSIG_ARG = rSIGNAL.InstanceOf<sSIG_STEP_ARG>();
|
|
//rSIG_ARG.SetInfo(LFG_ZONE, S_001830_KBMOVING_LF);
|
|
//pDelegator->OnMsg(&rSIGNAL);
|
|
//return LFRET_SUCCESS_JUMP;
|
|
//// ---TEST---
|
|
|
|
|
|
// 현재 위치 파악해서 해당 루틴으로 점프한다.
|
|
LF_RESULT lfRET = SHARED_LF::ZONE::CHECK_CURRENT_ZONE_n_JUMP_ROUTINE(pDelegator, NULL, arguments);
|
|
|
|
if(LFRET_SUCCESS_LOOP == lfRET)
|
|
{
|
|
sSIG_STEP& rSIGNAL = sSIGNAL_BUFFER::InstanceOf<sSIG_STEP>();
|
|
rSIGNAL.SUBTYPE() = sSIG_STEP::ACTIVATE_JUMP_STEP;
|
|
sSIG_STEP_ARG& rSIG_ARG = rSIGNAL.InstanceOf<sSIG_STEP_ARG>();
|
|
|
|
rSIG_ARG.SetInfo(LFG_ZONE, S_001030_CHECK_CURRENT_ZONE_LF);
|
|
pDelegator->OnMsg(&rSIGNAL);
|
|
lfRET = LFRET_SUCCESS_JUMP;
|
|
}
|
|
|
|
return lfRET;
|
|
}
|
|
|
|
|
|
LF_ACTIVE_HANDLER_IMPL(S_001500_START_MARK_VILLAGE_LF)
|
|
{
|
|
//DEBUGGING_CODE_L3("");
|
|
|
|
// 마을에 있는 상태다. 특별한 명령이 없으면 마을 관련 처리를 수행하면서,
|
|
// 루프를 돌도록 지원한다.
|
|
// Control Flow
|
|
// S_001500_START_MARK_VILLAGE_LF -> ~ -> S_001590_CLOSURE_MARK_VILLAGE_LF
|
|
// -> S_001030_CHECK_CURRENT_ZONE_LF (*****)
|
|
COMMON_REF_BLOCK;
|
|
|
|
LF_RESULT lfRET = SHARED_LF::ZONE::IN_VILLAGE_NEXT_ACTION_PROECESS(pDelegator);
|
|
|
|
return lfRET;
|
|
}
|
|
|
|
|
|
LF_ACTIVE_HANDLER_IMPL(S_001590_CLOSURE_MARK_VILLAGE_LF)
|
|
{
|
|
//DEBUGGING_CODE_L3("");
|
|
|
|
WiseUser* pUser = pDelegator->GetWiseUser();
|
|
WiseCharacter* pCHAR = pUser->GetSelectedCharacter();
|
|
|
|
UserSessionMgr& rMGR = pUser->GetSessionMgr();
|
|
ZoneControl& rZONE = pUser->ZoneController();
|
|
SEND_MESSAGE_BLOCK& rSENDMSG = pUser->SEND_MSG();
|
|
|
|
sSIG_STEP& rSIGNAL = sSIGNAL_BUFFER::InstanceOf<sSIG_STEP>();
|
|
rSIGNAL.SUBTYPE() = sSIG_STEP::ACTIVATE_JUMP_STEP;
|
|
sSIG_STEP_ARG& rSIG_ARG = rSIGNAL.InstanceOf<sSIG_STEP_ARG>();
|
|
rSIG_ARG.SetInfo(LFG_ZONE, S_001030_CHECK_CURRENT_ZONE_LF);
|
|
pDelegator->OnMsg(&rSIGNAL);
|
|
|
|
return LFRET_SUCCESS_JUMP;
|
|
}
|
|
|
|
|
|
LF_ACTIVE_HANDLER_IMPL(S_001600_START_MARK_HUNTING_FIELD_LF)
|
|
{
|
|
DEBUGGING_CODE_L3("");
|
|
|
|
return LFRET_SUCCESS_DEFAULT;
|
|
}
|
|
|
|
|
|
LF_ACTIVE_HANDLER_IMPL(S_001690_CLOSURE_MARK_HUNTING_FIELD_LF)
|
|
{
|
|
DEBUGGING_CODE_L3("");
|
|
|
|
return LFRET_SUCCESS_DEFAULT;
|
|
}
|
|
|
|
|
|
|
|
LF_ACTIVE_HANDLER_IMPL(S_001700_START_MARK_TUTORIAL_FIELD_LF)
|
|
{
|
|
DEBUGGING_CODE_L3("");
|
|
// (THINKING)
|
|
// 1) TUTORIAL로 들어가려고 한다면, 패킷을 받은 이후 이곳으로 점프하도록 유도
|
|
// 2) CG_MISSION_TUTORIAL_WINDOW_RET_ACCEPT_SYN 을 이용해서 ACK을 받도록 요청한다.
|
|
// 3) 다음에는 PORTAL_FIELD_MOVE_SYN...
|
|
// 4) PORTAL_FIELD_MOVE_ACK
|
|
// 5) PLAYER_ENTER_SYN
|
|
// 6) PLAYER_ENTER_ACK
|
|
|
|
return LFRET_SUCCESS_DEFAULT;
|
|
}
|
|
|
|
/*
|
|
LF_ACTIVE_HANDLER_IMPL(S_001710_SEND_CG_MISSION_TUTORIAL_WINDOW_RET_ACCEPT_SYN)
|
|
{
|
|
COMMON_REF_BLOCK;
|
|
|
|
MSG_CG_MISSION_TUTORIAL_WINDOW_RET_ACCEPT_SYN& rMsgSYN = rSENDMSG.InstanceOf<MSG_CG_MISSION_TUTORIAL_WINDOW_RET_ACCEPT_SYN>();
|
|
rMGR.SendPacket(AGENT_SESSION, &rMsgSYN, sizeof(rMsgSYN));
|
|
|
|
return LFRET_SUCCESS_DEFAULT;
|
|
}
|
|
|
|
LF_ACTIVE_HANDLER_IMPL(S_001720_WAIT_CG_MISSION_TUTORIAL_WINDOW_RET_ACCEPT_ACK)
|
|
{
|
|
DEBUGGING_CODE_L3("");
|
|
|
|
return LFRET_PENDING_UNTIL_PASSIVE;
|
|
}
|
|
*/
|
|
|
|
LF_ACTIVE_HANDLER_IMPL(S_001730_SEND_CG_ZONE_PORTAL_FIELD_MOVE_SYN)
|
|
{
|
|
COMMON_REF_BLOCK;
|
|
|
|
sZONE_MOVINFO_ARG rARG;
|
|
rZONE.ZoneMoveCmd(ZoneControl::CMD_ZONE_GET_CUR_INFO, &rARG);
|
|
|
|
CHAR* rOutput;
|
|
CHAR pszNumber[10];
|
|
|
|
Converter::String::ToString(rARG.FIELDCODE_CUR, pszNumber, sizeof(pszNumber));
|
|
ScriptLogic* pSLOGIC = Manipulater::GetScriptLogicInterface()->SCRIPTLOGIC;
|
|
pSLOGIC->GetData("[TUTORIAL]", pszNumber, rOutput);
|
|
WORD wPortalIdx = Converter::String::ToWORD(rOutput);
|
|
|
|
MSG_CG_ZONE_PORTAL_FIELD_MOVE_SYN& rMsgSYN = rSENDMSG.InstanceOf<MSG_CG_ZONE_PORTAL_FIELD_MOVE_SYN>();
|
|
rMsgSYN.m_wIndex = wPortalIdx;
|
|
rMGR.SendPacket(AGENT_SESSION, &rMsgSYN, sizeof(rMsgSYN));
|
|
|
|
//
|
|
pSLOGIC->GetData("[TUTORIAL]", "MAP_CODE", rOutput);
|
|
WORD wTutorialFieldCode = Converter::String::ToWORD(rOutput);
|
|
|
|
MapInfoParser* pPARSER = MapInfoParser::Instance();
|
|
MAPCODE mcCODE = (MAPCODE)wTutorialFieldCode;
|
|
const sMAPINFO* pMAPINFO = pPARSER->FindMapInfo((MAPCODE)mcCODE);
|
|
eZONETYPE ztTYPE = (eZONETYPE)pMAPINFO->byMKind;
|
|
//
|
|
|
|
rARG.ZONETYPE_NEXT = ztTYPE;
|
|
rARG.FIELDCODE_NEXT = (FIELDCODE)mcCODE;
|
|
rZONE.ZoneMoveCmd(ZoneControl::CMD_ZONE_MOV_START, &rARG);
|
|
|
|
return LFRET_SUCCESS_DEFAULT;
|
|
}
|
|
|
|
LF_ACTIVE_HANDLER_IMPL(S_001740_WAIT_CG_ZONE_PORTAL_FIELD_MOVE_ACK)
|
|
{
|
|
return LFRET_PENDING_UNTIL_PASSIVE;
|
|
}//S_001100_CHECK_CURRENT_ZONE_LF
|
|
|
|
LF_ACTIVE_HANDLER_IMPL(S_001750_JUMP_PLAYER_ENTER)
|
|
{
|
|
COMMON_REF_BLOCK;
|
|
|
|
sSIG_STEP& rSIGNAL = sSIGNAL_BUFFER::InstanceOf<sSIG_STEP>();
|
|
rSIGNAL.SUBTYPE() = sSIG_STEP::ACTIVATE_JUMP_STEP;
|
|
sSIG_STEP_ARG& rSIG_ARG = rSIGNAL.InstanceOf<sSIG_STEP_ARG>();
|
|
rSIG_ARG.SetInfo(LFG_ZONE, S_001100_CHECK_CURRENT_ZONE_LF);
|
|
pDelegator->OnMsg(&rSIGNAL);
|
|
|
|
return LFRET_SUCCESS_JUMP;
|
|
}
|
|
|
|
// 튜토리얼 필드에서 유지상태
|
|
LF_ACTIVE_HANDLER_IMPL(S_001760_EOL_FLOW_CONTROL_LF)
|
|
{
|
|
COMMON_REF_BLOCK;
|
|
|
|
sZONE_MOVINFO_ARG rARG;
|
|
rZONE.ZoneMoveCmd(ZoneControl::CMD_ZONE_GET_CUR_INFO, &rARG);
|
|
|
|
|
|
sSIG_STEP& rSIGNAL = sSIGNAL_BUFFER::InstanceOf<sSIG_STEP>();
|
|
rSIGNAL.SUBTYPE() = sSIG_STEP::ACTIVATE_JUMP_STEP;
|
|
sSIG_STEP_ARG& rSIG_ARG = rSIGNAL.InstanceOf<sSIG_STEP_ARG>();
|
|
rSIG_ARG.SetInfo(LFG_ZONE, S_001030_CHECK_CURRENT_ZONE_LF);
|
|
pDelegator->OnMsg(&rSIGNAL);
|
|
|
|
return LFRET_SUCCESS_JUMP;
|
|
}
|
|
|
|
LF_ACTIVE_HANDLER_IMPL(S_001790_CLOSURE_MARK_TUTORIAL_FIELD_LF)
|
|
{
|
|
DEBUGGING_CODE_L3("");
|
|
|
|
return LFRET_SUCCESS_DEFAULT;
|
|
}
|
|
|
|
|
|
LF_ACTIVE_HANDLER_IMPL(S_002950_CLOSURE_EXCEPTION_LF)
|
|
{
|
|
//DEBUGGING_CODE_L3("");
|
|
|
|
return LFRET_SUCCESS_LOOP;
|
|
}
|
|
|
|
|
|
LF_ACTIVE_HANDLER_IMPL(S_002999_CLOSURE_MARK_LF)
|
|
{
|
|
DEBUGGING_CODE_L3("");
|
|
|
|
return LFRET_SUCCESS_DEFAULT;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|