diff --git a/RPG.Services.Gameserver/Game/Entity/EntityManager.cs b/RPG.Services.Gameserver/Game/Entity/EntityManager.cs index f6e305b..97ded35 100644 --- a/RPG.Services.Gameserver/Game/Entity/EntityManager.cs +++ b/RPG.Services.Gameserver/Game/Entity/EntityManager.cs @@ -32,6 +32,11 @@ internal class EntityManager return null; } + public void NotifyMove(EntityBase entity) + { + _listener.OnEntityMoveByServer(entity.Id, new MotionInfo { Pos = entity.Position, Rot = entity.Rotation }); + } + public void NotifyUpdate(EntityBase entity) { _listener.OnUpdateEntity(entity.SceneEntityInfo); diff --git a/RPG.Services.Gameserver/Game/Entity/IEntityEventListener.cs b/RPG.Services.Gameserver/Game/Entity/IEntityEventListener.cs index 826962c..d7a615a 100644 --- a/RPG.Services.Gameserver/Game/Entity/IEntityEventListener.cs +++ b/RPG.Services.Gameserver/Game/Entity/IEntityEventListener.cs @@ -9,4 +9,5 @@ internal interface IEntityEventListener Task OnRemoveEntities(IEnumerable ids); Task OnUpdateEntity(SceneEntityInfo entity); + Task OnEntityMoveByServer(uint entityId, MotionInfo motion); } diff --git a/RPG.Services.Gameserver/Game/Maze/MazeManager.cs b/RPG.Services.Gameserver/Game/Maze/MazeManager.cs index 2b95825..002ec02 100644 --- a/RPG.Services.Gameserver/Game/Maze/MazeManager.cs +++ b/RPG.Services.Gameserver/Game/Maze/MazeManager.cs @@ -3,7 +3,6 @@ using RPG.GameCore.Level; using RPG.GameCore.Level.Floor; using RPG.GameCore.Level.Group; using RPG.GameCore.Level.Objects; -using RPG.GameCore.Util; using RPG.Network.Proto; using RPG.Services.Gameserver.Game.Entity; using RPG.Services.Gameserver.Game.Entity.Factory; @@ -47,7 +46,7 @@ internal class MazeManager if (entity != null) { entity.SetMotion(CreateInitialAvatarMotion()); - EntityManager.NotifyUpdate(entity); + EntityManager.NotifyMove(entity); } } } diff --git a/RPG.Services.Gameserver/Modules/AdventureModule.cs b/RPG.Services.Gameserver/Modules/AdventureModule.cs index 386efe2..635839e 100644 --- a/RPG.Services.Gameserver/Modules/AdventureModule.cs +++ b/RPG.Services.Gameserver/Modules/AdventureModule.cs @@ -45,6 +45,9 @@ internal class AdventureModule : BaseModule public override Task OnLogin() { + ModuleManager.Get().InitStartingLineup(); + + _mazeManager.SetPlayerUid(ModuleManager.PlayerUID); _mazeManager.EnterMaze(StartingEntryId, ModuleManager.Get().Team); return Task.CompletedTask; diff --git a/RPG.Services.Gameserver/Modules/BattleModule.cs b/RPG.Services.Gameserver/Modules/BattleModule.cs index 2e391e2..d88e675 100644 --- a/RPG.Services.Gameserver/Modules/BattleModule.cs +++ b/RPG.Services.Gameserver/Modules/BattleModule.cs @@ -30,12 +30,12 @@ internal class BattleModule : BaseModule { PVEBattleResultCsReq req = PVEBattleResultCsReq.Parser.ParseFrom(body.Span); AdventureModule adventureModule = ModuleManager.Get(); - switch (req.EndStatus) { case BattleEndStatus.BattleEndWin: adventureModule.OnBattleWin(_battleMonsterEntityId, _battleMonsterAssists!); break; + case BattleEndStatus.BattleEndQuit: case BattleEndStatus.BattleEndLose: adventureModule.OnBattleLost(); break; diff --git a/RPG.Services.Gameserver/Modules/LoginModule.cs b/RPG.Services.Gameserver/Modules/LoginModule.cs index 3070e2f..16f85d9 100644 --- a/RPG.Services.Gameserver/Modules/LoginModule.cs +++ b/RPG.Services.Gameserver/Modules/LoginModule.cs @@ -19,7 +19,7 @@ internal class LoginModule : BaseModule PlayerLoginCsReq req = PlayerLoginCsReq.Parser.ParseFrom(body.Span); _mazeEventListener.Session = session; - await ModuleManager.OnLogin(); + await ModuleManager.OnLogin(session.PlayerUid); Send(session, CmdType.CmdPlayerLoginScRsp, new PlayerLoginScRsp { diff --git a/RPG.Services.Gameserver/Modules/ModuleManager.cs b/RPG.Services.Gameserver/Modules/ModuleManager.cs index 7f3fefe..15dc89f 100644 --- a/RPG.Services.Gameserver/Modules/ModuleManager.cs +++ b/RPG.Services.Gameserver/Modules/ModuleManager.cs @@ -21,6 +21,8 @@ internal class ModuleManager private readonly IServiceProvider _serviceProvider; private readonly ILogger _logger; + public uint PlayerUID { get; private set; } + static ModuleManager() { s_moduleTypes = Assembly.GetExecutingAssembly().GetTypes().Where(t => t.IsAssignableTo(typeof(BaseModule)) && !t.IsAbstract); @@ -39,8 +41,10 @@ internal class ModuleManager return _serviceProvider.GetRequiredService(); } - public async Task OnLogin() + public async Task OnLogin(uint gameUID) { + PlayerUID = gameUID; + foreach (Type moduleType in s_moduleTypes) { if (_serviceProvider.GetRequiredService(moduleType) is BaseModule module) diff --git a/RPG.Services.Gameserver/Modules/TeamModule.cs b/RPG.Services.Gameserver/Modules/TeamModule.cs index 5cf3cb5..bcda526 100644 --- a/RPG.Services.Gameserver/Modules/TeamModule.cs +++ b/RPG.Services.Gameserver/Modules/TeamModule.cs @@ -14,14 +14,12 @@ internal class TeamModule : BaseModule { } - public override Task OnLogin() + public void InitStartingLineup() { for (uint i = 0; i < StartingLineup.Length; i++) { Team.Join(StartingLineup[i], AvatarType.AvatarFormalType, i); } - - return Task.CompletedTask; } [OnCommand(CmdType.CmdChangeLineupLeaderCsReq)] diff --git a/RPG.Services.Gameserver/Session/SessionEntityEventListener.cs b/RPG.Services.Gameserver/Session/SessionEntityEventListener.cs index 6173be7..50698e2 100644 --- a/RPG.Services.Gameserver/Session/SessionEntityEventListener.cs +++ b/RPG.Services.Gameserver/Session/SessionEntityEventListener.cs @@ -37,4 +37,22 @@ internal class SessionEntityEventListener : IEntityEventListener return Task.CompletedTask; } + + public Task OnEntityMoveByServer(uint entityId, MotionInfo motion) + { + SceneEntityMoveScNotify notify = new() + { + EntityId = entityId, + Motion = motion + }; + + Session?.SendToService(RPGServiceType.Gateserver, ServiceCommandType.ForwardGameMessage, new CmdForwardGameMessage + { + SessionId = Session.SessionId, + CmdType = (uint)CmdType.CmdSceneEntityMoveScNotify, + Payload = notify.ToByteString() + }); + + return Task.CompletedTask; + } }