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

📄 party.cpp

📁 墨香最新私服
💻 CPP
字号:
// Party.cpp: implementation of the CParty class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Party.h"
#include "UserTable.h"
#include "Network.h"
#include "Distribute_Random.h"
#include "Distribute_Damage.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CParty::CParty(DWORD id,DWORD MasterID,char* strMasterName,CPlayer* pMaster,BYTE Option) :
m_PartyIDx(id)
{
	m_Member[0].SetMember(MasterID,strMasterName,NULL, 0);
	m_TacticObjectID = 0;
	m_MasterChanging = FALSE;
	m_Option = Option;
	m_OldSendtime = 0;
	switch(m_Option)
	{
	case ePartyOpt_Random:
		m_pDistributeWay = DISTRIBUTERAND; break;
	case ePartyOpt_Damage:
		m_pDistributeWay = DISTRIBUTEDAM; break;
	case ePartyOpt_Sequence:
		{
			m_pDistributeWay = DISTRIBUTERAND;
			ASSERT(0);
		}
		break;
	default:
		{
			m_pDistributeWay = DISTRIBUTERAND;
			ASSERT(0);
		}		
		break;
	}
}

CParty::~CParty()
{

}

void CParty::SetMaster(CPlayer* pMaster)
{
	m_Member[0].SetMember(pMaster->GetID(), pMaster->GetObjectName(), pMaster, pMaster->GetLevel());
}

void CParty::SendPartyInfo(CPlayer* pToPlayer)
{
	PARTY_INFO msg;
	msg.Category = MP_PARTY;
	msg.Protocol = MP_PARTY_INFO;
	msg.dwObjectID = pToPlayer->GetID();
	msg.PartyDBIdx = m_PartyIDx;
	for(int n=0;n<MAX_PARTY_LISTNUM;++n)
	{
		GetMemberInfo(n,&msg.Member[n]);
		CPlayer* pMember = (CPlayer*)g_pUserTable->FindUser(msg.Member[n].dwMemberID);
		if(pMember)
		if(pToPlayer->GetGridID() != pMember->GetGridID())
		{
			msg.Member[n].LifePercent = 0;
			msg.Member[n].NaeRyukPercent = 0;
		}
	}
	msg.Option = GetOption();
	pToPlayer->SendMsg(&msg,sizeof(msg));
}

BOOL CParty::AddPartyMember(DWORD AddMemberID,char* Name,CPlayer* pPlayer, LEVELTYPE lvl)
{
	if(m_Member[0].MemberID == 0)
		ASSERTMSG(0, "颇萍 沥焊啊 绝绰单 AddPartyMember窃");
	for(int n=1;n<MAX_PARTY_LISTNUM;++n)
	{
		if(m_Member[n].MemberID == 0)
		{
			m_Member[n].SetMember(AddMemberID,Name,pPlayer,lvl);
			if(pPlayer)
			{				
				SendPartyInfo(pPlayer);
			}
			return TRUE;
		}
	}
	ASSERTMSG(0,"颇萍啊 菜 茫绰单 Add窍妨 沁嚼聪促");

	return FALSE;
}

BOOL CParty::RemovePartyMember(DWORD MemberID) 
{
	for(int n=1;n<MAX_PARTY_LISTNUM;++n) 
	{
		if(m_Member[n].MemberID == MemberID) 
		{			
			m_Member[n].MemberID = 0;
			m_Member[n].Name[0] = 0;
			m_Member[n].bLogged = FALSE;
			m_Member[n].LifePercent = 0;
			m_Member[n].NaeRyukPercent = 0;
			m_Member[n].Level = 0;

			return TRUE;
		}
	}
	return FALSE;
} 

BOOL CParty::ChangeMaster(DWORD FromID,DWORD ToID)
{
	ASSERTMSG(m_Member[0].MemberID != ToID,"磊扁磊脚俊霸 府歹甫 捞剧窍妨 沁嚼聪促.");
	ASSERTMSG(m_Member[0].MemberID == FromID,"府歹啊 酒囱 荤恩捞 捞剧窍妨 沁嚼聪促.");


	for(int n=1; n<MAX_PARTY_LISTNUM; ++n) 
	{
		if(m_Member[n].MemberID == ToID) 
		{
			swap(m_Member[0], m_Member[n]);
			return TRUE;
		} //if
	} // for
	
	return FALSE;
} 

