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

📄 distributer.cpp

📁 墨香最新私服
💻 CPP
字号:
// Distributer.cpp: implementation of the CDistributer class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "Distributer.h"
#include "UserTable.h"
#include "CharMove.h"
#include "AttackManager.h"
#include "PartyManager.h"
#include "Party.h"
#include "Distribute_Random.h"
#include "Monster.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

float gExpRate		= 1.0f;
float gItemRate		= 1.0f;
float gMoneyRate	= 1.0f;
// RaMa -04.11.24
float gDamageReciveRate	= 1.0f;		// 罐绰 单固瘤
float gDamageRate		= 1.0f;		// 林绰 单固瘤
float gNaeRuykRate	= 1.0f;		// 郴仿家葛
float gUngiSpeed	= 1.0f;		// 款扁炼侥 胶乔靛
float gPartyExpRate	= 1.0f;		// 颇萍版氰摹
float gAbilRate		= 1.0f;		// 漂扁摹
float gGetMoney		= 1.0f;		// 掘绰捣狼 硅荐
// Etc - 酒流救凳
float gShield		= 1.0f;		// 龋脚碍扁
float gDefence		= 1.0f;		// 规绢仿

float gEventRate[eEvent_Max] = { 1.0f, };



CDistributer::CDistributer()
{
	m_DamageObjectTableSolo.Initialize(MAX_POINTACCEPTOBJECT_NUM);
	m_DamageObjectTableParty.Initialize(MAX_POINTACCEPTOBJECT_NUM);
	m_1stPartyID = 0;
	m_1stPlayerID = 0;
	m_PlusDamage = 0;
}

CDistributer::~CDistributer()
{
	Release();
}

void CDistributer::Release()
{
	m_1stPartyID = 0;
	m_1stPlayerID = 0;
	m_PlusDamage = 0;
	DAMAGEOBJ *sobj, *pobj = NULL;
	m_DamageObjectTableSolo.SetPositionHead();
	while(sobj = m_DamageObjectTableSolo.GetData())
		delete sobj;
	m_DamageObjectTableSolo.RemoveAll();

	m_DamageObjectTableParty.SetPositionHead();
	while(pobj = m_DamageObjectTableParty.GetData())
		delete pobj;
	m_DamageObjectTableParty.RemoveAll();
}

void CDistributer::AddDamageObject(CPlayer* pPlayer, DWORD damage, DWORD plusdamage)
{
	if(pPlayer->GetPartyIdx()) //颇萍盔捞搁 颇萍单固瘤俊 敲矾胶
	{
		DoAddDamageObj(&m_DamageObjectTableParty, pPlayer->GetPartyIdx(), damage+plusdamage);
	}
	DoAddDamageObj(&m_DamageObjectTableSolo, pPlayer->GetID(), damage+plusdamage);	

	if(plusdamage != 0)
	{
		m_PlusDamage = plusdamage;
		m_1stPlayerID = pPlayer->GetID();
		m_1stPartyID = pPlayer->GetPartyIdx();
	}
}

void CDistributer::DoAddDamageObj(CYHHashTable<DAMAGEOBJ> * pTable, DWORD dwID, DWORD damage)
{
	DAMAGEOBJ* pDObj;
	pDObj = pTable->GetData(dwID);
	if(pDObj != NULL)
	{
		pDObj->dwData += damage;
	}
	else
	{
		DAMAGEOBJ * newObj = new DAMAGEOBJ;
		newObj->dwID = dwID;
		newObj->dwData = damage;
		
		pTable->Add(newObj, newObj->dwID);
	}
}

