diff --git a/RPG.GameCore/RPG.GameCore.csproj b/RPG.GameCore/RPG.GameCore.csproj
new file mode 100644
index 0000000..fa71b7a
--- /dev/null
+++ b/RPG.GameCore/RPG.GameCore.csproj
@@ -0,0 +1,9 @@
+
+
+
+ net8.0
+ enable
+ enable
+
+
+
diff --git a/RPG.Network.Proto/RPG.Network.Proto.csproj b/RPG.Network.Proto/RPG.Network.Proto.csproj
new file mode 100644
index 0000000..fcff061
--- /dev/null
+++ b/RPG.Network.Proto/RPG.Network.Proto.csproj
@@ -0,0 +1,25 @@
+
+
+
+ net8.0
+ enable
+ enable
+
+
+
+
+
+
+
+
+
+ all
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+
+
+
+
+
+
+
+
diff --git a/RPG.Network.Proto/messages.proto b/RPG.Network.Proto/messages.proto
new file mode 100644
index 0000000..17e53a0
--- /dev/null
+++ b/RPG.Network.Proto/messages.proto
@@ -0,0 +1,2203 @@
+syntax = "proto3";
+option csharp_namespace = "RPG.Network.Proto";
+
+message PlayerBasicInfo {
+ string nickname = 1;
+ uint32 level = 2;
+ uint32 exp = 3;
+ uint32 stamina = 4;
+ uint32 mcoin = 5;
+ uint32 hcoin = 6;
+ uint32 scoin = 7;
+ uint32 world_level = 8;
+}
+
+message BlackInfo {
+ uint32 begin_time = 1;
+ uint32 end_time = 2;
+ uint32 limit_level = 3;
+ uint32 ban_type = 4;
+}
+
+message VersionCount {
+ uint32 version = 1;
+ uint32 count = 2;
+}
+
+enum AccountType {
+ ACCOUNT_MIHOYO_GUEST = 0;
+ ACCOUNT_MIHOYO = 1;
+ ACCOUNT_XIAOMI = 11;
+ ACCOUNT_COOLPAD = 12;
+ ACCOUNT_YYB = 13;
+ ACCOUNT_BILI = 14;
+ ACCOUNT_HUAWEI = 15;
+ ACCOUNT_MEIZU = 16;
+ ACCOUNT_360 = 17;
+ ACCOUNT_OPPO = 18;
+ ACCOUNT_VIVO = 19;
+ ACCOUNT_UC = 20;
+ ACCOUNT_WANDOJIA = 21;
+ ACCOUNT_LENOVO = 22;
+ ACCOUNT_JINLI = 23;
+ ACCOUNT_BAIDU = 25;
+ ACCOUNT_DANGLE = 26;
+ ACCOUNT_WEGAME = 27;
+ ACCOUNT_RPG_CUSTOM = 10000;
+}
+
+enum ChannelIdType {
+ CHANNEL_ID_NONE = 0;
+ CHANNEL_ID_MIHOYO = 1;
+ CHANNEL_ID_XIAOMI = 11;
+ CHANNEL_ID_COOLPAD = 12;
+ CHANNEL_ID_YYB = 13;
+ CHANNEL_ID_BILI = 14;
+ CHANNEL_ID_HUAWEI = 15;
+ CHANNEL_ID_MEIZU = 16;
+ CHANNEL_ID_360 = 17;
+ CHANNEL_ID_OPPO = 18;
+ CHANNEL_ID_VIVO = 19;
+ CHANNEL_ID_UC = 20;
+ CHANNEL_ID_WANDOJIA = 21;
+ CHANNEL_ID_LENOVO = 22;
+ CHANNEL_ID_JINLI = 23;
+ CHANNEL_ID_BAIDU = 25;
+ CHANNEL_ID_DANGLE = 26;
+ CHANNEL_ID_WEGAME = 27;
+}
+
+enum AvatarSlotType {
+ AVATAR_SLOT_1 = 0;
+ AVATAR_SLOT_2 = 1;
+ AVATAR_SLOT_3 = 2;
+}
+
+enum ItemType {
+ ITEM_TYPE_NONE = 0;
+ ITEM_AVATAR_CARD = 1;
+ ITEM_EQUIPMENT = 2;
+ ITEM_MATERIAL = 3;
+ ITEM_AVATAR_EXP = 4;
+}
+
+enum VirtualItemType {
+ VIRTUAL_ITEM_NONE = 0;
+ VIRTUAL_ITEM_HCOIN = 1;
+ VIRTUAL_ITEM_SCOIN = 2;
+ VIRTUAL_ITEM_MCOIN = 3;
+ VIRTUAL_ITEM_STAMINA = 11;
+ VIRTUAL_ITEM_EXP = 22;
+}
+
+enum BlackLimitLevel { BLACK_LIMIT_LEVEL_ALL = 0; }
+
+enum AreaType {
+ AREA_NONE = 0;
+ AREA_CN = 1;
+ AREA_JP = 2;
+ AREA_ASIA = 3;
+ AREA_WEST = 4;
+ AREA_KR = 5;
+ AREA_OVERSEAS = 6;
+}
+
+enum EntityType {
+ ENTITY_NONE = 0;
+ ENTITY_AVATAR = 1;
+ ENTITY_MONSTER = 2;
+ ENTITY_NPC = 3;
+ ENTITY_PROP = 4;
+ ENTITY_TRIGGER = 5;
+ ENTITY_ENV = 6;
+}
+
+enum LanguageType {
+ LANGUAGE_NONE = 0;
+ LANGUAGE_SC = 1;
+ LANGUAGE_TC = 2;
+ LANGUAGE_EN = 3;
+ LANGUAGE_KR = 4;
+ LANGUAGE_JP = 5;
+ LANGUAGE_FR = 6;
+ LANGUAGE_DE = 7;
+ LANGUAGE_ES = 8;
+ LANGUAGE_PT = 9;
+ LANGUAGE_RU = 10;
+ LANGUAGE_TH = 11;
+ LANGUAGE_VI = 12;
+ LANGUAGE_ID = 13;
+}
+
+enum PlatformType {
+ EDITOR = 0;
+ IOS = 1;
+ ANDROID = 2;
+ PC = 3;
+}
+
+enum ReloginType {
+ NO_KICK = 0;
+ FORCE_KICK = 1;
+ IDLE_KICK = 2;
+}
+
+enum AvatarType {
+ AVATAR_TYPE_NONE = 0;
+ AVATAR_TRIAL_TYPE = 1;
+ AVATAR_LIMIT_TYPE = 2;
+ AVATAR_FORMAL_TYPE = 3;
+}
+
+message BattleOp {
+ uint32 turn_counter = 1;
+ uint32 state = 2;
+ uint32 action_entity_id = 3;
+ uint32 target_entity_id = 4;
+ uint32 op_type = 5;
+ uint32 skill_index = 6;
+ uint32 operation_counter = 7;
+}
+
+message BattleEquipment {
+ uint32 id = 1;
+ uint32 level = 2;
+ uint32 promotion = 3;
+ uint32 rank = 4;
+}
+
+message AvatarSkillTree {
+ uint32 point_id = 1;
+ uint32 level = 2;
+}
+
+message BattleAvatar {
+ AvatarType avatar_type = 1;
+ uint32 id = 2;
+ uint32 level = 3;
+ uint32 rank = 4;
+ uint32 index = 5;
+ repeated AvatarSkillTree skilltree_list = 6;
+ repeated BattleEquipment equipment_list = 7;
+ uint32 hp = 8;
+ uint32 sp = 9;
+ uint32 promotion = 10;
+}
+
+message BattleMonsterWave { repeated uint32 monster_id_list = 1; }
+
+message BattleBuff {
+ uint32 id = 1;
+ uint32 level = 2;
+ uint32 owner_index = 3;
+ uint32 wave_flag = 4;
+}
+
+message BattleLineup {
+ repeated BattleAvatar avatar_list = 1;
+ repeated BattleMonsterWave monster_wave_list = 2;
+ repeated BattleBuff buff_list = 3;
+}
+
+message ClientTurnSnapshot {
+ uint32 turn_counter = 1;
+ uint32 random_counter = 2;
+ uint32 anim_event_counter = 3;
+ repeated CharacterSnapshot snapshot_list = 4;
+ repeated AnimEventSnapshot anim_event_list = 5;
+}
+
+message GamecoreConfig {
+ bool is_skip_verify = 1;
+ uint32 max_turn_cnt = 2;
+ bool is_auto_fight = 3;
+ string csv_path = 4;
+}
+
+message BattleBuffMsg {
+ repeated uint32 buff_id_list = 1;
+ repeated uint32 buff_index_list = 2;
+ repeated uint32 buff_level_list = 3;
+ repeated uint32 buff_flag_list = 4;
+}
+
+message BattleReplay {
+ uint32 version = 1;
+ uint32 logic_random_seed = 2;
+ uint32 stage_id = 3;
+ BattleLineup lineup = 4;
+ repeated BattleOp op_list = 5;
+ bytes turn_snapshot_hash = 6;
+ uint32 maze_plane_id = 7;
+ repeated uint32 extra_ability_list = 8;
+ bool is_ai_consider_ultra_skill = 9;
+ BattleCheckStrategyType check_strategy = 10;
+ repeated ClientTurnSnapshot turn_snapshot_list = 21;
+ string local_level_path = 22;
+ string debug_extra_info = 23;
+ GamecoreConfig config = 24;
+}
+
+message AvatarProperty {
+ double max_hp = 1;
+ double attack = 2;
+ double defence = 3;
+ double speed = 4;
+ double left_hp = 5;
+ double left_sp = 6;
+ double max_sp = 7;
+}
+
+message EquipmentProperty {
+ uint32 id = 1;
+ uint32 rank = 2;
+ uint32 promotion = 3;
+ uint32 level = 4;
+}
+
+message AttackDamageProperty {
+ string attack_type = 1;
+ double damage = 2;
+}
+
+message SkillUseProperty {
+ uint32 skill_id = 1;
+ string skill_type = 2;
+ uint32 skill_level = 3;
+ uint32 skill_use_count = 4;
+}
+
+message SpAddSource {
+ string source = 1;
+ uint32 sp_add = 2;
+}
+
+message AvatarBattleInfo {
+ AvatarType avatar_type = 1;
+ uint32 id = 2;
+ uint32 avatar_level = 3;
+ uint32 avatar_rank = 4;
+ uint32 avatar_promotion = 5;
+ AvatarProperty avatar_status = 6;
+ string avatar_skill = 7;
+ repeated EquipmentProperty avatar_equipment = 8;
+ uint32 total_turns = 9;
+ double total_damage = 10;
+ double total_heal = 11;
+ double total_damage_taken = 12;
+ double total_hp_recover = 13;
+ double total_sp_cost = 14;
+ uint32 stage_id = 15;
+ uint32 stage_type = 16;
+ double total_break_damage = 17;
+ repeated AttackDamageProperty attack_type_damage = 18;
+ repeated AttackDamageProperty attack_type_break_damage = 19;
+ repeated AttackDamageProperty attack_type_max_damage = 20;
+ repeated SkillUseProperty skill_times = 21;
+ double delay_cumulate = 22;
+ uint32 total_sp_add = 23;
+ repeated SpAddSource sp_add_source = 24;
+ uint32 total_bp_cost = 25;
+ uint32 die_times = 26;
+ uint32 revive_times = 27;
+ uint32 break_times = 28;
+ uint32 extra_turns = 29;
+ double total_shield = 30;
+ double total_shield_taken = 31;
+ double total_shield_damage = 32;
+ AvatarProperty initial_status = 33;
+}
+
+message MonsterProperty {
+ double max_hp = 1;
+ double attack = 2;
+ double defence = 3;
+ double shield = 4;
+ double speed = 5;
+}
+
+message MonsterBattleInfo {
+ uint32 entity_id = 1;
+ uint32 monster_id = 2;
+ uint32 monster_template_id = 3;
+ uint32 monster_level = 4;
+ MonsterProperty monster_status = 5;
+ uint32 total_turns = 6;
+ double total_damage = 7;
+ double total_heal = 8;
+ double total_damage_taken = 9;
+ double total_stance_damage_taken = 10;
+ double total_hp_recover = 11;
+ uint32 stage_id = 12;
+ uint32 battle_id = 13;
+ uint32 monster_type = 14;
+ repeated AttackDamageProperty attack_type_damage = 15;
+ repeated SkillUseProperty skill_times = 16;
+ uint32 stage_type = 17;
+ double total_break_damage_taken = 18;
+ double delay_cumulate = 19;
+}
+
+message BattleStatistics {
+ uint32 total_battle_turns = 1;
+ uint32 total_auto_turns = 2;
+ repeated uint32 avatar_id_list = 3;
+ uint32 ultra_cnt = 4;
+ double total_delay_cumulate = 5;
+ double cost_time = 6;
+ repeated AvatarBattleInfo avatar_battle_list = 7;
+ repeated MonsterBattleInfo monster_battle_list = 8;
+ uint32 round_cnt = 9;
+ uint32 cocoon_dead_wave = 10;
+}
+
+message BattleResult {
+ BattleCheckResultType retcode = 1;
+ BattleEndStatus end_status = 2;
+ BattleStatistics stt = 3;
+}
+
+message CharacterSnapshot {
+ uint32 runtime_id = 1;
+ repeated uint64 properties = 2;
+}
+
+message AnimEventSnapshot {
+ string event_name = 1;
+ uint32 count = 2;
+}
+
+enum BattleCheckStrategyType {
+ BATTLE_CHECK_STRATEGY_IDENTICAL = 0;
+ BATTLE_CHECK_STRATEGY_SERVER = 1;
+ BATTLE_CHECK_STRATEGY_CLIENT = 2;
+}
+
+enum BattleCheckResultType {
+ BATTLE_CHECK_RESULT_SUCC = 0;
+ BATTLE_CHECK_RESULT_FAIL = 1;
+ BATTLE_CHECK_RESULT_PASS = 2;
+}
+
+enum BattleEndStatus {
+ BATTLE_END_NONE = 0;
+ BATTLE_END_WIN = 1;
+ BATTLE_END_LOSE = 2;
+ BATTLE_END_QUIT = 3;
+}
+
+enum Retcode {
+ RET_SUCC = 0;
+ RET_FAIL = 1;
+ RET_SERVER_INTERNAL_ERROR = 2;
+ RET_TIMEOUT = 3;
+ RET_REPEATED_REQ = 4;
+ RET_REQ_PARA_INVALID = 5;
+ RET_PLAYER_DATA_ERROR = 6;
+ RET_PLAYER_CLIENT_PAUSED = 7;
+ RET_REPEATE_LOGIN = 1000;
+ RET_RETRY_LOGIN = 1001;
+ RET_WAIT_LOGIN = 1002;
+ RET_NOT_IN_WHITE_LIST = 1003;
+ RET_IN_BLACK_LIST = 1004;
+ RET_ACCOUNT_VERIFY_ERROR = 1005;
+ RET_ACCOUNT_PARA_ERROR = 1006;
+ RET_ANTI_ADDICT_LOGIN = 1007;
+ RET_CHECK_SUM_ERROR = 1008;
+ RET_QUEST_REWARD_ALREADY_TAKEN = 1100;
+ RET_QUEST_NOT_ACCEPT = 1101;
+ RET_QUEST_NOT_FINISH = 1102;
+ RET_QUEST_STATUS_ERROR = 1103;
+ RET_AVATAR_NOT_EXIST = 1200;
+ RET_AVATAR_RES_EXP_NOT_ENOUGH = 1201;
+ RET_AVATAR_EXP_REACH_PROMOTION_LIMIT = 1202;
+ RET_AVATAR_REACH_MAX_PROMOTION = 1203;
+ RET_SKILLTREE_CONFIG_NOT_EXIST = 1204;
+ RET_SKILLTREE_ALREADY_UNLOCK = 1205;
+ RET_SKILLTREE_PRE_LOCKED = 1206;
+ RET_SKILLTREE_LEVEL_NOT_MEET = 1207;
+ RET_SKILLTREE_RANK_NOT_MEET = 1208;
+ RET_AVATAR_DRESS_NO_EQUIPMENT = 1209;
+ RET_AVATAR_EXP_ITEM_NOT_EXIST = 1210;
+ RET_SKILLTREE_POINT_UNLOCK = 1211;
+ RET_SKILLTREE_POINT_LEVEL_UPGRADE_NOT_MATCH = 1212;
+ RET_SKILLTREE_POINT_LEVEL_REACH_MAX = 1213;
+ RET_WORLD_LEVEL_NOT_MEET = 1214;
+ RET_PLAYER_LEVEL_NOT_MEET = 1215;
+ RET_ITEM_NOT_EXIST = 1300;
+ RET_ITEM_COST_NOT_ENOUGH = 1301;
+ RET_ITEM_COST_TOO_MUCH = 1302;
+ RET_ITEM_NO_COST = 1303;
+ RET_ITEM_NOT_ENOUGH = 1304;
+ RET_ITEM_INVALID = 1305;
+ RET_ITEM_CONFIG_NOT_EXIST = 1306;
+ RET_SCOIN_NOT_ENOUGH = 1307;
+ RET_ITEM_REWARD_EXCEED_LIMIT = 1308;
+ RET_ITEM_INVALID_USE = 1309;
+ RET_ITEM_USE_CONFIG_NOT_EXIST = 1310;
+ RET_REWARD_CONFIG_NOT_EXIST = 1311;
+ RET_ITEM_EXCEED_LIMIT = 1312;
+ RET_ITEM_COUNT_INVALID = 1313;
+ RET_ITEM_USE_TARGET_TYPE_INVALID = 1314;
+ RET_ITEM_USE_SATIETY_FULL = 1315;
+ RET_ITEM_COMPOSE_NOT_EXIST = 1316;
+ RET_EQUIPMENT_ALREADY_DRESSED = 1350;
+ RET_EQUIPMENT_NOT_EXIST = 1351;
+ RET_EQUIPMENT_REACH_LEVEL_LIMIT = 1352;
+ RET_EQUIPMENT_CONSUME_SELF = 1353;
+ RET_EQUIPMENT_ALREADY_LOCKED = 1354;
+ RET_EQUIPMENT_ALREADY_UNLOCKED = 1355;
+ RET_EQUIPMENT_LOCKED = 1356;
+ RET_EQUIPMENT_SELECT_NUM_OVER_LIMIT = 1357;
+ RET_EQUIPMENT_RANK_UP_MUST_CONSUME_SAME_TID = 1358;
+ RET_EQUIPMENT_PROMOTION_REACH_MAX = 1359;
+ RET_EQUIPMENT_RANK_UP_REACH_MAX = 1360;
+ RET_EQUIPMENT_LEVEL_REACH_MAX = 1361;
+ RET_EQUIPMENT_EXCEED_LIMIT = 1362;
+ RET_LINEUP_INVALID_INDEX = 1400;
+ RET_LINEUP_INVALID_MEMBER_POS = 1401;
+ RET_LINEUP_SWAP_NOT_EXIST = 1402;
+ RET_LINEUP_AVATAR_ALREADY_IN = 1403;
+ RET_LINEUP_CREATE_AVATAR_ERROR = 1404;
+ RET_LINEUP_AVATAR_INIT_ERROR = 1405;
+ RET_LINEUP_NOT_EXIST = 1406;
+ RET_LINEUP_ONLY_ONE_MEMBER = 1407;
+ RET_LINEUP_SAME_LEADER_SLOT = 1408;
+ RET_LINEUP_NO_LEADER_SELECT = 1409;
+ RET_LINEUP_SWAP_SAME_SLOT = 1410;
+ RET_LINEUP_AVATAR_NOT_EXIST = 1411;
+ RET_LINEUP_TRIAL_AVATAR_CAN_NOT_QUIT = 1412;
+ RET_LINEUP_VIRTUAL_LINEUP_PLANE_NOT_MATCH = 1413;
+ RET_LINEUP_NOT_VALID_LEADER = 1414;
+ RET_LINEUP_SAME_INDEX = 1415;
+ RET_LINEUP_IS_EMPTY = 1416;
+ RET_LINEUP_NAME_FORMAT_ERROR = 1417;
+ RET_MAIL_NOT_EXIST = 1700;
+ RET_MAIL_RANGE_INVALID = 1701;
+ RET_MAIL_MAIL_ID_INVALID = 1702;
+ RET_MAIL_NO_MAIL_TAKE_ATTACHMENT = 1703;
+ RET_MAIL_NO_MAIL_TO_DEL = 1704;
+ RET_STAGE_SETTLE_ERROR = 1800;
+ RET_STAGE_CONFIG_NOT_EXIST = 1801;
+ RET_STAGE_NOT_FOUND = 1802;
+ RET_STAGE_COCOON_PROP_NOT_VALID = 1804;
+ RET_STAGE_COCOON_WAVE_NOT_VALID = 1805;
+ RET_STAGE_PROP_ID_NOT_EQUAL = 1806;
+ RET_STAGE_COCOON_WAVE_OVER = 1807;
+ RET_CHAPTER_LOCK = 1900;
+ RET_CHAPTER_CHALLENGE_NUM_NOT_ENOUGH = 1901;
+ RET_CHAPTER_REWARD_ID_NOT_EXIST = 1902;
+ RET_CHAPTER_REWARD_ALREADY_TAKEN = 1903;
+ RET_BATTLE_STAGE_NOT_MATCH = 2000;
+ RET_IN_BATTLE_NOW = 2001;
+ RET_BATTLE_CHEAT = 2002;
+ RET_BATTLE_FAIL = 2003;
+ RET_BATTLE_NO_LINEUP = 2004;
+ RET_BATTLE_LINEUP_EMPTY = 2005;
+ RET_BATTLE_VERSION_NOT_MATCH = 2006;
+ RET_LACK_EXCHANGE_STAMINA_TIMES = 2100;
+ RET_LACK_STAMINA = 2101;
+ RET_STAMINA_FULL = 2102;
+ RET_AUTHKEY_SIGN_TYPE_ERROR = 2103;
+ RET_AUTHKEY_SIGN_VER_ERROR = 2104;
+ RET_NICKNAME_FORMAT_ERROR = 2105;
+ RET_SENSITIVE_WORDS = 2106;
+ RET_LEVEL_REWARD_HAS_TAKEN = 2107;
+ RET_LEVEL_REWARD_LEVEL_ERROR = 2108;
+ RET_LANGUAGE_INVALID = 2109;
+ RET_MAZE_NOT_FINISH = 2200;
+ RET_MAZE_LACK_TICKET = 2201;
+ RET_MAZE_NOT_UNLOCK = 2202;
+ RET_MAZE_DIFFICULTY_LIMIT = 2203;
+ RET_MAZE_NO_ABILITY = 2204;
+ RET_MAZE_NO_PLANE = 2205;
+ RET_MAZE_STAGE_DISMATCH = 2206;
+ RET_MAZE_MAP_NOT_EXIST = 2207;
+ RET_MAZE_TYPE_NOT_EXIST = 2208;
+ RET_MAZE_ALREADY_FINISH = 2209;
+ RET_MAZE_PROP_NOT_EXIST = 2210;
+ RET_MAZE_POSITION_TOO_FAR = 2211;
+ RET_MAZE_SKILL_CAST_CNT_REACH_MAX = 2212;
+ RET_MAZE_MP_NOT_ENOUGH = 2213;
+ RET_SPRING_NOT_ENABLE = 2214;
+ RET_SPRING_REFRESH_IN_CD = 2215;
+ RET_SPRING_TOO_FAR = 2216;
+ RET_MAZE_NO_FLOOR = 2217;
+ RET_NOT_IN_MAZE = 2218;
+ RET_PLANE_ID_NOT_MATCH = 2219;
+ RET_FLOOR_ID_NOT_MATCH = 2220;
+ RET_SAVEPOINTS_TIMES_ZERO = 2221;
+ RET_PLOT_NOT_UNLOCK = 2300;
+ RET_MISSION_NOT_EXIST = 2400;
+ RET_MISSION_ALREADY_DONE = 2401;
+ RET_DAILY_TASK_NOT_FINISH = 2402;
+ RET_DAILY_TASK_REWARD_HAS_TAKEN = 2403;
+ RET_MISSION_NOT_FINISH = 2404;
+ RET_MISSION_NOT_DOING = 2405;
+ RET_MISSION_FINISH_WAY_NOT_MATCH = 2406;
+ RET_MISSION_SCENE_NOT_MATCH = 2407;
+ RET_ADVENTURE_MAP_NOT_EXIST = 2500;
+ RET_SCENE_ENTITY_NOT_EXIST = 2600;
+ RET_NOT_IN_SCENE = 2601;
+ RET_SCENE_MONSTER_NOT_EXIST = 2602;
+ RET_INTERACT_CONFIG_NOT_EXIST = 2603;
+ RET_UNSUPPORTED_PROP_STATE = 2604;
+ RET_SCENE_ENTRY_ID_NOT_MATCH = 2605;
+ RET_ASSIST_MONSTER_COUNT_LIMIT = 2607;
+ RET_SCENE_USE_SKILL_FAIL = 2608;
+ RET_PROP_IS_HIDDEN = 2609;
+ RET_LOADING_SUCC_ALREADY = 2610;
+ RET_SCENE_ENTITY_TYPE_INVALID = 2611;
+ RET_INTERACT_TYPE_INVALID = 2612;
+ RET_INTERACT_NOT_IN_REGION = 2613;
+ RET_INTERACT_SUB_TYPE_INVALID = 2614;
+ RET_NOT_LEADER_ENTITY = 2615;
+ RET_BUY_TIMES_LIMIT = 2700;
+ RET_BUY_LIMIT_TYPE = 2701;
+ RET_SHOP_NOT_OPEN = 2702;
+ RET_GOODS_NOT_OPEN = 2703;
+ RET_TUTORIAL_NOT_UNLOCK = 2751;
+ RET_TUTORIAL_UNLOCK_ALREADY = 2752;
+ RET_TUTORIAL_FINISH_ALREADY = 2753;
+ RET_TUTORIAL_PRE_NOT_UNLOCK = 2754;
+ RET_TUTORIAL_PLAYER_LEVEL_NOT_MATCH = 2755;
+ RET_TUTORIAL_TUTORIAL_NOT_FOUND = 2756;
+ RET_CHALLENGE_NOT_EXIST = 2801;
+ RET_CHALLENGE_NOT_UNLOCK = 2802;
+ RET_CHALLENGE_ALREADY = 2803;
+ RET_CHALLENGE_LINEUP_EDIT_FORBIDDEN = 2804;
+ RET_CHALLENGE_LINEUP_EMPTY = 2805;
+ RET_CHALLENGE_NOT_DOING = 2806;
+ RET_CHALLENGE_NOT_FINISH = 2807;
+}
+
+message EnterAdventureCsReq { uint32 map_id = 1; }
+
+message EnterAdventureScRsp {
+ uint32 retcode = 1;
+ SceneInfo scene = 2;
+}
+
+enum CmdAdventureType {
+ CmdAdventureTypeNone = 0;
+ CmdEnterAdventureCsReq = 1301;
+ CmdEnterAdventureScRsp = 1302;
+}
+
+message GetAvatarDataCsReq {
+ bool is_get_all = 1;
+ repeated uint32 avatar_id_list = 2;
+}
+
+message Avatar {
+ uint32 avatar_id = 1;
+ uint32 exp = 2;
+ uint32 level = 3;
+ uint32 promotion = 4;
+ uint32 rank = 5;
+ repeated AvatarSkillTree skilltree_list = 6;
+ uint32 equipment_unique_id = 7;
+}
+
+message GetAvatarDataScRsp {
+ uint32 retcode = 1;
+ repeated Avatar avatar_list = 2;
+ bool is_all = 3;
+}
+
+message AvatarExpUpCsReq {
+ uint32 avatar_id = 1;
+ ItemCostData item_cost = 2;
+}
+
+message AvatarExpUpScRsp {
+ uint32 retcode = 1;
+ repeated PileItem return_item_list = 2;
+}
+
+message UnlockSkilltreeCsReq {
+ uint32 point_id = 1;
+ uint32 level = 2;
+ repeated ItemCost item_list = 3;
+}
+
+message UnlockSkilltreeScRsp {
+ uint32 retcode = 1;
+ uint32 avatar_id = 2;
+ uint32 point_id = 3;
+ uint32 level = 4;
+}
+
+message PromoteAvatarCsReq {
+ uint32 avatar_id = 1;
+ repeated ItemCost item_list = 2;
+}
+
+message PromoteAvatarScRsp { uint32 retcode = 1; }
+
+message DressAvatarCsReq {
+ uint32 equipment_unique_id = 1;
+ uint32 avatar_id = 2;
+}
+
+message DressAvatarScRsp { uint32 retcode = 1; }
+
+message TakeOffEquipmentCsReq { uint32 avatar_id = 1; }
+
+message TakeOffEquipmentScRsp { uint32 retcode = 1; }
+
+message AddAvatarScNotify {
+ uint32 avatar_id = 1;
+ uint32 rank = 2;
+ RewardData reward = 3;
+}
+
+enum CmdAvatarType {
+ CmdAvatarTypeNone = 0;
+ CmdGetAvatarDataCsReq = 301;
+ CmdGetAvatarDataScRsp = 302;
+ CmdAvatarExpUpCsReq = 303;
+ CmdAvatarExpUpScRsp = 304;
+ CmdUnlockSkilltreeCsReq = 305;
+ CmdUnlockSkilltreeScRsp = 306;
+ CmdPromoteAvatarCsReq = 307;
+ CmdPromoteAvatarScRsp = 308;
+ CmdDressAvatarCsReq = 309;
+ CmdDressAvatarScRsp = 310;
+ CmdTakeOffEquipmentCsReq = 311;
+ CmdTakeOffEquipmentScRsp = 312;
+ CmdAddAvatarScNotify = 313;
+}
+
+message PVEBattleResultCsReq {
+ uint32 stage_id = 1;
+ repeated BattleOp op_list = 2;
+ bytes turn_snapshot_hash = 3;
+ uint32 cost_time = 4;
+ string debug_extra_info = 5;
+ uint32 res_version = 6;
+ bool is_ai_consider_ultra_skill = 7;
+ BattleEndStatus end_status = 8;
+ BattleStatistics stt = 9;
+}
+
+message PVEBattleResultScRsp {
+ uint32 retcode = 1;
+ uint32 stage_id = 2;
+ uint32 cur_finish_challenge = 3;
+ repeated DropItem drop_list = 4;
+ uint32 avatar_exp_reward = 5;
+ string bin_ver = 6;
+ string res_ver = 7;
+ uint32 battle_id = 8;
+ BattleEndStatus end_status = 9;
+ repeated DropItem extra_drop_list = 10;
+ bool check_identical = 11;
+}
+
+message QuitBattleCsReq {}
+
+message QuitBattleScRsp { uint32 retcode = 1; }
+
+message GetCurBattleInfoCsReq {}
+
+message GetCurBattleInfoScRsp {
+ uint32 retcode = 1;
+ uint32 stage_id = 2;
+ uint32 logic_random_seed = 3;
+ repeated BattleAvatar avatar_list = 4;
+ SceneBattleInfo battle_info = 5;
+}
+
+message SyncClientResVersionCsReq { uint32 res_version = 1; }
+
+message SyncClientResVersionScRsp {
+ uint32 retcode = 1;
+ uint32 res_version = 2;
+}
+
+enum CmdBattleType {
+ CmdBattleTypeNone = 0;
+ CmdPVEBattleResultCsReq = 101;
+ CmdPVEBattleResultScRsp = 102;
+ CmdQuitBattleCsReq = 103;
+ CmdQuitBattleScRsp = 104;
+ CmdGetCurBattleInfoCsReq = 105;
+ CmdGetCurBattleInfoScRsp = 106;
+ CmdSyncClientResVersionCsReq = 107;
+ CmdSyncClientResVersionScRsp = 108;
+}
+
+message Challenge {
+ uint32 challenge_id = 1;
+ uint32 stars = 2;
+}
+
+message GetChallengeCsReq {}
+
+message GetChallengeScRsp {
+ uint32 retcode = 1;
+ repeated Challenge challenge_list = 2;
+}
+
+message StartChallengeCsReq { uint32 challenge_id = 1; }
+
+message StartChallengeScRsp {
+ uint32 retcode = 1;
+ Maze maze = 2;
+}
+
+message LeaveChallengeCsReq {}
+
+message LeaveChallengeScRsp {
+ uint32 retcode = 1;
+ Maze maze = 2;
+}
+
+message ChallengeSettleNotify {
+ uint32 challenge_id = 1;
+ bool is_win = 2;
+ RewardData reward = 3;
+ uint32 stars = 4;
+}
+
+message FinishChallengeCsReq { uint32 challenge_id = 1; }
+
+message FinishChallengeScRsp { uint32 retcode = 1; }
+
+enum CmdChallengeType {
+ CmdChallengeTypeNone = 0;
+ CmdGetChallengeCsReq = 1701;
+ CmdGetChallengeScRsp = 1702;
+ CmdStartChallengeCsReq = 1703;
+ CmdStartChallengeScRsp = 1704;
+ CmdLeaveChallengeCsReq = 1705;
+ CmdLeaveChallengeScRsp = 1706;
+ CmdChallengeSettleNotify = 1707;
+ CmdFinishChallengeCsReq = 1708;
+ CmdFinishChallengeScRsp = 1709;
+}
+
+message PileItem {
+ uint32 item_id = 1;
+ uint32 item_num = 2;
+}
+
+message ItemCost {
+ oneof Item {
+ PileItem pile_item = 1;
+ uint32 unique_id = 2;
+ }
+}
+
+message ItemCostData { repeated ItemCost item_list = 1; }
+
+message DropItem {
+ uint32 item_id = 1;
+ uint32 level = 2;
+ uint32 rank = 3;
+ uint32 num = 4;
+}
+
+message DropData { repeated DropItem item_list = 1; }
+
+message RewardItem {
+ uint32 item_id = 1;
+ uint32 level = 2;
+ uint32 rank = 3;
+ uint32 num = 4;
+ uint32 promotion = 5;
+}
+
+message RewardData { repeated RewardItem item_list = 1; }
+
+message SceneMonsterWave {
+ repeated uint32 monster_id_list = 1;
+ repeated DropData drop_list = 2;
+}
+
+message SceneBattleInfo {
+ uint32 logic_random_seed = 1;
+ uint32 stage_id = 2;
+ repeated SceneMonsterWave monster_wave_list = 3;
+ repeated BattleAvatar battle_avatar_list = 4;
+ repeated BattleBuff buff_list = 5;
+}
+
+enum MissionStatus {
+ MISSION_NONE = 0;
+ MISSION_DOING = 1;
+ MISSION_FINISH = 2;
+ MISSION_PREPARED = 3;
+}
+
+message GetBagCsReq {}
+
+message Equipment {
+ uint32 unique_id = 1;
+ uint32 tid = 2;
+ uint32 level = 3;
+ uint32 exp = 4;
+ uint32 rank = 5;
+ uint32 belong_avatar_id = 6;
+ bool is_protected = 7;
+ uint32 promotion = 8;
+}
+
+message Material {
+ uint32 tid = 1;
+ uint32 num = 2;
+}
+
+message GetBagScRsp {
+ uint32 retcode = 1;
+ repeated Equipment equipment_list = 2;
+ repeated Material material_list = 3;
+}
+
+message PromoteEquipmentCsReq {
+ uint32 equipment_unique_id = 1;
+ ItemCostData cost_data = 2;
+}
+
+message PromoteEquipmentScRsp { uint32 retcode = 1; }
+
+message LockEquipmentCsReq {
+ uint32 equipment_unique_id = 1;
+ bool is_lock = 2;
+}
+
+message LockEquipmentScRsp {
+ uint32 retcode = 1;
+ uint32 equipment_unique_id = 2;
+}
+
+message UseItemCsReq { uint32 use_item_id = 1; }
+
+message UseItemScRsp {
+ uint32 retcode = 1;
+ uint32 use_item_id = 2;
+ RewardData reward_data = 3;
+}
+
+message RankUpEquipmentCsReq {
+ uint32 equipment_unique_id = 1;
+ repeated uint32 equipment_id_list = 2;
+}
+
+message RankUpEquipmentScRsp { uint32 retcode = 1; }
+
+message ExpUpEquipmentCsReq {
+ uint32 equipment_unique_id = 1;
+ ItemCostData cost_data = 2;
+}
+
+message ExpUpEquipmentScRsp {
+ uint32 retcode = 1;
+ repeated PileItem return_item_list = 2;
+}
+
+message UseItemFoodCsReq {
+ uint32 use_item_id = 1;
+ uint32 use_item_count = 2;
+ uint32 use_avatar_id = 3;
+ AvatarType use_avatar_type = 4;
+}
+
+message UseItemFoodScRsp {
+ uint32 retcode = 1;
+ uint32 use_item_id = 2;
+ uint32 use_item_count = 3;
+}
+
+message ComposeItemCsReq {
+ uint32 compose_id = 1;
+ uint32 count = 2;
+}
+
+message ComposeItemScRsp {
+ uint32 retcode = 1;
+ uint32 compose_id = 2;
+ uint32 count = 3;
+}
+
+enum CmdItemType {
+ CmdItemTypeNone = 0;
+ CmdGetBagCsReq = 501;
+ CmdGetBagScRsp = 502;
+ CmdPromoteEquipmentCsReq = 503;
+ CmdPromoteEquipmentScRsp = 504;
+ CmdLockEquipmentCsReq = 505;
+ CmdLockEquipmentScRsp = 506;
+ CmdUseItemCsReq = 507;
+ CmdUseItemScRsp = 508;
+ CmdRankUpEquipmentCsReq = 509;
+ CmdRankUpEquipmentScRsp = 510;
+ CmdExpUpEquipmentCsReq = 511;
+ CmdExpUpEquipmentScRsp = 512;
+ CmdUseItemFoodCsReq = 513;
+ CmdUseItemFoodScRsp = 514;
+ CmdComposeItemCsReq = 515;
+ CmdComposeItemScRsp = 516;
+}
+
+message GetStageLineupCsReq {}
+
+message StageLineup {
+ uint32 stage_type = 1;
+ uint32 lineup_index = 2;
+}
+
+message GetStageLineupScRsp {
+ uint32 retcode = 1;
+ repeated StageLineup stage_lineup_list = 2;
+}
+
+message LineupAvatar {
+ uint32 slot = 1;
+ AvatarType avatar_type = 2;
+ uint32 id = 3;
+ uint32 skill_cast_cnt = 4;
+ uint32 hp = 5;
+ uint32 sp = 6;
+ uint32 satiety = 7;
+}
+
+message LineupInfo {
+ repeated LineupAvatar avatar_list = 1;
+ bool is_virtual = 2;
+ uint32 plane_id = 3;
+ uint32 mp = 4;
+ uint32 leader_slot = 5;
+ uint32 index = 6;
+ ExtraLineupType extra_lineup_type = 7;
+ string name = 8;
+}
+
+message GetCurLineupDataCsReq {}
+
+message GetCurLineupDataScRsp {
+ uint32 retcode = 1;
+ LineupInfo lineup = 2;
+}
+
+message JoinLineupCsReq {
+ uint32 avatar_id = 1;
+ bool is_virtual = 2;
+ uint32 plane_id = 3;
+ uint32 slot = 4;
+ uint32 index = 5;
+ ExtraLineupType extra_lineup_type = 6;
+}
+
+message JoinLineupScRsp { uint32 retcode = 1; }
+
+message QuitLineupCsReq {
+ uint32 avatar_id = 1;
+ bool is_virtual = 2;
+ uint32 plane_id = 3;
+ uint32 index = 4;
+ ExtraLineupType extra_lineup_type = 5;
+}
+
+message QuitLineupScRsp {
+ uint32 retcode = 1;
+ uint32 avatar_id = 2;
+ bool is_mainline = 3;
+ uint32 plane_id = 4;
+ bool is_virtual = 5;
+}
+
+message SwapLineupCsReq {
+ bool is_virtual = 1;
+ uint32 plane_id = 2;
+ uint32 src_slot = 3;
+ uint32 dst_slot = 4;
+ uint32 index = 5;
+ ExtraLineupType extra_lineup_type = 6;
+}
+
+message SwapLineupScRsp { uint32 retcode = 1; }
+
+message SyncLineupNotify { LineupInfo lineup = 1; }
+
+message GetLineupAvatarDataCsReq {}
+
+message LineupAvatarData {
+ AvatarType avatar_type = 1;
+ uint32 id = 2;
+ uint32 hp = 3;
+}
+
+message GetLineupAvatarDataScRsp {
+ uint32 retcode = 1;
+ repeated LineupAvatarData avatar_data_list = 2;
+}
+
+message ChangeLineupLeaderCsReq { uint32 slot = 1; }
+
+message ChangeLineupLeaderScRsp {
+ uint32 retcode = 1;
+ uint32 slot = 2;
+}
+
+message SwitchLineupIndexCsReq { uint32 index = 1; }
+
+message SwitchLineupIndexScRsp {
+ uint32 retcode = 1;
+ uint32 index = 2;
+}
+
+message SetLineupNameCsReq {
+ string name = 1;
+ uint32 index = 2;
+}
+
+message SetLineupNameScRsp {
+ uint32 retcode = 1;
+ string name = 2;
+ uint32 index = 3;
+}
+
+message GetAllLineupDataCsReq {}
+
+message GetAllLineupDataScRsp {
+ uint32 retcode = 1;
+ uint32 cur_index = 2;
+ repeated LineupInfo lineup_list = 3;
+}
+
+message VirtualLineupDestroyNotify { uint32 plane_id = 1; }
+
+enum CmdLineupType {
+ CmdLineupTypeNone = 0;
+ CmdGetStageLineupCsReq = 701;
+ CmdGetStageLineupScRsp = 702;
+ CmdGetCurLineupDataCsReq = 703;
+ CmdGetCurLineupDataScRsp = 704;
+ CmdJoinLineupCsReq = 705;
+ CmdJoinLineupScRsp = 706;
+ CmdQuitLineupCsReq = 707;
+ CmdQuitLineupScRsp = 708;
+ CmdSwapLineupCsReq = 709;
+ CmdSwapLineupScRsp = 710;
+ CmdSyncLineupNotify = 711;
+ CmdGetLineupAvatarDataCsReq = 712;
+ CmdGetLineupAvatarDataScRsp = 713;
+ CmdChangeLineupLeaderCsReq = 714;
+ CmdChangeLineupLeaderScRsp = 715;
+ CmdSwitchLineupIndexCsReq = 716;
+ CmdSwitchLineupIndexScRsp = 717;
+ CmdSetLineupNameCsReq = 718;
+ CmdSetLineupNameScRsp = 719;
+ CmdGetAllLineupDataCsReq = 720;
+ CmdGetAllLineupDataScRsp = 721;
+ CmdVirtualLineupDestroyNotify = 722;
+}
+
+enum ExtraLineupType {
+ LINEUP_NONE = 0;
+ LINEUP_CHALLENGE = 1;
+}
+
+message GetMailCsReq {
+ uint32 start = 1;
+ uint32 stop = 2;
+}
+
+message MailItem {
+ uint32 item_id = 1;
+ uint32 level = 2;
+ uint32 num = 3;
+ uint32 rank = 4;
+ uint32 promotion = 5;
+}
+
+message MailAttachment { repeated MailItem item_list = 1; }
+
+message ClientMail {
+ uint32 id = 1;
+ uint32 template_id = 2;
+ string title = 3;
+ string content = 4;
+ string sender = 5;
+ uint32 time = 6;
+ MailAttachment attachment = 7;
+ bool is_read = 8;
+ uint32 expire_time = 9;
+ repeated string para_list = 10;
+}
+
+message GetMailScRsp {
+ uint32 retcode = 1;
+ repeated ClientMail mail_list = 2;
+ bool is_end = 3;
+ uint32 total_num = 4;
+ uint32 start = 5;
+ repeated ClientMail notice_mail_list = 6;
+}
+
+message MarkReadMailCsReq { uint32 id = 1; }
+
+message MarkReadMailScRsp {
+ uint32 retcode = 1;
+ uint32 id = 2;
+}
+
+message DelMailCsReq { repeated uint32 id_list = 1; }
+
+message DelMailScRsp {
+ uint32 retcode = 1;
+ repeated uint32 id_list = 2;
+}
+
+message TakeMailAttachmentCsReq { repeated uint32 mail_id_list = 1; }
+
+message ClientMailAttachmentItem {
+ uint32 mail_id = 1;
+ uint32 item_id = 2;
+}
+
+message TakeMailAttachmentScRsp {
+ uint32 retcode = 1;
+ repeated uint32 succ_mail_id_list = 2;
+ MailAttachment attachment = 3;
+ repeated ClientMailAttachmentItem fail_mail_list = 4;
+}
+
+message NewMailScNotify { repeated uint32 mail_id_list = 1; }
+
+enum CmdMailType {
+ CmdMailTypeNone = 0;
+ CmdGetMailCsReq = 801;
+ CmdGetMailScRsp = 802;
+ CmdMarkReadMailCsReq = 803;
+ CmdMarkReadMailScRsp = 804;
+ CmdDelMailCsReq = 805;
+ CmdDelMailScRsp = 806;
+ CmdTakeMailAttachmentCsReq = 807;
+ CmdTakeMailAttachmentScRsp = 808;
+ CmdNewMailScNotify = 809;
+}
+
+message MazeFloor {
+ uint32 floor_id = 1;
+ SceneInfo scene = 2;
+}
+
+message Maze {
+ uint32 id = 1;
+ MazeFloor floor = 2;
+ uint32 map_entry_id = 3;
+}
+
+message MazeAvatar {
+ uint32 avatar_id = 1;
+ uint32 left_hp = 2;
+ uint32 sp = 3;
+}
+
+message MazeMission {
+ uint32 sub_mission_id = 1;
+ MissionStatus status = 2;
+}
+
+message GetMazeCsReq {}
+
+message GetMazeScRsp {
+ uint32 retcode = 1;
+ repeated Maze maze_list = 2;
+ uint32 cur_series_id = 3;
+ repeated uint32 finished_plane_list = 4;
+ repeated uint32 wait_plane_list = 5;
+ repeated uint32 taken_reward_list = 6;
+ repeated MazeAvatar avatar_list = 7;
+ repeated uint32 chosen_ability_list = 8;
+ repeated uint32 candidate_ability_list = 9;
+ repeated MazeMission maze_mission_list = 10;
+}
+
+message ChooseMazeSeriesCsReq { uint32 series_id = 1; }
+
+message ChooseMazeSeriesScRsp {
+ uint32 retcode = 1;
+ uint32 series_id = 2;
+}
+
+message ChooseMazeAbilityCsReq { uint32 ability_id = 1; }
+
+message ChooseMazeAbilityScRsp {
+ uint32 retcode = 1;
+ repeated uint32 ability_list = 2;
+}
+
+message EnterMazeCsReq {
+ uint32 plane_id = 1;
+ uint32 floor_id = 2;
+ uint32 entry_id = 3;
+ uint32 group_id = 4;
+ uint32 config_id = 5;
+}
+
+message EnterMazeScRsp {
+ uint32 retcode = 1;
+ Maze maze = 2;
+}
+
+message MazeBuffScNotify {
+ uint32 buff_id = 1;
+ MazeBuffOp op = 2;
+}
+
+message CastMazeSkillCsReq { uint32 skill_id = 1; }
+
+message CastMazeSkillScRsp { uint32 retcode = 1; }
+
+message MazePlaneEventScNotify {
+ RewardData reward = 1;
+ repeated DropItem drop_list = 2;
+}
+
+message EnterMazeByServerScNotify { Maze maze = 1; }
+
+message MazePropState {
+ uint32 group_id = 1;
+ uint32 config_id = 2;
+ uint32 state = 3;
+}
+
+message MazeGroup {
+ uint32 group_id = 1;
+ uint32 modify_time = 2;
+}
+
+message GetMazeMapInfoCsReq { uint32 entry_id = 1; }
+
+message GetMazeMapInfoScRsp {
+ uint32 retcode = 1;
+ uint32 entry_id = 2;
+ repeated uint32 lighten_section_list = 3;
+ repeated MazePropState maze_prop_list = 4;
+ repeated MazeGroup maze_group_list = 5;
+}
+
+enum CmdMazeType {
+ CmdMazeTypeNode = 0;
+ CmdGetMazeCsReq = 1001;
+ CmdGetMazeScRsp = 1002;
+ CmdChooseMazeSeriesCsReq = 1003;
+ CmdChooseMazeSeriesScRsp = 1004;
+ CmdChooseMazeAbilityCsReq = 1005;
+ CmdChooseMazeAbilityScRsp = 1006;
+ CmdEnterMazeCsReq = 1007;
+ CmdEnterMazeScRsp = 1008;
+ CmdMazeBuffScNotify = 1011;
+ CmdCastMazeSkillCsReq = 1012;
+ CmdCastMazeSkillScRsp = 1013;
+ CmdMazePlaneEventScNotify = 1014;
+ CmdEnterMazeByServerScNotify = 1015;
+ CmdGetMazeMapInfoCsReq = 1016;
+ CmdGetMazeMapInfoScRsp = 1017;
+}
+
+enum MazeBuffOp {
+ MAZE_BUFF_OP_NONE = 0;
+ MAZE_BUFF_OP_ADD = 1;
+ MAZE_BUFF_OP_DEL = 2;
+}
+
+message GetMissionDataCsReq {}
+
+message Mission {
+ uint32 id = 1;
+ MissionStatus status = 2;
+ uint32 progress = 3;
+}
+
+message GetMissionDataScRsp {
+ uint32 retcode = 1;
+ repeated Mission mission_list = 2;
+ repeated uint32 finished_main_mission_id_list = 3;
+}
+
+message FinishTalkMissionCsReq { string talk_str = 1; }
+
+message FinishTalkMissionScRsp {
+ uint32 retcode = 1;
+ string talk_str = 2;
+}
+
+message MissionRewardScNotify {
+ uint32 main_mission_id = 1;
+ RewardData reward = 2;
+}
+
+message SyncTaskCsReq { string key = 1; }
+
+message SyncTaskScRsp {
+ uint32 retcode = 1;
+ string key = 2;
+}
+
+message DailyTask {
+ uint32 main_mission_id = 1;
+ bool is_finished = 2;
+}
+
+message DailyTaskDataScNotify {
+ bool is_taken_extra_reward = 1;
+ uint32 finished_num = 2;
+ repeated DailyTask daily_task_list = 3;
+}
+
+message TakeDailyTaskExtraRewardCsReq {}
+
+message TakeDailyTaskExtraRewardScRsp {
+ uint32 retcode = 1;
+ RewardData reward = 2;
+}
+
+message DailyTaskRewardScNotify {
+ uint32 count = 1;
+ RewardData reward = 2;
+}
+
+message MissionGroupWarnScNotify { repeated uint32 group_id_list = 1; }
+
+message FinishCosumeItemMissionCsReq { uint32 sub_mission_id = 1; }
+
+message FinishCosumeItemMissionScRsp {
+ uint32 retcode = 1;
+ uint32 sub_mission_id = 2;
+}
+
+enum CmdMissionType {
+ CmdMissionTypeNone = 0;
+ CmdGetMissionDataCsReq = 1201;
+ CmdGetMissionDataScRsp = 1202;
+ CmdFinishTalkMissionCsReq = 1203;
+ CmdFinishTalkMissionScRsp = 1204;
+ CmdMissionRewardScNotify = 1205;
+ CmdSyncTaskCsReq = 1206;
+ CmdSyncTaskScRsp = 1207;
+ CmdDailyTaskDataScNotify = 1208;
+ CmdTakeDailyTaskExtraRewardCsReq = 1209;
+ CmdTakeDailyTaskExtraRewardScRsp = 1210;
+ CmdDailyTaskRewardScNotify = 1211;
+ CmdMissionGroupWarnScNotify = 1212;
+ CmdFinishCosumeItemMissionCsReq = 1213;
+ CmdFinishCosumeItemMissionScRsp = 1214;
+}
+
+message PlayerLoginCsReq {
+ PlatformType platform = 1;
+ string cps = 2;
+ string device_uuid = 3;
+ string device_info = 4;
+ string system_info = 5;
+ string client_version = 6;
+ LanguageType language = 7;
+ uint32 last_server_packet_id = 8;
+ string check_sum_1 = 9;
+ string check_sum_2 = 10;
+ string signature = 11;
+ string resolution = 12;
+ uint64 login_random = 13;
+ string system_language = 14;
+ uint32 res_version = 15;
+}
+
+message PlayerLoginScRsp {
+ uint32 retcode = 1;
+ bool is_new_player = 2;
+ PlayerBasicInfo basic_info = 3;
+ uint64 server_timestamp_ms = 4;
+ uint32 stamina = 5;
+ bool is_relay = 6;
+ uint64 login_random = 7;
+}
+
+message PlayerLogoutCsReq {}
+
+message PlayerGetTokenCsReq {
+ uint32 channel_id = 1;
+ string account_uid = 2;
+ string token = 3;
+ uint32 uid = 4;
+ string device = 5;
+}
+
+message PlayerGetTokenScRsp {
+ uint32 retcode = 1;
+ uint32 uid = 2;
+ BlackInfo black_info = 3;
+ string msg = 4;
+ uint64 secret_key_seed = 5;
+}
+
+message PlayerKeepAliveNotify {}
+
+message GmTalkScNotify { string msg = 1; }
+
+message PlayerKickOutScNotify {
+ KickType kick_type = 1;
+ enum KickType {
+ KICK_SQUEEZED = 0;
+ KICK_BLACK = 1;
+ KICK_CHANGE_PWD = 2;
+ }
+
+ BlackInfo black_info = 2;
+}
+
+message GmTalkCsReq { string msg = 1; }
+
+message GmTalkScRsp {
+ uint32 retcode = 1;
+ string retmsg = 2;
+}
+
+message GetStaminaExchangeCsReq {}
+
+message GetStaminaExchangeScRsp {
+ uint32 retcode = 1;
+ uint32 next_recover_time = 2;
+ uint32 exchange_times = 3;
+}
+
+message ExchangeStaminaCsReq {}
+
+message ExchangeStaminaScRsp {
+ uint32 retcode = 1;
+ uint32 stamina_add = 2;
+ repeated ItemCost item_cost_list = 3;
+ uint32 last_recover_time = 4;
+ uint32 exchange_times = 5;
+}
+
+message GetAuthkeyCsReq {
+ string auth_appid = 1;
+ uint32 sign_type = 2;
+ uint32 authkey_ver = 3;
+}
+
+message GetAuthkeyScRsp {
+ uint32 retcode = 1;
+ string authkey = 2;
+ string auth_appid = 3;
+ uint32 sign_type = 4;
+ uint32 authkey_ver = 5;
+}
+
+message RegionStopScNotify {
+ uint32 stop_begin_time = 1;
+ uint32 stop_end_time = 2;
+}
+
+message AntiAddictScNotify {
+ uint32 msg_type = 1;
+ string msg = 2;
+ string level = 3;
+}
+
+message SetNicknameCsReq {
+ string nickname = 1;
+ bool is_modify = 2;
+}
+
+message SetNicknameScRsp { uint32 retcode = 1; }
+
+message GetLevelRewardTakenListCsReq {}
+
+message GetLevelRewardTakenListScRsp {
+ uint32 retcode = 1;
+ repeated uint32 taken_level_list = 2;
+}
+
+message GetLevelRewardCsReq { uint32 level = 1; }
+
+message GetLevelRewardScRsp {
+ uint32 retcode = 1;
+ RewardData reward = 2;
+}
+
+message SyncTimeCsReq { uint64 client_time_ms = 1; }
+
+message SyncTimeScRsp {
+ uint32 retcode = 1;
+ uint64 client_time_ms = 2;
+ uint64 server_time_ms = 3;
+}
+
+message SetLanguageCsReq { LanguageType language = 1; }
+
+message SetLanguageScRsp {
+ uint32 retcode = 1;
+ LanguageType language = 2;
+}
+
+message AnnounceData {
+ uint32 config_id = 1;
+ uint32 begin_time = 2;
+ uint32 end_time = 3;
+ string center_system_text = 4;
+ string count_down_text = 5;
+ string dungeon_confirm_text = 6;
+ uint32 center_system_frequency = 7;
+ uint32 count_down_frequency = 8;
+ bool is_center_system_last_5_every_minutes = 9;
+}
+
+message ServerAnnounceNotify { repeated AnnounceData announce_data_list = 1; }
+
+enum CmdPlayerType {
+ CmdPlayerTypeNone = 0;
+ CmdPlayerLoginCsReq = 1;
+ CmdPlayerLoginScRsp = 2;
+ CmdPlayerLogoutCsReq = 3;
+ CmdPlayerLogoutScRsp = 4;
+ CmdPlayerGetTokenCsReq = 5;
+ CmdPlayerGetTokenScRsp = 6;
+ CmdPlayerKeepAliveNotify = 7;
+ CmdGmTalkScNotify = 8;
+ CmdPlayerKickOutScNotify = 9;
+ CmdGmTalkCsReq = 10;
+ CmdGmTalkScRsp = 11;
+ CmdGetStaminaExchangeCsReq = 12;
+ CmdGetStaminaExchangeScRsp = 13;
+ CmdExchangeStaminaCsReq = 14;
+ CmdExchangeStaminaScRsp = 15;
+ CmdGetAuthkeyCsReq = 16;
+ CmdGetAuthkeyScRsp = 17;
+ CmdRegionStopScNotify = 18;
+ CmdAntiAddictScNotify = 19;
+ CmdSetNicknameCsReq = 20;
+ CmdSetNicknameScRsp = 21;
+ CmdGetLevelRewardTakenListCsReq = 22;
+ CmdGetLevelRewardTakenListScRsp = 23;
+ CmdGetLevelRewardCsReq = 24;
+ CmdGetLevelRewardScRsp = 25;
+ CmdSyncTimeCsReq = 26;
+ CmdSyncTimeScRsp = 27;
+ CmdSetLanguageCsReq = 28;
+ CmdSetLanguageScRsp = 29;
+ CmdServerAnnounceNotify = 30;
+}
+
+enum AuthkeySignType {
+ AUTHKEY_SIGN_TYPE_NONE = 0;
+ AUTHKEY_SIGN_TYPE_DEFAULT = 1;
+ AUTHKEY_SIGN_TYPE_RSA = 2;
+}
+
+message FinishPlotCsReq { uint32 plot_id = 1; }
+
+message FinishPlotScRsp {
+ uint32 retcode = 1;
+ uint32 plot_id = 2;
+}
+
+enum CmdPlotType {
+ CmdPlotTypeNone = 0;
+ CmdFinishPlotCsReq = 1101;
+ CmdFinishPlotScRsp = 1102;
+}
+
+message GetQuestDataCsReq {}
+
+message Quest {
+ uint32 id = 1;
+ QuestStatus status = 2;
+ uint32 progress = 3;
+}
+
+message GetQuestDataScRsp {
+ uint32 retcode = 1;
+ repeated Quest quest_list = 2;
+}
+
+message TakeQuestRewardCsReq { repeated uint32 quest_id_list = 1; }
+
+message TakeQuestRewardScRsp {
+ uint32 retcode = 1;
+ RewardData reward = 2;
+ repeated uint32 succ_quest_id_list = 3;
+}
+
+enum CmdQuestType {
+ CmdQuestTypeNone = 0;
+ CmdGetQuestDataCsReq = 901;
+ CmdGetQuestDataScRsp = 902;
+ CmdTakeQuestRewardCsReq = 903;
+ CmdTakeQuestRewardScRsp = 904;
+}
+
+enum QuestStatus {
+ QUEST_NONE = 0;
+ QUEST_DOING = 1;
+ QUEST_FINISH = 2;
+ QUEST_CLOSE = 3;
+ QUEST_DELETE = 4;
+}
+
+message Vector {
+ sint32 x = 1;
+ sint32 y = 2;
+ sint32 z = 3;
+}
+
+message MotionInfo {
+ Vector pos = 1;
+ Vector rot = 2;
+}
+
+message SceneActorInfo {
+ uint32 uid = 1;
+ AvatarType avatar_type = 2;
+ uint32 avatar_id = 3;
+}
+
+message SceneNpcMonsterInfo {
+ uint32 monster_id = 1;
+ bool is_gen_monster = 2;
+}
+
+message SceneNpcInfo { uint32 npc_id = 1; }
+
+message ScenePropInfo {
+ uint32 prop_id = 1;
+ uint32 prop_state = 2;
+ uint64 create_time_ms = 3;
+ uint32 life_time_ms = 4;
+}
+
+message SceneEntityInfo {
+ uint32 entity_id = 1;
+ MotionInfo motion = 2;
+ uint32 group_id = 3;
+ uint32 inst_id = 4;
+
+ oneof entity {
+ SceneActorInfo actor = 5;
+ SceneNpcMonsterInfo npc_monster = 6;
+ SceneNpcInfo npc = 7;
+ ScenePropInfo prop = 8;
+ }
+}
+
+message BuffInfo {
+ uint32 buff_id = 1;
+ uint32 level = 2;
+ uint64 add_time_ms = 3;
+ float life_time = 4;
+ uint32 count = 5;
+ uint32 caster_avatar_id = 6;
+ map dynamic_values = 7;
+}
+
+message SceneInfo {
+ uint32 map_id = 1;
+ uint32 plane_id = 2;
+ uint32 floor_id = 3;
+ repeated SceneEntityInfo entity_list = 4;
+ repeated uint32 lighten_section_list = 5;
+ uint32 leader_entity_id = 6;
+ uint32 entry_id = 7;
+ repeated BuffInfo env_buff_list = 8;
+}
+
+message EntityMotion {
+ uint32 entity_id = 1;
+ MotionInfo motion = 2;
+}
+
+message SceneEntityMoveCsReq {
+ repeated EntityMotion entity_motion_list = 1;
+ uint32 entry_id = 2;
+}
+
+message SceneEntityMoveScRsp { uint32 retcode = 1; }
+
+message SceneEntityMoveScNotify {
+ uint32 entity_id = 1;
+ MotionInfo motion = 2;
+}
+
+message InteractPropCsReq {
+ uint32 prop_entity_id = 1;
+ uint32 interact_id = 2;
+}
+
+message InteractPropScRsp {
+ uint32 retcode = 1;
+ uint32 prop_entity_id = 2;
+ uint32 prop_state = 3;
+}
+
+message SceneCastSkillCsReq {
+ uint32 cast_entity_id = 1;
+ uint32 skill_index = 2;
+ uint32 ability_target_entity_id = 3;
+ repeated uint32 hit_target_entity_id_list = 4;
+ repeated uint32 assist_monster_entity_id_list = 5;
+ MotionInfo target_motion = 6;
+}
+
+message SceneCastSkillScRsp {
+ uint32 retcode = 1;
+ SceneBattleInfo battle_info = 2;
+}
+
+message SceneEnterStageCsReq { uint32 stage_id = 1; }
+
+message SceneEnterStageScRsp {
+ uint32 retcode = 1;
+ SceneBattleInfo battle_info = 2;
+}
+
+message GetCurSceneInfoCsReq {}
+
+message GetCurSceneInfoScRsp {
+ uint32 retcode = 1;
+ SceneInfo scene = 2;
+}
+
+message SceneEntityUpdateScNotify { repeated SceneEntityInfo entity_list = 1; }
+
+message SceneEntityDisappearScNotify { repeated uint32 entity_id_list = 1; }
+
+message WaitCustomStringCsReq {
+ string custom_string = 3;
+
+ oneof key {
+ uint32 prop_entity_id = 1;
+ uint32 sub_mission_id = 2;
+ }
+}
+
+message WaitCustomStringScRsp {
+ uint32 retcode = 1;
+ string custom_string = 4;
+
+ oneof key {
+ uint32 prop_entity_id = 2;
+ uint32 sub_mission_id = 3;
+ }
+}
+
+message SpringTransferCsReq {
+ uint32 plane_id = 1;
+ uint32 floor_id = 2;
+ uint32 prop_entity_id = 3;
+}
+
+message SpringTransferScRsp { uint32 retcode = 1; }
+
+message UpdateBuffScNotify {
+ uint32 entity_id = 1;
+ BuffInfo buff = 2;
+}
+
+message DelBuffScNotify {
+ uint32 entity_id = 1;
+ uint32 buff_id = 2;
+}
+
+message SpringRefreshCsReq {
+ uint32 plane_id = 1;
+ uint32 floor_id = 2;
+ uint32 prop_entity_id = 3;
+}
+
+message SpringRefreshScRsp { uint32 retcode = 1; }
+
+message LastSpringRefreshTimeNotify { uint32 last_time = 1; }
+
+message ReturnLastTownCsReq {}
+
+message ReturnLastTownScRsp {
+ uint32 retcode = 1;
+ SceneInfo scene = 2;
+}
+
+message EnterSectionCsReq { uint32 section_id = 1; }
+
+message EnterSectionScRsp { uint32 retcode = 1; }
+
+message SetCurInteractEntityCsReq { uint32 entity_id = 1; }
+
+message SetCurInteractEntityScRsp { uint32 retcode = 1; }
+
+message RecoverAllLineupCsReq {}
+
+message RecoverAllLineupScRsp { uint32 retcode = 1; }
+
+message SavePointsInfoNotify {
+ uint32 valid_times = 1;
+ uint32 refresh_time = 2;
+}
+
+message StartCocoonStageCsReq {
+ uint32 prop_entity_id = 1;
+ uint32 cocoon_id = 2;
+ uint32 wave = 3;
+}
+
+message StartCocoonStageScRsp {
+ uint32 retcode = 1;
+ SceneBattleInfo battle_info = 2;
+ uint32 prop_entity_id = 3;
+ uint32 cocoon_id = 4;
+ uint32 wave = 5;
+}
+
+message EntityBindPropCsReq {
+ bool is_bind = 1;
+ MotionInfo motion = 2;
+}
+
+message EntityBindPropScRsp { uint32 retcode = 1; }
+
+message SetClientPausedCsReq { bool paused = 1; }
+
+message SetClientPausedScRsp {
+ uint32 retcode = 1;
+ bool paused = 2;
+}
+
+message PropBeHitCsReq { uint32 prop_entity_id = 1; }
+
+message PropBeHitScRsp {
+ uint32 retcode = 1;
+ uint32 prop_entity_id = 2;
+}
+
+enum CmdSceneType {
+ CmdSceneTypeNone = 0;
+ CmdSceneEntityMoveCsReq = 1401;
+ CmdSceneEntityMoveScRsp = 1402;
+ CmdInteractPropCsReq = 1403;
+ CmdInteractPropScRsp = 1404;
+ CmdSceneCastSkillCsReq = 1405;
+ CmdSceneCastSkillScRsp = 1406;
+ CmdGetCurSceneInfoCsReq = 1407;
+ CmdGetCurSceneInfoScRsp = 1408;
+ CmdSceneEntityUpdateScNotify = 1409;
+ CmdSceneEntityDisappearScNotify = 1410;
+ CmdSceneEntityMoveScNotify = 1411;
+ CmdWaitCustomStringCsReq = 1412;
+ CmdWaitCustomStringScRsp = 1413;
+ CmdSpringTransferCsReq = 1414;
+ CmdSpringTransferScRsp = 1415;
+ CmdUpdateBuffScNotify = 1416;
+ CmdDelBuffScNotify = 1417;
+ CmdSpringRefreshCsReq = 1418;
+ CmdSpringRefreshScRsp = 1419;
+ CmdLastSpringRefreshTimeNotify = 1420;
+ CmdReturnLastTownCsReq = 1421;
+ CmdReturnLastTownScRsp = 1422;
+ CmdSceneEnterStageCsReq = 1423;
+ CmdSceneEnterStageScRsp = 1424;
+ CmdEnterSectionCsReq = 1427;
+ CmdEnterSectionScRsp = 1428;
+ CmdSetCurInteractEntityCsReq = 1431;
+ CmdSetCurInteractEntityScRsp = 1432;
+ CmdRecoverAllLineupCsReq = 1433;
+ CmdRecoverAllLineupScRsp = 1434;
+ CmdSavePointsInfoNotify = 1435;
+ CmdStartCocoonStageCsReq = 1436;
+ CmdStartCocoonStageScRsp = 1437;
+ CmdEntityBindPropCsReq = 1438;
+ CmdEntityBindPropScRsp = 1439;
+ CmdSetClientPausedCsReq = 1440;
+ CmdSetClientPausedScRsp = 1441;
+ CmdPropBeHitCsReq = 1442;
+ CmdPropBeHitScRsp = 1443;
+}
+
+message Shop {
+ uint32 shop_id = 1;
+ uint32 begin_time = 2;
+ uint32 end_time = 3;
+ repeated Goods goods_list = 4;
+}
+
+message Goods {
+ uint32 goods_id = 1;
+ uint32 buy_times = 2;
+ uint32 begin_time = 3;
+ uint32 end_time = 4;
+}
+
+message GetShopListCsReq { uint32 shop_type = 1; }
+
+message GetShopListScRsp {
+ uint32 retcode = 1;
+ repeated Shop shop_list = 2;
+ uint32 shop_type = 3;
+}
+
+message BuyGoodsCsReq {
+ uint32 shop_id = 1;
+ uint32 goods_id = 2;
+ uint32 goods_num = 3;
+}
+
+message BuyGoodsScRsp {
+ uint32 retcode = 1;
+ uint32 shop_id = 2;
+ uint32 goods_id = 3;
+ uint32 goods_buy_times = 4;
+}
+
+enum CmdShopType {
+ CmdShopTypeNone = 0;
+ CmdGetShopListCsReq = 1501;
+ CmdGetShopListScRsp = 1502;
+ CmdBuyGoodsCsReq = 1503;
+ CmdBuyGoodsScRsp = 1504;
+}
+
+message Stage {
+ uint32 id = 1;
+ uint32 win_times = 2;
+ uint32 challenge_value = 3;
+}
+
+message GetStageDataCsReq { repeated uint32 stage_id_list = 1; }
+
+message GetStageDataScRsp {
+ uint32 retcode = 1;
+ repeated Stage stage_list = 2;
+ bool is_all = 3;
+}
+
+message StageBeginCsReq {
+ uint32 stage_id = 1;
+ uint32 lineup_index = 2;
+}
+
+message StageBeginScRsp {
+ uint32 retcode = 1;
+ uint32 logic_random_seed = 2;
+ uint32 stage_id = 3;
+ repeated BattleAvatar battle_avatar_list = 4;
+}
+
+enum CmdStageType {
+ CmdStageTypeNone = 0;
+ CmdGetStageDataCsReq = 201;
+ CmdGetStageDataScRsp = 202;
+ CmdStageBeginCsReq = 203;
+ CmdStageBeginScRsp = 204;
+}
+
+message BasicModuleSync { uint32 stamina = 1; }
+
+message AvatarSync { repeated Avatar avatar_list = 1; }
+
+message MissionSync {
+ repeated Mission mission_list = 1;
+ repeated uint32 finished_main_mission_id_list = 2;
+ repeated uint32 del_mission_id_list = 3;
+ repeated uint32 del_main_mission_id_list = 4;
+}
+
+message PlayerSyncScNotify {
+ PlayerBasicInfo basic_info = 1;
+ AvatarSync avatar_sync = 2;
+ repeated Equipment equipment_list = 3;
+ repeated uint32 del_equipment_list = 4;
+ repeated Material material_list = 5;
+ repeated Quest quest_list = 6;
+ MissionSync mission_sync = 7;
+ BasicModuleSync basic_module_sync = 8;
+}
+
+enum CmdPlayerSyncType {
+ CmdPlayerSyncNone = 0;
+ CmdPlayerSyncScNotify = 601;
+}
+
+message Tutorial {
+ uint32 id = 1;
+ TutorialStatus status = 2;
+}
+
+message TutorialGuide {
+ uint32 id = 1;
+ TutorialStatus status = 2;
+}
+
+message GetTutorialCsReq {}
+
+message GetTutorialScRsp {
+ uint32 retcode = 1;
+ repeated Tutorial tutorial_list = 2;
+}
+
+message GetTutorialGuideCsReq {}
+
+message GetTutorialGuideScRsp {
+ uint32 retcode = 1;
+ repeated TutorialGuide tutorial_guide_list = 2;
+}
+
+message UnlockTutorialCsReq { uint32 tutorial_id = 1; }
+
+message UnlockTutorialScRsp {
+ uint32 retcode = 1;
+ Tutorial tutorial = 2;
+}
+
+message UnlockTutorialGuideCsReq { uint32 group_id = 1; }
+
+message UnlockTutorialGuideScRsp {
+ uint32 retcode = 1;
+ TutorialGuide tutorial_guide = 2;
+}
+
+message FinishTutorialCsReq { uint32 tutorial_id = 1; }
+
+message FinishTutorialScRsp {
+ uint32 retcode = 1;
+ Tutorial tutorial = 2;
+}
+
+message FinishTutorialGuideCsReq { uint32 group_id = 1; }
+
+message FinishTutorialGuideScRsp {
+ uint32 retcode = 1;
+ TutorialGuide tutorial_guide = 2;
+ RewardData reward = 3;
+}
+
+enum CmdTutorialType {
+ CmdTutorialTypeNone = 0;
+ CmdGetTutorialCsReq = 1601;
+ CmdGetTutorialScRsp = 1602;
+ CmdGetTutorialGuideCsReq = 1603;
+ CmdGetTutorialGuideScRsp = 1604;
+ CmdUnlockTutorialCsReq = 1605;
+ CmdUnlockTutorialScRsp = 1606;
+ CmdUnlockTutorialGuideCsReq = 1607;
+ CmdUnlockTutorialGuideScRsp = 1608;
+ CmdFinishTutorialCsReq = 1609;
+ CmdFinishTutorialScRsp = 1610;
+ CmdFinishTutorialGuideCsReq = 1611;
+ CmdFinishTutorialGuideScRsp = 1612;
+}
+
+enum TutorialStatus {
+ TUTORIAL_NONE = 0;
+ TUTORIAL_UNLOCK = 1;
+ TUTORIAL_FINISH = 2;
+}
+
+message Waypoint {
+ uint32 id = 1;
+ uint32 finish_times = 2;
+ bool is_new = 3;
+}
+
+message ChapterBrief {
+ uint32 id = 1;
+ uint32 finish_challenge_num = 2;
+ repeated uint32 taken_reward_id_list = 3;
+ bool is_new = 4;
+}
+
+message Chapter {
+ ChapterBrief brief_info = 1;
+ repeated Waypoint waypoint_list = 2;
+}
+
+message GetWaypointCsReq { uint32 chapter_id = 1; }
+
+message GetWaypointScRsp {
+ uint32 retcode = 1;
+ Chapter chapter = 2;
+ uint32 cur_waypoint_id = 3;
+}
+
+message SetCurWaypointCsReq { uint32 waypoint_id = 1; }
+
+message SetCurWaypointScRsp {
+ uint32 retcode = 1;
+ uint32 cur_waypoint_id = 2;
+}
+
+message GetChapterCsReq {}
+
+message GetChapterScRsp {
+ uint32 retcode = 1;
+ repeated ChapterBrief chapter_list = 2;
+ uint32 cur_waypoint_id = 3;
+}
+
+message WaypointShowNewCsNotify {
+ uint32 waypoint_id = 1;
+ uint32 chapter_id = 2;
+}
+
+message TakeChapterRewardCsReq {
+ uint32 chapter_id = 1;
+ uint32 chapter_reward_id = 2;
+}
+
+message TakeChapterRewardScRsp {
+ uint32 retcode = 1;
+ uint32 chapter_id = 2;
+ uint32 chapter_reward_id = 3;
+}
+
+enum CmdWaypointType {
+ CmdWaypointTypeNone = 0;
+ CmdGetWaypointCsReq = 401;
+ CmdGetWaypointScRsp = 402;
+ CmdSetCurWaypointCsReq = 403;
+ CmdSetCurWaypointScRsp = 404;
+ CmdGetChapterCsReq = 405;
+ CmdGetChapterScRsp = 406;
+ CmdWaypointShowNewCsNotify = 407;
+ CmdTakeChapterRewardCsReq = 408;
+ CmdTakeChapterRewardScRsp = 409;
+}
+
+enum WaypointType {
+ WAYPOINT_TYPE_NONE = 0;
+ WAYPOINT_TYPE_STAGE = 1;
+ WAYPOINT_TYPE_PLOT = 2;
+}
+
+enum WaypointUnlockType {
+ WAYPOINT_UNLOCK_NONE = 0;
+ WAYPOINT_UNLOCK_PRE = 1;
+ WAYPOINT_UNLOCK_LEVEL = 2;
+}
+
+message PacketHead {
+ uint32 packet_id = 1;
+ uint32 sign_type = 2;
+ uint32 sign = 3;
+ uint32 user_id = 4;
+ uint32 src_addr = 5;
+ uint32 dst_addr = 6;
+ uint32 dispatch_type = 7;
+ uint32 server_type = 8;
+ uint32 dispatch_key = 9;
+ uint32 user_session_id = 10;
+ uint32 id = 11;
+ uint32 coroutine_id = 12;
+ uint32 hop_cnt = 13;
+}
+
+enum DispatchType {
+ DISPATCH_TYPE_NONE = 0;
+ DISPATCH_TYPE_BY_ADDR = 1;
+ DISPATCH_TYPE_BY_MOD = 2;
+ DISPATCH_TYPE_BY_RAND = 3;
+ DISPATCH_TYPE_BY_CHASH = 4;
+ DISPATCH_TYPE_BY_STICKY_SESSION = 5;
+ DISPATCH_TYPE_BY_OBJECT = 6;
+}
\ No newline at end of file
diff --git a/RPG.Network.Proto/server_only.proto b/RPG.Network.Proto/server_only.proto
new file mode 100644
index 0000000..c892c55
--- /dev/null
+++ b/RPG.Network.Proto/server_only.proto
@@ -0,0 +1,23 @@
+syntax = "proto3";
+option csharp_namespace = "RPG.Network.Proto";
+
+enum RPGServiceType
+{
+ SERVICE_TYPE_NONE = 0;
+ SERVICE_TYPE_SDK = 1;
+ SERVICE_TYPE_GATESERVER = 2;
+ SERVICE_TYPE_GAMESERVER = 3;
+}
+
+message ActionMetadata
+{
+ RPGServiceType sender_type = 1;
+ uint64 session_id = 2;
+ uint32 player_uid = 3;
+}
+
+message ForwardGameMessageNotify
+{
+ uint32 cmd_type = 1;
+ bytes payload = 2;
+}
\ No newline at end of file
diff --git a/RPG.Services.Core/RPG.Services.Core.csproj b/RPG.Services.Core/RPG.Services.Core.csproj
new file mode 100644
index 0000000..6b584d4
--- /dev/null
+++ b/RPG.Services.Core/RPG.Services.Core.csproj
@@ -0,0 +1,18 @@
+
+
+
+ net8.0
+ enable
+ enable
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/RPG.Services.Core/RPGServiceBase.cs b/RPG.Services.Core/RPGServiceBase.cs
new file mode 100644
index 0000000..6a29dd4
--- /dev/null
+++ b/RPG.Services.Core/RPGServiceBase.cs
@@ -0,0 +1,15 @@
+using Microsoft.Extensions.Hosting;
+
+namespace RPG.Services.Core;
+public abstract class RPGServiceBase : IHostedService
+{
+ public virtual Task StartAsync(CancellationToken cancellationToken)
+ {
+ throw new NotImplementedException();
+ }
+
+ public virtual Task StopAsync(CancellationToken cancellationToken)
+ {
+ throw new NotImplementedException();
+ }
+}
diff --git a/RPG.Services.Gameserver/Program.cs b/RPG.Services.Gameserver/Program.cs
new file mode 100644
index 0000000..98f13a6
--- /dev/null
+++ b/RPG.Services.Gameserver/Program.cs
@@ -0,0 +1,9 @@
+namespace RPG.Services.Gameserver;
+
+internal class Program
+{
+ static void Main(string[] args)
+ {
+ Console.WriteLine("Hello, World!");
+ }
+}
diff --git a/RPG.Services.Gameserver/RPG.Services.Gameserver.csproj b/RPG.Services.Gameserver/RPG.Services.Gameserver.csproj
new file mode 100644
index 0000000..2150e37
--- /dev/null
+++ b/RPG.Services.Gameserver/RPG.Services.Gameserver.csproj
@@ -0,0 +1,10 @@
+
+
+
+ Exe
+ net8.0
+ enable
+ enable
+
+
+
diff --git a/RPG.Services.Gateserver/Program.cs b/RPG.Services.Gateserver/Program.cs
new file mode 100644
index 0000000..00230ad
--- /dev/null
+++ b/RPG.Services.Gateserver/Program.cs
@@ -0,0 +1,9 @@
+namespace RPG.Services.Gateserver;
+
+internal class Program
+{
+ static void Main(string[] args)
+ {
+ Console.WriteLine("Hello, World!");
+ }
+}
diff --git a/RPG.Services.Gateserver/RPG.Services.Gateserver.csproj b/RPG.Services.Gateserver/RPG.Services.Gateserver.csproj
new file mode 100644
index 0000000..2150e37
--- /dev/null
+++ b/RPG.Services.Gateserver/RPG.Services.Gateserver.csproj
@@ -0,0 +1,10 @@
+
+
+
+ Exe
+ net8.0
+ enable
+ enable
+
+
+
diff --git a/RPG.Services.SDK/Handlers/AuthHandler.cs b/RPG.Services.SDK/Handlers/AuthHandler.cs
new file mode 100644
index 0000000..18e6763
--- /dev/null
+++ b/RPG.Services.SDK/Handlers/AuthHandler.cs
@@ -0,0 +1,59 @@
+using Microsoft.AspNetCore.Http.HttpResults;
+using RPG.Services.SDK.Models.Auth;
+
+namespace RPG.Services.SDK.Handlers;
+
+public static class AuthHandler
+{
+ public static JsonHttpResult LoginWithPassword(string productName)
+ {
+ _ = productName;
+
+ return TypedResults.Json(new MdkLoginRsp
+ {
+ Retcode = 0,
+ Message = "OK",
+ Data = new MdkLoginRsp.LoginData
+ {
+ Account = new MdkLoginRsp.MdkAccount
+ {
+ Name = "Snowflake Player",
+ Token = "mostsecuretokenever",
+ Uid = "1337"
+ }
+ }
+ });
+ }
+
+ public static JsonHttpResult OnGranterVerification(string productName)
+ {
+ _ = productName;
+
+ return TypedResults.Json(new GranterVerificationRsp
+ {
+ Retcode = 0,
+ Message = "OK",
+ Data = new GranterVerificationRsp.GranterData
+ {
+ ComboId = 1,
+ OpenId = 1337,
+ ComboToken = "mostsecuretokenever",
+ AccountType = 1
+ }
+ });
+ }
+
+ public static JsonHttpResult OnRiskyApiCheck()
+ {
+ return TypedResults.Json(new RiskyApiCheckRsp
+ {
+ Retcode = 0,
+ Message = "OK",
+ Data = new RiskyApiCheckRsp.Info
+ {
+ Id = "06611ed14c3131a676b19c0d34c0644b",
+ Action = "ACTION_NONE"
+ }
+ });
+ }
+}
diff --git a/RPG.Services.SDK/Handlers/DispatchHandler.cs b/RPG.Services.SDK/Handlers/DispatchHandler.cs
new file mode 100644
index 0000000..c6d03bf
--- /dev/null
+++ b/RPG.Services.SDK/Handlers/DispatchHandler.cs
@@ -0,0 +1,52 @@
+using Microsoft.AspNetCore.Http.HttpResults;
+using RPG.Services.SDK.Models;
+using RPG.Services.SDK.Models.Region;
+
+namespace RPG.Services.SDK.Handlers;
+
+public static class DispatchHandler
+{
+ private const string QueryGatewayUrl = "http://127.0.0.1:8888/query_gateway";
+
+ public static JsonHttpResult OnQueryDispatch()
+ {
+ return TypedResults.Json(new QueryDispatchHttpRsp
+ {
+ Retcode = 0,
+ TopServerRegionName = "Snowflake",
+ RegionList =
+ [
+ new RegionInfo
+ {
+ EnvType = "2",
+ DispatchUrl = QueryGatewayUrl,
+ Name = "Snowflake",
+ Title = "Snowflake"
+ }
+ ]
+ });
+ }
+
+ public static JsonHttpResult OnQueryGateway()
+ {
+ return TypedResults.Json(new QueryGatewayHttpRsp
+ {
+ Retcode = 0,
+ Message = "OK",
+ AsbRelogin = 1,
+ RegionName = "Snowflake",
+ Gateway = new GatewayInfo
+ {
+ Ip = "127.0.0.1",
+ Port = 20301
+ },
+ Ext = new ExtAssetInfo
+ {
+ UpdateStreamingAsb = "0",
+ DataUseAssetBundle = "0",
+ ForbidRecharge = "0",
+ ResUseAssetBundle = "0"
+ }
+ });
+ }
+}
diff --git a/RPG.Services.SDK/Models/Auth/GranterVerificationRsp.cs b/RPG.Services.SDK/Models/Auth/GranterVerificationRsp.cs
new file mode 100644
index 0000000..0773a90
--- /dev/null
+++ b/RPG.Services.SDK/Models/Auth/GranterVerificationRsp.cs
@@ -0,0 +1,42 @@
+using System.Text.Json.Serialization;
+
+namespace RPG.Services.SDK.Models.Auth;
+
+public record GranterVerificationRsp
+{
+ [JsonPropertyName("retcode")]
+ public required int Retcode { get; init; }
+
+ [JsonPropertyName("message")]
+ public required string Message { get; init; }
+
+ [JsonPropertyName("data")]
+ public GranterData? Data { get; init; }
+
+ public record GranterData
+ {
+ [JsonPropertyName("combo_id")]
+ public required int ComboId { get; init; }
+
+ [JsonPropertyName("open_id")]
+ public required int OpenId { get; init; }
+
+ [JsonPropertyName("combo_token")]
+ public required string ComboToken { get; init; }
+
+ [JsonPropertyName("heartbeat")]
+ public bool Heartbeat { get; init; }
+
+ [JsonPropertyName("account_type")]
+ public required int AccountType { get; init; }
+
+ [JsonPropertyName("data")]
+ public GuestLoginData Data { get; } = new();
+ }
+
+ public record GuestLoginData
+ {
+ [JsonPropertyName("guest")]
+ public bool Guest { get; init; }
+ }
+}
diff --git a/RPG.Services.SDK/Models/Auth/MdkLoginRsp.cs b/RPG.Services.SDK/Models/Auth/MdkLoginRsp.cs
new file mode 100644
index 0000000..c51be48
--- /dev/null
+++ b/RPG.Services.SDK/Models/Auth/MdkLoginRsp.cs
@@ -0,0 +1,33 @@
+using System.Text.Json.Serialization;
+
+namespace RPG.Services.SDK.Models.Auth;
+
+public record MdkLoginRsp
+{
+ [JsonPropertyName("retcode")]
+ public required int Retcode { get; init; }
+
+ [JsonPropertyName("message")]
+ public required string Message { get; init; }
+
+ [JsonPropertyName("data")]
+ public required LoginData Data { get; init; }
+
+ public record MdkAccount
+ {
+ [JsonPropertyName("name")]
+ public required string Name { get; init; }
+
+ [JsonPropertyName("token")]
+ public required string Token { get; init; }
+
+ [JsonPropertyName("uid")]
+ public required string Uid { get; init; }
+ }
+
+ public record LoginData
+ {
+ [JsonPropertyName("account")]
+ public MdkAccount? Account { get; init; }
+ }
+}
diff --git a/RPG.Services.SDK/Models/Auth/RiskyApiCheckRsp.cs b/RPG.Services.SDK/Models/Auth/RiskyApiCheckRsp.cs
new file mode 100644
index 0000000..9f873a1
--- /dev/null
+++ b/RPG.Services.SDK/Models/Auth/RiskyApiCheckRsp.cs
@@ -0,0 +1,24 @@
+using System.Text.Json.Serialization;
+
+namespace RPG.Services.SDK.Models.Auth;
+
+public record RiskyApiCheckRsp
+{
+ [JsonPropertyName("retcode")]
+ public required int Retcode { get; init; }
+
+ [JsonPropertyName("message")]
+ public required string Message { get; init; }
+
+ [JsonPropertyName("data")]
+ public required Info Data { get; init; }
+
+ public record Info
+ {
+ [JsonPropertyName("id")]
+ public required string Id { get; init; }
+
+ [JsonPropertyName("action")]
+ public required string Action { get; init; }
+ }
+}
diff --git a/RPG.Services.SDK/Models/Region/ExtAssetInfo.cs b/RPG.Services.SDK/Models/Region/ExtAssetInfo.cs
new file mode 100644
index 0000000..71b5257
--- /dev/null
+++ b/RPG.Services.SDK/Models/Region/ExtAssetInfo.cs
@@ -0,0 +1,18 @@
+using System.Text.Json.Serialization;
+
+namespace RPG.Services.SDK.Models.Region;
+
+public record ExtAssetInfo
+{
+ [JsonPropertyName("data_use_asset_bundle")]
+ public required string DataUseAssetBundle { get; set; }
+
+ [JsonPropertyName("forbid_recharge")]
+ public required string ForbidRecharge { get; set; }
+
+ [JsonPropertyName("res_use_asset_bundle")]
+ public required string ResUseAssetBundle { get; set; }
+
+ [JsonPropertyName("update_streaming_asb")]
+ public required string UpdateStreamingAsb { get; set; }
+}
diff --git a/RPG.Services.SDK/Models/Region/GatewayInfo.cs b/RPG.Services.SDK/Models/Region/GatewayInfo.cs
new file mode 100644
index 0000000..db328ec
--- /dev/null
+++ b/RPG.Services.SDK/Models/Region/GatewayInfo.cs
@@ -0,0 +1,12 @@
+using System.Text.Json.Serialization;
+
+namespace RPG.Services.SDK.Models.Region;
+
+public record GatewayInfo
+{
+ [JsonPropertyName("ip")]
+ public required string Ip { get; set; }
+
+ [JsonPropertyName("port")]
+ public required int Port { get; set; }
+}
diff --git a/RPG.Services.SDK/Models/Region/QueryDispatchHttpRsp.cs b/RPG.Services.SDK/Models/Region/QueryDispatchHttpRsp.cs
new file mode 100644
index 0000000..9c93ea4
--- /dev/null
+++ b/RPG.Services.SDK/Models/Region/QueryDispatchHttpRsp.cs
@@ -0,0 +1,15 @@
+using System.Text.Json.Serialization;
+
+namespace RPG.Services.SDK.Models.Region;
+
+public record QueryDispatchHttpRsp
+{
+ [JsonPropertyName("retcode")]
+ public int Retcode { get; set; }
+
+ [JsonPropertyName("region_list")]
+ public List RegionList { get; set; } = [];
+
+ [JsonPropertyName("top_server_region_name")]
+ public required string TopServerRegionName { get; set; }
+}
diff --git a/RPG.Services.SDK/Models/Region/QueryGatewayHttpRsp.cs b/RPG.Services.SDK/Models/Region/QueryGatewayHttpRsp.cs
new file mode 100644
index 0000000..807425c
--- /dev/null
+++ b/RPG.Services.SDK/Models/Region/QueryGatewayHttpRsp.cs
@@ -0,0 +1,48 @@
+using System.Text.Json.Serialization;
+
+namespace RPG.Services.SDK.Models.Region;
+
+public record QueryGatewayHttpRsp
+{
+ [JsonPropertyName("asb_memo")]
+ public string AsbMemo { get; set; } = string.Empty;
+
+ [JsonPropertyName("asb_relogin")]
+ public int AsbRelogin { get; set; }
+
+ [JsonPropertyName("asset_bundle_url")]
+ public string AssetBundleUrl { get; set; } = string.Empty;
+
+ [JsonPropertyName("client_secret_key")]
+ public string ClientSecretKey { get; set; } = string.Empty;
+
+ [JsonPropertyName("design_data_memo")]
+ public string DesignDataMemo { get; set; } = string.Empty;
+
+ [JsonPropertyName("ex_resource_url")]
+ public string ExResourceUrl { get; set; } = string.Empty;
+
+ [JsonPropertyName("ext")]
+ public required ExtAssetInfo Ext { get; set; }
+
+ [JsonPropertyName("gateway")]
+ public required GatewayInfo Gateway { get; set; }
+
+ [JsonPropertyName("lua_url")]
+ public string LuaUrl { get; set; } = string.Empty;
+
+ [JsonPropertyName("region_name")]
+ public required string RegionName { get; set; }
+
+ [JsonPropertyName("retcode")]
+ public required int Retcode { get; set; }
+
+ [JsonPropertyName("message")]
+ public required string Message { get; set; }
+
+ [JsonPropertyName("stopBeginTime")]
+ public int StopBeginTime { get; set; }
+
+ [JsonPropertyName("stopEndTime")]
+ public int StopEndTime { get; set; }
+}
diff --git a/RPG.Services.SDK/Models/Region/RegionInfo.cs b/RPG.Services.SDK/Models/Region/RegionInfo.cs
new file mode 100644
index 0000000..12602dc
--- /dev/null
+++ b/RPG.Services.SDK/Models/Region/RegionInfo.cs
@@ -0,0 +1,18 @@
+using System.Text.Json.Serialization;
+
+namespace RPG.Services.SDK.Models.Region;
+
+public record RegionInfo
+{
+ [JsonPropertyName("env_type")]
+ public required string EnvType { get; set; }
+
+ [JsonPropertyName("dispatch_url")]
+ public required string DispatchUrl { get; set; }
+
+ [JsonPropertyName("name")]
+ public required string Name { get; set; }
+
+ [JsonPropertyName("title")]
+ public required string Title { get; set; }
+}
diff --git a/RPG.Services.SDK/Program.cs b/RPG.Services.SDK/Program.cs
new file mode 100644
index 0000000..aabf0e5
--- /dev/null
+++ b/RPG.Services.SDK/Program.cs
@@ -0,0 +1,25 @@
+using RPG.Services.SDK.Handlers;
+
+namespace RPG.Services.SDK;
+
+internal static class Program
+{
+ private static async Task Main(string[] args)
+ {
+ Console.Title = "Snowflake | SDK";
+
+ WebApplicationBuilder builder = WebApplication.CreateBuilder(args);
+
+ builder.WebHost.UseUrls("http://*:8888");
+ WebApplication app = builder.Build();
+
+ app.MapGet("/query_dispatch", DispatchHandler.OnQueryDispatch);
+ app.MapGet("/query_gateway", DispatchHandler.OnQueryGateway);
+
+ app.MapPost("/account/risky/api/check", AuthHandler.OnRiskyApiCheck);
+ app.MapPost("/{productName}/mdk/shield/api/login", AuthHandler.LoginWithPassword);
+ app.MapPost("/{productName}/combo/granter/login/v2/login", AuthHandler.OnGranterVerification);
+
+ await app.RunAsync();
+ }
+}
diff --git a/RPG.Services.SDK/Properties/launchSettings.json b/RPG.Services.SDK/Properties/launchSettings.json
new file mode 100644
index 0000000..6ea335a
--- /dev/null
+++ b/RPG.Services.SDK/Properties/launchSettings.json
@@ -0,0 +1,12 @@
+{
+ "profiles": {
+ "RPG.Services.SDK": {
+ "commandName": "Project",
+ "launchBrowser": true,
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ },
+ "applicationUrl": "https://localhost:52654;http://localhost:52655"
+ }
+ }
+}
\ No newline at end of file
diff --git a/RPG.Services.SDK/RPG.Services.SDK.csproj b/RPG.Services.SDK/RPG.Services.SDK.csproj
new file mode 100644
index 0000000..791df35
--- /dev/null
+++ b/RPG.Services.SDK/RPG.Services.SDK.csproj
@@ -0,0 +1,10 @@
+
+
+
+ Exe
+ net8.0
+ enable
+ enable
+
+
+
diff --git a/Snowflake.sln b/Snowflake.sln
new file mode 100644
index 0000000..5b3e1f1
--- /dev/null
+++ b/Snowflake.sln
@@ -0,0 +1,67 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 17
+VisualStudioVersion = 17.0.31903.59
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RPG.Network.Proto", "RPG.Network.Proto\RPG.Network.Proto.csproj", "{7DA70126-3F73-407B-A024-5856F354FA97}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RPG.GameCore", "RPG.GameCore\RPG.GameCore.csproj", "{74042D70-7EA0-4348-9BDB-D1E5D0FC868A}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Framework", "Framework", "{0FF9D567-C413-43F0-9EDF-09D4D36154B7}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Services", "Services", "{F199706E-4A92-4A2F-BDDD-25DA4691D43E}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RPG.Services.SDK", "RPG.Services.SDK\RPG.Services.SDK.csproj", "{855DA130-974F-4CE8-8DB5-2BD59DC2C3AA}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RPG.Services.Gateserver", "RPG.Services.Gateserver\RPG.Services.Gateserver.csproj", "{EB7A2038-E2AF-4565-944C-D850D6AEAEED}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RPG.Services.Gameserver", "RPG.Services.Gameserver\RPG.Services.Gameserver.csproj", "{565F9857-3E97-4363-9A5D-05CED8718116}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RPG.Services.Core", "RPG.Services.Core\RPG.Services.Core.csproj", "{1B434662-DEC9-40C9-A709-CE87026191D9}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {7DA70126-3F73-407B-A024-5856F354FA97}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {7DA70126-3F73-407B-A024-5856F354FA97}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {7DA70126-3F73-407B-A024-5856F354FA97}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {7DA70126-3F73-407B-A024-5856F354FA97}.Release|Any CPU.Build.0 = Release|Any CPU
+ {74042D70-7EA0-4348-9BDB-D1E5D0FC868A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {74042D70-7EA0-4348-9BDB-D1E5D0FC868A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {74042D70-7EA0-4348-9BDB-D1E5D0FC868A}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {74042D70-7EA0-4348-9BDB-D1E5D0FC868A}.Release|Any CPU.Build.0 = Release|Any CPU
+ {855DA130-974F-4CE8-8DB5-2BD59DC2C3AA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {855DA130-974F-4CE8-8DB5-2BD59DC2C3AA}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {855DA130-974F-4CE8-8DB5-2BD59DC2C3AA}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {855DA130-974F-4CE8-8DB5-2BD59DC2C3AA}.Release|Any CPU.Build.0 = Release|Any CPU
+ {EB7A2038-E2AF-4565-944C-D850D6AEAEED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {EB7A2038-E2AF-4565-944C-D850D6AEAEED}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {EB7A2038-E2AF-4565-944C-D850D6AEAEED}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {EB7A2038-E2AF-4565-944C-D850D6AEAEED}.Release|Any CPU.Build.0 = Release|Any CPU
+ {565F9857-3E97-4363-9A5D-05CED8718116}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {565F9857-3E97-4363-9A5D-05CED8718116}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {565F9857-3E97-4363-9A5D-05CED8718116}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {565F9857-3E97-4363-9A5D-05CED8718116}.Release|Any CPU.Build.0 = Release|Any CPU
+ {1B434662-DEC9-40C9-A709-CE87026191D9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {1B434662-DEC9-40C9-A709-CE87026191D9}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {1B434662-DEC9-40C9-A709-CE87026191D9}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {1B434662-DEC9-40C9-A709-CE87026191D9}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(NestedProjects) = preSolution
+ {7DA70126-3F73-407B-A024-5856F354FA97} = {0FF9D567-C413-43F0-9EDF-09D4D36154B7}
+ {74042D70-7EA0-4348-9BDB-D1E5D0FC868A} = {0FF9D567-C413-43F0-9EDF-09D4D36154B7}
+ {855DA130-974F-4CE8-8DB5-2BD59DC2C3AA} = {F199706E-4A92-4A2F-BDDD-25DA4691D43E}
+ {EB7A2038-E2AF-4565-944C-D850D6AEAEED} = {F199706E-4A92-4A2F-BDDD-25DA4691D43E}
+ {565F9857-3E97-4363-9A5D-05CED8718116} = {F199706E-4A92-4A2F-BDDD-25DA4691D43E}
+ {1B434662-DEC9-40C9-A709-CE87026191D9} = {0FF9D567-C413-43F0-9EDF-09D4D36154B7}
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {9B5CE103-882A-419D-8FA3-89C8642687F6}
+ EndGlobalSection
+EndGlobal