Files
Sun1602/Server/GameServer/GM/GMHandler_Domination.cpp
2022-10-26 12:25:11 +08:00

404 lines
16 KiB
C++

#include "stdafx.h"
#include "GMCmdManager.h"
//
//
#include <DominationInfoParser.h>
//
#include "GameZoneManager.h"
#include "GameDominationField.h"
#include "GameGuildManager.h"
#include "GameGuild.h"
#include "GameDominationManager.h"
// Internal utilities
#include "./GMHandler_InterUtils.hxx"
namespace nsGM {
;
static bool ProcessDomination(DWORD player_key, const GmCmdTokens& vecCmd)
{
GMCmdManager* const gm_manager = GMCmdManager::Instance();
Player* pPlayer = gm_manager->GetGMPlayer(player_key);
if (!pPlayer)
return false;
INT nArgSize = (INT)vecCmd.size();
CHKSendErr(2 > nArgSize , MSG_CG_GM_STRING_CMD_NAK, RC::RC_GM_INVALID_ARGUMENT, pPlayer);
enum cmd_mode {scriptmode = 0, time, offense, defense, observer, request_info,
exec_reward_event,jointime, max_cmd_mode};
cmd_mode mode = max_cmd_mode;
const char* cmd_str = vecCmd[1].c_str();
if (strcmp(cmd_str, "脚本模式") == 0 || strcmp(cmd_str, "scriptmode") == 0)
mode = scriptmode;
else if (strcmp(cmd_str, "时间") == 0 || strcmp(cmd_str, "time") == 0)
mode = time;
else if (strcmp(cmd_str, "攻击") == 0 || strcmp(cmd_str, "off") == 0)
mode = offense;
else if (strcmp(cmd_str, "防御") == 0 || strcmp(cmd_str, "def") == 0)
mode = defense;
else if (strcmp(cmd_str, "观察员") == 0 || strcmp(cmd_str, "observer") == 0)
mode = observer;
else if (strcmp(cmd_str, "信息") == 0 || strcmp(cmd_str, "info") == 0)
mode = request_info;
else if (strcmp(cmd_str, "奖励活动") == 0 || strcmp(cmd_str, "rewardevent") == 0)
mode = exec_reward_event;
else if (strcmp(cmd_str, "参与") == 0 || strcmp(cmd_str, "jointime") == 0)
mode = jointime;
else
mode = max_cmd_mode;
switch(mode)
{
case exec_reward_event:
{ // implemented by _NA_0_20100705_DOMINATION_EVENT
CHKSendErr(5 != nArgSize , MSG_CG_GM_STRING_CMD_NAK, RC::RC_GM_INVALID_ARGUMENT, pPlayer);
MAPCODE mapCode = atoi(vecCmd[2].c_str());
WORD wDayOfWeek = atoi(vecCmd[3].c_str());
DWORD dwTime = atoi(vecCmd[4].c_str());
mapCode = DominationInfoParser::Instance()->GetDominationFieldCode(mapCode);
CHKSendErr(!mapCode, MSG_CG_GM_STRING_CMD_NAK, RC::RC_GM_NOTEXIST_SCRIPT, pPlayer);
GameDominationField* field = static_cast<GameDominationField *>(
g_GameZoneManager.GetFieldVillageZone(mapCode));
CHKSendErr(!field, MSG_CG_GM_STRING_CMD_NAK, RC::RC_GM_NOTEXIST_SCRIPT, pPlayer);
field->GMRewardEventReset(wDayOfWeek, dwTime);
}
break;
case request_info:
{
MAPCODE mapCode = 0;
if (2 < nArgSize)
{
mapCode = atoi(vecCmd[2].c_str());
}
else
{
GameField* pGameField = pPlayer->GetField();
if (NULL != pGameField)
mapCode = pGameField->GetFieldCode();
}
mapCode = DominationInfoParser::Instance()->GetDominationFieldCode(mapCode);
CHKSendErr(!mapCode, MSG_CG_GM_STRING_CMD_NAK, RC::RC_GM_NOTEXIST_SCRIPT, pPlayer);
GameDominationField* field = static_cast<GameDominationField *>(
g_GameZoneManager.GetFieldVillageZone(mapCode));
CHKSendErr(!field, MSG_CG_GM_STRING_CMD_NAK, RC::RC_GM_NOTEXIST_SCRIPT, pPlayer);
const eDOMINATION_EVENT_STATE curEventState = field->GetEventState();
const char* event_string =
curEventState == DOMINATION_EVENT_AUCTION_START ? "AUCTION_START"
: curEventState == DOMINATION_EVENT_AUCTION_START2? "AUCTION_START2"
: curEventState == DOMINATION_EVENT_SYSTEM_RESET ? "SYSTEM_RESET"
: curEventState == DOMINATION_EVENT_AUCTION_END ? "AUCTION_END"
: curEventState == DOMINATION_EVENT_SELECT_ATTACKGUILD ? "SELECT_ATTACKGUILD"
: curEventState == DOMINATION_EVENT_SELECT_ATTACKGUILD_END ? "SELECT_ATTACKGUILD_END"
: curEventState == DOMINATION_EVENT_WAIT ? "DOMINATION_WAIT"
: curEventState == DOMINATION_EVENT_START ? "DOMINATION_START"
: curEventState == DOMINATION_EVENT_END ? "DOMINATION_END"
: curEventState == DOMINATION_EVENT_MAX ? "DOMINATION_MAX_ERR"
: "EMPTY";
const DOMINATION_INFO* pDominationInfo =
GameDominationManager::Instance()->GetDominationInfo(mapCode);
if (pDominationInfo == NULL)
{
return false;
}
CHKSendErr(!pDominationInfo, MSG_CG_GM_STRING_CMD_NAK, RC::RC_GM_INVALID_ARGUMENT, pPlayer);
MSG_CG_ETC_DEBUGINFO_CMD msgCMD;
INT iLen = _snprintf(msgCMD.m_pszChatMsg, _countof(msgCMD.m_pszChatMsg),
"mapcode[%u] event[%s] defense[%s] offense[%s] "
"reward_event_state[%d] reward_event_day[%d] reward_event_time[%d]",
pDominationInfo->m_FieldCode,
event_string,
pDominationInfo->m_inGuildInfo.m_tszGuildName,
pDominationInfo->m_disGuildInfo.m_tszGuildName,
pDominationInfo->m_rewardEvent.m_byEventStats,
pDominationInfo->m_rewardEvent.m_wEventDayOfWeek,
pDominationInfo->m_rewardEvent.m_dwEventTime);
msgCMD.m_byMsgLength = (BYTE)iLen;
pPlayer->SendPacket(&msgCMD, msgCMD.GetSize());
return true;
}
break;
case scriptmode:
{
CHKSendErr(2 != nArgSize , MSG_CG_GM_STRING_CMD_NAK, RC::RC_GM_INVALID_ARGUMENT, pPlayer);
DominationInfoParser::Instance()->GMClearEventInfo();
MSG_AG_GM_DOMINATION_INIT_CMD cmdMsg;
cmdMsg.m_flag = MSG_AG_GM_DOMINATION_INIT_CMD::time;
cmdMsg.m_bMode = true;
g_pGameServer->SendToServer(AGENT_SERVER, &cmdMsg, sizeof(cmdMsg));
}
break;
case time:
{
CHKSendErr(5 > nArgSize , MSG_CG_GM_STRING_CMD_NAK, RC::RC_GM_INVALID_ARGUMENT, pPlayer);
#ifdef _NA_007128_20140326_MONDSCHIEN_DOMINATION
const WORD auction = atoi(vecCmd[2].c_str()); //拍卖时间不再使用,但不修改现有指令和混用
const DWORD wait = atoi(vecCmd[3].c_str()); //占领战准备时间
const DWORD war = atoi(vecCmd[4].c_str()); //占领战战争时间
DWORD map_code = 0; //占领战地图码
if (nArgSize >= 6) //如果输入了地图代码,只在特定地图上激活占领战
{
map_code = atoi(vecCmd[5].c_str());
}
DWORD dwTime = 0;
const WORD wDayOfWeek = util::GetDateTime_Week_HHMMSS(dwTime);
MSG_AG_GM_DOMINATION_INIT_CMD cmdMsg;
cmdMsg.m_flag = MSG_AG_GM_DOMINATION_INIT_CMD::time;
cmdMsg.m_bMode = false;
sDOMINATION_EVENT_INFO& eventInfo = cmdMsg.m_Info;
DWORD* pTime = eventInfo.m_dwTime;
eventInfo.m_wEventIndex = 0;
eventInfo.m_wMapCode = map_code;
eventInfo.m_bDominationType = 0;
eventInfo.m_wDayOfWeek = wDayOfWeek;
//GM指令在以下时间间隔太短时
//玩家移动中出现占领战重置的情况,玩家丢失了以前的地图代码.
*pTime++ = DOMINATION_EVENT_AUCTION_START_TIME;
*pTime++ = util::CarcHHMMSS(dwTime,DOMINATION_EVENT_AUCTION_END_TIME);
*pTime++ = util::CarcHHMMSS(*(pTime-1),20);
*pTime++ = util::CarcHHMMSS(*(pTime-1),5);
*pTime++ = util::CarcHHMMSS(*(pTime-1),2);
*pTime++ = util::CarcHHMMSS(*(pTime-1),13);
*pTime++ = util::CarcHHMMSS(*(pTime-1),wait);
*pTime++ = util::CarcHHMMSS(*(pTime-1),war);
*pTime = DOMINATION_EVENT_AUCTION_START2_TIME;
#else
const DWORD auction = atoi(vecCmd[2].c_str());
const DWORD wait = atoi(vecCmd[3].c_str());
const DWORD war = atoi(vecCmd[4].c_str());
DWORD dwTime = 0;
const WORD wDayOfWeek = util::GetDateTime_Week_HHMMSS(dwTime);
MSG_AG_GM_DOMINATION_INIT_CMD cmdMsg;
cmdMsg.m_flag = MSG_AG_GM_DOMINATION_INIT_CMD::time;
cmdMsg.m_bMode = false;
sDOMINATION_EVENT_INFO& eventInfo = cmdMsg.m_Info;
DWORD* pTime = eventInfo.m_dwTime;
eventInfo.m_wDayOfWeek = wDayOfWeek;
*pTime++ = 0;
*pTime++ = util::CarcHHMMSS(dwTime,auction);
*pTime++ = util::CarcHHMMSS(*(pTime-1),20);
*pTime++ = util::CarcHHMMSS(*(pTime-1),5);
*pTime++ = util::CarcHHMMSS(*(pTime-1),2);
*pTime++ = util::CarcHHMMSS(*(pTime-1),13);
*pTime++ = util::CarcHHMMSS(*(pTime-1),wait);
*pTime++ = util::CarcHHMMSS(*(pTime-1),war);
*pTime = 240000;
#endif
SUNLOG(eCRITICAL_LOG, "区域占领战时间 : A_START[%d] A_END[%d] "
"SYSTEM[%d] WAIT[%d] START[%d] END[%d] A_START2[%d]",
eventInfo.m_dwTime[DOMINATION_EVENT_AUCTION_START],
eventInfo.m_dwTime[DOMINATION_EVENT_AUCTION_END],
eventInfo.m_dwTime[DOMINATION_EVENT_SELECT_ATTACKGUILD],
eventInfo.m_dwTime[DOMINATION_EVENT_SELECT_ATTACKGUILD_END],
eventInfo.m_dwTime[DOMINATION_EVENT_SYSTEM_RESET],
eventInfo.m_dwTime[DOMINATION_EVENT_WAIT],
eventInfo.m_dwTime[DOMINATION_EVENT_START],
eventInfo.m_dwTime[DOMINATION_EVENT_END],
eventInfo.m_dwTime[DOMINATION_EVENT_AUCTION_START2]);
CHKSendErr(!DominationInfoParser::Instance()->GMInsertEventInfo(eventInfo),
MSG_CG_GM_STRING_CMD_NAK, RC::RC_GM_CMD_FAILED, pPlayer);
g_pGameServer->SendToServer(AGENT_SERVER, &cmdMsg, sizeof(cmdMsg));
}
break;
case jointime:
{
CHKSendErr(6 > nArgSize , MSG_CG_GM_STRING_CMD_NAK, RC::RC_GM_INVALID_ARGUMENT, pPlayer);
const DWORD auction = atoi(vecCmd[2].c_str());
const DWORD selectend = atoi(vecCmd[3].c_str());
const DWORD wait = atoi(vecCmd[4].c_str());
const DWORD war = atoi(vecCmd[5].c_str());
DWORD dwTime = 0;
const WORD wDayOfWeek = util::GetDateTime_Week_HHMMSS(dwTime);
MSG_AG_GM_DOMINATION_INIT_CMD cmdMsg;
cmdMsg.m_flag = MSG_AG_GM_DOMINATION_INIT_CMD::time;
cmdMsg.m_bMode = false;
sDOMINATION_EVENT_INFO& eventInfo = cmdMsg.m_Info;
DWORD* pTime = eventInfo.m_dwTime;
eventInfo.m_wDayOfWeek = wDayOfWeek;
*pTime++ = 0;
*pTime++ = util::CarcHHMMSS(dwTime,auction);
*pTime++ = util::CarcHHMMSS(*(pTime-1),1);
*pTime++ = util::CarcHHMMSS(*(pTime-1),5);
*pTime++ = util::CarcHHMMSS(*(pTime-1),selectend);
*pTime++ = util::CarcHHMMSS(*(pTime-1),10);
*pTime++ = util::CarcHHMMSS(*(pTime-1),wait);
*pTime++ = util::CarcHHMMSS(*(pTime-1),war);
*pTime = 240000;
CHKSendErr(!DominationInfoParser::Instance()->GMInsertEventInfo(eventInfo),
MSG_CG_GM_STRING_CMD_NAK, RC::RC_GM_CMD_FAILED, pPlayer);
g_pGameServer->SendToServer(AGENT_SERVER, &cmdMsg, sizeof(cmdMsg));
}
break;
case offense:
case defense:
{
MAPCODE mapCode = 0;
TCHAR tszGuildName[MAX_GUILDNAME_LENGTH+1] = {0,};
if (2 < nArgSize)
{
mapCode = atoi(vecCmd[2].c_str());
}
else
{
GameField* pGameField = pPlayer->GetField();
if (NULL != pGameField)
mapCode = pGameField->GetFieldCode();
}
if (3 < nArgSize)
{
_tcsncpy(tszGuildName, vecCmd[3].c_str(), MAX_GUILDNAME_LENGTH);
}
else
{
GameGuild* pGameGuild = g_GameGuildManager.FindGuild(pPlayer->GetGuildGuid());
CHKSendErr(!pGameGuild, MSG_CG_GM_STRING_CMD_NAK, RC::RC_GM_USER_STATE_INVALID, pPlayer);
_tcsncpy(tszGuildName, pGameGuild->GetGuildName(), MAX_GUILDNAME_LENGTH);
}
tszGuildName[MAX_GUILDNAME_LENGTH] = '\0';
mapCode = DominationInfoParser::Instance()->GetDominationFieldCode(mapCode);
CHKSendErr(!mapCode, MSG_CG_GM_STRING_CMD_NAK, RC::RC_GM_NOTEXIST_SCRIPT, pPlayer);
const DOMINATION_INFO* pDominationInfo =
GameDominationManager::Instance()->GetDominationInfo(mapCode);
if (pDominationInfo == NULL)
{
return false;
}
CHKSendErr(!pDominationInfo, MSG_CG_GM_STRING_CMD_NAK, RC::RC_GM_INVALID_ARGUMENT, pPlayer);
eDOMINATION_EVENT_TYPE eSetType = DOMINATION_INIT;
DOMINATION_INFO newInfo;
ZeroMemory(&newInfo, sizeof(newInfo));
newInfo.m_FieldCode = mapCode;
newInfo.m_TotalPoint = 5;
if (mode == offense)
{
eSetType = DOMINATION_GM_OFFENCE_GUILD_SET;
newInfo.m_inGuildInfo = pDominationInfo->m_inGuildInfo;
_tcsncpy(newInfo.m_disGuildInfo.m_tszGuildName, tszGuildName, MAX_GUILDNAME_LENGTH);
}
else
{
eSetType = DOMINATION_GM_DEFENCE_GUILD_SET;
newInfo.m_disGuildInfo = pDominationInfo->m_disGuildInfo;
_tcsncpy(newInfo.m_inGuildInfo.m_tszGuildName, tszGuildName, MAX_GUILDNAME_LENGTH);
}
GameDominationManager::Instance()->SendUpdateDominationInfo(newInfo, eSetType);
}
break;
case observer:
{
CHKSendErr(3 != nArgSize , MSG_CG_GM_STRING_CMD_NAK, RC::RC_GM_INVALID_ARGUMENT, pPlayer);
const char* cmd_str = vecCmd[2].c_str();
BOOL is_observer_mode;
if (strcmp(cmd_str, "开") == 0 || strcmp(cmd_str, "on") == 0)
{
is_observer_mode = true;
}
else if (strcmp(cmd_str, "关") == 0 || strcmp(cmd_str, "off") == 0)
{
is_observer_mode = false;
}
else
{
_SendErr(MSG_CG_GM_STRING_CMD_NAK, RC::RC_GM_INVALID_ARGUMENT, pPlayer);
return false;
}
MSG_AG_GM_DOMINATION_INIT_CMD cmdMsg;
cmdMsg.m_flag = MSG_AG_GM_DOMINATION_INIT_CMD::observer;
cmdMsg.m_bMode = is_observer_mode;
g_pGameServer->SendToServer(AGENT_SERVER, &cmdMsg, sizeof(cmdMsg));
}
break;
default:
_SendErr(MSG_CG_GM_STRING_CMD_NAK, RC::RC_GM_INVALID_ARGUMENT, pPlayer);
return false;
}
SendGMCmdAck(pPlayer, vecCmd[0].c_str());
return true;
}
}; //end of namespace 'nsGM'
bool GMCmdManager::RegisterDomination(const HandlerNode** node_array, size_t* result_array_count)
{
using namespace nsGM;
bool success = false;
#define GMHANDLER_MAPPING(activated, korean, english, handler) \
{ activated, eGM_GRADE_MAX, 0xFFFFFFFF, 0xFFFFFFFF, handler, korean, english }
static HandlerNode const_node_array[] =
{
GMHANDLER_MAPPING(true, "区域占领战", "domi", &ProcessDomination), // 区域占领战触发重置
}; //
ModifyGmHandlerNode(const_node_array, _countof(const_node_array));
*node_array = const_node_array;
*result_array_count = _countof(const_node_array);
success = true;
//
return success;
}