forked from metin2/server
1
0
Fork 0

fix game header encoding

This commit is contained in:
sdgmt2 2024-04-01 12:39:34 +02:00
parent 0101618d89
commit 82317e6c4d
No known key found for this signature in database
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로
// fixme : titempos로
WORD GetBasePosition(const LPITEM pItem) const;
bool IsValidCellForThisItem(const LPITEM pItem, const TItemPos& Cell) const;
int GetDuration(const LPITEM pItem) const;
// 용혼석을 받아서 특정 용심을 추출하는 함수
// 용혼석을 받아서 특정 용심을 추출하는 함수
bool ExtractDragonHeart(LPCHARACTER ch, LPITEM pItem, LPITEM pExtractor = NULL);
// 특정 용혼석(pItem)을 장비창에서 제거할 때에 성공 여부를 결정하고,
// 실패시 부산물을 주는 함수.(부산물은 dragon_soul_table.txt에 정의)
// DestCell에 invalid한 값을 넣으면 성공 시, 용혼석을 빈 공간에 자동 추가.
// 실패 시, 용혼석(pItem)은 delete됨.
// 추출아이템이 있다면 추출 성공 확률이 pExtractor->GetValue(0)%만큼 증가함.
// 부산물은 언제나 자동 추가.
// 특정 용혼석(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);
// 용혼석 업그레이드 함수
// 용혼석 업그레이드 함수
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);
// 캐릭터의 용혼석 덱을 살펴보고, 활성화 된 용혼석이 없다면, 캐릭터의 용혼석 활성 상태를 off 시키는 함수.
// 캐릭터의 용혼석 덱을 살펴보고, 활성화 된 용혼석이 없다면, 캐릭터의 용혼석 활성 상태를 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]; // 실제 이미지
Pixel m_apxBuf[SIZE]; // 실제 이미지
///////////////////////////////////////////////////////////////////////////////
void Clear();
@ -38,11 +38,11 @@ struct SGuildMarkBlock
};
///////////////////////////////////////////////////////////////////////////////
Pixel m_apxBuf[SIZE]; // 실제 이미지
Pixel m_apxBuf[SIZE]; // 실제 이미지
BYTE m_abCompBuf[MAX_COMP_SIZE]; // 압축된 데이터
lzo_uint m_sizeCompBuf; // 압축된 크기
DWORD m_crc; // 압축된 데이터의 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); // 서버 -> 클라이언트
bool SaveBlockFromCompressedData(DWORD posBlock, const BYTE * pbComp, DWORD dwCompSize); // 서버 -> 클라이언트
DWORD GetEmptyPosition(); // 빈 마크 위치를 얻는다.
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(); // 마크 인덱스 불러오기 (서버에서만 사용)
bool SaveMarkIndex(); // 마크 인덱스 저장하기
bool LoadMarkIndex(); // 마크 인덱스 불러오기 (서버에서만 사용)
bool SaveMarkIndex(); // 마크 인덱스 저장하기
void LoadMarkImages(); // 모든 마크 이미지를 불러오기
void SaveMarkImage(DWORD imgIdx); // 마크 이미지 저장
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이벤트가 완전히 끝난 상태
OXEVENT_OPEN = 1, // OX이벤트가 시작됨. 을두지(20012)를 통해서 입장가능
OXEVENT_CLOSE = 2, // OX이벤트의 참가가 끝남. 을두지(20012)를 통한 입장이 차단됨
OXEVENT_QUIZ = 3, // 퀴즈를 출제함.
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: 펫으로서의 능력치? 라던가 친밀도, 배고픔 기타등등... 수치
// TODO: 펫으로서의 능력치? 라던가 친밀도, 배고픔 기타등등... 수치
struct SPetAbility
{
};
@ -34,8 +34,8 @@ protected:
virtual bool Update(DWORD deltaTime);
protected:
virtual bool _UpdateFollowAI(); ///< 주인을 따라다니는 AI 처리
virtual bool _UpdatAloneActionAI(float fMinDist, float fMaxDist); ///< 주인 근처에서 혼자 노는 AI 처리
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; }
// 버프 주는 함수와 거두는 함수.
// 이게 좀 괴랄한게, 서버가 ㅄ라서,
// POINT_MOV_SPEED, POINT_ATT_SPEED, POINT_CAST_SPEED는 PointChange()란 함수만 써서 변경해 봐야 소용이 없는게,
// PointChange() 이후에 어디선가 ComputePoints()를 하면 싹다 초기화되고,
// 더 웃긴건, ComputePoints()를 부르지 않으면 클라의 POINT는 전혀 변하지 않는다는 거다.
// 그래서 버프를 주는 것은 ComputePoints() 내부에서 petsystem->RefreshBuff()를 부르도록 하였고,
// 버프를 빼는 것은 ClearBuff()를 부르고, ComputePoints를 하는 것으로 한다.
// 버프 주는 함수와 거두는 함수.
// 이게 좀 괴랄한게, 서버가 ㅄ라서,
// 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; // 능력치
// SPetAbility m_petAbility; // 능력치
};
/**
@ -95,7 +95,7 @@ private:
class CPetSystem
{
public:
typedef std::unordered_map<DWORD, CPetActor*> TPetActorMap; /// <VNUM, PetActor> map. (한 캐릭터가 같은 vnum의 펫을 여러개 가질 일이 있을까..??)
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; ///< 현재 소환된(실체화 된 캐릭터가 있는) 펫의 개수
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: 진짜 펫 시스템이 들어갈 때 구현. (캐릭터가 보유한 펫의 정보를 추가할 때 라던가...)
// 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; ///< 펫 시스템의 Owner
DWORD m_dwUpdatePeriod; ///< 업데이트 주기 (ms단위)
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 에 있는 것을 복붙 하였다
#define EMPIRE_NONE 0 // 아무국가 아님
#define EMPIRE_RED 1 // 신수
#define EMPIRE_YELLOW 2 // 천조
#define EMPIRE_BLUE 3 // 진노
// 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 profiler.
* @brief Network I/O traffic profiler.
* @author Bang2ni
* @version 05/07/07 Bang2ni - First release.
*
* Network I/O traffic , Text file .
* Network I/O traffic , Text file .
*/
class TrafficProfiler : public singleton< TrafficProfiler >
{
public:
/// I/O 방향
/// I/O 방향
enum IODirection {
IODIR_INPUT = 0, ///< Input
IODIR_OUTPUT, ///< Output
@ -37,25 +37,25 @@ class TrafficProfiler : public singleton< TrafficProfiler >
/// Destructor
~TrafficProfiler( void );
/// Profiling 에 필요한 초기화를 한다.
/// Profiling 에 필요한 초기화를 한다.
/**
* @param [in] dwFlushCycle Flush . .
* @param [in] pszLogFileName Profiling log file
* @return false profiling log file open .
* @param [in] dwFlushCycle Flush . .
* @param [in] pszLogFileName Profiling log file
* @return false profiling log file open .
*
* profiling log file open() .
* profiling log file open() .
*/
bool Initialize( DWORD dwFlushCycle, const char* pszLogFileName );
/// Profiling 을 위해 전송됐거나 전송 할 Packet 을 Report 한다.
/// Profiling 을 위해 전송됐거나 전송 할 Packet 을 Report 한다.
/**
* @param [in] dir Profiling Packet
* @param [in] byHeader Packet
* @param [in] dwSize Packet size
* @return Initialize false .
* @param [in] dir Profiling Packet
* @param [in] byHeader Packet
* @param [in] dwSize Packet size
* @return Initialize false .
*
* Packet size .
* Initialize Flush Flush Report Flush .
* 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;
}
/// 현재까지 Report 된 내용을 파일에 쓴다.
/// 현재까지 Report 된 내용을 파일에 쓴다.
/**
* @return Initialize .
* @return Initialize .
*/
bool Flush( void );
private:
/// Profling 에 관련된 variables 를 초기화 한다.
/// Profling 에 관련된 variables 를 초기화 한다.
void InitializeProfiling( void );
/// Report 된 Packet 의 traffic 를 계산한다.
/// Report 된 Packet 의 traffic 를 계산한다.
/**
* @param [in] dir Profiling Packet
* @param [in] byHeader Packet
* @param [in] dwSize Packet 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: size
* second: packet
* 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 주기
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 를 가진다.
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, // 경험의 반지
AFFECT_ITEM_BONUS = 501, // 도둑의 장갑
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, // 원앙의 깃털
AFFECT_GOLD_BONUS = 506, // 돈 드롭확률 50%증가
AFFECT_MARRIAGE_FAST = 505, // 원앙의 깃털
AFFECT_GOLD_BONUS = 506, // 돈 드롭확률 50%증가
AFFECT_PREMIUM_END = 509,
AFFECT_MALL = 510, // 몰 아이템 에펙트
AFFECT_NO_DEATH_PENALTY = 511, // 용신의 가호 (경험치가 패널티를 한번 막아준다)
AFFECT_SKILL_BOOK_BONUS = 512, // 선인의 교훈 (책 수련 성공 확률이 50% 증가)
AFFECT_SKILL_NO_BOOK_DELAY = 513, // 주안술서
AFFECT_MALL = 510, // 몰 아이템 에펙트
AFFECT_NO_DEATH_PENALTY = 511, // 용신의 가호 (경험치가 패널티를 한번 막아준다)
AFFECT_SKILL_BOOK_BONUS = 512, // 선인의 교훈 (책 수련 성공 확률이 50% 증가)
AFFECT_SKILL_NO_BOOK_DELAY = 513, // 주안술서
AFFECT_HAIR = 514, // 헤어 효과
AFFECT_COLLECT = 515, //수집퀘스트
AFFECT_EXP_BONUS_EURO_FREE = 516, // 경험의 반지 (유럽 버전 14 레벨 이하 기본 효과)
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, // 던전에서 준비 상태
AFF_DUNGEON_UNIQUE, // 던전 유니크 (클라이언트에서 컬링되지않음)
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, // 전귀혼
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_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, // 헤어
AFF_GERMANY, // 독일
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가 무한대로 들어가 있어야 할 경우 사용.
// 시간을 계속 줄이기 때문에 매우 큰값으로 무한대를 에뮬레이션함.
//// 24비트는 적으므로 25비트를 사용.
// ... 25비트 사용한다고 해놓고선 29bit 사용하고 있는 엄청난 주석이란...
// collect quest에서 무한 시간을 60년으로 사용하고 있으므로, 여기도 60년으로 하자.
// 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을 위한 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]);
// 나의 경매장을 위한 함수.
// 나의 경매장을 위한 함수.
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가 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);
// 이미 있으면 덮어 씌운다.
// 이미 있으면 덮어 씌운다.
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에 등록된 정보 중 가격, 등등 아이템 테이블에 포함되지 않는 정보들을 관리하는 것들
// auction에 등록된 정보 중 가격, 등등 아이템 테이블에 포함되지 않는 정보들을 관리하는 것들
AuctionBoard Auction;
SaleBoard Sale;
WishBoard Wish;

View File

@ -3,7 +3,7 @@
#include "char.h"
enum EBattleTypes // 상대방 기준
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);
// 특성 공격
// 특성 공격
inline void AttackAffect(LPCHARACTER pkAttacker,
LPCHARACTER pkVictim,
BYTE att_point,

View File

@ -13,7 +13,7 @@ public:
{
static TGradeUnit beltGradeByLevelTable[] =
{
0, // 벨트+0
0, // 벨트+0
1, // +1
1, // +2
2, // +3
@ -34,20 +34,20 @@ public:
return beltGradeByLevelTable[level];
}
// 현재 벨트 레벨을 기준으로, 어떤 셀들을 이용할 수 있는지 리턴
// 현재 벨트 레벨을 기준으로, 어떤 셀들을 이용할 수 있는지 리턴
static const TGradeUnit* GetAvailableRuleTableByGrade()
{
/**
+0 ~ +9 , 7 .
. >= .
(, 0 , )
+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)
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*/)
{
// 기획 또 바뀜.. 아놔...
// 기획 또 바뀜.. 아놔...
//const TGradeUnit beltGrade = GetBeltGradeByRefineLevel(beltLevel);
const TGradeUnit* ruleTable = GetAvailableRuleTableByGrade();
return ruleTable[cell] <= beltGrade;
}
/// pc의 벨트 인벤토리에 아이템이 하나라도 존재하는 지 검사하는 함수.
/// 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이 벨트 인벤토리에 들어갈 수 있는 타입인지 검사하는 함수. (이 규칙은 기획자가 결정함)
/// 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();
// 장착 중 이면서, m_p_vec_buff_wear_targets에 해당하는 아이템인 경우, 해당 아이템으로 인해 붙은 효과를 제거.
// 장착 중 이면서, m_p_vec_buff_wear_targets에 해당하는 아이템인 경우, 해당 아이템으로 인해 붙은 효과를 제거.
void RemoveBuffFromItem(LPITEM pItem);
// m_p_vec_buff_wear_targets에 해당하는 아이템인 경우, 해당 아이템의 attribute에 대한 효과 추가.
// m_p_vec_buff_wear_targets에 해당하는 아이템인 경우, 해당 아이템의 attribute에 대한 효과 추가.
void AddBuffFromItem(LPITEM pItem);
// m_bBuffValue를 바꾸고, 버프의 값도 바꿈.
// m_bBuffValue를 바꾸고, 버프의 값도 바꿈.
void ChangeBuffValue(BYTE bNewValue);
// CHRACTRE::ComputePoints에서 속성치를 초기화하고 다시 계산하므로,
// 버프 속성치들을 강제적으로 owner에게 줌.
// CHRACTRE::ComputePoints에서 속성치를 초기화하고 다시 계산하므로,
// 버프 속성치들을 강제적으로 owner에게 줌.
void GiveAllAttributes();
// m_p_vec_buff_wear_targets에 해당하는 모든 아이템의 attribute를 type별로 합산하고,
// 그 attribute들의 (m_bBuffValue)% 만큼을 버프로 줌.
// m_p_vec_buff_wear_targets에 해당하는 모든 아이템의 attribute를 type별로 합산하고,
// 그 attribute들의 (m_bBuffValue)% 만큼을 버프로 줌.
bool On(BYTE bValue);
// 버프 제거 후, 초기화
// 버프 제거 후, 초기화
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 페어의 맵
// apply_type, apply_value 페어의 맵
typedef std::map <BYTE, int> TMapAttr;
// m_p_vec_buff_wear_targets에 해당하는 모든 아이템의 attribute를 type별로 합산하여 가지고 있음.
// 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 // 경비병 배치 구역
#define MAX_CASTLE_GUARD_PER_REGION 10 // 한지역에 배치할수있는 경비병그룹
#define MAX_CASTLE_FROG 20 // 황금 두꺼비
#define MAX_CASTLE_TOWER 10 // 봉화 최대 소환 개수
#define MIN_CASTLE_TOWER 5 // 봉화 최소 소환 개수
#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 // 황금두꺼비 가격 (1억)
#define CASTLE_FROG_VNUM 11505 // 황금두꺼비 번호
//#define CASTLE_TOWER_VNUM 11506 // 봉화 번호
#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, // 평화모드
CASTLE_SIEGE_STRUGGLE, // 공성중
CASTLE_SIEGE_END // 수성에 성공했다면 1시간동안 봉화를 깰 수 있다.
CASTLE_SIEGE_NONE, // 평화모드
CASTLE_SIEGE_STRUGGLE, // 공성중
CASTLE_SIEGE_END // 수성에 성공했다면 1시간동안 봉화를 깰 수 있다.
};
struct CASTLE_DATA
{
LPCHARACTER frog[MAX_CASTLE_FROG]; // 황금두꺼비
LPCHARACTER frog[MAX_CASTLE_FROG]; // 황금두꺼비
LPCHARACTER guard[MAX_CASTLE_GUARD_REGION][MAX_CASTLE_GUARD_PER_REGION]; // 경비병 리더
DWORD guard_group[MAX_CASTLE_GUARD_REGION][MAX_CASTLE_GUARD_PER_REGION]; // 경비병 리더
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]; // 봉화
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,
//스킬
//스킬
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 스테미너
POINT_MAX_STAMINA, // 10 최대 스테미너
POINT_STAMINA, // 9 스테미너
POINT_MAX_STAMINA, // 10 최대 스테미너
POINT_GOLD, // 11
POINT_ST, // 12 근력
POINT_HT, // 13 체력
POINT_DX, // 14 민첩성
POINT_IQ, // 15 정신력
POINT_ST, // 12 근력
POINT_HT, // 13 체력
POINT_DX, // 14 민첩성
POINT_IQ, // 15 정신력
POINT_DEF_GRADE, // 16 ...
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_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 활 사정거리 증가치 (meter)
POINT_BOW_DISTANCE, // 34 활 사정거리 증가치 (meter)
POINT_HP_RECOVERY, // 35 체력 회복 증가량
POINT_SP_RECOVERY, // 36 정신력 회복 증가량
POINT_HP_RECOVERY, // 35 체력 회복 증가량
POINT_SP_RECOVERY, // 36 정신력 회복 증가량
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_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 인간에게 강함
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_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 무사에게 저항
POINT_RESIST_ASSASSIN, // 60 자객에게 저항
POINT_RESIST_SURA, // 61 수라에게 저항
POINT_RESIST_SHAMAN, // 62 무당에게 저항
POINT_RESIST_WARRIOR, // 59 무사에게 저항
POINT_RESIST_ASSASSIN, // 60 자객에게 저항
POINT_RESIST_SURA, // 61 수라에게 저항
POINT_RESIST_SHAMAN, // 62 무당에게 저항
POINT_STEAL_HP, // 63 생명력 흡수
POINT_STEAL_SP, // 64 정신력 흡수
POINT_STEAL_HP, // 63 생명력 흡수
POINT_STEAL_SP, // 64 정신력 흡수
POINT_MANA_BURN_PCT, // 65 마나 번
POINT_MANA_BURN_PCT, // 65 마나 번
/// 피해시 보너스 ///
/// 피해시 보너스 ///
POINT_DAMAGE_SP_RECOVER, // 66 공격당할 시 정신력 회복 확률
POINT_DAMAGE_SP_RECOVER, // 66 공격당할 시 정신력 회복 확률
POINT_BLOCK, // 67 블럭율
POINT_DODGE, // 68 회피율
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 화살 저항 : 대미지 감소
POINT_RESIST_FIRE, // 75 화염 저항 : 화염공격에 대한 대미지 감소
POINT_RESIST_ELEC, // 76 전기 저항 : 전기공격에 대한 대미지 감소
POINT_RESIST_MAGIC, // 77 술법 저항 : 모든술법에 대한 대미지 감소
POINT_RESIST_WIND, // 78 바람 저항 : 바람공격에 대한 대미지 감소
POINT_RESIST_BOW, // 74 화살 저항 : 대미지 감소
POINT_RESIST_FIRE, // 75 화염 저항 : 화염공격에 대한 대미지 감소
POINT_RESIST_ELEC, // 76 전기 저항 : 전기공격에 대한 대미지 감소
POINT_RESIST_MAGIC, // 77 술법 저항 : 모든술법에 대한 대미지 감소
POINT_RESIST_WIND, // 78 바람 저항 : 바람공격에 대한 대미지 감소
POINT_REFLECT_MELEE, // 79 공격 반사
POINT_REFLECT_MELEE, // 79 공격 반사
/// 특수 피해시 ///
POINT_REFLECT_CURSE, // 80 저주 반사
POINT_POISON_REDUCE, // 81 독데미지 감소
/// 특수 피해시 ///
POINT_REFLECT_CURSE, // 80 저주 반사
POINT_POISON_REDUCE, // 81 독데미지 감소
/// 적 소멸시 ///
POINT_KILL_SP_RECOVER, // 82 적 소멸시 MP 회복
/// 적 소멸시 ///
POINT_KILL_SP_RECOVER, // 82 적 소멸시 MP 회복
POINT_EXP_DOUBLE_BONUS, // 83
POINT_GOLD_DOUBLE_BONUS, // 84
POINT_ITEM_DROP_BONUS, // 85
/// 회복 관련 ///
/// 회복 관련 ///
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 흑신수호 스킬에 의한 마나쉴드 효과 정도
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 변신한 몬스터 번호
POINT_MOUNT, // 109 타고있는 몬스터 번호
POINT_POLYMORPH, // 108 변신한 몬스터 번호
POINT_MOUNT, // 109 타고있는 몬스터 번호
POINT_PARTY_HASTE_BONUS, // 110
POINT_PARTY_DEFENDER_BONUS, // 111
POINT_STAT_RESET_COUNT, // 112 피의 단약 사용을 통한 스텟 리셋 포인트 (1당 1포인트 리셋가능)
POINT_STAT_RESET_COUNT, // 112 피의 단약 사용을 통한 스텟 리셋 포인트 (1당 1포인트 리셋가능)
POINT_HORSE_SKILL, // 113
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_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 최대생명력 +x%
POINT_MAX_SP_PCT, // 120 최대정신력 +x%
POINT_MAX_HP_PCT, // 119 최대생명력 +x%
POINT_MAX_SP_PCT, // 120 최대정신력 +x%
POINT_SKILL_DAMAGE_BONUS, // 121 스킬 데미지 *(100+x)%
POINT_NORMAL_HIT_DAMAGE_BONUS, // 122 평타 데미지 *(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 스킬 방어 데미지
POINT_NORMAL_HIT_DEFEND_BONUS, // 124 평타 방어 데미지
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방 전용 경험치 보너스
POINT_PC_BANG_DROP_BONUS, // 126 PC방 전용 드롭률 보너스
POINT_PC_BANG_EXP_BONUS, // 125 PC방 전용 경험치 보너스
POINT_PC_BANG_DROP_BONUS, // 126 PC방 전용 드롭률 보너스
// END_PC_BANG_ITEM_ADD
POINT_RAMADAN_CANDY_BONUS_EXP, // 라마단 사탕 경험치 증가용
POINT_RAMADAN_CANDY_BONUS_EXP, // 라마단 사탕 경험치 증가용
POINT_ENERGY = 128, // 128 기력
POINT_ENERGY = 128, // 128 기력
// 기력 ui 용.
// 서버에서 쓰지 않기만, 클라이언트에서 기력의 끝 시간을 POINT로 관리하기 때문에 이렇게 한다.
// 아 부끄럽다
POINT_ENERGY_END_TIME = 129, // 129 기력 종료 시간
// 기력 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,
// 추가 속성 저항
POINT_RESIST_ICE = 133, // 냉기 저항 : 얼음공격에 대한 대미지 감소
POINT_RESIST_EARTH = 134, // 대지 저항 : 얼음공격에 대한 대미지 감소
POINT_RESIST_DARK = 135, // 어둠 저항 : 얼음공격에 대한 대미지 감소
// 추가 속성 저항
POINT_RESIST_ICE = 133, // 냉기 저항 : 얼음공격에 대한 대미지 감소
POINT_RESIST_EARTH = 134, // 대지 저항 : 얼음공격에 대한 대미지 감소
POINT_RESIST_DARK = 135, // 어둠 저항 : 얼음공격에 대한 대미지 감소
POINT_RESIST_CRITICAL = 136, // 크리티컬 저항 : 상대의 크리티컬 확률을 감소
POINT_RESIST_PENETRATE = 137, // 관통타격 저항 : 상대의 관통타격 확률을 감소
POINT_RESIST_CRITICAL = 136, // 크리티컬 저항 : 상대의 크리티컬 확률을 감소
POINT_RESIST_PENETRATE = 137, // 관통타격 저항 : 상대의 관통타격 확률을 감소
//POINT_MAX_NUM = 129 common/length.h
};
@ -352,7 +352,7 @@ struct DynamicCharacterPtr {
uint32_t id;
};
/* 저장하는 데이터 */
/* 저장하는 데이터 */
typedef struct character_point
{
int points[POINT_MAX_NUM];
@ -375,7 +375,7 @@ typedef struct character_point
BYTE skill_group;
} CHARACTER_POINT;
/* 저장되지 않는 캐릭터 데이터 */
/* 저장되지 않는 캐릭터 데이터 */
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];
// 용혼석 인벤토리.
// 용혼석 인벤토리.
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; // 평상복 번호
BYTE bBasePart; // 평상복 번호
int iMaxStamina;
@ -507,7 +507,7 @@ class CHARACTER : public CEntity, public CFSM, public CHorseRider
{
protected:
//////////////////////////////////////////////////////////////////////////////////
// Entity 관련
// 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) 관련
// 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); // 저장 시 사용
void CreatePlayerProto(TPlayerTable & tab); // 저장 시 사용
void SetProto(const CMob * c_pkMob);
WORD GetRaceNum() const;
void Save(); // DelayedSave
void SaveReal(); // 실제 저장
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(); // 제일 많이 때린 사람을 리턴한다.
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(); // 내가 메인캐릭터라고 보내준다.
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 등의 현재 값이 최대값 보다 높은지 검사하고 높다면 낮춘다.
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; } // 이전 스텟을 유지하는 폴리모프.
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); // 바로 이동 시키지 않고 목표 위치로 BLENDING 시킨다.
bool Goto(int x, int y); // 바로 이동 시키지 않고 목표 위치로 BLENDING 시킨다.
void Stop();
bool CanMove() const; // 이동할 수 있는가?
bool CanMove() const; // 이동할 수 있는가?
void SyncPacket();
bool Sync(int x, int y); // 실제 이 메소드로 이동 한다 (각 종 조건에 의한 이동 불가가 없음)
bool Move(int x, int y); // 조건을 검사하고 Sync 메소드를 통해 이동 한다.
void OnMove(bool bIsAttack = false); // 움직일때 불린다. Move() 메소드 이외에서도 불릴 수 있다.
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); // 마지막으로 공격받은 시간 및 위치를 저장함
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; // 내가 SyncOwner인 자들
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 관련
// 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이 끝난 상태인가?
// 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);
/// 자신의 파티에 다른 character 를 초대한다.
/// 자신의 파티에 다른 character 를 초대한다.
/**
* @param pchInvitee character. .
* @param pchInvitee character. .
*
* character .
* character .
*/
void PartyInvite(LPCHARACTER pchInvitee);
/// 초대했던 character 의 수락을 처리한다.
/// 초대했던 character 의 수락을 처리한다.
/**
* @param pchInvitee character. .
* @param pchInvitee character. .
*
* pchInvitee .
* pchInvitee .
*/
void PartyInviteAccept(LPCHARACTER pchInvitee);
/// 초대했던 character 의 초대 거부를 처리한다.
/// 초대했던 character 의 초대 거부를 처리한다.
/**
* @param [in] dwPID character PID
* @param [in] dwPID character PID
*/
void PartyInviteDeny(DWORD dwPID);
@ -961,45 +961,45 @@ class CHARACTER : public CEntity, public CFSM, public CHorseRider
protected:
/// 파티에 가입한다.
/// 파티에 가입한다.
/**
* @param pkLeader
* @param pkLeader
*/
void PartyJoin(LPCHARACTER pkLeader);
/**
* .
* Error code (mutable) type (static) type .
* Error code PERR_SEPARATOR type type .
* .
* Error code (mutable) type (static) type .
* Error code PERR_SEPARATOR type type .
*/
enum PartyJoinErrCode {
PERR_NONE = 0, ///< 처리성공
PERR_SERVER, ///< 서버문제로 파티관련 처리 불가
PERR_DUNGEON, ///< 캐릭터가 던전에 있음
PERR_OBSERVER, ///< 관전모드임
PERR_LVBOUNDARY, ///< 상대 캐릭터와 레벨차이가 남
PERR_LOWLEVEL, ///< 상대파티의 최고레벨보다 30레벨 낮음
PERR_HILEVEL, ///< 상대파티의 최저레벨보다 30레벨 높음
PERR_ALREADYJOIN, ///< 파티가입 대상 캐릭터가 이미 파티중
PERR_PARTYISFULL, ///< 파티인원 제한 초과
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, ///< 상대 캐릭터와 다른 제국임
PERR_MAX ///< Error code 최고치. 이 앞에 Error code 를 추가한다.
PERR_DIFFEMPIRE, ///< 상대 캐릭터와 다른 제국임
PERR_MAX ///< Error code 최고치. 이 앞에 Error code 를 추가한다.
};
/// 파티 가입이나 결성 가능한 조건을 검사한다.
/// 파티 가입이나 결성 가능한 조건을 검사한다.
/**
* @param pchLeader leader character
* @param pchGuest character
* @return PartyJoinErrCode .
* @param pchLeader leader character
* @param pchGuest character
* @return PartyJoinErrCode .
*/
static PartyJoinErrCode IsPartyJoinableCondition(const LPCHARACTER pchLeader, const LPCHARACTER pchGuest);
/// 파티 가입이나 결성 가능한 동적인 조건을 검사한다.
/// 파티 가입이나 결성 가능한 동적인 조건을 검사한다.
/**
* @param pchLeader leader character
* @param pchGuest character
* @return mutable type code .
* @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;
/**
* Event map.
* key: PID
* value: event의 pointer
* Event map.
* key: PID
* value: event의 pointer
*
* 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); // 아이템 관련 행위를 할 수 있는가?
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); /// 비단 보따리 아이템의 사용
void UseSilkBotary(void); /// 비단 보따리 아이템의 사용
/// DB 캐시로 부터 받아온 가격정보 리스트를 유저에게 전송하고 보따리 아이템 사용을 처리한다.
/// DB 캐시로 부터 받아온 가격정보 리스트를 유저에게 전송하고 보따리 아이템 사용을 처리한다.
/**
* @param [in] p
* @param [in] p
*
* UseSilkBotary DB
* .
* 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);
// 현재 item을 착용할 수 있는 지 확인하고, 불가능 하다면 캐릭터에게 이유를 알려주는 함수
// 현재 item을 착용할 수 있는 지 확인하고, 불가능 하다면 캐릭터에게 이유를 알려주는 함수
bool CanEquipNow(const LPITEM item, const TItemPos& srcCell = NPOS, const TItemPos& destCell = NPOS);
// 착용중인 item을 벗을 수 있는 지 확인하고, 불가능 하다면 캐릭터에게 이유를 알려주는 함수
// 착용중인 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:
/// 한 아이템에 대한 가격정보를 전송한다.
/// 한 아이템에 대한 가격정보를 전송한다.
/**
* @param [in] dwItemVnum vnum
* @param [in] dwItemPrice
* @param [in] dwItemVnum vnum
* @param [in] dwItemPrice
*/
void SendMyShopPriceListCmd(DWORD dwItemVnum, DWORD dwItemPrice);
bool m_bNoOpenedShop; ///< 이번 접속 후 개인상점을 연 적이 있는지의 여부(열었던 적이 없다면 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); // 파티가 있으면 파티 분배, 로그 등의 처리
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과 싸우기 시작한다. (강제적임, 시작할 수 있나 체크하려면 CanBeginFight을 사용)
void BeginFight(LPCHARACTER pkVictim); // pkVictimr과 싸우기 시작한다. (강제적임, 시작할 수 있나 체크하려면 CanBeginFight을 사용)
bool CounterAttack(LPCHARACTER pkChr); // 반격하기 (몬스터만 사용)
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;
//선악치 얻기
//선악치 얻기
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; // 어떤 캐릭터가 나에게 얼마만큼의 데미지를 주었는가?
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; // 나를 스폰한 돌
CHARACTER_SET m_set_pkChrSpawnedBy; // 내가 스폰한 놈들
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; ///< 마지막으로 skill 을 쓴 시간(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; // 공격할 대상 리턴
LPCHARACTER GetVictim() const; // 공격할 대상 리턴
void SetVictim(LPCHARACTER pkVictim);
LPCHARACTER GetNearestVictim(LPCHARACTER pkChr);
LPCHARACTER GetProtege() const; // 보호해야 할 대상 리턴
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; // 내 타겟
CHARACTER_SET m_set_pkChrTargetedBy; // 나를 타겟으로 가지고 있는 사람들
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();
/// 창고 열기 요청
/// 창고 열기 요청
/**
* @param [in] pszPassword 1 6
* @param [in] pszPassword 1 6
*
* DB .
* , 10 .
* DB .
* , 10 .
*/
void ReqSafeboxLoad(const char* pszPassword);
/// 창고 열기 요청의 취소
/// 창고 열기 요청의 취소
/**
* ReqSafeboxLoad CloseSafebox .
* DB .
* 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; ///< 창고가 열기 요청 중이거나 열려있는가 여부, true 일 경우 열기요청이거나 열려있음.
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; } // 현재 소환중인 말
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; // 특정 효과에 의해 움직일 수 없는 상태인가?
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);
// 캐릭터 인스턴스 업데이트 함수. 기존엔 이상한 상속구조로 CFSM::Update 함수를 호출하거나 UpdateStateMachine 함수를 사용했는데, 별개의 업데이트 함수 추가함.
// 캐릭터 인스턴스 업데이트 함수. 기존엔 이상한 상속구조로 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; ///< 디폴트 아이템 속성변경 가능 주기
static const char msc_szLastChangeItemAttrFlag[]; ///< 최근 아이템 속성을 변경한 시간의 Quest Flag 이름
static const char msc_szChangeItemAttrCycleFlag[]; ///< 아이템 속성병경 가능 주기의 Quest Flag 이름
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 방지를 위한 체크.
// 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:
//중국 전용
//18세 미만 전용
//3시간 : 50 % 5 시간 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;
// 무적 : 원활한 테스트를 위하여.
// 무적 : 원활한 테스트를 위하여.
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
//최종 데미지 보정.
//최종 데미지 보정.
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;
//독일 선물 기능 패킷 임시 저장
//독일 선물 기능 패킷 임시 저장
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:
//용혼석
//용혼석
// 캐릭터의 affect, quest가 load 되기 전에 DragonSoul_Initialize를 호출하면 안된다.
// affect가 가장 마지막에 로드되어 LoadAffect에서 호출함.
// 캐릭터의 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();
// 반드시 ClearItem 전에 불러야 한다.
// 왜냐하면....
// 용혼석 하나 하나를 deactivate할 때마다 덱에 active인 용혼석이 있는지 확인하고,
// active인 용혼석이 하나도 없다면, 캐릭터의 용혼석 affect와, 활성 상태를 제거한다.
// 반드시 ClearItem 전에 불러야 한다.
// 왜냐하면....
// 용혼석 하나 하나를 deactivate할 때마다 덱에 active인 용혼석이 있는지 확인하고,
// active인 용혼석이 하나도 없다면, 캐릭터의 용혼석 affect와, 활성 상태를 제거한다.
//
// 하지만 ClearItem 시, 캐릭터가 착용하고 있는 모든 아이템을 unequip하는 바람에,
// 용혼석 Affect가 제거되고, 결국 로그인 시, 용혼석이 활성화되지 않는다.
// (Unequip할 때에는 로그아웃 상태인지, 아닌지 알 수 없다.)
// 용혼석만 deactivate시키고 캐릭터의 용혼석 덱 활성 상태는 건드리지 않는다.
// 하지만 ClearItem 시, 캐릭터가 착용하고 있는 모든 아이템을 unequip하는 바람에,
// 용혼석 Affect가 제거되고, 결국 로그인 시, 용혼석이 활성화되지 않는다.
// (Unequip할 때에는 로그아웃 상태인지, 아닌지 알 수 없다.)
// 용혼석만 deactivate시키고 캐릭터의 용혼석 덱 활성 상태는 건드리지 않는다.
void DragonSoul_CleanUp();
// 용혼석 강화창
// 용혼석 강화창
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을 악용하여 타유저를 이상한 곳으로 보내는 핵 방어하기 위하여,
// SyncPosition이 일어날 때를 기록.
// 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(); // 정상적 셧다운할 때 사용. PC를 모두 저장시키고 Destroy 한다.
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: 어떠한 루틴 내에서 저장을 해야 할 짓을 많이 하면 저장
// 쿼리가 너무 많아지므로 "저장을 한다" 라고 표시만 해두고 잠깐
// (예: 1 frame) 후에 저장시킨다.
// DelayedSave: 어떠한 루틴 내에서 저장을 해야 할 짓을 많이 하면 저장
// 쿼리가 너무 많아지므로 "저장을 한다" 라고 표시만 해두고 잠깐
// (예: 1 frame) 후에 저장시킨다.
void DelayedSave(LPCHARACTER ch);
bool FlushDelayedSave(LPCHARACTER ch); // Delayed 리스트에 있다면 지우고 저장한다. 끊김 처리시 사용 됨.
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이 돌아가고 있는 놈들
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); // 이 게임서버에만 공지
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); // 같은 제국에게 공지
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 이면 TrafficProfiler 를 켠다.
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; // 범법자가 "평화모드" 인 일반유저를 공격하지 못함
extern bool g_noticeBattleZone; // 중립지대에 입장하면 안내메세지를 알려줌
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; // 돈이 나올 확률
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개까지
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 :
* 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; // 제조시 필요한 금액
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 접속 종료시 빌링 테이블 모두 지우기 (재연결시 복구함)
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, ...); // 결과를 f인자로 호출함 (SQLMsg *) 알아서 해제됨
template<class Functor> void FuncAfterQuery(Functor f, const char * c_pszFormat, ...); // 끝나고 나면 f가 호출됨 void f(void) 형태
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 버그 찾기용 데이타
// sequence 버그 찾기용 데이타
struct seq_t
{
BYTE hdr;
BYTE seq;
};
typedef std::vector<seq_t> seq_vector_t;
// sequence 버그 찾기용 데이타
// 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; }
// 핸드쉐이크 (시간 동기화)
// 핸드쉐이크 (시간 동기화)
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();
// 제국
// 제국
BYTE GetEmpire();
// for p2p
@ -127,7 +127,7 @@ class DESC
void DisconnectOfSameLogin();
void SetAdminMode();
bool IsAdminMode(); // Handshake 에서 어드민 명령을 쓸수있나?
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 에서 어드민 명령을 쓸수있나?
bool m_bAdminMode; // Handshake 에서 어드민 명령을 쓸수있나?
bool m_bPong;
int m_iCurrentSequence;
@ -252,7 +252,7 @@ class DESC
void ChatPacket(BYTE type, const char * format, ...);
/* 시퀀스 버그 찾기용 코드 */
/* 시퀀스 버그 찾기용 코드 */
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; } // 데이터로 리젠한 몬스터의 수
int CountRealMonster(); // 실제로 맵상에 있는 몬스터
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은 item_vnum과 item_count로 구성.
// 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;
// 적 전멸시 워프하는 위치
// 적 전멸시 워프하는 위치
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);
// 파티 단위 던전 입장을 위한 임시 변수.
// m_map_pkParty는 관리가 부실하여 사용할 수 없다고 판단하여,
// 임시로 한 파티에 대한 관리를 하는 변수 생성.
// 파티 단위 던전 입장을 위한 임시 변수.
// 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(); // 주위 Entity에 패킷을 다시 보낸다.
void ViewReencode(); // 주위 Entity에 패킷을 다시 보낸다.
int GetViewAge() const { return m_iViewAge; }

