Compare commits
5 commits
Author | SHA1 | Date | |
---|---|---|---|
63fc7a5888 | |||
195d76a92c | |||
e8b50bf352 | |||
c66d8726ed | |||
e7e140f341 |
9 changed files with 62 additions and 28 deletions
|
@ -1,10 +1,18 @@
|
|||
const std = @import("std");
|
||||
const builtin = @import("builtin");
|
||||
const httpz = @import("httpz");
|
||||
const protocol = @import("protocol");
|
||||
|
||||
const authentication = @import("authentication.zig");
|
||||
const dispatch = @import("dispatch.zig");
|
||||
|
||||
pub const std_options = .{
|
||||
.log_level = switch (builtin.mode) {
|
||||
.Debug => .debug,
|
||||
else => .info,
|
||||
},
|
||||
};
|
||||
|
||||
pub fn main() !void {
|
||||
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
|
||||
const allocator = gpa.allocator();
|
||||
|
|
|
@ -9,6 +9,7 @@ const Stream = std.net.Stream;
|
|||
const Address = std.net.Address;
|
||||
|
||||
const Self = @This();
|
||||
const log = std.log.scoped(.session);
|
||||
|
||||
address: Address,
|
||||
stream: Stream,
|
||||
|
@ -42,7 +43,6 @@ pub fn send(self: *Self, cmd_id: protocol.CmdID, proto: anytype) !void {
|
|||
defer self.allocator.free(packet);
|
||||
|
||||
_ = try self.stream.write(packet);
|
||||
std.log.debug("sent packet with id {}", .{cmd_id});
|
||||
}
|
||||
|
||||
pub fn send_empty(self: *Self, cmd_id: protocol.CmdID) !void {
|
||||
|
@ -50,5 +50,5 @@ pub fn send_empty(self: *Self, cmd_id: protocol.CmdID) !void {
|
|||
defer self.allocator.free(packet);
|
||||
|
||||
_ = try self.stream.write(packet);
|
||||
std.log.debug("sent EMPTY packet with id {}", .{cmd_id});
|
||||
log.debug("sent EMPTY packet with id {}", .{cmd_id});
|
||||
}
|
||||
|
|
|
@ -14,12 +14,15 @@ const Allocator = std.mem.Allocator;
|
|||
const ArenaAllocator = std.heap.ArenaAllocator;
|
||||
const CmdID = protocol.CmdID;
|
||||
|
||||
const log = std.log.scoped(.handlers);
|
||||
|
||||
const Action = *const fn (*Session, *const Packet, Allocator) anyerror!void;
|
||||
const HandlerList = [_]struct { CmdID, Action }{
|
||||
.{ CmdID.CmdPlayerGetTokenCsReq, login.onPlayerGetToken },
|
||||
.{ CmdID.CmdPlayerLoginCsReq, login.onPlayerLogin },
|
||||
.{ CmdID.CmdPlayerHeartBeatCsReq, misc.onPlayerHeartBeat },
|
||||
.{ CmdID.CmdGetAvatarDataCsReq, avatar.onGetAvatarData },
|
||||
.{ CmdID.CmdGetMultiPathAvatarInfoCsReq, avatar.onGetMultiPathAvatarInfo },
|
||||
.{ CmdID.CmdGetMissionStatusCsReq, mission.onGetMissionStatus },
|
||||
.{ CmdID.CmdGetCurLineupDataCsReq, lineup.onGetCurLineupData },
|
||||
.{ CmdID.CmdGetCurSceneInfoCsReq, scene.onGetCurSceneInfo },
|
||||
|
@ -68,6 +71,8 @@ const DummyCmdList = [_]struct { CmdID, CmdID }{
|
|||
.{ CmdID.CmdGetMainMissionCustomValueCsReq, CmdID.CmdGetMainMissionCustomValueScRsp },
|
||||
};
|
||||
|
||||
const SuppressLogList = [_]CmdID{CmdID.CmdSceneEntityMoveCsReq};
|
||||
|
||||
pub fn handle(session: *Session, packet: *const Packet) !void {
|
||||
var arena = ArenaAllocator.init(session.allocator);
|
||||
defer arena.deinit();
|
||||
|
@ -77,7 +82,9 @@ pub fn handle(session: *Session, packet: *const Packet) !void {
|
|||
inline for (HandlerList) |handler| {
|
||||
if (handler[0] == cmd_id) {
|
||||
try handler[1](session, packet, arena.allocator());
|
||||
std.log.debug("packet {} was handled", .{cmd_id});
|
||||
if (!std.mem.containsAtLeast(CmdID, &SuppressLogList, 1, &[_]CmdID{cmd_id})) {
|
||||
log.debug("packet {} was handled", .{cmd_id});
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
@ -89,5 +96,5 @@ pub fn handle(session: *Session, packet: *const Packet) !void {
|
|||
}
|
||||
}
|
||||
|
||||
std.log.warn("packet {} was ignored", .{cmd_id});
|
||||
log.warn("packet {} was ignored", .{cmd_id});
|
||||
}
|
||||
|
|
|
@ -1,10 +1,15 @@
|
|||
const std = @import("std");
|
||||
const builtin = @import("builtin");
|
||||
const network = @import("network.zig");
|
||||
const handlers = @import("handlers.zig");
|
||||
|
||||
pub fn main() !void {
|
||||
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
|
||||
const allocator = gpa.allocator();
|
||||
pub const std_options = .{
|
||||
.log_level = switch (builtin.mode) {
|
||||
.Debug => .debug,
|
||||
else => .info,
|
||||
},
|
||||
};
|
||||
|
||||
try network.listen(allocator);
|
||||
pub fn main() !void {
|
||||
try network.listen();
|
||||
}
|
||||
|
|
|
@ -2,7 +2,7 @@ const std = @import("std");
|
|||
const Session = @import("Session.zig");
|
||||
const Allocator = std.mem.Allocator;
|
||||
|
||||
pub fn listen(allocator: Allocator) !void {
|
||||
pub fn listen() !void {
|
||||
const addr = std.net.Address.parseIp4("0.0.0.0", 23301) catch unreachable;
|
||||
var listener = try addr.listen(.{
|
||||
.kernel_backlog = 100,
|
||||
|
@ -15,22 +15,27 @@ pub fn listen(allocator: Allocator) !void {
|
|||
const conn = listener.accept() catch continue;
|
||||
errdefer conn.stream.close();
|
||||
|
||||
const session = try allocator.create(Session);
|
||||
session.* = Session.init(conn.address, conn.stream, allocator);
|
||||
|
||||
const thread = try std.Thread.spawn(.{}, runSession, .{session});
|
||||
const thread = try std.Thread.spawn(.{}, runSession, .{ conn.address, conn.stream });
|
||||
thread.detach();
|
||||
}
|
||||
}
|
||||
|
||||
fn runSession(s: *Session) void {
|
||||
std.log.info("new connection from {}", .{s.address});
|
||||
fn runSession(address: std.net.Address, stream: std.net.Stream) !void {
|
||||
std.log.info("new connection from {}", .{address});
|
||||
|
||||
if (s.run()) |_| {
|
||||
std.log.info("client from {} disconnected", .{s.address});
|
||||
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
|
||||
defer if (gpa.deinit() == .leak) std.log.err("memory leaks were detected for session at {}", .{address});
|
||||
|
||||
const allocator = gpa.allocator();
|
||||
|
||||
const session = try allocator.create(Session);
|
||||
session.* = Session.init(address, stream, allocator);
|
||||
|
||||
if (session.*.run()) |_| {
|
||||
std.log.info("client from {} disconnected", .{address});
|
||||
} else |err| {
|
||||
std.log.err("session disconnected with an error: {}", .{err});
|
||||
}
|
||||
|
||||
s.allocator.destroy(s);
|
||||
allocator.destroy(session);
|
||||
}
|
||||
|
|
|
@ -29,3 +29,10 @@ pub fn onGetAvatarData(session: *Session, packet: *const Packet, allocator: Allo
|
|||
|
||||
try session.send(CmdID.CmdGetAvatarDataScRsp, rsp);
|
||||
}
|
||||
|
||||
pub fn onGetMultiPathAvatarInfo(session: *Session, _: *const Packet, allocator: Allocator) !void {
|
||||
var rsp = protocol.GetMultiPathAvatarInfoScRsp.init(allocator);
|
||||
try rsp.cur_multi_path_avatar_type_map.append(.{ .key = 1001, .value = .Mar_7thRogueType });
|
||||
|
||||
try session.send(CmdID.CmdGetMultiPathAvatarInfoScRsp, rsp);
|
||||
}
|
||||
|
|
|
@ -18,7 +18,7 @@ pub fn onPlayerHeartBeat(session: *Session, packet: *const Packet, allocator: Al
|
|||
const rsp = protocol.PlayerHeartBeatScRsp{
|
||||
.retcode = 0,
|
||||
.client_time_ms = req.client_time_ms,
|
||||
.server_time_ms = @intCast(std.time.timestamp()),
|
||||
.server_time_ms = @intCast(std.time.milliTimestamp()),
|
||||
.download_data = data,
|
||||
};
|
||||
|
||||
|
|
|
@ -5,6 +5,8 @@ const Session = @import("../Session.zig");
|
|||
const Packet = @import("../Packet.zig");
|
||||
const Allocator = std.mem.Allocator;
|
||||
|
||||
const log = std.log.scoped(.scene_service);
|
||||
|
||||
pub fn onGetCurSceneInfo(session: *Session, _: *const Packet, allocator: Allocator) !void {
|
||||
var scene_info = protocol.SceneInfo.init(allocator);
|
||||
scene_info.game_mode_type = 1;
|
||||
|
@ -64,7 +66,7 @@ pub fn onSceneEntityMove(session: *Session, packet: *const Packet, allocator: Al
|
|||
|
||||
for (req.entity_motion_list.items) |entity_motion| {
|
||||
if (entity_motion.motion) |motion| {
|
||||
std.log.debug("[POSITION] entity_id: {}, motion: {}", .{ entity_motion.entity_id, motion });
|
||||
log.debug("[POSITION] entity_id: {}, motion: {}", .{ entity_motion.entity_id, motion });
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -22767,7 +22767,7 @@ pub const JDKHDANPJEA = struct {
|
|||
pub usingnamespace protobuf.MessageMixins(@This());
|
||||
};
|
||||
|
||||
pub const PDLCDMEPDDJ = struct {
|
||||
pub const MultiPathAvatarInfo = struct {
|
||||
KBEJIBADOKJ: u32 = 0,
|
||||
avatar_id: MultiPathAvatarType = @enumFromInt(0),
|
||||
FKDENBOKHPO: ArrayList(AvatarSkillTree),
|
||||
|
@ -22819,18 +22819,18 @@ pub const GetMultiPathAvatarInfoCsReq = struct {
|
|||
|
||||
pub const GetMultiPathAvatarInfoScRsp = struct {
|
||||
retcode: u32 = 0,
|
||||
HKNADMABCGG: ArrayList(PDLCDMEPDDJ),
|
||||
FIFIBNJEIGL: ArrayList(FIFIBNJEIGLEntry),
|
||||
multi_path_avatar_info_list: ArrayList(MultiPathAvatarInfo),
|
||||
cur_multi_path_avatar_type_map: ArrayList(CurMultiPathAvatarTypeMapEntry),
|
||||
GMHDHIMDKFI: ArrayList(u32),
|
||||
|
||||
pub const _desc_table = .{
|
||||
.retcode = fd(7, .{ .Varint = .Simple }),
|
||||
.HKNADMABCGG = fd(13, .{ .List = .{ .SubMessage = {} } }),
|
||||
.FIFIBNJEIGL = fd(4, .{ .List = .{ .SubMessage = {} } }),
|
||||
.multi_path_avatar_info_list = fd(13, .{ .List = .{ .SubMessage = {} } }),
|
||||
.cur_multi_path_avatar_type_map = fd(4, .{ .List = .{ .SubMessage = {} } }),
|
||||
.GMHDHIMDKFI = fd(15, .{ .PackedList = .{ .Varint = .Simple } }),
|
||||
};
|
||||
|
||||
pub const FIFIBNJEIGLEntry = struct {
|
||||
pub const CurMultiPathAvatarTypeMapEntry = struct {
|
||||
key: u32 = 0,
|
||||
value: MultiPathAvatarType = @enumFromInt(0),
|
||||
|
||||
|
@ -34265,7 +34265,7 @@ pub const GGCKPLMOOPE = struct {
|
|||
NOGKOKELAKC: ArrayList(CJHMEKCHFDH),
|
||||
AFAPMKPDNAK: ArrayList(GKKAKMDBGAD),
|
||||
DLCOBFIGMMD: ArrayList(CJHMEKCHFDH),
|
||||
HKNADMABCGG: ArrayList(PDLCDMEPDDJ),
|
||||
multi_path_avatar_info_list: ArrayList(MultiPathAvatarInfo),
|
||||
KPMNKMGMEGA: ArrayList(ILDONLKCIDA),
|
||||
GLEAJHKCMEA: ?FJFLOACEAOL = null,
|
||||
LLDHJNLGOPL: u32 = 0,
|
||||
|
@ -34288,7 +34288,7 @@ pub const GGCKPLMOOPE = struct {
|
|||
.NOGKOKELAKC = fd(935, .{ .List = .{ .SubMessage = {} } }),
|
||||
.AFAPMKPDNAK = fd(10, .{ .List = .{ .SubMessage = {} } }),
|
||||
.DLCOBFIGMMD = fd(3, .{ .List = .{ .SubMessage = {} } }),
|
||||
.HKNADMABCGG = fd(1767, .{ .List = .{ .SubMessage = {} } }),
|
||||
.multi_path_avatar_info_list = fd(1767, .{ .List = .{ .SubMessage = {} } }),
|
||||
.KPMNKMGMEGA = fd(176, .{ .List = .{ .SubMessage = {} } }),
|
||||
.GLEAJHKCMEA = fd(12, .{ .SubMessage = {} }),
|
||||
.LLDHJNLGOPL = fd(552, .{ .Varint = .Simple }),
|
||||
|
|
Loading…
Reference in a new issue