Files
Sun1602/Tools/WiseClient/Logic/S_ACTIVE/S_0010xx_ZONE_LF.cpp
T
2022-10-26 12:25:11 +08:00

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;
}