From 9c9ae665a870b5d8f3f231250036d44e4bb4ee8f Mon Sep 17 00:00:00 2001 From: warquys <64769541+warquys@users.noreply.github.com> Date: Tue, 31 May 2022 13:00:16 +0200 Subject: [PATCH 1/8] Fix Atribue Bug of the Process, revew Display and other small edit --- VT-Api/Core/Behaviour/Display.cs | 2 + VT-Api/Core/Enum/AudioStatus.cs | 9 ++ VT-Api/Core/Enum/RoleID.cs | 2 +- VT-Api/Core/MapAndRoundManger.cs | 121 +++++++++--------- VT-Api/Core/NetworkLiar.cs | 37 ++++++ .../Core/Plugin/Process/AutoUpdatePorecess.cs | 2 +- VT-Api/Core/Plugin/Process/ItemProcess.cs | 2 +- VT-Api/Core/Plugin/Process/MiniGameProcess.cs | 2 +- VT-Api/Core/Plugin/Process/RoleProcess.cs | 2 +- VT-Api/Core/Plugin/Process/TeamProcess.cs | 2 +- .../Plugin/Updater/AbstractAutoUpdater.cs | 2 +- VT-Api/Core/Plugin/Updater/Release.cs | 4 + VT-Api/Core/Plugin/Updater/ReleaseAsset.cs | 4 + VT-Api/Core/Roles/ICustomPhysicalRole.cs | 9 ++ VT-Api/Core/Roles/IUtrRole.cs | 10 +- VT-Api/Core/Roles/IVtRole.cs | 3 +- VT-Api/Core/Roles/RoleManager.cs | 49 ++++++- VT-Api/VT-Api.csproj | 8 +- ref/DissonanceVoip-Publicized.dll | Bin 0 -> 270848 bytes 19 files changed, 190 insertions(+), 80 deletions(-) create mode 100644 VT-Api/Core/Enum/AudioStatus.cs create mode 100644 VT-Api/Core/Roles/ICustomPhysicalRole.cs create mode 100644 ref/DissonanceVoip-Publicized.dll diff --git a/VT-Api/Core/Behaviour/Display.cs b/VT-Api/Core/Behaviour/Display.cs index 08d05a4..3e10f0f 100644 --- a/VT-Api/Core/Behaviour/Display.cs +++ b/VT-Api/Core/Behaviour/Display.cs @@ -215,11 +215,13 @@ public string BuildCustomInfo() displayWhitHierachy += Config.Config.Get.VtTranslation.ActiveTranslation.RankSame; } NetworkLiar.Get.SendDisplayInfo(Player, displayWhitHierachy, new List() { player }); + NetworkLiar.Get.SebdInfoToDisplay(Player, PlayerInfoArea.CustomInfo, Server.Get.Players); } } else { NetworkLiar.Get.SendDisplayInfo(Player, display, Server.Get.Players); + NetworkLiar.Get.SebdInfoToDisplay(Player, PlayerInfoArea.CustomInfo, Server.Get.Players); } } #endregion diff --git a/VT-Api/Core/Enum/AudioStatus.cs b/VT-Api/Core/Enum/AudioStatus.cs new file mode 100644 index 0000000..2ef36ff --- /dev/null +++ b/VT-Api/Core/Enum/AudioStatus.cs @@ -0,0 +1,9 @@ +namespace VT_Api.Core.Enum +{ + public enum AudioStatus + { + Stopped, + Playing, + Paused, + } +} diff --git a/VT-Api/Core/Enum/RoleID.cs b/VT-Api/Core/Enum/RoleID.cs index 5d54166..2c73827 100644 --- a/VT-Api/Core/Enum/RoleID.cs +++ b/VT-Api/Core/Enum/RoleID.cs @@ -92,7 +92,7 @@ public enum RoleID /// TestClass = 200, /// - /// Class201 is only use for dev test or Exemple of code + /// Class 201 is only use for dev test or Exemple of code /// Class201 = 201, } diff --git a/VT-Api/Core/MapAndRoundManger.cs b/VT-Api/Core/MapAndRoundManger.cs index 82c1439..44a0ce9 100644 --- a/VT-Api/Core/MapAndRoundManger.cs +++ b/VT-Api/Core/MapAndRoundManger.cs @@ -12,6 +12,7 @@ using UERandom = UnityEngine.Random; using Logger = Synapse.Api.Logger; using SynRagdoll = Synapse.Api.Ragdoll; +using MEC; namespace VT_Api.Core { @@ -190,85 +191,79 @@ public void ResetRoomsLightColor() room.ResetRoomLightColor(); } + const float MtfRespawnTimeEffect = 17.95f; + const float ChiRespawnTimeEffect = 13.49f; + public void MtfRespawn(bool isCI, List players, bool useTicket = true) // TODO { - SpawnableTeamType Team = isCI ? SpawnableTeamType.ChaosInsurgency : SpawnableTeamType.NineTailedFox; - Logger.Get.Debug("MtfRespawn 1"); - players.RemoveAll(p => p.OverWatch); - Logger.Get.Debug("MtfRespawn 2"); - if (!players.Any()) return; - Logger.Get.Debug("MtfRespawn 3"); - Queue queueToFill = new Queue(); - SpawnableTeamHandlerBase spawnableTeamHandlerBase = RespawnWaveGenerator.SpawnableTeams[Team]; - spawnableTeamHandlerBase.GenerateQueue(queueToFill, players.Count); - Logger.Get.Debug("MtfRespawn 4"); - if (useTicket) + if (isCI) + Round.Get.PlayChaosSpawnSound(); + Round.Get.SpawnVehicle(isCI); + + Timing.CallDelayed(isCI ? ChiRespawnTimeEffect : MtfRespawnTimeEffect, () => { - Logger.Get.Debug("MtfRespawn 4.1"); - if (Round.Get.PrioritySpawn) - players = players.OrderBy(p => p.DeathTime).ToList(); - else - players.ShuffleList(); - Logger.Get.Debug("MtfRespawn 4.2"); - - int tickets = RespawnTickets.Singleton.GetAvailableTickets(Team); - if (tickets == 0) + var Team = isCI ? SpawnableTeamType.ChaosInsurgency : SpawnableTeamType.NineTailedFox; + players.RemoveAll(p => p.OverWatch); + if (!players.Any()) return; + var queueToFill = new Queue(); + var spawnableTeamHandlerBase = RespawnWaveGenerator.SpawnableTeams[Team]; + spawnableTeamHandlerBase.GenerateQueue(queueToFill, players.Count); + if (useTicket) { - tickets = 5; - RespawnTickets.Singleton.GrantTickets(SpawnableTeamType.ChaosInsurgency, 5, true); - } + if (Round.Get.PrioritySpawn) + players = players.OrderBy(p => p.DeathTime).ToList(); + else + players.ShuffleList(); - Logger.Get.Debug("MtfRespawn 4.3"); - int num = Mathf.Min(tickets, spawnableTeamHandlerBase.MaxWaveSize); - while (players.Count > num) - players.RemoveAt(players.Count - 1); + int tickets = RespawnTickets.Singleton.GetAvailableTickets(Team); + if (tickets == 0) + { + tickets = 5; + RespawnTickets.Singleton.GrantTickets(SpawnableTeamType.ChaosInsurgency, 5, true); + } - Logger.Get.Debug("MtfRespawn 4.4"); - } - players.ShuffleList(); - Logger.Get.Debug("MtfRespawn 5"); - string unityName = ""; - bool setUnite = UnitNamingRules.TryGetNamingRule(Team, out UnitNamingRule rule); - Logger.Get.Debug("MtfRespawn 6"); + int num = Mathf.Min(tickets, spawnableTeamHandlerBase.MaxWaveSize); + while (players.Count > num) + players.RemoveAt(players.Count - 1); - if (setUnite) - { - rule.GenerateNew(Team, out unityName); - rule.PlayEntranceAnnouncement(unityName); - } - Logger.Get.Debug("MtfRespawn 7"); + } + players.ShuffleList(); + var unityName = ""; + var setUnite = UnitNamingRules.TryGetNamingRule(Team, out UnitNamingRule rule); - foreach (var player in players) - { - try + if (setUnite) { - Logger.Get.Debug($"MtfRespawn {player.name}"); + rule.GenerateNew(Team, out unityName); + rule.PlayEntranceAnnouncement(unityName); + } - if (player == null) + foreach (var player in players) + { + try { - Logger.Get.Error("Couldn't spawn a player - target's is null."); - continue; - } + Logger.Get.Debug($"MtfRespawn {player.name}"); - player.RoleID = (int)queueToFill.Dequeue(); + if (player == null) + { + Logger.Get.Error("Couldn't spawn a player - target's is null."); + continue; + } - if (setUnite) + player.RoleID = (int)queueToFill.Dequeue(); + + if (setUnite) + { + player.ClassManager.NetworkCurSpawnableTeamType = (byte)Team; + player.UnitName = unityName; + } + } + catch (Exception e) { - player.ClassManager.NetworkCurSpawnableTeamType = (byte)Team; - player.UnitName = unityName; + Logger.Get.Error($"Player {player.name} couldn't be spawned. Err msg: {e.Message}"); } } - catch (Exception e) - { - Logger.Get.Error($"Player {player.name} couldn't be spawned. Err msg: {e.Message}"); - } - } - Logger.Get.Debug("MtfRespawn 8"); - - RespawnEffectsController.ExecuteAllEffects(RespawnEffectsController.EffectType.UponRespawn, Team); - RespawnManager.Singleton.RestartSequence(); - Logger.Get.Debug("MtfRespawn 9"); - + RespawnManager.Singleton.RestartSequence(); + }); } } } diff --git a/VT-Api/Core/NetworkLiar.cs b/VT-Api/Core/NetworkLiar.cs index 59fa282..ffd2ab8 100644 --- a/VT-Api/Core/NetworkLiar.cs +++ b/VT-Api/Core/NetworkLiar.cs @@ -49,6 +49,43 @@ public void SendRole(Player player, RoleType info, List players) SendAndRecycle(owner, observer, players, player); } + public void SebdInfoToDisplay(Player player, PlayerInfoArea info, List players) + { + const byte bytecodes = 4; + + var owner = NetworkWriterPool.GetWriter(); + var observer = NetworkWriterPool.GetWriter(); + + // Get behavior and index of it + GetBehaviour(player.Hub.networkIdentity, out var behaviourIndex, out var behaviour); + + // Writ + owner.WriteByte((byte)behaviourIndex); + + var positionRef = owner.Position; + owner.WriteInt32(0); + var positionData = owner.Position; + + behaviour.SerializeObjectsDelta(owner); + + // Write var + owner.WriteUInt64(bytecodes); + owner.WriteByte((byte)info); + + // Write syncdata position data + WritePostion(owner, positionRef, positionData); + + // Copy owner to observer + if (behaviour.syncMode != SyncMode.Observers) + { + var arraySegment = owner.ToArraySegment(); + observer.WriteBytes(arraySegment.Array, positionRef, owner.Position - positionRef); + } + + //send + SendAndRecycle(owner, observer, players, player); + } + public void SendDisplayInfo(Player player, string info, List players) { const byte bytecodes = 2; diff --git a/VT-Api/Core/Plugin/Process/AutoUpdatePorecess.cs b/VT-Api/Core/Plugin/Process/AutoUpdatePorecess.cs index c50dfe6..6173c97 100644 --- a/VT-Api/Core/Plugin/Process/AutoUpdatePorecess.cs +++ b/VT-Api/Core/Plugin/Process/AutoUpdatePorecess.cs @@ -13,7 +13,7 @@ public void Process(PluginLoadContext context) { try { - if (!typeof(IAutoUpdate).IsAssignableFrom(autoUpdate) || autoUpdate.GetCustomAttribute() != null) + if (!typeof(IAutoUpdate).IsAssignableFrom(autoUpdate) || autoUpdate.GetCustomAttribute(false) != null) continue; var autoUpdater = (IAutoUpdate)Activator.CreateInstance(autoUpdate); diff --git a/VT-Api/Core/Plugin/Process/ItemProcess.cs b/VT-Api/Core/Plugin/Process/ItemProcess.cs index 17b8bda..d71c4ad 100644 --- a/VT-Api/Core/Plugin/Process/ItemProcess.cs +++ b/VT-Api/Core/Plugin/Process/ItemProcess.cs @@ -14,7 +14,7 @@ public void Process(PluginLoadContext context) foreach (var itemType in context.Classes) { - if (!typeof(IItem).IsAssignableFrom(itemType) || itemType.GetCustomAttribute() != null) + if (!typeof(IItem).IsAssignableFrom(itemType) || itemType.GetCustomAttribute(false) != null) continue; try diff --git a/VT-Api/Core/Plugin/Process/MiniGameProcess.cs b/VT-Api/Core/Plugin/Process/MiniGameProcess.cs index 3ac1756..2a75eef 100644 --- a/VT-Api/Core/Plugin/Process/MiniGameProcess.cs +++ b/VT-Api/Core/Plugin/Process/MiniGameProcess.cs @@ -14,7 +14,7 @@ public void Process(PluginLoadContext context) foreach (var miniGameType in context.Classes) { - if (!typeof(IMiniGame).IsAssignableFrom(miniGameType) || miniGameType.GetCustomAttribute() != null) + if (!typeof(IMiniGame).IsAssignableFrom(miniGameType) || miniGameType.GetCustomAttribute(false) != null) continue; try diff --git a/VT-Api/Core/Plugin/Process/RoleProcess.cs b/VT-Api/Core/Plugin/Process/RoleProcess.cs index b9a23e3..b11af91 100644 --- a/VT-Api/Core/Plugin/Process/RoleProcess.cs +++ b/VT-Api/Core/Plugin/Process/RoleProcess.cs @@ -16,7 +16,7 @@ public void Process(PluginLoadContext context) foreach (var roleType in context.Classes) { - if (!typeof(IRole).IsAssignableFrom(roleType) || roleType.GetCustomAttribute() != null) + if (!typeof(IRole).IsAssignableFrom(roleType) || roleType.GetCustomAttribute(false) != null) continue; try diff --git a/VT-Api/Core/Plugin/Process/TeamProcess.cs b/VT-Api/Core/Plugin/Process/TeamProcess.cs index ca05af4..a37adbe 100644 --- a/VT-Api/Core/Plugin/Process/TeamProcess.cs +++ b/VT-Api/Core/Plugin/Process/TeamProcess.cs @@ -16,7 +16,7 @@ public void Process(PluginLoadContext context) foreach (var teamType in context.Classes) { - if (!typeof(Synapse.Api.Teams.ISynapseTeam).IsAssignableFrom(teamType) || teamType.GetCustomAttribute() != null) + if (!typeof(Synapse.Api.Teams.ISynapseTeam).IsAssignableFrom(teamType) || teamType.GetCustomAttribute(false) != null) continue; try diff --git a/VT-Api/Core/Plugin/Updater/AbstractAutoUpdater.cs b/VT-Api/Core/Plugin/Updater/AbstractAutoUpdater.cs index 137d171..c42aeb1 100644 --- a/VT-Api/Core/Plugin/Updater/AbstractAutoUpdater.cs +++ b/VT-Api/Core/Plugin/Updater/AbstractAutoUpdater.cs @@ -9,7 +9,7 @@ namespace VT_Api.Core.Plugin.Updater { - internal abstract class AbstractAutoUpdater : AbstractUpdateHandler, IAutoUpdate + public abstract class AbstractAutoUpdater : AbstractUpdateHandler, IAutoUpdate where T : IPlugin { diff --git a/VT-Api/Core/Plugin/Updater/Release.cs b/VT-Api/Core/Plugin/Updater/Release.cs index 54f9222..3365f7e 100644 --- a/VT-Api/Core/Plugin/Updater/Release.cs +++ b/VT-Api/Core/Plugin/Updater/Release.cs @@ -8,12 +8,16 @@ public class Release { [DataMember(Name = "id")] public readonly int Id; + [DataMember(Name = "tag_name")] public readonly string TagName; + [DataMember(Name = "prerelease")] public readonly bool PreRelease; + [DataMember(Name = "created_at")] public readonly DateTime CreatedAt; + [DataMember(Name = "assets")] public readonly ReleaseAsset[] Assets; diff --git a/VT-Api/Core/Plugin/Updater/ReleaseAsset.cs b/VT-Api/Core/Plugin/Updater/ReleaseAsset.cs index b1b5e4a..94f3ab3 100644 --- a/VT-Api/Core/Plugin/Updater/ReleaseAsset.cs +++ b/VT-Api/Core/Plugin/Updater/ReleaseAsset.cs @@ -7,12 +7,16 @@ public readonly struct ReleaseAsset { [DataMember(Name = "id")] public readonly int Id; + [DataMember(Name = "name")] public readonly string Name; + [DataMember(Name = "size")] public readonly int Size; + [DataMember(Name = "url")] public readonly string Url; + [DataMember(Name = "browser_download_url")] public readonly string BrowserDownloadUrl; diff --git a/VT-Api/Core/Roles/ICustomPhysicalRole.cs b/VT-Api/Core/Roles/ICustomPhysicalRole.cs new file mode 100644 index 0000000..d183e02 --- /dev/null +++ b/VT-Api/Core/Roles/ICustomPhysicalRole.cs @@ -0,0 +1,9 @@ +using Synapse.Api.Roles; + +namespace VT_Api.Core.Roles +{ + public interface ICustomPhysicalRole : IRole + { + void UpdateBody(); + } +} diff --git a/VT-Api/Core/Roles/IUtrRole.cs b/VT-Api/Core/Roles/IUtrRole.cs index b20dde7..487bca5 100644 --- a/VT-Api/Core/Roles/IUtrRole.cs +++ b/VT-Api/Core/Roles/IUtrRole.cs @@ -1,13 +1,9 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using Synapse.Api.Roles; namespace VT_Api.Core.Roles { - public interface IUtrRole + public interface IUtrRole : ICustomPhysicalRole { - + } } diff --git a/VT-Api/Core/Roles/IVtRole.cs b/VT-Api/Core/Roles/IVtRole.cs index d9d5bb6..589ebbd 100644 --- a/VT-Api/Core/Roles/IVtRole.cs +++ b/VT-Api/Core/Roles/IVtRole.cs @@ -1,8 +1,9 @@ using Synapse.Api.Events.SynapseEventArguments; +using Synapse.Api.Roles; namespace VT_Api.Core.Roles { - public interface IVtRole + public interface IVtRole : IRole { void InitAll(PlayerSetClassEventArgs ev); diff --git a/VT-Api/Core/Roles/RoleManager.cs b/VT-Api/Core/Roles/RoleManager.cs index 8577138..4e40a52 100644 --- a/VT-Api/Core/Roles/RoleManager.cs +++ b/VT-Api/Core/Roles/RoleManager.cs @@ -4,6 +4,7 @@ using Synapse.Api.Roles; using System; using System.Collections.Generic; +using System.Linq; using UnityEngine; using VT_Api.Core.Enum; using VT_Api.Extension; @@ -14,22 +15,30 @@ namespace VT_Api.Core.Roles public class RoleManager { + #region Properties & Variable public Dictionary OldPlayerRole { get; } = new Dictionary(); + public List CustomPhysicaleRoles { get; } = new List(); + public static int[] VanilaScpID { get; } = { (int)RoleType.Scp049, (int)RoleType.Scp0492, (int)RoleType.Scp079, (int)RoleType.Scp096, (int)RoleType.Scp106, (int)RoleType.Scp173, (int)RoleType.Scp93953, (int)RoleType.Scp93989 }; public static RoleManager Get => VtController.Get.Role; + #endregion - + #region Constructor & Destructor internal RoleManager() { } + #endregion + #region Methods internal void Init() { Synapse.Api.Events.EventHandler.Get.Player.PlayerSetClassEvent += OnSetClass; Synapse.Api.Events.EventHandler.Get.Player.PlayerDeathEvent += OnPlayerDeath; Synapse.Api.Events.EventHandler.Get.Player.PlayerKeyPressEvent += OnPressKey; + Synapse.Api.Events.EventHandler.Get.Server.UpdateEvent += OnUpdate; + Synapse.Api.Events.EventHandler.Get.Server.TransmitPlayerDataEvent += OnTransmitPlayerData; } public bool IsVanilla(int roleID) @@ -69,7 +78,9 @@ public int OldTeam(Player player) } return (int)TeamID.None; } + #endregion + #region Events private void OnPressKey(PlayerKeyPressEventArgs ev) { if (ev.Player.CustomRole is IVtRole role) @@ -104,6 +115,17 @@ private void OnSetClass(PlayerSetClassEventArgs ev) { role.InitAll(ev); } + if (ev.Player.CustomRole is ICustomPhysicalRole customPhyRole) + { + if (!CustomPhysicaleRoles.Contains(customPhyRole)) + CustomPhysicaleRoles.Add(customPhyRole); + } + else + { + customPhyRole = CustomPhysicaleRoles.FirstOrDefault(r => r?.Player == ev.Player); + if (customPhyRole != null) + CustomPhysicaleRoles.Remove(customPhyRole); + } } private void OnPlayerDeath(PlayerDeathEventArgs ev) @@ -118,6 +140,31 @@ private void OnPlayerDeath(PlayerDeathEventArgs ev) var unityName = ev.Killer?.Team == Team.MTF ? ev.Killer.UnitName : "UNKNOWN"; Server.Get.Map.AnnounceScpDeath(scpName, ev.DamageType.GetScpRecontainmentType(ev.Killer), unityName); } + + if (ev.Victim.CustomRole is IUtrRole utr) + { + CustomPhysicaleRoles.Remove(utr); + } + } + + private void OnUpdate() + { + foreach (var utr in CustomPhysicaleRoles) + { + utr.UpdateBody(); + } + } + + private void OnTransmitPlayerData(TransmitPlayerDataEventArgs ev) + { + if (ev.PlayerToShow == ev.Player) + return; + var utr = CustomPhysicaleRoles.FirstOrDefault(p => p.Player == ev.PlayerToShow); + if (utr == null) + return; + if (ev.Player.RoleID != (int)RoleID.Staff) + ev.Invisible = false; } + #endregion } } diff --git a/VT-Api/VT-Api.csproj b/VT-Api/VT-Api.csproj index ec720b2..679218a 100644 --- a/VT-Api/VT-Api.csproj +++ b/VT-Api/VT-Api.csproj @@ -51,6 +51,7 @@ + @@ -107,6 +108,7 @@ + @@ -153,12 +155,16 @@ + - + + ..\ref\DissonanceVoip-Publicized.dll + Dissonance + ..\ref\NorthwoodLib-Publicized.dll diff --git a/ref/DissonanceVoip-Publicized.dll b/ref/DissonanceVoip-Publicized.dll new file mode 100644 index 0000000000000000000000000000000000000000..be48484815457924820905feb752bae8dcba2660 GIT binary patch literal 270848 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 Date: Wed, 1 Jun 2022 13:23:37 +0200 Subject: [PATCH 2/8] CopyPropertyAndFeild --- VT-Api/Core/Events/ItemEvents.cs | 3 +++ VT-Api/Core/Roles/RoleManager.cs | 9 +++++++- VT-Api/Core/VtExtensionsReflexion.cs | 23 ++++++++++++++++++- .../ItemPatches/RemoveExceedingLimitsPatch.cs | 10 ++++---- 4 files changed, 39 insertions(+), 6 deletions(-) diff --git a/VT-Api/Core/Events/ItemEvents.cs b/VT-Api/Core/Events/ItemEvents.cs index 5f82a3c..b16b752 100644 --- a/VT-Api/Core/Events/ItemEvents.cs +++ b/VT-Api/Core/Events/ItemEvents.cs @@ -6,6 +6,7 @@ using System.Collections.Generic; using System.Collections.ObjectModel; using VT_Api.Core.Events.EventArguments; +using VT_Api.Extension; namespace VT_Api.Core.Events { @@ -54,6 +55,8 @@ internal void InvokeCheckLimitItemEvent(Player player, SynapseItem item, int can internal void InvokeRemoveLimitAmmoEvent(Player player, Dictionary catergoryMax, ref Dictionary removAmmo) { + Logger.Get.Debug("Call"); + var ev = new RemoveAmmoEventArgs { Player = player, diff --git a/VT-Api/Core/Roles/RoleManager.cs b/VT-Api/Core/Roles/RoleManager.cs index 4e40a52..98a0281 100644 --- a/VT-Api/Core/Roles/RoleManager.cs +++ b/VT-Api/Core/Roles/RoleManager.cs @@ -113,7 +113,14 @@ private void OnSetClass(PlayerSetClassEventArgs ev) { if (ev.Player.CustomRole is IVtRole role && !role.Spawned) { - role.InitAll(ev); + try + { + role.InitAll(ev); + } + catch (Exception ex) + { + Synapse.Api.Logger.Get.Error($"Fail to init the role {role.GetRoleName()} (ID : {role.GetRoleID()}) :\n{ex}"); + } } if (ev.Player.CustomRole is ICustomPhysicalRole customPhyRole) { diff --git a/VT-Api/Core/VtExtensionsReflexion.cs b/VT-Api/Core/VtExtensionsReflexion.cs index b44edbf..2707afa 100644 --- a/VT-Api/Core/VtExtensionsReflexion.cs +++ b/VT-Api/Core/VtExtensionsReflexion.cs @@ -47,7 +47,7 @@ public static T GetFieldOrPropertyValue(this Type element, string fieldName) { return (T)prop.GetValue(null); } - FieldInfo field = element.GetField(fieldName, BindingFlags.NonPublic | BindingFlags.Static); + var field = element.GetField(fieldName, BindingFlags.NonPublic | BindingFlags.Static); if (field != null) { return (T)field.GetValue(null); @@ -141,5 +141,26 @@ public static void CallEvent(this object element, string eventName, params objec Synapse.Api.Logger.Get.Error("Vt-Reflexion: CallEvent failed!! \n eventsField null"); } } + + public static T CopyPropertyAndFeild(this T element, T elementToCopy) + { + var props = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); + if (props.Length != 0) + { + foreach (var prop in props) + { + prop.SetValue(element, prop.GetValue(elementToCopy)); + } + } + var fields = typeof(T).GetFields(BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance); + if (fields.Length != 0) + { + foreach (var field in fields) + { + field.SetValue(element, field.GetValue(elementToCopy)); + } + } + return element; + } } } diff --git a/VT-Api/Patches/VtEvent/ItemPatches/RemoveExceedingLimitsPatch.cs b/VT-Api/Patches/VtEvent/ItemPatches/RemoveExceedingLimitsPatch.cs index 856da0c..ec2aa12 100644 --- a/VT-Api/Patches/VtEvent/ItemPatches/RemoveExceedingLimitsPatch.cs +++ b/VT-Api/Patches/VtEvent/ItemPatches/RemoveExceedingLimitsPatch.cs @@ -10,6 +10,7 @@ using System.Collections.Generic; using System.Linq; using UnityEngine; +using VT_Api.Extension; namespace VT_Api.Patches.VtEvent.ItemPatches { @@ -17,16 +18,15 @@ namespace VT_Api.Patches.VtEvent.ItemPatches class RemoveExceedingLimitsPatch { - [HarmonyPrefix]// TODO And When Player try to pickup Item - private static bool ItemLimitPatch(Inventory inv, BodyArmor armor, bool removeItems = true, bool removeAmmo = true) + [HarmonyPrefix] + private static bool ItemLimitPatch(Inventory inv, BodyArmor armor, bool removeItems = true, bool removeAmmo = true) // TODO fix this { + SynapseController.Server.Logger.Debug("ItemLimitPatch"); try { - //SynapseController.Server.Logger.Debug("ItemLimitPatch"); var player = inv.GetPlayer(); - //Item if (removeItems) RemovItems(inv, armor, player); @@ -90,6 +90,8 @@ private static void RemovAmmos(Inventory inv, BodyArmor armor, Player player) } } + Synapse.Api.Logger.Get.Debug("RemovAmmos"); + VtController.Get.Events.Item.InvokeRemoveLimitAmmoEvent(player, ammosLimit, ref ammosDrop); foreach (var ammo in ammosDrop) From 213cda89b770a8941a38cd1f1ab459feac5d460a Mon Sep 17 00:00:00 2001 From: warquys <64769541+warquys@users.noreply.github.com> Date: Thu, 2 Jun 2022 17:57:43 +0200 Subject: [PATCH 3/8] Custom Class Death & Fix Custom Class Event Bug --- VT-Api/Config/Config.cs | 6 +- VT-Api/Config/VtApiTranslation.cs | 13 +- VT-Api/Core/Enum/RoleID.cs | 2 + VT-Api/Core/Enum/TeamID.cs | 1 + .../Events/EventArguments/PlayerEventArgs.cs | 7 - VT-Api/Core/Events/ItemEvents.cs | 2 - VT-Api/Core/MapAndRoundManger.cs | 4 +- VT-Api/Core/Roles/AbstractRole.cs | 133 ++++++++++++------ VT-Api/Core/Roles/RoleManager.cs | 26 +++- VT-Api/Core/VtExtensionsReflexion.cs | 3 +- .../ItemPatches/RemoveExceedingLimitsPatch.cs | 3 - 11 files changed, 126 insertions(+), 74 deletions(-) diff --git a/VT-Api/Config/Config.cs b/VT-Api/Config/Config.cs index e2a842a..dfb541f 100644 --- a/VT-Api/Config/Config.cs +++ b/VT-Api/Config/Config.cs @@ -26,7 +26,8 @@ internal void Init() NotANumber = "Das Argument muss eine Zahl sein. Beispiel : 1", RankOver = "GIB ANWEISUNGEN", RankSame = "GLEICHER RANG", - RankUnder = "FOLGE ANWEISUNGEN" + RankUnder = "FOLGE ANWEISUNGEN", + DeathMessage = "Du wurdest gertöet von\\n%PlayerName%\\nals\\n%RoleName%" }, "GERMAN"); VtTranslation.AddTranslation(new VtApiTranslation { @@ -34,7 +35,8 @@ internal void Init() NotANumber = "L'argument doit être un nombre. Exemple : 1", RankOver = "VOUS POUVEZ LUI DONNER DES ORDRES", RankSame = "MÊME NIVEAU D'ACCRÉDITATION", - RankUnder = "SUIVEZ SES ORDRES" + RankUnder = "SUIVEZ SES ORDRES", + DeathMessage = "Vous avez été tué par:\\n%PlayerName%\\nen tent que:\\n%RoleName%" }, "FRENCH"); diff --git a/VT-Api/Config/VtApiTranslation.cs b/VT-Api/Config/VtApiTranslation.cs index 7babdfb..cbede6c 100644 --- a/VT-Api/Config/VtApiTranslation.cs +++ b/VT-Api/Config/VtApiTranslation.cs @@ -6,12 +6,15 @@ namespace VT_Api.Config public class VtApiTranslation : IPluginTranslation { [Description("Message returned when a player has no power for their role")] - public string NoPower = "You don't have any power"; - public string NotANumber = "The argument must be a number. exemple : 1"; + public string NoPower { get; set; } = "You don't have any power"; + public string NotANumber { get; set; } = "The argument must be a number. exemple : 1"; [Description("The info about levels of accreditation")] - public string RankOver = "GIVE ORDERS"; - public string RankSame = "SAME RANK"; - public string RankUnder = "FOLLOW ORDERS"; + public string RankOver { get; set; } = "GIVE ORDERS"; + public string RankSame { get; set; } = "SAME RANK"; + public string RankUnder { get; set; } = "FOLLOW ORDERS"; + + [Description("The death message when you are kill by a custom class of the VT-API")] + public string DeathMessage { get; set; } = "You were killed by\\n%PlayerName%\\nas\\n%RoleName%"; } } diff --git a/VT-Api/Core/Enum/RoleID.cs b/VT-Api/Core/Enum/RoleID.cs index 2c73827..897d10a 100644 --- a/VT-Api/Core/Enum/RoleID.cs +++ b/VT-Api/Core/Enum/RoleID.cs @@ -95,5 +95,7 @@ public enum RoleID /// Class 201 is only use for dev test or Exemple of code /// Class201 = 201, + SaphirLeader = 300, + SaphirPrivate = 301, } } diff --git a/VT-Api/Core/Enum/TeamID.cs b/VT-Api/Core/Enum/TeamID.cs index fcf8242..64f6991 100644 --- a/VT-Api/Core/Enum/TeamID.cs +++ b/VT-Api/Core/Enum/TeamID.cs @@ -21,5 +21,6 @@ public enum TeamID ASI = 17, AL1 = 18, GOC = 19, + SAP = 20, } } diff --git a/VT-Api/Core/Events/EventArguments/PlayerEventArgs.cs b/VT-Api/Core/Events/EventArguments/PlayerEventArgs.cs index 6d9e715..43ae609 100644 --- a/VT-Api/Core/Events/EventArguments/PlayerEventArgs.cs +++ b/VT-Api/Core/Events/EventArguments/PlayerEventArgs.cs @@ -36,11 +36,4 @@ public class PlayerSetClassAdvEventArgs : Synapse.Api.Events.EventHandler.ISynap public RoleType Role { get; internal set; } } - - public class PlayerSetClassEventArgs : Synapse.Api.Events.EventHandler.ISynapseEventArgs - { - public Player Player { get; internal set; } - public int OldID { get; internal set; } - public int NewID { get; internal set; } - } } diff --git a/VT-Api/Core/Events/ItemEvents.cs b/VT-Api/Core/Events/ItemEvents.cs index b16b752..01214b3 100644 --- a/VT-Api/Core/Events/ItemEvents.cs +++ b/VT-Api/Core/Events/ItemEvents.cs @@ -55,8 +55,6 @@ internal void InvokeCheckLimitItemEvent(Player player, SynapseItem item, int can internal void InvokeRemoveLimitAmmoEvent(Player player, Dictionary catergoryMax, ref Dictionary removAmmo) { - Logger.Get.Debug("Call"); - var ev = new RemoveAmmoEventArgs { Player = player, diff --git a/VT-Api/Core/MapAndRoundManger.cs b/VT-Api/Core/MapAndRoundManger.cs index 44a0ce9..a3feedb 100644 --- a/VT-Api/Core/MapAndRoundManger.cs +++ b/VT-Api/Core/MapAndRoundManger.cs @@ -68,7 +68,7 @@ public Vector3[] AirbombPos } } - public IEnumerator AirBomb(int waitforready, int limit) + private IEnumerator AirBomb(int waitforready, int limit) { if (isAirBombCurrently) yield break; @@ -241,8 +241,6 @@ public void MtfRespawn(bool isCI, List players, bool useTicket = true) / { try { - Logger.Get.Debug($"MtfRespawn {player.name}"); - if (player == null) { Logger.Get.Error("Couldn't spawn a player - target's is null."); diff --git a/VT-Api/Core/Roles/AbstractRole.cs b/VT-Api/Core/Roles/AbstractRole.cs index 7cc0d8f..cecf3a5 100644 --- a/VT-Api/Core/Roles/AbstractRole.cs +++ b/VT-Api/Core/Roles/AbstractRole.cs @@ -34,16 +34,37 @@ public abstract class AbstractRole : Synapse.Api.Roles.Role, IVtRole public sealed override int GetRoleID() => RoleId; public sealed override string GetRoleName() => RoleName; public sealed override int GetTeamID() => RoleTeam; - - public virtual bool CallPower(byte power, out string message) - { - message = VtController.Get.Configs.VtTranslation.ActiveTranslation.NoPower; - return false; - } - + [Obsolete] + public sealed override List GetFriends() => new List(); + [Obsolete] + public sealed override List GetEnemys() => new List(); + [Obsolete] + public sealed override int GetEscapeRole() => 0; + [Obsolete] + public sealed override Team GetTeam() => Team.RIP; + public bool Spawned { get; set; } = false; - private static bool _fristSpawn = true; + private static List _firstSpawnClass = new List(); + + private bool _fristSpawn + { + get + { + return !_firstSpawnClass.Any(p => p == this.GetType()); + } + set + { + if (!value && !_firstSpawnClass.Any(p => p == this.GetType())) + { + _firstSpawnClass.Add(this.GetType()); + } + else if (value && _firstSpawnClass.Any(p => p == this.GetType())) + { + _firstSpawnClass.Remove(this.GetType()); + } + } + } #endregion #region Constructors & Destructor @@ -83,41 +104,31 @@ protected T ActiveComponent() [API] protected virtual void AditionalInit(PlayerSetClassEventArgs ev) { } - - public sealed override void Spawn() - { - Player.RoleType = RoleType; - - if (!string.IsNullOrEmpty(SpawnMessage)) - { - string message = Regex.Replace(SpawnMessage, "%RoleName%", RoleName, RegexOptions.IgnoreCase); - Player.OpenReportWindow(message.Replace("\\n", "\n")); - } - - SetDisplayInfo(); - } - - public virtual void SetDisplayInfo() + [API] + public virtual bool CallPower(byte power, out string message) { - Player.SetDisplayInfoRole(RoleName); + message = VtController.Get.Configs.VtTranslation.ActiveTranslation.NoPower; + return false; } /// - /// Dont call it if you dont no what you are dowing + /// Is called when the player ave the corect roleType. + /// Call the base to apply the config. /// - public void InitAll(PlayerSetClassEventArgs ev) + [API] + public virtual void Spawning() { - Spawned = true; - - if (_fristSpawn) + if (Config != null) { - InitEvent(); - _fristSpawn = false; - } - - PlayerInit(ev); + if (Config.Health != null) + Player.Health = (float)Config.Health; + Player.MaxHealth = Config.MaxHealth ?? Player.Health; - AditionalInit(ev); + if (Config.ArtificialHealth != null) + Player.ArtificialHealth = (float)Config.ArtificialHealth; + if (Config.MaxArtificialHealth != null) + Player.MaxArtificialHealth = (int)Config.MaxArtificialHealth; + } } /** @@ -139,7 +150,45 @@ public void InitAll(PlayerSetClassEventArgs ev) * */ [API] - protected virtual void InitEvent() { } + protected virtual void InitEvent() + { + + } + + public virtual void SetDisplayInfo() + { + Player.SetDisplayInfoRole(RoleName); + } + + public sealed override void Spawn() + { + if (_fristSpawn) + { + InitEvent(); + _fristSpawn = false; + } + + Player.RoleType = RoleType; + + if (!string.IsNullOrEmpty(SpawnMessage)) + { + string message = Regex.Replace(SpawnMessage, "%RoleName%", RoleName, RegexOptions.IgnoreCase); + Player.OpenReportWindow(message.Replace("\\n", "\n")); + } + + SetDisplayInfo(); + Spawning(); + } + + public void InitAll(PlayerSetClassEventArgs ev) + { + if (Spawned) return; + Spawned = true; + + PlayerInit(ev); + + AditionalInit(ev); + } private void PlayerInit(PlayerSetClassEventArgs ev) { @@ -155,16 +204,6 @@ private void PlayerInit(PlayerSetClassEventArgs ev) if (postion != null) ev.Position = postion.Position; - - if (Config.Health != null) - ev.Player.Health = (float)Config.Health; - ev.Player.MaxHealth = Config.MaxHealth ?? ev.Player.Health; - - if (Config.ArtificialHealth != null) - ev.Player.ArtificialHealth = (float)Config.ArtificialHealth; - if (Config.MaxArtificialHealth != null) - ev.Player.MaxArtificialHealth = (int)Config.MaxArtificialHealth; - } catch (Exception e) { @@ -192,6 +231,8 @@ private void CheckItems(SerializedPlayerInventory inventory) [API] public override void DeSpawn() { + if (Player == null) + return; Player.DisplayInfo = null; Player.AddDisplayInfo(PlayerInfoArea.Role); Player.AddDisplayInfo(PlayerInfoArea.UnitName); diff --git a/VT-Api/Core/Roles/RoleManager.cs b/VT-Api/Core/Roles/RoleManager.cs index 98a0281..3f6ae2c 100644 --- a/VT-Api/Core/Roles/RoleManager.cs +++ b/VT-Api/Core/Roles/RoleManager.cs @@ -1,10 +1,14 @@ -using Synapse; +using Mirror; +using PlayerStatsSystem; +using Subtitles; +using Synapse; using Synapse.Api; using Synapse.Api.Events.SynapseEventArguments; using Synapse.Api.Roles; using System; using System.Collections.Generic; using System.Linq; +using System.Text.RegularExpressions; using UnityEngine; using VT_Api.Core.Enum; using VT_Api.Extension; @@ -138,8 +142,9 @@ private void OnSetClass(PlayerSetClassEventArgs ev) private void OnPlayerDeath(PlayerDeathEventArgs ev) { if (OldPlayerRole.ContainsKey(ev.Victim)) - OldPlayerRole[ev.Victim] = ev.Victim.RoleID; - else OldPlayerRole.Add(ev.Victim, ev.Victim.RoleID); + OldPlayerRole[ev.Victim] = ev.Victim.RoleID; + else + OldPlayerRole.Add(ev.Victim, ev.Victim.RoleID); if (ev.Victim.CustomRole is IScpDeathAnnonce scpDeathAnnonce) { @@ -148,9 +153,20 @@ private void OnPlayerDeath(PlayerDeathEventArgs ev) Server.Get.Map.AnnounceScpDeath(scpName, ev.DamageType.GetScpRecontainmentType(ev.Killer), unityName); } - if (ev.Victim.CustomRole is IUtrRole utr) + if (ev.Killer?.CustomRole is IVtRole role) { - CustomPhysicaleRoles.Remove(utr); + ev.Allow = false; + var message = VtController.Get.Configs.VtTranslation.ActiveTranslation.DeathMessage; + message = Regex.Replace(message, "%PlayerName%", ev.Killer.name, RegexOptions.IgnoreCase); + message = Regex.Replace(message, "%RoleName%", role.GetRoleName(), RegexOptions.IgnoreCase); + ev.Victim.Kill(message); + + /* + * Smal : Vous avez été tuer par + * %PlayerName% + * en tant que + * %RoleName% + */ } } diff --git a/VT-Api/Core/VtExtensionsReflexion.cs b/VT-Api/Core/VtExtensionsReflexion.cs index 2707afa..5c31772 100644 --- a/VT-Api/Core/VtExtensionsReflexion.cs +++ b/VT-Api/Core/VtExtensionsReflexion.cs @@ -149,7 +149,8 @@ public static T CopyPropertyAndFeild(this T element, T elementToCopy) { foreach (var prop in props) { - prop.SetValue(element, prop.GetValue(elementToCopy)); + if (prop.SetMethod != null) + prop.SetValue(element, prop.GetValue(elementToCopy)); } } var fields = typeof(T).GetFields(BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance); diff --git a/VT-Api/Patches/VtEvent/ItemPatches/RemoveExceedingLimitsPatch.cs b/VT-Api/Patches/VtEvent/ItemPatches/RemoveExceedingLimitsPatch.cs index ec2aa12..6356071 100644 --- a/VT-Api/Patches/VtEvent/ItemPatches/RemoveExceedingLimitsPatch.cs +++ b/VT-Api/Patches/VtEvent/ItemPatches/RemoveExceedingLimitsPatch.cs @@ -21,7 +21,6 @@ class RemoveExceedingLimitsPatch [HarmonyPrefix] private static bool ItemLimitPatch(Inventory inv, BodyArmor armor, bool removeItems = true, bool removeAmmo = true) // TODO fix this { - SynapseController.Server.Logger.Debug("ItemLimitPatch"); try { @@ -90,8 +89,6 @@ private static void RemovAmmos(Inventory inv, BodyArmor armor, Player player) } } - Synapse.Api.Logger.Get.Debug("RemovAmmos"); - VtController.Get.Events.Item.InvokeRemoveLimitAmmoEvent(player, ammosLimit, ref ammosDrop); foreach (var ammo in ammosDrop) From b0a8523eb8e46dee27e6ff861f60fcfab0174741 Mon Sep 17 00:00:00 2001 From: warquys <64769541+warquys@users.noreply.github.com> Date: Thu, 2 Jun 2022 19:59:51 +0200 Subject: [PATCH 4/8] Translation --- VT-Api/Config/Config.cs | 4 ++-- VT-Api/Config/VtApiTranslation.cs | 2 +- VT-Api/Core/Items/ItemManager.cs | 12 ++++++++++-- VT-Api/Core/MapAndRoundManger.cs | 11 ++++++----- VT-Api/Core/Roles/RoleManager.cs | 4 ++-- 5 files changed, 21 insertions(+), 12 deletions(-) diff --git a/VT-Api/Config/Config.cs b/VT-Api/Config/Config.cs index dfb541f..9240952 100644 --- a/VT-Api/Config/Config.cs +++ b/VT-Api/Config/Config.cs @@ -27,7 +27,7 @@ internal void Init() RankOver = "GIB ANWEISUNGEN", RankSame = "GLEICHER RANG", RankUnder = "FOLGE ANWEISUNGEN", - DeathMessage = "Du wurdest gertöet von\\n%PlayerName%\\nals\\n%RoleName%" + DeathMessage = "Du wurdest gertöet von\\n%PlayerName%\\nals\\n%RoleName%" }, "GERMAN"); VtTranslation.AddTranslation(new VtApiTranslation { @@ -36,7 +36,7 @@ internal void Init() RankOver = "VOUS POUVEZ LUI DONNER DES ORDRES", RankSame = "MÊME NIVEAU D'ACCRÉDITATION", RankUnder = "SUIVEZ SES ORDRES", - DeathMessage = "Vous avez été tué par:\\n%PlayerName%\\nen tent que:\\n%RoleName%" + DeathMessage = "Vous avez été tué par:\\n%PlayerName%\\nen tent que:\\n%RoleName%" }, "FRENCH"); diff --git a/VT-Api/Config/VtApiTranslation.cs b/VT-Api/Config/VtApiTranslation.cs index cbede6c..4660ad9 100644 --- a/VT-Api/Config/VtApiTranslation.cs +++ b/VT-Api/Config/VtApiTranslation.cs @@ -15,6 +15,6 @@ public class VtApiTranslation : IPluginTranslation public string RankUnder { get; set; } = "FOLLOW ORDERS"; [Description("The death message when you are kill by a custom class of the VT-API")] - public string DeathMessage { get; set; } = "You were killed by\\n%PlayerName%\\nas\\n%RoleName%"; + public string DeathMessage { get; set; } = "You were killed by\\n%PlayerName%\\nas\\n%RoleName%"; } } diff --git a/VT-Api/Core/Items/ItemManager.cs b/VT-Api/Core/Items/ItemManager.cs index 13488a1..6843e77 100644 --- a/VT-Api/Core/Items/ItemManager.cs +++ b/VT-Api/Core/Items/ItemManager.cs @@ -81,8 +81,16 @@ public IWeapon GetWeaponScript(SynapseItem item) => item?.ItemData[KeySynapseItemData] as IWeapon; /// if item ave no script or if is else return - public bool TryGetScript(SynapseItem item, out IItem script) - => (script = GetScript(item)) != null; + public bool TryGetScript(SynapseItem item, out IItem script) + { + if (item?.ItemData == null || !item.ItemData.TryGetValue(KeySynapseItemData, out var data)) + { + script = null; + return false; + } + script = data as IItem; + return true; + } /// if item ave no script as a or if is else return public bool TryGetWeaponScript(SynapseItem item, out IWeapon script) diff --git a/VT-Api/Core/MapAndRoundManger.cs b/VT-Api/Core/MapAndRoundManger.cs index a3feedb..5af1831 100644 --- a/VT-Api/Core/MapAndRoundManger.cs +++ b/VT-Api/Core/MapAndRoundManger.cs @@ -68,7 +68,7 @@ public Vector3[] AirbombPos } } - private IEnumerator AirBomb(int waitforready, int limit) + private IEnumerator AirBomb(int waitforready, int limit, Player player) { if (isAirBombCurrently) yield break; @@ -92,10 +92,11 @@ private IEnumerator AirBomb(int waitforready, int limit) int throwcount = 0; while (isAirBombCurrently) { - List randampos = AirbombPos.OrderBy(x => Guid.NewGuid()).ToList(); + List randampos = AirbombPos.ToList(); + randampos.ShuffleList(); foreach (var pos in randampos) { - Map.Get.SpawnGrenade(pos, Vector3.zero, 0.1f); + Map.Get.SpawnGrenade(pos, Vector3.zero, 0.1f, player : player); yield return MEC.Timing.WaitForSeconds(0.1f); } throwcount++; @@ -170,8 +171,8 @@ public int GetVoltage() return (int)totalvoltagefloat; } - public void StartAirBombardement(int waitforready = 10, int limit = 5) - => MEC.Timing.RunCoroutine(MapAndRoundManger.Get.AirBomb(waitforready, limit)); + public void StartAirBombardement(int waitforready = 10, int limit = 5, Player player = null) + => MEC.Timing.RunCoroutine(MapAndRoundManger.Get.AirBomb(waitforready, limit, player)); public void PlayAmbientSound(int id) => Server.Get.Host.GetComponent().RpcPlaySound(id); diff --git a/VT-Api/Core/Roles/RoleManager.cs b/VT-Api/Core/Roles/RoleManager.cs index 3f6ae2c..66bcc1f 100644 --- a/VT-Api/Core/Roles/RoleManager.cs +++ b/VT-Api/Core/Roles/RoleManager.cs @@ -156,8 +156,8 @@ private void OnPlayerDeath(PlayerDeathEventArgs ev) if (ev.Killer?.CustomRole is IVtRole role) { ev.Allow = false; - var message = VtController.Get.Configs.VtTranslation.ActiveTranslation.DeathMessage; - message = Regex.Replace(message, "%PlayerName%", ev.Killer.name, RegexOptions.IgnoreCase); + var message = VtController.Get.Configs.VtTranslation.ActiveTranslation.DeathMessage.Replace("\\n", "\n"); + message = Regex.Replace(message, "%PlayerName%", ev.Killer.DisplayName, RegexOptions.IgnoreCase); message = Regex.Replace(message, "%RoleName%", role.GetRoleName(), RegexOptions.IgnoreCase); ev.Victim.Kill(message); From 17dc68a9454e354bde9723d426422b7716d8fc13 Mon Sep 17 00:00:00 2001 From: warquys <64769541+warquys@users.noreply.github.com> Date: Thu, 9 Jun 2022 14:59:31 +0200 Subject: [PATCH 5/8] Fix the AutoUpdater --- VT-Api/Config/Config.cs | 4 +- VT-Api/Config/VtApiTranslation.cs | 2 +- .../Events/EventArguments/PlayerEventArgs.cs | 9 ++++ VT-Api/Core/Events/PlayerEvents.cs | 1 + VT-Api/Core/MiniGame/MiniGameManager.cs | 1 + VT-Api/Core/Plugin/AutoRegisterManager.cs | 2 +- .../Plugin/Updater/AbstractAutoUpdater.cs | 16 +++---- .../Plugin/Updater/AbstractUpdateHandler.cs | 42 ++++++++++++++----- VT-Api/Core/Plugin/Updater/IUpdateHandler.cs | 6 +-- .../Plugin/Updater/{ => Models}/Release.cs | 0 .../Updater/{ => Models}/ReleaseAsset.cs | 0 .../Updater/{Version.cs => PluginVersion.cs} | 38 ++++++++++------- VT-Api/Core/Roles/RoleManager.cs | 32 +++++++------- .../Patches/VtPatch/CustomDeathReasonPatch.cs | 27 ++++++++++++ VT-Api/VT-Api.csproj | 7 ++-- VT-Api/VtController.cs | 20 ++++----- 16 files changed, 135 insertions(+), 72 deletions(-) rename VT-Api/Core/Plugin/Updater/{ => Models}/Release.cs (100%) rename VT-Api/Core/Plugin/Updater/{ => Models}/ReleaseAsset.cs (100%) rename VT-Api/Core/Plugin/Updater/{Version.cs => PluginVersion.cs} (69%) create mode 100644 VT-Api/Patches/VtPatch/CustomDeathReasonPatch.cs diff --git a/VT-Api/Config/Config.cs b/VT-Api/Config/Config.cs index 9240952..68a02c1 100644 --- a/VT-Api/Config/Config.cs +++ b/VT-Api/Config/Config.cs @@ -27,7 +27,7 @@ internal void Init() RankOver = "GIB ANWEISUNGEN", RankSame = "GLEICHER RANG", RankUnder = "FOLGE ANWEISUNGEN", - DeathMessage = "Du wurdest gertöet von\\n%PlayerName%\\nals\\n%RoleName%" + DefaultDeathMessage = "Du wurdest gertöet von\\n%PlayerName%\\nals\\n%RoleName%" }, "GERMAN"); VtTranslation.AddTranslation(new VtApiTranslation { @@ -36,7 +36,7 @@ internal void Init() RankOver = "VOUS POUVEZ LUI DONNER DES ORDRES", RankSame = "MÊME NIVEAU D'ACCRÉDITATION", RankUnder = "SUIVEZ SES ORDRES", - DeathMessage = "Vous avez été tué par:\\n%PlayerName%\\nen tent que:\\n%RoleName%" + DefaultDeathMessage = "Vous avez été tué par:\\n%PlayerName%\\nen tent que:\\n%RoleName%" }, "FRENCH"); diff --git a/VT-Api/Config/VtApiTranslation.cs b/VT-Api/Config/VtApiTranslation.cs index 4660ad9..c210043 100644 --- a/VT-Api/Config/VtApiTranslation.cs +++ b/VT-Api/Config/VtApiTranslation.cs @@ -15,6 +15,6 @@ public class VtApiTranslation : IPluginTranslation public string RankUnder { get; set; } = "FOLLOW ORDERS"; [Description("The death message when you are kill by a custom class of the VT-API")] - public string DeathMessage { get; set; } = "You were killed by\\n%PlayerName%\\nas\\n%RoleName%"; + public string DefaultDeathMessage { get; set; } = "You were killed by\\n%PlayerName%\\nas\\n%RoleName%"; } } diff --git a/VT-Api/Core/Events/EventArguments/PlayerEventArgs.cs b/VT-Api/Core/Events/EventArguments/PlayerEventArgs.cs index 43ae609..ad138ea 100644 --- a/VT-Api/Core/Events/EventArguments/PlayerEventArgs.cs +++ b/VT-Api/Core/Events/EventArguments/PlayerEventArgs.cs @@ -13,6 +13,15 @@ public class PlayerDamagePostEventArgs : Synapse.Api.Events.EventHandler.ISynaps public DamageType DamageType { get; internal set; } public bool Allow { get; set; } } + public class PlayerDeathPostEventArgs : Synapse.Api.Events.EventHandler.ISynapseEventArgs + { + public Player Killer { get; internal set; } + public Player Victim { get; internal set; } + public float Damage { get; set; } + public DamageType DamageType { get; internal set; } + public bool Allow { get; set; } + } + public class PlayerDestroyEventArgs : Synapse.Api.Events.EventHandler.ISynapseEventArgs { diff --git a/VT-Api/Core/Events/PlayerEvents.cs b/VT-Api/Core/Events/PlayerEvents.cs index f001b45..8446d94 100644 --- a/VT-Api/Core/Events/PlayerEvents.cs +++ b/VT-Api/Core/Events/PlayerEvents.cs @@ -11,6 +11,7 @@ internal PlayerEvents() { } #region Events public event Synapse.Api.Events.EventHandler.OnSynapseEvent PlayerDamagePostEvent; + public event Synapse.Api.Events.EventHandler.OnSynapseEvent PlayerDeathPostEvent; public event Synapse.Api.Events.EventHandler.OnSynapseEvent PlayerUnloadEvent; public event Synapse.Api.Events.EventHandler.OnSynapseEvent PlayerSpeakIntercomEvent; public event Synapse.Api.Events.EventHandler.OnSynapseEvent PlayerSetClassAdvEvent; diff --git a/VT-Api/Core/MiniGame/MiniGameManager.cs b/VT-Api/Core/MiniGame/MiniGameManager.cs index 3960786..18f9b96 100644 --- a/VT-Api/Core/MiniGame/MiniGameManager.cs +++ b/VT-Api/Core/MiniGame/MiniGameManager.cs @@ -41,6 +41,7 @@ internal void Init() Synapse.Api.Events.EventHandler.Get.Round.RoundEndEvent += OnEndRound; Synapse.Api.Events.EventHandler.Get.Round.RoundCheckEvent += OnCheckEnd; } + public string GetMiniGameName(int id) { if (!IsIDRegistered(id)) diff --git a/VT-Api/Core/Plugin/AutoRegisterManager.cs b/VT-Api/Core/Plugin/AutoRegisterManager.cs index d6fd514..df81366 100644 --- a/VT-Api/Core/Plugin/AutoRegisterManager.cs +++ b/VT-Api/Core/Plugin/AutoRegisterManager.cs @@ -13,7 +13,7 @@ public class AutoRegisterManager internal AutoRegisterManager() { } - readonly IContextProcessor[] AddedRegisterProcesses = { new CommandProcess(), new ItemProcess(), new MiniGameProcess(), new RoleProcess(), new TeamProcess(), new DebugCheckProcess() }; + readonly IContextProcessor[] AddedRegisterProcesses = { new CommandProcess(), new ItemProcess(), new MiniGameProcess(), new RoleProcess(), new TeamProcess(), new DebugCheckProcess(), new AutoUpdatePorecess() }; internal void Init() { diff --git a/VT-Api/Core/Plugin/Updater/AbstractAutoUpdater.cs b/VT-Api/Core/Plugin/Updater/AbstractAutoUpdater.cs index c42aeb1..020aa68 100644 --- a/VT-Api/Core/Plugin/Updater/AbstractAutoUpdater.cs +++ b/VT-Api/Core/Plugin/Updater/AbstractAutoUpdater.cs @@ -1,4 +1,5 @@ -using Synapse.Api.Plugin; +using Synapse; +using Synapse.Api.Plugin; using System; using System.Collections.Generic; using System.Linq; @@ -16,7 +17,7 @@ public abstract class AbstractAutoUpdater : AbstractUpdateHandler, IAutoUpdat public abstract long GithubID { get; } public abstract bool Prerealase { get; } - public bool Update() + public virtual bool Update() { HttpClient client = new HttpClient(); client.Timeout = TimeSpan.FromSeconds(500); @@ -25,22 +26,23 @@ public bool Update() var githubVerison = GetGitVersion(client, string.Format(GitHubPage, GithubID), out var release, Prerealase); var pluginVersion = GetPluginVersion(); + var pluginName = typeof(T).Assembly.GetName().Name; if (!NeedToUpdate(pluginVersion, githubVerison)) return false; - if (!TryDownload(client, release, typeof(T).Assembly.GetName().Name, out var filePath)) + if (!TryDownload(client, release, pluginName, out var filePath)) return false; - - var pluginName = typeof(T).GetType().Assembly.GetName().Name; - var plugin = SynapseController.PluginLoader.GetFieldValueOrPerties>("_plugins").FirstOrDefault(p => p.GetType() == typeof(T)); if (plugin == null) throw new Exception("AutoUpdater : Plugin note found !"); - base.Replace(filePath, pluginName, plugin.PluginDirectory); + var shared = plugin.Information.GetFieldValueOrPerties("shared"); + var pluginPath = shared ? Server.Get.Files.SharedPluginDirectory : Server.Get.Files.PluginDirectory; + + base.Replace(filePath, pluginName, pluginPath); return true; } diff --git a/VT-Api/Core/Plugin/Updater/AbstractUpdateHandler.cs b/VT-Api/Core/Plugin/Updater/AbstractUpdateHandler.cs index af1dcae..fa15a49 100644 --- a/VT-Api/Core/Plugin/Updater/AbstractUpdateHandler.cs +++ b/VT-Api/Core/Plugin/Updater/AbstractUpdateHandler.cs @@ -20,8 +20,9 @@ public abstract class AbstractUpdateHandler : IUpdateHandler { #region Properties & Variable public const string Unknow = "Unknown"; - public const string GitHubPage = "https://api.github.com/repositories/{0}/releases/?per_page=20&page=1"; - public const string DefaultsRegexVersion = @"[v,V]?(?\d+)\.(?\d+)\.(?\d+)"; + public const string GitHubPage = "https://api.github.com/repositories/{0}/releases?per_page=20&page=1"; + + private static bool FirstLoad { get; set; } = true; private string _tempDirectory; public string TempDirectory @@ -84,7 +85,7 @@ private set } } - public virtual string RegexExpressionVersion { get; } = DefaultsRegexVersion; + public virtual string RegexExpressionVersion { get; } = PluginVersion.DefaultsRegexVersion; #endregion #region Constructor & Destructor @@ -93,18 +94,37 @@ public AbstractUpdateHandler() TempDirectory = Path.Combine(Server.Get.Files.SynapseDirectory, "temp"); DownloadDirectory = Path.Combine(_tempDirectory, "download"); OldDllDirectory = Path.Combine(_tempDirectory, "old"); + DeletetTempDirectory(); } #endregion #region Methods public void DeletetTempDirectory() { - if (!Directory.Exists(_tempDirectory)) + if (Directory.Exists(_tempDirectory) && FirstLoad) { - Directory.Delete(_tempDirectory); + DeleteDirectory(_tempDirectory); + FirstLoad = false; } } + private void DeleteDirectory(string target_dir) + { + var files = Directory.GetFiles(target_dir); + var dirs = Directory.GetDirectories(target_dir); + + foreach (var file in files) + { + File.SetAttributes(file, FileAttributes.Normal); + File.Delete(file); + } + + foreach (var dir in dirs) + DeleteDirectory(dir); + + Directory.Delete(target_dir, false); + } + public virtual bool TryDownload(HttpClient client, Release release, string name, out string filePath) { var asset = release.Assets.FirstOrDefault(r => r.Name.Contains(name) && r.Name.Contains(".dll")); @@ -125,7 +145,7 @@ public virtual bool TryDownload(HttpClient client, Release release, string name, return true; } - public virtual Version GetPluginVersion() + public virtual PluginVersion GetPluginVersion() { var info = (PluginInformation)Attribute.GetCustomAttribute(typeof(T), typeof(PluginInformation)); if (info.Version == Unknow) @@ -135,20 +155,20 @@ public virtual Version GetPluginVersion() else throw new VtUnknownVersionException($"Vt-AutoUppdate : The plugin {info.Name} in the assembly {typeof(T).Assembly.GetName().Name} did not set its version", typeof(T).Assembly.FullName, info.Name); } - return new Version(info.Version, RegexExpressionVersion); + return new PluginVersion(info.Version, RegexExpressionVersion); } - public virtual Version GetGitVersion(HttpClient client, string link, out Release release, bool prerealase = false) + public virtual PluginVersion GetGitVersion(HttpClient client, string link, out Release release, bool prerealase = false) { var realases = GetRealases(client, link); - Version highestVersion = new Version(0,0,0); + PluginVersion highestVersion = new PluginVersion(0,0,0); Release highestRelease = null; foreach (var realase in realases) { if (!prerealase && realase.PreRelease) continue; - if (Version.TryParse(realase.TagName, out var version) && version > highestVersion) + if (PluginVersion.TryParse(realase.TagName, out var version) && version > highestVersion) { highestVersion = version; highestRelease = realase; @@ -170,7 +190,7 @@ private List GetRealases(HttpClient client, string link) return JsonSerializer.Deserialize(stream).OrderByDescending(r => r.CreatedAt.Ticks).ToList(); } - public virtual bool NeedToUpdate(Version PluginVersion, Version GitVersion) + public virtual bool NeedToUpdate(PluginVersion PluginVersion, PluginVersion GitVersion) => PluginVersion < GitVersion; public virtual void Replace(string newPluginPath, string pluinName, string pluginDirectory) diff --git a/VT-Api/Core/Plugin/Updater/IUpdateHandler.cs b/VT-Api/Core/Plugin/Updater/IUpdateHandler.cs index 0f30101..20775c5 100644 --- a/VT-Api/Core/Plugin/Updater/IUpdateHandler.cs +++ b/VT-Api/Core/Plugin/Updater/IUpdateHandler.cs @@ -8,9 +8,9 @@ public interface IUpdateHandler string RegexExpressionVersion { get; } void DeletetTempDirectory(); - Version GetPluginVersion(); - Version GetGitVersion(HttpClient client, string link, out Release release, bool ignorePrerealase = true); - bool NeedToUpdate(Version PluginVersion, Version GitVersion); + PluginVersion GetPluginVersion(); + PluginVersion GetGitVersion(HttpClient client, string link, out Release release, bool ignorePrerealase = true); + bool NeedToUpdate(PluginVersion PluginVersion, PluginVersion GitVersion); bool TryDownload(HttpClient client, Release release, string name, out string filePath); void Replace(string newPluginPath, string pluinName, string pluginDirectory); } diff --git a/VT-Api/Core/Plugin/Updater/Release.cs b/VT-Api/Core/Plugin/Updater/Models/Release.cs similarity index 100% rename from VT-Api/Core/Plugin/Updater/Release.cs rename to VT-Api/Core/Plugin/Updater/Models/Release.cs diff --git a/VT-Api/Core/Plugin/Updater/ReleaseAsset.cs b/VT-Api/Core/Plugin/Updater/Models/ReleaseAsset.cs similarity index 100% rename from VT-Api/Core/Plugin/Updater/ReleaseAsset.cs rename to VT-Api/Core/Plugin/Updater/Models/ReleaseAsset.cs diff --git a/VT-Api/Core/Plugin/Updater/Version.cs b/VT-Api/Core/Plugin/Updater/PluginVersion.cs similarity index 69% rename from VT-Api/Core/Plugin/Updater/Version.cs rename to VT-Api/Core/Plugin/Updater/PluginVersion.cs index 6ac8104..fd65db9 100644 --- a/VT-Api/Core/Plugin/Updater/Version.cs +++ b/VT-Api/Core/Plugin/Updater/PluginVersion.cs @@ -2,22 +2,24 @@ namespace VT_Api.Core.Plugin.Updater { - public struct Version + public struct PluginVersion { #region Properties & Variable + public const string DefaultsRegexVersion = @"[v,V]?(?\d+)\.(?\d+)\.(?\d+)"; + int Major; int Minor; int Patch; #endregion #region Constructor & Destructor - public Version(int major, int minor, int patch = 0) + public PluginVersion(int major, int minor, int patch = 0) { Major = major; Minor = minor; Patch = patch; } - public Version(string version, string expression = @"[v,V]?(?\d+)\.(?\d+)\.(?\d+))") + public PluginVersion(string version, string expression = DefaultsRegexVersion) { var pattern = new Regex(expression); var match = pattern.Match(version); @@ -28,42 +30,42 @@ public Version(string version, string expression = @"[v,V]?(?\d+)\.(?\d+)\.(?\d+)\.(?\d+))") + public static PluginVersion Parse(string s, string expression = DefaultsRegexVersion) { var pattern = new Regex(expression); var match = pattern.Match(s); - return new Version(int.Parse(match.Groups["major"].Value), int.Parse(match.Groups["minor"].Value), int.Parse(match.Groups["patch"].Value)); + return new PluginVersion(int.Parse(match.Groups["major"].Value), int.Parse(match.Groups["minor"].Value), int.Parse(match.Groups["patch"].Value)); } - public static bool TryParse(string s, out Version version, string expression = @"[v,V]?(?\d+)\.(?\d+)\.(?\d+))") + public static bool TryParse(string s, out PluginVersion version, string expression = DefaultsRegexVersion) { var pattern = new Regex(expression); var match = pattern.Match(s); if (!match.Success) { - version = new Version(); + version = new PluginVersion(); return false; } if (!int.TryParse(match.Groups["major"].Value, out int major)) { - version = new Version(); + version = new PluginVersion(); return false; } if (!int.TryParse(match.Groups["minor"].Value, out int minor)) { - version = new Version(); + version = new PluginVersion(); return false; } if (!int.TryParse(match.Groups["patch"].Value, out int patch)) { - version = new Version(); + version = new PluginVersion(); return false; } - version = new Version(major, minor, patch); + version = new PluginVersion(major, minor, patch); return true; } @@ -88,14 +90,18 @@ public override bool Equals(object obj) else return false; } - else if (obj is Version version) + else if (obj is PluginVersion version) return version == this; return false; } + + public override string ToString() + => $"{Major}.{Minor}.{Patch}"; + #endregion #region operator - public static bool operator >(Version a, Version b) + public static bool operator >(PluginVersion a, PluginVersion b) { if (a.Major > b.Major) return true; @@ -110,7 +116,7 @@ public override bool Equals(object obj) return false; } - public static bool operator <(Version a, Version b) + public static bool operator <(PluginVersion a, PluginVersion b) { if (a.Major < b.Major) return true; @@ -125,10 +131,10 @@ public override bool Equals(object obj) return false; } - public static bool operator ==(Version a, Version b) + public static bool operator ==(PluginVersion a, PluginVersion b) => a.Patch == b.Patch && a.Minor == b.Minor && a.Major == b.Major; - public static bool operator !=(Version a, Version b) + public static bool operator !=(PluginVersion a, PluginVersion b) => a.Patch != b.Patch || a.Minor != b.Minor || a.Major != b.Major; #endregion } diff --git a/VT-Api/Core/Roles/RoleManager.cs b/VT-Api/Core/Roles/RoleManager.cs index 66bcc1f..032ad04 100644 --- a/VT-Api/Core/Roles/RoleManager.cs +++ b/VT-Api/Core/Roles/RoleManager.cs @@ -1,5 +1,7 @@ using Mirror; using PlayerStatsSystem; +using Respawning; +using Respawning.NamingRules; using Subtitles; using Synapse; using Synapse.Api; @@ -11,6 +13,7 @@ using System.Text.RegularExpressions; using UnityEngine; using VT_Api.Core.Enum; +using VT_Api.Core.Teams; using VT_Api.Extension; using SynRoleManager = Synapse.Api.Roles.RoleManager; @@ -145,28 +148,21 @@ private void OnPlayerDeath(PlayerDeathEventArgs ev) OldPlayerRole[ev.Victim] = ev.Victim.RoleID; else OldPlayerRole.Add(ev.Victim, ev.Victim.RoleID); - - if (ev.Victim.CustomRole is IScpDeathAnnonce scpDeathAnnonce) - { - var scpName = scpDeathAnnonce.ScpName; - var unityName = ev.Killer?.Team == Team.MTF ? ev.Killer.UnitName : "UNKNOWN"; - Server.Get.Map.AnnounceScpDeath(scpName, ev.DamageType.GetScpRecontainmentType(ev.Killer), unityName); - } - + if (ev.Killer?.CustomRole is IVtRole role) { - ev.Allow = false; - var message = VtController.Get.Configs.VtTranslation.ActiveTranslation.DeathMessage.Replace("\\n", "\n"); + var message = VtController.Get.Configs.VtTranslation.ActiveTranslation.DefaultDeathMessage.Replace("\\n", "\n"); message = Regex.Replace(message, "%PlayerName%", ev.Killer.DisplayName, RegexOptions.IgnoreCase); message = Regex.Replace(message, "%RoleName%", role.GetRoleName(), RegexOptions.IgnoreCase); - ev.Victim.Kill(message); - - /* - * Smal : Vous avez été tuer par - * %PlayerName% - * en tant que - * %RoleName% - */ + + Patches.VtPatch.CustomDeathReasonPatch.CustomReason = message; + } + + if (ev.Victim.CustomRole is IScpDeathAnnonce scpDeathAnnonce) + { + var scpName = scpDeathAnnonce.ScpName; + var unityName = ev.Killer?.Team == Team.MTF ? ev.Killer.UnitName : "UNKNOWN"; + Server.Get.Map.AnnounceScpDeath(scpName, ev.DamageType.GetScpRecontainmentType(ev.Killer), unityName); } } diff --git a/VT-Api/Patches/VtPatch/CustomDeathReasonPatch.cs b/VT-Api/Patches/VtPatch/CustomDeathReasonPatch.cs new file mode 100644 index 0000000..8e1d8c2 --- /dev/null +++ b/VT-Api/Patches/VtPatch/CustomDeathReasonPatch.cs @@ -0,0 +1,27 @@ +using HarmonyLib; +using Mirror; +using PlayerStatsSystem; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace VT_Api.Patches.VtPatch +{ + [HarmonyPatch(typeof(PlayerStats), nameof(PlayerStats.TargetReceiveSpecificDeathReason))] + class CustomDeathReasonPatch + { + public static string CustomReason { get; set; } + + [HarmonyPrefix] + public static void TargetReceiveSpecificDeathReason(PlayerStats __instance, DamageHandlerBase handler) + { + if (CustomReason != null) + { + handler = new CustomReasonDamageHandler(CustomReason); + CustomReason = null; + } + } + } +} diff --git a/VT-Api/VT-Api.csproj b/VT-Api/VT-Api.csproj index 679218a..7ffcb42 100644 --- a/VT-Api/VT-Api.csproj +++ b/VT-Api/VT-Api.csproj @@ -103,9 +103,9 @@ - - - + + + @@ -146,6 +146,7 @@ + diff --git a/VT-Api/VtController.cs b/VT-Api/VtController.cs index a014d28..7fc6939 100644 --- a/VT-Api/VtController.cs +++ b/VT-Api/VtController.cs @@ -75,21 +75,21 @@ private void LogMessage() private void InitAll() { + var i = 0; try { - AutoRegister.Init(); - MinGames.Init(); - Events.Init(); - Commands.Init(); - Configs.Init(); - Team.Init(); - Role.Init(); - Item.Init(); - + AutoRegister.Init(); i++; + MinGames.Init(); i++; + Events.Init(); i++; + Commands.Init(); i++; + Configs.Init(); i++; + Team.Init(); i++; + Role.Init(); i++; + Item.Init(); i++; } catch (Exception e) { - throw new VtInitAllHandlerExceptions($"Vt-init: Error while Initialising the handlers!\n Please fix the Issue and restart your Server!\n{e}\nStackTrace:\n{e.StackTrace}", e); + throw new VtInitAllHandlerExceptions($"Vt-init: Error while Initialising the handlers #{i} !\n Please fix the Issue and restart your Server!\n{e}\nStackTrace:\n{e.StackTrace}", e); } } From 4f2c409f2da9f9a4255cf60fb8ecccafa0aec56a Mon Sep 17 00:00:00 2001 From: warquys <64769541+warquys@users.noreply.github.com> Date: Thu, 9 Jun 2022 15:09:47 +0200 Subject: [PATCH 6/8] PostDeathEvent --- .../Events/EventArguments/PlayerEventArgs.cs | 1 - VT-Api/Core/Events/PlayerEvents.cs | 15 ++++++ VT-Api/Core/Roles/IVtRole.cs | 1 - VT-Api/Core/Roles/RoleManager.cs | 9 +++- .../PlayerPatches/SynapseDamagePatch.cs | 3 -- .../PlayerPatches/SynapseDeathPatch.cs | 47 +++++++++++++++++++ VT-Api/VT-Api.csproj | 1 + 7 files changed, 70 insertions(+), 7 deletions(-) create mode 100644 VT-Api/Patches/VtEvent/PlayerPatches/SynapseDeathPatch.cs diff --git a/VT-Api/Core/Events/EventArguments/PlayerEventArgs.cs b/VT-Api/Core/Events/EventArguments/PlayerEventArgs.cs index ad138ea..8c2b5b7 100644 --- a/VT-Api/Core/Events/EventArguments/PlayerEventArgs.cs +++ b/VT-Api/Core/Events/EventArguments/PlayerEventArgs.cs @@ -17,7 +17,6 @@ public class PlayerDeathPostEventArgs : Synapse.Api.Events.EventHandler.ISynapse { public Player Killer { get; internal set; } public Player Victim { get; internal set; } - public float Damage { get; set; } public DamageType DamageType { get; internal set; } public bool Allow { get; set; } } diff --git a/VT-Api/Core/Events/PlayerEvents.cs b/VT-Api/Core/Events/PlayerEvents.cs index 8446d94..6f0d833 100644 --- a/VT-Api/Core/Events/PlayerEvents.cs +++ b/VT-Api/Core/Events/PlayerEvents.cs @@ -30,6 +30,21 @@ internal void InvokePlayerSetClassAdvEvent(Player player, RoleType role) PlayerSetClassAdvEvent?.Invoke(ev); } + internal void InvokePlayerDeathPostEvent(Player victim, Player killer, DamageType type, ref bool allow) + { + var ev = new PlayerDeathPostEventArgs + { + Allow = allow, + DamageType = type, + Killer = killer, + Victim = victim + }; + + PlayerDeathPostEvent?.Invoke(ev); + + allow = ev.Allow; + } + internal void InvokePlayerSpeakIntercomEvent(Player player, ref bool allow) { var ev = new PlayerSpeakIntercomEventEventArgs diff --git a/VT-Api/Core/Roles/IVtRole.cs b/VT-Api/Core/Roles/IVtRole.cs index 589ebbd..1faaa23 100644 --- a/VT-Api/Core/Roles/IVtRole.cs +++ b/VT-Api/Core/Roles/IVtRole.cs @@ -10,6 +10,5 @@ public interface IVtRole : IRole bool CallPower(byte power, out string message); bool Spawned { get; set; } - } } diff --git a/VT-Api/Core/Roles/RoleManager.cs b/VT-Api/Core/Roles/RoleManager.cs index 032ad04..6498766 100644 --- a/VT-Api/Core/Roles/RoleManager.cs +++ b/VT-Api/Core/Roles/RoleManager.cs @@ -13,6 +13,7 @@ using System.Text.RegularExpressions; using UnityEngine; using VT_Api.Core.Enum; +using VT_Api.Core.Events.EventArguments; using VT_Api.Core.Teams; using VT_Api.Extension; using SynRoleManager = Synapse.Api.Roles.RoleManager; @@ -42,10 +43,11 @@ internal RoleManager() { } internal void Init() { Synapse.Api.Events.EventHandler.Get.Player.PlayerSetClassEvent += OnSetClass; - Synapse.Api.Events.EventHandler.Get.Player.PlayerDeathEvent += OnPlayerDeath; Synapse.Api.Events.EventHandler.Get.Player.PlayerKeyPressEvent += OnPressKey; Synapse.Api.Events.EventHandler.Get.Server.UpdateEvent += OnUpdate; Synapse.Api.Events.EventHandler.Get.Server.TransmitPlayerDataEvent += OnTransmitPlayerData; + VtController.Get.Events.Player.PlayerDeathPostEvent += OnPlayerDeath; + } public bool IsVanilla(int roleID) @@ -142,8 +144,11 @@ private void OnSetClass(PlayerSetClassEventArgs ev) } } - private void OnPlayerDeath(PlayerDeathEventArgs ev) + private void OnPlayerDeath(PlayerDeathPostEventArgs ev) { + if (!ev.Allow) + return; + if (OldPlayerRole.ContainsKey(ev.Victim)) OldPlayerRole[ev.Victim] = ev.Victim.RoleID; else diff --git a/VT-Api/Patches/VtEvent/PlayerPatches/SynapseDamagePatch.cs b/VT-Api/Patches/VtEvent/PlayerPatches/SynapseDamagePatch.cs index 06deae7..efa1c5f 100644 --- a/VT-Api/Patches/VtEvent/PlayerPatches/SynapseDamagePatch.cs +++ b/VT-Api/Patches/VtEvent/PlayerPatches/SynapseDamagePatch.cs @@ -37,9 +37,6 @@ private static bool DamageEventPatch(PlayerEvents __instance, Player victim, Pla VtController.Get.Events.Player.InvokePlayerDamagePostEvent(victim, killer, ref damage, type, ref allow); - ev.Damage = damage; - ev.Allow = allow; - return false; } catch (Exception e) diff --git a/VT-Api/Patches/VtEvent/PlayerPatches/SynapseDeathPatch.cs b/VT-Api/Patches/VtEvent/PlayerPatches/SynapseDeathPatch.cs new file mode 100644 index 0000000..6eaadc0 --- /dev/null +++ b/VT-Api/Patches/VtEvent/PlayerPatches/SynapseDeathPatch.cs @@ -0,0 +1,47 @@ +using HarmonyLib; +using Synapse.Api; +using Synapse.Api.Enum; +using Synapse.Api.Events; +using Synapse.Api.Events.SynapseEventArguments; +using Synapse.Api.Items; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using VT_Api.Reflexion; + +namespace VT_Api.Patches.VtEvent.PlayerPatches +{ + [HarmonyPatch(typeof(PlayerEvents), "InvokePlayerDeathEvent")] + class SynapseDeathPatch + { + [HarmonyPrefix] + private static bool DeathEventPatch(PlayerEvents __instance, Player victim, Player killer, DamageType type, out bool allow) + { + try + { + var ev = new PlayerDeathEventArgs(); + ev.Allow = true; + ev.SetProperty("Killer", killer); + ev.SetProperty("Victim", victim); + ev.SetProperty("DamageType", type); + + __instance.CallEvent("PlayerDeathEvent", ev); + + allow = ev.Allow; + + VtController.Get.Events.Player.InvokePlayerDeathPostEvent(victim, killer, type, ref allow); + + return false; + } + catch (Exception e) + { + Synapse.Api.Logger.Get.Error($"Vt-Event: PlayerDamagePost failed!!\n{e}\nStackTrace:\n{e.StackTrace}"); + allow = true; + return true; + } + } + + } +} diff --git a/VT-Api/VT-Api.csproj b/VT-Api/VT-Api.csproj index 7ffcb42..90cd691 100644 --- a/VT-Api/VT-Api.csproj +++ b/VT-Api/VT-Api.csproj @@ -144,6 +144,7 @@ + From 86264a6e58ae30a178f986d664cddd62701bf08e Mon Sep 17 00:00:00 2001 From: warquys <64769541+warquys@users.noreply.github.com> Date: Thu, 9 Jun 2022 15:51:58 +0200 Subject: [PATCH 7/8] Auto Updater for the API & Config for Auto Update --- VT-Api/Config/VtApiConfiguration.cs | 4 +- VT-Api/Core/Behaviour/RoundBehaviour.cs | 1 + .../Core/Plugin/Process/AutoUpdatePorecess.cs | 8 +++- VT-Api/Core/Structur/StructureManager.cs | 22 ----------- VT-Api/Core/Updater.cs | 38 +++++++++++++++++++ VT-Api/Properties/AssemblyInfo.cs | 4 +- VT-Api/VT-Api.csproj | 3 +- VT-Api/VtController.cs | 13 +++++++ VT-Api/VtVersion.cs | 7 +++- 9 files changed, 71 insertions(+), 29 deletions(-) delete mode 100644 VT-Api/Core/Structur/StructureManager.cs create mode 100644 VT-Api/Core/Updater.cs diff --git a/VT-Api/Config/VtApiConfiguration.cs b/VT-Api/Config/VtApiConfiguration.cs index 5524e9c..04323d8 100644 --- a/VT-Api/Config/VtApiConfiguration.cs +++ b/VT-Api/Config/VtApiConfiguration.cs @@ -10,8 +10,8 @@ namespace VT_Api.Config { public class VtApiConfiguration : AbstractConfigSection { - [Description("Juste a stupide Test ¯\\_(ツ)_/¯ ")] - public bool Train { get; set; } = true; + [Description("If active then the plugins and the api this metron is up to date on its own")] + public bool AutoUpdate { get; set; } = true; } } diff --git a/VT-Api/Core/Behaviour/RoundBehaviour.cs b/VT-Api/Core/Behaviour/RoundBehaviour.cs index fda712a..8c63584 100644 --- a/VT-Api/Core/Behaviour/RoundBehaviour.cs +++ b/VT-Api/Core/Behaviour/RoundBehaviour.cs @@ -21,6 +21,7 @@ public virtual void Kill() { try { + Server.Get.Events.Round.RoundRestartEvent -= Kill; Destroy(this); } catch (Exception e) diff --git a/VT-Api/Core/Plugin/Process/AutoUpdatePorecess.cs b/VT-Api/Core/Plugin/Process/AutoUpdatePorecess.cs index 6173c97..791b8c7 100644 --- a/VT-Api/Core/Plugin/Process/AutoUpdatePorecess.cs +++ b/VT-Api/Core/Plugin/Process/AutoUpdatePorecess.cs @@ -9,6 +9,9 @@ internal class AutoUpdatePorecess : IContextProcessor { public void Process(PluginLoadContext context) { + if (!VtController.Get.Configs.VtConfiguration.AutoUpdate) + return; + foreach (Type autoUpdate in context.Classes) { try @@ -18,7 +21,10 @@ public void Process(PluginLoadContext context) var autoUpdater = (IAutoUpdate)Activator.CreateInstance(autoUpdate); - autoUpdater.Update(); + var isUpdate = autoUpdater.Update(); + + if (isUpdate) + Synapse.Api.Logger.Get.Warn($"Plugin {context.Plugin.Information.Name} is now Update ! You need to restart the server for use the new version"); } catch (Exception e) { diff --git a/VT-Api/Core/Structur/StructureManager.cs b/VT-Api/Core/Structur/StructureManager.cs deleted file mode 100644 index 5d8b5d4..0000000 --- a/VT-Api/Core/Structur/StructureManager.cs +++ /dev/null @@ -1,22 +0,0 @@ -using Mirror; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using UnityEngine; - -namespace VT_Api.Core.Structur -{ - internal class StructureManager - { - internal StructureManager() { } - - internal void init() - { - - } - // TODO : do som stuff here - - } -} diff --git a/VT-Api/Core/Updater.cs b/VT-Api/Core/Updater.cs new file mode 100644 index 0000000..ec14e10 --- /dev/null +++ b/VT-Api/Core/Updater.cs @@ -0,0 +1,38 @@ +using Synapse; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net.Http; +using VT_Api.Core.Plugin.Updater; + +namespace VT_Api.Core +{ + internal class Updater : AbstractUpdateHandler, IAutoUpdate + { + public const long GithubID = 442298975; + + public bool Update() + { + HttpClient client = new HttpClient(); + client.Timeout = TimeSpan.FromSeconds(500); + client.DefaultRequestHeaders.Add("User-Agent", $"VT-API"); + + var githubVerison = GetGitVersion(client, string.Format(GitHubPage, GithubID), out var release); + var curentVersion = VtVersion.GetVersion(); + var assmeblyName = this.GetType().Assembly.GetName().Name; + + if (!NeedToUpdate(curentVersion, githubVerison)) + return false; + + if (!TryDownload(client, release, assmeblyName, out var filePath)) + return false; + + var depedencyPath = Path.Combine(Server.Get.Files.SynapseDirectory, "dependencies"); + + base.Replace(filePath, assmeblyName, depedencyPath); + + return true; + } + } +} diff --git a/VT-Api/Properties/AssemblyInfo.cs b/VT-Api/Properties/AssemblyInfo.cs index db3b3e2..6b67918 100644 --- a/VT-Api/Properties/AssemblyInfo.cs +++ b/VT-Api/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ // Vous pouvez spécifier toutes les valeurs ou indiquer les numéros de build et de révision par défaut // en utilisant '*', comme indiqué ci-dessous : // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.1.0.0")] -[assembly: AssemblyFileVersion("1.1.0.0")] +[assembly: AssemblyVersion("1.2.0.0")] +[assembly: AssemblyFileVersion("1.2.0.0")] diff --git a/VT-Api/VT-Api.csproj b/VT-Api/VT-Api.csproj index 90cd691..270f20a 100644 --- a/VT-Api/VT-Api.csproj +++ b/VT-Api/VT-Api.csproj @@ -118,10 +118,10 @@ - + @@ -158,6 +158,7 @@ + diff --git a/VT-Api/VtController.cs b/VT-Api/VtController.cs index 7fc6939..2468f03 100644 --- a/VT-Api/VtController.cs +++ b/VT-Api/VtController.cs @@ -58,10 +58,23 @@ public static void InitApi() VtController.Get.LogMessage(); VtController.Get.AplidePatch(); VtController.Get.InitAll(); + VtController.Get.CheckUpdate(); Logger.Get.Info("Vt-API is now ready!"); } + private void CheckUpdate() + { + if (!Configs.VtConfiguration.AutoUpdate) + return; + + var updater = new Updater(); + var isUpdate = updater.Update(); + + if (isUpdate) + Logger.Get.Warn("The VT-API is update on the last version !"); + } + private void LogMessage() { ServerConsole.AddLog("Vt-API Initialising!", System.ConsoleColor.Yellow); diff --git a/VT-Api/VtVersion.cs b/VT-Api/VtVersion.cs index ea311dd..661e322 100644 --- a/VT-Api/VtVersion.cs +++ b/VT-Api/VtVersion.cs @@ -1,10 +1,12 @@ // copy past of SynapseVersion +using VT_Api.Core.Plugin.Updater; + public static class VtVersion { public const int Major = 1; - public const int Minor = 1; + public const int Minor = 2; public const int Patch = 0; @@ -30,6 +32,9 @@ public static class VtVersion SynapseVersion.Debug; #endif + public static PluginVersion GetVersion() + => new PluginVersion(Major, Minor, Patch); + public static string GetVersionName() { var version = $"{Major}.{Minor}.{Patch}"; From ed74a6a5c43f4de2d6cfe1f0c2f1500faeac9544 Mon Sep 17 00:00:00 2001 From: warquys <64769541+warquys@users.noreply.github.com> Date: Mon, 13 Jun 2022 14:46:15 +0200 Subject: [PATCH 8/8] PlayShoot & Try RepeatingBh & Synapse Event Patch log error --- Exemple-Plugin/Exemple-Plugin.csproj | 16 +++--- Exemple-Plugin/packages.config | 2 +- VT-Api/Core/Behaviour/RepeatingBehaviour.cs | 18 +++++-- VT-Api/Core/Command/CommandHandler.cs | 4 +- VT-Api/Core/Command/Commands/CallPower.cs | 2 +- VT-Api/Core/MapAndRoundManger.cs | 26 ++++++++++ VT-Api/Core/Roles/AbstractRole.cs | 22 +++++---- VT-Api/Core/VtExtensions.cs | 30 ++---------- .../VtEvent/MapPaches/StoppingWarHeadPatch.cs | 49 +++++++++---------- .../PlayerPatches/SynapseDamagePatch.cs | 24 ++++++--- .../PlayerPatches/SynapseDeathPatch.cs | 14 ++++-- 11 files changed, 119 insertions(+), 88 deletions(-) diff --git a/Exemple-Plugin/Exemple-Plugin.csproj b/Exemple-Plugin/Exemple-Plugin.csproj index 79cb81e..9e4765b 100644 --- a/Exemple-Plugin/Exemple-Plugin.csproj +++ b/Exemple-Plugin/Exemple-Plugin.csproj @@ -35,19 +35,19 @@ ..\packages\Lib.Harmony.2.2.1\lib\net48\0Harmony.dll - ..\packages\SynapseSL.2.9.0\lib\net472\Assembly-CSharp.dll + ..\packages\SynapseSL.2.10.0\lib\net472\Assembly-CSharp.dll - ..\packages\SynapseSL.2.9.0\lib\net472\Assembly-CSharp-firstpass.dll + ..\packages\SynapseSL.2.10.0\lib\net472\Assembly-CSharp-firstpass.dll ..\packages\LiteDB.5.0.11\lib\net45\LiteDB.dll - ..\packages\SynapseSL.2.9.0\lib\net472\Mirror.dll + ..\packages\SynapseSL.2.10.0\lib\net472\Mirror.dll - - ..\packages\SynapseSL.2.9.0\lib\net472\Synapse.dll + + ..\packages\SynapseSL.2.10.0\lib\net472\Synapse.dll @@ -59,13 +59,13 @@ - ..\packages\SynapseSL.2.9.0\lib\net472\UnityEngine.dll + ..\packages\SynapseSL.2.10.0\lib\net472\UnityEngine.dll - ..\packages\SynapseSL.2.9.0\lib\net472\UnityEngine.CoreModule.dll + ..\packages\SynapseSL.2.10.0\lib\net472\UnityEngine.CoreModule.dll - ..\packages\SynapseSL.2.9.0\lib\net472\UnityEngine.PhysicsModule.dll + ..\packages\SynapseSL.2.10.0\lib\net472\UnityEngine.PhysicsModule.dll ..\packages\YamlDotNet.11.2.1\lib\net45\YamlDotNet.dll diff --git a/Exemple-Plugin/packages.config b/Exemple-Plugin/packages.config index 3d5dd8f..27c73f5 100644 --- a/Exemple-Plugin/packages.config +++ b/Exemple-Plugin/packages.config @@ -2,6 +2,6 @@ - + \ No newline at end of file diff --git a/VT-Api/Core/Behaviour/RepeatingBehaviour.cs b/VT-Api/Core/Behaviour/RepeatingBehaviour.cs index 940289b..0332774 100644 --- a/VT-Api/Core/Behaviour/RepeatingBehaviour.cs +++ b/VT-Api/Core/Behaviour/RepeatingBehaviour.cs @@ -27,8 +27,15 @@ public RepeatingBehaviour() : base() { } #region Methods public override void Kill() { - OnDisable(); - base.Kill(); + try + { + OnDisable(); + base.Kill(); + } + catch (Exception e) + { + Synapse.Api.Logger.Get.Error($"Vt-Event: RepeatingBehaviour kill faild!!\n{e}\nStackTrace:\n{e.StackTrace}"); + } } /// @@ -64,8 +71,11 @@ private void ActionExecute() private void ActionStop() { - _Started = false; - CancelInvoke("BehaviourAction"); + if (_Started) + { + CancelInvoke("BehaviourAction"); + _Started = false; + } } #endregion } diff --git a/VT-Api/Core/Command/CommandHandler.cs b/VT-Api/Core/Command/CommandHandler.cs index b2c8e4a..1be781d 100644 --- a/VT-Api/Core/Command/CommandHandler.cs +++ b/VT-Api/Core/Command/CommandHandler.cs @@ -12,9 +12,8 @@ public class CommandHandler internal void Init() { + RegisterVtCommands(); Synapse.Api.Events.EventHandler.Get.Round.WaitingForPlayersEvent += RegisterSubCommand; - - RegisterVtCommands(); } public static CommandHandler Get { get => VtController.Get.Commands; } @@ -101,6 +100,7 @@ private void RegisterVtCommands() { if (!_firstLoad) return; + Logger.Get.Info("Register Command"); RegisterSynapseCommand(new CallPower(), false); } diff --git a/VT-Api/Core/Command/Commands/CallPower.cs b/VT-Api/Core/Command/Commands/CallPower.cs index 892c5ac..7102545 100644 --- a/VT-Api/Core/Command/Commands/CallPower.cs +++ b/VT-Api/Core/Command/Commands/CallPower.cs @@ -14,7 +14,7 @@ namespace VT_Api.Core.Command.Commands Description = "Call the power of your role", Usage = "no argument if you want to call your main power, if not add the id of the power", Permission = "", - Platforms = new[] { Platform.RemoteAdmin, Platform.ServerConsole }, + Platforms = new[] { Platform.ServerConsole }, Arguments = new[] { "(powerId)" } )] public class CallPower : ISynapseCommand diff --git a/VT-Api/Core/MapAndRoundManger.cs b/VT-Api/Core/MapAndRoundManger.cs index 5af1831..0f48c1e 100644 --- a/VT-Api/Core/MapAndRoundManger.cs +++ b/VT-Api/Core/MapAndRoundManger.cs @@ -13,6 +13,8 @@ using Logger = Synapse.Api.Logger; using SynRagdoll = Synapse.Api.Ragdoll; using MEC; +using InventorySystem.Items.Firearms; +using Synapse.Api.Enum; namespace VT_Api.Core { @@ -264,5 +266,29 @@ public void MtfRespawn(bool isCI, List players, bool useTicket = true) / RespawnManager.Singleton.RestartSequence(); }); } + + public void PlayShoot(ShootSound sound, Vector3 position, byte shootSoundDistance = 25) + { + foreach (var player in Server.Get.Players) + { + var msg = new GunAudioMessage(player, 0, shootSoundDistance, player); + var to = position - player.Position; + + if (player.RoleType != RoleType.Spectator && to.sqrMagnitude > 1760f) + { + to.y = 0f; + var num = Vector3.Angle(Vector3.forward, to); + if (Vector3.Dot(to.normalized, Vector3.left) > 0f) + num = 360f - num; + + msg.ShooterDirection = (byte)Mathf.RoundToInt(num / 1.44f); + msg.ShooterRealDistance = (byte)Mathf.RoundToInt(Mathf.Min(to.magnitude, 255f)); + } + + msg.Weapon = (ItemType)sound; + + player.Connection.Send(msg); + } + } } } diff --git a/VT-Api/Core/Roles/AbstractRole.cs b/VT-Api/Core/Roles/AbstractRole.cs index cecf3a5..642eb01 100644 --- a/VT-Api/Core/Roles/AbstractRole.cs +++ b/VT-Api/Core/Roles/AbstractRole.cs @@ -118,17 +118,7 @@ public virtual bool CallPower(byte power, out string message) [API] public virtual void Spawning() { - if (Config != null) - { - if (Config.Health != null) - Player.Health = (float)Config.Health; - Player.MaxHealth = Config.MaxHealth ?? Player.Health; - if (Config.ArtificialHealth != null) - Player.ArtificialHealth = (float)Config.ArtificialHealth; - if (Config.MaxArtificialHealth != null) - Player.MaxArtificialHealth = (int)Config.MaxArtificialHealth; - } } /** @@ -177,6 +167,18 @@ public sealed override void Spawn() } SetDisplayInfo(); + if (Config != null) + { + if (Config.Health != null) + Player.Health = (float)Config.Health; + Player.MaxHealth = Config.MaxHealth ?? Player.Health; + + if (Config.ArtificialHealth != null) + Player.ArtificialHealth = (float)Config.ArtificialHealth; + if (Config.MaxArtificialHealth != null) + Player.MaxArtificialHealth = (int)Config.MaxArtificialHealth; + } + Spawning(); } diff --git a/VT-Api/Core/VtExtensions.cs b/VT-Api/Core/VtExtensions.cs index 036895e..b566675 100644 --- a/VT-Api/Core/VtExtensions.cs +++ b/VT-Api/Core/VtExtensions.cs @@ -265,36 +265,16 @@ public static bool TryPickup(this Player.PlayerAmmoBox ammos, SynapseItem item) public static void SetDisplayInfoRole(this Player player, string roleName) { - /* - * TODO Rework This : - * - * Badge "pas touche" - * - * Nickname - * Role (Unit) - * CustomInfo - * - * PowerStatus - */ - - // to - - /* - * - * NickName - * CustomInfo - * - * - * - * - */ - player.RemoveDisplayInfo(PlayerInfoArea.Role); if (player.Team == Team.MTF) { + if (string.IsNullOrWhiteSpace(player.UnitName)) + player.DisplayInfo = $"{roleName} ({player.UnitName})"; + else + player.DisplayInfo = roleName; + player.RemoveDisplayInfo(PlayerInfoArea.UnitName); - player.DisplayInfo = $"{roleName} ({player.UnitName})"; } else { diff --git a/VT-Api/Patches/VtEvent/MapPaches/StoppingWarHeadPatch.cs b/VT-Api/Patches/VtEvent/MapPaches/StoppingWarHeadPatch.cs index fb13300..a2a28d5 100644 --- a/VT-Api/Patches/VtEvent/MapPaches/StoppingWarHeadPatch.cs +++ b/VT-Api/Patches/VtEvent/MapPaches/StoppingWarHeadPatch.cs @@ -2,12 +2,14 @@ using HarmonyLib; using Interactables.Interobjects.DoorUtils; using Mirror; +using Subtitles; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using UnityEngine; +using Utils.Networking; namespace VT_Api.Patches.VtEvent.MapPaches { @@ -19,37 +21,32 @@ private static bool NukeCancelButon(AlphaWarheadController __instance, GameObjec { try { - if (!__instance.inProgress) + ServerLogs.AddLog(ServerLogs.Modules.Warhead, "Detonation cancelled.", ServerLogs.ServerLogType.GameEvent); + + var flag = __instance.inProgress && __instance.timeToDetonation > 10f && !__instance._isLocked; + + VtController.Get.Events.Map.InvokeWarheadStopEvent(disabler?.GetPlayer(), ref flag); + + if (!flag) return false; - if (disabler != null) - { - bool flag = __instance.timeToDetonation > 10.0 && !__instance._isLocked; - VtController.Get.Events.Map.InvokeWarheadStopEvent(disabler.GetPlayer(), ref flag); - if (!flag) - return false; + if (__instance.timeToDetonation <= 15f && disabler != null) + AchievementHandlerBase.ServerAchieve(disabler.GetComponent().connectionToClient, AchievementName.ThatWasClose); - if (__instance.timeToDetonation <= 15f && disabler != null) - { - AchievementHandlerBase.ServerAchieve(disabler.GetComponent().connectionToClient, AchievementName.ThatWasClose); - } + for (sbyte b = 0; b < __instance.scenarios_resume.Length; b = (sbyte)(b + 1)) + if (__instance.scenarios_resume[b].SumTime() > __instance.timeToDetonation && __instance.scenarios_resume[b].SumTime() < __instance.scenarios_start[AlphaWarheadController._startScenario].SumTime()) + __instance.NetworksyncResumeScenario = b; - for (sbyte b = 0; b < __instance.scenarios_resume.Length; b = (sbyte)(b + 1)) + __instance.NetworktimeToDetonation = ((AlphaWarheadController._resumeScenario < 0) ? __instance.scenarios_start[AlphaWarheadController._startScenario].SumTime() : __instance.scenarios_resume[AlphaWarheadController._resumeScenario].SumTime()) + (float)__instance.cooldown; + __instance.NetworkinProgress = false; + DoorEventOpenerExtension.TriggerAction(DoorEventOpenerExtension.OpenerEventType.WarheadCancel); + if (NetworkServer.active) + { + __instance._autoDetonate = false; + NetworkUtils.SendToAuthenticated(new SubtitleMessage(new SubtitlePart[1] { - if (__instance.scenarios_resume[b].SumTime() > __instance.timeToDetonation - && __instance.scenarios_resume[b].SumTime() < __instance.scenarios_start[AlphaWarheadController._startScenario].SumTime()) - { - __instance.NetworksyncResumeScenario = b; - } - } - - __instance.NetworktimeToDetonation = ((AlphaWarheadController._resumeScenario < 0) ? - __instance.scenarios_start[AlphaWarheadController._startScenario].SumTime() : - __instance.scenarios_resume[AlphaWarheadController._resumeScenario].SumTime()) + __instance.cooldown; - __instance.NetworkinProgress = false; - DoorEventOpenerExtension.TriggerAction(DoorEventOpenerExtension.OpenerEventType.WarheadCancel); - if (NetworkServer.active) - __instance._autoDetonate = false; + new SubtitlePart(SubtitleType.AlphaWarheadCancelled, null) + })); } return false; } diff --git a/VT-Api/Patches/VtEvent/PlayerPatches/SynapseDamagePatch.cs b/VT-Api/Patches/VtEvent/PlayerPatches/SynapseDamagePatch.cs index efa1c5f..5f45dbe 100644 --- a/VT-Api/Patches/VtEvent/PlayerPatches/SynapseDamagePatch.cs +++ b/VT-Api/Patches/VtEvent/PlayerPatches/SynapseDamagePatch.cs @@ -19,22 +19,31 @@ class SynapseDamagePatch [HarmonyPrefix] private static bool DamageEventPatch(PlayerEvents __instance, Player victim, Player killer, ref float damage, DamageType type, out bool allow) { + var ev = new PlayerDamageEventArgs + { + Damage = damage, + }; + try { - var ev = new PlayerDamageEventArgs - { - Damage = damage, - }; ev.SetProperty("Killer", killer); ev.SetProperty("Victim", victim); ev.SetProperty("Damage", damage); ev.SetProperty("DamageType", type); __instance.CallEvent("PlayerDamageEvent", ev); - + + allow = ev.Allow; damage = ev.Damage; + } + catch (Exception e) + { + Synapse.Api.Logger.Get.Error($"Synapse-Event: PlayerDamage event failed!!\n{e}"); allow = ev.Allow; - + return false; + } + try + { VtController.Get.Events.Player.InvokePlayerDamagePostEvent(victim, killer, ref damage, type, ref allow); return false; @@ -42,8 +51,7 @@ private static bool DamageEventPatch(PlayerEvents __instance, Player victim, Pla catch (Exception e) { Synapse.Api.Logger.Get.Error($"Vt-Event: PlayerDamagePost failed!!\n{e}\nStackTrace:\n{e.StackTrace}"); - allow = true; - return true; + return false; } } diff --git a/VT-Api/Patches/VtEvent/PlayerPatches/SynapseDeathPatch.cs b/VT-Api/Patches/VtEvent/PlayerPatches/SynapseDeathPatch.cs index 6eaadc0..074dfb6 100644 --- a/VT-Api/Patches/VtEvent/PlayerPatches/SynapseDeathPatch.cs +++ b/VT-Api/Patches/VtEvent/PlayerPatches/SynapseDeathPatch.cs @@ -19,9 +19,10 @@ class SynapseDeathPatch [HarmonyPrefix] private static bool DeathEventPatch(PlayerEvents __instance, Player victim, Player killer, DamageType type, out bool allow) { + var ev = new PlayerDeathEventArgs(); try { - var ev = new PlayerDeathEventArgs(); + ev.Allow = true; ev.SetProperty("Killer", killer); ev.SetProperty("Victim", victim); @@ -30,7 +31,15 @@ private static bool DeathEventPatch(PlayerEvents __instance, Player victim, Play __instance.CallEvent("PlayerDeathEvent", ev); allow = ev.Allow; - + } + catch (Exception e) + { + allow = ev.Allow; + Logger.Get.Error($"Synapse-Event: PlayerDeath event failed!!\n{e}"); + return false; + } + try + { VtController.Get.Events.Player.InvokePlayerDeathPostEvent(victim, killer, type, ref allow); return false; @@ -38,7 +47,6 @@ private static bool DeathEventPatch(PlayerEvents __instance, Player victim, Play catch (Exception e) { Synapse.Api.Logger.Get.Error($"Vt-Event: PlayerDamagePost failed!!\n{e}\nStackTrace:\n{e.StackTrace}"); - allow = true; return true; } }