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

📄 msgtalk.cpp

📁 网络游戏魔域的服务端与客户端完整源代码 包括详细的说明文档与开发日志
💻 CPP
📖 第 1 页 / 共 2 页
字号:
							IMapThing* pTheMapThing = pSet->GetObjByIndex(i);
							if (pTheMapThing && 									
									pTheMapThing->GetObjType() == OBJ_NPC &&
										pTheMapThing->GetPosX() == nPosX && pTheMapThing->GetPosY() == nPosY)
							{
								pMapThing = pTheMapThing;
								break;		
							}
						}

						if (!pMapThing)
							pUser->FlyMap(ID_NONE, nPosX, nPosY);
						else
							pUser->SendSysMsg(STR_CAN_STAND);
					}
				}
			}
		}
		else if (stricmp(szCmd, "chgmap") == 0)
		{
			if (pUser && pUser->IsGM())
			{
				MSGBUF	szCmd	= "NO_CMD";
				OBJID idMap = ID_NONE;
				int nPosX = 0, nPosY = 0;
				if (4 == sscanf(szWords+1, "%s %u %d %d", szCmd, &idMap, &nPosX, &nPosY))
				{
					CMapPtr pMap = MapManager()->QueryMap(idMap);
					if (pMap)
					{
#ifdef	LOCAL_DEBUG
						if(!pMap->IsValidPoint(nPosX, nPosY))
#else
						if(!pMap->IsStandEnable(nPosX, nPosY))
#endif
						{
							pUser->SendSysMsg(STR_CAN_STAND);
							return;
						}
						IMapThing* pMapThing = NULL;

						IThingSet* pSet = pMap->QueryBlock(nPosX, nPosY).QuerySet();
						CHECK(pSet);
						for(int i = 0; i < pSet->GetAmount(); i++)
						{
							IMapThing* pTheMapThing = pSet->GetObjByIndex(i);
							if (pTheMapThing && 									
									pTheMapThing->GetObjType() == OBJ_NPC &&
										pTheMapThing->GetPosX() == nPosX && pTheMapThing->GetPosY() == nPosY)
							{
								pMapThing = pTheMapThing;
								break;		
							}
						}

						if (!pMapThing)
							pUser->FlyMap(idMap, nPosX, nPosY);
						else
							pUser->SendSysMsg(STR_CAN_STAND);
					}
					else
					{
						pUser->FlyMap(idMap, nPosX, nPosY);
					}
				}
			}
		}
		else if (stricmp(szCmd, "千里传音") == 0)
		{
			if (pUser->IsGM())
			{
				char szMsg[256] = "";
				if (2 == sscanf(szWords+1, "%s %s", szCmd, szMsg))
				{
					char szBuf[300]	= "";
					sprintf(szBuf, "%s:%s", pUser->GetName(), szMsg);
					UserManager()->BroadcastMsg(szBuf, NULL, NULL, 0xffffff, _TXTATR_GM);
				}
			}
		}
		else if (stricmp(szCmd, "reloadaction") == 0)
		{
			OBJID idAction=0;
			if (2 == sscanf(szWords+1, "%s %u", szCmd, &idAction))
			{
				if(idAction == ID_NONE)
				{
					if (pUser->IsPM())
					{
						pUser->SendSysMsg(STR_WARNING_CRASH);
						extern IActionSet* g_setAction;
						if(g_setAction)
							g_setAction->Release();
						char	szSQL[1024];
						sprintf(szSQL, "SELECT * FROM %s", _TBL_ACTION);
						g_setAction	= CActionSet::CreateNew(true);
						IF_OK_(g_setAction && g_setAction->Create(szSQL, Database()))
							pUser->SendSysMsg("[ACTION UPDATE。]");
						LOGMSG("★process command: %s★", szCmd);
					}
				}
				else
				{
					if (pUser->IsGM())
					{
						extern IActionSet* g_setAction;
						SQLBUF	szSQL;
						sprintf(szSQL, "SELECT * FROM %s WHERE id=%u LIMIT 1", _TBL_ACTION, idAction);
						CAutoPtr<IRecordset>	pRes = Database()->CreateNewRecordset(szSQL);
						CActionData* pData = CActionData::CreateNew();
						if(pData)
						{
							IF_OK(pData->Create(pRes))
							{
								DEBUG_TRY // VVVVVVVVVVVVVV
								g_setAction->DelObj(pData->GetKey());		// BUG: don't safe in multi thread
								g_setAction->AddObj(pData);
								pUser->SendSysMsg("[AN ACTION UPDATE。]");
								DEBUG_CATCH("reloadaction") // AAAAAAAAAAAAA
							}
							else
								pData->Release();
						}
						LOGMSG("%s process command: %s %d", pUser->GetName(), szCmd, idAction);
					}
				}
			}
		}
		else if (stricmp(szCmd, "reloadmagictype") == 0)
		{
			if (pUser->IsPM())
			{
				pUser->SendSysMsg(STR_WARNING_CRASH);
				
				extern IMagicTypeSet* g_setMagicType;
				if(g_setMagicType)
					g_setMagicType->Release();
				g_setMagicType	= CMagicTypeSet::CreateNew(true);
				char szSQL[1024];
				sprintf(szSQL, "SELECT * FROM %s", _TBL_MAGIC);
				IF_NOT_(g_setMagicType && g_setMagicType->Create(szSQL, Database()))
					pUser->SendSysMsg("[ERROR: MAGICTYPE UPDATE ERROR]");

				extern IMagicTypeSet* g_setAutoMagicType;
				if(g_setAutoMagicType)
					g_setAutoMagicType->Release();
				g_setAutoMagicType	= CMagicTypeSet::CreateNew(true);
				sprintf(szSQL, "SELECT * FROM %s WHERE auto_learn!=0", _TBL_MAGIC);
				IF_NOT_(g_setAutoMagicType && g_setAutoMagicType->Create(szSQL, Database()))
					pUser->SendSysMsg("[ERROR: MAGICTYPE UPDATE ERROR]");
				CUserManager::Iterator pUser = UserManager()->NewEnum();
				while(pUser.Next())
				{
					if(pUser)
						pUser->QueryMagic()->DebugReloadAll();
				}
				LOGMSG("★process command: %s★", szCmd);
			}
		}
		else if (stricmp(szCmd, "查询") == 0)
		{
			CUserPtr pTarget = UserManager()->GetUser(szParam);
			if(pTarget)
			{
				OBJID idSyn = pUser->QuerySynAttr()->GetSynID();
				OBJID idTargetSyn = pTarget->QuerySynAttr()->GetSynID();
				if(idSyn != ID_NONE && idTargetSyn == idSyn)
				{
					pUser->SendSysMsg("贡献度:%d。", pTarget->QuerySynAttr()->GetInt(SYNATTRDATA_PROFFER));
				}
			}
		}
		else if (stricmp(szCmd, "奖品") == 0)
		{
			if (!pUser->DoBonus())
			{
				pUser->SendSysMsg(STR_NO_BONUS);
			}
		}
		else if (stricmp(szCmd, "attach") == 0)
		{
			if (pUser->IsPM())
			{
				int nStatus, nPower, nSecs, nTimes;
				if (5 == sscanf(szWords+1, "%s %d %d %d %d", szCmd, &nStatus, &nPower, &nSecs, &nTimes))
				{
					pUser->AttachStatus(pUser->QueryRole(), nStatus, nPower, nSecs, nTimes);
				}
				else
					pUser->SendSysMsg("Invalid arguments.");
			}
		}
		else if (stricmp(szCmd, "statuslist") == 0)
		{
			if (pUser->IsPM())
			{
				IStatusSet* pStatusSet = pUser->QueryStatusSet();
				if (pStatusSet)
				{
					pUser->SendSysMsg(_TXTATR_NORMAL, "================ Status info =================");
					for (int i=0; i<pStatusSet->GetAmount(); i++)
					{
						IStatus* pStatus = pStatusSet->GetObjByIndex(i);
						if (pStatus)
						{
							StatusInfoStruct info;
							pStatus->GetInfo(&info);
							pUser->SendSysMsg(_TXTATR_NORMAL, "Status=%d, power=%d, remain secs=%d, times=%d",
								info.nStatus, info.nPower, info.nSecs, info.nTimes);
						}
					}
					pUser->SendSysMsg(_TXTATR_NORMAL, "==============================================");
				}
			}
		}
