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

📄 gameaction.cpp

📁 网络游戏魔域的服务端与客户端完整源代码 包括详细的说明文档与开发日志
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	case ACTION_MAP_SETSTATUS:
		{
			OBJID	idMap;
			int		nStatus;
			int		nFlag;
			if (3 == sscanf(szParam, "%u %d %d", &idMap, &nStatus, &nFlag))
			{
				CGameMap* pMap = MapManager()->QueryMap(idMap);
				if (pMap)
				{
					pMap->SetStatus(nStatus, nFlag != 0);
					return true;					
				}
			}
			else
				LOGERROR("ACTION %u: 错误的参数数量", pAction->GetID());
		}
		break;
		
	case ACTION_MAP_DROPITEM:
		{
			OBJID idItemType = ID_NONE, idMap = ID_NONE;
			POINT pos;
			if (4 == sscanf(szParam, "%u %u %d %d", &idItemType, &idMap, &pos.x, &pos.y))
			{
				CGameMap* pMap = MapManager()->QueryMap(idMap);
				if (pMap && pMap->IsLayItemEnable(pos.x, pos.y))
				{
					CMapItem* pMapItem = CMapItem::CreateNew();
					if (pMapItem)
					{
						if(pMapItem->Create(MapManager()->SpawnMapItemID(), pMap, pos, idItemType, ID_NONE))
						{
							MapManager()->QueryMapItemSet()->AddObj(pMapItem);
							return true;
						}
						else
							pMapItem->ReleaseByOwner();
					}
				}
			}
			else
				LOGERROR("ACTION %u: 错误的参数数量", pAction->GetID());
		}
		break;

	case	ACTION_MAP_MAPEFFECT:
		{
			OBJID idMap = ID_NONE;
			int nPosX = 0, nPosY = 0;
			char szEffect[256] = "";

			if (4 == sscanf(szParam, "%u %d %d %s", &idMap, &nPosX, &nPosY, szEffect))
			{
				CGameMap* pMap = MapManager()->QueryMap(idMap);
				if (pMap)
				{
					CMsgName msg;
					IF_OK (msg.Create(NAMEACT_MAPEFFECT, szEffect, nPosX, nPosY))
						pMap->BroadcastBlockMsg(nPosX, nPosY, &msg);

					return true;
				}
			}
			else
				LOGERROR("ACTION %u: 错误的参数数量", pAction->GetID());
		}
		break;

	case	ACTION_MAP_MOVENPC:
		{
			CNpc* pNpc;
			IRole* pRole = RoleManager()->QuerySet()->GetObj(pAction->GetInt(ACTIONDATA_DATA));
			if (pRole && pRole->QueryObj(OBJ_NPC, IPP_OF(pNpc)))
			{
				IF_NOT(!pNpc->IsDynaNpc())
				{
					LOGERROR("ACTION_MAP_MOVENPC 仅用于固定NPC[%d]", pNpc->GetID());
					return false;
				}

				OBJID idMap = ID_NONE;
				int nPosX = 0, nPosY = 0;

				if (3 == sscanf(szParam, "%u %d %d", &idMap, &nPosX, &nPosY))
				{
					if (pNpc->ChangePos(idMap, nPosX, nPosY))
						return true;
				}
				else
					LOGERROR("ACTION %u: 错误的参数数量", pAction->GetID());
			}
		}
		break;

	case	ACTION_MAP_MAPUSER:
		{
			char szCmd[256] = "", szOpt[256] = "";
			int nData = 0;
			if (3 == sscanf(szParam, "%s %s %d", szCmd, szOpt, &nData))
			{
				OBJID idMap = pAction->GetInt(ACTIONDATA_DATA);
				vector<CUser*> setUser;

				if (0 == stricmp("map_user", szCmd))
				{
					CUserManager::Iterator pUser = UserManager()->NewEnum();
					while(pUser.Next())
					{
						if (pUser && pUser->GetMapID() == idMap)
							setUser.push_back(pUser);
					}
				}
				else if (0 == stricmp("alive_user", szCmd))
				{
					CUserManager::Iterator pUser = UserManager()->NewEnum();
					while(pUser.Next())
					{
						if (pUser && pUser->GetMapID() == idMap && pUser->IsAlive())
							setUser.push_back(pUser);
					}
				}
				else
				{
					LOGERROR("ACTION %u: 错误的param参数", pAction->GetID());
					return false;
				}


				if (0 == stricmp(szOpt, "=="))
				{
					if (setUser.size() == nData)
						return true;
				}
				else if (0 == stricmp(szOpt, "<="))
				{
					if (setUser.size() <= nData)
						return true;
				}
				else if (0 == stricmp(szOpt, ">="))
				{
					if (setUser.size() >= nData)
						return true;
				}
			}
			else
				LOGERROR("ACTION %u: 错误的参数数量", pAction->GetID());
		}
		break;

	case	ACTION_MAP_BROCASTMSG:
		{
			CMsgTalk msg;
			IF_OK (msg.Create(SYSTEM_NAME, ALLUSERS_NAME, szParam, NULL, 0x0ffffff, _TXTATR_SYSTEM))
				UserManager()->BroadcastMapMsg(pAction->GetInt(ACTIONDATA_DATA), &msg);

			return true;
		}
		break;

	case	ACTION_MAP_CHANGEWEATHER:
		{
			CHECKF(pUser);

			int nType, nIntensity, nDir, nColor, nKeepSecs;
			if (5 == sscanf(szParam, "%d %d %d %d %d", &nType, &nIntensity, &nDir, &nColor, &nKeepSecs))
			{
				pUser->SetWeather(nType, nIntensity, nDir, nColor, nKeepSecs, 10);
				return true;
			}
			else
				LOGERROR("ACTION %u: 错误的参数数量", pAction->GetID());
		}
		break;

	case	ACTION_MAP_CHANGELIGHT:
		{
			DWORD	dwRGB;
			OBJID	idMap = ID_NONE;
			int		nSecs = 0;
			if (3 == sscanf(szParam, "%u %u %d", &idMap, &dwRGB, &nSecs))
			{
				CGameMap* pMap = MapManager()->QueryMap(idMap);
				if (pMap)
				{
					if(nSecs == 0)		// keep light
						pMap->SetLight(dwRGB);
					
					CMsgAction	msg;
					IF_OK(msg.Create(1, 0, 0, nSecs, actionMapARGB, dwRGB))
						UserManager()->BroadcastMapMsg(pMap->GetID(), &msg, NULL);

					return true;
				}
			}
			else
				LOGERROR("ACTION %u: 错误的参数数量", pAction->GetID());
		}
		break;

	case	ACTION_MAP_ATTRIB:
		{
			PARAMBUF	szField;
			PARAMBUF	szOpt;
			int			nData;
			OBJID		idMap = ID_NONE;
			if (sscanf(szParam, "%s %s %d %u", szField, szOpt, &nData, &idMap) < 3)
			{
				LOGERROR("ACTION %u: 错误的参数数量", pAction->GetID());
				return false;
			}

			CGameMap*	pTaskMap = NULL;
			if(idMap != ID_NONE)
			{
				pTaskMap = MapManager()->QueryMap(idMap);
			}
			else
			{
				CNpc* pNpc = NULL;
				if(pUser)
					pTaskMap = pUser->GetMap();
				else if(pRole && pRole->QueryObj(OBJ_NPC, IPP_OF(pNpc)))
					pTaskMap = pNpc->GetMap();
			}
			CHECKF(pTaskMap);

			if(stricmp(szField, "synid") == 0)
			{
				if(strcmp(szOpt, "==") == 0)
				{
					if(pTaskMap->GetSynID() == nData)
						return true;
				}
				else if(strcmp(szOpt, "=") == 0)
				{
					pTaskMap->SetSynID(nData, true);		// with all map npc
					return true;
				}
			}
			else if(stricmp(szField, "status") == 0)
			{
				if(strcmp(szOpt, "test") == 0)
				{
					if((pTaskMap->GetStatus() & nData) != 0)
						return true;
				}
				else if(strcmp(szOpt, "set") == 0)
				{
					pTaskMap->SetStatus(nData, true);
					return true;
				}
				else if(strcmp(szOpt, "reset") == 0)
				{
					pTaskMap->SetStatus(nData, false);
					return true;
				}
			}
			else if(stricmp(szField, "type") == 0)
			{
				if(strcmp(szOpt, "test") == 0)
				{
					if((pTaskMap->GetType() & nData) != 0)
						return true;
				}
			}
			else if(stricmp(szField, "res_lev") == 0)
			{
				if(strcmp(szOpt, "==") == 0)
				{
					if(pTaskMap->GetResLev() == nData)
						return true;
				}
				else if(strcmp(szOpt, "<") == 0)
				{
					if(pTaskMap->GetResLev() < nData)
						return true;
				}
				else if(strcmp(szOpt, "=") == 0)
				{
					pTaskMap->SetResLev(nData, true);
					return true;
				}
			}
			else if(stricmp(szField, "mapdoc") == 0)
			{
				if(strcmp(szOpt, "==") == 0)
				{
					if(pTaskMap->GetDocID() == nData)
						return true;
				}
				else if(strcmp(szOpt, "=") == 0)
				{
					pTaskMap->ChangeMapDoc(nData);
					return true;
				}
			}
			else if(stricmp(szField, "portal0_x") == 0)
			{
				if(strcmp(szOpt, "=") == 0)
				{
					pTaskMap->SetPortal0X(nData, UPDATE_TRUE);
					return true;
				}
			}
			else if(stricmp(szField, "portal0_y") == 0)
			{
				if(strcmp(szOpt, "=") == 0)
				{
					pTaskMap->SetPortal0Y(nData, UPDATE_TRUE);
					return true;
				}
			}
			else if(stricmp(szField,"castle") == 0)                  //add huang 2003.12.30
			{
				if(stricmp(szOpt, "==") == 0)
				{
					if(pTaskMap->GetID() == nData)
						return true;
				}
			}
		}
		break;
	case	ACTION_MAP_REGION_MONSTER:
		{
			PARAMBUF	szOpt;
			OBJID		idMap, idType;
			int			nRegionX, nRegionY, nRegionCX, nRegionCY, nData;
			if(sscanf(szParam, "%u %d %d %d %d %u %s %d", 
					&idMap, &nRegionX, &nRegionY, &nRegionCX, &nRegionCY, &idType, szOpt, &nData) < 8)
			{
				LOGERROR("ACTION %u: 错误的参数数量", pAction->GetID());
				break;
			}

			if(idMap == ID_NONE)
			{
				if(pUser)
				{
					idMap = pUser->GetMapID();
				}
				else
				{
					CNpc* pNpc = NULL;
					if(pRole->QueryObj(OBJ_NPC, IPP_OF(pNpc)))
						idMap = pNpc->GetMapID();
				}
			}
			if(idMap == ID_NONE)
			{
				LOGERROR("ACTION %u: 没有找到地图", pAction->GetID());
				break;
			}

			int nCount = 0;
			CRoleSet::Iterator pRole = RoleManager()->QuerySet()->NewEnum();
			while(pRole.Next())
			{
				CMonster* pMonster;
				if(pRole && pRole->QueryObj(OBJ_MONSTER, IPP_OF(pMonster))
					&& pMonster->GetMap()->GetID() == idMap
					&& pRole->GetPosX() >= nRegionX && pRole->GetPosX() < nRegionX + nRegionCX
					&& pRole->GetPosY() >= nRegionY && pRole->GetPosY() < nRegionY + nRegionCY
					&& (idType == ID_NONE || pMonster->GetType() == idType) )
				{
					nCount++;
				}
			}

			if(strcmp(szOpt, "==") == 0)
			{
				if(nCount == nData)
					return true;
			}
			else if(strcmp(szOpt, "<") == 0)
			{
				if(nCount < nData)
					return true;
			}
		}
		break;
	case	ACTION_MAP_CREATEMAP:
		{
			CHECKF(pUser && pRole);
			CNpc* pNpc;
			IF_NOT(pRole->QueryObj(OBJ_NPC, IPP_OF(pNpc)))
				return false;

			CHECKF(pNpc->IsLinkNpc());

			PARAMBUF	szName;
			OBJID		idOwner, idRebornMap;
			int			nOwnerType, nMapDoc, nType, nPortalX, nPortalY, nRebornPortal, nResLev;
			if(sscanf(szParam, "%s %d %u %d %d %d %d %u %d %d", 
					szName, &nOwnerType, &idOwner, &nMapDoc, &nType, &nPortalX, &nPortalY, &idRebornMap, &nRebornPortal, &nResLev) < 10)
			{
				LOGERROR("ACTION %u: 错误的参数数量", pAction->GetID());
				break;
			}

			NewMapInfo	info;
			memset(&info, 0, sizeof(NewMapInfo));
			SafeCopy(info.szName, szName, _MAX_NAMESIZE);
			info.nMapDoc		= nMapDoc; 
			info.nType			= nType;
			info.nOwnerType		= nOwnerType;
			info.idOwner		= idOwner;
			info.nMapGroup		= MapGroup(PID)->GetMapGroup();
			info.idLikeMap		= pUser->GetMapID();
			info.nLinkX			= pUser->GetPosX();
			info.nLinkY			= pUser->GetPosY();
			info.nPortalX		= nPortalX;
			info.nPortalY		= nPortalY;
			info.idRebornMap	= idRebornMap;
			info.nRebornPortal	= nRebornPortal;
			info.nResLev		= nResLev;

			OBJID idMap = MapManager()->CreateDynaMap(&info);
			if(idMap == ID_NONE)
				return false;

			pNpc->QueryLinkMap()->SetLinkMap(idMap);

			return true;
		}
		break;
	default:
		LOGERROR("不支持的ACTION[%u]类型[%u]", pAction->GetKey(), pAction->GetInt(ACTIONDATA_TYPE));
	}

	return false;
}