void CDistributer::Distribute(DWORD KillerID,VECTOR3* pKilledPosition, WORD DropItemID, DWORD DropItemRatio,CMonster* pMob)
{
	DAMAGEOBJ *obj;
	DWORD Exp = 0;
	CPlayer* pReceivePlayer;
	
	DWORD BigPlayerID; //单固瘤甫 啊厘 腹捞 拎辑 荐访摹客 酒捞袍 啊廉哎 荤恩/颇萍
	DWORD BigPartyID;
	DWORD BigPlayerDamage, BigPartyDamage;
	BigPlayerID = BigPartyID = BigPlayerDamage = BigPartyDamage = 0;
	
	//贾肺 抛捞喉 八荤
	m_DamageObjectTableSolo.SetPositionHead();
	while(obj = m_DamageObjectTableSolo.GetData())
	{
		if(obj->dwData == 0)
			continue;
		////酒捞袍苞 荐访摹 罐阑 荤恩 急琶窍扁 困秦 啊厘 奴 单固瘤 霖 荤恩 急琶
		ChooseOne(obj, &BigPlayerDamage, &BigPlayerID);

		pReceivePlayer = (CPlayer *)g_pUserTable->FindUser(obj->dwID);
		if(Chk(pReceivePlayer, pKilledPosition, pMob->GetGridID()) == FALSE)
			continue;
		if(obj->dwID == m_1stPlayerID)
		{
			obj->dwData -= m_PlusDamage;
		}
		if(pReceivePlayer->GetPartyIdx())
			continue;
		if( pMob->GetSMonsterList()->ExpPoint)	//龋冠 魂鸥
			Exp = CalcObtainExp(pMob->GetLevel() ,pReceivePlayer->GetLevel(),pMob->GetSMonsterList()->Life,obj->dwData);
		else
			Exp = 0;
		if(Exp == 0)
			continue;

		// 俺牢俊霸 版氰摹 焊晨
		DISTRIBUTERAND->SendToPersonalExp(pReceivePlayer, Exp);
	}
	
	//颇萍
	DAMAGEOBJ* pPobj = NULL;
	CParty* pParty;
	m_DamageObjectTableParty.SetPositionHead();
	while(pPobj = m_DamageObjectTableParty.GetData())
	{
		////奴 单固瘤 霖 颇萍 急琶
		ChooseOne(pPobj, &BigPartyDamage, &BigPartyID);

		pParty = PARTYMGR->GetParty(pPobj->dwID);
		if(pParty==NULL) //颇萍啊 秦魂灯栏搁 continue
			continue;
		if(pPobj->dwData == 0)
			continue;
		if(pParty->GetPartyIdx() == m_1stPartyID)
		{
			pPobj->dwData -= m_PlusDamage;
		}

		if( pMob->GetSMonsterList()->ExpPoint)	//龋冠 魂鸥		
			CalcAndSendPartyExp(pParty, pPobj->dwData, pKilledPosition, pMob->GetSMonsterList()->Life, pMob->GetGridID(), KillerID, pMob->GetLevel());
	}

	//abil and item
	pReceivePlayer = (CPlayer *)g_pUserTable->FindUser(BigPlayerID);
	pParty = PARTYMGR->GetParty(BigPartyID);

	if(BigPartyDamage < BigPlayerDamage) //俺牢俊霸 焊晨
	{
		SendPersonalAbilandItem(pReceivePlayer, pMob, DropItemID, DropItemRatio);
	}
	else if(BigPartyDamage == BigPlayerDamage) //单固瘤啊 鞍栏搁 罚待栏肺 急琶
	{ 
		int rate = rand()%2;
		if(pParty)
		if(pParty->IsPartyMember(BigPlayerID) == TRUE)
		{
			SendPartyAbilandItem(pParty, pKilledPosition, pMob->GetGridID(), pMob->GetLevel(), DropItemID, DropItemRatio, (MONSTEREX_LIST *)pMob->GetSMonsterList(), pMob->GetMonsterKind());
		}		
		else if(rate == 0)
		{
			SendPersonalAbilandItem(pReceivePlayer, pMob, DropItemID, DropItemRatio);
		}
		else //颇萍俊霸
		{	
			SendPartyAbilandItem(pParty, pKilledPosition, pMob->GetGridID(), pMob->GetLevel(), DropItemID, DropItemRatio, (MONSTEREX_LIST *)pMob->GetSMonsterList(), pMob->GetMonsterKind());
		}
	}
	else //颇萍俊霸
	{
		SendPartyAbilandItem(pParty, pKilledPosition, pMob->GetGridID(), pMob->GetLevel(), DropItemID, DropItemRatio, (MONSTEREX_LIST *)pMob->GetSMonsterList(), pMob->GetMonsterKind());
	}
	Release();
}

