1
0
forked from metin2/server

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);
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;
bool IsValidCellForThisItem(const LPITEM pItem, const TItemPos& Cell) 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);
// Ư<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>,
// <EFBFBD><EFBFBD><EFBFBD>н<EFBFBD> <20>λ깰<CEBB><EAB9B0> <20>ִ<EFBFBD> <20>Լ<EFBFBD>.(<28>λ깰<CEBB><EAB9B0> dragon_soul_table.txt<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>)
// 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>.
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>, <20><>ȥ<EFBFBD><C8A5>(pItem)<EFBFBD><EFBFBD> delete<EFBFBD><EFBFBD>.
// <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>.
// <EFBFBD>λ깰<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ڵ<EFBFBD> <20>߰<EFBFBD>.
// 특정 용혼석(pItem)을 장비창에서 제거할 때에 성공 여부를 결정하고,
// 실패시 부산물을 주는 함수.(부산물은 dragon_soul_table.txt에 정의)
// DestCell invalid한 값을 넣으면 성공 시, 용혼석을 빈 공간에 자동 추가.
// 실패 시, 용혼석(pItem) delete.
// 추출아이템이 있다면 추출 성공 확률이 pExtractor->GetValue(0)%만큼 증가함.
// 부산물은 언제나 자동 추가.
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 DoRefineStep(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:
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);
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();
@ -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>
lzo_uint m_sizeCompBuf; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ũ<><C5A9>
DWORD m_crc; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> CRC
BYTE m_abCompBuf[MAX_COMP_SIZE]; // 압축된 데이터
lzo_uint m_sizeCompBuf; // 압축된 크기
DWORD m_crc; // 압축된 데이터의 CRC
///////////////////////////////////////////////////////////////////////////////
DWORD GetCRC() const;
@ -87,9 +87,9 @@ class CGuildMarkImage
bool SaveMark(DWORD posMark, BYTE * pbMarkImage);
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 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);
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 SaveMarkIndex(); // <EFBFBD><EFBFBD>ũ <20>ε<EFBFBD><CEB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD>
bool LoadMarkIndex(); // 마크 인덱스 불러오기 (서버에서만 사용)
bool SaveMarkIndex(); // 마크 인덱스 저장하기
void LoadMarkImages(); // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ũ <20>̹<EFBFBD><CCB9><EFBFBD><EFBFBD><EFBFBD> <20>ҷ<EFBFBD><D2B7><EFBFBD><EFBFBD><EFBFBD>
void SaveMarkImage(DWORD imgIdx); // <EFBFBD><EFBFBD>ũ <20>̹<EFBFBD><CCB9><EFBFBD> <20><><EFBFBD><EFBFBD>
void LoadMarkImages(); // 모든 마크 이미지를 불러오기
void SaveMarkImage(DWORD imgIdx); // 마크 이미지 저장
bool GetMarkImageFilename(DWORD imgIdx, std::string & path) const;
bool AddMarkIDByGuildID(DWORD guildID, DWORD markID);

View File

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

View File

@ -4,7 +4,7 @@
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
{
};
@ -34,8 +34,8 @@ protected:
virtual bool Update(DWORD deltaTime);
protected:
virtual bool _UpdateFollowAI(); ///< <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ٴϴ<D9B4> AI ó<EFBFBD><EFBFBD>
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 _UpdateFollowAI(); ///< 주인을 따라다니는 AI 처리
virtual bool _UpdatAloneActionAI(float fMinDist, float fMaxDist); ///< 주인 근처에서 혼자 노는 AI 처리
/// @TODO
//virtual bool _UpdateCombatAI();
@ -62,13 +62,13 @@ public:
bool IsSummoned() const { return 0 != m_pkChar; }
void SetSummonItem (LPITEM pItem);
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>,
// PointChange() <EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD> <20><><EFBFBD>𼱰<EFBFBD> ComputePoints()<EFBFBD><EFBFBD> <20>ϸ<EFBFBD> <20>ϴ<EFBFBD> <20>ʱ<EFBFBD>ȭ<EFBFBD>ǰ<EFBFBD>,
// <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>.
// <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>,
// <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>.
// 버프 주는 함수와 거두는 함수.
// 이게 좀 괴랄한게, 서버가 ㅄ라서,
// POINT_MOV_SPEED, POINT_ATT_SPEED, POINT_CAST_SPEED PointChange()란 함수만 써서 변경해 봐야 소용이 없는게,
// PointChange() 이후에 어디선가 ComputePoints()를 하면 싹다 초기화되고,
// 더 웃긴건, ComputePoints()를 부르지 않으면 클라의 POINT는 전혀 변하지 않는다는 거다.
// 그래서 버프를 주는 것은 ComputePoints() 내부에서 petsystem->RefreshBuff()를 부르도록 하였고,
// 버프를 빼는 것은 ClearBuff()를 부르고, ComputePoints를 하는 것으로 한다.
void GiveBuff();
void ClearBuff();
@ -87,7 +87,7 @@ private:
LPCHARACTER m_pkChar; // Instance of pet(CHARACTER)
LPCHARACTER m_pkOwner;
// SPetAbility m_petAbility; // <EFBFBD>ɷ<EFBFBD>ġ
// SPetAbility m_petAbility; // 능력치
};
/**
@ -95,7 +95,7 @@ private:
class CPetSystem
{
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:
CPetSystem(LPCHARACTER owner);
@ -107,7 +107,7 @@ public:
bool Update(DWORD deltaTime);
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:
void SetUpdatePeriod(DWORD ms);
@ -117,7 +117,7 @@ public:
void Unsummon(DWORD mobVnum, 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);
void DeletePet(DWORD mobVnum);
@ -126,8 +126,8 @@ public:
private:
TPetActorMap m_petActorMap;
LPCHARACTER m_pkOwner; ///< <EFBFBD><EFBFBD> <20>ý<EFBFBD><C3BD><EFBFBD><EFBFBD><EFBFBD> Owner
DWORD m_dwUpdatePeriod; ///< <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20>ֱ<EFBFBD> (ms<6D><73><EFBFBD><EFBFBD>)
LPCHARACTER m_pkOwner; ///< 펫 시스템의 Owner
DWORD m_dwUpdatePeriod; ///< 업데이트 주기 (ms단위)
DWORD m_dwLastUpdateTime;
LPEVENT m_pkPetSystemUpdateEvent;
};

View File

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

View File

@ -12,17 +12,17 @@
/**
* @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
* @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 >
{
public:
/// I/O <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// I/O 방향
enum IODirection {
IODIR_INPUT = 0, ///< Input
IODIR_OUTPUT, ///< Output
@ -37,25 +37,25 @@ class TrafficProfiler : public singleton< TrafficProfiler >
/// Destructor
~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] pszLogFileName Profiling log file <EFBFBD><EFBFBD> <20≯<EFBFBD>
* @return false <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> profiling log file <EFBFBD><EFBFBD> open <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ߴ<EFBFBD>.
* @param [in] dwFlushCycle Flush 주기. 초 단위이다.
* @param [in] pszLogFileName Profiling log file 의 이름
* @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 );
/// 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] byHeader Packet <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param [in] dwSize Packet <EFBFBD><EFBFBD> <20><> size
* @return Initialize <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʾҴٸ<D2B4> false <20><> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>.
* @param [in] dir Profiling Packet 의 방향
* @param [in] byHeader Packet 헤더
* @param [in] dwSize Packet 의 총 size
* @return Initialize 되지 않았다면 false 를 반환한다.
*
* Packet <EFBFBD><EFBFBD> <20>ش<EFBFBD><D8B4>ϴ<EFBFBD> size <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ų<EFBFBD><C5B2>.
* 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>.
* Packet 에 해당하는 size 를 누적시킨다.
* Initialize 이후나 최근 Flush 된 이후에 Flush 주기 만큼 시간이 흐른 후 호출된다면 Report 이후 Flush 한다.
*/
bool Report( IODirection dir, BYTE byHeader, DWORD dwSize )
{
@ -65,22 +65,22 @@ class TrafficProfiler : public singleton< TrafficProfiler >
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 );
private:
/// Profling <EFBFBD><EFBFBD> <20><><EFBFBD>õ<EFBFBD> variables <EFBFBD><EFBFBD> <20>ʱ<EFBFBD>ȭ <20>Ѵ<EFBFBD>.
/// Profling 에 관련된 variables 를 초기화 한다.
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] byHeader Packet <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param [in] dwSize Packet <EFBFBD><EFBFBD> <20><> size
* @param [in] dir Profiling Packet 의 방향
* @param [in] byHeader Packet 헤더
* @param [in] dwSize Packet 의 총 size
*/
void ComputeTraffic( IODirection dir, BYTE byHeader, DWORD dwSize )
{
@ -96,8 +96,8 @@ class TrafficProfiler : public singleton< TrafficProfiler >
/// Traffic info type.
/**
* first: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> size
* second: <EFBFBD><EFBFBD> packet <EFBFBD><EFBFBD> <20><><EFBFBD>۵<EFBFBD> Ƚ<><C8BD>
* first: 누적된 총 size
* second: packet 이 전송된 횟수
*/
typedef std::pair< DWORD, DWORD > TrafficInfo;
@ -105,11 +105,11 @@ class TrafficProfiler : public singleton< TrafficProfiler >
typedef std::vector< TrafficInfo > TrafficVec;
FILE* m_pfProfileLogFile; ///< Profile log file pointer
DWORD m_dwFlushCycle; ///< Flush <EFBFBD>ֱ<EFBFBD>
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>.
DWORD m_dwTotalTraffic; ///< Report <EFBFBD><EFBFBD> <20><> Traffic <EFBFBD>
DWORD m_dwTotalPacket; ///< Report <EFBFBD><EFBFBD> <20><> Packet <EFBFBD><EFBFBD>
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>.
DWORD m_dwFlushCycle; ///< Flush 주기
time_t m_tmProfileStartTime; ///< 프로파일을 시작한 시간. Flush 될 때마다 Update 된다.
DWORD m_dwTotalTraffic; ///< Report 된 총 Traffic 용량
DWORD m_dwTotalPacket; ///< Report 된 총 Packet
TrafficVec m_aTrafficVec[ IODIR_MAX ]; ///< Report Traffic 을 저장할 vector의 배열. 각 방향마다 vector 를 가진다.
};
#endif // _METIN_II_TRAFFICPROFILER_H_

View File

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

View File

