#ifndef _CTHREAT_H_ #define _CTHREAT_H_ #pragma once #pragma warning(disable:4800) #include class CAggresiveCreature; class CParty; class CThreat { public: enum Const { MAX_THREAT_TARGET = 10, // ¾²·¹Æ® ¸®½ºÆ®ÀÇ ÃÖ´ë °³Ã¼ ¼ö MAX_THREAT_REWARD = 3, // ¾²·¹Æ®¿¡ ÀÇÇØ °æÇèÄ¡ º¸»óÀ» ¹Þ´Â ÃÖ´ë ±×·ì ¼ö FAME_CONSENT_GAP = 5, // ¸í¼º ºÐ¹è Çã¿ë ·¹º§ Æø EXP_CONSENT_GAP = 14, // °æÇèÄ¡ ºÐ¹è Çã¿ë ·¹º§ Æø EXP_BALANCE_HANDLE = 14, // ÆÄƼ °æÇèÄ¡ ºÐ¹è¿ë ¹ë·±½º ÇÚµé MOVING_ATTACK_TAUNT_RATE = 3, // À̵¿ °ø°ÝÀÌ °¡´ÉÇÑ °Å¸®ÀÇ Å¸°Ù¿¡ ´ëÇÑ ¾²·¹Æ® °¡ÁßÄ¡ ATTACK_TAUNT_RATE = 6 // ÀÏ¹Ý °ø°ÝÀÌ °¡´ÉÇÑ °Å¸®ÀÇ Å¸°Ù¿¡ ´ëÇÑ ¾²·¹Æ® °¡ÁßÄ¡ }; enum AffectThreatType { TAUNT = 1, DETAUNT = 2 }; struct ThreatInfo { CAggresiveCreature* m_pCreature; long m_lThreatAmount; ThreatInfo() : m_pCreature(NULL), m_lThreatAmount(0) { } ThreatInfo(CAggresiveCreature* pCreature, long lThreatAmount) : m_pCreature(pCreature), m_lThreatAmount(lThreatAmount) { } }; struct AwardInfo { CAggresiveCreature* m_pCreature; CParty* m_pParty; long m_lAward; AwardInfo() : m_pCreature(NULL), m_pParty(NULL), m_lAward(0) { } AwardInfo(CAggresiveCreature* pCreature, CParty* pParty, long lAward) : m_pCreature(pCreature), m_pParty(pParty), m_lAward(lAward) { } }; struct SaveEnemyInfo { // ¸í¼º ¾îºä¡ ±ÝÁö ÀåÄ¡ (ÃÖ±Ù¿¡ ÀÚ½ÅÀ» Á×ÀΠij¸¯Å͸¦ ±â¾ïÇØµÐ´Ù.) enum { MAX_SAVING_ENEMY = 5, // ±â¾ïÇÏ´Â ÃÖ´ë °³Ã¼ ¼ö MAX_SAVING_TICKCOUNT = 300000, // ÇÑ °³Ã¼´ç ÃÖ´ë ±â¾ï ½Ã°£ (5ºÐ) MAX_SAVING_TICKCOUNT_FOR_US = 900000 // ¹Ì±¹ Åä³Ê¸ÕÆ® ¼­¹ö±º¿ë ÇÑ °³Ã¼´ç ÃÖ´ë ±â¾ï ½Ã°£ (15ºÐ) }; unsigned long m_dwCID; unsigned long m_dwTickCount; SaveEnemyInfo() : m_dwCID(0), m_dwTickCount(0) { } }; CThreat(void); ~CThreat(void); void ClearAll(void); void ClearThreatList(void); void ClearThreatenedList(void); void SetOwner(CAggresiveCreature* pCreature) { m_pOwner = pCreature; } void AddToThreatList(CAggresiveCreature* pAttackCreature, long lThreatAmount); void AddToThreatenedList(CAggresiveCreature* pDefendCreature); void HealThreat(CAggresiveCreature* pHealCreature, long lThreatAmount); void AffectThreat(CAggresiveCreature* pTauntCreature, long lDamage, AffectThreatType eType); bool DeleteThreat(CAggresiveCreature* pAttackCreature); bool DeleteThreatened(CAggresiveCreature* pDefendCreature); CAggresiveCreature* GetTarget(void); CAggresiveCreature* GetMaxThreatCreature(void) { return m_ThreatList.empty() ? NULL : m_ThreatList.back().m_pCreature; } long GetMaxThreatAmount(void) { return m_ThreatList.empty() ? 0 : m_ThreatList.back().m_lThreatAmount; } inline float GetAggravation(CAggresiveCreature *pCreature); unsigned char GetAward(unsigned long* aryItemID, Item::CItem** aryItem, unsigned long* dwOwnerID); void DivisionExp(void); // °æÇèÄ¡ ºÐ¹è bool SaveEnemy(unsigned long dwCID); // ÃÖ±Ù Á×ÀÎ »ó´ë¸¦ ÀúÀå (¸í¼º ¹Ð¾îÁֱ⠹æÁö¿ë) SaveEnemyInfo* GetSaveEnemyInfo(void) { return m_LatestEnemy; } protected: typedef std::list ThreatList; typedef std::list ThreatenedList; ThreatList m_ThreatList; // ¾²·¹Æ® ¸®½ºÆ® ThreatenedList m_ThreatenedList; // Ÿ Å©¸®ÃÄÀÇ ¾²·¹Æ® ¸®½ºÆ®¿ÍÀÇ »óÈ£ÂüÁ¶¿ë ¸®½ºÆ® CAggresiveCreature* m_pOwner; // ÀÌ ¾²·¹Æ®¸¦ °¡Áö°í ÀÖ´Â Å©¸®Ã³ unsigned char m_cMaxLevel; // ¾²·¹Æ® ¸®½ºÆ®¿¡ µé¾î¿Ô´ø Å©¸®ÃÄÁß ÃÖ°í ·¹º§ (¾ÆÀÌÅÛ º¸»ó¿ë) Creature::CreatureType m_eMaxLevelCreatureType; // ÃÖ°í ·¹º§ Å©¸®ÃÄÀÇ Å¸ÀÔ SaveEnemyInfo m_LatestEnemy[SaveEnemyInfo::MAX_SAVING_ENEMY]; // ÃÖ±Ù¿¡ ÀÚ½ÅÀ» »ìÇØÇÑ Å©¸®ÃÄ ¸ñ·Ï (PvP½Ã ¾îºäÁî ¹æÁö) }; #endif