Compare commits

..

No commits in common. "main" and "1.0.0" have entirely different histories.
main ... 1.0.0

29 changed files with 493 additions and 377156 deletions

View file

@ -1,26 +1,26 @@
{ {
"avatar_config": [ "avatar_config": [
{ {
"name": "Acheron", "name": "Cipher",
"id": 1308, "id": 1406,
"hp": 100, "hp": 100,
"sp": 0, "sp": 50,
"level": 80, "level": 80,
"promotion": 6, "promotion": 6,
"rank": 2, "rank": 6,
"lightcone": { "lightcone": {
"id": 23024, "id": 23043,
"rank": 1, "rank": 5,
"level": 80, "level": 80,
"promotion": 6 "promotion": 6
}, },
"relics": [ "relics": [
"61171,15,1,4,3:2:2,4:1:2,8:2:3,9:3:1", "61261,15,1,4,8:1:1,3:4:4,7:2:2,4:2:2",
"61172,15,1,4,1:2:4,5:2:4,8:2:2,9:3:1", "61262,15,1,4,10:1:1,1:3:3,9:4:4,8:1:1",
"61173,15,5,4,4:2:0,5:3:2,8:3:5,10:1:1", "61263,15,5,4,2:3:3,4:2:2,12:2:2,6:2:2",
"61174,15,2,4,2:2:2,8:3:5,9:2:2,10:1:1", "61264,15,4,4,6:2:2,2:1:1,1:4:4,5:2:2",
"63145,15,7,4,3:3:5,4:1:2,5:1:1,8:3:4", "63145,15,9,4,9:1:1,3:2:2,7:4:4,5:2:2",
"63146,15,4,4,3:2:1,9:4:4,10:1:1,11:1:1" "63146,15,4,4,1:2:2,3:3:3,4:2:2,2:2:2"
], ],
"use_technique": true "use_technique": true
}, },
@ -31,79 +31,84 @@
"sp": 50, "sp": 50,
"level": 80, "level": 80,
"promotion": 6, "promotion": 6,
"rank": 0, "rank": 6,
"lightcone": { "lightcone": {
"id": 23042, "id": 23042,
"rank": 1, "rank": 5,
"level": 80, "level": 80,
"promotion": 6 "promotion": 6
}, },
"relics": [ "relics": [
"61251,15,1,4,5:1:1,6:3:3,7:3:3,12:1:1", "61251,15,1,4,6:1:1,11:2:2,5:2:2,2:4:4",
"61252,15,1,4,7:3:3,10:3:3,11:2:2,12:1:1", "61252,15,1,4,5:3:3,4:1:1,7:2:2,10:3:3",
"61253,15,6,4,5:1:1,6:3:5,7:2:4,12:3:4", "61253,15,5,4,3:2:2,11:2:2,10:3:3,5:2:2",
"61254,15,4,4,4:2:0,9:2:2,11:2:4,10:3:0", "61254,15,4,4,11:3:3,9:3:3,12:1:1,4:2:2",
"63205,15,8,4,2:2:3,7:3:1,8:2:1,10:2:4", "63205,15,1,4,3:1:1,8:4:4,9:2:2,2:2:2",
"63206,15,3,4,3:3:2,7:2:1,9:3:4,11:1:1" "63206,15,2,4,6:3:3,8:3:3,11:1:1,3:2:2"
], ],
"use_technique": true "use_technique": true
}, },
{ {
"name": "Cipher", "name": "Trailblazer",
"id": 1406, "id": 8008,
"hp": 100, "hp": 100,
"sp": 50, "sp": 50,
"level": 80, "level": 80,
"promotion": 6, "promotion": 6,
"rank": 0, "rank": 6,
"lightcone": { "lightcone": {
"id": 23043, "id": 23042,
"rank": 1, "rank": 5,
"level": 80, "level": 80,
"promotion": 6 "promotion": 6
}, },
"relics": [ "relics": [
"61171,15,1,4,7:2:2,5:2:3,8:1:2,9:3:2", "61261,15,1,4,12:3:3,11:2:2,8:3:3,2:1:1",
"61172,15,1,4,5:2:3,8:2:2,9:2:2,12:2:1", "61262,15,1,4,3:3:3,8:2:2,6:2:2,1:2:2",
"61173,15,5,4,8:3:3,7:2:2,5:3:0,2:1:1", "61263,15,5,4,12:1:1,5:2:2,7:3:3,4:3:3",
"61174,15,4,4,3:2:3,8:2:3,9:2:2,10:2:1", "61264,15,4,4,6:1:1,9:3:3,2:3:3,1:2:2",
"63145,15,9,4,3:2:2,5:2:2,8:2:3,9:2:3", "63145,15,6,4,7:4:4,8:1:1,3:2:2,12:2:2",
"63146,15,4,4,1:2:3,6:1:2,8:1:0,9:4:2" "63146,15,2,4,8:2:2,6:3:3,10:3:3,1:1:1"
], ],
"use_technique": false "use_technique": true
}, },
{ {
"name": "Tribbie", "name": "Acheron",
"id": 1403, "id": 1308,
"hp": 100, "hp": 100,
"sp": 0, "sp": 50,
"level": 80, "level": 80,
"promotion": 6, "promotion": 6,
"rank": 0, "rank": 6,
"lightcone": { "lightcone": {
"id": 23038, "id": 23024,
"rank": 1, "rank": 5,
"level": 80, "level": 80,
"promotion": 6 "promotion": 6
}, },
"relics": [ "relics": [
"61241,15,1,4,8:2:1,9:2:4,11:2:2,12:2:2", "61171,15,1,4,9:2:2,12:2:2,8:3:3,6:2:2",
"61242,15,1,4,3:1:0,8:3:3,9:2:1,12:2:3", "61172,15,1,4,8:4:4,4:3:3,5:1:1,6:1:1",
"61243,15,5,4,3:2:4,8:3:2,10:1:0,11:2:3", "61173,15,5,4,3:1:1,12:3:3,11:3:3,7:2:2",
"61244,15,1,4,5:2:2,8:2:3,9:2:1,12:2:4", "61174,15,4,4,5:1:1,11:2:2,4:4:4,6:2:2",
"63195,15,1,4,1:2:4,5:1:1,8:4:4,9:1:1", "63145,15,7,4,9:2:2,4:1:1,6:2:2,2:4:4",
"63196,15,3,4,7:2:1,8:4:7,9:2:1,10:1:1" "63146,15,4,4,4:2:2,7:3:3,1:2:2,2:2:2"
], ],
"use_technique": true "use_technique": true
} }
], ],
"battle_config": { "battle_config": {
"battle_id": 1, "battle_id": 1,
"stage_id": 201012311, "stage_id": 30114122,
"cycle_count": 30, "cycle_count": 30,
"monster_wave": [ "monster_wave": [
[ [
4015011 4033010,
4033030,
4032030
],
[
2034010
] ]
], ],
"monster_level": 95, "monster_level": 95,

View file

@ -9,6 +9,8 @@ const CNPROD_HOST = "prod-gf-cn-dp01.bhsr.com";
const CNBETA_HOST = "beta-release01-cn.bhsr.com"; const CNBETA_HOST = "beta-release01-cn.bhsr.com";
const OSPROD_HOST = "prod-official-asia-dp01.starrails.com"; const OSPROD_HOST = "prod-official-asia-dp01.starrails.com";
const OSBETA_HOST = "beta-release01-asia.starrails.com"; const OSBETA_HOST = "beta-release01-asia.starrails.com";
const OSCE_HOST = "alb-ftpc0bk5jk0c9b3go4.us-east-1.alb.aliyuncs.com";
const CNCE_HOST = "alb-xvofr71l6rrvwgcupw.cn-shanghai.alb.aliyuncs.com";
pub fn onQueryDispatch(_: *httpz.Request, res: *httpz.Response) !void { pub fn onQueryDispatch(_: *httpz.Request, res: *httpz.Response) !void {
std.log.debug("onQueryDispatch", .{}); std.log.debug("onQueryDispatch", .{});
@ -43,8 +45,16 @@ pub fn onQueryGateway(req: *httpz.Request, res: *httpz.Response) !void {
const dispatch_seed = query.get("dispatch_seed") orelse ""; const dispatch_seed = query.get("dispatch_seed") orelse "";
std.log.info("Get DispatchSeed >> {s}", .{dispatch_seed}); std.log.info("Get DispatchSeed >> {s}", .{dispatch_seed});
const host = selectHost(version); const host = selectHost(version);
const gatewayUrl = constructUrl(host, version, dispatch_seed); var gatewayUrl: []const u8 = undefined;
//Check if the client is CE version
if (std.mem.startsWith(u8, version, "OSCE") or std.mem.startsWith(u8, version, "CNCE")) {
gatewayUrl = constructCEUrl(host, version, dispatch_seed);
std.log.info("Constructed CE Gateway URL >> {s}", .{gatewayUrl});
} else {
gatewayUrl = constructUrl(host, version, dispatch_seed);
std.log.info("Constructed Gateway URL >> {s}", .{gatewayUrl}); std.log.info("Constructed Gateway URL >> {s}", .{gatewayUrl});
}
const hotfix = try hotfixInfo.Parser(res.arena, "hotfix.json", version); const hotfix = try hotfixInfo.Parser(res.arena, "hotfix.json", version);
var assetBundleUrl: []const u8 = undefined; var assetBundleUrl: []const u8 = undefined;
@ -90,19 +100,46 @@ pub fn onQueryGateway(req: *httpz.Request, res: *httpz.Response) !void {
//std.log.info("\x1b[33;1mProtobuf Message >> {}\x1b[0m", .{gateserver_proto}); //std.log.info("\x1b[33;1mProtobuf Message >> {}\x1b[0m", .{gateserver_proto});
assetBundleUrl = hotfix.assetBundleUrl; assetBundleUrl = hotfix.assetBundleUrl;
//Check if the client is CE version
if (std.mem.startsWith(u8, version, "OSCE") or std.mem.startsWith(u8, version, "CNCE")) {
exResourceUrl = "";
} else {
exResourceUrl = hotfix.exResourceUrl; exResourceUrl = hotfix.exResourceUrl;
}
luaUrl = hotfix.luaUrl; luaUrl = hotfix.luaUrl;
iFixUrl = hotfix.iFixUrl; iFixUrl = hotfix.iFixUrl;
if (assetBundleUrl.len == 0 or exResourceUrl.len == 0 or luaUrl.len == 0 or iFixUrl.len == 0) { if (assetBundleUrl.len == 0 or exResourceUrl.len == 0 or luaUrl.len == 0 or iFixUrl.len == 0) {
assetBundleUrl = gateserver_proto.asset_bundle_url.Owned.str; assetBundleUrl = gateserver_proto.asset_bundle_url.Owned.str;
//Check if the client is CE version
if (std.mem.startsWith(u8, version, "OSCE") or std.mem.startsWith(u8, version, "CNCE")) {
exResourceUrl = "";
} else {
exResourceUrl = gateserver_proto.ex_resource_url.Owned.str; exResourceUrl = gateserver_proto.ex_resource_url.Owned.str;
}
luaUrl = gateserver_proto.lua_url.Owned.str;
iFixUrl = gateserver_proto.ifix_url.Owned.str;
try hotfixInfo.putValue(version, assetBundleUrl, exResourceUrl, luaUrl, iFixUrl);
} else {
// Check if exResourceUrl has changed
const latestExResourceUrl = gateserver_proto.ex_resource_url.Owned.str;
if (!std.mem.eql(u8, exResourceUrl, latestExResourceUrl)) {
std.log.info("exResourceUrl changed from '{s}' to '{s}'", .{ exResourceUrl, latestExResourceUrl });
assetBundleUrl = gateserver_proto.asset_bundle_url.Owned.str;
//Check if the client is CE version
if (std.mem.startsWith(u8, version, "OSCE") or std.mem.startsWith(u8, version, "CNCE")) {
exResourceUrl = "";
} else {
exResourceUrl = latestExResourceUrl;
}
luaUrl = gateserver_proto.lua_url.Owned.str; luaUrl = gateserver_proto.lua_url.Owned.str;
iFixUrl = gateserver_proto.ifix_url.Owned.str; iFixUrl = gateserver_proto.ifix_url.Owned.str;
try hotfixInfo.putValue(version, assetBundleUrl, exResourceUrl, luaUrl, iFixUrl); try hotfixInfo.putValue(version, assetBundleUrl, exResourceUrl, luaUrl, iFixUrl);
} }
}
std.log.info("Get AssetBundleUrl >> {s}", .{assetBundleUrl}); std.log.info("Get AssetBundleUrl >> {s}", .{assetBundleUrl});
std.log.info("Get ExResourceUrl >> {s}", .{exResourceUrl}); std.log.info("Get ExResourceUrl >> {s}", .{exResourceUrl});
std.log.info("Get LuaUrl >> {s}", .{luaUrl}); std.log.info("Get LuaUrl >> {s}", .{luaUrl});
@ -120,8 +157,17 @@ pub fn onQueryGateway(req: *httpz.Request, res: *httpz.Response) !void {
proto.network_diagnostic = true; proto.network_diagnostic = true;
proto.enable_android_middle_package = true; proto.enable_android_middle_package = true;
proto.use_new_networking = true; proto.use_new_networking = true;
//Check if the client is CE version
if (std.mem.startsWith(u8, version, "OSCE") or std.mem.startsWith(u8, version, "CNCE")) {
proto.enable_design_data_version_update = false;
proto.enable_version_update = false;
std.log.info("CE client version {s} detected, skipping design_data download.", .{version});
} else {
proto.enable_design_data_version_update = true; proto.enable_design_data_version_update = true;
proto.enable_version_update = true; proto.enable_version_update = true;
}
proto.mtp_switch = true; proto.mtp_switch = true;
proto.forbid_recharge = true; proto.forbid_recharge = true;
proto.close_redeem_code = true; proto.close_redeem_code = true;
@ -149,6 +195,10 @@ pub fn selectHost(version: []const u8) []const u8 {
return OSPROD_HOST; return OSPROD_HOST;
} else if (std.mem.startsWith(u8, version, "OSBETA")) { } else if (std.mem.startsWith(u8, version, "OSBETA")) {
return OSBETA_HOST; return OSBETA_HOST;
} else if (std.mem.startsWith(u8, version, "OSCE")) {
return OSCE_HOST;
} else if (std.mem.startsWith(u8, version, "CNCE")) {
return CNCE_HOST;
} else { } else {
return ""; return "";
} }
@ -157,3 +207,7 @@ pub fn selectHost(version: []const u8) []const u8 {
pub fn constructUrl(host: []const u8, version: []const u8, dispatch_seed: []const u8) []const u8 { pub fn constructUrl(host: []const u8, version: []const u8, dispatch_seed: []const u8) []const u8 {
return std.fmt.allocPrint(std.heap.page_allocator, "https://{s}/query_gateway?version={s}&dispatch_seed={s}&language_type=1&platform_type=2&channel_id=1&sub_channel_id=1&is_need_url=1&account_type=1", .{ host, version, dispatch_seed }) catch ""; return std.fmt.allocPrint(std.heap.page_allocator, "https://{s}/query_gateway?version={s}&dispatch_seed={s}&language_type=1&platform_type=2&channel_id=1&sub_channel_id=1&is_need_url=1&account_type=1", .{ host, version, dispatch_seed }) catch "";
} }
pub fn constructCEUrl(host: []const u8, version: []const u8, dispatch_seed: []const u8) []const u8 {
return std.fmt.allocPrint(std.heap.page_allocator, "http://{s}/query_gateway?version={s}&dispatch_seed={s}&language_type=1&platform_type=2&channel_id=1&sub_channel_id=1&is_need_url=1&account_type=1", .{ host, version, dispatch_seed }) catch "";
}

File diff suppressed because one or more lines are too long

View file

@ -83,6 +83,7 @@ const HandlerList = [_]struct { CmdID, Action }{
.{ CmdID.CmdGetTutorialGuideCsReq, mission.onGetTutorialGuideStatus }, .{ CmdID.CmdGetTutorialGuideCsReq, mission.onGetTutorialGuideStatus },
.{ CmdID.CmdGetMissionStatusCsReq, mission.onGetMissionStatus }, .{ CmdID.CmdGetMissionStatusCsReq, mission.onGetMissionStatus },
.{ CmdID.CmdGetTutorialCsReq, mission.onGetTutorialStatus }, .{ CmdID.CmdGetTutorialCsReq, mission.onGetTutorialStatus },
.{ CmdID.CmdFinishTutorialGuideCsReq, mission.onFinishTutorialGuideStatus },
.{ CmdID.CmdUnlockTutorialGuideCsReq, mission.onUnlockTutorialGuide }, .{ CmdID.CmdUnlockTutorialGuideCsReq, mission.onUnlockTutorialGuide },
//chat //chat
.{ CmdID.CmdGetFriendListInfoCsReq, chat.onGetFriendListInfo }, .{ CmdID.CmdGetFriendListInfoCsReq, chat.onGetFriendListInfo },
@ -106,7 +107,6 @@ const HandlerList = [_]struct { CmdID, Action }{
.{ CmdID.CmdSetGroupCustomSaveDataCsReq, scene.onSetGroupCustomSaveData }, .{ CmdID.CmdSetGroupCustomSaveDataCsReq, scene.onSetGroupCustomSaveData },
//events //events
.{ CmdID.CmdGetActivityScheduleConfigCsReq, events.onGetActivity }, .{ CmdID.CmdGetActivityScheduleConfigCsReq, events.onGetActivity },
.{ CmdID.CmdUpdateServerPrefsDataCsReq, events.onUpdateServerPrefsData },
//challenge //challenge
.{ CmdID.CmdGetChallengeCsReq, challenge.onGetChallenge }, .{ CmdID.CmdGetChallengeCsReq, challenge.onGetChallenge },
.{ CmdID.CmdGetChallengeGroupStatisticsCsReq, challenge.onGetChallengeGroupStatistics }, .{ CmdID.CmdGetChallengeGroupStatisticsCsReq, challenge.onGetChallengeGroupStatistics },
@ -206,6 +206,7 @@ const DummyCmdList = [_]struct { CmdID, CmdID }{
.{ CmdID.CmdTarotBookGetDataCsReq, CmdID.CmdTarotBookGetDataScRsp }, .{ CmdID.CmdTarotBookGetDataCsReq, CmdID.CmdTarotBookGetDataScRsp },
.{ CmdID.CmdGetMarkChestCsReq, CmdID.CmdGetMarkChestScRsp }, .{ CmdID.CmdGetMarkChestCsReq, CmdID.CmdGetMarkChestScRsp },
.{ CmdID.CmdMatchThreeGetDataCsReq, CmdID.CmdMatchThreeGetDataScRsp }, .{ CmdID.CmdMatchThreeGetDataCsReq, CmdID.CmdMatchThreeGetDataScRsp },
.{ CmdID.CmdUpdateServerPrefsDataCsReq, CmdID.CmdUpdateServerPrefsDataScRsp },
.{ CmdID.CmdUpdateTrackMainMissionIdCsReq, CmdID.CmdUpdateTrackMainMissionIdScRsp }, .{ CmdID.CmdUpdateTrackMainMissionIdCsReq, CmdID.CmdUpdateTrackMainMissionIdScRsp },
.{ CmdID.CmdGetNpcMessageGroupCsReq, CmdID.CmdGetNpcMessageGroupScRsp }, .{ CmdID.CmdGetNpcMessageGroupCsReq, CmdID.CmdGetNpcMessageGroupScRsp },
.{ CmdID.CmdGetAllSaveRaidCsReq, CmdID.CmdGetAllSaveRaidScRsp }, .{ CmdID.CmdGetAllSaveRaidCsReq, CmdID.CmdGetAllSaveRaidScRsp },
@ -218,6 +219,7 @@ const DummyCmdList = [_]struct { CmdID, CmdID }{
.{ CmdID.CmdRelicSmartWearGetPlanCsReq, CmdID.CmdRelicSmartWearGetPlanScRsp }, .{ CmdID.CmdRelicSmartWearGetPlanCsReq, CmdID.CmdRelicSmartWearGetPlanScRsp },
.{ CmdID.CmdRelicSmartWearGetPinRelicCsReq, CmdID.CmdRelicSmartWearGetPinRelicScRsp }, .{ CmdID.CmdRelicSmartWearGetPinRelicCsReq, CmdID.CmdRelicSmartWearGetPinRelicScRsp },
.{ CmdID.CmdSetGrowthTargetAvatarCsReq, CmdID.CmdSetGrowthTargetAvatarScRsp }, .{ CmdID.CmdSetGrowthTargetAvatarCsReq, CmdID.CmdSetGrowthTargetAvatarScRsp },
//.{ CmdID.CmdGetStoryTokenActivityDataCsReq, CmdID.CmdGetStoryTokenActivityDataScRsp },
}; };
const SuppressLogList = [_]CmdID{CmdID.CmdSceneEntityMoveCsReq}; const SuppressLogList = [_]CmdID{CmdID.CmdSceneEntityMoveCsReq};

View file

@ -4,7 +4,6 @@ const Session = @import("../Session.zig");
const Packet = @import("../Packet.zig"); const Packet = @import("../Packet.zig");
const Config = @import("../services/config.zig"); const Config = @import("../services/config.zig");
const Data = @import("../data.zig"); const Data = @import("../data.zig");
const ChallengeData = @import("../services/challenge.zig");
const ArrayList = std.ArrayList; const ArrayList = std.ArrayList;
const Allocator = std.mem.Allocator; const Allocator = std.mem.Allocator;
@ -239,225 +238,6 @@ pub const BattleManager = struct {
return battle; return battle;
} }
}; };
pub const ChallegeStageManager = struct {
allocator: std.mem.Allocator,
pub fn init(allocator: std.mem.Allocator) ChallegeStageManager {
return ChallegeStageManager{ .allocator = allocator };
}
pub fn createChallegeStage(
self: *ChallegeStageManager,
) !protocol.SceneBattleInfo {
const config = try Config.loadGameConfig(self.allocator, "config.json");
const stage = try Config.loadStageConfig(self.allocator, "resources/StageConfig.json");
var battle = protocol.SceneBattleInfo.init(self.allocator);
const BattleBuff = protocol.BattleBuff;
for (stage.stage_config.items) |stageConf| {
if (stageConf.stage_id == ChallengeData.challenge_stageID) {
for (config.avatar_config.items, 0..) |avatarConf, idx| {
var avatar = protocol.BattleAvatar.init(self.allocator);
avatar.id = avatarConf.id;
avatar.hp = avatarConf.hp * 100;
avatar.sp_bar = .{ .sp_cur = avatarConf.sp * 100, .sp_max = 10000 };
avatar.level = avatarConf.level;
avatar.rank = avatarConf.rank;
avatar.promotion = avatarConf.promotion;
avatar.avatar_type = .AVATAR_FORMAL_TYPE;
for (avatarConf.relics.items) |relic| {
const r = try relicCoder(self.allocator, relic.id, relic.level, relic.main_affix_id, relic.stat1, relic.cnt1, relic.step1, relic.stat2, relic.cnt2, relic.step2, relic.stat3, relic.cnt3, relic.step3, relic.stat4, relic.cnt4, relic.step4);
try avatar.relic_list.append(r);
}
const lc = protocol.BattleEquipment{
.id = avatarConf.lightcone.id,
.rank = avatarConf.lightcone.rank,
.level = avatarConf.lightcone.level,
.promotion = avatarConf.lightcone.promotion,
};
try avatar.equipment_list.append(lc);
var talentLevel: u32 = 0;
const skill_list: []const u32 = if (isInList(avatar.id, &Data.Rem)) &Data.skills else &Data.skills_old;
for (skill_list) |elem| {
talentLevel = switch (elem) {
1 => 6,
2...4 => 10,
301, 302 => if (isInList(avatar.id, &Data.Rem)) 6 else 1,
else => 1,
};
const talent = protocol.AvatarSkillTree{ .point_id = avatar.id * 1000 + elem, .level = talentLevel };
try avatar.skilltree_list.append(talent);
}
if (avatarConf.use_technique) {
var targetIndexList = ArrayList(u32).init(self.allocator);
try targetIndexList.append(0);
var buffedAvatarId = avatar.id;
if (avatar.id == 8004) {
buffedAvatarId = 8003;
} else if (avatar.id == 8006) {
buffedAvatarId = 8005;
} else if (avatar.id == 8008) {
buffedAvatarId = 8007;
}
for (Data.buffs_unlocked) |buffId| {
const idPrefix = buffId / 100;
if (idPrefix == buffedAvatarId) {
var buff = BattleBuff{
.id = buffId,
.level = 1,
.owner_index = @intCast(idx),
.wave_flag = 1,
.target_index_list = targetIndexList,
.dynamic_values = ArrayList(protocol.BattleBuff.DynamicValuesEntry).init(self.allocator),
};
try buff.dynamic_values.append(.{ .key = .{ .Const = "SkillIndex" }, .value = 0 });
try battle.buff_list.append(buff);
}
}
if (isInList(buffedAvatarId, &Data.IgnoreToughness)) {
var buff_tough = BattleBuff{
.id = 1000119, //for is_ignore toughness
.level = 1,
.owner_index = @intCast(idx),
.wave_flag = 1,
.target_index_list = targetIndexList,
.dynamic_values = ArrayList(protocol.BattleBuff.DynamicValuesEntry).init(self.allocator),
};
try buff_tough.dynamic_values.append(.{ .key = .{ .Const = "SkillIndex" }, .value = 0 });
try battle.buff_list.append(buff_tough);
}
if (buffedAvatarId == 1224) {
var buff_march = protocol.BattleBuff{
.id = 122401, //for hunt march 7th tech
.level = 1,
.owner_index = @intCast(idx),
.wave_flag = 1,
.target_index_list = targetIndexList,
.dynamic_values = ArrayList(protocol.BattleBuff.DynamicValuesEntry).init(self.allocator),
};
try buff_march.dynamic_values.appendSlice(&[_]protocol.BattleBuff.DynamicValuesEntry{
.{ .key = .{ .Const = "#ADF_1" }, .value = 3 },
.{ .key = .{ .Const = "#ADF_2" }, .value = 3 },
});
try battle.buff_list.append(buff_march);
}
if (buffedAvatarId == 1310) {
var buff_firefly = BattleBuff{
.id = 1000112, //for firefly tech
.level = 1,
.owner_index = @intCast(idx),
.wave_flag = 1,
.target_index_list = targetIndexList,
.dynamic_values = ArrayList(protocol.BattleBuff.DynamicValuesEntry).init(self.allocator),
};
try buff_firefly.dynamic_values.append(.{ .key = .{ .Const = "SkillIndex" }, .value = 0 });
try battle.buff_list.append(buff_firefly);
}
if (buffedAvatarId == 8007) {
var buff_rmc = BattleBuff{
.id = 800701, //for rmc tech
.level = 1,
.owner_index = @intCast(idx),
.wave_flag = 1,
.target_index_list = targetIndexList,
.dynamic_values = ArrayList(protocol.BattleBuff.DynamicValuesEntry).init(self.allocator),
};
try buff_rmc.dynamic_values.append(.{ .key = .{ .Const = "SkillIndex" }, .value = 0 });
try battle.buff_list.append(buff_rmc);
}
}
try battle.pve_avatar_list.append(avatar);
}
battle.battle_id = 1;
battle.stage_id = stageConf.stage_id;
battle.logic_random_seed = @intCast(@mod(std.time.timestamp(), 0xFFFFFFFF));
battle.rounds_limit = if (ChallengeData.challenge_mode != 1) 30 else 4;
battle.monster_wave_length = @intCast(stageConf.monster_list.items.len);
battle.world_level = 6;
// Monster handler
for (stageConf.monster_list.items) |wave| {
var monster_wave = protocol.SceneMonsterWave.init(self.allocator);
monster_wave.wave_param = protocol.SceneMonsterWaveParam{ .level = stageConf.level };
for (wave.items) |mob_id| {
try monster_wave.monster_list.append(.{ .monster_id = mob_id });
}
try battle.monster_wave_list.append(monster_wave);
}
// stage blessings
for (ChallengeData.challenge_blessing) |blessing| {
var targetIndexList = ArrayList(u32).init(self.allocator);
try targetIndexList.append(0);
var buff = protocol.BattleBuff{
.id = blessing,
.level = 1,
.owner_index = 0xffffffff,
.wave_flag = 0xffffffff,
.target_index_list = targetIndexList,
.dynamic_values = ArrayList(protocol.BattleBuff.DynamicValuesEntry).init(self.allocator),
};
try buff.dynamic_values.append(.{ .key = .{ .Const = "SkillIndex" }, .value = 0 });
try battle.buff_list.append(buff);
}
if (isInList(1407, Data.AllAvatars)) { //support Castorice
var targetIndexList = ArrayList(u32).init(self.allocator);
try targetIndexList.append(0);
var mazebuff_data = BattleBuff{
.id = 140703,
.level = 1,
.owner_index = 1,
.wave_flag = @intCast(stageConf.monster_list.items.len),
.target_index_list = targetIndexList,
.dynamic_values = ArrayList(protocol.BattleBuff.DynamicValuesEntry).init(self.allocator),
};
try mazebuff_data.dynamic_values.append(.{ .key = .{ .Const = "SkillIndex" }, .value = 0 });
try battle.buff_list.append(mazebuff_data);
}
// PF/AS scoring
const BattleTargetInfoEntry = protocol.SceneBattleInfo.BattleTargetInfoEntry;
battle.battle_target_info = ArrayList(BattleTargetInfoEntry).init(self.allocator);
// target hardcode
var pfTargetHead = protocol.BattleTargetList{ .battle_target_list = ArrayList(protocol.BattleTarget).init(self.allocator) };
try pfTargetHead.battle_target_list.append(.{ .id = 10002, .progress = 0, .total_progress = 0 });
var pfTargetTail = protocol.BattleTargetList{ .battle_target_list = ArrayList(protocol.BattleTarget).init(self.allocator) };
try pfTargetTail.battle_target_list.append(.{ .id = 2001, .progress = 0, .total_progress = 0 });
try pfTargetTail.battle_target_list.append(.{ .id = 2002, .progress = 0, .total_progress = 0 });
var asTargetHead = protocol.BattleTargetList{ .battle_target_list = ArrayList(protocol.BattleTarget).init(self.allocator) };
try asTargetHead.battle_target_list.append(.{ .id = 90005, .progress = 0, .total_progress = 0 });
switch (battle.stage_id) {
// PF
30019000...30019100, 30021000...30021100, 30301000...30319000 => {
try battle.battle_target_info.append(.{ .key = 1, .value = pfTargetHead });
// fill blank target
for (2..5) |i| {
try battle.battle_target_info.append(.{ .key = @intCast(i) });
}
try battle.battle_target_info.append(.{ .key = 5, .value = pfTargetTail });
},
// AS
420100...420300 => {
try battle.battle_target_info.append(.{ .key = 1, .value = asTargetHead });
},
else => {},
}
}
}
return battle;
}
};
pub fn relicCoder(allocator: Allocator, id: u32, level: u32, main_affix_id: u32, stat1: u32, cnt1: u32, step1: u32, stat2: u32, cnt2: u32, step2: u32, stat3: u32, cnt3: u32, step3: u32, stat4: u32, cnt4: u32, step4: u32) !protocol.BattleRelic { pub fn relicCoder(allocator: Allocator, id: u32, level: u32, main_affix_id: u32, stat1: u32, cnt1: u32, step1: u32, stat2: u32, cnt2: u32, step2: u32, stat3: u32, cnt3: u32, step3: u32, stat4: u32, cnt4: u32, step4: u32) !protocol.BattleRelic {
var relic = protocol.BattleRelic{ var relic = protocol.BattleRelic{
.id = id, .id = id,

View file

@ -21,7 +21,7 @@ pub const LineupManager = struct {
var lineup = protocol.LineupInfo.init(self.allocator); var lineup = protocol.LineupInfo.init(self.allocator);
lineup.mp = 5; lineup.mp = 5;
lineup.max_mp = 5; lineup.max_mp = 5;
lineup.name = .{ .Const = "CipherSR" }; lineup.name = .{ .Const = "CastoriceSR" };
for (config.avatar_config.items, 0..) |avatarConf, idx| { for (config.avatar_config.items, 0..) |avatarConf, idx| {
var avatar = protocol.LineupAvatar.init(self.allocator); var avatar = protocol.LineupAvatar.init(self.allocator);

View file

@ -127,7 +127,6 @@ pub const ChallengeSceneManager = struct {
entry_id: u32, entry_id: u32,
world_id: u32, world_id: u32,
monster_id: u32, monster_id: u32,
event_id: u32,
group_id: u32, group_id: u32,
maze_group_id: u32, maze_group_id: u32,
) !protocol.SceneInfo { ) !protocol.SceneInfo {
@ -177,7 +176,7 @@ pub const ChallengeSceneManager = struct {
var monster_info = protocol.SceneNpcMonsterInfo.init(self.allocator); var monster_info = protocol.SceneNpcMonsterInfo.init(self.allocator);
monster_info.monster_id = monster_id; monster_info.monster_id = monster_id;
monster_info.event_id = event_id; monster_info.event_id = monsConf.eventId;
monster_info.world_level = 6; monster_info.world_level = 6;
try scene_group.entity_list.append(.{ try scene_group.entity_list.append(.{

View file

@ -172,6 +172,7 @@ pub fn onGetBigDataAll(session: *Session, packet: *const Packet, allocator: Allo
var rsp = protocol.GetBigDataAllRecommendScRsp.init(allocator); var rsp = protocol.GetBigDataAllRecommendScRsp.init(allocator);
rsp.retcode = 0; rsp.retcode = 0;
rsp.IANNEEIJAKH = req.IANNEEIJAKH; rsp.IANNEEIJAKH = req.IANNEEIJAKH;
std.debug.print("PRINT BIG DATA ALL REQ {}\n", .{req});
try session.send(CmdID.CmdGetBigDataAllRecommendScRsp, rsp); try session.send(CmdID.CmdGetBigDataAllRecommendScRsp, rsp);
} }
pub fn onGetBigData(session: *Session, packet: *const Packet, allocator: Allocator) !void { pub fn onGetBigData(session: *Session, packet: *const Packet, allocator: Allocator) !void {
@ -180,5 +181,6 @@ pub fn onGetBigData(session: *Session, packet: *const Packet, allocator: Allocat
rsp.retcode = 0; rsp.retcode = 0;
rsp.IANNEEIJAKH = req.IANNEEIJAKH; rsp.IANNEEIJAKH = req.IANNEEIJAKH;
rsp.EIGPMIBCIKG = req.EIGPMIBCIKG; rsp.EIGPMIBCIKG = req.EIGPMIBCIKG;
std.debug.print("PRINT BIG DATA REQ {}\n", .{req});
try session.send(CmdID.CmdGetBigDataRecommendScRsp, rsp); try session.send(CmdID.CmdGetBigDataRecommendScRsp, rsp);
} }

View file

@ -4,9 +4,7 @@ const Session = @import("../Session.zig");
const Packet = @import("../Packet.zig"); const Packet = @import("../Packet.zig");
const Config = @import("config.zig"); const Config = @import("config.zig");
const Data = @import("../data.zig"); const Data = @import("../data.zig");
const ChallengeData = @import("challenge.zig");
const BattleManager = @import("../manager/battle_mgr.zig").BattleManager; const BattleManager = @import("../manager/battle_mgr.zig").BattleManager;
const ChallegeStageManager = @import("../manager/battle_mgr.zig").ChallegeStageManager;
const ArrayList = std.ArrayList; const ArrayList = std.ArrayList;
const Allocator = std.mem.Allocator; const Allocator = std.mem.Allocator;
@ -59,8 +57,7 @@ pub fn onStartBattleCollege(session: *Session, packet: *const Packet, allocator:
pub fn onSceneCastSkill(session: *Session, packet: *const Packet, allocator: Allocator) !void { pub fn onSceneCastSkill(session: *Session, packet: *const Packet, allocator: Allocator) !void {
var battle_mgr = BattleManager.init(allocator); var battle_mgr = BattleManager.init(allocator);
const battle = try battle_mgr.createBattle(); const battle = try battle_mgr.createBattle();
var challege_mgr = ChallegeStageManager.init(allocator);
const challenge = try challege_mgr.createChallegeStage();
const req = try packet.getProto(protocol.SceneCastSkillCsReq, allocator); const req = try packet.getProto(protocol.SceneCastSkillCsReq, allocator);
var monster_battle_info_list = ArrayList(protocol.HitMonsterBattleInfo).init(allocator); var monster_battle_info_list = ArrayList(protocol.HitMonsterBattleInfo).init(allocator);
try monster_battle_info_list.appendSlice(&[_]protocol.HitMonsterBattleInfo{ try monster_battle_info_list.appendSlice(&[_]protocol.HitMonsterBattleInfo{
@ -73,11 +70,7 @@ pub fn onSceneCastSkill(session: *Session, packet: *const Packet, allocator: All
.retcode = 0, .retcode = 0,
.cast_entity_id = req.cast_entity_id, .cast_entity_id = req.cast_entity_id,
.monster_battle_info = monster_battle_info_list, .monster_battle_info = monster_battle_info_list,
.battle_info = if (req.assist_monster_entity_id_list.items.len > 0 or .battle_info = if (req.assist_monster_entity_id_list.items.len > 0 or (req.attacked_by_entity_id >= 1 and req.attacked_by_entity_id <= 99)) battle else null,
(req.attacked_by_entity_id >= 1 and req.attacked_by_entity_id <= 99))
(if (ChallengeData.on_challenge) challenge else battle)
else
null,
}); });
} }

View file

@ -5,7 +5,6 @@ const Packet = @import("../Packet.zig");
const Config = @import("config.zig"); const Config = @import("config.zig");
const Res_config = @import("res_config.zig"); const Res_config = @import("res_config.zig");
const Data = @import("../data.zig"); const Data = @import("../data.zig");
const ChallegeStageManager = @import("../manager/battle_mgr.zig").ChallegeStageManager;
const SceneManager = @import("../manager/scene_mgr.zig").SceneManager; const SceneManager = @import("../manager/scene_mgr.zig").SceneManager;
const ChallengeSceneManager = @import("../manager/scene_mgr.zig").ChallengeSceneManager; const ChallengeSceneManager = @import("../manager/scene_mgr.zig").ChallengeSceneManager;
const LineupManager = @import("../manager/lineup_mgr.zig").LineupManager; const LineupManager = @import("../manager/lineup_mgr.zig").LineupManager;
@ -40,13 +39,6 @@ fn contains(list: *const std.ArrayListAligned(u32, null), value: u32) bool {
} }
return false; return false;
} }
pub var challenge_stageID: u32 = 0;
pub var challenge_mode: u32 = 0;
pub var on_challenge: bool = false;
pub const ChallengeBlessing = ArrayList(u32);
pub var challenge_blessing: []const u32 = &.{};
pub fn onGetChallenge(session: *Session, _: *const Packet, allocator: Allocator) !void { pub fn onGetChallenge(session: *Session, _: *const Packet, allocator: Allocator) !void {
const challenge_config = try Config.loadChallengeConfig(allocator, "resources/ChallengeMazeConfig.json"); const challenge_config = try Config.loadChallengeConfig(allocator, "resources/ChallengeMazeConfig.json");
@ -85,18 +77,12 @@ pub fn onLeaveChallenge(session: *Session, _: *const Packet, allocator: Allocato
.lineup = lineup, .lineup = lineup,
.scene = scene_info, .scene = scene_info,
}); });
on_challenge = false;
challenge_mode = 0;
try session.send(CmdID.CmdLeaveChallengeScRsp, protocol.LeaveChallengeScRsp{ try session.send(CmdID.CmdLeaveChallengeScRsp, protocol.LeaveChallengeScRsp{
.retcode = 0, .retcode = 0,
}); });
} }
//TODO: IMPLEMENT CHALLENGE BUFF AND FIX MENU
pub fn onStartChallenge(session: *Session, packet: *const Packet, allocator: Allocator) !void { pub fn onStartChallenge(session: *Session, packet: *const Packet, allocator: Allocator) !void {
var challenge_blessing_list = ChallengeBlessing{
.allocator = std.heap.page_allocator,
.items = &.{},
.capacity = 0,
};
const req = try packet.getProto(protocol.StartChallengeCsReq, allocator); const req = try packet.getProto(protocol.StartChallengeCsReq, allocator);
var rsp = protocol.StartChallengeScRsp.init(allocator); var rsp = protocol.StartChallengeScRsp.init(allocator);
const challenge_config = try Config.loadChallengeConfig(allocator, "resources/ChallengeMazeConfig.json"); const challenge_config = try Config.loadChallengeConfig(allocator, "resources/ChallengeMazeConfig.json");
@ -104,12 +90,10 @@ pub fn onStartChallenge(session: *Session, packet: *const Packet, allocator: All
const maze_config = try Config.loadMazePlaneConfig(allocator, "resources/MazePlane.json"); const maze_config = try Config.loadMazePlaneConfig(allocator, "resources/MazePlane.json");
var avatarList = std.ArrayList(u32).init(allocator); var avatarList = std.ArrayList(u32).init(allocator);
var lineup = protocol.LineupInfo.init(allocator); var lineup1 = protocol.LineupInfo.init(allocator);
lineup.mp = 5; lineup1.mp = 5;
lineup.max_mp = 5; lineup1.max_mp = 5;
lineup.extra_lineup_type = if (NodeCheck.challenge_node == 0) protocol.ExtraLineupType.LINEUP_CHALLENGE else protocol.ExtraLineupType.LINEUP_CHALLENGE_2; lineup1.extra_lineup_type = protocol.ExtraLineupType.LINEUP_CHALLENGE;
if (NodeCheck.challenge_node == 0) {
for (req.first_lineup.items, 0..) |avt, idx| { for (req.first_lineup.items, 0..) |avt, idx| {
var list = protocol.LineupAvatar.init(allocator); var list = protocol.LineupAvatar.init(allocator);
try avatarList.append(avt); try avatarList.append(avt);
@ -119,23 +103,27 @@ pub fn onStartChallenge(session: *Session, packet: *const Packet, allocator: All
list.avatar_type = protocol.AvatarType.AVATAR_FORMAL_TYPE; list.avatar_type = protocol.AvatarType.AVATAR_FORMAL_TYPE;
list.hp = 10000; list.hp = 10000;
list.sp_bar = .{ .sp_cur = 10000, .sp_max = 10000 }; list.sp_bar = .{ .sp_cur = 10000, .sp_max = 10000 };
try lineup.avatar_list.append(list); try lineup1.avatar_list.append(list);
} }
try rsp.lineup_list.append(lineup); try rsp.lineup_list.append(lineup1);
} else {
var avatarList2 = std.ArrayList(u32).init(allocator);
var lineup2 = protocol.LineupInfo.init(allocator);
lineup2.mp = 5;
lineup2.max_mp = 5;
lineup2.extra_lineup_type = protocol.ExtraLineupType.LINEUP_CHALLENGE_2;
for (req.second_lineup.items, 0..) |avt, idx| { for (req.second_lineup.items, 0..) |avt, idx| {
var list = protocol.LineupAvatar.init(allocator); var list = protocol.LineupAvatar.init(allocator);
try avatarList.append(avt); try avatarList2.append(avt);
list.id = avt; list.id = avt;
list.slot = @intCast(idx); list.slot = @intCast(idx);
list.satiety = 0; list.satiety = 0;
list.avatar_type = protocol.AvatarType.AVATAR_FORMAL_TYPE; list.avatar_type = protocol.AvatarType.AVATAR_FORMAL_TYPE;
list.hp = 10000; list.hp = 10000;
list.sp_bar = .{ .sp_cur = 10000, .sp_max = 10000 }; list.sp_bar = .{ .sp_cur = 10000, .sp_max = 10000 };
try lineup.avatar_list.append(list); try lineup2.avatar_list.append(list);
}
try rsp.lineup_list.append(lineup);
} }
try rsp.lineup_list.append(lineup2);
var cur_challenge_info = protocol.CurChallenge.init(allocator); var cur_challenge_info = protocol.CurChallenge.init(allocator);
cur_challenge_info.challenge_id = req.challenge_id; cur_challenge_info.challenge_id = req.challenge_id;
@ -148,7 +136,6 @@ pub fn onStartChallenge(session: *Session, packet: *const Packet, allocator: All
var entryID: u32 = 0; var entryID: u32 = 0;
var worldID: u32 = 0; var worldID: u32 = 0;
var monsterID: u32 = 0; var monsterID: u32 = 0;
var eventID: u32 = 0;
var groupID: u32 = 0; var groupID: u32 = 0;
var maze_groupID: u32 = 0; var maze_groupID: u32 = 0;
if (NodeCheck.challenge_node == 0) { if (NodeCheck.challenge_node == 0) {
@ -159,38 +146,9 @@ pub fn onStartChallenge(session: *Session, packet: *const Packet, allocator: All
if (entrance.id == challengeConf.map_entrance_id) { if (entrance.id == challengeConf.map_entrance_id) {
for (maze_config.maze_plane_config.items) |maze| { for (maze_config.maze_plane_config.items) |maze| {
if (contains(&maze.floor_id_list, entrance.floor_id)) { if (contains(&maze.floor_id_list, entrance.floor_id)) {
if (req.challenge_id > 20000 and req.challenge_id < 30000) {
var story_buff = protocol.ChallengeStoryBuffList{
.buff_list = ArrayList(u32).init(allocator),
};
try story_buff.buff_list.append(challengeConf.maze_buff_id);
try story_buff.buff_list.append(req.stage_info.?.IEICDGGELNE.?.story_info.buff_one);
try challenge_blessing_list.appendSlice(story_buff.buff_list.items);
cur_challenge_info.stage_info = .{
.IEICDGGELNE = .{
.cur_story_buffs = story_buff,
},
};
challenge_mode = 1;
} else if (req.challenge_id > 30000) {
var boss_buff = protocol.ChallengeBossBuffList{
.buff_list = ArrayList(u32).init(allocator),
.challenge_boss_const = 1,
};
try boss_buff.buff_list.append(challengeConf.maze_buff_id);
try boss_buff.buff_list.append(req.stage_info.?.IEICDGGELNE.?.boss_info.buff_one);
try challenge_blessing_list.appendSlice(boss_buff.buff_list.items);
cur_challenge_info.stage_info = .{
.IEICDGGELNE = .{
.cur_boss_buffs = boss_buff,
},
};
challenge_mode = 2;
}
floorID = entrance.floor_id; floorID = entrance.floor_id;
worldID = maze.world_id; worldID = maze.world_id;
monsterID = challengeConf.npc_monster_id_list1.items[challengeConf.npc_monster_id_list1.items.len - 1]; monsterID = challengeConf.npc_monster_id_list1.items[challengeConf.npc_monster_id_list1.items.len - 1];
eventID = challengeConf.event_id_list1.items[challengeConf.event_id_list1.items.len - 1];
groupID = challengeConf.maze_group_id1; groupID = challengeConf.maze_group_id1;
maze_groupID = challengeConf.maze_group_id1; maze_groupID = challengeConf.maze_group_id1;
planeID = maze.challenge_plane_id; planeID = maze.challenge_plane_id;
@ -209,46 +167,13 @@ pub fn onStartChallenge(session: *Session, packet: *const Packet, allocator: All
if (entrance.id == challengeConf.map_entrance_id2) { if (entrance.id == challengeConf.map_entrance_id2) {
for (maze_config.maze_plane_config.items) |maze| { for (maze_config.maze_plane_config.items) |maze| {
if (contains(&maze.floor_id_list, entrance.floor_id)) { if (contains(&maze.floor_id_list, entrance.floor_id)) {
if (challengeConf.maze_group_id2) |id| {
if (req.challenge_id > 20000 and req.challenge_id < 30000) {
var story_buff = protocol.ChallengeStoryBuffList{
.buff_list = ArrayList(u32).init(allocator),
};
try story_buff.buff_list.append(challengeConf.maze_buff_id);
try story_buff.buff_list.append(req.stage_info.?.IEICDGGELNE.?.story_info.buff_two);
try challenge_blessing_list.appendSlice(story_buff.buff_list.items);
cur_challenge_info.stage_info = .{
.IEICDGGELNE = .{
.cur_story_buffs = story_buff,
},
};
challenge_mode = 1;
} else if (req.challenge_id > 30000) {
var boss_buff = protocol.ChallengeBossBuffList{
.buff_list = ArrayList(u32).init(allocator),
.challenge_boss_const = 1,
};
try boss_buff.buff_list.append(challengeConf.maze_buff_id);
try boss_buff.buff_list.append(req.stage_info.?.IEICDGGELNE.?.boss_info.buff_two);
try challenge_blessing_list.appendSlice(boss_buff.buff_list.items);
cur_challenge_info.stage_info = .{
.IEICDGGELNE = .{
.cur_boss_buffs = boss_buff,
},
};
challenge_mode = 2;
}
floorID = entrance.floor_id; floorID = entrance.floor_id;
worldID = maze.world_id; worldID = maze.world_id;
monsterID = challengeConf.npc_monster_id_list2.items[challengeConf.npc_monster_id_list2.items.len - 1]; monsterID = challengeConf.npc_monster_id_list2.items[challengeConf.npc_monster_id_list2.items.len - 1];
eventID = challengeConf.event_id_list2.items[challengeConf.event_id_list2.items.len - 1]; groupID = challengeConf.maze_group_id2;
groupID = id; maze_groupID = challengeConf.maze_group_id2;
maze_groupID = id;
planeID = maze.challenge_plane_id; planeID = maze.challenge_plane_id;
entryID = challengeConf.map_entrance_id2; entryID = challengeConf.map_entrance_id2;
} else {
std.debug.print("THIS CHALLENGE ID: {} DOES NOT SUPPORT 2ND NODE. PLEASE DO COMMAND /node TO SWITCH BACK TO FIRST NODE\n", .{req.challenge_id});
}
} }
} }
} }
@ -258,13 +183,12 @@ pub fn onStartChallenge(session: *Session, packet: *const Packet, allocator: All
} }
var scene_PF_manager = ChallengeSceneManager.init(allocator); var scene_PF_manager = ChallengeSceneManager.init(allocator);
const scene_info = try scene_PF_manager.createScene( const scene_info = try scene_PF_manager.createScene(
avatarList, if (NodeCheck.challenge_node == 0) avatarList else avatarList2,
planeID, planeID,
floorID, floorID,
entryID, entryID,
worldID, worldID,
monsterID, monsterID,
eventID,
groupID, groupID,
maze_groupID, maze_groupID,
); );
@ -272,9 +196,12 @@ pub fn onStartChallenge(session: *Session, packet: *const Packet, allocator: All
rsp.scene = scene_info; rsp.scene = scene_info;
rsp.cur_challenge = cur_challenge_info; rsp.cur_challenge = cur_challenge_info;
on_challenge = true;
challenge_stageID = eventID;
challenge_blessing = challenge_blessing_list.items[0..challenge_blessing_list.items.len];
try session.send(CmdID.CmdStartChallengeScRsp, rsp); try session.send(CmdID.CmdStartChallengeScRsp, rsp);
std.debug.print("SEND PLANE ID {} FLOOR ID {} ENTRY ID {} GROUP ID {} MAZE GROUP ID {}\n", .{ planeID, floorID, entryID, groupID, maze_groupID }); std.debug.print("SEND PLANE ID {} FLOOR ID {} ENTRY ID {} GROUP ID {} MAZE GROUP ID {}\n", .{ planeID, floorID, entryID, groupID, maze_groupID });
try session.send(CmdID.CmdEnterSceneByServerScNotify, protocol.EnterSceneByServerScNotify{
.lineup = if (NodeCheck.challenge_node == 0) lineup1 else lineup2,
.reason = protocol.EnterSceneReason.ENTER_SCENE_REASON_DIMENSION_MERGE,
.scene = scene_info,
});
} }

View file

@ -11,11 +11,7 @@ const BattleConfig = struct {
monster_level: u32, monster_level: u32,
blessings: ArrayList(u32), blessings: ArrayList(u32),
}; };
const Stage = struct {
level: u32,
stage_id: u32,
monster_list: ArrayList(ArrayList(u32)),
};
const ExtraMazeBuff = struct { const ExtraMazeBuff = struct {
enable: bool, enable: bool,
mazebuff: ArrayList(u32), mazebuff: ArrayList(u32),
@ -58,33 +54,17 @@ const Avatar = struct {
relics: ArrayList(Relic), relics: ArrayList(Relic),
use_technique: bool, use_technique: bool,
}; };
const PlayerIcon = struct {
id: u32,
};
const MainMission = struct {
main_mission_id: u32,
};
const TutorialGuide = struct {
guide_group_id: u32,
};
const Tutorial = struct {
tutorial_id: u32,
};
const Activity = struct {
activity_module_list: ArrayList(u32),
panel_id: u32,
};
const ChallengeConfig = struct { const ChallengeConfig = struct {
id: u32, id: u32, //
npc_monster_id_list1: ArrayList(u32), npc_monster_id_list1: ArrayList(u32), //
npc_monster_id_list2: ArrayList(u32), npc_monster_id_list2: ArrayList(u32), //
event_id_list1: ArrayList(u32), event_id_list1: ArrayList(u32), //
event_id_list2: ArrayList(u32), event_id_list2: ArrayList(u32), //
map_entrance_id: u32, map_entrance_id: u32, //
map_entrance_id2: u32, map_entrance_id2: u32, //
maze_group_id1: u32, maze_group_id1: u32, //
maze_group_id2: ?u32, // to check if it missing MazeGroupID2 field maze_group_id2: u32, //
maze_buff_id: u32,
}; };
const MapEntrance = struct { const MapEntrance = struct {
@ -105,24 +85,6 @@ pub const GameConfig = struct {
battle_config: BattleConfig, battle_config: BattleConfig,
avatar_config: ArrayList(Avatar), avatar_config: ArrayList(Avatar),
}; };
pub const StageConfig = struct {
stage_config: ArrayList(Stage),
};
pub const PlayerIconConfig = struct {
player_icon_config: ArrayList(PlayerIcon),
};
pub const MainMissionConfig = struct {
main_mission_config: ArrayList(MainMission),
};
pub const TutorialGuideConfig = struct {
tutorial_guide_config: ArrayList(TutorialGuide),
};
pub const TutorialConfig = struct {
tutorial_config: ArrayList(Tutorial),
};
pub const ActivityConfig = struct {
activity_config: ArrayList(Activity),
};
pub const ChallengeMazeConfig = struct { pub const ChallengeMazeConfig = struct {
challenge_config: ArrayList(ChallengeConfig), challenge_config: ArrayList(ChallengeConfig),
}; };
@ -159,30 +121,6 @@ pub fn loadGameConfig(allocator: Allocator, filename: []const u8) ErrorSet!GameC
return loadConfig(GameConfig, parseConfig, allocator, filename); return loadConfig(GameConfig, parseConfig, allocator, filename);
} }
pub fn loadStageConfig(allocator: Allocator, filename: []const u8) ErrorSet!StageConfig {
return loadConfig(StageConfig, parseStageConfig, allocator, filename);
}
pub fn loadPlayerIconConfig(allocator: Allocator, filename: []const u8) ErrorSet!PlayerIconConfig {
return loadConfig(PlayerIconConfig, parsePlayerIconConfig, allocator, filename);
}
pub fn loadMainMissionConfig(allocator: Allocator, filename: []const u8) ErrorSet!MainMissionConfig {
return loadConfig(MainMissionConfig, parseMainMissionConfig, allocator, filename);
}
pub fn loadTutorialGuideConfig(allocator: Allocator, filename: []const u8) ErrorSet!TutorialGuideConfig {
return loadConfig(TutorialGuideConfig, parseTutorialGuideConfig, allocator, filename);
}
pub fn loadTutorialConfig(allocator: Allocator, filename: []const u8) ErrorSet!TutorialConfig {
return loadConfig(TutorialConfig, parseTutorialConfig, allocator, filename);
}
pub fn loadActivityConfig(allocator: Allocator, filename: []const u8) ErrorSet!ActivityConfig {
return loadConfig(ActivityConfig, parseActivityConfig, allocator, filename);
}
pub fn loadChallengeConfig(allocator: Allocator, filename: []const u8) ErrorSet!ChallengeMazeConfig { pub fn loadChallengeConfig(allocator: Allocator, filename: []const u8) ErrorSet!ChallengeMazeConfig {
return loadConfig(ChallengeMazeConfig, parseChallengeConfig, allocator, filename); return loadConfig(ChallengeMazeConfig, parseChallengeConfig, allocator, filename);
} }
@ -206,6 +144,8 @@ pub fn parseConfig(root: std.json.Value, allocator: Allocator) ErrorSet!GameConf
.blessings = ArrayList(u32).init(allocator), .blessings = ArrayList(u32).init(allocator),
}; };
std.debug.print("loading config stageID = {}\n", .{battle_config.stage_id});
for (battle_config_json.object.get("monster_wave").?.array.items) |wave| { for (battle_config_json.object.get("monster_wave").?.array.items) |wave| {
var wave_list = ArrayList(u32).init(allocator); var wave_list = ArrayList(u32).init(allocator);
for (wave.array.items) |monster| { for (wave.array.items) |monster| {
@ -252,100 +192,11 @@ pub fn parseConfig(root: std.json.Value, allocator: Allocator) ErrorSet!GameConf
.avatar_config = avatar_config, .avatar_config = avatar_config,
}; };
} }
pub fn parseStageConfig(root: std.json.Value, allocator: Allocator) ErrorSet!StageConfig {
var stage_config = ArrayList(Stage).init(allocator);
for (root.object.get("stage_config").?.array.items) |stage_json| {
var stage = Stage{
.level = @intCast(stage_json.object.get("Level").?.integer),
.stage_id = @intCast(stage_json.object.get("StageID").?.integer),
.monster_list = ArrayList(ArrayList(u32)).init(allocator),
};
for (stage_json.object.get("MonsterList").?.array.items) |wave| {
var wave_list = ArrayList(u32).init(allocator);
for (wave.array.items) |monster| {
try wave_list.append(@intCast(monster.integer));
}
try stage.monster_list.append(wave_list);
}
try stage_config.append(stage);
}
return StageConfig{
.stage_config = stage_config,
};
}
fn parsePlayerIconConfig(root: std.json.Value, allocator: Allocator) ErrorSet!PlayerIconConfig {
var player_icon_config = ArrayList(PlayerIcon).init(allocator);
for (root.object.get("player_icon_config").?.array.items) |icon_json| {
const icon = PlayerIcon{
.id = @intCast(icon_json.object.get("ID").?.integer),
};
try player_icon_config.append(icon);
}
return PlayerIconConfig{
.player_icon_config = player_icon_config,
};
}
fn parseMainMissionConfig(root: std.json.Value, allocator: Allocator) ErrorSet!MainMissionConfig {
var main_mission_config = ArrayList(MainMission).init(allocator);
for (root.object.get("main_mission_config").?.array.items) |main_json| {
const main_mission = MainMission{
.main_mission_id = @intCast(main_json.object.get("MainMissionID").?.integer),
};
try main_mission_config.append(main_mission);
}
return MainMissionConfig{
.main_mission_config = main_mission_config,
};
}
fn parseTutorialGuideConfig(root: std.json.Value, allocator: Allocator) ErrorSet!TutorialGuideConfig {
var tutorial_guide_config = ArrayList(TutorialGuide).init(allocator);
for (root.object.get("tutorial_guide_config").?.array.items) |guide_json| {
const tutorial_guide = TutorialGuide{
.guide_group_id = @intCast(guide_json.object.get("GroupID").?.integer),
};
try tutorial_guide_config.append(tutorial_guide);
}
return TutorialGuideConfig{
.tutorial_guide_config = tutorial_guide_config,
};
}
fn parseTutorialConfig(root: std.json.Value, allocator: Allocator) ErrorSet!TutorialConfig {
var tutorial_config = ArrayList(Tutorial).init(allocator);
for (root.object.get("tutorial_config").?.array.items) |tutorial_json| {
const tutorial = Tutorial{
.tutorial_id = @intCast(tutorial_json.object.get("TutorialID").?.integer),
};
try tutorial_config.append(tutorial);
}
return TutorialConfig{
.tutorial_config = tutorial_config,
};
}
fn parseActivityConfig(root: std.json.Value, allocator: Allocator) ErrorSet!ActivityConfig {
var activity_config = ArrayList(Activity).init(allocator);
for (root.object.get("activity_config").?.array.items) |activity_json| {
var activity = Activity{
.panel_id = @intCast(activity_json.object.get("ActivityID").?.integer),
.activity_module_list = ArrayList(u32).init(allocator),
};
for (activity_json.object.get("ActivityModuleIDList").?.array.items) |id| {
try activity.activity_module_list.append(@intCast(id.integer));
}
try activity_config.append(activity);
}
return ActivityConfig{
.activity_config = activity_config,
};
}
fn parseChallengeConfig(root: std.json.Value, allocator: Allocator) ErrorSet!ChallengeMazeConfig { fn parseChallengeConfig(root: std.json.Value, allocator: Allocator) ErrorSet!ChallengeMazeConfig {
var challenge_config = ArrayList(ChallengeConfig).init(allocator); var challenge_config = ArrayList(ChallengeConfig).init(allocator);
for (root.object.get("challenge_config").?.array.items) |challenge_json| { for (root.object.get("challenge_config").?.array.items) |challenge_json| {
var challenge = ChallengeConfig{ var challenge = ChallengeConfig{
.id = @intCast(challenge_json.object.get("ID").?.integer), .id = @intCast(challenge_json.object.get("ID").?.integer),
.maze_buff_id = @intCast(challenge_json.object.get("MazeBuffID").?.integer),
.npc_monster_id_list1 = ArrayList(u32).init(allocator), .npc_monster_id_list1 = ArrayList(u32).init(allocator),
.npc_monster_id_list2 = ArrayList(u32).init(allocator), .npc_monster_id_list2 = ArrayList(u32).init(allocator),
.event_id_list1 = ArrayList(u32).init(allocator), .event_id_list1 = ArrayList(u32).init(allocator),
@ -353,10 +204,7 @@ fn parseChallengeConfig(root: std.json.Value, allocator: Allocator) ErrorSet!Cha
.map_entrance_id = @intCast(challenge_json.object.get("MapEntranceID").?.integer), .map_entrance_id = @intCast(challenge_json.object.get("MapEntranceID").?.integer),
.map_entrance_id2 = @intCast(challenge_json.object.get("MapEntranceID2").?.integer), .map_entrance_id2 = @intCast(challenge_json.object.get("MapEntranceID2").?.integer),
.maze_group_id1 = @intCast(challenge_json.object.get("MazeGroupID1").?.integer), .maze_group_id1 = @intCast(challenge_json.object.get("MazeGroupID1").?.integer),
.maze_group_id2 = if (challenge_json.object.get("MazeGroupID2")) |val| .maze_group_id2 = @intCast(challenge_json.object.get("MazeGroupID2").?.integer),
@intCast(val.integer)
else
null,
}; };
for (challenge_json.object.get("NpcMonsterIDList1").?.array.items) |npc1| { for (challenge_json.object.get("NpcMonsterIDList1").?.array.items) |npc1| {
try challenge.npc_monster_id_list1.append(@intCast(npc1.integer)); try challenge.npc_monster_id_list1.append(@intCast(npc1.integer));

View file

@ -2,7 +2,7 @@ const std = @import("std");
const protocol = @import("protocol"); const protocol = @import("protocol");
const Session = @import("../Session.zig"); const Session = @import("../Session.zig");
const Packet = @import("../Packet.zig"); const Packet = @import("../Packet.zig");
const Config = @import("config.zig"); const Data = @import("../data.zig");
const ArrayList = std.ArrayList; const ArrayList = std.ArrayList;
const Allocator = std.mem.Allocator; const Allocator = std.mem.Allocator;
@ -10,28 +10,20 @@ const CmdID = protocol.CmdID;
pub fn onGetActivity(session: *Session, _: *const Packet, allocator: Allocator) !void { pub fn onGetActivity(session: *Session, _: *const Packet, allocator: Allocator) !void {
var rsp = protocol.GetActivityScheduleConfigScRsp.init(allocator); var rsp = protocol.GetActivityScheduleConfigScRsp.init(allocator);
const activity_config = try Config.loadActivityConfig(allocator, "resources/ActivityConfig.json");
for (activity_config.activity_config.items) |activityConf| { for (Data.EventList) |id| {
if (activityConf.panel_id != 30002) {
for (activityConf.activity_module_list.items) |id| {
var activ_list = protocol.ActivityScheduleData.init(allocator); var activ_list = protocol.ActivityScheduleData.init(allocator);
activ_list.begin_time = 1664308800; activ_list.begin_time = 0;
activ_list.end_time = 4294967295; activ_list.end_time = 1924992000;
activ_list.activity_id = id; if (id >= 100000) {
activ_list.panel_id = activityConf.panel_id; activ_list.activity_id = ((id % 100000) * 100) + 1;
} else {
activ_list.activity_id = id * 100 + 1;
}
activ_list.panel_id = id;
try rsp.schedule_data.append(activ_list); try rsp.schedule_data.append(activ_list);
} }
}
}
rsp.retcode = 0; rsp.retcode = 0;
try session.send(CmdID.CmdGetActivityScheduleConfigScRsp, rsp); try session.send(CmdID.CmdGetActivityScheduleConfigScRsp, rsp);
} }
pub fn onUpdateServerPrefsData(session: *Session, packet: *const Packet, allocator: Allocator) !void {
var rsp = protocol.UpdateServerPrefsDataScRsp.init(allocator);
const req = try packet.getProto(protocol.UpdateServerPrefsDataCsReq, allocator);
rsp.server_prefs_id = req.server_prefs.?.server_prefs_id;
rsp.retcode = 0;
try session.send(CmdID.CmdUpdateServerPrefsDataScRsp, rsp);
}

View file

@ -30,7 +30,7 @@ pub fn onReplaceLineup(session: *Session, packet: *const Packet, allocator: Allo
var lineup = protocol.LineupInfo.init(allocator); var lineup = protocol.LineupInfo.init(allocator);
lineup.mp = 5; lineup.mp = 5;
lineup.max_mp = 5; lineup.max_mp = 5;
lineup.name = .{ .Const = "CipherSR" }; lineup.name = .{ .Const = "CastoriceSR" };
for (req.lineup_slot_list.items) |ok| { for (req.lineup_slot_list.items) |ok| {
const avatar = protocol.LineupAvatar{ const avatar = protocol.LineupAvatar{
.id = ok.id, .id = ok.id,

View file

@ -12,10 +12,8 @@ pub fn onPlayerGetToken(session: *Session, _: *const Packet, allocator: Allocato
rsp.retcode = 0; rsp.retcode = 0;
rsp.uid = 1; rsp.uid = 1;
try session.send(CmdID.CmdPlayerGetTokenScRsp, rsp); try session.send(CmdID.CmdPlayerGetTokenScRsp, rsp);
} }
pub fn onPlayerLogin(session: *Session, packet: *const Packet, allocator: Allocator) !void { pub fn onPlayerLogin(session: *Session, packet: *const Packet, allocator: Allocator) !void {
const req = try packet.getProto(protocol.PlayerLoginCsReq, allocator); const req = try packet.getProto(protocol.PlayerLoginCsReq, allocator);

View file

@ -20,7 +20,7 @@ pub fn onGetMail(session: *Session, _: *const Packet, allocator: Allocator) !voi
mail.Title = .{ .Const = "Readme" }; mail.Title = .{ .Const = "Readme" };
mail.IsRead = false; mail.IsRead = false;
mail.id = 1; mail.id = 1;
mail.Content = .{ .Const = "CipherSR is a free and open-source sofware\nJoin our discord: https://discord.gg/reversedrooms\nUse https://yunlisr-relic-builder.vercel.app to setup relic :Đ\n" }; mail.Content = .{ .Const = "CastoriceSR is a free and open-source sofware\nJoin our discord: https://discord.gg/reversedrooms\nUse https://yunlisr-relic-builder.vercel.app to setup relic :Đ\n" };
mail.Time = 1723334400; mail.Time = 1723334400;
mail.ExpireTime = 17186330890; mail.ExpireTime = 17186330890;
mail.MailType = protocol.MailType.MAIL_TYPE_STAR; mail.MailType = protocol.MailType.MAIL_TYPE_STAR;

View file

@ -0,0 +1,42 @@
const std = @import("std");
const protocol = @import("protocol");
const Session = @import("../Session.zig");
const Packet = @import("../Packet.zig");
const Allocator = std.mem.Allocator;
const CmdID = protocol.CmdID;
const B64Decoder = std.base64.standard.Decoder;
pub fn onPlayerHeartBeat(session: *Session, packet: *const Packet, allocator: Allocator) !void {
const req = try packet.getProto(protocol.PlayerHeartBeatCsReq, allocator);
const lua_code =
\\local function setTextComponent(path, newText)
\\ local obj = CS.UnityEngine.GameObject.Find(path)
\\ if obj then
\\ local textComponent = obj:GetComponentInChildren(typeof(CS.RPG.Client.LocalizedText))
\\ if textComponent then
\\ textComponent.text = newText
\\ end
\\ end
\\end
\\
\\setTextComponent("UIRoot/AboveDialog/BetaHintDialog(Clone)", "<color=#ffc800>CipherSR is a free and open source software.</color>")
\\setTextComponent("VersionText", "<color=#ffc800>Visit discord.gg/reversedrooms for more info!</color>")
;
const data = protocol.ClientDownloadData{
.version = 51,
.time = @intCast(std.time.milliTimestamp()),
.data = .{ .Owned = .{
.allocator = allocator,
.str = try allocator.dupe(u8, lua_code),
} },
};
const rsp = protocol.PlayerHeartBeatScRsp{
.retcode = 0,
.client_time_ms = req.client_time_ms,
.server_time_ms = @intCast(std.time.milliTimestamp()),
.download_data = data,
};
try session.send(CmdID.CmdPlayerHeartBeatScRsp, rsp);
}

View file

@ -3,7 +3,6 @@ const protocol = @import("protocol");
const Session = @import("../Session.zig"); const Session = @import("../Session.zig");
const Packet = @import("../Packet.zig"); const Packet = @import("../Packet.zig");
const Data = @import("../data.zig"); const Data = @import("../data.zig");
const Config = @import("config.zig");
const ArrayList = std.ArrayList; const ArrayList = std.ArrayList;
const Allocator = std.mem.Allocator; const Allocator = std.mem.Allocator;
@ -12,37 +11,45 @@ const CmdID = protocol.CmdID;
pub fn onGetMissionStatus(session: *Session, packet: *const Packet, allocator: Allocator) !void { pub fn onGetMissionStatus(session: *Session, packet: *const Packet, allocator: Allocator) !void {
const req = try packet.getProto(protocol.GetMissionStatusCsReq, allocator); const req = try packet.getProto(protocol.GetMissionStatusCsReq, allocator);
var rsp = protocol.GetMissionStatusScRsp.init(allocator); var rsp = protocol.GetMissionStatusScRsp.init(allocator);
const main_mission_config = try Config.loadMainMissionConfig(allocator, "resources/MainMission.json");
rsp.retcode = 0; rsp.retcode = 0;
for (req.sub_mission_id_list.items) |id| { for (req.sub_mission_id_list.items) |id| {
try rsp.SubMissionStatusList.append(protocol.Mission{ .id = id, .status = protocol.MissionStatus.MISSION_FINISH, .progress = 1 }); try rsp.SubMissionStatusList.append(protocol.Mission{ .id = id, .status = protocol.MissionStatus.MISSION_FINISH, .progress = 1 });
} }
for (main_mission_config.main_mission_config.items) |main_missionConf| { try rsp.FinishedMainMissionIdList.appendSlice(&Data.FinishedMainMissionIdList);
try rsp.FinishedMainMissionIdList.append(main_missionConf.main_mission_id); try rsp.CurversionFinishedMainMissionIdList.appendSlice(&Data.FinishedMainMissionIdList);
try rsp.CurversionFinishedMainMissionIdList.append(main_missionConf.main_mission_id);
}
try session.send(CmdID.CmdGetMissionStatusScRsp, rsp); try session.send(CmdID.CmdGetMissionStatusScRsp, rsp);
} }
pub fn onGetTutorialGuideStatus(session: *Session, _: *const Packet, allocator: Allocator) !void { pub fn onGetTutorialGuideStatus(session: *Session, _: *const Packet, allocator: Allocator) !void {
var rsp = protocol.GetTutorialGuideScRsp.init(allocator); var rsp = protocol.GetTutorialGuideScRsp.init(allocator);
const tutorial_guide_config = try Config.loadTutorialGuideConfig(allocator, "resources/TutorialGuideGroup.json");
rsp.retcode = 0; rsp.retcode = 0;
for (tutorial_guide_config.tutorial_guide_config.items) |guideConf| { for (Data.TutorialGuideIdList) |id| {
try rsp.TutorialGuideList.append(protocol.TutorialGuide{ .id = guideConf.guide_group_id, .Status = protocol.TutorialStatus.TUTORIAL_FINISH }); try rsp.TutorialGuideList.append(protocol.TutorialGuide{ .id = id, .Status = protocol.TutorialStatus.TUTORIAL_FINISH });
} }
try session.send(CmdID.CmdGetTutorialGuideScRsp, rsp); try session.send(CmdID.CmdGetTutorialGuideScRsp, rsp);
} }
pub fn onFinishTutorialGuideStatus(session: *Session, _: *const Packet, allocator: Allocator) !void {
var rsp = protocol.FinishTutorialGuideScRsp.init(allocator);
rsp.retcode = 0;
for (Data.TutorialGuideIdList) |id| {
rsp.TutorialGuide = .{ .id = id, .Status = protocol.TutorialStatus.TUTORIAL_FINISH };
}
try session.send(CmdID.CmdFinishTutorialScRsp, rsp);
}
pub fn onGetTutorialStatus(session: *Session, _: *const Packet, allocator: Allocator) !void { pub fn onGetTutorialStatus(session: *Session, _: *const Packet, allocator: Allocator) !void {
var rsp = protocol.GetTutorialScRsp.init(allocator); var rsp = protocol.GetTutorialScRsp.init(allocator);
const tutorial_guide_config = try Config.loadTutorialConfig(allocator, "resources/TutorialData.json");
rsp.retcode = 0; rsp.retcode = 0;
for (tutorial_guide_config.tutorial_config.items) |tutorialConf| { for (Data.FinishedTutorialIdList) |id| {
try rsp.TutorialList.append(protocol.Tutorial{ .id = tutorialConf.tutorial_id, .Status = protocol.TutorialStatus.TUTORIAL_FINISH }); try rsp.TutorialList.append(protocol.Tutorial{ .id = id, .Status = protocol.TutorialStatus.TUTORIAL_FINISH });
} }
try session.send(CmdID.CmdGetTutorialScRsp, rsp); try session.send(CmdID.CmdGetTutorialScRsp, rsp);
} }
@ -50,7 +57,9 @@ pub fn onGetTutorialStatus(session: *Session, _: *const Packet, allocator: Alloc
pub fn onUnlockTutorialGuide(session: *Session, packet: *const Packet, allocator: Allocator) !void { pub fn onUnlockTutorialGuide(session: *Session, packet: *const Packet, allocator: Allocator) !void {
const req = try packet.getProto(protocol.UnlockTutorialGuideCsReq, allocator); const req = try packet.getProto(protocol.UnlockTutorialGuideCsReq, allocator);
var rsp = protocol.UnlockTutorialGuideScRsp.init(allocator); var rsp = protocol.UnlockTutorialGuideScRsp.init(allocator);
rsp.retcode = 0; rsp.retcode = 0;
std.debug.print("UNLOCK TUTORIAL GUIDE ID: {}\n", .{req.group_id}); std.debug.print("UNLOCK TUTORIAL GUIDE ID: {}\n", .{req.group_id});
try session.send(CmdID.CmdUnlockTutorialGuideScRsp, rsp); try session.send(CmdID.CmdUnlockTutorialGuideScRsp, rsp);
} }

View file

@ -3,7 +3,6 @@ const protocol = @import("protocol");
const Session = @import("../Session.zig"); const Session = @import("../Session.zig");
const Packet = @import("../Packet.zig"); const Packet = @import("../Packet.zig");
const Data = @import("../data.zig"); const Data = @import("../data.zig");
const Config = @import("config.zig");
const UidGenerator = @import("item.zig").UidGenerator; const UidGenerator = @import("item.zig").UidGenerator;
const ArrayList = std.ArrayList; const ArrayList = std.ArrayList;
@ -47,11 +46,10 @@ pub fn onGetPlayerBoardData(session: *Session, _: *const Packet, allocator: Allo
var rsp = protocol.GetPlayerBoardDataScRsp.init(allocator); var rsp = protocol.GetPlayerBoardDataScRsp.init(allocator);
var generator = UidGenerator().init(); var generator = UidGenerator().init();
var display_list = protocol.DisplayAvatarVec.init(allocator); var display_list = protocol.DisplayAvatarVec.init(allocator);
const player_icon_config = try Config.loadPlayerIconConfig(allocator, "resources/AvatarPlayerIcon.json");
display_list.is_display = true; display_list.is_display = true;
rsp.retcode = 0; rsp.retcode = 0;
rsp.OLDMJONBJOM = 253000; rsp.OLDMJONBJOM = 253000;
rsp.signature = .{ .Const = "" }; rsp.signature = .{ .Const = "Visit discord.gg/reversedrooms for more info!" };
try rsp.assist_avatar_id_list.appendSlice(&SupportAvatar); try rsp.assist_avatar_id_list.appendSlice(&SupportAvatar);
for (ListAvatar) |id| { for (ListAvatar) |id| {
var A_list = protocol.DisplayAvatarData.init(allocator); var A_list = protocol.DisplayAvatarData.init(allocator);
@ -60,9 +58,9 @@ pub fn onGetPlayerBoardData(session: *Session, _: *const Packet, allocator: Allo
try display_list.display_avatar_list.append(A_list); try display_list.display_avatar_list.append(A_list);
} }
rsp.display_avatar_vec = display_list; rsp.display_avatar_vec = display_list;
for (player_icon_config.player_icon_config.items) |head_id| { for (Data.OwnedHeadIcon) |head_id| {
const head_icon = protocol.HeadIconData{ const head_icon = protocol.HeadIconData{
.id = head_id.id, .id = head_id,
}; };
try rsp.unlocked_head_icon_list.append(head_icon); try rsp.unlocked_head_icon_list.append(head_icon);
} }
@ -106,6 +104,5 @@ pub fn onSetHeadIcon(session: *Session, packet: *const Packet, allocator: Alloca
var rsp = protocol.SetHeadIconScRsp.init(allocator); var rsp = protocol.SetHeadIconScRsp.init(allocator);
rsp.retcode = 0; rsp.retcode = 0;
rsp.current_head_icon_id = req.id; rsp.current_head_icon_id = req.id;
std.debug.print("SET HEAD ICON ID: {}\n", .{req.id});
try session.send(CmdID.CmdSetHeadIconScRsp, rsp); try session.send(CmdID.CmdSetHeadIconScRsp, rsp);
} }

View file

@ -84,6 +84,7 @@ pub fn onGetSceneMapInfo(session: *Session, packet: *const Packet, allocator: Al
.{ .chest_type = protocol.ChestType.MAP_INFO_CHEST_TYPE_CHALLENGE }, .{ .chest_type = protocol.ChestType.MAP_INFO_CHEST_TYPE_CHALLENGE },
.{ .chest_type = protocol.ChestType.MAP_INFO_CHEST_TYPE_PUZZLE }, .{ .chest_type = protocol.ChestType.MAP_INFO_CHEST_TYPE_PUZZLE },
}; };
std.debug.print("SCENE MAP FLOOR ID REQ: {}\n", .{req.floor_id_list});
for (req.floor_id_list.items) |floor_id| { for (req.floor_id_list.items) |floor_id| {
var rsp = protocol.GetSceneMapInfoScRsp.init(allocator); var rsp = protocol.GetSceneMapInfoScRsp.init(allocator);
rsp.retcode = 0; rsp.retcode = 0;
@ -128,7 +129,9 @@ pub fn onGetSceneMapInfo(session: *Session, packet: *const Packet, allocator: Al
try session.send(CmdID.CmdGetSceneMapInfoScRsp, rsp); try session.send(CmdID.CmdGetSceneMapInfoScRsp, rsp);
} }
} }
pub fn onGetUnlockTeleport(session: *Session, _: *const Packet, allocator: Allocator) !void { pub fn onGetUnlockTeleport(session: *Session, packet: *const Packet, allocator: Allocator) !void {
const req = try packet.getProto(protocol.GetUnlockTeleportCsReq, allocator);
std.debug.print("UNLOCK TELEPORT ENTRY ID REQ: {}\n", .{req.entry_id_list});
var rsp = protocol.GetUnlockTeleportScRsp.init(allocator); var rsp = protocol.GetUnlockTeleportScRsp.init(allocator);
const res_config = try Res_config.anchorLoader(allocator, "resources/res.json"); const res_config = try Res_config.anchorLoader(allocator, "resources/res.json");
for (res_config.scene_config.items) |sceneCof| { for (res_config.scene_config.items) |sceneCof| {
@ -213,17 +216,17 @@ pub fn onDeactivateFarmElement(session: *Session, packet: *const Packet, allocat
} }
pub fn onSetGroupCustomSaveData(session: *Session, packet: *const Packet, allocator: Allocator) !void { pub fn onSetGroupCustomSaveData(session: *Session, packet: *const Packet, allocator: Allocator) !void {
const req = try packet.getProto(protocol.SetGroupCustomSaveDataCsReq, allocator); const req = try packet.getProto(protocol.SetGroupCustomSaveDataCsReq, allocator);
//switch (req.AAMHHECOCOI) { switch (req.AAMHHECOCOI) {
// .Owned => |val| { .Owned => |val| {
// std.debug.print("CUSTOM SAVE DATA REQ: {s}\n", .{val.str}); std.debug.print("CUSTOM SAVE DATA REQ: {s}\n", .{val.str});
// }, },
// .Const => |val| { .Const => |val| {
// std.debug.print("CUSTOM SAVE DATA REQ: {s}\n", .{val}); std.debug.print("CUSTOM SAVE DATA REQ: {s}\n", .{val});
// }, },
// .Empty => { .Empty => {
// std.debug.print("CUSTOM SAVE DATA REQ: <empty string>\n", .{}); std.debug.print("CUSTOM SAVE DATA REQ: <empty string>\n", .{});
// }, },
//} }
try session.send(CmdID.CmdSetGroupCustomSaveDataScRsp, protocol.SetGroupCustomSaveDataScRsp{ try session.send(CmdID.CmdSetGroupCustomSaveDataScRsp, protocol.SetGroupCustomSaveDataScRsp{
.retcode = 0, .retcode = 0,
.group_id = req.group_id, .group_id = req.group_id,

View file

@ -14,13 +14,5 @@
"ifix_version": "0", "ifix_version": "0",
"lua_url": "https://autopatchos.starrails.com/lua/BetaLive/output_10025298_1dc728a6c8ee_1128f068b506d4", "lua_url": "https://autopatchos.starrails.com/lua/BetaLive/output_10025298_1dc728a6c8ee_1128f068b506d4",
"lua_version": "" "lua_version": ""
},
"OSBETAWin3.2.53": {
"asset_bundle_url": "https://autopatchos.starrails.com/asb/BetaLive/output_10104345_a5535dc0c779_a36b870100988f",
"ex_resource_url": "https://autopatchos.starrails.com/design_data/BetaLive/output_10114007_b191beeb9546_2f88552ee48ab1",
"ifix_url": "https://autopatchos.starrails.com/ifix/BetaLive/output_0_40d2ce0253_6d871f8bca6eb4",
"ifix_version": "0",
"lua_url": "https://autopatchos.starrails.com/lua/BetaLive/output_10104505_31a450a7e7a3_0793e9a5426e39",
"lua_version": ""
} }
} }

View file

@ -3,7 +3,9 @@
.version = "0.0.0", .version = "0.0.0",
.dependencies = .{ .dependencies = .{
.protobuf = .{ .protobuf = .{
.url = "https://github.com/Arwalk/zig-protobuf/archive/7c49ed66e029c9c7e6253b3d6d256118745550a4.tar.gz", //.url = "https://github.com/Arwalk/zig-protobuf/archive/7c49ed66e029c9c7e6253b3d6d256118745550a4.tar.gz",
.url = "git+https://github.com/Arwalk/zig-protobuf?ref=v2.0.0#42ccf142e5d6b7de886b766af7d287021c561dfd",
.hash = "122063ee7ff32a3c1aefd91a46a9fc23df0571949c3a02e2f44d39afbad0b53018a3", .hash = "122063ee7ff32a3c1aefd91a46a9fc23df0571949c3a02e2f44d39afbad0b53018a3",
}, },
}, },

File diff suppressed because it is too large Load diff

View file

@ -1,753 +0,0 @@
{
"player_icon_config": [
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/UI_Message_Contacts_Anonymous.png",
"ID": 200001,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/200101.png",
"ID": 200101,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/200102.png",
"ID": 200102,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/200103.png",
"ID": 200103,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/200104.png",
"ID": 200104,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/200105.png",
"ID": 200105,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/200106.png",
"ID": 200106,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/200107.png",
"ID": 200107,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/200108.png",
"ID": 200108,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/200109.png",
"ID": 200109,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/200110.png",
"ID": 200110,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/200111.png",
"ID": 200111,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/200112.png",
"ID": 200112,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/200113.png",
"ID": 200113,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/200114.png",
"ID": 200114,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/200115.png",
"ID": 200115,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/200116.png",
"ID": 200116,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/200117.png",
"ID": 200117,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/200118.png",
"ID": 200118,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/200119.png",
"ID": 200119,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/200120.png",
"ID": 200120,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/200121.png",
"ID": 200121,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/200122.png",
"ID": 200122,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/200123.png",
"ID": 200123,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/200124.png",
"ID": 200124,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/200125.png",
"ID": 200125,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/200126.png",
"ID": 200126,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/200127.png",
"ID": 200127,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/200128.png",
"ID": 200128,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/200129.png",
"ID": 200129,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/200130.png",
"ID": 200130,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/200131.png",
"ID": 200131,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/200132.png",
"ID": 200132,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/200133.png",
"ID": 200133,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/200134.png",
"ID": 200134,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/200135.png",
"ID": 200135,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/200136.png",
"ID": 200136,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/200137.png",
"ID": 200137,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/200138.png",
"ID": 200138,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/200139.png",
"ID": 200139,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/200140.png",
"ID": 200140,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/202001.png",
"ID": 202001,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/202002.png",
"ID": 202002,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/202003.png",
"ID": 202003,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/202004.png",
"ID": 202004,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/202005.png",
"ID": 202005,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/202006.png",
"ID": 202006,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/202007.png",
"ID": 202007,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/202008.png",
"ID": 202008,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/202009.png",
"ID": 202009,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/202010.png",
"ID": 202010,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/202011.png",
"ID": 202011,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/202012.png",
"ID": 202012,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/202013.png",
"ID": 202013,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/202014.png",
"ID": 202014,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/202015.png",
"ID": 202015,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/202016.png",
"ID": 202016,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/202017.png",
"ID": 202017,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/202018.png",
"ID": 202018,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/202019.png",
"ID": 202019,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/202020.png",
"ID": 202020,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/202022.png",
"ID": 202022,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/202023.png",
"ID": 202023,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/202024.png",
"ID": 202024,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/202025.png",
"ID": 202025,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/202028.png",
"ID": 202028,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/AvatarSkin/1100101.png",
"ID": 202029,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/202031.png",
"ID": 202031,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Series/202033.png",
"ID": 202033,
"IsVisible": true
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1001.png",
"ID": 201001,
"IsVisible": true,
"AvatarID": 1001
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1002.png",
"ID": 201002,
"IsVisible": true,
"AvatarID": 1002
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1003.png",
"ID": 201003,
"IsVisible": true,
"AvatarID": 1003
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1004.png",
"ID": 201004,
"IsVisible": true,
"AvatarID": 1004
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1005.png",
"ID": 201005,
"IsVisible": true,
"AvatarID": 1005
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1006.png",
"ID": 201006,
"IsVisible": true,
"AvatarID": 1006
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1008.png",
"ID": 201008,
"IsVisible": true,
"AvatarID": 1008
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1009.png",
"ID": 201009,
"IsVisible": true,
"AvatarID": 1009
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1013.png",
"ID": 201013,
"IsVisible": true,
"AvatarID": 1013
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1101.png",
"ID": 201101,
"IsVisible": true,
"AvatarID": 1101
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1102.png",
"ID": 201102,
"IsVisible": true,
"AvatarID": 1102
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1103.png",
"ID": 201103,
"IsVisible": true,
"AvatarID": 1103
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1104.png",
"ID": 201104,
"IsVisible": true,
"AvatarID": 1104
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1105.png",
"ID": 201105,
"IsVisible": true,
"AvatarID": 1105
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1106.png",
"ID": 201106,
"IsVisible": true,
"AvatarID": 1106
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1107.png",
"ID": 201107,
"IsVisible": true,
"AvatarID": 1107
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1108.png",
"ID": 201108,
"IsVisible": true,
"AvatarID": 1108
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1109.png",
"ID": 201109,
"IsVisible": true,
"AvatarID": 1109
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1110.png",
"ID": 201110,
"IsVisible": true,
"AvatarID": 1110
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1111.png",
"ID": 201111,
"IsVisible": true,
"AvatarID": 1111
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1203.png",
"ID": 201203,
"IsVisible": true,
"AvatarID": 1203
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1204.png",
"ID": 201204,
"IsVisible": true,
"AvatarID": 1204
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1205.png",
"ID": 201205,
"IsVisible": true,
"AvatarID": 1205
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1206.png",
"ID": 201206,
"AvatarID": 1206
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/8001.png",
"ID": 208001,
"IsVisible": true,
"AvatarID": 8001
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/8002.png",
"ID": 208002,
"IsVisible": true,
"AvatarID": 8002
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/8003.png",
"ID": 208003,
"IsVisible": true,
"AvatarID": 8003
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/8004.png",
"ID": 208004,
"IsVisible": true,
"AvatarID": 8004
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/8005.png",
"ID": 208005,
"IsVisible": true,
"AvatarID": 8005
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/8006.png",
"ID": 208006,
"IsVisible": true,
"AvatarID": 8006
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1201.png",
"ID": 201201,
"AvatarID": 1201
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1202.png",
"ID": 201202,
"AvatarID": 1202
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1207.png",
"ID": 201207,
"AvatarID": 1207
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1208.png",
"ID": 201208,
"AvatarID": 1208
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1209.png",
"ID": 201209,
"AvatarID": 1209
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1210.png",
"ID": 201210,
"AvatarID": 1210
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1211.png",
"ID": 201211,
"AvatarID": 1211
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1212.png",
"ID": 201212,
"AvatarID": 1212
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1213.png",
"ID": 201213,
"AvatarID": 1213
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1214.png",
"ID": 201214,
"AvatarID": 1214
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1215.png",
"ID": 201215,
"AvatarID": 1215
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1112.png",
"ID": 201112,
"AvatarID": 1112
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1301.png",
"ID": 201301,
"AvatarID": 1301
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1302.png",
"ID": 201302,
"AvatarID": 1302
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1217.png",
"ID": 201217,
"AvatarID": 1217
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1303.png",
"ID": 201303,
"AvatarID": 1303
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1304.png",
"ID": 201304,
"AvatarID": 1304
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1305.png",
"ID": 201305,
"AvatarID": 1305
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1307.png",
"ID": 201307,
"AvatarID": 1307
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1308.png",
"ID": 201308,
"AvatarID": 1308
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1309.png",
"ID": 201309,
"AvatarID": 1309
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1312.png",
"ID": 201312,
"AvatarID": 1312
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1314.png",
"ID": 201314,
"AvatarID": 1314
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1315.png",
"ID": 201315,
"AvatarID": 1315
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1310.png",
"ID": 201310,
"AvatarID": 1310
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1306.png",
"ID": 201306,
"AvatarID": 1306
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1218.png",
"ID": 201218,
"AvatarID": 1218
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1224.png",
"ID": 201224,
"AvatarID": 1224
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1313.png",
"ID": 201313,
"AvatarID": 1313
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1221.png",
"ID": 201221,
"AvatarID": 1221
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1220.png",
"ID": 201220,
"AvatarID": 1220
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1317.png",
"ID": 201317,
"AvatarID": 1317
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1223.png",
"ID": 201223,
"AvatarID": 1223
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1222.png",
"ID": 201222,
"AvatarID": 1222
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1225.png",
"ID": 201225,
"AvatarID": 1225
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1402.png",
"ID": 201402,
"AvatarID": 1402
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1401.png",
"ID": 201401,
"AvatarID": 1401
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1403.png",
"ID": 201403,
"AvatarID": 1403
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/8007.png",
"ID": 208007,
"AvatarID": 8007
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1404.png",
"ID": 201404,
"AvatarID": 1404
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/8008.png",
"ID": 208008,
"AvatarID": 8008
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1407.png",
"ID": 201407,
"AvatarID": 1407
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1405.png",
"ID": 201405,
"AvatarID": 1405
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1409.png",
"ID": 201409,
"AvatarID": 1409
},
{
"ImagePath": "SpriteOutput/AvatarRoundIcon/Avatar/1406.png",
"ID": 201406,
"AvatarID": 1406
}
]
}

View file

@ -41,7 +41,8 @@
"Hash": -585545512, "Hash": -585545512,
"hash64": 7610618346915917303 "hash64": 7610618346915917303
}, },
"MazeGroupID1": 2 "MazeGroupID1": 2,
"MazeGroupID2": 0
}, },
{ {
"NpcMonsterIDList2": [], "NpcMonsterIDList2": [],
@ -85,7 +86,8 @@
"Hash": 2143337843, "Hash": 2143337843,
"hash64": 17271419042682156335 "hash64": 17271419042682156335
}, },
"MazeGroupID1": 2 "MazeGroupID1": 2,
"MazeGroupID2": 0
}, },
{ {
"NpcMonsterIDList2": [], "NpcMonsterIDList2": [],
@ -129,7 +131,8 @@
"Hash": 577253902, "Hash": 577253902,
"hash64": 5150775987177055706 "hash64": 5150775987177055706
}, },
"MazeGroupID1": 2 "MazeGroupID1": 2,
"MazeGroupID2": 0
}, },
{ {
"NpcMonsterIDList2": [], "NpcMonsterIDList2": [],
@ -173,7 +176,8 @@
"Hash": -1345060399, "Hash": -1345060399,
"hash64": 7564248973955320288 "hash64": 7564248973955320288
}, },
"MazeGroupID1": 2 "MazeGroupID1": 2,
"MazeGroupID2": 0
}, },
{ {
"NpcMonsterIDList2": [], "NpcMonsterIDList2": [],
@ -217,7 +221,8 @@
"Hash": 1383822956, "Hash": 1383822956,
"hash64": 5242189358921793964 "hash64": 5242189358921793964
}, },
"MazeGroupID1": 2 "MazeGroupID1": 2,
"MazeGroupID2": 0
}, },
{ {
"NpcMonsterIDList2": [], "NpcMonsterIDList2": [],
@ -262,7 +267,8 @@
"Hash": -182260985, "Hash": -182260985,
"hash64": 15269943691528539554 "hash64": 15269943691528539554
}, },
"MazeGroupID1": 4 "MazeGroupID1": 4,
"MazeGroupID2": 0
}, },
{ {
"NpcMonsterIDList2": [], "NpcMonsterIDList2": [],
@ -308,7 +314,8 @@
"Hash": -1748344926, "Hash": -1748344926,
"hash64": 8853592441228331582 "hash64": 8853592441228331582
}, },
"MazeGroupID1": 4 "MazeGroupID1": 4,
"MazeGroupID2": 0
}, },
{ {
"NpcMonsterIDList2": [], "NpcMonsterIDList2": [],
@ -354,7 +361,8 @@
"Hash": 1336768789, "Hash": 1336768789,
"hash64": 11639544939584837964 "hash64": 11639544939584837964
}, },
"MazeGroupID1": 4 "MazeGroupID1": 4,
"MazeGroupID2": 0
}, },
{ {
"NpcMonsterIDList2": [], "NpcMonsterIDList2": [],
@ -399,7 +407,8 @@
"Hash": -229315152, "Hash": -229315152,
"hash64": 13127512314370178244 "hash64": 13127512314370178244
}, },
"MazeGroupID1": 4 "MazeGroupID1": 4,
"MazeGroupID2": 0
}, },
{ {
"NpcMonsterIDList2": [], "NpcMonsterIDList2": [],
@ -445,7 +454,8 @@
"Hash": 1577274280, "Hash": 1577274280,
"hash64": 3433035089102959956 "hash64": 3433035089102959956
}, },
"MazeGroupID1": 4 "MazeGroupID1": 4,
"MazeGroupID2": 0
}, },
{ {
"NpcMonsterIDList2": [ "NpcMonsterIDList2": [

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -199568,9 +199568,9 @@
"instId": 200001, "instId": 200001,
"eventId": 99999011, "eventId": 99999011,
"pos": { "pos": {
"x": 580, "x": -714570,
"y": 8551, "y": 6270,
"z": 54030 "z": 67130
}, },
"rot": { "rot": {
"x": 0, "x": 0,