fix game header encoding

This commit is contained in:
2024-04-01 12:39:34 +02:00
parent 0101618d89
commit 82317e6c4d
54 changed files with 832 additions and 832 deletions

View File

@ -16,23 +16,23 @@ public:
bool ReadDragonSoulTableFile(const char * c_pszFileName); bool ReadDragonSoulTableFile(const char * c_pszFileName);
void GetDragonSoulInfo(DWORD dwVnum, OUT BYTE& bType, OUT BYTE& bGrade, OUT BYTE& bStep, OUT BYTE& bRefine) const; void GetDragonSoulInfo(DWORD dwVnum, OUT BYTE& bType, OUT BYTE& bGrade, OUT BYTE& bStep, OUT BYTE& bRefine) const;
// fixme : titempos<EFBFBD><EFBFBD> // fixme : titempos
WORD GetBasePosition(const LPITEM pItem) const; WORD GetBasePosition(const LPITEM pItem) const;
bool IsValidCellForThisItem(const LPITEM pItem, const TItemPos& Cell) const; bool IsValidCellForThisItem(const LPITEM pItem, const TItemPos& Cell) const;
int GetDuration(const LPITEM pItem) const; int GetDuration(const LPITEM pItem) const;
// <EFBFBD><EFBFBD>ȥ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>޾Ƽ<DEBE> Ư<><C6AF> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20>Լ<EFBFBD> // 용혼석을 받아서 특정 용심을 추출하는 함수
bool ExtractDragonHeart(LPCHARACTER ch, LPITEM pItem, LPITEM pExtractor = NULL); bool ExtractDragonHeart(LPCHARACTER ch, LPITEM pItem, LPITEM pExtractor = NULL);
// Ư<EFBFBD><EFBFBD> <20><>ȥ<EFBFBD><C8A5>(pItem)<29><> <20><><EFBFBD><EFBFBD>â<EFBFBD><C3A2><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>θ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD>, // 특정 용혼석(pItem)을 장비창에서 제거할 때에 성공 여부를 결정하고,
// <EFBFBD><EFBFBD><EFBFBD>н<EFBFBD> <20>λ깰<CEBB><EAB9B0> <20>ִ<EFBFBD> <20>Լ<EFBFBD>.(<28>λ깰<CEBB><EAB9B0> dragon_soul_table.txt<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>) // 실패시 부산물을 주는 함수.(부산물은 dragon_soul_table.txt에 정의)
// DestCell<EFBFBD><EFBFBD> invalid<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>, <20><>ȥ<EFBFBD><C8A5><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ڵ<EFBFBD> <20>߰<EFBFBD>. // DestCell invalid한 값을 넣으면 성공 시, 용혼석을 빈 공간에 자동 추가.
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>, <20><>ȥ<EFBFBD><C8A5>(pItem)<EFBFBD><EFBFBD> delete<EFBFBD><EFBFBD>. // 실패 시, 용혼석(pItem) delete.
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִٸ<D6B4> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Ȯ<><C8AE><EFBFBD><EFBFBD> pExtractor->GetValue(0)%<EFBFBD><EFBFBD>ŭ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. // 추출아이템이 있다면 추출 성공 확률이 pExtractor->GetValue(0)%만큼 증가함.
// <EFBFBD>λ깰<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ڵ<EFBFBD> <20>߰<EFBFBD>. // 부산물은 언제나 자동 추가.
bool PullOut(LPCHARACTER ch, TItemPos DestCell, IN OUT LPITEM& pItem, LPITEM pExtractor = NULL); bool PullOut(LPCHARACTER ch, TItemPos DestCell, IN OUT LPITEM& pItem, LPITEM pExtractor = NULL);
// <EFBFBD><EFBFBD>ȥ<EFBFBD><EFBFBD> <20><><EFBFBD>׷<EFBFBD><D7B7>̵<EFBFBD> <20>Լ<EFBFBD> // 용혼석 업그레이드 함수
bool DoRefineGrade(LPCHARACTER ch, TItemPos (&aItemPoses)[DRAGON_SOUL_REFINE_GRID_SIZE]); bool DoRefineGrade(LPCHARACTER ch, TItemPos (&aItemPoses)[DRAGON_SOUL_REFINE_GRID_SIZE]);
bool DoRefineStep(LPCHARACTER ch, TItemPos (&aItemPoses)[DRAGON_SOUL_REFINE_GRID_SIZE]); bool DoRefineStep(LPCHARACTER ch, TItemPos (&aItemPoses)[DRAGON_SOUL_REFINE_GRID_SIZE]);
bool DoRefineStrength(LPCHARACTER ch, TItemPos (&aItemPoses)[DRAGON_SOUL_REFINE_GRID_SIZE]); bool DoRefineStrength(LPCHARACTER ch, TItemPos (&aItemPoses)[DRAGON_SOUL_REFINE_GRID_SIZE]);
@ -47,7 +47,7 @@ public:
private: private:
void SendRefineResultPacket(LPCHARACTER ch, BYTE bSubHeader, const TItemPos& pos); void SendRefineResultPacket(LPCHARACTER ch, BYTE bSubHeader, const TItemPos& pos);
// ij<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȥ<EFBFBD><C8A5> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><ECBAB8>, Ȱ<><C8B0>ȭ <20><> <20><>ȥ<EFBFBD><C8A5><EFBFBD><EFBFBD> <20><><EFBFBD>ٸ<EFBFBD>, ij<><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȥ<EFBFBD><C8A5> Ȱ<><C8B0> <20><><EFBFBD>¸<EFBFBD> off <20><>Ű<EFBFBD><C5B0> <20>Լ<EFBFBD>. // 캐릭터의 용혼석 덱을 살펴보고, 활성화 된 용혼석이 없다면, 캐릭터의 용혼석 활성 상태를 off 시키는 함수.
void RefreshDragonSoulState(LPCHARACTER ch); void RefreshDragonSoulState(LPCHARACTER ch);
DWORD MakeDragonSoulVnum(BYTE bType, BYTE grade, BYTE step, BYTE refine); DWORD MakeDragonSoulVnum(BYTE bType, BYTE grade, BYTE step, BYTE refine);

View File

@ -16,7 +16,7 @@ struct SGuildMark
}; };
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
Pixel m_apxBuf[SIZE]; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̹<EFBFBD><CCB9><EFBFBD> Pixel m_apxBuf[SIZE]; // 실제 이미지
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
void Clear(); void Clear();
@ -38,11 +38,11 @@ struct SGuildMarkBlock
}; };
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
Pixel m_apxBuf[SIZE]; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̹<EFBFBD><CCB9><EFBFBD> Pixel m_apxBuf[SIZE]; // 실제 이미지
BYTE m_abCompBuf[MAX_COMP_SIZE]; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> BYTE m_abCompBuf[MAX_COMP_SIZE]; // 압축된 데이터
lzo_uint m_sizeCompBuf; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ũ<><C5A9> lzo_uint m_sizeCompBuf; // 압축된 크기
DWORD m_crc; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> CRC DWORD m_crc; // 압축된 데이터의 CRC
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
DWORD GetCRC() const; DWORD GetCRC() const;
@ -87,9 +87,9 @@ class CGuildMarkImage
bool SaveMark(DWORD posMark, BYTE * pbMarkImage); bool SaveMark(DWORD posMark, BYTE * pbMarkImage);
bool DeleteMark(DWORD posMark); bool DeleteMark(DWORD posMark);
bool SaveBlockFromCompressedData(DWORD posBlock, const BYTE * pbComp, DWORD dwCompSize); // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> -> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ bool SaveBlockFromCompressedData(DWORD posBlock, const BYTE * pbComp, DWORD dwCompSize); // 서버 -> 클라이언트
DWORD GetEmptyPosition(); // <EFBFBD><EFBFBD> <20><>ũ <20><>ġ<EFBFBD><C4A1> <20><><EFBFBD>´<EFBFBD>. DWORD GetEmptyPosition(); // 빈 마크 위치를 얻는다.
void GetBlockCRCList(DWORD * crcList); void GetBlockCRCList(DWORD * crcList);
void GetDiffBlocks(const DWORD * crcList, std::map<BYTE, const SGuildMarkBlock *> & mapDiffBlocks); void GetDiffBlocks(const DWORD * crcList, std::map<BYTE, const SGuildMarkBlock *> & mapDiffBlocks);

View File

@ -32,11 +32,11 @@ class CGuildMarkManager : public singleton<CGuildMarkManager>
// //
void SetMarkPathPrefix(const char * prefix); void SetMarkPathPrefix(const char * prefix);
bool LoadMarkIndex(); // <EFBFBD><EFBFBD>ũ <20>ε<EFBFBD><CEB5><EFBFBD> <20>ҷ<EFBFBD><D2B7><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>) bool LoadMarkIndex(); // 마크 인덱스 불러오기 (서버에서만 사용)
bool SaveMarkIndex(); // <EFBFBD><EFBFBD>ũ <20>ε<EFBFBD><CEB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD> bool SaveMarkIndex(); // 마크 인덱스 저장하기
void LoadMarkImages(); // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ũ <20>̹<EFBFBD><CCB9><EFBFBD><EFBFBD><EFBFBD> <20>ҷ<EFBFBD><D2B7><EFBFBD><EFBFBD><EFBFBD> void LoadMarkImages(); // 모든 마크 이미지를 불러오기
void SaveMarkImage(DWORD imgIdx); // <EFBFBD><EFBFBD>ũ <20>̹<EFBFBD><CCB9><EFBFBD> <20><><EFBFBD><EFBFBD> void SaveMarkImage(DWORD imgIdx); // 마크 이미지 저장
bool GetMarkImageFilename(DWORD imgIdx, std::string & path) const; bool GetMarkImageFilename(DWORD imgIdx, std::string & path) const;
bool AddMarkIDByGuildID(DWORD guildID, DWORD markID); bool AddMarkIDByGuildID(DWORD guildID, DWORD markID);

View File

@ -10,10 +10,10 @@ struct tag_Quiz
enum OXEventStatus enum OXEventStatus
{ {
OXEVENT_FINISH = 0, // OX<EFBFBD>̺<EFBFBD>Ʈ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> OXEVENT_FINISH = 0, // OX이벤트가 완전히 끝난 상태
OXEVENT_OPEN = 1, // OX<EFBFBD>̺<EFBFBD>Ʈ<EFBFBD><EFBFBD> <20><><EFBFBD>۵<EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(20012)<29><> <20><><EFBFBD>ؼ<EFBFBD> <20><><EFBFBD><EFBFBD><E5B0A1> OXEVENT_OPEN = 1, // OX이벤트가 시작됨. 을두지(20012)를 통해서 입장가능
OXEVENT_CLOSE = 2, // OX<EFBFBD>̺<EFBFBD>Ʈ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(20012)<29><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ܵ<EFBFBD> OXEVENT_CLOSE = 2, // OX이벤트의 참가가 끝남. 을두지(20012)를 통한 입장이 차단됨
OXEVENT_QUIZ = 3, // <EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. OXEVENT_QUIZ = 3, // 퀴즈를 출제함.
OXEVENT_ERR = 0xff OXEVENT_ERR = 0xff
}; };

View File

@ -4,7 +4,7 @@
class CHARACTER; class CHARACTER;
// TODO: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD><EFBFBD><EFBFBD> <20>ɷ<EFBFBD>ġ? <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ģ<>е<EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD>... <EFBFBD><EFBFBD>ġ // TODO: 펫으로서의 능력치? 라던가 친밀도, 배고픔 기타등등... 수치
struct SPetAbility struct SPetAbility
{ {
}; };
@ -34,8 +34,8 @@ protected:
virtual bool Update(DWORD deltaTime); virtual bool Update(DWORD deltaTime);
protected: protected:
virtual bool _UpdateFollowAI(); ///< <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ٴϴ<D9B4> AI ó<EFBFBD><EFBFBD> virtual bool _UpdateFollowAI(); ///< 주인을 따라다니는 AI 처리
virtual bool _UpdatAloneActionAI(float fMinDist, float fMaxDist); ///< <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ó<EFBFBD><C3B3><EFBFBD><EFBFBD> ȥ<><C8A5> <20><><EFBFBD><EFBFBD> AI ó<EFBFBD><EFBFBD> virtual bool _UpdatAloneActionAI(float fMinDist, float fMaxDist); ///< 주인 근처에서 혼자 노는 AI 처리
/// @TODO /// @TODO
//virtual bool _UpdateCombatAI(); //virtual bool _UpdateCombatAI();
@ -62,13 +62,13 @@ public:
bool IsSummoned() const { return 0 != m_pkChar; } bool IsSummoned() const { return 0 != m_pkChar; }
void SetSummonItem (LPITEM pItem); void SetSummonItem (LPITEM pItem);
DWORD GetSummonItemVID () { return m_dwSummonItemVID; } DWORD GetSummonItemVID () { return m_dwSummonItemVID; }
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20>Լ<EFBFBD><D4BC><EFBFBD> <20>ŵδ<C5B5> <20>Լ<EFBFBD>. // 버프 주는 함수와 거두는 함수.
// <EFBFBD>̰<EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>Ѱ<EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, // 이게 좀 괴랄한게, 서버가 ㅄ라서,
// POINT_MOV_SPEED, POINT_ATT_SPEED, POINT_CAST_SPEED<EFBFBD><EFBFBD> PointChange()<EFBFBD><EFBFBD> <20>Լ<EFBFBD><D4BC><EFBFBD> <20><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ҿ<EFBFBD><D2BF><EFBFBD> <20><><EFBFBD>°<EFBFBD>, // POINT_MOV_SPEED, POINT_ATT_SPEED, POINT_CAST_SPEED PointChange()란 함수만 써서 변경해 봐야 소용이 없는게,
// PointChange() <EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD> <20><><EFBFBD>𼱰<EFBFBD> ComputePoints()<EFBFBD><EFBFBD> <20>ϸ<EFBFBD> <20>ϴ<EFBFBD> <20>ʱ<EFBFBD>ȭ<EFBFBD>ǰ<EFBFBD>, // PointChange() 이후에 어디선가 ComputePoints()를 하면 싹다 초기화되고,
// <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, ComputePoints()<EFBFBD><EFBFBD> <20>θ<EFBFBD><CEB8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD><EFBFBD> POINT<4E><54> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ´ٴ<C2B4> <20>Ŵ<EFBFBD>. // 더 웃긴건, ComputePoints()를 부르지 않으면 클라의 POINT는 전혀 변하지 않는다는 거다.
// <EFBFBD>׷<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> ComputePoints() <EFBFBD><EFBFBD><EFBFBD>ο<EFBFBD><EFBFBD><EFBFBD> petsystem->RefreshBuff()<EFBFBD><EFBFBD> <20>θ<EFBFBD><CEB8><EFBFBD><EFBFBD><EFBFBD> <20>Ͽ<EFBFBD><CFBF><EFBFBD>, // 그래서 버프를 주는 것은 ComputePoints() 내부에서 petsystem->RefreshBuff()를 부르도록 하였고,
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ClearBuff()<EFBFBD><EFBFBD> <20>θ<EFBFBD><CEB8><EFBFBD>, ComputePoints<EFBFBD><EFBFBD> <20>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>. // 버프를 빼는 것은 ClearBuff()를 부르고, ComputePoints를 하는 것으로 한다.
void GiveBuff(); void GiveBuff();
void ClearBuff(); void ClearBuff();
@ -87,7 +87,7 @@ private:
LPCHARACTER m_pkChar; // Instance of pet(CHARACTER) LPCHARACTER m_pkChar; // Instance of pet(CHARACTER)
LPCHARACTER m_pkOwner; LPCHARACTER m_pkOwner;
// SPetAbility m_petAbility; // <EFBFBD>ɷ<EFBFBD>ġ // SPetAbility m_petAbility; // 능력치
}; };
/** /**
@ -95,7 +95,7 @@ private:
class CPetSystem class CPetSystem
{ {
public: public:
typedef std::unordered_map<DWORD, CPetActor*> TPetActorMap; /// <VNUM, PetActor> map. (<EFBFBD><EFBFBD> ij<><C4B3><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD><EFBFBD> vnum<75><6D> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>..??) typedef std::unordered_map<DWORD, CPetActor*> TPetActorMap; /// <VNUM, PetActor> map. (한 캐릭터가 같은 vnum의 펫을 여러개 가질 일이 있을까..??)
public: public:
CPetSystem(LPCHARACTER owner); CPetSystem(LPCHARACTER owner);
@ -107,7 +107,7 @@ public:
bool Update(DWORD deltaTime); bool Update(DWORD deltaTime);
void Destroy(); void Destroy();
size_t CountSummoned() const; ///< <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD><C8AF>(<28><>üȭ <20><> ij<><C4B3><EFBFBD>Ͱ<EFBFBD> <20>ִ<EFBFBD>) <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> size_t CountSummoned() const; ///< 현재 소환된(실체화 된 캐릭터가 있는) 펫의 개수
public: public:
void SetUpdatePeriod(DWORD ms); void SetUpdatePeriod(DWORD ms);
@ -117,7 +117,7 @@ public:
void Unsummon(DWORD mobVnum, bool bDeleteFromList = false); void Unsummon(DWORD mobVnum, bool bDeleteFromList = false);
void Unsummon(CPetActor* petActor, bool bDeleteFromList = false); void Unsummon(CPetActor* petActor, bool bDeleteFromList = false);
// TODO: <EFBFBD><EFBFBD>¥ <20><> <20>ý<EFBFBD><C3BD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><20><> <20><><EFBFBD><EFBFBD>. (ij<><C4B3><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...) // TODO: 진짜 펫 시스템이 들어갈 때 구현. (캐릭터가 보유한 펫의 정보를 추가할 때 라던가...)
CPetActor* AddPet(DWORD mobVnum, const char* petName, const SPetAbility& ability, DWORD options = CPetActor::EPetOption_Followable | CPetActor::EPetOption_Summonable | CPetActor::EPetOption_Combatable); CPetActor* AddPet(DWORD mobVnum, const char* petName, const SPetAbility& ability, DWORD options = CPetActor::EPetOption_Followable | CPetActor::EPetOption_Summonable | CPetActor::EPetOption_Combatable);
void DeletePet(DWORD mobVnum); void DeletePet(DWORD mobVnum);
@ -126,8 +126,8 @@ public:
private: private:
TPetActorMap m_petActorMap; TPetActorMap m_petActorMap;
LPCHARACTER m_pkOwner; ///< <EFBFBD><EFBFBD> <20>ý<EFBFBD><C3BD><EFBFBD><EFBFBD><EFBFBD> Owner LPCHARACTER m_pkOwner; ///< 펫 시스템의 Owner
DWORD m_dwUpdatePeriod; ///< <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20>ֱ<EFBFBD> (ms<6D><73><EFBFBD><EFBFBD>) DWORD m_dwUpdatePeriod; ///< 업데이트 주기 (ms단위)
DWORD m_dwLastUpdateTime; DWORD m_dwLastUpdateTime;
LPEVENT m_pkPetSystemUpdateEvent; LPEVENT m_pkPetSystemUpdateEvent;
}; };

View File

@ -4,11 +4,11 @@
#include <common/length.h> #include <common/length.h>
#include <list> #include <list>
// castle.cpp <EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ͽ<EFBFBD><CFBF><EFBFBD> // castle.cpp 에 있는 것을 복붙 하였다
#define EMPIRE_NONE 0 // <EFBFBD>ƹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴ<EFBFBD> #define EMPIRE_NONE 0 // 아무국가 아님
#define EMPIRE_RED 1 // <EFBFBD>ż<EFBFBD> #define EMPIRE_RED 1 // 신수
#define EMPIRE_YELLOW 2 // õ<EFBFBD><EFBFBD> #define EMPIRE_YELLOW 2 // 천조
#define EMPIRE_BLUE 3 // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> #define EMPIRE_BLUE 3 // 진노
class HME class HME
{ {

View File

@ -12,17 +12,17 @@
/** /**
* @class TrafficProfiler * @class TrafficProfiler
* @brief Network I/O traffic <EFBFBD><EFBFBD> <20><>Ŷ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> profiler. * @brief Network I/O traffic 을 패킷 단위로 측정하는 profiler.
* @author Bang2ni * @author Bang2ni
* @version 05/07/07 Bang2ni - First release. * @version 05/07/07 Bang2ni - First release.
* *
* <EFBFBD>ð<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Network I/O <EFBFBD><EFBFBD> traffic <EFBFBD><EFBFBD> <20><>Ŷ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD>, Text file <20><><EFBFBD>·<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ۼ<EFBFBD><DBBC>Ѵ<EFBFBD>. * 시간대 별로 Network I/O traffic 을 패킷 단위로 측정하고, Text file 형태로 보고서를 작성한다.
*/ */
class TrafficProfiler : public singleton< TrafficProfiler > class TrafficProfiler : public singleton< TrafficProfiler >
{ {
public: public:
/// I/O <EFBFBD><EFBFBD><EFBFBD><EFBFBD> /// I/O 방향
enum IODirection { enum IODirection {
IODIR_INPUT = 0, ///< Input IODIR_INPUT = 0, ///< Input
IODIR_OUTPUT, ///< Output IODIR_OUTPUT, ///< Output
@ -37,25 +37,25 @@ class TrafficProfiler : public singleton< TrafficProfiler >
/// Destructor /// Destructor
~TrafficProfiler( void ); ~TrafficProfiler( void );
/// Profiling <EFBFBD><EFBFBD> <20>ʿ<EFBFBD><CABF><EFBFBD> <20>ʱ<EFBFBD>ȭ<EFBFBD><C8AD> <20>Ѵ<EFBFBD>. /// Profiling 에 필요한 초기화를 한다.
/** /**
* @param [in] dwFlushCycle Flush <EFBFBD>ֱ<EFBFBD>. <20><> <20><><EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD>. * @param [in] dwFlushCycle Flush 주기. 초 단위이다.
* @param [in] pszLogFileName Profiling log file <EFBFBD><EFBFBD> <20≯<EFBFBD> * @param [in] pszLogFileName Profiling log file 의 이름
* @return false <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> profiling log file <EFBFBD><EFBFBD> open <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ߴ<EFBFBD>. * @return false 일 경우 profiling log file open 하지 못했다.
* *
* profiling log file <EFBFBD><EFBFBD> open(<EFBFBD><EFBFBD><EFBFBD><EFBFBD>) <20>Ѵ<EFBFBD>. * profiling log file open(생성) 한다.
*/ */
bool Initialize( DWORD dwFlushCycle, const char* pszLogFileName ); bool Initialize( DWORD dwFlushCycle, const char* pszLogFileName );
/// Profiling <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>۵ưų<C6B0> <20><><EFBFBD><EFBFBD> <20><> Packet <EFBFBD><EFBFBD> Report <EFBFBD>Ѵ<EFBFBD>. /// Profiling 을 위해 전송됐거나 전송 할 Packet Report 한다.
/** /**
* @param [in] dir Profiling <EFBFBD><EFBFBD> Packet <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> * @param [in] dir Profiling Packet 의 방향
* @param [in] byHeader Packet <EFBFBD><EFBFBD><EFBFBD><EFBFBD> * @param [in] byHeader Packet 헤더
* @param [in] dwSize Packet <EFBFBD><EFBFBD> <20><> size * @param [in] dwSize Packet 의 총 size
* @return Initialize <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʾҴٸ<D2B4> false <20><> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>. * @return Initialize 되지 않았다면 false 를 반환한다.
* *
* Packet <EFBFBD><EFBFBD> <20>ش<EFBFBD><D8B4>ϴ<EFBFBD> size <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ų<EFBFBD><C5B2>. * Packet 에 해당하는 size 를 누적시킨다.
* Initialize <EFBFBD><EFBFBD><EFBFBD>ij<EFBFBD> <20>ֱ<EFBFBD> Flush <20><> <20><><EFBFBD>Ŀ<EFBFBD> Flush <20>ֱ<EFBFBD> <20><>ŭ <20>ð<EFBFBD><C3B0><EFBFBD> <20><20><> ȣ<><C8A3><EFBFBD>ȴٸ<C8B4> Report <EFBFBD><EFBFBD><EFBFBD><EFBFBD> Flush <EFBFBD>Ѵ<EFBFBD>. * Initialize 이후나 최근 Flush 된 이후에 Flush 주기 만큼 시간이 흐른 후 호출된다면 Report 이후 Flush 한다.
*/ */
bool Report( IODirection dir, BYTE byHeader, DWORD dwSize ) bool Report( IODirection dir, BYTE byHeader, DWORD dwSize )
{ {
@ -65,22 +65,22 @@ class TrafficProfiler : public singleton< TrafficProfiler >
return true; return true;
} }
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Report <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ͽ<EFBFBD> <20><><EFBFBD><EFBFBD>. /// 현재까지 Report 된 내용을 파일에 쓴다.
/** /**
* @return Initialize <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʾҴ<CABE>. * @return Initialize 되지 않았다.
*/ */
bool Flush( void ); bool Flush( void );
private: private:
/// Profling <EFBFBD><EFBFBD> <20><><EFBFBD>õ<EFBFBD> variables <EFBFBD><EFBFBD> <20>ʱ<EFBFBD>ȭ <20>Ѵ<EFBFBD>. /// Profling 에 관련된 variables 를 초기화 한다.
void InitializeProfiling( void ); void InitializeProfiling( void );
/// Report <EFBFBD><EFBFBD> Packet <EFBFBD><EFBFBD> traffic <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>. /// Report Packet traffic 를 계산한다.
/** /**
* @param [in] dir Profiling <EFBFBD><EFBFBD> Packet <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> * @param [in] dir Profiling Packet 의 방향
* @param [in] byHeader Packet <EFBFBD><EFBFBD><EFBFBD><EFBFBD> * @param [in] byHeader Packet 헤더
* @param [in] dwSize Packet <EFBFBD><EFBFBD> <20><> size * @param [in] dwSize Packet 의 총 size
*/ */
void ComputeTraffic( IODirection dir, BYTE byHeader, DWORD dwSize ) void ComputeTraffic( IODirection dir, BYTE byHeader, DWORD dwSize )
{ {
@ -96,8 +96,8 @@ class TrafficProfiler : public singleton< TrafficProfiler >
/// Traffic info type. /// Traffic info type.
/** /**
* first: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> size * first: 누적된 총 size
* second: <EFBFBD><EFBFBD> packet <EFBFBD><EFBFBD> <20><><EFBFBD>۵<EFBFBD> Ƚ<><C8BD> * second: packet 이 전송된 횟수
*/ */
typedef std::pair< DWORD, DWORD > TrafficInfo; typedef std::pair< DWORD, DWORD > TrafficInfo;
@ -105,11 +105,11 @@ class TrafficProfiler : public singleton< TrafficProfiler >
typedef std::vector< TrafficInfo > TrafficVec; typedef std::vector< TrafficInfo > TrafficVec;
FILE* m_pfProfileLogFile; ///< Profile log file pointer FILE* m_pfProfileLogFile; ///< Profile log file pointer
DWORD m_dwFlushCycle; ///< Flush <EFBFBD>ֱ<EFBFBD> DWORD m_dwFlushCycle; ///< Flush 주기
time_t m_tmProfileStartTime; ///< <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ð<EFBFBD>. Flush <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Update <EFBFBD>ȴ<EFBFBD>. time_t m_tmProfileStartTime; ///< 프로파일을 시작한 시간. Flush 될 때마다 Update 된다.
DWORD m_dwTotalTraffic; ///< Report <EFBFBD><EFBFBD> <20><> Traffic <EFBFBD> DWORD m_dwTotalTraffic; ///< Report 된 총 Traffic 용량
DWORD m_dwTotalPacket; ///< Report <EFBFBD><EFBFBD> <20><> Packet <EFBFBD><EFBFBD> DWORD m_dwTotalPacket; ///< Report 된 총 Packet
TrafficVec m_aTrafficVec[ IODIR_MAX ]; ///< Report <EFBFBD><EFBFBD> Traffic <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> vector<6F><72> <20>迭. <20><> <20><><EFBFBD><EFBFBD><E2B8B6> vector <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. TrafficVec m_aTrafficVec[ IODIR_MAX ]; ///< Report Traffic 을 저장할 vector의 배열. 각 방향마다 vector 를 가진다.
}; };
#endif // _METIN_II_TRAFFICPROFILER_H_ #endif // _METIN_II_TRAFFICPROFILER_H_

View File

@ -54,23 +54,23 @@ enum EAffectTypes
AFFECT_DEF_GRADE, // 226 AFFECT_DEF_GRADE, // 226
AFFECT_PREMIUM_START = 500, AFFECT_PREMIUM_START = 500,
AFFECT_EXP_BONUS = 500, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> AFFECT_EXP_BONUS = 500, // 경험의 반지
AFFECT_ITEM_BONUS = 501, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> AFFECT_ITEM_BONUS = 501, // 도둑의 장갑
AFFECT_SAFEBOX = 502, // PREMIUM_SAFEBOX, AFFECT_SAFEBOX = 502, // PREMIUM_SAFEBOX,
AFFECT_AUTOLOOT = 503, // PREMIUM_AUTOLOOT, AFFECT_AUTOLOOT = 503, // PREMIUM_AUTOLOOT,
AFFECT_FISH_MIND = 504, // PREMIUM_FISH_MIND, AFFECT_FISH_MIND = 504, // PREMIUM_FISH_MIND,
AFFECT_MARRIAGE_FAST = 505, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> AFFECT_MARRIAGE_FAST = 505, // 원앙의 깃털
AFFECT_GOLD_BONUS = 506, // <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ȯ<EFBFBD><C8AE> 50%<25><><EFBFBD><EFBFBD> AFFECT_GOLD_BONUS = 506, // 돈 드롭확률 50%증가
AFFECT_PREMIUM_END = 509, AFFECT_PREMIUM_END = 509,
AFFECT_MALL = 510, // <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ AFFECT_MALL = 510, // 몰 아이템 에펙트
AFFECT_NO_DEATH_PENALTY = 511, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȣ (<28><><EFBFBD><EFBFBD>ġ<EFBFBD><C4A1> <20>г<EFBFBD>Ƽ<EFBFBD><C6BC> <20>ѹ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>) AFFECT_NO_DEATH_PENALTY = 511, // 용신의 가호 (경험치가 패널티를 한번 막아준다)
AFFECT_SKILL_BOOK_BONUS = 512, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Ȯ<><C8AE><EFBFBD><EFBFBD> 50% <EFBFBD><EFBFBD><EFBFBD><EFBFBD>) AFFECT_SKILL_BOOK_BONUS = 512, // 선인의 교훈 (책 수련 성공 확률이 50% 증가)
AFFECT_SKILL_NO_BOOK_DELAY = 513, // <EFBFBD>־ȼ<EFBFBD><EFBFBD><EFBFBD> AFFECT_SKILL_NO_BOOK_DELAY = 513, // 주안술서
AFFECT_HAIR = 514, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> ȿ<><C8BF> AFFECT_HAIR = 514, // 헤어 효과
AFFECT_COLLECT = 515, //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ AFFECT_COLLECT = 515, //수집퀘스트
AFFECT_EXP_BONUS_EURO_FREE = 516, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> 14 <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>⺻ ȿ<><C8BF>) AFFECT_EXP_BONUS_EURO_FREE = 516, // 경험의 반지 (유럽 버전 14 레벨 이하 기본 효과)
AFFECT_EXP_BONUS_EURO_FREE_UNDER_15 = 517, AFFECT_EXP_BONUS_EURO_FREE_UNDER_15 = 517,
AFFECT_UNIQUE_ABILITY = 518, AFFECT_UNIQUE_ABILITY = 518,
@ -121,8 +121,8 @@ enum EAffectBits
AFF_SLOW, AFF_SLOW,
AFF_STUN, AFF_STUN,
AFF_DUNGEON_READY, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>غ<EFBFBD> <20><><EFBFBD><EFBFBD> AFF_DUNGEON_READY, // 던전에서 준비 상태
AFF_DUNGEON_UNIQUE, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ũ (Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20>ø<EFBFBD><C3B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>) AFF_DUNGEON_UNIQUE, // 던전 유니크 (클라이언트에서 컬링되지않음)
AFF_BUILDING_CONSTRUCTION_SMALL, AFF_BUILDING_CONSTRUCTION_SMALL,
AFF_BUILDING_CONSTRUCTION_LARGE, AFF_BUILDING_CONSTRUCTION_LARGE,
@ -133,34 +133,34 @@ enum EAffectBits
AFF_FISH_MIND, AFF_FISH_MIND,
AFF_JEONGWIHON, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȥ AFF_JEONGWIHON, // 전귀혼
AFF_GEOMGYEONG, // <EFBFBD>˰<EFBFBD> AFF_GEOMGYEONG, // 검경
AFF_CHEONGEUN, // õ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> AFF_CHEONGEUN, // 천근추
AFF_GYEONGGONG, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> AFF_GYEONGGONG, // 경공술
AFF_EUNHYUNG, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> AFF_EUNHYUNG, // 은형법
AFF_GWIGUM, // <EFBFBD>Ͱ<EFBFBD> AFF_GWIGUM, // 귀검
AFF_TERROR, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> AFF_TERROR, // 공포
AFF_JUMAGAP, // <EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD> AFF_JUMAGAP, // 주마갑
AFF_HOSIN, // ȣ<EFBFBD><EFBFBD> AFF_HOSIN, // 호신
AFF_BOHO, // <EFBFBD><EFBFBD>ȣ AFF_BOHO, // 보호
AFF_KWAESOK, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> AFF_KWAESOK, // 쾌속
AFF_MANASHIELD, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> AFF_MANASHIELD, // 마나쉴드
AFF_MUYEONG, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> affect AFF_MUYEONG, // 무영진 affect
AFF_REVIVE_INVISIBLE, // <EFBFBD><EFBFBD>Ȱ<EFBFBD><EFBFBD> <20><><EFBFBD>õ<EFBFBD><C3B5><EFBFBD> <20><><EFBFBD><EFBFBD> AFF_REVIVE_INVISIBLE, // 부활시 잠시동안 무적
AFF_FIRE, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> AFF_FIRE, // 지속 불 데미지
AFF_GICHEON, // <EFBFBD><EFBFBD>õ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> AFF_GICHEON, // 기천대공
AFF_JEUNGRYEOK, // <EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD> AFF_JEUNGRYEOK, // 증력술
AFF_TANHWAN_DASH, // źȯ<EFBFBD>ݿ<EFBFBD> <20>޸<EFBFBD><DEB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ AFF_TANHWAN_DASH, // 탄환격용 달리기어펙트
AFF_PABEOP, // <EFBFBD>Ĺ<EFBFBD><EFBFBD><EFBFBD> AFF_PABEOP, // 파법술
AFF_CHEONGEUN_WITH_FALL, // õ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> AFF_CHEONGEUN_WITH_FALL, // 천근추
AFF_POLYMORPH, AFF_POLYMORPH,
AFF_WAR_FLAG1, AFF_WAR_FLAG1,
AFF_WAR_FLAG2, AFF_WAR_FLAG2,
AFF_WAR_FLAG3, AFF_WAR_FLAG3,
AFF_CHINA_FIREWORK, AFF_CHINA_FIREWORK,
AFF_HAIR, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> AFF_HAIR, // 헤어
AFF_GERMANY, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> AFF_GERMANY, // 독일
AFF_BITS_MAX AFF_BITS_MAX
}; };
@ -170,11 +170,11 @@ extern void SendAffectAddPacket(LPDESC d, CAffect * pkAff);
// AFFECT_DURATION_BUG_FIX // AFFECT_DURATION_BUG_FIX
enum AffectVariable enum AffectVariable
{ {
// Affect<EFBFBD><EFBFBD> <20><><EFBFBD>Ѵ<EFBFBD><D1B4><EFBFBD> <20><><EFBFBD><20>־<EFBFBD><D6BE><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. // Affect가 무한대로 들어가 있어야 할 경우 사용.
// <EFBFBD>ð<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>̱<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ſ<EFBFBD> ū<><C5AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ѵ<20><><EFBFBD>ķ<EFBFBD><C4B7>̼<EFBFBD><CCBC><EFBFBD>. // 시간을 계속 줄이기 때문에 매우 큰값으로 무한대를 에뮬레이션함.
//// 24<EFBFBD><EFBFBD>Ʈ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD> 25<32><35>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD>. //// 24비트는 적으므로 25비트를 사용.
// ... 25<EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD>Ѵٰ<D1B4> <20>س<EFBFBD><D8B3><EFBFBD><EFBFBD><EFBFBD> 29bit <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20>ִ<EFBFBD> <20><>û<EFBFBD><C3BB> <20>ּ<EFBFBD><D6BC>̶<EFBFBD>... // ... 25비트 사용한다고 해놓고선 29bit 사용하고 있는 엄청난 주석이란...
// collect quest<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD> 60<36><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>, <20><><EFBFBD>⵵ 60<36><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. // collect quest에서 무한 시간을 60년으로 사용하고 있으므로, 여기도 60년으로 하자.
INFINITE_AFFECT_DURATION = 60 * 365 * 24 * 60 * 60 INFINITE_AFFECT_DURATION = 60 * 365 * 24 * 60 * 60
}; };