@ -63,7 +63,7 @@ private:
TPCMap offer_map;
// sorting<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> members
// sorting을 위한 members
public:
typedef std::vector <TAuctionItemInfo*> TItemInfoVec;
private:
@ -76,7 +76,7 @@ private:
public:
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);
};
@ -131,7 +131,7 @@ private:
typedef std::pair <int, bool> BidInfo;
typedef std::map <DWORD, BidInfo > TItemMap;
typedef std::unordered_map <DWORD, TItemMap*> TMyBidBoard;
// bidder_id<EFBFBD><EFBFBD> key
// bidder_id key
TMyBidBoard pc_map;
public:
@ -144,7 +144,7 @@ public:
BidInfo GetMoney (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 Lock (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;
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;
SaleBoard Sale;
WishBoard Wish;

View File

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

View File

@ -13,7 +13,7 @@ public:
{
static TGradeUnit beltGradeByLevelTable[] =
{
0, // <EFBFBD><EFBFBD>Ʈ+0
0, // 벨트+0
1, // +1
1, // +2
2, // +3
@ -34,20 +34,20 @@ public:
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()
{
/**
<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>.
<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 ~ +9 레벨을 가질 수 있으며, 레벨에 따라 7단계 등급으로 구분되어 인벤토리가 활성 화 된다.
벨트 레벨에 따른 사용 가능한 셀은 아래 그림과 같음. 현재 등급 >= 활성가능 등급이면 사용 가능.
(단, 현재 레벨이 0이면 무조건 사용 불가, 괄호 안의 숫자는 등급)
2(1) 4(2) 6(4) 8(6)
5(3) 5(3) 6(4) 8(6)
7(5) 7(5) 7(5) 8(6)
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] = {
@ -62,14 +62,14 @@ public:
static bool IsAvailableCell(WORD cell, int beltGrade /*int beltLevel*/)
{
// <EFBFBD><EFBFBD>ȹ <20><> <20>ٲ<EFBFBD>.. <20>Ƴ<EFBFBD>...
// 기획 또 바뀜.. 아놔...
//const TGradeUnit beltGrade = GetBeltGradeByRefineLevel(beltLevel);
const TGradeUnit* ruleTable = GetAvailableRuleTableByGrade();
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)
{
for (WORD i = BELT_INVENTORY_SLOT_START; i < BELT_INVENTORY_SLOT_END; ++i)
@ -83,7 +83,7 @@ public:
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)
{
bool canMove = false;

View File

@ -9,20 +9,20 @@ public:
CBuffOnAttributes(LPCHARACTER pOwner, BYTE m_point_type, std::vector <BYTE>* vec_buff_targets);
~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);
// 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);
// m_bBuffValue<EFBFBD><EFBFBD> <20>ٲٰ<D9B2>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ٲ<EFBFBD>.
// m_bBuffValue를 바꾸고, 버프의 값도 바꿈.
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>,
// <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><>.
// CHRACTRE::ComputePoints에서 속성치를 초기화하고 다시 계산하므로,
// 버프 속성치들을 강제적으로 owner에게 줌.
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>,
// <EFBFBD><EFBFBD> attribute<EFBFBD><EFBFBD><EFBFBD><EFBFBD> (m_bBuffValue)% <EFBFBD><EFBFBD>ŭ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>.
// m_p_vec_buff_wear_targets에 해당하는 모든 아이템의 attribute type별로 합산하고,
// attribute들의 (m_bBuffValue)% 만큼을 버프로 줌.
bool On(BYTE bValue);
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>, <20>ʱ<EFBFBD>ȭ
// 버프 제거 후, 초기화
void Off();
void Initialize();
@ -32,9 +32,9 @@ private:
BYTE m_bBuffValue;
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;
// 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;
};

View File

@ -9,36 +9,36 @@
#define _castle_h_
#define MAX_CASTLE_GUARD_REGION 4 // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ġ <20><><EFBFBD><EFBFBD>
#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_FROG 20 // Ȳ<EFBFBD><EFBFBD> <20>β<EFBFBD><CEB2><EFBFBD>
#define MAX_CASTLE_TOWER 10 // <EFBFBD><EFBFBD>ȭ <20>ִ<EFBFBD> <20><>ȯ <20><><EFBFBD><EFBFBD>
#define MIN_CASTLE_TOWER 5 // <EFBFBD><EFBFBD>ȭ <20>ּ<EFBFBD> <20><>ȯ <20><><EFBFBD><EFBFBD>
#define MAX_CASTLE_GUARD_REGION 4 // 경비병 배치 구역
#define MAX_CASTLE_GUARD_PER_REGION 10 // 한지역에 배치할수있는 경비병그룹
#define MAX_CASTLE_FROG 20 // 황금 두꺼비
#define MAX_CASTLE_TOWER 10 // 봉화 최대 소환 개수
#define MIN_CASTLE_TOWER 5 // 봉화 최소 소환 개수
#define CASTLE_FROG_PRICE 100000000 // Ȳ<EFBFBD>ݵβ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> (1<EFBFBD><EFBFBD>)
#define CASTLE_FROG_VNUM 11505 // Ȳ<EFBFBD>ݵβ<EFBFBD><EFBFBD><EFBFBD> <20><>ȣ
//#define CASTLE_TOWER_VNUM 11506 // <EFBFBD><EFBFBD>ȭ <20><>ȣ
#define CASTLE_FROG_PRICE 100000000 // 황금두꺼비 가격 (1)
#define CASTLE_FROG_VNUM 11505 // 황금두꺼비 번호
//#define CASTLE_TOWER_VNUM 11506 // 봉화 번호
#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))
enum CASTLE_STATE
{
CASTLE_SIEGE_NONE, // <EFBFBD><EFBFBD>ȭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CASTLE_SIEGE_STRUGGLE, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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_NONE, // 평화모드
CASTLE_SIEGE_STRUGGLE, // 공성중
CASTLE_SIEGE_END // 수성에 성공했다면 1시간동안 봉화를 깰 수 있다.
};
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>
DWORD guard_group[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]; // 경비병 리더
LPCHARACTER tower[MAX_CASTLE_TOWER]; // <EFBFBD><EFBFBD>ȭ
LPCHARACTER tower[MAX_CASTLE_TOWER]; // 봉화
LPEVENT siege_event;
LPEVENT stone_event;

View File

@ -83,7 +83,7 @@ enum EDamageType
DAMAGE_TYPE_NONE,
DAMAGE_TYPE_NORMAL,
DAMAGE_TYPE_NORMAL_RANGE,
//<EFBFBD><EFBFBD>ų
//스킬
DAMAGE_TYPE_MELEE,
DAMAGE_TYPE_RANGE,
DAMAGE_TYPE_FIRE,
@ -105,103 +105,103 @@ enum EPointTypes
POINT_MAX_HP, // 6
POINT_SP, // 7
POINT_MAX_SP, // 8
POINT_STAMINA, // 9 <EFBFBD><EFBFBD><EFBFBD>׹̳<EFBFBD>
POINT_MAX_STAMINA, // 10 <EFBFBD>ִ<EFBFBD> <20><><EFBFBD>׹̳<D7B9>
POINT_STAMINA, // 9 스테미너
POINT_MAX_STAMINA, // 10 최대 스테미너
POINT_GOLD, // 11
POINT_ST, // 12 <EFBFBD>ٷ<EFBFBD>
POINT_HT, // 13 ü<EFBFBD><EFBFBD>
POINT_DX, // 14 <EFBFBD><EFBFBD>ø<EFBFBD><EFBFBD>
POINT_IQ, // 15 <EFBFBD><EFBFBD><EFBFBD>ŷ<EFBFBD>
POINT_ST, // 12 근력
POINT_HT, // 13 체력
POINT_DX, // 14 민첩성
POINT_IQ, // 15 정신력
POINT_DEF_GRADE, // 16 ...
POINT_ATT_SPEED, // 17 <EFBFBD><EFBFBD><EFBFBD>ݼӵ<EFBFBD>
POINT_ATT_GRADE, // 18 <EFBFBD><EFBFBD><EFBFBD>ݷ<EFBFBD> MAX
POINT_MOV_SPEED, // 19 <EFBFBD>̵<EFBFBD><EFBFBD>ӵ<EFBFBD>
POINT_CLIENT_DEF_GRADE, // 20 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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_MAGIC_ATT_GRADE, // 22 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݷ<EFBFBD>
POINT_MAGIC_DEF_GRADE, // 23 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
POINT_EMPIRE_POINT, // 24 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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_STAT, // 26 <EFBFBD>ɷ<EFBFBD>ġ <20>ø<EFBFBD> <20><> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD>
POINT_SUB_SKILL, // 27 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD>Ʈ
POINT_SKILL, // 28 <EFBFBD><EFBFBD>Ƽ<EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD>Ʈ
POINT_WEAPON_MIN, // 29 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ּ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
POINT_WEAPON_MAX, // 30 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
POINT_PLAYTIME, // 31 <EFBFBD>÷<EFBFBD><EFBFBD>̽ð<EFBFBD>
POINT_HP_REGEN, // 32 HP ȸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
POINT_SP_REGEN, // 33 SP ȸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
POINT_ATT_SPEED, // 17 공격속도
POINT_ATT_GRADE, // 18 공격력 MAX
POINT_MOV_SPEED, // 19 이동속도
POINT_CLIENT_DEF_GRADE, // 20 방어등급
POINT_CASTING_SPEED, // 21 주문속도 (쿨다운타임*100) / (100 + 이값) = 최종 쿨다운 타임
POINT_MAGIC_ATT_GRADE, // 22 마법공격력
POINT_MAGIC_DEF_GRADE, // 23 마법방어력
POINT_EMPIRE_POINT, // 24 제국점수
POINT_LEVEL_STEP, // 25 한 레벨에서의 단계.. (1 2 3 될 때 보상, 4 되면 레벨 업)
POINT_STAT, // 26 능력치 올릴 수 있는 개수
POINT_SUB_SKILL, // 27 보조 스킬 포인트
POINT_SKILL, // 28 액티브 스킬 포인트
POINT_WEAPON_MIN, // 29 무기 최소 데미지
POINT_WEAPON_MAX, // 30 무기 최대 데미지
POINT_PLAYTIME, // 31 플레이시간
POINT_HP_REGEN, // 32 HP 회복률
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_SP_RECOVERY, // 36 <EFBFBD><EFBFBD><EFBFBD>ŷ<EFBFBD> ȸ<><C8B8> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
POINT_HP_RECOVERY, // 35 체력 회복 증가량
POINT_SP_RECOVERY, // 36 정신력 회복 증가량
POINT_POISON_PCT, // 37 <EFBFBD><EFBFBD> Ȯ<><C8AE>
POINT_STUN_PCT, // 38 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ȯ<><C8AE>
POINT_SLOW_PCT, // 39 <EFBFBD><EFBFBD><EFBFBD>ο<EFBFBD> Ȯ<><C8AE>
POINT_CRITICAL_PCT, // 40 ũ<EFBFBD><EFBFBD>Ƽ<EFBFBD><EFBFBD> Ȯ<><C8AE>
POINT_PENETRATE_PCT, // 41 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ÿ<EFBFBD><EFBFBD> Ȯ<><C8AE>
POINT_CURSE_PCT, // 42 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ȯ<><C8AE>
POINT_POISON_PCT, // 37 독 확률
POINT_STUN_PCT, // 38 기절 확률
POINT_SLOW_PCT, // 39 슬로우 확률
POINT_CRITICAL_PCT, // 40 크리티컬 확률
POINT_PENETRATE_PCT, // 41 관통타격 확률
POINT_CURSE_PCT, // 42 저주 확률
POINT_ATTBONUS_HUMAN, // 43 <EFBFBD>ΰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
POINT_ATTBONUS_ANIMAL, // 44 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> % <20><><EFBFBD><EFBFBD>
POINT_ATTBONUS_ORC, // 45 <EFBFBD><EFBFBD><EFBFBD>Ϳ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> % <20><><EFBFBD><EFBFBD>
POINT_ATTBONUS_MILGYO, // 46 <EFBFBD>б<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> % <20><><EFBFBD><EFBFBD>
POINT_ATTBONUS_UNDEAD, // 47 <EFBFBD><EFBFBD>ü<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> % <20><><EFBFBD><EFBFBD>
POINT_ATTBONUS_DEVIL, // 48 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<28>Ǹ<EFBFBD>)<29><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> % <20><><EFBFBD><EFBFBD>
POINT_ATTBONUS_INSECT, // 49 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
POINT_ATTBONUS_FIRE, // 50 ȭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
POINT_ATTBONUS_ICE, // 51 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
POINT_ATTBONUS_DESERT, // 52 <EFBFBD><EFBFBD><EFBFBD>
POINT_ATTBONUS_MONSTER, // 53 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ϳ<EFBFBD><CDBF><EFBFBD> <20><><EFBFBD><EFBFBD>
POINT_ATTBONUS_WARRIOR, // 54 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
POINT_ATTBONUS_ASSASSIN, // 55 <EFBFBD>ڰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
POINT_ATTBONUS_SURA, // 56 <EFBFBD><EFBFBD><EFBFBD>󿡰<EFBFBD> <20><><EFBFBD><EFBFBD>
POINT_ATTBONUS_SHAMAN, // 57 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
POINT_ATTBONUS_TREE, // 58 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> 20050729.myevan UNUSED5
POINT_ATTBONUS_HUMAN, // 43 인간에게 강함
POINT_ATTBONUS_ANIMAL, // 44 동물에게 데미지 % 증가
POINT_ATTBONUS_ORC, // 45 웅귀에게 데미지 % 증가
POINT_ATTBONUS_MILGYO, // 46 밀교에게 데미지 % 증가
POINT_ATTBONUS_UNDEAD, // 47 시체에게 데미지 % 증가
POINT_ATTBONUS_DEVIL, // 48 마귀(악마)에게 데미지 % 증가
POINT_ATTBONUS_INSECT, // 49 벌레족
POINT_ATTBONUS_FIRE, // 50 화염족
POINT_ATTBONUS_ICE, // 51 빙설족
POINT_ATTBONUS_DESERT, // 52 사막족
POINT_ATTBONUS_MONSTER, // 53 모든 몬스터에게 강함
POINT_ATTBONUS_WARRIOR, // 54 무사에게 강함
POINT_ATTBONUS_ASSASSIN, // 55 자객에게 강함
POINT_ATTBONUS_SURA, // 56 수라에게 강함
POINT_ATTBONUS_SHAMAN, // 57 무당에게 강함
POINT_ATTBONUS_TREE, // 58 나무에게 강함 20050729.myevan UNUSED5
POINT_RESIST_WARRIOR, // 59 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
POINT_RESIST_ASSASSIN, // 60 <EFBFBD>ڰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
POINT_RESIST_SURA, // 61 <EFBFBD><EFBFBD><EFBFBD>󿡰<EFBFBD> <20><><EFBFBD><EFBFBD>
POINT_RESIST_SHAMAN, // 62 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
POINT_RESIST_WARRIOR, // 59 무사에게 저항
POINT_RESIST_ASSASSIN, // 60 자객에게 저항
POINT_RESIST_SURA, // 61 수라에게 저항
POINT_RESIST_SHAMAN, // 62 무당에게 저항
POINT_STEAL_HP, // 63 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
POINT_STEAL_SP, // 64 <EFBFBD><EFBFBD><EFBFBD>ŷ<EFBFBD> <20><><EFBFBD><EFBFBD>
POINT_STEAL_HP, // 63 생명력 흡수
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_DODGE, // 68 ȸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
POINT_BLOCK, // 67 블럭율
POINT_DODGE, // 68 회피율
POINT_RESIST_SWORD, // 69
POINT_RESIST_TWOHAND, // 70
POINT_RESIST_DAGGER, // 71
POINT_RESIST_BELL, // 72
POINT_RESIST_FAN, // 73
POINT_RESIST_BOW, // 74 ȭ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
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_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_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_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_BOW, // 74 화살 저항 : 대미지 감소
POINT_RESIST_FIRE, // 75 화염 저항 : 화염공격에 대한 대미지 감소
POINT_RESIST_ELEC, // 76 전기 저항 : 전기공격에 대한 대미지 감소
POINT_RESIST_MAGIC, // 77 술법 저항 : 모든술법에 대한 대미지 감소
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_POISON_REDUCE, // 81 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
/// 특수 피해시 ///
POINT_REFLECT_CURSE, // 80 저주 반사
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_GOLD_DOUBLE_BONUS, // 84
POINT_ITEM_DROP_BONUS, // 85
/// ȸ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ///
/// 회복 관련 ///
POINT_POTION_BONUS, // 86
POINT_KILL_HP_RECOVERY, // 87
@ -225,7 +225,7 @@ enum EPointTypes
POINT_HIT_HP_RECOVERY, // 100
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_SKILL_MASTER_BONUS, // 104
@ -234,56 +234,56 @@ enum EPointTypes
POINT_SP_RECOVER_CONTINUE, // 106
POINT_STEAL_GOLD, // 107
POINT_POLYMORPH, // 108 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȣ
POINT_MOUNT, // 109 Ÿ<EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȣ
POINT_POLYMORPH, // 108 변신한 몬스터 번호
POINT_MOUNT, // 109 타고있는 몬스터 번호
POINT_PARTY_HASTE_BONUS, // 110
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_MALL_ATTBONUS, // 114 <EFBFBD><EFBFBD><EFBFBD>ݷ<EFBFBD> +x%
POINT_MALL_DEFBONUS, // 115 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> +x%
POINT_MALL_EXPBONUS, // 116 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ġ +x%
POINT_MALL_ITEMBONUS, // 117 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> x/10<EFBFBD><EFBFBD>
POINT_MALL_GOLDBONUS, // 118 <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> x/10<EFBFBD><EFBFBD>
POINT_MALL_ATTBONUS, // 114 공격력 +x%
POINT_MALL_DEFBONUS, // 115 방어력 +x%
POINT_MALL_EXPBONUS, // 116 경험치 +x%
POINT_MALL_ITEMBONUS, // 117 아이템 드롭율 x/10
POINT_MALL_GOLDBONUS, // 118 돈 드롭율 x/10
POINT_MAX_HP_PCT, // 119 <EFBFBD>ִ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> +x%
POINT_MAX_SP_PCT, // 120 <EFBFBD>ִ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ŷ<EFBFBD> +x%
POINT_MAX_HP_PCT, // 119 최대생명력 +x%
POINT_MAX_SP_PCT, // 120 최대정신력 +x%
POINT_SKILL_DAMAGE_BONUS, // 121 <EFBFBD><EFBFBD>ų <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> *(100+x)%
POINT_NORMAL_HIT_DAMAGE_BONUS, // 122 <EFBFBD><EFBFBD>Ÿ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> *(100+x)%
POINT_SKILL_DAMAGE_BONUS, // 121 스킬 데미지 *(100+x)%
POINT_NORMAL_HIT_DAMAGE_BONUS, // 122 평타 데미지 *(100+x)%
// DEFEND_BONUS_ATTRIBUTES
POINT_SKILL_DEFEND_BONUS, // 123 <EFBFBD><EFBFBD>ų <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
POINT_NORMAL_HIT_DEFEND_BONUS, // 124 <EFBFBD><EFBFBD>Ÿ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
POINT_SKILL_DEFEND_BONUS, // 123 스킬 방어 데미지
POINT_NORMAL_HIT_DEFEND_BONUS, // 124 평타 방어 데미지
// END_OF_DEFEND_BONUS_ATTRIBUTES
// 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_DROP_BONUS, // 126 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방 전용 드롭률 보너스
// 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>.
// <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>.
// <EFBFBD><EFBFBD> <20>β<EFBFBD><CEB2><EFBFBD><EFBFBD><EFBFBD>
POINT_ENERGY_END_TIME = 129, // 129 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD>
// 기력 ui .
// 서버에서 쓰지 않기만, 클라이언트에서 기력의 끝 시간을 POINT로 관리하기 때문에 이렇게 한다.
// 아 부끄럽다
POINT_ENERGY_END_TIME = 129, // 129 기력 종료 시간
POINT_COSTUME_ATTR_BONUS = 130,
POINT_MAGIC_ATT_BONUS_PER = 131,
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_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_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_ICE = 133, // 냉기 저항 : 얼음공격에 대한 대미지 감소
POINT_RESIST_EARTH = 134, // 대지 저항 : 얼음공격에 대한 대미지 감소
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_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_CRITICAL = 136, // 크리티컬 저항 : 상대의 크리티컬 확률을 감소
POINT_RESIST_PENETRATE = 137, // 관통타격 저항 : 상대의 관통타격 확률을 감소
//POINT_MAX_NUM = 129 common/length.h
};
@ -352,7 +352,7 @@ struct DynamicCharacterPtr {
uint32_t id;
};
/* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
/* 저장하는 데이터 */
typedef struct character_point
{
int points[POINT_MAX_NUM];
@ -375,7 +375,7 @@ typedef struct character_point
BYTE skill_group;
} 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
{
int points[POINT_MAX_NUM];
@ -397,7 +397,7 @@ typedef struct character_point_instant
LPITEM pItems[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];
WORD wDSItemGrid[DRAGON_SOUL_INVENTORY_MAX_NUM];
@ -409,7 +409,7 @@ typedef struct character_point_instant
BYTE gm_level;
BYTE bBasePart; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȣ
BYTE bBasePart; // 평상복 번호
int iMaxStamina;
@ -507,7 +507,7 @@ class CHARACTER : public CEntity, public CFSM, public CHorseRider
{
protected:
//////////////////////////////////////////////////////////////////////////////////
// Entity <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// Entity 관련
virtual void EncodeInsertPacket(LPENTITY entity);
virtual void EncodeRemovePacket(LPENTITY entity);
//////////////////////////////////////////////////////////////////////////////////
@ -517,7 +517,7 @@ class CHARACTER : public CEntity, public CFSM, public CHorseRider
void UpdatePacket();
//////////////////////////////////////////////////////////////////////////////////
// FSM (Finite State Machine) <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// FSM (Finite State Machine) 관련
protected:
CStateTemplate<CHARACTER> m_stateMove;
CStateTemplate<CHARACTER> m_stateBattle;
@ -587,13 +587,13 @@ class CHARACTER : public CEntity, public CFSM, public CHorseRider
DWORD GetPlayerID() const { return m_dwPlayerID; }
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);
WORD GetRaceNum() const;
void Save(); // DelayedSave
void SaveReal(); // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
void SaveReal(); // 실제 저장
void FlushDelayedSaveItem();
const char * GetName() const;
@ -634,7 +634,7 @@ class CHARACTER : public CEntity, public CFSM, public CHorseRider
DWORD GetExp() const { return m_points.exp; }
void SetExp(DWORD exp) { m_points.exp = exp; }
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 DistributeSP(LPCHARACTER pkKiller, int iMethod=0);
@ -717,14 +717,14 @@ class CHARACTER : public CEntity, public CFSM, public CHorseRider
DWORD GetPolymorphItemVnum() 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 ComputeBattlePoints();
void PointChange(BYTE type, int amount, bool bAmount = false, bool bBroadcast = false);
void PointsPacket();
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);
@ -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 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);
DWORD GetPolymorphVnum() const { return m_dwPolymorphRace; }
int GetPolymorphPower() const;
@ -806,15 +806,15 @@ class CHARACTER : public CEntity, public CFSM, public CHorseRider
void SetNowWalking(bool bWalkFlag);
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();
bool CanMove() const; // <EFBFBD>̵<EFBFBD><EFBFBD><EFBFBD> <20><> <20>ִ°<D6B4>?
bool CanMove() const; // 이동할 수 있는가?
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 Move(int x, int y); // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>˻<EFBFBD><CBBB>ϰ<EFBFBD> Sync <20>޼ҵ带 <20><><EFBFBD><EFBFBD> <20>̵<EFBFBD> <20>Ѵ<EFBFBD>.
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>.
bool Sync(int x, int y); // 실제 이 메소드로 이동 한다 (각 종 조건에 의한 이동 불가가 없음)
bool Move(int x, int y); // 조건을 검사하고 Sync 메소드를 통해 이동 한다.
void OnMove(bool bIsAttack = false); // 움직일때 불린다. Move() 메소드 이외에서도 불릴 수 있다.
DWORD GetMotionMode() const;
float GetMoveMotionSpeed() const;
float GetMoveSpeed() const;
@ -825,7 +825,7 @@ class CHARACTER : public CEntity, public CFSM, public CHorseRider
DWORD GetLastMoveTime() const { return m_dwLastMoveTime; }
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 IsSyncOwner(LPCHARACTER ch) const;
@ -852,7 +852,7 @@ class CHARACTER : public CEntity, public CFSM, public CHorseRider
float m_fSyncTime;
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_posStart;
@ -875,7 +875,7 @@ class CHARACTER : public CEntity, public CFSM, public CHorseRider
bool m_bStaminaConsume;
// End
// Quickslot <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// Quickslot 관련
public:
void SyncQuickslot(BYTE bType, BYTE bOldPos, BYTE bNewPos);
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 SaveAffect();
// Affect loading<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ΰ<EFBFBD>?
// Affect loading이 끝난 상태인가?
bool IsLoadedAffect() const { return m_bIsLoadedAffect; }
bool IsGoodAffect(BYTE bAffectType) const;
@ -930,25 +930,25 @@ class CHARACTER : public CEntity, public CFSM, public CHorseRider
void DenyToParty(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);
/// <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);
/// <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);
@ -961,45 +961,45 @@ class CHARACTER : public CEntity, public CFSM, public CHorseRider
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);
/**
* <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 <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 는 시간에 의존적인가에 따라 변경가능한(mutable) type 과 정적(static) type 으로 나뉜다.
* Error code 의 값이 PERR_SEPARATOR 보다 낮으면 변경가능한 type 이고 높으면 정적 type 이다.
*/
enum PartyJoinErrCode {
PERR_NONE = 0, ///< ó<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
PERR_SERVER, ///< <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ƽ<EFBFBD><C6BC><EFBFBD><EFBFBD> ó<><C3B3> <20>Ұ<EFBFBD>
PERR_DUNGEON, ///< ij<EFBFBD><EFBFBD><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
PERR_OBSERVER, ///< <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
PERR_LVBOUNDARY, ///< <EFBFBD><EFBFBD><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD>Ϳ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̰<EFBFBD> <20><>
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_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_ALREADYJOIN, ///< <EFBFBD><EFBFBD>Ƽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD>Ͱ<EFBFBD> <20>̹<EFBFBD> <20><>Ƽ<EFBFBD><C6BC>
PERR_PARTYISFULL, ///< <EFBFBD><EFBFBD>Ƽ<EFBFBD>ο<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʰ<EFBFBD>
PERR_NONE = 0, ///< 처리성공
PERR_SERVER, ///< 서버문제로 파티관련 처리 불가
PERR_DUNGEON, ///< 캐릭터가 던전에 있음
PERR_OBSERVER, ///< 관전모드임
PERR_LVBOUNDARY, ///< 상대 캐릭터와 레벨차이가 남
PERR_LOWLEVEL, ///< 상대파티의 최고레벨보다 30레벨 낮음
PERR_HILEVEL, ///< 상대파티의 최저레벨보다 30레벨 높음
PERR_ALREADYJOIN, ///< 파티가입 대상 캐릭터가 이미 파티중
PERR_PARTYISFULL, ///< 파티인원 제한 초과
PERR_SEPARATOR, ///< Error type separator.
PERR_DIFFEMPIRE, ///< <EFBFBD><EFBFBD><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD>Ϳ<EFBFBD> <20>ٸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
PERR_MAX ///< Error code <EFBFBD>ְ<EFBFBD>ġ. <20><> <20>տ<EFBFBD> Error code <EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0>Ѵ<EFBFBD>.
PERR_DIFFEMPIRE, ///< 상대 캐릭터와 다른 제국임
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 pchGuest <EFBFBD>ʴ<EFBFBD><EFBFBD>޴<EFBFBD> character
* @return <EFBFBD><EFBFBD><EFBFBD><EFBFBD> PartyJoinErrCode <EFBFBD><EFBFBD> <20><>ȯ<EFBFBD><C8AF> <20><> <20>ִ<EFBFBD>.
* @param pchLeader 파티의 leader 이거나 초대한 character
* @param pchGuest 초대받는 character
* @return 모든 PartyJoinErrCode 가 반환될 수 있다.
*/
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 pchGuest <EFBFBD>ʴ<EFBFBD><EFBFBD>޴<EFBFBD> character
* @return mutable type <EFBFBD><EFBFBD> code <EFBFBD><EFBFBD> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>.
* @param pchLeader 파티의 leader 이거나 초대한 character
* @param pchGuest 초대받는 character
* @return mutable type code 만 반환한다.
*/
static PartyJoinErrCode IsPartyJoinableMutableCondition(const LPCHARACTER pchLeader, const LPCHARACTER pchGuest);
@ -1008,11 +1008,11 @@ class CHARACTER : public CEntity, public CFSM, public CHorseRider
LPEVENT m_pkPartyRequestEvent;
/**
* <EFBFBD><EFBFBD>Ƽ<EFBFBD><EFBFBD>û Event map.
* key: <EFBFBD>ʴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> PID
* value: event<EFBFBD><EFBFBD> pointer
* 파티초청 Event map.
* key: 초대받은 캐릭터의 PID
* value: event pointer
*
* <EFBFBD>ʴ<EFBFBD><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD>͵鿡 <20><><EFBFBD><EFBFBD> event map.
* 초대한 캐릭터들에 대한 event map.
*/
typedef std::map< DWORD, LPEVENT > EventMap;
EventMap m_PartyInviteEventMap;
@ -1046,7 +1046,7 @@ class CHARACTER : public CEntity, public CFSM, public CHorseRider
////////////////////////////////////////////////////////////////////////////////////////
// Item related
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; }
void SetItemLoaded() { m_bItemLoaded = true; }
@ -1061,14 +1061,14 @@ class CHARACTER : public CEntity, public CFSM, public CHorseRider
LPITEM GetWear(BYTE bCell) const;
// 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>
* <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>.
* 접속한 후 처음 비단 보따리 아이템 사용 시 UseSilkBotary 에서 DB 캐시로 가격정보 리스트를 요청하고
* 응답받은 시점에 이 함수에서 실제 비단보따리 사용을 처리한다.
*/
void UseSilkBotaryReal(const TPacketMyshopPricelistHeader* p);
// 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 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);
// <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 SwapItem(BYTE bCell, BYTE bDestCell);
@ -1149,14 +1149,14 @@ class CHARACTER : public CEntity, public CFSM, public CHorseRider
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] dwItemPrice <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
* @param [in] dwItemVnum 아이템 vnum
* @param [in] 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;
int m_iRefineAdditionalCell;
@ -1170,7 +1170,7 @@ class CHARACTER : public CEntity, public CFSM, public CHorseRider
void SetGold(INT gold) { m_points.gold = gold; }
bool DropGold(INT gold);
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
////////////////////////////////////////////////////////////////////////////////////////
@ -1236,9 +1236,9 @@ class CHARACTER : public CEntity, public CFSM, public CHorseRider
bool CanFight() 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;
void Stun();
@ -1268,7 +1268,7 @@ class CHARACTER : public CEntity, public CFSM, public CHorseRider
void UpdateAlignment(int iAmount);
int GetAlignment() const;
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ġ <20><><EFBFBD><EFBFBD>
//선악치 얻기
int GetRealAlignment() const;
void ShowAlignment(bool bShow);
@ -1317,7 +1317,7 @@ class CHARACTER : public CEntity, public CFSM, public CHorseRider
DWORD m_dwFlyTargetID;
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;
DWORD m_dwKillerPID;
@ -1340,8 +1340,8 @@ class CHARACTER : public CEntity, public CFSM, public CHorseRider
BYTE GetDropMetinStonePct() const { return m_bDropMetinStonePct; }
protected:
LPCHARACTER m_pkChrStone; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>
CHARACTER_SET m_set_pkChrSpawnedBy; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
LPCHARACTER m_pkChrStone; // 나를 스폰한 돌
CHARACTER_SET m_set_pkChrSpawnedBy; // 내가 스폰한 놈들
DWORD m_dwDropMetinStone;
BYTE m_bDropMetinStonePct;
// End of Stone
@ -1399,7 +1399,7 @@ class CHARACTER : public CEntity, public CFSM, public CHorseRider
private:
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
// MOB_SKILL
@ -1456,10 +1456,10 @@ class CHARACTER : public CEntity, public CFSM, public CHorseRider
// AI related
public:
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);
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 Return();
@ -1483,8 +1483,8 @@ class CHARACTER : public CEntity, public CFSM, public CHorseRider
////////////////////////////////////////////////////////////////////////////////////////
// Target
protected:
LPCHARACTER m_pkChrTarget; // <EFBFBD><EFBFBD> Ÿ<><C5B8>
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>
LPCHARACTER m_pkChrTarget; // 내 타겟
CHARACTER_SET m_set_pkChrTargetedBy; // 나를 타겟으로 가지고 있는 사람들
public:
void SetTarget(LPCHARACTER pkChrTarget);
@ -1505,19 +1505,19 @@ class CHARACTER : public CEntity, public CFSM, public CHorseRider
void ChangeSafeboxSize(BYTE bSize);
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>.
* â<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>.
* DB 에 창고열기를 요청한다.
* 창고는 중복으로 열지 못하며, 최근 창고를 닫은 시간으로 부터 10초 이내에는 열 지 못한다.
*/
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>.
* â<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>.
* ReqSafeboxLoad 를 호출하고 CloseSafebox 하지 않았을 때 이 함수를 호출하면 창고를 열 수 있다.
* 창고열기의 요청이 DB 서버에서 실패응답을 받았을 경우 이 함수를 사용해서 요청을 할 수 있게 해준다.
*/
void CancelSafeboxLoad( void ) { m_bOpeningSafebox = false; }
@ -1535,7 +1535,7 @@ class CHARACTER : public CEntity, public CFSM, public CHorseRider
CSafebox * m_pkSafebox;
int m_iSafeboxSize;
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;
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);
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
void SetRider(LPCHARACTER ch);
@ -1631,7 +1631,7 @@ class CHARACTER : public CEntity, public CFSM, public CHorseRider
////////////////////////////////////////////////////////////////////////////////////////
// Resists & Proofs
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);
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 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);
protected:
@ -1741,9 +1741,9 @@ class CHARACTER : public CEntity, public CFSM, public CHorseRider
int m_aiPremiumTimes[PREMIUM_MAX_NUM];
// 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 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_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 DWORD msc_dwDefaultChangeItemAttrCycle; ///< 디폴트 아이템 속성변경 가능 주기
static const char msc_szLastChangeItemAttrFlag[]; ///< 최근 아이템 속성을 변경한 시간의 Quest Flag 이름
static const char msc_szChangeItemAttrCycleFlag[]; ///< 아이템 속성병경 가능 주기의 Quest Flag 이름
// END_OF_CHANGE_ITEM_ATTRIBUTES
// PC_BANG_ITEM_ADD
@ -1824,7 +1824,7 @@ class CHARACTER : public CEntity, public CFSM, public CHorseRider
int GetMyShopTime() const { return m_iMyShopTime; }
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);
// MONARCH
@ -1874,9 +1874,9 @@ class CHARACTER : public CEntity, public CFSM, public CHorseRider
bool IsSiegeNPC() const;
private:
//<EFBFBD>߱<EFBFBD> <20><><EFBFBD><EFBFBD>
//18<EFBFBD><EFBFBD> <20≯<EFBFBD> <20><><EFBFBD><EFBFBD>
//3<EFBFBD>ð<EFBFBD> : 50 % 5 <EFBFBD>ð<EFBFBD> 0%
//중국 전용
//18세 미만 전용
//3시간 : 50 % 5 시간 0%
e_overtime m_eOverTime;
public:
@ -1952,7 +1952,7 @@ class CHARACTER : public CEntity, public CFSM, public CHorseRider
typedef std::map <BYTE, CBuffOnAttributes*> TMapBuffOnAttrs;
TMapBuffOnAttrs m_map_buff_on_attrs;
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> : <20><>Ȱ<EFBFBD><C8B0> <20>׽<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD>Ͽ<EFBFBD>.
// 무적 : 원활한 테스트를 위하여.
public:
void SetArmada() { cannot_dead = true; }
void ResetArmada() { cannot_dead = false; }
@ -1967,7 +1967,7 @@ class CHARACTER : public CEntity, public CFSM, public CHorseRider
bool IsPet() { return m_bIsPet; }
#endif
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
//최종 데미지 보정.
private:
float m_fAttMul;
float m_fDamMul;
@ -1980,7 +1980,7 @@ class CHARACTER : public CEntity, public CFSM, public CHorseRider
private:
bool IsValidItemPosition(TItemPos Pos) const;
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>Ŷ <20>ӽ<EFBFBD> <20><><EFBFBD><EFBFBD>
//독일 선물 기능 패킷 임시 저장
private:
unsigned int itemAward_vnum = 0;
char itemAward_cmd[20] = "";
@ -1994,10 +1994,10 @@ class CHARACTER : public CEntity, public CFSM, public CHorseRider
//void SetItemAward_flag(bool flag) { itemAward_flag = flag; }
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<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, quest load 되기 전에 DragonSoul_Initialize를 호출하면 안된다.
// affect가 가장 마지막에 로드되어 LoadAffect에서 호출함.
void DragonSoul_Initialize();
bool DragonSoul_IsQualified() const;
@ -2008,17 +2008,17 @@ class CHARACTER : public CEntity, public CFSM, public CHorseRider
bool DragonSoul_ActivateDeck(int deck_idx);
void DragonSoul_DeactivateAll();
// <EFBFBD>ݵ<EFBFBD><EFBFBD><EFBFBD> ClearItem <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ҷ<EFBFBD><D2B7><EFBFBD> <20>Ѵ<EFBFBD>.
// <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>,
// 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>.
// 반드시 ClearItem 전에 불러야 한다.
// 왜냐하면....
// 용혼석 하나 하나를 deactivate할 때마다 덱에 active인 용혼석이 있는지 확인하고,
// 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>,
// <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>.
// (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>.)
// <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>.
// 하지만 ClearItem 시, 캐릭터가 착용하고 있는 모든 아이템을 unequip하는 바람에,
// 용혼석 Affect가 제거되고, 결국 로그인 시, 용혼석이 활성화되지 않는다.
// (Unequip할 때에는 로그아웃 상태인지, 아닌지 알 수 없다.)
// 용혼석만 deactivate시키고 캐릭터의 용혼석 덱 활성 상태는 건드리지 않는다.
void DragonSoul_CleanUp();
// <EFBFBD><EFBFBD>ȥ<EFBFBD><EFBFBD> <20><>ȭâ
// 용혼석 강화창
public:
bool DragonSoul_RefineWindow_Open(LPENTITY pEntity);
bool DragonSoul_RefineWindow_Close();
@ -2026,8 +2026,8 @@ class CHARACTER : public CEntity, public CFSM, public CHorseRider
bool DragonSoul_RefineWindow_CanRefine();
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<EFBFBD><EFBFBD> <20>Ͼ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
// SyncPosition을 악용하여 타유저를 이상한 곳으로 보내는 핵 방어하기 위하여,
// SyncPosition이 일어날 때를 기록.
timeval m_tvLastSyncTime;
int m_iSyncHackCount;
public:

