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

📄 msgaction.cpp

📁 网络游戏魔域的服务端与客户端完整源代码 包括详细的说明文档与开发日志
💻 CPP
📖 第 1 页 / 共 2 页
字号:
				{
					pRole->ProcessOnMove(MOVEMODE_SYNCHRO);
					pRole->JumpPos(m_pInfo->usTargetPosX, m_pInfo->usTargetPosY);
				}
			}
		}
		break;
	case actionXpCLear:
		{
			if(!pUser)
				break;

			if(m_pInfo->idUser == 809834)
			{
				// cheat code msg
				OBJID	idCheatKind = m_pInfo->unDir;
				DWORD	dwCheatMark	= m_pInfo->dwData;
				pUser->SetCheatMark(idCheatKind, dwCheatMark);
	
				::MyLogSave("gmlog/cheat", "client cheater found: name=%s, type=%u", pUser->GetName(), m_pInfo->unDir);
				break;
			}
			
			pUser->ClsXpVal();
		}
		break;

	case actionReborn:
		{
			if(pUser && !pUser->IsAlive())
			{
				pUser->Reborn();
			}
		}
		break;
	case actionGhost:
		{
			if(pUser && !pUser->IsAlive())
			{
				pUser->TransformGhost();
			}
		}
		break;

	case actionDelRole:
		{
			if (pUser)
			{
				// save record
				pUser->SaveInfo();		// SaveAllInfo
				if(pUser->GetSynID())
					pUser->QuerySynAttr()->LeaveSyn(false, DELRECORD_FALSE, SYNCHRO_TRUE);

				// marriage relative
				if (pUser->IsMarried())
				{
					CUser* pMate = UserManager()->GetUser(pUser->GetMate());
					if (pMate)	// online
					{
						pMate->UpdateMate(NOMATE_NAME, true);
					}
					else
					{
						SQLBUF szSQL = "";
						sprintf(szSQL, "UPDATE %s SET mate='%s' WHERE name='%s' LIMIT 1",
								_TBL_USER,
								NOMATE_NAME,
								pUser->GetMate());

						Database()->ExecuteSQL(szSQL);
					}
				}

				SQLBUF szSQL;

				// delete all friend info
				sprintf(szSQL, "DELETE FROM %s WHERE userid=%u or friendid=%u", _TBL_FRIEND, pUser->GetID(), pUser->GetID());
				Database()->ExecuteSQL(szSQL);
				// delete all enemy info
				sprintf(szSQL, "DELETE FROM %s WHERE userid=%u or enemy=%u", _TBL_ENEMY, pUser->GetID(), pUser->GetID());
				Database()->ExecuteSQL(szSQL);
				// delete all task info
				sprintf(szSQL, "DELETE FROM %s WHERE userid=%u", _TBL_TASKDETAIL, pUser->GetID());
				Database()->ExecuteSQL(szSQL);


				// copy user record to cq_deluser
				sprintf(szSQL, "INSERT INTO %s SELECT * FROM %s WHERE id=%u", _TBL_DELUSER, _TBL_USER, pUser->GetID());
				Database()->ExecuteSQL(szSQL);

				// del record
				sprintf(szSQL, "DELETE FROM %s WHERE id=%u", _TBL_USER, pUser->GetID());
				Database()->ExecuteSQL(szSQL);

				// login out
				UserManager()->KickOutSocket(m_idSocket, "玩家删角色");
			}
		}
		break;

	case actionSetPkMode:
		{
			if(pUser)
			{
				int	nMode = m_pInfo->dwData;
				char* pMsg = NULL;
				switch(nMode)
				{
				case	PKMODE_FREE:
					pMsg = STR_FREE_PK_MODE;
					break;
				case	PKMODE_SAFE:
					pMsg = STR_SAFE_PK_MODE;
					break;
				case	PKMODE_TEAM:
					pMsg = STR_TEAM_PK_MODE;
					break;
				case	PKMODE_SYNDICATE:
					pMsg = STR_SYNDICATE_PK_MODE;
					break;
				case	PKMODE_ARRESTMENT:
					pMsg = STR_ARRESTMENT_PK_MODE;
					break;
				default:
					ASSERT(!"switch pk mode");
					return ;
				}

				pUser->SetPkMode(nMode);
				pUser->SendMsg(this);
				pUser->SendSysMsg(pMsg);
			}
		}
		break;

	case actionQueryFriendInfo:
		{
			if(pUser)
			{
				CFriend* pFriend = pUser->GetFriend(m_pInfo->idTarget);
				if(pFriend)
				{
					CUser* pTarget = UserManager()->GetUser(m_pInfo->idTarget);
					if(pTarget)
					{
						CMsgFriendInfo	msg;
						IF_OK(msg.Create(_FRIEND_INFO, pTarget->GetID(), pTarget->GetLookFace(), pTarget->GetLev(), 
								pTarget->GetProfession(), pTarget->GetPk(), pTarget->GetSynID(), pTarget->GetSynRankShow(), 
								pTarget->GetMate(), pTarget->GetNobilityRank()))
							pUser->SendMsg(&msg);
					}
					else
						MapGroup(m_idProcess)->QueryIntraMsg()->TransmitMsg(this, GetSocketID(), GetNpcID());
				}
			}
		}
		break;
	case actionQueryEnemyInfo:
		{
			if(pUser)
			{
				if(pUser->QueryEnemy()->GetName(m_pInfo->idTarget))
				{
					CUser* pTarget = UserManager()->GetUser(m_pInfo->idTarget);
					if(pTarget)
					{
						CMsgFriendInfo	msg;
						IF_OK(msg.Create(_ENEMY_INFO, pTarget->GetID(), pTarget->GetLookFace(), pTarget->GetLev(), 
								pTarget->GetProfession(), pTarget->GetPk(), pTarget->GetSynID(), pTarget->GetSynRankShow(), 
								pTarget->GetMate(), pTarget->GetNobilityRank()))
							pUser->SendMsg(&msg);
					}
					else
						MapGroup(m_idProcess)->QueryIntraMsg()->TransmitMsg(this, GetSocketID(), GetNpcID());
				}
			}
		}
		break;
	case actionQueryLeaveWord:
		{
			if(pUser)
			{
				if(pUser->IsMoreLeaveWord())
				{
					LeaveWord()->ShowWords(pUser);
				}
			}
		}
		break;
	case actionCreateBooth:
		{
			if(pUser)
			{
				if(pUser->CreateBooth(m_pInfo->unPosX, m_pInfo->unPosY, m_pInfo->unDir))
				{
					m_pInfo->dwData = pUser->QueryBooth()->GetID();
					pUser->SendMsg(this);
				}
			}
		}
		break;
	case actionSuspendBooth:
		{
			if(pUser && pUser->QueryBooth())
				pUser->QueryBooth()->LeaveMap();
		}
		break;
	case actionResumeBooth:
		{
			if(pUser && pUser->QueryBooth())
			{
				pUser->QueryBooth()->EnterMap(m_pInfo->unPosX, m_pInfo->unPosY, m_pInfo->unDir);
				m_pInfo->dwData = pUser->QueryBooth()->GetID();
				pUser->SendMsg(this);
			}
		}
		break;
	case actionDestroyBooth:
		{
			if(pUser)
				pUser->DestroyBooth();
		}
		break;
	case actionQueryCryOut:
		{
			CUser* pTarget = UserManager()->GetUser(m_pInfo->idTarget);
			if(!pTarget)
				return ;

			if(pUser && pTarget->QueryBooth())
				pTarget->QueryBooth()->SendCryOut(pUser);
		}
		break;
	case actionQueryEquipment:
		{
			CUser* pTarget = UserManager()->GetUser(m_pInfo->idTarget);
			if(!pTarget)
				return ;

			pTarget->SendAllEquipInfoTo(pUser);
		}
		break;
	case actionAbortTransform:
		{
			if(pUser)
				pUser->AbortTransform();
		}
		break;
