📄 party.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 + -