View File

@ -24,7 +24,7 @@ class CHARACTER_MANAGER : public singleton<CHARACTER_MANAGER>
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();
@ -56,11 +56,11 @@ class CHARACTER_MANAGER : public singleton<CHARACTER_MANAGER>
bool AddToStateList(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>
// <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>.
// DelayedSave: 어떠한 루틴 내에서 저장을 해야 할 짓을 많이 하면 저장
// 쿼리가 너무 많아지므로 "저장을 한다" 라고 표시만 해두고 잠깐
// (: 1 frame) 후에 저장시킨다.
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();
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;
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_pkChrMonsterLog;

View File

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

View File

@ -35,7 +35,7 @@ extern bool china_event_server;
extern bool g_bNoMoreClient;
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;
@ -99,8 +99,8 @@ extern int VIEW_RANGE;
extern int VIEW_BONUS_RANGE;
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_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_protectNormalPlayer; // 범법자가 "평화모드" 인 일반유저를 공격하지 못함
extern bool g_noticeBattleZone; // 중립지대에 입장하면 안내메세지를 알려줌
extern DWORD g_GoldDropTimeLimitValue;

View File

@ -13,7 +13,7 @@ enum EMonsterChatState
typedef struct SMobRankStat
{
int iGoldPercent; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Ȯ<><C8AE>
int iGoldPercent; // 돈이 나올 확률
} TMobRankStat;
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 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 aiItemAttributeAddPercent[ITEM_ATTRIBUTE_MAX_NUM];

View File

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

View File

@ -105,7 +105,7 @@ class DBManager : public singleton<DBManager>
void FlushBilling(bool bForce=false);
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 CountQueryResult() { return m_sql.CountResult(); }
@ -119,8 +119,8 @@ class DBManager : public singleton<DBManager>
const std::string & GetDBString(const std::string& key);
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 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 FuncQuery(Functor f, const char * c_pszFormat, ...); // 결과를 f인자로 호출함 (SQLMsg *) 알아서 해제됨
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);

