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

📄 gameaction.cpp

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