BOOL CParty::IsPartyMember(DWORD PlayerID) {
	for(int n=0; n<MAX_PARTY_LISTNUM; ++n) 
		if(m_Member[n].MemberID == PlayerID) return TRUE;
	return FALSE;	
	
}

BOOL CParty::IsMemberLogIn(int n)
{
	return m_Member[n].bLogged;
}

void CParty::UserLogIn(CPlayer* pPlayer,BOOL bNotifyUserLogin) 
{	
	int n = SetMemberInfo(pPlayer->GetID(), pPlayer->GetObjectName(), pPlayer, pPlayer->GetLevel(), TRUE);
	if(n == -1)
	{
		ASSERT(0); 
		return;
	}
	// 扁粮 颇萍狼 沥焊甫 肺弊牢茄 蜡历俊霸 焊郴霖促.
	SendPartyInfo(pPlayer);

	if(bNotifyUserLogin)
	{
		// 肺弊牢茄 蜡历狼 沥焊甫 扁粮 颇萍盔俊霸 焊郴霖促.
		SendPlayerInfoToOtherMembers(n, pPlayer->GetGridID());
		
		SEND_CHANGE_PARTY_MEMBER_INFO cmsg;
		cmsg.Category = MP_PARTY;
		cmsg.Protocol = MP_PARTY_NOTIFYMEMBER_LOGIN_TO_MAPSERVER;
		cmsg.dwObjectID = pPlayer->GetID();
		cmsg.PartyID = pPlayer->GetPartyIdx();
		cmsg.Level = pPlayer->GetLevel();
		SafeStrCpy(cmsg.Name,this->GetMemberName(pPlayer->GetID()), MAX_NAME_LENGTH+1);
		
		g_Network.Send2AgentServer((char*)&cmsg,sizeof(cmsg));
	}
}

void CParty::NotifyUserLogIn(SEND_CHANGE_PARTY_MEMBER_INFO* pmsg)
{
	int n = SetMemberInfo(pmsg->dwObjectID, pmsg->Name, NULL, pmsg->Level, TRUE);
	SendPlayerInfoToOtherMembers(n, 0);
}

void CParty::UserLogOut(DWORD PlayerID) 
{
	for(int n=0;n<MAX_PARTY_LISTNUM;++n)
	{
		if(m_Member[n].MemberID == PlayerID)
		{
			m_Member[n].bLogged = FALSE;
			m_Member[n].LifePercent = 0;
			m_Member[n].NaeRyukPercent = 0;
			m_Member[n].ShieldPercent = 0;
		}
	}
}

void CParty::SendMsgUserLogOut(DWORD PlayerID)
{
	// 肺弊酒眶茄 蜡历狼 沥焊甫 促弗 颇萍盔俊霸 焊郴霖促.
	MSG_DWORD msg;
	msg.Category = MP_PARTY;
	msg.Protocol = MP_PARTY_MEMBER_LOGOUT;
	msg.dwData = PlayerID;
	SendMsgToAll(&msg,sizeof(msg));
}

void CParty::SendMsgToAll(MSGBASE* msg, int size) 
{
	CPlayer* pPlayer;
	for(int i=0; i<MAX_PARTY_LISTNUM; ++i) 
	{
		if(m_Member[i].bLogged == TRUE ) 
		{
			msg->dwObjectID = m_Member[i].MemberID;
			pPlayer = (CPlayer*)g_pUserTable->FindUser(m_Member[i].MemberID);
			if(pPlayer == NULL)
				continue;

			pPlayer->SendMsg(msg, size);
		}
	}
} 

void CParty::SendMsgExceptOne(MSGBASE* msg, int size, DWORD PlayerID) 
{
	CPlayer* pPlayer;
	for(int i=0; i<MAX_PARTY_LISTNUM; ++i) 
	{
		if(m_Member[i].MemberID == PlayerID )
			continue;
		else if(m_Member[i].bLogged == TRUE ) 
		{
			msg->dwObjectID = m_Member[i].MemberID;
			pPlayer = (CPlayer*)g_pUserTable->FindUser(m_Member[i].MemberID);
			if(pPlayer == NULL)
				continue;
			
			pPlayer->SendMsg(msg, size);
		}
	}
}