View File

@ -47,14 +47,14 @@ class CLoginKey
};
// sequence <EFBFBD><EFBFBD><EFBFBD><EFBFBD> ã<><C3A3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ÿ
// sequence 버그 찾기용 데이타
struct seq_t
{
BYTE hdr;
BYTE seq;
};
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 DescWriteHandler(bufferevent *bev, void *ctx);
@ -109,7 +109,7 @@ class DESC
bool IsPhase(int phase) const { return m_iPhase == phase ? true : false; }
// <EFBFBD>ڵ彦<EFBFBD><EFBFBD>ũ (<28>ð<EFBFBD> <20><><EFBFBD><EFBFBD>ȭ)
// 핸드쉐이크 (시간 동기화)
void StartHandshake(DWORD _dw);
void SendHandshake(DWORD dwCurTime, LONG lNewDelta);
bool HandshakeProcess(DWORD dwTime, LONG lDelta, bool bInfiniteRetry=false);
@ -118,7 +118,7 @@ class DESC
DWORD GetHandshake() const { return m_dwHandshake; }
DWORD GetClientTime();
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 제국
BYTE GetEmpire();
// for p2p
@ -127,7 +127,7 @@ class DESC
void DisconnectOfSameLogin();
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);
bool IsPong();
@ -200,7 +200,7 @@ class DESC
WORD m_wP2PPort;
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;
int m_iCurrentSequence;
@ -252,7 +252,7 @@ class DESC
void ChatPacket(BYTE type, const char * format, ...);
/* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ã<><C3A3><EFBFBD><EFBFBD> <20>ڵ<EFBFBD> */
/* 시퀀스 버그 찾기용 코드 */
public:
seq_vector_t m_seq_vector;
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 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 CountRealMonster(); // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʻ<EFBFBD><CABB><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int CountMonster() { return m_iMonsterCount; } // 데이터로 리젠한 몬스터의 수
int CountRealMonster(); // 실제로 맵상에 있는 몬스터
void IncPartyMember(LPPARTY pParty, LPCHARACTER ch);
void DecPartyMember(LPPARTY pParty, LPCHARACTER ch);
@ -103,7 +103,7 @@ class CDungeon
void SetFlag(std::string name, int value);
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;
void CreateItemGroup (std::string& group_name, ItemGroup& item_group);
const ItemGroup* GetItemGroup (std::string& group_name);
@ -142,7 +142,7 @@ class CDungeon
bool m_bExitAllAtEliminate;
bool m_bWarpAtEliminate;
// <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><>ġ
// 적 전멸시 워프하는 위치
int m_iWarpDelay;
int m_lWarpMapIndex;
int m_lWarpX;
@ -163,9 +163,9 @@ class CDungeon
friend EVENTFUNC(dungeon_exit_all_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>,
// <EFBFBD>ӽ÷<EFBFBD> <20><> <20><>Ƽ<EFBFBD><C6BC> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
// 파티 단위 던전 입장을 위한 임시 변수.
// m_map_pkParty는 관리가 부실하여 사용할 수 없다고 판단하여,
// 임시로 한 파티에 대한 관리를 하는 변수 생성.
LPPARTY m_pParty;
public :

View File

@ -28,7 +28,7 @@ class CEntity
void ViewCleanup();
void ViewInsert(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; }

View File

@ -1,8 +1,8 @@
/*
* 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__
#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)
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 int event_processing_time(LPEVENT event); // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ð<EFBFBD> <20><><EFBFBD><EFBFBD>
extern int event_time(LPEVENT event); // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ð<EFBFBD> <20><><EFBFBD><EFBFBD>
extern void event_reset_time(LPEVENT event, int when); // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ð<EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
extern void event_cancel(LPEVENT * event); // 이벤트 취소
extern int event_processing_time(LPEVENT event); // 수행 시간 리턴
extern int event_time(LPEVENT event); // 남은 시간 리턴
extern void event_reset_time(LPEVENT event, int when); // 실행 시간 재 설정
extern void event_set_verbose(int level);
extern event_info_data* FindEventInfo(DWORD dwID);

View File

@ -35,7 +35,7 @@ class CExchange
bool CheckSpace();
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;

View File

@ -45,15 +45,15 @@ public:
int GetRowCount();
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>.
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̱<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><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의 특정 컬럼의 값을 반환하는 함수.
// 이질적이긴 하지만, 편의를 위한 함수.
template <typename T>
bool GetValue(const std::string & c_rstrRowKey, const std::string & c_rstrColKey, T& tValue) const;
template <typename T>
bool GetValue(const std::string & c_rstrRowKey, int index, T& tValue) 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 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))
return true;
}
// default group<EFBFBD><EFBFBD> <20><><EFBFBD>.
// default group을 살펴봄.
pChildGroup = GetChildNode("default");
if (NULL != pChildGroup)
{
@ -203,7 +203,7 @@ bool CGroupNode::GetGroupValue(const std::string& stGroupName, const std::string
if (pChildGroup->GetValue(stRow, stCol, tValue))
return true;
}
// default group<EFBFBD><EFBFBD> <20><><EFBFBD>.
// default group을 살펴봄.
pChildGroup = GetChildNode("default");
if (NULL != pChildGroup)
{

View File

@ -29,12 +29,12 @@ struct SGuildMaster
typedef struct SGuildMember
{
DWORD pid; // player <EFBFBD><EFBFBD><EFBFBD>̺<EFBFBD><EFBFBD><EFBFBD> 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> ¯)
DWORD pid; // player 테이블의 id; primary key
BYTE grade; // 길드상의 플레이어의 계급 1 to 15 (1이 짱)
BYTE is_general;
BYTE job;
BYTE level;
DWORD offer_exp; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ġ
DWORD offer_exp; // 공헌한 경험치
BYTE _dummy;
std::string name;
@ -72,7 +72,7 @@ typedef struct packet_guild_sub_info
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;
} TGuildGrade;
@ -256,7 +256,7 @@ class CGuild
bool ChargeSP(LPCHARACTER ch, int iSP);
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 AdvanceLevel(int iLevel);
@ -266,7 +266,7 @@ class CGuild
void RequestWithdrawMoney(LPCHARACTER ch, 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; }
@ -277,7 +277,7 @@ class CGuild
int GetGuildWarState(DWORD guild_id);
bool CanStartWar(BYTE bGuildWarType);
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);
// War map relative
@ -320,26 +320,26 @@ class CGuild
bool HasLand();
// 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 pchInvitee <EFBFBD>ʴ<EFBFBD><EFBFBD><EFBFBD> character.
* @param pchInviter 초대한 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 );
/// <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 );
/// <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 );
// END_OF_GUILD_JOIN_BUG_FIX
@ -377,27 +377,27 @@ class CGuild
bool abSkillUsable[GUILD_SKILL_COUNT];
// 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 {
GERR_NONE = 0, ///< ó<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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_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_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_GUILDISFULL, ///< <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ο<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʰ<EFBFBD>
GERR_GUILD_IS_IN_WAR, ///< <EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
GERR_INVITE_LIMIT, ///< <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
GERR_MAX ///< Error code <EFBFBD>ְ<EFBFBD>ġ. <20><> <20>տ<EFBFBD> Error code <EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0>Ѵ<EFBFBD>.
GERR_NONE = 0, ///< 처리성공
GERR_WITHDRAWPENALTY, ///< 탈퇴후 가입가능한 시간이 지나지 않음
GERR_COMMISSIONPENALTY, ///< 해산후 가입가능한 시간이 지나지 않음
GERR_ALREADYJOIN, ///< 길드가입 대상 캐릭터가 이미 길드에 가입해 있음
GERR_GUILDISFULL, ///< 길드인원 제한 초과
GERR_GUILD_IS_IN_WAR, ///< 길드가 현재 전쟁중
GERR_INVITE_LIMIT, ///< 길드원 가입 제한 상태
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
*/
GuildJoinErrCode VerifyGuildJoinableCondition( const LPCHARACTER pchInvitee );
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
};