#ifdef	_DEBUG
		else if (stricmp(szCmd, "task_list") == 0)
		{
			pUser->SendSysMsg("===== mercenary task list =====");
			for (int i=0; i<MercenaryTask()->GetTaskAmount(); i++)
			{
				CMercenaryTaskData* pData = MercenaryTask()->QueryTaskDataByIndex(i);
				if (pData)
					pUser->SendSysMsg("[%u] [%s] [%s]", pData->GetID(), pData->GetStr(MTASKDATA_TITLE), pData->GetStr(MTASKDATA_USER_NAME));
			}
			pUser->SendSysMsg("===============================");
		}
		else if (stricmp(szCmd, "task_new") == 0)
		{
			if (MercenaryTask()->QueryTaskDataByOwner(pUser->GetID()))
			{
				pUser->SendSysMsg("您不能发布多个任务。");
			}
			else
			{
				ST_MTASK_DATA	tTaskData;
				memset(&tTaskData, 0L, sizeof(ST_MTASK_DATA));
				if (7 == sscanf(szWords+1, "%s %u %s %s %s %u %u", szCmd,
					&tTaskData.ucType, tTaskData.szTitle, tTaskData.szDetail, tTaskData.szTargetName, &tTaskData.dwPrizeMoney, &tTaskData.ucRankReq))
				{
					tTaskData.idUser	= pUser->GetID();
					::SafeCopy(tTaskData.szUserName, pUser->GetName(), _MAX_NAMESIZE);
					if (MercenaryTask()->CreateNewTask(&tTaskData))
					{
						pUser->SendSysMsg("任务发布成功。");
					}
				}
			}
		}
		else if (stricmp(szCmd, "task_del") == 0)
		{
			CMercenaryTaskData* pData = MercenaryTask()->QueryTaskDataByOwner(pUser->GetID());
			if (pData)
			{
				if (MercenaryTask()->DeleteTask(pData->GetID()))
					pUser->SendSysMsg("任务删除成功");
				else
					pUser->SendSysMsg("任务删除失败");
			}
			else
				pUser->SendSysMsg("您还没有发布任务。");
		}
		else if (stricmp(szCmd, "magicattack") == 0)
		{
			int nType = 0;
			char szName[256];
			if (3 == sscanf(szWords+1, "%s %d %s", szCmd, &nType, szName))
			{
				CUser* pTarget = UserManager()->GetUser(szName);
				if (pTarget)
				{
					pUser->SendSysMsg("Magic attack [type=%d, target=%s]", nType, szName);
					pUser->MagicAttack(nType, pTarget->GetID(), pTarget->GetPosX(), pTarget->GetPosY());
				}
			}
		}
		else if (stricmp(szCmd, "chgpos") == 0)
		{
			int nPosX=0, nPosY = 0;
			if (3 == sscanf(szWords+1, "%s %d %d", szCmd, &nPosX, &nPosY))
			{
				if(pUser->GetMap()->IsStandEnable(nPosX, nPosY))
				{
//					pUser->ProcessOnMove(MOVEMODE_TRACK);
//					pUser->JumpPos(nPosX, nPosY);		//? may be optimize to JumpPos(,)
//					pUser->Synchro();

					pUser->SyncTrackTo(nPosX, nPosY, 0, 0);
				}
//				pUser->ProcessOnMove(MOVEMODE_TRACK);
//				pUser->JumpPos(nPosX, nPosY);
//				pUser->Synchro();
			}
		}
		else if (stricmp(szCmd, "callpet") == 0)
		{
			OBJID	idType = ID_NONE;
			int		nSecs = 0;
			if (3 == sscanf(szWords+1, "%s %u %d", szCmd, &idType, &nSecs))
			{
				pUser->CallPet(idType, pUser->GetPosX(), pUser->GetPosY(), nSecs);
			}
		}
		else if (stricmp(szCmd, "showid") == 0)
		{
			pUser->SendSysMsg("AccountID=%u, UserID=%u", pUser->GetAccountID(), pUser->GetID());
		}
		else if (stricmp(szCmd, "attacheudemon") == 0)
		{
			if (pUser->GetEudemonAmount() > 0)
			{
//				CMonster* pMonster = pUser->QueryEudemonByIndex(0);
			}
		}
#endif
		DEBUG_CATCH2("CMsgTalk CMD:[%s] error.", szCmd)			// AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
		return;
	}

	// 鬼频道
	if(pUser && pUser->IsGhost() && m_pInfo->unTxtAttribute != _TXTATR_TEAM)
	{
		m_pInfo->unTxtAttribute	= _TXTATR_GHOST;
		pUser->BroadcastRoomMsg(this, EXCLUDE_SELF);
		return ;
	}

	// 普通TALK
	switch(m_pInfo->unTxtAttribute)
	{
	case	_TXTATR_GLOBAL:
		{
			if(pRole->GetLev() < 30)
			{
				pRole->SendSysMsg(STR_NO_ENOUGH_LEVEL);
				break;
			}

			if(pUser && pUser->GetMana() < 200)
			{
				pRole->SendSysMsg(STR_NO_ENOUGH_POWER);
				break;
			}

			pRole->AddAttrib(_USERATTRIB_MANA, -200, SYNCHRO_TRUE);

			RoleManager()->BroadcastMsg(this);
		}
		break;
	case	_TXTATR_PRIVATE:
		{
			CUserPtr pTarget = UserManager()->GetUser(szReceiver);
			if(pTarget)
				pTarget->SendMsg(this);
			else
				MapGroup(PID)->QueryIntraMsg()->TransmitWorldMsg(this, szReceiver);
		}
		break;
	case	_TXTATR_TEAM:
		{
			if (pUser)
			{
				CTeam* pTeam = pUser->GetTeam();
				if (pTeam)
					pTeam->BroadcastTeamMsg(this, pUser);
			}
		}
		break;
	case	_TXTATR_FRIEND:
		{
			if (pUser)
				pUser->BroadcastFriendsMsg(this);
		}
		break;
	case	_TXTATR_SYNDICATE:
		{
			if (pUser)
			{
				OBJID idSyn = pUser->GetSynID();
				CSyndicate* pSyn = SynManager()->QuerySyndicate(idSyn);
				if (pSyn)
				{
					if(pSyn->GetInt(SYNDATA_MONEY) < SYN_MONEY_BASELINE)
					{
						pUser->SendSysMsg(STR_TOO_LOWER_SYN_MONEY);
						break;
					}
					pSyn->BroadcastSynMsg(this, pUser);

					m_pInfo->idTransmit	= pSyn->GetID();
					MapGroup(PID)->QueryIntraMsg()->TransmitMsg(this, GetSocketID(), GetNpcID());
				}
			}
		}
		break;
	case	_TXTATR_LEAVEWORD:
		{
			if (pUser)
			{
				if(!::TalkStrCheck(szWords, true))		// true: enable new line character
				{
					pUser->SendSysMsg(STR_INVALID_CHARACTER);
					return ;
				}
				pUser->AddLeaveWord(szReceiver, szWords);
			}
		}
		break;
	case	_TXTATR_SYNANNOUNCE:
		{
			LPCTSTR pAnnounce = szWords;
			if(!pUser || pUser->GetSynID() == ID_NONE || pUser->GetSynRankShow() != RANK_LEADER)
				return ;
			if(!::TalkStrCheck(szWords, true))		// true: enable new line character
			{
				pUser->SendSysMsg(STR_INVALID_CHARACTER);
				return ;
			}

			CSyndicate* pSyn = SynManager()->QuerySyndicate(pUser->GetSynID());
			IF_OK(pSyn)
			{
				pSyn->QueryModify()->SetTenet(pAnnounce);
				pSyn->BroadcastSubSynMsg(GetSocketID(), GetNpcID(), pAnnounce, NULL, NULL, 0xFFFFFF, _TXTATR_SYNANNOUNCE);
			}
		}
		break;
	case	_TXTATR_CRYOUT:
		{
			if (pUser && pUser->QueryBooth())
			{
				if(!::TalkStrCheck(szWords, true))
				{
					pUser->SendSysMsg(STR_INVALID_MSG);
					return ;
				}

				pUser->QueryBooth()->SetCryOut(szWords);
				pUser->BroadcastRoomMsg(this, false);// add by arhun
			}
		}
		break;
	case	_TXTATR_MSG_TRADE:
	case	_TXTATR_MSG_FRIEND:
	case	_TXTATR_MSG_TEAM:
	case	_TXTATR_MSG_SYN:
	case	_TXTATR_MSG_OTHER:
		{
			CUser* pUser = UserManager()->GetUser(this);
			if(!pUser)
				return ;
			if(pUser->GetLev() < LOGIN_FREE_LEVEL)
			{
				pUser->SendSysMsg(STR_LOW_LEVEL);
				return ;
			}
			if(!::TalkStrCheck(szWords, true))		// true: enable new line character
			{
				pUser->SendSysMsg(STR_INVALID_CHARACTER);
				return ;
			}

				if(m_pInfo->unTxtAttribute == _TXTATR_MSG_SYN)
			{
				OBJID idSyn = pUser->GetSynID();
				if(idSyn == ID_NONE)
					return ;

				SetTransData(idSyn);
			}

			MapGroup(PID)->QueryIntraMsg()->TransmitWorldMsg(this);
		}
		break;
	case	_TXTATR_MSG_SYSTEM:
		{
			ASSERT(!"_TXTATR_MSG_OTHER");
		}
		break;

	case	_TXTATR_SERVE:
		{
			CUser* pUser = UserManager()->GetUser(this);
			if (!pUser)
				return;

			if (pUser->IsGM())	// game service
			{
				CUserPtr pTarget = UserManager()->GetUser(szReceiver);
				if (pTarget)
					pTarget->SendMsg(this);
				else
					MapGroup(PID)->QueryIntraMsg()->TransmitWorldMsg(this, szReceiver);
			}
			else				// client ask service
			{
				// 发给服务频道GM的消息全部通过世界核心处理,以保证唯一性和正确性 -- zlong 2004.5.18
//				CUserPtr pTarget = UserManager()->GetGM();
//				if (pTarget)
//					pTarget->SendMsg(this);
//				else
					MapGroup(PID)->QueryIntraMsg()->TransmitWorldMsg(this);	//, szReceiver);
			}
		}
		break;

	case	_TXTATR_REJECT:
		{
			CUserPtr pTarget = UserManager()->GetUser(szReceiver);
			if(pTarget)
			{
				pTarget->SendMsg(this);
				// 上面是从信仰继承过来的处理方式
				// 存在一个BUG,就是没有清除CUser的请求,需要以下修改:

				if (strcmp(szWords, "a") == 0)	// REJECT_FRIEND
					pTarget->FetchApply(CUser::APPLY_FRIEND, pUser->GetID());
				else if (strcmp(szWords, "b") == 0)	// REJECT_TRADE
					pTarget->FetchApply(CUser::APPLY_TRADE, pUser->GetID());
				else if (strcmp(szWords, "c") == 0)	// REJECT_TEAM
					pTarget->FetchApply(CUser::APPLY_TEAMAPPLY, pUser->GetID());
				else if (strcmp(szWords, "d") == 0)	// REJECT_TEACHERAPPLY
					pTarget->FetchApply(CUser::APPLY_TEACHERAPPLY, pUser->GetID());
				else if (strcmp(szWords, "e") == 0)	// REJECT_STUDENGAPPLY
					pTarget->FetchApply(CUser::APPLY_STUDENTAPPLY, pUser->GetID());
			}
		}
		break;

	default:
		{
			pRole->BroadcastRoomMsg(this, EXCLUDE_SELF);
		}
		break;
	}
}

⌨️ 快捷键说明

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