From 085c6fd1cf591db4efbf052ba813aac02d75ecf0 Mon Sep 17 00:00:00 2001 From: VALERA771 <72030575+VALERA771@users.noreply.github.com> Date: Thu, 24 Oct 2024 22:05:08 +0300 Subject: [PATCH] Dev (#152) * fix (#147) Co-authored-by: VALERA771 * ``[EXILED::API]`` Fixing NPC PlayerId assignment (#135) * spawn fix (#148) * ueu (#149) --------- Co-authored-by: Misaka-ZeroTwo <45165615+Misaka-ZeroTwo@users.noreply.github.com> Co-authored-by: SrLicht --- EXILED/Exiled.API/Features/Npc.cs | 116 ++++++++++++++++-- .../Events/Player/ChangingRoleAndSpawned.cs | 13 +- .../Patches/Events/Server/Reporting.cs | 2 +- EXILED/Exiled.Loader/Loader.cs | 12 +- 4 files changed, 132 insertions(+), 11 deletions(-) diff --git a/EXILED/Exiled.API/Features/Npc.cs b/EXILED/Exiled.API/Features/Npc.cs index 82a6c7374..e79038065 100644 --- a/EXILED/Exiled.API/Features/Npc.cs +++ b/EXILED/Exiled.API/Features/Npc.cs @@ -16,7 +16,6 @@ namespace Exiled.API.Features using CentralAuth; using CommandSystem; using Exiled.API.Enums; - using Exiled.API.Extensions; using Exiled.API.Features.Components; using Exiled.API.Features.Roles; using Footprinting; @@ -142,6 +141,7 @@ public override Vector3 Position /// The userID of the NPC. /// The position to spawn the NPC. /// The spawned. + [Obsolete("This metod is marked as obsolet due to a bug that make player have the same id. Use Npc.Spawn(string) instead")] public static Npc Spawn(string name, RoleTypeId role, int id = 0, string userId = PlayerAuthenticationManager.DedicatedId, Vector3? position = null) { GameObject newObject = UnityEngine.Object.Instantiate(Mirror.NetworkManager.singleton.playerPrefab); @@ -208,18 +208,118 @@ public static Npc Spawn(string name, RoleTypeId role, int id = 0, string userId return npc; } + /// + /// Spawns an NPC based on the given parameters. + /// + /// The name of the NPC. + /// The RoleTypeId of the NPC, defaulting to None. + /// Whether the NPC should be ignored by round ending checks. + /// The userID of the NPC for authentication. Defaults to the Dedicated ID. + /// The position where the NPC should spawn. If null, the default spawn location is used. + /// The spawned. + public static Npc Spawn(string name, RoleTypeId role = RoleTypeId.None, bool ignored = false, string userId = PlayerAuthenticationManager.DedicatedId, Vector3? position = null) + { + GameObject newObject = UnityEngine.Object.Instantiate(Mirror.NetworkManager.singleton.playerPrefab); + + Npc npc = new(newObject) + { + IsNPC = true, + }; + + FakeConnection fakeConnection = new(npc.Id); + + try + { + if (userId == PlayerAuthenticationManager.DedicatedId) + { + npc.ReferenceHub.authManager.SyncedUserId = userId; + try + { + npc.ReferenceHub.authManager.InstanceMode = ClientInstanceMode.DedicatedServer; + } + catch (Exception e) + { + Log.Debug($"Ignore: {e.Message}"); + } + } + else + { + npc.ReferenceHub.authManager.InstanceMode = ClientInstanceMode.Unverified; + npc.ReferenceHub.authManager._privUserId = userId == string.Empty ? $"Dummy-{npc.Id}@localhost" : userId; + } + } + catch (Exception e) + { + Log.Debug($"Ignore: {e.Message}"); + } + + try + { + npc.ReferenceHub.roleManager.InitializeNewRole(RoleTypeId.None, RoleChangeReason.None); + } + catch (Exception e) + { + Log.Debug($"Ignore: {e.Message}"); + } + + NetworkServer.AddPlayerForConnection(fakeConnection, newObject); + + npc.ReferenceHub.nicknameSync.Network_myNickSync = name; + Dictionary.Add(newObject, npc); + + Timing.CallDelayed(0.5f, () => + { + npc.Role.Set(role, SpawnReason.RoundStart, position is null ? RoleSpawnFlags.All : RoleSpawnFlags.AssignInventory); + + if (position is not null) + npc.Position = position.Value; + }); + + if (ignored) + Round.IgnoredPlayers.Add(npc.ReferenceHub); + + return npc; + } + + /// + /// Destroys all NPCs currently spawned. + /// + public static void DestroyAll() + { + foreach (Npc npc in List) + npc.Destroy(); + } + /// /// Destroys the NPC. /// public void Destroy() { - NetworkConnectionToClient conn = ReferenceHub.connectionToClient; - if (ReferenceHub._playerId.Value <= RecyclablePlayerId._autoIncrement) - ReferenceHub._playerId.Destroy(); - ReferenceHub.OnDestroy(); - CustomNetworkManager.TypedSingleton.OnServerDisconnect(conn); - Dictionary.Remove(GameObject); - Object.Destroy(GameObject); + try + { + Round.IgnoredPlayers.Remove(ReferenceHub); + NetworkConnectionToClient conn = ReferenceHub.connectionToClient; + ReferenceHub.OnDestroy(); + CustomNetworkManager.TypedSingleton.OnServerDisconnect(conn); + Dictionary.Remove(GameObject); + Object.Destroy(GameObject); + } + catch (Exception e) + { + Log.Error($"Error while destroying a NPC: {e.Message}"); + } + } + + /// + /// Schedules the destruction of the NPC after a delay. + /// + /// The delay in seconds before the NPC is destroyed. + public void LateDestroy(float time) + { + Timing.CallDelayed(time, () => + { + this?.Destroy(); + }); } } } diff --git a/EXILED/Exiled.Events/Patches/Events/Player/ChangingRoleAndSpawned.cs b/EXILED/Exiled.Events/Patches/Events/Player/ChangingRoleAndSpawned.cs index 8de757847..d1a30dc44 100644 --- a/EXILED/Exiled.Events/Patches/Events/Player/ChangingRoleAndSpawned.cs +++ b/EXILED/Exiled.Events/Patches/Events/Player/ChangingRoleAndSpawned.cs @@ -44,6 +44,7 @@ private static IEnumerable Transpiler(IEnumerable Transpiler(IEnumerable Transpiler(IEnumerable Transpiler(IEnumerable instruction.StoresField(Field(typeof(CheaterReport), nameof(CheaterReport._lastReport)))) + offset; diff --git a/EXILED/Exiled.Loader/Loader.cs b/EXILED/Exiled.Loader/Loader.cs index c174f9c92..77894ba66 100644 --- a/EXILED/Exiled.Loader/Loader.cs +++ b/EXILED/Exiled.Loader/Loader.cs @@ -394,7 +394,17 @@ public IEnumerator Run(Assembly[] dependencies = null) GameCore.Version.BackwardCompatibility, GameCore.Version.BackwardRevision)) { - ServerConsole.AddLog($"Exiled is outdated, a new version will be installed automatically as soon as it's available.\nSCP:SL: {GameCore.Version.VersionString} Exiled Supported Version: {AutoUpdateFiles.RequiredSCPSLVersion}", ConsoleColor.DarkRed); + string messageText = new Version( + GameCore.Version.Major, + GameCore.Version.Minor, + GameCore.Version.Revision) < new Version( + AutoUpdateFiles.RequiredSCPSLVersion.Major, + AutoUpdateFiles.RequiredSCPSLVersion.Minor, + AutoUpdateFiles.RequiredSCPSLVersion.Revision) + ? "SCP: SL is outdated. Update SCP: SL Dedicated Server to required version or downgrade Exiled." + : "Exiled is outdated, a new version will be installed automatically as soon as it's available."; + + ServerConsole.AddLog($"{messageText}\nSCP:SL version: {GameCore.Version.VersionString} Exiled Supported Version: {AutoUpdateFiles.RequiredSCPSLVersion}", ConsoleColor.DarkRed); yield break; }