DragonNest/GameCommon/DnBubbleSystem.h

167 lines
5.3 KiB
C
Raw Normal View History

2024-12-19 09:48:26 +08:00
#pragma once
#include "DnObserver.h"
#include "SmartPtrDef.h"
#include "DNTableFile.h"
class CPacketCompressStream;
namespace BubbleSystem
{
class CDnBubble;
class IDnConditionChecker;
class IDnBubbleEventHandler;
//------------------------------------------------------------------------------
/**
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ý<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ŭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
<EFBFBD><EFBFBD> Ŭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ŭ<EFBFBD><EFBFBD><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>Ӽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> CDnPlayerActor <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ϳ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϳ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ǵ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>÷<EFBFBD><EFBFBD>̾<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> ȹ<EFBFBD><EFBFBD>, <EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <EFBFBD>Ҹ<EFBFBD><EFBFBD><EFBFBD> ó<EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
ij<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ٸ<EFBFBD> <EFBFBD><EFBFBD> <EFBFBD>ִ<EFBFBD>.
<EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ε<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>װ<EFBFBD> <EFBFBD>ȴٸ<EFBFBD> CDnMonsterActor <EFBFBD>ʿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> ó<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>Ѵ<EFBFBD>.
*/
//------------------------------------------------------------------------------
class CDnBubbleSystem : public CDnObserver
{
public:
struct S_CREATE_BUBBLE
{
int iBubbleTypeID;
int iIconIndex;
float fDurationTime;
int iServerBubbleCount; // Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٸ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD> <20><><EFBFBD>ؼ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
S_CREATE_BUBBLE( void ) : iBubbleTypeID( 0 ), iIconIndex( 0 ), fDurationTime( 0.0f ), iServerBubbleCount( 0 ) {};
};
// <20>ܺο<DCBA><CEBF><EFBFBD> <20><>ȸ<EFBFBD><C8B8> <20><> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
struct S_BUBBLE_INFO
{
int iBubbleTypeID;
int iCount;
int iIconIndex;
float fDurationTime;
float fRemainTime;
S_BUBBLE_INFO( void ) : iBubbleTypeID( 0 ), iCount( 0 ), iIconIndex( 0 ), fDurationTime( 0.0f ), fRemainTime( 0.0f ) {};
};
private:
// <20><> <20><><EFBFBD><EFBFBD> <20>ý<EFBFBD><C3BD><EFBFBD> <20><>ü<EFBFBD><C3BC> <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD>
DnActorHandle m_hActor;
// <20><20><><EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>߿<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ȴ<EFBFBD>.
//vector<CDnBubble*> m_vlpBubbles;
typedef map<int, deque<CDnBubble*> > BubblesByTypeID;
typedef BubblesByTypeID::iterator BubblesByTypeID_iter;
BubblesByTypeID m_mapBubblesByTypeID;
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD>̺<EFBFBD><CCBA><EFBFBD> <20><><EFBFBD>ǵ<EFBFBD> <20>̺<EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ƴ<EFBFBD><C6B3><EFBFBD> <20><><EFBFBD><EFBFBD>ü
struct S_DEFINED_BUBBLE_EVENT
{
int iTableID; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD>̺<EFBFBD> ID
vector<IDnConditionChecker*> vlpConditions;
vector<IDnBubbleEventHandler*> vlpEventHandlers;
S_DEFINED_BUBBLE_EVENT( void ) : iTableID( 0 ) {};
~S_DEFINED_BUBBLE_EVENT( void );
};
// <20><><EFBFBD>̺<EFBFBD> ID <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̺<EFBFBD>Ʈ <20><><EFBFBD><EFBFBD>
//map<int, S_DEFINED_BUBBLE_EVENT*> m_mapDefinedBubbleEvent;
vector<S_DEFINED_BUBBLE_EVENT*> m_vlpDefinedBubbleEvent;
// <20><> <20>̺<EFBFBD>Ʈ Ÿ<>Ժ<EFBFBD><D4BA><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>̺<EFBFBD>Ʈ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
// <20>̺<EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ܺ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ϳ<EFBFBD><CDBF><EFBFBD> <20><><EFBFBD>ǵǴ<C7B5> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴϹǷ<CFB9>
// <20>̷<EFBFBD><CCB7><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ؼ<EFBFBD> <20>ڵ忡 <20>ھƳ<DABE><C6B3>´<EFBFBD>.
typedef multimap<int, S_DEFINED_BUBBLE_EVENT*> DefinedByEventMMap;
typedef DefinedByEventMMap::iterator DefinedByEventMMap_iter;
DefinedByEventMMap m_mmapDefinedByEvent;
// <20><><EFBFBD><EFBFBD> Ÿ<>Ժ<EFBFBD><D4BA><EFBFBD> <20>Ҹ<EFBFBD><D2B8><EFBFBD> ó<><C3B3><EFBFBD>Ǵ<EFBFBD> <20>̺<EFBFBD>Ʈ <20>ڵ鷯 <20><><EFBFBD><EFBFBD>.
// <20><><EFBFBD><EFBFBD> <20>Ҹ<EFBFBD><D2B8><EFBFBD> <20>̺<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>̺<EFBFBD><CCBA><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʰ<EFBFBD> <20><><EFBFBD>ǿ<EFBFBD> <20><><EFBFBD>ؼ<EFBFBD> <20>ڵ忡<DAB5><E5BFA1> <20><><EFBFBD><EFBFBD> <20><>ġ<EFBFBD>Ѵ<EFBFBD>.
//map<int, IDnBubbleEventHandler*> m_mapBubbleRemoveEventHandlers;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD>.
map<int, vector<int> > m_mapBubbleStateBlowsByBubbleType;
// <20><><EFBFBD><EFBFBD> Ÿ<>Ժ<EFBFBD><D4BA><EFBFBD> <20>Ҹ<EFBFBD><D2B8>Ǵ<EFBFBD> <20><><EFBFBD><EFBFBD>.
// Ÿ<>Ժ<EFBFBD><D4BA><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD> ȿ<><C8BF>.
protected:
void _CreateBubble( const S_CREATE_BUBBLE& Info );
CDnBubble* _CreateNewBubble( const S_CREATE_BUBBLE &Info );
void _OnCreatedBubble( CDnBubble* pCreatedBubble );
//void _OnRemoveBubble( CDnBubble* pBubbleToRemove );
void _OnRemovedBubbles( int iBubbleTypeID, int iCount );
int _GetRelatedEventMessageType( int iConditionType );
void _OnCreateEventHandler( DNTableFileFormat* pBubbleTable, int iBubbleTableID, IDnBubbleEventHandler* pEventHandler, const char* pArgument );
public:
CDnBubbleSystem( void );
virtual ~CDnBubbleSystem( void );
// TODO: <20><><EFBFBD><EFBFBD>ü<EFBFBD><C3BC> <20>ʿ<EFBFBD><CABF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ܺο<DCBA><CEBF><EFBFBD> <20>޴´<DEB4>. <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>丮, <20><>ų <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD>..
void Initialize( DnActorHandle hActor );
// TODO: ij<><C4B3><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϰų<CFB0> <20>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20>ٽ<EFBFBD> <20>ʱ<EFBFBD>ȭ <20>ؾ<EFBFBD> <20><>.
void Clear( void );
// <20><><EFBFBD>ڷ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Ÿ<><C5B8> ID <20><> <20>ش<EFBFBD><D8B4>Ǵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
int GetBubbleCountByTypeID( int iBubbleTypeID );
// <20><><EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0>Ǿ<EFBFBD><C7BE>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> Ÿ<><C5B8><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
void GetAllAppliedBubbles( /*OUT*/ vector<S_BUBBLE_INFO>& vlBubbleInfos );
// <20><><EFBFBD><EFBFBD> <20>߰<EFBFBD>
void AddBubble( const S_CREATE_BUBBLE& Info );
// Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
void AddBubbleAndCountRevision( const S_CREATE_BUBBLE& Info );
void RevisionBubbleCount( const S_CREATE_BUBBLE& Info );
// <20><><EFBFBD>ڷ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Ÿ<><C5B8> ID <20><> <20>ش<EFBFBD><D8B4>Ǵ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ŭ <20><><EFBFBD><EFBFBD>.
void RemoveBubbleByTypeID( int iBubbleTypeID, int iRemoveCount );
// <20><><EFBFBD>ڷ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Ÿ<><C5B8> ID <20><> <20>ش<EFBFBD><D8B4>Ǵ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
void RemoveAllBubbleByTypeID( int iBubbleTypeID );
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
void RemoveAllBubbles( bool bHandleRemoveEvent = true );
// <20><><EFBFBD><EFBFBD> Ÿ<>Կ<EFBFBD> <20>ش<EFBFBD><D8B4>Ǵ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ü <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
CDnBubble* GetBubble( int iBubbleTypeID );
// Ư<><C6AF> Ÿ<><C5B8><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ӽð<D3BD><C3B0><EFBFBD> <20><><EFBFBD>ڷ<EFBFBD> <20>־<EFBFBD><D6BE><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
void SetDurationTime( int iBubbleTypeID, float fDurationTime );
// <20><><EFBFBD>μ<EFBFBD><CEBC><EFBFBD>~
void Process( LOCAL_TIME LocalTime, float fDelta );
// from CDnObserver
virtual void OnEvent( boost::shared_ptr<::IDnObserverNotifyEvent>& pEvent );
// <20><> <20><><EFBFBD><EFBFBD> <20>ý<EFBFBD><C3BD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ڵ<EFBFBD><DAB5><EFBFBD> <20><><EFBFBD><EFBFBD>
DnActorHandle GetHasActor( void ) { return m_hActor; };
#ifdef _GAMESERVER
// CDnAddStateEffectHandler <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ȣ<><C8A3><EFBFBD><EFBFBD>.
void AddBubbleStateBlow( int iBubbleTypeID, int iBlowID );
// CDnRemoveStateEffectHandler <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ȣ<><C8A3><EFBFBD><EFBFBD>.
void RemoveBubbleStateBlow( int iBubbleTypeID );
#else
void CreateBubbleFromPacketStream( ::CPacketCompressStream* pStream );
void RefreshBubbleDurationTimeFromPacketStream( ::CPacketCompressStream* pStream );
#endif // #ifdef _GAMESERVER
};
} // namespace BubbleSystem