KCP gameserver with packet dispatch, scene streaming, combat, gacha and the shop, plus a small HTTP server for the login flow and the wish history page. Game data under assets is pulled out of the client instead of being typed by hand. The excel tables come from the packed bin container and the spawn points from the compiled scene scripts.
75 lines
2.8 KiB
C#
75 lines
2.8 KiB
C#
using Microsoft.Extensions.DependencyInjection;
|
|
using Microsoft.Extensions.Hosting;
|
|
using Microsoft.Extensions.Logging;
|
|
using Yuanshen.Gameserver;
|
|
using Yuanshen.Gameserver.Controllers.Dispatching;
|
|
using Yuanshen.Gameserver.Game;
|
|
using Yuanshen.Gameserver.Network;
|
|
using Yuanshen.Gameserver.Network.Kcp;
|
|
using Yuanshen.Gameserver.Network.Session;
|
|
using Yuanshen.Gameserver.Options;
|
|
using Yuanshen.Common.Console;
|
|
using Yuanshen.Common.Data.Provider;
|
|
|
|
Console.Title = "Yuanshen | Game Server";
|
|
Directory.SetCurrentDirectory(AppContext.BaseDirectory);
|
|
|
|
ConsoleBanner.Print("GAME SERVER", new[]
|
|
{
|
|
("listen", "0.0.0.0:22102"),
|
|
("protocol", "kcp / 0.9.10"),
|
|
("console", "type a GM command, ? for help")
|
|
});
|
|
|
|
HostApplicationBuilder builder = Host.CreateApplicationBuilder(args);
|
|
builder.Logging.ClearProviders();
|
|
builder.Logging.AddProvider(new ThemedLoggerProvider());
|
|
|
|
builder.Services.Configure<GatewayOptions>(builder.Configuration.GetSection(GatewayOptions.Section));
|
|
builder.Services.Configure<DatabaseOptions>(builder.Configuration.GetSection(DatabaseOptions.Section));
|
|
|
|
builder.Services.UseLocalAssets();
|
|
|
|
builder.Services.AddScoped<NetCommandDispatcher>();
|
|
builder.Services.AddScoped<NetSession, KcpSession>();
|
|
builder.Services.AddScoped<GameState>();
|
|
builder.Services.AddScoped<Player>();
|
|
builder.Services.AddScoped<SceneManager>();
|
|
builder.Services.AddScoped<CombatManager>();
|
|
builder.Services.AddScoped<GmCommandService>();
|
|
builder.Services.AddSingleton<MonsterSpawnTable>();
|
|
builder.Services.AddSingleton<DropTable>();
|
|
builder.Services.AddScoped<WorldSpawner>();
|
|
builder.Services.AddScoped<Yuanshen.Gameserver.Database.PlayerPersistence>();
|
|
builder.Services.AddSingleton<Yuanshen.Gameserver.Database.PlayerSessionRegistry>();
|
|
builder.Services.AddSingleton<Yuanshen.Gameserver.Database.IPlayerRepository, Yuanshen.Gameserver.Database.PostgresPlayerRepository>();
|
|
builder.Services.AddSingleton<Yuanshen.Gameserver.Database.IAccountRepository, Yuanshen.Gameserver.Database.PostgresAccountRepository>();
|
|
builder.Services.AddSingleton<IGateway, KcpGateway>();
|
|
builder.Services.AddSingleton<ScenePointTable>();
|
|
builder.Services.AddSingleton<OpenStateTable>();
|
|
builder.Services.AddSingleton<GachaBannerTable>();
|
|
builder.Services.AddSingleton<ConsoleBridge>();
|
|
builder.Services.AddSingleton<NetSessionManager>();
|
|
|
|
builder.Services.AddHostedService<GameServer>();
|
|
|
|
IHost host = builder.Build();
|
|
ConsoleBridge bridge = host.Services.GetRequiredService<ConsoleBridge>();
|
|
|
|
ConsolePrompt.Start("yuanshen >", async command =>
|
|
{
|
|
IServiceProvider? session = bridge.Session;
|
|
|
|
if (session is null)
|
|
{
|
|
ConsolePrompt.Warn("no player is connected");
|
|
return;
|
|
}
|
|
|
|
GmCommandService gm = session.GetRequiredService<GmCommandService>();
|
|
|
|
foreach (string line in await gm.ExecuteAsync(command))
|
|
ConsolePrompt.Reply(line);
|
|
});
|
|
|
|
await host.RunAsync();
|