//////////////////////////////////////////////////////////////////////
bool CGameAction::ProcessActionItemOnly(CActionData* pAction, LPCTSTR szParam, CUser* pUser, IRole* pRole, CItem* pItem, LPCTSTR pszAccept)
{
	CHECKF(pAction && pUser && pItem);

	switch(pAction->GetInt(ACTIONDATA_TYPE))
	{
	case	ACTION_ITEM_REQUESTLAYNPC:
		{
			OBJID	idNextTask;
			int		nType, nSort, nLookFace, nRegion=0;
			if(sscanf(szParam, "%u %d %d %d %d %d", &idNextTask, &nType, &nSort, &nLookFace, &nRegion) < 4)
			{
				LOGERROR("ACTION %u: 错误的参数数量", pAction->GetID());
				break;
			}

			CHECKF(idNextTask != ID_NONE);
			pUser->SetTaskItemActionID(idNextTask);

			CMsgNpc		msg;
			IF_OK(msg.Create(EVENT_LAYNPC, nRegion, nType, nLookFace))
				pUser->SendMsg(&msg);
			return true;
		}
		break;
	case	ACTION_ITEM_COUNTNPC:
		{
			PARAMBUF	szField;
			PARAMBUF	szData;
			PARAMBUF	szOpt;
			int			nNum;
			IF_NOT_(sscanf(szParam, "%s %s %s %d", szField, szData, szOpt, &nNum) == 4)
				return false;

			int nCount = 0;
			if(stricmp(szField, "all") == 0)
			{
				nCount = RoleManager()->CountAllNpc(pUser->GetMapID());
			}
			else if(stricmp(szField, "furniture") == 0)
			{
				nCount = RoleManager()->CountFurnitureNpc(pUser->GetMapID());
			}
			else if(stricmp(szField, "name") == 0)
			{
				nCount = RoleManager()->CountNpcByName(pUser->GetMapID(), szData);
			}
			else if(stricmp(szField, "type") == 0)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -