⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gameaction.cpp

📁 网络游戏魔域的服务端与客户端完整源代码 包括详细的说明文档与开发日志
💻 CPP
📖 第 1 页 / 共 5 页
字号:
					{
						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( &ltime );
					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 + -