Net.Like.Xue.Tokyo/Packages-Local/Com.Project.B.Unity/Program.cs

643 lines
27 KiB
C#

using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Reflection;
using System.Threading;
using BITFALL;
using BITFALL.Bullet;
using BITKit;
using BITKit.Console;
using BITKit.Entities;
using BITKit.IO;
using BITKit.Mod;
using BITKit.Net;
using BITKit.Pool;
using BITKit.StateMachine;
using BITKit.UX;
using BITKit.UX.Hotkey;
using BITKit.UX.Settings;
using BITKit.WorldNode;
using Com.Project.B.Lobby;
using Cysharp.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Net.BITKit.Chat;
using Net.BITKit.Database;
using Net.BITKit.Localization;
using Net.BITKit.Quadtree;
using Net.BITKit.UX;
using Net.BITKit.UX.SnackBar;
using Net.BITKit.VFX;
using Net.Project.B;
using Net.Project.B.AI;
using Net.Project.B.AI.Dialogue;
using Net.Project.B.AI.Dialogue.MaxKb;
using Net.Project.B.Buff;
using Net.Project.B.Chat;
using Net.Project.B.Damage;
using Net.Project.B.Dialogue;
using Net.Project.B.Health;
using Net.Project.B.Interaction;
using Net.Project.B.Inventory;
using Net.Project.B.Item;
using Net.Project.B.Loot;
using Net.Project.B.Mark;
using Net.Project.B.Melee;
using Net.Project.B.PDA;
using Net.Project.B.PDA.App;
using Net.Project.B.Quest;
using Net.Project.B.Survival;
using Net.Project.B.UX;
using Net.Project.B.Vehicle;
using Net.Project.B.World;
using Net.Project.B.WorldNode;
using Newtonsoft.Json;
using Project.B.Animation;
using Project.B.Authorize;
using Project.B.CharacterController;
using Project.B.Entities;
using Project.B.Map;
using Project.B.Player;
using Project.B.UX;
using UnityEngine;
using UnityEngine.InputSystem;
using YamlDotNet.Serialization;
using YamlDotNet.Serialization.NamingConventions;
using IUXDialogue = Net.Project.B.UX.IUXDialogue;
namespace Project.B
{
public class Program : MonoBehaviour
{
public class DefaultDictionary<TKey,TValue>:Dictionary<TKey,TValue>
{
}
public static async UniTask<IServiceCollection> AddProjectBServices(IServiceCollection serviceCollection,CancellationTokenSource cancellationTokenSource)
{
YooAssetModHelper.PackagesManifestDictionary.Clear();
ModService.LoadAssetAsyncFactory += YooAssetModHelper.LoadAsset;
ModService.LoadAssetsAsyncFactory += YooAssetModHelper.LoadAssets;
// 自动持久化存储Dictionary
//serviceCollection.AddSingleton(typeof(IDictionary<,>), typeof(LiteDbDictionary<,>));
serviceCollection.AddSingleton(typeof(IDictionary<,>),typeof(DefaultDictionary<,>));
//本地化
serviceCollection.AddSingleton<ILocalizationService, LocalizationService>();
// 本地化Csv支持
serviceCollection.AddSingleton<CsvLocalizationService>();
serviceCollection.AddLogging();
serviceCollection.AddSingleton<IServiceCollection>(serviceCollection);
//初始化Log
serviceCollection.AddSingleton(typeof(ILogger<>),typeof( UnityLogger<>));
serviceCollection.AddSingleton<ILogger<IUXInitialize>>(x => x.GetRequiredService<IUXInitialize>());
//yaml
// 创建序列化器并注册转换器
var serializer = new SerializerBuilder()
.WithNamingConvention(CamelCaseNamingConvention.Instance)
.WithTypeConverter(new UnityMathematicsYamlConverters())
.Build();
var deserializer = new DeserializerBuilder()
.WithNamingConvention(CamelCaseNamingConvention.Instance)
.WithTypeConverter(new UnityMathematicsYamlConverters())
.Build();
serviceCollection.AddSingleton<ISerializer>(serializer);
serviceCollection.AddSingleton<IDeserializer>(deserializer);
serviceCollection.AddSingleton<YooAssetModHelper>();
//物品实体初始化
serviceCollection.AddSingleton<ScriptableEntitiesService>();
//初始化状态机
serviceCollection.AddSingleton(typeof(IMicroStateMachine<>), typeof(MicroStateMachine<>));
//初始化数据监听
serviceCollection.AddSingleton(typeof(IWrapper<>), typeof(ValueWrapper<>));
//初始化服务
serviceCollection.AddSingleton(serviceCollection);
//对象池
serviceCollection.AddSingleton<IPoolService, UnityPoolService>();
//主循环
serviceCollection.AddSingleton<ITicker,GameTick>();
serviceCollection.AddSingleton<IMainTicker, UnityUpdateTick>();
serviceCollection.AddSingleton<IAfterTicker, UnityLateUpdateTick>();
serviceCollection.AddSingleton<IFixedTicker, UnityFixedUpdateTick>();
serviceCollection.AddSingleton<IAsyncTicker, AsyncTicker>();
serviceCollection.AddSingleton(cancellationTokenSource);
//网络
serviceCollection.AddSingleton<INetClient, KcpNetClient>();
serviceCollection.AddSingleton<INetServer, KCPNetServer>();
serviceCollection.AddSingleton<INetProvider>(x => x.GetRequiredService<INetClient>().NetProvider);
//玩家&实体
serviceCollection.AddSingleton<IEntitiesService, EntitiesService>();
serviceCollection.AddSingleton<GameMapPlayerService>();
//对话树
serviceCollection.AddSingleton<IDialogueService, DialogueService>();
//NodeCanvas对话树中间件
serviceCollection.AddSingleton<DialogueMiddlewareNodeCanvasDialogueTree>();
//地图
serviceCollection.AddSingleton<IGameMapService, GameMapService>();
//大厅
serviceCollection.AddSingleton<ILobbyServices>(x=>x.GetRequiredService<INetProvider>().GetRemoteInterface<ILobbyServices>());
//授权
serviceCollection.AddSingleton<IAuthorizeService>(x=>x.GetRequiredService<INetProvider>().GetRemoteInterface<IAuthorizeService>());
//玩家角色控制器服务
serviceCollection.AddSingleton<ICharacterService, CharacterService>();
//玩家生命值
serviceCollection.AddSingleton<IHealthService, HealthService>();
//玩家击倒服务
serviceCollection.AddSingleton<IKnockedService, KnockedService>();
var scriptablePlayerAnimation =await
ModService.LoadAsset<ScriptablePlayerAnimationFactory>("scriptable_player_animations");
//玩家动画
serviceCollection.AddSingleton<IHumanoidAnimationFactory>(scriptablePlayerAnimation);
serviceCollection.AddSingleton<IPlayerAnimationFactory>(scriptablePlayerAnimation);
// 玩家过渡动画
serviceCollection.AddSingleton<IHumanoidTransitionAnimationFactory>(await
ModService.LoadAsset<ScriptableHumanoidTransitionAnimationFactory>("scriptable_player_translation_animations"));
//注册实体工厂
serviceCollection.AddSingleton<IEntitiesFactory, EntitiesFactory>();
serviceCollection.AddSingleton<IPlayerFactory, PlayerFactory>();
serviceCollection.AddSingleton<INpcFactory, NpcFactory>();
//场景互动
serviceCollection.AddSingleton<IWorldInteractionService, UnityInteractionService>();
//场景可互动高亮
serviceCollection.AddSingleton<WorldHighlightService>();
//场景互动门
serviceCollection.AddSingleton<UnityDoorService>();
//载具系统
serviceCollection.AddSingleton<WorldCarService>();
//座位系统
serviceCollection.AddSingleton<IWorldSeatService, WorldSeatService>();
//实体生成
serviceCollection.AddSingleton<UnityEntitiesCreateService>();
//电梯
serviceCollection.AddSingleton<UnityElevatorService>();
//场景物品服务
serviceCollection.AddSingleton<IManagedItemService, ManagedItemService>();
//玩家配置
serviceCollection.AddSingleton<IPlayerData>(x=>x.GetRequiredService<INetProvider>().GetRemoteInterface<IPlayerData>());
serviceCollection.AddSingleton<IPlayerService>(x=>x.GetRequiredService<INetProvider>().GetRemoteInterface<IPlayerService>());
var keyMap =await ModService.LoadAsset<ScriptablePlayerKeyMap>("scriptable_player_key_map");
serviceCollection.AddSingleton<IPlayerKeyMap<InputAction>>(keyMap);
serviceCollection.AddSingleton<IUXKeyMap<InputAction>>(keyMap);
serviceCollection.AddSingleton<ICarKeyMap<InputAction>>(keyMap);
//任务
serviceCollection.AddSingleton<IQuestService, QuestService>();
//世界相机
serviceCollection.AddSingleton<WorldCameraService>();
//场景侦查
serviceCollection.AddSingleton<ISnapshotService, UnitySnapshotService>();
//Unity设置
serviceCollection.AddSingleton<UnitySettingService>();
//添加作弊器
serviceCollection.AddSingleton<CheatService>();
//购买商店
serviceCollection.AddSingleton<IBuyStationService, UnityBuyStationService>();
// Minimap
serviceCollection.AddSingleton<IWorldMinimapService,UnityMinimapService>();
//战利品
serviceCollection.AddSingleton<ILootService, UnityLootService>();
// NPC生成
serviceCollection.AddSingleton<INpcSpawnService, NpcSpawnService>();
// 子弹
serviceCollection.AddSingleton<IBulletService, BulletService>();
// VFX
serviceCollection.AddSingleton<VFXService>();
//伤害
serviceCollection.AddSingleton<IDamageService, UnityDamageService>();
//近战
serviceCollection.AddSingleton<IMeleeService, UnityMeleeService>();
// 本地化
serviceCollection.AddSingleton<UXLocalization>();
// 自动回血
serviceCollection.AddSingleton<PlayerAutoHealController>();
//建筑Lod
serviceCollection.AddSingleton<WorldChunkService>();
// Zombie AI
serviceCollection.AddSingleton<AIZombieService>();
// Human AI
serviceCollection.AddSingleton<AIHumanService>();
// Shooter AI
serviceCollection.AddSingleton<AIShooterService>();
// 自动四叉树
serviceCollection.AddSingleton(typeof(QuadTreeService<>));
// AI传感器
serviceCollection.AddSingleton<AISensorService>();
// 标记系统
serviceCollection.AddSingleton<IMarkService,UnityMarkService>();
// 世界任务
serviceCollection.AddSingleton<WorldQuestService>();
// 撤离点
serviceCollection.AddSingleton<UnityEvacuateService>();
// 地铁
serviceCollection.AddSingleton<UnitySubwayService>();
// Buff
serviceCollection.AddSingleton<UnityBuffService>();
// 生存
serviceCollection.AddSingleton<UnitySurvivalService>();
// AI 开门
serviceCollection.AddSingleton<AIOpenDoorService>();
// App
serviceCollection.AddSingleton<IChatService, ChatService>();
serviceCollection.AddSingleton<IAppClass<Net.Project.B.PDA.App.Map>>(x=>x.GetRequiredService<AppMap>());
serviceCollection.AddSingleton<IAppClass<Phone>, AppPhone>();
serviceCollection.AddSingleton<IAppClass<Quest>, AppQuest>();
serviceCollection.AddSingleton<IAppClass<Feed>, AppFeed>();
serviceCollection.AddSingleton<IAppClass<Chat>, AppChat>();
serviceCollection.AddSingleton<IAppClass>(x => x.GetRequiredService<IAppClass<Net.Project.B.PDA.App.Map>>());
serviceCollection.AddSingleton<IAppClass>(x => x.GetRequiredService<IAppClass<Phone>>());
serviceCollection.AddSingleton<IAppClass>(x => x.GetRequiredService<IAppClass<Quest>>());
serviceCollection.AddSingleton<IAppClass>(x => x.GetRequiredService<IAppClass<Feed>>());
serviceCollection.AddSingleton<IAppClass>(x => x.GetRequiredService<IAppClass<Chat>>());
serviceCollection.AddSingleton<AppMap>();
serviceCollection.AddKeyedSingleton<IUXMap,UXMap<AppMap>>(nameof(AppMap));
serviceCollection.AddSingleton<WorldRangedDialogueService>();
serviceCollection.AddSingleton<IAiDialogueService, MaxKbDialogueService>();
//战利品搜刮可视化
serviceCollection.AddSingleton<UnityLootContainerVisualService>();
return serviceCollection;
}
public static async UniTask<IServiceProvider> BuildServiceProvider(IServiceProvider serviceProvider,CancellationToken cancellationToken=default)
{
cancellationToken.Register(() =>
{
ModService.LoadAssetAsyncFactory -= YooAssetModHelper.LoadAsset;
ModService.LoadAssetsAsyncFactory -= YooAssetModHelper.LoadAssets;
YooAssetModHelper.PackagesManifestDictionary.Clear();
});
cancellationToken.Register(serviceProvider.GetRequiredService<IAsyncTicker>().Dispose);
var playerSettings = new PlayerSettings();
if (PlayerPrefs.HasKey(nameof(PlayerSettings)))
{
var json = PlayerPrefs.GetString(nameof(PlayerSettings));
playerSettings = JsonConvert.DeserializeObject<PlayerSettings>(json);
Debug.Log("已读取到玩家设置");
}
else
{
var json = JsonConvert.SerializeObject(playerSettings);
PlayerPrefs.SetString(nameof(PlayerSettings), json);
PlayerPrefs.Save();
Debug.Log("未读取到玩家设置,创建默认设置");
}
var settingsWrapper = serviceProvider.GetRequiredService<IWrapper<PlayerSettings>>();
settingsWrapper .Value = playerSettings;
settingsWrapper.OnValueChanged += (_, x) =>
{
var json = JsonConvert.SerializeObject(x);
PlayerPrefs.SetString(nameof(PlayerSettings), json);
PlayerPrefs.Save();
};
//初始化Log
var logger = serviceProvider.GetRequiredService<ILogger<Program>>();
BIT4Log.OnLog += (x) => { logger.LogInformation(x); };
BIT4Log.OnWarning += (x) => { logger.LogWarning(x); };
BIT4Log.OnException += (x) => { logger.LogCritical(x,x.Message);};
logger.LogInformation("Hello World");
var loginLogger = serviceProvider.GetRequiredService<ILogger<IUXInitialize>>();
loginLogger.LogInformation("正在加载本地化支持");
try
{
var localize = serviceProvider.GetRequiredService<ILocalizationService>();
serviceProvider.GetRequiredService<CsvLocalizationService>();
await localize.ChangeLanguageAsync(playerSettings.Language)
.TimeoutWithoutException(TimeSpan.FromSeconds(1))
;
loginLogger.LogInformation("本地化加载完成");
await UniTask.Delay(100, cancellationToken: cancellationToken);
}
catch (Exception e)
{
loginLogger.LogError(e, $"加载本地化支持失败:{e.Message}");
await UniTask.Delay(1000, cancellationToken: cancellationToken);
}
loginLogger.LogInformation("正在加载设置...");
//获取Unity设置
serviceProvider.GetRequiredService<UnitySettingService>();
loginLogger.LogInformation("正在初始化Mod...");
await ModService.Initialize(loginLogger);
loginLogger.LogInformation("正在从本地文件夹加载Mod...");
await YooAssetModHelper.LoadMods(loginLogger);
loginLogger.LogInformation("正在加载物品...");
await serviceProvider.GetRequiredService<ScriptableEntitiesService>().InitializeAsync(loginLogger);
loginLogger.LogInformation("正在加载菜单场景...");
await serviceProvider.GetRequiredService<IGameMapService>().StopMapAsync();
//初始化玩家动画
var animationFactory = serviceProvider.GetRequiredService<IPlayerAnimationFactory>();
await animationFactory.InitializeAsync();
//场景高亮
serviceProvider.GetRequiredService<WorldHighlightService>();
//场景互动门
serviceProvider.GetRequiredService<UnityDoorService>();
//载具
serviceProvider.GetRequiredService<WorldCarService>();
//座位系统
serviceProvider.GetRequiredService<IWorldSeatService>();
//实体生成
serviceProvider.GetRequiredService<UnityEntitiesCreateService>();
//场景电梯
serviceProvider.GetRequiredService<UnityElevatorService>();
//场景物品服务
serviceProvider.GetRequiredService<IManagedItemService>();
//初始化玩家
var playerFactory = serviceProvider.GetRequiredService<IPlayerFactory>();
serviceProvider.GetRequiredService<GameMapPlayerService>();
//作弊器
serviceProvider.GetRequiredService<CheatService>();
//获取相机
serviceProvider.GetRequiredService<WorldCameraService>();
//加载对话树中间件
serviceProvider.GetRequiredService<DialogueMiddlewareNodeCanvasDialogueTree>();
// Minimap
serviceProvider.GetRequiredService<IWorldMinimapService>();
// 战利品
serviceProvider.GetRequiredService<ILootService>();
// 伤害服务
serviceProvider.GetRequiredService<IDamageService>();
// NPC生成
cancellationToken.Register( serviceProvider.GetRequiredService<INpcSpawnService>().Dispose);
// 自动回血
serviceProvider.GetRequiredService<PlayerAutoHealController>();
//建筑LOD
serviceProvider.GetRequiredService<WorldChunkService>();
// Zombie AI
serviceProvider.GetRequiredService<AIZombieService>();
// Human AI
serviceProvider.GetRequiredService<AIHumanService>();
// Shooter AI
serviceProvider.GetRequiredService<AIShooterService>();
// AI传感器
serviceProvider.GetRequiredService<AISensorService>();
// 标记系统
serviceProvider.GetRequiredService<IMarkService>();
// 世界任务
serviceProvider.GetRequiredService<WorldQuestService>();
// 撤离点
serviceProvider.GetRequiredService<UnityEvacuateService>();
// 地铁
serviceProvider.GetRequiredService<UnitySubwayService>();
// Buff
serviceProvider.GetRequiredService<UnityBuffService>();
// 生存
serviceProvider.GetRequiredService<UnitySurvivalService>();
// AI 开门
serviceProvider.GetRequiredService<AIOpenDoorService>();
// App
serviceProvider.GetKeyedService<IUXMap>(nameof(AppMap));
// 世界范围对话
serviceProvider.GetRequiredService<WorldRangedDialogueService>();
// 战利品搜刮可视化
serviceProvider.GetRequiredService<UnityLootContainerVisualService>();
return serviceProvider;
}
private async void Start()
{
DontDestroyOnLoad(gameObject);
var source = new CancellationTokenSource();
destroyCancellationToken.Register(source.Cancel);
var serviceCollection = BITApp.ServiceCollection = new ServiceCollection();
await AddProjectBServices(serviceCollection, source);
//基本UI框架
serviceCollection.AddSingleton<UXModService>();
serviceCollection.AddSingleton<UXConsole>();
serviceCollection.AddSingleton<UXContextMenu>();
serviceCollection.AddSingleton<UXToolTips>();
serviceCollection.AddSingleton<UXRadialMenu>();
serviceCollection.AddSingleton<IUXHotKey>(x => x.GetRequiredService<UXRadialMenu>());
serviceCollection.AddSingleton<IUXSettings,UXSettings<IUXLobby, PlayerSettings>>();
//UX用户页面
serviceCollection.AddSingleton<IUXService, UXService>();
serviceCollection.AddSingleton<IUXLobby,UXLobby>();
serviceCollection.AddSingleton<UXLobbySearch>();
serviceCollection.AddSingleton<IUXHud,UXHUD>();
serviceCollection.AddSingleton<IUXInventory,UXInventory<IUXHud>>();
serviceCollection.AddSingleton<IUXInventorySwap, UXInventorySwap>();
serviceCollection.AddSingleton<IUXDialogue,UXDialogue<IUXHud>>();
serviceCollection.AddSingleton<IUXLoadingMap,UXLoadingMap>();
serviceCollection.AddSingleton<IUXInitialize,UXInitialize>();
serviceCollection.AddSingleton<IUXMapSelector,UXMapSelector>();
serviceCollection.AddSingleton<IUXControlMode,UXControlMode<IUXHud>>();
serviceCollection.AddKeyedSingleton<IUXMap, UXMap<IUXInventory>>(nameof(IUXInventory));
serviceCollection.AddKeyedSingleton<IUXMap, UXMap<IUXHud>>(nameof(IUXHud));
serviceCollection.AddKeyedSingleton<IUXInventoryPrompt, UXInventoryPrompt<IUXHud>>(nameof(IUXHud));
serviceCollection.AddSingleton<IUXItemInspector,UXItemInspector>();
serviceCollection.AddSingleton<IUXSnapshot,UXSnapshots>();
serviceCollection.AddSingleton<IUXSnapshotWindow,UXSnapshotWindow>();
serviceCollection.AddSingleton<IUXBuyStation,UXBuyStation>();
serviceCollection.AddSingleton<IUXCosmetics,UXCosmetics<IUXLobby>>();
serviceCollection.AddSingleton<IUXIndicator,UXIndicator<IUXHud>>();
serviceCollection.AddSingleton<IUXMark, UXMark<IUXHud>>();
serviceCollection.AddSingleton<IUXQuest, UXQuest<IUXHud>>();
serviceCollection.AddSingleton<IUXSurvival, UXSurvival<IUXInventory>>();
serviceCollection.AddSingleton<IUXChat, UXChat<IUXHud>>();
serviceCollection.AddSingleton<ISnackBar, UXSnackBar<IUXHud>>();
// PDA
serviceCollection.AddSingleton<IPDAService, UnityPDAService>();
//UX独立页面
serviceCollection.AddSingleton<IUXWaiting, UXWaiting>();
//serviceCollection.AddSingleton<IUXDialogue, UXAlert>();
var serviceProvider =BITApp.ServiceProvider= serviceCollection.BuildServiceProvider();
//初始化UX
var uxService = serviceProvider.GetRequiredService<IUXService>();
await uxService.InitializeAsync();
uxService.Entry<IUXInitialize>();
await BuildServiceProvider(serviceProvider,destroyCancellationToken);
uxService.Entry<IUXLobby>();
serviceProvider.GetRequiredService<IUXLoadingMap>();
serviceProvider.GetRequiredService<IUXHud>();
serviceProvider.GetRequiredService<IUXInventory>();
serviceProvider.GetRequiredService<IUXInventorySwap>();
serviceProvider.GetKeyedService<IUXMap>(nameof(IUXInventory));
serviceProvider.GetKeyedService<IUXMap>(nameof(IUXHud));
serviceProvider.GetKeyedService<IUXInventoryPrompt>(nameof(IUXHud));
serviceProvider.GetRequiredService<IUXControlMode>();
serviceProvider.GetRequiredService<IUXSnapshot>();
serviceProvider.GetRequiredService<IUXBuyStation>();
serviceProvider.GetRequiredService<IUXDialogue>();
serviceProvider.GetRequiredService<IUXService>();
serviceProvider.GetRequiredService<IUXCosmetics>();
serviceProvider.GetRequiredService<IUXIndicator>();
serviceProvider.GetRequiredService<IUXMark>();
serviceProvider.GetRequiredService<IUXQuest>();
serviceProvider.GetRequiredService<IUXSettings>();
//加载屏幕空间提示
serviceProvider.GetRequiredService<UXToolTips>();
//加载控制台
serviceProvider.GetRequiredService<UXConsole>();
//加载右键菜单
serviceProvider.GetRequiredService<UXContextMenu>();
serviceProvider.GetRequiredService<IPDAService>();
serviceProvider.GetRequiredService<IUXSurvival>().SurvivalBuffs=new IBuff[]
{
new Hunger(),
new Thirsty(),
};
serviceProvider.GetRequiredService<IUXChat>();
//本地化
serviceProvider.GetRequiredService<UXLocalization>();
serviceProvider.QueryComponents(out ILocalizationService localizationService);
await localizationService.ChangeLanguageAsync(localizationService.CurrentLanguage);
await serviceProvider.GetRequiredService<ILocalizationService>().ChangeLanguageAsync(localizationService.CurrentLanguage);
BITApp.WalkUntilInitialize.TrySetResult();
await destroyCancellationToken.WaitUntilCanceled();
ModService.Dispose();
serviceProvider.Dispose();
await serviceProvider.DisposeAsync();
//playerFactory.Dispose();
//uxService.Dispose();
}
}
}