mirror of
https://github.com/Gurge44/EndlessHostRoles.git
synced 2026-10-20 01:46:25 +00:00
fix
This commit is contained in:
1 parent
23f91695fd
commit
7d7de07a73
10 files changed
+113
-48
No files matched your search
+2
-1
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
@@ -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
@@ -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)
|
||||
|
||||
@@ -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(':', '#');
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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");
|
||||
|
||||
Reference in new issue
Block a user