feat: Add support for 3.7.5x

This commit is contained in:
amizing25
2025-11-04 23:16:14 +07:00
parent f1ef8d8da2
commit 56bdb1abc1
20 changed files with 59097 additions and 61538 deletions
-1
View File
@@ -1,4 +1,3 @@
#![feature(let_chains)]
use anyhow::Result;
mod net;
+5 -5
View File
@@ -2,12 +2,12 @@ use std::collections::HashMap;
use super::*;
pub static UNLOCKED_AVATARS: [u32; 73] = [
pub static UNLOCKED_AVATARS: [u32; 74] = [
1002, 1003, 1004, 1005, 1006, 1008, 1009, 1013, 1101, 1102, 1103, 1104, 1105, 1106, 1107, 1108,
1109, 1110, 1111, 1112, 1201, 1202, 1203, 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1211, 1212,
1213, 1214, 1215, 1217, 1301, 1302, 1303, 1304, 1305, 1306, 1307, 1308, 1309, 1312, 1315, 1310,
1314, 1218, 1221, 1220, 1222, 1223, 1317, 1313, 1225, 1402, 1401, 1404, 1403, 1405, 1407, 1406,
1409, 1014, 1015, 1408, 1410, 1412, 1413, 1414, 1415
1409, 1014, 1015, 1408, 1410, 1412, 1413, 1414, 1415, 1321,
];
pub async fn on_get_avatar_data_cs_req(
@@ -57,18 +57,18 @@ pub async fn on_get_avatar_data_cs_req(
level: 1,
})
.collect(),
first_met_timestamp: 1712924677,
first_met_time_stamp: 1712924677,
..Default::default()
})
})
.collect();
res.current_multi_path_avatar_id = HashMap::from([
res.cur_avatar_path = HashMap::from([
(8001, json.main_character.get_type().into()),
(1001, json.march_type.get_type().into()),
]);
res.multi_path_avatar_type_info_list = json.get_multi_path_info();
res.multi_path_avatar_info_list = json.get_multi_path_info();
}
pub async fn on_set_avatar_enhanced_id_cs_req(
+68 -68
View File
@@ -1,11 +1,10 @@
use std::collections::HashMap;
use rand::Rng;
use rogue_magic_battle_unit_info::Item;
use common::{
resources::GAME_RES,
structs::{BattleType, Monster, RogueMagicComponentType},
structs::{BattleType, Monster},
};
use super::*;
@@ -50,7 +49,7 @@ pub async fn on_scene_cast_skill_cs_req(
req: &SceneCastSkillCsReq,
res: &mut SceneCastSkillScRsp,
) {
res.attacked_group_id = req.attacked_group_id;
res.cast_entity_id = req.cast_entity_id;
let targets = req
.hit_target_entity_id_list
@@ -64,9 +63,9 @@ pub async fn on_scene_cast_skill_cs_req(
return;
}
let battle_info = create_battle_info(session, req.caster_id, req.skill_index).await;
let battle_info = create_battle_info(session, req.attacked_by_entity_id, req.skill_index).await;
res.attacked_group_id = req.attacked_group_id;
res.cast_entity_id = req.cast_entity_id;
res.battle_info = Some(battle_info);
}
@@ -133,7 +132,7 @@ async fn create_battle_info(
battle_info.buff_list.push(BattleBuff {
id: avatar_config.weakness_buff_id,
level: 1,
owner_id: *avatar_index,
owner_index: *avatar_index,
wave_flag: 0xffffffff,
dynamic_values: HashMap::from([(
String::from("SkillIndex"),
@@ -151,7 +150,7 @@ async fn create_battle_info(
id: 122401,
level: 3,
wave_flag: 0xffffffff,
owner_id: *avatar_index,
owner_index: *avatar_index,
dynamic_values: HashMap::from([
(String::from("#ADF_1"), 3f32),
(String::from("#ADF_2"), 3f32),
@@ -168,7 +167,7 @@ async fn create_battle_info(
if first_avatar_id != 0 {
for buff in battle_info.buff_list.iter_mut() {
if buff.id == 141202 || buff.id == 141403 {
buff.owner_id = first_avatar_id
buff.owner_index = first_avatar_id
}
}
}
@@ -207,7 +206,7 @@ async fn create_battle_info(
id: blessing.id,
level: blessing.level,
wave_flag: 0xffffffff,
owner_id: 0xffffffff,
owner_index: 0xffffffff,
..Default::default()
};
@@ -296,72 +295,73 @@ async fn create_battle_info(
// SU
if player.battle_config.battle_type == BattleType::SU {
battle_info
.event_battle_info_list
.push(BattleEventBattleInfo {
battle_event_id: player.battle_config.path_resonance_id,
status: Some(BattleEventInitedData {
sp_bar: Some(SpBarInfo {
cur_sp: 10_000,
max_sp: 10_000,
}),
battle_info.battle_event.push(BattleEventBattleInfo {
battle_event_id: player.battle_config.path_resonance_id,
status: Some(BattleEventProperty {
sp_bar: Some(SpBarInfo {
cur_sp: 10_000,
max_sp: 10_000,
}),
skill_info: Vec::with_capacity(0),
})
}),
skill_info: Vec::with_capacity(0),
})
}
// Monsters
battle_info.monster_wave_list = Monster::to_scene_monster_waves(&player.battle_config.monsters);
// Rogue Magic
// TODO: i dont need these shit
if !player.battle_config.scepters.is_empty() {
battle_info.rogue_magic_battle_info = Some(RogueMagicBattleInfo {
player_detail_info: Some(RogueMagicBattleUnitInfo {
item: Some(Item::BattleRogueMagicData(BattleRogueMagicData {
round_cnt: Some(BattleRogueMagicRoundCount {
gpojenhaiba: 3,
kljklbmlefo: 0,
}),
battle_scepter_list: player
.battle_config
.scepters
.iter()
.map(|scepter| {
let mut battle_scepter = BattleRogueMagicScepter {
level: scepter.level,
scepter_id: scepter.id,
magic_list: Vec::new(),
trench_count: HashMap::from([(3, 0), (4, 0), (5, 0)]),
};
let mut index = [0u32; 3];
for component in &scepter.components {
let (slot_type, locked) = match component.component_type {
RogueMagicComponentType::Passive => (3u32, false),
RogueMagicComponentType::Active => (4, true),
RogueMagicComponentType::Attach => (5, false),
};
let slot_index = &mut index[slot_type as usize - 3];
battle_scepter.magic_list.push(BattleRogueMagicUnit {
level: component.level,
unit_id: component.id,
slot_id: *slot_index,
locked,
counter_map: Default::default(),
});
*slot_index += 1;
*battle_scepter.trench_count.get_mut(&slot_type).unwrap() += 1;
}
battle_scepter
})
.collect(),
})),
}),
scepter: Some(Plgjihifpag { egmebanhhnf: 5 }),
});
// battle_info.battle_rogue_magic_info = Some(BattleRogueMagicInfo {
// detail_info: Some(BattleRogueMagicDetailInfo {
// paiigoggofj: Some(Item::BattleRogueMagicData(BattleRogueMagicData {
// round_cnt: Some(BattleRogueMagicRoundCount {
// gpojenhaiba: 3,
// kljklbmlefo: 0,
// }),
// battle_scepter_list: player
// .battle_config
// .scepters
// .iter()
// .map(|scepter| {
// let mut battle_scepter = BattleRogueMagicScepter {
// level: scepter.level,
// scepter_id: scepter.id,
// magic_list: Vec::new(),
// trench_count: HashMap::from([(3, 0), (4, 0), (5, 0)]),
// };
//
// let mut index = [0u32; 3];
//
// for component in &scepter.components {
// let (slot_type, locked) = match component.component_type {
// RogueMagicComponentType::Passive => (3u32, false),
// RogueMagicComponentType::Active => (4, true),
// RogueMagicComponentType::Attach => (5, false),
// };
//
// let slot_index = &mut index[slot_type as usize - 3];
// battle_scepter.magic_list.push(BattleRogueMagicUnit {
// level: component.level,
// unit_id: component.id,
// slot_id: *slot_index,
// locked,
// counter_map: Default::default(),
// });
// *slot_index += 1;
// *battle_scepter.trench_count.get_mut(&slot_type).unwrap() += 1;
// }
//
// battle_scepter
// })
// .collect(),
// })),
// }),
// modifier_content: Some(BattleRogueMagicModifierInfo {
// rogue_magic_battle_const: 5,
// }),
// });
}
// Global Buff
@@ -369,7 +369,7 @@ async fn create_battle_info(
battle_info.buff_list.push(BattleBuff {
id: 140703,
level: 1,
owner_id: u32::MAX,
owner_index: u32::MAX,
wave_flag: u32::MAX,
target_index_list: Vec::with_capacity(0),
dynamic_values: HashMap::with_capacity(0),
+33 -32
View File
@@ -20,7 +20,8 @@ pub async fn on_get_friend_login_info_cs_req(
_req: &GetFriendLoginInfoCsReq,
res: &mut GetFriendLoginInfoScRsp,
) {
res.friend_uid_list = vec![SERVER_UID];
res.cmcilifageb = vec![SERVER_UID];
res.gddmgcalkhc = vec![SERVER_UID];
}
pub async fn on_get_friend_list_info_cs_req(
@@ -28,9 +29,9 @@ pub async fn on_get_friend_list_info_cs_req(
_req: &GetFriendListInfoCsReq,
res: &mut GetFriendListInfoScRsp,
) {
res.friend_list = vec![FriendListInfo {
friend_name: String::from("RobinSR"),
simple_info: Some(PlayerSimpleInfo {
res.friend_list = vec![FriendSimpleInfo {
remark_name: String::from("RobinSR"),
player_info: Some(PlayerSimpleInfo {
uid: SERVER_UID,
platform: PlatformType::Pc.into(),
online_status: FriendOnlineStatus::Online.into(),
@@ -42,7 +43,7 @@ pub async fn on_get_friend_list_info_cs_req(
..Default::default()
}),
is_marked: true,
sent_time: 0,
create_time: 0,
..Default::default()
}];
}
@@ -53,18 +54,18 @@ pub async fn on_get_private_chat_history_cs_req(
res: &mut GetPrivateChatHistoryScRsp,
) {
let cur_time = cur_timestamp_ms();
res.chat_list = SERVER_CHAT_HISTORY
res.chat_message_list = SERVER_CHAT_HISTORY
.iter()
.map(|text| Chat {
msg_type: MsgType::CustomText.into(),
sent_time: cur_time,
text: String::from(*text),
sender_uid: SERVER_UID,
.map(|text| ChatMessageData {
message_type: MsgType::CustomText.into(),
create_time: cur_time,
content: String::from(*text),
sender_id: SERVER_UID,
..Default::default()
})
.collect();
res.to_uid = req.to_uid;
res.from_uid = SERVER_UID;
res.target_side = req.target_side;
res.contact_side = SERVER_UID;
}
pub async fn on_send_msg_cs_req(
@@ -77,19 +78,19 @@ pub async fn on_send_msg_cs_req(
return;
};
if let Some((cmd, args)) = parse_command(&body.text) {
if let Some((cmd, args)) = parse_command(&body.message_text) {
match cmd {
"sync" => {
session.sync_player().await;
session
.send(RevcMsgScNotify {
msg_type: body.msg_type,
text: String::from("Inventory Synced"),
emote: body.emote,
from_uid: SERVER_UID,
to_uid: 25,
message_type: body.message_type,
message_text: String::from("Inventory Synced"),
extra_id: body.extra_id,
source_uid: SERVER_UID,
target_uid: 25,
chat_type: body.chat_type,
hnbepabnbng: body.hnbepabnbng,
dijgjpgfflg: body.dijgjpgfflg.clone(),
})
.await
.unwrap();
@@ -117,13 +118,13 @@ pub async fn on_send_msg_cs_req(
session
.send(RevcMsgScNotify {
msg_type: body.msg_type,
text: format!("Success change mc to {mc:#?}"),
emote: body.emote,
from_uid: SERVER_UID,
to_uid: 25,
message_type: body.message_type,
message_text: format!("Success change mc to {mc:#?}"),
extra_id: body.extra_id,
source_uid: SERVER_UID,
target_uid: 25,
chat_type: body.chat_type,
hnbepabnbng: body.hnbepabnbng,
dijgjpgfflg: body.dijgjpgfflg.clone(),
})
.await
.unwrap();
@@ -155,13 +156,13 @@ pub async fn on_send_msg_cs_req(
session
.send(RevcMsgScNotify {
msg_type: body.msg_type,
text: format!("Success change march to {march_type:#?}"),
emote: body.emote,
from_uid: SERVER_UID,
to_uid: 25,
message_type: body.message_type,
message_text: format!("Success change march to {march_type:#?}"),
extra_id: body.extra_id,
source_uid: SERVER_UID,
target_uid: 25,
chat_type: body.chat_type,
hnbepabnbng: body.hnbepabnbng,
dijgjpgfflg: body.dijgjpgfflg.clone(),
})
.await
.unwrap();
+6 -7
View File
@@ -236,7 +236,7 @@ fn equip_relic(player: &mut FreesrData, req: &DressRelicAvatarCsReq) -> Option<P
let mut avatar_ids_to_sy = vec![];
let mut relic_index_to_sync = vec![];
for param in &req.param_list {
for param in &req.switch_list {
let Some(target_relic_idx) = player
.relics
.iter()
@@ -245,10 +245,9 @@ fn equip_relic(player: &mut FreesrData, req: &DressRelicAvatarCsReq) -> Option<P
continue;
};
let cur_avatar_relic_idx = player
.relics
.iter()
.position(|r| r.equip_avatar == target_avatar.avatar_id && r.get_slot() == param.slot);
let cur_avatar_relic_idx = player.relics.iter().position(|r| {
r.equip_avatar == target_avatar.avatar_id && r.get_slot() == param.relic_type
});
// jika avatar sekarang sedang pakai LC, kita tukar pemiliknya dengan pemilik dari LC target
if let Some(cur_avatar_relic_idx) = cur_avatar_relic_idx {
@@ -289,7 +288,7 @@ fn unequip_relic(player: &mut FreesrData, req: &TakeOffRelicCsReq) -> Option<Pla
let mut relic_index_to_sync = vec![];
for slot in &req.slot_list {
for slot in &req.relic_type_list {
let relics = player
.relics
.iter()
@@ -328,7 +327,7 @@ fn build_sync(
.filter_map(|id| player.get_avatar_proto(*id))
.collect::<Vec<_>>();
ret.avatar_sync = Some(AvatarSync { avatar_list });
ret.multi_path_avatar_type_info_list = avatar_ids
ret.multi_path_avatar_info_list = avatar_ids
.into_iter()
.filter_map(|id| player.get_avatar_multipath_proto(id))
.collect();
+5 -5
View File
@@ -76,7 +76,7 @@ pub async fn on_replace_lineup_cs_req(
let lineups = &mut player.lineups;
for (slot, avatar_id) in &mut *lineups {
if let Some(lineup) = req.slots.get(*slot as usize) {
if let Some(lineup) = req.lineup_slot_list.get(*slot as usize) {
*avatar_id = lineup.id;
} else {
*avatar_id = 0;
@@ -131,15 +131,15 @@ async fn refresh_lineup(session: &mut PlayerSession) {
session
.send(SceneGroupRefreshScNotify {
group_refresh_info: vec![SceneGroupRefreshInfo {
group_refresh_list: vec![GroupRefreshInfo {
group_id: 0,
state: 0,
group_refresh_type: SceneGroupRefreshType::Loaded.into(),
refresh_type: SceneGroupRefreshType::Loaded.into(),
refresh_entity: new_entities,
bccgjihncdn: Vec::with_capacity(0),
..Default::default()
}],
floor_id,
gfhglffhfbd: 0,
dimension_id: 0,
})
.await
.unwrap();
+1 -1
View File
@@ -23,7 +23,7 @@ pub async fn on_get_mail_cs_req(
..Default::default()
}],
}),
mail_type: MailType::Normal.into(),
mail_type: 0,
template_id: 0,
}];
}
+13 -13
View File
@@ -43,7 +43,7 @@ use proto::{
CmdMissionType::*, CmdMonopolyType::*, CmdMultiplayerType::*, CmdMultipleDropType::*,
CmdMuseumType::*, CmdOfferingType::*, CmdPamMissionType::*, CmdPhoneType::*,
CmdPlayerBoardType::*, CmdPlayerReturnType::*, CmdPlayerSync::*, CmdPlayerType::*,
CmdPlotType::*, CmdPunkLordType::*, CmdQuestType::*, CmdRaidCollectionType::*, CmdRaidType::*,
CmdPunkLordType::*, CmdQuestType::*, CmdRaidCollectionType::*, CmdRaidType::*,
CmdRechargeGiftType::*, CmdRecommendType::*, CmdRedDotType::*, CmdReplayType::*,
CmdRndOptionType::*, CmdRogueCommonType::*, CmdRogueEndless::*, CmdRogueModifierType::*,
CmdRogueTournType::*, CmdRogueType::*, CmdRollShopType::*, CmdSceneType::*,
@@ -90,7 +90,7 @@ macro_rules! dummy {
dummy! {
// SceneEntityMove,
GetLevelRewardTakenList,
GetRogueScoreRewardInfo,
// GetRogueScoreRewardInfo, // ?3.7.51
// GetGachaInfo,
QueryProductInfo,
GetQuestData,
@@ -98,33 +98,33 @@ dummy! {
// GetFriendListInfo,
// GetFriendApplyListInfo,
GetCurAssist,
GetRogueHandbookData,
// GetRogueHandbookData, // ?3.7.51
GetDailyActiveInfo,
GetFightActivityData,
GetMultipleDropInfo,
GetPlayerReturnMultiDropInfo,
GetShareData,
GetTreasureDungeonActivityData,
PlayerReturnInfoQuery,
// GetMultipleDropInfo, // ?3.7.51
// GetPlayerReturnMultiDropInfo, // ?3.7.51
// GetShareData, // ?3.7.51
// GetTreasureDungeonActivityData, // ?3.7.51
// PlayerReturnInfoQuery, // ?3.7.51
// GetBag,
GetPlayerBoardData,
GetActivityScheduleConfig,
GetMissionData,
GetChallenge,
GetCurChallenge,
GetRogueInfo,
// GetRogueInfo, // ?3.7.51
GetExpeditionData,
// GetRogueDialogueEventData,
GetJukeboxData,
SyncClientResVersion,
DailyFirstMeetPam,
GetMuseumInfo,
// DailyFirstMeetPam, // ?3.7.51
// GetMuseumInfo, // ?3.7.51
GetLoginActivity,
GetRaidInfo,
GetTrialActivityData,
GetBoxingClubInfo,
// GetBoxingClubInfo, // ?3.7.51
GetNpcStatus,
TextJoinQuery,
// TextJoinQuery, // ?3.7.51
// GetSpringRecoverData, // Removed 2.7.51
// GetChatFriendHistory,
GetSecretKeyInfo,
+3 -3
View File
@@ -32,14 +32,14 @@ pub async fn on_player_login_finish_cs_req(
) -> Result<()> {
session
.send(ContentPackageSyncDataScNotify {
data: Some(PackageData {
info_list: [
data: Some(ContentPackageData {
content_package_list: [
200001, 200002, 200003, 200004, 200005, 200006, 200007, 200008, 150017, 150015,
150021, 150018, 130011, 130012, 130013, 150025, 140006, 150026, 130014, 150034,
150029, 150035, 150041, 150039, 150045,
]
.into_iter()
.map(|v| ContentInfo {
.map(|v| ContentPackageInfo {
status: ContentPackageStatus::Finished.into(),
content_id: v,
})
+33 -31
View File
@@ -46,7 +46,7 @@ pub async fn on_enter_scene_cs_req(
.await
.is_err()
{
res.retcode = Retcode::RetSceneEntryIdNotMatch as u32;
res.retcode = 2605;
};
}
@@ -56,19 +56,19 @@ pub async fn on_get_scene_map_info_cs_req(
res: &mut GetSceneMapInfoScRsp,
) {
for floor_id in &req.floor_id_list {
let mut map_info = MazeMapData {
let mut map_info = SceneMapInfo {
retcode: 0,
unlocked_chest_list: vec![
MazeChest {
map_info_chest_type: MapInfoChestType::Normal.into(),
chest_list: vec![
ChestInfo {
chest_type: 101,
..Default::default()
},
MazeChest {
map_info_chest_type: MapInfoChestType::Puzzle.into(),
ChestInfo {
chest_type: 102,
..Default::default()
},
MazeChest {
map_info_chest_type: MapInfoChestType::Challenge.into(),
ChestInfo {
chest_type: 104,
..Default::default()
},
],
@@ -94,37 +94,39 @@ pub async fn on_get_scene_map_info_cs_req(
});
for teleport in group.teleports.keys() {
map_info.unlocked_teleport_list.push(*teleport)
map_info.unlock_teleport_list.push(*teleport)
}
for prop in &group.props {
map_info.maze_prop_list.push(MazeProp {
map_info.maze_prop_list.push(MazePropState {
group_id: prop.group_id,
state: prop.prop_state,
config_id: prop.inst_id,
});
map_info.maze_prop_extra_list.push(MazePropExtra {
group_id: prop.group_id,
state: prop.prop_state,
config_id: prop.inst_id,
extra_info: Option::None,
});
map_info
.maze_prop_extra_state_list
.push(MazePropExtraState {
group_id: prop.group_id,
state: prop.prop_state,
config_id: prop.inst_id,
extra_info: Option::None,
});
}
}
map_info.lighten_section_list = floor_config.sections.clone();
map_info.floor_saved_data = floor_config.saved_values.clone();
// TODO!
map_info
.chest_unlock_progress_list
.push(ChestUnlockProgress {
r#type: 0,
total_chest_count: 25,
unlocked_chest_count: 25,
});
// #TODO!
// map_info
// .chest_unlock_progress_list
// .push(ChestUnlockProgress {
// r#type: 0,
// total_chest_count: 25,
// unlocked_chest_count: 25,
// });
}
res.map_list.push(map_info)
res.scene_map_info.push(map_info)
}
}
@@ -170,7 +172,7 @@ pub async fn on_get_entered_scene_cs_req(
_req: &GetEnteredSceneCsReq,
res: &mut GetEnteredSceneScRsp,
) {
res.entered_scene_info = GAME_RES
res.entered_scene_info_list = GAME_RES
.level_output_configs
.iter()
.flat_map(|(_, v)| {
@@ -249,13 +251,13 @@ async fn load_scene(
scene.world_id
},
lighten_section_list: scene.sections.clone(),
chest_id_list: scene
lddigmlcgdb: scene
.scenes
.values()
.flat_map(|v| v.chests.clone())
.collect::<Vec<_>>(),
scene_mission_info: Some(MissionStatusBySceneInfo {
finished_mission_id_list: scene
finished_main_mission_id_list: scene
.scenes
.values()
.flat_map(|s| s.finished_main_missions.clone())
@@ -392,7 +394,7 @@ async fn load_scene(
scene_info.entity_group_list.push(group_info);
scene_info.group_state_list.push(SceneGroupState {
scene_info.clecmgljocl.push(SceneGroupState {
group_id: *group_id,
is_default: true,
state: 0,
@@ -403,7 +405,7 @@ async fn load_scene(
scene_info.entity_group_list.push(SceneEntityGroupInfo {
state: 0,
group_id: 0,
hejamoojbcj: HashMap::with_capacity(0),
jnajakchjdf: HashMap::with_capacity(0),
entity_list: json
.lineups
.iter()
+1 -1
View File
@@ -17,7 +17,7 @@ use proto::{
CmdMissionType::*, CmdMonopolyType::*, CmdMultiplayerType::*, CmdMultipleDropType::*,
CmdMuseumType::*, CmdOfferingType::*, CmdPamMissionType::*, CmdPhoneType::*,
CmdPlayerBoardType::*, CmdPlayerReturnType::*, CmdPlayerSync::*, CmdPlayerType::*,
CmdPlotType::*, CmdPunkLordType::*, CmdQuestType::*, CmdRaidCollectionType::*, CmdRaidType::*,
CmdPunkLordType::*, CmdQuestType::*, CmdRaidCollectionType::*, CmdRaidType::*,
CmdRecommendType::*, CmdRedDotType::*, CmdReplayType::*, CmdRndOptionType::*,
CmdRogueCommonType::*, CmdRogueEndless::*, CmdRogueModifierType::*, CmdRogueTournType::*,
CmdRogueType::*, CmdRollShopType::*, CmdSceneType::*, CmdServerPrefsType::*, CmdShopType::*,
+8 -7
View File
@@ -10,7 +10,7 @@ use anyhow::Result;
use common::sr_tools::FreesrData;
use mhy_kcp::Kcp;
use prost::Message;
use proto::{AvatarSync, CmdID, CmdPlayerType, PlayerSyncScNotify};
use proto::{AvatarSync, CmdID, PlayerSyncScNotify};
use tokio::{
io::AsyncWrite,
net::UdpSocket,
@@ -70,11 +70,12 @@ impl PlayerSession {
drop(kcp);
for packet in packets {
if packet.cmd_type == CmdPlayerType::CmdPlayerLogoutCsReq as u16 {
tracing::info!("Player logged out");
let _ = self.shutdown_tx.send(());
return Ok(());
};
// #TODO
// if packet.cmd_type == CmdPlayerType::CmdPlayerLogoutCsReq as u16 {
// tracing::info!("Player logged out");
// let _ = self.shutdown_tx.send(());
// return Ok(());
// };
Self::on_message(self, packet.cmd_type, packet.body).await?;
}
@@ -140,7 +141,7 @@ impl PlayerSession {
.map(|avatar| avatar.to_avatar_proto(Option::None, vec![]))
.collect::<Vec<_>>(),
}),
multi_path_avatar_type_info_list: json.get_multi_path_info(),
multi_path_avatar_info_list: json.get_multi_path_info(),
..Default::default()
})
.await