void CParty::SendMsgExceptOneinChannel(MSGBASE* msg, int size, DWORD PlayerID, DWORD GridID)
{
	CPlayer* pPlayer;
	for(int i=0; i<MAX_PARTY_LISTNUM; ++i) 
	{
		if(m_Member[i].MemberID == PlayerID )
			continue;
		else if(m_Member[i].bLogged == TRUE ) 
		{
			msg->dwObjectID = m_Member[i].MemberID;
			pPlayer = (CPlayer*)g_pUserTable->FindUser(m_Member[i].MemberID);
			if(pPlayer == NULL)
				continue;
			if(pPlayer->GetGridID() != GridID)
				continue;
			pPlayer->SendMsg(msg, size);
		}
	}
}

void CParty::BreakUp()
{
	CPlayer* pPlayer;
	for(int i=0; i<MAX_PARTY_LISTNUM; ++i) 
	{
		if(m_Member[i].MemberID != NULL ) 
		{
			pPlayer = (CPlayer*)g_pUserTable->FindUser(m_Member[i].MemberID);
			if(pPlayer == NULL)
				continue;
			
			pPlayer->SetPartyIdx(0);
		}
	}
}

void CParty::GetMemberInfo(int n, PARTY_MEMBER* pRtInfo)
{	
	pRtInfo->dwMemberID = m_Member[n].MemberID;
	SafeStrCpy(pRtInfo->Name,m_Member[n].Name, MAX_NAME_LENGTH+1);
	pRtInfo->bLogged = m_Member[n].bLogged;
	pRtInfo->Level = m_Member[n].Level;
	if(m_Member[n].MemberID != NULL && m_Member[n].bLogged == TRUE)
	{
		pRtInfo->LifePercent = m_Member[n].LifePercent;
		pRtInfo->NaeRyukPercent = m_Member[n].NaeRyukPercent;
		
		CPlayer* pPlayer = (CPlayer*)g_pUserTable->GetData(m_Member[n].MemberID);
		if(pPlayer)
		{
			VECTOR3 vPos;
			pPlayer->GetPosition(&vPos);
			pRtInfo->posX = (WORD)vPos.x;
			pRtInfo->posZ = (WORD)vPos.z;
		}
	}
	else
	{
		pRtInfo->LifePercent = 0;
		pRtInfo->NaeRyukPercent = 0;
		pRtInfo->posX = 0;
		pRtInfo->posZ = 0;
	}
}

DWORD CParty::GetFirstOnlineMemberID()
{
	for(int i=0; i<MAX_PARTY_LISTNUM; ++i) 
	{
		if( m_Member[i].bLogged == TRUE ) 
		{
			return m_Member[i].MemberID;
		}
	}
	return 0;
}

char* CParty::GetMemberName(DWORD MemberID)
{
	for(int i=0; i<MAX_PARTY_LISTNUM; ++i) 
	{
		if(m_Member[i].MemberID == MemberID ) 
		{
			return m_Member[i].Name;
		} //if
	} //for
//	ASSERTMSG(0,"干滚啊 酒囱 荤恩狼 酒捞叼甫 茫栏妨 沁嚼聪促.");
	return "";
}

void CParty::SendMemberLogInMsg(DWORD PlayerID)
{
	MSG_DWORD msg;
	msg.Category = MP_PARTY;
	msg.Protocol = MP_PARTY_MEMBER_LOGINMSG;
	msg.dwData = PlayerID;
	SendMsgToAll(&msg, sizeof(msg)); 
}

void CParty::NotifyMemberLogin(DWORD PlayerID)
{
	MSG_DWORD bmsg;
	bmsg.Category = MP_PARTY;
	bmsg.Protocol = MP_PARTY_NOTIFYMEMBER_LOGINMSG;
	bmsg.dwObjectID = PlayerID;
	bmsg.dwData = GetPartyIdx();
	g_Network.Send2AgentServer((char*)&bmsg, sizeof(bmsg));
}

int CParty::SetMemberInfo(DWORD MemberID, char* strName, CPlayer* pPlayer, LEVELTYPE lvl, BOOL bLog)
{
	for(int n=0;n<MAX_PARTY_LISTNUM;++n)
	{
		if(m_Member[n].MemberID == MemberID)
		{
			m_Member[n].SetMember(MemberID, strName, pPlayer, lvl);
			m_Member[n].bLogged = bLog;
			return n;
		}
	}
	ASSERT( n < MAX_PARTY_LISTNUM );
	return -1;
}

void CParty::SendPlayerInfoToOtherMembers(int n, DWORD GridID)
{
	SEND_PARTY_MEMBER_INFO msg;
	msg.Category = MP_PARTY;
	msg.Protocol = MP_PARTY_MEMBER_LOGIN;
	GetMemberInfo(n,&msg.MemberInfo);
	msg.PartyID = GetPartyIdx();
	SendMsgLoginMemberInfo(&msg, GridID);
}

