This commit is contained in:
Gurge44 committed 2025-08-04 14:47:01 +02:00
1 parent 23f91695fd
commit 7d7de07a73
10 files changed
+113 -48

No files matched your search

+2 -1
View File
@@ -736,9 +736,10 @@ public static class BedWars
Health = MaxHealth;
NameNotifyManager.Notifies.Remove(pc.PlayerId);
RPC.PlaySoundRPC(pc.PlayerId, Sounds.TaskComplete);
pc.RpcRevive();
pc.ReviveFromTemporaryExile();
pc.RpcSetColor(Team.GetColorId());
pc.TP(Base.SpawnPosition);
Utils.NotifyRoles(SpecifyTarget: pc, SendOption: SendOption.None);
Reviving.Remove(pc.PlayerId);
}
+2 -1
View File
@@ -750,10 +750,11 @@ public static class CaptureTheFlag
if (Utils.TimeStamp >= endTS)
{
TemporarilyOutPlayers.Remove(__instance.PlayerId);
__instance.RpcRevive();
__instance.ReviveFromTemporaryExile();
__instance.TP(team.GetFlagBase().Position);
__instance.SetKillCooldown();
RPC.PlaySoundRPC(__instance.PlayerId, Sounds.TaskComplete);
Utils.NotifyRoles(SpecifySeer: __instance, SpecifyTarget: __instance, SendOption: SendOption.None);
}
else if (GameEndCriteria.GetValue() != 2)
Utils.NotifyRoles(SpecifySeer: __instance, SpecifyTarget: __instance, SendOption: SendOption.None);
+2 -1
View File
@@ -787,10 +787,11 @@ public static class KingOfTheZones
PlayerControl player = id.GetPlayer();
if (player == null) continue;
player.RpcRevive();
player.ReviveFromTemporaryExile();
player.TP(RandomSpawn.SpawnMap.GetSpawnMap().Positions.ExceptBy(Zones, x => x.Key).RandomElement().Value);
player.SetKillCooldown(GetKillCooldown(player));
RPC.PlaySoundRPC(player.PlayerId, Sounds.TaskComplete);
Utils.NotifyRoles(SpecifyTarget: player, SendOption: SendOption.None);
int spawnProtectionTime = SpawnProtectionTime.GetInt();
if (spawnProtectionTime > 0) SpawnProtectionTimes[id] = now + spawnProtectionTime;
+1 -1
View File
@@ -512,7 +512,7 @@ public static class Quiz
if (stillLiving.Count <= 1) break;
}
spectators.Do(x => x.RpcRevive());
spectators.Do(x => x.ReviveFromTemporaryExile());
AllowKills = false;
Utils.SendRPC(CustomRPC.QuizSync, AllowKills);
+2 -2
View File
@@ -222,7 +222,6 @@ internal static class SoloPVP
RPC.PlaySoundRPC(killer.PlayerId, Sounds.KillSound);
RPC.PlaySoundRPC(target.PlayerId, Sounds.KillSound);
if (!target.IsModdedClient() && !target.AmOwner) target.SetKillCooldown(0.01f);
Utils.NotifyRoles(SpecifySeer: killer, SpecifyTarget: target);
Utils.NotifyRoles(SpecifySeer: target, SpecifyTarget: killer);
@@ -233,9 +232,10 @@ internal static class SoloPVP
BackCountdown.Remove(pc.PlayerId);
PlayerHP[pc.PlayerId] = PlayerHPMax[pc.PlayerId];
LastHurt[pc.PlayerId] = Utils.TimeStamp;
pc.RpcRevive();
pc.ReviveFromTemporaryExile();
RPC.PlaySoundRPC(pc.PlayerId, Sounds.TaskComplete);
SpawnMap.GetSpawnMap().RandomTeleport(pc);
Utils.NotifyRoles(SpecifyTarget: pc, SendOption: SendOption.None);
}
private static void OnPlayerDead(PlayerControl target)
+1 -1
View File
@@ -152,7 +152,7 @@ public static class BanManager
Logger.Info($"{player.PlayerName} was in temp ban list", "BAN");
}
if (GameStates.CurrentServerType is GameStates.ServerType.Modded or GameStates.ServerType.Local) return;
if (GameStates.CurrentServerType is GameStates.ServerType.Modded or GameStates.ServerType.Niko or GameStates.ServerType.Local) return;
string friendcode = player.FriendCode.Replace(':', '#');
+77 -27
View File
@@ -263,7 +263,7 @@ internal static class ExtendedPlayerControl
public static readonly HashSet<byte> TempExiled = [];
public static void ExileTemporarily(this PlayerControl pc)
public static void ExileTemporarily(this PlayerControl pc) // Only used in game modes
{
if (!TempExiled.Add(pc.PlayerId)) return;
@@ -298,6 +298,56 @@ internal static class ExtendedPlayerControl
}
}
// Saves some RPC calls for vanilla servers to make innersloth's rate limit happy
public static void ReviveFromTemporaryExile(this PlayerControl player) // Only used in game modes
{
if (GameStates.CurrentServerType != GameStates.ServerType.Vanilla)
{
player.RpcRevive();
return;
}
TempExiled.Remove(player.PlayerId);
PlayerState state = Main.PlayerStates[player.PlayerId];
state.IsDead = false;
state.deathReason = PlayerState.DeathReason.etc;
var sender = CustomRpcSender.Create("ReviveFromTemporaryExile", SendOption.Reliable);
var hasValue = false;
player.RpcSetRoleGlobal(RoleTypes.Crewmate);
RoleTypes newRoleType = state.MainRole.GetRoleTypes();
if (Options.CurrentGameMode is CustomGameMode.SoloKombat or CustomGameMode.FFA or CustomGameMode.CaptureTheFlag or CustomGameMode.KingOfTheZones or CustomGameMode.BedWars)
hasValue |= sender.RpcSetRole(player, newRoleType, player.OwnerId);
player.ResetKillCooldown();
LateTask.New(() => player.SetKillCooldown(), 0.2f, log: false);
if (newRoleType is not (RoleTypes.Crewmate or RoleTypes.Impostor or RoleTypes.Noisemaker))
hasValue |= sender.RpcResetAbilityCooldown(player);
if (DoRPC)
{
sender.SyncGeneralOptions(player);
hasValue = true;
}
sender.SendMessage(!hasValue);
}
// If you use vanilla RpcSetRole, it will block further SetRole calls until the next game starts.
private static void RpcSetRoleGlobal(this PlayerControl player, RoleTypes roleTypes)
{
if (AmongUsClient.Instance.AmClient) player.StartCoroutine(player.CoSetRole(roleTypes, true));
MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(player.NetId, (byte)RpcCalls.SetRole, SendOption.Reliable);
writer.Write((ushort)roleTypes);
writer.Write(true);
AmongUsClient.Instance.FinishRpcImmediately(writer);
}
public static void RpcSetRoleDesync(this PlayerControl player, RoleTypes role, int clientId, bool setRoleMap = false)
{
if (player == null) return;
@@ -400,7 +450,7 @@ internal static class ExtendedPlayerControl
int playerClientId = player.OwnerId;
CustomRoles playerRole = Utils.GetRoleMap(playerId).CustomRole;
RoleTypes newRoleType = newCustomRole.GetRoleTypes();
RoleTypes remeberRoleType;
RoleTypes rememberRoleType;
if (!forced)
{
@@ -440,13 +490,13 @@ internal static class ExtendedPlayerControl
bool self = playerId == seer.PlayerId;
if (!self && seer.HasDesyncRole() && !seerIsHost)
remeberRoleType = newRoleVN is CustomRoles.Noisemaker ? RoleTypes.Noisemaker : RoleTypes.Scientist;
rememberRoleType = newRoleVN is CustomRoles.Noisemaker ? RoleTypes.Noisemaker : RoleTypes.Scientist;
else
remeberRoleType = newRoleType;
rememberRoleType = newRoleType;
// Set role type for seer
StartGameHostPatch.RpcSetRoleReplacer.RoleMap[(seer.PlayerId, playerId)] = (remeberRoleType, newCustomRole);
player.RpcSetRoleDesync(remeberRoleType, seerClientId);
StartGameHostPatch.RpcSetRoleReplacer.RoleMap[(seer.PlayerId, playerId)] = (rememberRoleType, newCustomRole);
player.RpcSetRoleDesync(rememberRoleType, seerClientId);
if (self) continue;
@@ -455,25 +505,25 @@ internal static class ExtendedPlayerControl
if (seer.IsAlive())
{
if (seerCustomRole.IsDesyncRole())
remeberRoleType = seerIsHost ? RoleTypes.Crewmate : RoleTypes.Scientist;
rememberRoleType = seerIsHost ? RoleTypes.Crewmate : RoleTypes.Scientist;
else
remeberRoleType = seerRoleType;
rememberRoleType = seerRoleType;
}
else
{
bool playerIsKiller = playerRole.IsImpostor();
remeberRoleType = RoleTypes.CrewmateGhost;
if (!playerIsKiller && seer.Is(Team.Impostor)) remeberRoleType = RoleTypes.ImpostorGhost;
rememberRoleType = RoleTypes.CrewmateGhost;
if (!playerIsKiller && seer.Is(Team.Impostor)) rememberRoleType = RoleTypes.ImpostorGhost;
StartGameHostPatch.RpcSetRoleReplacer.RoleMap[(playerId, seer.PlayerId)] = (seerCustomRole.IsDesyncRole() ? seerIsHost ? RoleTypes.Crewmate : RoleTypes.Scientist : seerRoleType, seerCustomRole);
seer.RpcSetRoleDesync(remeberRoleType, playerClientId);
seer.RpcSetRoleDesync(rememberRoleType, playerClientId);
continue;
}
// Set role type for player
StartGameHostPatch.RpcSetRoleReplacer.RoleMap[(playerId, seer.PlayerId)] = (remeberRoleType, seerCustomRole);
seer.RpcSetRoleDesync(remeberRoleType, playerClientId);
StartGameHostPatch.RpcSetRoleReplacer.RoleMap[(playerId, seer.PlayerId)] = (rememberRoleType, seerCustomRole);
seer.RpcSetRoleDesync(rememberRoleType, playerClientId);
}
break;
@@ -490,36 +540,36 @@ internal static class ExtendedPlayerControl
if (self)
{
remeberRoleType = player.IsHost() ? RoleTypes.Crewmate : RoleTypes.Impostor;
rememberRoleType = player.IsHost() ? RoleTypes.Crewmate : RoleTypes.Impostor;
// For Desync Shapeshifter
if (newRoleDY is RoleTypes.Shapeshifter or RoleTypes.Phantom)
remeberRoleType = newRoleDY;
rememberRoleType = newRoleDY;
}
else
remeberRoleType = newRoleVN is CustomRoles.Noisemaker ? RoleTypes.Noisemaker : RoleTypes.Scientist;
rememberRoleType = newRoleVN is CustomRoles.Noisemaker ? RoleTypes.Noisemaker : RoleTypes.Scientist;
StartGameHostPatch.RpcSetRoleReplacer.RoleMap[(seer.PlayerId, playerId)] = (remeberRoleType, newCustomRole);
player.RpcSetRoleDesync(remeberRoleType, seerClientId);
StartGameHostPatch.RpcSetRoleReplacer.RoleMap[(seer.PlayerId, playerId)] = (rememberRoleType, newCustomRole);
player.RpcSetRoleDesync(rememberRoleType, seerClientId);
if (self) continue;
CustomRoles seerCustomRole = seer.GetRoleMap().CustomRole;
if (seer.IsAlive())
remeberRoleType = newRoleVN is CustomRoles.Noisemaker ? RoleTypes.Noisemaker : RoleTypes.Scientist;
rememberRoleType = newRoleVN is CustomRoles.Noisemaker ? RoleTypes.Noisemaker : RoleTypes.Scientist;
else
{
remeberRoleType = RoleTypes.CrewmateGhost;
rememberRoleType = RoleTypes.CrewmateGhost;
StartGameHostPatch.RpcSetRoleReplacer.RoleMap[(playerId, seer.PlayerId)] = (seerCustomRole.GetVNRole() is CustomRoles.Noisemaker ? RoleTypes.Noisemaker : RoleTypes.Scientist, seerCustomRole);
seer.RpcSetRoleDesync(remeberRoleType, playerClientId);
seer.RpcSetRoleDesync(rememberRoleType, playerClientId);
continue;
}
// Set role type for player
StartGameHostPatch.RpcSetRoleReplacer.RoleMap[(playerId, seer.PlayerId)] = (remeberRoleType, seerCustomRole);
seer.RpcSetRoleDesync(remeberRoleType, playerClientId);
StartGameHostPatch.RpcSetRoleReplacer.RoleMap[(playerId, seer.PlayerId)] = (rememberRoleType, seerCustomRole);
seer.RpcSetRoleDesync(rememberRoleType, playerClientId);
}
break;
@@ -536,12 +586,12 @@ internal static class ExtendedPlayerControl
if (seerClientId == -1) continue;
if ((playerIsDesync || seer.HasDesyncRole()) && seer.PlayerId != playerId)
remeberRoleType = Utils.GetRoleMap(seer.PlayerId, playerId).RoleType;
rememberRoleType = Utils.GetRoleMap(seer.PlayerId, playerId).RoleType;
else
remeberRoleType = newRoleType;
rememberRoleType = newRoleType;
StartGameHostPatch.RpcSetRoleReplacer.RoleMap[(seer.PlayerId, playerId)] = (remeberRoleType, newCustomRole);
player.RpcSetRoleDesync(remeberRoleType, seerClientId);
StartGameHostPatch.RpcSetRoleReplacer.RoleMap[(seer.PlayerId, playerId)] = (rememberRoleType, newCustomRole);
player.RpcSetRoleDesync(rememberRoleType, seerClientId);
}
break;
+3 -6
View File
@@ -36,7 +36,7 @@ public static class Statistics
CustomGameMode gm = Options.CurrentGameMode;
if (gm != CustomGameMode.Standard)
if (gm != CustomGameMode.Standard && GameStates.CurrentServerType is not GameStates.ServerType.Modded and not GameStates.ServerType.Niko)
{
try
{
@@ -45,11 +45,8 @@ public static class Statistics
Main.NumWinsPerGM.TryAdd(gm, []);
Main.NumWinsPerGM[gm].AddRange(winners, false);
foreach (string hashedpuid in Main.NumWinsPerGM[gm].Keys.ToArray())
{
if (winners.ContainsKey(hashedpuid))
Main.NumWinsPerGM[gm][hashedpuid]++;
}
foreach (string hashedpuid in Main.NumWinsPerGM[gm].Keys.Intersect(winners.Keys).ToArray())
Main.NumWinsPerGM[gm][hashedpuid]++;
if (Main.NumWinsPerGM[gm].Count != 0)
{
+21 -6
View File
@@ -26,6 +26,8 @@ public static class HudSpritePatch
private static Sprite Pet;
private static Sprite Report;
private static Sprite[] DefaultIcons = [];
private static long LastErrorTime;
public static bool ResetButtonIcons;
@@ -55,12 +57,25 @@ public static class HudSpritePatch
bool shapeshifting = player.IsShifted();
if (!Kill) Kill = __instance.KillButton.graphic.sprite;
if (!Ability) Ability = __instance.AbilityButton.graphic.sprite;
if (!Vent) Vent = __instance.ImpostorVentButton.graphic.sprite;
if (!Sabotage) Sabotage = __instance.SabotageButton.graphic.sprite;
if (!Pet) Pet = __instance.PetButton.graphic.sprite;
if (!Report) Report = __instance.ReportButton.graphic.sprite;
if (DefaultIcons.Length == 0)
{
DefaultIcons =
[
__instance.KillButton.graphic.sprite,
__instance.AbilityButton.graphic.sprite,
__instance.ImpostorVentButton.graphic.sprite,
__instance.SabotageButton.graphic.sprite,
__instance.PetButton.graphic.sprite,
__instance.ReportButton.graphic.sprite
];
}
if (!Kill) Kill = DefaultIcons[0];
if (!Ability) Ability = DefaultIcons[1];
if (!Vent) Vent = DefaultIcons[2];
if (!Sabotage) Sabotage = DefaultIcons[3];
if (!Pet) Pet = DefaultIcons[4];
if (!Report) Report = DefaultIcons[5];
Sprite newKillButton = Kill;
Sprite newAbilityButton = Ability;
+2 -2
View File
@@ -237,7 +237,7 @@ internal static class OnPlayerJoinedPatch
catch { }
}, 4.5f, "green bean kick late task", false);
if (AmongUsClient.Instance.AmHost && client.FriendCode == "" && Options.KickPlayerFriendCodeNotExist.GetBool() && GameStates.CurrentServerType is not GameStates.ServerType.Modded and not GameStates.ServerType.Local)
if (AmongUsClient.Instance.AmHost && client.FriendCode == "" && Options.KickPlayerFriendCodeNotExist.GetBool() && GameStates.CurrentServerType is not GameStates.ServerType.Modded and not GameStates.ServerType.Niko and not GameStates.ServerType.Local)
{
if (!BanManager.TempBanWhiteList.Contains(client.GetHashedPuid())) BanManager.TempBanWhiteList.Add(client.GetHashedPuid());
@@ -254,7 +254,7 @@ internal static class OnPlayerJoinedPatch
Logger.Info(msg, "Android Kick");
}
if (FastDestroyableSingleton<FriendsListManager>.Instance.IsPlayerBlockedUsername(client.FriendCode) && AmongUsClient.Instance.AmHost && GameStates.CurrentServerType is not GameStates.ServerType.Modded and not GameStates.ServerType.Local)
if (FastDestroyableSingleton<FriendsListManager>.Instance.IsPlayerBlockedUsername(client.FriendCode) && AmongUsClient.Instance.AmHost && GameStates.CurrentServerType is not GameStates.ServerType.Modded and not GameStates.ServerType.Niko and not GameStates.ServerType.Local)
{
AmongUsClient.Instance.KickPlayer(client.Id, true);
Logger.Info($"Blocked Player {client.PlayerName}({client.FriendCode}) has been banned.", "BAN");