void CDistributer::CalcAndSendPartyExp(CParty* pParty, DWORD TotalDamage, VECTOR3* pKilledPosition, DWORD MonsterTotalLife, DWORD GridID, DWORD KillerID, LEVELTYPE MonsterLevel)
{
	DAMAGEOBJ *obj = NULL;
	CPlayer* pPlayer[MAX_PARTY_LISTNUM] = {0,};
	DWORD PlayerID;
	float levelavg = 0;
	LEVELTYPE maxlevel = 0;  
	LEVELTYPE curlevel = 0;
	DWORD onlinenumconfirm = 0;	
	
	for(int n=0;n<MAX_PARTY_LISTNUM;++n)
	{
		PlayerID = pParty->GetMemberID(n);
		if(PlayerID == 0)
			continue; 
		pPlayer[n] = (CPlayer*)g_pUserTable->FindUser(PlayerID);
		if(Chk(pPlayer[n], pKilledPosition,GridID) == FALSE)
			continue;
		
		++onlinenumconfirm;
		curlevel = pPlayer[n]->GetLevel();
		if(maxlevel < curlevel)
			maxlevel = curlevel;
		levelavg += curlevel;		
	}
	
	levelavg /= (float)onlinenumconfirm;
	
	EXPTYPE partyexp = CalcObtainExp(MonsterLevel,maxlevel,MonsterTotalLife ,TotalDamage);
	EXPTYPE exp=0;
	if(partyexp == 0)
		return;
	
	for(n=0;n<MAX_PARTY_LISTNUM;++n)
	{		
		if(Chk(pPlayer[n],pKilledPosition,GridID) == FALSE)
			continue;
				
		curlevel = pPlayer[n]->GetLevel();
		if(onlinenumconfirm != 1)
			exp = partyexp * ( curlevel * (10 + onlinenumconfirm) / 9.f / (float)levelavg ) 
									/ (float)onlinenumconfirm;
		else
			exp = partyexp;
		if(exp == 0)
			continue;

		// 颇萍版氰摹 厚啦 眠啊 - RaMa 04.11.24
		exp *= gPartyExpRate;

		DISTRIBUTERAND->SendToPersonalExp(pPlayer[n], exp);
	}
}

DWORD CDistributer::CalcObtainExp(LEVELTYPE MonsterLevel,LEVELTYPE KillerLevel,DWORD TotalLife,DWORD Damage)
{
	if(KillerLevel >= MonsterLevel + 6)
		return 0;
	else if(KillerLevel <= MonsterLevel - 9)
		MonsterLevel = KillerLevel + 9;

	DWORD ObtainPoint = ATTACKMGR->GetAttackCalc().GetPlayerPoint(MonsterLevel,MonsterLevel - KillerLevel);
	/*
	啊)	1		= 100% 单固瘤 : 版氰摹 100%
	唱)	0.8~1	= 80%~100%固父 单固瘤 : 版氰摹 80%
	促)	0.6~0.8	= 60%~80% 固父 单固瘤 : 版氰摹 60%
	扼)	0.4~0.6			40%~60% 固父 单固瘤 : 版氰摹 40%
	付)	0.2~0.4			20%~40% 固父 单固瘤 : 版氰摹 20%
	官)	0~0.2			20%固父 : 版氰摹 绝澜.
	*/
	DWORD perc = Damage*100 / TotalLife;
	if( (100 <= perc) )
	{
		ObtainPoint = ObtainPoint;
	}
	else if( (80 <= perc) && (perc < 100) )
	{
		ObtainPoint = (DWORD)(ObtainPoint*0.8);
	}
	else if( (60 <= perc) && (perc < 80) )
	{
		ObtainPoint = (DWORD)(ObtainPoint*0.6);
	}
	else if( (40 <= perc) && (perc < 60) )
	{
		ObtainPoint = (DWORD)(ObtainPoint*0.4);
	}
	else if( (20 <= perc) && (perc < 40) )
	{
		ObtainPoint = (DWORD)(ObtainPoint*0.2);
	}
	else
	{
		ObtainPoint = 0;
	}

	return ObtainPoint;
}

BOOL CDistributer::Chk(CPlayer* pPlayer, VECTOR3* pKilledPosition, DWORD GridID)
{
	VECTOR3* PlayerPosition;
	if(!pPlayer)	
		return FALSE;
	if(pPlayer->GetInitState() != PLAYERINITSTATE_INITED)
		return FALSE;
	if(pPlayer->IsVimuing() == TRUE)
		return FALSE;
	PlayerPosition = CCharMove::GetPosition(pPlayer);
	if(CalcDistanceXZ(pKilledPosition, PlayerPosition) > POINT_VALID_DISTANCE)
		return FALSE;
	if(pPlayer->GetState() == eObjectState_Die)
		return FALSE;
	if(pPlayer->GetGridID() != GridID)
		return FALSE;
	return TRUE;
}

void CDistributer::ChooseOne(DAMAGEOBJ * pobj, DWORD* pBigDamage, DWORD* pBigID)
{
	if(*pBigDamage < pobj->dwData)
	{
		*pBigDamage = pobj->dwData;
		*pBigID = pobj->dwID;
	}
	else if(*pBigDamage == pobj->dwData)
	{
		int rate = rand() % 2;
		if(rate == 1)
			*pBigID = pobj->dwID;
	}
}

void CDistributer::GetReceivePartyMember(PARTY_RECEIVE_MEMBER* rtInfo, CParty* pParty, VECTOR3* pKilledPosition, DWORD GridID)
{
	int count=0;
	DWORD PlayerID;
	DAMAGEOBJ* pobj;
	CPlayer* pPlayer;
	for(int n=0;n<MAX_PARTY_LISTNUM;++n)
	{
		PlayerID = pParty->GetMemberID(n);
		if(PlayerID == 0)
			continue; 
		pPlayer = (CPlayer*)g_pUserTable->FindUser(PlayerID);
		if(Chk(pPlayer,pKilledPosition,GridID) == FALSE)
			continue;
		
		pobj = m_DamageObjectTableSolo.GetData(PlayerID);
		if(pobj == 0)
			continue;
		
		rtInfo->pPlayer[count] = pPlayer;
		rtInfo->Damage[count] = pobj->dwData;;
		count++;
	}
	rtInfo->count = count;
}

void CDistributer::SendPersonalAbilandItem(CPlayer* pReceivePlayer, CMonster* pMonster, WORD DropItemID, DWORD DropItemRatio)
{
	if(pReceivePlayer == 0)
	{		
		Release();
		return;
	}
	//版氰摹啊 0捞搁 漂扁 荐访摹档 救霖促. (ex: 龋冠捞亥飘)
	if(pMonster->GetSMonsterList()->ExpPoint)
		DISTRIBUTERAND->SendToPersonalAbil(pReceivePlayer, pMonster->GetLevel());
	DISTRIBUTERAND->SendToPersonalItem(pReceivePlayer, DropItemID, DropItemRatio, (MONSTEREX_LIST *)pMonster->GetSMonsterList(), pMonster->GetMonsterKind());
}

void CDistributer::SendPartyAbilandItem(CParty* pParty, VECTOR3* pKilledPosition, DWORD GridID, LEVELTYPE MonsterLevel,
										WORD DropItemId, DWORD DropItemRatio, MONSTEREX_LIST * pMonInfo, WORD MonsterKind)
{
	if(!pParty)
	{
		Release();
		return;
	}
	PARTY_RECEIVE_MEMBER MemberInfo;
	GetReceivePartyMember(&MemberInfo, pParty, pKilledPosition, GridID);

	//版氰摹啊 0捞搁 漂扁 荐访摹档 救霖促. (ex: 龋冠捞亥飘)
	if(pMonInfo->ExpPoint)
		pParty->SendAbil(MonsterLevel, &MemberInfo);
	pParty->SendItem(&MemberInfo, DropItemId, DropItemRatio, pMonInfo, MonsterKind);
}

⌨️ 快捷键说明

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