View File

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

View File

@ -177,7 +177,7 @@ protected:
protected:
void MapLocations(const char * c_pData);
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 PlayerDeleteFail(LPDESC d);
void PlayerLoad(LPDESC d, const char* data);
@ -272,10 +272,10 @@ protected:
void BlockException(TPacketBlockException * data);
// 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 p <EFBFBD><EFBFBD>Ŷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param d 아이템 가격정보 리스트를 요청한 플레이어의 descriptor
* @param p 패킷데이터의 포인터
*/
void MyshopPricelistRes( LPDESC d, const TPacketMyshopPricelistHeader* p );
// END_OF_MYSHOP_PRICE_LIST
@ -285,7 +285,7 @@ protected:
//END_RELOAD_ADMIN
void DetailLog(const TPacketNeedLoginLogInfo* info);
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>׽<EFBFBD>Ʈ
// 독일 선물 기능 테스트
void ItemAwardInformer(TPacketItemAwardInfromer* data);
void RespondChannelStatus(LPDESC desc, const char* pcData);

View File

@ -60,10 +60,10 @@ class CItem : public CEntity
bool SetCount(DWORD count);
DWORD GetCount();
// GetVnum<EFBFBD><EFBFBD> GetOriginalVnum<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> 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>.
// Masking <EFBFBD><EFBFBD><EFBFBD><EFBFBD> ori_to_new.txt<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ǵ<EFBFBD> <20><><EFBFBD>̴<EFBFBD>.
// 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>.
// GetVnum GetOriginalVnum에 대한 comment
// GetVnum Masking Vnum이다. 이를 사용함으로써, 아이템의 실제 Vnum 10이지만, Vnum 20인 것처럼 동작할 수 있는 것이다.
// Masking 값은 ori_to_new.txt에서 정의된 값이다.
// GetOriginalVnum은 아이템 고유의 Vnum으로, 로그 남길 때, 클라이언트에 아이템 정보 보낼 때, 저장할 때는 이 Vnum을 사용하여야 한다.
//
DWORD GetVnum() const { return m_dwMaskVnum ? m_dwMaskVnum : m_dwVnum; }
DWORD GetOriginalVnum() const { return m_dwVnum; }
@ -103,7 +103,7 @@ class CItem : public CEntity
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);
const int * GetSockets() { return &m_alSockets[0]; }
@ -146,7 +146,7 @@ class CItem : public CEntity
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 AlterToSocketItem(int iSocketCount);
@ -165,7 +165,7 @@ class CItem : public CEntity
void StopTimerBasedOnWearExpireEvent();
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 GetAttributeCount();
@ -180,7 +180,7 @@ class CItem : public CEntity
bool IsSameSpecialGroup(const LPITEM item) const;
// 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();
int GetAccessorySocketGrade();
@ -193,7 +193,7 @@ class CItem : public CEntity
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 SetAccessorySocketExpireEvent(LPEVENT pkEvent);
@ -227,7 +227,7 @@ class CItem : public CEntity
protected:
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:
bool IsRideItem();
@ -237,46 +237,46 @@ class CItem : public CEntity
bool IsNewMountItem();
#ifdef __AUCTION__
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 경매장
bool MoveToAuction ();
void CopyToRawData (TPlayerItem* item);
#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>
// <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>.
// <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>,
// <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 기반으로 되어있어
// 새로운 vnum을 죄다 서버에 새로 다 박아야하는 안타까운 상황에 맞닿았다.
// 그래서 새 vnum의 아이템이면, 서버에서 돌아갈 때는 오리지널 아이템 vnum으로 바꿔서 돌고 하고,
// 저장할 때에 본래 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; }
DWORD GetMaskVnum() { return m_dwMaskVnum; }
bool IsMaskedItem() { return m_dwMaskVnum != 0; }
// <EFBFBD><EFBFBD>ȥ<EFBFBD><EFBFBD>
// 용혼석
bool IsDragonSoul();
int GiveMoreTime_Per(float fPercent);
int GiveMoreTime_Fix(DWORD dwTime);
private:
TItemTable const * m_pProto; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ÿ<><C5B8>
TItemTable const * m_pProto; // 프로토 타잎
DWORD m_dwVnum;
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>
DWORD m_dwID; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȣ
bool m_bEquipped; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ǿ<EFBFBD><C7BE>°<EFBFBD>?
BYTE m_bWindow; // 현재 아이템이 위치한 윈도우
DWORD m_dwID; // 고유번호
bool m_bEquipped; // 장착 되었는가?
DWORD m_dwVID; // VID
WORD m_wCell; // <EFBFBD><EFBFBD>ġ
DWORD m_dwCount; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int m_lFlag; // <EFBFBD>߰<EFBFBD> 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
WORD m_wCell; // 위치
DWORD m_dwCount; // 개수
int m_lFlag; // 추가 flag
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];
LPEVENT m_pkDestroyEvent;

View File

@ -5,9 +5,9 @@
#include "pool.h"
#endif
// special_item_group.txt<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20>Ӽ<EFBFBD> <20>׷<EFBFBD>
// type attr<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>ִ<EFBFBD>.
// <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에서 정의하는 속성 그룹
// type attr로 선언할 수 있다.
// 이 속성 그룹을 이용할 수 있는 것은 special_item_group.txt에서 Special type으로 정의된 그룹에 속한 UNIQUE ITEM이다.
class CSpecialAttrGroup
{
public:
@ -43,10 +43,10 @@ class CSpecialItemGroup
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>.
// <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>.
// 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>.
// <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>.
// QUEST 타입은 퀘스트 스크립트에서 vnum.sig_use를 사용할 수 있는 그룹이다.
// 단, 이 그룹에 들어가기 위해서는 ITEM 자체의 TYPE QUEST여야 한다.
// SPECIAL 타입은 idx, item_vnum, attr_vnum을 입력한다. attr_vnum은 위에 CSpecialAttrGroup Vnum이다.
// 이 그룹에 들어있는 아이템은 같이 착용할 수 없다.
enum ESIGType { NORMAL, PCT, QUEST, SPECIAL };
struct CSpecialItemInfo
@ -79,9 +79,9 @@ class CSpecialItemGroup
return m_vecProbs.empty();
}
// Type Multi, <EFBFBD><EFBFBD> m_bType == PCT <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>,
// Ȯ<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>.
// Type Multi, m_bType == PCT 인 경우,
// 확률을 더해가지 않고, 독립적으로 계산하여 아이템을 생성한다.
// 따라서 여러 개의 아이템이 생성될 수 있다.
// by rtsummit
int GetMultiIndex(std::vector <int> &idx_vec) const
{
@ -143,8 +143,8 @@ class CSpecialItemGroup
return false;
}
// Group<EFBFBD><EFBFBD> Type<EFBFBD><EFBFBD> Special<EFBFBD><EFBFBD> <20><><EFBFBD>
// dwVnum<EFBFBD><EFBFBD> <20><>Ī<EFBFBD>Ǵ<EFBFBD> AttrVnum<EFBFBD><EFBFBD> return<EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
// Group Type Special인 경우에
// dwVnum에 매칭되는 AttrVnum return해준다.
DWORD GetAttrVnum(DWORD dwVnum) const
{
if (CSpecialItemGroup::SPECIAL != m_bType)
@ -354,18 +354,18 @@ class ITEM_MANAGER : public singleton<ITEM_MANAGER>
bool Initialize(TItemTable * table, int size);
void Destroy();
void Update(); // <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>θ<EFBFBD><CEB8><EFBFBD>.
void Update(); // 매 루프마다 부른다.
void GracefulShutdown();
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);
// 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>
// <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>.
// DelayedSave: 어떠한 루틴 내에서 저장을 해야 할 짓을 많이 하면 저장
// 쿼리가 너무 많아지므로 "저장을 한다" 라고 표시만 해두고 잠깐
// (: 1 frame) 후에 저장시킨다.
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);
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
void DestroyItem(LPITEM item, const char* file, size_t line);
#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 FindByVID(DWORD vid);
@ -397,7 +397,7 @@ class ITEM_MANAGER : public singleton<ITEM_MANAGER>
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);
@ -421,8 +421,8 @@ class ITEM_MANAGER : public singleton<ITEM_MANAGER>
std::map<DWORD, DWORD> m_map_ItemRefineFrom;
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>.
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>.
ITEM_VID_MAP m_VIDMap; ///< m_dwVIDCount 의 값단위로 아이템을 저장한다.
DWORD m_dwVIDCount; ///< 이녀석 VID가 아니라 그냥 프로세스 단위 유니크 번호다.
DWORD m_dwCurrentID;
TItemIDRangeTable m_ItemIDRange;
TItemIDRangeTable m_ItemIDSpareRange;
@ -443,15 +443,15 @@ class ITEM_MANAGER : public singleton<ITEM_MANAGER>
// END_OF_CHECK_UNIQUE_GROUP
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>
// <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>.
// <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>,
// <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>.
// <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을 죄다 서버에 새로 다 박아야하는 안타까운 상황에 맞닿았다.
// 그래서 새 vnum의 아이템이면, 서버에서 돌아갈 때는 오리지널 아이템 vnum으로 바꿔서 돌고 하고,
// 저장할 때에 본래 vnum으로 바꿔주도록 한다.
// 이를 위해 오리지널 vnum과 새로운 vnum을 연결시켜주는 맵을 만듦.
typedef std::map <DWORD, DWORD> TMapDW2DW;
TMapDW2DW m_map_new_to_ori;

