#pragma once #include "DnObserver.h" #include "SmartPtrDef.h" #include "DNTableFile.h" class CPacketCompressStream; namespace BubbleSystem { class CDnBubble; class IDnConditionChecker; class IDnBubbleEventHandler; //------------------------------------------------------------------------------ /** ¹öºí ½Ã½ºÅÛ ±¸ÇöÇÑ Å¬·¡½º. ÀÌ Å¬·¡½º´Â Ŭ¶óÀÌ¾ðÆ®¿Í °ÔÀÓ¼­¹ö¿¡¼­ CDnPlayerActor ¿¡¼­ Çϳª¾¿ °®°í ÀÖÀ¸¸ç µ¥ÀÌÅÍ¿¡ Á¤ÀÇµÈ ´ë·Î Ç÷¹À̾îÀÇ ¹öºí ȹµæ, À¯Áö, ¼Ò¸ð¸¦ ó¸®ÇÑ´Ù. ij¸¯ÅÍÀÇ Á÷¾÷º°·Î ³»¿ëÀÌ ´Ù¸¦ ¼ö ÀÖ´Ù. ÃßÈÄ¿¡ ¸ó½ºÅÍ ½º½º·Îµµ ¹öºíÀ» ½×°Ô µÈ´Ù¸é CDnMonsterActor ÂÊ¿¡¼­µµ ¸â¹ö·Î °®°í ó¸®ÇØÁà¾ß ÇÑ´Ù. */ //------------------------------------------------------------------------------ class CDnBubbleSystem : public CDnObserver { public: struct S_CREATE_BUBBLE { int iBubbleTypeID; int iIconIndex; float fDurationTime; int iServerBubbleCount; // Ŭ¶óÀÌ¾ðÆ®¿¡¼­¸¸ »ç¿ëÇÔ. ¼­¹ö¿Í °¹¼ö°¡ ´Ù¸¦ °æ¿ì º¸Á¤ÇØÁÖ±â À§Çؼ­ »ç¿ëÇÔ. S_CREATE_BUBBLE( void ) : iBubbleTypeID( 0 ), iIconIndex( 0 ), fDurationTime( 0.0f ), iServerBubbleCount( 0 ) {}; }; // ¿ÜºÎ¿¡¼­ Á¶È¸ÇÒ ¼ö ÀÖ´Â ¹öºí Á¤º¸. 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: // ÀÌ ¹öºí ½Ã½ºÅÛ °´Ã¼¸¦ °®°í ÀÖ´Â ¾×ÅÍ DnActorHandle m_hActor; // ¿ì¼± ¸ÕÀú Ãß°¡µÈ ¹öºí ¼ø´ë·Î ³ªÁß¿¡ Á¦°Å µÈ´Ù. //vector m_vlpBubbles; typedef map > BubblesByTypeID; typedef BubblesByTypeID::iterator BubblesByTypeID_iter; BubblesByTypeID m_mapBubblesByTypeID; // ¹öºí Å×ÀÌºí¿¡ Á¤ÀÇµÈ À̺¥Æ® Á¤º¸¸¦ ¸ð¾Æ³õÀº ±¸Á¶Ã¼ struct S_DEFINED_BUBBLE_EVENT { int iTableID; // ¹öºí Å×À̺í ID vector vlpConditions; vector vlpEventHandlers; S_DEFINED_BUBBLE_EVENT( void ) : iTableID( 0 ) {}; ~S_DEFINED_BUBBLE_EVENT( void ); }; // Å×À̺í ID ±âÁØÀ¸·Î Á¤¸®µÈ À̺¥Æ® Á¤º¸ //map m_mapDefinedBubbleEvent; vector m_vlpDefinedBubbleEvent; // °¢ À̺¥Æ® ŸÀÔº°·Î ¸ð¾Æ ³õÀº À̺¥Æ® Á¤ÀÇ Á¤º¸ // À̺¥Æ®¿¡¼­ »ç¿ëµÇ´Â Á¶°Ç Á¤º¸µéÀº ¿ÜºÎ µ¥ÀÌÅÍ¿¡¼­ Á¤ÀǵǴ Á¤º¸°¡ ¾Æ´Ï¹Ç·Î // ÀÌ·¸°Ô ¿¬°ü¼º¿¡ ´ëÇØ¼­ Äڵ忡 ¹Ú¾Æ³õ´Â´Ù. typedef multimap DefinedByEventMMap; typedef DefinedByEventMMap::iterator DefinedByEventMMap_iter; DefinedByEventMMap m_mmapDefinedByEvent; // ¹öºí ŸÀÔº°·Î ¼Ò¸ð½Ã 󸮵Ǵ À̺¥Æ® Çڵ鷯 ¸ðÀ½. // ¹öºí ¼Ò¸ð½Ã À̺¥Æ®´Â µû·Î Å×ÀÌºí¿¡¼­ Á¤ÀÇÇÏÁö ¾Ê°í Á¶°Ç¿¡ ´ëÇØ¼­ Äڵ忡¼­ Á÷Á¢ ¹èÄ¡ÇÑ´Ù. //map m_mapBubbleRemoveEventHandlers; // ¹öºí·Î Ãß°¡µÈ »óÅÂÈ¿°úµé. map > m_mapBubbleStateBlowsByBubbleType; // ¹öºí ŸÀÔº°·Î ¼Ò¸ðµÇ´Â ¹æ½Ä. // ŸÀÔº°·Î ¹öºíÀ» À¯ÁöÇÒ °æ¿ì »ý¼ºµÇ´Â È¿°ú. 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: ±¸Á¶Ã¼·Î ÇÊ¿äÇÑ Á¤º¸¸¦ ¿ÜºÎ¿¡¼­ ¹Þ´Â´Ù. Á÷¾÷ È÷½ºÅ丮, ½ºÅ³ ¸®½ºÆ® µîµî.. void Initialize( DnActorHandle hActor ); // TODO: ij¸¯ÅͰ¡ ÀüÁ÷À» Çϰųª ÇÏ´Â °æ¿ì µ¥ÀÌÅ͸¦ ¸ðµÎ ¸®¼ÂÇÏ°í ´Ù½Ã ÃʱâÈ­ ÇØ¾ß ÇÔ. void Clear( void ); // ÀÎÀÚ·Î ¹ÞÀº ¹öºí ŸÀÔ ID ¿¡ ÇØ´çµÇ´Â °¹¼ö¸¦ ¸®ÅÏÇÑ´Ù. int GetBubbleCountByTypeID( int iBubbleTypeID ); // ÇöÀç Ãß°¡µÇ¾îÀÖ´Â ¹öºí ŸÀÔÀÇ °¹¼ö void GetAllAppliedBubbles( /*OUT*/ vector& vlBubbleInfos ); // ¹öºí Ãß°¡ void AddBubble( const S_CREATE_BUBBLE& Info ); // Ŭ¶óÀÌ¾ðÆ®¿¡¼­¸¸ »ç¿ë void AddBubbleAndCountRevision( const S_CREATE_BUBBLE& Info ); void RevisionBubbleCount( const S_CREATE_BUBBLE& Info ); // ÀÎÀÚ·Î ¹ÞÀº ¹öºí ŸÀÔ ID ¿¡ ÇØ´çµÇ´Â ¹öºí °¹¼ö¸¸Å­ Á¦°Å. void RemoveBubbleByTypeID( int iBubbleTypeID, int iRemoveCount ); // ÀÎÀÚ·Î ¹ÞÀº ¹öºí ŸÀÔ ID ¿¡ ÇØ´çµÇ´Â ¹öºí ¸ðµÎ Á¦°Å. void RemoveAllBubbleByTypeID( int iBubbleTypeID ); // ¹öºí ¸ðµÎ »èÁ¦. void RemoveAllBubbles( bool bHandleRemoveEvent = true ); // ¹öºí ŸÀÔ¿¡ ÇØ´çµÇ´Â ¹öºí °´Ã¼ ¾ò¾î¿À±â. CDnBubble* GetBubble( int iBubbleTypeID ); // ƯÁ¤ ŸÀÔÀÇ ¹öºíÀÇ Áö¼Ó½Ã°£À» ÀÎÀÚ·Î ÁÖ¾îÁø ½Ã°£À¸·Î ¼ÂÆÃÇÔ. void SetDurationTime( int iBubbleTypeID, float fDurationTime ); // ÇÁ·Î¼¼½º~ void Process( LOCAL_TIME LocalTime, float fDelta ); // from CDnObserver virtual void OnEvent( boost::shared_ptr<::IDnObserverNotifyEvent>& pEvent ); // ÀÌ ¹öºí ½Ã½ºÅÛÀ» °®°í ÀÖ´Â ¾×ÅÍÀÇ ÇÚµéÀ» ¾òÀ½ DnActorHandle GetHasActor( void ) { return m_hActor; }; #ifdef _GAMESERVER // CDnAddStateEffectHandler ¿¡¼­¸¸ È£ÃâµÊ. void AddBubbleStateBlow( int iBubbleTypeID, int iBlowID ); // CDnRemoveStateEffectHandler ¿¡¼­¸¸ È£ÃâµÊ. void RemoveBubbleStateBlow( int iBubbleTypeID ); #else void CreateBubbleFromPacketStream( ::CPacketCompressStream* pStream ); void RefreshBubbleDurationTimeFromPacketStream( ::CPacketCompressStream* pStream ); #endif // #ifdef _GAMESERVER }; } // namespace BubbleSystem