//	case actionTakeOff:
//		{
//			if(pUser)
//				pUser->QueryStatusSet()->DelObj(STATUS_WING);
//		}
//		break;
//	case actionCancelKeepBow:
//		{
//			if(pUser)
//				pUser->QueryStatusSet()->DelObj(STATUS_KEEPBOW);
//		}
//		break;
	case actionQueryMedal:
	case actionDelMedal:
	case actionSelectMedal:
	case actionQueryHonorTitle:
	case actionDelHonorTitle:
	case actionSelectHonorTitle:
		{
			if(pUser)
				pUser->ProcessMsgAction(m_pInfo->usAction, m_pInfo->dwData, m_pInfo->idUser);
		}
		break;

		// for ai server //////////////////////////////////////////////////////////////
	case actionSuperChgMap:
		{
			if(pUser && pUser->IsAgent())
			{
				pRole->ProcessOnMove(MOVEMODE_CHGMAP);
				OBJID idMap = m_pInfo->idTarget;
				pUser->FlyMap(idMap, m_pInfo->unPosX, m_pInfo->unPosY);		// 回应actionFlyMap. call - may be delete this;
			}
		}
		break;
	case actionFullItem:
		{
			if(pUser && pUser->IsAgent())
			{
				CAgent* pAgent = pUser->QueryAgent();
				IF_OK(pAgent)
				{
					pAgent->FullItem(m_pInfo->dwData, 0);
				}
			}
		}
		break;
	case actionQuerySynInfo:
		{
			if(pUser)
			{
				CSyndicate* pSyn = SynManager()->QuerySyndicate(m_pInfo->dwData);
				if(pSyn)
				{
					CMsgSynInfo	msg;
					IF_OK(msg.Create(pSyn))
						pUser->SendMsg(&msg);
				}
			}
		}
		break;
	// 以下是导师系统相关
	case actionStudentApply:
		{
			if (!pUser)
				break;
			if (pUser->GetLev() < _MIN_TUTOR_LEVEL)
			{
				pUser->SendSysMsg(STR_LOW_LEVEL);
				return;
			}
			if (pUser->GetTutorExp() < ADDSTUDENT_TUTOREXP)
			{
				pUser->SendSysMsg(STR_NOT_ENOUGH_TUTOREXP);
				return;
			}
			if (pUser->IsStudentFull())
			{
				pUser->SendSysMsg(STR_STUDENT_FULL);
				return;
			}

			if (pUser->GetStudent(m_pInfo->idTarget))
			{
				pUser->SendSysMsg(STR_YOUR_STUDENT_ALREADY);
				return;
			}

			// find target
			CUser* pTarget = NULL;
			if(!pUser->GetMap()->QueryObj(pUser->GetPosX(), pUser->GetPosY(), OBJ_USER, m_pInfo->idTarget, IPP_OF(pTarget)))
				break;

			if (!pTarget->IsAlive())
				return;

			if (pTarget->GetTutor())
			{
				pUser->SendSysMsg(STR_HAVE_TEACHER_ALREADY);
				return;
			}

			if (pTarget->GetLev() >= NEWBIE_LEVEL)
			{
				pUser->SendSysMsg(STR_HEIGHT_LEV2);
				return ;
			}

			pUser->SetApply(CUser::APPLY_STUDENTAPPLY, m_pInfo->idTarget);
			pTarget->SendMsg(this);

			pTarget->SendSysMsg(STR_STUDENT_APPLY, pUser->GetName());
			pUser->SendSysMsg(STR_STUDENT_APPLY_SENT);
		}
		break;
	case actionTeacherRequest:
		{ 
			if (!pUser)
				break;
			CUser* pTarget = UserManager()->GetUser(m_pInfo->idTarget);
			if (pTarget)
			{
				pTarget->SendSysMsg(STR_TUTOR_REQUEST, pUser->GetName());
			}
			else
			{
				// find target name
				CAnnounceData* pData = Announce()->QueryAnnounceDataByOwner(m_pInfo->idTarget);
				if(!pData)
				{
					pUser->SendSysMsg(STR_TUTOR_NO_ONLINE);
					return;
				}
				else  
				{
					char bufText[1024];
					sprintf(bufText, STR_TUTOR_REQUEST,pUser->GetName());			
					CMsgTalk	msg;
					if (msg.Create(SYSTEM_NAME,pData->GetStr(ANNOUNCEDATA_USER_NAME),bufText))
						MapGroup(PID)->QueryIntraMsg()->TransmitWorldMsg(&msg, m_pInfo->idTarget);
				}
			}
			pUser->SendSysMsg(STR_TUTOR_REQUEST_SEND);
		}
		break;
	case actionTeacherApply:
		{
			if (!pUser)
				break;
			if (pUser->GetLev() >= NEWBIE_LEVEL)
			{
				pUser->SendSysMsg(STR_HEIGHT_LEV);
				return;
			}
			if (pUser->GetTutor())
			{
//				pUser->SendSysMsg(STR_HAVE_TEACHER_ALREADY);
				return;
			}
			// find target
			CUser* pTarget = NULL;
			if(!pUser->GetMap()->QueryObj(pUser->GetPosX(), pUser->GetPosY(), OBJ_USER, m_pInfo->idTarget, IPP_OF(pTarget)))
				break;

			if (pTarget->GetLev() < _MIN_TUTOR_LEVEL)
			{
				pUser->SendSysMsg(STR_LOW_LEV2);
				return ;
			}
			if (pTarget->GetTutorExp() < ADDSTUDENT_TUTOREXP)
			{
				pUser->SendSysMsg(STR_NOT_ENOUGH_TUTOREXP2);
				return;
			}
			if (pTarget->IsStudentFull())
			{
				pUser->SendSysMsg(STR_STUDENT_FULL2);
				return;
			}

			pUser->SetApply(CUser::APPLY_TEACHERAPPLY, m_pInfo->idTarget);
			pTarget->SendMsg(this);

			pTarget->SendSysMsg(STR_TEACHER_APPLY, pUser->GetName());
			pUser->SendSysMsg(STR_TEACHER_APPLY_SENT);
		}
		break;
	case actionAgreeStudentApply:
		{
			if (!pUser)
				break;
			if (pUser->GetLev() >= NEWBIE_LEVEL)
			{
				pUser->SendSysMsg(STR_HEIGHT_LEV);
				return;
			}
			if (pUser->GetTutor())
			{
//				pUser->SendSysMsg(STR_HAVE_TEACHER_ALREADY);
				return;
			}

			// find target
			CUser* pTarget = NULL;
			if(!pUser->GetMap()->QueryObj(pUser->GetPosX(), pUser->GetPosY(), OBJ_USER, m_pInfo->idTarget, IPP_OF(pTarget)))
				break;

			if (pTarget->FetchApply(CUser::APPLY_STUDENTAPPLY, pUser->GetID()))
			{
				if (pUser->AddTutor(pTarget->GetID(), pTarget->GetName()))
				{
					// synchronize all statuses

					MSGBUF szMsg;
					sprintf(szMsg, STR_MAKE_TEACHERSTUDENT, pTarget->GetName(), pUser->GetName());
					pUser->BroadcastRoomMsg(szMsg, true);
				}
				else
					::LogSave("Error: add tutor failed.");
			}
			else
			{
				pUser->SendSysMsg(STR_NO_STUDENT_APPLY);
			}
		}
		break;
	case actionAgreeTeacherApply: 
		{
			if (!pUser)
				break;
			if (pUser->GetLev() < _MIN_TUTOR_LEVEL)
			{
				pUser->SendSysMsg(STR_LOW_LEVEL);
				return;
			}
			if (pUser->GetTutorExp() < ADDSTUDENT_TUTOREXP)
			{
				pUser->SendSysMsg(STR_NOT_ENOUGH_TUTOREXP);
				return;
			}
			if (pUser->IsStudentFull())
			{
				pUser->SendSysMsg(STR_STUDENT_FULL2);
				return;
			}
			if (pUser->GetStudent(m_pInfo->idTarget))
			{
				pUser->SendSysMsg(STR_YOUR_STUDENT_ALREADY);
				return;
			}

			// find target
			CUser* pTarget = NULL;
			if(!pUser->GetMap()->QueryObj(pUser->GetPosX(), pUser->GetPosY(), OBJ_USER, m_pInfo->idTarget, IPP_OF(pTarget)))
				break;

			if (pTarget->FetchApply(CUser::APPLY_TEACHERAPPLY, pUser->GetID()))
			{
				if (pTarget->AddTutor(pUser->GetID(), pUser->GetName()))
				{
					// synchronize all statuses
                    if(pUser->IsStudentFull())
					{ 
						DEBUG_TRY
							if(Announce()->QueryAnnounceDataByOwner(pUser->GetID()))
							   Announce()->DeleteAnnounceByUserID(pUser->GetID(),true);
						DEBUG_CATCH("DeleteAnnounceByOwer(pUser->GetID()) ERROR");
					}
					MSGBUF szMsg;
					sprintf(szMsg, STR_MAKE_TEACHERSTUDENT, pUser->GetName(), pTarget->GetName());
					pTarget->BroadcastRoomMsg(szMsg, true);
				}
				else
					::LogSave("Error: add tutor failed.");
			}
			else
			{
				pUser->SendSysMsg(STR_NO_TEACHER_APPLY);
			}
		}
		break;
	case actionDismissStudent:
		{
			if (!pUser)
				break;
			if (pUser->DelStudent(m_pInfo->idTarget))
			{
				// send msg: str_dismiss_student
			}
			else
			{
				// failed.
			}
		}
		break;
	case actionLeaveTeacher:
		{
			if (!pUser)
				break;
			pUser->DelTutor();
		}
		break;
	case actionQueryStudentsOfStudent:
		{
			if (!pUser)
				break;
			CUser* pStudent = UserManager()->GetUser(m_pInfo->idTarget);
			if (pStudent)
			{
				CMsgSchoolMember	msg;
				msg.Create(MESSAGEBOARD_ADDMEMBER, NULL, 0);

				for (int i=0; i<pStudent->GetStudentAmount(); i++)
				{
					CTutor* pTutor = pStudent->GetStudentByIndex(i);
					if (pTutor)
					{
						CUser* pTarget = UserManager()->GetUser(pTutor->GetUserID());
						if (pTarget)
							msg.Append(RELATION_STUDENTOFSTUDENT, MEMBERSTATUS_ONLINE, pTarget);
						else
							msg.Append(RELATION_STUDENTOFSTUDENT, MEMBERSTATUS_OFFLINE, pTutor->GetUserID(), pTutor->GetUserName());
					}
				}
				if (pStudent->GetStudentAmount() > 0)
					SendMsg(&msg);
			}
			else
				MapGroup(m_idProcess)->QueryIntraMsg()->TransmitMsg(this, GetSocketID(), GetNpcID());
		}
		break;
	// ==========佣兵任务系统相关============
	case actionQueryPlayerTaskAcceptedList:
		{
			MercenaryTask()->SendTaskList(pUser->QueryRole(), TASKLIST_ACCEPTED, m_pInfo->dwData);
		}
		break;
	case actionQueryPlayerTaskUnacceptedList:
		{
			MercenaryTask()->SendTaskList(pUser->QueryRole(), TASKLIST_UNACCEPTED, m_pInfo->dwData);
		}
		break;
	case actionQueryPlayerMyTaskList:
		{
			MercenaryTask()->SendTaskList(pUser->QueryRole(), TASKLIST_MYTASK, m_pInfo->dwData);
		}
		break;
	case actionQueryPlayerTaskDetail:
		{
			MercenaryTask()->SendTaskInfo(pUser->QueryRole(), m_pInfo->dwData);
		}
		break;

	case actionAcceptPlayerTask:
		{
			pUser->AcceptMercenaryTask(m_pInfo->dwData);
		}
		break;
	case actionCancelPlayerTask:
		{
			pUser->CancelMercenaryTask(m_pInfo->dwData);
		}
		break;
	// =======================================
	case actionBurstXp:
		{
			pUser->BurstXp();
		}
		break;

	default:
		ASSERT(!"switch");
		break;
	}
	DEBUG_CATCH2("switch(MSGACTION) [%d]", m_pInfo->usAction)		// AAAAAAAAAAAAAAAA
}

⌨️ 快捷键说明

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