This commit is contained in:
amizing25 2024-05-10 22:15:58 +07:00
parent 1e0cfa6f12
commit 5ae73b4d8c
19 changed files with 36919 additions and 26049 deletions

View File

@ -1,17 +1,19 @@
# Supported Version: 2.1.51, 2.1.52, 2.1.53, 2.1.54, 2.1.55
# Supported Version: 2.2.51
Run the game by clicking run.bat file.
Tool website: [https://freesr-tools.pages.dev](https://freesr-tools.pages.dev)
Start battle by entering any calyx in the map, DON'T ATTACK THE ENEMIES, IT WON'T WORK (maybe)
Some scenes might not loaded properly. If you stuck at loading screen, remove persistent file.
Some scenes might not loaded properly. If you stuck at loading screen, remove `persistent` file.
# RobinSR
Original: [https://git.xeondev.com/reversedrooms/RobinSR/](https://git.xeondev.com/reversedrooms/RobinSR/)
Original:
[https://git.xeondev.com/reversedrooms/RobinSR](https://git.xeondev.com/reversedrooms/RobinSR)
[https://git.xeondev.com/reversedrooms/JadeSR](https://git.xeondev.com/reversedrooms/JadeSR)
A Server emulator for the game [`Honkai: Star Rail`](https://hsr.hoyoverse.com/en-us/)
![screenshot](https://git.xeondev.com/reversedrooms/RobinSR/raw/branch/master/screenshot.png)
![screenshot](https://raw.githubusercontent.com/amizing25/robinsr/main/screenshot.png)
## Installation
@ -65,19 +67,5 @@ run the following in a terminal:
```
## Connecting
[Get 2.2 beta client](https://bhrpg-prod.oss-accelerate.aliyuncs.com/client/beta/20240322124944_scfGE0xJXlWtoJ1r/StarRail_2.1.51.zip),
replace [mhypbase.dll](https://git.xeondev.com/reversedrooms/RobinSR/raw/branch/master/mhypbase.dll) file in your game folder, it will redirect game traffic (and also disable in-game censorship)
## Contributing
Pull requests are welcome. For major changes, please open an issue first to discuss
what you would like to change, and why.
## Bug Reports
If you find a bug, please open an issue with as much detail as possible. If you
can, please include steps to reproduce the bug.
Bad issues such as "This doesn't work" will be closed immediately, be _sure_ to
provide exact detailed steps to reproduce your bug. If it's hard to reproduce, try
to explain it and write a reproducer as best as you can.
[Get 2.2 beta client](https://bhrpg-prod.oss-accelerate.aliyuncs.com/client/beta/20240322124944_scfGE0xJXlWtoJ1r/StarRail_2.1.51.zip)
Replace [mhypbase.dll](https://git.xeondev.com/reversedrooms/RobinSR/raw/branch/master/mhypbase.dll) file in your game folder, it will redirect game traffic (and also disable in-game censorship)

File diff suppressed because it is too large Load Diff

View File

@ -2,11 +2,11 @@ use crate::net::tools::JsonData;
use super::*;
static UNLOCKED_AVATARS: [u32; 54] = [
static UNLOCKED_AVATARS: [u32; 56] = [
8001, 8002, 8003, 8004, 8005, 8006, 1001, 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,
1306, 1307, 1308, 1309, 1312, 1315, 1310, 1314,
];
pub async fn on_get_avatar_data_cs_req(

View File

@ -13,8 +13,9 @@ pub async fn on_start_cocoon_stage_cs_req(
let mut battle_info = SceneBattleInfo {
stage_id: player.battle_config.stage_id,
logic_random_seed: rand::thread_rng().gen::<u32>(),
// battle_id: 1,
kimmjioaodn: player.battle_config.cycle_count,
battle_id: 1,
// cleheggdkal: player.battle_config.cycle_count, // wave
ohfkoaahoib: player.battle_config.cycle_count, // wave
..Default::default()
};
@ -91,21 +92,21 @@ pub async fn on_start_cocoon_stage_cs_req(
// pf score object
if player.battle_config.battle_type == BattleType::PF {
let mut battle_target = Hbinjjdphdo::default();
battle_target.bgnpebhgelb.push(BattleTarget {
let mut battle_target = Cnngaoldopi::default();
battle_target.fdfcmhbhnmc.push(BattleTarget {
id: 10001,
progress: 0,
..Default::default()
});
battle_info.ichnbmifjdi.insert(1, battle_target);
battle_info.jelkfckaonl.insert(1, battle_target);
for i in 2..=4 {
battle_info.ichnbmifjdi.insert(i, Hbinjjdphdo::default());
battle_info.jelkfckaonl.insert(i, Cnngaoldopi::default());
}
battle_info.ichnbmifjdi.insert(
battle_info.jelkfckaonl.insert(
5,
Hbinjjdphdo {
bgnpebhgelb: vec![
Cnngaoldopi {
fdfcmhbhnmc: vec![
BattleTarget {
id: 2001,
progress: 0,
@ -121,11 +122,21 @@ pub async fn on_start_cocoon_stage_cs_req(
);
}
// Apocalyptic Shadow
if player.battle_config.battle_type == BattleType::AS {
let mut battle_target = Cnngaoldopi::default();
battle_target.fdfcmhbhnmc.push(BattleTarget {
id: 10002,
progress: 0,
..Default::default()
});
}
// SU
if player.battle_config.battle_type == BattleType::SU {
battle_info.mpobegkcikn.push(Npjnkmmjfdf {
chgdaadjepi: player.battle_config.path_resonance_id,
status: Some(Agpocmnmmdi {
battle_info.ldkhpbclcbd.push(Mnnlfkgifmc {
ejilnblflii: player.battle_config.path_resonance_id,
status: Some(Fmaobdmmcjb {
sp: Some(AmountInfo {
cur_amount: 10_000,
max_amount: 10_000,
@ -167,14 +178,18 @@ pub async fn on_pve_battle_result_cs_req(
}
// scene cast skill cs req
pub async fn on_mpemgbdkigg(session: &mut PlayerSession, request: &Mpemgbdkigg) -> Result<()> {
pub async fn on_scene_cast_skill_cs_req(
session: &mut PlayerSession,
request: &SceneCastSkillCsReq,
) -> Result<()> {
let player = tools::JsonData::load().await;
let mut battle_info = SceneBattleInfo {
stage_id: player.battle_config.stage_id,
logic_random_seed: rand::thread_rng().gen::<u32>(),
// battle_id: 1,
kimmjioaodn: player.battle_config.cycle_count,
battle_id: 1,
// cleheggdkal: player.battle_config.cycle_count, // wave
ohfkoaahoib: player.battle_config.cycle_count, // wave
..Default::default()
};
@ -251,21 +266,21 @@ pub async fn on_mpemgbdkigg(session: &mut PlayerSession, request: &Mpemgbdkigg)
// pf score object
if player.battle_config.battle_type == BattleType::PF {
let mut battle_target = Hbinjjdphdo::default();
battle_target.bgnpebhgelb.push(BattleTarget {
let mut battle_target = Cnngaoldopi::default();
battle_target.fdfcmhbhnmc.push(BattleTarget {
id: 10001,
progress: 0,
..Default::default()
});
battle_info.ichnbmifjdi.insert(1, battle_target);
battle_info.jelkfckaonl.insert(1, battle_target);
for i in 2..=4 {
battle_info.ichnbmifjdi.insert(i, Hbinjjdphdo::default());
battle_info.jelkfckaonl.insert(i, Cnngaoldopi::default());
}
battle_info.ichnbmifjdi.insert(
battle_info.jelkfckaonl.insert(
5,
Hbinjjdphdo {
bgnpebhgelb: vec![
Cnngaoldopi {
fdfcmhbhnmc: vec![
BattleTarget {
id: 2001,
progress: 0,
@ -281,11 +296,21 @@ pub async fn on_mpemgbdkigg(session: &mut PlayerSession, request: &Mpemgbdkigg)
);
}
// Apocalyptic Shadow
if player.battle_config.battle_type == BattleType::AS {
let mut battle_target = Cnngaoldopi::default();
battle_target.fdfcmhbhnmc.push(BattleTarget {
id: 10002,
progress: 0,
..Default::default()
});
}
// SU
if player.battle_config.battle_type == BattleType::SU {
battle_info.mpobegkcikn.push(Npjnkmmjfdf {
chgdaadjepi: player.battle_config.path_resonance_id,
status: Some(Agpocmnmmdi {
battle_info.ldkhpbclcbd.push(Mnnlfkgifmc {
ejilnblflii: player.battle_config.path_resonance_id,
status: Some(Fmaobdmmcjb {
sp: Some(AmountInfo {
cur_amount: 10_000,
max_amount: 10_000,
@ -298,15 +323,15 @@ pub async fn on_mpemgbdkigg(session: &mut PlayerSession, request: &Mpemgbdkigg)
// monsters
battle_info.monster_wave_list = Monster::to_scene_monster_waves(&player.battle_config.monsters);
let mut resp = Ifiohnjlehh {
elgjckaejld: request.elgjckaejld,
let mut resp = SceneCastSkillScRsp {
jkdaceoekll: request.jkdaceoekll,
retcode: 0,
pbgpinglheg: vec![],
diehcelekfj: vec![],
..Default::default()
};
let targets = request
.jpieajikioh
.igkjjpeealc
.iter()
.filter(|id| **id > 30_000 || **id < 1_000)
.collect::<Vec<_>>();

View File

@ -8,31 +8,31 @@ use crate::{
use super::*;
pub async fn on_nhfajfplkep(session: &mut PlayerSession, _: &Nhfajfplkep) -> Result<()> {
pub async fn on_jhfffmnkcbf(session: &mut PlayerSession, _: &Jhfffmnkcbf) -> Result<()> {
session
.send(
CMD_GET_FRIEND_LIST_INFO_SC_RSP,
Pbfkjlnnnim {
amgpdgdnlgd: vec![Leldmbjfheh {
gpgdedmpjla: PlayingState::None.into(),
cfmiklhjmle: Some(Alcoeanikil::default()),
hiljemhhhnk: String::from("RobinSR"),
kmclngophda: Some(Hcdpijbnijp {
Fmonbbgkfpp {
nffnphfnbph: vec![Pbbkojapeaj {
jkmlmffobmi: PlayingState::None.into(),
eejlmfccjnm: Some(Bhkoekppbaf::default()),
ddnklblgmaa: String::from("RobinSR"),
mkabddponma: Some(Mionicmdpaa {
uid: 727,
mbdjcknimop: 3,
igmaomgegaj: 1,
gjlfhjlijon: 201008,
jpajpffgnbi: 220005,
platform: 3,
mjbmlkimpnn: 1,
dgojjmfnomj: 201008,
kpiphlhfiib: 220005,
level: 70,
nickname: String::from("Server"),
plmbeaaegak: vec![AssistSimpleInfo {
oemkmkkhkde: vec![AssistSimpleInfo {
avatar_id: 1008,
level: 70,
..Default::default()
}],
..Default::default()
}),
gjdiplfecfa: true,
niekopdjolm: true,
}],
..Default::default()
},
@ -40,20 +40,36 @@ pub async fn on_nhfajfplkep(session: &mut PlayerSession, _: &Nhfajfplkep) -> Res
.await
}
pub async fn on_komknbijgpi(session: &mut PlayerSession, _: &Komknbijgpi) -> Result<()> {
pub async fn on_pignjacjgdl(session: &mut PlayerSession, _: &Pignjacjgdl) -> Result<()> {
session
.send(
CMD_GET_PRIVATE_CHAT_HISTORY_SC_RSP,
Ooibcglpnac {
pgofeopnpbm: vec![Bpifmdladdn {
bdjoneohhpj: MsgType::CustomText.into(),
phhhfhobhmk: cur_timestamp_ms(),
fbelgjfhbkh: ":motorized_wheelchair:".to_string(),
nokipdbhglc: 727,
..Default::default()
}],
fjbkleaflam: 727,
oligkfnjkma: 1337,
Hachagdjilp {
fepangjbmpa: vec![
Gnbekokccfc {
mgmicgabebd: MsgType::CustomText.into(),
hkkkjdbgiao: cur_timestamp_ms(),
anjfbjikchf: "'sync'".to_string(),
befmkobhohp: 727,
..Default::default()
},
Gnbekokccfc {
mgmicgabebd: MsgType::CustomText.into(),
hkkkjdbgiao: cur_timestamp_ms(),
anjfbjikchf: "'mc {mc_id}' mc_id can be set from 8001 to 8006".to_string(),
befmkobhohp: 727,
..Default::default()
},
Gnbekokccfc {
mgmicgabebd: MsgType::CustomText.into(),
hkkkjdbgiao: cur_timestamp_ms(),
anjfbjikchf: "available command:".to_string(),
befmkobhohp: 727,
..Default::default()
},
],
cibgdjekbja: 727, // from
ienomggikon: 1337, // to
..Default::default()
},
)
@ -61,22 +77,24 @@ pub async fn on_komknbijgpi(session: &mut PlayerSession, _: &Komknbijgpi) -> Res
}
// RecvMsgCsReq
pub async fn on_bgfjcbbfiek(session: &mut PlayerSession, body: &Bgfjcbbfiek) -> Result<()> {
pub async fn on_dgaiigecbee(session: &mut PlayerSession, body: &Dgaiigecbee) -> Result<()> {
let mut json = JsonData::load().await;
if let Some((cmd, args)) = parse_command(&body.moiplammfad) {
if let Some((cmd, args)) = parse_command(&body.ajlhdpcjand) {
match cmd {
"sync" => {
sync_player(session, json).await?;
session
.send(
CMD_REVC_MSG_SC_NOTIFY,
Kifdjbodlcc {
pofomobijdg: body.pofomobijdg,
kjdhmhgjdmc: body.kjdhmhgjdmc,
moiplammfad: String::from("Inventory Synced"),
bdjoneohhpj: body.bdjoneohhpj,
aljhmlmnmhp: 727,
djefnoaonkc: 1337,
Klonpheafip {
ggadmjhlomj: body.ggadmjhlomj.clone(),
kokadficdfb: body.kokadficdfb,
ajlhdpcjand: String::from("Inventory Synced"),
mgmicgabebd: body.mgmicgabebd,
ghojifhngmc: 727, // from
cmmildghfnl: 1337, // to
nmfepfoojic: body.nmfepfoojic,
},
)
.await?;
@ -113,13 +131,14 @@ pub async fn on_bgfjcbbfiek(session: &mut PlayerSession, body: &Bgfjcbbfiek) ->
session
.send(
CMD_REVC_MSG_SC_NOTIFY,
Kifdjbodlcc {
pofomobijdg: body.pofomobijdg,
kjdhmhgjdmc: body.kjdhmhgjdmc,
moiplammfad: format!("Set MC to: {mc:#?}"),
bdjoneohhpj: body.bdjoneohhpj,
aljhmlmnmhp: 727,
djefnoaonkc: 1337,
Klonpheafip {
ggadmjhlomj: body.ggadmjhlomj.clone(),
kokadficdfb: body.kokadficdfb,
ajlhdpcjand: format!("Set MC to: {mc:#?}"),
mgmicgabebd: body.mgmicgabebd,
ghojifhngmc: 727,
cmmildghfnl: 1337,
nmfepfoojic: body.nmfepfoojic,
},
)
.await?;
@ -131,7 +150,7 @@ pub async fn on_bgfjcbbfiek(session: &mut PlayerSession, body: &Bgfjcbbfiek) ->
session
.send(
CMD_SEND_MSG_SC_RSP,
Jhickbdnnii {
Ckcjblcacof {
retcode: 0,
end_time: 0,
},
@ -153,9 +172,9 @@ async fn sync_player(session: &mut PlayerSession, json: JsonData) -> Result<()>
session
.send(
CMD_PLAYER_SYNC_SC_NOTIFY,
Eckkajafean {
lminpcphbfp: (2000..3500).collect(),
oglioehgbal: (1..2000).collect(),
Pkbehgpoein {
ipnkigfoikl: (2000..3500).collect(),
idgakomjiio: (1..2000).collect(),
..Default::default()
},
)
@ -164,8 +183,8 @@ async fn sync_player(session: &mut PlayerSession, json: JsonData) -> Result<()>
session
.send(
CMD_PLAYER_SYNC_SC_NOTIFY,
Eckkajafean {
fihplpphfme: Some(Abcekhjbnmp {
Pkbehgpoein {
enfnppagfpp: Some(Gkjoiapbbne {
avatar_list: json
.avatars
.values()
@ -180,7 +199,7 @@ async fn sync_player(session: &mut PlayerSession, json: JsonData) -> Result<()>
session
.send(
CMD_PLAYER_SYNC_SC_NOTIFY,
Eckkajafean {
Pkbehgpoein {
relic_list: json.relics.iter().map(|v| v.to_relic_proto()).collect(),
equipment_list: json
.lightcones
@ -195,8 +214,8 @@ async fn sync_player(session: &mut PlayerSession, json: JsonData) -> Result<()>
session
.send(
CMD_PLAYER_SYNC_SC_NOTIFY,
Eckkajafean {
fihplpphfme: Some(Abcekhjbnmp {
Pkbehgpoein {
enfnppagfpp: Some(Gkjoiapbbne {
avatar_list: json
.avatars
.values()

View File

@ -32,35 +32,41 @@ pub async fn on_get_archive_data_cs_req(
.send(
CMD_GET_ARCHIVE_DATA_SC_RSP,
GetArchiveDataScRsp {
archive_data: Some(ArchiveData::default()),
bkcflgbcjmi: Some(ArchiveData::default()),
retcode: 0,
},
)
.await
}
pub async fn on_oakankcfbec(session: &mut PlayerSession, _: &Oakankcfbec) -> Result<()> {
pub async fn on_gfmigicacfn(session: &mut PlayerSession, _: &Gfmigicacfn) -> Result<()> {
// ?
session
.send(CMD_DRESS_RELIC_AVATAR_SC_RSP, Dummy::default())
.await
}
pub async fn on_cnpajjnhfpa(session: &mut PlayerSession, _: &Cnpajjnhfpa) -> Result<()> {
pub async fn on_nbmofdgfejk(session: &mut PlayerSession, _: &Nbmofdgfejk) -> Result<()> {
// ?
session
.send(CMD_TAKE_OFF_RELIC_SC_RSP, Dummy::default())
.await
}
pub async fn on_copkgioejac(session: &mut PlayerSession, _: &Copkgioejac) -> Result<()> {
pub async fn on_dress_avatar_cs_req(
session: &mut PlayerSession,
_: &DressAvatarCsReq,
) -> Result<()> {
// ?
session
.send(CMD_DRESS_AVATAR_SC_RSP, Dummy::default())
.await
}
pub async fn on_aafgmacgenl(session: &mut PlayerSession, _: &Aafgmacgenl) -> Result<()> {
pub async fn on_take_off_equipment_cs_req(
session: &mut PlayerSession,
_: &TakeOffEquipmentCsReq,
) -> Result<()> {
// ?
session
.send(CMD_TAKE_OFF_EQUIPMENT_SC_RSP, Dummy::default())

View File

@ -10,8 +10,8 @@ pub async fn on_get_all_lineup_data_cs_req(
let lineup = LineupInfo {
extra_lineup_type: ExtraLineupType::LineupNone.into(),
name: "Squad 1".to_string(),
njjbfegnhjc: 5,
bpkggopoppf: 5,
mp: 5,
mp_max: 5,
avatar_list: AvatarJson::to_lineup_avatars(&player),
..Default::default()
};
@ -35,8 +35,8 @@ pub async fn on_get_cur_lineup_data_cs_req(
let mut lineup = LineupInfo {
extra_lineup_type: ExtraLineupType::LineupNone.into(),
name: "Squad 1".to_string(),
njjbfegnhjc: 5,
bpkggopoppf: 5,
mp: 5,
mp_max: 5,
..Default::default()
};
@ -112,7 +112,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.jkifflmenfn.get(*slot as usize) {
if let Some(lineup) = req.replace_slot_list.get(*slot as usize) {
*avatar_id = if lineup.id > 8000 {
player.main_character as u32
} else {
@ -150,25 +150,25 @@ async fn refresh_lineup(sess: &mut PlayerSession, player: &JsonData) -> Result<(
extra_lineup_type: ExtraLineupType::LineupNone.into(),
name: "Squad 1".to_string(),
avatar_list: AvatarJson::to_lineup_avatars(player),
njjbfegnhjc: 5,
bpkggopoppf: 5,
mp_max: 5,
mp: 5,
..Default::default()
};
sess.send(
CMD_SCENE_GROUP_REFRESH_SC_NOTIFY,
Ljihfeagpcl {
kpfomkdmoce: vec![Jnofbbanolk {
Kecnjlcjefm {
kpjckjjpjhj: vec![Makfkmagkli {
group_id: 0,
state: 0,
kppckepfpce: 0,
fiiciciambe: player
kcbpdfengaa: 0,
hdaiklkffjh: player
.lineups
.iter()
.map(|(idx, v)| Gffbkjofnad {
fimallpbobk: 0,
mggfjbdchjh: 0,
glalelmdamm: Some(SceneEntityInfo {
.map(|(idx, v)| Kbikoelgpde {
kjjeiknincl: 0,
cojmgafmcjm: 0,
gonncekbppg: Some(SceneEntityInfo {
actor: Some(SceneActorInfo {
avatar_type: AvatarType::AvatarFormalType.into(),
base_avatar_id: *v,

View File

@ -141,20 +141,20 @@ pub async fn on_get_mission_status_cs_req(
retcode: 0,
finished_main_mission_id_list: FINISHED_MAIN_MISSIONS.to_vec(),
sub_mission_status_list: body
.main_mission_id_list
.sub_mission_id_list
.iter()
.map(|id| Mission {
id: *id,
progress: 0,
progress: 1,
status: MissionStatus::MissionFinish.into(),
})
.collect(),
mission_event_status_list: body
.mission_event_id_list
.main_mission_id_list
.iter()
.map(|id| Mission {
id: *id,
progress: 0,
progress: 1,
status: MissionStatus::MissionFinish.into(),
})
.collect(),

View File

@ -28,15 +28,32 @@ pub use tutorial::*;
pub use inventory::*;
pub use chat::*;
#[allow(unused_imports)]
use proto::{
Aaihejacdpk::*, Achkcddkkkj::*, Bancodieeof::*, CmdActivityType::*, CmdBattleType::*,
CmdPlayerType::*, Cmpepmnekko::*, Cpbdjpocnai::*, Ddhbjcelmjp::*,
Eegmjpcijbc::*, Emhbkpkpjpa::*, Fdkapmfjgjl::*, Gaifgoihffa::*, Galijhmhgcg::*, Gdjpnkniijf::*,
Hfjpennlffa::*, Hmnbojnkleh::*, Ieoildlcdkb::*, Kfmpmaojchm::*, Lopidcokdih::*, Lpegmiilfjm::*,
Mbnnmfkffbo::*, Mkeclbphcol::*, Niinikapdpg::*, Pfokmnnfiap::*, Pjmghcfmmge::*, Pnjfenbhbhg::*,
Pnnbhogkeeh::*,
CmdActivityType::*, CmdAdventureType::*, CmdAetherDivideType::*, CmdAlleyType::*,
CmdArchiveType::*, CmdAvatarType::*, CmdBattleCollegeType::*, CmdBattlePassType::*,
CmdBattleType::*, CmdBoxingClubType::*, CmdChallengeType::*, CmdChatType::*,
CmdChessRogueType::*, CmdClockParkType::*, CmdContentPackageType::*, CmdDailyActiveType::*,
CmdDrinkMakerType::*, CmdEvolveBuildType::*, CmdExpeditionType::*,
CmdFantasticStoryActivityType::*, CmdFeverTimeActivityType::*, CmdFightActivityType::*,
CmdFightMathc3Type::*, CmdFightType::*, CmdFriendType::*, CmdGachaType::*, CmdHeartdialType::*,
CmdHeliobusType::*, CmdItemType::*, CmdJukeboxType::*, CmdLineupType::*, CmdLobbyType::*,
CmdMailType::*, CmdMapRotationType::*, CmdMatchThreeModuleType::*, CmdMatchType::*,
CmdMessageType::*, CmdMiscModuleType::*, CmdMissionType::*, CmdMonopolyType::*,
CmdMultiplayerType::*, CmdMultipleDropType::*, CmdMuseumType::*, CmdOfferingType::*,
CmdPamMissionType::*, CmdPhoneType::*, CmdPlayerBoardType::*, CmdPlayerReturnType::*,
CmdPlayerSync::*, CmdPlayerType::*, CmdPlotType::*, CmdPunkLordType::*, CmdQuestType::*,
CmdRaidCollectionType::*, CmdRaidType::*, CmdRedDotType::*, CmdReplayType::*,
CmdRndOptionType::*, CmdRogueCommonType::*, CmdRogueEndless::*, CmdRogueModifierType::*,
CmdRogueTournType::*, CmdRogueType::*, CmdRollShopType::*, CmdSceneType::*,
CmdServerPrefsType::*, CmdShopType::*, CmdSpaceZooType::*, CmdStarFightType::*,
CmdStoryLineType::*, CmdStrongChallengeActivityType::*, CmdTalkRewardType::*,
CmdTelevisionActivityType::*, CmdTextJoinType::*, CmdTrainVisitorType::*,
CmdTravelBrochureType::*, CmdTreasureDungeonType::*, CmdTutorialType::*, CmdWaypointType::*,
CmdWolfBroType::*,
};
macro_rules! dummy {
($($cmd:ident),* $(,)*) => {
paste! {
@ -102,7 +119,7 @@ dummy! {
GetCurChallenge,
GetRogueInfo,
GetExpeditionData,
GetRogueDialogueEventData,
// GetRogueDialogueEventData,
GetJukeboxData,
SyncClientResVersion,
DailyFirstMeetPam,

View File

@ -58,7 +58,10 @@ pub async fn on_get_cur_scene_info_cs_req(
}
// enterscene
pub async fn on_lckgkdehclb(session: &mut PlayerSession, request: &Lckgkdehclb) -> Result<()> {
pub async fn on_enter_scene_cs_req(
session: &mut PlayerSession,
request: &EnterSceneCsReq,
) -> Result<()> {
let mut player = JsonData::load().await;
// send packet first
@ -71,7 +74,7 @@ pub async fn on_lckgkdehclb(session: &mut PlayerSession, request: &Lckgkdehclb)
&mut player,
request.entry_id,
true,
Some(request.maplanefddc),
Some(request.dehbihbbbgo),
)
.await?;
@ -79,23 +82,26 @@ pub async fn on_lckgkdehclb(session: &mut PlayerSession, request: &Lckgkdehclb)
}
// getscenemapinfocsreq
pub async fn on_fkjoeabiioe(sesison: &mut PlayerSession, request: &Fkjoeabiioe) -> Result<()> {
let mut map_infos = Vec::<Fjniajephmj>::new();
pub async fn on_get_scene_map_info_cs_req(
sesison: &mut PlayerSession,
request: &GetSceneMapInfoCsReq,
) -> Result<()> {
let mut map_infos = Vec::<SceneMapInfo>::new();
for entry_id in &request.dmkkkfnkofh {
let mut map_info = Fjniajephmj {
for entry_id in &request.entry_id_list {
let mut map_info = SceneMapInfo {
retcode: 0,
dcbdhkkkpgd: vec![
Gbiimoglajl {
gommoeicmjg: Kihbdaniehp::MapInfoChestTypeNormal.into(),
chest_info_list: vec![
ChestInfo {
fmangokfagc: MapInfoChestType::Normal.into(),
..Default::default()
},
Gbiimoglajl {
gommoeicmjg: Kihbdaniehp::MapInfoChestTypePuzzle.into(),
ChestInfo {
fmangokfagc: MapInfoChestType::Puzzle.into(),
..Default::default()
},
Gbiimoglajl {
gommoeicmjg: Kihbdaniehp::MapInfoChestTypeChallenge.into(),
ChestInfo {
fmangokfagc: MapInfoChestType::Challenge.into(),
..Default::default()
},
],
@ -104,7 +110,7 @@ pub async fn on_fkjoeabiioe(sesison: &mut PlayerSession, request: &Fkjoeabiioe)
};
for i in 0..100 {
map_info.phicefeaigb.push(i)
map_info.lighten_section_list.push(i)
}
let group_config = GAME_RESOURCES.map_entrance.get(entry_id).and_then(|v| {
@ -115,47 +121,43 @@ pub async fn on_fkjoeabiioe(sesison: &mut PlayerSession, request: &Fkjoeabiioe)
if let Some(level) = group_config {
// add teleports
for teleport in &level.teleports {
map_info.ojlnmnehgai.push(*teleport.0)
map_info.unlock_teleport_list.push(*teleport.0)
}
for (group_id, group) in &level.group_items {
map_info.pmolfbcbfpe.push(Gecjjlmabhp {
map_info.maze_group_list.push(MazeGroup {
group_id: *group_id,
..Default::default()
});
// prop
for prop in &group.props {
map_info.cgkfbhoadpc.push(Kangcibfhee {
map_info.maze_prop_list.push(MazePropState {
group_id: prop.group_id,
state: if prop.prop_state_list.contains(&PropState::CheckPointEnable) {
PropState::CheckPointEnable as u32
} else {
prop.state.clone() as u32
},
ifjocipnpgd: prop.id,
config_id: prop.id,
});
}
}
}
// Debug
// tokio::fs::write(format!("./text-{}.txt", entry_id), format!("{:#?}", map_info)).await?;
map_infos.push(map_info)
}
sesison
.send(
CMD_GET_SCENE_MAP_INFO_SC_RSP,
Cegeebldbke {
GetSceneMapInfoScRsp {
retcode: 0,
mhefdgcamjl: map_infos,
map_info_list: map_infos,
..Default::default()
},
)
.await?;
Ok(())
.await
}
lazy_static! {
@ -186,13 +188,13 @@ pub async fn on_scene_entity_move_cs_req(
}
if let Some(motion) = &entity.motion {
if let Some(pos) = &motion.aomilajjmii {
player.position.x = pos.baimdminomk;
player.position.y = pos.bemlopmcgch;
player.position.z = pos.bagloppgnpb;
if let Some(pos) = &motion.pos {
player.position.x = pos.x;
player.position.y = pos.y;
player.position.z = pos.z;
}
if let Some(rot) = &motion.eiaoiankefd {
player.position.rot_y = rot.bemlopmcgch;
if let Some(rot) = &motion.rot {
player.position.rot_y = rot.y;
}
}
}
@ -214,7 +216,7 @@ pub async fn on_get_entered_scene_cs_req(
.filter(|(_, v)| {
!v.finish_main_mission_list.is_empty() || !v.finish_sub_mission_list.is_empty()
})
.map(|(_, v)| Lpllljogfeh {
.map(|(_, v)| Hhglkmjngeg {
floor_id: v.floor_id,
plane_id: v.plane_id,
})
@ -223,19 +225,14 @@ pub async fn on_get_entered_scene_cs_req(
session
.send(
CMD_GET_ENTERED_SCENE_SC_RSP,
Mkgidalegbd {
lejonbbgdnn: scenes,
Fchnfpafjce {
npbjclegekf: scenes,
retcode: 0,
},
)
.await
}
// getunlockteleportcsreq
pub async fn on_kkbapmgmmcb(_session: &mut PlayerSession, _request: &Kkbapmgmmcb) -> Result<()> {
Ok(())
}
async fn load_scene(
session: &mut PlayerSession,
json: &mut JsonData,
@ -278,24 +275,26 @@ async fn load_scene(
floor_id: enterance.floor_id,
plane_id: enterance.plane_id,
entry_id,
game_mode_type: plane.plane_type as u32,
pbfgagecpcd: plane.world_id,
pjbjelcgkof: plane.plane_type as u32,
nnfgkelcban: 1,
lgflfajffjl: 1,
game_mode_type: 1,
..Default::default()
};
let lineup_info = AvatarJson::to_lineup_info(&json.lineups);
let player_pos = MotionInfo {
// rot
eiaoiankefd: Some(Vector {
baimdminomk: 0,
bemlopmcgch: position.rot_y,
bagloppgnpb: 0,
rot: Some(Vector {
x: 0,
y: position.rot_y,
z: 0,
}),
// pos
aomilajjmii: Some(Vector {
baimdminomk: position.x,
bemlopmcgch: position.y,
bagloppgnpb: position.z,
pos: Some(Vector {
x: position.x,
y: position.y,
z: position.z,
}),
};
@ -305,7 +304,7 @@ async fn load_scene(
let mut monster_entity_id = 30_000;
for (group_id, group) in &group_config.group_items {
let mut group_info = Dhkacjhaoid {
let mut group_info = SceneGroupInfo {
state: 0,
group_id: *group_id,
..Default::default()
@ -365,7 +364,7 @@ async fn load_scene(
entity_id: npc_entity_id,
motion: Some(npc_position.to_motion()),
npc: Some(SceneNpcInfo {
egeneneoadj: npc.npcid,
npc_id: npc.npcid,
..Default::default()
}),
..Default::default()
@ -403,11 +402,11 @@ async fn load_scene(
group_info.entity_list.push(info);
}
scene_info.chhmmbdhjpg.push(group_info);
scene_info.scene_group_list.push(group_info);
}
// load player entity
let mut player_group = Dhkacjhaoid {
let mut player_group = SceneGroupInfo {
state: 0,
group_id: 0,
..Default::default()
@ -418,16 +417,16 @@ async fn load_scene(
entity_id: (*slot) + 1,
motion: Some(MotionInfo {
// pos
aomilajjmii: Some(Vector {
baimdminomk: json.position.x,
bemlopmcgch: json.position.y,
bagloppgnpb: json.position.z,
pos: Some(Vector {
x: json.position.x,
y: json.position.y,
z: json.position.z,
}),
// rot
eiaoiankefd: Some(Vector {
baimdminomk: 0,
bemlopmcgch: json.position.rot_y,
bagloppgnpb: 0,
rot: Some(Vector {
x: 0,
y: json.position.rot_y,
z: 0,
}),
}),
actor: Some(SceneActorInfo {
@ -439,13 +438,13 @@ async fn load_scene(
..Default::default()
})
}
scene_info.chhmmbdhjpg.push(player_group);
scene_info.scene_group_list.push(player_group);
if _save {
session
.send(
CMD_ENTER_SCENE_BY_SERVER_SC_NOTIFY,
Jdokmmikidp {
EnterSceneByServerScNotify {
scene: Some(scene_info.clone()),
lineup: Some(lineup_info),
..Default::default()

File diff suppressed because it is too large Load Diff

View File

@ -51,8 +51,8 @@ impl AvatarJson {
} else {
0
},
ojneijnggfo: 1712924677,
amafpakcckf: relics
first_met_timestamp: 1712924677,
equip_relic_list: relics
.iter()
.map(|v| v.to_equipment_relic_proto())
.collect::<Vec<_>>(),
@ -153,8 +153,8 @@ impl AvatarJson {
let mut lineup_info = LineupInfo {
extra_lineup_type: ExtraLineupType::LineupNone.into(),
name: "Squad 1".to_string(),
njjbfegnhjc: 5,
bpkggopoppf: 5,
mp: 5,
mp_max: 5,
..Default::default()
};
@ -197,7 +197,7 @@ impl Lightcone {
pub fn to_equipment_proto(&self) -> Equipment {
Equipment {
base_avatar_id: self.equip_avatar,
imhlbinfhlh: self.equip_avatar,
cmmegdchmlb: self.equip_avatar,
exp: 0,
is_protected: false,
level: self.level,
@ -249,7 +249,7 @@ impl Relic {
pub fn to_relic_proto(&self) -> proto::Relic {
proto::Relic {
base_avatar_id: self.equip_avatar,
imhlbinfhlh: self.equip_avatar,
cmmegdchmlb: self.equip_avatar,
exp: 0,
is_protected: false,
level: self.level,
@ -291,9 +291,9 @@ impl Relic {
pub fn to_equipment_relic_proto(&self) -> EquipRelic {
EquipRelic {
ipnhjoomhdm: self.relic_id % 10,
iaglgkpdloe: self.relic_id % 10,
// ?
llepdadmfdo: 1 + self.internal_uid,
ekjochfepap: 1 + self.internal_uid,
}
}
}
@ -309,11 +309,11 @@ pub struct Monster {
}
impl Monster {
fn to_scene_monster_info(&self) -> SceneMonsterParam {
SceneMonsterParam {
fn to_scene_monster_info(&self) -> SceneMonsterData {
SceneMonsterData {
monster_id: self.monster_id,
max_hp: self.max_hp,
aiapcboelmg: self.max_hp,
jjhfeikbakk: self.max_hp,
}
}
@ -324,9 +324,9 @@ impl Monster {
}
SceneMonsterWave {
iilhbcalikm: wave_index, // wave indexx??
imapolkmefn: wave_index, // wave indexx??
ejahmdkklbn: Some(Holldlkceof {
acpannfhach: Some(Kjfnknacfin {
// monster param
level: monsters.iter().map(|v| v.level).max().unwrap_or(95),
..Default::default()
@ -387,6 +387,7 @@ pub enum BattleType {
Moc = 1,
PF = 2,
SU = 3,
AS = 4,
}
impl Default for BattleType {
@ -462,16 +463,16 @@ impl Position {
pub fn to_motion(&self) -> MotionInfo {
MotionInfo {
// rot
eiaoiankefd: Some(Vector {
baimdminomk: 0,
bemlopmcgch: self.rot_y,
bagloppgnpb: 0,
rot: Some(Vector {
x: 0,
y: self.rot_y,
z: 0,
}),
// pos
aomilajjmii: Some(Vector {
baimdminomk: self.x,
bemlopmcgch: self.y,
bagloppgnpb: self.z,
pos: Some(Vector {
x: self.x,
y: self.y,
z: self.z,
}),
}
}

Binary file not shown.

View File

@ -1,20 +1,20 @@
{
"lineups": {
"0": 1315,
"1": 1309,
"2": 1303,
"3": 1217
"0": 1310,
"1": 1308,
"2": 1314,
"3": 1308
},
"position": {
"x": 34639,
"y": 192819,
"z": 435863,
"rot_y": 26508
"x": -3588,
"y": 56256,
"z": -87629,
"rot_y": 318488
},
"scene": {
"plane_id": 20313,
"floor_id": 20313001,
"entry_id": 2031301
"plane_id": 20321,
"floor_id": 20321001,
"entry_id": 2032101
},
"main_character": "FemaleHarmony"
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,7 +1,7 @@
use crate::config::versions;
use axum::extract::Query;
use prost::Message;
use proto::{Dispatch, Gateserver, RegionInfo};
use proto::{Gateserver, GlobalDispatchData, ServerData};
use serde::Deserialize;
pub const QUERY_DISPATCH_ENDPOINT: &str = "/query_dispatch";
@ -9,12 +9,12 @@ pub const QUERY_GATEWAY_ENDPOINT: &str = "/query_gateway";
#[tracing::instrument]
pub async fn query_dispatch() -> String {
let rsp = Dispatch {
let rsp = GlobalDispatchData {
retcode: 0,
region_list: vec![RegionInfo {
server_list: vec![ServerData {
name: String::from("RobinSR"),
title: String::from("RobinSR"),
env_type: String::from("9"),
env_type: String::from("11"),
dispatch_url: String::from("http://127.0.0.1:21000/query_gateway"),
..Default::default()
}],
@ -44,20 +44,13 @@ pub async fn query_gateway(parameters: Query<QueryGatewayParameters>) -> String
lua_url: config.lua_url.clone(),
lua_version: config.lua_version.clone(),
ifix_version: String::from("0"),
jblkncaoiao: true,
hjdjakjkdbi: true,
ldknmcpffim: true,
feehapamfci: true,
eebfeohfpph: true,
dfmjjcfhfea: true,
najikcgjgan: true,
giddjofkndm: true,
fbnbbembcgn: false,
dedgfjhbnok: false,
pdpbjhfgnjk: true,
bipcmeeljhj: true,
hecpclndaac: true,
nlfkefmfige: true,
oigmgpfnloj: true,
pnnionnkbnn: true,
use_tcp: true,
linlaijbboh: false,
ahmbfbkhmgh: false,
nmdccehcdcc: false,
..Default::default()
}
} else {

View File

@ -1,65 +1,14 @@
{
"OSBETAWin2.1.51": {
"asset_bundle_url": "https://autopatchcn.bhsr.com/asb/BetaLive/output_6744505_89b2f5dc973e",
"ex_resource_url": "https://autopatchcn.bhsr.com/design_data/BetaLive/output_6759713_b4e0e740f0da",
"lua_url": "https://autopatchcn.bhsr.com/lua/BetaLive/output_6755976_3c46d7c46e2c",
"lua_version": "6755976"
"CNBETAWin2.2.51": {
"asset_bundle_url": "https://autopatchcn.bhsr.com/asb/BetaLive/output_7037158_b67f5a6a68fb",
"ex_resource_url": "https://autopatchcn.bhsr.com/design_data/BetaLive/output_7033392_aaca9c1b456b",
"lua_url": "https://autopatchcn.bhsr.com/lua/BetaLive/output_7050564_f05a0f949b10",
"lua_version": "7050564"
},
"CNBETAWin2.1.51": {
"asset_bundle_url": "https://autopatchcn.bhsr.com/asb/BetaLive/output_6744505_89b2f5dc973e",
"ex_resource_url": "https://autopatchcn.bhsr.com/design_data/BetaLive/output_6759713_b4e0e740f0da",
"lua_url": "https://autopatchcn.bhsr.com/lua/BetaLive/output_6755976_3c46d7c46e2c",
"lua_version": "6755976"
},
"OSBETAWin2.1.52": {
"asset_bundle_url": "https://autopatchcn.bhsr.com/asb/BetaLive/output_6785106_15237df2ef89",
"ex_resource_url": "https://autopatchcn.bhsr.com/design_data/BetaLive/output_6787319_5f3f1dae4769",
"lua_url": "https://autopatchcn.bhsr.com/lua/BetaLive/output_6785460_26c4b6c61a8b",
"lua_version": "6785460"
},
"CNBETAWin2.1.52": {
"asset_bundle_url": "https://autopatchcn.bhsr.com/asb/BetaLive/output_6785106_15237df2ef89",
"ex_resource_url": "https://autopatchcn.bhsr.com/design_data/BetaLive/output_6787319_5f3f1dae4769",
"lua_url": "https://autopatchcn.bhsr.com/lua/BetaLive/output_6785460_26c4b6c61a8b",
"lua_version": "6785460"
},
"OSBETAWin2.1.53": {
"asset_bundle_url": "https://autopatchcn.bhsr.com/asb/BetaLive/output_6828321_72f2df86102b",
"ex_resource_url": "https://autopatchcn.bhsr.com/design_data/BetaLive/output_6834225_44836493b261",
"lua_url": "https://autopatchcn.bhsr.com/lua/BetaLive/output_6828764_f749b48347fd",
"lua_version": "6828764"
},
"CNBETAWin2.1.53": {
"asset_bundle_url": "https://autopatchcn.bhsr.com/asb/BetaLive/output_6828321_72f2df86102b",
"ex_resource_url": "https://autopatchcn.bhsr.com/design_data/BetaLive/output_6834225_44836493b261",
"lua_url": "https://autopatchcn.bhsr.com/lua/BetaLive/output_6828764_f749b48347fd",
"lua_version": "6828764"
},
"OSBETAWin2.1.54": {
"asset_bundle_url": "https://autopatchcn.bhsr.com/asb/BetaLive/output_6875067_4783dbc33bcd",
"ex_resource_url": "https://autopatchcn.bhsr.com/design_data/BetaLive/output_6894513_13602cb3df26",
"lua_url": "https://autopatchcn.bhsr.com/lua/BetaLive/output_6875272_2cb77cca61ea",
"lua_version": "6875272"
},
"CNBETAWin2.1.54": {
"asset_bundle_url": "https://autopatchcn.bhsr.com/asb/BetaLive/output_6875067_4783dbc33bcd",
"ex_resource_url": "https://autopatchcn.bhsr.com/design_data/BetaLive/output_6894513_13602cb3df26",
"lua_url": "https://autopatchcn.bhsr.com/lua/BetaLive/output_6875272_2cb77cca61ea",
"lua_version": "6875272"
},
"CNBETAWin2.1.55": {
"asset_bundle_url": "https://autopatchcn.bhsr.com/asb/BetaLive/output_6918564_f65307ddaa2b",
"ex_resource_url": "https://autopatchcn.bhsr.com/design_data/BetaLive/output_6928643_3ce1c3e895fa",
"lua_url": "https://autopatchcn.bhsr.com/lua/BetaLive/output_6931760_dcbf48d15383",
"lua_version": "6931760"
},
"OSBETAWin2.1.55": {
"asset_bundle_url": "https://autopatchcn.bhsr.com/asb/BetaLive/output_6918564_f65307ddaa2b",
"ex_resource_url": "https://autopatchcn.bhsr.com/design_data/BetaLive/output_6928643_3ce1c3e895fa",
"lua_url": "https://autopatchcn.bhsr.com/lua/BetaLive/output_6931760_dcbf48d15383",
"lua_version": "6931760"
"OSBETAWin2.2.51": {
"asset_bundle_url": "https://autopatchos.starrails.com/asb/BetaLive/output_7037158_b67f5a6a68fb",
"ex_resource_url": "https://autopatchos.starrails.com/design_data/BetaLive/output_7033392_aaca9c1b456b",
"lua_url": "https://autopatchos.starrails.com/lua/BetaLive/output_7050564_f05a0f949b10",
"lua_version": "7050564"
}
}
}

View File

@ -1,65 +1,14 @@
{
"OSBETAWin2.1.51": {
"asset_bundle_url": "https://autopatchcn.bhsr.com/asb/BetaLive/output_6744505_89b2f5dc973e",
"ex_resource_url": "https://autopatchcn.bhsr.com/design_data/BetaLive/output_6759713_b4e0e740f0da",
"lua_url": "https://autopatchcn.bhsr.com/lua/BetaLive/output_6755976_3c46d7c46e2c",
"lua_version": "6755976"
"CNBETAWin2.2.51": {
"asset_bundle_url": "https://autopatchcn.bhsr.com/asb/BetaLive/output_7037158_b67f5a6a68fb",
"ex_resource_url": "https://autopatchcn.bhsr.com/design_data/BetaLive/output_7033392_aaca9c1b456b",
"lua_url": "https://autopatchcn.bhsr.com/lua/BetaLive/output_7050564_f05a0f949b10",
"lua_version": "7050564"
},
"CNBETAWin2.1.51": {
"asset_bundle_url": "https://autopatchcn.bhsr.com/asb/BetaLive/output_6744505_89b2f5dc973e",
"ex_resource_url": "https://autopatchcn.bhsr.com/design_data/BetaLive/output_6759713_b4e0e740f0da",
"lua_url": "https://autopatchcn.bhsr.com/lua/BetaLive/output_6755976_3c46d7c46e2c",
"lua_version": "6755976"
},
"OSBETAWin2.1.52": {
"asset_bundle_url": "https://autopatchcn.bhsr.com/asb/BetaLive/output_6785106_15237df2ef89",
"ex_resource_url": "https://autopatchcn.bhsr.com/design_data/BetaLive/output_6787319_5f3f1dae4769",
"lua_url": "https://autopatchcn.bhsr.com/lua/BetaLive/output_6785460_26c4b6c61a8b",
"lua_version": "6785460"
},
"CNBETAWin2.1.52": {
"asset_bundle_url": "https://autopatchcn.bhsr.com/asb/BetaLive/output_6785106_15237df2ef89",
"ex_resource_url": "https://autopatchcn.bhsr.com/design_data/BetaLive/output_6787319_5f3f1dae4769",
"lua_url": "https://autopatchcn.bhsr.com/lua/BetaLive/output_6785460_26c4b6c61a8b",
"lua_version": "6785460"
},
"OSBETAWin2.1.53": {
"asset_bundle_url": "https://autopatchcn.bhsr.com/asb/BetaLive/output_6828321_72f2df86102b",
"ex_resource_url": "https://autopatchcn.bhsr.com/design_data/BetaLive/output_6834225_44836493b261",
"lua_url": "https://autopatchcn.bhsr.com/lua/BetaLive/output_6828764_f749b48347fd",
"lua_version": "6828764"
},
"CNBETAWin2.1.53": {
"asset_bundle_url": "https://autopatchcn.bhsr.com/asb/BetaLive/output_6828321_72f2df86102b",
"ex_resource_url": "https://autopatchcn.bhsr.com/design_data/BetaLive/output_6834225_44836493b261",
"lua_url": "https://autopatchcn.bhsr.com/lua/BetaLive/output_6828764_f749b48347fd",
"lua_version": "6828764"
},
"OSBETAWin2.1.54": {
"asset_bundle_url": "https://autopatchcn.bhsr.com/asb/BetaLive/output_6875067_4783dbc33bcd",
"ex_resource_url": "https://autopatchcn.bhsr.com/design_data/BetaLive/output_6894513_13602cb3df26",
"lua_url": "https://autopatchcn.bhsr.com/lua/BetaLive/output_6875272_2cb77cca61ea",
"lua_version": "6875272"
},
"CNBETAWin2.1.54": {
"asset_bundle_url": "https://autopatchcn.bhsr.com/asb/BetaLive/output_6875067_4783dbc33bcd",
"ex_resource_url": "https://autopatchcn.bhsr.com/design_data/BetaLive/output_6894513_13602cb3df26",
"lua_url": "https://autopatchcn.bhsr.com/lua/BetaLive/output_6875272_2cb77cca61ea",
"lua_version": "6875272"
},
"CNBETAWin2.1.55": {
"asset_bundle_url": "https://autopatchcn.bhsr.com/asb/BetaLive/output_6918564_f65307ddaa2b",
"ex_resource_url": "https://autopatchcn.bhsr.com/design_data/BetaLive/output_6928643_3ce1c3e895fa",
"lua_url": "https://autopatchcn.bhsr.com/lua/BetaLive/output_6931760_dcbf48d15383",
"lua_version": "6931760"
},
"OSBETAWin2.1.55": {
"asset_bundle_url": "https://autopatchcn.bhsr.com/asb/BetaLive/output_6918564_f65307ddaa2b",
"ex_resource_url": "https://autopatchcn.bhsr.com/design_data/BetaLive/output_6928643_3ce1c3e895fa",
"lua_url": "https://autopatchcn.bhsr.com/lua/BetaLive/output_6931760_dcbf48d15383",
"lua_version": "6931760"
"OSBETAWin2.2.51": {
"asset_bundle_url": "https://autopatchos.starrails.com/asb/BetaLive/output_7037158_b67f5a6a68fb",
"ex_resource_url": "https://autopatchos.starrails.com/design_data/BetaLive/output_7033392_aaca9c1b456b",
"lua_url": "https://autopatchos.starrails.com/lua/BetaLive/output_7050564_f05a0f949b10",
"lua_version": "7050564"
}
}