📄 gameaction.cpp
字号:
if (pMonster->DropMoney(dwMoneyDrop, idUser))
return true;
}
else if (0 == stricmp(szCmd, "droptrap"))//monster被杀死后掉陷阱, param "droptrap traptype lifeperiod"。
{
OBJID idTrapId=NULL;
UINT uiLifePeriod=0;
if (3 == sscanf(szParam, "%s %u %u", szCmd, &idTrapId,&uiLifePeriod))
{
if (0 == stricmp(szCmd, "droptrap"))
{
TRAP_INFO info;
memset(&info, 0, sizeof(TRAP_INFO));
info.usType = idTrapId;
if (pMonster->DropTrap(info,uiLifePeriod))
return true;
}
}
}
}
break;
case ACTION_MST_MAGIC:
{
if (!pRole->QueryMagic())
return false;
PARAMBUF szCmd;
int nType;
int nLevel=0;
bool bSave=true;
int nNum = 0;
if((nNum=sscanf(szParam, "%s %u %u %u", szCmd, &nType, &nLevel, &bSave)) < 2)
{
LOGERROR("ACTION %u: 错误的参数数量", pAction->GetID());
break;
}
if(stricmp(szCmd, "check") == 0)
{
if(nNum == 3)
return pRole->QueryMagic()->CheckLevel(nType, nLevel);
else
return pRole->QueryMagic()->CheckType(nType);
}
else if(stricmp(szCmd, "learn") == 0)
{
return pRole->QueryMagic()->LearnMagic(nType, nLevel, bSave) != ID_NONE;
}
else if(stricmp(szCmd, "uplevel") == 0)
{
return pRole->QueryMagic()->UpLevelByTask(nType);
}
else
{
ASSERT(!"ACTION_USER_MAGIC 错误的参数类型!");
}
return true;
}
break;
default:
LOGERROR("错误的Action Type", pAction->GetInt(ACTIONDATA_TYPE));
break;
}
return false;
}
//////////////////////////////////////////////////////////////////////
bool CGameAction::ProcessActionSys(CActionData* pAction, LPCTSTR szParam, CUser* pUser, IRole* pRole, CItem* pItem, LPCTSTR pszAccept)
{
CHECKF(pAction);
switch(pAction->GetInt(ACTIONDATA_TYPE))
{
case ACTION_BROCASTMSG:
{
CMsgTalk msg;
if (msg.Create(SYSTEM_NAME, ALLUSERS_NAME, szParam, NULL, _COLOR_WHITE, pAction->GetInt(ACTIONDATA_DATA)))
RoleManager()->BroadcastMsg(&msg);
}
break;
case ACTION_POSTCMD:
{
if (pUser)
{
CMsgAction msg;
IF_OK (msg.Create( pUser->GetID(),
pUser->GetPosX(),
pUser->GetPosY(),
pUser->GetDir(),
actionPostCmd,
pAction->GetInt(ACTIONDATA_DATA) ))
pUser->SendMsg(&msg);
return true;
}
}
break;
case ACTION_CHKTIME:
{
if (CMapGroup::CheckTime(pAction->GetInt(ACTIONDATA_DATA), szParam))
return true;
}
break;
case ACTION_MENUTEXT:
{
if(!pUser)
{
LOGERROR("Can't find user object when action[%d].", pAction->GetID());
return false;
}
CMsgDialog msg;
CHECKF(msg.Create(MSGDIALOG_TEXT, szParam, INDEX_NONE, pAction->GetInt(ACTIONDATA_DATA)));
pUser->SendMsg(&msg);
return true;
}
break;
case ACTION_MENULINK:
{
CHECKF(pUser);
PARAMBUF szText;
OBJID idTask;
int nAlign = 0;
if(sscanf(szParam, "%s %u %d", szText, &idTask, &nAlign) < 2)
{
LOGERROR("ACTION %u: 错误的参数数量", pAction->GetID());
break;
}
CMsgDialog msg;
CHECKF(msg.Create(MSGDIALOG_LINK, szText, pUser->PushTaskID(idTask), nAlign));
pUser->SendMsg(&msg);
return true;
}
break;
case ACTION_MENUEDIT:
{
CHECKF(pUser);
int nAcceptLen;
OBJID idTask;
PARAMBUF szText = "";
if(sscanf(szParam, "%d %u %s", &nAcceptLen, &idTask, szText) < 2)
{
LOGERROR("ACTION %u: 错误的参数数量", pAction->GetID());
break;
}
CMsgDialog msg;
CHECKF(msg.Create(MSGDIALOG_EDIT, szText, pUser->PushTaskID(idTask), nAcceptLen));
pUser->SendMsg(&msg);
return true;
}
break;
case ACTION_MENUPIC:
{
CHECKF(pUser);
int x;
int y;
OBJID idPic;
OBJID idTask = ID_NONE;
if(sscanf(szParam, "%d %d %u %u", &x, &y, &idPic, &idTask) < 3)
{
LOGERROR("ACTION %u: 错误的参数数量", pAction->GetID());
break;
}
CMsgDialog msg;
CHECKF(msg.Create(MSGDIALOG_PIC, x, y, idPic, pUser->PushTaskID(idTask)));
pUser->SendMsg(&msg);
return true;
}
break;
case ACTION_MENUBUTTON:
LOGERROR("不支持的ACTION[%u]类型[%u]", pAction->GetKey(), pAction->GetInt(ACTIONDATA_TYPE));
break;
case ACTION_MENULISTPART:
{
CHECKF(pUser);
OBJID idTask;
OBJID idIter;
if(sscanf(szParam, "%u %u ", &idTask, &idIter) < 2)
{
LOGERROR("ACTION %u: 错误的参数数量", pAction->GetID());
break;
}
char* pszText = strchr(szParam, ' ');
CHECKF(pszText);
pszText = strchr(pszText+1, ' ');
CHECKF(pszText);
pszText++;
CHECKF(*pszText);
CMsgDialog msg;
CHECKF(msg.Create(MSGDIALOG_LISTLINE, pszText, pUser->PushTaskID(idTask, idIter), idIter));
pUser->SendMsg(&msg);
return true;
}
break;
case ACTION_MENUCREATE:
{
CHECKF(pUser);
OBJID idTask = ID_NONE;
sscanf(szParam, "%u", &idTask);
CMsgDialog msg;
CHECKF(msg.Create(MSGDIALOG_CREATE, pUser->PushTaskID(idTask)));
pUser->SendMsg(&msg);
return true;
}
break;
case ACTION_RAND:
{
int nData1, nData2;
if(sscanf(szParam, "%u %u", &nData1, &nData2) < 2)
{
LOGERROR("ACTION %u: 错误的参数数量", pAction->GetID());
break;
}
if(::RandGet(nData2) < nData1)
return true;
else
return false;
}
break;
case ACTION_RANDACTION:
{
// 检测随机率。"action0 .... action7"
OBJID idAction[8];
if (8 == sscanf(szParam, "%u %u %u %u %u %u %u %u",
&idAction[0], &idAction[1], &idAction[2], &idAction[3],
&idAction[4], &idAction[5], &idAction[6], &idAction[7]))
{
ProcessAction(idAction[::RandGet(8)], pUser, pRole, pItem, pszAccept);
return true;
}
else
LOGERROR("ACTION %u: 错误的参数数量", pAction->GetID());
}
break;
case ACTION_MESSAGEBOX:
{
if(pUser)
{
int nChannel = _TXTATR_MESSAGEBOX;
if(pAction->GetInt(ACTIONDATA_DATA) > 0 && pAction->GetInt(ACTIONDATA_DATA) < _TXTATR_DIALOG_END - _TXTATR_DIALOG_BEGIN)
nChannel = pAction->GetInt(ACTIONDATA_DATA) + _TXTATR_DIALOG_BEGIN;
CMsgTalk msg;
IF_OK(msg.Create(nChannel, szParam))
pUser->SendMsg(&msg);
return true;
}
}
break;
default:
LOGERROR("不支持的ACTION[%u]类型[%u]", pAction->GetKey(), pAction->GetInt(ACTIONDATA_TYPE));
} // switch
return false;
}
//////////////////////////////////////////////////////////////////////
bool CGameAction::ProcessActionNpc(CActionData* pAction, LPCTSTR szParam, CUser* pUser, IRole* pRole, CItem* pItem, LPCTSTR pszAccept)
{
CHECKF(pAction);
switch(pAction->GetInt(ACTIONDATA_TYPE))
{
case ACTION_NPC_DRESS_SYNCLOTHING://穿帮派服装
{
CNpc* pNpc=NULL;
CHECKF(pRole);
if(!pUser->GetMap()->IsSynMap())
return false;
IF_NOT(pRole->QueryObj(OBJ_NPC, IPP_OF(pNpc)))
return false;
if(pNpc->GetSynID() != pUser->GetSynID())
{
return false;
}
int nData0 = pNpc->GetData(SYNDRESS_SORT);
if(!(nData0>=0&&nData0<5))//5类帮派服装
return false;
int nData1 = pNpc->GetData(SYNDRESS_SETTING);
char szData1[16];
sprintf(szData1,"%d",nData1);
OBJID idMap = pUser->GetMapID();
DWORD dwSynID = pUser->GetSynID();
int nLevel=0, nRank=0;
int nIndex=0; //帮派服装的类别索引
nLevel = pUser->QuerySynAttr()->GetSynMemberLevel();
nRank= pUser->GetSyndicate()->GetInt(SYNDATA_RANK);
if(nRank==RANK_TEAMLEADER||nLevel==SYNMEM_LEVEL_THREE||nLevel==SYNMEM_LEVEL_FOUR)
nIndex = 1;
else if(nRank==RANK_SUBLEADER||nLevel==SYNMEM_LEVEL_FIVE)
nIndex = 2;
else if(nRank==RANK_LEADER)
nIndex = 3;
else //普通
nIndex =0;
if(nData1!=0)
{
char cColor= szData1[nIndex]-1;
nData1 = atoi(&cColor);
}
char szFlag[7];
sprintf(szFlag,"137%d%d0",nData1,nData0);
pUser->SetSynDressArmorType(atoi(szFlag));
// pUser->SendSelfToBlock();
CMsgUserAttrib msgAtt;
if (msgAtt.Create(pUser->GetID(), _USERATTRIB_ARMORTYPE, pUser->GetArmorTypeID()))
{
pUser->SendMsg(&msgAtt);
}
return true;
}
break;
case ACTION_NPC_TAKEOFF_SYNCLOTHING://脱帮派服装
{
CNpc* pNpc=NULL;
CHECKF(pRole);
if(!pUser->GetMap()->IsSynMap())
return false;
IF_NOT(pRole->QueryObj(OBJ_NPC, IPP_OF(pNpc)))
return false;
pUser->SetSynDressArmorType(0);
// pUser->SendSelfToBlock();
CMsgUserAttrib msgAtt;
if (msgAtt.Create(pUser->GetID(), _USERATTRIB_ARMORTYPE, pUser->GetArmorTypeID()))
{
pUser->SendMsg(&msgAtt);
}
return true;
}
break;
case ACTION_NPC_ATTR:
{
PARAMBUF szAttr;
PARAMBUF szOpt;
PARAMBUF szData;
OBJID idTargetNpc = ID_NONE;
if(sscanf(szParam, "%s %s %s %u", szAttr, szOpt, szData, &idTargetNpc) < 4)
{
LOGERROR("ACTION %u: 错误的参数数量", pAction->GetID());
break;
}
int nData = atoi(szData);
bool bUpdate = UPDATE_FALSE;
CNpc* pNpc=NULL;
if(idTargetNpc != ID_NONE)
{
pNpc = RoleManager()->QueryDynNpcByRecordID(idTargetNpc);
}
else
{
CHECKF(pRole);
pRole->QueryObj(OBJ_NPC, IPP_OF(pNpc));
}
IF_NOT(pNpc)
{
LOGERROR("Can't find npc_id[%u] in action[%u].", idTargetNpc, pAction->GetID());
return false;
}
if(stricmp(szAttr, "ownerid") == 0)
{
if(strcmp(szOpt, "=") == 0)
{
pNpc->SetInt(NPCDATA_OWNERID, nData, bUpdate);
return true;
}
else if(strcmp(szOpt, "==") == 0)
{
if(pNpc->GetInt(NPCDATA_OWNERID) == nData)
return true;
}
}
else if(stricmp(szAttr, "ownertype") == 0)
{
if(strcmp(szOpt, "=") == 0)
{
pNpc->SetInt(NPCDATA_OWNERTYPE, nData, bUpdate);
return true;
}
else if(strcmp(szOpt, "==") == 0)
{
if(pNpc->GetInt(NPCDATA_OWNERTYPE) == nData)
return true;
}
}
else if(stricmp(szAttr, "lookface") == 0)
{
if(strcmp(szOpt, "=") == 0)
{
pNpc->SetInt(NPCDATA_LOOKFACE, nData, bUpdate);
CMsgUserAttrib msg;
IF_OK(msg.Create(pNpc->GetID(), _USERATTRIB_LOOKFACE, nData))
pNpc->BroadcastRoomMsg(&msg);
return true;
}
else if(strcmp(szOpt, "==") == 0)
{
if(pNpc->GetInt(NPCDATA_LOOKFACE) == nData)
return true;
}
}
else if(stricmp(szAttr, "datastr") == 0)
{
if(strcmp(szOpt, "=") == 0)
{
pNpc->SetInt(NPCDATA_DATASTR, nData, bUpdate);
return true;
}
else if(strcmp(szOpt, "==") == 0)
{
if(pNpc->GetInt(NPCDATA_DATASTR) == nData)
return true;
}
}
else if(strnicmp(szAttr, "data", 4) == 0)
{
if(stricmp(szData, "accept") == 0)
{
nData = atol(pszAccept);
}
int idx = (*(szAttr+4) - '0');
if(idx < 0 || idx >= MAX_NPCDATA)
return false;
if(strcmp(szOpt, "=") == 0)
{
pNpc->SetData(idx, nData, bUpdate);
return true;
}
else if(strcmp(szOpt, "+=") == 0)
{
pNpc->SetData(idx, pNpc->GetData(idx) + nData, bUpdate);
return true;
}
else if(strcmp(szOpt, "==") == 0)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -