cipher-sr/gameserver/src/manager/scene_mgr.zig

289 lines
13 KiB
Zig

const std = @import("std");
const protocol = @import("protocol");
const Session = @import("../Session.zig");
const Packet = @import("../Packet.zig");
const Config = @import("../services/config.zig");
const Res_config = @import("../services/res_config.zig");
const Data = @import("../data.zig");
const UidGenerator = @import("../services/item.zig").UidGenerator;
const ArrayList = std.ArrayList;
const Allocator = std.mem.Allocator;
const CmdID = protocol.CmdID;
pub const SceneManager = struct {
allocator: std.mem.Allocator,
pub fn init(allocator: std.mem.Allocator) SceneManager {
return SceneManager{ .allocator = allocator };
}
pub fn createScene(
self: *SceneManager,
plane_id: u32,
floor_id: u32,
entry_id: u32,
teleport_id: u32,
) !protocol.SceneInfo {
const config = try Config.loadGameConfig(self.allocator, "config.json");
const res_config = try Res_config.anchorLoader(self.allocator, "resources/res.json");
var generator = UidGenerator().init();
var scene_info = protocol.SceneInfo.init(self.allocator);
scene_info.game_mode_type = 1;
scene_info.plane_id = plane_id;
scene_info.floor_id = floor_id;
scene_info.entry_id = entry_id;
scene_info.leader_entity_id = 100000;
scene_info.world_id = 501;
scene_info.client_pos_version = 1;
var group_map = std.AutoHashMap(u32, protocol.SceneEntityGroupInfo).init(self.allocator);
defer group_map.deinit();
for (res_config.scene_config.items) |sceneConf| {
for (sceneConf.teleports.items) |teleConf| {
if (teleConf.teleportId == teleport_id) {
var scene_group = protocol.SceneEntityGroupInfo.init(self.allocator);
scene_group.state = 1;
for (config.avatar_config.items, 0..) |avatarConf, idx| {
try scene_group.entity_list.append(.{
.InstId = 1,
.EntityId = @intCast(idx + 100000),
.entityCase_ = .{ .Actor = .{
.base_avatar_id = avatarConf.id,
.avatar_type = .AVATAR_FORMAL_TYPE,
.uid = 0,
.map_layer = 0,
} },
.Motion = .{
.pos = .{ .x = teleConf.pos.x, .y = teleConf.pos.y, .z = teleConf.pos.z },
.rot = .{ .x = teleConf.rot.x, .y = teleConf.rot.y, .z = teleConf.rot.z },
},
});
}
try scene_info.entity_group_list.append(scene_group);
}
}
if (scene_info.plane_id != 10000 and scene_info.plane_id != 10202 and sceneConf.planeID == scene_info.plane_id) {
for (sceneConf.props.items) |propConf| {
var scene_group = try getOrCreateGroup(&group_map, propConf.groupId, self.allocator);
var prop_info = protocol.ScenePropInfo.init(self.allocator);
prop_info.prop_id = propConf.propId;
prop_info.prop_state = propConf.propState;
try scene_group.entity_list.append(.{
.entityCase_ = .{ .Prop = prop_info },
.GroupId = scene_group.group_id,
.InstId = propConf.instId,
.EntityId = generator.nextId(),
.Motion = .{
.pos = .{ .x = propConf.pos.x, .y = propConf.pos.y, .z = propConf.pos.z },
.rot = .{ .x = propConf.rot.x, .y = propConf.rot.y, .z = propConf.rot.z },
},
});
}
for (sceneConf.monsters.items) |monsConf| {
var scene_group = try getOrCreateGroup(&group_map, monsConf.groupId, self.allocator);
var monster_info = protocol.SceneNpcMonsterInfo.init(self.allocator);
monster_info.monster_id = monsConf.monsterId;
monster_info.event_id = monsConf.eventId;
monster_info.world_level = 6;
try scene_group.entity_list.append(.{
.entityCase_ = .{ .NpcMonster = monster_info },
.GroupId = scene_group.group_id,
.InstId = monsConf.instId,
.EntityId = generator.nextId(),
.Motion = .{
.pos = .{ .x = monsConf.pos.x, .y = monsConf.pos.y, .z = monsConf.pos.z },
.rot = .{ .x = monsConf.rot.x, .y = monsConf.rot.y, .z = monsConf.rot.z },
},
});
}
}
}
var iter = group_map.iterator();
while (iter.next()) |entry| {
try scene_info.entity_group_list.append(entry.value_ptr.*);
try scene_info.entity_list.appendSlice(entry.value_ptr.entity_list.items);
try scene_info.DJBIBIJMEBH.append(entry.value_ptr.group_id);
try scene_info.custom_data_list.append(protocol.CustomSaveData{
.group_id = entry.value_ptr.group_id,
});
try scene_info.group_state_list.append(protocol.SceneGroupState{
.group_id = entry.value_ptr.group_id,
.state = 0,
.is_default = true,
});
}
const ranges = [_][2]usize{
.{ 0, 101 },
.{ 10000, 10051 },
.{ 20000, 20001 },
.{ 30000, 30020 },
};
for (ranges) |range| {
for (range[0]..range[1]) |i| {
try scene_info.lighten_section_list.append(@intCast(i));
}
}
return scene_info;
}
fn getOrCreateGroup(group_map: *std.AutoHashMap(u32, protocol.SceneEntityGroupInfo), group_id: u32, allocator: std.mem.Allocator) !*protocol.SceneEntityGroupInfo {
if (group_map.getPtr(group_id)) |existing_group| {
return existing_group;
}
var new_group = protocol.SceneEntityGroupInfo.init(allocator);
new_group.state = 1;
new_group.group_id = group_id;
try group_map.put(group_id, new_group);
return group_map.getPtr(group_id).?;
}
};
pub const ChallengeSceneManager = struct {
allocator: std.mem.Allocator,
pub fn init(allocator: std.mem.Allocator) ChallengeSceneManager {
return ChallengeSceneManager{ .allocator = allocator };
}
pub fn createScene(
self: *ChallengeSceneManager,
avatar_list: ArrayList(u32),
plane_id: u32,
floor_id: u32,
entry_id: u32,
world_id: u32,
monster_id: u32,
event_id: u32,
group_id: u32,
maze_group_id: u32,
) !protocol.SceneInfo {
const res_config = try Res_config.anchorLoader(self.allocator, "resources/res.json");
var generator = UidGenerator().init();
var scene_info = protocol.SceneInfo.init(self.allocator);
scene_info.game_mode_type = 4;
scene_info.plane_id = plane_id;
scene_info.floor_id = floor_id;
scene_info.entry_id = entry_id;
scene_info.leader_entity_id = 1;
scene_info.world_id = world_id;
try scene_info.group_state_list.append(protocol.SceneGroupState{
.group_id = maze_group_id,
.is_default = true,
});
{ // Character
var scene_group = protocol.SceneEntityGroupInfo.init(self.allocator);
scene_group.state = 1;
scene_group.group_id = 0;
for (avatar_list.items, 0..) |avatarConf, idx| {
const newidx = idx + 100000;
try scene_group.entity_list.append(.{
.InstId = 1,
.EntityId = @intCast(newidx),
.entityCase_ = .{
.Actor = .{
.base_avatar_id = avatarConf,
.avatar_type = .AVATAR_FORMAL_TYPE,
.uid = 1,
.map_layer = 0,
},
},
.Motion = .{ .pos = .{}, .rot = .{} },
});
}
try scene_info.entity_group_list.append(scene_group);
}
for (res_config.scene_config.items) |sceneConf| {
if (sceneConf.planeID == scene_info.plane_id) {
for (sceneConf.monsters.items) |monsConf| { //create monster
var scene_group = protocol.SceneEntityGroupInfo.init(self.allocator);
scene_group.state = 1;
if (monsConf.groupId == group_id) {
scene_group.group_id = group_id;
var monster_info = protocol.SceneNpcMonsterInfo.init(self.allocator);
monster_info.monster_id = monster_id;
monster_info.event_id = event_id;
monster_info.world_level = 6;
try scene_group.entity_list.append(.{
.entityCase_ = .{ .NpcMonster = monster_info },
.GroupId = group_id,
.InstId = monsConf.instId,
.EntityId = generator.nextId(),
.Motion = .{
.pos = .{ .x = monsConf.pos.x, .y = monsConf.pos.y, .z = monsConf.pos.z },
.rot = .{ .x = monsConf.rot.x, .y = monsConf.rot.y, .z = monsConf.rot.z },
},
});
try scene_info.entity_group_list.append(scene_group);
}
}
}
}
for (res_config.scene_config.items) |sceneConf| {
if (sceneConf.planeID == scene_info.plane_id) {
for (sceneConf.props.items) |propConf| { //create props
var scene_group = protocol.SceneEntityGroupInfo.init(self.allocator);
scene_group.state = 1;
scene_group.group_id = group_id;
var prop_info = protocol.ScenePropInfo.init(self.allocator);
prop_info.prop_id = propConf.propId;
prop_info.prop_state = propConf.propState;
try scene_group.entity_list.append(.{
.entityCase_ = .{ .Prop = prop_info },
.GroupId = group_id,
.InstId = propConf.instId,
.EntityId = 0,
.Motion = .{
.pos = .{ .x = propConf.pos.x, .y = propConf.pos.y, .z = propConf.pos.z },
.rot = .{ .x = propConf.rot.x, .y = propConf.rot.y, .z = propConf.rot.z },
},
});
try scene_info.entity_group_list.append(scene_group);
}
}
}
return scene_info;
}
};
pub const MazeMapManager = struct {
allocator: std.mem.Allocator,
pub fn init(allocator: std.mem.Allocator) MazeMapManager {
return MazeMapManager{ .allocator = allocator };
}
pub fn setMazeMapData(
self: *MazeMapManager,
map_info: *protocol.SceneMapInfo,
floor_id: u32,
) !void {
const config = try Config.loadMapEntranceConfig(self.allocator, "resources/MapEntrance.json");
const res_config = try Res_config.anchorLoader(self.allocator, "resources/res.json");
var plane_ids = ArrayList(u32).init(self.allocator);
for (config.map_entrance_config.items) |entrConf| {
if (entrConf.floor_id == floor_id) {
try plane_ids.append(entrConf.plane_id);
}
}
map_info.maze_group_list = ArrayList(protocol.MazeGroup).init(self.allocator);
map_info.maze_prop_list = ArrayList(protocol.MazePropState).init(self.allocator);
for (res_config.scene_config.items) |resConf| {
for (plane_ids.items) |plane_id| {
if (resConf.planeID == plane_id) {
for (resConf.props.items) |propConf| {
try map_info.maze_group_list.append(protocol.MazeGroup{
.NOBKEONAKLE = ArrayList(u32).init(self.allocator),
.group_id = propConf.groupId,
});
try map_info.maze_prop_list.append(protocol.MazePropState{
.group_id = propConf.groupId,
.config_id = propConf.instId,
.state = propConf.propState,
});
}
}
}
}
}
};