View File

@ -22,10 +22,10 @@ class MessengerManager : public singleton<MessengerManager>
void RequestToAdd(LPCHARACTER ch, LPCHARACTER target);
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 __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 RemoveAllList(keyA account);

View File

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

View File

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

View File

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

View File

@ -24,19 +24,19 @@ class P2P_MANAGER : public singleton<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>.
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ǥ<><C7A5><EFBFBD>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>
// 아래 Register* Unregister* pair들은 내부적으로 사실 같은 루틴을 사용한다.
// 단지 명시적으로 표시하기 위한 것
void RegisterAcceptor(LPDESC d);
void UnregisterAcceptor(LPDESC d);
void RegisterConnector(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 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);

View File

@ -45,14 +45,14 @@ enum
HEADER_CG_ITEM_USE_TO_ITEM = 60,
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_SCRIPT_BUTTON = 66,
HEADER_CG_MESSENGER = 67,
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_CHECKOUT = 71, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> â<><C3A2><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>´<EFBFBD>.
HEADER_CG_SAFEBOX_CHECKIN = 70, // 아이템을 창고에 넣??는다.
HEADER_CG_SAFEBOX_CHECKOUT = 71, // 아이템을 창고로 부터 빼온다.
HEADER_CG_PARTY_INVITE = 72,
HEADER_CG_PARTY_INVITE_ANSWER = 73,
@ -93,10 +93,10 @@ enum
// HEADER_CG_ROULETTE = 200,
// 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>.
//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>..
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD> packet generator<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٶ<EFBFBD><D9B6><EFBFBD><EFBFBD><EFBFBD> <20>ʴ´<CAB4>. <20>̷<EFBFBD> <20><>XX
//<EFBFBD>̷<EFBFBD><EFBFBD>ٰ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD> å<><C3A5><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD>???
//NOTE : 이런 개XXX 정말 이거 Packet설계한 사람은 누구냐. 이렇게 코딩하고 밥이 넘어가나.
//enum을 별도로 구별을 하던가. 아님 namepsace로 구별을 하던가..
//정말 packet generator까지는 바라지도 않는다. 이런 씨XX
//이러다가 숫자 겹치면 누가 책임지는데???
HEADER_CG_DRAGON_SOUL_REFINE = 205,
HEADER_CG_STATE_CHECKER = 206,
@ -286,7 +286,7 @@ enum
HEADER_GG_NOTICE = 4,
HEADER_GG_SHUTDOWN = 5,
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_SETUP = 9,
HEADER_GG_MESSENGER_ADD = 10,
@ -454,8 +454,8 @@ typedef struct SPacketGGMessengerMobile
typedef struct SPacketGGFindPosition
{
BYTE header;
DWORD dwFromPID; // <EFBFBD><EFBFBD> <20><>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD><EFBFBD>Ϸ<EFBFBD><CFB7><EFBFBD> <20><><EFBFBD><EFBFBD>
DWORD dwTargetPID; // ã<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
DWORD dwFromPID; // 저 위치로 워프하려는 사람
DWORD dwTargetPID; // 찾는 사람
} TPacketGGFindPosition;
typedef struct SPacketGGWarpCharacter
@ -496,14 +496,14 @@ typedef struct SPacketGGBlockChat
LONG lBlockDuration;
} TPacketGGBlockChat;
/* Ŭ<EFBFBD><EFBFBD><EFBFBD>̾<EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ŷ */
/* 클라이언트 측에서 보내는 패킷 */
typedef struct command_text
{
BYTE bHeader;
} TPacketCGText;
/* <EFBFBD>α<EFBFBD><EFBFBD><EFBFBD> (1) */
/* 로그인 (1) */
typedef struct command_handshake
{
BYTE bHeader;
@ -587,7 +587,7 @@ typedef struct command_player_create_success
TSimplePlayer player;
} TPacketGCPlayerCreateSuccess;
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 공격
typedef struct command_attack
{
BYTE bHeader;
@ -609,7 +609,7 @@ enum EMoveFuncType
FUNC_SKILL = 0x80,
};
// <EFBFBD>̵<EFBFBD>
// 이동
typedef struct command_move
{
BYTE bHeader;
@ -628,22 +628,22 @@ typedef struct command_sync_position_element
LONG lY;
} TPacketCGSyncPositionElement;
// <EFBFBD><EFBFBD>ġ <20><><EFBFBD><EFBFBD>ȭ
typedef struct command_sync_position // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ŷ
// 위치 동기화
typedef struct command_sync_position // 가변 패킷
{
BYTE bHeader;
WORD wSize;
} TPacketCGSyncPosition;
/* ä<EFBFBD><EFBFBD> (3) */
typedef struct command_chat // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ŷ
/* 채팅 (3) */
typedef struct command_chat // 가변 패킷
{
BYTE header;
WORD size;
BYTE type;
} TPacketCGChat;
/* <EFBFBD>ӼӸ<EFBFBD> */
/* 귓속말 */
typedef struct command_whisper
{
BYTE bHeader;
@ -803,7 +803,7 @@ typedef struct command_quest_confirm
} TPacketCGQuestConfirm;
/*
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ŷ
* 서버 측에서 보내는 패킷
*/
typedef struct packet_quest_confirm
{
@ -919,7 +919,7 @@ typedef struct packet_add_char
BYTE bAttackSpeed;
BYTE bStateFlag;
DWORD dwAffectFlag[2]; // ȿ<EFBFBD><EFBFBD>
DWORD dwAffectFlag[2]; // 효과
} TPacketGCCharacterAdd;
typedef struct packet_char_additional_info
@ -981,7 +981,7 @@ typedef struct packet_del_char
DWORD id;
} TPacketGCCharacterDelete;
typedef struct packet_chat // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ŷ
typedef struct packet_chat // 가변 패킷
{
BYTE header;
WORD size;
@ -990,7 +990,7 @@ typedef struct packet_chat //
BYTE bEmpire;
} TPacketGCChat;
typedef struct packet_whisper // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ŷ
typedef struct packet_whisper // 가변 패킷
{
BYTE bHeader;
WORD wSize;
@ -1214,7 +1214,7 @@ typedef struct packet_shop_start
struct packet_shop_item items[SHOP_HOST_ITEM_MAX_NUM];
} 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
{
@ -1237,7 +1237,7 @@ typedef struct packet_shop_update_price
INT iPrice;
} TPacketGCShopUpdatePrice;
typedef struct packet_shop // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ŷ
typedef struct packet_shop // 가변 패킷
{
BYTE header;
WORD size;
@ -1317,7 +1317,7 @@ typedef struct packet_move
DWORD dwDuration;
} TPacketGCMove;
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 소유권
typedef struct packet_ownership
{
BYTE bHeader;
@ -1325,7 +1325,7 @@ typedef struct packet_ownership
DWORD dwVictimVID;
} TPacketGCOwnership;
// <EFBFBD><EFBFBD>ġ <20><><EFBFBD><EFBFBD>ȭ <20><>Ŷ<EFBFBD><C5B6> bCount <20><>ŭ <20>ٴ<EFBFBD> <20><><EFBFBD><EFBFBD>
// 위치 동기화 패킷의 bCount 만큼 붙는 단위
typedef struct packet_sync_position_element
{
DWORD dwVID;
@ -1333,11 +1333,11 @@ typedef struct packet_sync_position_element
LONG lY;
} TPacketGCSyncPositionElement;
// <EFBFBD><EFBFBD>ġ <20><><EFBFBD><EFBFBD>ȭ
typedef struct packet_sync_position // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ŷ
// 위치 동기화
typedef struct packet_sync_position // 가변 패킷
{
BYTE bHeader;
WORD wSize; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> = (wSize - sizeof(TPacketGCSyncPosition)) / sizeof(TPacketGCSyncPositionElement)
WORD wSize; // 개수 = (wSize - sizeof(TPacketGCSyncPosition)) / sizeof(TPacketGCSyncPositionElement)
} TPacketGCSyncPosition;
typedef struct packet_fly
@ -1372,7 +1372,7 @@ typedef struct packet_shoot
typedef struct packet_duel_start
{
BYTE header;
WORD wSize; // DWORD<EFBFBD><EFBFBD> <20>? <20><><EFBFBD><EFBFBD> = (wSize - sizeof(TPacketGCPVPList)) / 4
WORD wSize; // DWORD가 몇개? 개수 = (wSize - sizeof(TPacketGCPVPList)) / 4
} TPacketGCDuelStart;
enum EPVPModes
@ -1388,7 +1388,7 @@ typedef struct packet_pvp
BYTE bHeader;
DWORD dwVIDSrc;
DWORD dwVIDDst;
BYTE bMode; // 0 <EFBFBD≯<EFBFBD> <20><>, 1<≯<EFBFBD> <20><>
BYTE bMode; // 0 이면 끔, 1이면 켬
} TPacketGCPVP;
typedef struct command_use_skill
@ -1785,7 +1785,7 @@ typedef struct packet_mark_idxlist
BYTE header;
DWORD bufSize;
WORD count;
//<EFBFBD>ڿ<EFBFBD> size * (WORD + WORD)<EFBFBD><EFBFBD>ŭ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
//뒤에 size * (WORD + WORD)만큼 데이터 붙음
} TPacketGCMarkIDXList;
typedef struct packet_mark_block
@ -1794,7 +1794,7 @@ typedef struct packet_mark_block
DWORD bufSize;
BYTE imgIdx;
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;
typedef struct command_symbol_upload
@ -1933,8 +1933,8 @@ typedef struct SPacketGCRefineInformaion
DWORD src_vnum;
DWORD result_vnum;
BYTE material_count;
INT cost; // <EFBFBD>ҿ<EFBFBD> <20><><EFBFBD><EFBFBD>
INT prob; // Ȯ<EFBFBD><EFBFBD>
INT cost; // 소요 비용
INT prob; // 확률
TRefineMaterial materials[REFINE_MATERIAL_MAX_NUM];
} TPacketGCRefineInformation;
@ -2149,13 +2149,13 @@ typedef struct SPacketGCPanamaPack
BYTE abIV[32];
} 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
{
SPacketGCHybridCryptKeys() : m_pStream(NULL) {}
~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 )
{
delete[] m_pStream;
@ -2188,7 +2188,7 @@ typedef struct SPacketGCHybridCryptKeys
}
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;
BYTE* pDataKeyStream;
@ -2236,7 +2236,7 @@ typedef struct SPacketGCPackageSDB
}
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;
BYTE* m_pDataSDBStream;
@ -2254,7 +2254,7 @@ typedef struct SPacketGCSpecificEffect
char effect_file[MAX_EFFECT_FILE_NAME];
} TPacketGCSpecificEffect;
// <EFBFBD><EFBFBD>ȥ<EFBFBD><EFBFBD>
// 용혼석
enum EDragonSoulRefineWindowRefineType
{
DragonSoulRefineWindow_UPGRADE,

View File

@ -5,7 +5,7 @@
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_SHORT = 30,
PARTY_MAX_MEMBER = 8,
@ -69,12 +69,12 @@ class CPartyManager : public singleton<CPartyManager>
void P2PQuitParty(DWORD pid);
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_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_pkParty; // PID로 어느 파티에 있나 검색하기 위한 컨테이너
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
@ -246,9 +246,9 @@ class CParty
TFlagMap m_map_iFlag;
LPDUNGEON m_pkDungeon;
// <EFBFBD>Ʊ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> dungeon <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
// <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>
// <EFBFBD>װ<EFBFBD> <20><>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̷<EFBFBD><CCB7><EFBFBD> <20>ӽ÷<D3BD> <20>س<EFBFBD><D8B3>´<EFBFBD>.
// 아귀 동굴용 dungeon 멤버 변수.
// 정말 이렇게까지 하고 싶진 않았는데, 던전에서 party 관리가 정말로 개판이라
// 그거 고치기 전까지는 이렇게 임시로 해놓는다.
LPDUNGEON m_pkDungeon_for_Only_party;
public:
void SetDungeon_for_Only_party(LPDUNGEON pDungeon);

View File

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

View File

@ -3,8 +3,8 @@
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>.
// CPVPManager<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̷<EFBFBD><CCB7><EFBFBD> <20><><EFBFBD><EFBFBD> CRC<52><43> <20><><EFBFBD><EFBFBD> <20>˻<EFBFBD><CBBB>Ѵ<EFBFBD>.
// CPVP에는 DWORD 아이디 두개를 받아서 m_dwCRC를 만들어서 가지고 있는다.
// CPVPManager에서 이렇게 만든 CRC를 통해 검색한다.
class CPVP
{
public:
@ -26,8 +26,8 @@ class CPVP
CPVP(CPVP & v);
~CPVP();
void Win(DWORD dwPID); // dwPID<EFBFBD><EFBFBD> <20>̰<EFBFBD><CCB0><EFBFBD>!
bool CanRevenge(DWORD dwPID); // dwPID<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>־<EFBFBD>?
void Win(DWORD dwPID); // dwPID가 이겼다!
bool CanRevenge(DWORD dwPID); // dwPID가 복수할 수 있어?
bool IsFight();
bool Agree(DWORD dwPID);
@ -57,7 +57,7 @@ class CPVPManager : public singleton<CPVPManager>
void Insert(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 Connect(LPCHARACTER pkChr);
void Disconnect(LPCHARACTER pkChr);

View File

@ -56,7 +56,7 @@ namespace quest
bool RunState(QuestState& qs);
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();
const string & GetCurrentQuestName();
@ -106,7 +106,7 @@ namespace quest
void Letter(DWORD pc);
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);
// 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:
void BeginOtherPCBlock(DWORD pid);
void EndOtherPCBlock();

View File

@ -21,13 +21,13 @@ namespace quest
class NPC
{
public:
// <EFBFBD><EFBFBD><EFBFBD>ڰ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ũ<EFBFBD><C5A9>Ʈ<EFBFBD><C6AE>
// 인자가 없는 스크립트들
// first: state number
typedef map<int, AStateScriptType> AQuestScriptType;
// first: quest number
typedef map<unsigned int, AQuestScriptType> QuestMapType;
// <EFBFBD><EFBFBD><EFBFBD>ڰ<EFBFBD> <20>ִ<EFBFBD> <20><>ũ<EFBFBD><C5A9>Ʈ<EFBFBD><C6AE>
// 인자가 있는 스크립트들
// first: state number
typedef map<int, vector<AArgScript> > AArgQuestScriptType;
// first: quest number
@ -69,7 +69,7 @@ namespace quest
bool OnChat(PC& pc);
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 OnUnmount(PC& pc);

View File

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

View File

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

View File

@ -132,7 +132,7 @@ class SECTREE
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) )
return;
}
@ -143,7 +143,7 @@ class SECTREE
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++) )
return true;
}
@ -176,9 +176,9 @@ class SECTREE
DWORD GetAttribute(int x, int y);
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 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 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] lStartX <EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ǥ
* @param [in] lStartY <EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ǥ
* @param [in] lEndX <EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ǥ
* @param [in] lEndY <EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ʒ<EFBFBD><C6B7><EFBFBD> <20><>ǥ
* @param [in] lRotate <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ȸ<><C8B8><EFBFBD><EFBFBD> <20><>
* @param [in] dwAttr <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Attribute
* @param [in] mode Attribute <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD> type
* @param [in] lMapIndex 적용할 Map index
* @param [in] lStartX 사각형 영역의 가장 왼쪽 좌표
* @param [in] lStartY 사각형 영역의 가장 위쪽 좌표
* @param [in] lEndX 사각형 영역의 가장 오른쪽 좌표
* @param [in] lEndY 사각형 영역의 가장 아랫쪽 좌표
* @param [in] lRotate 영역에 대해 회전할 각
* @param [in] dwAttr 적용할 Attribute
* @param [in] mode Attribute 에 대해 처리할 type
*/
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:
/// <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] lCX <EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Cell <20><> <20><>ǥ
* @param [in] lCY <EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Cell <20><> <20><>ǥ
* @param [in] lCW <EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Cell <20><><EFBFBD><EFBFBD> <20><>
* @param [in] lCH <EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Cell <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
* @param [in] lRotate ȸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>(<28><><EFBFBD><EFBFBD>)
* @param [in] dwAttr <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Attribute
* @param [in] mode Attribute <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD> type
* @param [in] lMapIndex 적용할 Map index
* @param [in] lCX 사각형 영역의 가장 왼쪽 Cell 의 좌표
* @param [in] lCY 사각형 영역의 가장 위쪽 Cell 의 좌표
* @param [in] lCW 사각형 영역의 Cell 단위 폭
* @param [in] lCH 사각형 영역의 Cell 단위 높이
* @param [in] lRotate 회전할 각(직각)
* @param [in] dwAttr 적용할 Attribute
* @param [in] mode Attribute 에 대해 처리할 type
*/
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] lCX <EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Cell <20><> <20><>ǥ
* @param [in] lCY <EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Cell <20><> <20><>ǥ
* @param [in] lCW <EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Cell <20><><EFBFBD><EFBFBD> <20><>
* @param [in] lCH <EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Cell <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
* @param [in] lRotate ȸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>(<28><><EFBFBD><EFBFBD> <20>̿<EFBFBD><CCBF><EFBFBD> <20><>)
* @param [in] dwAttr <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Attribute
* @param [in] mode Attribute <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD> type
* @param [in] lMapIndex 적용할 Map index
* @param [in] lCX 사각형 영역의 가장 왼쪽 Cell 의 좌표
* @param [in] lCY 사각형 영역의 가장 위쪽 Cell 의 좌표
* @param [in] lCW 사각형 영역의 Cell 단위 폭
* @param [in] lCH 사각형 영역의 Cell 단위 높이
* @param [in] lRotate 회전할 각(직각 이외의 각)
* @param [in] dwAttr 적용할 Attribute
* @param [in] mode Attribute 에 대해 처리할 type
*/
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] lCX <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Cell <EFBFBD><EFBFBD> X <EFBFBD><EFBFBD>ǥ
* @param [in] lCY <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Cell <EFBFBD><EFBFBD> Y <EFBFBD><EFBFBD>ǥ
* @param [in] dwAttr <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Attribute
* @param [in] mode Attribute <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD> type
* @param [in] lMapIndex 적용할 Map index
* @param [in] lCX 적용할 Cell X 좌표
* @param [in] lCY 적용할 Cell Y 좌표
* @param [in] dwAttr 적용할 Attribute
* @param [in] mode Attribute 에 대해 처리할 type
*/
bool ForAttrRegionCell( int lMapIndex, int lCX, int lCY, DWORD dwAttr, EAttrRegionMode mode );