View File

@ -1,8 +1,8 @@
/*
* Filename: event.h
* Description: (timed event)
* Description: (timed event)
*
* Author: (aka. , Cronan), (aka. myevan, )
* 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); // 이벤트 취소
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_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; // 상대방의 CExchange 포인터
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번째(map에 들어있는 순서일 뿐, txt의 순서와는 관계 없음) row의 특정 컬럼의 값을 반환하는 함수.
// 이질적이긴 하지만, 편의를 위한 함수.
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;
// 참고로, idx랑 txt에 쓰여진 순서랑 관계 없음.
// 참고로, 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을 살펴봄.
// 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을 살펴봄.
// default group을 살펴봄.
pChildGroup = GetChildNode("default");
if (NULL != pChildGroup)
{

View File

@ -29,12 +29,12 @@ struct SGuildMaster
typedef struct SGuildMember
{
DWORD pid; // player 테이블의 id; primary key
BYTE grade; // 길드상의 플레이어의 계급 1 to 15 (1이 짱)
DWORD pid; // player 테이블의 id; primary key
BYTE grade; // 길드상의 플레이어의 계급 1 to 15 (1이 짱)
BYTE is_general;
BYTE job;
BYTE level;
DWORD offer_exp; // 공헌한 경험치
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 길드장, 길드원 등의 이름
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); // 길드 채팅
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 이면 길드장에게 주는 걸 시도하고 성공실패를 디비에게 보낸다
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); // 전쟁중인가?
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 에게 길드가입 초대를 한다.
/// character 에게 길드가입 초대를 한다.
/**
* @param pchInviter character.
* @param pchInvitee character.
* @param pchInviter character.
* @param pchInvitee character.
*
* .
* .
*/
void Invite( LPCHARACTER pchInviter, LPCHARACTER pchInvitee );
/// 길드초대에 대한 상대 character 의 수락을 처리한다.
/// 길드초대에 대한 상대 character 의 수락을 처리한다.
/**
* @param pchInvitee character
* @param pchInvitee character
*
* .
* .
*/
void InviteAccept( LPCHARACTER pchInvitee );
/// 길드초대에 대한 상대 character 의 거부를 처리한다.
/// 길드초대에 대한 상대 character 의 거부를 처리한다.
/**
* @param dwPID character 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
/// 길드 가입을 할 수 없을 경우의 에러코드.
/// 길드 가입을 할 수 없을 경우의 에러코드.
enum GuildJoinErrCode {
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 를 추가한다.
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 를 추가한다.
};
/// 길드에 가입 가능한 조건을 검사한다.
/// 길드에 가입 가능한 조건을 검사한다.
/**
* @param [in] pchInvitee character
* @param [in] pchInvitee character
* @return GuildJoinErrCode
*/
GuildJoinErrCode VerifyGuildJoinableCondition( const LPCHARACTER pchInvitee );
typedef std::map< DWORD, LPEVENT > EventMap;
EventMap m_GuildInviteEventMap; ///< 길드 초청 Event map. key: 초대받은 캐릭터의 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; // 탑승할 수 있는 최소 레벨
int iMinLevel; // 탑승할 수 있는 최소 레벨
int iNPCRace;
int iMaxHealth; // 말의 최대 체력
int iMaxStamina; // 말의 최대 스테미너
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 = 일반 실패 1 = 이미 있음
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
/// 아이템 가격정보 리스트 요청에 대한 응답 패킷(HEADER_DG_MYSHOP_PRICELIST_RES) 처리함수
/// 아이템 가격정보 리스트 요청에 대한 응답 패킷(HEADER_DG_MYSHOP_PRICELIST_RES) 처리함수
/**
* @param d descriptor
* @param p
* @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);
// 독일 선물 기능 테스트
// 독일 선물 기능 테스트
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과 GetOriginalVnum에 대한 comment
// GetVnum은 Masking 된 Vnum이다. 이를 사용함으로써, 아이템의 실제 Vnum은 10이지만, Vnum이 20인 것처럼 동작할 수 있는 것이다.
// Masking 값은 ori_to_new.txt에서 정의된 값이다.
// GetOriginalVnum은 아이템 고유의 Vnum으로, 로그 남길 때, 클라이언트에 아이템 정보 보낼 때, 저장할 때는 이 Vnum을 사용하여야 한다.
// 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); // 아이템의 효과를 캐릭터에 부여 한다. bAdd가 false이면 제거함
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(); // 속성 붙는것을 지정한 배열의 어느 인덱스를 사용하는지 돌려준다.
int GetAttributeSetIndex(); // 속성 붙는것을 지정한 배열의 어느 인덱스를 사용하는지 돌려준다.
void AlterToMagicItem();
void AlterToSocketItem(int iSocketCount);
@ -165,7 +165,7 @@ class CItem : public CEntity
void StopTimerBasedOnWearExpireEvent();
void StopAccessorySocketExpireEvent();
// 일단 REAL_TIME과 TIMER_BASED_ON_WEAR 아이템에 대해서만 제대로 동작함.
// 일단 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
// 액세서리에 광산을 통해 소켓을 추가
// 액세서리에 광산을 통해 소켓을 추가
bool IsAccessoryForSocket();
int GetAccessorySocketGrade();
@ -193,7 +193,7 @@ class CItem : public CEntity
void AccessorySocketDegrade();
// 악세사리 를 아이템에 밖았을때 타이머 돌아가는것( 구리, 등 )
// 악세사리 를 아이템에 밖았을때 타이머 돌아가는것( 구리, 등 )
void StartAccessorySocketExpireEvent();
void SetAccessorySocketExpireEvent(LPEVENT pkEvent);
@ -227,7 +227,7 @@ class CItem : public CEntity
protected:
friend class CInputDB;
bool OnAfterCreatedItem(); // 서버상에 아이템이 모든 정보와 함께 완전히 생성(로드)된 후 불리우는 함수.
bool OnAfterCreatedItem(); // 서버상에 아이템이 모든 정보와 함께 완전히 생성(로드)된 후 불리우는 함수.
public:
bool IsRideItem();
@ -237,46 +237,46 @@ class CItem : public CEntity
bool IsNewMountItem();
#ifdef __AUCTION__
// 경매장
// 경매장
bool MoveToAuction ();
void CopyToRawData (TPlayerItem* item);
#endif
// 독일에서 기존 캐시 아이템과 같지만, 교환 가능한 캐시 아이템을 만든다고 하여,
// 오리지널 아이템에, 교환 금지 플래그만 삭제한 새로운 아이템들을 새로운 아이템 대역에 할당하였다.
// 문제는 새로운 아이템도 오리지널 아이템과 같은 효과를 내야하는데,
// 서버건, 클라건, vnum 기반으로 되어있어
// 새로운 vnum을 죄다 서버에 새로 다 박아야하는 안타까운 상황에 맞닿았다.
// 그래서 새 vnum의 아이템이면, 서버에서 돌아갈 때는 오리지널 아이템 vnum으로 바꿔서 돌고 하고,
// 저장할 때에 본래 vnum으로 바꿔주도록 한다.
// 독일에서 기존 캐시 아이템과 같지만, 교환 가능한 캐시 아이템을 만든다고 하여,
// 오리지널 아이템에, 교환 금지 플래그만 삭제한 새로운 아이템들을 새로운 아이템 대역에 할당하였다.
// 문제는 새로운 아이템도 오리지널 아이템과 같은 효과를 내야하는데,
// 서버건, 클라건, vnum 기반으로 되어있어
// 새로운 vnum을 죄다 서버에 새로 다 박아야하는 안타까운 상황에 맞닿았다.
// 그래서 새 vnum의 아이템이면, 서버에서 돌아갈 때는 오리지널 아이템 vnum으로 바꿔서 돌고 하고,
// 저장할 때에 본래 vnum으로 바꿔주도록 한다.
// Mask vnum은 어떤 이유(ex. 위의 상황)로 인해 vnum이 바뀌어 돌아가는 아이템을 위해 있다.
// Mask vnum은 어떤 이유(ex. 위의 상황)로 인해 vnum이 바뀌어 돌아가는 아이템을 위해 있다.
void SetMaskVnum(DWORD vnum) { m_dwMaskVnum = vnum; }
DWORD GetMaskVnum() { return m_dwMaskVnum; }
bool IsMaskedItem() { return m_dwMaskVnum != 0; }
// 용혼석
// 용혼석
bool IsDragonSoul();
int GiveMoreTime_Per(float fPercent);
int GiveMoreTime_Fix(DWORD dwTime);
private:
TItemTable const * m_pProto; // 프로토 타잎
TItemTable const * m_pProto; // 프로토 타잎
DWORD m_dwVnum;
LPCHARACTER m_pOwner;
BYTE m_bWindow; // 현재 아이템이 위치한 윈도우
DWORD m_dwID; // 고유번호
bool m_bEquipped; // 장착 되었는가?
BYTE m_bWindow; // 현재 아이템이 위치한 윈도우
DWORD m_dwID; // 고유번호
bool m_bEquipped; // 장착 되었는가?
DWORD m_dwVID; // VID
WORD m_wCell; // 위치
DWORD m_dwCount; // 개수
int m_lFlag; // 추가 flag
DWORD m_dwLastOwnerPID; // 마지막 가지고 있었던 사람의 PID
WORD m_wCell; // 위치
DWORD m_dwCount; // 개수
int m_lFlag; // 추가 flag
DWORD m_dwLastOwnerPID; // 마지막 가지고 있었던 사람의 PID
bool m_bExchanging; ///< 현재 교환중 상태
bool m_bExchanging; ///< 현재 교환중 상태
int m_alSockets[ITEM_SOCKET_MAX_NUM]; // 아이템 소캣
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에서 정의하는 속성 그룹
// type attr로 선언할 수 있다.
// 이 속성 그룹을 이용할 수 있는 것은 special_item_group.txt에서 Special type으로 정의된 그룹에 속한 UNIQUE ITEM이다.
// 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 타입은 퀘스트 스크립트에서 vnum.sig_use를 사용할 수 있는 그룹이다.
// 단, 이 그룹에 들어가기 위해서는 ITEM 자체의 TYPE이 QUEST여야 한다.
// SPECIAL 타입은 idx, item_vnum, attr_vnum을 입력한다. attr_vnum은 위에 CSpecialAttrGroup의 Vnum이다.
// 이 그룹에 들어있는 아이템은 같이 착용할 수 없다.
// 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, 즉 m_bType == PCT 인 경우,
// 확률을 더해가지 않고, 독립적으로 계산하여 아이템을 생성한다.
// 따라서 여러 개의 아이템이 생성될 수 있다.
// Type Multi, 즉 m_bType == PCT 인 경우,
// 확률을 더해가지 않고, 독립적으로 계산하여 아이템을 생성한다.
// 따라서 여러 개의 아이템이 생성될 수 있다.
// by rtsummit
int GetMultiIndex(std::vector <int> &idx_vec) const
{
@ -143,8 +143,8 @@ class CSpecialItemGroup
return false;
}
// Group의 Type이 Special인 경우에
// dwVnum에 매칭되는 AttrVnum을 return해준다.
// 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(); // 매 루프마다 부른다.
void Update(); // 매 루프마다 부른다.
void GracefulShutdown();
DWORD GetNewID();
bool SetMaxItemID(TItemIDRangeTable range); // 최대 고유 아이디를 지정
bool SetMaxItemID(TItemIDRangeTable range); // 최대 고유 아이디를 지정
bool SetMaxSpareItemID(TItemIDRangeTable range);
// DelayedSave: 어떠한 루틴 내에서 저장을 해야 할 짓을 많이 하면 저장
// 쿼리가 너무 많아지므로 "저장을 한다" 라고 표시만 해두고 잠깐
// (예: 1 frame) 후에 저장시킨다.
// DelayedSave: 어떠한 루틴 내에서 저장을 해야 할 짓을 많이 하면 저장
// 쿼리가 너무 많아지므로 "저장을 한다" 라고 표시만 해두고 잠깐
// (예: 1 frame) 후에 저장시킨다.
void DelayedSave(LPITEM item);
void FlushDelayedSave(LPITEM item); // Delayed 리스트에 있다면 지우고 저장한다. 끊김 처리시 사용 됨.
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); // 사용자로 부터 아이템을 제거
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으로 모든 속성과 소켓 값들을 목사하는 함수.
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 의 값단위로 아이템을 저장한다.
DWORD m_dwVIDCount; ///< 이녀석 VID가 아니라 그냥 프로세스 단위 유니크 번호다.
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:
// 독일에서 기존 캐시 아이템과 같지만, 교환 가능한 캐시 아이템을 만든다고 하여,
// 오리지널 아이템에 교환 금지 플래그만 삭제한 새로운 아이템들을 만들어,
// 새로운 아이템 대역을 할당하였다.
// 문제는 새로운 아이템도 오리지널 아이템과 같은 효과를 내야하는데,
// 서버건, 클라건, vnum 기반으로 되어있어
// 새로운 vnum을 죄다 서버에 새로 다 박아야하는 안타까운 상황에 맞닿았다.
// 그래서 새 vnum의 아이템이면, 서버에서 돌아갈 때는 오리지널 아이템 vnum으로 바꿔서 돌고 하고,
// 저장할 때에 본래 vnum으로 바꿔주도록 한다.
// 이를 위해 오리지널 vnum과 새로운 vnum을 연결시켜주는 맵을 만듦.
// 독일에서 기존 캐시 아이템과 같지만, 교환 가능한 캐시 아이템을 만든다고 하여,
// 오리지널 아이템에 교환 금지 플래그만 삭제한 새로운 아이템들을 만들어,
// 새로운 아이템 대역을 할당하였다.
// 문제는 새로운 아이템도 오리지널 아이템과 같은 효과를 내야하는데,
// 서버건, 클라건, 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); // 실제 m_Relation, m_InverseRelation 수정하는 메소드
void __AddToList(keyA account, keyA companion); // 실제 m_Relation, m_InverseRelation 수정하는 메소드
void AddToList(keyA account, keyA companion);
void __RemoveFromList(keyA account, keyA companion); // 실제 m_Relation, m_InverseRelation 수정하는 메소드
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; // 스킬 사용 후 실제로 데미지 먹힐때까지 기다리는 시간 (ms)
DWORD dwHitDistance; // 스킬 사용시 실제로 스킬 계산이 되는 거리 (전방 몇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; // 마지막 맞은 위치
DWORD m_dwLastAttackedTime; // 마지막 맞은 시간
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]; ///< 군주의 사자후
int m_DefenseUp[4]; ///< 군주의 금강권
int m_PowerUp[4]; ///< 군주의 사자후
int m_DefenseUp[4]; ///< 군주의 금강권
int m_PowerUpCT[4]; ///< 군주의 사자후
int m_DefenseUpCT[4]; ///< 군주의 금강권
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 없음
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_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();
// 아래 Register* Unregister* pair들은 내부적으로 사실 같은 루틴을 사용한다.
// 단지 명시적으로 표시하기 위한 것
// 아래 Register* Unregister* pair들은 내부적으로 사실 같은 루틴을 사용한다.
// 단지 명시적으로 표시하기 위한 것
void RegisterAcceptor(LPDESC d);
void UnregisterAcceptor(LPDESC d);
void RegisterConnector(LPDESC d);
void UnregisterConnector(LPDESC d);
void EraseUserByDesc(LPDESC d); // 해당 desc에 있는 유저들을 지운다.
void EraseUserByDesc(LPDESC d); // 해당 desc에 있는 유저들을 지운다.
void FlushOutput();
void Boot(LPDESC d); // p2p 처리에 필요한 정보를 보내준다. (전 캐릭터의 로그인 정보 등)
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, // @ 로 시작되면 텍스트를 파싱한다.
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, // 아이템을 창고에 넣??는다.
HEADER_CG_SAFEBOX_CHECKOUT = 71, // 아이템을 창고로 부터 빼온다.
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 : 이런 개XXX 정말 이거 Packet설계한 사람은 누구냐. 이렇게 코딩하고 밥이 넘어가나.
//enum을 별도로 구별을 하던가. 아님 namepsace로 구별을 하던가..
//정말 packet generator까지는 바라지도 않는다. 이런 씨XX
//이러다가 숫자 겹치면 누가 책임지는데???
//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, // 누군가의 접속을 강제로 끊을 때
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; // 저 위치로 워프하려는 사람
DWORD dwTargetPID; // 찾는 사람
DWORD dwFromPID; // 저 위치로 워프하려는 사람
DWORD dwTargetPID; // 찾는 사람
} TPacketGGFindPosition;
typedef struct SPacketGGWarpCharacter
@ -496,14 +496,14 @@ typedef struct SPacketGGBlockChat
LONG lBlockDuration;
} TPacketGGBlockChat;
/* 클라이언트 측에서 보내는 패킷 */
/* 클라이언트 측에서 보내는 패킷 */
typedef struct command_text
{
BYTE bHeader;
} TPacketCGText;
/* 로그인 (1) */
/* 로그인 (1) */
typedef struct command_handshake
{
BYTE bHeader;
@ -587,7 +587,7 @@ typedef struct command_player_create_success
TSimplePlayer player;
} TPacketGCPlayerCreateSuccess;
// 공격
// 공격
typedef struct command_attack
{
BYTE bHeader;
@ -609,7 +609,7 @@ enum EMoveFuncType
FUNC_SKILL = 0x80,
};
// 이동
// 이동
typedef struct command_move
{
BYTE bHeader;
@ -628,22 +628,22 @@ typedef struct command_sync_position_element
LONG lY;
} TPacketCGSyncPositionElement;
// 위치 동기화
typedef struct command_sync_position // 가변 패킷
// 위치 동기화
typedef struct command_sync_position // 가변 패킷
{
BYTE bHeader;
WORD wSize;
} TPacketCGSyncPosition;
/* 채팅 (3) */
typedef struct command_chat // 가변 패킷
/* 채팅 (3) */
typedef struct command_chat // 가변 패킷
{
BYTE header;
WORD size;
BYTE type;
} TPacketCGChat;
/* 귓속말 */
/* 귓속말 */
typedef struct command_whisper
{
BYTE bHeader;
@ -803,7 +803,7 @@ typedef struct command_quest_confirm
} TPacketCGQuestConfirm;
/*
*
*
*/
typedef struct packet_quest_confirm
{
@ -919,7 +919,7 @@ typedef struct packet_add_char
BYTE bAttackSpeed;
BYTE bStateFlag;
DWORD dwAffectFlag[2]; // 효과
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 // 가변 패킷
typedef struct packet_chat // 가변 패킷
{
BYTE header;
WORD size;
@ -990,7 +990,7 @@ typedef struct packet_chat //
BYTE bEmpire;
} TPacketGCChat;
typedef struct packet_whisper // 가변 패킷
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 // 다음에 TSubPacketShopTab* shop_tabs 이 따라옴.
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 // 가변 패킷
typedef struct packet_shop // 가변 패킷
{
BYTE header;
WORD size;
@ -1317,7 +1317,7 @@ typedef struct packet_move
DWORD dwDuration;
} TPacketGCMove;
// 소유권
// 소유권
typedef struct packet_ownership
{
BYTE bHeader;
@ -1325,7 +1325,7 @@ typedef struct packet_ownership
DWORD dwVictimVID;
} TPacketGCOwnership;
// 위치 동기화 패킷의 bCount 만큼 붙는 단위
// 위치 동기화 패킷의 bCount 만큼 붙는 단위
typedef struct packet_sync_position_element
{
DWORD dwVID;
@ -1333,11 +1333,11 @@ typedef struct packet_sync_position_element
LONG lY;
} TPacketGCSyncPositionElement;
// 위치 동기화
typedef struct packet_sync_position // 가변 패킷
// 위치 동기화
typedef struct packet_sync_position // 가변 패킷
{
BYTE bHeader;
WORD wSize; // 개수 = (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가 몇개? 개수 = (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 이면 끔, 1이면 켬
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;
//뒤에 size * (WORD + WORD)만큼 데이터 붙음
//뒤에 size * (WORD + WORD)만큼 데이터 붙음
} TPacketGCMarkIDXList;
typedef struct packet_mark_block
@ -1794,7 +1794,7 @@ typedef struct packet_mark_block
DWORD bufSize;
BYTE imgIdx;
DWORD count;
// 뒤에 64 x 48 x 픽셀크기(4바이트) = 12288만큼 데이터 붙음
// 뒤에 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; // 소요 비용
INT prob; // 확률
INT cost; // 소요 비용
INT prob; // 확률
TRefineMaterial materials[REFINE_MATERIAL_MAX_NUM];
} TPacketGCRefineInformation;
@ -2149,13 +2149,13 @@ typedef struct SPacketGCPanamaPack
BYTE abIV[32];
} TPacketGCPanamaPack;
//TODO : 아우 짱나..가변패킷 사이즈 받아들일수 있게 패킷 핸들러 Refactoring 하자.
//TODO : 아우 짱나..가변패킷 사이즈 받아들일수 있게 패킷 핸들러 Refactoring 하자.
typedef struct SPacketGCHybridCryptKeys
{
SPacketGCHybridCryptKeys() : m_pStream(NULL) {}
~SPacketGCHybridCryptKeys()
{
//GCC 에선 NULL delete 해도 괜찮나? 일단 안전하게 NULL 체크 하자. ( 근데 이거 C++ 표준아니었나 --a )
//GCC 에선 NULL delete 해도 괜찮나? 일단 안전하게 NULL 체크 하자. ( 근데 이거 C++ 표준아니었나 --a )
if( m_pStream )
{
delete[] m_pStream;
@ -2188,7 +2188,7 @@ typedef struct SPacketGCHybridCryptKeys
}
BYTE bHeader;
WORD uDynamicPacketSize; // 빌어먹을 클라 DynamicPacketHeader 구조때문에 맞춰줘야한다 -_-;
WORD uDynamicPacketSize; // 빌어먹을 클라 DynamicPacketHeader 구조때문에 맞춰줘야한다 -_-;
INT KeyStreamLen;
BYTE* pDataKeyStream;
@ -2236,7 +2236,7 @@ typedef struct SPacketGCPackageSDB
}
BYTE bHeader;
WORD uDynamicPacketSize; // 빌어먹을 클라 DynamicPacketHeader 구조때문에 맞춰줘야한다 -_-;
WORD uDynamicPacketSize; // 빌어먹을 클라 DynamicPacketHeader 구조때문에 맞춰줘야한다 -_-;
INT iStreamLen;
BYTE* m_pDataSDBStream;
@ -2254,7 +2254,7 @@ typedef struct SPacketGCSpecificEffect
char effect_file[MAX_EFFECT_FILE_NAME];
} TPacketGCSpecificEffect;
// 용혼석
// 용혼석
enum EDragonSoulRefineWindowRefineType
{
DragonSoulRefineWindow_UPGRADE,

View File

@ -5,7 +5,7 @@
enum // unit : minute
{
PARTY_ENOUGH_MINUTE_FOR_EXP_BONUS = 60, // 파티 결성 후 60분 후 부터 추가 경험치 보너스
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로 어느 파티에 있나 검색하기 위한 컨테이너
TPartyMap m_map_pkMobParty; // Mob 파티는 PID 대신 VID 로 따로 관리한다.
TPartyMap m_map_pkParty; // PID로 어느 파티에 있나 검색하기 위한 컨테이너
TPartyMap m_map_pkMobParty; // Mob 파티는 PID 대신 VID 로 따로 관리한다.
TPCPartySet m_set_pkPCParty; // 사람들의 파티 전체 집합
TPCPartySet m_set_pkPCParty; // 사람들의 파티 전체 집합
bool m_bEnablePCParty; // 디비가 켜져있지 않으면 사람들의 파티 상태가 변경불가
bool m_bEnablePCParty; // 디비가 켜져있지 않으면 사람들의 파티 상태가 변경불가
};
enum EPartyMessages
@ -246,9 +246,9 @@ class CParty
TFlagMap m_map_iFlag;
LPDUNGEON m_pkDungeon;
// 아귀 동굴용 dungeon 멤버 변수.
// 정말 이렇게까지 하고 싶진 않았는데, 던전에서 party 관리가 정말로 개판이라
// 그거 고치기 전까지는 이렇게 임시로 해놓는다.
// 아귀 동굴용 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
* RequestGiveGuildPriv, GiveGuildPriv
* m_aPrivGuild
* SPrivGuildData, GetPrivByGuildEx
* @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);
/// 길드 보너스 데이터
/// 길드 보너스 데이터
struct SPrivGuildData
{
int value; ///< 보너스 수치
time_t end_time_sec; ///< 지속 시간
int value; ///< 보너스 수치
time_t end_time_sec; ///< 지속 시간
};
/// 길드 보너스 데이터를 얻어온다.
/// 길드 보너스 데이터를 얻어온다.
/**
* @param [in] dwGuildID ID
* @param [in] byType
* @return , ID 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에는 DWORD 아이디 두개를 받아서 m_dwCRC를 만들어서 가지고 있는다.
// CPVPManager에서 이렇게 만든 CRC를 통해 검색한다.
// CPVP에는 DWORD 아이디 두개를 받아서 m_dwCRC를 만들어서 가지고 있는다.
// CPVPManager에서 이렇게 만든 CRC를 통해 검색한다.
class CPVP
{
public:
@ -26,8 +26,8 @@ class CPVP
CPVP(CPVP & v);
~CPVP();
void Win(DWORD dwPID); // dwPID가 이겼다!
bool CanRevenge(DWORD dwPID); // dwPID가 복수할 수 있어?
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에 있었나 없었나를 리턴
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); // 현재 PC를 바꾸지 않고 PC 포인터를 가져온다.
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); //독일선물기능
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을 위한 객체들.
// 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:
// 인자가 없는 스크립트들
// 인자가 없는 스크립트들
// first: state number
typedef map<int, AStateScriptType> AQuestScriptType;
// first: quest number
typedef map<unsigned int, AQuestScriptType> QuestMapType;
// 인자가 있는 스크립트들
// 인자가 있는 스크립트들
// 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); // 독일 선물 기능 테스트
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자 까지
QUEST_SEND_CLOCK_NAME = (1 << 2), // 16자 까지
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자 까지
QUEST_SEND_COUNTER_NAME = (1 << 4), // 16자 까지
QUEST_SEND_COUNTER_VALUE = (1 << 5),
QUEST_SEND_ICON_FILE = (1 << 6), // 24자 까지
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에 저장
// 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; // 로드는 한번만 한다.
bool m_bLoaded; // 로드는 한번만 한다.
int m_iLastState;

View File

@ -5,8 +5,8 @@
enum
{
BLACKSMITH_MOB = 20016, // 확률 개량
ALCHEMIST_MOB = 20001, // 100% 개량 성공
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())
{
//첫번째를 찾으면 바로 리턴
//첫번째를 찾으면 바로 리턴
if ( (*(it_tree++))->for_each_entity_for_find_victim(func) )
return;
}
@ -143,7 +143,7 @@ class SECTREE
while (it != m_set_entity.end())
{
//정상적으로 찾으면 바로 리턴
//정상적으로 찾으면 바로 리턴
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 처리시 사용
void CloneAttribute(LPSECTREE tree); // private map 처리시 사용
int GetEventAttribute(int x, int y); // 20050313 현재는 사용하지 않음
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);
/// 영역에 대해 Sectree 의 Attribute 에 대해 특정한 처리를 수행한다.
/// 영역에 대해 Sectree 의 Attribute 에 대해 특정한 처리를 수행한다.
/**
* @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
* @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:
/// 직각의 사각형 영역에 대해 Sectree 의 Attribute 에 대해 특정한 처리를 수행한다.
/// 직각의 사각형 영역에 대해 Sectree 의 Attribute 에 대해 특정한 처리를 수행한다.
/**
* @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
* @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 );
/// 직각 이외의 사각형 영역에 대해 Sectree 의 Attribute 에 대해 특정한 처리를 수행한다.
/// 직각 이외의 사각형 영역에 대해 Sectree 의 Attribute 에 대해 특정한 처리를 수행한다.
/**
* @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
* @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 );
/// 한 Cell 의 Attribute 에 대해 특정한 처리를 수행한다.
/// 한 Cell 의 Attribute 에 대해 특정한 처리를 수행한다.
/**
* @param [in] lMapIndex Map index
* @param [in] lCX Cell X
* @param [in] lCY Cell Y
* @param [in] dwAttr Attribute
* @param [in] mode Attribute 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; // 아이템 번호
int price; // 가격
BYTE count; // 아이템 개수
DWORD vnum; // 아이템 번호
int price; // 가격
BYTE count; // 아이템 개수
LPITEM pkItem;
int itemid; // 아이템 고유아이디
int itemid; // 아이템 고유아이디
shop_item()
{
@ -40,20 +40,20 @@ class CShop
virtual void SetPCShop(LPCHARACTER ch);
virtual bool IsPCShop() { return m_pkPC ? true : false; }
// 게스트 추가/삭제
// 게스트 추가/삭제
virtual bool AddGuest(LPCHARACTER ch,DWORD owner_vid, bool bOtherEmpire);
void RemoveGuest(LPCHARACTER ch);
// 물건 구입
// 물건 구입
virtual int Buy(LPCHARACTER ch, BYTE pos);
// 게스트에게 패킷을 보냄
// 게스트에게 패킷을 보냄
void BroadcastUpdateItem(BYTE pos);
// 판매중인 아이템의 갯수를 알려준다.
// 판매중인 아이템의 갯수를 알려준다.
int GetNumberByVnum(DWORD dwVnum);
// 아이템이 상점에 등록되어 있는지 알려준다.
// 아이템이 상점에 등록되어 있는지 알려준다.
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; // 이 상점에서 취급하는 물건들
std::vector<SHOP_ITEM> m_itemVector; // 이 상점에서 취급하는 물건들
LPCHARACTER m_pkPC;
};

View File

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

View File

@ -5,33 +5,33 @@
enum ESkillFlags
{
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_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), // 쓰고나면 잠시동안(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), // 불 속성
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,
// 무사 전사 계열
// 무사 전사 계열
// A
SKILL_SAMYEON = 1, // 삼연참(세번베기)
SKILL_PALBANG, // 팔방풍우
SKILL_SAMYEON = 1, // 삼연참(세번베기)
SKILL_PALBANG, // 팔방풍우
// S
SKILL_JEONGWI, // 전귀혼
SKILL_GEOMKYUNG, // 검경
SKILL_TANHWAN, // 탄환격
SKILL_JEONGWI, // 전귀혼
SKILL_GEOMKYUNG, // 검경
SKILL_TANHWAN, // 탄환격
// 무사 기공 계열
// 무사 기공 계열
// A
SKILL_GIGONGCHAM = 16, // 기공참
SKILL_GYOKSAN, // 격산타우
SKILL_DAEJINGAK, // 대진각
SKILL_GIGONGCHAM = 16, // 기공참
SKILL_GYOKSAN, // 격산타우
SKILL_DAEJINGAK, // 대진각
// S
SKILL_CHUNKEON, // 천근추
SKILL_GEOMPUNG, // 검풍
SKILL_CHUNKEON, // 천근추
SKILL_GEOMPUNG, // 검풍
// 자객 암살 계열
// 자객 암살 계열
// A
SKILL_AMSEOP = 31, // 암습
SKILL_GUNGSIN, // 궁신탄영
SKILL_CHARYUN, // 차륜살
SKILL_AMSEOP = 31, // 암습
SKILL_GUNGSIN, // 궁신탄영
SKILL_CHARYUN, // 차륜살
// S
SKILL_EUNHYUNG, // 은형법
SKILL_SANGONG, // 산공분
SKILL_EUNHYUNG, // 은형법
SKILL_SANGONG, // 산공분
// 자객 궁수 계열
// 자객 궁수 계열
// A
SKILL_YEONSA = 46, // 연사
SKILL_KWANKYEOK, // 관격술
SKILL_HWAJO, // 화조파
SKILL_YEONSA = 46, // 연사
SKILL_KWANKYEOK, // 관격술
SKILL_HWAJO, // 화조파
// S
SKILL_GYEONGGONG, // 경공술
SKILL_GIGUNG, // 기궁
SKILL_GYEONGGONG, // 경공술
SKILL_GIGUNG, // 기궁
// 수라 검
// 수라 검
// A
SKILL_SWAERYUNG = 61, // 쇄령지
SKILL_YONGKWON, // 용권파
SKILL_SWAERYUNG = 61, // 쇄령지
SKILL_YONGKWON, // 용권파
// S
SKILL_GWIGEOM, // 귀검
SKILL_TERROR, // 공포
SKILL_JUMAGAP, // 주마갑
SKILL_PABEOB, // 파법술
SKILL_GWIGEOM, // 귀검
SKILL_TERROR, // 공포
SKILL_JUMAGAP, // 주마갑
SKILL_PABEOB, // 파법술
// 수라 마법
// 수라 마법
// A
SKILL_MARYUNG = 76, // 마령
SKILL_HWAYEOMPOK, // 화염폭
SKILL_MUYEONG, // 무영진
SKILL_MARYUNG = 76, // 마령
SKILL_HWAYEOMPOK, // 화염폭
SKILL_MUYEONG, // 무영진
// S
SKILL_MANASHILED, // 흑신수호
SKILL_TUSOK, // 투속마령
SKILL_MAHWAN, // 마환격
SKILL_MANASHILED, // 흑신수호
SKILL_TUSOK, // 투속마령
SKILL_MAHWAN, // 마환격
// 무당 용신
// 무당 용신
// A
SKILL_BIPABU = 91,
SKILL_YONGBI, // 용비광사파
SKILL_PAERYONG, // 패룡나한무
SKILL_YONGBI, // 용비광사파
SKILL_PAERYONG, // 패룡나한무
// S
//SKILL_BUDONG, // 부동박부
SKILL_HOSIN, // 호신
SKILL_REFLECT, // 보호
SKILL_GICHEON, // 기천대공
//SKILL_BUDONG, // 부동박부
SKILL_HOSIN, // 호신
SKILL_REFLECT, // 보호
SKILL_GICHEON, // 기천대공
// 무당 뇌신
// 무당 뇌신
// A
SKILL_NOEJEON = 106, // 뇌전령
SKILL_BYEURAK, // 벼락
SKILL_CHAIN, // 체인라이트닝
SKILL_NOEJEON = 106, // 뇌전령
SKILL_BYEURAK, // 벼락
SKILL_CHAIN, // 체인라이트닝
// S
SKILL_JEONGEOP, // 정업인
SKILL_KWAESOK, // 이동속도업
SKILL_JEUNGRYEOK, // 증력술
SKILL_JEONGEOP, // 정업인
SKILL_KWAESOK, // 이동속도업
SKILL_JEUNGRYEOK, // 증력술
// 공통 스킬
// 공통 스킬
// 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,
// 보조 스킬
// 보조 스킬
SKILL_LEADERSHIP = 121, // 통솔력
SKILL_COMBO = 122, // 연계기
SKILL_CREATE = 123, // 제조
SKILL_LEADERSHIP = 121, // 통솔력
SKILL_COMBO = 122, // 연계기
SKILL_CREATE = 123, // 제조
SKILL_MINING = 124,
SKILL_LANGUAGE1 = 126, // 신수어 능력
SKILL_LANGUAGE2 = 127, // 천조어 능력
SKILL_LANGUAGE3 = 128, // 진노어 능력
SKILL_POLYMORPH = 129, // 둔갑
SKILL_LANGUAGE1 = 126, // 신수어 능력
SKILL_LANGUAGE2 = 127, // 천조어 능력
SKILL_LANGUAGE3 = 128, // 진노어 능력
SKILL_POLYMORPH = 129, // 둔갑
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_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, // 증혈
SKILL_RESIST_PENETRATE = 142, // 철통
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; // 번호
DWORD dwVnum; // 번호
DWORD dwType; // 0: 전직업, 1: 무사, 2: 자객, 3: 수라, 4: 무당
BYTE bMaxLevel; // 최대 수련도
BYTE bLevelLimit; // 레벨제한
int iSplashRange; // 스플래쉬 거리 제한
DWORD dwType; // 0: 전직업, 1: 무사, 2: 자객, 3: 수라, 4: 무당
BYTE bMaxLevel; // 최대 수련도
BYTE bLevelLimit; // 레벨제한
int iSplashRange; // 스플래쉬 거리 제한
BYTE bPointOn; // 어디에 결과값을 적용 시키는가? (타격치, MAX HP, HP REGEN 등등등)
CPoly kPointPoly; // 결과값 만드는 공식
BYTE bPointOn; // 어디에 결과값을 적용 시키는가? (타격치, MAX HP, HP REGEN 등등등)
CPoly kPointPoly; // 결과값 만드는 공식
CPoly kSPCostPoly; // 사용 SP 공식
CPoly kDurationPoly; // 지속 시간 공식
CPoly kDurationSPCostPoly; // 지속 SP 공식
CPoly kCooldownPoly; // 쿨다운 시간 공식
CPoly kMasterBonusPoly; // 마스터일 때 보너스 공식
CPoly kSplashAroundDamageAdjustPoly; // 스플래쉬 공격일 경우 주위 적에게 입히는 데미지 감소 비율
CPoly kSPCostPoly; // 사용 SP 공식
CPoly kDurationPoly; // 지속 시간 공식
CPoly kDurationSPCostPoly; // 지속 SP 공식
CPoly kCooldownPoly; // 쿨다운 시간 공식
CPoly kMasterBonusPoly; // 마스터일 때 보너스 공식
CPoly kSplashAroundDamageAdjustPoly; // 스플래쉬 공격일 경우 주위 적에게 입히는 데미지 감소 비율
DWORD dwFlag; // 스킬옵션
DWORD dwAffectFlag; // 스킬에 맞은 경우 적용되는 Affect
DWORD dwFlag; // 스킬옵션
DWORD dwAffectFlag; // 스킬에 맞은 경우 적용되는 Affect
BYTE bLevelStep; // 한번에 올리는데 필요한 스킬 포인트 수
DWORD preSkillVnum; // 배우는데 필요한 이전에 배워야할 스킬
BYTE preSkillLevel; // 이전에 배워야할 스킬의 레벨
BYTE bLevelStep; // 한번에 올리는데 필요한 스킬 포인트 수
DWORD preSkillVnum; // 배우는데 필요한 이전에 배워야할 스킬
BYTE preSkillLevel; // 이전에 배워야할 스킬의 레벨
int lMaxHit;
BYTE bSkillAttrType;
// 2차 적용
// 2차 적용
BYTE bPointOn2;
CPoly kPointPoly2;
CPoly kDurationPoly2;
@ -218,7 +218,7 @@ class CSkillProto
return dwVnum == SKILL_TANHWAN || dwVnum == SKILL_HORSE_CHARGE;
}
// 3차 적용
// 3차 적용
BYTE bPointOn3;
CPoly kPointPoly3;
CPoly kDurationPoly3;

View File

@ -8,7 +8,7 @@ class CTableBySkill : public singleton<CTableBySkill>
CTableBySkill()
: m_aiSkillDamageByLevel(NULL)
{
//스킬 레벨당 추가데미지 초기화
//스킬 레벨당 추가데미지 초기화
for ( int job = 0; job < JOB_MAX_NUM * 2; ++job )
m_aiSkillPowerByLevelFromType[job] = NULL;
}
@ -18,18 +18,18 @@ class CTableBySkill : public singleton<CTableBySkill>
DeleteAll();
}
//테이블 세팅 체크
//테이블 세팅 체크
bool Check() const;
//삭제
//삭제
void DeleteAll();
//스킬레벨단위 스킬파워 테이블
//스킬레벨단위 스킬파워 테이블
int GetSkillPowerByLevelFromType( int job, int skillgroup, int skilllevel, bool bMob ) const;
void SetSkillPowerByLevelFromType( int idx, const int* aTable );
void DeleteSkillPowerByLevelFromType( int idx );
//레벨당 추가 스킬데미지 테이블
//레벨당 추가 스킬데미지 테이블
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]; // 퀘스트에서 사용하는 이름
char szTargetDesc[32+1]; // 실제 클라이언트에 전송되는 이름
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 스킬 망각서
ITEM_SKILLFORGET2_VNUM = 70055, // 7, 8 스킬 망각서
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, // 열정의 가면
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,
// 용혼석 추출 확률을 높여주는 아이템
// 용혼석 추출 확률을 높여주는 아이템
DRAGON_SOUL_EXTRACTOR_GROUP = 10600,
// 용심 추출해주는 아이템
// 용심 추출해주는 아이템
DRAGON_HEART_EXTRACTOR_GROUP = 10601,
// 용혼석에서 추출할 때 주는 용심.
// 용혼석에서 추출할 때 주는 용심.
DRAGON_HEART_VNUM = 100000,
};

View File

@ -68,7 +68,7 @@ class CWarMap
DWORD GetWinnerGuild();
void UsePotion(LPCHARACTER ch, LPITEM item);
void Draw(); // 강제 무승부 처리
void Draw(); // 강제 무승부 처리
void Timeout();
void CheckWarEnd();
bool SetEnded();
@ -125,8 +125,8 @@ class CWarMap
void Initialize();
int GetAccumulatedJoinerCount(); // 누적된 참가자 수
int GetCurJointerCount(); // 현재 참가자 수
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, //산타
// MOB_SANTA_VNUM = 20095, //노해
MOB_SANTA_VNUM = 20031, //산타
// MOB_SANTA_VNUM = 20095, //노해
MOB_XMAS_TREE_VNUM = 20032,
MOB_XMAS_FIRWORK_SELLER_VNUM = 9004,
};