From 34b1070aa920f412aeff9122c8afd18f2af60aa2 Mon Sep 17 00:00:00 2001 From: Gurge44 Date: Mon, 7 Jul 2025 14:36:18 +0200 Subject: [PATCH] improvements --- GameMode/BedWars.cs | 11 +-- GameMode/CaptureTheFlag.cs | 26 +++--- GameMode/KingOfTheZones.cs | 8 +- GameMode/RoomRush.cs | 11 +-- GameMode/SoloPVP.cs | 79 ++++--------------- Modules/CustomNetObject.cs | 63 ++++----------- Modules/CustomRolesHelper.cs | 1 + Modules/CustomRpcSender.cs | 37 +-------- Modules/ExtendedPlayerControl.cs | 40 ++++++++++ .../PlayerGameOptionsSender.cs | 5 ++ Modules/Utils.cs | 35 ++------ Patches/OnGameStartedPatch.cs | 15 +++- Patches/PlayerControlPatch.cs | 11 +-- 13 files changed, 120 insertions(+), 222 deletions(-) diff --git a/GameMode/BedWars.cs b/GameMode/BedWars.cs index 2a9b94fce..a4495b5e1 100644 --- a/GameMode/BedWars.cs +++ b/GameMode/BedWars.cs @@ -703,17 +703,13 @@ public static class BedWars Inventory.Clear(); if (Reviving.Add(pc.PlayerId)) Main.Instance.StartCoroutine(ReviveCountdown(pc)); - pc.Exiled(); - CustomRpcSender.Create("BedWars Death", SendOption.Reliable).AutoStartRpc(pc.NetId, 4).EndRpc().SendMessage(); - Main.PlayerStates[pc.PlayerId].SetDead(); - pc.RpcSetRoleDesync(RoleTypes.GuardianAngel, pc.OwnerId); - pc.RpcResetAbilityCooldown(); - pc.MarkDirtySettings(); + + pc.ExileTemporarily(); } else { Inventory.Items = []; - pc.Suicide(); + pc.Suicide(PlayerState.DeathReason.Kill); } } } @@ -733,7 +729,6 @@ public static class BedWars Health = MaxHealth; NameNotifyManager.Notifies.Remove(pc.PlayerId); - Utils.NotifyRoles(SpecifySeer: pc, SpecifyTarget: pc); RPC.PlaySoundRPC(pc.PlayerId, Sounds.TaskComplete); pc.RpcRevive(); pc.RpcSetColor(Team.GetColorId()); diff --git a/GameMode/CaptureTheFlag.cs b/GameMode/CaptureTheFlag.cs index 1a8eaffda..15345bd7a 100644 --- a/GameMode/CaptureTheFlag.cs +++ b/GameMode/CaptureTheFlag.cs @@ -4,7 +4,6 @@ using System.Collections.Generic; using System.Linq; using AmongUs.GameOptions; using EHR.Modules; -using EHR.Neutral; using Hazel; using UnityEngine; @@ -399,8 +398,9 @@ public static class CaptureTheFlag } } catch (Exception e) { Utils.ThrowException(e); } - */ + yield return new WaitForSeconds(0.2f); + */ ValidTag = true; GameStartTS = Utils.TimeStamp; @@ -415,7 +415,7 @@ public static class CaptureTheFlag Vector2 flagBase = team.GetFlagBase().Position; data.DropFlag(); data.Flag.TP(flagBase); - data.Players.ToValidPlayers().Do(x => x.TP(flagBase)); + data.Players.ToValidPlayers().MassTP(flagBase); } } @@ -439,7 +439,7 @@ public static class CaptureTheFlag target.MarkDirtySettings(); break; case 1: - target.Suicide(); + target.Suicide(PlayerState.DeathReason.Kill); string notify = string.Format(Translator.GetString("CTF_TeamMemberFallen"), target.PlayerId.ColoredPlayerName()); TeamData[targetTeam].Players.ToValidPlayers().NotifyPlayers(notify); if (Main.GM.Value && AmongUsClient.Instance.AmHost) PlayerControl.LocalPlayer.KillFlash(); @@ -447,9 +447,7 @@ public static class CaptureTheFlag break; case 2: TemporarilyOutPlayers[target.PlayerId] = Utils.TimeStamp + BackTime.GetInt(); - Main.AllPlayerSpeed[target.PlayerId] = Main.MinSpeed; - target.TP(Pelican.GetBlackRoomPS()); - target.MarkDirtySettings(); + target.ExileTemporarily(); break; } @@ -474,6 +472,9 @@ public static class CaptureTheFlag public static void ApplyGameOptions() { AURoleOptions.PhantomCooldown = 5f; + + try { AURoleOptions.GuardianAngelCooldown = 900f; } + catch (Exception e) { Utils.ThrowException(e); } } public static bool IsNotInLocalPlayersTeam(PlayerControl pc) @@ -739,28 +740,19 @@ public static class CaptureTheFlag .SendMessage(); } - Vector2 pos = __instance.Pos(); - Vector2 blackRoomPS = Pelican.GetBlackRoomPS(); - if (TemporarilyOutPlayers.TryGetValue(__instance.PlayerId, out long endTS)) { if (Utils.TimeStamp >= endTS) { TemporarilyOutPlayers.Remove(__instance.PlayerId); - Main.AllPlayerSpeed[__instance.PlayerId] = Main.RealOptionsData.GetFloat(FloatOptionNames.PlayerSpeedMod); - __instance.MarkDirtySettings(); + __instance.RpcRevive(); __instance.TP(team.GetFlagBase().Position); __instance.SetKillCooldown(); RPC.PlaySoundRPC(__instance.PlayerId, Sounds.TaskComplete); } else if (GameEndCriteria.GetValue() != 2) - { Utils.NotifyRoles(SpecifySeer: __instance, SpecifyTarget: __instance, SendOption: SendOption.None); - if (Vector2.Distance(pos, blackRoomPS) > 2f) __instance.TP(blackRoomPS); - } } - else if (Vector2.Distance(pos, blackRoomPS) <= 2f) - __instance.TP(team.GetFlagBase().Position); } } } diff --git a/GameMode/KingOfTheZones.cs b/GameMode/KingOfTheZones.cs index 747143241..f9e32db0f 100644 --- a/GameMode/KingOfTheZones.cs +++ b/GameMode/KingOfTheZones.cs @@ -4,7 +4,6 @@ using System.Collections.Generic; using System.Linq; using AmongUs.GameOptions; using EHR.Modules; -using EHR.Neutral; using Hazel; using UnityEngine; using static EHR.Translator; @@ -496,9 +495,7 @@ public static class KingOfTheZones target.SetKillCooldown(GetKillCooldown(target)); RespawnTimes[target.PlayerId] = Utils.TimeStamp + RespawnTime.GetInt() + 1; - Main.AllPlayerSpeed[target.PlayerId] = Main.MinSpeed; - target.MarkDirtySettings(); - target.TP(Pelican.GetBlackRoomPS()); + target.ExileTemporarily(); } private static float GetKillCooldown(PlayerControl player) @@ -780,10 +777,9 @@ public static class KingOfTheZones PlayerControl player = id.GetPlayer(); if (player == null) continue; - Main.AllPlayerSpeed[id] = Main.RealOptionsData.GetFloat(FloatOptionNames.PlayerSpeedMod); + player.RpcRevive(); player.TP(RandomSpawn.SpawnMap.GetSpawnMap().Positions.ExceptBy(Zones, x => x.Key).RandomElement().Value); player.SetKillCooldown(GetKillCooldown(player)); - player.MarkDirtySettings(); RPC.PlaySoundRPC(player.PlayerId, Sounds.TaskComplete); int spawnProtectionTime = SpawnProtectionTime.GetInt(); diff --git a/GameMode/RoomRush.cs b/GameMode/RoomRush.cs index e56fdb3a8..a62f50a47 100644 --- a/GameMode/RoomRush.cs +++ b/GameMode/RoomRush.cs @@ -555,20 +555,17 @@ public static class RoomRush Logger.Info("Time is up, killing everyone who didn't enter the correct room", "RoomRush"); PlayerControl[] lateAapc = Main.AllAlivePlayerControls; PlayerControl[] playersOutsideRoom = lateAapc.ExceptBy(DonePlayers, x => x.PlayerId).ToArray(); + bool everyoneDies = playersOutsideRoom.Length == lateAapc.Length; if (WinByPointsInsteadOfDeaths.GetBool()) { - if (playersOutsideRoom.Length == lateAapc.Length) - { - Vector2 roomPos = Map.Positions.GetValueOrDefault(RoomGoal, RoomGoal.GetRoomClass().transform.position); - playersOutsideRoom.Do(x => x.TP(roomPos)); - } - else playersOutsideRoom.Do(x => x.TP(DonePlayers.RandomElement().GetPlayer())); + Vector2 location = everyoneDies ? Map.Positions.GetValueOrDefault(RoomGoal, RoomGoal.GetRoomClass().transform.position) : DonePlayers.RandomElement().GetPlayer().Pos(); + playersOutsideRoom.MassTP(location); } else { - if (playersOutsideRoom.Length == lateAapc.Length) CustomWinnerHolder.ResetAndSetWinner(CustomWinner.None); playersOutsideRoom.Do(x => x.Suicide()); + if (everyoneDies) CustomWinnerHolder.ResetAndSetWinner(CustomWinner.None); } StartNewRound(); diff --git a/GameMode/SoloPVP.cs b/GameMode/SoloPVP.cs index ee3cd5d9d..c0d4eef5c 100644 --- a/GameMode/SoloPVP.cs +++ b/GameMode/SoloPVP.cs @@ -1,9 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; -using AmongUs.GameOptions; using EHR.Modules; -using EHR.Neutral; using UnityEngine; using static EHR.RandomSpawn; @@ -20,7 +18,7 @@ internal static class SoloPVP public static Dictionary KBScore = []; public static int RoundTime; - private static readonly Dictionary NameNotify = []; + private static readonly Dictionary NameNotify = []; private static Dictionary BackCountdown = []; private static Dictionary LastHurt = []; @@ -179,7 +177,8 @@ internal static class SoloPVP return; } - if (NameNotify.TryGetValue(player.PlayerId, out (string Text, long TimeStamp) value1)) name = value1.Text; + if (NameNotify.TryGetValue(player.PlayerId, out (string Text, long RemoveTimeStamp) value1)) + name = value1.Text; } public static int GetRankFromScore(byte playerId) @@ -232,37 +231,15 @@ internal static class SoloPVP { BackCountdown.Remove(pc.PlayerId); PlayerHP[pc.PlayerId] = PlayerHPMax[pc.PlayerId]; - LastHurt[pc.PlayerId] = Utils.TimeStamp; - Main.AllPlayerSpeed[pc.PlayerId] = Main.RealOptionsData.GetFloat(FloatOptionNames.PlayerSpeedMod); - pc.MarkDirtySettings(); - + pc.RpcRevive(); RPC.PlaySoundRPC(pc.PlayerId, Sounds.TaskComplete); - pc.RpcGuardAndKill(); - - if (pc.inVent) pc.MyPhysics.RpcBootFromVent(ShipStatus.Instance.AllVents.RandomElement().Id); - else SpawnMap.GetSpawnMap().RandomTeleport(pc); + SpawnMap.GetSpawnMap().RandomTeleport(pc); } private static void OnPlayerDead(PlayerControl target) { - target.MyPhysics.RpcCancelPet(); - PetsHelper.RpcRemovePet(target); - - Main.AllPlayerSpeed[target.PlayerId] = Main.MinSpeed; - target.MarkDirtySettings(); - - if (target.walkingToVent || target.inVent || target.inMovingPlat || target.onLadder || target.MyPhysics.Animations.IsPlayingEnterVentAnimation()) - { - LateTask.New(() => - { - target.MyPhysics.RpcExitVent(Main.LastEnteredVent.TryGetValue(target.PlayerId, out var vent) ? vent.Id : 2); - LateTask.New(() => target.TP(Pelican.GetBlackRoomPS()), 0.6f, log: false); - }, 1f, log: false); - } - else - target.TP(Pelican.GetBlackRoomPS()); - + target.ExileTemporarily(); BackCountdown.TryAdd(target.PlayerId, KB_ResurrectionWaitingTime.GetInt()); } @@ -279,6 +256,7 @@ internal static class SoloPVP addRate *= KB_KillBonusMultiplier.GetFloat(); if (killer.IsHost()) addRate /= 2f; + var text = string.Empty; float addin; switch (IRandom.Instance.Next(0, 4)) @@ -286,31 +264,26 @@ internal static class SoloPVP case 0: addin = PlayerHPMax[killer.PlayerId] * addRate; PlayerHPMax[killer.PlayerId] += addin; - AddNameNotify(killer, string.Format(Translator.GetString("KB_Buff_HPMax"), addin.ToString("0.0#####"))); + text = string.Format(Translator.GetString("KB_Buff_HPMax"), addin.ToString("0.0#####")); break; case 1: addin = PlayerHPReco[killer.PlayerId] * addRate * 2; PlayerHPReco[killer.PlayerId] += addin; - AddNameNotify(killer, string.Format(Translator.GetString("KB_Buff_HPReco"), addin.ToString("0.0#####"))); + text = string.Format(Translator.GetString("KB_Buff_HPReco"), addin.ToString("0.0#####")); break; case 2: addin = PlayerATK[killer.PlayerId] * addRate; PlayerATK[killer.PlayerId] += addin; - AddNameNotify(killer, string.Format(Translator.GetString("KB_Buff_ATK"), addin.ToString("0.0#####"))); + text = string.Format(Translator.GetString("KB_Buff_ATK"), addin.ToString("0.0#####")); break; case 3: addin = Math.Max(PlayerDF[killer.PlayerId], 1f) * addRate * 8; PlayerDF[killer.PlayerId] += addin; - AddNameNotify(killer, string.Format(Translator.GetString("KB_Buff_DF"), addin.ToString("0.0#####"))); + text = string.Format(Translator.GetString("KB_Buff_DF"), addin.ToString("0.0#####")); break; } - } - private static void AddNameNotify(PlayerControl pc, string text, int time = 5) - { - NameNotify.Remove(pc.PlayerId); - NameNotify.Add(pc.PlayerId, (text, Utils.TimeStamp + time)); - Utils.NotifyRoles(SpecifySeer: pc, SpecifyTarget: pc); + NameNotify[killer.PlayerId] = (text, Utils.TimeStamp + 5); } //[HarmonyPatch(typeof(PlayerControl), nameof(PlayerControl.FixedUpdate))] @@ -323,35 +296,11 @@ internal static class SoloPVP byte id = __instance.PlayerId; if (!GameStates.IsInTask || ExileController.Instance || !Main.IntroDestroyed || Options.CurrentGameMode != CustomGameMode.SoloKombat || !AmongUsClient.Instance.AmHost || id >= 254) return; - bool soloAlive = __instance.SoloAlive(); - bool inVent = __instance.inVent; - - try - { - Vector2 pos = Pelican.GetBlackRoomPS(); - float dis = Vector2.Distance(pos, __instance.Pos()); - - switch (soloAlive) - { - case false when !inVent && !__instance.walkingToVent && !__instance.MyPhysics.Animations.IsPlayingEnterVentAnimation() && dis > 1f: - { - __instance.TP(pos); - break; - } - case true when !inVent && dis < 1.1f: - { - SpawnMap.GetSpawnMap().RandomTeleport(__instance); - break; - } - } - } - catch (Exception e) { Utils.ThrowException(e); } - long now = Utils.TimeStamp; if (LastCountdownTime[id] == now) return; LastCountdownTime[id] = now; - if (LastHurt[id] + KB_RecoverAfterSecond.GetInt() < now && PlayerHP[id] < PlayerHPMax[id] && soloAlive && !inVent) + if (LastHurt[id] + KB_RecoverAfterSecond.GetInt() < now && PlayerHP[id] < PlayerHPMax[id] && __instance.SoloAlive() && !__instance.inVent) { PlayerHP[id] += PlayerHPReco[id]; PlayerHP[id] = Math.Min(PlayerHPMax[id], PlayerHP[id]); @@ -363,7 +312,7 @@ internal static class SoloPVP if (BackCountdown[id] <= 0) OnPlayerBack(__instance); } - if (NameNotify.TryGetValue(id, out (string Text, long TimeStamp) nameNotify) && nameNotify.TimeStamp < now) + if (NameNotify.TryGetValue(id, out (string Text, long RemoveTimeStamp) nameNotify) && nameNotify.RemoveTimeStamp < now) NameNotify.Remove(id); diff --git a/Modules/CustomNetObject.cs b/Modules/CustomNetObject.cs index bc6d02b13..9b6fa4ab8 100644 --- a/Modules/CustomNetObject.cs +++ b/Modules/CustomNetObject.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using AmongUs.InnerNet.GameDataMessages; using EHR; using EHR.Crewmate; using EHR.Modules; @@ -173,62 +174,30 @@ namespace EHR msg.StartMessage(5); msg.Write(AmongUsClient.Instance.GameId); msg.StartMessage(4); - msg.WritePacked(playerControl.SpawnId); - msg.WritePacked(-2); - msg.Write((byte)SpawnFlags.None); - InnerNetObject[] componentsInChildren = playerControl.GetComponentsInChildren(); - msg.WritePacked(componentsInChildren.Length); - - for (int index = 0; index < componentsInChildren.Length; ++index) - { - InnerNetObject innerNetObject = componentsInChildren[index]; - innerNetObject.OwnerId = -2; - innerNetObject.SpawnFlags = SpawnFlags.None; - - if (innerNetObject.NetId == 0U) - { - innerNetObject.NetId = AmongUsClient.Instance.NetIdCnt++; - InnerNetObjectCollection allObjects = AmongUsClient.Instance.allObjects; - allObjects.allObjects.Add(innerNetObject); - allObjects.allObjectsFast.Add(innerNetObject.NetId, innerNetObject); - } - - msg.WritePacked(innerNetObject.NetId); - msg.StartMessage(1); - innerNetObject.Serialize(msg, true); - msg.EndMessage(); - } - + SpawnGameDataMessage item = AmongUsClient.Instance.CreateSpawnMessage(playerControl, -2, SpawnFlags.None); + item.SerializeValues(msg); msg.EndMessage(); - msg.EndMessage(); - AmongUsClient.Instance.SendOrDisconnect(msg); - msg.Recycle(); if (GameStates.CurrentServerType == GameStates.ServerType.Vanilla) { - MessageWriter msg2 = MessageWriter.Get(SendOption.Reliable); - msg2.StartMessage(6); - msg2.Write(AmongUsClient.Instance.GameId); - msg2.WritePacked(int.MaxValue); - for (uint i = 1; i <= 3; ++i) { - msg2.StartMessage(4); - msg2.WritePacked(2U); - msg2.WritePacked(-2); - msg2.Write((byte)SpawnFlags.None); - msg2.WritePacked(1); - msg2.WritePacked(AmongUsClient.Instance.NetIdCnt - i); - msg2.StartMessage(1); - msg2.EndMessage(); - msg2.EndMessage(); + msg.StartMessage(4); + msg.WritePacked(2U); + msg.WritePacked(-2); + msg.Write((byte)SpawnFlags.None); + msg.WritePacked(1); + msg.WritePacked(AmongUsClient.Instance.NetIdCnt - i); + msg.StartMessage(1); + msg.EndMessage(); + msg.EndMessage(); } - - msg2.EndMessage(); - AmongUsClient.Instance.SendOrDisconnect(msg2); - msg2.Recycle(); } + msg.EndMessage(); + AmongUsClient.Instance.SendOrDisconnect(msg); + msg.Recycle(); + if (PlayerControl.AllPlayerControls.Contains(playerControl)) PlayerControl.AllPlayerControls.Remove(playerControl); diff --git a/Modules/CustomRolesHelper.cs b/Modules/CustomRolesHelper.cs index 97eb41e94..189bf465e 100644 --- a/Modules/CustomRolesHelper.cs +++ b/Modules/CustomRolesHelper.cs @@ -892,6 +892,7 @@ internal static class CustomRolesHelper public static bool NeedsUpdateAfterDeath(this CustomRoles role) { return role is + CustomRoles.KB_Normal or CustomRoles.BedWarsPlayer or CustomRoles.Weatherman or CustomRoles.Altruist or diff --git a/Modules/CustomRpcSender.cs b/Modules/CustomRpcSender.cs index 178dceda9..34df51439 100644 --- a/Modules/CustomRpcSender.cs +++ b/Modules/CustomRpcSender.cs @@ -453,26 +453,6 @@ public static class CustomRpcSenderExtensions .EndRpc(); } - public static bool RpcExitVentDesync(this CustomRpcSender sender, PlayerPhysics physics, int ventId, PlayerControl seer) - { - if (sender == null || physics == null) return false; - - int clientId = seer.OwnerId; - - if (AmongUsClient.Instance.ClientId == clientId) - { - physics.StopAllCoroutines(); - physics.StartCoroutine(physics.CoExitVent(ventId)); - return false; - } - - sender.AutoStartRpc(physics.NetId, RpcCalls.ExitVent, clientId); - sender.WritePacked(ventId); - sender.EndRpc(); - - return true; - } - public static bool RpcGuardAndKill(this CustomRpcSender sender, PlayerControl killer, PlayerControl target = null, bool forObserver = false, bool fromSetKCD = false) { if (!AmongUsClient.Instance.AmHost) @@ -635,14 +615,6 @@ public static class CustomRpcSenderExtensions sender.EndRpc(); } - public static void RpcExileV2(this CustomRpcSender sender, PlayerControl player) - { - player.Exiled(); - sender.AutoStartRpc(player.NetId, RpcCalls.Exiled); - sender.EndRpc(); - LateTask.New(() => FixedUpdatePatch.LoversSuicide(player.PlayerId), Utils.CalculatePingDelay() * 2f, log: false); - } - public static bool Notify(this CustomRpcSender sender, PlayerControl pc, string text, float time = 6f, bool overrideAll = false, bool log = true, bool setName = true) { if (!AmongUsClient.Instance.AmHost || pc == null) return false; @@ -708,14 +680,9 @@ public static class CustomRpcSenderExtensions CheckInvalidMovementPatch.LastPosition[pc.PlayerId] = location; CheckInvalidMovementPatch.ExemptedPlayers.Add(pc.PlayerId); - return true; - } - public static bool TPToRandomVent(this CustomRpcSender sender, PlayerControl pc, bool log = true) - { - Vent vent = ShipStatus.Instance.AllVents.RandomElement(); - Logger.Info($"{pc.GetNameWithRole().RemoveHtmlTags()} => {vent.transform.position} (vent)", "TP"); - return sender.TP(pc, new(vent.transform.position.x, vent.transform.position.y + 0.3636f), log); + if (sender.sendOption == SendOption.Reliable) Utils.NumSnapToCallsThisRound++; + return true; } public static bool NotifyRolesSpecific(this CustomRpcSender sender, PlayerControl seer, PlayerControl target, out CustomRpcSender newSender, out bool senderWasCleared) diff --git a/Modules/ExtendedPlayerControl.cs b/Modules/ExtendedPlayerControl.cs index 5781a1241..9c3e5f9af 100644 --- a/Modules/ExtendedPlayerControl.cs +++ b/Modules/ExtendedPlayerControl.cs @@ -261,6 +261,39 @@ internal static class ExtendedPlayerControl if (init) Main.PlayerStates[player.PlayerId].InitTask(player); } + public static void ExileTemporarily(this PlayerControl pc) + { + pc.Exiled(); + Main.PlayerStates[pc.PlayerId].SetDead(); + + CustomRpcSender.Create("Temporary Death", SendOption.Reliable) + .AutoStartRpc(pc.NetId, 4) + .EndRpc() + .SendMessage(); + + pc.SyncSettings(); + + if (!pc.AmOwner) + { + var sender = CustomRpcSender.Create("Temporary Death (2)", SendOption.Reliable); + sender.StartMessage(pc.OwnerId); + sender.StartRpc(pc.NetId, RpcCalls.SetRole) + .Write((ushort)RoleTypes.GuardianAngel) + .Write(true) + .EndRpc(); + sender.StartRpc(pc.NetId, RpcCalls.ProtectPlayer) + .WriteNetObject(pc) + .Write(0) + .EndRpc(); + sender.SendMessage(); + } + else + { + pc.SetRole(RoleTypes.GuardianAngel); + pc.Data.Role.SetCooldown(); + } + } + public static void RpcSetRoleDesync(this PlayerControl player, RoleTypes role, int clientId, bool setRoleMap = false) { if (player == null) return; @@ -1681,6 +1714,13 @@ internal static class ExtendedPlayerControl return (pos, roomName); } + public static void MassTP(this IEnumerable players, Vector2 location, bool noCheckState = false, bool log = true) + { + var sender = CustomRpcSender.Create("Mass TP", SendOption.Reliable); + bool hasValue = players.Aggregate(false, (current, pc) => current | sender.TP(pc, location, noCheckState, log)); + sender.SendMessage(!hasValue); + } + public static bool TP(this PlayerControl pc, PlayerControl target, bool noCheckState = false, bool log = true) { return Utils.TP(pc.NetTransform, target.Pos(), noCheckState, log); diff --git a/Modules/GameOptionsSender/PlayerGameOptionsSender.cs b/Modules/GameOptionsSender/PlayerGameOptionsSender.cs index ad4cec4e2..211d879e4 100644 --- a/Modules/GameOptionsSender/PlayerGameOptionsSender.cs +++ b/Modules/GameOptionsSender/PlayerGameOptionsSender.cs @@ -208,6 +208,11 @@ public sealed class PlayerGameOptionsSender(PlayerControl player) : GameOptionsS catch (Exception e) { Utils.ThrowException(e); } goto case CustomGameMode.RoomRush; + case CustomGameMode.SoloKombat: + try { AURoleOptions.GuardianAngelCooldown = 900f; } + catch (Exception e) { Utils.ThrowException(e); } + + break; } switch (player.GetCustomRoleTypes()) diff --git a/Modules/Utils.cs b/Modules/Utils.cs index c6f2f0563..085eedbd8 100644 --- a/Modules/Utils.cs +++ b/Modules/Utils.cs @@ -11,6 +11,7 @@ using System.Text; using System.Text.RegularExpressions; using AmongUs.Data; using AmongUs.GameOptions; +using AmongUs.InnerNet.GameDataMessages; using EHR.AddOns.Common; using EHR.AddOns.Crewmate; using EHR.AddOns.GhostRoles; @@ -3510,7 +3511,7 @@ public static class Utils return num switch { - < 15 when player != null => player.GetNameWithRole().RemoveHtmlTags(), + < 128 when player != null => player.GetNameWithRole().RemoveHtmlTags(), 253 => "Skip", 254 => "None", 255 => "Dead", @@ -4033,35 +4034,10 @@ public static class Utils AmongUsClient.Instance.NetIdCnt += 1U; var sender = CustomRpcSender.Create("Utils.RpcCreateDeadBody", sendOption, true, false); MessageWriter writer = sender.stream; - writer.StartMessage(5); - writer.Write(AmongUsClient.Instance.GameId); + sender.StartMessage(); writer.StartMessage(4); - writer.WritePacked(playerControl.SpawnId); - writer.WritePacked(-2); - writer.Write((byte)SpawnFlags.None); - InnerNetObject[] componentsInChildren = playerControl.GetComponentsInChildren(); - writer.WritePacked(componentsInChildren.Length); - - for (var index = 0; index < componentsInChildren.Length; ++index) - { - InnerNetObject innerNetObject = componentsInChildren[index]; - innerNetObject.OwnerId = -2; - innerNetObject.SpawnFlags = SpawnFlags.None; - - if (innerNetObject.NetId == 0U) - { - innerNetObject.NetId = AmongUsClient.Instance.NetIdCnt++; - InnerNetObjectCollection allObjects = AmongUsClient.Instance.allObjects; - allObjects.allObjects.Add(innerNetObject); - allObjects.allObjectsFast.Add(innerNetObject.NetId, innerNetObject); - } - - writer.WritePacked(innerNetObject.NetId); - writer.StartMessage(1); - innerNetObject.Serialize(writer, true); - writer.EndMessage(); - } - + SpawnGameDataMessage item = AmongUsClient.Instance.CreateSpawnMessage(playerControl, -2, SpawnFlags.None); + item.SerializeValues(writer); writer.EndMessage(); if (GameStates.CurrentServerType == GameStates.ServerType.Vanilla) @@ -4082,6 +4058,7 @@ public static class Utils if (PlayerControl.AllPlayerControls.Contains(playerControl)) PlayerControl.AllPlayerControls.Remove(playerControl); + int baseColorId = playerControl.Data.DefaultOutfit.ColorId; sender.StartRpc(playerControl.NetId, RpcCalls.SetColor) .Write(playerControl.Data.NetId) diff --git a/Patches/OnGameStartedPatch.cs b/Patches/OnGameStartedPatch.cs index 64f9e154e..d88c7487f 100644 --- a/Patches/OnGameStartedPatch.cs +++ b/Patches/OnGameStartedPatch.cs @@ -1174,10 +1174,19 @@ internal static class StartGameHostPatch ? roleMap.RoleType : RpcSetRoleReplacer.StoragedData[target.PlayerId]; - bool forceDisplayCrewmate = Options.CurrentGameMode == CustomGameMode.Standard && target.Is(Team.Crewmate) && roleType is not (RoleTypes.Crewmate or RoleTypes.Scientist or RoleTypes.Engineer or RoleTypes.Noisemaker or RoleTypes.Tracker or RoleTypes.CrewmateGhost or RoleTypes.GuardianAngel); - if (forceDisplayCrewmate) RpcSetRoleReplacer.OverriddenTeamRevealScreen[target.PlayerId] = roleType; + RoleTypes displayRole = roleType; - target.RpcSetRoleDesync(forceDisplayCrewmate ? RoleTypes.Crewmate : roleType, targetClientId); + if (Options.CurrentGameMode == CustomGameMode.Standard) + { + if (target.Is(Team.Crewmate) && roleType is not (RoleTypes.Crewmate or RoleTypes.Scientist or RoleTypes.Engineer or RoleTypes.Noisemaker or RoleTypes.Tracker or RoleTypes.CrewmateGhost or RoleTypes.GuardianAngel)) + displayRole = RoleTypes.Crewmate; + + if (target.Is(Team.Impostor) && roleType is not (RoleTypes.Impostor or RoleTypes.Shapeshifter or RoleTypes.Phantom or RoleTypes.ImpostorGhost)) + displayRole = RoleTypes.Impostor; + } + + if (displayRole != roleType) RpcSetRoleReplacer.OverriddenTeamRevealScreen[target.PlayerId] = roleType; + target.RpcSetRoleDesync(displayRole, targetClientId); } catch (Exception e) { Utils.ThrowException(e); } } diff --git a/Patches/PlayerControlPatch.cs b/Patches/PlayerControlPatch.cs index 9507924b7..7bd2600b5 100644 --- a/Patches/PlayerControlPatch.cs +++ b/Patches/PlayerControlPatch.cs @@ -86,22 +86,23 @@ internal static class RpcMurderPlayerPatch __instance.MurderPlayer(target, murderResultFlags); var sender = CustomRpcSender.Create("RpcMurderPlayer", SendOption.Reliable); + sender.StartMessage(); if (Main.Invisible.Contains(target.PlayerId) && murderResultFlags == MurderResultFlags.Succeeded) { - sender.AutoStartRpc(target.NetTransform.NetId, RpcCalls.SnapTo) + sender.StartRpc(target.NetTransform.NetId, RpcCalls.SnapTo) .WriteVector2(new Vector2(50f, 50f)) .Write((ushort)(target.NetTransform.lastSequenceId + 16383)) .EndRpc(); - sender.AutoStartRpc(target.NetTransform.NetId, RpcCalls.SnapTo) + sender.StartRpc(target.NetTransform.NetId, RpcCalls.SnapTo) .WriteVector2(new Vector2(50f, 50f)) .Write((ushort)(target.NetTransform.lastSequenceId + 32767)) .EndRpc(); - sender.AutoStartRpc(target.NetTransform.NetId, RpcCalls.SnapTo) + sender.StartRpc(target.NetTransform.NetId, RpcCalls.SnapTo) .WriteVector2(new Vector2(50f, 50f)) .Write((ushort)(target.NetTransform.lastSequenceId + 32767 + 16383)) .EndRpc(); - sender.AutoStartRpc(target.NetTransform.NetId, RpcCalls.SnapTo) + sender.StartRpc(target.NetTransform.NetId, RpcCalls.SnapTo) .WriteVector2(target.transform.position) .Write(target.NetTransform.lastSequenceId) .EndRpc(); @@ -109,7 +110,7 @@ internal static class RpcMurderPlayerPatch NumSnapToCallsThisRound += 4; } - sender.AutoStartRpc(__instance.NetId, RpcCalls.MurderPlayer) + sender.StartRpc(__instance.NetId, RpcCalls.MurderPlayer) .WriteNetObject(target) .Write((int)murderResultFlags) .EndRpc();