View File

@ -14,12 +14,12 @@ class CShop
public:
typedef struct shop_item
{
DWORD vnum; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȣ
int price; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
BYTE count; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
DWORD vnum; // 아이템 번호
int price; // 가격
BYTE count; // 아이템 개수
LPITEM pkItem;
int itemid; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̵<EFBFBD>
int itemid; // 아이템 고유아이디
shop_item()
{
@ -40,20 +40,20 @@ class CShop
virtual void SetPCShop(LPCHARACTER ch);
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);
void RemoveGuest(LPCHARACTER ch);
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
// 물건 구입
virtual int Buy(LPCHARACTER ch, BYTE pos);
// <EFBFBD>Խ<EFBFBD>Ʈ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ŷ<EFBFBD><C5B6> <20><><EFBFBD><EFBFBD>
// 게스트에게 패킷을 보냄
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);
// <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);
DWORD GetVnum() { return m_dwVnum; }
@ -70,7 +70,7 @@ class CShop
typedef std::unordered_map<LPCHARACTER, bool> GuestMapType;
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;
};

View File

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

View File

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

View File

@ -8,7 +8,7 @@ class CTableBySkill : public singleton<CTableBySkill>
CTableBySkill()
: 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 )
m_aiSkillPowerByLevelFromType[job] = NULL;
}
@ -18,18 +18,18 @@ class CTableBySkill : public singleton<CTableBySkill>
DeleteAll();
}
//<EFBFBD><EFBFBD><EFBFBD>̺<EFBFBD> <20><><EFBFBD><EFBFBD> üũ
//테이블 세팅 체크
bool Check() const;
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//삭제
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;
void SetSkillPowerByLevelFromType( int idx, const int* aTable );
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;
void SetSkillDamageByLevelTable( const int* aTable );
void DeleteSkillDamageByLevelTable();

View File

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

View File

@ -40,13 +40,13 @@ enum
ITEM_GIVE_STAT_RESET_COUNT_VNUM = 70014,
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_SAFEBOX_EXPAND = 71009, // â<EFBFBD><EFBFBD>Ȯ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
UNIQUE_ITEM_AUTOLOOT_GOLD = 71010, // <EFBFBD><EFBFBD>3<EFBFBD><EFBFBD> <20><>
UNIQUE_ITEM_EMOTION_MASK = 71011, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
UNIQUE_ITEM_EMOTION_MASK2 = 71033, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
UNIQUE_ITEM_FISH_MIND = 71008, // 월간어심
UNIQUE_ITEM_SAFEBOX_EXPAND = 71009, // 창고확장권
UNIQUE_ITEM_AUTOLOOT_GOLD = 71010, // 제3의 손
UNIQUE_ITEM_EMOTION_MASK = 71011, // 열정의 가면
UNIQUE_ITEM_EMOTION_MASK2 = 71033, // 열정의 가면
ITEM_NEW_YEAR_GREETING_VNUM = 50023,
@ -106,11 +106,11 @@ enum
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,
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 용심 추출해주는 아이템
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,
};

View File

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

View File

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