View File

@ -63,7 +63,7 @@ private:
TPCMap offer_map; TPCMap offer_map;
// sorting<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> members // sorting을 위한 members
public: public:
typedef std::vector <TAuctionItemInfo*> TItemInfoVec; typedef std::vector <TAuctionItemInfo*> TItemInfoVec;
private: private:
@ -76,7 +76,7 @@ private:
public: public:
void SortedItemInfos (TItemInfoVec& vec, BYTE grade, BYTE category, int start_idx, BYTE size, BYTE order[5]); void SortedItemInfos (TItemInfoVec& vec, BYTE grade, BYTE category, int start_idx, BYTE size, BYTE order[5]);
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Լ<EFBFBD>. // 나의 경매장을 위한 함수.
void YourItemInfoList (TItemInfoVec& vec, DWORD player_id, int start_idx, BYTE size); void YourItemInfoList (TItemInfoVec& vec, DWORD player_id, int start_idx, BYTE size);
}; };
@ -131,7 +131,7 @@ private:
typedef std::pair <int, bool> BidInfo; typedef std::pair <int, bool> BidInfo;
typedef std::map <DWORD, BidInfo > TItemMap; typedef std::map <DWORD, BidInfo > TItemMap;
typedef std::unordered_map <DWORD, TItemMap*> TMyBidBoard; typedef std::unordered_map <DWORD, TItemMap*> TMyBidBoard;
// bidder_id<EFBFBD><EFBFBD> key // bidder_id key
TMyBidBoard pc_map; TMyBidBoard pc_map;
public: public:
@ -144,7 +144,7 @@ public:
BidInfo GetMoney (DWORD player_id, DWORD item_id); BidInfo GetMoney (DWORD player_id, DWORD item_id);
bool Delete (DWORD player_id, DWORD item_id); bool Delete (DWORD player_id, DWORD item_id);
// <EFBFBD>̹<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. // 이미 있으면 덮어 씌운다.
void Insert (DWORD player_id, DWORD item_id, int money); void Insert (DWORD player_id, DWORD item_id, int money);
void Lock (DWORD player_id, DWORD item_id); void Lock (DWORD player_id, DWORD item_id);
void UnLock (DWORD player_id, DWORD item_id); void UnLock (DWORD player_id, DWORD item_id);
@ -156,7 +156,7 @@ private :
typedef std::unordered_map<DWORD, LPITEM> TItemMap; typedef std::unordered_map<DWORD, LPITEM> TItemMap;
TItemMap auction_item_map; TItemMap auction_item_map;
// auction<EFBFBD><EFBFBD> <20><><EFBFBD>ϵ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̺<EFBFBD><CCBA><EFBFBD> <20><><EFBFBD>Ե<EFBFBD><D4B5><EFBFBD> <20>ʴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20>͵<EFBFBD> // auction에 등록된 정보 중 가격, 등등 아이템 테이블에 포함되지 않는 정보들을 관리하는 것들
AuctionBoard Auction; AuctionBoard Auction;
SaleBoard Sale; SaleBoard Sale;
WishBoard Wish; WishBoard Wish;

View File

