📄 gameaction.cpp
字号:
{
CSynPtr pSyn = SynManager()->QuerySyndicate((OBJID)pUser->TaskIterator());
if(pSyn)
sprintf(szNum, "%d", pSyn->GetInt(SYNDATA_MONEY));
}
strcpy(ptr2, szNum);
ptr += sizeof(PARA_ITER_SYN_MONEY)-1;
ptr2 += strlen(szNum);
// continue;
}
else if(strnicmp(ptr, PARA_ITER_SYN_AMOUNT, sizeof(PARA_ITER_SYN_AMOUNT)-1) == 0)
{
char szNum[256] = "--"; // 缺省OWNERID为0
if(pUser->TaskIterator() != ID_NONE)
{
CSynPtr pSyn = SynManager()->QuerySyndicate((OBJID)pUser->TaskIterator());
if(pSyn)
sprintf(szNum, "%u", pSyn->GetSynAmount());
}
strcpy(ptr2, szNum);
ptr += sizeof(PARA_ITER_SYN_AMOUNT)-1;
ptr2 += strlen(szNum);
// continue;
}
else if(strnicmp(ptr, PARA_ITER_SYN_FEALTY, sizeof(PARA_ITER_SYN_FEALTY)-1) == 0)
{
char szNum[256] = "--"; // 缺省OWNERID为0
if(pUser->TaskIterator() != ID_NONE)
{
CSynPtr pSyn = SynManager()->QuerySyndicate((OBJID)pUser->TaskIterator());
if(pSyn)
sprintf(szNum, "%u", pSyn->GetFealtyName());
}
strcpy(ptr2, szNum);
ptr += sizeof(PARA_ITER_SYN_FEALTY)-1;
ptr2 += strlen(szNum);
// continue;
}
else if(strnicmp(ptr, PARA_ITER_MEMBER_RANK, sizeof(PARA_ITER_MEMBER_RANK)-1) == 0)
{
const char* pName = "--";
if(pUser->TaskIterator() != ID_NONE)
{
CUser* pTheUser = UserManager()->GetUser((OBJID)pUser->TaskIterator());
if(pTheUser && pTheUser->GetSynID())
pName = pTheUser->QuerySynAttr()->GetRankTitle();
}
strcpy(ptr2, pName);
ptr += sizeof(PARA_ITER_MEMBER_RANK)-1;
ptr2 += strlen(pName);
// continue;
}
else if(strnicmp(ptr, PARA_ITER_MEMBER_NAME, sizeof(PARA_ITER_MEMBER_NAME)-1) == 0)
{
const char* pName = "--";
if(pUser->TaskIterator() != ID_NONE)
{
CUser* pTheUser = UserManager()->GetUser((OBJID)pUser->TaskIterator());
if(pTheUser)
pName = pTheUser->GetName();
}
strcpy(ptr2, pName);
ptr += sizeof(PARA_ITER_MEMBER_NAME)-1;
ptr2 += strlen(pName);
// continue;
}
else if(strnicmp(ptr, PARA_ITER_MEMBER_PROFFER, sizeof(PARA_ITER_MEMBER_PROFFER)-1) == 0)
{
char szNum[256] = "--"; // 缺省OWNERID为0
if(pUser->TaskIterator() != ID_NONE)
{
CUser* pTheUser = UserManager()->GetUser((OBJID)pUser->TaskIterator());
if(pTheUser && pTheUser->GetSynID() != ID_NONE)
sprintf(szNum, "%d", pTheUser->QuerySynAttr()->GetInt(SYNATTRDATA_PROFFER));
}
strcpy(ptr2, szNum);
ptr += sizeof(PARA_ITER_MEMBER_PROFFER)-1;
ptr2 += strlen(szNum);
// continue;
}
else if (strnicmp(ptr, PARA_ITER_TABLE_DATASTR, sizeof(PARA_ITER_TABLE_DATASTR)-1) == 0)
{
CHECK(pNpc && pNpc->QueryTable());
CTableData* pData = pNpc->QueryTable()->QuerySet()->GetObj(pUser->TaskIterator());
CHECK(pData);
strcpy(ptr2, pData->GetStr(TABLEDATA_DATASTR));
ptr += sizeof(PARA_ITER_TABLE_DATASTR)-1;
ptr2 += strlen(pData->GetStr(TABLEDATA_DATASTR));
// continue;
}
else if(strnicmp(ptr, PARA_ITER_TABLE_DATA_, sizeof(PARA_ITER_TABLE_DATA_)-1) == 0
&& *(ptr+sizeof(PARA_ITER_TABLE_DATA_)-1) >= '0' && *(ptr+sizeof(PARA_ITER_TABLE_DATA_)-1) < '0'+ TABLEDATA_SIZE)
{
CHECK(pNpc && pNpc->QueryTable());
CTableData* pData = pNpc->QueryTable()->QuerySet()->GetObj(pUser->TaskIterator());
CHECK(pData);
char szNum[256] = "--";
int idx = *(ptr+sizeof(PARA_ITER_TABLE_DATA_)-1) - '0';
if(idx >= 0 && idx < TABLEDATA_SIZE)
sprintf(szNum, "%d", pData->GetInt(TABLEDATA(TABLEDATA_DATA0 + idx)));
strcpy(ptr2, szNum);
ptr += sizeof(PARA_ITER_TABLE_DATA_)-1 + 1; //+1 : index
ptr2 += strlen(szNum);
// continue;
}
else if(strnicmp(ptr, PARA_ITER_ITEM_DATA, sizeof(PARA_ITER_ITEM_DATA)-1) == 0)
{
char szNum[256] = "(err)";
CItem* pItem = pUser->GetItem(pUser->TaskIterator());
IF_OK(pItem)
sprintf(szNum, "%u", pItem->GetInt(ITEMDATA_DATA));
strcpy(ptr2, szNum);
ptr += sizeof(PARA_ITER_ITEM_DATA)-1;
ptr2 += strlen(szNum);
// continue;
}
//---任务系统---begin
else if(strnicmp(ptr, PARA_ITER_TASK_USERNAME, sizeof(PARA_ITER_TASK_USERNAME)-1) == 0)
{
//此任务对应的用户名
char szName[128];
CTaskDetail * pTask = pUser->GetTaskDetail();
CHECK(pTask);
CTaskDetailData * pTaskData = pTask->QueryData(pUser->TaskIterator());
CHECK(pTaskData);
OBJID idUser = pTaskData->GetInt(TASKDETAILDATA_USERID);
CUser * pUser = UserManager()->GetUser(idUser);
CHECK(pUser);
sprintf(szName,"%s",pUser->GetName());
strcpy(ptr2, szName);
ptr += sizeof(PARA_ITER_TASK_USERNAME)-1;
ptr2 += strlen(szName);
// continue;
}
else if(strnicmp(ptr, PARA_ITER_TASK_COMPLETENUM, sizeof(PARA_ITER_TASK_COMPLETENUM)-1) == 0)
{
//任务完成次数
char szBuff[128];
CTaskDetail * pTask = pUser->GetTaskDetail();
CHECK(pTask);
CTaskDetailData * pTaskData = pTask->QueryData(pUser->TaskIterator());
CHECK(pTaskData);
sprintf(szBuff,"%d",pTaskData->GetInt(TASKDETAILDATA_TASKCOMPLETENUM));
strcpy(ptr2, szBuff);
ptr += sizeof(PARA_ITER_TASK_COMPLETENUM)-1;
ptr2 += strlen(szBuff);
}
else if(strnicmp(ptr, PARA_ITER_TASK_BEGINTIME, sizeof(PARA_ITER_TASK_BEGINTIME)-1) == 0)
{
//任务的开始时间
char szBuff[128];
CTaskDetail * pTask =pUser->GetTaskDetail();
CHECK(pTask);
CTaskDetailData * pTaskData = pTask->QueryData(pUser->TaskIterator());
CHECK(pTaskData);
time_t ltime = pTaskData->GetInt(TASKDETAILDATA_TASKBEGINTIME);
struct tm *pTime;
pTime = localtime( <ime );
CHECK(pTime);
int nYear, nMonth, nDay, nHour, nMinute, nSec;
nYear =pTime->tm_year+1900;
nMonth =pTime->tm_mon+1;
nDay =pTime->tm_mday;
nHour =pTime->tm_hour;
nMinute =pTime->tm_min;
nSec = pTime->tm_sec;
sprintf(szBuff,"%d-%02d-%02d %02d:%02d:%02d",nYear,nMonth,nDay,nHour,nMinute,nSec);
strcpy(ptr2, szBuff);
ptr += sizeof(TASKDETAILDATA_TASKBEGINTIME)-1;
ptr2 += strlen(szBuff);
}
//---任务系统---end
}
if(pNpc)
{
if (strnicmp(ptr, PARA_DATASTR, sizeof(PARA_DATASTR)-1) == 0)
{
strcpy(ptr2, pNpc->GetStr(NPCDATA_DATASTR));
ptr += sizeof(PARA_DATASTR)-1;
ptr2 += strlen(pNpc->GetStr(NPCDATA_DATASTR));
// continue;
}
else if(strnicmp(ptr, PARA_DATA_, sizeof(PARA_DATA_)-1) == 0
&& *(ptr+sizeof(PARA_DATA_)-1) >= '0' && *(ptr+sizeof(PARA_DATA_)-1) < '0'+ MAX_NPCDATA)
{
char szNum[256] = "";
int idx = *(ptr+sizeof(PARA_DATA_)-1) - '0';
if(idx >= 0 && idx < MAX_NPCDATA)
sprintf(szNum, "%d", pNpc->GetData(idx));
strcpy(ptr2, szNum);
ptr += sizeof(PARA_DATA_)-1 + 1; //+1 : index
ptr2 += strlen(szNum);
// continue;
}
else if(strnicmp(ptr, PARA_NAME, sizeof(PARA_NAME)-1) == 0)
{
strcpy(ptr2, pNpc->GetName());
ptr += sizeof(PARA_NAME)-1;
ptr2 += strlen(pNpc->GetStr(NPCDATA_NAME));
// continue;
}
else if(strnicmp(ptr, PARA_NPC_ID, sizeof(PARA_NPC_ID)-1) == 0)
{
char szNum[256] = "0";
sprintf(szNum, "%u", pNpc->GetRecordID());
strcpy(ptr2, szNum);
ptr += sizeof(PARA_NPC_ID)-1;
ptr2 += strlen(szNum);
// continue;
}
else if(strnicmp(ptr, PARA_NPC_X, sizeof(PARA_NPC_X)-1) == 0)
{
char szNum[256] = "0";
sprintf(szNum, "%u", pNpc->GetPosX());
strcpy(ptr2, szNum);
ptr += sizeof(PARA_NPC_X)-1;
ptr2 += strlen(szNum);
// continue;
}
else if(strnicmp(ptr, PARA_NPC_Y, sizeof(PARA_NPC_Y)-1) == 0)
{
char szNum[256] = "0";
sprintf(szNum, "%u", pNpc->GetPosY());
strcpy(ptr2, szNum);
ptr += sizeof(PARA_NPC_Y)-1;
ptr2 += strlen(szNum);
// continue;
}
else if(strnicmp(ptr, PARA_NPC_OWNERID, sizeof(PARA_NPC_OWNERID)-1) == 0)
{
char szNum[256] = "0";
sprintf(szNum, "%u", pNpc->GetInt(NPCDATA_OWNERID));
strcpy(ptr2, szNum);
ptr += sizeof(PARA_NPC_OWNERID)-1;
ptr2 += strlen(szNum);
// continue;
}
}
if(pItem)
{
if(strnicmp(ptr, PARA_ITEM_TYPE, sizeof(PARA_ITEM_TYPE)-1) == 0)
{
char szNum[256] = "";
sprintf(szNum, "%u", pItem->GetInt(ITEMDATA_TYPE));
strcpy(ptr2, szNum);
ptr += sizeof(PARA_ITEM_TYPE)-1;
ptr2 += strlen(szNum);
// continue;
}
else if(strnicmp(ptr, PARA_ITEM_DATA, sizeof(PARA_ITEM_DATA)-1) == 0)
{
char szNum[256] = "";
sprintf(szNum, "%u", pItem->GetInt(ITEMDATA_DATA));
strcpy(ptr2, szNum);
ptr += sizeof(PARA_ITEM_DATA)-1;
ptr2 += strlen(szNum);
// continue;
}
}
// fill space
if(nWidth)
{
while(ptr2 < pNext)
*(ptr2++) = ' ';
}
} // %
else
{
*ptr2 = *ptr;
ptr++;
ptr2++;
}
} // while
*ptr2 = 0;
}
////////////////////////////////////////////////////////////////////////////////////
bool CGameAction::ProcessAction(OBJID idAction, CUser* pUser, IRole* pRole, CItem* pItem, LPCTSTR pszAccept)
{
if (idAction == ID_NONE)
return false;
m_pUser = pUser;
m_pRole = pRole;
m_pItem = pItem;
try
{
// process action...
const _MAX_ACTIONPRC =32;
DWORD dwActionCount =0;
while (idAction != ID_NONE)
{
DEADLOOP_CHECK(PID, "idAction: ")
CActionData* pAction = ActionSet()->GetObj(idAction);
if (!pAction)
{
::LogSave("Error: game action %u not found.", idAction);
break;
}
char szParam[1024];
ReplaceAttrStr(szParam, pAction->GetStr(ACTIONDATA_PARAM), m_pUser, m_pRole, m_pItem, pszAccept);
szParam[255] = 0; // 截断
//? FOR DEBUG
if(m_pUser && m_pUser->IsPM())
{
char szMsg[1024];
sprintf(szMsg, "%d: [%d,%d]. type[%d], data[%d], param:[%s].",
pAction->GetID(),
pAction->GetInt(ACTIONDATA_IDNEXT),
pAction->GetInt(ACTIONDATA_IDNEXTFAIL),
pAction->GetInt(ACTIONDATA_TYPE),
pAction->GetInt(ACTIONDATA_DATA),
szParam);
// '%' in szMsg this->SendSysMsg(_TXTATR_NORMAL, "ACTION: %s", szMsg);
szMsg[255] = 0;
CMsgTalk msg;
if (msg.Create(SYSTEM_NAME, m_pUser->GetName(), szMsg, NULL, 0x00ffff00, _TXTATR_NORMAL))
m_pUser->SendMsg(&msg);
}
// process action now!
bool bRet = false;
int nActionType = pAction->GetInt(ACTIONDATA_TYPE);
if(nActionType > ACTION_SYS_FIRST && nActionType < ACTION_SYS_LIMIT)
bRet = ProcessActionSys (pAction, szParam, m_pUser, m_pRole, m_pItem, pszAccept);
else if(nActionType > ACTION_NPC_FIRST && nActionType < ACTION_NPC_LIMIT)
bRet = ProcessActionNpc (pAction, szParam, m_pUser, m_pRole, m_pItem, pszAccept);
else if(nActionType > ACTION_MAP_FIRST && nActionType < ACTION_MAP_LIMIT)
bRet = ProcessActionMap (pAction, szParam, m_pUser, m_pRole, m_pItem, pszAccept);
else if(nActionType > ACTION_ITEMONLY_FIRST && nActionType < ACTION_ITEMONLY_LIMIT)
bRet = ProcessActionItemOnly (pAction, szParam, m_pUser, m_pRole, m_pItem, pszAccept);
else if(nActionType > ACTION_ITEM_FIRST && nActionType < ACTION_ITEM_LIMIT)
bRet = ProcessActionItem (pAction, szParam, m_pUser, m_pRole, m_pItem, pszAccept);
else if(nActionType > ACTION_NPCONLY_FIRST && nActionType < ACTION_NPCONLY_LIMIT)
bRet = ProcessActionNpcOnly (pAction, szParam, m_pUser, m_pRole, m_pItem, pszAccept);
else if(nActionType > ACTION_SYN_FIRST && nActionType < ACTION_SYN_LIMIT)
bRet = ProcessActionSyn (pAction, szParam, m_pUser, m_pRole, m_pItem, pszAccept);
else if(nActionType > ACTION_USER_FIRST && nActionType < ACTION_USER_LIMIT)
bRet = ProcessActionUser (pAction, szParam, m_pUser, m_pRole, m_pItem, pszAccept);
else if(nActionType > ACTION_EVENT_FIRST && nActionType < ACTION_EVENT_LIMIT)
bRet = ProcessActionEvent (pAction, szParam, m_pUser, m_pRole, m_pItem, pszAccept);
else if(nActionType > ACTION_TRAP_FIRST && nActionType < ACTION_TRAP_LIMIT)
bRet = ProcessActionEvent (pAction, szParam, m_pUser, m_pRole, m_pItem, pszAccept);
else if(nActionType > ACTION_WANTED_FIRST && nActionType < ACTION_WANTED_LIMIT)
bRet = ProcessActionWanted (pAction, szParam, m_pUser, m_pRole, m_pItem, pszAccept);
else if(nActionType > ACTION_MST_FIRST && nActionType < ACTION_MST_LIMIT)
bRet = ProcessActionMonster (pAction, szParam, m_pUser, m_pRole, m_pItem, pszAccept);
else if(nActionType > ACTION_MAP_FIRST && nActionType < ACTION_MAGIC_LIMIT)
bRet = ProcessActionMagic(pAction, szParam, m_pUser, m_pRole, m_pItem, pszAccept);
else
{
ASSERT(!"Error action type!");
}
if (bRet)
idAction = pAction->GetInt(ACTIONDATA_IDNEXT);
else
idAction = pAction->GetInt(ACTIONDATA_IDNEXTFAIL);
if (dwActionCount++ >= _MAX_ACTIONPRC)
{
::LogSave("Error: too many game action, last action:%u.", idAction);
break;
}
} // while
}
catch(...)
{
ASSERT(!"catch");
::LogSave("Error: exception catched in CGameAction::ProcessAction(%u)", idAction);
}
return true;
}
//////////////////////////////////////////////////////////////////////
bool CGameAction::ProcessActionMonster(CActionData* pAction, LPCTSTR szParam, CUser* pUser, IRole* pRole, CItem* pItem, LPCTSTR pszAccept)
{
IF_NOT (pAction)
return false;
CMonster* pMonster = NULL;
IF_NOT (pRole->QueryObj(OBJ_MONSTER, IPP_OF(pMonster)))
return false;
switch(pAction->GetInt(ACTIONDATA_TYPE))
{
case ACTION_MST_DROPITEM:
{
// monster被杀死后掉物品或者钱, param "dropitem itemtype"或者"dropmoney money [LowPercent]"
char szCmd[MAX_PARAMSIZE] = "";
if (1 != sscanf(szParam, "%s", szCmd))
{
LOGERROR("ACTION %u: 错误的参数数量", pAction->GetID());
break;
}
if (0 == stricmp(szCmd, "dropitem"))
{
DWORD dwData = 0;
if (2 == sscanf(szParam, "%s %u", szCmd, &dwData))
{
if (0 == stricmp(szCmd, "dropitem"))
{
OBJID idUser = ID_NONE;
if (pUser)
idUser = pUser->GetID();
if (pMonster->DropItem(dwData, idUser))
return true;
}
}
else
{
LOGERROR("ACTION %u: 错误的参数数量", pAction->GetID());
break;
}
}
else if (0 == stricmp(szCmd, "dropmoney"))
{
DWORD dwData=0, dwLowPercent=0;
int rval = sscanf(szParam, "%s %u %u", szCmd, &dwData, &dwLowPercent);
if (rval == 2)
dwLowPercent = 100;
else if (rval == 3)
dwLowPercent %= 100;
else
{
LOGERROR("ACTION %u: 错误的参数数量", pAction->GetID());
break;
}
DWORD dwMoneyDrop = dwData*(dwLowPercent+::RandGet(100-dwLowPercent))/100;
if (dwMoneyDrop <= 0)
return false;
OBJID idUser = ID_NONE;
if (pUser)
idUser = pUser->GetID();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -