Files
Leviathan/Server/GameServer/Game/Message/GameMessage.h
T
2026-06-01 12:46:52 +02:00

4316 lines
113 KiB
C++

#pragma once
#include <mmo/ArType.h>
#include <mmo/ArTime.h>
#include "ItemBase.h"
#include "ItemInstance.h"
#include "CreatureBase.h"
#include "QuestBase.h"
#include "QuestInstance.h"
#include "BattleArenaBase.h"
#include "MessageType.h"
#include "FieldPropManager.h"
#include <hack_shield/AntiCpXSvr.h>
#include <xtrap/Xtrap_S_Interface.h>
#include "GameRule.h"
#include "GameType.h"
#define _INIT(_id) { memset( this, 0, sizeof(*this) ); id = _id; size = sizeof( *this ); }
#pragma pack( 1 )
const unsigned short TM_COMMON = 9998;
const unsigned short TM_NONE = 9999;
const unsigned short TM_CS_VERSION_OLD = 50;
const unsigned short TM_CS_VERSION = 51;
const unsigned short TM_SC_INFO = 52;
const unsigned short TM_SC_ANTI_HACK = 53;
const unsigned short TM_CS_ANTI_HACK = 54;
const unsigned short TM_SC_GAME_GUARD_AUTH_QUERY = 55;
const unsigned short TM_CS_GAME_GUARD_AUTH_ANSWER = 56;
const unsigned short TM_CS_CHECK_ILLEGAL_USER = 57;
const unsigned short TM_SC_XTRAP_CHECK = 58;
const unsigned short TM_CS_XTRAP_CHECK = 59;
const unsigned short TM_CS_REQUEST = 60;
const unsigned short TM_SC_RESULT = 0;
const unsigned short TM_CS_LOGIN = 1; //1 - 61
const unsigned short TM_SC_LOGIN_RESULT = 4; //4 - 64
const unsigned short TM_TIMESYNC = 2;
const unsigned short TM_SC_ENTER = 3;
const unsigned short TM_CS_QUERY = 13;
const unsigned short TM_CS_MOVE_REQUEST = 5; //5 - 65
const unsigned short TM_SC_MOVE_ACK = 6; //6 - 66
const unsigned short TM_CS_REGION_UPDATE = 7; //7 - 67
const unsigned short TM_SC_REGION_ACK = 11;
const unsigned short TM_CS_ENTER_EVENT_AREA = 15;
const unsigned short TM_CS_LEAVE_EVENT_AREA = 16;
const unsigned short TM_SC_MOVE = 8;
const unsigned short TM_SC_FORCE_MOVE = 14;
const unsigned short TM_SC_LEAVE = 9;
const unsigned short TM_SC_WARP = 12;
const unsigned short TM_SC_SET_TIME = 10;
const unsigned short TM_CS_CHAT_REQUEST = 20;
const unsigned short TM_SC_CHAT_LOCAL = 21;
const unsigned short TM_SC_CHAT = 22;
const unsigned short TM_SC_CHAT_RESULT = 24;
const unsigned short TM_CS_RETURN_LOBBY = 23;
const unsigned short TM_CS_REQUEST_RETURN_LOBBY= 25;
const unsigned short TM_CS_REQUEST_LOGOUT = 26;
const unsigned short TM_CS_LOGOUT = 27;
const unsigned short TM_SC_DISCONNECT_DESC = 28;
const unsigned short TM_SC_CHANGE_NAME = 30;
const unsigned short TM_CS_CHANGE_ALIAS = 31;
const unsigned short TM_CS_ATTACK_REQUEST = 100;
const unsigned short TM_SC_ATTACK_EVENT = 101;
const unsigned short TM_SC_CANT_ATTACK = 102;
const unsigned short TM_SC_KNOCK_BACK = 104;
const unsigned short TM_CS_CANCEL_ACTION = 150;
const unsigned short TM_CS_PUTON_ITEM = 200; // 아이템 장비 요청
const unsigned short TM_CS_PUTOFF_ITEM = 201; // 아이템 장비해제 요청
const unsigned short TM_SC_WEAR_INFO = 202; // 아이템 장비 정보 - 첫 enter 시, 혹은 장비 변경시 방송됨
const unsigned short TM_CS_DROP_ITEM = 203; // 아이템 버림 요청
const unsigned short TM_CS_TAKE_ITEM = 204; // Item pickup request
const unsigned short TM_SC_DROP_RESULT = 205; // 아이템 버림 결과
const unsigned short TM_SC_INVENTORY = 207; // 인벤 내용
const unsigned short TM_CS_ERASE_ITEM = 208; // 아이템 파기
const unsigned short TM_SC_ERASE_ITEM = 209; // 아이템 파기 결과
const unsigned short TM_SC_TAKE_ITEM_RESULT = 210;
const unsigned short TM_SC_OPEN_STORAGE = 211; // 창고를 여셈~
const unsigned short TM_CS_STORAGE = 212; // 창고 아이템 이동
const unsigned short TM_SC_GET_CHAOS = 213; // 혼돈 얻음
const unsigned short TM_CS_PUTON_CARD = 214; // 벨트 슬롯에 아이템 장착
const unsigned short TM_CS_PUTOFF_CARD = 215; // 벨트 슬롯에 아이템 장착
const unsigned short TM_SC_BELT_SLOT_INFO = 216; // 벨트 슬롯 정보
const unsigned short TM_SC_ITEM_COOL_TIME = 217; // 아이템 쿨타임
const unsigned short TM_CS_CHANGE_ITEM_POSITION = 218; // 아이템 위치 변경(정렬)
const unsigned short TM_CS_ARRANGE_ITEM = 219; // 인벤토리/창고 아이템 정렬
const unsigned short TM_SC_HAIR_INFO = 220; // 헤어 정보 방송 - 첫 enter 시, 혹은 염색/헤어 스타일 변경 시 방송됨
const unsigned short TM_CS_HIDE_EQUIP_INFO = 221; // 장비 숨기기 정보 변경 요청
const unsigned short TM_SC_HIDE_EQUIP_INFO = 222; // 장비 숨기기 정보 방송 - TM_CS_HIDE_EQUIP_INFO 처리 시 방송됨
const unsigned short TM_CS_SWAP_EQUIP = 223; // 장비 스왑
const unsigned short TM_SC_SKIN_INFO = 224; // 피부 색상 변경
const unsigned short TM_SC_NPC_TRADE_INFO = 240; // 아이템 상점(NPC) 판매/구매 결과
const unsigned short TM_SC_MARKET = 250; // 상점 아이템 리스트
const unsigned short TM_CS_BUY_ITEM = 251; // 아이템 구입
const unsigned short TM_CS_SELL_ITEM = 252; // 아이템 판매
const unsigned short TM_CS_USE_ITEM = 253; // 아이템 사용
const unsigned short TM_SC_DESTROY_ITEM = 254; // 아이템 제거
const unsigned short TM_SC_UPDATE_ITEM_COUNT = 255; // 아이템 제거
const unsigned short TM_CS_MIX = 256; // 아이템 조합
const unsigned short TM_SC_MIX_RESULT = 257; // 아이템 조합 결과
const unsigned short TM_CS_DONATE_ITEM = 258; // 아이템 기부
const unsigned short TM_CS_DONATE_REWARD = 259; // 아이템 기부 보상 받기 요청
const unsigned short TM_SC_SHOW_SOULSTONE_CRAFT_WINDOW = 259; // 아이템 소켓 UI 표시 요청
const unsigned short TM_CS_SOULSTONE_CRAFT = 260; // 소켓 UI에 의한 소울스톤 세공
const unsigned short TM_SC_SHOW_SOULSTONE_REPAIR_WINDOW = 261; // 아이템 소울스톤 내구도 수리 UI 표시 요청
const unsigned short TM_CS_REPAIR_SOULSTONE = 262; // 소켓 아이템 내구도 수리
const unsigned short TM_CS_TRANSMIT_ETHEREAL_DURABILITY = 263; // 아이템 내구도 충전
const unsigned short TM_CS_TRANSMIT_ETHEREAL_DURABILITY_TO_EQUIPMENT = 264; // 장비 전체 수리
const unsigned short TM_CS_DECOMPOSE = 265; // 아이템 분해
const unsigned short TM_SC_DECOMPOSE_RESULT = 266; // 아이템 분해 결과
const unsigned short TM_TRADE = 280; // 트레이드
const unsigned short TM_CS_PUTON_ITEM_SET = 281; // 풀셋 아이템 장착 요청
const unsigned short TM_SC_ITEM_DROP_INFO = 282; // 어떤 몹이 어떤 아템 떨어트리는건지 정보
const unsigned short TM_SC_USE_ITEM_RESULT = 283; // 아이템 사용 결과
const unsigned short TM_CS_BIND_SKILLCARD = 284;
const unsigned short TM_CS_UNBIND_SKILLCARD = 285;
const unsigned short TM_SC_SKILLCARD_INFO = 286;
const unsigned short TM_SC_ITEM_WEAR_INFO = 287; // 아이템 장비 정보 - 첫 enter 시, 혹은 장비 변경시 방송됨
//const unsigned short TM_SC_ADD_SUMMON = 300; // 소환수 생성됨 통지
const unsigned short TM_SC_ADD_SUMMON_INFO = 301; // 편성된 소환수 정보 추가
const unsigned short TM_SC_REMOVE_SUMMON_INFO = 302; // 편성된 소환수 정보 제거
const unsigned short TM_EQUIP_SUMMON = 303; // 소환수 편성 정보
const unsigned short TM_CS_SUMMON = 304; // 소환/역소환 요청
const unsigned short TM_SC_UNSUMMON = 305; // 역소환 통지
const unsigned short TM_SC_UNSUMMON_NOTICE = 306; // 역소환 알림( x시간 후에 역소환 됨 )
const unsigned short TM_SC_SUMMON_EVOLUTION = 307;
const unsigned short TM_SC_TAMING_INFO = 310; // 테이밍 정보
const unsigned short TM_SC_MOUNT_SUMMON = 320;
const unsigned short TM_SC_UNMOUNT_SUMMON = 321;
const unsigned short TM_SC_SHOW_SUMMON_NAME_CHANGE = 322; // 소환수 이름 변경 UI 출력 요청
const unsigned short TM_CS_CHANGE_SUMMON_NAME = 323; // 변경될 소환수 이름(대상은 StructPlayer가 들고 있음)
const unsigned short TM_CS_GET_SUMMON_SETUP_INFO = 324; // 소환수 편성 정보를 포함하는 메시지 요청(편성 창 띄우기로 사용)
const unsigned short TM_SC_UNSUMMON_PET = 350; // 펫 역소환 통지
const unsigned short TM_SC_ADD_PET_INFO = 351; // 보유 중인 펫 정보 추가
const unsigned short TM_SC_REMOVE_PET_INFO = 352; // 보유 중인 펫 정보 제거
const unsigned short TM_SC_SHOW_SET_PET_NAME = 353; // 펫 이름 설정 창 표시
const unsigned short TM_CS_SET_PET_NAME = 354; // 펫 이름 설정
const unsigned short TM_CS_SKILL = 400;
const unsigned short TM_SC_SKILL = 401;
const unsigned short TM_CS_LEARN_SKILL = 402;
const unsigned short TM_SC_SKILL_LIST = 403;
const unsigned short TM_SC_ADDED_SKILL_LIST = 404;
const unsigned short TM_CS_JOB_LEVEL_UP = 410;
const unsigned short TM_SC_SKILL_EFFECT = 404;
//const unsigned short TM_SC_SKILL_CASTING_TIME = 405;
const unsigned short TM_SC_STATE_RESULT = 406;
const unsigned short TM_SC_AURA = 407;
const unsigned short TM_CS_REQUEST_REMOVE_STATE = 408;
//const unsigned short TM_CS_SKILL_LEVEL_LIST = 450;
const unsigned short TM_SC_SKILL_LEVEL_LIST = 451;
const unsigned short TM_CS_SUMMON_CARD_SKILL_LIST = 452;
const unsigned short TM_SC_STATUS_CHANGE = 500;
//const unsigned short TM_SC_HP = 501;
//const unsigned short TM_SC_MP = 502;
const unsigned short TM_CS_UPDATE = 503; // HP/MP 채우는거나 기타등등. 30초가량마다 한번씩 다오~
const unsigned short TM_SC_DEAD = 504; // 사망~
const unsigned short TM_SC_STATE = 505; // 상태이상 메시지
const unsigned short TM_SC_PROPERTY = 507; // 프로퍼티
const unsigned short TM_CS_SET_PROPERTY = 508; // 프로퍼티
const unsigned short TM_SC_HPMP = 509;
const unsigned short TM_SC_REGEN_INFO = 510;
const unsigned short TM_CS_TARGETING = 511;
const unsigned short TM_SC_TARGET = 512;
const unsigned short TM_CS_RESURRECTION = 513; //
const unsigned short TM_SC_SP = 514;
const unsigned short TM_SC_ENERGY = 515;
const unsigned short TM_SC_REGEN_HPMP = 516;
const unsigned short TM_CS_MONSTER_RECOGNIZE = 517; // 선공 몬스터의 시야 범위 내에 캐릭터가 들어갔을 때 클라에서 서버로 알려주는 패킷(서버에서는 주기적인 선공 체크밖에 못하므로 실시간 체크는 클라에 의존)
const unsigned short TM_CS_GET_REGION_INFO = 550;
const unsigned short TM_SC_QUEST_LIST = 600;
const unsigned short TM_SC_QUEST_STATUS = 601;
const unsigned short TM_SC_QUEST_INFOMATION = 602;
const unsigned short TM_CS_DROP_QUEST = 603;
const unsigned short TM_CS_QUEST_INFO = 604;
const unsigned short TM_CS_END_QUEST = 605;
const unsigned short TM_SC_TITLE_LIST = 625;
const unsigned short TM_SC_TITLE_CONDITION_LIST = 626;
const unsigned short TM_SC_REMAIN_TITLE_TIME = 627;
const unsigned short TM_CS_SET_MAIN_TITLE = 628;
const unsigned short TM_SC_SET_MAIN_TITLE = 629;
const unsigned short TM_CS_SET_SUB_TITLE = 630;
const unsigned short TM_SC_SET_SUB_TITLE = 631;
const unsigned short TM_CS_BOOKMARK_TITLE = 632;
const unsigned short TM_SC_BOOKMARK_TITLE = 633;
const unsigned short TM_SC_ACHIEVE_TITLE = 634;
const unsigned short TM_SC_OPEN_TITLE = 635;
const unsigned short TM_SC_CHANGE_TITLE_CONDITION = 636;
const unsigned short TM_SC_SHOW_CREATE_GUILD = 650;
const unsigned short TM_SC_OPEN_GUILD_WINDOW = 651;
const unsigned short TM_SC_UPDATE_GUILD_ICON = 652;
const unsigned short TM_SC_UPDATE_GUILD_BANNER = 653;
const unsigned short TM_SC_SHOW_CREATE_ALLIANCE = 660;
const unsigned short TM_CS_START_BOOTH = 700; // 개설
const unsigned short TM_CS_STOP_BOOTH = 701; // 중지
const unsigned short TM_CS_WATCH_BOOTH = 702; // 내용 보기
const unsigned short TM_SC_WATCH_BOOTH = 703; // 내용 보내주기
const unsigned short TM_CS_STOP_WATCH_BOOTH = 704; // 그만 보기
const unsigned short TM_CS_BUY_FROM_BOOTH = 705; // 물건 구입
const unsigned short TM_CS_SELL_TO_BOOTH = 706; // 물건 판매
const unsigned short TM_CS_GET_BOOTHS_NAME = 707; // 노점 이름 얻어오기
const unsigned short TM_SC_GET_BOOTHS_NAME = 708; // 노점 이름들
const unsigned short TM_SC_BOOTH_CLOSED = 709; // 노점 닫힘 알림
const unsigned short TM_SC_BOOTH_TRADE_INFO = 710; // 노점상에게 물건 거래 알림.
const unsigned short TM_CS_CHECK_BOOTH_STARTABLE = 711; // 노점 개설 가능 여부 확인(클라 UI 출력 전 확인)
const unsigned short TM_CS_TURN_ON_PK_MODE = 800;
const unsigned short TM_CS_TURN_OFF_PK_MODE = 801;
const unsigned short TM_CS_CHANGE_LOCATION = 900;
const unsigned short TM_SC_CHANGE_LOCATION = 901;
const unsigned short TM_SC_WEATHER_INFO = 902;
const unsigned short TM_CS_GET_WEATHER_INFO = 903;
const unsigned short TM_SC_STAT_INFO = 1000; // 스탯정보
const unsigned short TM_SC_GOLD_UPDATE = 1001; // 돈 바뀜
const unsigned short TM_SC_LEVEL_UPDATE = 1002; // 레벨 바뀜
const unsigned short TM_SC_EXP_UPDATE = 1003; // 경험치 바뀜
const unsigned short TM_SC_BONUS_EXP_JP = 1004; // 보너스 경험치/잡포 획득 방송
const unsigned short TM_SC_DETECT_RANGE_UPDATE= 1005; // 은신 감지 범위 변경
const unsigned short TM_CS_GAME_TIME = 1100;
const unsigned short TM_SC_GAME_TIME = 1101;
const unsigned short TM_SC_EMOTION = 1201;
const unsigned short TM_CS_EMOTION = 1202;
const unsigned short TM_CS_AUCTION_SEARCH = 1300; // 경매 물품 검색 요청
const unsigned short TM_SC_AUCTION_SEARCH = 1301; // 경매 물품 검색 결과
const unsigned short TM_CS_AUCTION_SELLING_LIST = 1302; // 자신이 등록한 경매 물품 목록 요청
const unsigned short TM_SC_AUCTION_SELLING_LIST = 1303; // 자신이 등록한 경매 물품 목록 결과
const unsigned short TM_CS_AUCTION_BIDDED_LIST = 1304; // 자신이 입찰한 경매 목록 요청
const unsigned short TM_SC_AUCTION_BIDDED_LIST = 1305; // 자신이 입찰한 경매 목록 결과
const unsigned short TM_CS_AUCTION_BID = 1306; // 경매 입찰 요청(결과는 TS_SC_RESULT로 보내고 성공시 최고 입찰가는 TS_SC_RESULT 메시지의 value로 전달함)
const unsigned short TM_CS_AUCTION_INSTANT_PURCHASE = 1308; // 경매 물품 즉시구매 요청(결과는 TS_SC_RESULT로 보내고 페이지 갱신은 클라에서 요청 따로 보냄)
const unsigned short TM_CS_AUCTION_REGISTER = 1309; // 경매 물품 등록 요청(결과는 TS_SC_RESULT로 보내고 페이지 갱신은 클라에서 요청 따로 보냄)
const unsigned short TM_CS_AUCTION_CANCEL = 1310; // 자신이 등록한 경매 취소 요청(결과는 TS_SC_RESULT로 보내고 페이지 갱신은 클라에서 요청 따로 보냄)
const unsigned short TM_CS_ITEM_KEEPING_LIST = 1350; // 자신 소유 보관 아이템 목록 요청
const unsigned short TM_SC_ITEM_KEEPING_LIST = 1351; // 자신 소유 보관 아이템 목록 결과
const unsigned short TM_CS_ITEM_KEEPING_TAKE = 1352; // 자신 소유 보관 아이템 회수 요청(결과는 TS_SC_RESULT로 보냄)
//const unsigned short TM_CS_ACCOUNT = 2000;
const unsigned short TM_CS_CHARACTER_LIST = 2001;
const unsigned short TM_CS_CREATE_CHARACTER = 2002;
const unsigned short TM_CS_DELETE_CHARACTER = 2003;
const unsigned short TM_SC_CHARACTER_LIST = 2004;
const unsigned short TM_CS_ACCOUNT_WITH_AUTH = 2005;
const unsigned short TM_CS_CHECK_CHARACTER_NAME = 2006;
const unsigned short TM_SC_DIALOG = 3000;
const unsigned short TM_CS_DIALOG = 3001;
const unsigned short TM_CS_CONTACT = 3002;
const unsigned short TM_SC_SHOW_WINDOW = 3003;
const unsigned short TM_SC_GENERAL_MESSAGE_BOX = 3004;
// 헌터홀릭 관련
//{
const unsigned short TM_CS_HUNTAHOLIC_INSTANCE_LIST = 4000;
const unsigned short TM_SC_HUNTAHOLIC_INSTANCE_LIST = 4001;
const unsigned short TM_SC_HUNTAHOLIC_INSTANCE_INFO = 4002;
const unsigned short TM_CS_HUNTAHOLIC_CREATE_INSTANCE = 4003;
const unsigned short TM_CS_HUNTAHOLIC_JOIN_INSTANCE = 4004;
const unsigned short TM_CS_HUNTAHOLIC_LEAVE_INSTANCE = 4005;
const unsigned short TM_SC_HUNTAHOLIC_HUNTING_SCORE = 4006;
const unsigned short TM_SC_HUNTAHOLIC_UPDATE_SCORE = 4007;
const unsigned short TM_CS_HUNTAHOLIC_LEAVE_LOBBY = 4008;
const unsigned short TM_SC_HUNTAHOLIC_BEGIN_HUNTING = 4009;
const unsigned short TM_SC_HUNTAHOLIC_MAX_POINT_ACHIEVED = 4010;
const unsigned short TM_CS_HUNTAHOLIC_BEGIN_HUNTING = 4011;
const unsigned short TM_SC_HUNTAHOLIC_BEGIN_COUNTDOWN = 4012;
//}
// 인스턴스 게임 관련
const unsigned short TM_CS_INSTANCE_GAME_ENTER = 4250;
const unsigned short TM_CS_INSTANCE_GAME_EXIT = 4251;
const unsigned short TM_CS_INSTANCE_GAME_SCORE_REQUEST = 4252;
const unsigned short TM_SC_INSTANCE_GAME_SCORE_REQUEST = 4253;
// Compete(필드 대련) 관련
const unsigned short TM_CS_COMPETE_REQUEST = 4500;
const unsigned short TM_SC_COMPETE_REQUEST = 4501;
const unsigned short TM_CS_COMPETE_ANSWER = 4502;
const unsigned short TM_SC_COMPETE_ANSWER = 4503;
const unsigned short TM_SC_COMPETE_COUNTDOWN = 4504;
const unsigned short TM_SC_COMPETE_START = 4505;
const unsigned short TM_SC_COMPETE_END = 4506;
// 배틀 아레나 관련
const unsigned short TM_SC_BATTLE_ARENA_PENALTY_INFO = 4700;
const unsigned short TM_CS_BATTLE_ARENA_JOIN_QUEUE = 4701;
const unsigned short TM_SC_BATTLE_ARENA_JOIN_QUEUE = 4702;
const unsigned short TM_SC_BATTLE_ARENA_UPDATE_WAIT_USER_COUNT = 4703;
const unsigned short TM_CS_BATTLE_ARENA_LEAVE = 4704;
const unsigned short TM_SC_BATTLE_ARENA_LEAVE = 4705;
const unsigned short TM_SC_BATTLE_ARENA_BATTLE_INFO = 4706;
const unsigned short TM_CS_BATTLE_ARENA_ENTER_WHILE_COUNTDOWN = 4707;
const unsigned short TM_CS_BATTLE_ARENA_EXERCISE_READY = 4708;
const unsigned short TM_SC_BATTLE_ARENA_EXERCISE_READY_STATUS = 4709;
const unsigned short TM_CS_BATTLE_ARENA_EXERCISE_START = 4710;
const unsigned short TM_SC_BATTLE_ARENA_BATTLE_STATUS = 4711;
const unsigned short TM_SC_BATTLE_ARENA_BATTLE_SCORE = 4712;
const unsigned short TM_SC_BATTLE_ARENA_JOIN_BATTLE = 4713;
const unsigned short TM_SC_BATTLE_ARENA_DISCONNECT_BATTLE = 4714;
const unsigned short TM_SC_BATTLE_ARENA_RECONNECT_BATTLE = 4715;
const unsigned short TM_SC_BATTLE_ARENA_RESULT = 4716;
const unsigned short TM_CS_BATTLE_ARENA_ABSENCE_CHECK_REQUEST = 4717;
const unsigned short TM_SC_BATTLE_ARENA_ABSENCE_CHECK = 4718;
const unsigned short TM_CS_BATTLE_ARENA_ABSENCE_CHECK_ANSWER = 4719;
// 랭킹 시스템 관련
const unsigned short TM_CS_RANKING_TOP_RECORD = 5000;
const unsigned short TM_SC_RANKING_TOP_RECORD = 5001;
// 크리처 농장 관련
const unsigned short TM_CS_REQUEST_FARM_INFO = 6000;
const unsigned short TM_SC_FARM_INFO = 6001;
const unsigned short TM_CS_FOSTER_CREATURE = 6002;
const unsigned short TM_SC_RESULT_FOSTER = 6003;
const unsigned short TM_CS_RETRIEVE_CREATURE = 6004;
const unsigned short TM_SC_RESULT_RETRIEVE = 6005;
const unsigned short TM_CS_NURSE_CREATURE = 6006;
const unsigned short TM_SC_RESULT_NURSE = 6007;
const unsigned short TM_CS_REQUEST_FARM_MARKET = 6008;
// 파티매칭
const unsigned short TM_CS_PARTYMATCH_ACTION = 7000;
const unsigned short TM_SC_PARTYMATCH_LIST = 7001;
const unsigned short TM_SC_PARTYMATCH_MEMBER = 7002;
const unsigned short TM_CS_REPORT = 8000;
const unsigned short TM_SC_OPEN_URL = 9000;
const unsigned short TM_SC_URL_LIST = 9001;
// 2009. 8. 11 floyd 보안비밀번호 2차 수정
//const unsigned short TM_SC_CREATE_SECUTIRY_NO = 9002;
const unsigned short TM_SC_REQUEST_SECUTIRY_NO = 9004;
const unsigned short TM_CS_SECURITY_NO = 9005;
//const unsigned short TM_CS_CREATE_SECURITY_NO = 9006;
//const unsigned short TM_CS_CHANGE_SECURITY_NO = 9007;
//const unsigned short TM_CS_REQUEST_SECURITY_NO_CHANGE = 9008;
//const unsigned short TM_SC_CHANGE_SECURITY_NO = 9009;
//const unsigned short TM_CS_REQUEST_CLEAR_SECURITY_NO = 9010;
//const unsigned short TM_SC_CLEAR_SECURITY_NO = 9011;
//const unsigned short TM_CS_CLEAR_SECURITY_NO = 9012;
// { 유료화 관련
const unsigned short TM_CS_OPEN_ITEM_SHOP = 10000;
const unsigned short TM_SC_OPEN_ITEM_SHOP = 10001;
const unsigned short TM_SC_COMMERCIAL_STORAGE_INFO = 10003; // 캐쉬템 창고에 아이템이 뭔가 들어왔을경우 전송됨
const unsigned short TM_SC_COMMERCIAL_STORAGE_LIST = 10004;
const unsigned short TM_CS_TAKEOUT_COMMERCIAL_ITEM = 10005;
// }
// { Auth Server <-> Game Server
const unsigned short TM_GA_LOGIN = 20001;
const unsigned short TM_AG_LOGIN_RESULT = 20002;
const unsigned short TM_GA_CLIENT_LOGIN = 20010;
const unsigned short TM_AG_CLIENT_LOGIN = 20011;
const unsigned short TM_GA_CLIENT_LOGOUT = 20012;
const unsigned short TM_AG_KICK_CLIENT = 20013;
const unsigned short TM_GA_CLIENT_KICK_FAILED = 20014;
const unsigned short TM_AG_PCBANG_EXPIRE_WARNING = 20020;
const unsigned short TM_AG_PCBANG_EXPIRED = 20021;
const unsigned short TM_AG_PCBANG_CHANGED = 20022;
const unsigned short TM_AG_ITEM_PURCHASED = 30000;
const unsigned short TM_AG_ITEM_SUPPLIED = 30001;
const unsigned short TM_AG_SECURITY_NO_CHECK = 40000;
const unsigned short TM_GA_SECURITY_NO_CHECK = 40001;
// }
// { Upload Server <-> Game Server
const unsigned short TM_SU_LOGIN = 50001;
const unsigned short TM_US_LOGIN_RESULT = 50002;
const unsigned short TM_SU_REQUEST_UPLOAD = 50003;
const unsigned short TM_US_REQUEST_UPLOAD = 50004;
//const unsigned short TM_CU_LOGIN = 50005;
//const unsigned short TM_UC_LOGIN_RESULT = 50006;
//const unsigned short TM_CU_UPLOAD = 50007;
//const unsigned short TM_UC_UPLOAD = 50008;
const unsigned short TM_US_UPLOAD = 50009;
// }
struct TS_MESSAGE
{
TS_MESSAGE()
{
size = sizeof( *this );
}
unsigned int size;
unsigned short id;
unsigned char msg_check_sum;
bool IsValidMessage() const
{
return ( msg_check_sum == get_check_sum() );
}
void set_check_sum()
{
msg_check_sum = get_check_sum();
}
protected:
unsigned char get_check_sum() const
{
const char *p = reinterpret_cast< const char* >( &size );
unsigned char check_sum = 0;
while( p != reinterpret_cast< const char* >( &msg_check_sum ) )
{
check_sum += *p;
++p;
}
return check_sum;
}
};
struct TS_SC_RESULT : TS_MESSAGE
{
TS_SC_RESULT( unsigned short _request_msg_id, unsigned short _result, int _value ) : request_msg_id( _request_msg_id ), result( _result ), value( _value )
{
size = sizeof( *this );
id = TM_SC_RESULT;
set_check_sum();
}
unsigned short request_msg_id;
unsigned short result;
int value;
};
struct TS_CS_REPORT : TS_MESSAGE
{
TS_CS_REPORT() _INIT( TM_CS_REPORT )
unsigned short report_len;
};
struct TS_SC_OPEN_URL : TS_MESSAGE
{
TS_SC_OPEN_URL() _INIT( TM_SC_OPEN_URL )
bool wait_for_event_scene;
int width;
int height;
unsigned short url_len;
// 이 뒤로 url_len 만큼의 Url이 붙어감.
};
struct TS_SC_URL_LIST : TS_MESSAGE
{
TS_SC_URL_LIST() _INIT( TM_SC_URL_LIST )
unsigned short url_list_len;
// 이 뒤로 길이 url_list_len 의 문자열이 붙어감.
};
struct TS_SC_ANTI_HACK : TS_MESSAGE
{
TS_SC_ANTI_HACK() _INIT( TM_SC_ANTI_HACK )
AHNHS_TRANS_BUFFER AhnHSReqBuffer;
};
struct TS_CS_ANTI_HACK : TS_MESSAGE
{
TS_CS_ANTI_HACK() _INIT( TM_CS_ANTI_HACK )
AHNHS_TRANS_BUFFER AhnHSAckBuffer;
};
struct TS_SC_GAME_GUARD_AUTH_QUERY : TS_MESSAGE
{
TS_SC_GAME_GUARD_AUTH_QUERY() _INIT( TM_SC_GAME_GUARD_AUTH_QUERY )
unsigned int auth_data_size;
// 뒤에 auth_data_size 만큼 데이터가 추가됨
};
struct TS_CS_GAME_GUARD_AUTH_ANSWER : TS_MESSAGE
{
TS_CS_GAME_GUARD_AUTH_ANSWER() _INIT( TM_CS_GAME_GUARD_AUTH_ANSWER )
unsigned int auth_data_size;
// 뒤에 auth_data_size 만큼 데이터가 추가됨
};
struct TS_CS_CHECK_ILLEGAL_USER : TS_MESSAGE
{
TS_CS_CHECK_ILLEGAL_USER() _INIT( TM_CS_CHECK_ILLEGAL_USER )
unsigned long log_code;
};
struct TS_SC_XTRAP_CHECK : TS_MESSAGE
{
TS_SC_XTRAP_CHECK() _INIT( TM_SC_XTRAP_CHECK )
unsigned char pCheckBuffer[ XTRAP_SETINFO_PACKETBUFF_SIZE ];
};
struct TS_CS_XTRAP_CHECK : TS_MESSAGE
{
TS_CS_XTRAP_CHECK() _INIT( TM_CS_XTRAP_CHECK )
unsigned char pCheckBuffer[ XTRAP_SETINFO_PACKETBUFF_SIZE ];
};
struct TS_AG_PCBANG_EXPIRE_WARNING : TS_MESSAGE
{
TS_AG_PCBANG_EXPIRE_WARNING() _INIT( TM_AG_PCBANG_EXPIRE_WARNING )
char account[GameRule::MAX_ACCOUNT_LEN + 1];
int remain_minutes;
};
struct TS_AG_PCBANG_EXPIRE : TS_MESSAGE
{
TS_AG_PCBANG_EXPIRE() _INIT( TM_AG_PCBANG_EXPIRED )
char account[GameRule::MAX_ACCOUNT_LEN + 1];
};
struct TS_AG_PCBANG_CHANGED : TS_MESSAGE
{
TS_AG_PCBANG_CHANGED() _INIT( TM_AG_PCBANG_CHANGED )
char account[GameRule::MAX_ACCOUNT_LEN + 1];
int nPCBangMode;
};
struct TS_CS_VERSION : TS_MESSAGE
{
TS_CS_VERSION() _INIT( TM_CS_VERSION )
char szVersion[20];
// szVersion이 서버 정보 값을 요구하는 새 패킷이라면, 그 카운트만큼 뒤에 이 구조체가 따라 붙음.
struct ServerENVInfo
{
ServerENVInfo()
{
memset( szData, 0, sizeof( szData ) );
}
char szData[40];
};
};
struct TS_SC_INFO : TS_MESSAGE
{
const static int MAX_QUERY_COUNT = 20;
TS_SC_INFO() _INIT( TM_SC_INFO )
// 뒤에 count만큼 ServerENVResult가 따라 붙음
int count;
struct ServerENVResult
{
ServerENVResult()
{
memset( szData, 0, sizeof( szData ) );
}
char szData[40];
};
};
struct TS_CS_REQUEST : TS_MESSAGE
{
TS_CS_REQUEST() _INIT( TM_CS_REQUEST )
char t;
};
struct TS_LOGIN : TS_MESSAGE
{
TS_LOGIN() _INIT( TM_CS_LOGIN )
// below is game conetents
char szName[19];
unsigned char race;
};
struct TS_LOGIN_RESULT : TS_MESSAGE
{
TS_LOGIN_RESULT() _INIT( TM_SC_LOGIN_RESULT )
unsigned short result;
AR_HANDLE handle;
AR_UNIT x,y,z;
unsigned char layer;
float face_direction;
int region_size;
// below is game conetents
int hp;
int mp;
int max_hp;
int max_mp;
int sex;
int race;
unsigned long skin_color;
ItemBase::ItemCode faceId;
ItemBase::ItemCode hairId;
char szName[19];
int cell_size;
int guild_id;
int back_board;
};
struct TS_SC_CHANGE_NAME : TS_MESSAGE
{
TS_SC_CHANGE_NAME() _INIT( TM_SC_CHANGE_NAME );
AR_HANDLE handle;
char name[19];
};
struct TS_TIMESYNC : TS_MESSAGE
{
TS_TIMESYNC() _INIT( TM_TIMESYNC )
AR_TIME time;
};
struct TS_CS_QUERY : TS_MESSAGE
{
TS_CS_QUERY() _INIT( TM_CS_QUERY )
AR_HANDLE handle;
};
struct TS_ENTER : TS_MESSAGE
{
TS_ENTER() _INIT( TM_SC_ENTER )
enum
{
PLAYER = 0, NPC = 1, STATIC_OBJECT = 2
};
enum //Game Obj Type
{
GAME_PLAYER = 0,
GAME_NPC = 1,
GAME_ITEM = 2,
GAME_MOB = 3,
GAME_SUMMON = 4,
GAME_SKILL_PROP = 5,
GAME_FIELD_PROP = 6,
GAME_PET = 7
};
unsigned char type;
AR_HANDLE handle;
AR_UNIT x,y,z;
unsigned char layer;
// below is game conetents
unsigned char ObjType;
struct TS_ITEM_PICK_UP_ORDER
{
AR_TIME drop_time;
AR_HANDLE hPlayer[ 3 ];
int nPartyID[ 3 ];
/*
먹자 방지 룰
drop_time부터 30초 이내:
pickup_order.hPlayer[0] 가 0이 아닐 경우, hPlayer[0]인 사용자만 집을 수 있습니다.
pickup_order.hPlayer[0] 가 0이고, pickup_order.nPartyID[0] > 0 일 경우, pickup_order.nPartyID[0]인 파티 소속원만 집을 수 있습니다.
drop_time부터 40초 이내:
pickup_order.hPlayer[1] 가 0이 아닐 경우, hPlayer[1]인 사용자만 집을 수 있습니다.
pickup_order.hPlayer[1] 가 0이고, pickup_order.nPartyID[1] > 0 일 경우, pickup_order.nPartyID[1]인 파티 소속원만 집을 수 있습니다.
drop_time부터 50초 이내:
pickup_order.hPlayer[2] 가 0이 아닐 경우, hPlayer[2]인 사용자만 집을 수 있습니다.
pickup_order.hPlayer[2] 가 0이고, pickup_order.nPartyID[2] > 0 일 경우, pickup_order.nPartyID[2]인 파티 소속원만 집을 수 있습니다.
50초 이후엔 아무나 집을 수 있습니다.
*/
};
struct ItemInfo
{
ENC_INT code; // code 가 0인것은 돈임. 액수는 cnt
__int64 cnt;
TS_ITEM_PICK_UP_ORDER pick_up_order;
};
struct SkillInfo
{
AR_HANDLE caster;
AR_TIME start_time;
int skill_num;
};
struct FieldPropInfo
{
int prop_id;
float fZOffset;
float fRotateX, fRotateY, fRotateZ;
float fScaleX, fScaleY, fScaleZ;
bool bLockHeight;
float fLockHeight;
};
struct CreatureInfo
{
enum
{
FLAG_BATTLE_MODE = 1 << 0,
FLAG_INVISIBLE = 1 << 1,
};
unsigned status;
float face_direction; // 보고있는 방향
int hp;
int max_hp;
int mp;
int max_mp;
int level;
unsigned char race;
unsigned long skin_color;
bool is_first_enter;
int energy;
};
struct MonsterInfo : CreatureInfo
{
enum
{
FLAG_DEAD = 1 << 8,
FLAG_DUNGEON_ORIGINAL_OWNER = 1 << 15,
FLAG_DUNGEON_ORIGINAL_SIEGER = 1 << 17,
};
ENC_INT monster_id;
bool is_tamed; // 테이밍 되었는지 여부
};
struct SummonInfo : CreatureInfo
{
AR_HANDLE master_handle;
ENC_INT summon_code;
char szName[19];
unsigned char enhance;
};
struct NPCInfo : CreatureInfo
{
enum
{
FLAG_HAS_STARTABLE_QUEST = 1 << 8,
FLAG_HAS_IN_PROGRESS_QUEST = 1 << 9,
FLAG_HAS_FINISHABLE_QUEST = 1 << 10,
};
ENC_INT npc_id;
//int model_id;
//char szName[25];
};
struct PlayerInfo : CreatureInfo
{
enum
{
FLAG_SITDOWN = 1 << 8,
FLAG_BUY_BOOTH = 1 << 9,
FLAG_SELL_BOOTH = 1 << 10,
FLAG_PK_ON = 1 << 11,
FLAG_BLOODY = 1 << 12,
FLAG_DEMONIAC = 1 << 13,
FLAG_GM = 1 << 14,
FLAG_DUNGEON_ORIGINAL_OWNER = 1 << 15,
FLAG_WALKING = 1 << 16,
FLAG_DUNGEON_ORIGINAL_SIEGER = 1 << 17,
FLAG_SHOVELING_SEARCH = 1 << 18,
FLAG_SHOVELING_APPROACH = 1 << 19,
FLAG_SHOVELING_DIG = 1 << 20,
FLAG_COMPETING = 1 << 21,
FLAG_BATTLE_ARENA_TEAM_0 = 1 << 22,
FLAG_BATTLE_ARENA_TEAM_1 = 1 << 23,
};
unsigned char sex;
ItemBase::ItemCode faceId;
int faceTextureId;
int hairId;
int hairColorIndex;
unsigned int hairColorRGB;
unsigned int hideEquipFlag;
char szName[19];
unsigned short job_id;
AR_HANDLE ride_handle;
int guild_id;
int title_code;
int back_board;
};
struct PetInfo : CreatureInfo
{
AR_HANDLE master_handle;
ENC_INT pet_code;
char szName[19];
};
};
struct TS_SC_STATUS_CHANGE : TS_MESSAGE
{
TS_SC_STATUS_CHANGE() _INIT( TM_SC_STATUS_CHANGE )
AR_HANDLE handle;
unsigned status;
};
struct TS_CS_RESURRECTION : TS_MESSAGE
{
TS_CS_RESURRECTION() _INIT( TM_CS_RESURRECTION )
AR_HANDLE handle;
enum
{
RESURRECT_TYPE_NORMAL = 0, // 일반 부활
RESURRECT_TYPE_BY_STATE = 1, // 버프 부활
RESURRECT_TYPE_BY_POTION = 2, // 대모 요정의 병 부활
RESURRECT_TYPE_BY_COMPETE = 3, // 대련 사망 패배 후 부활
RESURRECT_TYPE_BY_DEATHMATCH = 4, // 데스매치에서 사망 후 부활
};
char type;
};
struct TS_SC_TARGET : TS_MESSAGE
{
TS_SC_TARGET() _INIT( TM_SC_TARGET )
AR_HANDLE target;
};
struct TS_CS_TARGETING : TS_MESSAGE
{
TS_CS_TARGETING() _INIT( TM_CS_TARGETING )
AR_HANDLE target;
};
struct TS_SC_STATE : TS_MESSAGE
{
TS_SC_STATE() _INIT( TM_SC_STATE )
AR_HANDLE handle; // 대상 크리쳐
unsigned short state_handle; // 상태이상 핸들
unsigned int state_code; // 상태이상 종류
unsigned short state_level; // 상태이상의 레벨 (0이면 풀리는 메시지임)
AR_TIME end_time; // 끝나는 시간 (0이면 영원히) ( -1 : aura )
AR_TIME start_time; // 시작시간
int state_value; // 지속효과 관련 추가값
char state_string_value[32];
};
struct TS_SC_PROPERTY : TS_MESSAGE
{
TS_SC_PROPERTY() _INIT( TM_SC_PROPERTY )
AR_HANDLE handle;
bool is_number; // 이게 참이라면 value 에 숫자가 들어감. 거짓이라면 문자열 값인데 메시지 끝이 '\0' 으로 끝나는 문자열이 들어감.
char name[16];
__int64 value;
};
struct TS_CS_SET_PROPERTY : TS_MESSAGE
{
TS_CS_SET_PROPERTY() _INIT( TM_CS_SET_PROPERTY )
char name[16];
};
//struct TS_SC_HP : TS_MESSAGE
//{
// TS_SC_HP() _INIT( TM_SC_HP )
//
// AR_HANDLE handle;
// int hp;
// unsigned char hp_percentage;
//};
//
struct TS_SC_HPMP : TS_MESSAGE
{
TS_SC_HPMP() _INIT( TM_SC_HPMP )
AR_HANDLE handle;
int add_hp;
int hp;
int max_hp;
int add_mp;
int mp;
int max_mp;
bool need_to_display;
};
//struct TS_SC_MP : TS_MESSAGE
//{
// TS_SC_MP() _INIT( TM_SC_MP )
//
// AR_HANDLE handle;
// short mp;
//};
struct TS_SC_SP : TS_MESSAGE
{
TS_SC_SP() _INIT( TM_SC_SP )
AR_HANDLE handle;
short sp;
short max_sp;
};
struct TS_SC_ENERGY : TS_MESSAGE
{
TS_SC_ENERGY() _INIT( TM_SC_ENERGY )
AR_HANDLE handle;
short energy;
};
struct TS_SC_REGEN_HPMP : TS_MESSAGE
{
TS_SC_REGEN_HPMP() _INIT( TM_SC_REGEN_HPMP )
AR_HANDLE handle;
int hp_regen;
int mp_regen;
int hp;
int mp;
};
struct TS_CS_MONSTER_RECOGNIZE : TS_MESSAGE
{
TS_CS_MONSTER_RECOGNIZE() _INIT( TM_CS_MONSTER_RECOGNIZE )
AR_HANDLE recognizer_handle;
AR_HANDLE monster_handle;
};
struct TS_CS_UPDATE : TS_MESSAGE
{
TS_CS_UPDATE() _INIT( TM_CS_UPDATE )
AR_HANDLE handle;
int ar_time;
int rtc;
};
struct TS_SC_TAMING_INFO : TS_MESSAGE
{
TS_SC_TAMING_INFO() _INIT( TM_SC_TAMING_INFO )
enum
{
START = 0, // tamer 가 target 에게 테이밍 스킬을 걸었음
CLEAR = 1, // 테이밍이 초기화됨 (tamer_handle 은 0)
SUCCESS = 2, // target 이 죽어서 tamer 에게 테이밍됨.
FAILED = 3, // target 이 죽었지만 테이밍은 실패!
};
unsigned char mode;
AR_HANDLE tamer_handle;
AR_HANDLE target_handle;
};
struct TS_WEAR_INFO : TS_MESSAGE
{
TS_WEAR_INFO() _INIT( TM_SC_WEAR_INFO )
AR_HANDLE handle;
ItemBase::ItemCode itemCode[ItemBase::MAX_ITEM_WEAR];
int itemEnhance[ItemBase::MAX_ITEM_WEAR];
int itemLevel[ItemBase::MAX_ITEM_WEAR];
unsigned char elemental_effect_type[ItemBase::MAX_ITEM_WEAR];
ItemBase::ItemCode appearance_code[ItemBase::MAX_ITEM_WEAR];
};
struct TS_SC_ITEM_WEAR_INFO : TS_MESSAGE
{
TS_SC_ITEM_WEAR_INFO() _INIT( TM_SC_ITEM_WEAR_INFO )
AR_HANDLE item_handle;
short wear_position; // -1이면 장착 안된 아이템
AR_HANDLE target_handle;
int enhance;
unsigned char elemental_effect_type;
ItemBase::ItemCode appearance_code;
};
struct TS_LEAVE : TS_MESSAGE
{
TS_LEAVE() _INIT( TM_SC_LEAVE )
AR_HANDLE handle;
};
struct TS_MOVE_REQUEST : TS_MESSAGE
{
TS_MOVE_REQUEST() _INIT( TM_CS_MOVE_REQUEST )
AR_HANDLE handle;
// AR_UNIT tx,ty;
AR_UNIT x,y;
AR_TIME cur_time;
// unsigned char tlayer;
bool speed_sync;
unsigned short count;
struct MOVE_INFO
{
AR_UNIT tx,ty;
};
// 이 뒤에 MOVE_INFO가 COUNT만큼 붙어서 온다.
};
struct TS_MOVE : TS_MESSAGE
{
TS_MOVE() _INIT( TM_SC_MOVE )
AR_TIME start_time;
AR_HANDLE handle;
//AR_UNIT tx, ty, tz;
unsigned char tlayer;
unsigned char speed;
unsigned short count;
struct MOVE_INFO
{
AR_UNIT tx,ty;
};
};
struct TS_SC_MOUNT_SUMMON : TS_MESSAGE
{
TS_SC_MOUNT_SUMMON() _INIT( TM_SC_MOUNT_SUMMON )
AR_HANDLE handle;
AR_HANDLE summon_handle;
AR_UNIT x, y;
bool success;
};
struct TS_SC_UNMOUNT_SUMMON : TS_MESSAGE
{
TS_SC_UNMOUNT_SUMMON() _INIT( TM_SC_UNMOUNT_SUMMON )
AR_HANDLE handle;
AR_HANDLE summon_handle;
enum
{
NORMAL = 0,
FALL = 1,
UNSUMMON = 2,
};
char flag;
};
struct TS_SC_SHOW_SUMMON_NAME_CHANGE : TS_MESSAGE
{
TS_SC_SHOW_SUMMON_NAME_CHANGE() _INIT( TM_SC_SHOW_SUMMON_NAME_CHANGE )
AR_HANDLE handle;
};
struct TS_CS_CHANGE_SUMMON_NAME : TS_MESSAGE
{
TS_CS_CHANGE_SUMMON_NAME() _INIT( TM_CS_CHANGE_SUMMON_NAME )
char szName[19];
};
struct TS_CS_GET_SUMMON_SETUP_INFO : TS_MESSAGE
{
TS_CS_GET_SUMMON_SETUP_INFO() _INIT( TM_CS_GET_SUMMON_SETUP_INFO )
bool show_dialog;
};
struct TS_SC_UNSUMMON_PET : TS_MESSAGE
{
TS_SC_UNSUMMON_PET() _INIT( TM_SC_UNSUMMON_PET )
AR_HANDLE handle;
};
struct TS_SC_ADD_PET_INFO : TS_MESSAGE
{
TS_SC_ADD_PET_INFO() _INIT( TM_SC_ADD_PET_INFO )
AR_HANDLE cage_handle;
AR_HANDLE pet_handle;
char name[19];
int code;
};
struct TS_SC_REMOVE_PET_INFO : TS_MESSAGE
{
TS_SC_REMOVE_PET_INFO() _INIT( TM_SC_REMOVE_PET_INFO )
AR_HANDLE handle;
};
struct TS_SC_SHOW_SET_PET_NAME : TS_MESSAGE
{
TS_SC_SHOW_SET_PET_NAME() _INIT( TM_SC_SHOW_SET_PET_NAME )
AR_HANDLE handle;
};
struct TS_CS_SET_PET_NAME : TS_MESSAGE
{
TS_CS_SET_PET_NAME() _INIT( TM_CS_SET_PET_NAME )
AR_HANDLE handle;
char name[19];
};
struct TS_FORCE_MOVE : TS_MESSAGE
{
TS_FORCE_MOVE() _INIT( TM_SC_FORCE_MOVE )
AR_HANDLE handle;
AR_UNIT x, y, z;
unsigned char layer;
float face;
};
struct TS_REGION_UPDATE : TS_MESSAGE
{
TS_REGION_UPDATE() _INIT( TM_CS_REGION_UPDATE )
AR_TIME update_time;
AR_UNIT x, y, z;
bool bIsStopMessage;
};
struct TS_SC_WARP : TS_MESSAGE
{
TS_SC_WARP() _INIT( TM_SC_WARP )
AR_UNIT x, y, z;
unsigned char layer;
};
struct TS_REGION_ACK : TS_MESSAGE
{
TS_REGION_ACK() _INIT( TM_SC_REGION_ACK )
unsigned rx, ry;
};
struct TS_CS_ENTER_EVENT_AREA : TS_MESSAGE
{
TS_CS_ENTER_EVENT_AREA() _INIT( TM_CS_ENTER_EVENT_AREA )
int event_area_id;
int area_index;
};
struct TS_CS_LEAVE_EVENT_AREA : TS_MESSAGE
{
TS_CS_LEAVE_EVENT_AREA() _INIT( TM_CS_LEAVE_EVENT_AREA )
int event_area_id;
int area_index;
};
struct TS_MOVE_ACK : TS_MESSAGE
{
TS_MOVE_ACK() _INIT( TM_SC_MOVE_ACK )
AR_TIME time;
unsigned char speed;
};
struct TS_SET_TIME : TS_MESSAGE
{
TS_SET_TIME() _INIT( TM_SC_SET_TIME )
int gap;
};
struct TS_ATTACK_REQUEST : TS_MESSAGE
{
TS_ATTACK_REQUEST() _INIT( TM_CS_ATTACK_REQUEST )
AR_HANDLE handle;
AR_HANDLE target_handle; // NULL 이면 공격 중지 메시지
};
struct TS_SC_STATE_RESULT : TS_MESSAGE
{
TS_SC_STATE_RESULT() _INIT( TM_SC_STATE_RESULT )
AR_HANDLE caster_handle;
AR_HANDLE target_handle;
int code;
unsigned short level;
// result_type 종류
enum
{
STATE_DAMAGE_HP = 1,
STATE_DAMAGE_MP = 2,
STATE_DAMAGE_SP = 3,
STATE_HEAL_HP = 4,
STATE_HEAL_MP = 5,
STATE_HEAL_SP = 6,
};
unsigned short result_type; // 위의 enum 값 중 하나
int value; // enum에 해당하는 종류의 수치
int target_value; // 처리 후 target의 해당 수치
bool final;
int total_amount;
};
struct TS_ATTACK_EVENT : TS_MESSAGE
{
TS_ATTACK_EVENT() _INIT( TM_SC_ATTACK_EVENT )
AR_HANDLE attacker_handle;
AR_HANDLE target_handle;
enum
{
FLAG_CRITICAL = ( 1 << 3 ),
FLAG_MISS = ( 1 << 2 ),
FLAG_BLOCK = ( 1 << 1 ),
FLAG_PERFECT_BLOCK = ( 1 << 0 ),
};
struct ATTACK_INFO
{
int damage;
int mp_damage;
unsigned char flag;
int elemental_damage[ Elemental::TYPE_COUNT ];
int target_hp;
int target_mp;
int attacker_damage;
int attacker_mp_damage;
int attacker_hp;
int attacker_mp;
};
unsigned short attack_speed; // ms
unsigned short attack_delay; // ms
enum
{
ATTACK_END = 1,
ATTACK_AIMING = 2,
ATTACK_ATTACK = 3,
ATTACK_CANCEL = 4,
};
char attack_action;
enum
{
ATTACK_FLAG_BOW = ( 1 << 0 ),
ATTACK_FLAG_CROSS_BOW = ( 1 << 1 ),
ATTACK_FLAG_DOUBLE_WEAPON = ( 1 << 2 ),
ATTACK_FLAG_DOUBLE_ATTACK = ( 1 << 3 ),
};
char attack_flag;
unsigned char count;
// double weapon의 경우, right, left 순서
// double weapon, double attack의 경우, right, left, right, left 순서
};
struct TS_SC_KNOCK_BACK : TS_MESSAGE
{
TS_SC_KNOCK_BACK() _INIT( TM_SC_KNOCK_BACK )
AR_HANDLE handle;
AR_UNIT x, y, z;
unsigned char layer;
float face;
AR_TIME next_movable_time;
};
struct TS_SC_CANT_ATTACK : TS_MESSAGE
{
TS_SC_CANT_ATTACK() _INIT( TM_SC_CANT_ATTACK )
AR_HANDLE attacker_handle;
AR_HANDLE target_handle;
int reason;
};
struct TS_ITEM_BASE_INFO
{
AR_HANDLE handle;
ItemBase::ItemCode Code;
ItemUID uid;
// TS_SC_ITEM_KEEPING_LIST::TS_ITEM_KEEPING_INFO 에 돈이 들어갈 경우 수량이 액수가 되어야 해서 __int64 타입 사용함
__int64 count;
int ethereal_durability;
unsigned int endurance;
unsigned char enhance;
unsigned char level;
short enhance_chance;
int Flag;
int nAdditionalItemEffect; // Fraun Sky Accessories 7/12/2025
int socket[ ItemBase::MAX_SOCKET_NUMBER ];
struct AwakenOption
{
int nValue1[ ItemInstance::MAX_AWAKEN_NUMBER ];
int nValue2[ ItemInstance::MAX_AWAKEN_NUMBER ];
};
AwakenOption awakenoption;
struct RandomOption
{
int nType[ ItemInstance::MAX_RANDOM_OPTION_NUMBER ];
c_fixed10 fValue1[ ItemInstance::MAX_RANDOM_OPTION_NUMBER ];
c_fixed10 fValue2[ ItemInstance::MAX_RANDOM_OPTION_NUMBER ];
};
RandomOption random_option;
int remain_time;
unsigned char elemental_effect_type;
int elemental_effect_remain_time;
int elemental_effect_attack_point;
int elemental_effect_magic_point;
ItemBase::ItemCode appearance_code;
int summon_code;
};
struct TS_ITEM_INFO : TS_ITEM_BASE_INFO
{
short wear_position; // -1이면 장착 안된 아이템,
// -2이면 창고 아이템
// -3이면 캐쉬템 아이템
AR_HANDLE own_summon_handle; // 소환수 장착 아니면 0
int index;
};
struct TS_CS_BIND_SKILLCARD : TS_MESSAGE
{
TS_CS_BIND_SKILLCARD() _INIT( TM_CS_BIND_SKILLCARD )
AR_HANDLE item_handle;
AR_HANDLE target_handle;
};
struct TS_CS_UNBIND_SKILLCARD : TS_MESSAGE
{
TS_CS_UNBIND_SKILLCARD() _INIT( TM_CS_UNBIND_SKILLCARD )
AR_HANDLE item_handle;
AR_HANDLE target_handle;
};
struct TS_SC_SKILLCARD_INFO : TS_MESSAGE
{
TS_SC_SKILLCARD_INFO() _INIT( TM_SC_SKILLCARD_INFO )
AR_HANDLE item_handle;
AR_HANDLE target_handle; // 0 이면 장착해지
};
struct TS_CS_PUTON_ITEM : TS_MESSAGE
{
TS_CS_PUTON_ITEM() _INIT( TM_CS_PUTON_ITEM )
unsigned char position;
AR_HANDLE item_handle;
AR_HANDLE target_handle;
};
struct TS_CS_PUTON_ITEM_SET : TS_MESSAGE
{
TS_CS_PUTON_ITEM_SET() _INIT( TM_CS_PUTON_ITEM_SET )
AR_HANDLE handle[ItemBase::MAX_ITEM_WEAR];
};
struct TS_CS_PUTON_CARD : TS_MESSAGE
{
TS_CS_PUTON_CARD() _INIT( TM_CS_PUTON_CARD )
unsigned char position;
AR_HANDLE item_handle;
};
struct TS_CS_PUTOFF_CARD : TS_MESSAGE
{
TS_CS_PUTOFF_CARD() _INIT( TM_CS_PUTOFF_CARD )
unsigned char position;
};
struct TS_SC_BELT_SLOT_INFO : TS_MESSAGE
{
TS_SC_BELT_SLOT_INFO() _INIT( TM_SC_BELT_SLOT_INFO )
AR_HANDLE handle[8];
};
struct TS_CS_PUTOFF_ITEM : TS_MESSAGE
{
TS_CS_PUTOFF_ITEM() _INIT( TM_CS_PUTOFF_ITEM )
unsigned char position;
AR_HANDLE target_handle;
};
struct TS_CS_DROP_ITEM : TS_MESSAGE
{
TS_CS_DROP_ITEM() _INIT( TM_CS_DROP_ITEM )
AR_HANDLE item_handle;
int count;
};
struct TS_CS_TAKE_ITEM : TS_MESSAGE
{
TS_CS_TAKE_ITEM() _INIT( TM_CS_TAKE_ITEM )
AR_HANDLE taker_handle;
AR_HANDLE item_handle;
};
struct TS_SC_TAKE_ITEM_RESULT : TS_MESSAGE
{
TS_SC_TAKE_ITEM_RESULT() _INIT( TM_SC_TAKE_ITEM_RESULT )
AR_HANDLE item_handle;
AR_HANDLE item_taker;
};
struct TS_SC_DROP_RESULT : TS_MESSAGE
{
TS_SC_DROP_RESULT() _INIT( TM_SC_DROP_RESULT )
AR_HANDLE item_handle;
bool isAccepted;
};
struct TS_CS_ERASE_ITEM : TS_MESSAGE
{
struct EraseItemInfo
{
AR_HANDLE item_handle;
__int64 count;
char is_in_storage;
};
TS_CS_ERASE_ITEM() _INIT( TM_CS_ERASE_ITEM )
unsigned char item_count;
};
struct TS_SC_ERASE_ITEM : TS_MESSAGE
{
struct EraseItemInfo
{
AR_HANDLE item_handle;
__int64 count;
};
TS_SC_ERASE_ITEM() _INIT( TM_SC_ERASE_ITEM )
unsigned char item_count;
};
struct TS_SC_INVENTORY : TS_MESSAGE
{
TS_SC_INVENTORY() _INIT( TM_SC_INVENTORY )
unsigned short count;
// 이하 TS_ITEM_INFO 가 count 만큼 붙게됨
};
struct TS_SC_OPEN_STORAGE : TS_MESSAGE
{
TS_SC_OPEN_STORAGE() _INIT( TM_SC_OPEN_STORAGE )
int maxStorageItemCount;
};
struct TS_SC_COMMERCIAL_STORAGE_INFO : TS_MESSAGE
{
TS_SC_COMMERCIAL_STORAGE_INFO() _INIT( TM_SC_COMMERCIAL_STORAGE_INFO )
unsigned short total_item_count;
unsigned short new_item_count;
};
struct TS_SC_COMMERCIAL_STORAGE_LIST : TS_MESSAGE
{
TS_SC_COMMERCIAL_STORAGE_LIST() _INIT( TM_SC_COMMERCIAL_STORAGE_LIST )
struct CommercialItemInfo
{
unsigned int commercial_item_uid; // cuid (캐쉬템 고유번호)
ItemBase::ItemCode code; // 아이템 코드
unsigned short count; // 갯수
};
unsigned short count;
// 이하 CommercialItemInfo 가 count 만큼 붙음
};
struct TS_CS_TAKEOUT_COMMERCIAL_ITEM : TS_MESSAGE
{
TS_CS_TAKEOUT_COMMERCIAL_ITEM() _INIT( TM_CS_TAKEOUT_COMMERCIAL_ITEM )
unsigned int commercial_item_uid; // 꺼낼 아이템 cuid
unsigned short count; // 꺼낼 갯수
};
struct TS_CS_GET_REGION_INFO : TS_MESSAGE
{
TS_CS_GET_REGION_INFO() _INIT( TM_CS_GET_REGION_INFO )
AR_UNIT x;
AR_UNIT y;
};
struct TS_SC_SHOW_CREATE_GUILD : TS_MESSAGE
{
TS_SC_SHOW_CREATE_GUILD() _INIT( TM_SC_SHOW_CREATE_GUILD )
};
struct TS_SC_SHOW_CREATE_ALLIANCE : TS_MESSAGE
{
TS_SC_SHOW_CREATE_ALLIANCE() _INIT( TM_SC_SHOW_CREATE_ALLIANCE )
};
struct TS_SC_OPEN_GUILD_WINDOW : TS_MESSAGE
{
TS_SC_OPEN_GUILD_WINDOW() _INIT( TM_SC_OPEN_GUILD_WINDOW )
int client_id;
int account_id;
int one_time_password;
char raw_server_name[32];
};
struct TS_SC_UPDATE_GUILD_ICON : TS_MESSAGE
{
TS_SC_UPDATE_GUILD_ICON() _INIT( TM_SC_UPDATE_GUILD_ICON )
int client_id;
int account_id;
int one_time_password;
char raw_server_name[32];
};
struct TS_SC_UPDATE_GUILD_BANNER : TS_MESSAGE
{
TS_SC_UPDATE_GUILD_BANNER() _INIT( TM_SC_UPDATE_GUILD_BANNER )
int client_id;
int account_id;
int one_time_password;
char raw_server_name[32];
};
struct TS_CS_CHANGE_ITEM_POSITION : TS_MESSAGE
{
TS_CS_CHANGE_ITEM_POSITION() _INIT( TM_CS_CHANGE_ITEM_POSITION )
bool is_storage;
AR_HANDLE item_handle_1;
AR_HANDLE item_handle_2;
};
struct TS_CS_STORAGE : TS_MESSAGE
{
TS_CS_STORAGE() _INIT( TM_CS_STORAGE )
enum
{
ITEM_INVENTORY_TO_STORAGE = 0,
ITEM_STORAGE_TO_INVENTORY = 1,
GOLD_INVENTORY_TO_STORAGE = 2,
GOLD_STORAGE_TO_INVENTORY = 3,
CLOSE = 4,
};
AR_HANDLE item_handle;
unsigned char mode;
__int64 count;
};
struct TS_SC_ITEM_COOL_TIME : TS_MESSAGE
{
TS_SC_ITEM_COOL_TIME() _INIT( TM_SC_ITEM_COOL_TIME )
enum
{
MAX_ITEM_COOLTIME_GROUP = 40,
};
AR_TIME cool_time[MAX_ITEM_COOLTIME_GROUP];
};
struct TS_SC_GET_CHAOS : TS_MESSAGE
{
TS_SC_GET_CHAOS() _INIT( TM_SC_GET_CHAOS );
AR_HANDLE hPlayer;
AR_HANDLE hCorpse;
int nChaos;
enum CHAOS_BONUS_TYPE
{
CHAOS_BONUS_NONE = 0,
CHAOS_BONUS_PCBANG = 1,
CHAOS_BONUS_PREMIUM_PCBANG = 2,
};
char nBonusType;
unsigned char nBonusPercent;
int nBonus;
};
struct TS_CS_ARRANGE_ITEM : TS_MESSAGE
{
TS_CS_ARRANGE_ITEM() _INIT( TM_CS_ARRANGE_ITEM );
bool bIsStorage;
};
struct TS_SC_HAIR_INFO : TS_MESSAGE
{
TS_SC_HAIR_INFO() _INIT( TM_SC_HAIR_INFO )
AR_HANDLE hPlayer;
int nHairID;
int nHairColorIndex;
unsigned int nHairColorRGB;
};
struct TS_SC_SKIN_INFO : TS_MESSAGE
{
TS_SC_SKIN_INFO() _INIT( TM_SC_SKIN_INFO )
AR_HANDLE hPlayer;
int nSkinColor;
};
struct TS_CS_HIDE_EQUIP_INFO : TS_MESSAGE
{
TS_CS_HIDE_EQUIP_INFO() _INIT( TM_CS_HIDE_EQUIP_INFO )
unsigned int nHideEquipFlag;
};
struct TS_SC_HIDE_EQUIP_INFO : TS_MESSAGE
{
TS_SC_HIDE_EQUIP_INFO() _INIT( TM_SC_HIDE_EQUIP_INFO )
AR_HANDLE hPlayer;
unsigned int nHideEquipFlag;
};
struct TS_CS_SWAP_EQUIP : TS_MESSAGE
{
TS_CS_SWAP_EQUIP() _INIT( TM_CS_SWAP_EQUIP )
};
struct TS_CS_MIX : TS_MESSAGE
{
TS_CS_MIX() _INIT( TM_CS_MIX )
struct MIX_INFO
{
AR_HANDLE handle;
unsigned short count;
};
MIX_INFO main_item;
unsigned short count;
// 이하 MIX_INFO 타입이 count 만큼 붙게 됨.
};
struct TS_SC_MIX_RESULT : TS_MESSAGE
{
TS_SC_MIX_RESULT() _INIT( TM_SC_MIX_RESULT )
enum MIX_TYPE
{
MIX_TYPE_NONE,
MIX_TYPE_AWAKEN, // 각성
MIX_TYPE_RANDOM_OPTION, // 랜덤옵션
};
unsigned count; // 이하 AR_HANDLE 이 count 만큼 붙게 됨. count 가 0 이면 조합 실패.
unsigned char type; // 각성 Type
};
struct TS_CS_DECOMPOSE : TS_MESSAGE
{
TS_CS_DECOMPOSE() _INIT( TM_CS_DECOMPOSE )
struct DECOMPOSE_INFO
{
DECOMPOSE_INFO( AR_HANDLE _handle = 0, unsigned int _count = 0) : handle( _handle ), count( _count )
{}
AR_HANDLE handle;
unsigned int count;
};
unsigned int count; // 이하 DECOMPOSE_INFO 가 count 만큼 붙게 됨.
};
struct TS_SC_DECOMPOSE_RESULT : TS_MESSAGE
{
TS_SC_DECOMPOSE_RESULT() _INIT( TM_SC_DECOMPOSE_RESULT )
struct DECOMPOSE_INFO
{
DECOMPOSE_INFO( AR_HANDLE _handle = 0, unsigned int _count = 0) : handle( _handle ), count( _count )
{}
AR_HANDLE handle;
unsigned int count;
};
unsigned int total_count; // 이하 DECOMPOSE_INFO 가 total_count 만큼 붙게 됨. total_count는 항상 1 이상 (분해실패하면 TS_SC_RESULT 패킷 보냄)
};
struct TS_SC_CHAT_LOCAL : TS_MESSAGE
{
TS_SC_CHAT_LOCAL() _INIT( TM_SC_CHAT_LOCAL )
AR_HANDLE handle;
unsigned char len;
unsigned char type;
};
struct TS_SC_CHAT_RESULT : TS_MESSAGE
{
TS_SC_CHAT_RESULT() _INIT( TM_SC_CHAT_RESULT )
enum CHAT_RESULT
{
RESULT_DECREASE_HPMP = 0,
RESULT_COOLTIME = 1,
RESULT_NEED_MORE_HPMP = 2,
RESULT_LEVEL_RESTRICT = 3,
};
unsigned char type;
unsigned char percentage;
int result;
int reserved;
};
enum CHAT_TYPE
{
CHAT_NORMAL = 0, // 일반채팅
CHAT_YELL = 1, // 외치기
CHAT_ADV = 2, // 광고채팅
CHAT_WHISPER = 3, // 귓속말
CHAT_GLOBAL = 4, // 전체메시지
CHAT_EMOTION = 5, // 이모션
CHAT_GM = 6, // GM 메시지(색상 분리를 위해)
CHAT_GM_WHISPER = 7, // GM 귓말 메시지(색상 분리를 위해)
CHAT_PARTY = 10, // 파티
CHAT_GUILD = 11, // 길드
CHAT_ATTACKTEAM = 12, // 동맹(시즈 공대)
CHAT_FRIEND = 13, // 친구
CHAT_NOTICE = 20, // 공지
CHAT_ANNOUNCE = 21, // 알림 This is the green one if that's what you want
CHAT_CENTER_NOTICE = 22, // 중앙 공지(UI 팀에서 추가한 화면 중앙 상단에 위치한 별도의 공지 공간에 출력됨)
CHAT_EXP = 30, // 경험치 관련
CHAT_DAMAGE = 31, // 데미지 (공격&마법데미지양)
CHAT_ITEM = 32, // 아이템 관련
CHAT_BATTLE = 33, // 전투관련
CHAT_SUMMON = 34, // 소환수 관련
CHAT_ETC = 35, // 기타
CHAT_TITLE = 36, // 호칭
CHAT_NPC = 40, // NPC 메시지
CHAT_DEBUG = 50, // 디버그 메시지 (개발용. 콘솔에 출력)
CHAT_PARTY_SYSTEM = 100, // 파티 시스템 메시지
CHAT_GUILD_SYSTEM = 110, // 길드 시스템 메시지
CHAT_QUEST_SYSTEM = 120, // 퀘스트 메시지
CHAT_RAID_SYSTEM = 130, // 레이드 시스템 메시지
CHAT_FRIEND_SYSTEM = 140, // 친구 시스템 메시지
CHAT_ALLIANCE_SYSTEM = 150, // 길드 연합 시스템 메시지
CHAT_HUNTAHOLIC_SYSTEM = 160, // 헌터홀릭 시스템 메시지
CHAT_DUNGEON_SYSTEM = 170, // 인스턴스 던전 시스템 메시지
//AziaMafia Tchat Helper
CHAT_HELPER = 56,
CHAT_HELPER_WHISPER = 57,
};
struct TS_SC_CHAT : TS_MESSAGE
{
TS_SC_CHAT() _INIT( TM_SC_CHAT )
char szSender[21];
unsigned short len;
unsigned char type;
};
struct TS_CS_CHAT_REQUEST : TS_MESSAGE
{
TS_CS_CHAT_REQUEST() _INIT( TM_CS_CHAT_REQUEST )
char szTarget[21];
unsigned char request_id;
unsigned char len;
unsigned char type;
};
struct TS_SC_STAT_INFO : TS_MESSAGE
{
TS_SC_STAT_INFO() _INIT( TM_SC_STAT_INFO )
AR_HANDLE handle;
CreatureStat stat;
CreatureAttribute attribute;
enum
{
TOTAL = 0,
BY_ITEM = 1,
};
unsigned char type;
};
struct TS_SC_REGEN_INFO : TS_MESSAGE
{
TS_SC_REGEN_INFO() _INIT( TM_SC_REGEN_INFO )
AR_HANDLE handle;
short hp_regen_percentage;
int hp_regen_point;
short mp_regen_percentage;
int mp_regen_point;
};
struct TS_CS_CANCEL_ACTION : TS_MESSAGE
{
TS_CS_CANCEL_ACTION() _INIT( TM_CS_CANCEL_ACTION )
AR_HANDLE handle;
};
struct TS_CS_SKILL : TS_MESSAGE
{
TS_CS_SKILL() _INIT( TM_CS_SKILL )
int skill_id;
AR_HANDLE caster;
AR_HANDLE target;
AR_UNIT x,y,z;
unsigned char layer;
/*
enum
{
CASTING = 1,
CANCEL = 2,
};
char type;
*/
char skill_level;
};
/*
struct TS_SC_SKILL_CASTING_TIME : TS_MESSAGE
{
TS_SC_SKILL_CASTING_TIME() _INIT( TM_SC_SKILL_CASTING_TIME )
AR_HANDLE caster;
AR_TIME tm;
};
*/
struct TS_SC_SKILL : TS_MESSAGE
{
TS_SC_SKILL() _INIT( TM_SC_SKILL )
int skill_id;
char skill_level;
AR_HANDLE caster;
AR_HANDLE target;
AR_UNIT x,y,z;
unsigned char layer;
char type;
int hp_cost;
int mp_cost;
int caster_hp;
int caster_mp;
enum
{
FIRE = 0,
CASTING = 1,
CASTING_UPDATE = 2,
CANCEL = 3,
REGION_FIRE = 4, // 지역 스킬의 fire
COMPLETE = 5,
};
struct CancelType
{
// 내용 없음
};
struct CompleteType
{
// 내용 없음
};
struct CastType // Casting 이거나 Casting_update일 경우 날아감.
{
AR_TIME tm; // 캐스팅 타임
unsigned short nErrorCode; // 성공 여부 ( 0이면 성공 )
};
struct FireType // Region Fire일 경우에도 얘가 날아감.
{
bool bMultiple;
AR_UNIT range; // 스킬 효과 범위
unsigned char target_count;
unsigned char fire_count;
unsigned short count;
};
union
{
CancelType cancel;
CompleteType complete;
CastType cast;
FireType fire;
};
// Fire나 Region Fire일 경우 추가로 뒤에 SkillResult 가 count 만큼 따라간다
};
struct TS_SC_AURA : TS_MESSAGE
{
TS_SC_AURA() _INIT( TM_SC_AURA )
AR_HANDLE caster;
int skill_id;
bool status;
};
struct TS_CS_REQUEST_REMOVE_STATE : TS_MESSAGE
{
TS_CS_REQUEST_REMOVE_STATE() _INIT( TM_CS_REQUEST_REMOVE_STATE )
AR_HANDLE target;
int state_code;
};
struct TS_CS_SUMMON_CARD_SKILL_LIST : TS_MESSAGE
{
TS_CS_SUMMON_CARD_SKILL_LIST() _INIT( TM_CS_SUMMON_CARD_SKILL_LIST )
AR_HANDLE item_handle;
};
struct TS_SC_SKILL_LEVEL_LIST : TS_MESSAGE
{
TS_SC_SKILL_LEVEL_LIST() _INIT( TM_SC_SKILL_LEVEL_LIST )
struct SkillLevelInfo
{
int skill_id;
unsigned char skill_level;
};
unsigned short count;
};
struct TS_SC_SKILL_EFFECT : TS_MESSAGE
{
TS_SC_SKILL_EFFECT() _INIT( TM_SC_SKILL_EFFECT )
AR_HANDLE caster;
AR_HANDLE target;
int skill_id;
unsigned char skill_level;
int var1; // Damage 양
unsigned char var2; // HP Percentage
char var3; // Flag
};
// 라크 갱신도 같이 처리
struct TS_SC_GOLD_UPDATE : TS_MESSAGE
{
TS_SC_GOLD_UPDATE() _INIT( TM_SC_GOLD_UPDATE )
__int64 gold;
int chaos;
};
struct TS_SC_EXP_UPDATE : TS_MESSAGE
{
TS_SC_EXP_UPDATE() _INIT( TM_SC_EXP_UPDATE )
AR_HANDLE handle;
__int64 exp;
__int64 jp;
};
struct TS_SC_BONUS_EXP_JP : TS_MESSAGE
{
TS_SC_BONUS_EXP_JP() _INIT( TM_SC_BONUS_EXP_JP )
AR_HANDLE handle;
unsigned short count;
struct BONUS_INFO
{
int type; // 보너스 종류
int rate; // 보너스 비율(메시지 출력용)
__int64 exp; // 보너스 경험치
__int64 jp; // 보너스 JP
};
// 이 뒤로 count개 만큼의 BONUS_INFO가 붙어서 감
};
struct TS_SC_DETECT_RANGE_UPDATE : TS_MESSAGE
{
TS_SC_DETECT_RANGE_UPDATE() _INIT( TM_SC_DETECT_RANGE_UPDATE )
AR_HANDLE handle;
AR_UNIT detect_range;
};
struct TS_SC_LEVEL_UPDATE : TS_MESSAGE
{
TS_SC_LEVEL_UPDATE() _INIT( TM_SC_LEVEL_UPDATE )
AR_HANDLE handle;
int level;
int job_level;
};
/////////////////////////////////////////////////////////////////////////////
// 로비에서 쓰기 위한것들
struct MODEL_INFO
{
int sex;
int race;
int model_id[5];
int hair_color_index;
unsigned int hair_color_rgb;
unsigned int hide_equip_flag;
int texture_id;
int wear_info[ItemBase::MAX_ITEM_WEAR];
};
struct LOBBY_CHARACTER_INFO : MODEL_INFO
{
int level;
int job;
int job_level;
int exp_percentage; // ( 0 ~ 100 )
int hp;
int mp;
int permission;
bool is_banned;
char name[19];
unsigned long skin_color;
char szCreateTime[30];
char szDeleteTime[30];
int wear_item_enhance_info[ItemBase::MAX_ITEM_WEAR];
int wear_item_level_info[ItemBase::MAX_ITEM_WEAR];
char wear_item_elemental_type[ItemBase::MAX_ITEM_WEAR];
ItemBase::ItemCode wear_appearance_code[ItemBase::MAX_ITEM_WEAR];
};
struct TS_CS_CHARACTER_LIST : TS_MESSAGE
{
TS_CS_CHARACTER_LIST() _INIT( TM_CS_CHARACTER_LIST )
char account[GameRule::MAX_ACCOUNT_LEN + 1];
};
struct TS_CS_CHECK_CHARACTER_NAME : TS_MESSAGE
{
TS_CS_CHECK_CHARACTER_NAME() _INIT( TM_CS_CHECK_CHARACTER_NAME )
char name[19];
};
struct TS_CS_CHANGE_ALIAS : TS_MESSAGE
{
TS_CS_CHANGE_ALIAS() _INIT( TM_CS_CHANGE_ALIAS )
char alias[ 19 ];
};
struct TS_CS_CREATE_CHARACTER : TS_MESSAGE
{
TS_CS_CREATE_CHARACTER() _INIT( TM_CS_CREATE_CHARACTER )
LOBBY_CHARACTER_INFO info;
};
struct TS_CS_DELETE_CHARACTER : TS_MESSAGE
{
TS_CS_DELETE_CHARACTER() _INIT( TM_CS_DELETE_CHARACTER )
char name[19];
};
struct TS_SC_CHARACTER_LIST : TS_MESSAGE
{
TS_SC_CHARACTER_LIST() _INIT( TM_SC_CHARACTER_LIST )
unsigned int current_server_time; // 1970년 1월 1일 0시 0분 0초로부터 몇초가 경과되었는지를 알려줌.
// ( CRT 의 time() 리턴값임)
unsigned short last_login_index;
unsigned short count;
// 이하 LOBBY_CHARACTER_INFO 가 count 만큼 붙게됨
};
struct TS_CS_ACCOUNT_WITH_AUTH : TS_MESSAGE
{
TS_CS_ACCOUNT_WITH_AUTH() _INIT( TM_CS_ACCOUNT_WITH_AUTH )
char account[GameRule::MAX_ACCOUNT_LEN + 1];
__int64 one_time_key;
};
// NPC 다이얼로그
struct TS_SC_DIALOG : TS_MESSAGE
{
TS_SC_DIALOG() _INIT( TM_SC_DIALOG )
enum DIALOG_TYPE
{
TYPE_NPC = 0,
TYPE_DUNGEON_STONE = 1,
TYPE_DONATION_PROP = 2,
TYPE_QUEST_INFO_AND_START = 3,
TYPE_AUCTION_WINDOW = 4,
TYPE_HUNTAHOLIC_LOBBY = 5,
TYPE_DONATION_REWARD_NOTIFY = 6,
TYPE_QUEST_INFO_IN_PROGRESS = 7,
TYPE_QUEST_INFO_AND_END = 8,
TYPE_CREATURE_FARM_WINDOW = 9,
TYPE_OTHER_INSTANCE_DUNGEON_CONFIRM_WINDOW = 10,
};
int type;
AR_HANDLE npc_handle; // NULL 일수도 있음.
// 만약 length가 모두 0일경우는 열려 있던 다이얼로그를 닫을것.
unsigned short title_length;
unsigned short text_length;
unsigned short menu_length;
// 이하 다이얼로그 정보가 text string 으로 붙게됨. 메뉴는 |문자열|트리거| 의 형식으로 붙게 된다.
/*
+-----------------------+ title_length : 6
| 경비병 | text_length : 20
+-----------------------+ menu_length : 41
| |
| 위험하니 돌아가세요. | data : 경비병위험하니 돌아가세요.|예|on_click_yes()||아니오|on_click_no()|
| |
| |
| [예] [아니오] |
+-----------------------+
*/
};
// 다이얼로그 메뉴 클릭 결과를 전송한다. 이 헤더 이후에 스트링이 따라 붙어 오게 된다.
struct TS_CS_DIALOG : TS_MESSAGE
{
TS_CS_DIALOG() _INIT( TM_CS_DIALOG )
unsigned short trigger_length;
};
// 프랍이나 NPC 를 클릭했을때 서버로 보낸다. 결과로는 TS_SC_DIALOG 나 기타등등의 메시지가 갈 수 있다.
struct TS_CS_CONTACT : TS_MESSAGE
{
TS_CS_CONTACT() _INIT( TM_CS_CONTACT )
AR_HANDLE handle;
};
// 특수 다이얼로그 처리
struct TS_SC_SHOW_WINDOW : TS_MESSAGE
{
TS_SC_SHOW_WINDOW() _INIT( TM_SC_SHOW_WINDOW )
unsigned short window_length;
unsigned short argument_length;
unsigned short trigger_length;
};
// 메시지 박스 처리
struct TS_SC_GENERAL_MESSAGE_BOX : TS_MESSAGE
{
TS_SC_GENERAL_MESSAGE_BOX() _INIT( TM_SC_GENERAL_MESSAGE_BOX )
unsigned short text_length;
};
struct TS_SC_NPC_TRADE_INFO : TS_MESSAGE
{
TS_SC_NPC_TRADE_INFO() _INIT( TM_SC_NPC_TRADE_INFO )
bool is_sell;
ItemBase::ItemCode code;
__int64 count;
__int64 price;
int huntaholic_point;
int arena_point;
AR_HANDLE target;
};
struct TS_SC_MARKET : TS_MESSAGE
{
struct ItemInfo
{
ItemBase::ItemCode code; // 상점 물품 아이템 코드
__int64 price; // 상점 판매가 - 루피(플레이어 입장 구매가)
int huntaholic_point; // 상점 판매가 - 헌터홀릭 포인트(플레이어 입장 구매가)
int arena_point; // 상점 판매가 - 아레나 포인트(플레이어 입장 구매가)
};
TS_SC_MARKET() _INIT( TM_SC_MARKET )
AR_HANDLE npc_handle;
unsigned short item_count;
};
struct TS_CS_BUY_ITEM : TS_MESSAGE
{
TS_CS_BUY_ITEM() _INIT( TM_CS_BUY_ITEM )
ItemBase::ItemCode item_code;
unsigned short buy_count;
};
struct TS_CS_SELL_ITEM : TS_MESSAGE
{
TS_CS_SELL_ITEM() _INIT( TM_CS_SELL_ITEM )
AR_HANDLE handle;
__int64 sell_count;
};
struct TS_CS_DONATE_ITEM : TS_MESSAGE
{
struct DonateItemInfo
{
AR_HANDLE handle;
__int64 count;
};
TS_CS_DONATE_ITEM() _INIT( TM_CS_DONATE_ITEM )
__int64 gold;
int jp;
unsigned char item_count;
// 이 뒤로 DonateItemInfo가 item_count 개수만큼 붙음
};
struct TS_CS_DONATE_REWARD : TS_MESSAGE
{
TS_CS_DONATE_REWARD() _INIT( TM_CS_DONATE_REWARD )
struct RewardInfo
{
unsigned char reward_type;
unsigned short count;
};
unsigned char reward_count;
// 이 뒤로 reward_count개 만큼의 RewardInfo가 붙어서 옴
};
struct TS_SC_SHOW_SOULSTONE_CRAFT_WINDOW : TS_MESSAGE
{
TS_SC_SHOW_SOULSTONE_CRAFT_WINDOW() _INIT( TM_SC_SHOW_SOULSTONE_CRAFT_WINDOW );
};
struct TS_CS_SOULSTONE_CRAFT : TS_MESSAGE
{
TS_CS_SOULSTONE_CRAFT() _INIT( TM_CS_SOULSTONE_CRAFT );
AR_HANDLE craft_item_handle;
enum
{
MAX_SOULSTONE_NUM = 8, //4
};
AR_HANDLE soulstone_handle[ MAX_SOULSTONE_NUM ];
};
struct TS_SC_SHOW_SOULSTONE_REPAIR_WINDOW : TS_MESSAGE
{
TS_SC_SHOW_SOULSTONE_REPAIR_WINDOW() _INIT( TM_SC_SHOW_SOULSTONE_REPAIR_WINDOW );
};
struct TS_CS_REPAIR_SOULSTONE : TS_MESSAGE
{
TS_CS_REPAIR_SOULSTONE() _INIT( TM_CS_REPAIR_SOULSTONE );
enum
{
MAX_REPAIR_COUNT = 6,
};
AR_HANDLE item_handle[ MAX_REPAIR_COUNT ];
};
struct TS_CS_TRANSMIT_ETHEREAL_DURABILITY : TS_MESSAGE
{
TS_CS_TRANSMIT_ETHEREAL_DURABILITY() _INIT( TM_CS_TRANSMIT_ETHEREAL_DURABILITY );
AR_HANDLE handle;
};
struct TS_CS_TRANSMIT_ETHEREAL_DURABILITY_TO_EQUIPMENT : TS_MESSAGE
{
TS_CS_TRANSMIT_ETHEREAL_DURABILITY_TO_EQUIPMENT() _INIT( TM_CS_TRANSMIT_ETHEREAL_DURABILITY_TO_EQUIPMENT );
float rate;
char target;
};
struct TS_CS_USE_ITEM : TS_MESSAGE
{
TS_CS_USE_ITEM() _INIT( TM_CS_USE_ITEM )
AR_HANDLE item_handle;
AR_HANDLE target_handle; // 혼자 쓰는거라면 0
char szParameter[32];
};
struct TS_SC_USE_ITEM_RESULT : TS_MESSAGE
{
TS_SC_USE_ITEM_RESULT() _INIT( TM_SC_USE_ITEM_RESULT )
AR_HANDLE item_handle;
AR_HANDLE target_handle;
};
struct TS_SC_DESTROY_ITEM : TS_MESSAGE
{
TS_SC_DESTROY_ITEM() _INIT( TM_SC_DESTROY_ITEM )
AR_HANDLE item_handle;
};
struct TS_SC_UPDATE_ITEM_COUNT : TS_MESSAGE
{
TS_SC_UPDATE_ITEM_COUNT() _INIT( TM_SC_UPDATE_ITEM_COUNT )
AR_HANDLE item_handle;
__int64 count;
};
struct TS_TRADE : TS_MESSAGE
{
TS_TRADE() _INIT( TM_TRADE )
enum {
REQUEST_TRADE = 0, // 트레이드 요청을 시작한다
ACCEPT_TRADE = 1, // 트레이드 요청을 수락한다
BEGIN_TRADE = 2, // 트레이드 시작
CANCEL_TRADE = 3, // 트레이드 취소
REJECT_TRADE = 4, // 트레이드 거부
ADD_ITEM = 5, // 아이템을 올린다.
ADD_GOLD = 6, // 돈을 올린다. 돈을 올릴때는 item_info 를 모두 0 으로 채우고 count 만 액수로 설정한다.
FREEZE_TRADE = 7, // 확인버튼을 누른다.
CONFIRM_TRADE = 8, // 최종결정 버튼을 누른다.
PROCESS_TRADE = 9, // 거래 완료
REMOVE_ITEM = 10, // 아이템을 내린다(확인 버튼 누르기 이전에 아이템 올릴 수 있을 때만 가능)
MODIFY_COUNT = 11, // 아이템 수량을 바꾼다
};
/* 트레이드 진행 순서의 예
. 트레이드 요청하는이를 A, 대상을 B 라고 한다.
1. A 가 B 의 핸들을 적어 서버에게 REQUEST_TRADE 를 보낸다.
2. B 에게는 REQUEST_TRADE 메시지가 도착한다.
3. 만약 B 가 거부하려면 서버에게 REJECT_TRADE 메시지를 보낸다. 그러면 A 에게 REJECT_TRADE 메시지가 전달됨.
4. 만약 B 가 승락하려면 서버에게 ACCEPT_TRADE 메시지를 보낸다. 그러면 A 와 B 에게 BEGIN_TRADE 메시지가 전달됨.
5. 이후 아이템이나 돈을 올려 놓으려면 서버에게 ADD_ITEM 이나 ADD_GOLD 메시지를 보낸다. 그러면 A 와 B 에게 해당 메시지가 전달됨.
6. 만약 중도에 트레이드를 취소하려면 서버에 CANCEL_TRADE 버튼을 누른다. 그러면 A 와 B 에게 CANCEL_TRADE 메시지가 전달됨.
7. 확인 버튼을 누르려면 서버에게 FREEZE_TRADE 메시지를 보낸다. 그러면 A 와 B 에게 FREEZE_TRADE 메시지가 전달됨.
8. 둘다 확인버튼을 누른 상태에서 또 둘다 CONFIRM_TRADE 메시지를 보내면 트레이드가 성사된다.
A 와 B 에게 PROCESS_TRADE 가 전송되며 바뀐 인벤 데이터와 금액 데이터는 다른 메시지로 전송된다.
*/
AR_HANDLE target_player;
char mode;
TS_ITEM_INFO item_info;
};
struct TS_SC_SKILL_LIST : TS_MESSAGE
{
TS_SC_SKILL_LIST() _INIT( TM_SC_SKILL_LIST );
struct SkillInfo
{
int skill_id;
unsigned char base_skill_level;
unsigned char current_skill_level;
AR_TIME total_cool_time;
AR_TIME remain_cool_time;
};
AR_HANDLE target; // 플레이어 혹은 크리쳐
unsigned short count;
unsigned char modification_type; // enum ModificationType
// 이후 따라오는 스킬 리스트가 어떤 의미를 가지는가를 의미하는 열거형
enum ModificationType
{
UPDATE = 0, // 스킬이 업데이트됨
REFRESH = 1, // 스킬 리스트를 갱신
};
// 이후 count만큼의 SkillInfo가 따라옴
};
// 스킬 레벨의 변동이 발생
struct TS_SC_ADDED_SKILL_LIST : TS_MESSAGE
{
TS_SC_ADDED_SKILL_LIST() _INIT( TM_SC_ADDED_SKILL_LIST );
struct AddedSkillInfo
{
int skill_id; // 스킬 ID
bool restricted_to_type;
char added_skill_level;
};
AR_HANDLE target;
unsigned short count;
};
// 스킬을 배우거나, 스킬레벨을 올린다.
struct TS_CS_LEARN_SKILL : TS_MESSAGE
{
TS_CS_LEARN_SKILL() _INIT( TM_CS_LEARN_SKILL )
AR_HANDLE target; // 자기 자신 혹은 자신의 크리쳐
int skill_id; // 배우려는 목표 스킬 ID
int original_skill_id; // 랜덤 스킬로 찍혔을 때 원본 랜덤 스킬 ID(껍데기스킬), 아니면 0
short skill_level; // 배울 스킬 레벨
};
// 잡레벨을 올린다 (1씩)
struct TS_CS_JOB_LEVEL_UP : TS_MESSAGE
{
TS_CS_JOB_LEVEL_UP() _INIT( TM_CS_JOB_LEVEL_UP )
AR_HANDLE target; // 자기 자신 혹은 자신의 크리쳐
};
//////////////////////////////////////////////////////////////////////////////
// 이하 소환수
struct TS_SC_SUMMON_EVOLUTION : TS_MESSAGE
{
TS_SC_SUMMON_EVOLUTION() _INIT( TM_SC_SUMMON_EVOLUTION )
AR_HANDLE card_handle;
AR_HANDLE summon_handle;
char name[19];
int code;
};
struct TS_SC_ADD_SUMMON_INFO : TS_MESSAGE
{
TS_SC_ADD_SUMMON_INFO() _INIT( TM_SC_ADD_SUMMON_INFO )
AR_HANDLE card_handle;
AR_HANDLE summon_handle;
char name[19];
int code;
// 이하 정보 필요
int level;
int sp;
};
struct TS_SC_REMOVE_SUMMON_INFO : TS_MESSAGE
{
TS_SC_REMOVE_SUMMON_INFO() _INIT( TM_SC_REMOVE_SUMMON_INFO )
AR_HANDLE card_handle;
};
struct TS_EQUIP_SUMMON : TS_MESSAGE
{
TS_EQUIP_SUMMON() _INIT( TM_EQUIP_SUMMON )
bool open_dialog;
AR_HANDLE card_handle[ 6 ];
};
struct TS_CS_SUMMON : TS_MESSAGE
{
TS_CS_SUMMON() _INIT( TM_CS_SUMMON )
unsigned char is_summon; // 1이면 소환, 0이면 역소환
AR_HANDLE card_handle;
};
struct TS_SC_UNSUMMON_NOTICE : TS_MESSAGE
{
TS_SC_UNSUMMON_NOTICE() _INIT( TM_SC_UNSUMMON_NOTICE )
AR_HANDLE summon_handle;
AR_TIME unsummon_duration;
};
struct TS_SC_UNSUMMON : TS_MESSAGE
{
TS_SC_UNSUMMON() _INIT( TM_SC_UNSUMMON )
AR_HANDLE summon_handle;
};
struct TS_SC_ITEM_DROP_INFO : TS_MESSAGE // Broadcast only
{
TS_SC_ITEM_DROP_INFO() _INIT( TM_SC_ITEM_DROP_INFO )
AR_HANDLE monster_handle;
AR_HANDLE item_handle;
};
struct TS_SC_QUEST_LIST : TS_MESSAGE
{
enum
{
MAX_VALUE = 6,
};
struct TS_QUEST_INFO
{
QuestBase::QuestCode code;
int nStartID;
int nValue[MAX_VALUE];
int nStatus[QuestInstance::MAX_STATUS];
unsigned char nProgress;
AR_TIME nTimeLimit;
};
struct TS_PENDING_QUEST_INFO
{
QuestBase::QuestCode code;
int nStartID;
};
TS_SC_QUEST_LIST() _INIT( TM_SC_QUEST_LIST )
unsigned short count_active;
unsigned short count_pending;
// 이하 TS_QUEST_INFO가 count_active만큼 붙고 그 뒤로 TS_PENDING_QUEST_INFO가 count_pending만큼 붙게 됨.
};
struct TS_SC_QUEST_STATUS : TS_MESSAGE
{
TS_SC_QUEST_STATUS() _INIT( TM_SC_QUEST_STATUS )
QuestBase::QuestCode code;
int nStatus[QuestInstance::MAX_STATUS];
unsigned char nProgress;
AR_TIME nTimeLimit;
};
struct TS_SC_QUEST_INFOMATION : TS_MESSAGE
{
enum QUEST_PROGRESS
{
IS_STARTABLE = 0,
IS_IN_PROGRESS = 1,
IS_FINISHABLE = 2,
};
TS_SC_QUEST_INFOMATION() _INIT( TM_SC_QUEST_INFOMATION )
QuestBase::QuestCode code;
QUEST_PROGRESS nProgress;
unsigned short trigger_length;
};
struct TS_CS_DROP_QUEST : TS_MESSAGE
{
TS_CS_DROP_QUEST() _INIT( TM_CS_DROP_QUEST )
QuestBase::QuestCode code;
};
struct TS_CS_QUEST_INFO : TS_MESSAGE
{
TS_CS_QUEST_INFO() _INIT( TM_CS_QUEST_INFO )
QuestBase::QuestCode code;
};
struct TS_CS_END_QUEST : TS_MESSAGE
{
TS_CS_END_QUEST() _INIT( TM_CS_END_QUEST )
QuestBase::QuestCode code;
unsigned char nOptionalReward;
};
struct TS_SC_TITLE_LIST : TS_MESSAGE
{
struct TS_TITLE_INFO
{
int code;
int status;
};
TS_SC_TITLE_LIST() _INIT( TM_SC_TITLE_LIST )
unsigned short count;
// 이하 TS_TITLE_INFO가 count만큼 붙는다.
};
struct TS_SC_TITLE_CONDITION_LIST : TS_MESSAGE
{
struct TS_TITLE_CONDITION_INFO
{
int type;
__int64 count;
};
TS_SC_TITLE_CONDITION_LIST() _INIT( TM_SC_TITLE_CONDITION_LIST )
unsigned short count;
// 이하 TS_TITLE_CONDITION_INFO가 count만큼 붙는다.
};
struct TS_SC_REMAIN_TITLE_TIME : TS_MESSAGE
{
TS_SC_REMAIN_TITLE_TIME() _INIT( TM_SC_REMAIN_TITLE_TIME )
AR_TIME remain_title_time;
};
struct TS_CS_SET_MAIN_TITLE : TS_MESSAGE
{
TS_CS_SET_MAIN_TITLE() _INIT( TM_CS_SET_MAIN_TITLE )
int code;
};
struct TS_SC_SET_MAIN_TITLE : TS_MESSAGE
{
TS_SC_SET_MAIN_TITLE() _INIT( TM_SC_SET_MAIN_TITLE )
int handle;
int code;
};
struct TS_CS_SET_SUB_TITLE : TS_MESSAGE
{
TS_CS_SET_SUB_TITLE() _INIT( TM_CS_SET_SUB_TITLE )
int index;
int code;
};
struct TS_SC_SET_SUB_TITLE : TS_MESSAGE
{
TS_SC_SET_SUB_TITLE() _INIT( TM_SC_SET_SUB_TITLE )
int index;
int code;
};
struct TS_CS_BOOKMARK_TITLE : TS_MESSAGE
{
TS_CS_BOOKMARK_TITLE() _INIT( TM_CS_BOOKMARK_TITLE )
int code;
};
struct TS_SC_BOOKMARK_TITLE : TS_MESSAGE
{
TS_SC_BOOKMARK_TITLE() _INIT( TM_SC_BOOKMARK_TITLE )
int code;
bool bookmarked;
};
struct TS_SC_ACHIEVE_TITLE : TS_MESSAGE
{
TS_SC_ACHIEVE_TITLE() _INIT( TM_SC_ACHIEVE_TITLE )
int code;
};
struct TS_SC_OPEN_TITLE : TS_MESSAGE
{
TS_SC_OPEN_TITLE() _INIT( TM_SC_OPEN_TITLE )
int code;
};
struct TS_SC_CHANGE_TITLE_CONDITION : TS_MESSAGE
{
TS_SC_CHANGE_TITLE_CONDITION() _INIT( TM_SC_CHANGE_TITLE_CONDITION )
int condition_id;
__int64 count;
};
struct TS_CS_RETURN_LOBBY : TS_MESSAGE
{
TS_CS_RETURN_LOBBY() _INIT( TM_CS_RETURN_LOBBY )
};
struct TS_CS_REQUEST_RETURN_LOBBY : TS_MESSAGE
{
TS_CS_REQUEST_RETURN_LOBBY() _INIT( TM_CS_REQUEST_RETURN_LOBBY )
};
struct TS_CS_REQUEST_LOGOUT : TS_MESSAGE
{
TS_CS_REQUEST_LOGOUT() _INIT( TM_CS_REQUEST_LOGOUT )
};
struct TS_CS_LOGOUT : TS_MESSAGE
{
TS_CS_LOGOUT() _INIT( TM_CS_LOGOUT )
};
struct TS_SC_DISCONNECT_DESC : TS_MESSAGE
{
TS_SC_DISCONNECT_DESC() _INIT( TM_SC_DISCONNECT_DESC )
enum _DISCONNECT_TYPE
{
// { TS_AG_KICK_CLIENT::_KICK_TYPE
DISCONNECT_TYPE_ANOTHER_LOGIN = 0, // 다른 유저의 접속으로 인한 접속 종료
DISCONNECT_TYPE_DUPLICATED_LOGIN = 1, // 인증 서버에서 게임 서버 로그인 처리 시 중복된 로그인 감지로 인한 접속 종료(내부 오류 또는 해킹에 의한 발생)
DISCONNECT_TYPE_BILLING_EXPIRED = 2, // 결재 정보 만료로 인한 접속 종료
DISCONNECT_TYPE_GAME_ADDICTION = 3, // 게임 중독 방지로 인한 접속 종료
// } TS_AG_KICK_CLIENT::_KICK_TYPE
DISCONNECT_TYPE_DB_ERROR = 100, // DB 오류로 인한 예외 처리로 인한 접속 종료
DISCONNECT_TYPE_ANTI_HACK = 101, // 게임 보안 솔루션 오류로 인한 접속 종료
DISCONNECT_TYPE_SCRIPT = 102, // 스크립트 명령어(SCRIPT_Kick)으로 인한 접속 종료
};
char desc_id;
};
struct TS_CS_START_BOOTH : TS_MESSAGE
{
struct TS_BOOTH_OPEN_ITEM_INFO
{
AR_HANDLE item_handle;
int cnt;
__int64 gold;
};
TS_CS_START_BOOTH() _INIT( TM_CS_START_BOOTH )
char name[49];
char type; // If 1 → Selling booth, If 2 → Buying booth
unsigned short cnt;
// After this, TS_BOOTH_ITEM_OPEN_INFO structures follow,
// as many times as the value of CNT.
};
struct TS_CS_STOP_BOOTH : TS_MESSAGE
{
TS_CS_STOP_BOOTH() _INIT( TM_CS_STOP_BOOTH )
};
struct TS_CS_WATCH_BOOTH : TS_MESSAGE
{
TS_CS_WATCH_BOOTH() _INIT( TM_CS_WATCH_BOOTH )
AR_HANDLE target; // 보고 싶은 사용자
};
struct TS_SC_WATCH_BOOTH : TS_MESSAGE
{
struct TS_BOOTH_ITEM_INFO : TS_ITEM_BASE_INFO
{
__int64 gold;
};
TS_SC_WATCH_BOOTH() _INIT( TM_SC_WATCH_BOOTH )
AR_HANDLE target; // 노점을 연 사용자
char type; // 1이면 판매 부스. 2이면 구매 부스
unsigned short cnt; // 아이템 숫자
// 아래로 TS_BOOTH_ITEM_INFO가 CNT만큼 붙게 됨
};
struct TS_CS_STOP_WATCH_BOOTH : TS_MESSAGE
{
TS_CS_STOP_WATCH_BOOTH() _INIT( TM_CS_STOP_WATCH_BOOTH )
AR_HANDLE target; // 보고 싶은 사용자
};
struct TS_CS_BUY_FROM_BOOTH : TS_MESSAGE
{
TS_CS_BUY_FROM_BOOTH() _INIT( TM_CS_BUY_FROM_BOOTH )
AR_HANDLE target; // 노점을 연 사용자
short cnt;
// 이하 TS_ITEM_BASE_INFO 가 count만큼 들어감.
};
struct TS_BOOTH_TRADE_ITEM_INFO : TS_ITEM_BASE_INFO
{
__int64 price;
};
struct TS_SC_BOOTH_TRADE_INFO : TS_MESSAGE
{
TS_SC_BOOTH_TRADE_INFO() _INIT( TM_SC_BOOTH_TRADE_INFO )
AR_HANDLE target; // 거래가 이루어진 대상
bool is_sell; // 판매인지 구매인지 여부. true이면 판매. false이면 구매.
short cnt;
// 이하 TS_BOOTH_TRADE_ITEM_INFO 가 count만큼 들어감.
};
struct TS_CS_SELL_TO_BOOTH : TS_MESSAGE
{
TS_CS_SELL_TO_BOOTH() _INIT( TM_CS_SELL_TO_BOOTH )
AR_HANDLE target; // 노점을 연 사용자
AR_HANDLE item_handle; // 판매할 사용자의 아이템 핸들 (노점에 있는 아이템 핸들이 아님!)
int cnt;
};
struct TS_CS_GET_BOOTHS_NAME : TS_MESSAGE
{
TS_CS_GET_BOOTHS_NAME() _INIT( TM_CS_GET_BOOTHS_NAME )
unsigned cnt;
// 이하 cnt만큼의 AR_HANDLE(플레이어 핸들) 이 달려오게 된다.
};
struct TS_SC_GET_BOOTHS_NAME : TS_MESSAGE
{
TS_SC_GET_BOOTHS_NAME() _INIT( TM_SC_GET_BOOTHS_NAME )
struct TS_BOOTH_NAME
{
AR_HANDLE handle;
char name[49];
};
unsigned cnt;
// 이하 cnt만큼의 TS_BOOTH_NAME 이 달려오게 된다.
};
struct TS_SC_BOOTH_CLOSED : TS_MESSAGE
{
TS_SC_BOOTH_CLOSED() _INIT( TM_SC_BOOTH_CLOSED )
AR_HANDLE target; // 노점을 연 사용자
};
struct TS_CS_CHECK_BOOTH_STARTABLE : TS_MESSAGE
{
TS_CS_CHECK_BOOTH_STARTABLE() _INIT( TM_CS_CHECK_BOOTH_STARTABLE )
};
struct TS_CS_TURN_ON_PK_MODE : TS_MESSAGE
{
TS_CS_TURN_ON_PK_MODE() _INIT( TM_CS_TURN_ON_PK_MODE )
};
struct TS_CS_TURN_OFF_PK_MODE : TS_MESSAGE
{
TS_CS_TURN_OFF_PK_MODE() _INIT( TM_CS_TURN_OFF_PK_MODE )
};
struct TS_CS_CHANGE_LOCATION : TS_MESSAGE
{
TS_CS_CHANGE_LOCATION() _INIT( TM_CS_CHANGE_LOCATION )
AR_UNIT x;
AR_UNIT y;
};
struct TS_SC_CHANGE_LOCATION : TS_MESSAGE
{
TS_SC_CHANGE_LOCATION() _INIT( TM_SC_CHANGE_LOCATION )
int prev_location_id;
int cur_location_id;
};
struct TS_CS_GET_WEATHER_INFO : TS_MESSAGE
{
TS_CS_GET_WEATHER_INFO() _INIT( TM_CS_GET_WEATHER_INFO )
unsigned int region_id;
};
struct TS_SC_WEATHER_INFO : TS_MESSAGE
{
TS_SC_WEATHER_INFO() _INIT( TM_SC_WEATHER_INFO )
enum
{
CLEAR = 0, LIGHT_RAINY = 1, RAINY = 2, HEAVY_RAINY = 3, LIGHT_SNOWY = 4, SNOWY = 5, HEAVY_SNOWY = 6
};
unsigned int region_id;
unsigned short weather_id;
};
struct TS_SC_EMOTION : TS_MESSAGE
{
TS_SC_EMOTION() _INIT( TM_SC_EMOTION )
AR_HANDLE handle;
int emotion;
};
struct TS_CS_EMOTION : TS_MESSAGE
{
TS_CS_EMOTION() _INIT( TM_CS_EMOTION )
int emotion;
};
struct TS_CS_GAME_TIME : TS_MESSAGE
{
TS_CS_GAME_TIME() _INIT( TM_CS_GAME_TIME )
};
struct TS_SC_GAME_TIME : TS_MESSAGE
{
TS_SC_GAME_TIME() _INIT( TM_SC_GAME_TIME )
AR_TIME t;
time_t game_time;
};
// 경매 데이터
struct TS_AUCTION_INFO
{
enum AUCTION_DURATION_TYPE
{
DURATION_SHORTTERM = 1, // 마감 시한: 단기
DURATION_MIDTERM = 2, // 마감 시한: 중기
DURATION_LONGTERM = 3 // 마감 시한: 장기
};
int auction_uid; // 경매 번호
TS_ITEM_BASE_INFO item_info; // 아이템 정보
unsigned char duration_type; // 마감 시한 타입(AUCTION_DURATION_TYPE 값이 들어감)
__int64 bidded_price; // 현재 입찰가
__int64 instant_purchase_price; // 즉시 구매가
};
// 경매 물품 검색 요청
struct TS_CS_AUCTION_SEARCH : TS_MESSAGE
{
TS_CS_AUCTION_SEARCH() _INIT( TM_CS_AUCTION_SEARCH )
int category_id; // 검색 카테고리(-1: 전체 혹은 기타인데 sub_category_id에 의해 결정 / 0 이상: 상위 카테고리 번호)
int sub_category_id; // 검색 카테고리(category_id가 -1인 경우: -1은 전체, 0은 기타 / 그외: -1은 상위 카테고리임, 0 이상: 하위 카테고리임)
char keyword[31]; // 검색 키워드(없으면 빈 문자열이면 됨)
int page_num; // 요청 페이지 번호
bool is_equipable; // 착용 가능한 장비 검색 여부
};
// 경매 물품 검색 결과
struct TS_SC_AUCTION_SEARCH : TS_MESSAGE
{
TS_SC_AUCTION_SEARCH() _INIT( TM_SC_AUCTION_SEARCH )
struct SEARCHED_AUCTION_INFO : TS_AUCTION_INFO
{
char seller_name[31];
char flag;
enum SEARCHED_AUCTION_INFO_FLAG
{
FLAG_IS_HIGHEST_BIDDER = 1 << 0, // 자신이 최고 입찰자인지 여부
FLAG_NO_OTHER_BIDDER = 1 << 1 // 자신이 최초 입찰자인지 여부(현재 최고 입찰가로 입찰이 가능 - 5% 높은 가격 룰 제외됨)
};
};
int page_num; // 현재 페이지 번호
int total_page_count; // 전체 페이지 수
int auction_info_count; // 현재 페이지에 해당하는 경매 데이터 수
SEARCHED_AUCTION_INFO auction_info[ GameRule::AUCTION_INFO_COUNT_PER_PAGE_FOR_SEARCHED ]; // 현재 페이지에 해당하는 경매 데이터
};
// 자신이 등록한 경매 물품 목록 요청
struct TS_CS_AUCTION_SELLING_LIST : TS_MESSAGE
{
TS_CS_AUCTION_SELLING_LIST() _INIT( TM_CS_AUCTION_SELLING_LIST )
int page_num; // 요청 페이지 번호
};
// 자신이 등록한 경매 물품 목록 결과
struct TS_SC_AUCTION_SELLING_LIST : TS_MESSAGE
{
TS_SC_AUCTION_SELLING_LIST() _INIT( TM_SC_AUCTION_SELLING_LIST )
struct REGISTERED_AUCTION_INFO : TS_AUCTION_INFO
{
enum REGISTERED_AUCTION_STATUS
{
STATUS_NO_BIDDER = 1, // 상태: 입찰자 없음
STATUS_BID_CALLING = 2 // 상태: 입찰 진행중
};
unsigned char status; // REGISTERED_AUCTION_STATUS 값이 들어감
};
int page_num; // 현재 페이지 번호
int total_page_count; // 전체 페이지 수
int auction_info_count; // 현재 페이지에 해당하는 경매 데이터 수
REGISTERED_AUCTION_INFO auction_info[ GameRule::AUCTION_INFO_COUNT_PER_PAGE_FOR_REGISTERED ]; // 현재 페이지에 해당하는 경매 데이터
};
// 자신이 입찰한 경매 목록 요청
struct TS_CS_AUCTION_BIDDED_LIST : TS_MESSAGE
{
TS_CS_AUCTION_BIDDED_LIST() _INIT( TM_CS_AUCTION_BIDDED_LIST )
int page_num; // 요청 페이지 번호
};
// 자신이 입찰한 경매 목록 결과
struct TS_SC_AUCTION_BIDDED_LIST : TS_MESSAGE
{
TS_SC_AUCTION_BIDDED_LIST() _INIT( TM_SC_AUCTION_BIDDED_LIST )
struct BIDDED_AUCTION_LIST : TS_AUCTION_INFO
{
enum BIDDED_AUCTION_STATUS
{
STATUS_MINE = 1, // 입찰 현황: 본인 입찰
STATUS_OTHERS = 2 // 입찰 현황: 타인 입찰
};
unsigned char status; // BIDDED_AUCTION_STATUS 값이 들어감
};
int page_num; // 현재 페이지 번호
int total_page_count; // 전체 페이지 수
int auction_info_count; // 현재 페이지에 해당하는 경매 데이터 수
BIDDED_AUCTION_LIST auction_info[ GameRule::AUCTION_INFO_COUNT_PER_PAGE_FOR_BIDDED ]; // 현재 페이지에 해당하는 경매 데이터
};
// 경매 입찰 요청
struct TS_CS_AUCTION_BID : TS_MESSAGE
{
TS_CS_AUCTION_BID() _INIT( TM_CS_AUCTION_BID )
int auction_uid; // 입찰 대상 경매 번호
__int64 bidding_price; // 입찰 요청 가격
};
// 경매 물품 즉시구매 요청(결과는 TS_SC_RESULT로 보내고 페이지 갱신은 클라에서 요청 따로 보냄)
struct TS_CS_AUCTION_INSTANT_PURCHASE : TS_MESSAGE
{
TS_CS_AUCTION_INSTANT_PURCHASE() _INIT( TM_CS_AUCTION_INSTANT_PURCHASE )
int auction_uid; // 즉시 구매 대상 경매 번호
};
// 경매 물품 등록 요청(결과는 TS_SC_RESULT로 보내고 페이지 갱신은 클라에서 요청 따로 보냄)
struct TS_CS_AUCTION_REGISTER : TS_MESSAGE
{
TS_CS_AUCTION_REGISTER() _INIT( TM_CS_AUCTION_REGISTER )
enum AUCTION_DURATION_TYPE
{
DURATION_SHORTTERM = 1, // 경매 기간: 단기
DURATION_MIDTERM = 2, // 경매 기간: 중기
DURATION_LONGTERM = 3 // 경매 기간: 장기
};
AR_HANDLE item_handle; // 경매 등록할 아이템 핸들
int item_count; // 경매 등록할 아이템 수량
__int64 start_price; // 경매 시작가
__int64 instant_purchase_price; // 경매 물품 즉구가
unsigned char duration_type; // Auction duration type (stores a value from AUCTION_DURATION_TYPE)
};
// 자신이 등록한 경매 취소 요청(결과는 TS_SC_RESULT로 보내고 페이지 갱신은 클라에서 요청 따로 보냄)
struct TS_CS_AUCTION_CANCEL : TS_MESSAGE
{
TS_CS_AUCTION_CANCEL() _INIT( TM_CS_AUCTION_CANCEL )
int auction_uid; // 취소할 경매 번호
};
// 자신 소유 보관 아이템 목록 요청
struct TS_CS_ITEM_KEEPING_LIST : TS_MESSAGE
{
TS_CS_ITEM_KEEPING_LIST() _INIT( TM_CS_ITEM_KEEPING_LIST )
int page_num; // 요청 페이지 번호
};
// 자신 소유 보관 아이템 목록 결과
struct TS_SC_ITEM_KEEPING_LIST : TS_MESSAGE
{
TS_SC_ITEM_KEEPING_LIST() _INIT( TM_SC_ITEM_KEEPING_LIST )
// 아이템 보관 데이터
struct TS_ITEM_KEEPING_INFO
{
int keeping_uid; // 아이템 보관 번호
TS_ITEM_BASE_INFO item_info; // 아이템 정보
int duration; // 보관 기간
unsigned char keeping_type; // 보관 타입(AuctionBase.h의 enum KEEPING_TYPE 참조)
ItemBase::ItemCode related_item_code; // 관련 아이템 코드(보관 아이템이 돈일 경우만 사용됨)
int related_item_enhance; // 관련 아이템 강화 레벨(보관 아이템이 돈일 경우만 사용됨)
int related_item_level; // 관련 아이템 대장작 레벨(보관 아이템이 돈일 경우만 사용됨)
};
int page_num; // 현재 페이지 번호
int total_page_count; // 전체 페이지 수
int keeping_info_count; // 현재 페이지에 해당하는 아이템 보관 데이터 수
TS_ITEM_KEEPING_INFO keeping_info[ GameRule::AUCTION_INFO_COUNT_PER_PAGE_FOR_ITEM_KEEPING ]; // 현재 페이지에 해당하는 아이템 보관 데이터
};
// 자신 소유 보관 아이템 회수 요청(결과는 TS_SC_RESULT로 보내고 페이지 갱신은 클라에서 요청 따로 보냄)
struct TS_CS_ITEM_KEEPING_TAKE : TS_MESSAGE
{
TS_CS_ITEM_KEEPING_TAKE() _INIT( TM_CS_ITEM_KEEPING_TAKE )
int keeping_uid; // 요청 아이템 보관 번호
};
// 헌터홀릭 인스턴스 던전 목록 송신 요청
struct TS_CS_HUNTAHOLIC_INSTANCE_LIST : TS_MESSAGE
{
TS_CS_HUNTAHOLIC_INSTANCE_LIST() _INIT( TM_CS_HUNTAHOLIC_INSTANCE_LIST )
int page; // 목록 페이지 번호
};
// 헌터홀릭 인스턴스 던전 정보 보관용(메시지/데이터 공용)
struct TS_HUNTAHOLIC_INSTANCE_INFO
{
int instance_no; // 방 번호
char name[ GameRule::HUNTAHOLIC_MAX_INSTANCE_NAME_LENGTH + 1 ]; // 방 이름
unsigned char current_member_count; // 현재 참가 인원
unsigned char max_member_count; // 최대 참가 인원
bool require_password; // 비번방 여부(true: 비번방, false: 공개방)
};
// 헌터홀릭 인스턴스 던전 목록
struct TS_SC_HUNTAHOLIC_INSTANCE_LIST : TS_MESSAGE
{
TS_SC_HUNTAHOLIC_INSTANCE_LIST() _INIT( TM_SC_HUNTAHOLIC_INSTANCE_LIST )
int huntaholic_id; // 헌터홀릭 ID
int page; // 현재 페이지 번호
int count; // 현재 페이지에 해당하는 인스턴스 던전 개수
int total_page; // 전체 인스턴스 목록의 페이지 수
// 이 뒤로 TS_HUNTAHOLIC_INSTANCE_INFO 가 count 개 만큼 이어 붙음
};
// 헌터홀릭 인스턴스 던전 정보(현재 소속된 던전만)
struct TS_SC_HUNTAHOLIC_INSTANCE_INFO : TS_MESSAGE
{
TS_SC_HUNTAHOLIC_INSTANCE_INFO() _INIT( TM_SC_HUNTAHOLIC_INSTANCE_INFO )
TS_HUNTAHOLIC_INSTANCE_INFO info;
};
// 헌터홀릭 인스턴스 던전 생성 요청
struct TS_CS_HUNTAHOLIC_CREATE_INSTANCE : TS_MESSAGE
{
TS_CS_HUNTAHOLIC_CREATE_INSTANCE() _INIT( TM_CS_HUNTAHOLIC_CREATE_INSTANCE )
char name[ GameRule::HUNTAHOLIC_MAX_INSTANCE_NAME_LENGTH + 1 ];
unsigned char max_member_count;
char password[ GameRule::HUNTAHOLIC_MAX_INSTANCE_PASSWORD_LENGTH + 1 ];
};
// 헌터홀릭 인스턴스 던전 참가 요청
struct TS_CS_HUNTAHOLIC_JOIN_INSTANCE : TS_MESSAGE
{
TS_CS_HUNTAHOLIC_JOIN_INSTANCE() _INIT( TM_CS_HUNTAHOLIC_JOIN_INSTANCE )
int instance_no;
char password[ GameRule::HUNTAHOLIC_MAX_INSTANCE_PASSWORD_LENGTH + 1 ];
};
// 헌터홀릭 인스턴스 던전 탈퇴 요청
struct TS_CS_HUNTAHOLIC_LEAVE_INSTANCE : TS_MESSAGE
{
TS_CS_HUNTAHOLIC_LEAVE_INSTANCE() _INIT( TM_CS_HUNTAHOLIC_LEAVE_INSTANCE )
};
// 헌터홀릭 인스턴스 던전 사냥 결과
struct TS_SC_HUNTAHOLIC_HUNTING_SCORE : TS_MESSAGE
{
TS_SC_HUNTAHOLIC_HUNTING_SCORE() _INIT( TM_SC_HUNTAHOLIC_HUNTING_SCORE )
int huntaholic_id; // 헌터홀릭 ID
int personal_kill_count; // 개인 킬 수
int personal_score; // 개인 점수
int kill_count; // 킬 수(해당 인스턴스 던전 내의 합산)
int score; // 점수(해당 인스턴스 던전 내의 합산)
double point_advantage; // 방 레벨대에 따른 점수 증폭치
double point_rate; // 올림방 여부에 따른 증폭치(사용되지 않음. 무조건 1.0)
int gain_point; // 최종 계산된 획득 포인트
char result_type; // 사냥 결과(0: 성공, 1: 사망, 2: 리타이어)
};
// 헌터홀릭 인스턴스 던전 사냥 중 점수 갱신
struct TS_SC_HUNTAHOLIC_UPDATE_SCORE : TS_MESSAGE
{
TS_SC_HUNTAHOLIC_UPDATE_SCORE() _INIT( TM_SC_HUNTAHOLIC_UPDATE_SCORE )
int kill_count; // 킬 수
int score; // 킬 수에 따른 점수
};
// 헌터홀릭 로비에서 로비 입장 지점으로 귀환
struct TS_CS_HUNTAHOLIC_LEAVE_LOBBY : TS_MESSAGE
{
TS_CS_HUNTAHOLIC_LEAVE_LOBBY() _INIT( TM_CS_HUNTAHOLIC_LEAVE_LOBBY )
};
// 헌터홀릭 로비에서 던전으로 입장, 사냥 시작을 클라이언트에 알림
struct TS_SC_HUNTAHOLIC_BEGIN_HUNTING : TS_MESSAGE
{
TS_SC_HUNTAHOLIC_BEGIN_HUNTING() _INIT( TM_SC_HUNTAHOLIC_BEGIN_HUNTING )
AR_TIME begin_time;
};
// 헌터홀릭 던전에서 최대 획득 가능 점수에 도달
struct TS_SC_HUNTAHOLIC_MAX_POINT_ACHIEVED : TS_MESSAGE
{
TS_SC_HUNTAHOLIC_MAX_POINT_ACHIEVED() _INIT( TM_SC_HUNTAHOLIC_MAX_POINT_ACHIEVED )
};
// 헌터홀릭 로비에서 던전으로 입장 요청(방에 참여 중인 유저들이 사냥 던전으로 진입)
struct TS_CS_HUNTAHOLIC_BEGIN_HUNTING : TS_MESSAGE
{
TS_CS_HUNTAHOLIC_BEGIN_HUNTING() _INIT( TM_CS_HUNTAHOLIC_BEGIN_HUNTING )
};
// 헌터홀릭 로비에서 던전으로 입장을 위한 카운트 다운 시작(이후 10초간 카운트하고 TS_SC_HUNTAHOLIC_BEGIN_HUNTING 메시지 날아감)
struct TS_SC_HUNTAHOLIC_BEGIN_COUNTDOWN : TS_MESSAGE
{
TS_SC_HUNTAHOLIC_BEGIN_COUNTDOWN() _INIT( TM_SC_HUNTAHOLIC_BEGIN_COUNTDOWN )
};
// 인스턴스 게임으로 워프
struct TS_CS_INSTANCE_GAME_ENTER : TS_MESSAGE
{
enum MAP_TYPE
{
HUNTAHOLIC_BEAR_ROAD = 0,
RANKED_DEATHMATCH = 1,
FREED_DEATHMATCH = 2,
};
TS_CS_INSTANCE_GAME_ENTER() _INIT( TM_CS_INSTANCE_GAME_ENTER )
int instance_game_type;
};
// 인스턴스 게임에서 원래 맵으로 복귀
struct TS_CS_INSTANCE_GAME_EXIT : TS_MESSAGE
{
TS_CS_INSTANCE_GAME_EXIT() _INIT( TM_CS_INSTANCE_GAME_EXIT )
};
// 인스턴스 게임의 스코어 요청
struct TS_CS_INSTANCE_GAME_SCORE_REQUEST : TS_MESSAGE
{
TS_CS_INSTANCE_GAME_SCORE_REQUEST() _INIT( TM_CS_INSTANCE_GAME_SCORE_REQUEST )
};
// 인스턴스 게임의 스코어 전달
struct TS_SC_INSTANCE_GAME_SCORE_REQUEST : TS_MESSAGE
{
TS_SC_INSTANCE_GAME_SCORE_REQUEST() _INIT( TM_SC_INSTANCE_GAME_SCORE_REQUEST )
// 베어로드
unsigned int holicpoint;
unsigned int bearroad_ranking;
// 데스매치
unsigned int deathmatch_kill_count;
unsigned int deathmatch_death_count;
// 배틀 아레나
int battle_arena_point;
int battle_arena_mvp_count;
int battle_arena_record[ 3 /* _BATTLE_ARENA_TYPE */ ][ 2 /* win, lose */ ];
};
// 플레이어가 타 플레이어에게 대련 요청
struct TS_CS_COMPETE_REQUEST : TS_MESSAGE
{
TS_CS_COMPETE_REQUEST() _INIT( TM_CS_COMPETE_REQUEST )
unsigned char compete_type; // _COMPETE_TYPE 값이 사용됨
char requestee[ 31 ]; // 도전 받은 플레이어 이름(개인/파티전은 플레이어/파티장 이름, 길드/연합전은 길드/연합의 이름이 사용됨)
};
// 대련 요청받은 플레이어에게 요청 전달
struct TS_SC_COMPETE_REQUEST : TS_MESSAGE
{
TS_SC_COMPETE_REQUEST() _INIT( TM_SC_COMPETE_REQUEST )
unsigned char compete_type; // _COMPETE_TYPE 값이 사용됨
char requester[ 31 ]; // 도전자 이름(개인/파티전은 플레이어/파티장 이름, 길드/연합전은 길드/연합의 이름이 사용됨)
};
// 대련 요청받은 플레이어가 응답
struct TS_CS_COMPETE_ANSWER : TS_MESSAGE
{
TS_CS_COMPETE_ANSWER() _INIT( TM_CS_COMPETE_ANSWER )
unsigned char compete_type; // _COMPETE_TYPE 값이 사용됨
unsigned char answer_type; // _COMPETE_ANSWER_TYPE 값이 사용됨
};
// 최초 대련 요청에 대한 결과 전달(수락/거부/자동거부)
struct TS_SC_COMPETE_ANSWER : TS_MESSAGE
{
TS_SC_COMPETE_ANSWER() _INIT( TM_SC_COMPETE_ANSWER )
unsigned char compete_type; // _COMPETE_TYPE 값이 사용됨
unsigned char answer_type; // _COMPETE_ANSWER_TYPE 값이 사용됨
char requestee[ 31 ]; // 도전 받은 플레이어 이름(개인/파티전은 플레이어/파티장 이름, 길드/연합전은 길드/연합의 이름이 사용됨)
};
// 대련 시작 전 카운트 다운 개시
struct TS_SC_COMPETE_COUNTDOWN : TS_MESSAGE
{
TS_SC_COMPETE_COUNTDOWN() _INIT( TM_SC_COMPETE_COUNTDOWN )
unsigned char compete_type; // _COMPETE_TYPE 값이 사용됨
char competitor[ 31 ]; // 상대방 플레이어 이름(개인/파티전은 플레이어/파티장 이름, 길드/연합전은 길드/연합의 이름이 사용됨)
AR_HANDLE handle_competitor; // 상대방 플레이어 핸들(1:1 PVP에서만 사용됨)
};
// 대련 시작
struct TS_SC_COMPETE_START : TS_MESSAGE
{
TS_SC_COMPETE_START() _INIT( TM_SC_COMPETE_START )
unsigned char compete_type; // _COMPETE_TYPE 값이 사용됨
char competitor[ 31 ]; // 상대방 플레이어 이름(개인/파티전은 플레이어/파티장 이름, 길드/연합전은 길드/연합의 이름이 사용됨)
};
// 대련 종료(결과 방송)
struct TS_SC_COMPETE_END : TS_MESSAGE
{
TS_SC_COMPETE_END() _INIT( TM_SC_COMPETE_END )
unsigned char compete_type; // _COMPETE_TYPE 값이 사용됨
unsigned char end_type; // _COMPETE_END_TYPE 값이 사용됨
char winner[ 31 ]; // 승자 이름(개인/파티전은 플레이어/파티장 이름, 길드/연합전은 길드/연합의 이름이 사용됨)
char loser[ 31 ]; // 패자 이름(개인/파티전은 플레이어/파티장 이름, 길드/연합전은 길드/연합의 이름이 사용됨)
};
struct TS_SC_BATTLE_ARENA_PENALTY_INFO : TS_MESSAGE
{
TS_SC_BATTLE_ARENA_PENALTY_INFO() _INIT( TM_SC_BATTLE_ARENA_PENALTY_INFO )
AR_TIME nBlockTime;
int nPenaltyCount;
AR_TIME nPenaltyCountDecTime;
};
struct TS_CS_BATTLE_ARENA_JOIN_QUEUE : TS_MESSAGE
{
TS_CS_BATTLE_ARENA_JOIN_QUEUE() _INIT( TM_CS_BATTLE_ARENA_JOIN_QUEUE )
int nArenaID;
};
struct TS_SC_BATTLE_ARENA_JOIN_QUEUE : TS_MESSAGE
{
TS_SC_BATTLE_ARENA_JOIN_QUEUE() _INIT( TM_SC_BATTLE_ARENA_JOIN_QUEUE )
int nArenaID;
/*
// 아레나 유저 등급 구분
enum _BATTLE_GRADE
{
BG_INVALID = -1,
BG_ROOKIE = 0,
BG_GROW = 1,
BG_MAJOR = 2,
MAX_BATTLE_GRADE,
};
*/
_BATTLE_GRADE eGrade;
};
struct TS_SC_BATTLE_ARENA_UPDATE_WAIT_USER_COUNT : TS_MESSAGE
{
TS_SC_BATTLE_ARENA_UPDATE_WAIT_USER_COUNT() _INIT( TM_SC_BATTLE_ARENA_UPDATE_WAIT_USER_COUNT )
int nWaitUserCount;
};
struct TS_CS_BATTLE_ARENA_LEAVE : TS_MESSAGE
{
TS_CS_BATTLE_ARENA_LEAVE() _INIT( TM_CS_BATTLE_ARENA_LEAVE )
};
struct TS_SC_BATTLE_ARENA_LEAVE : TS_MESSAGE
{
TS_SC_BATTLE_ARENA_LEAVE() _INIT( TM_SC_BATTLE_ARENA_LEAVE )
/*
// 아레나 이탈 유형 코드
enum _ARENA_LEAVE_TYPE
{
ALT_UNKNOWN = 0,
ALT_USER_REQUEST = 1, // 대기열/경기 이탈 두 경우 모두 사용됨
ALT_GAME_OVER = 2, // 경기 이탈 시에만 사용됨
ALT_PARTICIPATING_SPECIAL_PARTY = 3, // 대기열 이탈 시에만 사용됨
ALT_FAILED_TO_JOIN_BATTLE = 4, // 대기열 이탈 시에만 사용됨
ALT_FAILED_TO_START_BATTLE = 5, // 대기열 이탈 시에만 사용됨(경기 시작 실패)
ALT_DISCONNECT = 6, // 대기열 이탈 시에만 사용됨(대기열에 있다가 접속 끊긴 경우)
ALT_ABSENT = 7, // 경기 중에 잠수 신고를 통해 경기에서 이탈된 경우
ALT_LEAVE_ARENA = 8, // 아레나에서 워프를 통해 다른 지역으로 이탈함으로 인해 경기에서 이탈된 경우(워프 자체가 근본적으로 차단되어야 함)
ALT_ENTER_INSTANCE_DUNGEON = 9, // 인스턴스 던전에 입장하기 위해 대기열에서 이탈되는 경우
ALT_ENTER_DEATHMATCH = 10, // 데스매치 존에 입장하기 위해 대기열에서 이탈되는 경우
ALT_ENTER_HUNTAHOLIC = 11, // 헌터홀릭 로비(?)에 입장하기 위해 대기열에서 이탈되는 경우
ALT_EXERCISE_PARTY_KICK = 12, // 연습 경기 파티 구성 중 추방에 의해 이탈되는 경우
};
*/
_ARENA_LEAVE_TYPE eLeaveType;
char szName[ 19 ];
};
struct TS_SC_BATTLE_ARENA_BATTLE_INFO : TS_MESSAGE
{
TS_SC_BATTLE_ARENA_BATTLE_INFO() _INIT( TM_SC_BATTLE_ARENA_BATTLE_INFO )
int nArenaID;
// 패킷 수신자 개인 종속적인 내용
AR_TIME nForceEnterTime;
// 경기 종속적인 내용(점수는 별도의 패킷이 있으므로 제외)
AR_TIME nStartTime;
_BATTLE_GRADE eGrade;
AR_TIME nEndTime;
unsigned char nPlayerCountPerTeam[ 2 ];
struct PlayerInfo
{
AR_HANDLE handle; // handle == 0 이면 오프라인 유저
int nJobID;
char szName[ 19 ]; // 기존에 AR_HANDLE과 묶인 이름 정보가 있더라도 가명에 의해 다른 이름이 지정될 수 있음
};
// 이 뒤로 PlayerInfo가 nPlayerCountPerTeam[ 0 ] + nPlayerCountPerTeam[ 1 ]개 만큼 붙음
};
struct TS_CS_BATTLE_ARENA_ENTER_WHILE_COUNTDOWN : TS_MESSAGE
{
TS_CS_BATTLE_ARENA_ENTER_WHILE_COUNTDOWN() _INIT( TM_CS_BATTLE_ARENA_ENTER_WHILE_COUNTDOWN )
};
struct TS_CS_BATTLE_ARENA_EXERCISE_READY : TS_MESSAGE
{
TS_CS_BATTLE_ARENA_EXERCISE_READY() _INIT( TM_CS_BATTLE_ARENA_EXERCISE_READY )
bool bReady;
};
struct TS_SC_BATTLE_ARENA_EXERCISE_READY_STATUS : TS_MESSAGE
{
TS_SC_BATTLE_ARENA_EXERCISE_READY_STATUS() _INIT( TM_SC_BATTLE_ARENA_EXERCISE_READY_STATUS )
int nReadyState;
};
struct TS_CS_BATTLE_ARENA_EXERCISE_START : TS_MESSAGE
{
TS_CS_BATTLE_ARENA_EXERCISE_START() _INIT( TM_CS_BATTLE_ARENA_EXERCISE_START )
};
struct TS_SC_BATTLE_ARENA_BATTLE_STATUS : TS_MESSAGE
{
TS_SC_BATTLE_ARENA_BATTLE_STATUS() _INIT( TM_SC_BATTLE_ARENA_BATTLE_STATUS )
int nStatus;
/*
enum _PROP_STATE
{
PS_NOT_EXIST = 0,
PS_NEUTRAL = 1,
PS_OWNED_BY_TEAM_0 = 2,
PS_OWNED_BY_TEAM_1 = 3,
};
*/
_PROP_STATE GetPropState( int nPropIndex ) const { assert( nPropIndex >= 0 && nPropIndex < 9 ); return static_cast< _PROP_STATE >( ( nStatus >> ( nPropIndex * 2 ) ) & 0x3 ); }
bool IsActivatedBingoLine( int nLineIndex ) { assert( nLineIndex >= 0 && nLineIndex < 8 ); return ( ( nStatus >> 24 ) & ( 1 << nLineIndex ) ) != 0; }
// 경기 타입에 따라 nStatus의 의미가 달라짐
// 클래식 - 이 패킷 자체를 사용하지 않음
// 슬래터 - 슬래터 프랍 소속 상태(GetPropState( 0 )으로 얻을 수 있음)
// 빙고 - 3x3 프랍의 소속 정보 및 빙고 달성 정보
// 1. 뒤에서부터 2 비트( ( nStatus >> ( nPropIndex * 2 ) ) & 0x3 )씩 잘라서 각 프랍의 소속 상태로 사용(0: 프랍 없음, 1: 중립, 2: 연합군, 3: 마녀군)
// 총 9개의 프랍이 있으므로 32비트 중 18비트가 사용됨
// * GetPropState을 사용해 각 프랍별 상태를 확인할 수 있음
// 2. 최상위의 8비트( int nActivatedLineFlag = (nStatus >> 24) & 0xFF )를 이번 nStatus 변경으로 인해 달성된 빙고 라인이 어느 것인지 표현
// 0---1---2
// | | |
// 3---4---5
// | | |
// 6---7---8
// 위와 같이 각 빙고 프랍에 대해 0 ~ 8 까지 Index가 지정되어 있을 때
// 0 - 1 - 2 (가로줄 1)이 달성되었으면 최하위 0번째 비트가 On ( nActivatedLineFlag & ( 1 << 0 ) ) != 0
// 3 - 4 - 5 (가로줄 2)가 달성되었으면 최하위 1번째 비트가 On ( nActivatedLineFlag & ( 1 << 1 ) ) != 0
// 6 - 7 - 8 (가로줄 3)이 달성되었으면 최하위 2번째 비트가 On ( nActivatedLineFlag & ( 1 << 2 ) ) != 0
// 0 - 3 - 6 (세로줄 1)이 달성되었으면 최하위 3번째 비트가 On ( nActivatedLineFlag & ( 1 << 3 ) ) != 0
// 1 - 4 - 7 (세로줄 2)가 달성되었으면 최하위 4번째 비트가 On ( nActivatedLineFlag & ( 1 << 4 ) ) != 0
// 2 - 5 - 8 (세로줄 3)이 달성되었으면 최하위 5번째 비트가 On ( nActivatedLineFlag & ( 1 << 5 ) ) != 0
// 0 - 4 - 8 (대각선 1)이 달성되었으면 최하위 6번째 비트가 On ( nActivatedLineFlag & ( 1 << 6 ) ) != 0
// 2 - 4 - 6 (대각선 2)가 달성되었으면 최하위 7번째 비트가 On ( nActivatedLineFlag & ( 1 << 7 ) ) != 0
// * 빙고에 참여된 프랍은 사라져야 하기 때문에 ( ( nStatus >> nPropIdx * 2 ) & 0x3 ) 값이 0이 아니었다가 0이 됨(빙고라는 걸 방송하는 시점에는 0이 된 상태로 방송됨)
// * >> (Bit right shift) 연산을 nStatus 에 할 때, signed 변수이기 때문에 만일 최상위 비트가 On 되어있었을 경우(int 값으로는 음수)에는
// 왼쪽에서부터 1이 채워져 들어오게 되므로 Shift 연산 후의 결과가 음수가 됨. 따라서 Shift 연산 후에는 반드시 & (Bitwise AND) 연산자를 통해 얻고자 하는 값만 잘라내야 함
// * IsActivatedBingoLine 함수로 특정 라인이 빙고 상태가 됐는지 확인 가능
};
struct TS_SC_BATTLE_ARENA_BATTLE_SCORE : TS_MESSAGE
{
TS_SC_BATTLE_ARENA_BATTLE_SCORE() _INIT( TM_SC_BATTLE_ARENA_BATTLE_SCORE )
struct TeamScore
{
short nTotalKillCount; // 각 팀별 킬 수 총합
short nTotalDeathCount; // 각 팀별 데스 수 총합
short nScore; // 각 팀별 현재 점수
};
struct PlayerScore
{
char szName[ 19 ];
short nKillCount;
short nDeathCount;
short nPropActivateCount;
int nTotalGainAP;
};
TeamScore aTeamScore[ 2 /* GameRule::BATTLE_ARENA_MAX_TEAM_COUNT */ ];
unsigned char nPlayerScoreCount;
// 이 뒤로 PlayerScore가 nPlayerScoreCount개 만큼 붙음
};
struct TS_SC_BATTLE_ARENA_JOIN_BATTLE : TS_MESSAGE
{
TS_SC_BATTLE_ARENA_JOIN_BATTLE() _INIT( TM_SC_BATTLE_ARENA_JOIN_BATTLE )
int nTeamNo;
AR_HANDLE handle;
int nJobID;
char szName[ 19 ];
};
struct TS_SC_BATTLE_ARENA_DISCONNECT_BATTLE : TS_MESSAGE
{
TS_SC_BATTLE_ARENA_DISCONNECT_BATTLE() _INIT( TM_SC_BATTLE_ARENA_DISCONNECT_BATTLE )
AR_HANDLE handle;
};
struct TS_SC_BATTLE_ARENA_RECONNECT_BATTLE : TS_MESSAGE
{
TS_SC_BATTLE_ARENA_RECONNECT_BATTLE() _INIT( TM_SC_BATTLE_ARENA_RECONNECT_BATTLE )
// 유저가 로그아웃되었다가 다시 접속될 경우 서버에서 AR_HANDLE값이 재부여되기 때문에
// 클라이언트에서는 기존의 AR_HANDLE 값을 사용하면 안되고 이 패킷으로 받은 값으로 갱신해서 사용해야 함
// 이 경우 어떤 유저가 재접속했는지는 szName을 기준으로 처리해야 함
char szName[ 19 ];
AR_HANDLE newHandle;
};
struct TS_SC_BATTLE_ARENA_RESULT : TS_MESSAGE
{
TS_SC_BATTLE_ARENA_RESULT() _INIT( TM_SC_BATTLE_ARENA_RESULT )
/*
// 아레나 경기 종료 타입
enum _ARENA_END_TYPE
{
AET_UNKNOWN = 0,
AET_ONE_TEAM_NO_MEMBER = 1, // 한 팀의 멤버가 모두 이탈하여 경기 종료(종료 유형이지만 보상이 없다는 내용도 포함)
AET_MAX_SCORE_REACHED = 2, // 목표 점수 도달로 경기 종료
AET_TIME_OVER = 3, // 시간 초과로 경기 종료
};
// 아레나 경기 보상 타입
enum _ARENA_REWARD_TYPE
{
ART_UNKNOWN = 0,
ART_FULL_REWARD = 1, // 값 없음(지정 안하면 이거)
ART_HALF_REWARD_BY_FEW_MEMBER = 2, // 한 팀의 멤버 수가 팀 최대 인원의 50% 미만이어서 보상이 절반으로 감소
ART_NO_REWARD_BY_NO_MEMBER = 3, // 한 팀의 멤버가 모두 이탈해서 경기가 중단되어 보상 없음
ART_NO_REWARD_BY_MIN_TIME = 4, // 최소 경기 시간 미달로 인해 보상 없음
ART_NO_REWARD_BY_EXERCISE = 5, // 연습 경기는 보상 없음
};
*/
_ARENA_END_TYPE eEndType;
_ARENA_REWARD_TYPE eRewardType;
int nWinnerTeamNo; // 0: 연합군, 1:마녀군
unsigned char nMVPCount;
// 이 뒤로 char[ 19 ] 가 nMVPCount 만큼 붙음
};
struct TS_CS_BATTLE_ARENA_ABSENCE_CHECK_REQUEST : TS_MESSAGE
{
TS_CS_BATTLE_ARENA_ABSENCE_CHECK_REQUEST() _INIT( TM_CS_BATTLE_ARENA_ABSENCE_CHECK_REQUEST )
AR_HANDLE hCheckTarget;
};
struct TS_SC_BATTLE_ARENA_ABSENCE_CHECK : TS_MESSAGE
{
TS_SC_BATTLE_ARENA_ABSENCE_CHECK() _INIT( TM_SC_BATTLE_ARENA_ABSENCE_CHECK )
AR_TIME nLimitTime;
};
struct TS_CS_BATTLE_ARENA_ABSENCE_CHECK_ANSWER : TS_MESSAGE
{
TS_CS_BATTLE_ARENA_ABSENCE_CHECK_ANSWER() _INIT( TM_CS_BATTLE_ARENA_ABSENCE_CHECK_ANSWER )
bool bSuccess;
};
// 랭킹 타입별 상위 랭킹 차트와 자신의 랭크 요청
struct TS_CS_RANKING_TOP_RECORD : TS_MESSAGE
{
TS_CS_RANKING_TOP_RECORD() _INIT( TM_CS_RANKING_TOP_RECORD )
unsigned char ranking_type; // _RANKING_TYPE 값이 사용됨
};
// 랭킹 타입별 상위 랭킹 차트와 요청자의 랭크
struct TS_SC_RANKING_TOP_RECORD : TS_MESSAGE
{
TS_SC_RANKING_TOP_RECORD() _INIT( TM_SC_RANKING_TOP_RECORD )
unsigned char ranking_type; // _RANKING_TYPE 값이 사용됨
unsigned short requester_rank; // 요청자 랭크(0이면 랭킹 미등록)
__int64 requester_score; // 요청자 점수
struct RANKING_RECORD
{
unsigned short rank;
char ranker_name[ 31 ];
__int64 score;
};
unsigned short record_count;
// 이 뒤로 RANKING_RECORD 가 record_count 개 만큼 이어 붙음
};
// 이하 크리처 농장 관련 패킷
// 크리처 농장 정보 요청
struct TS_CS_REQUEST_FARM_INFO : TS_MESSAGE
{
TS_CS_REQUEST_FARM_INFO() _INIT( TM_CS_REQUEST_FARM_INFO )
};
// 크리처 농장 정보 반환
struct TS_SC_FARM_INFO : TS_MESSAGE
{
TS_SC_FARM_INFO() _INIT( TM_SC_FARM_INFO )
char creature_count;
struct SUMMON_INFO {
int index; // 농장 슬롯
__int64 exp;
char name[19];
int duration; // 맡기는 기간
int elasped_time; // 경과 시간
int refresh_time; // 돌보기할 수 있는 시점까지 남은 시간
char using_cash;
char using_cracker;
TS_ITEM_BASE_INFO card_info; // 크리처 카드의 아이템 정보
};
// 이후 creature_count만큼 SUMMON_INFO 구조체가 따라옴.
};
// 크리처 맡기기 요청
struct TS_CS_FOSTER_CREATURE : TS_MESSAGE
{
TS_CS_FOSTER_CREATURE() _INIT( TM_CS_FOSTER_CREATURE )
AR_HANDLE creature_card_handle;
int ticket_info_count;
int cracker_info_count;
struct TICKET_INFO {
AR_HANDLE ticket_handle;
int ticket_count;
};
struct CRACKER_INFO {
AR_HANDLE cracker_handle;
int cracker_count;
};
// 이후 TICKET_INFO, CRACKER_INFO 순서로 관련 정보들이 ticket_info_count, cracker_info_count만큼 따라옴
};
// 크리처 맡기기 결과
struct TS_SC_RESULT_FOSTER : TS_MESSAGE
{
TS_SC_RESULT_FOSTER() _INIT( TM_SC_RESULT_FOSTER )
char result;
};
// 크리처 꺼내기 요청
struct TS_CS_RETRIEVE_CREATURE : TS_MESSAGE
{
TS_CS_RETRIEVE_CREATURE() _INIT( TM_CS_RETRIEVE_CREATURE )
AR_HANDLE creature_card_handle;
};
// 크리처 꺼내기 결과
struct TS_SC_RESULT_RETRIEVE : TS_MESSAGE
{
TS_SC_RESULT_RETRIEVE() _INIT( TM_SC_RESULT_RETRIEVE )
char result;
};
// 크리처 돌보기 요청
struct TS_CS_NURSE_CREATURE : TS_MESSAGE
{
TS_CS_NURSE_CREATURE() _INIT( TM_CS_NURSE_CREATURE )
AR_HANDLE creature_card_handle;
};
// 크리처 돌보기 결과
struct TS_SC_RESULT_NURSE : TS_MESSAGE
{
TS_SC_RESULT_NURSE() _INIT( TM_SC_RESULT_NURSE )
char result;
enum Result
{
FAILED = 0, // 무언가 잘못된 정보를 보냈으므로 요청을 무시.
NO_REWARD = 1, // 돌보기를 하였으나 크리처가 보상을 주지는 않음
REWARDED = 2, // 돌보기 결과 크리처가 보상을 줌
};
};
struct TS_CS_REQUEST_FARM_MARKET : TS_MESSAGE
{
TS_CS_REQUEST_FARM_MARKET() _INIT( TM_CS_REQUEST_FARM_MARKET )
};
// 크리처 농장 패킷 끝
///////////////////////////////////////////////////////////////////
// 파티매치 메시지
#define PARTYMATCH_MEMBER_MAX 10
#define PARTYMATCH_ROOM_MAX 100
#define PARTYMATCH_ROOM_PAGE 10
#define PARTYMATCH_ROOM_TITLE 32
struct STRUCT_PARTYMATCH_ROOM
{
int nRoom; // Room 이 0이면 방이 없는것
int nParty;
short nArea;
short nLevel;
short nMember;
short nMaxMember;
char szText[PARTYMATCH_ROOM_TITLE];
};
struct STRUCT_PARTYMATCH_MEMBER
{
int nMode; // 맴버 표시정보. 현재로서는 0x80000000 | (nLevel<<16) | nJobID;
//short nLevel;
//short nJobID;
AR_HANDLE nMember;
char szName[20];
};
struct TS_CS_PARTYMATCH_ACTION : TS_MESSAGE
{
TS_CS_PARTYMATCH_ACTION() _INIT( TM_CS_PARTYMATCH_ACTION )
int nAction; // 0:목록요청 1:맴버요청 2:방만들기 3:방없애기 4:Apply
int nPage; // 목록요청에만 사용.
AR_HANDLE nMaster; // Apply 에만 사용.
STRUCT_PARTYMATCH_ROOM stRoom;
};
struct TS_SC_PARTYMATCH_LIST : TS_MESSAGE
{
TS_SC_PARTYMATCH_LIST() _INIT( TM_SC_PARTYMATCH_LIST )
int nPage;
int nRoomTotal;
STRUCT_PARTYMATCH_ROOM pRoom[PARTYMATCH_ROOM_PAGE];
};
struct TS_SC_PARTYMATCH_MEMBER : TS_MESSAGE
{
TS_SC_PARTYMATCH_MEMBER() _INIT( TM_SC_PARTYMATCH_MEMBER )
int nRoom;
AR_HANDLE nMaster; // master ID 아래에 pMeber중 하나가 이와 같은 값이다.
STRUCT_PARTYMATCH_MEMBER pMember[PARTYMATCH_MEMBER_MAX];
};
// { Game Server <-> Auth Server
struct TS_GA_LOGIN : TS_MESSAGE
{
TS_GA_LOGIN() _INIT( TM_GA_LOGIN )
unsigned short server_idx;
char server_name[21];
char server_screenshot_url[256];
bool is_adult_server;
char server_ip[16];
int server_port;
};
struct TS_AG_LOGIN_RESULT : TS_MESSAGE
{
TS_AG_LOGIN_RESULT() _INIT( TM_AG_LOGIN_RESULT )
unsigned short result;
};
struct TS_GA_CLIENT_LOGIN : TS_MESSAGE
{
TS_GA_CLIENT_LOGIN() _INIT( TM_GA_CLIENT_LOGIN )
char account[GameRule::MAX_ACCOUNT_LEN + 1];
__int64 one_time_key;
};
struct TS_AG_CLIENT_LOGIN : TS_MESSAGE
{
TS_AG_CLIENT_LOGIN() _INIT( TM_AG_CLIENT_LOGIN )
char account[GameRule::MAX_ACCOUNT_LEN + 1];
int nAccountID;
unsigned short result;
char nPCBangMode;
int nEventCode;
int nAge;
AR_TIME nContinuousPlayTime;
AR_TIME nContinuousLogoutTime;
};
struct TS_GA_CLIENT_LOGOUT : TS_MESSAGE
{
TS_GA_CLIENT_LOGOUT() _INIT( TM_GA_CLIENT_LOGOUT )
char account[GameRule::MAX_ACCOUNT_LEN + 1];
AR_TIME nContinuousPlayTime;
};
struct TS_AG_KICK_CLIENT : TS_MESSAGE
{
TS_AG_KICK_CLIENT() _INIT( TM_AG_KICK_CLIENT )
enum _KICK_TYPE
{
KICK_TYPE_ANOTHER_LOGIN = 0, // 다른 유저의 접속으로 인한 접속 종료
KICK_TYPE_DUPLICATED_LOGIN = 1, // 인증 서버에서 게임 서버 로그인 처리 시 중복된 로그인 감지로 인한 접속 종료(내부 오류 또는 해킹에 의한 발생)
KICK_TYPE_BILLING_EXPIRED = 2, // 결재 정보 만료로 인한 접속 종료
KICK_TYPE_GAME_ADDICTION = 3, // 게임 중독 방지로 인한 접속 종료
};
char account[GameRule::MAX_ACCOUNT_LEN + 1];
char kick_type; // _KICK_TYPE 값이 사용됨
};
struct TS_GA_CLIENT_KICK_FAILED : TS_MESSAGE
{
TS_GA_CLIENT_KICK_FAILED() _INIT( TM_GA_CLIENT_KICK_FAILED )
char account[GameRule::MAX_ACCOUNT_LEN + 1];
};
struct TS_AG_ITEM_PURCHASED : TS_MESSAGE
{
TS_AG_ITEM_PURCHASED() _INIT( TM_AG_ITEM_PURCHASED )
char account[GameRule::MAX_ACCOUNT_LEN + 1];
int nAccountID;
};
struct TS_AG_ITEM_SUPPLIED : TS_MESSAGE
{
TS_AG_ITEM_SUPPLIED() _INIT( TM_AG_ITEM_SUPPLIED )
char account[GameRule::MAX_ACCOUNT_LEN + 1];
};
// 2009. 8. 11 floyd 보안비밀번호 2차 수정
struct TS_AG_SECURITY_NO_CHECK : TS_MESSAGE
{
TS_AG_SECURITY_NO_CHECK() _INIT( TM_AG_SECURITY_NO_CHECK )
char account[GameRule::MAX_ACCOUNT_LEN + 1];
int mode;
int result;
};
// 2009. 8. 11 floyd 보안비밀번호 2차 수정
struct TS_GA_SECURITY_NO_CHECK : TS_MESSAGE
{
TS_GA_SECURITY_NO_CHECK() _INIT( TM_GA_SECURITY_NO_CHECK )
char account[GameRule::MAX_ACCOUNT_LEN + 1];
char password[19];
int mode;
};
struct TS_CS_OPEN_ITEM_SHOP : TS_MESSAGE
{
TS_CS_OPEN_ITEM_SHOP() _INIT( TM_CS_OPEN_ITEM_SHOP )
};
struct TS_SC_OPEN_ITEM_SHOP : TS_MESSAGE
{
TS_SC_OPEN_ITEM_SHOP() _INIT( TM_SC_OPEN_ITEM_SHOP )
int client_id;
int account_id;
int one_time_password;
char raw_server_name[32];
};
// 2009. 8. 11 floyd 보안비밀번호 2차 수정
/*
struct TS_SC_CREATE_SECURITY_NO : TS_MESSAGE
{
TS_SC_CREATE_SECURITY_NO() _INIT( TM_SC_CREATE_SECUTIRY_NO )
};
*/
struct TS_SC_REQUEST_SECURITY_NO : TS_MESSAGE
{
TS_SC_REQUEST_SECURITY_NO() _INIT( TM_SC_REQUEST_SECUTIRY_NO );
enum { SC_NONE, SC_OPEN_STORAGE, SC_DELETE_CHARACTER };
int mode;
};
struct TS_CS_SECURITY_NO : TS_MESSAGE
{
TS_CS_SECURITY_NO() _INIT( TM_CS_SECURITY_NO );
int mode; // 0 - None, 1 - Storage open
char security_no[19];
};
// 2009. 8. 11 floyd 보안비밀번호 2차 수정
/*
struct TS_CS_CREATE_SECURITY_NO : TS_MESSAGE
{
TS_CS_CREATE_SECURITY_NO() _INIT( TM_CS_CREATE_SECURITY_NO );
char password[19];
char security_no[19];
};
struct TS_CS_REQUEST_SECURITY_NO_CHANGE : TS_MESSAGE
{
TS_CS_REQUEST_SECURITY_NO_CHANGE() _INIT( TM_CS_REQUEST_SECURITY_NO_CHANGE );
};
struct TS_SC_CHANGE_SECURITY_NO : TS_MESSAGE
{
TS_SC_CHANGE_SECURITY_NO() _INIT( TM_SC_CHANGE_SECURITY_NO );
};
struct TS_CS_CHANGE_SECURITY_NO : TS_MESSAGE
{
TS_CS_CHANGE_SECURITY_NO() _INIT( TM_CS_CHANGE_SECURITY_NO );
char security_no_old[19];
char security_no[19];
};
struct TS_CS_REQUEST_CLEAR_SECURITY_NO : TS_MESSAGE
{
TS_CS_REQUEST_CLEAR_SECURITY_NO() _INIT( TM_CS_REQUEST_CLEAR_SECURITY_NO );
};
struct TS_SC_CLEAR_SECURITY_NO : TS_MESSAGE
{
TS_SC_CLEAR_SECURITY_NO() _INIT( TM_SC_CLEAR_SECURITY_NO );
bool clearable;
};
struct TS_CS_CLEAR_SECURITY_NO : TS_MESSAGE
{
TS_CS_CLEAR_SECURITY_NO() _INIT( TM_CS_CLEAR_SECURITY_NO );
char password[19];
char security_no[19];
};
*/
// }
// { Upload Server <-> Game Server
struct TS_SU_LOGIN : TS_MESSAGE
{
TS_SU_LOGIN() _INIT( TM_SU_LOGIN )
char server_name[21];
};
struct TS_US_LOGIN_RESULT : TS_MESSAGE
{
TS_US_LOGIN_RESULT() _INIT( TM_US_LOGIN_RESULT )
unsigned short result;
};
struct TS_SU_REQUEST_UPLOAD : TS_MESSAGE
{
TS_SU_REQUEST_UPLOAD() _INIT( TM_SU_REQUEST_UPLOAD )
enum
{
UPLOAD_TYPE_ICON = 0,
UPLOAD_TYPE_BANNER = 1,
};
int client_id;
int account_id;
int guild_sid;
int one_time_password;
unsigned char type;
};
struct TS_US_REQUEST_UPLOAD : TS_MESSAGE
{
TS_US_REQUEST_UPLOAD() _INIT( TM_US_REQUEST_UPLOAD )
unsigned short result;
};
struct TS_US_UPLOAD : TS_MESSAGE
{
TS_US_UPLOAD() _INIT( TM_US_UPLOAD )
int guild_id;
int file_size;
unsigned char filename_length;
unsigned char type;
};
// }
#undef _INIT
#pragma pack()
#define BEGIN_COMMAND \
static SCheatCommand s_Command[] = \
{
#define END_COMMAND \
{ NULL, NULL, GameRule::PERMISSION_FOR_PLAYER, 0 } \
};
#define NORMAL1( message, function ) \
{ message, (SCheatCommand::CMD_FUNCTION)(function), GameRule::PERMISSION_FOR_PLAYER, 1 },
#define NORMAL2( message, function ) \
{ message, (SCheatCommand::CMD_FUNCTION)(function), GameRule::PERMISSION_FOR_PLAYER, 2 },
#define NORMALA( message, function ) \
{ message, (SCheatCommand::CMD_FUNCTION)(function), GameRule::PERMISSION_FOR_PLAYER, 0 },
#define GM1( message, function, permission ) \
{ message, (SCheatCommand::CMD_FUNCTION)(function), permission, 1 },
#define GM2( message, function, permission ) \
{ message, (SCheatCommand::CMD_FUNCTION)(function), permission, 2 },
#define GMA( message, function, permission ) \
{ message, (SCheatCommand::CMD_FUNCTION)(function), permission, 0 },