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

📄 dropmanager.cpp

📁 奇迹世界 部分源代码奇迹世界 部分源代码奇迹世界 部分源代码
💻 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 + -