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