Move git root from Client/ to src/ to track all source code: - Client: Game client source (moved to Client/Client/) - Server: Game server source - GameTools: Development tools - CryptoSource: Encryption utilities - database: Database scripts - Script: Game scripts - rylCoder_16.02.2008_src: Legacy coder tools - GMFont, Game: Additional resources 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
611 lines
18 KiB
C++
611 lines
18 KiB
C++
#ifndef _GUILD_PACKET_H_
|
|
#define _GUILD_PACKET_H_
|
|
|
|
#include <Network/Packet/PacketBase.h>
|
|
#include <Creature/Character/CharacterClass.h>
|
|
#include <Creature/CreatureStructure.h>
|
|
|
|
#include <Community/Guild/GuildConstants.h>
|
|
#include <Community/Guild/GuildStructure.h>
|
|
|
|
#pragma pack(1)
|
|
|
|
using namespace Guild;
|
|
|
|
// 길드 생성
|
|
struct PktCreateGuild : public PktBase
|
|
{
|
|
enum PktCreateGuildErr
|
|
{
|
|
FAIL_ALREADY_NAME = 2, // 이미 존재하는 이름
|
|
FAIL_DISSOLVE_GUILD = 3, // 길드 해체
|
|
FAIL_INVALID_NAME = 4 // 부적절한 이름
|
|
};
|
|
|
|
enum DissolveReason
|
|
{
|
|
NONE_LOGIN = 1, // 오랫동안 아무도 로그인하지 않음
|
|
MIN_MEMBER_TIMEOUT = 2, // 길드원이 최소 인원 미만인 채 일정 시간 경과
|
|
NONE_NEXT_GUILDMASTER_BY_NONE_LOGIN = 3, // 일정기간 길드마스터가 로그인하지 않아, 권한 이양하려 할 시에 길마가 없을 경우
|
|
NONE_NEXT_GUILDMASTER_BY_GUILDMASTER_OUT = 4, // 길드마스터 탈퇴시에 권한 이양하려 할 시에 길마가 없을 경우
|
|
NONE_NEXT_GUILDMASTER_BY_GUILDMASTER_DELETED = 5 // 길드마스터 삭제시에 권한 이양하려 할 시에 길마가 없을 경우
|
|
};
|
|
|
|
unsigned long m_dwCID;
|
|
unsigned long m_dwGID;
|
|
unsigned char m_cInclination;
|
|
char m_szGuildName[MAX_GUILD_NAME_LEN];
|
|
};
|
|
|
|
// 길드 리스트 (가변 길이) + 길드 정보
|
|
struct PktGuildList : public PktBase
|
|
{
|
|
enum { MAX_NUM_PER_PAGE = 10 };
|
|
|
|
unsigned long m_dwCID; // 캐릭터 아이디
|
|
|
|
unsigned char m_cSortCmd; // 명령
|
|
unsigned char m_cPage; // 페이지
|
|
|
|
unsigned char m_cSmallNodeNum; // 노드 수 (C -> S : 체크섬 노드, S -> C : 간략 노드)
|
|
unsigned char m_cLargeNodeNum; // 노드 수 (전체 정보 노드)
|
|
};
|
|
|
|
// 길드 정보 (체크섬)
|
|
struct GuildCheckSumNode
|
|
{
|
|
unsigned long m_dwGID; // 길드 아이디
|
|
unsigned long m_dwCheckSum; // 체크섬
|
|
};
|
|
|
|
// 길드 정보 (종종 변하지만 간혹 요청되는 자잘한 것들)
|
|
struct GuildSmallInfoNode
|
|
{
|
|
// TODO : 국가, 레벨, 길드 이름은 GuildLargeInfoNode로 빼면 될 듯 합니다.
|
|
// (국가와 길드 이름은 변경되지 않습니다. 레벨은 마크나 관계처럼 변경시마다 브로드캐스팅하면 됩니다.)
|
|
// 더불어 길드 생성시 생성되는 길드의 GuildLargeInfoNode를 브로드캐스팅해야 합니다.
|
|
// (이 때 주의할 점은 길드 생성 패킷 전송 당시엔 마스터가 가입하지 않은 상태이므로 마스터 이름을 별도로 넣어줘야 합니다.)
|
|
|
|
unsigned long m_dwGID; // 길드 아이디
|
|
unsigned char m_cIndex; // 리스트상의 인덱스
|
|
unsigned char m_cInclination; // 길드 성향
|
|
|
|
unsigned short m_wRank; // 순위
|
|
unsigned long m_dwFame; // 명성
|
|
unsigned char m_cLevel; // 레벨
|
|
unsigned char m_cCurrentMemberNum; // 인원수
|
|
|
|
char m_szName[MAX_GUILD_NAME_LEN]; // 길드 이름
|
|
char m_szMasterName[MAX_MEMBER_NAME_LEN]; // 마스터 이름
|
|
|
|
GuildSmallInfoNode()
|
|
: m_dwGID(0), m_cIndex(0), m_cInclination(0), m_wRank(0), m_dwFame(0), m_cLevel(0), m_cCurrentMemberNum(0)
|
|
{
|
|
std::fill_n(m_szName, int(MAX_GUILD_NAME_LEN), 0);
|
|
std::fill_n(m_szMasterName, int(MAX_MEMBER_NAME_LEN), 0);
|
|
}
|
|
|
|
GuildSmallInfoNode(unsigned long dwGID, unsigned char cIndex, unsigned char cInclination,
|
|
unsigned short wRank, unsigned long dwFame, unsigned char cLevel,
|
|
unsigned char cCurrentMemberNum, const char* szGuildName, const char* szMasterName)
|
|
: m_dwGID(dwGID), m_cIndex(cIndex), m_cInclination(cInclination),
|
|
m_wRank(wRank), m_dwFame(dwFame), m_cLevel(cLevel), m_cCurrentMemberNum(cCurrentMemberNum)
|
|
{
|
|
if (NULL != szGuildName)
|
|
{
|
|
strncpy(m_szName, szGuildName, MAX_GUILD_NAME_LEN);
|
|
}
|
|
|
|
if (NULL != szMasterName)
|
|
{
|
|
strncpy(m_szMasterName, szMasterName, MAX_MEMBER_NAME_LEN);
|
|
}
|
|
}
|
|
};
|
|
|
|
// 길드 정보 (모두)
|
|
struct GuildLargeInfoNode : public GuildSmallInfoNode
|
|
{
|
|
char m_szMark[MAX_MARK_SIZE]; // 마크
|
|
unsigned char m_cRelationByMine; // 클라이언트(유저)가 이 길드에 맺은 길드 관계
|
|
unsigned char m_cRelationByTarget; // 이 길드가 클라이언트(유저)에게 맺은 길드 관계
|
|
|
|
GuildLargeInfoNode()
|
|
: GuildSmallInfoNode(), m_cRelationByMine(0), m_cRelationByTarget(0)
|
|
{
|
|
std::fill_n(m_szMark, int(MAX_MARK_SIZE), 0);
|
|
}
|
|
|
|
GuildLargeInfoNode(unsigned long dwGID, unsigned char cIndex, unsigned char cInclination,
|
|
unsigned short wRank, unsigned long dwFame, unsigned char cLevel,
|
|
unsigned char cCurrentMemberNum, const char* szMasterName, const char* szGuildName,
|
|
const char* szMark, unsigned char cRelationByMine, unsigned char cRelationByTarget)
|
|
: GuildSmallInfoNode(dwGID, cIndex, cInclination, wRank, dwFame, cLevel, cCurrentMemberNum, szGuildName, szMasterName),
|
|
m_cRelationByMine(cRelationByMine), m_cRelationByTarget(cRelationByTarget)
|
|
{
|
|
if (NULL != szMark)
|
|
{
|
|
memcpy(m_szMark, szMark, MAX_MARK_SIZE);
|
|
}
|
|
}
|
|
};
|
|
|
|
// 길드 멤버 관련 명령
|
|
struct PktGuildCmd : public PktBase
|
|
{
|
|
enum GuildCmd
|
|
{
|
|
GC_INVITE = 0, // 초대
|
|
GC_JOIN = 1, // 가입 (초대에 의한)
|
|
GC_REFUSE = 2, // 거절 (초대에 대한)
|
|
GC_ASK_ENTER = 3, // 가입 신청
|
|
GC_ASK_LEAVE = 4, // 탈퇴 신청
|
|
GC_KICK = 5, // 강제 탈퇴
|
|
GC_SETUP_TITLE = 6, // 직위 변경
|
|
GC_LOGINOUT = 7, // 로그인/아웃
|
|
GC_RANK_UP = 8, // 서열 위로
|
|
GC_RANK_DOWN = 9, // 서열 아래로
|
|
GC_TACTICS = 10, // 용병 가입 신청.
|
|
GC_TACTICS_JOIN = 11, // 용병 가입 초대.
|
|
GC_TACTICS_TITLE = 12, // 용병 허가.
|
|
GC_TACTICS_KICK = 13, // 용병 삭제.
|
|
GC_TACTICS_LEAVE = 14, // 용병 탈퇴.
|
|
GC_TACTICS_REQUEST = 15, // 길드 전쟁 중 용병 허가 시 캐릭터 확인 요청.
|
|
};
|
|
|
|
enum PktGuildCmdErr
|
|
{
|
|
FAIL_NOT_MEMBER = 2, // 길드원이 아님
|
|
FAIL_NOT_RIGHT = 3, // 권한이 없음
|
|
FAIL_ALREADY_MEMBER = 4, // 이미 길드원임
|
|
FAIL_OVER_MEMBER = 5, // 길드 정원 초과
|
|
FAIL_NATION = 6, // 다른 국가의 길드
|
|
|
|
FAIL_DIFFERENCE_TITLE = 7, // 다른 직위로의 서열 변경
|
|
FAIL_OVER_MEMBER_NUM = 8, // 길드원 수 범위를 초과하는 서열 변경
|
|
|
|
FAIL_GUILDWAR_TIME_KICK = 9, // 길드전쟁 시간에 탈퇴를 시도하는 경우
|
|
|
|
FAIL_TACTICS_LIMITLEVEL = 10, // 용병 신청 레벨이 안되는 캐릭터.
|
|
FAIL_TACTICS_NATION = 11, // 국적이 다른 캐릭터.
|
|
FAIL_TACTICS_GUILDJOIN = 12, // 길드나 용병에 가입되어있거나 신청중인 캐릭터.
|
|
FAIL_TACTICS_OVER_MEMBER = 13, // 길드 정원 초과.
|
|
|
|
FAIL_TACTICS_LOGOUT = 14 // 용병 허가 시 로그아웃 상태일때.
|
|
};
|
|
|
|
unsigned long m_dwGID; // 길드 아이디
|
|
|
|
unsigned long m_dwSenderID; // 캐릭터 아이디 (주체)
|
|
unsigned long m_dwReferenceID; // 참조 아이디 (대상 캐릭터/서버 아이디/권한 비트)
|
|
|
|
char m_szGuildName[MAX_GUILD_NAME_LEN]; // 길드 이름
|
|
char m_szSenderName[MAX_MEMBER_NAME_LEN]; // 캐릭터 이름 (주체)
|
|
|
|
unsigned short m_wCmd; // 명령
|
|
};
|
|
|
|
// 멤버 리스트 (가변 길이) + 멤버 정보
|
|
struct PktGuildMemberList : public PktBase
|
|
{
|
|
enum { MAX_NUM_PER_PAGE = 10 };
|
|
|
|
unsigned long m_dwCID; // 캐릭터 아이디
|
|
|
|
unsigned char m_cMemberType; // 멤버리스트, 용병리스트
|
|
unsigned char m_cSortCmd; // 명령 (Guild::MemberSort)
|
|
unsigned char m_cPage; // 페이지
|
|
|
|
unsigned char m_cTotalMemberNum; // 총 멤버 수
|
|
unsigned char m_cNodeNum; // 노드 수 (멤버 노드)
|
|
};
|
|
|
|
// 멤버 정보
|
|
struct GuildMemberInfoNode
|
|
{
|
|
unsigned long m_dwCID;
|
|
|
|
char m_szName[MAX_MEMBER_NAME_LEN];
|
|
unsigned char m_cTactics;
|
|
|
|
unsigned long m_dwFame;
|
|
unsigned long m_dwGold;
|
|
unsigned long m_dwServerID;
|
|
|
|
unsigned char m_cRank;
|
|
unsigned char m_cTitle;
|
|
unsigned char m_cLevel;
|
|
unsigned char m_cClass;
|
|
unsigned char m_cGuildWarFlag;
|
|
};
|
|
|
|
// 멤버 정보 업데이트 (Game <-> DBAgent)
|
|
struct PktGuildMemberInfoUpdate : public PktBase
|
|
{
|
|
unsigned long m_dwGID;
|
|
unsigned long m_dwCID;
|
|
|
|
MemberListInfo m_MemberListInfo;
|
|
MemberDetailInfo m_MemberDetailInfo;
|
|
};
|
|
|
|
// 멤버 명성 업데이트
|
|
struct PktGuildMemberFameUpdate : public PktBase
|
|
{
|
|
unsigned long m_dwOurGID;
|
|
unsigned long m_dwEnemyGID;
|
|
unsigned long m_dwCID;
|
|
unsigned char m_cType;
|
|
int m_nAddFame;
|
|
};
|
|
|
|
// 멤버 돈 업데이트
|
|
struct PktGuildMemberGoldUpdate : public PktBase
|
|
{
|
|
unsigned long m_dwGID;
|
|
unsigned long m_dwCID;
|
|
unsigned long m_dwGold;
|
|
};
|
|
|
|
// 길드 마크
|
|
struct PktGuildMark : public PktBase
|
|
{
|
|
enum eError
|
|
{
|
|
FAIL_INVALID_GUILD = 2, // 존재하지않는 길드
|
|
FAIL_INVALID_MARK = 3, // 변경할 마크가 없음
|
|
FAIL_INVALID_CHARACTER = 4, // 존재하지않는 캐릭터
|
|
FAIL_NOT_MASTER = 5, // 마스터가 아님
|
|
FAIL_NOT_ENOUGH_GOLD = 6, // 금액 부족
|
|
};
|
|
|
|
unsigned long m_dwCID; // 캐릭터 아이디
|
|
unsigned long m_dwGID; // 길드 아이디
|
|
|
|
char m_szMark[MAX_MARK_SIZE]; // 마크
|
|
unsigned long m_dwGold; // 금고 잔액
|
|
};
|
|
|
|
// 길드 레벨
|
|
struct PktGuildLevel : public PktBase
|
|
{
|
|
unsigned long m_dwUID; // 아이디 (C -> S : 캐릭터 아이디, S -> C : 길드 아이디)
|
|
unsigned char m_cLevel; // 레벨
|
|
unsigned long m_dwGold; // 금고 잔액
|
|
};
|
|
|
|
// 길드 관계
|
|
struct PktGuildRelation : public PktBase
|
|
{
|
|
enum eSubCmd
|
|
{
|
|
GR_HOSTILITY = 0, // 적대 선언
|
|
GR_PEACE = 1, // 평화 선언
|
|
GR_ALERT = 2, // 경계 적대 선언
|
|
GR_COUNTER = 3, // 카운터 적대 선언
|
|
GR_REQUEST = 4, // 이미 적대인 길드와 평화 선언후 대상 길드와 적대 선언
|
|
// 카운터 적대 선언을 할지 물어보는 대화창
|
|
GR_HOSTILITYDEL = 5 // A->B로 적대선언을 한후 A->B에게 평화선언을 해도 B의 Target에 존재하는
|
|
// 적대선언 리스트는 사라지지 않는다. B가 직접 5번 커맨드로 취소해줘야만
|
|
// 취소가 된다.
|
|
};
|
|
|
|
enum eError
|
|
{
|
|
FAIL_NOT_MEMBER = 2, // 해당 길드의 멤버가 아님
|
|
FAIL_NOT_HOSTILITY_TIME = 3, // 적대 선언을 할수 없는 시간
|
|
FAIL_NOT_ALERT_TIME = 4, // 경계 적대 선언을 할수 없는 시간
|
|
FAIL_NOT_COUNTER_TIME = 5, // 카운터 적대 선언을 할수 없는 시간
|
|
FAIL_NOT_MASTER = 6, // 길드의 마스터가 아님
|
|
FAIL_NOT_EXIST_GUILD = 7, // 길드 ID가 0 이거나 길드가 존재하지 않음
|
|
FAIL_SELF_GUILD = 8, // 자신의 길드에게 적대/평화/경계/카운터 선언
|
|
FAIL_ALREADY_HOSTILITY = 9, // 대상 길드와 이미 적대 관계입니다.
|
|
FAIL_ALREADY_COUNTER_HOSTILITY = 10, // 대상 길드와 이미 카운터 적대 관계입니다.
|
|
FAIL_ALREADY_ALERT_HOSTILITY = 11, // 데상 길드와 이미 경계 적대 관계입니다.
|
|
FAIL_ALREADY_NEUTRALITY = 12, // 대상 길드와 이미 중립 관계입니다.
|
|
FAIL_MAX_ALERT_NUM = 13, // 경계 적대 선언권 초과
|
|
FAIL_NOT_HAVE_DEVELOPING_CAMP = 14, // 구축중인 길드 요새가 없음
|
|
FAIL_NOT_HAVE_ALERT = 15, // 경계 적대 신청을 받지 않고 카운터 적대 신청을 하려함
|
|
FAIL_TARGET_HOSTILITY_FULL = 16, // 적대 선언 받을 수 있는 한계치 초과
|
|
|
|
FAIL_REQUEST_WINDOW = 100, // 적대 선언수 초과로 인해 평화 선언후 적대 선언을 하도록 인증
|
|
FAIL_REQUEST_COUNTER = 101, // 카운터 적대 선언을 하도록 인증
|
|
};
|
|
|
|
unsigned long m_dwCID; // 캐릭터 아이디
|
|
unsigned long m_dwGID; // 자신의 GID
|
|
unsigned long m_dwTargetGID; // 상대 길드 아이디
|
|
unsigned long m_dwValue; // 적대 선언중인 GID ( GR_REQUEST 일때만... )
|
|
char m_cSubCmd; // 길드 관계 변경 커맨드
|
|
|
|
char m_szGuildName[MAX_GUILD_NAME_LEN]; // 대상 길드명 / 선포 길드명
|
|
char m_szTempGuildName[MAX_GUILD_NAME_LEN]; // 이미 적대 선언중인 길드 이름
|
|
};
|
|
|
|
// 길드 성향
|
|
struct PktGuildInclination : public PktBase
|
|
{
|
|
enum PktGIErr
|
|
{
|
|
FAIL_SO_FAST = 2, // 일정 시간동안을 변경할 수 없다.
|
|
FAIL_WRONG_NATION_KARTERANT = 3, // 카르테란트 길드에는 인간만 속할 수 있다.
|
|
FAIL_WRONG_NATION_MERKADIA = 4 // 메르카디아 길드에는 아칸만 속할 수 있다.
|
|
};
|
|
|
|
unsigned long m_dwUID; // 아이디 (C -> S : 캐릭터 아이디, S -> C : 길드 아이디)
|
|
unsigned char m_cInclination; // 성향 (Guild::Inclination 참고)
|
|
};
|
|
|
|
// 길드 권한 정보
|
|
struct GuildRight
|
|
{
|
|
enum Index
|
|
{
|
|
PUT_STOREHOUSE = 0,
|
|
GET_STOREHOUSE = 1,
|
|
USE_SAFE = 2,
|
|
INVITE_MEMBER = 3,
|
|
PERMIT_JOIN = 4,
|
|
CHANGE_PASSWORD = 5,
|
|
|
|
REGULATE_TEX = 6,
|
|
KICK_MEMBER = 7,
|
|
BOARD_ADMIN = 8,
|
|
|
|
SETUP_MARK_N_LEVEL = 9,
|
|
SETUP_MIDDLE = 10,
|
|
DIVIDE_GOLD = 11,
|
|
SETUP_POLICY = 12,
|
|
|
|
MAX_USING_RIGHT = 13
|
|
};
|
|
|
|
unsigned char m_aryRight[MAX_RIGHT_SIZE];
|
|
|
|
GuildRight()
|
|
{
|
|
Init(false);
|
|
}
|
|
|
|
GuildRight(bool bMaxRight)
|
|
{
|
|
Init(bMaxRight);
|
|
}
|
|
|
|
void Init(bool bMaxRight)
|
|
{
|
|
std::fill_n(m_aryRight, int(MAX_RIGHT_SIZE), Guild::NONE);
|
|
|
|
m_aryRight[CHANGE_PASSWORD] = (true == bMaxRight) ? Guild::COMMON : Guild::MASTER;
|
|
m_aryRight[PUT_STOREHOUSE] = (true == bMaxRight) ? Guild::COMMON : Guild::MASTER;
|
|
m_aryRight[GET_STOREHOUSE] = (true == bMaxRight) ? Guild::COMMON : Guild::MASTER;
|
|
m_aryRight[USE_SAFE] = (true == bMaxRight) ? Guild::COMMON : Guild::MASTER;
|
|
m_aryRight[INVITE_MEMBER] = (true == bMaxRight) ? Guild::COMMON : Guild::MASTER;
|
|
m_aryRight[PERMIT_JOIN] = (true == bMaxRight) ? Guild::COMMON : Guild::MASTER;
|
|
|
|
m_aryRight[REGULATE_TEX] = (true == bMaxRight) ? Guild::MIDDLE_ADMIN : Guild::MASTER;
|
|
m_aryRight[KICK_MEMBER] = (true == bMaxRight) ? Guild::MIDDLE_ADMIN : Guild::MASTER;
|
|
m_aryRight[BOARD_ADMIN] = (true == bMaxRight) ? Guild::MIDDLE_ADMIN : Guild::MASTER;
|
|
|
|
m_aryRight[SETUP_MARK_N_LEVEL] = (true == bMaxRight) ? Guild::MASTER : Guild::MASTER;
|
|
m_aryRight[SETUP_MIDDLE] = (true == bMaxRight) ? Guild::MASTER : Guild::MASTER;
|
|
m_aryRight[DIVIDE_GOLD] = (true == bMaxRight) ? Guild::MASTER : Guild::MASTER;
|
|
m_aryRight[SETUP_POLICY] = (true == bMaxRight) ? Guild::MASTER : Guild::MASTER;
|
|
}
|
|
|
|
int IsValid(void)
|
|
{
|
|
GuildRight MaxRight(true);
|
|
|
|
int nIndex = 0;
|
|
for (; nIndex < MAX_RIGHT_SIZE; ++nIndex)
|
|
{
|
|
if (m_aryRight[nIndex] > MaxRight.m_aryRight[nIndex])
|
|
{
|
|
return nIndex;
|
|
}
|
|
}
|
|
|
|
return nIndex;
|
|
}
|
|
};
|
|
|
|
// 길드 권한
|
|
struct PktGuildRight : public PktBase
|
|
{
|
|
unsigned long m_dwUID; // 아이디 (C -> S : 캐릭터 아이디, S -> C : 길드 아이디)
|
|
GuildRight m_GuildRight; // 길드 권한
|
|
};
|
|
|
|
// 자기 길드 정보
|
|
struct PktMyGuildInfo : public PktBase
|
|
{
|
|
unsigned long m_dwGold; // 길드 금고
|
|
|
|
GuildRight m_GuildRight; // 길드 권한
|
|
unsigned char m_cTitle; // 직위
|
|
};
|
|
|
|
// 적대 현황 리스트 (가변 길이) + 적대 현황 정보
|
|
struct PktGuildHostilityList : public PktBase
|
|
{
|
|
enum { MAX_NUM_PER_PAGE = 5 };
|
|
|
|
enum PageState
|
|
{
|
|
PAGE_CURRENT = 0,
|
|
PAGE_PREV = 1,
|
|
PAGE_NEXT = 2
|
|
};
|
|
|
|
unsigned long m_dwCID; // 캐릭터 아이디
|
|
|
|
unsigned char m_cCurrentPage; // 현재 페이지
|
|
unsigned char m_cPageState; // 요청한 페이지의 상태
|
|
unsigned char m_cNodeNum; // 가변 노드수
|
|
unsigned short m_wTotalItemNum; // 적대 현황의 총 리스트 수
|
|
|
|
char m_szHostility[MAX_GUILD_NAME_LEN]; // 적대 선언 중인 길드명
|
|
char m_szAlert[MAX_GUILD_NAME_LEN]; // 경계 적대 선언중인 길드명
|
|
};
|
|
|
|
// 길드 적대 현황 정보
|
|
struct GuildHostilityInfoNode
|
|
{
|
|
char m_szName[MAX_GUILD_NAME_LEN]; // 적대 관계 길드 이름
|
|
unsigned char m_cRelationType; // 적대 관계 타입 (Guild::Relation)
|
|
};
|
|
|
|
// 자신의 길드의 관계 리스트 요청 패킷 (가변 길이) + 관계 정보
|
|
struct PktGuildRelationInfo : public PktBase
|
|
{
|
|
unsigned long m_dwCID; // 요청 캐릭터
|
|
unsigned long m_dwGID; // 자신의 길드 ID
|
|
unsigned short m_wNodeNum; // 가변 노드수
|
|
};
|
|
|
|
// 길드 관계 정보
|
|
struct GuildRelationInfoNode
|
|
{
|
|
// GuildLargeInfo 의 내용과 동일
|
|
unsigned long m_dwGID;
|
|
unsigned char m_cRelationByMine;
|
|
unsigned char m_cRelationByTarget;
|
|
};
|
|
|
|
// 길드 금고
|
|
struct PktGuildSafe : public PktBase
|
|
{
|
|
enum PktGuildSafeErr
|
|
{
|
|
FAIL_NOT_ENOUGH_MONEY = 2, // 금고에 돈이 충분치 않음
|
|
FAIL_NOT_CHAR_MONEY = 3, // 캐릭터에 돈이 충분치 않음
|
|
FAIL_NOT_GUILD_DEPOSIT = 4, // 금고 입금하는데 실패했습니다.
|
|
FAIL_NOT_GUILD_UPDATE = 5, // 금고 정보를 업데이트 하는데 실패했습니다.
|
|
FAIL_REQUEST_DATA = 6, // 정보를 요청중입니다.
|
|
};
|
|
|
|
enum SafeCmd
|
|
{
|
|
SC_WITHDRAWAL = 0, // 출금
|
|
SC_DEPOSIT = 1, // 입금
|
|
SC_RELEASE = 2, // 길드원에게 방출
|
|
SC_REFER = 3, // 사용 내역 조회
|
|
SC_CAMPSHOP = 4, // 길드 요새 상점의 수익금
|
|
SC_BONUS = 5, // 보너스 입금
|
|
};
|
|
|
|
unsigned long m_dwCID; // 캐릭터 아이디
|
|
unsigned long m_dwGold; // 입금/출금/방출하는 금액
|
|
unsigned char m_cCmd; // 명령
|
|
};
|
|
|
|
// 길드 금고 Ack
|
|
struct PktGuildSafeAck : public PktBase
|
|
{
|
|
unsigned long m_dwCID; // 캐릭터 아이디
|
|
unsigned long m_dwGID; // 길드 아이디
|
|
|
|
unsigned long m_dwSafeGold; // 금고 잔액
|
|
unsigned long m_dwCharGold; // 캐릭터 잔액 (C -> S : 입금/출금/방출하는 금액)
|
|
|
|
unsigned char m_cCmd; // 명령
|
|
|
|
char m_szCharName[Guild::MAX_MEMBER_NAME_LEN]; // 캐릭터 이름
|
|
};
|
|
|
|
// 길드 DB (가변 길이) + 길드 정보
|
|
struct PktGuildDB : public PktBase
|
|
{
|
|
bool m_bStartFlag; // 시작 패킷인가? (PktGuildDB는 길드 수만큼 보내므로 첫번째 길드를 받았을 때 리스트를 초기화 해주어야 한다.)
|
|
|
|
unsigned long m_dwGID; // 길드 아이디
|
|
|
|
unsigned char m_cTotalMemberNum; // 길드원 수
|
|
unsigned char m_cRelationByMineNum; // 내가 맺은 길드 관계수
|
|
unsigned char m_cRelationByTargetNum; // 다른 길드가 맺은 길드 관계수
|
|
|
|
unsigned short m_wSize; // 길드 정보 크기
|
|
};
|
|
|
|
// 길드 정보 (DB)
|
|
struct GuildInfoDB
|
|
{
|
|
unsigned long m_dwGID;
|
|
char m_strName[MAX_GUILD_NAME_FOR_DB];
|
|
unsigned char m_cLevel;
|
|
unsigned long m_dwFame;
|
|
unsigned long m_dwGold;
|
|
TIME m_tmLastLogout;
|
|
TIME m_tmCheckMember;
|
|
TIME m_tmGMLastLogout;
|
|
char m_szMark[MAX_MARK_SIZE];
|
|
char m_szRight[MAX_RIGHT_SIZE];
|
|
unsigned char m_cInclination;
|
|
TIME m_tmChangeInclination;
|
|
};
|
|
|
|
// 길드 멤버 (DB)
|
|
struct GuildMemberDB
|
|
{
|
|
unsigned long m_dwGID;
|
|
unsigned long m_dwCID;
|
|
unsigned long m_dwRank;
|
|
char m_strName[MAX_MEMBER_NAME_LEN];
|
|
unsigned long m_dwTitle;
|
|
unsigned char m_cLevel;
|
|
unsigned short m_wClass;
|
|
unsigned long m_dwFame;
|
|
unsigned long m_dwGold;
|
|
unsigned char m_cGuildWarFlag;
|
|
TIME m_LeaveGuildTime;
|
|
|
|
unsigned char m_cTactics;
|
|
};
|
|
|
|
// 길드 관계 (DB)
|
|
struct GuildRelationDB
|
|
{
|
|
unsigned long m_dwGID;
|
|
unsigned long m_dwTargetGID;
|
|
unsigned char m_cRelation;
|
|
};
|
|
|
|
// 길드 포지션 설정 패킷.
|
|
struct PktGuildPosition : public PktBase
|
|
{
|
|
enum PktErr
|
|
{
|
|
FAIL_GUILD = 1, // 길드가 없을때.
|
|
FAIL_CONNECT_CHAR = 2, // 캐릭터가 접속 중일때.
|
|
FAIL_DB_UPDATE = 3, // DB 업데이트 실패.
|
|
FAIL_MEMBER_DELETE = 4 // 길드 멤버 삭제 실패.
|
|
};
|
|
|
|
enum Const
|
|
{
|
|
TYPE_POSITION = 0, // 포지션 변경시.
|
|
TYPE_MEMBERDELETE = 1 // 길드 멤버 삭제시.
|
|
};
|
|
|
|
unsigned long m_dwGID;
|
|
unsigned long m_dwCID;
|
|
unsigned char m_cPosition;
|
|
unsigned char m_cType;
|
|
};
|
|
|
|
// 위치가 없어서 임시로(조이스틱 키 설정 관련).
|
|
struct PktKeyInfo : public PktBase
|
|
{
|
|
enum Const
|
|
{
|
|
MAX_KEY_INFO = 34
|
|
};
|
|
|
|
unsigned long m_dwCID;
|
|
unsigned long m_dwKeyInfo[MAX_KEY_INFO];
|
|
};
|
|
|
|
#pragma pack()
|
|
|
|
#endif |