mirror of
https://github.com/Gurge44/EndlessHostRoles.git
synced 2026-10-20 01:46:25 +00:00
Add settings, optimize, fix
This commit is contained in:
1 parent
30d575dfcd
commit
1d806fe522
25 files changed
+137
-239
No files matched your search
@@ -2,6 +2,7 @@
|
||||
xmlns:s="clr-namespace:System;assembly=mscorlib"
|
||||
xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
|
||||
<s:String x:Key="/Default/CodeInspection/Highlighting/AnalysisEnabled/@EntryValue">SOLUTION</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=ATK/@EntryIndexedValue">ATK</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=AU/@EntryIndexedValue">AU</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=CD/@EntryIndexedValue">CD</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=CK/@EntryIndexedValue">CK</s:String>
|
||||
@@ -12,6 +13,7 @@
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=FFF/@EntryIndexedValue">FFF</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=FPS/@EntryIndexedValue">FPS</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=GM/@EntryIndexedValue">GM</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=HP/@EntryIndexedValue">HP</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=HUD/@EntryIndexedValue">HUD</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=KCD/@EntryIndexedValue">KCD</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=NB/@EntryIndexedValue">NB</s:String>
|
||||
|
||||
@@ -14,37 +14,20 @@ internal static class SoloKombatManager
|
||||
{
|
||||
private static Dictionary<byte, float> PlayerHPMax = [];
|
||||
private static Dictionary<byte, float> PlayerHP = [];
|
||||
private static Dictionary<byte, float> PlayerHPReco = [];
|
||||
private static Dictionary<byte, float> PlayerATK = [];
|
||||
private static Dictionary<byte, float> PlayerDF = [];
|
||||
public static Dictionary<byte, float> PlayerHPReco = [];
|
||||
public static Dictionary<byte, float> PlayerATK = [];
|
||||
public static Dictionary<byte, float> PlayerDF = [];
|
||||
|
||||
private static Dictionary<byte, float> originalSpeed = [];
|
||||
public static Dictionary<byte, int> KBScore = [];
|
||||
private static Dictionary<byte, float> OriginalSpeed = [];
|
||||
private static Dictionary<byte, int> KBScore = [];
|
||||
public static int RoundTime;
|
||||
|
||||
//Options
|
||||
public static OptionItem KB_GameTime;
|
||||
public static OptionItem KB_ATKCooldown;
|
||||
public static OptionItem KB_HPMax;
|
||||
public static OptionItem KB_ATK;
|
||||
public static OptionItem KB_RecoverAfterSecond;
|
||||
public static OptionItem KB_RecoverPerSecond;
|
||||
public static OptionItem KB_ResurrectionWaitingTime;
|
||||
public static OptionItem KB_KillBonusMultiplier;
|
||||
public static OptionItem KB_BootVentWhenDead;
|
||||
|
||||
public static Dictionary<byte, (string TEXT, long TIMESTAMP)> NameNotify = [];
|
||||
private static readonly Dictionary<byte, (string TEXT, long TIMESTAMP)> NameNotify = [];
|
||||
|
||||
private static Dictionary<byte, int> BackCountdown = [];
|
||||
private static Dictionary<byte, long> LastHurt = [];
|
||||
|
||||
public static bool SoloAlive(this PlayerControl pc) => pc.HP() > 0f;
|
||||
|
||||
public static float HPMAX(this PlayerControl pc) => PlayerHPMax[pc.PlayerId];
|
||||
public static float HP(this PlayerControl pc) => PlayerHP[pc.PlayerId];
|
||||
public static float HPRECO(this PlayerControl pc) => PlayerHPReco[pc.PlayerId];
|
||||
public static float ATK(this PlayerControl pc) => PlayerATK[pc.PlayerId];
|
||||
public static float DF(this PlayerControl pc) => PlayerDF[pc.PlayerId];
|
||||
public static bool SoloAlive(this PlayerControl pc) => PlayerHP[pc.PlayerId] > 0f;
|
||||
|
||||
public static void SetupCustomOption()
|
||||
{
|
||||
@@ -97,7 +80,7 @@ internal static class SoloKombatManager
|
||||
PlayerDF = [];
|
||||
|
||||
LastHurt = [];
|
||||
originalSpeed = [];
|
||||
OriginalSpeed = [];
|
||||
BackCountdown = [];
|
||||
KBScore = [];
|
||||
RoundTime = KB_GameTime.GetInt() + 8;
|
||||
@@ -160,13 +143,11 @@ internal static class SoloKombatManager
|
||||
KBScore[PlayerId] = reader.ReadInt32();
|
||||
}
|
||||
|
||||
public static void SendRPCSyncNameNotify(PlayerControl pc)
|
||||
private static void SendRPCSyncNameNotify(PlayerControl pc)
|
||||
{
|
||||
if (pc.AmOwner || !pc.IsModClient()) return;
|
||||
MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.SyncKBNameNotify, SendOption.Reliable, pc.GetClientId());
|
||||
if (NameNotify.TryGetValue(pc.PlayerId, out (string TEXT, long TIMESTAMP) value))
|
||||
writer.Write(value.TEXT);
|
||||
else writer.Write("");
|
||||
writer.Write(NameNotify.TryGetValue(pc.PlayerId, out (string TEXT, long TIMESTAMP) value) ? value.TEXT : "");
|
||||
AmongUsClient.Instance.FinishRpcImmediately(writer);
|
||||
}
|
||||
|
||||
@@ -174,16 +155,16 @@ internal static class SoloKombatManager
|
||||
{
|
||||
var name = reader.ReadString();
|
||||
NameNotify.Remove(PlayerControl.LocalPlayer.PlayerId);
|
||||
if (name != null && name != "")
|
||||
if (!string.IsNullOrEmpty(name))
|
||||
NameNotify.Add(PlayerControl.LocalPlayer.PlayerId, (name, 0));
|
||||
}
|
||||
|
||||
public static string GetDisplayHealth(PlayerControl pc)
|
||||
=> pc.SoloAlive() ? Utils.ColorString(GetHealthColor(pc), $"{(int)pc.HP()}/{(int)pc.HPMAX()}") : "";
|
||||
=> pc.SoloAlive() ? Utils.ColorString(GetHealthColor(pc), $"{(int)PlayerHP[pc.PlayerId]}/{(int)PlayerHPMax[pc.PlayerId]}") : string.Empty;
|
||||
|
||||
private static Color32 GetHealthColor(PlayerControl pc)
|
||||
{
|
||||
var x = (int)(pc.HP() / pc.HPMAX() * 10 * 50);
|
||||
var x = (int)(PlayerHP[pc.PlayerId] / PlayerHPMax[pc.PlayerId] * 10 * 50);
|
||||
int R = 255;
|
||||
int G = 255;
|
||||
int B = 0;
|
||||
@@ -194,7 +175,7 @@ internal static class SoloKombatManager
|
||||
|
||||
public static void GetNameNotify(PlayerControl player, ref string name)
|
||||
{
|
||||
if (Options.CurrentGameMode != CustomGameMode.SoloKombat || player == null) return;
|
||||
if (Options.CurrentGameMode != CustomGameMode.SoloKombat || player is null || !player) return;
|
||||
if (BackCountdown.TryGetValue(player.PlayerId, out int value))
|
||||
{
|
||||
name = string.Format(Translator.GetString("KBBackCountDown"), value);
|
||||
@@ -208,21 +189,12 @@ internal static class SoloKombatManager
|
||||
}
|
||||
}
|
||||
|
||||
public static string GetDisplayScore(byte playerId)
|
||||
{
|
||||
int rank = GetRankOfScore(playerId);
|
||||
string score = KBScore.TryGetValue(playerId, out var s) ? $"{s}" : "Invalid";
|
||||
string text = string.Format(Translator.GetString("KBDisplayScore"), rank.ToString(), score);
|
||||
Color color = Utils.GetRoleColor(CustomRoles.KB_Normal);
|
||||
return Utils.ColorString(color, text);
|
||||
}
|
||||
|
||||
public static int GetRankOfScore(byte playerId)
|
||||
{
|
||||
try
|
||||
{
|
||||
int ms = KBScore[playerId];
|
||||
int rank = 1 + KBScore.Values.Where(x => x > ms).Count();
|
||||
int rank = 1 + KBScore.Values.Count(x => x > ms);
|
||||
rank += KBScore.Where(x => x.Value == ms).ToList().IndexOf(new(playerId, ms));
|
||||
return rank;
|
||||
}
|
||||
@@ -242,8 +214,8 @@ internal static class SoloKombatManager
|
||||
if (killer == null || target == null || Options.CurrentGameMode != CustomGameMode.SoloKombat) return;
|
||||
if (!killer.SoloAlive() || !target.SoloAlive() || target.inVent) return;
|
||||
|
||||
var dmg = killer.ATK() - target.DF();
|
||||
PlayerHP[target.PlayerId] = Math.Max(0f, target.HP() - dmg);
|
||||
var dmg = PlayerATK[killer.PlayerId] - PlayerDF[target.PlayerId];
|
||||
PlayerHP[target.PlayerId] = Math.Max(0f, PlayerHP[target.PlayerId] - dmg);
|
||||
|
||||
if (!target.SoloAlive())
|
||||
{
|
||||
@@ -253,7 +225,7 @@ internal static class SoloKombatManager
|
||||
|
||||
LastHurt[target.PlayerId] = Utils.TimeStamp;
|
||||
|
||||
killer.SetKillCooldown(1f, target);
|
||||
killer.SetKillCooldown(KB_ATKCooldown.GetFloat(), target);
|
||||
RPC.PlaySoundRPC(killer.PlayerId, Sounds.KillSound);
|
||||
RPC.PlaySoundRPC(target.PlayerId, Sounds.KillSound);
|
||||
if (!target.IsModClient() && !target.AmOwner)
|
||||
@@ -264,14 +236,14 @@ internal static class SoloKombatManager
|
||||
Utils.NotifyRoles(SpecifySeer: target, SpecifyTarget: target);
|
||||
}
|
||||
|
||||
public static void OnPlayerBack(PlayerControl pc)
|
||||
private static void OnPlayerBack(PlayerControl pc)
|
||||
{
|
||||
BackCountdown.Remove(pc.PlayerId);
|
||||
PlayerHP[pc.PlayerId] = pc.HPMAX();
|
||||
PlayerHP[pc.PlayerId] = PlayerHPMax[pc.PlayerId];
|
||||
SendRPCSyncKBPlayer(pc.PlayerId);
|
||||
|
||||
LastHurt[pc.PlayerId] = Utils.TimeStamp;
|
||||
Main.AllPlayerSpeed[pc.PlayerId] = Main.AllPlayerSpeed[pc.PlayerId] - 0.3f + originalSpeed[pc.PlayerId];
|
||||
Main.AllPlayerSpeed[pc.PlayerId] = Main.AllPlayerSpeed[pc.PlayerId] - 0.3f + OriginalSpeed[pc.PlayerId];
|
||||
pc.MarkDirtySettings();
|
||||
|
||||
RPC.PlaySoundRPC(pc.PlayerId, Sounds.TaskComplete);
|
||||
@@ -280,7 +252,7 @@ internal static class SoloKombatManager
|
||||
PlayerRandomSpwan(pc);
|
||||
}
|
||||
|
||||
public static void PlayerRandomSpwan(PlayerControl pc)
|
||||
private static void PlayerRandomSpwan(PlayerControl pc)
|
||||
{
|
||||
SpawnMap map;
|
||||
switch (Main.NormalOptions.MapId)
|
||||
@@ -300,10 +272,10 @@ internal static class SoloKombatManager
|
||||
}
|
||||
}
|
||||
|
||||
public static void OnPlyaerDead(PlayerControl target)
|
||||
private static void OnPlyaerDead(PlayerControl target)
|
||||
{
|
||||
originalSpeed.Remove(target.PlayerId);
|
||||
originalSpeed.Add(target.PlayerId, Main.AllPlayerSpeed[target.PlayerId]);
|
||||
OriginalSpeed.Remove(target.PlayerId);
|
||||
OriginalSpeed.Add(target.PlayerId, Main.AllPlayerSpeed[target.PlayerId]);
|
||||
|
||||
target.TP(Pelican.GetBlackRoomPS());
|
||||
Main.AllPlayerSpeed[target.PlayerId] = 0.3f;
|
||||
@@ -313,7 +285,7 @@ internal static class SoloKombatManager
|
||||
SendRPCSyncKBBackCountdown(target);
|
||||
}
|
||||
|
||||
public static void OnPlayerKill(PlayerControl killer)
|
||||
private static void OnPlayerKill(PlayerControl killer)
|
||||
{
|
||||
killer.KillFlash();
|
||||
if (PlayerControl.LocalPlayer.Is(CustomRoles.GM))
|
||||
@@ -327,24 +299,24 @@ internal static class SoloKombatManager
|
||||
switch (IRandom.Instance.Next(0, 3))
|
||||
{
|
||||
case 0:
|
||||
addin = killer.HPMAX() * addRate;
|
||||
addin = PlayerHPMax[killer.PlayerId] * addRate;
|
||||
PlayerHPMax[killer.PlayerId] += addin;
|
||||
AddNameNotify(killer, string.Format(Translator.GetString("KB_Buff_HPMax"), addin.ToString("0.0#####")));
|
||||
break;
|
||||
case 1:
|
||||
addin = killer.HPRECO() * addRate * 2;
|
||||
addin = PlayerHPReco[killer.PlayerId] * addRate * 2;
|
||||
PlayerHPReco[killer.PlayerId] += addin;
|
||||
AddNameNotify(killer, string.Format(Translator.GetString("KB_Buff_HPReco"), addin.ToString("0.0#####")));
|
||||
break;
|
||||
case 2:
|
||||
addin = killer.ATK() * addRate;
|
||||
addin = PlayerATK[killer.PlayerId] * addRate;
|
||||
PlayerATK[killer.PlayerId] += addin;
|
||||
AddNameNotify(killer, string.Format(Translator.GetString("KB_Buff_ATK"), addin.ToString("0.0#####")));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
public static void AddNameNotify(PlayerControl pc, string text, int time = 5)
|
||||
private static void AddNameNotify(PlayerControl pc, string text, int time = 5)
|
||||
{
|
||||
NameNotify.Remove(pc.PlayerId);
|
||||
NameNotify.Add(pc.PlayerId, (text, Utils.TimeStamp + time));
|
||||
@@ -375,7 +347,6 @@ internal static class SoloKombatManager
|
||||
if (LastFixedUpdate == Utils.TimeStamp) return;
|
||||
LastFixedUpdate = Utils.TimeStamp;
|
||||
|
||||
// 减少全局倒计时
|
||||
RoundTime--;
|
||||
|
||||
if (!AmongUsClient.Instance.AmHost) return;
|
||||
@@ -383,16 +354,14 @@ internal static class SoloKombatManager
|
||||
foreach (var pc in Main.AllPlayerControls)
|
||||
{
|
||||
bool notifyRoles = false;
|
||||
// 每秒回复血量
|
||||
if (LastHurt[pc.PlayerId] + KB_RecoverAfterSecond.GetInt() < Utils.TimeStamp && pc.HP() < pc.HPMAX() && pc.SoloAlive() && !pc.inVent)
|
||||
if (LastHurt[pc.PlayerId] + KB_RecoverAfterSecond.GetInt() < Utils.TimeStamp && PlayerHP[pc.PlayerId] < PlayerHPMax[pc.PlayerId] && pc.SoloAlive() && !pc.inVent)
|
||||
{
|
||||
PlayerHP[pc.PlayerId] += pc.HPRECO();
|
||||
PlayerHP[pc.PlayerId] = Math.Min(pc.HPMAX(), pc.HP());
|
||||
PlayerHP[pc.PlayerId] += PlayerHPReco[pc.PlayerId];
|
||||
PlayerHP[pc.PlayerId] = Math.Min(PlayerHPMax[pc.PlayerId], PlayerHP[pc.PlayerId]);
|
||||
SendRPCSyncKBPlayer(pc.PlayerId);
|
||||
notifyRoles = true;
|
||||
}
|
||||
|
||||
// 复活玩家随机复活(二次确认)
|
||||
if (pc.SoloAlive() && !pc.inVent)
|
||||
{
|
||||
var pos = Pelican.GetBlackRoomPS();
|
||||
@@ -400,7 +369,6 @@ internal static class SoloKombatManager
|
||||
if (dis < 1.1f) PlayerRandomSpwan(pc);
|
||||
}
|
||||
|
||||
// 复活倒计时
|
||||
if (BackCountdown.ContainsKey(pc.PlayerId))
|
||||
{
|
||||
BackCountdown[pc.PlayerId]--;
|
||||
@@ -410,7 +378,6 @@ internal static class SoloKombatManager
|
||||
notifyRoles = true;
|
||||
}
|
||||
|
||||
// 清除过期的提示信息
|
||||
if (NameNotify.ContainsKey(pc.PlayerId) && NameNotify[pc.PlayerId].TIMESTAMP < Utils.TimeStamp)
|
||||
{
|
||||
NameNotify.Remove(pc.PlayerId);
|
||||
@@ -418,10 +385,23 @@ internal static class SoloKombatManager
|
||||
notifyRoles = true;
|
||||
}
|
||||
|
||||
// 必要时刷新玩家名字
|
||||
if (notifyRoles) Utils.NotifyRoles(SpecifySeer: pc, SpecifyTarget: pc);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Options
|
||||
// ReSharper disable InconsistentNaming
|
||||
private static OptionItem KB_GameTime;
|
||||
public static OptionItem KB_ATKCooldown;
|
||||
private static OptionItem KB_HPMax;
|
||||
private static OptionItem KB_ATK;
|
||||
private static OptionItem KB_RecoverAfterSecond;
|
||||
private static OptionItem KB_RecoverPerSecond;
|
||||
private static OptionItem KB_ResurrectionWaitingTime;
|
||||
private static OptionItem KB_KillBonusMultiplier;
|
||||
|
||||
private static OptionItem KB_BootVentWhenDead;
|
||||
// ReSharper restore InconsistentNaming
|
||||
}
|
||||
@@ -75,7 +75,7 @@ static class ExtendedPlayerControl
|
||||
|
||||
public static int GetClientId(this PlayerControl player)
|
||||
{
|
||||
if (player == null) return -1;
|
||||
if (player is null || !player) return -1;
|
||||
var client = player.GetClient();
|
||||
return client?.Id ?? -1;
|
||||
}
|
||||
@@ -90,7 +90,7 @@ static class ExtendedPlayerControl
|
||||
/// </summary>
|
||||
public static CustomRoles GetCustomRole(this PlayerControl player)
|
||||
{
|
||||
if (player == null)
|
||||
if (player is null || !player)
|
||||
{
|
||||
var callerMethod = new StackFrame(1, false).GetMethod();
|
||||
string callerMethodName = callerMethod?.Name;
|
||||
@@ -104,9 +104,9 @@ static class ExtendedPlayerControl
|
||||
public static List<CustomRoles> GetCustomSubRoles(this PlayerControl player)
|
||||
{
|
||||
if (GameStates.IsLobby) return [CustomRoles.NotAssigned];
|
||||
if (player == null)
|
||||
if (player is null || !player)
|
||||
{
|
||||
Logger.Warn("CustomSubRoleを取得しようとしましたが、対象がnullでした。", "getCustomSubRole");
|
||||
Logger.Warn("The player is null", "GetCustomSubRoles");
|
||||
return [CustomRoles.NotAssigned];
|
||||
}
|
||||
|
||||
@@ -115,7 +115,7 @@ static class ExtendedPlayerControl
|
||||
|
||||
public static CountTypes GetCountTypes(this PlayerControl player)
|
||||
{
|
||||
if (player == null)
|
||||
if (player is null || !player)
|
||||
{
|
||||
var caller = new StackFrame(1, false);
|
||||
var callerMethod = caller.GetMethod();
|
||||
@@ -141,8 +141,8 @@ static class ExtendedPlayerControl
|
||||
|
||||
public static void RpcSetNamePrivate(this PlayerControl player, string name, bool DontShowOnModdedClient = false, PlayerControl seer = null, bool force = false)
|
||||
{
|
||||
if (player == null || name == null || !AmongUsClient.Instance.AmHost) return;
|
||||
if (seer == null) seer = player;
|
||||
if (player is null || !player || name == null || !AmongUsClient.Instance.AmHost) return;
|
||||
if (seer is null || !seer) seer = player;
|
||||
if (!force && Main.LastNotifyNames[(player.PlayerId, seer.PlayerId)] == name) return;
|
||||
|
||||
Main.LastNotifyNames[(player.PlayerId, seer.PlayerId)] = name;
|
||||
@@ -157,7 +157,7 @@ static class ExtendedPlayerControl
|
||||
|
||||
public static void RpcSetRoleDesync(this PlayerControl player, RoleTypes role, int clientId)
|
||||
{
|
||||
//player: Rename target
|
||||
// player: Rename target
|
||||
|
||||
if (player == null) return;
|
||||
if (AmongUsClient.Instance.ClientId == clientId)
|
||||
@@ -222,7 +222,7 @@ static class ExtendedPlayerControl
|
||||
return;
|
||||
}
|
||||
|
||||
if (target == null) target = killer;
|
||||
if (target is null || !target) target = killer;
|
||||
|
||||
// Check Observer
|
||||
if (!forObserver && !MeetingStates.FirstMeeting)
|
||||
@@ -247,16 +247,6 @@ static class ExtendedPlayerControl
|
||||
|
||||
if (!fromSetKCD) killer.AddKillTimerToDict(half: true);
|
||||
}
|
||||
//public static void SetKillCooldownV2(this PlayerControl player, float time = -1f)
|
||||
//{
|
||||
// if (player == null) return;
|
||||
// if (!player.CanUseKillButton()) return;
|
||||
// if (time >= 0f) Main.AllPlayerKillCooldown[player.PlayerId] = time * 2;
|
||||
// else Main.AllPlayerKillCooldown[player.PlayerId] *= 2;
|
||||
// player.SyncSettings();
|
||||
// player.RpcGuardAndKill();
|
||||
// player.ResetKillCooldown();
|
||||
//}
|
||||
|
||||
public static void AddKCDAsAbilityCD(this PlayerControl pc) => AddAbilityCD(pc, (int)Math.Round(Main.AllPlayerKillCooldown.TryGetValue(pc.PlayerId, out var KCD) ? KCD : Options.DefaultKillCooldown));
|
||||
public static void AddAbilityCD(this PlayerControl pc, bool includeDuration = true) => Utils.AddAbilityCD(pc.GetCustomRole(), pc.PlayerId, includeDuration);
|
||||
@@ -307,7 +297,7 @@ static class ExtendedPlayerControl
|
||||
Main.PlayerStates[pc.PlayerId].SetDead();
|
||||
|
||||
Medic.IsDead(pc);
|
||||
if (realKiller != null)
|
||||
if (realKiller is not null && realKiller)
|
||||
{
|
||||
pc.SetRealKiller(realKiller);
|
||||
if (realKiller.Is(CustomRoles.Damocles)) Damocles.OnMurder(realKiller.PlayerId);
|
||||
@@ -319,7 +309,7 @@ static class ExtendedPlayerControl
|
||||
|
||||
public static void SetKillCooldown(this PlayerControl player, float time = -1f, PlayerControl target = null, bool forceAnime = false)
|
||||
{
|
||||
if (player == null) return;
|
||||
if (player is null || !player) return;
|
||||
Logger.Info($"{player.GetNameWithRole()}'s KCD set to {(Math.Abs(time - (-1f)) < 0.5f ? Main.AllPlayerKillCooldown[player.PlayerId] : time)}s", "SetKCD");
|
||||
if (player.GetCustomRole().UsesPetInsteadOfKill())
|
||||
{
|
||||
@@ -330,7 +320,7 @@ static class ExtendedPlayerControl
|
||||
|
||||
if (!player.CanUseKillButton()) return;
|
||||
player.AddKillTimerToDict(CD: time);
|
||||
if (target == null) target = player;
|
||||
if (target is null || !target) target = player;
|
||||
if (time >= 0f) Main.AllPlayerKillCooldown[player.PlayerId] = time * 2;
|
||||
else Main.AllPlayerKillCooldown[player.PlayerId] *= 2;
|
||||
if (player.Is(CustomRoles.Glitch) && Main.PlayerStates[player.PlayerId].Role is Glitch gc)
|
||||
@@ -360,32 +350,6 @@ static class ExtendedPlayerControl
|
||||
if (player.GetCustomRole() is not CustomRoles.Inhibitor and not CustomRoles.Saboteur) player.ResetKillCooldown();
|
||||
}
|
||||
|
||||
//public static void SetKillCooldownV3(this PlayerControl player, float time = -1f, PlayerControl target = null, bool forceAnime = false)
|
||||
//{
|
||||
// if (player == null) return;
|
||||
// if (!player.CanUseKillButton()) return;
|
||||
// if (target == null) target = player;
|
||||
// if (time >= 0f) Main.AllPlayerKillCooldown[player.PlayerId] = time * 2;
|
||||
// else Main.AllPlayerKillCooldown[player.PlayerId] *= 2;
|
||||
// if (forceAnime || !player.IsModClient() || !Options.DisableShieldAnimations.GetBool())
|
||||
// {
|
||||
// player.SyncSettings();
|
||||
// player.RpcGuardAndKill(target, 11);
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// time = Main.AllPlayerKillCooldown[player.PlayerId] / 2;
|
||||
// if (player.AmOwner) PlayerControl.LocalPlayer.SetKillTimer(time);
|
||||
// else
|
||||
// {
|
||||
// MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.SetKillTimer, SendOption.Reliable, player.GetClientId());
|
||||
// writer.Write(time);
|
||||
// AmongUsClient.Instance.FinishRpcImmediately(writer);
|
||||
// }
|
||||
// Main.AllPlayerControls.Where(x => x.Is(CustomRoles.Observer) && target.PlayerId != x.PlayerId).Do(x => x.RpcGuardAndKill(target, 11, true));
|
||||
// }
|
||||
// player.ResetKillCooldown();
|
||||
//}
|
||||
public static void RpcSpecificMurderPlayer(this PlayerControl killer, PlayerControl target = null)
|
||||
{
|
||||
if (target == null) target = killer;
|
||||
@@ -402,23 +366,9 @@ static class ExtendedPlayerControl
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
[Obsolete]
|
||||
public static void RpcSpecificProtectPlayer(this PlayerControl killer, PlayerControl target = null, int colorId = 0)
|
||||
{
|
||||
if (AmongUsClient.Instance.AmClient)
|
||||
{
|
||||
killer.ProtectPlayer(target, colorId);
|
||||
}
|
||||
MessageWriter messageWriter = AmongUsClient.Instance.StartRpcImmediately(killer.NetId, (byte)RpcCalls.ProtectPlayer, SendOption.Reliable, killer.GetClientId());
|
||||
messageWriter.WriteNetObject(target);
|
||||
messageWriter.Write(colorId);
|
||||
AmongUsClient.Instance.FinishRpcImmediately(messageWriter);
|
||||
}
|
||||
*/
|
||||
public static void RpcResetAbilityCooldown(this PlayerControl target)
|
||||
{
|
||||
if (!AmongUsClient.Instance.AmHost) return; //ホスト以外が実行しても何も起こさない
|
||||
if (!AmongUsClient.Instance.AmHost) return;
|
||||
Logger.Info($"Reset Ability Cooldown for {target.name} (ID: {target.PlayerId})", "RpcResetAbilityCooldown");
|
||||
if (target.Is(CustomRoles.Glitch) && Main.PlayerStates[target.PlayerId].Role is Glitch gc)
|
||||
{
|
||||
@@ -457,21 +407,6 @@ static class ExtendedPlayerControl
|
||||
AmongUsClient.Instance.FinishRpcImmediately(messageWriter);
|
||||
}
|
||||
|
||||
/*public static void RpcBeKilled(this PlayerControl player, PlayerControl KilledBy = null) {
|
||||
if(!AmongUsClient.Instance.AmHost) return;
|
||||
byte KilledById;
|
||||
if(KilledBy == null)
|
||||
KilledById = byte.MaxValue;
|
||||
else
|
||||
KilledById = KilledBy.PlayerId;
|
||||
|
||||
MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(player.NetId, (byte)CustomRPC.BeKilled, Hazel.SendOption.Reliable, -1);
|
||||
writer.Write(player.PlayerId);
|
||||
writer.Write(KilledById);
|
||||
AmongUsClient.Instance.FinishRpcImmediately(writer);
|
||||
|
||||
RPC.BeKilled(player.PlayerId, KilledById);
|
||||
}*/
|
||||
public static void MarkDirtySettings(this PlayerControl player)
|
||||
{
|
||||
PlayerGameOptionsSender.SetDirty(player.PlayerId);
|
||||
@@ -485,12 +420,6 @@ static class ExtendedPlayerControl
|
||||
|
||||
public static TaskState GetTaskState(this PlayerControl player) => Main.PlayerStates.TryGetValue(player.PlayerId, out var state) ? state.TaskState : new();
|
||||
|
||||
/*public static GameOptionsData DeepCopy(this GameOptionsData opt)
|
||||
{
|
||||
var optByte = opt.ToBytes(5);
|
||||
return GameOptionsData.FromBytes(optByte);
|
||||
}*/
|
||||
|
||||
public static bool IsNonHostModClient(this PlayerControl pc) => pc.IsModClient() && !pc.IsHost();
|
||||
|
||||
public static string GetDisplayRoleName(this PlayerControl player, bool pure = false)
|
||||
@@ -500,8 +429,8 @@ static class ExtendedPlayerControl
|
||||
|
||||
public static string GetSubRoleNames(this PlayerControl player, bool forUser = false)
|
||||
{
|
||||
var SubRoles = Main.PlayerStates[player.PlayerId].SubRoles.ToArray();
|
||||
if (SubRoles.Length == 0) return string.Empty;
|
||||
var SubRoles = Main.PlayerStates[player.PlayerId].SubRoles;
|
||||
if (SubRoles.Count == 0) return string.Empty;
|
||||
var sb = new StringBuilder();
|
||||
foreach (CustomRoles role in SubRoles)
|
||||
{
|
||||
@@ -537,7 +466,7 @@ static class ExtendedPlayerControl
|
||||
|
||||
public static void ResetPlayerCam(this PlayerControl pc, float delay = 0f)
|
||||
{
|
||||
if (pc == null || !AmongUsClient.Instance.AmHost || pc.AmOwner) return;
|
||||
if (pc is null || !pc || !AmongUsClient.Instance.AmHost || pc.AmOwner) return;
|
||||
|
||||
var systemtypes = (MapNames)Main.NormalOptions.MapId switch
|
||||
{
|
||||
@@ -560,7 +489,7 @@ static class ExtendedPlayerControl
|
||||
|
||||
public static void ReactorFlash(this PlayerControl pc, float delay = 0f)
|
||||
{
|
||||
if (pc == null) return;
|
||||
if (pc is null || !pc) return;
|
||||
|
||||
Logger.Info($"Reactor Flash for {pc.GetNameWithRole()}", "ReactorFlash");
|
||||
|
||||
@@ -592,7 +521,7 @@ static class ExtendedPlayerControl
|
||||
}
|
||||
catch (NullReferenceException nullReferenceException)
|
||||
{
|
||||
Logger.Error($"{nullReferenceException.Message} - player is null? {player == null}", "GetRealName");
|
||||
Logger.Error($"{nullReferenceException.Message} - player is null? {player is null || !player}", "GetRealName");
|
||||
return string.Empty;
|
||||
}
|
||||
catch (Exception exception)
|
||||
@@ -714,21 +643,21 @@ static class ExtendedPlayerControl
|
||||
|
||||
public static bool IsDousedPlayer(this PlayerControl arsonist, PlayerControl target)
|
||||
{
|
||||
if (arsonist == null || target == null || Arsonist.IsDoused == null) return false;
|
||||
if (arsonist is null || !arsonist || target is null || !target || Arsonist.IsDoused == null) return false;
|
||||
Arsonist.IsDoused.TryGetValue((arsonist.PlayerId, target.PlayerId), out bool isDoused);
|
||||
return isDoused;
|
||||
}
|
||||
|
||||
public static bool IsDrawPlayer(this PlayerControl arsonist, PlayerControl target)
|
||||
{
|
||||
if (arsonist == null || target == null || Revolutionist.IsDraw == null) return false;
|
||||
if (arsonist is null || !arsonist || target is null || !target || Revolutionist.IsDraw == null) return false;
|
||||
Revolutionist.IsDraw.TryGetValue((arsonist.PlayerId, target.PlayerId), out bool isDraw);
|
||||
return isDraw;
|
||||
}
|
||||
|
||||
public static bool IsRevealedPlayer(this PlayerControl player, PlayerControl target)
|
||||
{
|
||||
if (player == null || target == null || Farseer.IsRevealed == null) return false;
|
||||
if (player is null || !player || target is null || !target || Farseer.IsRevealed == null) return false;
|
||||
Farseer.IsRevealed.TryGetValue((player.PlayerId, target.PlayerId), out bool isDoused);
|
||||
return isDoused;
|
||||
}
|
||||
@@ -786,7 +715,7 @@ static class ExtendedPlayerControl
|
||||
if (Main.KilledDiseased.TryGetValue(player.PlayerId, out int value))
|
||||
{
|
||||
Main.AllPlayerKillCooldown[player.PlayerId] += value * Options.DiseasedCDOpt.GetFloat();
|
||||
Logger.Info($"kill cd of player set to {Main.AllPlayerKillCooldown[player.PlayerId]}", "Diseased");
|
||||
Logger.Info($"KCD of player set to {Main.AllPlayerKillCooldown[player.PlayerId]}", "Diseased");
|
||||
}
|
||||
|
||||
if (Main.KilledAntidote.TryGetValue(player.PlayerId, out int value1))
|
||||
@@ -794,15 +723,15 @@ static class ExtendedPlayerControl
|
||||
var kcd = Main.AllPlayerKillCooldown[player.PlayerId] - value1 * Options.AntidoteCDOpt.GetFloat();
|
||||
if (kcd < 0) kcd = 0;
|
||||
Main.AllPlayerKillCooldown[player.PlayerId] = kcd;
|
||||
Logger.Info($"kill cd of player set to {Main.AllPlayerKillCooldown[player.PlayerId]}", "Antidote");
|
||||
Logger.Info($"KCD of player set to {Main.AllPlayerKillCooldown[player.PlayerId]}", "Antidote");
|
||||
}
|
||||
}
|
||||
|
||||
public static void TrapperKilled(this PlayerControl killer, PlayerControl target)
|
||||
{
|
||||
Logger.Info($"{target?.Data?.PlayerName}はTrapperだった", "Trapper");
|
||||
Logger.Info($"{target?.Data?.PlayerName} was Trapper", "Trapper");
|
||||
var tmpSpeed = Main.AllPlayerSpeed[killer.PlayerId];
|
||||
Main.AllPlayerSpeed[killer.PlayerId] = Main.MinSpeed; //tmpSpeedで後ほど値を戻すので代入しています。
|
||||
Main.AllPlayerSpeed[killer.PlayerId] = Main.MinSpeed;
|
||||
ReportDeadBodyPatch.CanReport[killer.PlayerId] = false;
|
||||
killer.MarkDirtySettings();
|
||||
LateTask.New(() =>
|
||||
@@ -887,33 +816,6 @@ static class ExtendedPlayerControl
|
||||
killer.RpcMurderPlayer(target, true);
|
||||
}
|
||||
|
||||
/*
|
||||
public static void RpcMurderPlayerV2(this PlayerControl killer, PlayerControl target)
|
||||
{
|
||||
target.RemoveProtection();
|
||||
MessageWriter messageWriter = AmongUsClient.Instance.StartRpcImmediately(target.NetId, (byte)RpcCalls.MurderPlayer, SendOption.Reliable);
|
||||
messageWriter.WriteNetObject(target);
|
||||
messageWriter.Write((int)MurderResultFlags.FailedProtected);
|
||||
AmongUsClient.Instance.FinishRpcImmediately(messageWriter);
|
||||
|
||||
if (killer.AmOwner)
|
||||
{
|
||||
killer.RpcMurderPlayer(target, true);
|
||||
}
|
||||
else
|
||||
{
|
||||
killer.MurderPlayer(target, ResultFlags);
|
||||
MessageWriter messageWriter2 = AmongUsClient.Instance.StartRpcImmediately(killer.NetId, (byte)RpcCalls.MurderPlayer, SendOption.Reliable);
|
||||
messageWriter2.WriteNetObject(target);
|
||||
messageWriter2.Write((int)ResultFlags);
|
||||
AmongUsClient.Instance.FinishRpcImmediately(messageWriter2);
|
||||
}
|
||||
target.Data.IsDead = true;
|
||||
|
||||
NotifyRoles(SpecifySeer: killer, SpecifyTarget: target);
|
||||
NotifyRoles(SpecifySeer: target);
|
||||
}
|
||||
*/
|
||||
public static bool RpcCheckAndMurder(this PlayerControl killer, PlayerControl target, bool check = false) => CheckMurderPatch.RpcCheckAndMurder(killer, target, check);
|
||||
|
||||
public static void NoCheckStartMeeting(this PlayerControl reporter, GameData.PlayerInfo target, bool force = false)
|
||||
@@ -979,7 +881,7 @@ static class ExtendedPlayerControl
|
||||
|
||||
public static void SetRealKiller(this PlayerControl target, PlayerControl killer, bool NotOverRide = false)
|
||||
{
|
||||
if (target == null)
|
||||
if (target is null || !target)
|
||||
{
|
||||
Logger.Info("target is null", "SetRealKiller");
|
||||
return;
|
||||
@@ -987,7 +889,7 @@ static class ExtendedPlayerControl
|
||||
|
||||
var State = Main.PlayerStates[target.PlayerId];
|
||||
if (State.RealKiller.TIMESTAMP != DateTime.MinValue && NotOverRide) return; // Do not overwrite if value already exists
|
||||
byte killerId = killer == null ? byte.MaxValue : killer.PlayerId;
|
||||
byte killerId = killer is null || !killer ? byte.MaxValue : killer.PlayerId;
|
||||
RPC.SetRealKiller(target.PlayerId, killerId);
|
||||
}
|
||||
|
||||
@@ -1036,7 +938,7 @@ static class ExtendedPlayerControl
|
||||
public static bool IsAlive(this PlayerControl target)
|
||||
{
|
||||
// If target is not null and cannot be obtained, it is assumed to be alive because it has not been registered
|
||||
if (target == null || target.Is(CustomRoles.GM)) return false;
|
||||
if (target is null || !target || target.Is(CustomRoles.GM)) return false;
|
||||
return GameStates.IsLobby || !Main.PlayerStates.TryGetValue(target.PlayerId, out var ps) || !ps.IsDead;
|
||||
}
|
||||
|
||||
|
||||
@@ -49,7 +49,7 @@ public abstract class GameOptionsSender
|
||||
{
|
||||
for (byte i = 0; i < GameManager.Instance.LogicComponents.Count; i++)
|
||||
{
|
||||
var logicComponent = GameManager.Instance.LogicComponents[i];
|
||||
var logicComponent = GameManager.Instance.LogicComponents[(Index)i];
|
||||
if (logicComponent.TryCast<LogicOptions>(out _))
|
||||
{
|
||||
SendOptionsArray(optionArray, i, -1);
|
||||
|
||||
@@ -106,7 +106,7 @@ public class PlayerGameOptionsSender(PlayerControl player) : GameOptionsSender
|
||||
{
|
||||
for (byte i = 0; i < GameManager.Instance.LogicComponents.Count; i++)
|
||||
{
|
||||
var logicComponent = GameManager.Instance.LogicComponents[i];
|
||||
var logicComponent = GameManager.Instance.LogicComponents[(Index)i];
|
||||
if (logicComponent.TryCast<LogicOptions>(out _))
|
||||
{
|
||||
SendOptionsArray(optionArray, i, player.GetClientId());
|
||||
|
||||
@@ -246,7 +246,7 @@ public class PlayerState(byte playerId)
|
||||
if (role is CustomRoles.Flashman or CustomRoles.Dynamo)
|
||||
{
|
||||
Main.AllPlayerSpeed[PlayerId] = Main.RealOptionsData.GetFloat(FloatOptionNames.PlayerSpeedMod);
|
||||
Utils.GetPlayerById(PlayerId).MarkDirtySettings();
|
||||
PlayerGameOptionsSender.SetDirty(PlayerId);
|
||||
}
|
||||
|
||||
Utils.SendRPC(CustomRPC.RemoveSubRole, PlayerId, 1, (int)role);
|
||||
|
||||
@@ -340,7 +340,9 @@ public static class GuessManager
|
||||
{
|
||||
if (!isUI) Utils.SendMessage(GetString("GuessOnbound"), pc.PlayerId);
|
||||
else pc.ShowPopUp(GetString("GuessOnbound"));
|
||||
return true;
|
||||
|
||||
if (Onbound.GuesserSuicides.GetBool()) guesserSuicide = true;
|
||||
else return true;
|
||||
}
|
||||
|
||||
if (target.Is(CustomRoles.Lovers) && Lovers.GuessAbility.GetValue() == 0)
|
||||
|
||||
@@ -328,9 +328,6 @@ public static class Options
|
||||
public static OptionItem CrewpostorKillAfterTask;
|
||||
public static OptionItem CrewpostorLungeKill;
|
||||
public static OptionItem ObliviousBaitImmune;
|
||||
public static OptionItem ImpCanBeInLove;
|
||||
public static OptionItem CrewCanBeInLove;
|
||||
public static OptionItem NeutralCanBeInLove;
|
||||
public static OptionItem UnluckyTaskSuicideChance;
|
||||
public static OptionItem UnluckyKillSuicideChance;
|
||||
public static OptionItem UnluckyVentSuicideChance;
|
||||
@@ -698,9 +695,6 @@ public static class Options
|
||||
public static OptionItem MadSnitchTasks;
|
||||
public static OptionItem FlashmanSpeed;
|
||||
public static OptionItem GiantSpeed;
|
||||
public static OptionItem LoverSpawnChances;
|
||||
public static OptionItem LoverKnowRoles;
|
||||
public static OptionItem LoverSuicide;
|
||||
public static OptionItem ImpEgoistVisibalToAllies;
|
||||
public static OptionItem TicketsPerKill;
|
||||
public static OptionItem DualVotes;
|
||||
|
||||
+4
-6
@@ -811,7 +811,7 @@ public static class Utils
|
||||
|
||||
return __instance.Is(CustomRoles.Madmate) && PlayerControl.LocalPlayer.Is(CustomRoles.Madmate) && Options.MadmateKnowWhosMadmate.GetBool() ||
|
||||
__instance.Is(CustomRoles.Mimic) && Main.VisibleTasksCount && __instance.Data.IsDead ||
|
||||
__instance.Is(CustomRoles.Lovers) && PlayerControl.LocalPlayer.Is(CustomRoles.Lovers) && Options.LoverKnowRoles.GetBool() ||
|
||||
__instance.Is(CustomRoles.Lovers) && PlayerControl.LocalPlayer.Is(CustomRoles.Lovers) && Lovers.LoverKnowRoles.GetBool() ||
|
||||
__instance.Is(CustomRoles.Madmate) && PlayerControl.LocalPlayer.Is(CustomRoleTypes.Impostor) && Options.ImpKnowWhosMadmate.GetBool() ||
|
||||
__instance.Is(CustomRoleTypes.Impostor) && PlayerControl.LocalPlayer.Is(CustomRoles.Crewpostor) && Options.AlliesKnowCrewpostor.GetBool() ||
|
||||
__instance.Is(CustomRoleTypes.Impostor) && PlayerControl.LocalPlayer.Is(CustomRoleTypes.Impostor) && Options.ImpKnowAlliesRole.GetBool() ||
|
||||
@@ -1926,12 +1926,10 @@ public static class Utils
|
||||
const string iconTextLeft = "<color=#ffffff>\u21e8</color>";
|
||||
const string iconTextRight = "<color=#ffffff>\u21e6</color>";
|
||||
const string roleNameUp = "</size><size=1350%>\n \n</size>";
|
||||
|
||||
string selfTeamName = $"<size=450%>{iconTextLeft} <font=\"VCR SDF\" material=\"VCR Black Outline\">{ColorString(seerTeam.GetTeamColor(), $"{seerTeam}")}</font> {iconTextRight}</size><size=900%>\n \n</size>";
|
||||
SelfName = $"{ColorString(seer.GetRoleColor(), seer.GetRealName())}";
|
||||
SelfName = $"{selfTeamName}\r\n{seer.GetCustomRole().ToColoredString()}{roleNameUp}";
|
||||
|
||||
SelfName = $"{selfTeamName}\r\n{seer.GetDisplayRoleName()}\r\n{SelfName}{roleNameUp}";
|
||||
|
||||
// Privately set name
|
||||
seer.RpcSetNamePrivate(SelfName, true, seer);
|
||||
continue;
|
||||
}
|
||||
@@ -2209,7 +2207,7 @@ public static class Utils
|
||||
(seer.Data.IsDead && Options.GhostCanSeeOtherRoles.GetBool()) ||
|
||||
(seer.Is(CustomRoles.Mimic) && target.Data.IsDead && Options.MimicCanSeeDeadRoles.GetBool()) ||
|
||||
(target.Is(CustomRoles.Gravestone) && target.Data.IsDead) ||
|
||||
(seer.Is(CustomRoles.Lovers) && target.Is(CustomRoles.Lovers) && Options.LoverKnowRoles.GetBool()) ||
|
||||
(seer.Is(CustomRoles.Lovers) && target.Is(CustomRoles.Lovers) && Lovers.LoverKnowRoles.GetBool()) ||
|
||||
(seer.Is(CustomRoleTypes.Impostor) && target.Is(CustomRoleTypes.Impostor) && Options.ImpKnowAlliesRole.GetBool()) ||
|
||||
(seer.Is(CustomRoles.Madmate) && target.Is(CustomRoleTypes.Impostor) && Options.MadmateKnowWhosImp.GetBool()) ||
|
||||
(seer.Is(CustomRoleTypes.Impostor) && target.Is(CustomRoles.Madmate) && Options.ImpKnowWhosMadmate.GetBool()) ||
|
||||
|
||||
+19
-11
@@ -1,6 +1,7 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using AmongUs.GameOptions;
|
||||
using EHR.Modules;
|
||||
using EHR.Roles.AddOns.Common;
|
||||
using EHR.Roles.Crewmate;
|
||||
@@ -29,7 +30,7 @@ class HudManagerPatch
|
||||
|
||||
if (!GameStates.IsModHost) return;
|
||||
var player = PlayerControl.LocalPlayer;
|
||||
if (player == null) return;
|
||||
if (player is null || !player) return;
|
||||
|
||||
if (Input.GetKeyDown(KeyCode.LeftControl))
|
||||
{
|
||||
@@ -47,19 +48,19 @@ class HudManagerPatch
|
||||
}
|
||||
}
|
||||
|
||||
if (__instance == null) return;
|
||||
if (__instance is null || !__instance) return;
|
||||
|
||||
if (GameStates.IsLobby)
|
||||
{
|
||||
var POM = GameObject.Find("PlayerOptionsMenu(Clone)");
|
||||
__instance.GameSettings.text = POM != null ? string.Empty : OptionShower.GetTextNoFresh();
|
||||
__instance.GameSettings.text = POM is not null && POM ? string.Empty : OptionShower.GetTextNoFresh();
|
||||
__instance.GameSettings.fontSizeMin =
|
||||
__instance.GameSettings.fontSizeMax = 1f;
|
||||
}
|
||||
|
||||
if (AmongUsClient.Instance.AmHost)
|
||||
{
|
||||
if (OverriddenRolesText == null)
|
||||
if (OverriddenRolesText is null || !OverriddenRolesText)
|
||||
{
|
||||
OverriddenRolesText = Object.Instantiate(__instance.KillButton.cooldownTimerText, __instance.transform, true);
|
||||
OverriddenRolesText.alignment = TextAlignmentOptions.Right;
|
||||
@@ -79,7 +80,7 @@ class HudManagerPatch
|
||||
{
|
||||
var pc = Utils.GetPlayerById(item.Key);
|
||||
string prefix = first ? string.Empty : "\n";
|
||||
string text = $"{prefix}{(item.Key == 0 ? "Host" : $"{(pc == null ? $"ID {item.Key}" : $"{pc.GetRealName()}")}")} - <color={Main.RoleColors.GetValueOrDefault(item.Value, "#ffffff")}>{GetString(item.Value.ToString())}</color>";
|
||||
string text = $"{prefix}{(item.Key == 0 ? "Host" : $"{(pc is null || !pc ? $"ID {item.Key}" : $"{pc.GetRealName()}")}")} - <color={Main.RoleColors.GetValueOrDefault(item.Value, "#ffffff")}>{GetString(item.Value.ToString())}</color>";
|
||||
resultText[item.Key] = text;
|
||||
first = false;
|
||||
}
|
||||
@@ -98,7 +99,7 @@ class HudManagerPatch
|
||||
else
|
||||
{
|
||||
string prefix = first ? string.Empty : "\n";
|
||||
string text = $"{prefix}{(item.Key == 0 ? "Host" : $"{(pc == null ? $"ID {item.Key}" : $"{pc.GetRealName()}")}")} - <#ffffff>(</color><color={Main.RoleColors.GetValueOrDefault(role, "#ffffff")}>{GetString(role.ToString())}</color><#ffffff>)</color>";
|
||||
string text = $"{prefix}{(item.Key == 0 ? "Host" : $"{(pc is null || !pc ? $"ID {item.Key}" : $"{pc.GetRealName()}")}")} - <#ffffff>(</color><color={Main.RoleColors.GetValueOrDefault(role, "#ffffff")}>{GetString(role.ToString())}</color><#ffffff>)</color>";
|
||||
resultText[item.Key] = text;
|
||||
first = false;
|
||||
}
|
||||
@@ -185,7 +186,7 @@ class HudManagerPatch
|
||||
break;
|
||||
}
|
||||
|
||||
if (LowerInfoText == null)
|
||||
if (LowerInfoText is null || !LowerInfoText)
|
||||
{
|
||||
LowerInfoText = Object.Instantiate(__instance.KillButton.cooldownTimerText, __instance.transform, true);
|
||||
LowerInfoText.alignment = TextAlignmentOptions.Center;
|
||||
@@ -308,7 +309,14 @@ class ActionButtonSetFillUpPatch
|
||||
{
|
||||
if (__instance.isCoolingDown && timer is <= 90f and > 0f)
|
||||
{
|
||||
var color = PlayerControl.LocalPlayer.IsShifted() ? Color.green : Color.white;
|
||||
var roleType = PlayerControl.LocalPlayer.GetRoleTypes();
|
||||
var usingAbility = roleType switch
|
||||
{
|
||||
RoleTypes.Engineer => PlayerControl.LocalPlayer.inVent || VentButtonDoClickPatch.Animating,
|
||||
RoleTypes.Shapeshifter => PlayerControl.LocalPlayer.IsShifted(),
|
||||
_ => false
|
||||
};
|
||||
var color = usingAbility ? Color.green : Color.white;
|
||||
__instance.cooldownTimerText.text = Utils.ColorString(color, Mathf.CeilToInt(timer).ToString());
|
||||
__instance.cooldownTimerText.gameObject.SetActive(true);
|
||||
}
|
||||
@@ -568,9 +576,9 @@ class TaskPanelBehaviourPatch
|
||||
var lpc = PlayerControl.LocalPlayer;
|
||||
|
||||
AllText += "\r\n";
|
||||
AllText += $"\r\n{GetString("PVP.ATK")}: {lpc.ATK()}";
|
||||
AllText += $"\r\n{GetString("PVP.DF")}: {lpc.DF()}";
|
||||
AllText += $"\r\n{GetString("PVP.RCO")}: {lpc.HPRECO()}";
|
||||
AllText += $"\r\n{GetString("PVP.ATK")}: {SoloKombatManager.PlayerATK[lpc.PlayerId]}";
|
||||
AllText += $"\r\n{GetString("PVP.DF")}: {SoloKombatManager.PlayerDF[lpc.PlayerId]}";
|
||||
AllText += $"\r\n{GetString("PVP.RCO")}: {SoloKombatManager.PlayerHPReco[lpc.PlayerId]}";
|
||||
AllText += "\r\n";
|
||||
|
||||
Dictionary<byte, string> SummaryText = [];
|
||||
|
||||
@@ -3,6 +3,7 @@ using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using EHR.Modules;
|
||||
using EHR.Roles.AddOns.Common;
|
||||
using EHR.Roles.Crewmate;
|
||||
using EHR.Roles.Impostor;
|
||||
using EHR.Roles.Neutral;
|
||||
@@ -796,7 +797,7 @@ class MeetingHudStartPatch
|
||||
(Main.VisibleTasksCount && PlayerControl.LocalPlayer.Data.IsDead && Options.GhostCanSeeOtherRoles.GetBool()) ||
|
||||
(PlayerControl.LocalPlayer.Is(CustomRoles.Mimic) && Main.VisibleTasksCount && pc.Data.IsDead && Options.MimicCanSeeDeadRoles.GetBool()) ||
|
||||
(pc.Is(CustomRoles.Gravestone) && Main.VisibleTasksCount && pc.Data.IsDead) ||
|
||||
(pc.Is(CustomRoles.Lovers) && PlayerControl.LocalPlayer.Is(CustomRoles.Lovers) && Options.LoverKnowRoles.GetBool()) ||
|
||||
(pc.Is(CustomRoles.Lovers) && PlayerControl.LocalPlayer.Is(CustomRoles.Lovers) && Lovers.LoverKnowRoles.GetBool()) ||
|
||||
(pc.Is(CustomRoleTypes.Impostor) && PlayerControl.LocalPlayer.Is(CustomRoleTypes.Impostor) && Options.ImpKnowAlliesRole.GetBool()) ||
|
||||
(pc.Is(CustomRoleTypes.Impostor) && PlayerControl.LocalPlayer.Is(CustomRoles.Madmate) && Options.MadmateKnowWhosImp.GetBool()) ||
|
||||
(pc.Is(CustomRoles.Madmate) && PlayerControl.LocalPlayer.Is(CustomRoleTypes.Impostor) && Options.ImpKnowWhosMadmate.GetBool()) ||
|
||||
|
||||
@@ -494,7 +494,7 @@ internal class SelectRolesPatch
|
||||
}
|
||||
}
|
||||
|
||||
if (!overrideLovers && CustomRoles.Lovers.IsEnable() && (CustomRoles.FFF.IsEnable() ? -1 : rd.Next(1, 100)) <= Options.LoverSpawnChances.GetInt()) AssignLoversRolesFromList();
|
||||
if (!overrideLovers && CustomRoles.Lovers.IsEnable() && (CustomRoles.FFF.IsEnable() ? -1 : rd.Next(1, 100)) <= Lovers.LoverSpawnChances.GetInt()) AssignLoversRolesFromList();
|
||||
|
||||
var aapc = Main.AllAlivePlayerControls;
|
||||
AddonRolesList
|
||||
@@ -715,7 +715,7 @@ internal class SelectRolesPatch
|
||||
return;
|
||||
}
|
||||
|
||||
var allPlayers = Main.AllPlayerControls.Where(pc => !pc.Is(CustomRoles.GM) && (!pc.HasSubRole() || pc.GetCustomSubRoles().Count < Options.NoLimitAddonsNumMax.GetInt()) && !pc.Is(CustomRoles.Dictator) && !pc.Is(CustomRoles.God) && !pc.Is(CustomRoles.FFF) && !pc.Is(CustomRoles.Bomber) && !pc.Is(CustomRoles.Nuker) && !pc.Is(CustomRoles.Provocateur) && (!pc.IsCrewmate() || Options.CrewCanBeInLove.GetBool()) && (!pc.GetCustomRole().IsNeutral() || Options.NeutralCanBeInLove.GetBool()) && (!pc.GetCustomRole().IsImpostor() || Options.ImpCanBeInLove.GetBool())).ToList();
|
||||
var allPlayers = Main.AllPlayerControls.Where(pc => !pc.Is(CustomRoles.GM) && (!pc.HasSubRole() || pc.GetCustomSubRoles().Count < Options.NoLimitAddonsNumMax.GetInt()) && !pc.Is(CustomRoles.Dictator) && !pc.Is(CustomRoles.God) && !pc.Is(CustomRoles.FFF) && !pc.Is(CustomRoles.Bomber) && !pc.Is(CustomRoles.Nuker) && !pc.Is(CustomRoles.Provocateur) && (!pc.IsCrewmate() || Lovers.CrewCanBeInLove.GetBool()) && (!pc.GetCustomRole().IsNeutral() || Lovers.NeutralCanBeInLove.GetBool()) && (!pc.GetCustomRole().IsImpostor() || Lovers.ImpCanBeInLove.GetBool())).ToList();
|
||||
const CustomRoles role = CustomRoles.Lovers;
|
||||
var count = Math.Clamp(RawCount, 0, allPlayers.Count);
|
||||
if (RawCount == -1) count = Math.Clamp(role.GetCount(), 0, allPlayers.Count);
|
||||
|
||||
@@ -1583,7 +1583,7 @@ class FixedUpdatePatch
|
||||
|
||||
public static void LoversSuicide(byte deathId = 0x7f, bool isExiled = false)
|
||||
{
|
||||
if (!Options.LoverSuicide.GetBool() || Main.IsLoversDead || !Main.LoversPlayers.Any(player => player.Data.IsDead && player.PlayerId == deathId)) return;
|
||||
if (!Lovers.LoverSuicide.GetBool() || Main.IsLoversDead || !Main.LoversPlayers.Any(player => player.Data.IsDead && player.PlayerId == deathId)) return;
|
||||
|
||||
Main.IsLoversDead = true;
|
||||
var partnerPlayer = Main.LoversPlayers.First(player => player.PlayerId != deathId && !player.Data.IsDead);
|
||||
|
||||
@@ -2941,6 +2941,7 @@
|
||||
"EnigmaClueLevelTitle": "Enigma Level Clue!",
|
||||
"EnigmaClueFriendCodeTitle": "Enigma Friend Code Clue!",
|
||||
"EnigmaClueTitle": "Enigma Clue!",
|
||||
"GuesserSuicides": "Guessers Suicide When Trying to Guess Players With <#BAAAE9>Onbound</color>",
|
||||
"PlagueDoctor": "Infection",
|
||||
"PlagueDoctorInfo": "Spread the infection!",
|
||||
"PlagueDoctorInfoLong": "(Neutrals):\\n(Plague Doctor from TOH)\\nThe Plague Doctor's goal is to infect every living player.\\nThey start by choosing one player to infect, after which anyone who spends a set\\namount of time in range of the infected player becomes infected themselves.\\nInfection progress is cumulative, and does not reset with distance or after meetings.",
|
||||
|
||||
@@ -8,10 +8,10 @@ namespace EHR.Roles.AddOns.Common
|
||||
|
||||
public void SetupCustomOption()
|
||||
{
|
||||
SetupAdtRoleOptions(15290, CustomRoles.Busy, canSetNum: true);
|
||||
BusyLongTasks = new IntegerOptionItem(15293, "BusyLongTasks", new(0, 90, 1), 1, TabGroup.Addons)
|
||||
SetupAdtRoleOptions(15290, CustomRoles.Busy, canSetNum: true, teamSpawnOptions: true);
|
||||
BusyLongTasks = new IntegerOptionItem(15296, "BusyLongTasks", new(0, 90, 1), 1, TabGroup.Addons)
|
||||
.SetParent(CustomRoleSpawnChances[CustomRoles.Busy]);
|
||||
BusyShortTasks = new IntegerOptionItem(15294, "BusyShortTasks", new(0, 90, 1), 1, TabGroup.Addons)
|
||||
BusyShortTasks = new IntegerOptionItem(15297, "BusyShortTasks", new(0, 90, 1), 1, TabGroup.Addons)
|
||||
.SetParent(CustomRoleSpawnChances[CustomRoles.Busy]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,8 +11,8 @@ namespace EHR.Roles.AddOns.Common
|
||||
|
||||
public void SetupCustomOption()
|
||||
{
|
||||
SetupAdtRoleOptions(15430, CustomRoles.Disco, canSetNum: true);
|
||||
DiscoChangeInterval = new IntegerOptionItem(15433, "DiscoChangeInterval", new(1, 90, 1), 5, TabGroup.Addons)
|
||||
SetupAdtRoleOptions(15430, CustomRoles.Disco, canSetNum: true, teamSpawnOptions: true);
|
||||
DiscoChangeInterval = new IntegerOptionItem(15436, "DiscoChangeInterval", new(1, 90, 1), 5, TabGroup.Addons)
|
||||
.SetParent(CustomRoleSpawnChances[CustomRoles.Disco])
|
||||
.SetValueFormat(OptionFormat.Seconds);
|
||||
}
|
||||
|
||||
@@ -6,8 +6,8 @@
|
||||
|
||||
public void SetupCustomOption()
|
||||
{
|
||||
Options.SetupAdtRoleOptions(18700, CustomRoles.Flashman, canSetNum: true, tab: TabGroup.Addons);
|
||||
Options.FlashmanSpeed = new FloatOptionItem(18703, "FlashmanSpeed", new(0.25f, 3f, 0.05f), 2.5f, TabGroup.Addons)
|
||||
Options.SetupAdtRoleOptions(18700, CustomRoles.Flashman, canSetNum: true, tab: TabGroup.Addons, teamSpawnOptions: true);
|
||||
Options.FlashmanSpeed = new FloatOptionItem(18706, "FlashmanSpeed", new(0.25f, 3f, 0.05f), 2.5f, TabGroup.Addons)
|
||||
.SetParent(Options.CustomRoleSpawnChances[CustomRoles.Flashman])
|
||||
.SetValueFormat(OptionFormat.Multiplier);
|
||||
}
|
||||
|
||||
@@ -11,7 +11,7 @@ namespace EHR.Roles.AddOns.Common
|
||||
|
||||
public void SetupCustomOption()
|
||||
{
|
||||
SetupAdtRoleOptions(19100, CustomRoles.Guesser, canSetNum: true, tab: TabGroup.Addons);
|
||||
SetupAdtRoleOptions(19100, CustomRoles.Guesser, canSetNum: true, tab: TabGroup.Addons, teamSpawnOptions: true);
|
||||
GCanGuessAdt = new BooleanOptionItem(19110, "GCanGuessAdt", false, TabGroup.Addons)
|
||||
.SetParent(CustomRoleSpawnChances[CustomRoles.Guesser]);
|
||||
GTryHideMsg = new BooleanOptionItem(19111, "GuesserTryHideMsg", true, TabGroup.Addons)
|
||||
|
||||
@@ -6,6 +6,12 @@ namespace EHR.Roles.AddOns.Common
|
||||
{
|
||||
public static bool IsChatActivated = false;
|
||||
|
||||
public static OptionItem LoverSpawnChances;
|
||||
public static OptionItem LoverKnowRoles;
|
||||
public static OptionItem LoverSuicide;
|
||||
public static OptionItem ImpCanBeInLove;
|
||||
public static OptionItem CrewCanBeInLove;
|
||||
public static OptionItem NeutralCanBeInLove;
|
||||
public static OptionItem LegacyLovers;
|
||||
public static OptionItem LovingImpostorSpawnChance;
|
||||
public static OptionItem PrivateChat;
|
||||
|
||||
@@ -2,11 +2,15 @@
|
||||
{
|
||||
public class Onbound : IAddon
|
||||
{
|
||||
public static OptionItem GuesserSuicides;
|
||||
public AddonTypes Type => AddonTypes.Mixed;
|
||||
|
||||
public void SetupCustomOption()
|
||||
{
|
||||
Options.SetupAdtRoleOptions(14500, CustomRoles.Onbound, canSetNum: true, teamSpawnOptions: true);
|
||||
GuesserSuicides = new BooleanOptionItem(14506, "GuesserSuicides", true, TabGroup.Addons)
|
||||
.SetParent(Options.CustomRoleSpawnChances[CustomRoles.Onbound])
|
||||
.SetGameMode(CustomGameMode.Standard);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -8,7 +8,7 @@ namespace EHR.Roles.AddOns.Common
|
||||
|
||||
public void SetupCustomOption()
|
||||
{
|
||||
SetupAdtRoleOptions(15600, CustomRoles.Rascal, canSetNum: true, tab: TabGroup.Addons);
|
||||
SetupAdtRoleOptions(15600, CustomRoles.Rascal, canSetNum: true, tab: TabGroup.Addons, teamSpawnOptions: true);
|
||||
RascalAppearAsMadmate = new BooleanOptionItem(15610, "RascalAppearAsMadmate", true, TabGroup.Addons)
|
||||
.SetParent(CustomRoleSpawnChances[CustomRoles.Rascal]);
|
||||
}
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
|
||||
public void SetupCustomOption()
|
||||
{
|
||||
Options.SetupAdtRoleOptions(15150, CustomRoles.Sleuth, canSetNum: true);
|
||||
Options.SetupAdtRoleOptions(15150, CustomRoles.Sleuth, canSetNum: true, teamSpawnOptions: true);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -9,7 +9,7 @@ namespace EHR.Roles.AddOns.Common
|
||||
|
||||
public void SetupCustomOption()
|
||||
{
|
||||
Options.SetupAdtRoleOptions(15180, CustomRoles.Stained, canSetNum: true);
|
||||
Options.SetupAdtRoleOptions(15180, CustomRoles.Stained, canSetNum: true, teamSpawnOptions: true);
|
||||
}
|
||||
|
||||
public static void OnDeath(PlayerControl pc, PlayerControl killer)
|
||||
|
||||
@@ -8,7 +8,7 @@ namespace EHR.Roles.AddOns.Common
|
||||
|
||||
public void SetupCustomOption()
|
||||
{
|
||||
SetupAdtRoleOptions(14200, CustomRoles.Torch, canSetNum: true);
|
||||
SetupAdtRoleOptions(14200, CustomRoles.Torch, canSetNum: true, teamSpawnOptions: true);
|
||||
TorchVision = new FloatOptionItem(14210, "TorchVision", new(0.5f, 5f, 0.25f), 1.25f, TabGroup.Addons)
|
||||
.SetParent(CustomRoleSpawnChances[CustomRoles.Torch])
|
||||
.SetValueFormat(OptionFormat.Multiplier);
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
|
||||
public void SetupCustomOption()
|
||||
{
|
||||
Options.SetupAdtRoleOptions(18800, CustomRoles.Youtuber, canSetNum: true, tab: TabGroup.Addons);
|
||||
Options.SetupAdtRoleOptions(18800, CustomRoles.Youtuber, canSetNum: true, tab: TabGroup.Addons, teamSpawnOptions: true);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user