📄 gameaction.cpp
字号:
if(pNpc->GetData(idx) == nData)
return true;
}
else if(strcmp(szOpt, "<") == 0)
{
if(pNpc->GetData(idx) < nData)
return true;
}
else if(strcmp(szOpt, "<=") == 0)
{
if(pNpc->GetData(idx) <= nData)
return true;
}
else if(strcmp(szOpt, ">") == 0)
{
if(pNpc->GetData(idx) > nData)
return true;
}
else if(strcmp(szOpt, ">=") == 0)
{
if(pNpc->GetData(idx) >= nData)
return true;
}
else if(strcmp(szOpt, "pass") == 0)
{
pNpc->SetData(idx, ::DateStampPass(pNpc->GetData(idx), nData), bUpdate);
return true;
}
}
else if(stricmp(szAttr, "life") == 0)
{
if(strcmp(szOpt, "=") == 0)
{
pNpc->SetInt(NPCDATA_LIFE, nData, bUpdate);
CMsgUserAttrib msg;
IF_OK(msg.Create(pNpc->GetID(), _USERATTRIB_LIFE, nData))
pNpc->BroadcastRoomMsg(&msg);
return true;
}
}
else if(stricmp(szAttr, "maxlife") == 0)
{
if(strcmp(szOpt, "=") == 0)
{
pNpc->SetInt(NPCDATA_MAXLIFE, nData, bUpdate);
CMsgUserAttrib msg;
IF_OK(msg.Create(pNpc->GetID(), _USERATTRIB_MAXLIFE, nData))
pNpc->BroadcastRoomMsg(&msg);
return true;
}
}
else
{
LOGERROR("不支持的ACTION[%u]属性[%s]", pAction->GetKey(), szAttr);
}
return false;
}
break;
case ACTION_NPC_MODIFY:
{
OBJID idTarget;
PARAMBUF szAttr;
PARAMBUF szOpt;
PARAMBUF szData;
if(sscanf(szParam, "%u %s %s %s", &idTarget, szAttr, szOpt, szData) < 4)
{
LOGERROR("ACTION %u: 错误的参数数量", pAction->GetID());
break;
}
int nData = atoi(szData);
bool bUpdate = UPDATE_FALSE;
CNpc* pTarget = RoleManager()->QueryDynNpcByRecordID(idTarget);
if(!pTarget)
{
MapGroup(PID)->QueryIntraMsg()->ModifyNpc(idTarget, szAttr, szData);
return true;
}
if(stricmp(szAttr, "lookface") == 0)
{
if(strcmp(szOpt, "=") == 0)
{
pTarget->SetInt(NPCDATA_LOOKFACE, nData, bUpdate);
CMsgUserAttrib msg;
IF_OK(msg.Create(pTarget->GetID(), _USERATTRIB_LOOKFACE, nData))
pTarget->BroadcastRoomMsg(&msg);
return true;
}
}
else if(stricmp(szAttr, "datastr") == 0)
{
if(strcmp(szOpt, "=") == 0)
{
pTarget->SetStr(NPCDATA_DATASTR, szData, _MAX_NAMESIZE, bUpdate);
return true;
}
}
else if(strnicmp(szAttr, "data", 4) == 0)
{
int idx = (*(szAttr+4) - '0');
if(idx < 0 || idx >= MAX_NPCDATA)
return false;
if(strcmp(szOpt, "=") == 0)
{
pTarget->SetData(idx, nData, bUpdate);
return true;
}
}
else
{
LOGERROR("不支持的ACTION[%u]属性[%s]", pAction->GetKey(), szAttr);
}
return false;
}
break;
/* case ACTION_NPC_REQUESTSHIFT:
{
CHECKF(pAction && pRole);
CNpc* pNpc;
IF_NOT(pRole->QueryObj(OBJ_NPC, IPP_OF(pNpc)))
return false;
OBJID idNextTask;
if(sscanf(szParam, "%u", &idNextTask) < 1)
{
LOGERROR("ACTION %u: 错误的参数数量", pAction->GetID());
break;
}
CHECKF(idNextTask != ID_NONE);
ClearTaskID();
PushTaskID(idNextTask);
CMsgNpc msg;
IF_OK(msg.Create(EVENT_CHANGEPOS, pNpc->GetID()))
SendMsg(&msg);
return true;
}
break;
case ACTION_NPC_SHIFT:
{
CHECKF(pAction && pRole);
CNpc* pNpc;
IF_NOT(pRole->QueryObj(OBJ_NPC, IPP_OF(pNpc)))
return false;
CHECKF(pszAccept && strlen(pszAccept) > 0)
int x, y, nLook;
IF_NOT_(sscanf(pszAccept, "%d %d %d", &x, &y, &nLook) == 3) XXX // MsgNpcInfo转换成串,提供给任务系统
return false;
if(::MaskLook(pNpc->GetLookFace()) == ::MaskLook(nLook))
pNpc->SetInt(NPCDATA_LOOKFACE, nLook);
pNpc->TransPos(x, y); // synchro true
return true;
}
break;
*/
case ACTION_NPC_ERASE:
{
CHECKF(pAction && pRole);
CNpc* pNpc;
IF_NOT(pRole->QueryObj(OBJ_NPC, IPP_OF(pNpc)))
return false;
if(pNpc->IsDeleted())
return false;
int nType = pAction->GetInt(ACTIONDATA_DATA);
if(nType == 0)
{
m_pRole = NULL; // 清除任务NPC
return pNpc->DelNpc();
}
else
{
for(IRoleSet::Iter i = RoleManager()->QuerySet()->Begin(); i != RoleManager()->QuerySet()->End(); )
{
IRole* pRole = RoleManager()->QuerySet()->GetObjByIter(i);
i++; // 要删除,提前移动
CNpc* pNpc;
if(pRole && pRole->QueryObj(OBJ_NPC, IPP_OF(pNpc)) && pNpc->GetType() == nType)
{
if(!pNpc->DelNpc())
return false;
}
}
return true;
}
}
break;
case ACTION_NPC_RESETSYNOWNER://新的帮派占领帮派地图
{
CHECKF(pAction && pRole);
CNpc* pNpc;
IF_NOT(pRole->QueryObj(OBJ_NPC, IPP_OF(pNpc)))
return false;
CHECKF(pNpc->IsSynFlag());
/*
int nMaxScore = 0;
CSynPtr pMaxSyn = NULL;
for(int i = 0; i < SynManager()->QuerySynSet()->GetAmount(); i++)
{
CSyndicate* pSyn = SynManager()->QuerySynSet()->GetObjByIndex(i);
if(pSyn)
{
int nScore = pSyn->GetSynWarScore(pNpc->GetID());
pSyn->ClearSynWarScore(pNpc->GetID());
if(nMaxScore < nScore)
{
nMaxScore = nScore;
pMaxSyn = pSyn;
}
}
}
if(pMaxSyn && pMaxSyn->GetID() != ID_NONE)
{
// gain syn money
if(pNpc->GetSynID() != ID_NONE)
{
CSyndicate* pOldSyn = SynManager()->QuerySyndicate(pNpc->GetSynID());
if(pOldSyn && pOldSyn->GetInt(SYNDATA_MONEY) > 0)
{
int nMoney = MulDiv(pOldSyn->GetInt(SYNDATA_MONEY), SYNWAR_GAINMONEY_PERCENT, 100);
if(nMoney > 0)
{
pOldSyn->QueryModify()->AddData(SYNDATA_MONEY, -1*nMoney);
pMaxSyn->QueryModify()->AddData(SYNDATA_MONEY, nMoney);
}
}
}
}
*/
CGameMap * pSynMap = pNpc->GetMap();
IF_NOT(pSynMap->IsSynMap())
return false;
CNpc * pSynWarLetterNpc = pSynMap->GetNpcSynWarLetter();
OBJID idSynAtt = pSynWarLetterNpc->GetApplyAttackerSynID();
CSyndicate * pSynAtt = SynManager()->QuerySyndicate(idSynAtt);
IF_NOT(pSynAtt)
return false;
if(pSynWarLetterNpc)
{
int nMoney = pSynWarLetterNpc->GetData(SYNWARLETTER_DEPOSIT);
pSynAtt->QueryModify()->AddData(SYNDATA_MONEY,nMoney);//反还奖金
}
pNpc->SetSynOwnerID(pSynAtt->GetID(), false); // true: with link map
pNpc->GetMap()->SetSynID(pSynAtt->GetID(), true); // with all map npc
pNpc->GetMap()->SetStatus(CGameMap::STATUS_WAR, false);
// pNpc->SendSelfToBlock();
//记录占领的时间---begin
pNpc->GetMap()->SetSynOccupyTime();
//记录占领的时间---end
MSGBUF szMsg;
sprintf(szMsg, STR_GOT_WIN_s, pSynAtt->GetStr(SYNDATA_NAME));
CMsgTalk msg;
IF_OK (msg.Create(SYSTEM_NAME, ALLUSERS_NAME, szMsg, NULL, _COLOR_WHITE, _TXTATR_GM))
UserManager()->BroadcastMsg(&msg);
// stop all auto battal
CRoleSet::Iterator pRole = RoleManager()->QuerySet()->NewEnum();
while(pRole.Next())
{
if(pRole && pRole->GetMap()->GetID() == pNpc->GetMapID())
pRole->ClrAttackTarget();
}
// owner flag
CGameMap* pMap = pNpc->GetMap();
if(pMap->GetID() == WHITE_SYN_MAP_ID)
{
CMsgSyndicate msg;
IF_OK(msg.Create(SET_WHITE_SYN, pMap->GetOwnerID()))
UserManager()->BroadcastMsg(&msg);
}
else if(pMap->GetID() == BLACK_SYN_MAP_ID)
{
CMsgSyndicate msg;
IF_OK(msg.Create(SET_BLACK_SYN, pMap->GetOwnerID()))
UserManager()->BroadcastMsg(&msg);
}
return true;
}
break;
case ACTION_NPC_FIND_NEXT_TABLE:
{
CHECKF(pAction && pRole);
CNpc* pNpc;
IF_NOT(pRole->QueryObj(OBJ_NPC, IPP_OF(pNpc)))
return false;
CHECKF(pNpc->QueryTable());
int nType = atoi(szParam);
return pNpc->QueryTable()->FindNext(nType, pUser->TaskIterator());
}
break;
case ACTION_NPC_ADD_TABLE:
{
CHECKF(pAction && pRole);
CNpc* pNpc;
IF_NOT(pRole->QueryObj(OBJ_NPC, IPP_OF(pNpc)))
return false;
CHECKF(pNpc->QueryTable());
int nType;
OBJID idKey;
int setData[TABLEDATA_SIZE] = {0};
PARAMBUF szData = "";
CHECKF(TABLEDATA_SIZE == 4);
if(sscanf(szParam, "%d %u %d %d %d %d %s", &nType, &idKey, &setData[0], &setData[1], &setData[2], &setData[3], szData) < 2)
{
LOGERROR("ACTION %u: 错误的参数数量", pAction->GetID());
break;
}
return pNpc->QueryTable()->AddRecord(nType, idKey, setData, szData);
}
break;
case ACTION_NPC_DEL_TABLE:
{
CHECKF(pAction && pRole);
CNpc* pNpc;
IF_NOT(pRole->QueryObj(OBJ_NPC, IPP_OF(pNpc)))
return false;
CHECKF(pNpc->QueryTable());
if(strlen(szParam))
{
int nType;
OBJID idKey;
int setData[TABLEDATA_SIZE] = {0};
PARAMBUF szData = "";
CHECKF(TABLEDATA_SIZE == 4);
if(sscanf(szParam, "%d %u %d %d %d %d %s", &nType, &idKey, &setData[0], &setData[1], &setData[2], &setData[3], szData) < 2)
{
LOGERROR("ACTION %u: 错误的参数数量", pAction->GetID());
break;
}
return pNpc->QueryTable()->DelRecord(nType, idKey, setData, szData);
}
else
{
CHECKF(pUser->TaskIterator());
return pNpc->QueryTable()->DelRecord(pUser->TaskIterator());
}
}
break;
case ACTION_NPC_DEL_INVALID:
{
CHECKF(pAction && pRole);
CNpc* pNpc;
IF_NOT(pRole->QueryObj(OBJ_NPC, IPP_OF(pNpc)))
return false;
CHECKF(pNpc->QueryTable());
int nType;
int nIndex;
if(sscanf(szParam, "%d %u", &nType, &nIndex) < 2)
{
LOGERROR("ACTION %u: 错误的参数数量", pAction->GetID());
break;
}
return pNpc->QueryTable()->DelInvalid(nType, nIndex);
}
break;
case ACTION_NPC_AUCTIONING:
{
CNpc* pNpc;
IRole* pRole = RoleManager()->QuerySet()->GetObj(pAction->GetInt(ACTIONDATA_DATA));
if (pRole && pRole->QueryObj(OBJ_NPC, IPP_OF(pNpc)))
{
CHECKF(pNpc);
if(pNpc->IsAuctionNpc())
{
int nType = 0;
if(sscanf(szParam, "%d", &nType))
return(pNpc->QueryAuction()->CheckAuctionState(nType));
}
}
}
break;
case ACTION_NPC_SYS_AUCTION:
{
CNpc* pNpc;
IRole* pRole = RoleManager()->QuerySet()->GetObj(pAction->GetInt(ACTIONDATA_DATA));
if (pRole && pRole->QueryObj(OBJ_NPC, IPP_OF(pNpc)))
{
CHECKF(pNpc);
if(pNpc->IsAuctionNpc())
{
char szInfo[1024] = "NULL";
if(sscanf(szParam, "%s", szInfo) < 1 )
{
LOGERROR("ACTION %u: 错误的参数数量", pAction->GetID());
}
return(pNpc->QueryAuction()->SysAuctionStart(szInfo));
}
}
return false;
}
break;
case ACTION_NPC_TABLE_AMOUNT:
{
CHECKF(pAction && pRole);
CNpc* pNpc;
IF_NOT(pRole->QueryObj(OBJ_NPC, IPP_OF(pNpc)))
return false;
CHECKF(pNpc->QueryTable());
return pNpc->QueryTable()->QuerySet()->Size() < pAction->GetInt(ACTIONDATA_DATA);
}
break;
default:
LOGERROR("不支持的ACTION[%u]类型[%u]", pAction->GetKey(), pAction->GetInt(ACTIONDATA_TYPE));
}
return false;
}
//////////////////////////////////////////////////////////////////////
bool CGameAction::ProcessActionMap(CActionData* pAction, LPCTSTR szParam, CUser* pUser, IRole* pRole, CItem* pItem_no_use, LPCTSTR pszAccept)
{
CHECKF(pAction);
switch(pAction->GetInt(ACTIONDATA_TYPE))
{
/* case ACTION_MAP_NPC_BROCASTMSG:
{
CNpc* pNpc;
IRole* pRole = RoleManager()->QuerySet()->GetObj(pAction->GetInt(ACTIONDATA_DATA));
if (pRole && pRole->QueryObj(OBJ_NPC, IPP_OF(pNpc)))
{
CHECKF(pNpc);
CMsgTalk msg;
IF_OK (msg.Create(SYSTEM_NAME, ALLUSERS_NAME, szParam, NULL, 0x0ffffff, _TXTATR_SYSTEM))
UserManager()->BroadcastMapMsg(pNpc->GetMapID(), &msg);
return true;
}
}
break;*/
case ACTION_MAP_FIREWORKS:
{
IF_OK (pUser)
{
CMsgItem msg;
IF_OK (msg.Create(pUser->GetID(), ITEMACT_FIREWORKS))
pUser->BroadcastRoomMsg(&msg, true);
return true;
}
}
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -