Skip to content

Commit a5f4271

Browse files
committed
Add game module & player initialization
1 parent 3e09322 commit a5f4271

File tree

11 files changed

+143
-8
lines changed

11 files changed

+143
-8
lines changed
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
using System.Threading.Tasks;
2+
3+
namespace NetScape.Abstractions.Interfaces.Game.Interface
4+
{
5+
public interface ITabManager
6+
{
7+
Task SetTabAsync(Model.Game.Player player, int tabId, int interfaceId);
8+
9+
int[] Default { get; }
10+
}
11+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
using System.Threading.Tasks;
2+
3+
namespace NetScape.Abstractions.Interfaces.Game.Player
4+
{
5+
/// <summary>
6+
/// Initializes a player after login is complete.
7+
/// </summary>
8+
public interface IPlayerInitializer
9+
{
10+
/// <summary>
11+
/// Initializes a <see cref="Model.Game.Player"/> after <see cref="Login.ILoginProvider"/>
12+
/// authenticates the player successfully.
13+
/// </summary>
14+
/// <param name="player">The player.</param>
15+
Task InitializeAsync(Model.Game.Player player);
16+
}
17+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
using Autofac;
2+
using NetScape.Abstractions.Interfaces.Game.Interface;
3+
using NetScape.Abstractions.Interfaces.Game.Player;
4+
using NetScape.Modules.Game.Interface;
5+
using NetScape.Modules.Game.Player;
6+
7+
namespace NetScape.Modules.Game
8+
{
9+
public class GameModule : Module
10+
{
11+
protected override void Load(ContainerBuilder builder)
12+
{
13+
builder.RegisterType<TabManager>().As<ITabManager>();
14+
builder.RegisterType<PlayerInitializer>().As<IPlayerInitializer>();
15+
base.Load(builder);
16+
}
17+
}
18+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
using NetScape.Abstractions.Interfaces.Game.Interface;
2+
using NetScape.Modules.Messages.Encoders;
3+
using System.Threading.Tasks;
4+
5+
namespace NetScape.Modules.Game.Interface
6+
{
7+
public class TabManager : ITabManager
8+
{
9+
public int[] Default { get; } = new int[] { 2423, 3917, 638, 3213, 1644, 5608, 1151, -1, 5065, 5715, 2449, 904, 147, 962, };
10+
11+
public Task SetTabAsync(Abstractions.Model.Game.Player player, int tabId, int interfaceId)
12+
{
13+
var switchTabMessage = new SwitchTabInterfaceMessage
14+
{
15+
InterfaceId = (short)interfaceId,
16+
TabId = (byte)tabId
17+
};
18+
return player.SendAsync(switchTabMessage);
19+
}
20+
}
21+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<TargetFramework>netcoreapp5.0</TargetFramework>
5+
</PropertyGroup>
6+
7+
<ItemGroup>
8+
<ProjectReference Include="..\NetScape.Abstractions\NetScape.Abstractions.csproj" />
9+
<ProjectReference Include="..\NetScape.Modules.Messages\NetScape.Modules.Messages.csproj" />
10+
</ItemGroup>
11+
12+
</Project>
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
using NetScape.Abstractions.Interfaces.Game.Interface;
2+
using NetScape.Abstractions.Interfaces.Game.Player;
3+
using NetScape.Modules.Messages.Encoders;
4+
using System.Threading.Tasks;
5+
6+
namespace NetScape.Modules.Game.Player
7+
{
8+
public class PlayerInitializer : IPlayerInitializer
9+
{
10+
private readonly ITabManager _tabManager;
11+
12+
public PlayerInitializer(ITabManager tabManager)
13+
{
14+
_tabManager = tabManager;
15+
}
16+
17+
public async Task InitializeAsync(Abstractions.Model.Game.Player player)
18+
{
19+
var initMessage = new IdAssignmentMessage { IsMembers = 1, NewId = 1 };
20+
await player.SendAsync(initMessage);
21+
player.UpdateAppearance();
22+
23+
var defaultTabs = _tabManager.Default;
24+
for (int tab = 0; tab < defaultTabs.Length; tab++)
25+
{
26+
var interfaceId = defaultTabs[tab];
27+
_ = _tabManager.SetTabAsync(player, tab, interfaceId);
28+
}
29+
}
30+
}
31+
}

NetScape.Modules.LoginProtocol/Handlers/LoginDecoder.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using DotNetty.Transport.Channels;
44
using NetScape.Abstractions;
55
using NetScape.Abstractions.Extensions;
6+
using NetScape.Abstractions.Interfaces.Game.Player;
67
using NetScape.Abstractions.Interfaces.Login;
78
using NetScape.Abstractions.Interfaces.Messages;
89
using NetScape.Abstractions.Interfaces.World;
@@ -52,13 +53,14 @@ public class LoginDecoder : StatefulFrameDecoder<LoginDecoderState>
5253
private readonly ILoginProcessor<Rs2LoginRequest, Rs2LoginResponse> _loginProcessor;
5354
private readonly IMessageProvider _gameMessageProvider;
5455
private readonly IWorld _world;
55-
56-
public LoginDecoder(ILogger logger, ILoginProcessor<Rs2LoginRequest, Rs2LoginResponse> loginProcessor, IMessageProvider gameMessageProvider, IWorld world) : base(LoginDecoderState.LoginHandshake)
56+
private readonly IPlayerInitializer _playerInitializer;
57+
public LoginDecoder(ILogger logger, ILoginProcessor<Rs2LoginRequest, Rs2LoginResponse> loginProcessor, IMessageProvider gameMessageProvider, IWorld world, IPlayerInitializer playerInitializer) : base(LoginDecoderState.LoginHandshake)
5758
{
5859
_logger = logger;
5960
_gameMessageProvider = gameMessageProvider;
6061
_loginProcessor = loginProcessor;
6162
_world = world;
63+
_playerInitializer = playerInitializer;
6264
}
6365

6466
protected override void Decode(IChannelHandlerContext context, IByteBuffer input, List<object> output, LoginDecoderState state)
@@ -246,7 +248,8 @@ private async Task WriteProcessorResponseAsync(Rs2LoginResponse loginResult, ICh
246248
{
247249
await ctx.WriteAndFlushAsync(loginResult);
248250
HandleLoginProcessorResponse(loginResult.Player, loginResult.Status, ctx, randomPair);
249-
} catch(Exception e)
251+
}
252+
catch (Exception e)
250253
{
251254
Log.Logger.Error(e, nameof(WriteProcessorResponseAsync));
252255
await ctx.CloseAsync();
@@ -300,10 +303,7 @@ private void HandleLoginProcessorResponse(Player player, LoginStatus response, I
300303
ctx.GetAttribute(Constants.PlayerAttributeKey).SetIfAbsent(player);
301304
player.ChannelHandlerContext = ctx;
302305
_world.Add(player);
303-
304-
var initMessage = new IdAssignmentMessage { IsMembers = (byte)1, NewId = 1 };
305-
_ = player.SendAsync(initMessage);
306-
player.UpdateAppearance();
306+
_ = _playerInitializer.InitializeAsync(player);
307307
}
308308
}
309309
}

NetScape.Modules.Messages/encoder-messages.json

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,22 @@
106106
"Transform": "Add"
107107
}
108108
]
109+
},
110+
{
111+
"Name": "SwitchTabInterfaceMessage",
112+
"Id": 71,
113+
"FrameType": "Fixed",
114+
"Params": [
115+
{
116+
"Name": "InterfaceId",
117+
"Type": "Short"
118+
},
119+
{
120+
"Name": "TabId",
121+
"Type": "Byte",
122+
"Transform": "Add"
123+
}
124+
]
109125
}
110126
]
111127
}

NetScape.sln

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NetScape.Modules.World.Upda
3232
EndProject
3333
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NetScape.Modules.Region", "NetScape.Modules.Region\NetScape.Modules.Region.csproj", "{C1622972-D92D-41E7-8547-D20BD0D2F6D1}"
3434
EndProject
35-
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NetScape.Modules.Region.Collision", "NetScape.Modules.Region.Collision\NetScape.Modules.Region.Collision.csproj", "{DD128036-A424-4432-8B59-CBDB3E10531D}"
35+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NetScape.Modules.Region.Collision", "NetScape.Modules.Region.Collision\NetScape.Modules.Region.Collision.csproj", "{DD128036-A424-4432-8B59-CBDB3E10531D}"
36+
EndProject
37+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NetScape.Modules.Game", "NetScape.Modules.Game\NetScape.Modules.Game.csproj", "{2F68D1D5-2637-4B34-A2F7-4DCDAC66A74A}"
3638
EndProject
3739
Global
3840
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -96,6 +98,10 @@ Global
9698
{DD128036-A424-4432-8B59-CBDB3E10531D}.Debug|Any CPU.Build.0 = Debug|Any CPU
9799
{DD128036-A424-4432-8B59-CBDB3E10531D}.Release|Any CPU.ActiveCfg = Release|Any CPU
98100
{DD128036-A424-4432-8B59-CBDB3E10531D}.Release|Any CPU.Build.0 = Release|Any CPU
101+
{2F68D1D5-2637-4B34-A2F7-4DCDAC66A74A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
102+
{2F68D1D5-2637-4B34-A2F7-4DCDAC66A74A}.Debug|Any CPU.Build.0 = Debug|Any CPU
103+
{2F68D1D5-2637-4B34-A2F7-4DCDAC66A74A}.Release|Any CPU.ActiveCfg = Release|Any CPU
104+
{2F68D1D5-2637-4B34-A2F7-4DCDAC66A74A}.Release|Any CPU.Build.0 = Release|Any CPU
99105
EndGlobalSection
100106
GlobalSection(SolutionProperties) = preSolution
101107
HideSolutionNode = FALSE

NetScape/Kernel.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
using NetScape.Abstractions.Model.Game.Walking;
1010
using NetScape.Modules.Cache;
1111
using NetScape.Modules.DAL;
12+
using NetScape.Modules.Game;
1213
using NetScape.Modules.Logging.SeriLog;
1314
using NetScape.Modules.LoginProtocol;
1415
using NetScape.Modules.Messages;
@@ -69,6 +70,7 @@ private static void ConfigureAutofac(ContainerBuilder containerBuilder)
6970
containerBuilder.RegisterModule(new UpdatingModule());
7071
containerBuilder.RegisterModule(new RegionModule());
7172
containerBuilder.RegisterModule(new CollisionModule());
73+
containerBuilder.RegisterModule(new GameModule());
7274
containerBuilder.RegisterType<WalkingQueueHandler>();
7375
containerBuilder.RegisterType<FileSystem>().As<IFileSystem>();
7476
containerBuilder.RegisterType<ContainerProvider>().SingleInstance();

0 commit comments

Comments
 (0)