#ifndef _BROADCAST_2ND_CHARACTER_DATA_H_ #define _BROADCAST_2ND_CHARACTER_DATA_H_ #include #include #include #include //! º» ÆÄÀÏÀº ¼­¹ö/Ŭ¶óÀÌ¾ðÆ®°¡ ÀüºÎ »ç¿ëÇÏ´Â ÆÄÀÏÀÌ´Ù. //! ij¸¯ÅÍÀÇ µ¥ÀÌÅÍ Áß Å¬¶óÀÌ¾ðÆ®°¡ ²À ¾Ë¾Æ¾ß ÇÒ ³»¿ëµéÀ» ´ã°í ÀÖ´Ù. namespace Broadcast2nd { inline void COPY_AND_ADVANCE_SRC(void* dst, const char*& src, size_t size) { memcpy(dst, src, size); src += size; } inline void COPY_AND_ADVANCE_DST(char*& dst, const void* src, size_t size) { memcpy(dst, src, size); dst += size; } enum DeltaInfo { // CID : 4byte // UpdateFlag : 4byte CHAR_DELTA_EQUIPMENT = 1 << 0, // Àåºñ Á¤º¸ (0~7ºñÆ®¸¦ »ç¿ëÇÑ´Ù.) 32byte CHAR_DELTA_CHAR_NAME = 1 << 8, // ij¸¯ÅÍ À̸§ 16byte CHAR_DELTA_STALL_NAME = 1 << 9, // ³ëÁ¡»ó À̸§ 32byte CHAR_DELTA_GUILD_ID = 1 << 10, // ±æµå ID, ¿ëº´ 5byte CHAR_DELTA_PARTY_ID = 1 << 11, // ÆÄƼ ID 4byte CHAR_DELTA_FAME = 1 << 12, // ¸í¼º, ¸¶Àϸ®Áö 8byte CHAR_DELTA_BODYINFO = 1 << 13, // ¸ö °ü·Ã Á¤º¸ ¾÷µ¥ÀÌÆ® 4byte CHAR_DELTA_CLASS = 1 << 14, // Ŭ·¡½º º¯°æ 1byte CHAR_DELTA_LEVEL = 1 << 15, // ·¹º§ º¯°æ 1byte CHAR_DELTA_ENCHANT_INFO = 1 << 16, // æƮ/ÀÎæƮ Á¤º¸(16~19ºñÆ®¸¦ »ç¿ëÇÑ´Ù.) 16byte CHAR_DELTA_NETWORK_POS = 1 << 20, // ij¸¯ÅÍ ÁÂÇ¥ (x,y,z,¹æÇâ,À̵¿°Å¸®) 8byte CHAR_DELTA_HP = 1 << 21, // ij¸¯ÅÍ HP 2byte CHAR_DELTA_EQUIP_GRADE = 1 << 22, // Àåºñ ±×·¹À̵å(¸Ó¸®, ¸ö, ¿À¸¥¼Õ, ¿Þ¼Õ) 4byte CHAR_DELTA_WAR_FLAG = 1 << 23, // ±æµåÀü, ±¹°¡Àü Ç÷¡±× 2byte CHAR_DELTA_REALM_POINT = 1 << 24 // ±¹°¡ÀüÀï °øÇåÈÆÀå Æ÷ÀÎÆ®. 1byte. // Total : 144Byte }; enum MonsterDelta { MON_DELTA_ENCHANT_INFO = 1 << 0, // ¸ó½ºÅÍ ÀÎæƮ Á¤º¸ (0~3ºñÆ®¸¦ »ç¿ëÇÑ´Ù) 4*4byte MON_DELTA_NETWORK_POS = 1 << 4, // ¸ó½ºÅÍ ÁÂÇ¥ Á¤º¸ 8byte MON_DELTA_HP = 1 << 5, // ¸ó½ºÅÍ hpÁ¤º¸ 2byte MON_DELTA_MASTERCID = 1 << 6 // ¼Òȯ ¸ó½ºÅÍÀÇ ¸¶½ºÅÍ CID 4byte }; //! ±âº» ¸ö Á¤º¸ struct bcBodyInfo { unsigned long m_cHair : 4; //! ¸Ó¸®Ä® unsigned long m_cFace : 4; //! ¾ó±¼ unsigned long m_cNationality : 3; //! ±¹Àû unsigned long m_cAdminLevel : 3; //! ¿î¿µÀÚ ·¹º§ ( 0 : ÀϹÝ, 1º¸´Ù Å©¸é ¿î¿µÀÚ..) unsigned long m_cRace : 2; //! Á¾Á· unsigned long m_cSex : 1; //! 0 : ³²ÀÚ, 1 : ¿©ÀÚ unsigned long m_bPeaceMode : 1; //! 0 : ÀüÀï¸ðµå, 1 : ÆòÈ­¸ðµå unsigned long m_cHandPos : 1; //! 0 : 1¹ø ¼Õ, 1 : 2¹ø ¼Õ unsigned long m_cRideFlag : 1; //! 0 : x, 1 : ¸»Å½ unsigned long m_cReserved : 12; //! ±âŸ Ç÷¡±× }; //! ±âº» ½ºÅ×ÀÌÅͽº Á¤º¸ struct bcStatusInfo { union { bcBodyInfo m_BodyInfo; unsigned long m_dwBodyInfo; }; unsigned char m_cClass; // Ŭ·¡½º unsigned char m_cLevel; // ·¹º§ }; //! ³ëÁ¡»ó Á¤º¸ struct StallNode { enum { MAX_STALL_NAME = 32 }; unsigned long m_dwCID; char m_szStallName[MAX_STALL_NAME]; }; //! ÆÄƼ, ±æµå, ¸í¼º, ¸¶Àϸ®Áö °ü·Ã Á¤º¸ struct CommunityInfo { unsigned long m_dwGuild_ID; unsigned long m_dwParty_ID; unsigned char m_cTacticsFlag; unsigned long m_dwFame; unsigned long m_dwMileage; }; //! ÀÌÆåÆ® ó¸®µÉ ÀåºñÀÇ ±×·¹À̵å class CNetworkEquipGrade { public: CNetworkEquipGrade() : m_cHead(0), m_cBody(0), m_cRightHand(0), m_cLeftHand(0) { } CNetworkEquipGrade(unsigned char cHead, unsigned char cBody, unsigned char cRightHand, unsigned char cLeftHand) : m_cHead(cHead), m_cBody(cBody), m_cRightHand(cRightHand), m_cLeftHand(cLeftHand) { } inline bool operator != (const CNetworkEquipGrade& rhs) { return (m_cHead != rhs.m_cHead || m_cBody != rhs.m_cBody || m_cRightHand != rhs.m_cRightHand || m_cLeftHand != rhs.m_cLeftHand); } inline const unsigned char GetHead(void) { return m_cHead; } inline const unsigned char GetBody(void) { return m_cBody; } inline const unsigned char GetRightHand(void) { return m_cRightHand; } inline const unsigned char GetLeftHand(void) { return m_cLeftHand; } static const unsigned char TransferNetworkEquipGrade(Item::CItem* lpItem); private: unsigned short m_cHead : 4; unsigned short m_cBody : 4; unsigned short m_cRightHand : 4; unsigned short m_cLeftHand : 4; }; //! ±æµåÀü ±¹°¡Àü ÀüÀï Ç÷¡±× Á¤º¸ struct WarFlagInfo { unsigned char m_cGuildWarFlag; unsigned char m_cRealmWarFlag; }; enum DataFlag { CHARDATA_CHANGED = (1 << 0) }; class CAggresiveCreatureData { public: CAggresiveCreatureData(); virtual ~CAggresiveCreatureData(); const unsigned long GetCID() const { return m_dwCID; } const EnchantInfo& GetEnchantInfo() const { return m_EnchantInfo; } const CNetworkPos GetNetworkPos() const { return m_NetworkPos; } const unsigned short GetHP() const { return m_usHP; } void SetEnchantInfo(const EnchantInfo& enchantInfo); void SetEnchantInfo(unsigned char cIndex, unsigned long dwFlag) { m_EnchantInfo.m_dwStatusFlag[cIndex] = dwFlag; } void SetNetworkPos(const CNetworkPos& networkPos) { m_NetworkPos = networkPos; } void SetHP(unsigned short usHP) { m_usHP = usHP; } void SetDataFlag(unsigned long dwDataFlag) { m_dwDataFlag |= dwDataFlag; } bool IsSetDataFlag(unsigned long dwDataFlag) { return 0 != (m_dwDataFlag & dwDataFlag); } void ResetDataFlag(unsigned long dwDataFlag) { m_dwDataFlag &= ~dwDataFlag; } void ClearDataFlag() { m_dwDataFlag = 0; } unsigned long GetDataFlag() const { return m_dwDataFlag; } const unsigned long GetLastUpdatedPulse() const { return m_dwLastUpdatedPulse; } //! ¹öÆÛ¿Í ¹öÆÛ ±æÀ̸¦ ÀÎÀÚ·Î ¹Þ¾Æ¼­ µ¥ÀÌÅ͸¦ ¾÷µ¥ÀÌÆ®ÇÑ´Ù. //! ¸®ÅϽÿ¡ ¹öÆÛ ±æÀÌ¿¡, »ç¿ëÇÑ ¹öÆÛ ±æÀ̸¦ ³Ö¾î ÁØ´Ù. //! ¸®ÅϰªÀº ¼º°ø/½ÇÆÐ ¿©ºÎ¸¦ ¸®ÅÏÇÑ´Ù. virtual bool UpdateData(unsigned long dwCID, unsigned long dwCurrentPulse, const char* szData, int& nBufferSize_InOut) = 0; virtual void ClearData(); protected: unsigned long m_dwCID; unsigned long m_dwLastUpdatedPulse; unsigned long m_dwDataFlag; EnchantInfo m_EnchantInfo; CNetworkPos m_NetworkPos; unsigned short m_usHP; }; // ij¸¯ÅÍ µ¥ÀÌÅÍ Å¬·¡½º class CCharacterData : public CAggresiveCreatureData { public: enum { MAX_NAME = 16, HALF_EQUIP_POS = 8 }; CCharacterData(); virtual ~CCharacterData(); const char* GetName() const { return m_szName; } const char* GetStallName() const { return m_szStallName; } void GetEquipmentsID(unsigned short* lpEquipmentsID_Out, unsigned char nIDNum) const; const unsigned long GetGuildID() const { return m_CommunityInfo.m_dwGuild_ID; } const unsigned long GetPartyID() const { return m_CommunityInfo.m_dwParty_ID; } const unsigned long GetFame() const { return m_CommunityInfo.m_dwFame; } const unsigned long GetMileage() const { return m_CommunityInfo.m_dwMileage; } const unsigned long GetBodyInfo() const { return m_StatusInfo.m_dwBodyInfo; } const CNetworkEquipGrade GetNetworkEquipGrade() const { return m_NetworkEquipGrade; } const unsigned char GetGuildWarFlag() const { return m_WarFlagInfo.m_cGuildWarFlag; } const unsigned char GetRealmWarFlag() const { return m_WarFlagInfo.m_cRealmWarFlag; } const unsigned char GetTacticsFlag() const { return m_CommunityInfo.m_cTacticsFlag; } const unsigned char GetAdminLevel() const { return m_StatusInfo.m_BodyInfo.m_cAdminLevel; } const unsigned char GetClassType() const { return m_StatusInfo.m_cClass; } const unsigned char GetLevel() const { return m_StatusInfo.m_cLevel; } const unsigned char GetRace() const { return m_StatusInfo.m_BodyInfo.m_cRace; } const unsigned char GetNation() const { return m_StatusInfo.m_BodyInfo.m_cNationality; } const unsigned char GetFace() const { return m_StatusInfo.m_BodyInfo.m_cFace; } const unsigned char GetHair() const { return m_StatusInfo.m_BodyInfo.m_cHair; } const unsigned char GetSex() const { return static_cast(m_StatusInfo.m_BodyInfo.m_cSex) + 1; } const unsigned char GetHandPos() const { return m_StatusInfo.m_BodyInfo.m_cHandPos; } const unsigned char GetRideFlag() const { return m_StatusInfo.m_BodyInfo.m_cRideFlag; } const bool IsPeaceMode() const { return m_StatusInfo.m_BodyInfo.m_bPeaceMode; } const bool IsAdmin() const { return (0 != m_StatusInfo.m_BodyInfo.m_cAdminLevel); } const unsigned char GetRealmPoint() const { return m_cRealmPoint; } void SetEquipmentsID(unsigned short* lpEquipmentsID_In, const unsigned char nIDNum); void SetEquipmentsID(unsigned long dwEquipmentsID_In, const unsigned char nIDIndex); void SetName(const char* szName, const size_t nNameLen); void SetStallName(const char* szStallName, const size_t nStallNameLen); void SetGuildID(unsigned long dwGID) { m_CommunityInfo.m_dwGuild_ID = dwGID; } void SetPartyID(unsigned long dwPID) { m_CommunityInfo.m_dwParty_ID = dwPID; } void SetFame(unsigned long dwFame) { m_CommunityInfo.m_dwFame = dwFame; } void SetMileage(unsigned long dwMileage) { m_CommunityInfo.m_dwMileage = dwMileage;} void SetBodyInfo(unsigned long dwBodyInfo) { m_StatusInfo.m_dwBodyInfo = dwBodyInfo; } void SetNetworkEquipGrade(const CNetworkEquipGrade& equipGrade) { m_NetworkEquipGrade = equipGrade; } void SetGuildWarFlag(unsigned char cFlag) { m_WarFlagInfo.m_cGuildWarFlag = cFlag; } void SetRealmWarFlag(unsigned char cFlag) { m_WarFlagInfo.m_cRealmWarFlag = cFlag; } void SetTacticsFlag(unsigned char cFlag) { m_CommunityInfo.m_cTacticsFlag = cFlag; } void SetClass(unsigned char cClass) { m_StatusInfo.m_cClass = cClass; } void SetLevel(unsigned char cLevel) { m_StatusInfo.m_cLevel = cLevel; } void SetRealmPoint(unsigned char cRealmPoint) { m_cRealmPoint = cRealmPoint; } void ClearData(); bool UpdateData(unsigned long dwCID, unsigned long dwCurrentPulse, const char* szData, int& nBufferSize_InOut); static int EstimateBufferSize(unsigned long dwUpdateFlag); protected: char m_szName[MAX_NAME]; char m_szStallName[StallNode::MAX_STALL_NAME]; unsigned long m_dwDoubleEquipsID[HALF_EQUIP_POS]; // Àåºñ Á¤º¸´Â 2°³ ´ÜÀ§·Î ó¸®ÇÑ´Ù. CommunityInfo m_CommunityInfo; bcStatusInfo m_StatusInfo; CNetworkEquipGrade m_NetworkEquipGrade; WarFlagInfo m_WarFlagInfo; unsigned char m_cRealmPoint; }; class CMonsterData : public CAggresiveCreatureData { public: CMonsterData(); virtual ~CMonsterData(); void ClearData(); bool UpdateData(unsigned long dwCID, unsigned long dwCurrentPulse, const char* szData, int& nBufferSize_InOut); static int EstimateBufferSize(unsigned char cUpdateFlag); protected: unsigned long m_dwMasterCID; // ¼ÒȯÇÑ ¸ó½ºÅÍÀÎ °æ¿ì.... }; } #endif