@ -3,7 +3,7 @@
#include "char.h" #include "char.h"
enum EBattleTypes // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> enum EBattleTypes // 상대방 기준
{ {
BATTLE_NONE, BATTLE_NONE,
BATTLE_DAMAGE, BATTLE_DAMAGE,
@ -30,7 +30,7 @@ extern void NormalAttackAffect(LPCHARACTER pkAttacker, LPCHARACTER pkVictim);
extern int battle_hit(LPCHARACTER ch, LPCHARACTER victim); extern int battle_hit(LPCHARACTER ch, LPCHARACTER victim);
// Ư<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> // 특성 공격
inline void AttackAffect(LPCHARACTER pkAttacker, inline void AttackAffect(LPCHARACTER pkAttacker,
LPCHARACTER pkVictim, LPCHARACTER pkVictim,
BYTE att_point, BYTE att_point,

View File

@ -13,7 +13,7 @@ public:
{ {
static TGradeUnit beltGradeByLevelTable[] = static TGradeUnit beltGradeByLevelTable[] =
{ {
0, // <EFBFBD><EFBFBD>Ʈ+0 0, // 벨트+0
1, // +1 1, // +1
1, // +2 1, // +2
2, // +3 2, // +3
@ -34,20 +34,20 @@ public:
return beltGradeByLevelTable[level]; return beltGradeByLevelTable[level];
} }
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̿<EFBFBD><CCBF><EFBFBD> <20><> <20>ִ<EFBFBD><D6B4><EFBFBD> <20><><EFBFBD><EFBFBD> // 현재 벨트 레벨을 기준으로, 어떤 셀들을 이용할 수 있는지 리턴
static const TGradeUnit* GetAvailableRuleTableByGrade() static const TGradeUnit* GetAvailableRuleTableByGrade()
{ {
/** /**
<EFBFBD><EFBFBD>Ʈ<EFBFBD><EFBFBD> <20><> +0 ~ +9 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> 7<>ܰ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>еǾ<D0B5> <20>κ<EFBFBD><CEBA><EFBFBD><E4B8AE> Ȱ<><C8B0> ȭ <20>ȴ<EFBFBD>. 벨트는 총 +0 ~ +9 레벨을 가질 수 있으며, 레벨에 따라 7단계 등급으로 구분되어 인벤토리가 활성 화 된다.
<EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ʒ<EFBFBD> <20>׸<EFBFBD><D7B8><EFBFBD> <20><><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> >= Ȱ<><C8B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD≯<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. 벨트 레벨에 따른 사용 가능한 셀은 아래 그림과 같음. 현재 등급 >= 활성가능 등급이면 사용 가능.
(<EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0<≯<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ұ<EFBFBD>, <20><>ȣ <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ڴ<EFBFBD> <20><><EFBFBD><EFBFBD>) (단, 현재 레벨이 0이면 무조건 사용 불가, 괄호 안의 숫자는 등급)
2(1) 4(2) 6(4) 8(6) 2(1) 4(2) 6(4) 8(6)
5(3) 5(3) 6(4) 8(6) 5(3) 5(3) 6(4) 8(6)
7(5) 7(5) 7(5) 8(6) 7(5) 7(5) 7(5) 8(6)
9(7) 9(7) 9(7) 9(7) 9(7) 9(7) 9(7) 9(7)
<EFBFBD><EFBFBD>Ʈ <20>κ<EFBFBD><CEBA><EFBFBD><E4B8AE> ũ<><C5A9><EFBFBD><EFBFBD> 4x4 (16ĭ) 벨트 인벤토리의 크기는 4x4 (16)
*/ */
static TGradeUnit availableRuleByGrade[BELT_INVENTORY_SLOT_COUNT] = { static TGradeUnit availableRuleByGrade[BELT_INVENTORY_SLOT_COUNT] = {
@ -62,14 +62,14 @@ public:
static bool IsAvailableCell(WORD cell, int beltGrade /*int beltLevel*/) static bool IsAvailableCell(WORD cell, int beltGrade /*int beltLevel*/)
{ {
// <EFBFBD><EFBFBD>ȹ <20><> <20>ٲ<EFBFBD>.. <20>Ƴ<EFBFBD>... // 기획 또 바뀜.. 아놔...
//const TGradeUnit beltGrade = GetBeltGradeByRefineLevel(beltLevel); //const TGradeUnit beltGrade = GetBeltGradeByRefineLevel(beltLevel);
const TGradeUnit* ruleTable = GetAvailableRuleTableByGrade(); const TGradeUnit* ruleTable = GetAvailableRuleTableByGrade();
return ruleTable[cell] <= beltGrade; return ruleTable[cell] <= beltGrade;
} }
/// pc<EFBFBD><EFBFBD> <20><>Ʈ <20>κ<EFBFBD><CEBA><EFBFBD><E4B8AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϳ<EFBFBD><CFB3><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><> <20>˻<EFBFBD><CBBB>ϴ<EFBFBD> <20>Լ<EFBFBD>. /// pc의 벨트 인벤토리에 아이템이 하나라도 존재하는 지 검사하는 함수.
static bool IsExistItemInBeltInventory(LPCHARACTER pc) static bool IsExistItemInBeltInventory(LPCHARACTER pc)
{ {
for (WORD i = BELT_INVENTORY_SLOT_START; i < BELT_INVENTORY_SLOT_END; ++i) for (WORD i = BELT_INVENTORY_SLOT_START; i < BELT_INVENTORY_SLOT_END; ++i)
@ -83,7 +83,7 @@ public:
return false; return false;
} }
/// item<EFBFBD><EFBFBD> <20><>Ʈ <20>κ<EFBFBD><CEBA><EFBFBD><E4B8AE> <20><><EFBFBD><20><> <20>ִ<EFBFBD> Ÿ<><C5B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>˻<EFBFBD><CBBB>ϴ<EFBFBD> <20>Լ<EFBFBD>. (<28><> <20><>Ģ<EFBFBD><C4A2> <20><>ȹ<EFBFBD>ڰ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>) /// item이 벨트 인벤토리에 들어갈 수 있는 타입인지 검사하는 함수. (이 규칙은 기획자가 결정함)
static bool CanMoveIntoBeltInventory(LPITEM item) static bool CanMoveIntoBeltInventory(LPITEM item)
{ {
bool canMove = false; bool canMove = false;

View File

@ -9,20 +9,20 @@ public:
CBuffOnAttributes(LPCHARACTER pOwner, BYTE m_point_type, std::vector <BYTE>* vec_buff_targets); CBuffOnAttributes(LPCHARACTER pOwner, BYTE m_point_type, std::vector <BYTE>* vec_buff_targets);
~CBuffOnAttributes(); ~CBuffOnAttributes();
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20≯鼭, m_p_vec_buff_wear_targets<EFBFBD><EFBFBD> <20>ش<EFBFBD><D8B4>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>, <20>ش<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ȿ<><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. // 장착 중 이면서, m_p_vec_buff_wear_targets에 해당하는 아이템인 경우, 해당 아이템으로 인해 붙은 효과를 제거.
void RemoveBuffFromItem(LPITEM pItem); void RemoveBuffFromItem(LPITEM pItem);
// m_p_vec_buff_wear_targets<EFBFBD><EFBFBD> <20>ش<EFBFBD><D8B4>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>, <20>ش<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> attribute<74><65> <20><><EFBFBD><EFBFBD> ȿ<><C8BF> <20>߰<EFBFBD>. // m_p_vec_buff_wear_targets에 해당하는 아이템인 경우, 해당 아이템의 attribute에 대한 효과 추가.
void AddBuffFromItem(LPITEM pItem); void AddBuffFromItem(LPITEM pItem);
// m_bBuffValue<EFBFBD><EFBFBD> <20>ٲٰ<D9B2>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ٲ<EFBFBD>. // m_bBuffValue를 바꾸고, 버프의 값도 바꿈.
void ChangeBuffValue(BYTE bNewValue); void ChangeBuffValue(BYTE bNewValue);
// CHRACTRE::ComputePoints<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ӽ<EFBFBD>ġ<EFBFBD><C4A1> <20>ʱ<EFBFBD>ȭ<EFBFBD>ϰ<EFBFBD> <20>ٽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϹǷ<CFB9>, // CHRACTRE::ComputePoints에서 속성치를 초기화하고 다시 계산하므로,
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ӽ<EFBFBD>ġ<EFBFBD><C4A1><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> owner<65><72><EFBFBD><EFBFBD> <20><>. // 버프 속성치들을 강제적으로 owner에게 줌.
void GiveAllAttributes(); void GiveAllAttributes();
// m_p_vec_buff_wear_targets<EFBFBD><EFBFBD> <20>ش<EFBFBD><D8B4>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> attribute<EFBFBD><EFBFBD> type<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ջ<EFBFBD><D5BB>ϰ<EFBFBD>, // m_p_vec_buff_wear_targets에 해당하는 모든 아이템의 attribute type별로 합산하고,
// <EFBFBD><EFBFBD> attribute<EFBFBD><EFBFBD><EFBFBD><EFBFBD> (m_bBuffValue)% <EFBFBD><EFBFBD>ŭ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>. // attribute들의 (m_bBuffValue)% 만큼을 버프로 줌.
bool On(BYTE bValue); bool On(BYTE bValue);
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>, <20>ʱ<EFBFBD>ȭ // 버프 제거 후, 초기화
void Off(); void Off();
void Initialize(); void Initialize();
@ -32,9 +32,9 @@ private:
BYTE m_bBuffValue; BYTE m_bBuffValue;
std::vector <BYTE>* m_p_vec_buff_wear_targets; std::vector <BYTE>* m_p_vec_buff_wear_targets;
// apply_type, apply_value <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> // apply_type, apply_value 페어의 맵
typedef std::map <BYTE, int> TMapAttr; typedef std::map <BYTE, int> TMapAttr;
// m_p_vec_buff_wear_targets<EFBFBD><EFBFBD> <20>ش<EFBFBD><D8B4>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> attribute<EFBFBD><EFBFBD> type<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ջ<EFBFBD><D5BB>Ͽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. // m_p_vec_buff_wear_targets에 해당하는 모든 아이템의 attribute type별로 합산하여 가지고 있음.
TMapAttr m_map_additional_attrs; TMapAttr m_map_additional_attrs;
}; };

View File

@ -9,36 +9,36 @@
#define _castle_h_ #define _castle_h_
#define MAX_CASTLE_GUARD_REGION 4 // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ġ <20><><EFBFBD><EFBFBD> #define MAX_CASTLE_GUARD_REGION 4 // 경비병 배치 구역
#define MAX_CASTLE_GUARD_PER_REGION 10 // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ġ<EFBFBD>Ҽ<EFBFBD><D2BC>ִ<EFBFBD> <20><><EFBFBD>񺴱׷<F1BAB4B1> #define MAX_CASTLE_GUARD_PER_REGION 10 // 한지역에 배치할수있는 경비병그룹
#define MAX_CASTLE_FROG 20 // Ȳ<EFBFBD><EFBFBD> <20>β<EFBFBD><CEB2><EFBFBD> #define MAX_CASTLE_FROG 20 // 황금 두꺼비
#define MAX_CASTLE_TOWER 10 // <EFBFBD><EFBFBD>ȭ <20>ִ<EFBFBD> <20><>ȯ <20><><EFBFBD><EFBFBD> #define MAX_CASTLE_TOWER 10 // 봉화 최대 소환 개수
#define MIN_CASTLE_TOWER 5 // <EFBFBD><EFBFBD>ȭ <20>ּ<EFBFBD> <20><>ȯ <20><><EFBFBD><EFBFBD> #define MIN_CASTLE_TOWER 5 // 봉화 최소 소환 개수
#define CASTLE_FROG_PRICE 100000000 // Ȳ<EFBFBD>ݵβ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> (1<EFBFBD><EFBFBD>) #define CASTLE_FROG_PRICE 100000000 // 황금두꺼비 가격 (1)
#define CASTLE_FROG_VNUM 11505 // Ȳ<EFBFBD>ݵβ<EFBFBD><EFBFBD><EFBFBD> <20><>ȣ #define CASTLE_FROG_VNUM 11505 // 황금두꺼비 번호
//#define CASTLE_TOWER_VNUM 11506 // <EFBFBD><EFBFBD>ȭ <20><>ȣ //#define CASTLE_TOWER_VNUM 11506 // 봉화 번호
#define IS_CASTLE_MAP(map) (181==(map)||182==(map)||(183)==(map)) #define IS_CASTLE_MAP(map) (181==(map)||182==(map)||(183)==(map))
//#define IS_CASTLE_TOWER(vnum) (11506==(vnum)||11507==(vnum)||11508==(vnum)||11509==(vnum) || 11510==(vnum)) //#define IS_CASTLE_TOWER(vnum) (11506==(vnum)||11507==(vnum)||11508==(vnum)||11509==(vnum) || 11510==(vnum))
enum CASTLE_STATE enum CASTLE_STATE
{ {
CASTLE_SIEGE_NONE, // <EFBFBD><EFBFBD>ȭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> CASTLE_SIEGE_NONE, // 평화모드
CASTLE_SIEGE_STRUGGLE, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> CASTLE_SIEGE_STRUGGLE, // 공성중
CASTLE_SIEGE_END // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ߴٸ<DFB4> 1<>ð<EFBFBD><C3B0><EFBFBD><EFBFBD><EFBFBD> <20><>ȭ<EFBFBD><C8AD> <20><> <20><> <20>ִ<EFBFBD>. CASTLE_SIEGE_END // 수성에 성공했다면 1시간동안 봉화를 깰 수 있다.
}; };
struct CASTLE_DATA struct CASTLE_DATA
{ {
LPCHARACTER frog[MAX_CASTLE_FROG]; // Ȳ<EFBFBD>ݵβ<EFBFBD><EFBFBD><EFBFBD> LPCHARACTER frog[MAX_CASTLE_FROG]; // 황금두꺼비
LPCHARACTER guard[MAX_CASTLE_GUARD_REGION][MAX_CASTLE_GUARD_PER_REGION]; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> LPCHARACTER guard[MAX_CASTLE_GUARD_REGION][MAX_CASTLE_GUARD_PER_REGION]; // 경비병 리더
DWORD guard_group[MAX_CASTLE_GUARD_REGION][MAX_CASTLE_GUARD_PER_REGION]; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> DWORD guard_group[MAX_CASTLE_GUARD_REGION][MAX_CASTLE_GUARD_PER_REGION]; // 경비병 리더
LPCHARACTER tower[MAX_CASTLE_TOWER]; // <EFBFBD><EFBFBD>ȭ LPCHARACTER tower[MAX_CASTLE_TOWER]; // 봉화
LPEVENT siege_event; LPEVENT siege_event;
LPEVENT stone_event; LPEVENT stone_event;

View File

@ -83,7 +83,7 @@ enum EDamageType
DAMAGE_TYPE_NONE, DAMAGE_TYPE_NONE,
DAMAGE_TYPE_NORMAL, DAMAGE_TYPE_NORMAL,
DAMAGE_TYPE_NORMAL_RANGE, DAMAGE_TYPE_NORMAL_RANGE,
//<EFBFBD><EFBFBD>ų //스킬
DAMAGE_TYPE_MELEE, DAMAGE_TYPE_MELEE,
DAMAGE_TYPE_RANGE, DAMAGE_TYPE_RANGE,
DAMAGE_TYPE_FIRE, DAMAGE_TYPE_FIRE,
@ -105,103 +105,103 @@ enum EPointTypes
POINT_MAX_HP, // 6 POINT_MAX_HP, // 6
POINT_SP, // 7 POINT_SP, // 7
POINT_MAX_SP, // 8 POINT_MAX_SP, // 8
POINT_STAMINA, // 9 <EFBFBD><EFBFBD><EFBFBD>׹̳<EFBFBD> POINT_STAMINA, // 9 스테미너
POINT_MAX_STAMINA, // 10 <EFBFBD>ִ<EFBFBD> <20><><EFBFBD>׹̳<D7B9> POINT_MAX_STAMINA, // 10 최대 스테미너
POINT_GOLD, // 11 POINT_GOLD, // 11
POINT_ST, // 12 <EFBFBD>ٷ<EFBFBD> POINT_ST, // 12 근력
POINT_HT, // 13 ü<EFBFBD><EFBFBD> POINT_HT, // 13 체력
POINT_DX, // 14 <EFBFBD><EFBFBD>ø<EFBFBD><EFBFBD> POINT_DX, // 14 민첩성
POINT_IQ, // 15 <EFBFBD><EFBFBD><EFBFBD>ŷ<EFBFBD> POINT_IQ, // 15 정신력
POINT_DEF_GRADE, // 16 ... POINT_DEF_GRADE, // 16 ...
POINT_ATT_SPEED, // 17 <EFBFBD><EFBFBD><EFBFBD>ݼӵ<EFBFBD> POINT_ATT_SPEED, // 17 공격속도
POINT_ATT_GRADE, // 18 <EFBFBD><EFBFBD><EFBFBD>ݷ<EFBFBD> MAX POINT_ATT_GRADE, // 18 공격력 MAX
POINT_MOV_SPEED, // 19 <EFBFBD>̵<EFBFBD><EFBFBD>ӵ<EFBFBD> POINT_MOV_SPEED, // 19 이동속도
POINT_CLIENT_DEF_GRADE, // 20 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> POINT_CLIENT_DEF_GRADE, // 20 방어등급
POINT_CASTING_SPEED, // 21 <EFBFBD>ֹ<EFBFBD><EFBFBD>ӵ<EFBFBD> (<28><><EFBFBD>ٿ<EFBFBD>Ÿ<EFBFBD><C5B8>*100) / (100 + <EFBFBD>̰<EFBFBD>) = <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ٿ<EFBFBD> Ÿ<><C5B8> POINT_CASTING_SPEED, // 21 주문속도 (쿨다운타임*100) / (100 + 이값) = 최종 쿨다운 타임
POINT_MAGIC_ATT_GRADE, // 22 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݷ<EFBFBD> POINT_MAGIC_ATT_GRADE, // 22 마법공격력
POINT_MAGIC_DEF_GRADE, // 23 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> POINT_MAGIC_DEF_GRADE, // 23 마법방어력
POINT_EMPIRE_POINT, // 24 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> POINT_EMPIRE_POINT, // 24 제국점수
POINT_LEVEL_STEP, // 25 <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ܰ<EFBFBD>.. (1 2 3 <20><> <20><> <20><><EFBFBD><EFBFBD>, 4 <20>Ǹ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>) POINT_LEVEL_STEP, // 25 한 레벨에서의 단계.. (1 2 3 될 때 보상, 4 되면 레벨 업)
POINT_STAT, // 26 <EFBFBD>ɷ<EFBFBD>ġ <20>ø<EFBFBD> <20><> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> POINT_STAT, // 26 능력치 올릴 수 있는 개수
POINT_SUB_SKILL, // 27 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD>Ʈ POINT_SUB_SKILL, // 27 보조 스킬 포인트
POINT_SKILL, // 28 <EFBFBD><EFBFBD>Ƽ<EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD>Ʈ POINT_SKILL, // 28 액티브 스킬 포인트
POINT_WEAPON_MIN, // 29 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ּ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> POINT_WEAPON_MIN, // 29 무기 최소 데미지
POINT_WEAPON_MAX, // 30 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> POINT_WEAPON_MAX, // 30 무기 최대 데미지
POINT_PLAYTIME, // 31 <EFBFBD>÷<EFBFBD><EFBFBD>̽ð<EFBFBD> POINT_PLAYTIME, // 31 플레이시간
POINT_HP_REGEN, // 32 HP ȸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> POINT_HP_REGEN, // 32 HP 회복률
POINT_SP_REGEN, // 33 SP ȸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> POINT_SP_REGEN, // 33 SP 회복률
POINT_BOW_DISTANCE, // 34 Ȱ <20><><EFBFBD><EFBFBD><EFBFBD>Ÿ<EFBFBD> <20><><EFBFBD><EFBFBD>ġ (meter) POINT_BOW_DISTANCE, // 34 활 사정거리 증가치 (meter)
POINT_HP_RECOVERY, // 35 ü<EFBFBD><EFBFBD> ȸ<><C8B8> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> POINT_HP_RECOVERY, // 35 체력 회복 증가량
POINT_SP_RECOVERY, // 36 <EFBFBD><EFBFBD><EFBFBD>ŷ<EFBFBD> ȸ<><C8B8> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> POINT_SP_RECOVERY, // 36 정신력 회복 증가량
POINT_POISON_PCT, // 37 <EFBFBD><EFBFBD> Ȯ<><C8AE> POINT_POISON_PCT, // 37 독 확률
POINT_STUN_PCT, // 38 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ȯ<><C8AE> POINT_STUN_PCT, // 38 기절 확률
POINT_SLOW_PCT, // 39 <EFBFBD><EFBFBD><EFBFBD>ο<EFBFBD> Ȯ<><C8AE> POINT_SLOW_PCT, // 39 슬로우 확률
POINT_CRITICAL_PCT, // 40 ũ<EFBFBD><EFBFBD>Ƽ<EFBFBD><EFBFBD> Ȯ<><C8AE> POINT_CRITICAL_PCT, // 40 크리티컬 확률
POINT_PENETRATE_PCT, // 41 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ÿ<EFBFBD><EFBFBD> Ȯ<><C8AE> POINT_PENETRATE_PCT, // 41 관통타격 확률
POINT_CURSE_PCT, // 42 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ȯ<><C8AE> POINT_CURSE_PCT, // 42 저주 확률
POINT_ATTBONUS_HUMAN, // 43 <EFBFBD>ΰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> POINT_ATTBONUS_HUMAN, // 43 인간에게 강함
POINT_ATTBONUS_ANIMAL, // 44 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> % <20><><EFBFBD><EFBFBD> POINT_ATTBONUS_ANIMAL, // 44 동물에게 데미지 % 증가
POINT_ATTBONUS_ORC, // 45 <EFBFBD><EFBFBD><EFBFBD>Ϳ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> % <20><><EFBFBD><EFBFBD> POINT_ATTBONUS_ORC, // 45 웅귀에게 데미지 % 증가
POINT_ATTBONUS_MILGYO, // 46 <EFBFBD>б<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> % <20><><EFBFBD><EFBFBD> POINT_ATTBONUS_MILGYO, // 46 밀교에게 데미지 % 증가
POINT_ATTBONUS_UNDEAD, // 47 <EFBFBD><EFBFBD>ü<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> % <20><><EFBFBD><EFBFBD> POINT_ATTBONUS_UNDEAD, // 47 시체에게 데미지 % 증가
POINT_ATTBONUS_DEVIL, // 48 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<28>Ǹ<EFBFBD>)<29><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> % <20><><EFBFBD><EFBFBD> POINT_ATTBONUS_DEVIL, // 48 마귀(악마)에게 데미지 % 증가
POINT_ATTBONUS_INSECT, // 49 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> POINT_ATTBONUS_INSECT, // 49 벌레족
POINT_ATTBONUS_FIRE, // 50 ȭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> POINT_ATTBONUS_FIRE, // 50 화염족
POINT_ATTBONUS_ICE, // 51 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> POINT_ATTBONUS_ICE, // 51 빙설족
POINT_ATTBONUS_DESERT, // 52 <EFBFBD><EFBFBD><EFBFBD> POINT_ATTBONUS_DESERT, // 52 사막족
POINT_ATTBONUS_MONSTER, // 53 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ϳ<EFBFBD><CDBF><EFBFBD> <20><><EFBFBD><EFBFBD> POINT_ATTBONUS_MONSTER, // 53 모든 몬스터에게 강함
POINT_ATTBONUS_WARRIOR, // 54 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> POINT_ATTBONUS_WARRIOR, // 54 무사에게 강함
POINT_ATTBONUS_ASSASSIN, // 55 <EFBFBD>ڰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> POINT_ATTBONUS_ASSASSIN, // 55 자객에게 강함
POINT_ATTBONUS_SURA, // 56 <EFBFBD><EFBFBD><EFBFBD>󿡰<EFBFBD> <20><><EFBFBD><EFBFBD> POINT_ATTBONUS_SURA, // 56 수라에게 강함
POINT_ATTBONUS_SHAMAN, // 57 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> POINT_ATTBONUS_SHAMAN, // 57 무당에게 강함
POINT_ATTBONUS_TREE, // 58 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> 20050729.myevan UNUSED5 POINT_ATTBONUS_TREE, // 58 나무에게 강함 20050729.myevan UNUSED5
POINT_RESIST_WARRIOR, // 59 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> POINT_RESIST_WARRIOR, // 59 무사에게 저항
POINT_RESIST_ASSASSIN, // 60 <EFBFBD>ڰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> POINT_RESIST_ASSASSIN, // 60 자객에게 저항
POINT_RESIST_SURA, // 61 <EFBFBD><EFBFBD><EFBFBD>󿡰<EFBFBD> <20><><EFBFBD><EFBFBD> POINT_RESIST_SURA, // 61 수라에게 저항
POINT_RESIST_SHAMAN, // 62 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> POINT_RESIST_SHAMAN, // 62 무당에게 저항
POINT_STEAL_HP, // 63 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> POINT_STEAL_HP, // 63 생명력 흡수
POINT_STEAL_SP, // 64 <EFBFBD><EFBFBD><EFBFBD>ŷ<EFBFBD> <20><><EFBFBD><EFBFBD> POINT_STEAL_SP, // 64 정신력 흡수
POINT_MANA_BURN_PCT, // 65 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> POINT_MANA_BURN_PCT, // 65 마나 번
/// <EFBFBD><EFBFBD><EFBFBD>ؽ<EFBFBD> <20><><EFBFBD>ʽ<EFBFBD> /// /// 피해시 보너스 ///
POINT_DAMAGE_SP_RECOVER, // 66 <EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD>ŷ<EFBFBD> ȸ<><C8B8> Ȯ<><C8AE> POINT_DAMAGE_SP_RECOVER, // 66 공격당할 시 정신력 회복 확률
POINT_BLOCK, // 67 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> POINT_BLOCK, // 67 블럭율
POINT_DODGE, // 68 ȸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> POINT_DODGE, // 68 회피율
POINT_RESIST_SWORD, // 69 POINT_RESIST_SWORD, // 69
POINT_RESIST_TWOHAND, // 70 POINT_RESIST_TWOHAND, // 70
POINT_RESIST_DAGGER, // 71 POINT_RESIST_DAGGER, // 71
POINT_RESIST_BELL, // 72 POINT_RESIST_BELL, // 72
POINT_RESIST_FAN, // 73 POINT_RESIST_FAN, // 73
POINT_RESIST_BOW, // 74 ȭ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> POINT_RESIST_BOW, // 74 화살 저항 : 대미지 감소
POINT_RESIST_FIRE, // 75 ȭ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : ȭ<><C8AD><EFBFBD><EFBFBD><EFBFBD>ݿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> POINT_RESIST_FIRE, // 75 화염 저항 : 화염공격에 대한 대미지 감소
POINT_RESIST_ELEC, // 76 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> POINT_RESIST_ELEC, // 76 전기 저항 : 전기공격에 대한 대미지 감소
POINT_RESIST_MAGIC, // 77 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> POINT_RESIST_MAGIC, // 77 술법 저항 : 모든술법에 대한 대미지 감소
POINT_RESIST_WIND, // 78 <EFBFBD>ٶ<EFBFBD> <20><><EFBFBD><EFBFBD> : <20>ٶ<EFBFBD><D9B6><EFBFBD><EFBFBD>ݿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> POINT_RESIST_WIND, // 78 바람 저항 : 바람공격에 대한 대미지 감소
POINT_REFLECT_MELEE, // 79 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ݻ<EFBFBD> POINT_REFLECT_MELEE, // 79 공격 반사
/// Ư<EFBFBD><EFBFBD> <20><><EFBFBD>ؽ<EFBFBD> /// /// 특수 피해시 ///
POINT_REFLECT_CURSE, // 80 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ݻ<EFBFBD> POINT_REFLECT_CURSE, // 80 저주 반사
POINT_POISON_REDUCE, // 81 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> POINT_POISON_REDUCE, // 81 독데미지 감소
/// <EFBFBD><EFBFBD> <20>Ҹ<EFBFBD><D2B8><EFBFBD> /// /// 적 소멸시 ///
POINT_KILL_SP_RECOVER, // 82 <EFBFBD><EFBFBD> <20>Ҹ<EFBFBD><D2B8><EFBFBD> MP ȸ<EFBFBD><EFBFBD> POINT_KILL_SP_RECOVER, // 82 적 소멸시 MP 회복
POINT_EXP_DOUBLE_BONUS, // 83 POINT_EXP_DOUBLE_BONUS, // 83
POINT_GOLD_DOUBLE_BONUS, // 84 POINT_GOLD_DOUBLE_BONUS, // 84
POINT_ITEM_DROP_BONUS, // 85 POINT_ITEM_DROP_BONUS, // 85
/// ȸ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> /// /// 회복 관련 ///
POINT_POTION_BONUS, // 86 POINT_POTION_BONUS, // 86
POINT_KILL_HP_RECOVERY, // 87 POINT_KILL_HP_RECOVERY, // 87
@ -225,7 +225,7 @@ enum EPointTypes
POINT_HIT_HP_RECOVERY, // 100 POINT_HIT_HP_RECOVERY, // 100
POINT_HIT_SP_RECOVERY, // 101 POINT_HIT_SP_RECOVERY, // 101
POINT_MANASHIELD, // 102 <EFBFBD><EFBFBD><EFBFBD>ż<EFBFBD>ȣ <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ȿ<><C8BF> <20><><EFBFBD><EFBFBD> POINT_MANASHIELD, // 102 흑신수호 스킬에 의한 마나쉴드 효과 정도
POINT_PARTY_BUFFER_BONUS, // 103 POINT_PARTY_BUFFER_BONUS, // 103
POINT_PARTY_SKILL_MASTER_BONUS, // 104 POINT_PARTY_SKILL_MASTER_BONUS, // 104
@ -234,56 +234,56 @@ enum EPointTypes
POINT_SP_RECOVER_CONTINUE, // 106 POINT_SP_RECOVER_CONTINUE, // 106
POINT_STEAL_GOLD, // 107 POINT_STEAL_GOLD, // 107
POINT_POLYMORPH, // 108 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȣ POINT_POLYMORPH, // 108 변신한 몬스터 번호
POINT_MOUNT, // 109 Ÿ<EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȣ POINT_MOUNT, // 109 타고있는 몬스터 번호
POINT_PARTY_HASTE_BONUS, // 110 POINT_PARTY_HASTE_BONUS, // 110
POINT_PARTY_DEFENDER_BONUS, // 111 POINT_PARTY_DEFENDER_BONUS, // 111
POINT_STAT_RESET_COUNT, // 112 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ܾ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ (1<><31> 1<><31><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD>°<EFBFBD><C2B0><EFBFBD>) POINT_STAT_RESET_COUNT, // 112 피의 단약 사용을 통한 스텟 리셋 포인트 (1당 1포인트 리셋가능)
POINT_HORSE_SKILL, // 113 POINT_HORSE_SKILL, // 113
POINT_MALL_ATTBONUS, // 114 <EFBFBD><EFBFBD><EFBFBD>ݷ<EFBFBD> +x% POINT_MALL_ATTBONUS, // 114 공격력 +x%
POINT_MALL_DEFBONUS, // 115 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> +x% POINT_MALL_DEFBONUS, // 115 방어력 +x%
POINT_MALL_EXPBONUS, // 116 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ġ +x% POINT_MALL_EXPBONUS, // 116 경험치 +x%
POINT_MALL_ITEMBONUS, // 117 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> x/10<EFBFBD><EFBFBD> POINT_MALL_ITEMBONUS, // 117 아이템 드롭율 x/10
POINT_MALL_GOLDBONUS, // 118 <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> x/10<EFBFBD><EFBFBD> POINT_MALL_GOLDBONUS, // 118 돈 드롭율 x/10
POINT_MAX_HP_PCT, // 119 <EFBFBD>ִ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> +x% POINT_MAX_HP_PCT, // 119 최대생명력 +x%
POINT_MAX_SP_PCT, // 120 <EFBFBD>ִ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ŷ<EFBFBD> +x% POINT_MAX_SP_PCT, // 120 최대정신력 +x%
POINT_SKILL_DAMAGE_BONUS, // 121 <EFBFBD><EFBFBD>ų <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> *(100+x)% POINT_SKILL_DAMAGE_BONUS, // 121 스킬 데미지 *(100+x)%
POINT_NORMAL_HIT_DAMAGE_BONUS, // 122 <EFBFBD><EFBFBD>Ÿ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> *(100+x)% POINT_NORMAL_HIT_DAMAGE_BONUS, // 122 평타 데미지 *(100+x)%
// DEFEND_BONUS_ATTRIBUTES // DEFEND_BONUS_ATTRIBUTES
POINT_SKILL_DEFEND_BONUS, // 123 <EFBFBD><EFBFBD>ų <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> POINT_SKILL_DEFEND_BONUS, // 123 스킬 방어 데미지
POINT_NORMAL_HIT_DEFEND_BONUS, // 124 <EFBFBD><EFBFBD>Ÿ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> POINT_NORMAL_HIT_DEFEND_BONUS, // 124 평타 방어 데미지
// END_OF_DEFEND_BONUS_ATTRIBUTES // END_OF_DEFEND_BONUS_ATTRIBUTES
// PC_BANG_ITEM_ADD // PC_BANG_ITEM_ADD
POINT_PC_BANG_EXP_BONUS, // 125 PC<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ġ <20><><EFBFBD>ʽ<EFBFBD> POINT_PC_BANG_EXP_BONUS, // 125 PC방 전용 경험치 보너스
POINT_PC_BANG_DROP_BONUS, // 126 PC<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ӷ<EFBFBD> <20><><EFBFBD>ʽ<EFBFBD> POINT_PC_BANG_DROP_BONUS, // 126 PC방 전용 드롭률 보너스
// END_PC_BANG_ITEM_ADD // END_PC_BANG_ITEM_ADD
POINT_RAMADAN_CANDY_BONUS_EXP, // <EFBFBD>󸶴<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ġ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> POINT_RAMADAN_CANDY_BONUS_EXP, // 라마단 사탕 경험치 증가용
POINT_ENERGY = 128, // 128 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> POINT_ENERGY = 128, // 128 기력
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> ui <EFBFBD><EFBFBD>. // 기력 ui .
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʱ⸸, Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>ð<EFBFBD><C3B0><EFBFBD> POINT<4E><54> <20><><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̷<EFBFBD><CCB7><EFBFBD> <20>Ѵ<EFBFBD>. // 서버에서 쓰지 않기만, 클라이언트에서 기력의 끝 시간을 POINT로 관리하기 때문에 이렇게 한다.
// <EFBFBD><EFBFBD> <20>β<EFBFBD><CEB2><EFBFBD><EFBFBD><EFBFBD> // 아 부끄럽다
POINT_ENERGY_END_TIME = 129, // 129 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD> POINT_ENERGY_END_TIME = 129, // 129 기력 종료 시간
POINT_COSTUME_ATTR_BONUS = 130, POINT_COSTUME_ATTR_BONUS = 130,
POINT_MAGIC_ATT_BONUS_PER = 131, POINT_MAGIC_ATT_BONUS_PER = 131,
POINT_MELEE_MAGIC_ATT_BONUS_PER = 132, POINT_MELEE_MAGIC_ATT_BONUS_PER = 132,
// <EFBFBD>߰<EFBFBD> <20>Ӽ<EFBFBD> <20><><EFBFBD><EFBFBD> // 추가 속성 저항
POINT_RESIST_ICE = 133, // <EFBFBD>ñ<EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> POINT_RESIST_ICE = 133, // 냉기 저항 : 얼음공격에 대한 대미지 감소
POINT_RESIST_EARTH = 134, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> POINT_RESIST_EARTH = 134, // 대지 저항 : 얼음공격에 대한 대미지 감소
POINT_RESIST_DARK = 135, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> POINT_RESIST_DARK = 135, // 어둠 저항 : 얼음공격에 대한 대미지 감소
POINT_RESIST_CRITICAL = 136, // ũ<EFBFBD><EFBFBD>Ƽ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ũ<><C5A9>Ƽ<EFBFBD><C6BC> Ȯ<><C8AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> POINT_RESIST_CRITICAL = 136, // 크리티컬 저항 : 상대의 크리티컬 확률을 감소
POINT_RESIST_PENETRATE = 137, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ÿ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ÿ<EFBFBD><C5B8> Ȯ<><C8AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> POINT_RESIST_PENETRATE = 137, // 관통타격 저항 : 상대의 관통타격 확률을 감소
//POINT_MAX_NUM = 129 common/length.h //POINT_MAX_NUM = 129 common/length.h
}; };
@ -352,7 +352,7 @@ struct DynamicCharacterPtr {
uint32_t id; uint32_t id;
}; };
/* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */ /* 저장하는 데이터 */
typedef struct character_point typedef struct character_point
{ {
int points[POINT_MAX_NUM]; int points[POINT_MAX_NUM];
@ -375,7 +375,7 @@ typedef struct character_point
BYTE skill_group; BYTE skill_group;
} CHARACTER_POINT; } CHARACTER_POINT;
/* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ<EFBFBD> ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */ /* 저장되지 않는 캐릭터 데이터 */
typedef struct character_point_instant typedef struct character_point_instant
{ {
int points[POINT_MAX_NUM]; int points[POINT_MAX_NUM];
@ -397,7 +397,7 @@ typedef struct character_point_instant
LPITEM pItems[INVENTORY_AND_EQUIP_SLOT_MAX]; LPITEM pItems[INVENTORY_AND_EQUIP_SLOT_MAX];
BYTE bItemGrid[INVENTORY_AND_EQUIP_SLOT_MAX]; BYTE bItemGrid[INVENTORY_AND_EQUIP_SLOT_MAX];
// <EFBFBD><EFBFBD>ȥ<EFBFBD><EFBFBD> <20>κ<EFBFBD><CEBA>. // 용혼석 인벤토리.
LPITEM pDSItems[DRAGON_SOUL_INVENTORY_MAX_NUM]; LPITEM pDSItems[DRAGON_SOUL_INVENTORY_MAX_NUM];
WORD wDSItemGrid[DRAGON_SOUL_INVENTORY_MAX_NUM]; WORD wDSItemGrid[DRAGON_SOUL_INVENTORY_MAX_NUM];
@ -409,7 +409,7 @@ typedef struct character_point_instant
BYTE gm_level; BYTE gm_level;
BYTE bBasePart; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȣ BYTE bBasePart; // 평상복 번호
int iMaxStamina; int iMaxStamina;
@ -507,7 +507,7 @@ class CHARACTER : public CEntity, public CFSM, public CHorseRider
{ {
protected: protected:
////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////
// Entity <EFBFBD><EFBFBD><EFBFBD><EFBFBD> // Entity 관련
virtual void EncodeInsertPacket(LPENTITY entity); virtual void EncodeInsertPacket(LPENTITY entity);
virtual void EncodeRemovePacket(LPENTITY entity); virtual void EncodeRemovePacket(LPENTITY entity);
////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////
@ -517,7 +517,7 @@ class CHARACTER : public CEntity, public CFSM, public CHorseRider
void UpdatePacket(); void UpdatePacket();
////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////
// FSM (Finite State Machine) <EFBFBD><EFBFBD><EFBFBD><EFBFBD> // FSM (Finite State Machine) 관련
protected: protected:
CStateTemplate<CHARACTER> m_stateMove; CStateTemplate<CHARACTER> m_stateMove;
CStateTemplate<CHARACTER> m_stateBattle; CStateTemplate<CHARACTER> m_stateBattle;
@ -587,13 +587,13 @@ class CHARACTER : public CEntity, public CFSM, public CHorseRider
DWORD GetPlayerID() const { return m_dwPlayerID; } DWORD GetPlayerID() const { return m_dwPlayerID; }
void SetPlayerProto(const TPlayerTable * table); void SetPlayerProto(const TPlayerTable * table);
void CreatePlayerProto(TPlayerTable & tab); // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> void CreatePlayerProto(TPlayerTable & tab); // 저장 시 사용
void SetProto(const CMob * c_pkMob); void SetProto(const CMob * c_pkMob);
WORD GetRaceNum() const; WORD GetRaceNum() const;
void Save(); // DelayedSave void Save(); // DelayedSave
void SaveReal(); // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> void SaveReal(); // 실제 저장
void FlushDelayedSaveItem(); void FlushDelayedSaveItem();
const char * GetName() const; const char * GetName() const;
@ -634,7 +634,7 @@ class CHARACTER : public CEntity, public CFSM, public CHorseRider
DWORD GetExp() const { return m_points.exp; } DWORD GetExp() const { return m_points.exp; }
void SetExp(DWORD exp) { m_points.exp = exp; } void SetExp(DWORD exp) { m_points.exp = exp; }
DWORD GetNextExp() const; DWORD GetNextExp() const;
LPCHARACTER DistributeExp(); // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>. LPCHARACTER DistributeExp(); // 제일 많이 때린 사람을 리턴한다.
void DistributeHP(LPCHARACTER pkKiller); void DistributeHP(LPCHARACTER pkKiller);
void DistributeSP(LPCHARACTER pkKiller, int iMethod=0); void DistributeSP(LPCHARACTER pkKiller, int iMethod=0);
@ -717,14 +717,14 @@ class CHARACTER : public CEntity, public CFSM, public CHorseRider
DWORD GetPolymorphItemVnum() const; DWORD GetPolymorphItemVnum() const;
DWORD GetMonsterDrainSPPoint() const; DWORD GetMonsterDrainSPPoint() const;
void MainCharacterPacket(); // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ij<EFBFBD><C4B3><EFBFBD>Ͷ<EFBFBD><CDB6><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>. void MainCharacterPacket(); // 내가 메인캐릭터라고 보내준다.
void ComputePoints(); void ComputePoints();
void ComputeBattlePoints(); void ComputeBattlePoints();
void PointChange(BYTE type, int amount, bool bAmount = false, bool bBroadcast = false); void PointChange(BYTE type, int amount, bool bAmount = false, bool bBroadcast = false);
void PointsPacket(); void PointsPacket();
void ApplyPoint(BYTE bApplyType, int iVal); void ApplyPoint(BYTE bApplyType, int iVal);
void CheckMaximumPoints(); // HP, SP <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ִ밪 <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>˻<EFBFBD><CBBB>ϰ<EFBFBD> <20><><EFBFBD>ٸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. void CheckMaximumPoints(); // HP, SP 등의 현재 값이 최대값 보다 높은지 검사하고 높다면 낮춘다.
bool Show(int lMapIndex, int x, int y, int z = INT_MAX, bool bShowSpawnMotion = false); bool Show(int lMapIndex, int x, int y, int z = INT_MAX, bool bShowSpawnMotion = false);
@ -749,7 +749,7 @@ class CHARACTER : public CEntity, public CFSM, public CHorseRider
bool IsBlockMode(BYTE bFlag) const { return (m_pointsInstant.bBlockMode & bFlag)?true:false; } bool IsBlockMode(BYTE bFlag) const { return (m_pointsInstant.bBlockMode & bFlag)?true:false; }
bool IsPolymorphed() const { return m_dwPolymorphRace>0; } bool IsPolymorphed() const { return m_dwPolymorphRace>0; }
bool IsPolyMaintainStat() const { return m_bPolyMaintainStat; } // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. bool IsPolyMaintainStat() const { return m_bPolyMaintainStat; } // 이전 스텟을 유지하는 폴리모프.
void SetPolymorph(DWORD dwRaceNum, bool bMaintainStat = false); void SetPolymorph(DWORD dwRaceNum, bool bMaintainStat = false);
DWORD GetPolymorphVnum() const { return m_dwPolymorphRace; } DWORD GetPolymorphVnum() const { return m_dwPolymorphRace; }
int GetPolymorphPower() const; int GetPolymorphPower() const;
@ -806,15 +806,15 @@ class CHARACTER : public CEntity, public CFSM, public CHorseRider
void SetNowWalking(bool bWalkFlag); void SetNowWalking(bool bWalkFlag);
void ResetWalking() { SetNowWalking(m_bWalking); } void ResetWalking() { SetNowWalking(m_bWalking); }
bool Goto(int x, int y); // <EFBFBD>ٷ<EFBFBD> <20>̵<EFBFBD> <20><>Ű<EFBFBD><C5B0> <20>ʰ<EFBFBD> <20><>ǥ <20><>ġ<EFBFBD><C4A1> BLENDING <EFBFBD><EFBFBD>Ų<EFBFBD><EFBFBD>. bool Goto(int x, int y); // 바로 이동 시키지 않고 목표 위치로 BLENDING 시킨다.
void Stop(); void Stop();
bool CanMove() const; // <EFBFBD>̵<EFBFBD><EFBFBD><EFBFBD> <20><> <20>ִ°<D6B4>? bool CanMove() const; // 이동할 수 있는가?
void SyncPacket(); void SyncPacket();
bool Sync(int x, int y); // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>޼ҵ<DEBC><D2B5><EFBFBD> <20>̵<EFBFBD> <20>Ѵ<EFBFBD> (<28><> <20><> <20><><EFBFBD>ǿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>̵<EFBFBD> <20>Ұ<EFBFBD><D2B0><EFBFBD> <20><><EFBFBD><EFBFBD>) bool Sync(int x, int y); // 실제 이 메소드로 이동 한다 (각 종 조건에 의한 이동 불가가 없음)
bool Move(int x, int y); // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>˻<EFBFBD><CBBB>ϰ<EFBFBD> Sync <20>޼ҵ带 <20><><EFBFBD><EFBFBD> <20>̵<EFBFBD> <20>Ѵ<EFBFBD>. bool Move(int x, int y); // 조건을 검사하고 Sync 메소드를 통해 이동 한다.
void OnMove(bool bIsAttack = false); // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>϶<EFBFBD> <20>Ҹ<EFBFBD><D2B8><EFBFBD>. Move() <20>޼ҵ<DEBC> <20>̿ܿ<CCBF><DCBF><EFBFBD><EFBFBD><EFBFBD> <20>Ҹ<EFBFBD> <20><> <20>ִ<EFBFBD>. void OnMove(bool bIsAttack = false); // 움직일때 불린다. Move() 메소드 이외에서도 불릴 수 있다.
DWORD GetMotionMode() const; DWORD GetMotionMode() const;
float GetMoveMotionSpeed() const; float GetMoveMotionSpeed() const;
float GetMoveSpeed() const; float GetMoveSpeed() const;
@ -825,7 +825,7 @@ class CHARACTER : public CEntity, public CFSM, public CHorseRider
DWORD GetLastMoveTime() const { return m_dwLastMoveTime; } DWORD GetLastMoveTime() const { return m_dwLastMoveTime; }
DWORD GetLastAttackTime() const { return m_dwLastAttackTime; } DWORD GetLastAttackTime() const { return m_dwLastAttackTime; }
void SetLastAttacked(DWORD time); // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ݹ<EFBFBD><DDB9><EFBFBD> <20>ð<EFBFBD> <20><> <20><>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> void SetLastAttacked(DWORD time); // 마지막으로 공격받은 시간 및 위치를 저장함
bool SetSyncOwner(LPCHARACTER ch, bool bRemoveFromList = true); bool SetSyncOwner(LPCHARACTER ch, bool bRemoveFromList = true);
bool IsSyncOwner(LPCHARACTER ch) const; bool IsSyncOwner(LPCHARACTER ch) const;
@ -852,7 +852,7 @@ class CHARACTER : public CEntity, public CFSM, public CHorseRider
float m_fSyncTime; float m_fSyncTime;
LPCHARACTER m_pkChrSyncOwner; LPCHARACTER m_pkChrSyncOwner;
CHARACTER_LIST m_kLst_pkChrSyncOwned; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> SyncOwner<EFBFBD><EFBFBD> <20>ڵ<EFBFBD> CHARACTER_LIST m_kLst_pkChrSyncOwned; // 내가 SyncOwner인 자들
PIXEL_POSITION m_posDest; PIXEL_POSITION m_posDest;
PIXEL_POSITION m_posStart; PIXEL_POSITION m_posStart;
@ -875,7 +875,7 @@ class CHARACTER : public CEntity, public CFSM, public CHorseRider
bool m_bStaminaConsume; bool m_bStaminaConsume;
// End // End
// Quickslot <EFBFBD><EFBFBD><EFBFBD><EFBFBD> // Quickslot 관련
public: public:
void SyncQuickslot(BYTE bType, BYTE bOldPos, BYTE bNewPos); void SyncQuickslot(BYTE bType, BYTE bOldPos, BYTE bNewPos);
bool GetQuickslot(BYTE pos, TQuickslot ** ppSlot); bool GetQuickslot(BYTE pos, TQuickslot ** ppSlot);
@ -904,7 +904,7 @@ class CHARACTER : public CEntity, public CFSM, public CHorseRider
void LoadAffect(DWORD dwCount, TPacketAffectElement * pElements); void LoadAffect(DWORD dwCount, TPacketAffectElement * pElements);
void SaveAffect(); void SaveAffect();
// Affect loading<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ΰ<EFBFBD>? // Affect loading이 끝난 상태인가?
bool IsLoadedAffect() const { return m_bIsLoadedAffect; } bool IsLoadedAffect() const { return m_bIsLoadedAffect; }
bool IsGoodAffect(BYTE bAffectType) const; bool IsGoodAffect(BYTE bAffectType) const;
@ -930,25 +930,25 @@ class CHARACTER : public CEntity, public CFSM, public CHorseRider
void DenyToParty(LPCHARACTER member); void DenyToParty(LPCHARACTER member);
void AcceptToParty(LPCHARACTER member); void AcceptToParty(LPCHARACTER member);
/// <EFBFBD>ڽ<EFBFBD><EFBFBD><EFBFBD> <20><>Ƽ<EFBFBD><C6BC> <20>ٸ<EFBFBD> character <EFBFBD><EFBFBD> <20>ʴ<EFBFBD><CAB4>Ѵ<EFBFBD>. /// 자신의 파티에 다른 character 를 초대한다.
/** /**
* @param pchInvitee <EFBFBD>ʴ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> character. <EFBFBD><EFBFBD>Ƽ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̾<EFBFBD><CCBE><EFBFBD> <20>Ѵ<EFBFBD>. * @param pchInvitee 초대할 대상 character. 파티에 참여 가능한 상태이어야 한다.
* *
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD> character <EFBFBD><EFBFBD> <20><><EFBFBD>°<EFBFBD> <20><>Ƽ<EFBFBD><C6BC> <20>ʴ<EFBFBD><CAB4>ϰ<EFBFBD> <20>ʴ<EFBFBD><CAB4><EFBFBD><EFBFBD><EFBFBD> <20><> <20>ִ<EFBFBD> <20><><EFBFBD>°<EFBFBD> <20>ƴ϶<C6B4><CFB6><EFBFBD> <20>ʴ<EFBFBD><CAB4>ϴ<EFBFBD> ij<><C4B3><EFBFBD>Ϳ<EFBFBD><CDBF><EFBFBD> <20>ش<EFBFBD><D8B4>ϴ<EFBFBD> ä<><C3A4> <20>޼<EFBFBD><DEBC><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>. * 양측 character 의 상태가 파티에 초대하고 초대받을 수 있는 상태가 아니라면 초대하는 캐릭터에게 해당하는 채팅 메세지를 전송한다.
*/ */
void PartyInvite(LPCHARACTER pchInvitee); void PartyInvite(LPCHARACTER pchInvitee);
/// <EFBFBD>ʴ<EFBFBD><EFBFBD>ߴ<EFBFBD> character <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD>Ѵ<EFBFBD>. /// 초대했던 character 의 수락을 처리한다.
/** /**
* @param pchInvitee <EFBFBD><EFBFBD>Ƽ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> character. <20><>Ƽ<EFBFBD><C6BC> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̾<EFBFBD><CCBE><EFBFBD> <20>Ѵ<EFBFBD>. * @param pchInvitee 파티에 참여할 character. 파티에 참여가능한 상태이어야 한다.
* *
* pchInvitee <EFBFBD><EFBFBD> <20><>Ƽ<EFBFBD><C6BC> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>ִ<EFBFBD> <20><>Ȳ<EFBFBD><C8B2> <20>ƴ϶<C6B4><CFB6><EFBFBD> <20>ش<EFBFBD><D8B4>ϴ<EFBFBD> ä<><C3A4> <20>޼<EFBFBD><DEBC><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>. * pchInvitee 가 파티에 가입할 수 있는 상황이 아니라면 해당하는 채팅 메세지를 전송한다.
*/ */
void PartyInviteAccept(LPCHARACTER pchInvitee); void PartyInviteAccept(LPCHARACTER pchInvitee);
/// <EFBFBD>ʴ<EFBFBD><EFBFBD>ߴ<EFBFBD> character <EFBFBD><EFBFBD> <20>ʴ<EFBFBD> <20>źθ<C5BA> ó<><C3B3><EFBFBD>Ѵ<EFBFBD>. /// 초대했던 character 의 초대 거부를 처리한다.
/** /**
* @param [in] dwPID <EFBFBD>ʴ<EFBFBD> <20>ߴ<EFBFBD> character <EFBFBD><EFBFBD> PID * @param [in] dwPID 초대 했던 character PID
*/ */
void PartyInviteDeny(DWORD dwPID); void PartyInviteDeny(DWORD dwPID);
@ -961,45 +961,45 @@ class CHARACTER : public CEntity, public CFSM, public CHorseRider
protected: protected:
/// <EFBFBD><EFBFBD>Ƽ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>. /// 파티에 가입한다.
/** /**
* @param pkLeader <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ƽ<EFBFBD><C6BC> <20><><EFBFBD><EFBFBD> * @param pkLeader 가입할 파티의 리더
*/ */
void PartyJoin(LPCHARACTER pkLeader); void PartyJoin(LPCHARACTER pkLeader);
/** /**
* <EFBFBD><EFBFBD>Ƽ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>. * 파티 가입을 할 수 없을 경우의 에러코드.
* Error code <EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΰ<EFBFBD><CEB0><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E6B0A1><EFBFBD><EFBFBD>(mutable) type <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>(static) type <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. * Error code 는 시간에 의존적인가에 따라 변경가능한(mutable) type 과 정적(static) type 으로 나뉜다.
* Error code <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> PERR_SEPARATOR <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E6B0A1><EFBFBD><EFBFBD> type <20>̰<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> type <EFBFBD>̴<EFBFBD>. * Error code 의 값이 PERR_SEPARATOR 보다 낮으면 변경가능한 type 이고 높으면 정적 type 이다.
*/ */
enum PartyJoinErrCode { enum PartyJoinErrCode {
PERR_NONE = 0, ///< ó<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> PERR_NONE = 0, ///< 처리성공
PERR_SERVER, ///< <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ƽ<EFBFBD><C6BC><EFBFBD><EFBFBD> ó<><C3B3> <20>Ұ<EFBFBD> PERR_SERVER, ///< 서버문제로 파티관련 처리 불가
PERR_DUNGEON, ///< ij<EFBFBD><EFBFBD><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> PERR_DUNGEON, ///< 캐릭터가 던전에 있음
PERR_OBSERVER, ///< <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> PERR_OBSERVER, ///< 관전모드임
PERR_LVBOUNDARY, ///< <EFBFBD><EFBFBD><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD>Ϳ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̰<EFBFBD> <20><> PERR_LVBOUNDARY, ///< 상대 캐릭터와 레벨차이가 남
PERR_LOWLEVEL, ///< <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƽ<EFBFBD><EFBFBD> <20>ְ<EFBFBD><D6B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 30<33><30><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> PERR_LOWLEVEL, ///< 상대파티의 최고레벨보다 30레벨 낮음
PERR_HILEVEL, ///< <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƽ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 30<33><30><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> PERR_HILEVEL, ///< 상대파티의 최저레벨보다 30레벨 높음
PERR_ALREADYJOIN, ///< <EFBFBD><EFBFBD>Ƽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD>Ͱ<EFBFBD> <20>̹<EFBFBD> <20><>Ƽ<EFBFBD><C6BC> PERR_ALREADYJOIN, ///< 파티가입 대상 캐릭터가 이미 파티중
PERR_PARTYISFULL, ///< <EFBFBD><EFBFBD>Ƽ<EFBFBD>ο<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʰ<EFBFBD> PERR_PARTYISFULL, ///< 파티인원 제한 초과
PERR_SEPARATOR, ///< Error type separator. PERR_SEPARATOR, ///< Error type separator.
PERR_DIFFEMPIRE, ///< <EFBFBD><EFBFBD><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD>Ϳ<EFBFBD> <20>ٸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> PERR_DIFFEMPIRE, ///< 상대 캐릭터와 다른 제국임
PERR_MAX ///< Error code <EFBFBD>ְ<EFBFBD>ġ. <20><> <20>տ<EFBFBD> Error code <EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0>Ѵ<EFBFBD>. PERR_MAX ///< Error code 최고치. 이 앞에 Error code 를 추가한다.
}; };
/// <EFBFBD><EFBFBD>Ƽ <20><><EFBFBD><EFBFBD><EFBFBD>̳<EFBFBD> <20><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>˻<EFBFBD><CBBB>Ѵ<EFBFBD>. /// 파티 가입이나 결성 가능한 조건을 검사한다.
/** /**
* @param pchLeader <EFBFBD><EFBFBD>Ƽ<EFBFBD><EFBFBD> leader <EFBFBD>̰ų<EFBFBD> <20>ʴ<EFBFBD><CAB4><EFBFBD> character * @param pchLeader 파티의 leader 이거나 초대한 character
* @param pchGuest <EFBFBD>ʴ<EFBFBD><EFBFBD>޴<EFBFBD> character * @param pchGuest 초대받는 character
* @return <EFBFBD><EFBFBD><EFBFBD><EFBFBD> PartyJoinErrCode <EFBFBD><EFBFBD> <20><>ȯ<EFBFBD><C8AF> <20><> <20>ִ<EFBFBD>. * @return 모든 PartyJoinErrCode 가 반환될 수 있다.
*/ */
static PartyJoinErrCode IsPartyJoinableCondition(const LPCHARACTER pchLeader, const LPCHARACTER pchGuest); static PartyJoinErrCode IsPartyJoinableCondition(const LPCHARACTER pchLeader, const LPCHARACTER pchGuest);
/// <EFBFBD><EFBFBD>Ƽ <20><><EFBFBD><EFBFBD><EFBFBD>̳<EFBFBD> <20><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>˻<EFBFBD><CBBB>Ѵ<EFBFBD>. /// 파티 가입이나 결성 가능한 동적인 조건을 검사한다.
/** /**
* @param pchLeader <EFBFBD><EFBFBD>Ƽ<EFBFBD><EFBFBD> leader <EFBFBD>̰ų<EFBFBD> <20>ʴ<EFBFBD><CAB4><EFBFBD> character * @param pchLeader 파티의 leader 이거나 초대한 character
* @param pchGuest <EFBFBD>ʴ<EFBFBD><EFBFBD>޴<EFBFBD> character * @param pchGuest 초대받는 character
* @return mutable type <EFBFBD><EFBFBD> code <EFBFBD><EFBFBD> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>. * @return mutable type code 만 반환한다.
*/ */
static PartyJoinErrCode IsPartyJoinableMutableCondition(const LPCHARACTER pchLeader, const LPCHARACTER pchGuest); static PartyJoinErrCode IsPartyJoinableMutableCondition(const LPCHARACTER pchLeader, const LPCHARACTER pchGuest);
@ -1008,11 +1008,11 @@ class CHARACTER : public CEntity, public CFSM, public CHorseRider
LPEVENT m_pkPartyRequestEvent; LPEVENT m_pkPartyRequestEvent;
/** /**
* <EFBFBD><EFBFBD>Ƽ<EFBFBD><EFBFBD>û Event map. * 파티초청 Event map.
* key: <EFBFBD>ʴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> PID * key: 초대받은 캐릭터의 PID
* value: event<EFBFBD><EFBFBD> pointer * value: event pointer
* *
* <EFBFBD>ʴ<EFBFBD><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD>͵鿡 <20><><EFBFBD><EFBFBD> event map. * 초대한 캐릭터들에 대한 event map.
*/ */
typedef std::map< DWORD, LPEVENT > EventMap; typedef std::map< DWORD, LPEVENT > EventMap;
EventMap m_PartyInviteEventMap; EventMap m_PartyInviteEventMap;
@ -1046,7 +1046,7 @@ class CHARACTER : public CEntity, public CFSM, public CHorseRider
//////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////
// Item related // Item related
public: public:
bool CanHandleItem(bool bSkipRefineCheck = false, bool bSkipObserver = false); // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><> <20>ִ°<D6B4>? bool CanHandleItem(bool bSkipRefineCheck = false, bool bSkipObserver = false); // 아이템 관련 행위를 할 수 있는가?
bool IsItemLoaded() const { return m_bItemLoaded; } bool IsItemLoaded() const { return m_bItemLoaded; }
void SetItemLoaded() { m_bItemLoaded = true; } void SetItemLoaded() { m_bItemLoaded = true; }
@ -1061,14 +1061,14 @@ class CHARACTER : public CEntity, public CFSM, public CHorseRider
LPITEM GetWear(BYTE bCell) const; LPITEM GetWear(BYTE bCell) const;
// MYSHOP_PRICE_LIST // MYSHOP_PRICE_LIST
void UseSilkBotary(void); /// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> void UseSilkBotary(void); /// 비단 보따리 아이템의 사용
/// DB ij<EFBFBD>÷<EFBFBD> <20><><EFBFBD><EFBFBD> <20>޾ƿ<DEBE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD>Ѵ<EFBFBD>. /// DB 캐시로 부터 받아온 가격정보 리스트를 유저에게 전송하고 보따리 아이템 사용을 처리한다.
/** /**
* @param [in] p <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><>Ŷ * @param [in] p 가격정보 리스트 패킷
* *
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> ó<><C3B3> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> UseSilkBotary <20><><EFBFBD><EFBFBD> DB ij<>÷<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><>û<EFBFBD>ϰ<EFBFBD> * 접속한 후 처음 비단 보따리 아이템 사용 시 UseSilkBotary 에서 DB 캐시로 가격정보 리스트를 요청하고
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ܺ<EFBFBD><DCBA><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD>Ѵ<EFBFBD>. * 응답받은 시점에 이 함수에서 실제 비단보따리 사용을 처리한다.
*/ */
void UseSilkBotaryReal(const TPacketMyshopPricelistHeader* p); void UseSilkBotaryReal(const TPacketMyshopPricelistHeader* p);
// END_OF_MYSHOP_PRICE_LIST // END_OF_MYSHOP_PRICE_LIST
@ -1114,10 +1114,10 @@ class CHARACTER : public CEntity, public CFSM, public CHorseRider
bool EquipItem(LPITEM item, int iCandidateCell = -1); bool EquipItem(LPITEM item, int iCandidateCell = -1);
bool UnequipItem(LPITEM item); bool UnequipItem(LPITEM item);
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> item<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>ִ<EFBFBD> <20><> Ȯ<><C8AE><EFBFBD>ϰ<EFBFBD>, <20>Ұ<EFBFBD><D2B0><EFBFBD> <20>ϴٸ<CFB4> ij<><C4B3><EFBFBD>Ϳ<EFBFBD><CDBF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>˷<EFBFBD><CBB7>ִ<EFBFBD> <20>Լ<EFBFBD> // 현재 item을 착용할 수 있는 지 확인하고, 불가능 하다면 캐릭터에게 이유를 알려주는 함수
bool CanEquipNow(const LPITEM item, const TItemPos& srcCell = NPOS, const TItemPos& destCell = NPOS); bool CanEquipNow(const LPITEM item, const TItemPos& srcCell = NPOS, const TItemPos& destCell = NPOS);
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> item<65><6D> <20><><EFBFBD><EFBFBD> <20><> <20>ִ<EFBFBD> <20><> Ȯ<><C8AE><EFBFBD>ϰ<EFBFBD>, <20>Ұ<EFBFBD><D2B0><EFBFBD> <20>ϴٸ<CFB4> ij<><C4B3><EFBFBD>Ϳ<EFBFBD><CDBF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>˷<EFBFBD><CBB7>ִ<EFBFBD> <20>Լ<EFBFBD> // 착용중인 item을 벗을 수 있는 지 확인하고, 불가능 하다면 캐릭터에게 이유를 알려주는 함수
bool CanUnequipNow(const LPITEM item, const TItemPos& srcCell = NPOS, const TItemPos& destCell = NPOS); bool CanUnequipNow(const LPITEM item, const TItemPos& srcCell = NPOS, const TItemPos& destCell = NPOS);
bool SwapItem(BYTE bCell, BYTE bDestCell); bool SwapItem(BYTE bCell, BYTE bDestCell);
@ -1149,14 +1149,14 @@ class CHARACTER : public CEntity, public CFSM, public CHorseRider
protected: protected:
/// <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ۿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>. /// 한 아이템에 대한 가격정보를 전송한다.
/** /**
* @param [in] dwItemVnum <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> vnum * @param [in] dwItemVnum 아이템 vnum
* @param [in] dwItemPrice <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> * @param [in] dwItemPrice 아이템 가격
*/ */
void SendMyShopPriceListCmd(DWORD dwItemVnum, DWORD dwItemPrice); void SendMyShopPriceListCmd(DWORD dwItemVnum, DWORD dwItemPrice);
bool m_bNoOpenedShop; ///< <EFBFBD>̹<EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD><D6B4><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ٸ<EFBFBD> true) bool m_bNoOpenedShop; ///< 이번 접속 후 개인상점을 연 적이 있는지의 여부(열었던 적이 없다면 true)
bool m_bItemLoaded; bool m_bItemLoaded;
int m_iRefineAdditionalCell; int m_iRefineAdditionalCell;
@ -1170,7 +1170,7 @@ class CHARACTER : public CEntity, public CFSM, public CHorseRider
void SetGold(INT gold) { m_points.gold = gold; } void SetGold(INT gold) { m_points.gold = gold; }
bool DropGold(INT gold); bool DropGold(INT gold);
INT GetAllowedGold() const; INT GetAllowedGold() const;
void GiveGold(INT iAmount); // <EFBFBD><EFBFBD>Ƽ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ƽ <20>й<EFBFBD>, <20>α<EFBFBD> <20><><EFBFBD><EFBFBD> ó<><C3B3> void GiveGold(INT iAmount); // 파티가 있으면 파티 분배, 로그 등의 처리
// End of Money // End of Money
//////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////
@ -1236,9 +1236,9 @@ class CHARACTER : public CEntity, public CFSM, public CHorseRider
bool CanFight() const; bool CanFight() const;
bool CanBeginFight() const; bool CanBeginFight() const;
void BeginFight(LPCHARACTER pkVictim); // pkVictimr<EFBFBD><EFBFBD> <20>ο<EFBFBD><CEBF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>. (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>ֳ<EFBFBD> üũ<C3BC>Ϸ<EFBFBD><CFB7><EFBFBD> CanBeginFight<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>) void BeginFight(LPCHARACTER pkVictim); // pkVictimr과 싸우기 시작한다. (강제적임, 시작할 수 있나 체크하려면 CanBeginFight을 사용)
bool CounterAttack(LPCHARACTER pkChr); // <EFBFBD>ݰ<EFBFBD><EFBFBD>ϱ<EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD>) bool CounterAttack(LPCHARACTER pkChr); // 반격하기 (몬스터만 사용)
bool IsStun() const; bool IsStun() const;
void Stun(); void Stun();
@ -1268,7 +1268,7 @@ class CHARACTER : public CEntity, public CFSM, public CHorseRider
void UpdateAlignment(int iAmount); void UpdateAlignment(int iAmount);
int GetAlignment() const; int GetAlignment() const;
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ġ <20><><EFBFBD><EFBFBD> //선악치 얻기
int GetRealAlignment() const; int GetRealAlignment() const;
void ShowAlignment(bool bShow); void ShowAlignment(bool bShow);
@ -1317,7 +1317,7 @@ class CHARACTER : public CEntity, public CFSM, public CHorseRider
DWORD m_dwFlyTargetID; DWORD m_dwFlyTargetID;
std::vector<DWORD> m_vec_dwFlyTargets; std::vector<DWORD> m_vec_dwFlyTargets;
TDamageMap m_map_kDamage; // <EFBFBD> ij<><C4B3><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>󸶸<EFBFBD>ŭ<EFBFBD><C5AD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>־<EFBFBD><D6BE>°<EFBFBD>? TDamageMap m_map_kDamage; // 어떤 캐릭터가 나에게 얼마만큼의 데미지를 주었는가?
// AttackLog m_kAttackLog; // AttackLog m_kAttackLog;
DWORD m_dwKillerPID; DWORD m_dwKillerPID;
@ -1340,8 +1340,8 @@ class CHARACTER : public CEntity, public CFSM, public CHorseRider
BYTE GetDropMetinStonePct() const { return m_bDropMetinStonePct; } BYTE GetDropMetinStonePct() const { return m_bDropMetinStonePct; }
protected: protected:
LPCHARACTER m_pkChrStone; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> LPCHARACTER m_pkChrStone; // 나를 스폰한 돌
CHARACTER_SET m_set_pkChrSpawnedBy; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> CHARACTER_SET m_set_pkChrSpawnedBy; // 내가 스폰한 놈들
DWORD m_dwDropMetinStone; DWORD m_dwDropMetinStone;
BYTE m_bDropMetinStonePct; BYTE m_bDropMetinStonePct;
// End of Stone // End of Stone
@ -1399,7 +1399,7 @@ class CHARACTER : public CEntity, public CFSM, public CHorseRider
private: private:
bool m_bDisableCooltime; bool m_bDisableCooltime;
DWORD m_dwLastSkillTime; ///< <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> skill <20><> <20><> <20>ð<EFBFBD>(millisecond). DWORD m_dwLastSkillTime; ///< 마지막으로 skill 을 쓴 시간(millisecond).
// End of Skill // End of Skill
// MOB_SKILL // MOB_SKILL
@ -1456,10 +1456,10 @@ class CHARACTER : public CEntity, public CFSM, public CHorseRider
// AI related // AI related
public: public:
void AssignTriggers(const TMobTable * table); void AssignTriggers(const TMobTable * table);
LPCHARACTER GetVictim() const; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> LPCHARACTER GetVictim() const; // 공격할 대상 리턴
void SetVictim(LPCHARACTER pkVictim); void SetVictim(LPCHARACTER pkVictim);
LPCHARACTER GetNearestVictim(LPCHARACTER pkChr); LPCHARACTER GetNearestVictim(LPCHARACTER pkChr);
LPCHARACTER GetProtege() const; // <EFBFBD><EFBFBD>ȣ<EFBFBD>ؾ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> LPCHARACTER GetProtege() const; // 보호해야 할 대상 리턴
bool Follow(LPCHARACTER pkChr, float fMinimumDistance = 150.0f); bool Follow(LPCHARACTER pkChr, float fMinimumDistance = 150.0f);
bool Return(); bool Return();
@ -1483,8 +1483,8 @@ class CHARACTER : public CEntity, public CFSM, public CHorseRider
//////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////
// Target // Target
protected: protected:
LPCHARACTER m_pkChrTarget; // <EFBFBD><EFBFBD> Ÿ<><C5B8> LPCHARACTER m_pkChrTarget; // 내 타겟
CHARACTER_SET m_set_pkChrTargetedBy; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ÿ<><C5B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> CHARACTER_SET m_set_pkChrTargetedBy; // 나를 타겟으로 가지고 있는 사람들
public: public:
void SetTarget(LPCHARACTER pkChrTarget); void SetTarget(LPCHARACTER pkChrTarget);
@ -1505,19 +1505,19 @@ class CHARACTER : public CEntity, public CFSM, public CHorseRider
void ChangeSafeboxSize(BYTE bSize); void ChangeSafeboxSize(BYTE bSize);
void CloseSafebox(); void CloseSafebox();
/// â<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>û /// 창고 열기 요청
/** /**
* @param [in] pszPassword 1<EFBFBD><EFBFBD> <20>̻<EFBFBD> 6<><36> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> â<><C3A2> <20><><EFBFBD>й<EFBFBD>ȣ * @param [in] pszPassword 1자 이상 6자 이하의 창고 비밀번호
* *
* DB <EFBFBD><EFBFBD> â<><C3A2><EFBFBD><EFBFBD><EFBFBD><20><>û<EFBFBD>Ѵ<EFBFBD>. * DB 에 창고열기를 요청한다.
* â<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ߺ<EFBFBD><DFBA><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ϸ<EFBFBD>, <20>ֱ<EFBFBD> â<><C3A2><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> 10<31><30> <20>̳<EFBFBD><CCB3><EFBFBD><EFBFBD><EFBFBD> <20><> <20><> <20><><EFBFBD>Ѵ<EFBFBD>. * 창고는 중복으로 열지 못하며, 최근 창고를 닫은 시간으로 부터 10초 이내에는 열 지 못한다.
*/ */
void ReqSafeboxLoad(const char* pszPassword); void ReqSafeboxLoad(const char* pszPassword);
/// â<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>û<EFBFBD><C3BB> <20><><EFBFBD><EFBFBD> /// 창고 열기 요청의 취소
/** /**
* ReqSafeboxLoad <EFBFBD><EFBFBD> ȣ<><C8A3><EFBFBD>ϰ<EFBFBD> CloseSafebox <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʾ<EFBFBD><CABE><EFBFBD> <20><> <20><> <20>Լ<EFBFBD><D4BC><EFBFBD> ȣ<><C8A3><EFBFBD>ϸ<EFBFBD> â<><C3A2><EFBFBD><EFBFBD> <20><> <20><> <20>ִ<EFBFBD>. * ReqSafeboxLoad 를 호출하고 CloseSafebox 하지 않았을 때 이 함수를 호출하면 창고를 열 수 있다.
* â<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>û<EFBFBD><C3BB> DB <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>޾<EFBFBD><DEBE><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20>Լ<EFBFBD><D4BC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD> <20><>û<EFBFBD><C3BB> <20><> <20><> <20>ְ<EFBFBD> <20><><EFBFBD>ش<EFBFBD>. * 창고열기의 요청이 DB 서버에서 실패응답을 받았을 경우 이 함수를 사용해서 요청을 할 수 있게 해준다.
*/ */
void CancelSafeboxLoad( void ) { m_bOpeningSafebox = false; } void CancelSafeboxLoad( void ) { m_bOpeningSafebox = false; }
@ -1535,7 +1535,7 @@ class CHARACTER : public CEntity, public CFSM, public CHorseRider
CSafebox * m_pkSafebox; CSafebox * m_pkSafebox;
int m_iSafeboxSize; int m_iSafeboxSize;
int m_iSafeboxLoadTime; int m_iSafeboxLoadTime;
bool m_bOpeningSafebox; ///< â<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>û <20><><EFBFBD>̰ų<CCB0> <20><><EFBFBD><EFBFBD><EFBFBD>ִ°<D6B4> <20><><EFBFBD><EFBFBD>, true <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD>̰ų<CCB0> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. bool m_bOpeningSafebox; ///< 창고가 열기 요청 중이거나 열려있는가 여부, true 일 경우 열기요청이거나 열려있음.
CSafebox * m_pkMall; CSafebox * m_pkMall;
int m_iMallLoadTime; int m_iMallLoadTime;
@ -1569,7 +1569,7 @@ class CHARACTER : public CEntity, public CFSM, public CHorseRider
void HorseSummon(bool bSummon, bool bFromFar = false, DWORD dwVnum = 0, const char* name = 0); void HorseSummon(bool bSummon, bool bFromFar = false, DWORD dwVnum = 0, const char* name = 0);
LPCHARACTER GetHorse() const { return m_chHorse; } // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD><C8AF><EFBFBD><EFBFBD> <20><> LPCHARACTER GetHorse() const { return m_chHorse; } // 현재 소환중인 말
LPCHARACTER GetRider() const; // rider on horse LPCHARACTER GetRider() const; // rider on horse
void SetRider(LPCHARACTER ch); void SetRider(LPCHARACTER ch);
@ -1631,7 +1631,7 @@ class CHARACTER : public CEntity, public CFSM, public CHorseRider
//////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////
// Resists & Proofs // Resists & Proofs
public: public:
bool CannotMoveByAffect() const; // Ư<EFBFBD><EFBFBD> ȿ<><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ΰ<EFBFBD>? bool CannotMoveByAffect() const; // 특정 효과에 의해 움직일 수 없는 상태인가?
bool IsImmune(DWORD dwImmuneFlag); bool IsImmune(DWORD dwImmuneFlag);
void SetImmuneFlag(DWORD dw) { m_pointsInstant.dwImmuneFlag = dw; } void SetImmuneFlag(DWORD dw) { m_pointsInstant.dwImmuneFlag = dw; }
@ -1671,7 +1671,7 @@ class CHARACTER : public CEntity, public CFSM, public CHorseRider
void UpdateStateMachine(DWORD dwPulse); void UpdateStateMachine(DWORD dwPulse);
void SetNextStatePulse(int iPulseNext); void SetNextStatePulse(int iPulseNext);
// ij<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ν<EFBFBD><CEBD>Ͻ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20>Լ<EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̻<EFBFBD><CCBB><EFBFBD> <20><><EFBFBD>ӱ<EFBFBD><D3B1><EFBFBD><EFBFBD><EFBFBD> CFSM::Update <EFBFBD>Լ<EFBFBD><EFBFBD><EFBFBD> ȣ<><C8A3><EFBFBD>ϰų<CFB0> UpdateStateMachine <EFBFBD>Լ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ߴµ<DFB4>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20>Լ<EFBFBD> <20>߰<EFBFBD><DFB0><EFBFBD>. // 캐릭터 인스턴스 업데이트 함수. 기존엔 이상한 상속구조로 CFSM::Update 함수를 호출하거나 UpdateStateMachine 함수를 사용했는데, 별개의 업데이트 함수 추가함.
void UpdateCharacter(DWORD dwPulse); void UpdateCharacter(DWORD dwPulse);
protected: protected:
@ -1741,9 +1741,9 @@ class CHARACTER : public CEntity, public CFSM, public CHorseRider
int m_aiPremiumTimes[PREMIUM_MAX_NUM]; int m_aiPremiumTimes[PREMIUM_MAX_NUM];
// CHANGE_ITEM_ATTRIBUTES // CHANGE_ITEM_ATTRIBUTES
static const DWORD msc_dwDefaultChangeItemAttrCycle; ///< <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ӽ<EFBFBD><D3BC><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ֱ<EFBFBD> static const DWORD msc_dwDefaultChangeItemAttrCycle; ///< 디폴트 아이템 속성변경 가능 주기
static const char msc_szLastChangeItemAttrFlag[]; ///< <EFBFBD>ֱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ӽ<EFBFBD><D3BC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD> Quest Flag <EFBFBD≯<EFBFBD> static const char msc_szLastChangeItemAttrFlag[]; ///< 최근 아이템 속성을 변경한 시간의 Quest Flag 이름
static const char msc_szChangeItemAttrCycleFlag[]; ///< <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ӽ<EFBFBD><D3BC><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ֱ<EFBFBD><D6B1><EFBFBD> Quest Flag <EFBFBD≯<EFBFBD> static const char msc_szChangeItemAttrCycleFlag[]; ///< 아이템 속성병경 가능 주기의 Quest Flag 이름
// END_OF_CHANGE_ITEM_ATTRIBUTES // END_OF_CHANGE_ITEM_ATTRIBUTES
// PC_BANG_ITEM_ADD // PC_BANG_ITEM_ADD
@ -1824,7 +1824,7 @@ class CHARACTER : public CEntity, public CFSM, public CHorseRider
int GetMyShopTime() const { return m_iMyShopTime; } int GetMyShopTime() const { return m_iMyShopTime; }
void SetMyShopTime() { m_iMyShopTime = thecore_pulse(); } void SetMyShopTime() { m_iMyShopTime = thecore_pulse(); }
// Hack <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> üũ. // Hack 방지를 위한 체크.
bool IsHack(bool bSendMsg = true, bool bCheckShopOwner = true, int limittime = g_nPortalLimitTime); bool IsHack(bool bSendMsg = true, bool bCheckShopOwner = true, int limittime = g_nPortalLimitTime);
// MONARCH // MONARCH
@ -1874,9 +1874,9 @@ class CHARACTER : public CEntity, public CFSM, public CHorseRider
bool IsSiegeNPC() const; bool IsSiegeNPC() const;
private: private:
//<EFBFBD>߱<EFBFBD> <20><><EFBFBD><EFBFBD> //중국 전용
//18<EFBFBD><EFBFBD> <20≯<EFBFBD> <20><><EFBFBD><EFBFBD> //18세 미만 전용
//3<EFBFBD>ð<EFBFBD> : 50 % 5 <EFBFBD>ð<EFBFBD> 0% //3시간 : 50 % 5 시간 0%
e_overtime m_eOverTime; e_overtime m_eOverTime;
public: public:
@ -1952,7 +1952,7 @@ class CHARACTER : public CEntity, public CFSM, public CHorseRider
typedef std::map <BYTE, CBuffOnAttributes*> TMapBuffOnAttrs; typedef std::map <BYTE, CBuffOnAttributes*> TMapBuffOnAttrs;
TMapBuffOnAttrs m_map_buff_on_attrs; TMapBuffOnAttrs m_map_buff_on_attrs;
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> : <20><>Ȱ<EFBFBD><C8B0> <20>׽<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD>Ͽ<EFBFBD>. // 무적 : 원활한 테스트를 위하여.
public: public:
void SetArmada() { cannot_dead = true; } void SetArmada() { cannot_dead = true; }
void ResetArmada() { cannot_dead = false; } void ResetArmada() { cannot_dead = false; }
@ -1967,7 +1967,7 @@ class CHARACTER : public CEntity, public CFSM, public CHorseRider
bool IsPet() { return m_bIsPet; } bool IsPet() { return m_bIsPet; }
#endif #endif
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. //최종 데미지 보정.
private: private:
float m_fAttMul; float m_fAttMul;
float m_fDamMul; float m_fDamMul;
@ -1980,7 +1980,7 @@ class CHARACTER : public CEntity, public CFSM, public CHorseRider
private: private:
bool IsValidItemPosition(TItemPos Pos) const; bool IsValidItemPosition(TItemPos Pos) const;
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>Ŷ <20>ӽ<EFBFBD> <20><><EFBFBD><EFBFBD> //독일 선물 기능 패킷 임시 저장
private: private:
unsigned int itemAward_vnum = 0; unsigned int itemAward_vnum = 0;
char itemAward_cmd[20] = ""; char itemAward_cmd[20] = "";
@ -1994,10 +1994,10 @@ class CHARACTER : public CEntity, public CFSM, public CHorseRider
//void SetItemAward_flag(bool flag) { itemAward_flag = flag; } //void SetItemAward_flag(bool flag) { itemAward_flag = flag; }
public: public:
//<EFBFBD><EFBFBD>ȥ<EFBFBD><EFBFBD> //용혼석
// ij<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> affect, quest<EFBFBD><EFBFBD> load <EFBFBD>DZ<EFBFBD> <20><><EFBFBD><EFBFBD> DragonSoul_Initialize<EFBFBD><EFBFBD> ȣ<><C8A3><EFBFBD>ϸ<EFBFBD> <20>ȵȴ<C8B5>. // 캐릭터의 affect, quest load 되기 전에 DragonSoul_Initialize를 호출하면 안된다.
// affect<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5>Ǿ<EFBFBD> LoadAffect<EFBFBD><EFBFBD><EFBFBD><EFBFBD> ȣ<><C8A3><EFBFBD><EFBFBD>. // affect가 가장 마지막에 로드되어 LoadAffect에서 호출함.
void DragonSoul_Initialize(); void DragonSoul_Initialize();
bool DragonSoul_IsQualified() const; bool DragonSoul_IsQualified() const;
@ -2008,17 +2008,17 @@ class CHARACTER : public CEntity, public CFSM, public CHorseRider
bool DragonSoul_ActivateDeck(int deck_idx); bool DragonSoul_ActivateDeck(int deck_idx);
void DragonSoul_DeactivateAll(); void DragonSoul_DeactivateAll();
// <EFBFBD>ݵ<EFBFBD><EFBFBD><EFBFBD> ClearItem <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ҷ<EFBFBD><D2B7><EFBFBD> <20>Ѵ<EFBFBD>. // 반드시 ClearItem 전에 불러야 한다.
// <EFBFBD>ֳ<EFBFBD><EFBFBD>ϸ<EFBFBD>.... // 왜냐하면....
// <EFBFBD><EFBFBD>ȥ<EFBFBD><EFBFBD> <20>ϳ<EFBFBD> <20>ϳ<EFBFBD><CFB3><EFBFBD> deactivate<74><65> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> active<76><65> <20><>ȥ<EFBFBD><C8A5><EFBFBD><EFBFBD> <20>ִ<EFBFBD><D6B4><EFBFBD> Ȯ<><C8AE><EFBFBD>ϰ<EFBFBD>, // 용혼석 하나 하나를 deactivate할 때마다 덱에 active인 용혼석이 있는지 확인하고,
// active<EFBFBD><EFBFBD> <20><>ȥ<EFBFBD><C8A5><EFBFBD><EFBFBD> <20>ϳ<EFBFBD><CFB3><EFBFBD> <20><><EFBFBD>ٸ<EFBFBD>, ij<><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȥ<EFBFBD><C8A5> affect<63><74>, Ȱ<><C8B0> <20><><EFBFBD>¸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>. // active인 용혼석이 하나도 없다면, 캐릭터의 용혼석 affect와, 활성 상태를 제거한다.
// //
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ClearItem <EFBFBD><EFBFBD>, ij<><C4B3><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> unequip<69>ϴ<EFBFBD> <20>ٶ<EFBFBD><D9B6><EFBFBD>, // 하지만 ClearItem 시, 캐릭터가 착용하고 있는 모든 아이템을 unequip하는 바람에,
// <EFBFBD><EFBFBD>ȥ<EFBFBD><EFBFBD> Affect<EFBFBD><EFBFBD> <20><><EFBFBD>ŵǰ<C5B5>, <20><20>α<EFBFBD><CEB1><EFBFBD> <20><>, <20><>ȥ<EFBFBD><C8A5><EFBFBD><EFBFBD> Ȱ<><C8B0>ȭ<EFBFBD><C8AD><EFBFBD><EFBFBD> <20>ʴ´<CAB4>. // 용혼석 Affect가 제거되고, 결국 로그인 시, 용혼석이 활성화되지 않는다.
// (Unequip<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>α׾ƿ<D7BE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20>ƴ<EFBFBD><C6B4><EFBFBD> <20><> <20><> <20><><EFBFBD><EFBFBD>.) // (Unequip할 때에는 로그아웃 상태인지, 아닌지 알 수 없다.)
// <EFBFBD><EFBFBD>ȥ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> deactivate<EFBFBD><EFBFBD>Ű<EFBFBD><EFBFBD> ij<><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȥ<EFBFBD><C8A5> <20><> Ȱ<><C8B0> <20><><EFBFBD>´<EFBFBD> <20>ǵ帮<C7B5><E5B8AE> <20>ʴ´<CAB4>. // 용혼석만 deactivate시키고 캐릭터의 용혼석 덱 활성 상태는 건드리지 않는다.
void DragonSoul_CleanUp(); void DragonSoul_CleanUp();
// <EFBFBD><EFBFBD>ȥ<EFBFBD><EFBFBD> <20><>ȭâ // 용혼석 강화창
public: public:
bool DragonSoul_RefineWindow_Open(LPENTITY pEntity); bool DragonSoul_RefineWindow_Open(LPENTITY pEntity);
bool DragonSoul_RefineWindow_Close(); bool DragonSoul_RefineWindow_Close();
@ -2026,8 +2026,8 @@ class CHARACTER : public CEntity, public CFSM, public CHorseRider
bool DragonSoul_RefineWindow_CanRefine(); bool DragonSoul_RefineWindow_CanRefine();
private: private:
// SyncPosition<EFBFBD><EFBFBD> <20>ǿ<EFBFBD><C7BF>Ͽ<EFBFBD> Ÿ<><C5B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̻<EFBFBD><CCBB><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD> <20><><EFBFBD>Ͽ<EFBFBD>, // SyncPosition을 악용하여 타유저를 이상한 곳으로 보내는 핵 방어하기 위하여,
// SyncPosition<EFBFBD><EFBFBD> <20>Ͼ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. // SyncPosition이 일어날 때를 기록.
timeval m_tvLastSyncTime; timeval m_tvLastSyncTime;
int m_iSyncHackCount; int m_iSyncHackCount;
public: public:

View File

@ -24,7 +24,7 @@ class CHARACTER_MANAGER : public singleton<CHARACTER_MANAGER>
void Destroy(); void Destroy();
void GracefulShutdown(); // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>˴ٿ<CBB4><D9BF><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>. PC<50><43> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ű<EFBFBD><C5B0> Destroy <EFBFBD>Ѵ<EFBFBD>. void GracefulShutdown(); // 정상적 셧다운할 때 사용. PC를 모두 저장시키고 Destroy 한다.
DWORD AllocVID(); DWORD AllocVID();
@ -56,11 +56,11 @@ class CHARACTER_MANAGER : public singleton<CHARACTER_MANAGER>
bool AddToStateList(LPCHARACTER ch); bool AddToStateList(LPCHARACTER ch);
void RemoveFromStateList(LPCHARACTER ch); void RemoveFromStateList(LPCHARACTER ch);
// DelayedSave: <EFBFBD><EFBFBD><EFBFBD> <20><>ƾ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ؾ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ϸ<EFBFBD> <20><><EFBFBD><EFBFBD> // DelayedSave: 어떠한 루틴 내에서 저장을 해야 할 짓을 많이 하면 저장
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʹ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD> "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>" <20><><EFBFBD><EFBFBD> ǥ<>ø<EFBFBD> <20>صΰ<D8B5> <20><><EFBFBD><EFBFBD> // 쿼리가 너무 많아지므로 "저장을 한다" 라고 표시만 해두고 잠깐
// (<EFBFBD><EFBFBD>: 1 frame) <EFBFBD>Ŀ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ų<EFBFBD><C5B2>. // (: 1 frame) 후에 저장시킨다.
void DelayedSave(LPCHARACTER ch); void DelayedSave(LPCHARACTER ch);
bool FlushDelayedSave(LPCHARACTER ch); // Delayed <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><EFBFBD> <20>ִٸ<D6B4> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>. <20><><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>. bool FlushDelayedSave(LPCHARACTER ch); // Delayed 리스트에 있다면 지우고 저장한다. 끊김 처리시 사용 됨.
void ProcessDelayedSave(); void ProcessDelayedSave();
template<class Func> Func for_each_pc(Func f); template<class Func> Func for_each_pc(Func f);
@ -124,7 +124,7 @@ class CHARACTER_MANAGER : public singleton<CHARACTER_MANAGER>
NAME_MAP m_map_pkPCChr; NAME_MAP m_map_pkPCChr;
char dummy1[1024]; // memory barrier char dummy1[1024]; // memory barrier
CHARACTER_SET m_set_pkChrState; // FSM<EFBFBD><EFBFBD> <20><><EFBFBD>ư<EFBFBD><C6B0><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> CHARACTER_SET m_set_pkChrState; // FSM이 돌아가고 있는 놈들
CHARACTER_SET m_set_pkChrForDelayedSave; CHARACTER_SET m_set_pkChrForDelayedSave;
CHARACTER_SET m_set_pkChrMonsterLog; CHARACTER_SET m_set_pkChrMonsterLog;

View File

@ -51,11 +51,11 @@ enum SCMD_XMAS
}; };
extern void Shutdown(int iSec); extern void Shutdown(int iSec);
extern void SendNotice(const char * c_pszBuf); // <EFBFBD><EFBFBD> <20><><EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> extern void SendNotice(const char * c_pszBuf); // 이 게임서버에만 공지
extern void SendLog(const char * c_pszBuf); // <EFBFBD><EFBFBD>ڿ<EFBFBD><EFBFBD>Ը<EFBFBD> <20><><EFBFBD><EFBFBD> extern void SendLog(const char * c_pszBuf); // 운영자에게만 공지
extern void BroadcastNotice(const char * c_pszBuf); // <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> extern void BroadcastNotice(const char * c_pszBuf); // 전 서버에 공지
extern void SendNoticeMap(const char* c_pszBuf, int nMapIndex, bool bBigFont); // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʿ<EFBFBD><CABF><EFBFBD> <20><><EFBFBD><EFBFBD> extern void SendNoticeMap(const char* c_pszBuf, int nMapIndex, bool bBigFont); // 지정 맵에만 공지
extern void SendMonarchNotice(BYTE bEmpire, const char * c_pszBuf); // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> extern void SendMonarchNotice(BYTE bEmpire, const char * c_pszBuf); // 같은 제국에게 공지
// LUA_ADD_BGM_INFO // LUA_ADD_BGM_INFO
void CHARACTER_SetBGMVolumeEnable(); void CHARACTER_SetBGMVolumeEnable();

View File

@ -35,7 +35,7 @@ extern bool china_event_server;
extern bool g_bNoMoreClient; extern bool g_bNoMoreClient;
extern bool g_bNoRegen; extern bool g_bNoRegen;
extern bool g_bTrafficProfileOn; ///< true <EFBFBD≯<EFBFBD> TrafficProfiler <EFBFBD><EFBFBD> <20>Ҵ<EFBFBD>. extern bool g_bTrafficProfileOn; ///< true 이면 TrafficProfiler 를 켠다.
extern BYTE g_bChannel; extern BYTE g_bChannel;
@ -99,8 +99,8 @@ extern int VIEW_RANGE;
extern int VIEW_BONUS_RANGE; extern int VIEW_BONUS_RANGE;
extern bool g_bCheckMultiHack; extern bool g_bCheckMultiHack;
extern bool g_protectNormalPlayer; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڰ<EFBFBD> "<22><>ȭ<EFBFBD><C8AD><EFBFBD><EFBFBD>" <20><> <20>Ϲ<EFBFBD><CFB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> extern bool g_protectNormalPlayer; // 범법자가 "평화모드" 인 일반유저를 공격하지 못함
extern bool g_noticeBattleZone; // <EFBFBD>߸<EFBFBD><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD> <20>ȳ<EFBFBD><C8B3>޼<EFBFBD><DEBC><EFBFBD><EFBFBD><EFBFBD> <20>˷<EFBFBD><CBB7><EFBFBD> extern bool g_noticeBattleZone; // 중립지대에 입장하면 안내메세지를 알려줌
extern DWORD g_GoldDropTimeLimitValue; extern DWORD g_GoldDropTimeLimitValue;

View File

@ -13,7 +13,7 @@ enum EMonsterChatState
typedef struct SMobRankStat typedef struct SMobRankStat
{ {
int iGoldPercent; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Ȯ<><C8AE> int iGoldPercent; // 돈이 나올 확률
} TMobRankStat; } TMobRankStat;
typedef struct SMobStat typedef struct SMobStat
@ -124,7 +124,7 @@ extern const int aiMobResistsApplyIdx[MOB_RESISTS_MAX_NUM];
extern const int aSkillAttackAffectProbByRank[MOB_RANK_MAX_NUM]; extern const int aSkillAttackAffectProbByRank[MOB_RANK_MAX_NUM];
extern const int aiItemMagicAttributePercentHigh[ITEM_ATTRIBUTE_MAX_LEVEL]; // 1<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> extern const int aiItemMagicAttributePercentHigh[ITEM_ATTRIBUTE_MAX_LEVEL]; // 1개까지
extern const int aiItemMagicAttributePercentLow[ITEM_ATTRIBUTE_MAX_LEVEL]; extern const int aiItemMagicAttributePercentLow[ITEM_ATTRIBUTE_MAX_LEVEL];
extern const int aiItemAttributeAddPercent[ITEM_ATTRIBUTE_MAX_NUM]; extern const int aiItemAttributeAddPercent[ITEM_ATTRIBUTE_MAX_NUM];

View File

@ -2,7 +2,7 @@
* date : 2006.11.20 * date : 2006.11.20
* file : cube.h * file : cube.h
* author : mhh * author : mhh
* description : ť<EFBFBD><EFBFBD><EFBFBD>ý<EFBFBD><EFBFBD><EFBFBD> * description : 큐브시스템
*/ */
#ifndef _cube_h_ #ifndef _cube_h_
@ -30,7 +30,7 @@ struct CUBE_DATA
std::vector<CUBE_VALUE> item; std::vector<CUBE_VALUE> item;
std::vector<CUBE_VALUE> reward; std::vector<CUBE_VALUE> reward;
int percent; int percent;
unsigned int gold; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʿ<EFBFBD><CABF><EFBFBD> <20>ݾ<EFBFBD> unsigned int gold; // 제조시 필요한 금액
CUBE_DATA(); CUBE_DATA();

View File

@ -105,7 +105,7 @@ class DBManager : public singleton<DBManager>
void FlushBilling(bool bForce=false); void FlushBilling(bool bForce=false);
void CheckBilling(); void CheckBilling();
void StopAllBilling(); // 20050503.ipkn.DB-AUTH <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>̺<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><EFBFBD><E7BFAC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>) void StopAllBilling(); // 20050503.ipkn.DB-AUTH 접속 종료시 빌링 테이블 모두 지우기 (재연결시 복구함)
DWORD CountQuery() { return m_sql.CountQuery(); } DWORD CountQuery() { return m_sql.CountQuery(); }
DWORD CountQueryResult() { return m_sql.CountResult(); } DWORD CountQueryResult() { return m_sql.CountResult(); }
@ -119,8 +119,8 @@ class DBManager : public singleton<DBManager>
const std::string & GetDBString(const std::string& key); const std::string & GetDBString(const std::string& key);
const std::vector<std::string> & GetGreetMessage(); const std::vector<std::string> & GetGreetMessage();
template<class Functor> void FuncQuery(Functor f, const char * c_pszFormat, ...); // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> f<><66><EFBFBD>ڷ<EFBFBD> ȣ<><C8A3><EFBFBD><EFBFBD> (SQLMsg *) <EFBFBD>˾Ƽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> template<class Functor> void FuncQuery(Functor f, const char * c_pszFormat, ...); // 결과를 f인자로 호출함 (SQLMsg *) 알아서 해제됨
template<class Functor> void FuncAfterQuery(Functor f, const char * c_pszFormat, ...); // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> f<><66> ȣ<><C8A3><EFBFBD><EFBFBD> void f(void) <EFBFBD><EFBFBD><EFBFBD><EFBFBD> template<class Functor> void FuncAfterQuery(Functor f, const char * c_pszFormat, ...); // 끝나고 나면 f가 호출됨 void f(void) 형태
size_t EscapeString(char* dst, size_t dstSize, const char *src, size_t srcSize); size_t EscapeString(char* dst, size_t dstSize, const char *src, size_t srcSize);

View File

@ -47,14 +47,14 @@ class CLoginKey
}; };
// sequence <EFBFBD><EFBFBD><EFBFBD><EFBFBD> ã<><C3A3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ÿ // sequence 버그 찾기용 데이타
struct seq_t struct seq_t
{ {
BYTE hdr; BYTE hdr;
BYTE seq; BYTE seq;
}; };
typedef std::vector<seq_t> seq_vector_t; typedef std::vector<seq_t> seq_vector_t;
// sequence <EFBFBD><EFBFBD><EFBFBD><EFBFBD> ã<><C3A3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ÿ // sequence 버그 찾기용 데이타
extern void DescReadHandler(bufferevent *bev, void *ctx); extern void DescReadHandler(bufferevent *bev, void *ctx);
extern void DescWriteHandler(bufferevent *bev, void *ctx); extern void DescWriteHandler(bufferevent *bev, void *ctx);
@ -109,7 +109,7 @@ class DESC
bool IsPhase(int phase) const { return m_iPhase == phase ? true : false; } bool IsPhase(int phase) const { return m_iPhase == phase ? true : false; }
// <EFBFBD>ڵ彦<EFBFBD><EFBFBD>ũ (<28>ð<EFBFBD> <20><><EFBFBD><EFBFBD>ȭ) // 핸드쉐이크 (시간 동기화)
void StartHandshake(DWORD _dw); void StartHandshake(DWORD _dw);
void SendHandshake(DWORD dwCurTime, LONG lNewDelta); void SendHandshake(DWORD dwCurTime, LONG lNewDelta);
bool HandshakeProcess(DWORD dwTime, LONG lDelta, bool bInfiniteRetry=false); bool HandshakeProcess(DWORD dwTime, LONG lDelta, bool bInfiniteRetry=false);
@ -118,7 +118,7 @@ class DESC
DWORD GetHandshake() const { return m_dwHandshake; } DWORD GetHandshake() const { return m_dwHandshake; }
DWORD GetClientTime(); DWORD GetClientTime();
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> // 제국
BYTE GetEmpire(); BYTE GetEmpire();
// for p2p // for p2p
@ -127,7 +127,7 @@ class DESC
void DisconnectOfSameLogin(); void DisconnectOfSameLogin();
void SetAdminMode(); void SetAdminMode();
bool IsAdminMode(); // Handshake <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ֳ<EFBFBD>? bool IsAdminMode(); // Handshake 에서 어드민 명령을 쓸수있나?
void SetPong(bool b); void SetPong(bool b);
bool IsPong(); bool IsPong();
@ -200,7 +200,7 @@ class DESC
WORD m_wP2PPort; WORD m_wP2PPort;
BYTE m_bP2PChannel; BYTE m_bP2PChannel;
bool m_bAdminMode; // Handshake <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ֳ<EFBFBD>? bool m_bAdminMode; // Handshake 에서 어드민 명령을 쓸수있나?
bool m_bPong; bool m_bPong;
int m_iCurrentSequence; int m_iCurrentSequence;
@ -252,7 +252,7 @@ class DESC
void ChatPacket(BYTE type, const char * format, ...); void ChatPacket(BYTE type, const char * format, ...);
/* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ã<><C3A3><EFBFBD><EFBFBD> <20>ڵ<EFBFBD> */ /* 시퀀스 버그 찾기용 코드 */
public: public:
seq_vector_t m_seq_vector; seq_vector_t m_seq_vector;
void push_seq (BYTE hdr, BYTE seq); void push_seq (BYTE hdr, BYTE seq);

View File

@ -38,8 +38,8 @@ class CDungeon
void IncMonster() { m_iMonsterCount++; SPDLOG_DEBUG("MonsterCount {}", m_iMonsterCount); } void IncMonster() { m_iMonsterCount++; SPDLOG_DEBUG("MonsterCount {}", m_iMonsterCount); }
void DecMonster() { m_iMonsterCount--; CheckEliminated(); } void DecMonster() { m_iMonsterCount--; CheckEliminated(); }
int CountMonster() { return m_iMonsterCount; } // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> int CountMonster() { return m_iMonsterCount; } // 데이터로 리젠한 몬스터의 수
int CountRealMonster(); // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʻ<EFBFBD><CABB><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> int CountRealMonster(); // 실제로 맵상에 있는 몬스터
void IncPartyMember(LPPARTY pParty, LPCHARACTER ch); void IncPartyMember(LPPARTY pParty, LPCHARACTER ch);
void DecPartyMember(LPPARTY pParty, LPCHARACTER ch); void DecPartyMember(LPPARTY pParty, LPCHARACTER ch);
@ -103,7 +103,7 @@ class CDungeon
void SetFlag(std::string name, int value); void SetFlag(std::string name, int value);
void SetWarpLocation (int map_index, int x, int y); void SetWarpLocation (int map_index, int x, int y);
// item group<EFBFBD><EFBFBD> item_vnum<EFBFBD><EFBFBD> item_count<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. // item group item_vnum item_count로 구성.
typedef std::vector <std::pair <DWORD, int> > ItemGroup; typedef std::vector <std::pair <DWORD, int> > ItemGroup;
void CreateItemGroup (std::string& group_name, ItemGroup& item_group); void CreateItemGroup (std::string& group_name, ItemGroup& item_group);
const ItemGroup* GetItemGroup (std::string& group_name); const ItemGroup* GetItemGroup (std::string& group_name);
@ -142,7 +142,7 @@ class CDungeon
bool m_bExitAllAtEliminate; bool m_bExitAllAtEliminate;
bool m_bWarpAtEliminate; bool m_bWarpAtEliminate;
// <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><>ġ // 적 전멸시 워프하는 위치
int m_iWarpDelay; int m_iWarpDelay;
int m_lWarpMapIndex; int m_lWarpMapIndex;
int m_lWarpX; int m_lWarpX;
@ -163,9 +163,9 @@ class CDungeon
friend EVENTFUNC(dungeon_exit_all_event); friend EVENTFUNC(dungeon_exit_all_event);
friend EVENTFUNC(dungeon_jump_to_event); friend EVENTFUNC(dungeon_jump_to_event);
// <EFBFBD><EFBFBD>Ƽ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ӽ<EFBFBD> <20><><EFBFBD><EFBFBD>. // 파티 단위 던전 입장을 위한 임시 변수.
// m_map_pkParty<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ν<EFBFBD><CEBD>Ͽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD>ٰ<EFBFBD> <20>Ǵ<EFBFBD><C7B4>Ͽ<EFBFBD>, // m_map_pkParty는 관리가 부실하여 사용할 수 없다고 판단하여,
// <EFBFBD>ӽ÷<EFBFBD> <20><> <20><>Ƽ<EFBFBD><C6BC> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. // 임시로 한 파티에 대한 관리를 하는 변수 생성.
LPPARTY m_pParty; LPPARTY m_pParty;
public : public :

View File

@ -28,7 +28,7 @@ class CEntity
void ViewCleanup(); void ViewCleanup();
void ViewInsert(LPENTITY entity, bool recursive = true); void ViewInsert(LPENTITY entity, bool recursive = true);
void ViewRemove(LPENTITY entity, bool recursive = true); void ViewRemove(LPENTITY entity, bool recursive = true);
void ViewReencode(); // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> Entity<EFBFBD><EFBFBD> <20><>Ŷ<EFBFBD><C5B6> <20>ٽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. void ViewReencode(); // 주위 Entity에 패킷을 다시 보낸다.
int GetViewAge() const { return m_iViewAge; } int GetViewAge() const { return m_iViewAge; }

View File

@ -1,8 +1,8 @@
/* /*
* Filename: event.h * Filename: event.h
* Description: <EFBFBD>̺<EFBFBD>Ʈ <20><><EFBFBD><EFBFBD> (timed event) * Description: 이벤트 관련 (timed event)
* *
* Author: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (aka. <EFBFBD><EFBFBD><EFBFBD><EFBFBD>, Cronan), <EFBFBD>ۿ<EFBFBD><EFBFBD><EFBFBD> (aka. myevan, <EFBFBD><EFBFBD><EFBFBD>ڷ<EFBFBD>) * Author: 김한주 (aka. 비엽, Cronan), 송영진 (aka. myevan, 빗자루)
*/ */
#ifndef __INC_LIBTHECORE_EVENT_H__ #ifndef __INC_LIBTHECORE_EVENT_H__
#define __INC_LIBTHECORE_EVENT_H__ #define __INC_LIBTHECORE_EVENT_H__
@ -81,10 +81,10 @@ extern int event_count();
#define event_create(func, info, when) event_create_ex(func, info, when) #define event_create(func, info, when) event_create_ex(func, info, when)
extern LPEVENT event_create_ex(TEVENTFUNC func, event_info_data* info, int when); extern LPEVENT event_create_ex(TEVENTFUNC func, event_info_data* info, int when);
extern void event_cancel(LPEVENT * event); // <EFBFBD>̺<EFBFBD>Ʈ <20><><EFBFBD><EFBFBD> extern void event_cancel(LPEVENT * event); // 이벤트 취소
extern int event_processing_time(LPEVENT event); // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ð<EFBFBD> <20><><EFBFBD><EFBFBD> extern int event_processing_time(LPEVENT event); // 수행 시간 리턴
extern int event_time(LPEVENT event); // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ð<EFBFBD> <20><><EFBFBD><EFBFBD> extern int event_time(LPEVENT event); // 남은 시간 리턴
extern void event_reset_time(LPEVENT event, int when); // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ð<EFBFBD> <20><> <20><><EFBFBD><EFBFBD> extern void event_reset_time(LPEVENT event, int when); // 실행 시간 재 설정
extern void event_set_verbose(int level); extern void event_set_verbose(int level);
extern event_info_data* FindEventInfo(DWORD dwID); extern event_info_data* FindEventInfo(DWORD dwID);

View File

@ -35,7 +35,7 @@ class CExchange
bool CheckSpace(); bool CheckSpace();
private: private:
CExchange * m_pCompany; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> CExchange <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> CExchange * m_pCompany; // 상대방의 CExchange 포인터
LPCHARACTER m_pOwner; LPCHARACTER m_pOwner;

View File

@ -45,15 +45,15 @@ public:
int GetRowCount(); int GetRowCount();
template <typename T> template <typename T>
bool GetValue(size_t i, const std::string & c_rstrColKey, T& tValue) const; // n<EFBFBD><EFBFBD>°(map<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>, txt<78><74> <20><><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>) row<6F><77> Ư<><C6AF> <20>÷<EFBFBD><C3B7><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD>ϴ<EFBFBD> <20>Լ<EFBFBD>. bool GetValue(size_t i, const std::string & c_rstrColKey, T& tValue) const; // n번째(map에 들어있는 순서일 뿐, txt의 순서와는 관계 없음) row의 특정 컬럼의 값을 반환하는 함수.
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̱<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD>Ǹ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>Լ<EFBFBD>. // 이질적이긴 하지만, 편의를 위한 함수.
template <typename T> template <typename T>
bool GetValue(const std::string & c_rstrRowKey, const std::string & c_rstrColKey, T& tValue) const; bool GetValue(const std::string & c_rstrRowKey, const std::string & c_rstrColKey, T& tValue) const;
template <typename T> template <typename T>
bool GetValue(const std::string & c_rstrRowKey, int index, T& tValue) const; bool GetValue(const std::string & c_rstrRowKey, int index, T& tValue) const;
bool GetRow(const std::string & c_rstrKey, OUT const CGroupNodeRow ** ppRow) const; bool GetRow(const std::string & c_rstrKey, OUT const CGroupNodeRow ** ppRow) const;
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, idx<EFBFBD><EFBFBD> txt<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. // 참고로, idx txt에 쓰여진 순서랑 관계 없음.
bool GetRow(int idx, OUT const CGroupNodeRow ** ppRow) const; bool GetRow(int idx, OUT const CGroupNodeRow ** ppRow) const;
bool GetGroupRow(const std::string& stGroupName, const std::string& stRow, OUT const CGroupNode::CGroupNodeRow ** ppRow) const; bool GetGroupRow(const std::string& stGroupName, const std::string& stRow, OUT const CGroupNode::CGroupNodeRow ** ppRow) const;
@ -184,7 +184,7 @@ bool CGroupNode::GetGroupValue(const std::string& stGroupName, const std::string
if (pChildGroup->GetValue(stRow, iCol, tValue)) if (pChildGroup->GetValue(stRow, iCol, tValue))
return true; return true;
} }
// default group<EFBFBD><EFBFBD> <20><><EFBFBD>. // default group을 살펴봄.
pChildGroup = GetChildNode("default"); pChildGroup = GetChildNode("default");
if (NULL != pChildGroup) if (NULL != pChildGroup)
{ {
@ -203,7 +203,7 @@ bool CGroupNode::GetGroupValue(const std::string& stGroupName, const std::string
if (pChildGroup->GetValue(stRow, stCol, tValue)) if (pChildGroup->GetValue(stRow, stCol, tValue))
return true; return true;
} }
// default group<EFBFBD><EFBFBD> <20><><EFBFBD>. // default group을 살펴봄.
pChildGroup = GetChildNode("default"); pChildGroup = GetChildNode("default");
if (NULL != pChildGroup) if (NULL != pChildGroup)
{ {

View File

@ -29,12 +29,12 @@ struct SGuildMaster
typedef struct SGuildMember typedef struct SGuildMember
{ {
DWORD pid; // player <EFBFBD><EFBFBD><EFBFBD>̺<EFBFBD><EFBFBD><EFBFBD> id; primary key DWORD pid; // player 테이블의 id; primary key
BYTE grade; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>÷<EFBFBD><C3B7>̾<EFBFBD><CCBE><EFBFBD> <20><><EFBFBD><EFBFBD> 1 to 15 (1<EFBFBD><EFBFBD> ¯) BYTE grade; // 길드상의 플레이어의 계급 1 to 15 (1이 짱)
BYTE is_general; BYTE is_general;
BYTE job; BYTE job;
BYTE level; BYTE level;
DWORD offer_exp; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ġ DWORD offer_exp; // 공헌한 경험치
BYTE _dummy; BYTE _dummy;
std::string name; std::string name;
@ -72,7 +72,7 @@ typedef struct packet_guild_sub_info
typedef struct SGuildGrade typedef struct SGuildGrade
{ {
char grade_name[GUILD_GRADE_NAME_MAX_LEN+1]; // 8+1 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20≯<EFBFBD> char grade_name[GUILD_GRADE_NAME_MAX_LEN+1]; // 8+1 길드장, 길드원 등의 이름
BYTE auth_flag; BYTE auth_flag;
} TGuildGrade; } TGuildGrade;
@ -256,7 +256,7 @@ class CGuild
bool ChargeSP(LPCHARACTER ch, int iSP); bool ChargeSP(LPCHARACTER ch, int iSP);
void Chat(const char* c_pszText); void Chat(const char* c_pszText);
void P2PChat(const char* c_pszText); // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> ä<><C3A4> void P2PChat(const char* c_pszText); // 길드 채팅
void SkillUsableChange(DWORD dwSkillVnum, bool bUsable); void SkillUsableChange(DWORD dwSkillVnum, bool bUsable);
void AdvanceLevel(int iLevel); void AdvanceLevel(int iLevel);
@ -266,7 +266,7 @@ class CGuild
void RequestWithdrawMoney(LPCHARACTER ch, int iGold); void RequestWithdrawMoney(LPCHARACTER ch, int iGold);
void RecvMoneyChange(int iGold); void RecvMoneyChange(int iGold);
void RecvWithdrawMoneyGive(int iChangeGold); // bGive==1 <EFBFBD≯<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E5BFA1> <20>ִ<EFBFBD> <20><> <20>õ<EFBFBD><C3B5>ϰ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>и<EFBFBD> <20><><EFBFBD>񿡰<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> void RecvWithdrawMoneyGive(int iChangeGold); // bGive==1 이면 길드장에게 주는 걸 시도하고 성공실패를 디비에게 보낸다
int GetGuildMoney() const { return m_data.gold; } int GetGuildMoney() const { return m_data.gold; }
@ -277,7 +277,7 @@ class CGuild
int GetGuildWarState(DWORD guild_id); int GetGuildWarState(DWORD guild_id);
bool CanStartWar(BYTE bGuildWarType); bool CanStartWar(BYTE bGuildWarType);
DWORD GetWarStartTime(DWORD guild_id); DWORD GetWarStartTime(DWORD guild_id);
bool UnderWar(DWORD guild_id); // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΰ<EFBFBD>? bool UnderWar(DWORD guild_id); // 전쟁중인가?
DWORD UnderAnyWar(BYTE bType = GUILD_WAR_TYPE_MAX_NUM); DWORD UnderAnyWar(BYTE bType = GUILD_WAR_TYPE_MAX_NUM);
// War map relative // War map relative
@ -320,26 +320,26 @@ class CGuild
bool HasLand(); bool HasLand();
// GUILD_JOIN_BUG_FIX // GUILD_JOIN_BUG_FIX
/// character <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E5B0A1> <20>ʴ븦 <20>Ѵ<EFBFBD>. /// character 에게 길드가입 초대를 한다.
/** /**
* @param pchInviter <EFBFBD>ʴ<EFBFBD><EFBFBD><EFBFBD> character. * @param pchInviter 초대한 character.
* @param pchInvitee <EFBFBD>ʴ<EFBFBD><EFBFBD><EFBFBD> character. * @param pchInvitee 초대할 character.
* *
* <EFBFBD>ʴ<EFBFBD><EFBFBD>ϰų<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><C2B6><EFBFBD> <20>ش<EFBFBD><D8B4>ϴ<EFBFBD> ä<><C3A4> <20>޼<EFBFBD><DEBC><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>. * 초대하거나 받을수 없는 상태라면 해당하는 채팅 메세지를 전송한다.
*/ */
void Invite( LPCHARACTER pchInviter, LPCHARACTER pchInvitee ); void Invite( LPCHARACTER pchInviter, LPCHARACTER pchInvitee );
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʴ뿡 <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> character <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD>Ѵ<EFBFBD>. /// 길드초대에 대한 상대 character 의 수락을 처리한다.
/** /**
* @param pchInvitee <EFBFBD>ʴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> character * @param pchInvitee 초대받은 character
* *
* <EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD>԰<EFBFBD><D4B0><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>°<EFBFBD> <20>ƴ϶<C6B4><CFB6><EFBFBD> <20>ش<EFBFBD><D8B4>ϴ<EFBFBD> ä<><C3A4> <20>޼<EFBFBD><DEBC><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>. * 길드에 가입가능한 상태가 아니라면 해당하는 채팅 메세지를 전송한다.
*/ */
void InviteAccept( LPCHARACTER pchInvitee ); void InviteAccept( LPCHARACTER pchInvitee );
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʴ뿡 <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> character <20><> <20>źθ<C5BA> ó<><C3B3><EFBFBD>Ѵ<EFBFBD>. /// 길드초대에 대한 상대 character 의 거부를 처리한다.
/** /**
* @param dwPID <EFBFBD>ʴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> character <EFBFBD><EFBFBD> PID * @param dwPID 초대받은 character PID
*/ */
void InviteDeny( DWORD dwPID ); void InviteDeny( DWORD dwPID );
// END_OF_GUILD_JOIN_BUG_FIX // END_OF_GUILD_JOIN_BUG_FIX
@ -377,27 +377,27 @@ class CGuild
bool abSkillUsable[GUILD_SKILL_COUNT]; bool abSkillUsable[GUILD_SKILL_COUNT];
// GUILD_JOIN_BUG_FIX // GUILD_JOIN_BUG_FIX
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>. /// 길드 가입을 할 수 없을 경우의 에러코드.
enum GuildJoinErrCode { enum GuildJoinErrCode {
GERR_NONE = 0, ///< ó<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> GERR_NONE = 0, ///< 처리성공
GERR_WITHDRAWPENALTY, ///< Ż<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>԰<EFBFBD><D4B0><EFBFBD><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> GERR_WITHDRAWPENALTY, ///< 탈퇴후 가입가능한 시간이 지나지 않음
GERR_COMMISSIONPENALTY, ///< <EFBFBD>ػ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>԰<EFBFBD><D4B0><EFBFBD><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> GERR_COMMISSIONPENALTY, ///< 해산후 가입가능한 시간이 지나지 않음
GERR_ALREADYJOIN, ///< <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD>Ͱ<EFBFBD> <20>̹<EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> GERR_ALREADYJOIN, ///< 길드가입 대상 캐릭터가 이미 길드에 가입해 있음
GERR_GUILDISFULL, ///< <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ο<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʰ<EFBFBD> GERR_GUILDISFULL, ///< 길드인원 제한 초과
GERR_GUILD_IS_IN_WAR, ///< <EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> GERR_GUILD_IS_IN_WAR, ///< 길드가 현재 전쟁중
GERR_INVITE_LIMIT, ///< <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> GERR_INVITE_LIMIT, ///< 길드원 가입 제한 상태
GERR_MAX ///< Error code <EFBFBD>ְ<EFBFBD>ġ. <20><> <20>տ<EFBFBD> Error code <EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0>Ѵ<EFBFBD>. GERR_MAX ///< Error code 최고치. 이 앞에 Error code 를 추가한다.
}; };
/// <EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>˻<EFBFBD><CBBB>Ѵ<EFBFBD>. /// 길드에 가입 가능한 조건을 검사한다.
/** /**
* @param [in] pchInvitee <EFBFBD>ʴ<EFBFBD><EFBFBD>޴<EFBFBD> character * @param [in] pchInvitee 초대받는 character
* @return GuildJoinErrCode * @return GuildJoinErrCode
*/ */
GuildJoinErrCode VerifyGuildJoinableCondition( const LPCHARACTER pchInvitee ); GuildJoinErrCode VerifyGuildJoinableCondition( const LPCHARACTER pchInvitee );
typedef std::map< DWORD, LPEVENT > EventMap; typedef std::map< DWORD, LPEVENT > EventMap;
EventMap m_GuildInviteEventMap; ///< <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>û Event map. key: <EFBFBD>ʴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> PID EventMap m_GuildInviteEventMap; ///< 길드 초청 Event map. key: 초대받은 캐릭터의 PID
// END_OF_GUILD_JOIN_BUG_FIX // END_OF_GUILD_JOIN_BUG_FIX
}; };

View File

@ -8,10 +8,10 @@ const int HORSE_MAX_LEVEL = 30;
struct THorseStat struct THorseStat
{ {
int iMinLevel; // ž<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>ִ<EFBFBD> <20>ּ<EFBFBD> <20><><EFBFBD><EFBFBD> int iMinLevel; // 탑승할 수 있는 최소 레벨
int iNPCRace; int iNPCRace;
int iMaxHealth; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> ü<><C3BC> int iMaxHealth; // 말의 최대 체력
int iMaxStamina; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD>׹̳<D7B9> int iMaxStamina; // 말의 최대 스테미너
int iST; int iST;
int iDX; int iDX;
int iHT; int iHT;

View File

@ -177,7 +177,7 @@ protected:
protected: protected:
void MapLocations(const char * c_pData); void MapLocations(const char * c_pData);
void LoginSuccess(DWORD dwHandle, const char *data); void LoginSuccess(DWORD dwHandle, const char *data);
void PlayerCreateFailure(LPDESC d, BYTE bType); // 0 = <EFBFBD>Ϲ<EFBFBD> <20><><EFBFBD><EFBFBD> 1 = <20>̹<EFBFBD> <20><><EFBFBD><EFBFBD> void PlayerCreateFailure(LPDESC d, BYTE bType); // 0 = 일반 실패 1 = 이미 있음
void PlayerDeleteSuccess(LPDESC d, const char * data); void PlayerDeleteSuccess(LPDESC d, const char * data);
void PlayerDeleteFail(LPDESC d); void PlayerDeleteFail(LPDESC d);
void PlayerLoad(LPDESC d, const char* data); void PlayerLoad(LPDESC d, const char* data);
@ -272,10 +272,10 @@ protected:
void BlockException(TPacketBlockException * data); void BlockException(TPacketBlockException * data);
// MYSHOP_PRICE_LIST // MYSHOP_PRICE_LIST
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><>û<EFBFBD><C3BB> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>Ŷ(HEADER_DG_MYSHOP_PRICELIST_RES) ó<EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD> /// 아이템 가격정보 리스트 요청에 대한 응답 패킷(HEADER_DG_MYSHOP_PRICELIST_RES) 처리함수
/** /**
* @param d <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><>û<EFBFBD><C3BB> <20>÷<EFBFBD><C3B7>̾<EFBFBD><CCBE><EFBFBD> descriptor * @param d 아이템 가격정보 리스트를 요청한 플레이어의 descriptor
* @param p <EFBFBD><EFBFBD>Ŷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> * @param p 패킷데이터의 포인터
*/ */
void MyshopPricelistRes( LPDESC d, const TPacketMyshopPricelistHeader* p ); void MyshopPricelistRes( LPDESC d, const TPacketMyshopPricelistHeader* p );
// END_OF_MYSHOP_PRICE_LIST // END_OF_MYSHOP_PRICE_LIST
@ -285,7 +285,7 @@ protected:
//END_RELOAD_ADMIN //END_RELOAD_ADMIN
void DetailLog(const TPacketNeedLoginLogInfo* info); void DetailLog(const TPacketNeedLoginLogInfo* info);
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>׽<EFBFBD>Ʈ // 독일 선물 기능 테스트
void ItemAwardInformer(TPacketItemAwardInfromer* data); void ItemAwardInformer(TPacketItemAwardInfromer* data);
void RespondChannelStatus(LPDESC desc, const char* pcData); void RespondChannelStatus(LPDESC desc, const char* pcData);

View File

@ -60,10 +60,10 @@ class CItem : public CEntity
bool SetCount(DWORD count); bool SetCount(DWORD count);
DWORD GetCount(); DWORD GetCount();
// GetVnum<EFBFBD><EFBFBD> GetOriginalVnum<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> comment // GetVnum GetOriginalVnum에 대한 comment
// GetVnum<EFBFBD><EFBFBD> Masking <EFBFBD><EFBFBD> Vnum<EFBFBD>̴<EFBFBD>. <20≯<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ν<EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Vnum<EFBFBD><EFBFBD> 10<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, Vnum<EFBFBD><EFBFBD> 20<EFBFBD><EFBFBD> <20><>ó<EFBFBD><C3B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>ִ<EFBFBD> <20><><EFBFBD>̴<EFBFBD>. // GetVnum Masking Vnum이다. 이를 사용함으로써, 아이템의 실제 Vnum 10이지만, Vnum 20인 것처럼 동작할 수 있는 것이다.
// Masking <EFBFBD><EFBFBD><EFBFBD><EFBFBD> ori_to_new.txt<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ǵ<EFBFBD> <20><><EFBFBD>̴<EFBFBD>. // Masking 값은 ori_to_new.txt에서 정의된 값이다.
// GetOriginalVnum<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Vnum<75><6D><EFBFBD><EFBFBD>, <20>α<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>, Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> Vnum<75><6D> <20><><EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD><CFBF><EFBFBD> <20>Ѵ<EFBFBD>. // GetOriginalVnum은 아이템 고유의 Vnum으로, 로그 남길 때, 클라이언트에 아이템 정보 보낼 때, 저장할 때는 이 Vnum을 사용하여야 한다.
// //
DWORD GetVnum() const { return m_dwMaskVnum ? m_dwMaskVnum : m_dwVnum; } DWORD GetVnum() const { return m_dwMaskVnum ? m_dwMaskVnum : m_dwVnum; }
DWORD GetOriginalVnum() const { return m_dwVnum; } DWORD GetOriginalVnum() const { return m_dwVnum; }
@ -103,7 +103,7 @@ class CItem : public CEntity
bool IsPolymorphItem(); bool IsPolymorphItem();
void ModifyPoints(bool bAdd); // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ȿ<><C8BF><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD>Ϳ<EFBFBD> <20>ο<EFBFBD> <20>Ѵ<EFBFBD>. bAdd<EFBFBD><EFBFBD> false<EFBFBD≯<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> void ModifyPoints(bool bAdd); // 아이템의 효과를 캐릭터에 부여 한다. bAdd false이면 제거함
bool CreateSocket(BYTE bSlot, BYTE bGold); bool CreateSocket(BYTE bSlot, BYTE bGold);
const int * GetSockets() { return &m_alSockets[0]; } const int * GetSockets() { return &m_alSockets[0]; }
@ -146,7 +146,7 @@ class CItem : public CEntity
DWORD GetLastOwnerPID() { return m_dwLastOwnerPID; } DWORD GetLastOwnerPID() { return m_dwLastOwnerPID; }
int GetAttributeSetIndex(); // <EFBFBD>Ӽ<EFBFBD> <20>ٴ°<D9B4><C2B0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><E8BFAD> <20><><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD><CFB4><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>. int GetAttributeSetIndex(); // 속성 붙는것을 지정한 배열의 어느 인덱스를 사용하는지 돌려준다.
void AlterToMagicItem(); void AlterToMagicItem();
void AlterToSocketItem(int iSocketCount); void AlterToSocketItem(int iSocketCount);
@ -165,7 +165,7 @@ class CItem : public CEntity
void StopTimerBasedOnWearExpireEvent(); void StopTimerBasedOnWearExpireEvent();
void StopAccessorySocketExpireEvent(); void StopAccessorySocketExpireEvent();
// <EFBFBD>ϴ<EFBFBD> REAL_TIME<EFBFBD><EFBFBD> TIMER_BASED_ON_WEAR <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ۿ<EFBFBD> <20><><EFBFBD>ؼ<EFBFBD><D8BC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. // 일단 REAL_TIME TIMER_BASED_ON_WEAR 아이템에 대해서만 제대로 동작함.
int GetDuration(); int GetDuration();
int GetAttributeCount(); int GetAttributeCount();
@ -180,7 +180,7 @@ class CItem : public CEntity
bool IsSameSpecialGroup(const LPITEM item) const; bool IsSameSpecialGroup(const LPITEM item) const;
// ACCESSORY_REFINE // ACCESSORY_REFINE
// <EFBFBD>׼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߰<EFBFBD> // 액세서리에 광산을 통해 소켓을 추가
bool IsAccessoryForSocket(); bool IsAccessoryForSocket();
int GetAccessorySocketGrade(); int GetAccessorySocketGrade();
@ -193,7 +193,7 @@ class CItem : public CEntity
void AccessorySocketDegrade(); void AccessorySocketDegrade();
// <EFBFBD>Ǽ<EFBFBD><EFBFBD><20><> <20><><EFBFBD><EFBFBD><EFBFBD>ۿ<EFBFBD> <20>۾<EFBFBD><DBBE><EFBFBD><EFBFBD><EFBFBD> Ÿ<≯<EFBFBD> <20><><EFBFBD>ư<EFBFBD><C6B0>°<EFBFBD>( <20><><EFBFBD><EFBFBD>, <20><> ) // 악세사리 를 아이템에 밖았을때 타이머 돌아가는것( 구리, 등 )
void StartAccessorySocketExpireEvent(); void StartAccessorySocketExpireEvent();
void SetAccessorySocketExpireEvent(LPEVENT pkEvent); void SetAccessorySocketExpireEvent(LPEVENT pkEvent);
@ -227,7 +227,7 @@ class CItem : public CEntity
protected: protected:
friend class CInputDB; friend class CInputDB;
bool OnAfterCreatedItem(); // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Բ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>(<28>ε<EFBFBD>)<29><> <20><> <20>Ҹ<EFBFBD><D2B8><EFBFBD><EFBFBD><EFBFBD> <20>Լ<EFBFBD>. bool OnAfterCreatedItem(); // 서버상에 아이템이 모든 정보와 함께 완전히 생성(로드)된 후 불리우는 함수.
public: public:
bool IsRideItem(); bool IsRideItem();
@ -237,46 +237,46 @@ class CItem : public CEntity
bool IsNewMountItem(); bool IsNewMountItem();
#ifdef __AUCTION__ #ifdef __AUCTION__
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // 경매장
bool MoveToAuction (); bool MoveToAuction ();
void CopyToRawData (TPlayerItem* item); void CopyToRawData (TPlayerItem* item);
#endif #endif
// <EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ij<><C4B3> <20><><EFBFBD><EFBFBD><EFBFBD>۰<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><>ȯ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ij<><C4B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ٰ<EFBFBD> <20>Ͽ<EFBFBD>, // 독일에서 기존 캐시 아이템과 같지만, 교환 가능한 캐시 아이템을 만든다고 하여,
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ۿ<EFBFBD>, <20><>ȯ <20><><EFBFBD><EFBFBD> <20>÷<EFBFBD><C3B7>׸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ο<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>۵<EFBFBD><DBB5><EFBFBD> <20><><EFBFBD>ο<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><EBBFAA> <20>Ҵ<EFBFBD><D2B4>Ͽ<EFBFBD><CFBF><EFBFBD>. // 오리지널 아이템에, 교환 금지 플래그만 삭제한 새로운 아이템들을 새로운 아이템 대역에 할당하였다.
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ο<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>۵<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>۰<EFBFBD> <20><><EFBFBD><EFBFBD> ȿ<><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴµ<CFB4>, // 문제는 새로운 아이템도 오리지널 아이템과 같은 효과를 내야하는데,
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, Ŭ<><C5AC><EFBFBD><EFBFBD>, vnum <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ǿ<EFBFBD><C7BE>־<EFBFBD> // 서버건, 클라건, vnum 기반으로 되어있어
// <EFBFBD><EFBFBD><EFBFBD>ο<EFBFBD> vnum<75><6D> <20>˴<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20>ھƾ<DABE><C6BE>ϴ<EFBFBD> <20><>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD> <20><>Ȳ<EFBFBD><C8B2> <20>´<EFBFBD><C2B4>Ҵ<EFBFBD>. // 새로운 vnum을 죄다 서버에 새로 다 박아야하는 안타까운 상황에 맞닿았다.
// <EFBFBD>׷<EFBFBD><EFBFBD><EFBFBD> <20><> vnum<75><6D> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD≯<EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ư<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> vnum<75><6D><EFBFBD><EFBFBD> <20>ٲ㼭 <20><><EFBFBD><EFBFBD> <20>ϰ<EFBFBD>, // 그래서 새 vnum의 아이템이면, 서버에서 돌아갈 때는 오리지널 아이템 vnum으로 바꿔서 돌고 하고,
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> vnum<75><6D><EFBFBD><EFBFBD> <20>ٲ<EFBFBD><D9B2>ֵ<EFBFBD><D6B5><EFBFBD> <20>Ѵ<EFBFBD>. // 저장할 때에 본래 vnum으로 바꿔주도록 한다.
// Mask vnum<EFBFBD><EFBFBD> <20><20><><EFBFBD><EFBFBD>(ex. <20><><EFBFBD><EFBFBD> <20><>Ȳ)<29><> <20><><EFBFBD><EFBFBD> vnum<75><6D> <20>ٲ<EFBFBD><D9B2><EFBFBD> <20><><EFBFBD>ư<EFBFBD><C6B0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD>. // Mask vnum은 어떤 이유(ex. 위의 상황)로 인해 vnum이 바뀌어 돌아가는 아이템을 위해 있다.
void SetMaskVnum(DWORD vnum) { m_dwMaskVnum = vnum; } void SetMaskVnum(DWORD vnum) { m_dwMaskVnum = vnum; }
DWORD GetMaskVnum() { return m_dwMaskVnum; } DWORD GetMaskVnum() { return m_dwMaskVnum; }
bool IsMaskedItem() { return m_dwMaskVnum != 0; } bool IsMaskedItem() { return m_dwMaskVnum != 0; }
// <EFBFBD><EFBFBD>ȥ<EFBFBD><EFBFBD> // 용혼석
bool IsDragonSoul(); bool IsDragonSoul();
int GiveMoreTime_Per(float fPercent); int GiveMoreTime_Per(float fPercent);
int GiveMoreTime_Fix(DWORD dwTime); int GiveMoreTime_Fix(DWORD dwTime);
private: private:
TItemTable const * m_pProto; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ÿ<><C5B8> TItemTable const * m_pProto; // 프로토 타잎
DWORD m_dwVnum; DWORD m_dwVnum;
LPCHARACTER m_pOwner; LPCHARACTER m_pOwner;
BYTE m_bWindow; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> BYTE m_bWindow; // 현재 아이템이 위치한 윈도우
DWORD m_dwID; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȣ DWORD m_dwID; // 고유번호
bool m_bEquipped; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ǿ<EFBFBD><C7BE>°<EFBFBD>? bool m_bEquipped; // 장착 되었는가?
DWORD m_dwVID; // VID DWORD m_dwVID; // VID
WORD m_wCell; // <EFBFBD><EFBFBD>ġ WORD m_wCell; // 위치
DWORD m_dwCount; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> DWORD m_dwCount; // 개수
int m_lFlag; // <EFBFBD>߰<EFBFBD> flag int m_lFlag; // 추가 flag
DWORD m_dwLastOwnerPID; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>־<EFBFBD><D6BE><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> PID DWORD m_dwLastOwnerPID; // 마지막 가지고 있었던 사람의 PID
bool m_bExchanging; ///< <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD><C8AF> <20><><EFBFBD><EFBFBD> bool m_bExchanging; ///< 현재 교환중 상태
int m_alSockets[ITEM_SOCKET_MAX_NUM]; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ĺ int m_alSockets[ITEM_SOCKET_MAX_NUM]; // 아이템 소캣
TPlayerItemAttribute m_aAttr[ITEM_ATTRIBUTE_MAX_NUM]; TPlayerItemAttribute m_aAttr[ITEM_ATTRIBUTE_MAX_NUM];
LPEVENT m_pkDestroyEvent; LPEVENT m_pkDestroyEvent;

View File

@ -5,9 +5,9 @@
#include "pool.h" #include "pool.h"
#endif #endif
// special_item_group.txt<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20>Ӽ<EFBFBD> <20>׷<EFBFBD> // special_item_group.txt에서 정의하는 속성 그룹
// type attr<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>ִ<EFBFBD>. // type attr로 선언할 수 있다.
// <EFBFBD><EFBFBD> <20>Ӽ<EFBFBD> <20>׷<EFBFBD><D7B7><EFBFBD> <20>̿<EFBFBD><CCBF><EFBFBD> <20><> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> special_item_group.txt<EFBFBD><EFBFBD><EFBFBD><EFBFBD> Special type<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ǵ<EFBFBD> <20>׷쿡 <20><><EFBFBD><EFBFBD> UNIQUE ITEM<EFBFBD>̴<EFBFBD>. // 이 속성 그룹을 이용할 수 있는 것은 special_item_group.txt에서 Special type으로 정의된 그룹에 속한 UNIQUE ITEM이다.
class CSpecialAttrGroup class CSpecialAttrGroup
{ {
public: public:
@ -43,10 +43,10 @@ class CSpecialItemGroup
MOB_GROUP, MOB_GROUP,
}; };
// QUEST Ÿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><>ũ<EFBFBD><C5A9>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> vnum.sig_use<73><65> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>ִ<EFBFBD> <20>׷<EFBFBD><D7B7>̴<EFBFBD>. // QUEST 타입은 퀘스트 스크립트에서 vnum.sig_use를 사용할 수 있는 그룹이다.
// <EFBFBD><EFBFBD>, <20><> <20>׷쿡 <20><><EFBFBD><EFBFBD><EEB0A1> <20><><EFBFBD>ؼ<EFBFBD><D8BC><EFBFBD> ITEM <EFBFBD><EFBFBD>ü<EFBFBD><EFBFBD> TYPE<EFBFBD><EFBFBD> QUEST<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>. // 단, 이 그룹에 들어가기 위해서는 ITEM 자체의 TYPE QUEST여야 한다.
// SPECIAL Ÿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> idx, item_vnum, attr_vnum<EFBFBD><EFBFBD> <20>Է<EFBFBD><D4B7>Ѵ<EFBFBD>. attr_vnum<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> CSpecialAttrGroup<EFBFBD><EFBFBD> Vnum<EFBFBD>̴<EFBFBD>. // SPECIAL 타입은 idx, item_vnum, attr_vnum을 입력한다. attr_vnum은 위에 CSpecialAttrGroup Vnum이다.
// <EFBFBD><EFBFBD> <20>׷쿡 <20><><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>. // 이 그룹에 들어있는 아이템은 같이 착용할 수 없다.
enum ESIGType { NORMAL, PCT, QUEST, SPECIAL }; enum ESIGType { NORMAL, PCT, QUEST, SPECIAL };
struct CSpecialItemInfo struct CSpecialItemInfo
@ -79,9 +79,9 @@ class CSpecialItemGroup
return m_vecProbs.empty(); return m_vecProbs.empty();
} }
// Type Multi, <EFBFBD><EFBFBD> m_bType == PCT <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>, // Type Multi, m_bType == PCT 인 경우,
// Ȯ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ذ<EFBFBD><D8B0><EFBFBD> <20>ʰ<EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>. // 확률을 더해가지 않고, 독립적으로 계산하여 아이템을 생성한다.
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>ִ<EFBFBD>. // 따라서 여러 개의 아이템이 생성될 수 있다.
// by rtsummit // by rtsummit
int GetMultiIndex(std::vector <int> &idx_vec) const int GetMultiIndex(std::vector <int> &idx_vec) const
{ {
@ -143,8 +143,8 @@ class CSpecialItemGroup
return false; return false;
} }
// Group<EFBFBD><EFBFBD> Type<EFBFBD><EFBFBD> Special<EFBFBD><EFBFBD> <20><><EFBFBD> // Group Type Special인 경우에
// dwVnum<EFBFBD><EFBFBD> <20><>Ī<EFBFBD>Ǵ<EFBFBD> AttrVnum<EFBFBD><EFBFBD> return<EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>. // dwVnum에 매칭되는 AttrVnum return해준다.
DWORD GetAttrVnum(DWORD dwVnum) const DWORD GetAttrVnum(DWORD dwVnum) const
{ {
if (CSpecialItemGroup::SPECIAL != m_bType) if (CSpecialItemGroup::SPECIAL != m_bType)
@ -354,18 +354,18 @@ class ITEM_MANAGER : public singleton<ITEM_MANAGER>
bool Initialize(TItemTable * table, int size); bool Initialize(TItemTable * table, int size);
void Destroy(); void Destroy();
void Update(); // <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>θ<EFBFBD><CEB8><EFBFBD>. void Update(); // 매 루프마다 부른다.
void GracefulShutdown(); void GracefulShutdown();
DWORD GetNewID(); DWORD GetNewID();
bool SetMaxItemID(TItemIDRangeTable range); // <EFBFBD>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>̵<EFBFBD><CCB5><EFBFBD> <20><><EFBFBD><EFBFBD> bool SetMaxItemID(TItemIDRangeTable range); // 최대 고유 아이디를 지정
bool SetMaxSpareItemID(TItemIDRangeTable range); bool SetMaxSpareItemID(TItemIDRangeTable range);
// DelayedSave: <EFBFBD><EFBFBD><EFBFBD> <20><>ƾ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ؾ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ϸ<EFBFBD> <20><><EFBFBD><EFBFBD> // DelayedSave: 어떠한 루틴 내에서 저장을 해야 할 짓을 많이 하면 저장
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʹ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD> "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>" <20><><EFBFBD><EFBFBD> ǥ<>ø<EFBFBD> <20>صΰ<D8B5> <20><><EFBFBD><EFBFBD> // 쿼리가 너무 많아지므로 "저장을 한다" 라고 표시만 해두고 잠깐
// (<EFBFBD><EFBFBD>: 1 frame) <EFBFBD>Ŀ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ų<EFBFBD><C5B2>. // (: 1 frame) 후에 저장시킨다.
void DelayedSave(LPITEM item); void DelayedSave(LPITEM item);
void FlushDelayedSave(LPITEM item); // Delayed <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><EFBFBD> <20>ִٸ<D6B4> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>. <20><><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>. void FlushDelayedSave(LPITEM item); // Delayed 리스트에 있다면 지우고 저장한다. 끊김 처리시 사용 됨.
void SaveSingleItem(LPITEM item); void SaveSingleItem(LPITEM item);
LPITEM CreateItem(DWORD vnum, DWORD count = 1, DWORD dwID = 0, bool bTryMagic = false, int iRarePct = -1, bool bSkipSave = false); LPITEM CreateItem(DWORD vnum, DWORD count = 1, DWORD dwID = 0, bool bTryMagic = false, int iRarePct = -1, bool bSkipSave = false);
@ -374,7 +374,7 @@ class ITEM_MANAGER : public singleton<ITEM_MANAGER>
#else #else
void DestroyItem(LPITEM item, const char* file, size_t line); void DestroyItem(LPITEM item, const char* file, size_t line);
#endif #endif
void RemoveItem(LPITEM item, const char * c_pszReason=NULL); // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڷ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> void RemoveItem(LPITEM item, const char * c_pszReason=NULL); // 사용자로 부터 아이템을 제거
LPITEM Find(DWORD id); LPITEM Find(DWORD id);
LPITEM FindByVID(DWORD vid); LPITEM FindByVID(DWORD vid);
@ -397,7 +397,7 @@ class ITEM_MANAGER : public singleton<ITEM_MANAGER>
DWORD GetRefineFromVnum(DWORD dwVnum); DWORD GetRefineFromVnum(DWORD dwVnum);
static void CopyAllAttrTo(LPITEM pkOldItem, LPITEM pkNewItem); // pkNewItem<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ӽ<EFBFBD><D3BC><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20>Լ<EFBFBD>. static void CopyAllAttrTo(LPITEM pkOldItem, LPITEM pkNewItem); // pkNewItem으로 모든 속성과 소켓 값들을 목사하는 함수.
const CSpecialItemGroup* GetSpecialItemGroup(DWORD dwVnum); const CSpecialItemGroup* GetSpecialItemGroup(DWORD dwVnum);
@ -421,8 +421,8 @@ class ITEM_MANAGER : public singleton<ITEM_MANAGER>
std::map<DWORD, DWORD> m_map_ItemRefineFrom; std::map<DWORD, DWORD> m_map_ItemRefineFrom;
int m_iTopOfTable; int m_iTopOfTable;
ITEM_VID_MAP m_VIDMap; ///< m_dwVIDCount <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>. ITEM_VID_MAP m_VIDMap; ///< m_dwVIDCount 의 값단위로 아이템을 저장한다.
DWORD m_dwVIDCount; ///< <EFBFBD>̳༮ VID<EFBFBD><EFBFBD> <20>ƴ϶<C6B4> <20>׳<EFBFBD> <20><><EFBFBD>μ<EFBFBD><CEBC><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ũ <20><>ȣ<EFBFBD><C8A3>. DWORD m_dwVIDCount; ///< 이녀석 VID가 아니라 그냥 프로세스 단위 유니크 번호다.
DWORD m_dwCurrentID; DWORD m_dwCurrentID;
TItemIDRangeTable m_ItemIDRange; TItemIDRangeTable m_ItemIDRange;
TItemIDRangeTable m_ItemIDSpareRange; TItemIDRangeTable m_ItemIDSpareRange;
@ -443,15 +443,15 @@ class ITEM_MANAGER : public singleton<ITEM_MANAGER>
// END_OF_CHECK_UNIQUE_GROUP // END_OF_CHECK_UNIQUE_GROUP
private: private:
// <EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ij<><C4B3> <20><><EFBFBD><EFBFBD><EFBFBD>۰<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><>ȯ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ij<><C4B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ٰ<EFBFBD> <20>Ͽ<EFBFBD>, // 독일에서 기존 캐시 아이템과 같지만, 교환 가능한 캐시 아이템을 만든다고 하여,
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ۿ<EFBFBD> <20><>ȯ <20><><EFBFBD><EFBFBD> <20>÷<EFBFBD><C3B7>׸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ο<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>۵<EFBFBD><DBB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, // 오리지널 아이템에 교환 금지 플래그만 삭제한 새로운 아이템들을 만들어,
// <EFBFBD><EFBFBD><EFBFBD>ο<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><EBBFAA> <20>Ҵ<EFBFBD><D2B4>Ͽ<EFBFBD><CFBF><EFBFBD>. // 새로운 아이템 대역을 할당하였다.
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ο<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>۵<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>۰<EFBFBD> <20><><EFBFBD><EFBFBD> ȿ<><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴµ<CFB4>, // 문제는 새로운 아이템도 오리지널 아이템과 같은 효과를 내야하는데,
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, Ŭ<><C5AC><EFBFBD><EFBFBD>, vnum <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ǿ<EFBFBD><C7BE>־<EFBFBD> // 서버건, 클라건, vnum 기반으로 되어있어
// <EFBFBD><EFBFBD><EFBFBD>ο<EFBFBD> vnum<75><6D> <20>˴<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20>ھƾ<DABE><C6BE>ϴ<EFBFBD> <20><>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD> <20><>Ȳ<EFBFBD><C8B2> <20>´<EFBFBD><C2B4>Ҵ<EFBFBD>. // 새로운 vnum을 죄다 서버에 새로 다 박아야하는 안타까운 상황에 맞닿았다.
// <EFBFBD>׷<EFBFBD><EFBFBD><EFBFBD> <20><> vnum<75><6D> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD≯<EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ư<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> vnum<75><6D><EFBFBD><EFBFBD> <20>ٲ㼭 <20><><EFBFBD><EFBFBD> <20>ϰ<EFBFBD>, // 그래서 새 vnum의 아이템이면, 서버에서 돌아갈 때는 오리지널 아이템 vnum으로 바꿔서 돌고 하고,
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> vnum<75><6D><EFBFBD><EFBFBD> <20>ٲ<EFBFBD><D9B2>ֵ<EFBFBD><D6B5><EFBFBD> <20>Ѵ<EFBFBD>. // 저장할 때에 본래 vnum으로 바꿔주도록 한다.
// <EFBFBD≯<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> vnum<75><6D> <20><><EFBFBD>ο<EFBFBD> vnum<75><6D> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. // 이를 위해 오리지널 vnum과 새로운 vnum을 연결시켜주는 맵을 만듦.
typedef std::map <DWORD, DWORD> TMapDW2DW; typedef std::map <DWORD, DWORD> TMapDW2DW;
TMapDW2DW m_map_new_to_ori; TMapDW2DW m_map_new_to_ori;

View File

@ -22,10 +22,10 @@ class MessengerManager : public singleton<MessengerManager>
void RequestToAdd(LPCHARACTER ch, LPCHARACTER target); void RequestToAdd(LPCHARACTER ch, LPCHARACTER target);
void AuthToAdd(keyA account, keyA companion, bool bDeny); void AuthToAdd(keyA account, keyA companion, bool bDeny);
void __AddToList(keyA account, keyA companion); // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> m_Relation, m_InverseRelation <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20>޼ҵ<DEBC> void __AddToList(keyA account, keyA companion); // 실제 m_Relation, m_InverseRelation 수정하는 메소드
void AddToList(keyA account, keyA companion); void AddToList(keyA account, keyA companion);
void __RemoveFromList(keyA account, keyA companion); // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> m_Relation, m_InverseRelation <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20>޼ҵ<DEBC> void __RemoveFromList(keyA account, keyA companion); // 실제 m_Relation, m_InverseRelation 수정하는 메소드
void RemoveFromList(keyA account, keyA companion); void RemoveFromList(keyA account, keyA companion);
void RemoveAllList(keyA account); void RemoveAllList(keyA account);

View File

@ -3,8 +3,8 @@
typedef struct SMobSplashAttackInfo typedef struct SMobSplashAttackInfo
{ {
DWORD dwTiming; // <EFBFBD><EFBFBD>ų <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ٸ<EFBFBD><D9B8><EFBFBD> <20>ð<EFBFBD> (ms) DWORD dwTiming; // 스킬 사용 후 실제로 데미지 먹힐때까지 기다리는 시간 (ms)
DWORD dwHitDistance; // <EFBFBD><EFBFBD>ų <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ǵ<EFBFBD> <20>Ÿ<EFBFBD> (<28><><EFBFBD><EFBFBD> <20><>cm) DWORD dwHitDistance; // 스킬 사용시 실제로 스킬 계산이 되는 거리 (전방 몇cm)
SMobSplashAttackInfo(DWORD dwTiming, DWORD dwHitDistance) SMobSplashAttackInfo(DWORD dwTiming, DWORD dwHitDistance)
: dwTiming(dwTiming) : dwTiming(dwTiming)
@ -37,8 +37,8 @@ class CMobInstance
public: public:
CMobInstance(); CMobInstance();
PIXEL_POSITION m_posLastAttacked; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ġ PIXEL_POSITION m_posLastAttacked; // 마지막 맞은 위치
DWORD m_dwLastAttackedTime; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD> DWORD m_dwLastAttackedTime; // 마지막 맞은 시간
DWORD m_dwLastWarpTime; DWORD m_dwLastWarpTime;
bool m_IsBerserk; bool m_IsBerserk;

View File

@ -49,11 +49,11 @@ class CMonarch : public singleton<CMonarch>
private: private:
TMonarchInfo m_MonarchInfo; TMonarchInfo m_MonarchInfo;
int m_PowerUp[4]; ///< <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> int m_PowerUp[4]; ///< 군주의 사자후
int m_DefenseUp[4]; ///< <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ݰ<EFBFBD><DDB0><EFBFBD> int m_DefenseUp[4]; ///< 군주의 금강권
int m_PowerUpCT[4]; ///< <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> int m_PowerUpCT[4]; ///< 군주의 사자후
int m_DefenseUpCT[4]; ///< <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ݰ<EFBFBD><DDB0><EFBFBD> int m_DefenseUpCT[4]; ///< 군주의 금강권
}; };
bool IsMonarchWarpZone (int map_idx); bool IsMonarchWarpZone (int map_idx);

View File

@ -18,40 +18,40 @@ enum EMotionMode
enum EPublicMotion enum EPublicMotion
{ {
MOTION_NONE, // 0 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> MOTION_NONE, // 0 없음
MOTION_WAIT, // 1 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> (00.msa) MOTION_WAIT, // 1 대기 (00.msa)
MOTION_WALK, // 2 <EFBFBD>ȱ<EFBFBD> (02.msa) MOTION_WALK, // 2 걷기 (02.msa)
MOTION_RUN, // 3 <EFBFBD>ٱ<EFBFBD> (03.msa) MOTION_RUN, // 3 뛰기 (03.msa)
MOTION_CHANGE_WEAPON, // 4 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٲٱ<EFBFBD> MOTION_CHANGE_WEAPON, // 4 무기바꾸기
MOTION_DAMAGE, // 5 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>±<EFBFBD> (30.msa) MOTION_DAMAGE, // 5 정면맞기 (30.msa)
MOTION_DAMAGE_FLYING, // 6 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ư<EFBFBD><EFBFBD><EFBFBD> (32.msa) MOTION_DAMAGE_FLYING, // 6 정면날아가기 (32.msa)
MOTION_STAND_UP, // 7 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ͼ<EFBFBD><EFBFBD> (33.msa) MOTION_STAND_UP, // 7 정면일어나기 (33.msa)
MOTION_DAMAGE_BACK, // 8 <EFBFBD>ĸ<EFBFBD><EFBFBD>±<EFBFBD> (34.msa) MOTION_DAMAGE_BACK, // 8 후면맞기 (34.msa)
MOTION_DAMAGE_FLYING_BACK, // 9 <EFBFBD>ĸ鳯<EFBFBD>ư<EFBFBD><EFBFBD><EFBFBD> (35.msa) MOTION_DAMAGE_FLYING_BACK, // 9 후면날아가기 (35.msa)
MOTION_STAND_UP_BACK, // 10 <EFBFBD>ĸ<EFBFBD><EFBFBD>Ͼ<EFBFBD><EFBFBD> (26.msa) MOTION_STAND_UP_BACK, // 10 후면일어나기 (26.msa)
MOTION_DEAD, // 11 <EFBFBD>ױ<EFBFBD> (31.msa) MOTION_DEAD, // 11 죽기 (31.msa)
MOTION_DEAD_BACK, // 12 <EFBFBD>ĸ<EFBFBD><EFBFBD>ױ<EFBFBD> (37.msa) MOTION_DEAD_BACK, // 12 후면죽기 (37.msa)
MOTION_NORMAL_ATTACK, // 13 <EFBFBD><20><><EFBFBD><EFBFBD> MOTION_NORMAL_ATTACK, // 13 기본 공격
MOTION_COMBO_ATTACK_1, // 14 <EFBFBD>޺<EFBFBD> <20><><EFBFBD><EFBFBD> MOTION_COMBO_ATTACK_1, // 14 콤보 공격
MOTION_COMBO_ATTACK_2, // 15 <EFBFBD>޺<EFBFBD> <20><><EFBFBD><EFBFBD> MOTION_COMBO_ATTACK_2, // 15 콤보 공격
MOTION_COMBO_ATTACK_3, // 16 <EFBFBD>޺<EFBFBD> <20><><EFBFBD><EFBFBD> MOTION_COMBO_ATTACK_3, // 16 콤보 공격
MOTION_COMBO_ATTACK_4, // 17 <EFBFBD>޺<EFBFBD> <20><><EFBFBD><EFBFBD> MOTION_COMBO_ATTACK_4, // 17 콤보 공격
MOTION_COMBO_ATTACK_5, // 18 <EFBFBD>޺<EFBFBD> <20><><EFBFBD><EFBFBD> MOTION_COMBO_ATTACK_5, // 18 콤보 공격
MOTION_COMBO_ATTACK_6, // 19 <EFBFBD>޺<EFBFBD> <20><><EFBFBD><EFBFBD> MOTION_COMBO_ATTACK_6, // 19 콤보 공격
MOTION_COMBO_ATTACK_7, // 20 <EFBFBD>޺<EFBFBD> <20><><EFBFBD><EFBFBD> MOTION_COMBO_ATTACK_7, // 20 콤보 공격
MOTION_COMBO_ATTACK_8, // 21 <EFBFBD>޺<EFBFBD> <20><><EFBFBD><EFBFBD> MOTION_COMBO_ATTACK_8, // 21 콤보 공격
MOTION_INTRO_WAIT, // 22 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȭ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> MOTION_INTRO_WAIT, // 22 선택화면 대기
MOTION_INTRO_SELECTED, // 23 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȭ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> MOTION_INTRO_SELECTED, // 23 선택화면 선택
MOTION_INTRO_NOT_SELECTED, // 24 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȭ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> MOTION_INTRO_NOT_SELECTED, // 24 선택화면 비선택
MOTION_SPAWN, // 25 <EFBFBD><EFBFBD>ȯ MOTION_SPAWN, // 25 소환
MOTION_FISHING_THROW, // 26 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> MOTION_FISHING_THROW, // 26 낚시 던지기
MOTION_FISHING_WAIT, // 27 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> MOTION_FISHING_WAIT, // 27 낚시 대기
MOTION_FISHING_STOP, // 28 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>׸<EFBFBD><D7B8>α<EFBFBD> MOTION_FISHING_STOP, // 28 낚시 그만두기
MOTION_FISHING_REACT, // 29 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> MOTION_FISHING_REACT, // 29 낚시 반응
MOTION_FISHING_CATCH, // 30 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> MOTION_FISHING_CATCH, // 30 낚시 잡기
MOTION_FISHING_FAIL, // 31 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> MOTION_FISHING_FAIL, // 31 낚시 실패
MOTION_STOP, // 32 <EFBFBD><EFBFBD> <20><><EFBFBD>߱<EFBFBD> MOTION_STOP, // 32 말 멈추기
MOTION_SPECIAL_1, // 33 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų MOTION_SPECIAL_1, // 33 몬스터 스킬
MOTION_SPECIAL_2, // 34 MOTION_SPECIAL_2, // 34
MOTION_SPECIAL_3, // 35 MOTION_SPECIAL_3, // 35
MOTION_SPECIAL_4, // 36 MOTION_SPECIAL_4, // 36

View File

@ -24,19 +24,19 @@ class P2P_MANAGER : public singleton<P2P_MANAGER>
P2P_MANAGER(); P2P_MANAGER();
~P2P_MANAGER(); ~P2P_MANAGER();
// <EFBFBD>Ʒ<EFBFBD> Register* Unregister* pair<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ƾ<EFBFBD><C6BE> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>. // 아래 Register* Unregister* pair들은 내부적으로 사실 같은 루틴을 사용한다.
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ǥ<><C7A5><EFBFBD>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><> // 단지 명시적으로 표시하기 위한 것
void RegisterAcceptor(LPDESC d); void RegisterAcceptor(LPDESC d);
void UnregisterAcceptor(LPDESC d); void UnregisterAcceptor(LPDESC d);
void RegisterConnector(LPDESC d); void RegisterConnector(LPDESC d);
void UnregisterConnector(LPDESC d); void UnregisterConnector(LPDESC d);
void EraseUserByDesc(LPDESC d); // <EFBFBD>ش<EFBFBD> desc<EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. void EraseUserByDesc(LPDESC d); // 해당 desc에 있는 유저들을 지운다.
void FlushOutput(); void FlushOutput();
void Boot(LPDESC d); // p2p ó<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʿ<EFBFBD><CABF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>. (<28><> ij<><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>α<EFBFBD><CEB1><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>) void Boot(LPDESC d); // p2p 처리에 필요한 정보를 보내준다. (전 캐릭터의 로그인 정보 등)
void Send(const void * c_pvData, int iSize, LPDESC except = NULL); void Send(const void * c_pvData, int iSize, LPDESC except = NULL);

View File

@ -45,14 +45,14 @@ enum
HEADER_CG_ITEM_USE_TO_ITEM = 60, HEADER_CG_ITEM_USE_TO_ITEM = 60,
HEADER_CG_TARGET = 61, HEADER_CG_TARGET = 61,
HEADER_CG_TEXT = 64, // @ <EFBFBD><EFBFBD> <20><><EFBFBD>۵Ǹ<DBB5> <20>ؽ<EFBFBD>Ʈ<EFBFBD><C6AE> <20>Ľ<EFBFBD><C4BD>Ѵ<EFBFBD>. HEADER_CG_TEXT = 64, // @ 로 시작되면 텍스트를 파싱한다.
HEADER_CG_WARP = 65, HEADER_CG_WARP = 65,
HEADER_CG_SCRIPT_BUTTON = 66, HEADER_CG_SCRIPT_BUTTON = 66,
HEADER_CG_MESSENGER = 67, HEADER_CG_MESSENGER = 67,
HEADER_CG_MALL_CHECKOUT = 69, HEADER_CG_MALL_CHECKOUT = 69,
HEADER_CG_SAFEBOX_CHECKIN = 70, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> â<><C3A2><EFBFBD><EFBFBD> <20><>??<3F>´<EFBFBD>. HEADER_CG_SAFEBOX_CHECKIN = 70, // 아이템을 창고에 넣??는다.
HEADER_CG_SAFEBOX_CHECKOUT = 71, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> â<><C3A2><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>´<EFBFBD>. HEADER_CG_SAFEBOX_CHECKOUT = 71, // 아이템을 창고로 부터 빼온다.
HEADER_CG_PARTY_INVITE = 72, HEADER_CG_PARTY_INVITE = 72,
HEADER_CG_PARTY_INVITE_ANSWER = 73, HEADER_CG_PARTY_INVITE_ANSWER = 73,
@ -93,10 +93,10 @@ enum
// HEADER_CG_ROULETTE = 200, // HEADER_CG_ROULETTE = 200,
// HEADER_CG_RUNUP_MATRIX_ANSWER = 201, // HEADER_CG_RUNUP_MATRIX_ANSWER = 201,
//NOTE : <EFBFBD>̷<EFBFBD> <20><>XXX <20><><EFBFBD><EFBFBD> <20>̰<EFBFBD> Packet<65><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. <20>̷<EFBFBD><CCB7><EFBFBD> <20>ڵ<EFBFBD><DAB5>ϰ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ѿ<D1BE><EEB0A1>. //NOTE : 이런 개XXX 정말 이거 Packet설계한 사람은 누구냐. 이렇게 코딩하고 밥이 넘어가나.
//enum<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϴ<EFBFBD><CFB4><EFBFBD>. <20>ƴ<EFBFBD> namepsace<63><65> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϴ<EFBFBD><CFB4><EFBFBD>.. //enum을 별도로 구별을 하던가. 아님 namepsace로 구별을 하던가..
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD> packet generator<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٶ<EFBFBD><D9B6><EFBFBD><EFBFBD><EFBFBD> <20>ʴ´<CAB4>. <20>̷<EFBFBD> <20><>XX //정말 packet generator까지는 바라지도 않는다. 이런 씨XX
//<EFBFBD>̷<EFBFBD><EFBFBD>ٰ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD> å<><C3A5><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD>??? //이러다가 숫자 겹치면 누가 책임지는데???
HEADER_CG_DRAGON_SOUL_REFINE = 205, HEADER_CG_DRAGON_SOUL_REFINE = 205,
HEADER_CG_STATE_CHECKER = 206, HEADER_CG_STATE_CHECKER = 206,
@ -286,7 +286,7 @@ enum
HEADER_GG_NOTICE = 4, HEADER_GG_NOTICE = 4,
HEADER_GG_SHUTDOWN = 5, HEADER_GG_SHUTDOWN = 5,
HEADER_GG_GUILD = 6, HEADER_GG_GUILD = 6,
HEADER_GG_DISCONNECT = 7, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> HEADER_GG_DISCONNECT = 7, // 누군가의 접속을 강제로 끊을 때
HEADER_GG_SHOUT = 8, HEADER_GG_SHOUT = 8,
HEADER_GG_SETUP = 9, HEADER_GG_SETUP = 9,
HEADER_GG_MESSENGER_ADD = 10, HEADER_GG_MESSENGER_ADD = 10,
@ -454,8 +454,8 @@ typedef struct SPacketGGMessengerMobile
typedef struct SPacketGGFindPosition typedef struct SPacketGGFindPosition
{ {
BYTE header; BYTE header;
DWORD dwFromPID; // <EFBFBD><EFBFBD> <20><>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD><EFBFBD>Ϸ<EFBFBD><CFB7><EFBFBD> <20><><EFBFBD><EFBFBD> DWORD dwFromPID; // 저 위치로 워프하려는 사람
DWORD dwTargetPID; // ã<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> DWORD dwTargetPID; // 찾는 사람
} TPacketGGFindPosition; } TPacketGGFindPosition;
typedef struct SPacketGGWarpCharacter typedef struct SPacketGGWarpCharacter
@ -496,14 +496,14 @@ typedef struct SPacketGGBlockChat
LONG lBlockDuration; LONG lBlockDuration;
} TPacketGGBlockChat; } TPacketGGBlockChat;
/* Ŭ<EFBFBD><EFBFBD><EFBFBD>̾<EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ŷ */ /* 클라이언트 측에서 보내는 패킷 */
typedef struct command_text typedef struct command_text
{ {
BYTE bHeader; BYTE bHeader;
} TPacketCGText; } TPacketCGText;
/* <EFBFBD>α<EFBFBD><EFBFBD><EFBFBD> (1) */ /* 로그인 (1) */
typedef struct command_handshake typedef struct command_handshake
{ {
BYTE bHeader; BYTE bHeader;
@ -587,7 +587,7 @@ typedef struct command_player_create_success
TSimplePlayer player; TSimplePlayer player;
} TPacketGCPlayerCreateSuccess; } TPacketGCPlayerCreateSuccess;
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> // 공격
typedef struct command_attack typedef struct command_attack
{ {
BYTE bHeader; BYTE bHeader;
@ -609,7 +609,7 @@ enum EMoveFuncType
FUNC_SKILL = 0x80, FUNC_SKILL = 0x80,
}; };
// <EFBFBD>̵<EFBFBD> // 이동
typedef struct command_move typedef struct command_move
{ {
BYTE bHeader; BYTE bHeader;
@ -628,22 +628,22 @@ typedef struct command_sync_position_element
LONG lY; LONG lY;
} TPacketCGSyncPositionElement; } TPacketCGSyncPositionElement;
// <EFBFBD><EFBFBD>ġ <20><><EFBFBD><EFBFBD>ȭ // 위치 동기화
typedef struct command_sync_position // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ŷ typedef struct command_sync_position // 가변 패킷
{ {
BYTE bHeader; BYTE bHeader;
WORD wSize; WORD wSize;
} TPacketCGSyncPosition; } TPacketCGSyncPosition;
/* ä<EFBFBD><EFBFBD> (3) */ /* 채팅 (3) */
typedef struct command_chat // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ŷ typedef struct command_chat // 가변 패킷
{ {
BYTE header; BYTE header;
WORD size; WORD size;
BYTE type; BYTE type;
} TPacketCGChat; } TPacketCGChat;
/* <EFBFBD>ӼӸ<EFBFBD> */ /* 귓속말 */
typedef struct command_whisper typedef struct command_whisper
{ {
BYTE bHeader; BYTE bHeader;
@ -803,7 +803,7 @@ typedef struct command_quest_confirm
} TPacketCGQuestConfirm; } TPacketCGQuestConfirm;
/* /*
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ŷ * 서버 측에서 보내는 패킷
*/ */
typedef struct packet_quest_confirm typedef struct packet_quest_confirm
{ {
@ -919,7 +919,7 @@ typedef struct packet_add_char
BYTE bAttackSpeed; BYTE bAttackSpeed;
BYTE bStateFlag; BYTE bStateFlag;
DWORD dwAffectFlag[2]; // ȿ<EFBFBD><EFBFBD> DWORD dwAffectFlag[2]; // 효과
} TPacketGCCharacterAdd; } TPacketGCCharacterAdd;
typedef struct packet_char_additional_info typedef struct packet_char_additional_info
@ -981,7 +981,7 @@ typedef struct packet_del_char
DWORD id; DWORD id;
} TPacketGCCharacterDelete; } TPacketGCCharacterDelete;
typedef struct packet_chat // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ŷ typedef struct packet_chat // 가변 패킷
{ {
BYTE header; BYTE header;
WORD size; WORD size;
@ -990,7 +990,7 @@ typedef struct packet_chat //
BYTE bEmpire; BYTE bEmpire;
} TPacketGCChat; } TPacketGCChat;
typedef struct packet_whisper // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ŷ typedef struct packet_whisper // 가변 패킷
{ {
BYTE bHeader; BYTE bHeader;
WORD wSize; WORD wSize;
@ -1214,7 +1214,7 @@ typedef struct packet_shop_start
struct packet_shop_item items[SHOP_HOST_ITEM_MAX_NUM]; struct packet_shop_item items[SHOP_HOST_ITEM_MAX_NUM];
} TPacketGCShopStart; } TPacketGCShopStart;
typedef struct packet_shop_start_ex // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> TSubPacketShopTab* shop_tabs <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. typedef struct packet_shop_start_ex // 다음에 TSubPacketShopTab* shop_tabs 이 따라옴.
{ {
typedef struct sub_packet_shop_tab typedef struct sub_packet_shop_tab
{ {
@ -1237,7 +1237,7 @@ typedef struct packet_shop_update_price
INT iPrice; INT iPrice;
} TPacketGCShopUpdatePrice; } TPacketGCShopUpdatePrice;
typedef struct packet_shop // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ŷ typedef struct packet_shop // 가변 패킷
{ {
BYTE header; BYTE header;
WORD size; WORD size;
@ -1317,7 +1317,7 @@ typedef struct packet_move
DWORD dwDuration; DWORD dwDuration;
} TPacketGCMove; } TPacketGCMove;
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // 소유권
typedef struct packet_ownership typedef struct packet_ownership
{ {
BYTE bHeader; BYTE bHeader;
@ -1325,7 +1325,7 @@ typedef struct packet_ownership
DWORD dwVictimVID; DWORD dwVictimVID;
} TPacketGCOwnership; } TPacketGCOwnership;
// <EFBFBD><EFBFBD>ġ <20><><EFBFBD><EFBFBD>ȭ <20><>Ŷ<EFBFBD><C5B6> bCount <20><>ŭ <20>ٴ<EFBFBD> <20><><EFBFBD><EFBFBD> // 위치 동기화 패킷의 bCount 만큼 붙는 단위
typedef struct packet_sync_position_element typedef struct packet_sync_position_element
{ {
DWORD dwVID; DWORD dwVID;
@ -1333,11 +1333,11 @@ typedef struct packet_sync_position_element
LONG lY; LONG lY;
} TPacketGCSyncPositionElement; } TPacketGCSyncPositionElement;
// <EFBFBD><EFBFBD>ġ <20><><EFBFBD><EFBFBD>ȭ // 위치 동기화
typedef struct packet_sync_position // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ŷ typedef struct packet_sync_position // 가변 패킷
{ {
BYTE bHeader; BYTE bHeader;
WORD wSize; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> = (wSize - sizeof(TPacketGCSyncPosition)) / sizeof(TPacketGCSyncPositionElement) WORD wSize; // 개수 = (wSize - sizeof(TPacketGCSyncPosition)) / sizeof(TPacketGCSyncPositionElement)
} TPacketGCSyncPosition; } TPacketGCSyncPosition;
typedef struct packet_fly typedef struct packet_fly
@ -1372,7 +1372,7 @@ typedef struct packet_shoot
typedef struct packet_duel_start typedef struct packet_duel_start
{ {
BYTE header; BYTE header;
WORD wSize; // DWORD<EFBFBD><EFBFBD> <20>? <20><><EFBFBD><EFBFBD> = (wSize - sizeof(TPacketGCPVPList)) / 4 WORD wSize; // DWORD가 몇개? 개수 = (wSize - sizeof(TPacketGCPVPList)) / 4
} TPacketGCDuelStart; } TPacketGCDuelStart;
enum EPVPModes enum EPVPModes
@ -1388,7 +1388,7 @@ typedef struct packet_pvp
BYTE bHeader; BYTE bHeader;
DWORD dwVIDSrc; DWORD dwVIDSrc;
DWORD dwVIDDst; DWORD dwVIDDst;
BYTE bMode; // 0 <EFBFBD≯<EFBFBD> <20><>, 1<≯<EFBFBD> <20><> BYTE bMode; // 0 이면 끔, 1이면 켬
} TPacketGCPVP; } TPacketGCPVP;
typedef struct command_use_skill typedef struct command_use_skill
@ -1785,7 +1785,7 @@ typedef struct packet_mark_idxlist
BYTE header; BYTE header;
DWORD bufSize; DWORD bufSize;
WORD count; WORD count;
//<EFBFBD>ڿ<EFBFBD> size * (WORD + WORD)<EFBFBD><EFBFBD>ŭ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> //뒤에 size * (WORD + WORD)만큼 데이터 붙음
} TPacketGCMarkIDXList; } TPacketGCMarkIDXList;
typedef struct packet_mark_block typedef struct packet_mark_block
@ -1794,7 +1794,7 @@ typedef struct packet_mark_block
DWORD bufSize; DWORD bufSize;
BYTE imgIdx; BYTE imgIdx;
DWORD count; DWORD count;
// <EFBFBD>ڿ<EFBFBD> 64 x 48 x <EFBFBD>ȼ<EFBFBD>ũ<EFBFBD><EFBFBD>(4<><34><EFBFBD><EFBFBD>Ʈ) = 12288<38><38>ŭ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> // 뒤에 64 x 48 x 픽셀크기(4바이트) = 12288만큼 데이터 붙음
} TPacketGCMarkBlock; } TPacketGCMarkBlock;
typedef struct command_symbol_upload typedef struct command_symbol_upload
@ -1933,8 +1933,8 @@ typedef struct SPacketGCRefineInformaion
DWORD src_vnum; DWORD src_vnum;
DWORD result_vnum; DWORD result_vnum;
BYTE material_count; BYTE material_count;
INT cost; // <EFBFBD>ҿ<EFBFBD> <20><><EFBFBD><EFBFBD> INT cost; // 소요 비용
INT prob; // Ȯ<EFBFBD><EFBFBD> INT prob; // 확률
TRefineMaterial materials[REFINE_MATERIAL_MAX_NUM]; TRefineMaterial materials[REFINE_MATERIAL_MAX_NUM];
} TPacketGCRefineInformation; } TPacketGCRefineInformation;
@ -2149,13 +2149,13 @@ typedef struct SPacketGCPanamaPack
BYTE abIV[32]; BYTE abIV[32];
} TPacketGCPanamaPack; } TPacketGCPanamaPack;
//TODO : <EFBFBD>ƿ<EFBFBD> ¯<><C2AF>..<2E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŷ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>޾Ƶ<DEBE><C6B5>ϼ<EFBFBD> <20>ְ<EFBFBD> <20><>Ŷ <20>ڵ鷯 Refactoring <EFBFBD><EFBFBD><EFBFBD><EFBFBD>. //TODO : 아우 짱나..가변패킷 사이즈 받아들일수 있게 패킷 핸들러 Refactoring 하자.
typedef struct SPacketGCHybridCryptKeys typedef struct SPacketGCHybridCryptKeys
{ {
SPacketGCHybridCryptKeys() : m_pStream(NULL) {} SPacketGCHybridCryptKeys() : m_pStream(NULL) {}
~SPacketGCHybridCryptKeys() ~SPacketGCHybridCryptKeys()
{ {
//GCC <EFBFBD><EFBFBD><EFBFBD><EFBFBD> NULL delete <EFBFBD>ص<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>? <20>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> NULL üũ <20><><EFBFBD><EFBFBD>. ( <20>ٵ<EFBFBD> <20>̰<EFBFBD> C++ ǥ<>ؾƴϾ<C6B4><CFBE><EFBFBD> --a ) //GCC 에선 NULL delete 해도 괜찮나? 일단 안전하게 NULL 체크 하자. ( 근데 이거 C++ 표준아니었나 --a )
if( m_pStream ) if( m_pStream )
{ {
delete[] m_pStream; delete[] m_pStream;
@ -2188,7 +2188,7 @@ typedef struct SPacketGCHybridCryptKeys
} }
BYTE bHeader; BYTE bHeader;
WORD uDynamicPacketSize; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ŭ<><C5AC> DynamicPacketHeader <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD> -_-; WORD uDynamicPacketSize; // 빌어먹을 클라 DynamicPacketHeader 구조때문에 맞춰줘야한다 -_-;
INT KeyStreamLen; INT KeyStreamLen;
BYTE* pDataKeyStream; BYTE* pDataKeyStream;
@ -2236,7 +2236,7 @@ typedef struct SPacketGCPackageSDB
} }
BYTE bHeader; BYTE bHeader;
WORD uDynamicPacketSize; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ŭ<><C5AC> DynamicPacketHeader <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD> -_-; WORD uDynamicPacketSize; // 빌어먹을 클라 DynamicPacketHeader 구조때문에 맞춰줘야한다 -_-;
INT iStreamLen; INT iStreamLen;
BYTE* m_pDataSDBStream; BYTE* m_pDataSDBStream;
@ -2254,7 +2254,7 @@ typedef struct SPacketGCSpecificEffect
char effect_file[MAX_EFFECT_FILE_NAME]; char effect_file[MAX_EFFECT_FILE_NAME];
} TPacketGCSpecificEffect; } TPacketGCSpecificEffect;
// <EFBFBD><EFBFBD>ȥ<EFBFBD><EFBFBD> // 용혼석
enum EDragonSoulRefineWindowRefineType enum EDragonSoulRefineWindowRefineType
{ {
DragonSoulRefineWindow_UPGRADE, DragonSoulRefineWindow_UPGRADE,

View File

@ -5,7 +5,7 @@
enum // unit : minute enum // unit : minute
{ {
PARTY_ENOUGH_MINUTE_FOR_EXP_BONUS = 60, // <EFBFBD><EFBFBD>Ƽ <20><20><> 60<36><30> <20><> <20><><EFBFBD><EFBFBD> <20>߰<EFBFBD> <20><><EFBFBD><EFBFBD>ġ <20><><EFBFBD>ʽ<EFBFBD> PARTY_ENOUGH_MINUTE_FOR_EXP_BONUS = 60, // 파티 결성 후 60분 후 부터 추가 경험치 보너스
PARTY_HEAL_COOLTIME_LONG = 60, PARTY_HEAL_COOLTIME_LONG = 60,
PARTY_HEAL_COOLTIME_SHORT = 30, PARTY_HEAL_COOLTIME_SHORT = 30,
PARTY_MAX_MEMBER = 8, PARTY_MAX_MEMBER = 8,
@ -69,12 +69,12 @@ class CPartyManager : public singleton<CPartyManager>
void P2PQuitParty(DWORD pid); void P2PQuitParty(DWORD pid);
private: private:
TPartyMap m_map_pkParty; // PID<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>Ƽ<EFBFBD><C6BC> <20>ֳ<EFBFBD> <20>˻<EFBFBD><CBBB>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̳<EFBFBD> TPartyMap m_map_pkParty; // PID로 어느 파티에 있나 검색하기 위한 컨테이너
TPartyMap m_map_pkMobParty; // Mob <EFBFBD><EFBFBD>Ƽ<EFBFBD><EFBFBD> PID <EFBFBD><EFBFBD><EFBFBD><EFBFBD> VID <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>. TPartyMap m_map_pkMobParty; // Mob 파티는 PID 대신 VID 로 따로 관리한다.
TPCPartySet m_set_pkPCParty; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ƽ <20><>ü <20><><EFBFBD><EFBFBD> TPCPartySet m_set_pkPCParty; // 사람들의 파티 전체 집합
bool m_bEnablePCParty; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ƽ <20><><EFBFBD>°<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ұ<EFBFBD> bool m_bEnablePCParty; // 디비가 켜져있지 않으면 사람들의 파티 상태가 변경불가
}; };
enum EPartyMessages enum EPartyMessages
@ -246,9 +246,9 @@ class CParty
TFlagMap m_map_iFlag; TFlagMap m_map_iFlag;
LPDUNGEON m_pkDungeon; LPDUNGEON m_pkDungeon;
// <EFBFBD>Ʊ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> dungeon <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. // 아귀 동굴용 dungeon 멤버 변수.
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̷<EFBFBD><CCB7>Ա<EFBFBD><D4B1><EFBFBD> <20>ϰ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʾҴµ<D2B4>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> party <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̶<EFBFBD> // 정말 이렇게까지 하고 싶진 않았는데, 던전에서 party 관리가 정말로 개판이라
// <EFBFBD>װ<EFBFBD> <20><>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̷<EFBFBD><CCB7><EFBFBD> <20>ӽ÷<D3BD> <20>س<EFBFBD><D8B3>´<EFBFBD>. // 그거 고치기 전까지는 이렇게 임시로 해놓는다.
LPDUNGEON m_pkDungeon_for_Only_party; LPDUNGEON m_pkDungeon_for_Only_party;
public: public:
void SetDungeon_for_Only_party(LPDUNGEON pDungeon); void SetDungeon_for_Only_party(LPDUNGEON pDungeon);

View File

@ -2,10 +2,10 @@
#define __PRIV_MANAGER_H #define __PRIV_MANAGER_H
/** /**
* @version 05/06/08 Bang2ni - Guild privilege <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Լ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD> <20>߰<EFBFBD> * @version 05/06/08 Bang2ni - Guild privilege 관련 함수 지속 시간 추가
* RequestGiveGuildPriv, GiveGuildPriv <EFBFBD>Լ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ÿ<EFBFBD><C5B8> <20><><EFBFBD><EFBFBD> * RequestGiveGuildPriv, GiveGuildPriv 함수 프로토타잎 수정
* m_aPrivGuild Ÿ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> * m_aPrivGuild 타잎 수정
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ü SPrivGuildData, <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Լ<EFBFBD> GetPrivByGuildEx <EFBFBD>߰<EFBFBD> * 구조체 SPrivGuildData, 멤버 함수 GetPrivByGuildEx 추가
*/ */
class CPrivManager : public singleton<CPrivManager> class CPrivManager : public singleton<CPrivManager>
{ {
@ -38,18 +38,18 @@ class CPrivManager : public singleton<CPrivManager>
SPrivEmpireData* GetPrivByEmpireEx(BYTE bEmpire, BYTE type); SPrivEmpireData* GetPrivByEmpireEx(BYTE bEmpire, BYTE type);
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ʽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> /// 길드 보너스 데이터
struct SPrivGuildData struct SPrivGuildData
{ {
int value; ///< <EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD> <20><>ġ int value; ///< 보너스 수치
time_t end_time_sec; ///< <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ð<EFBFBD> time_t end_time_sec; ///< 지속 시간
}; };
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ʽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>´<EFBFBD>. /// 길드 보너스 데이터를 얻어온다.
/** /**
* @param [in] dwGuildID <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ID * @param [in] dwGuildID 얻어올 길드의 ID
* @param [in] byType <EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD> Ÿ<><C5B8> * @param [in] byType 보너스 타잎
* @return <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ʽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20>ش<EFBFBD><D8B4>ϴ<EFBFBD> <20><><EFBFBD>ʽ<EFBFBD> Ÿ<>ٰ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ID <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ʽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> NULL * @return 대상 길드의 길드 보너스 데이터의 포인터, 해당하는 보너스 타잎과 길드의 ID 에 대해 보너스 데이터가 없을 경우 NULL
*/ */
const SPrivGuildData* GetPrivByGuildEx( DWORD dwGuildID, BYTE byType ) const; const SPrivGuildData* GetPrivByGuildEx( DWORD dwGuildID, BYTE byType ) const;

View File

@ -3,8 +3,8 @@
class CHARACTER; class CHARACTER;
// CPVP<EFBFBD><EFBFBD><EFBFBD><EFBFBD> DWORD <EFBFBD><EFBFBD><EFBFBD>̵<EFBFBD> <20>ΰ<EFBFBD><CEB0><EFBFBD> <20>޾Ƽ<DEBE> m_dwCRC<52><43> <20><><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ´<D6B4>. // CPVP에는 DWORD 아이디 두개를 받아서 m_dwCRC를 만들어서 가지고 있는다.
// CPVPManager<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̷<EFBFBD><CCB7><EFBFBD> <20><><EFBFBD><EFBFBD> CRC<52><43> <20><><EFBFBD><EFBFBD> <20>˻<EFBFBD><CBBB>Ѵ<EFBFBD>. // CPVPManager에서 이렇게 만든 CRC를 통해 검색한다.
class CPVP class CPVP
{ {
public: public:
@ -26,8 +26,8 @@ class CPVP
CPVP(CPVP & v); CPVP(CPVP & v);
~CPVP(); ~CPVP();
void Win(DWORD dwPID); // dwPID<EFBFBD><EFBFBD> <20>̰<EFBFBD><CCB0><EFBFBD>! void Win(DWORD dwPID); // dwPID가 이겼다!
bool CanRevenge(DWORD dwPID); // dwPID<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>־<EFBFBD>? bool CanRevenge(DWORD dwPID); // dwPID가 복수할 수 있어?
bool IsFight(); bool IsFight();
bool Agree(DWORD dwPID); bool Agree(DWORD dwPID);
@ -57,7 +57,7 @@ class CPVPManager : public singleton<CPVPManager>
void Insert(LPCHARACTER pkChr, LPCHARACTER pkVictim); void Insert(LPCHARACTER pkChr, LPCHARACTER pkVictim);
bool CanAttack(LPCHARACTER pkChr, LPCHARACTER pkVictim); bool CanAttack(LPCHARACTER pkChr, LPCHARACTER pkVictim);
bool Dead(LPCHARACTER pkChr, DWORD dwKillerPID); // PVP<EFBFBD><EFBFBD> <20>־<EFBFBD><D6BE><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> bool Dead(LPCHARACTER pkChr, DWORD dwKillerPID); // PVP에 있었나 없었나를 리턴
void GiveUp(LPCHARACTER pkChr, DWORD dwKillerPID); void GiveUp(LPCHARACTER pkChr, DWORD dwKillerPID);
void Connect(LPCHARACTER pkChr); void Connect(LPCHARACTER pkChr);
void Disconnect(LPCHARACTER pkChr); void Disconnect(LPCHARACTER pkChr);

View File

@ -56,7 +56,7 @@ namespace quest
bool RunState(QuestState& qs); bool RunState(QuestState& qs);
PC * GetPC(unsigned int pc); PC * GetPC(unsigned int pc);
PC * GetPCForce(unsigned int pc); // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> PC<50><43> <20>ٲ<EFBFBD><D9B2><EFBFBD> <20>ʰ<EFBFBD> PC <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>´<EFBFBD>. PC * GetPCForce(unsigned int pc); // 현재 PC를 바꾸지 않고 PC 포인터를 가져온다.
unsigned int GetCurrentNPCRace(); unsigned int GetCurrentNPCRace();
const string & GetCurrentQuestName(); const string & GetCurrentQuestName();
@ -106,7 +106,7 @@ namespace quest
void Letter(DWORD pc); void Letter(DWORD pc);
void Letter(DWORD pc, DWORD quest_index, int state); void Letter(DWORD pc, DWORD quest_index, int state);
void ItemInformer(unsigned int pc, unsigned int vnum); //<EFBFBD><EFBFBD><EFBFBD>ϼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> void ItemInformer(unsigned int pc, unsigned int vnum); //독일선물기능
// //
@ -254,7 +254,7 @@ namespace quest
static bool ExecuteQuestScript(PC& pc, DWORD quest_index, const int state, const char* code, const int code_size, vector<AArgScript*>* pChatScripts = NULL, bool bUseCache = true); static bool ExecuteQuestScript(PC& pc, DWORD quest_index, const int state, const char* code, const int code_size, vector<AArgScript*>* pChatScripts = NULL, bool bUseCache = true);
// begin_other_pc_blcok, end_other_pc_block<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ü<EFBFBD><C3BC>. // begin_other_pc_blcok, end_other_pc_block을 위한 객체들.
public: public:
void BeginOtherPCBlock(DWORD pid); void BeginOtherPCBlock(DWORD pid);
void EndOtherPCBlock(); void EndOtherPCBlock();

View File

@ -21,13 +21,13 @@ namespace quest
class NPC class NPC
{ {
public: public:
// <EFBFBD><EFBFBD><EFBFBD>ڰ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ũ<EFBFBD><C5A9>Ʈ<EFBFBD><C6AE> // 인자가 없는 스크립트들
// first: state number // first: state number
typedef map<int, AStateScriptType> AQuestScriptType; typedef map<int, AStateScriptType> AQuestScriptType;
// first: quest number // first: quest number
typedef map<unsigned int, AQuestScriptType> QuestMapType; typedef map<unsigned int, AQuestScriptType> QuestMapType;
// <EFBFBD><EFBFBD><EFBFBD>ڰ<EFBFBD> <20>ִ<EFBFBD> <20><>ũ<EFBFBD><C5A9>Ʈ<EFBFBD><C6AE> // 인자가 있는 스크립트들
// first: state number // first: state number
typedef map<int, vector<AArgScript> > AArgQuestScriptType; typedef map<int, vector<AArgScript> > AArgQuestScriptType;
// first: quest number // first: quest number
@ -69,7 +69,7 @@ namespace quest
bool OnChat(PC& pc); bool OnChat(PC& pc);
bool HasChat(); bool HasChat();
bool OnItemInformer(PC& pc,unsigned int vnum); // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>׽<EFBFBD>Ʈ bool OnItemInformer(PC& pc,unsigned int vnum); // 독일 선물 기능 테스트
bool OnTarget(PC& pc, DWORD dwQuestIndex, const char * c_pszTargetName, const char * c_pszVerb, bool & bRet); bool OnTarget(PC& pc, DWORD dwQuestIndex, const char * c_pszTargetName, const char * c_pszVerb, bool & bRet);
bool OnUnmount(PC& pc); bool OnUnmount(PC& pc);

View File

@ -35,12 +35,12 @@ namespace quest
enum enum
{ {
QUEST_SEND_ISBEGIN = (1 << 0), QUEST_SEND_ISBEGIN = (1 << 0),
QUEST_SEND_TITLE = (1 << 1), // 30<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> QUEST_SEND_TITLE = (1 << 1), // 30자 까지
QUEST_SEND_CLOCK_NAME = (1 << 2), // 16<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> QUEST_SEND_CLOCK_NAME = (1 << 2), // 16자 까지
QUEST_SEND_CLOCK_VALUE = (1 << 3), QUEST_SEND_CLOCK_VALUE = (1 << 3),
QUEST_SEND_COUNTER_NAME = (1 << 4), // 16<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> QUEST_SEND_COUNTER_NAME = (1 << 4), // 16자 까지
QUEST_SEND_COUNTER_VALUE = (1 << 5), QUEST_SEND_COUNTER_VALUE = (1 << 5),
QUEST_SEND_ICON_FILE = (1 << 6), // 24<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> QUEST_SEND_ICON_FILE = (1 << 6), // 24자 까지
}; };
typedef map<unsigned int, QuestState> QuestInfo; typedef map<unsigned int, QuestState> QuestInfo;
@ -122,7 +122,7 @@ namespace quest
bool IsLoaded() const { return m_bLoaded; } bool IsLoaded() const { return m_bLoaded; }
void SetLoaded() { m_bLoaded = true; } void SetLoaded() { m_bLoaded = true; }
void Build(); void Build();
// DB<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> // DB에 저장
void Save(); void Save();
bool HasReward() { return !m_vRewardData.empty() || m_bIsGivenReward; } bool HasReward() { return !m_vRewardData.empty() || m_bIsGivenReward; }
@ -176,7 +176,7 @@ namespace quest
TTimerMap m_TimerMap; TTimerMap m_TimerMap;
int m_iSendToClient; int m_iSendToClient;
bool m_bLoaded; // <EFBFBD>ε<EFBFBD><EFBFBD><EFBFBD> <20>ѹ<EFBFBD><D1B9><EFBFBD> <20>Ѵ<EFBFBD>. bool m_bLoaded; // 로드는 한번만 한다.
int m_iLastState; int m_iLastState;

View File

@ -5,8 +5,8 @@
enum enum
{ {
BLACKSMITH_MOB = 20016, // Ȯ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> BLACKSMITH_MOB = 20016, // 확률 개량
ALCHEMIST_MOB = 20001, // 100% <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ALCHEMIST_MOB = 20001, // 100% 개량 성공
BLACKSMITH_WEAPON_MOB = 20044, BLACKSMITH_WEAPON_MOB = 20044,
BLACKSMITH_ARMOR_MOB = 20045, BLACKSMITH_ARMOR_MOB = 20045,

View File

@ -132,7 +132,7 @@ class SECTREE
while (it_tree != m_neighbor_list.end()) while (it_tree != m_neighbor_list.end())
{ {
//ù<EFBFBD><EFBFBD>°<EFBFBD><EFBFBD> ã<><C3A3><EFBFBD><EFBFBD> <20>ٷ<EFBFBD> <20><><EFBFBD><EFBFBD> //첫번째를 찾으면 바로 리턴
if ( (*(it_tree++))->for_each_entity_for_find_victim(func) ) if ( (*(it_tree++))->for_each_entity_for_find_victim(func) )
return; return;
} }
@ -143,7 +143,7 @@ class SECTREE
while (it != m_set_entity.end()) while (it != m_set_entity.end())
{ {
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ã<><C3A3><EFBFBD><EFBFBD> <20>ٷ<EFBFBD> <20><><EFBFBD><EFBFBD> //정상적으로 찾으면 바로 리턴
if ( func(*it++) ) if ( func(*it++) )
return true; return true;
} }
@ -176,9 +176,9 @@ class SECTREE
DWORD GetAttribute(int x, int y); DWORD GetAttribute(int x, int y);
bool IsAttr(int x, int y, DWORD dwFlag); bool IsAttr(int x, int y, DWORD dwFlag);
void CloneAttribute(LPSECTREE tree); // private map ó<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> void CloneAttribute(LPSECTREE tree); // private map 처리시 사용
int GetEventAttribute(int x, int y); // 20050313 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> int GetEventAttribute(int x, int y); // 20050313 현재는 사용하지 않음
void SetAttribute(DWORD x, DWORD y, DWORD dwAttr); void SetAttribute(DWORD x, DWORD y, DWORD dwAttr);
void RemoveAttribute(DWORD x, DWORD y, DWORD dwAttr); void RemoveAttribute(DWORD x, DWORD y, DWORD dwAttr);

View File

@ -165,16 +165,16 @@ class SECTREE_MANAGER : public singleton<SECTREE_MANAGER>
size_t GetMonsterCountInMap(int lMapIndex); size_t GetMonsterCountInMap(int lMapIndex);
size_t GetMonsterCountInMap(int lMpaIndex, DWORD dwVnum); size_t GetMonsterCountInMap(int lMpaIndex, DWORD dwVnum);
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Sectree <EFBFBD><EFBFBD> Attribute <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Ư<><C6AF><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>. /// 영역에 대해 Sectree Attribute 에 대해 특정한 처리를 수행한다.
/** /**
* @param [in] lMapIndex <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Map index * @param [in] lMapIndex 적용할 Map index
* @param [in] lStartX <EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ǥ * @param [in] lStartX 사각형 영역의 가장 왼쪽 좌표
* @param [in] lStartY <EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ǥ * @param [in] lStartY 사각형 영역의 가장 위쪽 좌표
* @param [in] lEndX <EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ǥ * @param [in] lEndX 사각형 영역의 가장 오른쪽 좌표
* @param [in] lEndY <EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ʒ<EFBFBD><C6B7><EFBFBD> <20><>ǥ * @param [in] lEndY 사각형 영역의 가장 아랫쪽 좌표
* @param [in] lRotate <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ȸ<><C8B8><EFBFBD><EFBFBD> <20><> * @param [in] lRotate 영역에 대해 회전할 각
* @param [in] dwAttr <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Attribute * @param [in] dwAttr 적용할 Attribute
* @param [in] mode Attribute <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD> type * @param [in] mode Attribute 에 대해 처리할 type
*/ */
bool ForAttrRegion(int lMapIndex, int lStartX, int lStartY, int lEndX, int lEndY, int lRotate, DWORD dwAttr, EAttrRegionMode mode); bool ForAttrRegion(int lMapIndex, int lStartX, int lStartY, int lEndX, int lEndY, int lRotate, DWORD dwAttr, EAttrRegionMode mode);
@ -182,39 +182,39 @@ class SECTREE_MANAGER : public singleton<SECTREE_MANAGER>
private: private:
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><E7B0A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Sectree <EFBFBD><EFBFBD> Attribute <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Ư<><C6AF><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>. /// 직각의 사각형 영역에 대해 Sectree Attribute 에 대해 특정한 처리를 수행한다.
/** /**
* @param [in] lMapIndex <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Map index * @param [in] lMapIndex 적용할 Map index
* @param [in] lCX <EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Cell <20><> <20><>ǥ * @param [in] lCX 사각형 영역의 가장 왼쪽 Cell 의 좌표
* @param [in] lCY <EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Cell <20><> <20><>ǥ * @param [in] lCY 사각형 영역의 가장 위쪽 Cell 의 좌표
* @param [in] lCW <EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Cell <20><><EFBFBD><EFBFBD> <20><> * @param [in] lCW 사각형 영역의 Cell 단위 폭
* @param [in] lCH <EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Cell <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> * @param [in] lCH 사각형 영역의 Cell 단위 높이
* @param [in] lRotate ȸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>(<28><><EFBFBD><EFBFBD>) * @param [in] lRotate 회전할 각(직각)
* @param [in] dwAttr <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Attribute * @param [in] dwAttr 적용할 Attribute
* @param [in] mode Attribute <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD> type * @param [in] mode Attribute 에 대해 처리할 type
*/ */
bool ForAttrRegionRightAngle( int lMapIndex, int lCX, int lCY, int lCW, int lCH, int lRotate, DWORD dwAttr, EAttrRegionMode mode ); bool ForAttrRegionRightAngle( int lMapIndex, int lCX, int lCY, int lCW, int lCH, int lRotate, DWORD dwAttr, EAttrRegionMode mode );
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̿<EFBFBD><CCBF><EFBFBD> <20><EFBFBD><E7B0A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Sectree <EFBFBD><EFBFBD> Attribute <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Ư<><C6AF><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>. /// 직각 이외의 사각형 영역에 대해 Sectree Attribute 에 대해 특정한 처리를 수행한다.
/** /**
* @param [in] lMapIndex <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Map index * @param [in] lMapIndex 적용할 Map index
* @param [in] lCX <EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Cell <20><> <20><>ǥ * @param [in] lCX 사각형 영역의 가장 왼쪽 Cell 의 좌표
* @param [in] lCY <EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Cell <20><> <20><>ǥ * @param [in] lCY 사각형 영역의 가장 위쪽 Cell 의 좌표
* @param [in] lCW <EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Cell <20><><EFBFBD><EFBFBD> <20><> * @param [in] lCW 사각형 영역의 Cell 단위 폭
* @param [in] lCH <EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Cell <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> * @param [in] lCH 사각형 영역의 Cell 단위 높이
* @param [in] lRotate ȸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>(<28><><EFBFBD><EFBFBD> <20>̿<EFBFBD><CCBF><EFBFBD> <20><>) * @param [in] lRotate 회전할 각(직각 이외의 각)
* @param [in] dwAttr <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Attribute * @param [in] dwAttr 적용할 Attribute
* @param [in] mode Attribute <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD> type * @param [in] mode Attribute 에 대해 처리할 type
*/ */
bool ForAttrRegionFreeAngle( int lMapIndex, int lCX, int lCY, int lCW, int lCH, int lRotate, DWORD dwAttr, EAttrRegionMode mode ); bool ForAttrRegionFreeAngle( int lMapIndex, int lCX, int lCY, int lCW, int lCH, int lRotate, DWORD dwAttr, EAttrRegionMode mode );
/// <EFBFBD><EFBFBD> Cell <EFBFBD><EFBFBD> Attribute <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Ư<><C6AF><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>. /// Cell Attribute 에 대해 특정한 처리를 수행한다.
/** /**
* @param [in] lMapIndex <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Map index * @param [in] lMapIndex 적용할 Map index
* @param [in] lCX <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Cell <EFBFBD><EFBFBD> X <EFBFBD><EFBFBD>ǥ * @param [in] lCX 적용할 Cell X 좌표
* @param [in] lCY <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Cell <EFBFBD><EFBFBD> Y <EFBFBD><EFBFBD>ǥ * @param [in] lCY 적용할 Cell Y 좌표
* @param [in] dwAttr <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Attribute * @param [in] dwAttr 적용할 Attribute
* @param [in] mode Attribute <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD> type * @param [in] mode Attribute 에 대해 처리할 type
*/ */
bool ForAttrRegionCell( int lMapIndex, int lCX, int lCY, DWORD dwAttr, EAttrRegionMode mode ); bool ForAttrRegionCell( int lMapIndex, int lCX, int lCY, DWORD dwAttr, EAttrRegionMode mode );

View File

@ -14,12 +14,12 @@ class CShop
public: public:
typedef struct shop_item typedef struct shop_item
{ {
DWORD vnum; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȣ DWORD vnum; // 아이템 번호
int price; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> int price; // 가격
BYTE count; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> BYTE count; // 아이템 개수
LPITEM pkItem; LPITEM pkItem;
int itemid; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̵<EFBFBD> int itemid; // 아이템 고유아이디
shop_item() shop_item()
{ {
@ -40,20 +40,20 @@ class CShop
virtual void SetPCShop(LPCHARACTER ch); virtual void SetPCShop(LPCHARACTER ch);
virtual bool IsPCShop() { return m_pkPC ? true : false; } virtual bool IsPCShop() { return m_pkPC ? true : false; }
// <EFBFBD>Խ<EFBFBD>Ʈ <20>߰<EFBFBD>/<2F><><EFBFBD><EFBFBD> // 게스트 추가/삭제
virtual bool AddGuest(LPCHARACTER ch,DWORD owner_vid, bool bOtherEmpire); virtual bool AddGuest(LPCHARACTER ch,DWORD owner_vid, bool bOtherEmpire);
void RemoveGuest(LPCHARACTER ch); void RemoveGuest(LPCHARACTER ch);
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> // 물건 구입
virtual int Buy(LPCHARACTER ch, BYTE pos); virtual int Buy(LPCHARACTER ch, BYTE pos);
// <EFBFBD>Խ<EFBFBD>Ʈ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ŷ<EFBFBD><C5B6> <20><><EFBFBD><EFBFBD> // 게스트에게 패킷을 보냄
void BroadcastUpdateItem(BYTE pos); void BroadcastUpdateItem(BYTE pos);
// <EFBFBD>Ǹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>˷<EFBFBD><CBB7>ش<EFBFBD>. // 판매중인 아이템의 갯수를 알려준다.
int GetNumberByVnum(DWORD dwVnum); int GetNumberByVnum(DWORD dwVnum);
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ϵǾ<CFB5> <20>ִ<EFBFBD><D6B4><EFBFBD> <20>˷<EFBFBD><CBB7>ش<EFBFBD>. // 아이템이 상점에 등록되어 있는지 알려준다.
virtual bool IsSellingItem(DWORD itemID); virtual bool IsSellingItem(DWORD itemID);
DWORD GetVnum() { return m_dwVnum; } DWORD GetVnum() { return m_dwVnum; }
@ -70,7 +70,7 @@ class CShop
typedef std::unordered_map<LPCHARACTER, bool> GuestMapType; typedef std::unordered_map<LPCHARACTER, bool> GuestMapType;
GuestMapType m_map_guest; GuestMapType m_map_guest;
std::vector<SHOP_ITEM> m_itemVector; // <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD>ǵ<EFBFBD> std::vector<SHOP_ITEM> m_itemVector; // 이 상점에서 취급하는 물건들
LPCHARACTER m_pkPC; LPCHARACTER m_pkPC;
}; };

View File

@ -12,11 +12,11 @@ typedef struct SShopTableEx : SShopTable
class CGroupNode; class CGroupNode;
// Ȯ<EFBFBD><EFBFBD> shop. // 확장 shop.
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ȭ<><C8AD><EFBFBD><EFBFBD> <20><> <20><> <20>ְ<EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ǿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ġ<EFBFBD><C4A1> <20><> <20>ִ<EFBFBD>. // 명도전을 화폐로 쓸 수 있고, 아이템을 여러 탭에 나눠 배치할 수 있다.
// <EFBFBD><EFBFBD>, pc <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. // , pc 샵은 구현하지 않음.
// Ŭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> pos 45 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. // 클라와 통신할 때에 탭은 pos 45 단위로 구분.
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> m_itemVector<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ´<CAB4>. // 기존 샵의 m_itemVector은 사용하지 않는다.
class CShopEx: public CShop class CShopEx: public CShop
{ {
public: public:

View File

@ -5,33 +5,33 @@
enum ESkillFlags enum ESkillFlags
{ {
SKILL_FLAG_ATTACK = (1 << 0), // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> SKILL_FLAG_ATTACK = (1 << 0), // 공격 기술
SKILL_FLAG_USE_MELEE_DAMAGE = (1 << 1), // <EFBFBD><20>и<EFBFBD> Ÿ<><C5B8>ġ<EFBFBD><C4A1> b <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> SKILL_FLAG_USE_MELEE_DAMAGE = (1 << 1), // 기본 밀리 타격치를 b 값으로 사용
SKILL_FLAG_COMPUTE_ATTGRADE = (1 << 2), // <EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD> SKILL_FLAG_COMPUTE_ATTGRADE = (1 << 2), // 공격등급을 계산한다
SKILL_FLAG_SELFONLY = (1 << 3), // <EFBFBD>ڽſ<EFBFBD><EFBFBD>Ը<EFBFBD> <20><> <20><> <20><><EFBFBD><EFBFBD> SKILL_FLAG_SELFONLY = (1 << 3), // 자신에게만 쓸 수 있음
SKILL_FLAG_USE_MAGIC_DAMAGE = (1 << 4), // <EFBFBD><20><><EFBFBD><EFBFBD> Ÿ<><C5B8>ġ<EFBFBD><C4A1> b <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> SKILL_FLAG_USE_MAGIC_DAMAGE = (1 << 4), // 기본 마법 타격치를 b 값으로 사용
SKILL_FLAG_USE_HP_AS_COST = (1 << 5), // HP<EFBFBD><EFBFBD> SP<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> SKILL_FLAG_USE_HP_AS_COST = (1 << 5), // HP SP대신 쓴다
SKILL_FLAG_COMPUTE_MAGIC_DAMAGE = (1 << 6), SKILL_FLAG_COMPUTE_MAGIC_DAMAGE = (1 << 6),
SKILL_FLAG_SPLASH = (1 << 7), SKILL_FLAG_SPLASH = (1 << 7),
SKILL_FLAG_GIVE_PENALTY = (1 << 8), // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>õ<EFBFBD><C3B5><EFBFBD>(3<><33>) 2<><32> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>޴´<DEB4>. SKILL_FLAG_GIVE_PENALTY = (1 << 8), // 쓰고나면 잠시동안(3초) 2배 데미지를 받는다.
SKILL_FLAG_USE_ARROW_DAMAGE = (1 << 9), // <EFBFBD>⺻ ȭ<><C8AD> Ÿ<><C5B8>ġ<EFBFBD><C4A1> b <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> SKILL_FLAG_USE_ARROW_DAMAGE = (1 << 9), // 기본 화살 타격치를 b 값으로 사용
SKILL_FLAG_PENETRATE = (1 << 10), // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SKILL_FLAG_PENETRATE = (1 << 10), // 방어무시
SKILL_FLAG_IGNORE_TARGET_RATING = (1 << 11), // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> SKILL_FLAG_IGNORE_TARGET_RATING = (1 << 11), // 상대 레이팅 무시
SKILL_FLAG_SLOW = (1 << 12), // <EFBFBD><EFBFBD><EFBFBD>ο<EFBFBD> <20><><EFBFBD><EFBFBD> SKILL_FLAG_SLOW = (1 << 12), // 슬로우 공격
SKILL_FLAG_STUN = (1 << 13), // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> SKILL_FLAG_STUN = (1 << 13), // 스턴 공격
SKILL_FLAG_HP_ABSORB = (1 << 14), // HP <EFBFBD><EFBFBD><EFBFBD><EFBFBD> SKILL_FLAG_HP_ABSORB = (1 << 14), // HP 흡수
SKILL_FLAG_SP_ABSORB = (1 << 15), // SP <EFBFBD><EFBFBD><EFBFBD><EFBFBD> SKILL_FLAG_SP_ABSORB = (1 << 15), // SP 흡수
SKILL_FLAG_FIRE_CONT = (1 << 16), // FIRE <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SKILL_FLAG_FIRE_CONT = (1 << 16), // FIRE 지속 데미지
SKILL_FLAG_REMOVE_BAD_AFFECT = (1 << 17), // <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȿ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> SKILL_FLAG_REMOVE_BAD_AFFECT = (1 << 17), // 나쁜효과 제거
SKILL_FLAG_REMOVE_GOOD_AFFECT = (1 << 18), // <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȿ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> SKILL_FLAG_REMOVE_GOOD_AFFECT = (1 << 18), // 나쁜효과 제거
SKILL_FLAG_CRUSH = (1 << 19), // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> SKILL_FLAG_CRUSH = (1 << 19), // 상대방을 날림
SKILL_FLAG_POISON = (1 << 20), // <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> SKILL_FLAG_POISON = (1 << 20), // 독 공격
SKILL_FLAG_TOGGLE = (1 << 21), // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> SKILL_FLAG_TOGGLE = (1 << 21), // 토글
SKILL_FLAG_DISABLE_BY_POINT_UP = (1 << 22), // <EFBFBD><EFBFBD><EFBFBD><20>ø<EFBFBD> <20><> <20><><EFBFBD><EFBFBD>. SKILL_FLAG_DISABLE_BY_POINT_UP = (1 << 22), // 찍어서 올릴 수 없다.
SKILL_FLAG_CRUSH_LONG = (1 << 23), // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ָ<EFBFBD> <20><><EFBFBD><EFBFBD> SKILL_FLAG_CRUSH_LONG = (1 << 23), // 상대방을 멀리 날림
SKILL_FLAG_WIND = (1 << 24), // <EFBFBD>ٶ<EFBFBD> <20>Ӽ<EFBFBD> SKILL_FLAG_WIND = (1 << 24), // 바람 속성
SKILL_FLAG_ELEC = (1 << 25), // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ӽ<EFBFBD> SKILL_FLAG_ELEC = (1 << 25), // 전기 속성
SKILL_FLAG_FIRE = (1 << 26), // <EFBFBD><EFBFBD> <20>Ӽ<EFBFBD> SKILL_FLAG_FIRE = (1 << 26), // 불 속성
}; };
enum enum
@ -44,84 +44,84 @@ enum ESkillIndexes
{ {
SKILL_RESERVED = 0, SKILL_RESERVED = 0,
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20> // 무사 전사 계열
// A // A
SKILL_SAMYEON = 1, // <EFBFBD><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>) SKILL_SAMYEON = 1, // 삼연참(세번베기)
SKILL_PALBANG, // <EFBFBD>ȹ<EFBFBD>dz<EFBFBD><EFBFBD> SKILL_PALBANG, // 팔방풍우
// S // S
SKILL_JEONGWI, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȥ SKILL_JEONGWI, // 전귀혼
SKILL_GEOMKYUNG, // <EFBFBD>˰<EFBFBD> SKILL_GEOMKYUNG, // 검경
SKILL_TANHWAN, // źȯ<EFBFBD><EFBFBD> SKILL_TANHWAN, // 탄환격
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20> // 무사 기공 계열
// A // A
SKILL_GIGONGCHAM = 16, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SKILL_GIGONGCHAM = 16, // 기공참
SKILL_GYOKSAN, // <EFBFBD>ݻ<EFBFBD>Ÿ<EFBFBD><EFBFBD> SKILL_GYOKSAN, // 격산타우
SKILL_DAEJINGAK, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SKILL_DAEJINGAK, // 대진각
// S // S
SKILL_CHUNKEON, // õ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> SKILL_CHUNKEON, // 천근추
SKILL_GEOMPUNG, // <EFBFBD><EFBFBD>dz SKILL_GEOMPUNG, // 검풍
// <EFBFBD>ڰ<EFBFBD> <20>ϻ<EFBFBD> <20> // 자객 암살 계열
// A // A
SKILL_AMSEOP = 31, // <EFBFBD>Ͻ<EFBFBD> SKILL_AMSEOP = 31, // 암습
SKILL_GUNGSIN, // <EFBFBD>ý<EFBFBD>ź<EFBFBD><EFBFBD> SKILL_GUNGSIN, // 궁신탄영
SKILL_CHARYUN, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SKILL_CHARYUN, // 차륜살
// S // S
SKILL_EUNHYUNG, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SKILL_EUNHYUNG, // 은형법
SKILL_SANGONG, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SKILL_SANGONG, // 산공분
// <EFBFBD>ڰ<EFBFBD> <20>ü<EFBFBD> <20> // 자객 궁수 계열
// A // A
SKILL_YEONSA = 46, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> SKILL_YEONSA = 46, // 연사
SKILL_KWANKYEOK, // <EFBFBD><EFBFBD><EFBFBD>ݼ<EFBFBD> SKILL_KWANKYEOK, // 관격술
SKILL_HWAJO, // ȭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> SKILL_HWAJO, // 화조파
// S // S
SKILL_GYEONGGONG, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SKILL_GYEONGGONG, // 경공술
SKILL_GIGUNG, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> SKILL_GIGUNG, // 기궁
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> // 수라 검
// A // A
SKILL_SWAERYUNG = 61, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SKILL_SWAERYUNG = 61, // 쇄령지
SKILL_YONGKWON, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SKILL_YONGKWON, // 용권파
// S // S
SKILL_GWIGEOM, // <EFBFBD>Ͱ<EFBFBD> SKILL_GWIGEOM, // 귀검
SKILL_TERROR, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> SKILL_TERROR, // 공포
SKILL_JUMAGAP, // <EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD> SKILL_JUMAGAP, // 주마갑
SKILL_PABEOB, // <EFBFBD>Ĺ<EFBFBD><EFBFBD><EFBFBD> SKILL_PABEOB, // 파법술
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> // 수라 마법
// A // A
SKILL_MARYUNG = 76, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> SKILL_MARYUNG = 76, // 마령
SKILL_HWAYEOMPOK, // ȭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> SKILL_HWAYEOMPOK, // 화염폭
SKILL_MUYEONG, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SKILL_MUYEONG, // 무영진
// S // S
SKILL_MANASHILED, // <EFBFBD><EFBFBD><EFBFBD>ż<EFBFBD>ȣ SKILL_MANASHILED, // 흑신수호
SKILL_TUSOK, // <EFBFBD><EFBFBD><EFBFBD>Ӹ<EFBFBD><EFBFBD><EFBFBD> SKILL_TUSOK, // 투속마령
SKILL_MAHWAN, // <EFBFBD><EFBFBD>ȯ<EFBFBD><EFBFBD> SKILL_MAHWAN, // 마환격
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> // 무당 용신
// A // A
SKILL_BIPABU = 91, SKILL_BIPABU = 91,
SKILL_YONGBI, // <EFBFBD><EFBFBD><EFBFBD>񱤻<EFBFBD><EFBFBD><EFBFBD> SKILL_YONGBI, // 용비광사파
SKILL_PAERYONG, // <EFBFBD>з泪<EFBFBD>ѹ<EFBFBD> SKILL_PAERYONG, // 패룡나한무
// S // S
//SKILL_BUDONG, // <EFBFBD>ε<EFBFBD><EFBFBD>ں<EFBFBD> //SKILL_BUDONG, // 부동박부
SKILL_HOSIN, // ȣ<EFBFBD><EFBFBD> SKILL_HOSIN, // 호신
SKILL_REFLECT, // <EFBFBD><EFBFBD>ȣ SKILL_REFLECT, // 보호
SKILL_GICHEON, // <EFBFBD><EFBFBD>õ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> SKILL_GICHEON, // 기천대공
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> // 무당 뇌신
// A // A
SKILL_NOEJEON = 106, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SKILL_NOEJEON = 106, // 뇌전령
SKILL_BYEURAK, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> SKILL_BYEURAK, // 벼락
SKILL_CHAIN, // ü<EFBFBD>ζ<EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><EFBFBD> SKILL_CHAIN, // 체인라이트닝
// S // S
SKILL_JEONGEOP, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SKILL_JEONGEOP, // 정업인
SKILL_KWAESOK, // <EFBFBD>̵<EFBFBD><EFBFBD>ӵ<EFBFBD><EFBFBD><EFBFBD> SKILL_KWAESOK, // 이동속도업
SKILL_JEUNGRYEOK, // <EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD> SKILL_JEUNGRYEOK, // 증력술
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų // 공통 스킬
// 7 // 7
SKILL_7_A_ANTI_TANHWAN = 112, SKILL_7_A_ANTI_TANHWAN = 112,
SKILL_7_B_ANTI_AMSEOP, SKILL_7_B_ANTI_AMSEOP,
@ -134,27 +134,27 @@ enum ESkillIndexes
SKILL_8_C_ANTI_MAHWAN, SKILL_8_C_ANTI_MAHWAN,
SKILL_8_D_ANTI_BYEURAK, SKILL_8_D_ANTI_BYEURAK,
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų // 보조 스킬
SKILL_LEADERSHIP = 121, // <EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD> SKILL_LEADERSHIP = 121, // 통솔력
SKILL_COMBO = 122, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SKILL_COMBO = 122, // 연계기
SKILL_CREATE = 123, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> SKILL_CREATE = 123, // 제조
SKILL_MINING = 124, SKILL_MINING = 124,
SKILL_LANGUAGE1 = 126, // <EFBFBD>ż<EFBFBD><EFBFBD><EFBFBD> <20>ɷ<EFBFBD> SKILL_LANGUAGE1 = 126, // 신수어 능력
SKILL_LANGUAGE2 = 127, // õ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ɷ<EFBFBD> SKILL_LANGUAGE2 = 127, // 천조어 능력
SKILL_LANGUAGE3 = 128, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ɷ<EFBFBD> SKILL_LANGUAGE3 = 128, // 진노어 능력
SKILL_POLYMORPH = 129, // <EFBFBD>а<EFBFBD> SKILL_POLYMORPH = 129, // 둔갑
SKILL_HORSE = 130, // <EFBFBD>¸<EFBFBD> <20><>ų SKILL_HORSE = 130, // 승마 스킬
SKILL_HORSE_SUMMON = 131, // <EFBFBD><EFBFBD> <20><>ȯ <20><>ų SKILL_HORSE_SUMMON = 131, // 말 소환 스킬
SKILL_HORSE_WILDATTACK = 137, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> SKILL_HORSE_WILDATTACK = 137, // 난무
SKILL_HORSE_CHARGE = 138, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> SKILL_HORSE_CHARGE = 138, // 돌격
SKILL_HORSE_ESCAPE = 139, // Ż<EFBFBD><EFBFBD> SKILL_HORSE_ESCAPE = 139, // 탈출
SKILL_HORSE_WILDATTACK_RANGE = 140, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD>) SKILL_HORSE_WILDATTACK_RANGE = 140, // 난무(활)
SKILL_ADD_HP = 141, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> SKILL_ADD_HP = 141, // 증혈
SKILL_RESIST_PENETRATE = 142, // ö<EFBFBD><EFBFBD> SKILL_RESIST_PENETRATE = 142, // 철통
GUILD_SKILL_START = 151, GUILD_SKILL_START = 151,
GUILD_SKILL_EYE = 151, GUILD_SKILL_EYE = 151,
@ -176,35 +176,35 @@ class CSkillProto
{ {
public: public:
char szName[64]; char szName[64];
DWORD dwVnum; // <EFBFBD><EFBFBD>ȣ DWORD dwVnum; // 번호
DWORD dwType; // 0: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, 1: <EFBFBD><EFBFBD><EFBFBD><EFBFBD>, 2: <EFBFBD>ڰ<EFBFBD>, 3: <EFBFBD><EFBFBD><EFBFBD><EFBFBD>, 4: <EFBFBD><EFBFBD><EFBFBD><EFBFBD> DWORD dwType; // 0: 전직업, 1: 무사, 2: 자객, 3: 수라, 4: 무당
BYTE bMaxLevel; // <EFBFBD>ִ<EFBFBD> <20><><EFBFBD>õ<EFBFBD> BYTE bMaxLevel; // 최대 수련도
BYTE bLevelLimit; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> BYTE bLevelLimit; // 레벨제한
int iSplashRange; // <EFBFBD><EFBFBD><EFBFBD>÷<EFBFBD><EFBFBD><EFBFBD> <20>Ÿ<EFBFBD> <20><><EFBFBD><EFBFBD> int iSplashRange; // 스플래쉬 거리 제한
BYTE bPointOn; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>Ű<EFBFBD>°<EFBFBD>? (Ÿ<><C5B8>ġ, MAX HP, HP REGEN <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>) BYTE bPointOn; // 어디에 결과값을 적용 시키는가? (타격치, MAX HP, HP REGEN 등등등)
CPoly kPointPoly; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> CPoly kPointPoly; // 결과값 만드는 공식
CPoly kSPCostPoly; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> SP <20><><EFBFBD><EFBFBD> CPoly kSPCostPoly; // 사용 SP 공식
CPoly kDurationPoly; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ð<EFBFBD> <20><><EFBFBD><EFBFBD> CPoly kDurationPoly; // 지속 시간 공식
CPoly kDurationSPCostPoly; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> SP <20><><EFBFBD><EFBFBD> CPoly kDurationSPCostPoly; // 지속 SP 공식
CPoly kCooldownPoly; // <EFBFBD><EFBFBD><EFBFBD>ٿ<EFBFBD> <20>ð<EFBFBD> <20><><EFBFBD><EFBFBD> CPoly kCooldownPoly; // 쿨다운 시간 공식
CPoly kMasterBonusPoly; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD>ʽ<EFBFBD> <20><><EFBFBD><EFBFBD> CPoly kMasterBonusPoly; // 마스터일 때 보너스 공식
CPoly kSplashAroundDamageAdjustPoly; // <EFBFBD><EFBFBD><EFBFBD>÷<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> CPoly kSplashAroundDamageAdjustPoly; // 스플래쉬 공격일 경우 주위 적에게 입히는 데미지 감소 비율
DWORD dwFlag; // <EFBFBD><EFBFBD>ų<EFBFBD>ɼ<EFBFBD> DWORD dwFlag; // 스킬옵션
DWORD dwAffectFlag; // <EFBFBD><EFBFBD>ų<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD> Affect DWORD dwAffectFlag; // 스킬에 맞은 경우 적용되는 Affect
BYTE bLevelStep; // <EFBFBD>ѹ<EFBFBD><EFBFBD><EFBFBD> <20>ø<EFBFBD><C3B8>µ<EFBFBD> <20>ʿ<EFBFBD><CABF><EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD>Ʈ <20><> BYTE bLevelStep; // 한번에 올리는데 필요한 스킬 포인트 수
DWORD preSkillVnum; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD> <20>ʿ<EFBFBD><CABF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų DWORD preSkillVnum; // 배우는데 필요한 이전에 배워야할 스킬
BYTE preSkillLevel; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD> BYTE preSkillLevel; // 이전에 배워야할 스킬의 레벨
int lMaxHit; int lMaxHit;
BYTE bSkillAttrType; BYTE bSkillAttrType;
// 2<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> // 2차 적용
BYTE bPointOn2; BYTE bPointOn2;
CPoly kPointPoly2; CPoly kPointPoly2;
CPoly kDurationPoly2; CPoly kDurationPoly2;
@ -218,7 +218,7 @@ class CSkillProto
return dwVnum == SKILL_TANHWAN || dwVnum == SKILL_HORSE_CHARGE; return dwVnum == SKILL_TANHWAN || dwVnum == SKILL_HORSE_CHARGE;
} }
// 3<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> // 3차 적용
BYTE bPointOn3; BYTE bPointOn3;
CPoly kPointPoly3; CPoly kPointPoly3;
CPoly kDurationPoly3; CPoly kDurationPoly3;

View File

@ -8,7 +8,7 @@ class CTableBySkill : public singleton<CTableBySkill>
CTableBySkill() CTableBySkill()
: m_aiSkillDamageByLevel(NULL) : m_aiSkillDamageByLevel(NULL)
{ {
//<EFBFBD><EFBFBD>ų <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʱ<EFBFBD>ȭ //스킬 레벨당 추가데미지 초기화
for ( int job = 0; job < JOB_MAX_NUM * 2; ++job ) for ( int job = 0; job < JOB_MAX_NUM * 2; ++job )
m_aiSkillPowerByLevelFromType[job] = NULL; m_aiSkillPowerByLevelFromType[job] = NULL;
} }
@ -18,18 +18,18 @@ class CTableBySkill : public singleton<CTableBySkill>
DeleteAll(); DeleteAll();
} }
//<EFBFBD><EFBFBD><EFBFBD>̺<EFBFBD> <20><><EFBFBD><EFBFBD> üũ //테이블 세팅 체크
bool Check() const; bool Check() const;
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD> //삭제
void DeleteAll(); void DeleteAll();
//<EFBFBD><EFBFBD>ų<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų<EFBFBD>Ŀ<EFBFBD> <20><><EFBFBD>̺<EFBFBD> //스킬레벨단위 스킬파워 테이블
int GetSkillPowerByLevelFromType( int job, int skillgroup, int skilllevel, bool bMob ) const; int GetSkillPowerByLevelFromType( int job, int skillgroup, int skilllevel, bool bMob ) const;
void SetSkillPowerByLevelFromType( int idx, const int* aTable ); void SetSkillPowerByLevelFromType( int idx, const int* aTable );
void DeleteSkillPowerByLevelFromType( int idx ); void DeleteSkillPowerByLevelFromType( int idx );
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߰<EFBFBD> <20><>ų<EFBFBD><C5B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̺<EFBFBD> //레벨당 추가 스킬데미지 테이블
int GetSkillDamageByLevel( int Level ) const; int GetSkillDamageByLevel( int Level ) const;
void SetSkillDamageByLevelTable( const int* aTable ); void SetSkillDamageByLevelTable( const int* aTable );
void DeleteSkillDamageByLevelTable(); void DeleteSkillDamageByLevelTable();

View File

@ -17,8 +17,8 @@ EVENTINFO(TargetInfo)
DWORD dwPID; DWORD dwPID;
DWORD dwQuestIndex; DWORD dwQuestIndex;
char szTargetName[32+1]; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20≯<EFBFBD> char szTargetName[32+1]; // 퀘스트에서 사용하는 이름
char szTargetDesc[32+1]; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD>۵Ǵ<DBB5> <20≯<EFBFBD> char szTargetDesc[32+1]; // 실제 클라이언트에 전송되는 이름
int iType; int iType;
int iArg1; int iArg1;

View File

@ -40,13 +40,13 @@ enum
ITEM_GIVE_STAT_RESET_COUNT_VNUM = 70014, ITEM_GIVE_STAT_RESET_COUNT_VNUM = 70014,
ITEM_SKILLFORGET_VNUM = 70037, ITEM_SKILLFORGET_VNUM = 70037,
ITEM_SKILLFORGET2_VNUM = 70055, // 7, 8 <EFBFBD><EFBFBD>ų <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ITEM_SKILLFORGET2_VNUM = 70055, // 7, 8 스킬 망각서
UNIQUE_ITEM_FISH_MIND = 71008, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> UNIQUE_ITEM_FISH_MIND = 71008, // 월간어심
UNIQUE_ITEM_SAFEBOX_EXPAND = 71009, // â<EFBFBD><EFBFBD>Ȯ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> UNIQUE_ITEM_SAFEBOX_EXPAND = 71009, // 창고확장권
UNIQUE_ITEM_AUTOLOOT_GOLD = 71010, // <EFBFBD><EFBFBD>3<EFBFBD><EFBFBD> <20><> UNIQUE_ITEM_AUTOLOOT_GOLD = 71010, // 제3의 손
UNIQUE_ITEM_EMOTION_MASK = 71011, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> UNIQUE_ITEM_EMOTION_MASK = 71011, // 열정의 가면
UNIQUE_ITEM_EMOTION_MASK2 = 71033, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> UNIQUE_ITEM_EMOTION_MASK2 = 71033, // 열정의 가면
ITEM_NEW_YEAR_GREETING_VNUM = 50023, ITEM_NEW_YEAR_GREETING_VNUM = 50023,
@ -106,11 +106,11 @@ enum
REWARD_BOX_UNIQUE_ITEM_CAPE_OF_COURAGE = 76007, REWARD_BOX_UNIQUE_ITEM_CAPE_OF_COURAGE = 76007,
// <EFBFBD><EFBFBD>ȥ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Ȯ<><C8AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // 용혼석 추출 확률을 높여주는 아이템
DRAGON_SOUL_EXTRACTOR_GROUP = 10600, DRAGON_SOUL_EXTRACTOR_GROUP = 10600,
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // 용심 추출해주는 아이템
DRAGON_HEART_EXTRACTOR_GROUP = 10601, DRAGON_HEART_EXTRACTOR_GROUP = 10601,
// <EFBFBD><EFBFBD>ȥ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD>. // 용혼석에서 추출할 때 주는 용심.
DRAGON_HEART_VNUM = 100000, DRAGON_HEART_VNUM = 100000,
}; };

View File

@ -68,7 +68,7 @@ class CWarMap
DWORD GetWinnerGuild(); DWORD GetWinnerGuild();
void UsePotion(LPCHARACTER ch, LPITEM item); void UsePotion(LPCHARACTER ch, LPITEM item);
void Draw(); // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>º<EFBFBD> ó<><C3B3> void Draw(); // 강제 무승부 처리
void Timeout(); void Timeout();
void CheckWarEnd(); void CheckWarEnd();
bool SetEnded(); bool SetEnded();
@ -125,8 +125,8 @@ class CWarMap
void Initialize(); void Initialize();
int GetAccumulatedJoinerCount(); // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> int GetAccumulatedJoinerCount(); // 누적된 참가자 수
int GetCurJointerCount(); // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> int GetCurJointerCount(); // 현재 참가자 수
void AppendMember(LPCHARACTER ch); void AppendMember(LPCHARACTER ch);
void RemoveMember(LPCHARACTER ch); void RemoveMember(LPCHARACTER ch);

View File

@ -5,8 +5,8 @@ namespace xmas
{ {
enum enum
{ {
MOB_SANTA_VNUM = 20031, //<EFBFBD><EFBFBD>Ÿ MOB_SANTA_VNUM = 20031, //산타
// MOB_SANTA_VNUM = 20095, //<EFBFBD><EFBFBD><EFBFBD><EFBFBD> // MOB_SANTA_VNUM = 20095, //노해
MOB_XMAS_TREE_VNUM = 20032, MOB_XMAS_TREE_VNUM = 20032,
MOB_XMAS_FIRWORK_SELLER_VNUM = 9004, MOB_XMAS_FIRWORK_SELLER_VNUM = 9004,
}; };