void CParty::SendMsgLoginMemberInfo(SEND_PARTY_MEMBER_INFO* msg, DWORD GridID)
{
	CPlayer* pPlayer;
	for(int i=0; i<MAX_PARTY_LISTNUM; ++i) 
	{
		if(m_Member[i].bLogged == TRUE ) 
		{
			msg->dwObjectID = m_Member[i].MemberID;
			pPlayer = (CPlayer*)g_pUserTable->FindUser(m_Member[i].MemberID);
			if(pPlayer == NULL)
				continue;
			if(pPlayer->GetGridID() != GridID)
			{
				msg->MemberInfo.LifePercent = 0;
				msg->MemberInfo.NaeRyukPercent = 0;
			}
			pPlayer->SendMsg(msg, sizeof(SEND_PARTY_MEMBER_INFO));
		}
	}
}

void CParty::SetMasterChanging(BOOL val)
{
	m_MasterChanging = val;
}

BOOL CParty::IsMasterChanging(CPlayer* pPlayer, BYTE Protocol)
{
	if(m_MasterChanging == TRUE)
	{
		MSG_INT msg;
		msg.Category = MP_PARTY;
		msg.Protocol = Protocol;
		pPlayer->SendMsg(&msg, sizeof(msg));
		return TRUE;
	}
	return FALSE;
}

void CParty::SetMemberLevel(DWORD PlayerID, LEVELTYPE lvl)
{
	for(int n=0;n<MAX_PARTY_LISTNUM;++n)
	{
		if(m_Member[n].MemberID == PlayerID)
		{
			m_Member[n].SetLevel(lvl);
			return;
		}
	}
	char buff[256] = {0, };
	sprintf(buff, "PartyID : %d, PlayerID : %d, level : %d", m_PartyIDx, PlayerID, lvl);
	ASSERTMSG(0, buff);
}

void CParty::SendMemberPos(DWORD MoverID, BASEMOVE_INFO* pMoveInfo)
{
	CPlayer* pPlayer = NULL;

	SEND_PARTYICON_MOVEINFO msg;
	msg.Category = MP_PARTY;
	msg.Protocol = MP_PARTY_SENDPOS;
	msg.MoveInfo.dwMoverID = MoverID;
	msg.MoveInfo.tgCount = pMoveInfo->GetMaxTargetPosIdx();
	msg.MoveInfo.cPos.posX = pMoveInfo->CurPosition.x;
	msg.MoveInfo.cPos.posZ = pMoveInfo->CurPosition.z;
	msg.MoveInfo.KyungGongIdx = pMoveInfo->KyungGongIdx;
	msg.MoveInfo.MoveState = pMoveInfo->MoveMode;
	
	for(int i=0; i<msg.MoveInfo.tgCount; i++)
	{
		VECTOR3* pTgPos = pMoveInfo->GetTargetPosition(i);
		msg.MoveInfo.tgPos[i].posX = pTgPos->x;
		msg.MoveInfo.tgPos[i].posZ = pTgPos->z;
	}
	
	for(i=0; i<MAX_PARTY_LISTNUM-1; i++)
	{
		if(m_Member[i].bLogged && m_Member[i].MemberID != MoverID)
//		if(m_Member[i].bLogged)
		{
			pPlayer = (CPlayer*)g_pUserTable->FindUser(m_Member[i].MemberID);
			if(!pPlayer)			continue;

			pPlayer->SendMsg(&msg, msg.GetSize());
		}
	}
}

void CParty::SetOption(BYTE Option)
{
	m_Option = Option;
}

BYTE CParty::GetOption()
{
	return m_Option;
}

void CParty::SendAbil(LEVELTYPE MonsterLevel, PARTY_RECEIVE_MEMBER* pMemberInfo)
{
	m_pDistributeWay->CalcAbilandSend(MonsterLevel, pMemberInfo);
}

void CParty::SendItem(PARTY_RECEIVE_MEMBER* pRealMember, WORD DropItemId, DWORD DropItemRatio, MONSTEREX_LIST * pMonInfo, WORD MonsterKind)
{
	m_pDistributeWay->SendItem(pRealMember, DropItemId, DropItemRatio, pMonInfo, MonsterKind);
}

⌨️ 快捷键说明

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