📄 dropmanager.cpp
字号:
#include "StdAfx.h"
#include ".\DropManager.h"
#include ".\ObjectFactory.h"
#include ".\Item.h"
#include "Map.h"
#include ".\Field.h"
#include <PacketStruct_DG.h>
#include <Protocol_DG.h>
#include "Player.h"
#include <misc.h>
#include "GameHuntingRoom.h"
#include "GameServer.h"
#include "ItemManager.h"
DropManager g_DropManager;
//-------------------------------------------------------------------------------------------------------------------------
// 敲饭捞绢 饭骇 钦(林格利)苞 敲饭捞绢 荐 眉农(<-夸扒Field俊窃荐绝绢辑鞍捞风橇倒锭弊成沁澜)
//-------------------------------------------------------------------------------------------------------------------------
class PlayerLevelSum
{
float m_limitDistance;
LEVELTYPE m_LevelSum;
DWORD m_dwPlayerNum;
const WzVector * m_OrgPos;
public:
PlayerLevelSum():m_LevelSum(0),m_dwPlayerNum(0),m_limitDistance(0.0f),m_OrgPos(NULL){}
~PlayerLevelSum(){}
inline VOID SetOrgPos( const WzVector * pOrgPos, float limitDistance ) { m_OrgPos = pOrgPos; m_limitDistance = limitDistance; }
inline LEVELTYPE GetLevelSum() { return m_LevelSum; }
inline DWORD GetPlayerNum() { return m_dwPlayerNum;}
VOID operator () ( Player * pPlayer )
{
if( m_limitDistance == 0.0f )
{
m_LevelSum = m_LevelSum + pPlayer->GetLevel();
++m_dwPlayerNum;
}
else
{
if( pPlayer->GetDist(*m_OrgPos) < m_limitDistance )
{
m_LevelSum = m_LevelSum + pPlayer->GetLevel();
++m_dwPlayerNum;
}
}
}
};
DropManager::DropManager()
{
m_DelayDropItemList.Initialize(100);
}
DropManager::~DropManager()
{
Release();
}
VOID DropManager::Release()
{
Item * pDropItem = NULL;
m_DelayDropItemList.SetFirst();
while( pDropItem = m_DelayDropItemList.GetNext() )
{
ObjectFactory::Instance()->FreeObject(pDropItem);
}
m_DelayDropItemList.RemoveAll();
}
VOID DropManager::Initialize( TCHAR * tszItemDropPerGradeFile, TCHAR * tszItemDropInfoFile, TCHAR * tszRareItemDropInfoFile )
{
DropFormulaCore::Init( tszItemDropPerGradeFile, tszItemDropInfoFile, tszRareItemDropInfoFile );
}
VOID DropManager::Drop( Field * pField, DWORD SectorIndex, const WzVector * pOrgPos, Player * pOwner, DWORD dwMonsterKey, BASE_NPCINFO * pMonsterInfo, eNPC_GRADE MonsterGrade, LEVELTYPE MonsterDisplayLV )
{
ASSERT( MonsterGrade < eNPC_GRADE_MAX );
if( MonsterGrade >= eNPC_GRADE_MAX ) return;
DWORD dwPlayerKey = 0;
if( pOwner ) dwPlayerKey = pOwner->GetObjectKey();
FLOAT PlusBonusPercent = 1.0f;
// (清泼:固记) 备盒
PlayerLevelSum sum;
GameZone * pZone = pField->GetMap()->GetGameZone();
if( pZone->GetZoneType() == eZONETYPE_MISSION )
{
pField->ForeachPlayer( sum );
}
else if( pZone->GetZoneType() == eZONETYPE_HUNTING )
{
// 15m馆版捞郴
sum.SetOrgPos(pOrgPos, 15.0f);
pField->ForeachNeighborPlayerAt( SectorIndex, sum );
// 清泼 焊呈胶 啊吝摹
GameHuntingRoom * pHuntingRoom = (GameHuntingRoom *)pZone;
if( pHuntingRoom->GetAdditionalInfo()->m_Bonus == eHUNTING_BONUS_TYPE_ITEM )
PlusBonusPercent = 1.1f;
}
else
{
// 15m馆版捞郴
sum.SetOrgPos(pOrgPos, 15.0f);
// 付阑俊辑 捞亥飘肺 阁胶磐甫 棱阑 锭
pField->ForeachNeighborPlayerAt( SectorIndex, sum );
}
// 蜡历 饭骇 拌魂
DWORD PlayerNum = sum.GetPlayerNum();
if( 0 == PlayerNum ) return;
LEVELTYPE LevelSum = sum.GetLevelSum();
DWORD LevelAvrg = (LevelSum / PlayerNum);
if( 0 == LevelAvrg ) return ;
MONEY DroppedMoney = 0;
SCItemSlot DroppedItemSlot;
eDROP_TYPE DroppedType;
if( DropFormulaCore::Drop( PlayerNum, MonsterGrade, MonsterDisplayLV, PlusBonusPercent, (LEVELTYPE)LevelAvrg, DroppedType, DroppedMoney, DroppedItemSlot ) )
{
switch(DroppedType)
{
case DROP_MONEY_1:
case DROP_MONEY_40:
case DROP_MONEY_400:
{
if( DroppedType == DROP_MONEY_40 || DroppedType == DROP_MONEY_400)
{
MONEY RemainMoney = DroppedMoney;
MONEY CurMoney = 0;
MONEY LastMoney = (MONEY)(DroppedMoney*0.06f);
// 掉饭捞 拎辑 冻绢 哆覆
INT i = 0;
while(1)
{
if( RemainMoney <= LastMoney)
break;
CurMoney = (MONEY)(DroppedMoney*random(3,5)/100);
if( RemainMoney < CurMoney )
break;
RemainMoney -= CurMoney;
if( CurMoney != 0 )
{
WzVector wzDropPos = pField->GetRandomPosInAround( pOrgPos, 3 );
DropMoneyToField( pField, &wzDropPos, dwPlayerKey, dwMonsterKey, CurMoney, 100*i );
g_pGameServer->PlusTotalPlus( CurMoney ); // 烹拌侩 扁废 巢变促(己泅芒)
}
++i;
}
if( RemainMoney != 0 )
{
WzVector wzDropPos = pField->GetRandomPosInAround( pOrgPos, 3 );
DropMoneyToField( pField, &wzDropPos, dwPlayerKey, dwMonsterKey, RemainMoney, 100*i );
g_pGameServer->PlusTotalPlus( RemainMoney ); // 烹拌侩 扁废 巢变促(己泅芒)
}
}
else
{
WzVector wzDropPos = pField->GetRandomPosInAround( pOrgPos, 2 );
DropMoneyToField( pField, &wzDropPos, dwPlayerKey, dwMonsterKey, DroppedMoney );
g_pGameServer->PlusTotalPlus( DroppedMoney ); // 烹拌侩 扁废 巢变促(己泅芒)
}
}
break;
case DROP_ITEM_0:
case DROP_ITEM_1:
case DROP_ITEM_2:
case DROP_ITEM_3:
case DROP_ITEM_4:
case DROP_ITEM_5:
case DROP_ITEM_6:
case DROP_ITEM_7:
case DROP_ITEM_8:
case DROP_ITEM_9:
case DROP_ITEM_10:
case DROP_RARE_ITEM:
{
// 珐农 酒捞袍老 版快 珐农 可记 嘿捞扁
BYTE MaxRank = DroppedItemSlot.GetRank();
DroppedItemSlot.SetRank( RANK_E );
for( INT RankIndex = RANK_E ; RankIndex < MaxRank ; ++RankIndex )
{
if( ItemManager::ItemRankUp( &DroppedItemSlot ) )
ItemManager::CreateRankItemSocketHole( &DroppedItemSlot, RankIndex );
}
WzVector wzDropPos = pField->GetRandomPosInAround( pOrgPos, 2 );
BOOL bRet = DropItemToField( pField, &wzDropPos, dwPlayerKey, dwMonsterKey, DroppedItemSlot );
if( bRet == TRUE)
{
// 阁胶磐 酒捞袍 靛而 肺弊 巢扁扁
GAMELOG->WriteMonsterItemDrop( g_pGameServer->GetServerGUID(), &DroppedItemSlot, pMonsterInfo->m_MonsterCode,
pMonsterInfo->m_Level, pField->GetMap()->GetMapCode(), (int)wzDropPos.x, (int)wzDropPos.y, (int)wzDropPos.z );
// 阁胶磐 酒捞袍 靛而 肺弊 巢扁扁 场
}
}
break;
}
}
if( DropFormulaCore::AdditionalItemDrop(pMonsterInfo->m_byItemDropRate, BASE_NPCINFO::MAX_DROPITEMCODE_NUM, pMonsterInfo->m_wDropItemRate, pMonsterInfo->m_ItemCode, DroppedItemSlot) )
{
WzVector wzDropPos = pField->GetRandomPosInAround( pOrgPos, 2 );
DropItemToField( pField, &wzDropPos, dwPlayerKey, dwMonsterKey, DroppedItemSlot );
}
}
BOOL DropManager::DropItemToField( Field * pField, const WzVector * pvPos, DWORD dwPlayerKey, DWORD dwFromMonsterKey, SCItemSlot & slot )
{
Item * pFieldItem = (Item *)ObjectFactory::Instance()->AllocObject( ITEM_OBJECT );
pFieldItem->CreateItem( dwPlayerKey, dwFromMonsterKey, slot );
return DropItem(pFieldItem, pField, pvPos);;
}
BOOL DropManager::DropMoneyToField( Field * pField, const WzVector * pvPos, DWORD dwPlayerKey, DWORD dwFromMonsterKey, MONEY & Money, DWORD DelayTime )
{
Item * pFieldMoneyItem = (Item *)ObjectFactory::Instance()->AllocObject( MONEY_OBJECT );
if( 0 == DelayTime )
{
pFieldMoneyItem->CreateMoney( dwPlayerKey, dwFromMonsterKey, Money );
return DropItem(pFieldMoneyItem, pField, pvPos);
}
else
{
pFieldMoneyItem->SetDropDelayTime( pField, const_cast<WzVector *>(pvPos), DelayTime );
AddDelayList( pFieldMoneyItem, pFieldMoneyItem->GetObjectKey() );
}
return TRUE;
}
BOOL DropManager::DropItem( Item * pDropItem, Field * pField, const WzVector * pvPos )
{
if( pField && !pField->EnterField( pDropItem, const_cast<WzVector *>(pvPos) ) )
{
ObjectFactory::Instance()->FreeObject( pDropItem );
SUNLOG( eCRITICAL_LOG, "[DropManager::DropItem] Item EnterField() is failed!!" );
return FALSE;
}
return TRUE;
}
VOID DropManager::Process()
{
Item * pDropItem = NULL;
m_DelayDropItemList.SetFirst();
while( pDropItem = m_DelayDropItemList.GetNext() )
{
if( pDropItem->IsDropDelayTimeout() )
{
DropItem( pDropItem, pDropItem->GetDropField(), pDropItem->GetDropPos() );
RemoveDelayList( pDropItem->GetObjectKey() );
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -