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

📄 gameaction.cpp

📁 网络游戏魔域的服务端与客户端完整源代码 包括详细的说明文档与开发日志
💻 CPP
📖 第 1 页 / 共 5 页
字号:
					if(pNpc->GetData(idx) == nData)
						return true;
				}
				else if(strcmp(szOpt, "<") == 0)
				{
					if(pNpc->GetData(idx) < nData)
						return true;
				}
				else if(strcmp(szOpt, "<=") == 0)
				{
					if(pNpc->GetData(idx) <= nData)
						return true;
				}
				else if(strcmp(szOpt, ">") == 0)
				{
					if(pNpc->GetData(idx) > nData)
						return true;
				}
				else if(strcmp(szOpt, ">=") == 0)
				{
					if(pNpc->GetData(idx) >= nData)
						return true;
				}
				else if(strcmp(szOpt, "pass") == 0)
				{
					pNpc->SetData(idx, ::DateStampPass(pNpc->GetData(idx), nData), bUpdate);
					return true;
				}
			}
			else if(stricmp(szAttr, "life") == 0)
			{
				if(strcmp(szOpt, "=") == 0)
				{
					pNpc->SetInt(NPCDATA_LIFE, nData, bUpdate);

					CMsgUserAttrib	msg;
					IF_OK(msg.Create(pNpc->GetID(), _USERATTRIB_LIFE, nData))
						pNpc->BroadcastRoomMsg(&msg);

					return true;
				}
			}
			else if(stricmp(szAttr, "maxlife") == 0)
			{
				if(strcmp(szOpt, "=") == 0)
				{
					pNpc->SetInt(NPCDATA_MAXLIFE, nData, bUpdate);

					CMsgUserAttrib	msg;
					IF_OK(msg.Create(pNpc->GetID(), _USERATTRIB_MAXLIFE, nData))
						pNpc->BroadcastRoomMsg(&msg);

					return true;
				}
			}
			else
			{
				LOGERROR("不支持的ACTION[%u]属性[%s]", pAction->GetKey(), szAttr);
			}

			return false;
		}
		break;
	case	ACTION_NPC_MODIFY:
		{
			OBJID		idTarget;
			PARAMBUF	szAttr;
			PARAMBUF	szOpt;
			PARAMBUF	szData;
			if(sscanf(szParam, "%u %s %s %s", &idTarget, szAttr, szOpt, szData) < 4)
			{
				LOGERROR("ACTION %u: 错误的参数数量", pAction->GetID());
				break;
			}
			int		nData = atoi(szData);
			bool	bUpdate = UPDATE_FALSE;

			CNpc*	pTarget = RoleManager()->QueryDynNpcByRecordID(idTarget);
			if(!pTarget)
			{
				MapGroup(PID)->QueryIntraMsg()->ModifyNpc(idTarget, szAttr, szData);
				return true;
			}

			if(stricmp(szAttr, "lookface") == 0)
			{
				if(strcmp(szOpt, "=") == 0)
				{
					pTarget->SetInt(NPCDATA_LOOKFACE, nData, bUpdate);

					CMsgUserAttrib	msg;
					IF_OK(msg.Create(pTarget->GetID(), _USERATTRIB_LOOKFACE, nData))
						pTarget->BroadcastRoomMsg(&msg);

					return true;
				}
			}
			else if(stricmp(szAttr, "datastr") == 0)
			{
				if(strcmp(szOpt, "=") == 0)
				{
					pTarget->SetStr(NPCDATA_DATASTR, szData, _MAX_NAMESIZE, bUpdate);
					return true;
				}
			}
			else if(strnicmp(szAttr, "data", 4) == 0)
			{
				int idx = (*(szAttr+4) - '0');
				if(idx < 0 || idx >= MAX_NPCDATA)
					return false;
				if(strcmp(szOpt, "=") == 0)
				{
					pTarget->SetData(idx, nData, bUpdate);
					return true;
				}
			}
			else
			{
				LOGERROR("不支持的ACTION[%u]属性[%s]", pAction->GetKey(), szAttr);
			}

			return false;
		}
		break;
/*	case	ACTION_NPC_REQUESTSHIFT:
		{
			CHECKF(pAction && pRole);

			CNpc* pNpc;
			IF_NOT(pRole->QueryObj(OBJ_NPC, IPP_OF(pNpc)))
				return false;

			OBJID	idNextTask;
			if(sscanf(szParam, "%u", &idNextTask) < 1)
			{
				LOGERROR("ACTION %u: 错误的参数数量", pAction->GetID());
				break;
			}

			CHECKF(idNextTask != ID_NONE);
			ClearTaskID();
			PushTaskID(idNextTask);

			CMsgNpc		msg;
			IF_OK(msg.Create(EVENT_CHANGEPOS, pNpc->GetID()))
				SendMsg(&msg);
			return true;
		}
		break;
	case	ACTION_NPC_SHIFT:
		{
			CHECKF(pAction && pRole);

			CNpc* pNpc;
			IF_NOT(pRole->QueryObj(OBJ_NPC, IPP_OF(pNpc)))
				return false;

			CHECKF(pszAccept && strlen(pszAccept) > 0)

			int x, y, nLook;
			IF_NOT_(sscanf(pszAccept, "%d %d %d", &x, &y, &nLook) == 3)	XXX	// MsgNpcInfo转换成串,提供给任务系统
				return false;

			if(::MaskLook(pNpc->GetLookFace()) == ::MaskLook(nLook))
				pNpc->SetInt(NPCDATA_LOOKFACE, nLook);
			pNpc->TransPos(x, y);		// synchro true
			return true;
		}
		break;
*/
	case	ACTION_NPC_ERASE:
		{
			CHECKF(pAction && pRole);

			CNpc* pNpc;
			IF_NOT(pRole->QueryObj(OBJ_NPC, IPP_OF(pNpc)))
				return false;

			if(pNpc->IsDeleted())
				return false;

			int	nType = pAction->GetInt(ACTIONDATA_DATA);
			if(nType == 0)
			{
				m_pRole	= NULL;			// 清除任务NPC
				return pNpc->DelNpc();
			}
			else
			{
				for(IRoleSet::Iter i = RoleManager()->QuerySet()->Begin(); i != RoleManager()->QuerySet()->End(); )
				{
					IRole* pRole = RoleManager()->QuerySet()->GetObjByIter(i);
					i++;		// 要删除,提前移动

					CNpc* pNpc;
					if(pRole && pRole->QueryObj(OBJ_NPC, IPP_OF(pNpc)) && pNpc->GetType() == nType)
					{
						if(!pNpc->DelNpc())
							return false;
					}
				}
				return true;
			}
		}
		break;
	case	ACTION_NPC_RESETSYNOWNER://新的帮派占领帮派地图
		{
			CHECKF(pAction && pRole);
			CNpc* pNpc;
			IF_NOT(pRole->QueryObj(OBJ_NPC, IPP_OF(pNpc)))
				return false;
			CHECKF(pNpc->IsSynFlag());
			/*
			int		nMaxScore	= 0;
			CSynPtr pMaxSyn		= NULL;
			for(int i = 0; i < SynManager()->QuerySynSet()->GetAmount(); i++)
			{
				CSyndicate* pSyn = SynManager()->QuerySynSet()->GetObjByIndex(i);
				if(pSyn)
				{
					int nScore = pSyn->GetSynWarScore(pNpc->GetID());
					pSyn->ClearSynWarScore(pNpc->GetID());
					if(nMaxScore < nScore)
					{
						nMaxScore	= nScore;
						pMaxSyn		= pSyn;
					}
				}
			}

			if(pMaxSyn && pMaxSyn->GetID() != ID_NONE)
			{
				// gain syn money
				if(pNpc->GetSynID() != ID_NONE)
				{
					CSyndicate* pOldSyn = SynManager()->QuerySyndicate(pNpc->GetSynID());
					if(pOldSyn && pOldSyn->GetInt(SYNDATA_MONEY) > 0)
					{
						int nMoney = MulDiv(pOldSyn->GetInt(SYNDATA_MONEY), SYNWAR_GAINMONEY_PERCENT, 100);
						if(nMoney > 0)
						{
							pOldSyn->QueryModify()->AddData(SYNDATA_MONEY, -1*nMoney);
							pMaxSyn->QueryModify()->AddData(SYNDATA_MONEY, nMoney);
						}
					}
				}  
				}
*/
			CGameMap * pSynMap = pNpc->GetMap();
			IF_NOT(pSynMap->IsSynMap())
				return false;
			
			CNpc * pSynWarLetterNpc = pSynMap->GetNpcSynWarLetter();

			OBJID idSynAtt = pSynWarLetterNpc->GetApplyAttackerSynID();
			CSyndicate * pSynAtt = SynManager()->QuerySyndicate(idSynAtt);
			IF_NOT(pSynAtt)
				return false;

			if(pSynWarLetterNpc)
			{
				int nMoney = pSynWarLetterNpc->GetData(SYNWARLETTER_DEPOSIT);
				pSynAtt->QueryModify()->AddData(SYNDATA_MONEY,nMoney);//反还奖金
			}
			
			pNpc->SetSynOwnerID(pSynAtt->GetID(), false);		// true: with link map
			pNpc->GetMap()->SetSynID(pSynAtt->GetID(), true);		// with all map npc
			pNpc->GetMap()->SetStatus(CGameMap::STATUS_WAR, false);
//			pNpc->SendSelfToBlock();

			//记录占领的时间---begin
			pNpc->GetMap()->SetSynOccupyTime();
			//记录占领的时间---end			

			MSGBUF	szMsg;
			sprintf(szMsg, STR_GOT_WIN_s, pSynAtt->GetStr(SYNDATA_NAME));

			CMsgTalk msg;
			IF_OK (msg.Create(SYSTEM_NAME, ALLUSERS_NAME, szMsg, NULL, _COLOR_WHITE, _TXTATR_GM))
				UserManager()->BroadcastMsg(&msg);

			// stop all auto battal
			CRoleSet::Iterator pRole = RoleManager()->QuerySet()->NewEnum();
			while(pRole.Next())
			{
				if(pRole && pRole->GetMap()->GetID() == pNpc->GetMapID())
					pRole->ClrAttackTarget();
			}
			
			// owner flag
			CGameMap* pMap = pNpc->GetMap();
			if(pMap->GetID() == WHITE_SYN_MAP_ID)
			{
				CMsgSyndicate	msg;
				IF_OK(msg.Create(SET_WHITE_SYN, pMap->GetOwnerID()))
					UserManager()->BroadcastMsg(&msg);
			}
			else if(pMap->GetID() == BLACK_SYN_MAP_ID)
			{
				CMsgSyndicate	msg;
				IF_OK(msg.Create(SET_BLACK_SYN, pMap->GetOwnerID()))
					UserManager()->BroadcastMsg(&msg);
			}
			return true;
		}
		break;
	case	ACTION_NPC_FIND_NEXT_TABLE:
		{
			CHECKF(pAction && pRole);

			CNpc* pNpc;
			IF_NOT(pRole->QueryObj(OBJ_NPC, IPP_OF(pNpc)))
				return false;
			CHECKF(pNpc->QueryTable());

			int nType = atoi(szParam);
			return pNpc->QueryTable()->FindNext(nType, pUser->TaskIterator());
		}
		break;
	case	ACTION_NPC_ADD_TABLE:
		{
			CHECKF(pAction && pRole);

			CNpc* pNpc;
			IF_NOT(pRole->QueryObj(OBJ_NPC, IPP_OF(pNpc)))
				return false;
			CHECKF(pNpc->QueryTable());

			int			nType;
			OBJID		idKey;
			int			setData[TABLEDATA_SIZE]	= {0};
			PARAMBUF	szData	= "";
			CHECKF(TABLEDATA_SIZE == 4);
			if(sscanf(szParam, "%d %u %d %d %d %d %s", &nType, &idKey, &setData[0], &setData[1], &setData[2], &setData[3], szData) < 2)
			{
				LOGERROR("ACTION %u: 错误的参数数量", pAction->GetID());
				break;
			}

			return pNpc->QueryTable()->AddRecord(nType, idKey, setData, szData);
		}
		break;
	case	ACTION_NPC_DEL_TABLE:
		{
			CHECKF(pAction && pRole);

			CNpc* pNpc;
			IF_NOT(pRole->QueryObj(OBJ_NPC, IPP_OF(pNpc)))
				return false;
			CHECKF(pNpc->QueryTable());

			if(strlen(szParam))
			{
				int			nType;
				OBJID		idKey;
				int			setData[TABLEDATA_SIZE]	= {0};
				PARAMBUF	szData	= "";
				CHECKF(TABLEDATA_SIZE == 4);
				if(sscanf(szParam, "%d %u %d %d %d %d %s", &nType, &idKey, &setData[0], &setData[1], &setData[2], &setData[3], szData) < 2)
				{
					LOGERROR("ACTION %u: 错误的参数数量", pAction->GetID());
					break;
				}

				return pNpc->QueryTable()->DelRecord(nType, idKey, setData, szData);
			}
			else
			{
				CHECKF(pUser->TaskIterator());
				return pNpc->QueryTable()->DelRecord(pUser->TaskIterator());
			}
		}
		break;
	case	ACTION_NPC_DEL_INVALID:
		{
			CHECKF(pAction && pRole);

			CNpc* pNpc;
			IF_NOT(pRole->QueryObj(OBJ_NPC, IPP_OF(pNpc)))
				return false;
			CHECKF(pNpc->QueryTable());

			int			nType;
			int			nIndex;
			if(sscanf(szParam, "%d %u", &nType, &nIndex) < 2)
			{
				LOGERROR("ACTION %u: 错误的参数数量", pAction->GetID());
				break;
			}

			return pNpc->QueryTable()->DelInvalid(nType, nIndex);
		}
		break;
	case ACTION_NPC_AUCTIONING:
		{
			CNpc* pNpc;
			IRole* pRole = RoleManager()->QuerySet()->GetObj(pAction->GetInt(ACTIONDATA_DATA));
			if (pRole && pRole->QueryObj(OBJ_NPC, IPP_OF(pNpc)))
			{
				CHECKF(pNpc);
				if(pNpc->IsAuctionNpc())
				{
					int nType = 0; 
					if(sscanf(szParam, "%d", &nType))
						return(pNpc->QueryAuction()->CheckAuctionState(nType));
				}
			}
		}
		break;
	case ACTION_NPC_SYS_AUCTION:
		{
			CNpc* pNpc;
			IRole* pRole = RoleManager()->QuerySet()->GetObj(pAction->GetInt(ACTIONDATA_DATA));
			if (pRole && pRole->QueryObj(OBJ_NPC, IPP_OF(pNpc)))
			{
				CHECKF(pNpc);
				if(pNpc->IsAuctionNpc())
				{
					char szInfo[1024] = "NULL";
					if(sscanf(szParam, "%s", szInfo) < 1 )
					{
						LOGERROR("ACTION %u: 错误的参数数量", pAction->GetID());
					}
					return(pNpc->QueryAuction()->SysAuctionStart(szInfo));
				}
			}  
			return false;
		}
		break;
	case	ACTION_NPC_TABLE_AMOUNT:
		{
			CHECKF(pAction && pRole);

			CNpc* pNpc;
			IF_NOT(pRole->QueryObj(OBJ_NPC, IPP_OF(pNpc)))
				return false;
			CHECKF(pNpc->QueryTable());

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

	return false;
}

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

	switch(pAction->GetInt(ACTIONDATA_TYPE))
	{
/*	case ACTION_MAP_NPC_BROCASTMSG:
		{
			CNpc* pNpc;
			IRole* pRole = RoleManager()->QuerySet()->GetObj(pAction->GetInt(ACTIONDATA_DATA));
			if (pRole && pRole->QueryObj(OBJ_NPC, IPP_OF(pNpc)))
			{
				CHECKF(pNpc);
				CMsgTalk msg;
				IF_OK (msg.Create(SYSTEM_NAME, ALLUSERS_NAME, szParam, NULL, 0x0ffffff, _TXTATR_SYSTEM))
					UserManager()->BroadcastMapMsg(pNpc->GetMapID(), &msg);
				return true;
			}
		}
		break;*/
	case ACTION_MAP_FIREWORKS:
		{
			IF_OK (pUser)
			{
				CMsgItem msg;
				IF_OK (msg.Create(pUser->GetID(), ITEMACT_FIREWORKS))
					pUser->BroadcastRoomMsg(&msg, true);

				return true;
			}
		}
		break;

⌨️ 快捷键说明

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