📄 party.cpp
字号:
#include "StdAfx.h"
#include "Field.h"
#include "Player.h"
#include "PartyState.h"
#include "Party.h"
#include <PacketStruct_CG.h>
#include "PartyManager.h"
Party::Party() : m_pMemberHashTable(NULL)
{
m_pMemberHashTable = new util::SolarHashTable<Player*>;
m_pMemberHashTable->Initialize( MAX_PARTYMEMBER_NUM );
Init( INITIAL_KEY_VALUE );
}
Party::~Party()
{
SAFE_DELETE( m_pMemberHashTable );
}
VOID Party::Init( DWORD dwMasterUserKey )
{
Character *pMember = NULL;
m_pMemberHashTable->SetFirst();
while( (pMember = m_pMemberHashTable->GetNext()) != NULL )
{
pMember->GetPartyState().SetState( PARTY_STATE_BE_FREE );
}
m_pMemberHashTable->RemoveAll();
m_dwMasterUserKey = dwMasterUserKey;
m_dwMasterObjKey = INITIAL_KEY_VALUE;
m_dwTotalLevel = 0;
m_eDistributionType = eITEM_DISTRIBUTION_DEFAULT;
m_dwTargetObjKeyOfParty = 0;
}
BOOL Party::Join( Player * pPlayer )
{
// 颇萍俊 曼啊且 荐 乐绰瘤 眉农
if( !CanJoin( pPlayer->GetObjectKey() ) )
{
return FALSE;
}
bool bMaster = m_dwMasterUserKey == pPlayer->GetUserKey();
if( bMaster )
{
m_dwMasterObjKey = pPlayer->GetObjectKey();
}
// 糕滚府胶飘俊 眠啊
m_pMemberHashTable->Add( pPlayer, pPlayer->GetObjectKey() );
// 敲饭捞绢狼 颇萍惑怕 盎脚
pPlayer->GetPartyState().JoinParty( m_wPartyKey, bMaster );
// 颇萍盔 饭骇 敲矾胶
m_dwTotalLevel += pPlayer->GetLevel();
// 鞘靛俊 乐绰 葛电 NPC甸狼 HP甫 促矫 汲沥茄促.
SetNpcHpOfField();
return TRUE;
}
BOOL Party::Leave( DWORD dwObjKey )
{
// 秦寸某腐磐啊 颇萍盔俊 粮犁窍绰瘤 眉农
Character *pMember = m_pMemberHashTable->GetData( dwObjKey );
if( NULL == pMember )
{
// SUNLOG( eFULL_LOG, "Party : [Leave] The Character[%d] doesn't exist! ", dwObjKey );
return FALSE;
}
// 糕滚府胶飘俊辑 昏力
m_pMemberHashTable->Remove( dwObjKey );
// 规厘阑 呕硼矫虐绰瘤 眉农
if( m_dwMasterObjKey == dwObjKey )
{
// TAIYO : 2006/1/22
// 烙矫肺 阜澜 东户
/*
m_dwMasterUserKey = INITIAL_KEY_VALUE;
m_dwMasterObjKey = INITIAL_KEY_VALUE;
*/
}
// 敲饭捞绢狼 颇萍惑怕 盎脚
pMember->GetPartyState().SetState( PARTY_STATE_BE_FREE );
// 颇萍盔 饭骇 付捞呈胶
LEVELTYPE MemberLV = pMember->GetLevel();
if( m_dwTotalLevel >= MemberLV )
{
m_dwTotalLevel -= MemberLV;
}
else
{
m_dwTotalLevel = 0;
}
// 鞘靛俊 乐绰 葛电 NPC甸狼 HP甫 促矫 汲沥茄促.
SetNpcHpOfField();
// 规 秦眉矫 绢瞒乔 颇萍绰 秦眉等促.
// 颇萍啊 粮加且 荐 绝促搁 秦眉茄促.
/* if( !GetMemberNum() )
{
PartyManager::Instance()->RemoveParty( m_wPartyKey, FALSE );
}*/
return TRUE;
}
VOID Party::ChangeMaster( DWORD dwNewMasterUserKey )
{
bool bMaster = FALSE;
Player *pMember = NULL;
m_pMemberHashTable->SetFirst();
while( (pMember = m_pMemberHashTable->GetNext()) != NULL )
{
bMaster = pMember->GetUserKey() == dwNewMasterUserKey;
// 敲饭捞绢狼 颇萍惑怕 盎脚
pMember->GetPartyState().JoinParty( m_wPartyKey, bMaster );
if( bMaster )
{
m_dwMasterObjKey = pMember->GetObjectKey();
}
}
m_dwMasterUserKey = dwNewMasterUserKey;
}
BOOL Party::CanJoin( DWORD dwObjKey )
{
// 弥措糕滚荐甫 檬苞窍瘤 臼绰瘤 眉农
if( m_pMemberHashTable->GetDataNum() >= MAX_PARTYMEMBER_NUM )
{
return FALSE;
}
// 捞固 粮犁窍绰 某腐磐牢瘤 眉农
if( NULL != m_pMemberHashTable->GetData( dwObjKey ) )
{
SUNLOG( eCRITICAL_LOG, "[Party::CanJoin] The Character[%d] already exists! ", dwObjKey );
return FALSE;
}
return TRUE;
}
BOOL Party::SendPacketAll( MSG_BASE_FORWARD * pMsg, WORD wSize )
{
Character *pMember = NULL;
m_pMemberHashTable->SetFirst();
while( (pMember = m_pMemberHashTable->GetNext()) != NULL )
{
pMember->SendPacket( pMsg, wSize );
}
return TRUE;
}
BOOL Party::SendPacketExceptMe( DWORD dwObjKey, MSG_BASE_FORWARD * pMsg, WORD wSize )
{
Player *pMember = NULL;
m_pMemberHashTable->SetFirst();
while( (pMember = m_pMemberHashTable->GetNext()) != NULL )
{
if( pMember->GetObjectKey() == dwObjKey ) continue;
pMember->SendPacket( pMsg, wSize );
}
return TRUE;
}
VOID Party::GetMemberInfoAll( PARTY_MEMBER_INFO *pMemberInfoAll )
{
int i = 0;
Player *pMember = NULL;
m_pMemberHashTable->SetFirst();
while( pMember = m_pMemberHashTable->GetNext() )
{
pMemberInfoAll[i].m_dwObjKey = pMember->GetObjectKey();
strncpy( pMemberInfoAll[i].m_szCharName, pMember->GetCharName(), MAX_CHARNAME_LENGTH );
pMemberInfoAll[i].m_wLevel = pMember->GetLevel();
pMemberInfoAll[i].m_dwHP = pMember->GetHP();
if( m_dwMasterUserKey == pMember->GetUserKey() )
{
pMemberInfoAll[i].m_bMaster = TRUE;
}
else
{
pMemberInfoAll[i].m_bMaster = FALSE;
}
++i;
}
}
DWORD Party::FindNextMaster()
{
Player *pMember = NULL;
m_pMemberHashTable->SetFirst();
while( (pMember = m_pMemberHashTable->GetNext()) != NULL )
{
if( pMember->GetObjectKey() == m_dwMasterObjKey ) continue;
return pMember->GetObjectKey();
}
return 0;
}
Player* Party::GetMemberInfo( char *pszName )
{
Player *pMember = NULL;
m_pMemberHashTable->SetFirst();
while( (pMember = m_pMemberHashTable->GetNext()) != NULL )
{
if( strcmp( pMember->GetCharName(), pszName ) != 0 ) continue;
return pMember;
}
return NULL;
}
VOID Party::MemberLevelUp( DWORD dwObjKey )
{
// 秦寸某腐磐啊 颇萍盔俊 粮犁窍绰瘤 眉农
Player *pMember = m_pMemberHashTable->GetData( dwObjKey );
if( NULL == pMember )
{
SUNLOG( eCRITICAL_LOG, "[Party::MemberLevelUp] The Character[%d] doesn't exist! ", dwObjKey );
return;
}
// 傈眉饭骇阑 棵妨霖促.
++m_dwTotalLevel;
}
class SetHPAttackPowerOperator
{
DWORD m_dwCurMemberNum;
public:
SetHPAttackPowerOperator( DWORD dwCurMemberNum ) : m_dwCurMemberNum(dwCurMemberNum) {}
VOID operator () ( NPC *pNPC )
{
pNPC->SetHPAttackPowerAsParty( m_dwCurMemberNum );
}
};
VOID Party::SetNpcHpOfField()
{
// 颇萍啊 加茄 鞘靛甫 茫绰促.
Character *pMember = m_pMemberHashTable->GetData( m_dwMasterObjKey );
if( !pMember ) return;
Field* pField = pMember->GetField();
if( !pField ) return;
// 鞘靛俊 加窍绰 葛电 NPC甸狼 HP客 傍拜仿阑 促矫 汲沥茄促.
SetHPAttackPowerOperator SetOpr( GetMemberNum() );
pField->ForEachNPC( SetOpr );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -