Merge pull request #28 from D1GQ/dev

v1.1.1
This commit is contained in:
D1GQ authored and GitHub committed 2024-08-28 14:09:29 -05:00
commit e44890ea6f
28 files changed
+991 -280

No files matched your search

+1 -1
View File
@@ -247,7 +247,7 @@ class AntiCheat
if (reader.BytesRemaining > 0) if (reader.BytesRemaining > 0)
{ {
uint level = reader.ReadPackedUInt32(); uint level = reader.ReadPackedUInt32();
if (level >= BetterGameSettings.DetectedLevelAbove.GetInt()) if (level > BetterGameSettings.DetectedLevelAbove.GetInt())
{ {
BetterNotificationManager.NotifyCheat(player, $"Invalid Level: {level}"); BetterNotificationManager.NotifyCheat(player, $"Invalid Level: {level}");
Logger.LogCheat($"{player.BetterData().RealName} {Enum.GetName((RpcCalls)callId)}: {level >= 200}"); Logger.LogCheat($"{player.BetterData().RealName} {Enum.GetName((RpcCalls)callId)}: {level >= 200}");
+33 -12
View File
@@ -173,46 +173,67 @@ class BetterDataManager
return false; return false;
} }
public static bool LoadBoolSetting(int id) public static bool LoadBoolSetting(int id, bool Default = false)
{ {
string filePath = SettingsFile; string filePath = SettingsFile;
string json = File.ReadAllText(filePath); string json = File.ReadAllText(filePath);
var jsonData = JsonSerializer.Deserialize<Dictionary<string, string>>(json) ?? new Dictionary<string, string>(); var jsonData = JsonSerializer.Deserialize<Dictionary<string, string>>(json) ?? new Dictionary<string, string>();
if (jsonData.ContainsKey(id.ToString())) try
{ {
return bool.Parse(jsonData[id.ToString()]); if (jsonData.ContainsKey(id.ToString()))
{
return bool.Parse(jsonData[id.ToString()]);
}
}
catch
{
SaveSetting(id, Default.ToString());
} }
return false; return Default;
} }
public static float LoadFloatSetting(int id) public static float LoadFloatSetting(int id, float Default = 0f)
{ {
string filePath = SettingsFile; string filePath = SettingsFile;
string json = File.ReadAllText(filePath); string json = File.ReadAllText(filePath);
var jsonData = JsonSerializer.Deserialize<Dictionary<string, string>>(json) ?? new Dictionary<string, string>(); var jsonData = JsonSerializer.Deserialize<Dictionary<string, string>>(json) ?? new Dictionary<string, string>();
if (jsonData.ContainsKey(id.ToString())) try
{ {
return float.Parse(jsonData[id.ToString()]); if (jsonData.ContainsKey(id.ToString()))
{
return float.Parse(jsonData[id.ToString()]);
}
}
catch
{
SaveSetting(id, Default.ToString());
} }
return -1f; return Default;
} }
public static int LoadIntSetting(int id) public static int LoadIntSetting(int id, int Default = 0)
{ {
string filePath = SettingsFile; string filePath = SettingsFile;
string json = File.ReadAllText(filePath); string json = File.ReadAllText(filePath);
var jsonData = JsonSerializer.Deserialize<Dictionary<string, string>>(json) ?? new Dictionary<string, string>(); var jsonData = JsonSerializer.Deserialize<Dictionary<string, string>>(json) ?? new Dictionary<string, string>();
if (jsonData.ContainsKey(id.ToString())) try
{ {
return int.Parse(jsonData[id.ToString()]); if (jsonData.ContainsKey(id.ToString()))
{
return int.Parse(jsonData[id.ToString()]);
}
}
catch
{
SaveSetting(id, Default.ToString());
} }
return -1; return Default;
} }
public static void SaveBanList(string friendCode = "", string hashPUID = "") public static void SaveBanList(string friendCode = "", string hashPUID = "")
+77 -50
View File
@@ -206,77 +206,104 @@ class BetterHostManager
foreach (PlayerControl target in Main.AllPlayerControls) foreach (PlayerControl target in Main.AllPlayerControls)
{ {
if (target == null || target == PlayerControl.LocalPlayer || target.BetterData().IsBetterUser) continue; if (target == null || target == PlayerControl.LocalPlayer) continue;
string NewName = player.CurrentOutfit.PlayerName; string NewName = player.CurrentOutfit.PlayerName;
StringBuilder sbTopTag = new StringBuilder(); StringBuilder sbTopTag = new StringBuilder();
StringBuilder sbTopInfo = new StringBuilder();
if (GameStates.IsLobby) if (!player.BetterData().IsBetterUser)
{ {
NewName = player.Data.PlayerName; if (GameStates.IsLobby)
if (player.IsHost())
NewName = player.GetPlayerNameAndColor();
if (player.IsDev())
sbTopTag.Append("<color=#6e6e6e>(<color=#0088ff>Dev</color>)</color>+++");
if (player == PlayerControl.LocalPlayer)
sbTopTag.Append($"<color=#0dff00>Better Host</color>+++");
else if (player.BetterData().IsBetterUser)
sbTopTag.Append("<color=#0dff00>Better User</color>+++");
}
else if (GameStates.IsInGamePlay && !GameStates.IsHideNSeek)
{
string Role = $"<color={player.GetTeamHexColor()}>{player.GetRoleName()}</color>";
if (!player.IsImpostorTeam() && player.myTasks.Count > 0)
{ {
Role += $" <color=#cbcbcb>({player.Data.Tasks.ToArray().Where(task => task.Complete).Count()}/{player.Data.Tasks.Count})</color>"; NewName = player.Data.PlayerName;
if (player.IsHost())
NewName = player.GetPlayerNameAndColor();
if (player.IsDev())
sbTopTag.Append("<color=#6e6e6e>(<color=#0088ff>Dev</color>)</color>+++");
if (player == PlayerControl.LocalPlayer)
sbTopTag.Append($"<color=#0dff00>Better Host</color>+++");
else if (player.BetterData().IsBetterUser)
sbTopTag.Append("<color=#0dff00>Better User</color>+++");
} }
if (player.IsImpostorTeam() is false || target.IsImpostorTeam() is false) else if (GameStates.IsInGamePlay && !GameStates.IsHideNSeek)
{ {
if (target.IsAlive() && player != target) string Role = $"<color={player.GetTeamHexColor()}>{player.GetRoleName()}</color>";
if (!player.IsImpostorTeam() && player.myTasks.Count > 0)
{ {
Role = ""; Role += $" <color=#cbcbcb>({player.Data.Tasks.ToArray().Where(task => task.Complete).Count()}/{player.Data.Tasks.Count})</color>";
}
if (player.IsImpostorTeam() is false || target.IsImpostorTeam() is false)
{
if (target.IsAlive() && player != target)
{
Role = "";
}
}
sbTopTag.Append($"{Role}+++");
}
else if (GameStates.IsInGamePlay)
{
if (player == target)
{
if (player.IsImpostorTeam())
{
sbTopTag.Append($"<color={Utils.GetTeamHexColor(RoleTeamTypes.Impostor)}>Seeker</color>+++");
}
else
{
sbTopTag.Append($"<color={Utils.GetTeamHexColor(RoleTeamTypes.Crewmate)}>Hider</color>+++");
}
} }
} }
sbTopTag.Append($"{Role}+++"); // Put +++ at the end of each tag
} static StringBuilder FormatInfo(StringBuilder source)
for (int i = 0; i < sbTopTag.ToString().Split("+++").Length; i++)
{
if (!string.IsNullOrEmpty(sbTopTag.ToString().Split("+++")[i]))
{ {
if (i < sbTopTag.ToString().Split("+++").Length) var sb = new StringBuilder();
if (source.Length > 0)
{ {
sbTopInfo.Append(sbTopTag.ToString().Split("+++")[i]); string text = source.ToString();
string[] parts = text.Split("+++");
for (int i = 0; i < parts.Length; i++)
{
if (!string.IsNullOrEmpty(Utils.RemoveHtmlText(parts[i])))
{
sb.Append(parts[i]);
if (i != parts.Length - 2)
{
sb.Append(" - ");
}
}
}
} }
if (i != sbTopTag.ToString().Split("+++").Length - 2)
return sb;
}
sbTopTag = FormatInfo(sbTopTag);
if (sbTopTag.Length > 0)
NewName = $"<size=65%>{sbTopTag}</size>\n{NewName}";
else
NewName = $"{NewName}";
// Don't send rpc if name is the same!
if (player.BetterData().LastNameSetFor.TryGetValue(target.PlayerId, out var lastName))
{
if (lastName == NewName || !force)
{ {
sbTopInfo.Append(" - "); return;
} }
} }
player.BetterData().LastNameSetFor[target.PlayerId] = NewName;
} }
if (sbTopInfo.Length > 0)
NewName = $"<size=65%>{sbTopInfo}</size>\n{NewName}";
else
NewName = $"{NewName}";
// Don't send rpc if name is the same!
if (player.BetterData().LastNameSetFor.TryGetValue(target.PlayerId, out var lastName))
{
if (lastName == NewName || !force)
{
return;
}
}
player.BetterData().LastNameSetFor[target.PlayerId] = NewName;
player.RpcSetNamePrivate(NewName, target); player.RpcSetNamePrivate(NewName, target);
Logger.Log($"Set {player.Data.PlayerName} name to {NewName.Replace("\n", "-")} for {target.Data.PlayerName}", "RPC"); Logger.Log($"Set {player.Data.PlayerName} name to {NewName.Replace("\n", "-")} for {target.Data.PlayerName}", "RPC");
} }
-5
View File
@@ -129,11 +129,6 @@ static class ExtendedPlayerControl
} }
// RPCs // RPCs
public static void RpcSendHostChat(this PlayerControl player, string text, string title = "<color=#ffffff><b>(<color=#00ff44>System Message</color>)</b>", bool sendToBetterUser = true)
{
if (player == null) return;
RPC.SendHostChatToPlayer(player, text, title, sendToBetterUser);
}
public static void RpcSetNamePrivate(this PlayerControl player, string name, PlayerControl target) public static void RpcSetNamePrivate(this PlayerControl player, string name, PlayerControl target)
{ {
if (player == null || target == null) return; if (player == null || target == null) return;
@@ -7,12 +7,17 @@ public class BetterOptionCheckboxItem : BetterOptionItem
private ToggleOption? ThisOption; private ToggleOption? ThisOption;
private bool? IsChecked; private bool? IsChecked;
public BetterOptionItem Create(int id, GameOptionsMenu gameOptionsMenu, string name, bool DefaultValue = true, BetterOptionItem Parent = null) public override bool ShowChildrenCondition() => IsChecked == true;
public override bool SelfShowCondition() => ShowCondition != null ? ShowCondition() : base.SelfShowCondition();
public Func<bool>? ShowCondition = null;
public BetterOptionItem Create(int id, GameOptionsMenu gameOptionsMenu, string name, bool DefaultValue = true, BetterOptionItem? Parent = null, Func<bool>? selfShowCondition = null)
{ {
Id = id; Id = id;
Tab = gameOptionsMenu; Tab = gameOptionsMenu;
Name = name; Name = name;
IsChecked = DefaultValue; IsChecked = DefaultValue;
ShowCondition = selfShowCondition;
if (gameOptionsMenu == null) if (gameOptionsMenu == null)
{ {
@@ -21,10 +26,17 @@ public class BetterOptionCheckboxItem : BetterOptionItem
} }
ToggleOption optionBehaviour = UnityEngine.Object.Instantiate<ToggleOption>(gameOptionsMenu.checkboxOrigin, Vector3.zero, Quaternion.identity, gameOptionsMenu.settingsContainer); ToggleOption optionBehaviour = UnityEngine.Object.Instantiate<ToggleOption>(gameOptionsMenu.checkboxOrigin, Vector3.zero, Quaternion.identity, gameOptionsMenu.settingsContainer);
optionBehaviour.transform.localPosition = new Vector3(0.952f, 2f - StaticSpacingNum * SpacingNum, -2f); optionBehaviour.transform.localPosition = new Vector3(0.952f, 2f, -2f);
SetUp(optionBehaviour); SetUp(optionBehaviour);
optionBehaviour.OnValueChanged = new Action<OptionBehaviour>((option) => ValueChanged(id, option)); optionBehaviour.OnValueChanged = new Action<OptionBehaviour>((option) => ValueChanged(id, option));
SpacingNum += StaticSpacingNumPlus;
optionBehaviour.LabelBackground.transform.localScale = new Vector3(1.6f, 0.78f);
optionBehaviour.LabelBackground.transform.SetLocalX(-2.4f);
optionBehaviour.TitleText.enableAutoSizing = false;
optionBehaviour.TitleText.transform.SetLocalX(-1.5f);
optionBehaviour.TitleText.alignment = TMPro.TextAlignmentOptions.Right;
optionBehaviour.TitleText.enableWordWrapping = false;
optionBehaviour.TitleText.fontSize = 2.5f;
// Set data // Set data
optionBehaviour.CheckMark.GetComponent<SpriteRenderer>().enabled = DefaultValue; optionBehaviour.CheckMark.GetComponent<SpriteRenderer>().enabled = DefaultValue;
@@ -35,6 +47,28 @@ public class BetterOptionCheckboxItem : BetterOptionItem
Load(DefaultValue); Load(DefaultValue);
BetterOptionItems.Add(this); BetterOptionItems.Add(this);
obj = optionBehaviour.gameObject;
if (Parent != null)
{
int Index = 1;
var tempParent = Parent;
while (tempParent.ThisParent != null)
{
tempParent = tempParent.ThisParent;
Index++;
}
optionBehaviour.LabelBackground.GetComponent<SpriteRenderer>().color -= new Color(0.25f, 0.25f, 0.25f, 0f) * Index;
optionBehaviour.LabelBackground.transform.localScale -= new Vector3(0.04f, 0f, 0f) * Index;
optionBehaviour.LabelBackground.transform.position += new Vector3(0.04f, 0f, 0f) * Index;
optionBehaviour.LabelBackground.transform.SetLocalZ(1f);
ThisParent = Parent;
IsChild = true;
Parent.ChildrenList.Add(this);
}
return this; return this;
} }
@@ -44,7 +78,7 @@ public class BetterOptionCheckboxItem : BetterOptionItem
{ {
if (ThisOption == null) return; if (ThisOption == null) return;
var Bool = BetterDataManager.LoadBoolSetting(Id); var Bool = BetterDataManager.LoadBoolSetting(Id, DefaultValue);
ThisOption.CheckMark.GetComponent<SpriteRenderer>().enabled = Bool; ThisOption.CheckMark.GetComponent<SpriteRenderer>().enabled = Bool;
IsChecked = Bool; IsChecked = Bool;
} }
@@ -79,5 +113,15 @@ public class BetterOptionCheckboxItem : BetterOptionItem
{ {
IsChecked = !IsChecked; IsChecked = !IsChecked;
BetterDataManager.SaveSetting(Id, IsChecked.ToString()); BetterDataManager.SaveSetting(Id, IsChecked.ToString());
if (IsParent || IsChild)
{
bool Bool = ShowChildrenCondition();
foreach (var item in ChildrenList)
{
item.obj.SetActive(Bool && item.SelfShowCondition());
}
UpdatePositions();
}
} }
} }
+58 -5
View File
@@ -5,14 +5,18 @@ namespace BetterAmongUs;
public class BetterOptionFloatItem : BetterOptionItem public class BetterOptionFloatItem : BetterOptionItem
{ {
private NumberOption? ThisOption;
public float CurrentValue; public float CurrentValue;
public FloatRange floatRange = new(0f, 180f); public FloatRange floatRange = new(0f, 180f);
public float Increment = 2.5f; public float Increment = 2.5f;
private NumberOption? ThisOption;
private string? PostFix; private string? PostFix;
private string? PreFix; private string? PreFix;
public BetterOptionItem Create(int id, GameOptionsMenu gameOptionsMenu, string name, float[] values, float DefaultValue, string preFix = "", string postFix = "", BetterOptionItem Parent = null) public override bool ShowChildrenCondition() => CurrentValue > floatRange.min;
public override bool SelfShowCondition() => ShowCondition != null ? ShowCondition() : base.SelfShowCondition();
public Func<bool>? ShowCondition = null;
public BetterOptionItem Create(int id, GameOptionsMenu gameOptionsMenu, string name, float[] values, float DefaultValue, string preFix = "", string postFix = "", BetterOptionItem? Parent = null, Func<bool>? selfShowCondition = null)
{ {
Id = id; Id = id;
floatRange = new(values[0], values[1]); floatRange = new(values[0], values[1]);
@@ -20,6 +24,7 @@ public class BetterOptionFloatItem : BetterOptionItem
if (DefaultValue < floatRange.min) DefaultValue = floatRange.min; if (DefaultValue < floatRange.min) DefaultValue = floatRange.min;
if (DefaultValue > floatRange.max) DefaultValue = floatRange.max; if (DefaultValue > floatRange.max) DefaultValue = floatRange.max;
CurrentValue = DefaultValue; CurrentValue = DefaultValue;
ShowCondition = selfShowCondition;
if (gameOptionsMenu == null) if (gameOptionsMenu == null)
{ {
@@ -30,10 +35,9 @@ public class BetterOptionFloatItem : BetterOptionItem
if (values.Length is < 3 or > 3) return null; if (values.Length is < 3 or > 3) return null;
NumberOption optionBehaviour = UnityEngine.Object.Instantiate<NumberOption>(gameOptionsMenu.numberOptionOrigin, Vector3.zero, Quaternion.identity, gameOptionsMenu.settingsContainer); NumberOption optionBehaviour = UnityEngine.Object.Instantiate<NumberOption>(gameOptionsMenu.numberOptionOrigin, Vector3.zero, Quaternion.identity, gameOptionsMenu.settingsContainer);
optionBehaviour.transform.localPosition = new Vector3(0.952f, 2f - StaticSpacingNum * SpacingNum, -2f); optionBehaviour.transform.localPosition = new Vector3(0.952f, 2f, -2f);
SetUp(optionBehaviour); SetUp(optionBehaviour);
optionBehaviour.OnValueChanged = new Action<OptionBehaviour>((option) => ValueChanged(id, option)); optionBehaviour.OnValueChanged = new Action<OptionBehaviour>((option) => ValueChanged(id, option));
SpacingNum += StaticSpacingNumPlus;
// Fix Game Crash // Fix Game Crash
foreach (RulesCategory rulesCategory in GameManager.Instance.GameSettingsList.AllCategories) foreach (RulesCategory rulesCategory in GameManager.Instance.GameSettingsList.AllCategories)
@@ -45,6 +49,16 @@ public class BetterOptionFloatItem : BetterOptionItem
optionBehaviour.MinusBtn.OnClick.RemoveAllListeners(); optionBehaviour.MinusBtn.OnClick.RemoveAllListeners();
optionBehaviour.PlusBtn.OnClick.AddListener(new Action(() => Increase())); optionBehaviour.PlusBtn.OnClick.AddListener(new Action(() => Increase()));
optionBehaviour.MinusBtn.OnClick.AddListener(new Action(() => Decrease())); optionBehaviour.MinusBtn.OnClick.AddListener(new Action(() => Decrease()));
optionBehaviour.PlusBtn.OnClick.AddListener(new Action(() => ValueChanged(id, optionBehaviour)));
optionBehaviour.MinusBtn.OnClick.AddListener(new Action(() => ValueChanged(id, optionBehaviour)));
optionBehaviour.LabelBackground.transform.localScale = new Vector3(1.6f, 0.78f);
optionBehaviour.LabelBackground.transform.SetLocalX(-2.4f);
optionBehaviour.TitleText.enableAutoSizing = false;
optionBehaviour.TitleText.transform.SetLocalX(-1.5f);
optionBehaviour.TitleText.alignment = TMPro.TextAlignmentOptions.Right;
optionBehaviour.TitleText.enableWordWrapping = false;
optionBehaviour.TitleText.fontSize = 2.5f;
// Set data // Set data
Tab = gameOptionsMenu; Tab = gameOptionsMenu;
@@ -59,6 +73,28 @@ public class BetterOptionFloatItem : BetterOptionItem
AdjustButtonsActiveState(); AdjustButtonsActiveState();
BetterOptionItems.Add(this); BetterOptionItems.Add(this);
obj = optionBehaviour.gameObject;
if (Parent != null)
{
int Index = 1;
var tempParent = Parent;
while (tempParent.ThisParent != null)
{
tempParent = tempParent.ThisParent;
Index++;
}
optionBehaviour.LabelBackground.GetComponent<SpriteRenderer>().color -= new Color(0.25f, 0.25f, 0.25f, 0f) * Index;
optionBehaviour.LabelBackground.transform.localScale -= new Vector3(0.04f, 0f, 0f) * Index;
optionBehaviour.LabelBackground.transform.position += new Vector3(0.04f, 0f, 0f) * Index;
optionBehaviour.LabelBackground.transform.SetLocalZ(1f);
ThisParent = Parent;
IsChild = true;
Parent.ChildrenList.Add(this);
}
return this; return this;
} }
@@ -99,6 +135,10 @@ public class BetterOptionFloatItem : BetterOptionItem
{ {
CurrentValue += Increment * times; CurrentValue += Increment * times;
} }
else
{
CurrentValue = floatRange.max;
}
AdjustButtonsActiveState(); AdjustButtonsActiveState();
} }
@@ -115,6 +155,10 @@ public class BetterOptionFloatItem : BetterOptionItem
{ {
CurrentValue -= Increment * times; CurrentValue -= Increment * times;
} }
else
{
CurrentValue = floatRange.min;
}
AdjustButtonsActiveState(); AdjustButtonsActiveState();
} }
@@ -123,7 +167,7 @@ public class BetterOptionFloatItem : BetterOptionItem
{ {
if (BetterDataManager.CanLoadSetting(Id)) if (BetterDataManager.CanLoadSetting(Id))
{ {
var Float = BetterDataManager.LoadFloatSetting(Id); var Float = BetterDataManager.LoadFloatSetting(Id, DefaultValue);
if (Float > floatRange.max || Float < floatRange.min) if (Float > floatRange.max || Float < floatRange.min)
{ {
@@ -174,5 +218,14 @@ public class BetterOptionFloatItem : BetterOptionItem
public override void ValueChanged(int id, OptionBehaviour optionBehaviour) public override void ValueChanged(int id, OptionBehaviour optionBehaviour)
{ {
if (IsParent || IsChild)
{
bool Bool = ShowChildrenCondition();
foreach (var item in ChildrenList)
{
item.obj.SetActive(Bool && item.SelfShowCondition());
}
UpdatePositions();
}
} }
} }
+59 -6
View File
@@ -4,14 +4,18 @@ namespace BetterAmongUs;
public class BetterOptionIntItem : BetterOptionItem public class BetterOptionIntItem : BetterOptionItem
{ {
private NumberOption? ThisOption;
public int CurrentValue; public int CurrentValue;
public IntRange intRange = new(0, 180); public IntRange intRange = new(0, 180);
public int Increment = 1; public int Increment = 1;
private NumberOption? ThisOption;
private string? PostFix; private string? PostFix;
private string? PreFix; private string? PreFix;
public BetterOptionItem Create(int id, GameOptionsMenu gameOptionsMenu, string name, int[] values, int DefaultValue, string preFix = "", string postFix = "", BetterOptionItem Parent = null) public override bool ShowChildrenCondition() => CurrentValue > intRange.min;
public override bool SelfShowCondition() => ShowCondition != null ? ShowCondition() : base.SelfShowCondition();
public Func<bool>? ShowCondition = null;
public BetterOptionItem Create(int id, GameOptionsMenu gameOptionsMenu, string name, int[] values, int DefaultValue, string preFix = "", string postFix = "", BetterOptionItem? Parent = null, Func<bool>? selfShowCondition = null)
{ {
Id = id; Id = id;
intRange = new(values[0], values[1]); intRange = new(values[0], values[1]);
@@ -19,6 +23,7 @@ public class BetterOptionIntItem : BetterOptionItem
if (DefaultValue < intRange.min) DefaultValue = intRange.min; if (DefaultValue < intRange.min) DefaultValue = intRange.min;
if (DefaultValue > intRange.max) DefaultValue = intRange.max; if (DefaultValue > intRange.max) DefaultValue = intRange.max;
CurrentValue = DefaultValue; CurrentValue = DefaultValue;
ShowCondition = selfShowCondition;
if (gameOptionsMenu == null) if (gameOptionsMenu == null)
{ {
@@ -29,10 +34,9 @@ public class BetterOptionIntItem : BetterOptionItem
if (values.Length is < 3 or > 3) return null; if (values.Length is < 3 or > 3) return null;
NumberOption optionBehaviour = UnityEngine.Object.Instantiate<NumberOption>(gameOptionsMenu.numberOptionOrigin, Vector3.zero, Quaternion.identity, gameOptionsMenu.settingsContainer); NumberOption optionBehaviour = UnityEngine.Object.Instantiate<NumberOption>(gameOptionsMenu.numberOptionOrigin, Vector3.zero, Quaternion.identity, gameOptionsMenu.settingsContainer);
optionBehaviour.transform.localPosition = new Vector3(0.952f, 2f - StaticSpacingNum * SpacingNum, -2f); optionBehaviour.transform.localPosition = new Vector3(0.952f, 2f, -2f);
SetUp(optionBehaviour); SetUp(optionBehaviour);
optionBehaviour.OnValueChanged = new Action<OptionBehaviour>((option) => ValueChanged(id, option)); optionBehaviour.OnValueChanged = new Action<OptionBehaviour>((option) => ValueChanged(id, option));
SpacingNum += StaticSpacingNumPlus;
// Fix Game Crash // Fix Game Crash
foreach (RulesCategory rulesCategory in GameManager.Instance.GameSettingsList.AllCategories) foreach (RulesCategory rulesCategory in GameManager.Instance.GameSettingsList.AllCategories)
@@ -44,6 +48,16 @@ public class BetterOptionIntItem : BetterOptionItem
optionBehaviour.MinusBtn.OnClick.RemoveAllListeners(); optionBehaviour.MinusBtn.OnClick.RemoveAllListeners();
optionBehaviour.PlusBtn.OnClick.AddListener(new Action(() => Increase())); optionBehaviour.PlusBtn.OnClick.AddListener(new Action(() => Increase()));
optionBehaviour.MinusBtn.OnClick.AddListener(new Action(() => Decrease())); optionBehaviour.MinusBtn.OnClick.AddListener(new Action(() => Decrease()));
optionBehaviour.PlusBtn.OnClick.AddListener(new Action(() => ValueChanged(id, optionBehaviour)));
optionBehaviour.MinusBtn.OnClick.AddListener(new Action(() => ValueChanged(id, optionBehaviour)));
optionBehaviour.LabelBackground.transform.localScale = new Vector3(1.6f, 0.78f);
optionBehaviour.LabelBackground.transform.SetLocalX(-2.4f);
optionBehaviour.TitleText.enableAutoSizing = false;
optionBehaviour.TitleText.transform.SetLocalX(-1.5f);
optionBehaviour.TitleText.alignment = TMPro.TextAlignmentOptions.Right;
optionBehaviour.TitleText.enableWordWrapping = false;
optionBehaviour.TitleText.fontSize = 2.5f;
// Set data // Set data
Tab = gameOptionsMenu; Tab = gameOptionsMenu;
@@ -58,6 +72,28 @@ public class BetterOptionIntItem : BetterOptionItem
AdjustButtonsActiveState(); AdjustButtonsActiveState();
BetterOptionItems.Add(this); BetterOptionItems.Add(this);
obj = optionBehaviour.gameObject;
if (Parent != null)
{
int Index = 1;
var tempParent = Parent;
while (tempParent.ThisParent != null)
{
tempParent = tempParent.ThisParent;
Index++;
}
optionBehaviour.LabelBackground.GetComponent<SpriteRenderer>().color -= new Color(0.25f, 0.25f, 0.25f, 0f) * Index;
optionBehaviour.LabelBackground.transform.localScale -= new Vector3(0.04f, 0f, 0f) * Index;
optionBehaviour.LabelBackground.transform.position += new Vector3(0.04f, 0f, 0f) * Index;
optionBehaviour.LabelBackground.transform.SetLocalZ(1f);
ThisParent = Parent;
IsChild = true;
Parent.ChildrenList.Add(this);
}
return this; return this;
} }
@@ -98,6 +134,10 @@ public class BetterOptionIntItem : BetterOptionItem
{ {
CurrentValue += Increment * times; CurrentValue += Increment * times;
} }
else
{
CurrentValue = intRange.max;
}
AdjustButtonsActiveState(); AdjustButtonsActiveState();
} }
@@ -114,6 +154,10 @@ public class BetterOptionIntItem : BetterOptionItem
{ {
CurrentValue -= Increment * times; CurrentValue -= Increment * times;
} }
else
{
CurrentValue = intRange.min;
}
AdjustButtonsActiveState(); AdjustButtonsActiveState();
} }
@@ -122,7 +166,7 @@ public class BetterOptionIntItem : BetterOptionItem
{ {
if (BetterDataManager.CanLoadSetting(Id)) if (BetterDataManager.CanLoadSetting(Id))
{ {
var Int = BetterDataManager.LoadIntSetting(Id); var Int = BetterDataManager.LoadIntSetting(Id, DefaultValue);
if (Int > intRange.max || Int < intRange.min) if (Int > intRange.max || Int < intRange.min)
{ {
@@ -167,11 +211,20 @@ public class BetterOptionIntItem : BetterOptionItem
optionBehaviour.data = new BaseGameSetting optionBehaviour.data = new BaseGameSetting
{ {
Title = StringNames.None, Title = StringNames.None,
Type = OptionTypes.Float, Type = OptionTypes.Int,
}; };
} }
public override void ValueChanged(int id, OptionBehaviour optionBehaviour) public override void ValueChanged(int id, OptionBehaviour optionBehaviour)
{ {
if (IsParent || IsChild)
{
bool Bool = ShowChildrenCondition();
foreach (var item in ChildrenList)
{
item.obj.SetActive(Bool && item.SelfShowCondition());
}
UpdatePositions();
}
} }
} }
+61 -1
View File
@@ -1,4 +1,5 @@
using TMPro; using BetterAmongUs.Patches;
using TMPro;
using UnityEngine; using UnityEngine;
namespace BetterAmongUs; namespace BetterAmongUs;
@@ -7,6 +8,8 @@ public class BetterOptionItem
{ {
public float StaticSpacingNum => 1f; public float StaticSpacingNum => 1f;
public float StaticSpacingNumPlus => 0.45f; public float StaticSpacingNumPlus => 0.45f;
public static Dictionary<int, int> TempPlayerOptionData = [];
public static int TempPlayerOptionDataNum = 0;
public static List<BetterOptionItem> BetterOptionItems = []; public static List<BetterOptionItem> BetterOptionItems = [];
public static float SpacingNum = 0; public static float SpacingNum = 0;
@@ -16,6 +19,63 @@ public class BetterOptionItem
public OptionBehaviour? Option; public OptionBehaviour? Option;
public string? Name = "None"; public string? Name = "None";
public TextMeshPro? TitleText; public TextMeshPro? TitleText;
public GameObject? obj;
public BetterOptionItem? ThisParent;
public bool IsChild = false;
public bool IsParent => ChildrenList.Count > 0;
public List<BetterOptionItem> ChildrenList = [];
public virtual bool ShowChildrenCondition() => false;
public virtual bool SelfShowCondition() => true;
public static void UpdatePositions()
{
SpacingNum = 0f;
foreach (var item in BetterOptionItems)
{
try
{
item.obj.transform.SetLocalY(2f);
// Need to fix name not setting
if (item.ThisParent != null)
{
_ = new LateTask(() =>
{
item.obj.SetActive(item.ThisParent.ShowChildrenCondition() && item.SelfShowCondition() && item.ThisParent.Option.gameObject.active);
}, 0.005f, shoudLog: false);
if (!(item.ThisParent.ShowChildrenCondition() && item.SelfShowCondition() && item.ThisParent.Option.gameObject.active))
continue;
}
if (item is BetterOptionPlayerItem player)
{
player.Load();
}
SpacingNum += item switch
{
BetterOptionHeaderItem => 0.1f,
BetterOptionDividerItem => 0.15f,
_ => 0f,
};
item.obj.transform.SetLocalY(2f - 1f * SpacingNum);
SpacingNum += item switch
{
BetterOptionHeaderItem => 0.75f,
BetterOptionTitleItem => 0.50f,
_ => 0.45f,
};
}
catch { }
}
GameSettingMenuPatch.BetterSettingsTab.scrollBar.SetYBoundsMax(1.5f * SpacingNum / 2);
GameSettingMenuPatch.BetterSettingsTab.scrollBar.ScrollRelative(new(0f, 0f));
}
public void SetUp(OptionBehaviour optionBehaviour) public void SetUp(OptionBehaviour optionBehaviour)
{ {
@@ -0,0 +1,192 @@
using System.Dynamic;
using UnityEngine;
namespace BetterAmongUs;
public class BetterOptionPlayerItem : BetterOptionItem
{
private NumberOption? ThisOption;
public int CurrentIndex = -1;
public override bool ShowChildrenCondition() => CurrentIndex > -1;
public override bool SelfShowCondition() => ShowCondition != null ? ShowCondition() : base.SelfShowCondition();
public Func<bool>? ShowCondition = null;
public BetterOptionItem Create(GameOptionsMenu gameOptionsMenu, string name, BetterOptionItem? Parent = null, Func<bool>? selfShowCondition = null)
{
Id = TempPlayerOptionDataNum + 1;
Tab = gameOptionsMenu;
Name = name;
ShowCondition = selfShowCondition;
if (gameOptionsMenu == null)
{
return this;
}
NumberOption optionBehaviour = UnityEngine.Object.Instantiate<NumberOption>(gameOptionsMenu.numberOptionOrigin, Vector3.zero, Quaternion.identity, gameOptionsMenu.settingsContainer);
optionBehaviour.transform.localPosition = new Vector3(0.952f, 2f, -2f);
SetUp(optionBehaviour);
optionBehaviour.OnValueChanged = new Action<OptionBehaviour>((option) => ValueChanged(0, option));
// Fix Game Crash
foreach (RulesCategory rulesCategory in GameManager.Instance.GameSettingsList.AllCategories)
{
optionBehaviour.data = rulesCategory.AllGameSettings.ToArray().FirstOrDefault(item => item.Type == OptionTypes.Player);
}
optionBehaviour.PlusBtn.OnClick.RemoveAllListeners();
optionBehaviour.MinusBtn.OnClick.RemoveAllListeners();
optionBehaviour.PlusBtn.OnClick.AddListener(new Action(() => Increase()));
optionBehaviour.MinusBtn.OnClick.AddListener(new Action(() => Decrease()));
optionBehaviour.PlusBtn.OnClick.AddListener(new Action(() => ValueChanged(Id, optionBehaviour)));
optionBehaviour.MinusBtn.OnClick.AddListener(new Action(() => ValueChanged(Id, optionBehaviour)));
optionBehaviour.LabelBackground.transform.localScale = new Vector3(1.6f, 0.78f);
optionBehaviour.LabelBackground.transform.SetLocalX(-2.4f);
optionBehaviour.TitleText.enableAutoSizing = false;
optionBehaviour.TitleText.transform.SetLocalX(-1.5f);
optionBehaviour.TitleText.alignment = TMPro.TextAlignmentOptions.Right;
optionBehaviour.TitleText.enableWordWrapping = false;
optionBehaviour.TitleText.fontSize = 2.5f;
// Set data
TitleText = optionBehaviour.TitleText;
Option = optionBehaviour;
ThisOption = optionBehaviour;
Load();
BetterOptionItems.Add(this);
obj = optionBehaviour.gameObject;
if (Parent != null)
{
int Index = 1;
var tempParent = Parent;
while (tempParent.ThisParent != null)
{
tempParent = tempParent.ThisParent;
Index++;
}
optionBehaviour.LabelBackground.GetComponent<SpriteRenderer>().color -= new Color(0.25f, 0.25f, 0.25f, 0f) * Index;
optionBehaviour.LabelBackground.transform.localScale -= new Vector3(0.04f, 0f, 0f) * Index;
optionBehaviour.LabelBackground.transform.position += new Vector3(0.04f, 0f, 0f) * Index;
optionBehaviour.LabelBackground.transform.SetLocalZ(1f);
ThisParent = Parent;
IsChild = true;
Parent.ChildrenList.Add(this);
}
TempPlayerOptionDataNum++;
return this;
}
private void AdjustButtonsActiveState()
{
if (ThisOption == null) return;
if (CurrentIndex >= 0)
{
ThisOption.ValueText.text = Utils.PlayerFromId(CurrentIndex).GetPlayerNameAndColor();
}
else
{
ThisOption.ValueText.text = "<color=#ababab>Random</color>";
}
if (CurrentIndex >= Main.AllPlayerControls.Length - 1)
{
ThisOption.PlusBtn.SetInteractable(false);
ThisOption.MinusBtn.SetInteractable(true);
}
else if (CurrentIndex <= -1)
{
ThisOption.PlusBtn.SetInteractable(true);
ThisOption.MinusBtn.SetInteractable(false);
}
else
{
ThisOption.PlusBtn.SetInteractable(true);
ThisOption.MinusBtn.SetInteractable(true);
}
TempPlayerOptionData[Id] = CurrentIndex;
}
public void Increase()
{
if (CurrentIndex < Main.AllPlayerControls.Length)
{
CurrentIndex++;
AdjustButtonsActiveState();
}
}
public void Decrease()
{
if (CurrentIndex > -1)
{
CurrentIndex--;
AdjustButtonsActiveState();
}
}
public int Load()
{
if (TempPlayerOptionData.ContainsKey(Id))
{
var saveindex = TempPlayerOptionData[Id];
if (saveindex != -1 && Utils.PlayerFromId(saveindex) == null)
saveindex = Main.AllPlayerControls.Length - 1;
CurrentIndex = saveindex;
}
else
{
TempPlayerOptionData[Id] = -1;
CurrentIndex = TempPlayerOptionData[Id];
}
AdjustButtonsActiveState();
return CurrentIndex;
}
public override int GetValue()
{
if (SelfShowCondition())
{
return Load();
}
else
{
return -1;
}
}
public override void SetData(OptionBehaviour optionBehaviour)
{
optionBehaviour.data = new BaseGameSetting
{
Title = StringNames.None,
Type = OptionTypes.Int,
};
}
public override void ValueChanged(int id, OptionBehaviour optionBehaviour)
{
if (IsParent || IsChild)
{
bool Bool = ShowChildrenCondition();
foreach (var item in ChildrenList)
{
item.obj.SetActive(Bool && item.SelfShowCondition());
}
UpdatePositions();
}
}
}
+50 -5
View File
@@ -4,11 +4,15 @@ namespace BetterAmongUs;
public class BetterOptionStringItem : BetterOptionItem public class BetterOptionStringItem : BetterOptionItem
{ {
private StringOption? ThisOption;
public string[] Values = []; public string[] Values = [];
public int CurrentValue; public int CurrentValue;
private StringOption? ThisOption;
public BetterOptionItem Create(int id, GameOptionsMenu gameOptionsMenu, string name, string[] strings, int DefaultValue = 0, BetterOptionItem Parent = null) public override bool ShowChildrenCondition() => CurrentValue > 0;
public override bool SelfShowCondition() => ShowCondition != null ? ShowCondition() : base.SelfShowCondition();
public Func<bool>? ShowCondition = null;
public BetterOptionItem Create(int id, GameOptionsMenu gameOptionsMenu, string name, string[] strings, int DefaultValue = 0, BetterOptionItem? Parent = null, Func<bool>? selfShowCondition = null)
{ {
Id = id; Id = id;
Values = strings; Values = strings;
@@ -17,6 +21,7 @@ public class BetterOptionStringItem : BetterOptionItem
if (DefaultValue < 0) DefaultValue = 0; if (DefaultValue < 0) DefaultValue = 0;
if (DefaultValue > Values.Length) DefaultValue = Values.Length; if (DefaultValue > Values.Length) DefaultValue = Values.Length;
CurrentValue = DefaultValue; CurrentValue = DefaultValue;
ShowCondition = selfShowCondition;
if (gameOptionsMenu == null) if (gameOptionsMenu == null)
{ {
@@ -25,10 +30,9 @@ public class BetterOptionStringItem : BetterOptionItem
} }
StringOption optionBehaviour = UnityEngine.Object.Instantiate<StringOption>(gameOptionsMenu.stringOptionOrigin, Vector3.zero, Quaternion.identity, gameOptionsMenu.settingsContainer); StringOption optionBehaviour = UnityEngine.Object.Instantiate<StringOption>(gameOptionsMenu.stringOptionOrigin, Vector3.zero, Quaternion.identity, gameOptionsMenu.settingsContainer);
optionBehaviour.transform.localPosition = new Vector3(0.952f, 2f - StaticSpacingNum * SpacingNum, -2f); optionBehaviour.transform.localPosition = new Vector3(0.952f, 2f, -2f);
SetUp(optionBehaviour); SetUp(optionBehaviour);
optionBehaviour.OnValueChanged = new Action<OptionBehaviour>((option) => ValueChanged(id, option)); optionBehaviour.OnValueChanged = new Action<OptionBehaviour>((option) => ValueChanged(id, option));
SpacingNum += StaticSpacingNumPlus;
// Fix Game Crash // Fix Game Crash
foreach (RulesCategory rulesCategory in GameManager.Instance.GameSettingsList.AllCategories) foreach (RulesCategory rulesCategory in GameManager.Instance.GameSettingsList.AllCategories)
@@ -40,6 +44,16 @@ public class BetterOptionStringItem : BetterOptionItem
optionBehaviour.MinusBtn.OnClick.RemoveAllListeners(); optionBehaviour.MinusBtn.OnClick.RemoveAllListeners();
optionBehaviour.PlusBtn.OnClick.AddListener(new Action(() => Increase())); optionBehaviour.PlusBtn.OnClick.AddListener(new Action(() => Increase()));
optionBehaviour.MinusBtn.OnClick.AddListener(new Action(() => Decrease())); optionBehaviour.MinusBtn.OnClick.AddListener(new Action(() => Decrease()));
optionBehaviour.PlusBtn.OnClick.AddListener(new Action(() => ValueChanged(id, optionBehaviour)));
optionBehaviour.MinusBtn.OnClick.AddListener(new Action(() => ValueChanged(id, optionBehaviour)));
optionBehaviour.LabelBackground.transform.localScale = new Vector3(1.6f, 0.78f);
optionBehaviour.LabelBackground.transform.SetLocalX(-2.4f);
optionBehaviour.TitleText.enableAutoSizing = false;
optionBehaviour.TitleText.transform.SetLocalX(-1.5f);
optionBehaviour.TitleText.alignment = TMPro.TextAlignmentOptions.Right;
optionBehaviour.TitleText.enableWordWrapping = false;
optionBehaviour.TitleText.fontSize = 2.5f;
// Set data // Set data
TitleText = optionBehaviour.TitleText; TitleText = optionBehaviour.TitleText;
@@ -50,6 +64,28 @@ public class BetterOptionStringItem : BetterOptionItem
AdjustButtonsActiveState(); AdjustButtonsActiveState();
BetterOptionItems.Add(this); BetterOptionItems.Add(this);
obj = optionBehaviour.gameObject;
if (Parent != null)
{
int Index = 1;
var tempParent = Parent;
while (tempParent.ThisParent != null)
{
tempParent = tempParent.ThisParent;
Index++;
}
optionBehaviour.LabelBackground.GetComponent<SpriteRenderer>().color -= new Color(0.25f, 0.25f, 0.25f, 0f) * Index;
optionBehaviour.LabelBackground.transform.localScale -= new Vector3(0.04f, 0f, 0f) * Index;
optionBehaviour.LabelBackground.transform.position += new Vector3(0.04f, 0f, 0f) * Index;
optionBehaviour.LabelBackground.transform.SetLocalZ(1f);
ThisParent = Parent;
IsChild = true;
Parent.ChildrenList.Add(this);
}
return this; return this;
} }
@@ -103,7 +139,7 @@ public class BetterOptionStringItem : BetterOptionItem
{ {
if (BetterDataManager.CanLoadSetting(Id)) if (BetterDataManager.CanLoadSetting(Id))
{ {
var Int = BetterDataManager.LoadIntSetting(Id); var Int = BetterDataManager.LoadIntSetting(Id, DefaultValue);
if (Int > Values.Length - 1 || Int < 0) if (Int > Values.Length - 1 || Int < 0)
{ {
@@ -142,5 +178,14 @@ public class BetterOptionStringItem : BetterOptionItem
public override void ValueChanged(int id, OptionBehaviour optionBehaviour) public override void ValueChanged(int id, OptionBehaviour optionBehaviour)
{ {
if (IsParent || IsChild)
{
bool Bool = ShowChildrenCondition();
foreach (var item in ChildrenList)
{
item.obj.SetActive(Bool && item.SelfShowCondition());
}
UpdatePositions();
}
} }
} }
@@ -11,13 +11,11 @@ public class BetterOptionDividerItem : BetterOptionItem
return this; return this;
} }
SpacingNum += 0.15f;
Tab = gameOptionsMenu; Tab = gameOptionsMenu;
Name = "Divider"; Name = "Divider";
CategoryHeaderMasked categoryHeaderMasked = UnityEngine.Object.Instantiate<CategoryHeaderMasked>(gameOptionsMenu.categoryHeaderOrigin, Vector3.zero, Quaternion.identity, gameOptionsMenu.settingsContainer); CategoryHeaderMasked categoryHeaderMasked = UnityEngine.Object.Instantiate<CategoryHeaderMasked>(gameOptionsMenu.categoryHeaderOrigin, Vector3.zero, Quaternion.identity, gameOptionsMenu.settingsContainer);
categoryHeaderMasked.transform.localScale = Vector3.one * 0.63f; categoryHeaderMasked.transform.localScale = Vector3.one * 0.63f;
categoryHeaderMasked.transform.localPosition = new Vector3(-0.903f, 2f - StaticSpacingNum * SpacingNum, -2f); categoryHeaderMasked.transform.localPosition = new Vector3(-0.903f, 2f, -2f);
UnityEngine.Object.Destroy(categoryHeaderMasked.Background.gameObject); UnityEngine.Object.Destroy(categoryHeaderMasked.Background.gameObject);
UnityEngine.Object.Destroy(categoryHeaderMasked.Title.gameObject); UnityEngine.Object.Destroy(categoryHeaderMasked.Title.gameObject);
if (categoryHeaderMasked.Divider != null) if (categoryHeaderMasked.Divider != null)
@@ -25,7 +23,8 @@ public class BetterOptionDividerItem : BetterOptionItem
categoryHeaderMasked.Divider.material.SetInt(PlayerMaterial.MaskLayer, maskLayer); categoryHeaderMasked.Divider.material.SetInt(PlayerMaterial.MaskLayer, maskLayer);
} }
SpacingNum += 0.45f; BetterOptionItems.Add(this);
obj = categoryHeaderMasked.gameObject;
return this; return this;
} }
@@ -11,13 +11,11 @@ public class BetterOptionHeaderItem : BetterOptionItem
return this; return this;
} }
SpacingNum += 0.1f;
Tab = gameOptionsMenu; Tab = gameOptionsMenu;
Name = name; Name = name;
CategoryHeaderMasked categoryHeaderMasked = UnityEngine.Object.Instantiate<CategoryHeaderMasked>(gameOptionsMenu.categoryHeaderOrigin, Vector3.zero, Quaternion.identity, gameOptionsMenu.settingsContainer); CategoryHeaderMasked categoryHeaderMasked = UnityEngine.Object.Instantiate<CategoryHeaderMasked>(gameOptionsMenu.categoryHeaderOrigin, Vector3.zero, Quaternion.identity, gameOptionsMenu.settingsContainer);
categoryHeaderMasked.transform.localScale = Vector3.one * 0.63f; categoryHeaderMasked.transform.localScale = Vector3.one * 0.63f;
categoryHeaderMasked.transform.localPosition = new Vector3(-0.903f, 2f - StaticSpacingNum * SpacingNum, -2f); categoryHeaderMasked.transform.localPosition = new Vector3(-0.903f, 2f, -2f);
categoryHeaderMasked.Title.text = name; categoryHeaderMasked.Title.text = name;
categoryHeaderMasked.Background.material.SetInt(PlayerMaterial.MaskLayer, maskLayer); categoryHeaderMasked.Background.material.SetInt(PlayerMaterial.MaskLayer, maskLayer);
if (categoryHeaderMasked.Divider != null) if (categoryHeaderMasked.Divider != null)
@@ -27,7 +25,8 @@ public class BetterOptionHeaderItem : BetterOptionItem
categoryHeaderMasked.Title.fontMaterial.SetFloat("_StencilComp", 3f); categoryHeaderMasked.Title.fontMaterial.SetFloat("_StencilComp", 3f);
categoryHeaderMasked.Title.fontMaterial.SetFloat("_Stencil", maskLayer); categoryHeaderMasked.Title.fontMaterial.SetFloat("_Stencil", maskLayer);
SpacingNum += 0.75f; BetterOptionItems.Add(this);
obj = categoryHeaderMasked.gameObject;
return this; return this;
} }
@@ -12,9 +12,8 @@ public class BetterOptionTitleItem : BetterOptionItem
} }
ToggleOption optionBehaviour = UnityEngine.Object.Instantiate<ToggleOption>(gameOptionsMenu.checkboxOrigin, Vector3.zero, Quaternion.identity, gameOptionsMenu.settingsContainer); ToggleOption optionBehaviour = UnityEngine.Object.Instantiate<ToggleOption>(gameOptionsMenu.checkboxOrigin, Vector3.zero, Quaternion.identity, gameOptionsMenu.settingsContainer);
optionBehaviour.transform.localPosition = new Vector3(0.952f, 2f - StaticSpacingNum * SpacingNum, -2f); optionBehaviour.transform.localPosition = new Vector3(0.952f, 2f, -2f);
SetUp(optionBehaviour); SetUp(optionBehaviour);
SpacingNum += StaticSpacingNumPlus;
UnityEngine.Object.Destroy(optionBehaviour.CheckMark.transform.parent.gameObject); UnityEngine.Object.Destroy(optionBehaviour.CheckMark.transform.parent.gameObject);
UnityEngine.Object.Destroy(optionBehaviour.GetComponent<ToggleOption>()); UnityEngine.Object.Destroy(optionBehaviour.GetComponent<ToggleOption>());
@@ -25,6 +24,14 @@ public class BetterOptionTitleItem : BetterOptionItem
optionBehaviour.LabelBackground.color = new Color(0.6f, 0.6f, 0.6f, 1f); optionBehaviour.LabelBackground.color = new Color(0.6f, 0.6f, 0.6f, 1f);
optionBehaviour.LabelBackground.transform.SetLocalZ(1f); optionBehaviour.LabelBackground.transform.SetLocalZ(1f);
optionBehaviour.LabelBackground.transform.localScale = new Vector3(1.6f, 1f);
optionBehaviour.LabelBackground.transform.SetLocalX(-2.4f);
optionBehaviour.TitleText.enableAutoSizing = false;
optionBehaviour.TitleText.transform.SetLocalX(-2.4f);
optionBehaviour.TitleText.alignment = TMPro.TextAlignmentOptions.Center;
optionBehaviour.TitleText.enableWordWrapping = false;
optionBehaviour.TitleText.fontSize = 2.5f;
// Set data // Set data
Tab = gameOptionsMenu; Tab = gameOptionsMenu;
Name = $"<b><size=150%>{name}</size></b>"; Name = $"<b><size=150%>{name}</size></b>";
@@ -32,6 +39,8 @@ public class BetterOptionTitleItem : BetterOptionItem
TitleText = optionBehaviour.TitleText; TitleText = optionBehaviour.TitleText;
BetterOptionItems.Add(this); BetterOptionItems.Add(this);
obj = optionBehaviour.gameObject;
return this; return this;
} }
+18 -45
View File
@@ -92,6 +92,22 @@ public static class MessageReaderUpdateSystemPatch
internal static class RPC internal static class RPC
{ {
public static void RpcSyncSettings()
{
if (!AmongUsClient.Instance.AmHost)
{
return;
}
foreach (var player in Main.AllPlayerControls.Where(pc => pc != PlayerControl.LocalPlayer))
{
var optionsByteArray = GameOptionsManager.Instance.gameOptionsFactory.ToBytes(GameOptionsManager.Instance.CurrentGameOptions, false);
MessageWriter messageWriter = AmongUsClient.Instance.StartRpcImmediately(player.NetId, (byte)RpcCalls.SyncSettings, SendOption.None, player.GetClientId());
messageWriter.WriteBytesAndSize(optionsByteArray);
AmongUsClient.Instance.FinishRpcImmediately(messageWriter);
}
}
public static void SendBetterCheck() public static void SendBetterCheck()
{ {
var flag = GameStates.IsHost && Main.BetterHost.Value; var flag = GameStates.IsHost && Main.BetterHost.Value;
@@ -133,51 +149,6 @@ internal static class RPC
player.Exiled(); player.Exiled();
} }
public static void SendHostChatToPlayer(PlayerControl player, string text, string? title = "", bool sendToBetterUser = true)
{
if (!GameStates.IsHost) return;
if (player.BetterData().IsBetterUser)
{
if (sendToBetterUser)
{
MessageWriter messageWriter2 = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, unchecked((byte)CustomRPC.AddChat), SendOption.None, player.GetClientId());
messageWriter2.Write(text);
messageWriter2.Write(title);
AmongUsClient.Instance.FinishRpcImmediately(messageWriter2);
}
return;
}
/*
PlayerControl asPlayer = Main.AllPlayerControls.Where(pc => pc.IsAlive()).OrderBy(pc => pc == PlayerControl.LocalPlayer ? 0 : 1).First();
var oldName = asPlayer.CurrentOutfit.PlayerName;
if (title == "")
title = oldName;
MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(asPlayer.NetId, (byte)RpcCalls.SetName, SendOption.None, player.GetClientId());
writer.Write(asPlayer.Data.NetId);
writer.Write(title);
AmongUsClient.Instance.FinishRpcImmediately(writer);
MessageWriter messageWriter = AmongUsClient.Instance.StartRpcImmediately(asPlayer.NetId, (byte)RpcCalls.SendChat, SendOption.None, player.GetClientId());
messageWriter.Write(text);
AmongUsClient.Instance.FinishRpcImmediately(messageWriter);
_ = new LateTask(() =>
{
MessageWriter writer2 = AmongUsClient.Instance.StartRpcImmediately(asPlayer.NetId, (byte)RpcCalls.SetName, SendOption.None, player.GetClientId());
writer2.Write(asPlayer.Data.NetId);
writer2.Write(oldName);
AmongUsClient.Instance.FinishRpcImmediately(writer2);
SyncAllNames(force: true);
}, 0.08f, shoudLog: false);
*/
}
public static void HandleCustomRPC(PlayerControl player, byte callId, MessageReader oldReader) public static void HandleCustomRPC(PlayerControl player, byte callId, MessageReader oldReader)
{ {
if (PlayerControl.LocalPlayer == null || player == null || player == PlayerControl.LocalPlayer || player.Data == null) return; if (PlayerControl.LocalPlayer == null || player == null || player == PlayerControl.LocalPlayer || player.Data == null) return;
@@ -201,6 +172,8 @@ internal static class RPC
player.BetterData().IsBetterUser = SetBetterUser; player.BetterData().IsBetterUser = SetBetterUser;
player.BetterData().IsBetterHost = IsBetterHost; player.BetterData().IsBetterHost = IsBetterHost;
SyncAllNames(force: true);
} }
break; break;
case (byte)CustomRPC.AddChat: case (byte)CustomRPC.AddChat:
+60
View File
@@ -289,4 +289,64 @@ public static class Utils
return $"{Tag}: {PlatformName}"; return $"{Tag}: {PlatformName}";
} }
public static string GetPlatformName(Platforms platform, bool useTag = false)
{
string Tag = string.Empty;
string PlatformName;
switch (platform)
{
case Platforms.StandaloneSteamPC:
PlatformName = "Steam";
Tag = "PC";
break;
case Platforms.StandaloneEpicPC:
PlatformName = "Epic Games";
Tag = "PC";
break;
case Platforms.StandaloneWin10:
PlatformName = "Microsoft Store";
Tag = "PC";
break;
case Platforms.StandaloneMac:
PlatformName = "Mac OS";
Tag = "PC";
break;
case Platforms.StandaloneItch:
PlatformName = "Itch.io";
Tag = "PC";
break;
case Platforms.Xbox:
PlatformName = "Xbox";
Tag = "Console";
break;
case Platforms.Playstation:
PlatformName = "Playstation";
Tag = "Console";
break;
case Platforms.Switch:
PlatformName = "Switch";
Tag = "Console";
break;
case Platforms.Android:
PlatformName = "Android";
Tag = "Mobile";
break;
case Platforms.IPhone:
PlatformName = "IPhone";
Tag = "Mobile";
break;
case Platforms.Unknown:
PlatformName = "None";
break;
default:
return string.Empty;
}
if (useTag == false)
return PlatformName;
return $"{Tag}: {PlatformName}";
}
} }
+6 -3
View File
@@ -125,7 +125,9 @@ class ChatPatch
ChatBubble pooledBubble = __instance.GetPooledBubble(); ChatBubble pooledBubble = __instance.GetPooledBubble();
try try
{ {
chatText = chatText.Replace("\n", ""); if (sourcePlayer.BetterData().IsBetterUser && GameStates.IsBetterHostLobby)
chatText = chatText.Replace("\n", "");
pooledBubble.transform.SetParent(__instance.scroller.Inner); pooledBubble.transform.SetParent(__instance.scroller.Inner);
pooledBubble.transform.localScale = Vector3.one; pooledBubble.transform.localScale = Vector3.one;
bool flag = sourcePlayer == PlayerControl.LocalPlayer; bool flag = sourcePlayer == PlayerControl.LocalPlayer;
@@ -173,9 +175,10 @@ class ChatPatch
if (sourcePlayer.IsDev()) if (sourcePlayer.IsDev())
sbTag.Append("<color=#0088ff>Dev</color>+++"); sbTag.Append("<color=#0088ff>Dev</color>+++");
if (((sourcePlayer == PlayerControl.LocalPlayer && GameStates.IsHost && Main.BetterHost.Value) || sourcePlayer.BetterData().IsBetterHost) && !GameStates.IsInGamePlay) if (((sourcePlayer == PlayerControl.LocalPlayer && GameStates.IsHost && Main.BetterHost.Value)
|| (sourcePlayer != PlayerControl.LocalPlayer && sourcePlayer.BetterData().IsBetterHost && sourcePlayer.IsHost())))
sbTag.Append("<color=#0dff00>Better Host</color>+++"); sbTag.Append("<color=#0dff00>Better Host</color>+++");
else if ((sourcePlayer == PlayerControl.LocalPlayer || sourcePlayer.BetterData().IsBetterUser) && !GameStates.IsInGamePlay) else if ((sourcePlayer == PlayerControl.LocalPlayer || sourcePlayer.BetterData().IsBetterUser))
sbTag.Append("<color=#0dff00>Better User</color>+++"); sbTag.Append("<color=#0dff00>Better User</color>+++");
if (!string.IsNullOrEmpty(hashPuid) && AntiCheat.SickoData.ContainsKey(hashPuid) || !string.IsNullOrEmpty(friendCode) && AntiCheat.SickoData.ContainsValue(friendCode)) if (!string.IsNullOrEmpty(hashPuid) && AntiCheat.SickoData.ContainsKey(hashPuid) || !string.IsNullOrEmpty(friendCode) && AntiCheat.SickoData.ContainsValue(friendCode))
-6
View File
@@ -10,7 +10,6 @@ public static class OptionsMenuBehaviourPatch
{ {
private static ClientOptionItem AntiCheat; private static ClientOptionItem AntiCheat;
private static ClientOptionItem BetterHost; private static ClientOptionItem BetterHost;
private static ClientOptionItem BetterRoleAlgorithma;
private static ClientOptionItem BetterNotifications; private static ClientOptionItem BetterNotifications;
private static ClientOptionItem ChatInGameplay; private static ClientOptionItem ChatInGameplay;
private static ClientOptionItem LobbyPlayerInfo; private static ClientOptionItem LobbyPlayerInfo;
@@ -63,11 +62,6 @@ public static class OptionsMenuBehaviourPatch
} }
} }
if (BetterRoleAlgorithma == null || BetterRoleAlgorithma.ToggleButton == null)
{
BetterRoleAlgorithma = ClientOptionItem.Create("<color=#4f92ff>Better Role Algorithma</color>", Main.BetterRoleAlgorithma, __instance, toggleCheck: () => !toggleCheckInGamePlay("<color=#4f92ff>Better Role Algorithma</color>"));
}
if (BetterNotifications == null || BetterNotifications.ToggleButton == null) if (BetterNotifications == null || BetterNotifications.ToggleButton == null)
{ {
BetterNotifications = ClientOptionItem.Create("<color=#4f92ff>Better Notifications</color>", Main.BetterNotifications, __instance, BetterNotificationsToggle); BetterNotifications = ClientOptionItem.Create("<color=#4f92ff>Better Notifications</color>", Main.BetterNotifications, __instance, BetterNotificationsToggle);
+2 -6
View File
@@ -246,8 +246,9 @@ class CommandsPatch
{ {
foreach (PlayerControl player in Main.AllPlayerControls) foreach (PlayerControl player in Main.AllPlayerControls)
{ {
player.RpcExile();
player.roleAssigned = false; player.roleAssigned = false;
player.RpcSetRole(RoleTypes.Crewmate, true); player.RpcSetRole(RoleTypes.CrewmateGhost, true);
} }
GameManager.Instance.RpcEndGame(GameOverReason.ImpostorByKill, false); GameManager.Instance.RpcEndGame(GameOverReason.ImpostorByKill, false);
return; return;
@@ -302,11 +303,6 @@ class CommandsPatch
case "role" or "setrole": case "role" or "setrole":
if (HandleIsHost(command) == true) if (HandleIsHost(command) == true)
{ {
if (!Main.BetterRoleAlgorithma.Value)
{
Utils.AddChatPrivate($"<color=#730000>{error}\nBetter Role Algorithma in better options must be turned on to use this command");
return;
}
if (command[0][1..].ToLower().Trim() == "role") if (command[0][1..].ToLower().Trim() == "role")
{ {
var player = PlayerControl.LocalPlayer; var player = PlayerControl.LocalPlayer;
+20
View File
@@ -61,6 +61,13 @@ class GamePlayManager
} }
catch { } catch { }
} }
[HarmonyPatch(nameof(LobbyBehaviour.RpcExtendLobbyTimer))]
[HarmonyPostfix]
private static void RpcExtendLobbyTimer_Postfix(/*LobbyBehaviour __instance*/)
{
GameStartManagerPatch.lobbyTimer += 30f;
}
} }
[HarmonyPatch(typeof(IntroCutscene))] [HarmonyPatch(typeof(IntroCutscene))]
@@ -124,10 +131,23 @@ class GamePlayManager
[HarmonyPatch(typeof(GameStartManager))] [HarmonyPatch(typeof(GameStartManager))]
public class GameStartManagerPatch public class GameStartManagerPatch
{ {
public static float lobbyTimer = 600f;
public static string lobbyTimerDisplay = "";
[HarmonyPatch(nameof(GameStartManager.Start))]
[HarmonyPostfix]
private static void Start_Postfix(/*GameStartManager __instance*/)
{
lobbyTimer = 600f;
}
[HarmonyPatch(nameof(GameStartManager.Update))] [HarmonyPatch(nameof(GameStartManager.Update))]
[HarmonyPrefix] [HarmonyPrefix]
private static void Update_Prefix(GameStartManager __instance) private static void Update_Prefix(GameStartManager __instance)
{ {
lobbyTimer = Mathf.Max(0f, lobbyTimer -= Time.deltaTime);
int minutes = (int)lobbyTimer / 60;
int seconds = (int)lobbyTimer % 60;
lobbyTimerDisplay = $"{minutes:00}:{seconds:00}";
__instance.MinPlayers = 1; __instance.MinPlayers = 1;
} }
[HarmonyPatch(nameof(GameStartManager.Update))] [HarmonyPatch(nameof(GameStartManager.Update))]
+73 -68
View File
@@ -16,10 +16,20 @@ class BetterGameSettings
public static BetterOptionItem? DetectedLevelAbove; public static BetterOptionItem? DetectedLevelAbove;
public static BetterOptionItem? DetectCheatClients; public static BetterOptionItem? DetectCheatClients;
public static BetterOptionItem? DetectInvalidRPCs; public static BetterOptionItem? DetectInvalidRPCs;
public static BetterOptionItem? RoleRandomizer;
public static BetterOptionItem? DesyncRoles;
public static BetterOptionItem? ExperimentalDetectInvalidSabotage; public static BetterOptionItem? ExperimentalDetectInvalidSabotage;
} }
class BetterGameSettingsTemp
{
public static BetterOptionItem? HideAndSeekImp2;
public static BetterOptionItem? HideAndSeekImp3;
public static BetterOptionItem? HideAndSeekImp4;
public static BetterOptionItem? HideAndSeekImp5;
}
[HarmonyPatch(typeof(GameSettingMenu))] [HarmonyPatch(typeof(GameSettingMenu))]
static class GameSettingMenuPatch static class GameSettingMenuPatch
{ {
@@ -29,8 +39,8 @@ static class GameSettingMenuPatch
public static void SetupSettings(bool IsPreload = false) public static void SetupSettings(bool IsPreload = false)
{ {
BetterOptionItem.SpacingNum = 0;
BetterOptionItem.BetterOptionItems.Clear(); BetterOptionItem.BetterOptionItems.Clear();
BetterOptionItem.TempPlayerOptionDataNum = 0;
TitleList.Clear(); TitleList.Clear();
// Anti-Cheat Settings // Anti-Cheat Settings
@@ -40,8 +50,8 @@ static class GameSettingMenuPatch
if (IsPreload || GameStates.IsHost) if (IsPreload || GameStates.IsHost)
{ {
TitleList.Add(new BetterOptionTitleItem().Create(BetterSettingsTab, $"<color=#4f92ff>Host Only</color>")); TitleList.Add(new BetterOptionTitleItem().Create(BetterSettingsTab, $"<color=#4f92ff>Host Only</color>"));
BetterGameSettings.WhenCheating = new BetterOptionStringItem().Create(100, BetterSettingsTab, "When a player is caught cheating", ["Do Nothing", "Kick", "Ban"], 2); BetterGameSettings.WhenCheating = new BetterOptionStringItem().Create(100, BetterSettingsTab, "When a player is caught cheating", ["Notify", "Kick", "Ban"], 2);
BetterGameSettings.InvalidFriendCode = new BetterOptionCheckboxItem().Create(200, BetterSettingsTab, "Allow invalid friendCodes", true); BetterGameSettings.InvalidFriendCode = new BetterOptionCheckboxItem().Create(200, BetterSettingsTab, "Detected invalid FriendCodes", true);
BetterGameSettings.UseBanPlayerList = new BetterOptionCheckboxItem().Create(300, BetterSettingsTab, "Use Ban Player List", true); BetterGameSettings.UseBanPlayerList = new BetterOptionCheckboxItem().Create(300, BetterSettingsTab, "Use Ban Player List", true);
BetterGameSettings.UseBanNameList = new BetterOptionCheckboxItem().Create(400, BetterSettingsTab, "Use Ban Name List", true); BetterGameSettings.UseBanNameList = new BetterOptionCheckboxItem().Create(400, BetterSettingsTab, "Use Ban Name List", true);
BetterGameSettings.UseBanWordList = new BetterOptionCheckboxItem().Create(500, BetterSettingsTab, "Use Ban Word List", true); BetterGameSettings.UseBanWordList = new BetterOptionCheckboxItem().Create(500, BetterSettingsTab, "Use Ban Word List", true);
@@ -49,7 +59,7 @@ static class GameSettingMenuPatch
} }
TitleList.Add(new BetterOptionTitleItem().Create(BetterSettingsTab, $"<color=#4f92ff>Detections</color>")); TitleList.Add(new BetterOptionTitleItem().Create(BetterSettingsTab, $"<color=#4f92ff>Detections</color>"));
BetterGameSettings.DetectedLevelAbove = new BetterOptionIntItem().Create(600, BetterSettingsTab, "Detected player level = or >", [100, 5000, 5], 200, "Lv ", ""); BetterGameSettings.DetectedLevelAbove = new BetterOptionIntItem().Create(600, BetterSettingsTab, "Detected player levels >", [100, 5000, 5], 200, "Lv ", "");
BetterGameSettings.DetectCheatClients = new BetterOptionCheckboxItem().Create(700, BetterSettingsTab, "Detect Cheat Clients", true); BetterGameSettings.DetectCheatClients = new BetterOptionCheckboxItem().Create(700, BetterSettingsTab, "Detect Cheat Clients", true);
BetterGameSettings.DetectInvalidRPCs = new BetterOptionCheckboxItem().Create(800, BetterSettingsTab, "Detect Invalid RPCs", true); BetterGameSettings.DetectInvalidRPCs = new BetterOptionCheckboxItem().Create(800, BetterSettingsTab, "Detect Invalid RPCs", true);
@@ -58,6 +68,13 @@ static class GameSettingMenuPatch
BetterGameSettings.ExperimentalDetectInvalidSabotage = new BetterOptionCheckboxItem().Create(100000, BetterSettingsTab, "Detect Invalid Sabotages", false); BetterGameSettings.ExperimentalDetectInvalidSabotage = new BetterOptionCheckboxItem().Create(100000, BetterSettingsTab, "Detect Invalid Sabotages", false);
} }
if (IsPreload || GameStates.IsHost)
{
TitleList.Add(new BetterOptionHeaderItem().Create(BetterSettingsTab, "<color=#4f92ff>Role Algorithm Settings</color>"));
BetterGameSettings.RoleRandomizer = new BetterOptionStringItem().Create(1100, BetterSettingsTab, "Randomizer", ["System.Random", "UnityEngine.Random"], 0);
BetterGameSettings.DesyncRoles = new BetterOptionCheckboxItem().Create(1200, BetterSettingsTab, "Desync Roles To Other Clients", true);
}
// Gameplay Settings // Gameplay Settings
{ {
if (IsPreload || GameStates.IsHost) if (IsPreload || GameStates.IsHost)
@@ -69,28 +86,41 @@ static class GameSettingMenuPatch
else if (IsPreload || GameStates.IsHideNSeek) else if (IsPreload || GameStates.IsHideNSeek)
{ {
new BetterOptionHeaderItem().Create(BetterSettingsTab, "<color=#d7d700>Hide & Seek Settings</color>"); new BetterOptionHeaderItem().Create(BetterSettingsTab, "<color=#d7d700>Hide & Seek Settings</color>");
new BetterOptionTitleItem().Create(BetterSettingsTab, $"<color={Utils.GetRoleColor(RoleTypes.Impostor)}>Imposter</color>");
if (IsPreload || Main.BetterRoleAlgorithma.Value) BetterGameSettings.HideAndSeekImpNum = new BetterOptionIntItem().Create(1000, BetterSettingsTab, "# Seekers", [1, 5, 1], 1, "", "");
BetterGameSettingsTemp.HideAndSeekImp2 = new BetterOptionPlayerItem().Create(BetterSettingsTab, "Seeker", BetterGameSettings.HideAndSeekImpNum, new Func<bool>(() =>
{ {
new BetterOptionTitleItem().Create(BetterSettingsTab, $"<color=#4f92ff>Better Role Algorithma</color>"); return BetterGameSettings.HideAndSeekImpNum is BetterOptionIntItem betterOption && betterOption.CurrentValue > 1;
BetterOptionItem.SpacingNum += 0.2f; }));
new BetterOptionTitleItem().Create(BetterSettingsTab, $"<color={Utils.GetRoleColor(RoleTypes.Impostor)}>Imposter</color>"); BetterGameSettingsTemp.HideAndSeekImp3 = new BetterOptionPlayerItem().Create(BetterSettingsTab, "Seeker", BetterGameSettings.HideAndSeekImpNum, new Func<bool>(() =>
BetterGameSettings.HideAndSeekImpNum = new BetterOptionIntItem().Create(1000, BetterSettingsTab, "# Seekers", [1, 5, 1], 1, "", ""); {
} return BetterGameSettings.HideAndSeekImpNum is BetterOptionIntItem betterOption && betterOption.CurrentValue > 2
&& BetterGameSettingsTemp.HideAndSeekImp2 is BetterOptionPlayerItem betterOption2 && betterOption2.CurrentIndex > -1;
}));
BetterGameSettingsTemp.HideAndSeekImp4 = new BetterOptionPlayerItem().Create(BetterSettingsTab, "Seeker", BetterGameSettings.HideAndSeekImpNum, new Func<bool>(() =>
{
return BetterGameSettings.HideAndSeekImpNum is BetterOptionIntItem betterOption && betterOption.CurrentValue > 3
&& BetterGameSettingsTemp.HideAndSeekImp2 is BetterOptionPlayerItem betterOption2 && betterOption2.CurrentIndex > -1
&& BetterGameSettingsTemp.HideAndSeekImp3 is BetterOptionPlayerItem betterOption3 && betterOption3.CurrentIndex > -1;
}));
BetterGameSettingsTemp.HideAndSeekImp5 = new BetterOptionPlayerItem().Create(BetterSettingsTab, "Seeker", BetterGameSettings.HideAndSeekImpNum, new Func<bool>(() =>
{
return BetterGameSettings.HideAndSeekImpNum is BetterOptionIntItem betterOption && betterOption.CurrentValue > 4
&& BetterGameSettingsTemp.HideAndSeekImp2 is BetterOptionPlayerItem betterOption2 && betterOption2.CurrentIndex > -1
&& BetterGameSettingsTemp.HideAndSeekImp3 is BetterOptionPlayerItem betterOption3 && betterOption3.CurrentIndex > -1
&& BetterGameSettingsTemp.HideAndSeekImp4 is BetterOptionPlayerItem betterOption4 && betterOption4.CurrentIndex > -1;
}));
} }
} }
} }
/* /*
new BetterOptionCheckboxItem().Create(0, BetterSettingsTab, "CheckBox Test", true); new BetterOptionCheckboxItem().Create(10000, BetterSettingsTab, "CheckBox Test", true);
new BetterOptionStringItem().Create(1, BetterSettingsTab, "String Test", ["Test 1", "Test 2", "Test 3"]); new BetterOptionStringItem().Create(10001, BetterSettingsTab, "String Test", ["Test 1", "Test 2", "Test 3"], 0);
new BetterOptionFloatItem().Create(2, BetterSettingsTab, "Float Test 1", [0f, 180f, 2.5f], 0f, ""); new BetterOptionFloatItem().Create(10002, BetterSettingsTab, "Float Test 1", [0f, 180f, 2.5f], 0f, "", "");
new BetterOptionIntItem().Create(5, BetterSettingsTab, "Int Test", [0, 5, 1], 0, ""); new BetterOptionIntItem().Create(10003, BetterSettingsTab, "Int Test", [0, 5, 1], 0, "", "");
new BetterOptionHeaderItem().Create(BetterSettingsTab, "<color=#4f92ff>Test Settings 2</color>"); new BetterOptionHeaderItem().Create(BetterSettingsTab, "<color=#4f92ff>Test Settings 2</color>");
*/ */
if (BetterSettingsTab != null)
BetterSettingsTab.scrollBar.SetYBoundsMax(1.25f * BetterOptionItem.SpacingNum / 2);
} }
private static void Initialize() private static void Initialize()
@@ -101,12 +131,16 @@ static class GameSettingMenuPatch
{ {
if (item != null) if (item != null)
{ {
item.obj.SetActive(true);
if (item.TitleText != null) if (item.TitleText != null)
{ {
item.TitleText.text = item.Name; item.TitleText.text = item.Name;
} }
} }
} }
BetterOptionItem.UpdatePositions();
}, 0.005f, shoudLog: false); }, 0.005f, shoudLog: false);
} }
@@ -159,6 +193,7 @@ static class GameSettingMenuPatch
BetterSettingsButton.OnClick.AddListener(new Action(() => BetterSettingsButton.OnClick.AddListener(new Action(() =>
{ {
__instance.ChangeTab(3, false); __instance.ChangeTab(3, false);
BetterOptionItem.UpdatePositions();
})); }));
BetterSettingsTab = UnityEngine.Object.Instantiate(__instance.GameSettingsTab, __instance.GameSettingsTab.transform.parent); BetterSettingsTab = UnityEngine.Object.Instantiate(__instance.GameSettingsTab, __instance.GameSettingsTab.transform.parent);
@@ -275,8 +310,17 @@ static class NumberOptionPatch
if (Input.GetKey(KeyCode.LeftControl)) if (Input.GetKey(KeyCode.LeftControl))
times = 10; times = 10;
__instance.Value += __instance.Increment * times; if (__instance.Value + __instance.Increment * times > __instance.ValidRange.max)
{
__instance.Value = __instance.ValidRange.max;
}
else
{
__instance.Value = __instance.ValidRange.Clamp(__instance.Value + __instance.Increment * times);
}
__instance.UpdateValue(); __instance.UpdateValue();
__instance.OnValueChanged.Invoke(__instance);
__instance.AdjustButtonsActiveState();
return false; return false;
} }
@@ -290,56 +334,17 @@ static class NumberOptionPatch
if (Input.GetKey(KeyCode.LeftControl)) if (Input.GetKey(KeyCode.LeftControl))
times = 10; times = 10;
__instance.Value -= __instance.Increment * times; if (__instance.Value - __instance.Increment * times < __instance.ValidRange.min)
{
__instance.Value = __instance.ValidRange.min;
}
else
{
__instance.Value = __instance.ValidRange.Clamp(__instance.Value - __instance.Increment * times);
}
__instance.UpdateValue(); __instance.UpdateValue();
return false; __instance.OnValueChanged.Invoke(__instance);
} __instance.AdjustButtonsActiveState();
[HarmonyPatch(nameof(NumberOption.UpdateValue))]
[HarmonyPrefix]
public static bool UpdateValue_Prefix(NumberOption __instance)
{
if (__instance.floatOptionName != FloatOptionNames.Invalid)
{
GameOptionsManager.Instance.CurrentGameOptions.SetFloat(__instance.floatOptionName, __instance.GetFloat());
return false;
}
if (__instance.intOptionName != Int32OptionNames.Invalid)
{
GameOptionsManager.Instance.CurrentGameOptions.SetInt(__instance.intOptionName, __instance.GetInt());
return false;
}
return false;
}
[HarmonyPatch(nameof(NumberOption.FixedUpdate))]
[HarmonyPrefix]
public static bool FixedUpdate_Prefix(NumberOption __instance)
{
try
{
if (__instance.MinusBtn != null && __instance.PlusBtn != null)
{
__instance.MinusBtn.SetInteractable(true);
__instance.PlusBtn.SetInteractable(true);
}
if (__instance.oldValue != __instance.Value)
{
__instance.oldValue = __instance.Value;
if (__instance.Value > __instance.ValidRange.max || __instance.Value < __instance.ValidRange.min)
{
__instance.ValueText.text = $"<color=#f20>{__instance.data.GetValueString(__instance.Value)}</color>";
}
else
{
__instance.ValueText.text = __instance.data.GetValueString(__instance.Value);
}
}
}
catch { }
return false; return false;
} }
} }
+16
View File
@@ -0,0 +1,16 @@
using InnerNet;
using HarmonyLib;
namespace BetterAmongUs;
[HarmonyPatch(typeof(MatchMakerGameButton))]
class MatchMakerGameButtonPatch
{
[HarmonyPatch(nameof(MatchMakerGameButton.SetGame))]
[HarmonyPostfix]
private static void SetGame_Postfix(MatchMakerGameButton __instance)
{
__instance.NameText.text = $"<b><color=#f4f400>{__instance.myListing.HostName}</color></b>\n";
__instance.NameText.text += $"<size=65%><voffset=0.4m><color=#9c9c9c>{Utils.GetPlatformName(__instance.myListing.Platform)} - {GameCode.IntToGameName(__instance.myListing.GameId)}</color></voffset></size>";
}
}
+33
View File
@@ -1,6 +1,7 @@
using HarmonyLib; using HarmonyLib;
using System.Text; using System.Text;
using UnityEngine; using UnityEngine;
using static BetterAmongUs.Patches.GamePlayManager;
namespace BetterAmongUs.Patches; namespace BetterAmongUs.Patches;
@@ -23,6 +24,12 @@ public class PingTrackerPatch
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
sb.AppendFormat("PING: <b>{0}</b>\n", GetPingColor(AmongUsClient.Instance.Ping)); sb.AppendFormat("PING: <b>{0}</b>\n", GetPingColor(AmongUsClient.Instance.Ping));
if (GameStates.IsLobby && GameStates.IsHost && GameStates.IsVanillaServer && !GameStates.IsLocalGame)
{
sb.AppendFormat("Timer: <b>{0}</b>\n", GetTimeColor(GameStartManagerPatch.lobbyTimer));
}
sb.Append($"<color=#00dbdb><size=75%>BetterAmongUs {Main.GetVersionText(true)}</size></color>\n"); sb.Append($"<color=#00dbdb><size=75%>BetterAmongUs {Main.GetVersionText(true)}</size></color>\n");
sb.AppendFormat("<color=#b0b0b0><size=50%>{0}</size></color>\n", Main.Github); sb.AppendFormat("<color=#b0b0b0><size=50%>{0}</size></color>\n", Main.Github);
@@ -76,4 +83,30 @@ public class PingTrackerPatch
return newPing; return newPing;
} }
private static string GetTimeColor(float time)
{
float minutes = (int)time / 60 + 1f;
string color;
switch (minutes)
{
case float n when n <= 1:
color = "#ff0000";
break;
case float n when n <= 3.5f:
color = "#ffa200";
break;
case float n when n <= 5f:
color = "#ffff00";
break;
default:
color = "#00f04c";
break;
}
string newTime = $"<color={color}>{GameStartManagerPatch.lobbyTimerDisplay}</color>";
return newTime;
}
} }
+26 -12
View File
@@ -128,11 +128,8 @@ class PlayerControlPatch
} }
var sbTag = new StringBuilder(); var sbTag = new StringBuilder();
var sbInfo = new StringBuilder();
var sbTagTop = new StringBuilder(); var sbTagTop = new StringBuilder();
var sbInfoTop = new StringBuilder();
var sbTagBottom = new StringBuilder(); var sbTagBottom = new StringBuilder();
var sbInfoBottom = new StringBuilder();
// Put +++ at the end of each tag // Put +++ at the end of each tag
if (!player.isDummy) if (!player.isDummy)
@@ -182,6 +179,20 @@ class PlayerControlPatch
sbTagTop.Append($"{Role}+++"); sbTagTop.Append($"{Role}+++");
} }
} }
else if (GameStates.IsInGame || GameStates.IsFreePlay)
{
if (player == PlayerControl.LocalPlayer)
{
if (player.IsImpostorTeam())
{
sbTagTop.Append($"<color={Utils.GetTeamHexColor(RoleTeamTypes.Impostor)}>Seeker</color>+++");
}
else
{
sbTagTop.Append($"<color={Utils.GetTeamHexColor(RoleTeamTypes.Crewmate)}>Hider</color>+++");
}
}
}
if (player.IsImpostorTeammate() && player != PlayerControl.LocalPlayer) if (player.IsImpostorTeammate() && player != PlayerControl.LocalPlayer)
{ {
@@ -194,8 +205,9 @@ class PlayerControlPatch
} }
// Put +++ at the end of each tag // Put +++ at the end of each tag
void AppendTagInfo(StringBuilder source, StringBuilder destination) static StringBuilder FormatInfo(StringBuilder source)
{ {
var sb = new StringBuilder();
if (source.Length > 0) if (source.Length > 0)
{ {
string text = source.ToString(); string text = source.ToString();
@@ -204,23 +216,25 @@ class PlayerControlPatch
{ {
if (!string.IsNullOrEmpty(Utils.RemoveHtmlText(parts[i]))) if (!string.IsNullOrEmpty(Utils.RemoveHtmlText(parts[i])))
{ {
destination.Append(parts[i]); sb.Append(parts[i]);
if (i != parts.Length - 2) if (i != parts.Length - 2)
{ {
destination.Append(" - "); sb.Append(" - ");
} }
} }
} }
} }
return sb;
} }
AppendTagInfo(sbTag, sbInfo); sbTag = FormatInfo(sbTag);
AppendTagInfo(sbTagTop, sbInfoTop); sbTagTop = FormatInfo(sbTagTop);
AppendTagInfo(sbTagBottom, sbInfoBottom); sbTagBottom = FormatInfo(sbTagBottom);
player.SetPlayerTextInfo(sbInfoTop.ToString()); player.SetPlayerTextInfo(sbTagTop.ToString());
player.SetPlayerTextInfo(sbInfoBottom.ToString(), isBottom: true); player.SetPlayerTextInfo(sbTagBottom.ToString(), isBottom: true);
player.SetPlayerTextInfo(sbInfo.ToString(), isInfo: true); player.SetPlayerTextInfo(sbTag.ToString(), isInfo: true);
} }
catch (Exception ex) catch (Exception ex)
{ {
-3
View File
@@ -52,9 +52,6 @@ public static class OnPlayerJoinedPatch
RPC.SyncAllNames(force: true); RPC.SyncAllNames(force: true);
if (Main.BetterHost.Value)
client.Character.RpcSendHostChat(HudManagerPatch.WelcomeMessage, sendToBetterUser: false);
// Auto ban player on ban list // Auto ban player on ban list
if (BetterGameSettings.UseBanPlayerList.GetBool()) if (BetterGameSettings.UseBanPlayerList.GetBool())
{ {
+87 -31
View File
@@ -21,8 +21,6 @@ public class RoleManagerPatch
[HarmonyPrefix] [HarmonyPrefix]
public static bool RoleManager_Prefix(/*RoleManager __instance*/) public static bool RoleManager_Prefix(/*RoleManager __instance*/)
{ {
if (!Main.BetterRoleAlgorithma.Value) return true;
if (!GameStates.IsHideNSeek) if (!GameStates.IsHideNSeek)
{ {
RegularBetterRoleAssignment(); RegularBetterRoleAssignment();
@@ -140,19 +138,22 @@ public class RoleManagerPatch
player.RpcSetRole(role); player.RpcSetRole(role);
// Desync role to other clients to prevent revealing the true role // Desync role to other clients to prevent revealing the true role
if (IsImpostorRole(role) && role is not RoleTypes.Phantom) if (BetterGameSettings.DesyncRoles.GetBool())
{ {
List<MessageWriter> messageWriter = AmongUsClient.Instance.StartRpcDesync(player.NetId, (byte)RpcCalls.SetRole, SendOption.None, player.GetClientId(), clientCheck); if (IsImpostorRole(role) && role is not RoleTypes.Phantom)
messageWriter.ForEach(mW => mW.Write((ushort)RoleTypes.Impostor)); {
messageWriter.ForEach(mW => mW.Write(false)); List<MessageWriter> messageWriter = AmongUsClient.Instance.StartRpcDesync(player.NetId, (byte)RpcCalls.SetRole, SendOption.None, player.GetClientId(), clientCheck);
AmongUsClient.Instance.FinishRpcDesync(messageWriter); messageWriter.ForEach(mW => mW.Write((ushort)RoleTypes.Impostor));
} messageWriter.ForEach(mW => mW.Write(false));
else if (role is not RoleTypes.Noisemaker) AmongUsClient.Instance.FinishRpcDesync(messageWriter);
{ }
List<MessageWriter> messageWriter = AmongUsClient.Instance.StartRpcDesync(player.NetId, (byte)RpcCalls.SetRole, SendOption.None, player.GetClientId(), clientCheck); else if (role is not RoleTypes.Noisemaker)
messageWriter.ForEach(mW => mW.Write((ushort)RoleTypes.Crewmate)); {
messageWriter.ForEach(mW => mW.Write(false)); List<MessageWriter> messageWriter = AmongUsClient.Instance.StartRpcDesync(player.NetId, (byte)RpcCalls.SetRole, SendOption.None, player.GetClientId(), clientCheck);
AmongUsClient.Instance.FinishRpcDesync(messageWriter); messageWriter.ForEach(mW => mW.Write((ushort)RoleTypes.Crewmate));
messageWriter.ForEach(mW => mW.Write(false));
AmongUsClient.Instance.FinishRpcDesync(messageWriter);
}
} }
player.roleAssigned = true; player.roleAssigned = true;
@@ -192,14 +193,19 @@ public class RoleManagerPatch
ImpostorRoles[kvp.Key]--; ImpostorRoles[kvp.Key]--;
Impostors.Add(pc); Impostors.Add(pc);
pc.RpcSetRole(kvp.Key); pc.RpcSetRole(kvp.Key);
// Desync role to other clients to prevent revealing the true role // Desync role to other clients to prevent revealing the true role
if (kvp.Key is not RoleTypes.Phantom) if (BetterGameSettings.DesyncRoles.GetBool())
{ {
List<MessageWriter> messageWriter = AmongUsClient.Instance.StartRpcDesync(pc.NetId, (byte)RpcCalls.SetRole, SendOption.None, pc.GetClientId(), clientCheck); if (kvp.Key is not RoleTypes.Phantom)
messageWriter.ForEach(mW => mW.Write((ushort)RoleTypes.Impostor)); {
messageWriter.ForEach(mW => mW.Write(false)); List<MessageWriter> messageWriter = AmongUsClient.Instance.StartRpcDesync(pc.NetId, (byte)RpcCalls.SetRole, SendOption.None, pc.GetClientId(), clientCheck);
AmongUsClient.Instance.FinishRpcDesync(messageWriter); messageWriter.ForEach(mW => mW.Write((ushort)RoleTypes.Impostor));
messageWriter.ForEach(mW => mW.Write(false));
AmongUsClient.Instance.FinishRpcDesync(messageWriter);
}
} }
pc.roleAssigned = true; pc.roleAssigned = true;
Logger.Log($"Assigned {Utils.GetRoleName(kvp.Key)} role to {pc.Data.PlayerName}", "RoleManager"); Logger.Log($"Assigned {Utils.GetRoleName(kvp.Key)} role to {pc.Data.PlayerName}", "RoleManager");
break; break;
@@ -226,14 +232,19 @@ public class RoleManagerPatch
CrewmateRoles[kvp.Key]--; CrewmateRoles[kvp.Key]--;
Crewmates.Add(pc); Crewmates.Add(pc);
pc.RpcSetRole(kvp.Key); pc.RpcSetRole(kvp.Key);
// Desync role to other clients to prevent revealing the true role // Desync role to other clients to prevent revealing the true role
if (kvp.Key is not RoleTypes.Noisemaker) if (BetterGameSettings.DesyncRoles.GetBool())
{ {
List<MessageWriter> messageWriter = AmongUsClient.Instance.StartRpcDesync(pc.NetId, (byte)RpcCalls.SetRole, SendOption.None, pc.GetClientId(), clientCheck); if (kvp.Key is not RoleTypes.Noisemaker)
messageWriter.ForEach(mW => mW.Write((ushort)RoleTypes.Crewmate)); {
messageWriter.ForEach(mW => mW.Write(false)); List<MessageWriter> messageWriter = AmongUsClient.Instance.StartRpcDesync(pc.NetId, (byte)RpcCalls.SetRole, SendOption.None, pc.GetClientId(), clientCheck);
AmongUsClient.Instance.FinishRpcDesync(messageWriter); messageWriter.ForEach(mW => mW.Write((ushort)RoleTypes.Crewmate));
messageWriter.ForEach(mW => mW.Write(false));
AmongUsClient.Instance.FinishRpcDesync(messageWriter);
}
} }
pc.roleAssigned = true; pc.roleAssigned = true;
Logger.Log($"Assigned {Utils.GetRoleName(kvp.Key)} role to {pc.Data.PlayerName}", "RoleManager"); Logger.Log($"Assigned {Utils.GetRoleName(kvp.Key)} role to {pc.Data.PlayerName}", "RoleManager");
break; break;
@@ -286,10 +297,41 @@ public class RoleManagerPatch
Impostors.Add(player); Impostors.Add(player);
player.RpcSetRole(RoleTypes.Impostor); player.RpcSetRole(RoleTypes.Impostor);
player.roleAssigned = true; player.roleAssigned = true;
NumImpostors--;
Logger.Log($"Settings Assigned {Utils.GetRoleName(RoleTypes.Impostor)} role to {player.Data.PlayerName}", "RoleManager"); Logger.Log($"Settings Assigned {Utils.GetRoleName(RoleTypes.Impostor)} role to {player.Data.PlayerName}", "RoleManager");
} }
} }
var betterImpostorSettings = new int[]
{
-1,
BetterGameSettingsTemp.HideAndSeekImp2.GetValue(),
BetterGameSettingsTemp.HideAndSeekImp3.GetValue(),
BetterGameSettingsTemp.HideAndSeekImp4.GetValue(),
BetterGameSettingsTemp.HideAndSeekImp5.GetValue()
};
for (int i = 1; i < BetterGameSettings.HideAndSeekImpNum.GetInt(); i++)
{
int tempSetImpostor = betterImpostorSettings[i];
if (tempSetImpostor >= 0)
{
var player = Utils.PlayerFromId(tempSetImpostor);
if (player != null)
{
if (NumImpostors > 0 && !Impostors.Contains(player))
{
Impostors.Add(player);
player.RpcSetRole(RoleTypes.Impostor);
player.roleAssigned = true;
NumImpostors--;
Logger.Log($"Settings Assigned {Utils.GetRoleName(RoleTypes.Impostor)} role to {player.Data.PlayerName}", "RoleManager");
}
}
}
}
// Override player role assignment // Override player role assignment
if (SetPlayerRole.Keys.Any()) if (SetPlayerRole.Keys.Any())
{ {
@@ -377,8 +419,6 @@ public class RoleManagerPatch
[HarmonyPrefix] [HarmonyPrefix]
public static bool AssignRoleOnDeath_Prefix(/*RoleManager __instance*/ [HarmonyArgument(0)] PlayerControl player) public static bool AssignRoleOnDeath_Prefix(/*RoleManager __instance*/ [HarmonyArgument(0)] PlayerControl player)
{ {
if (!Main.BetterRoleAlgorithma.Value) return true;
Dictionary<RoleTypes, int> GhostRoles = new() // Role, Amount Dictionary<RoleTypes, int> GhostRoles = new() // Role, Amount
{ {
{ RoleTypes.GuardianAngel, 0 }, { RoleTypes.GuardianAngel, 0 },
@@ -411,11 +451,16 @@ public class RoleManagerPatch
if (kvp.Value > 0 && RNG() <= GameOptionsManager.Instance.CurrentGameOptions.RoleOptions.GetChancePerGame(kvp.Key)) if (kvp.Value > 0 && RNG() <= GameOptionsManager.Instance.CurrentGameOptions.RoleOptions.GetChancePerGame(kvp.Key))
{ {
player.RpcSetRole(kvp.Key); player.RpcSetRole(kvp.Key);
// Desync role to other clients to prevent revealing the true role // Desync role to other clients to prevent revealing the true role
List<MessageWriter> messageWriter = AmongUsClient.Instance.StartRpcDesync(player.NetId, (byte)RpcCalls.SetRole, SendOption.None, player.GetClientId(), clientCheck); if (BetterGameSettings.DesyncRoles.GetBool())
messageWriter.ForEach(mW => mW.Write((ushort)player.Data.Role.DefaultGhostRole)); {
messageWriter.ForEach(mW => mW.Write(false)); List<MessageWriter> messageWriter = AmongUsClient.Instance.StartRpcDesync(player.NetId, (byte)RpcCalls.SetRole, SendOption.None, player.GetClientId(), clientCheck);
AmongUsClient.Instance.FinishRpcDesync(messageWriter); messageWriter.ForEach(mW => mW.Write((ushort)player.Data.Role.DefaultGhostRole));
messageWriter.ForEach(mW => mW.Write(false));
AmongUsClient.Instance.FinishRpcDesync(messageWriter);
}
return false; return false;
} }
} }
@@ -450,5 +495,16 @@ public class RoleManagerPatch
return shuffledDictionary; return shuffledDictionary;
} }
private static int RNG() => random.Next(0, 100); public static int RNG()
{
switch (BetterGameSettings.RoleRandomizer.GetValue())
{
case 1:
return UnityEngine.Random.Range(0, 100);
default:
Random Random = new Random();
return Random.Next(0, 100);
}
}
} }
+1 -1
View File
@@ -9,6 +9,6 @@ public class VersionShowerPatch
[HarmonyPostfix] [HarmonyPostfix]
public static void Postfix(VersionShower __instance) public static void Postfix(VersionShower __instance)
{ {
__instance.text.text = $"<color=#0dff00>♻BetterAmongUs♻ {Main.GetVersionText()}</color> - " + __instance.text.text; __instance.text.text = $"<color=#0dff00>♻BetterAmongUs♻ {Main.GetVersionText()}</color> <color=#ababab>~</color> {Utils.GetPlatformName(Main.PlatformData.Platform)} v{Main.AmongUsVersion}";
} }
} }
+47
View File
@@ -0,0 +1,47 @@
#Number:110002
#Title:Better Among Us v1.1.0
#SubTitle:<color=#4d4d4d>Settings Galore!</color>
#ShortTitle:BAU v1.1.0
#Date:2024-8-24T00:00:00Z
#-----------------------------
We are thrilled to announce the release of <b>BetterAmongUs</b> v1.1.0
#
BetterAmongUs comes packed with a variety of features designed to improve your gameplay experience:
#
<size=150%>Change Log</size>
#
<b>Client</b>
New: Added new intro on boot up
New: Added ability to skip intro by clicking the left or right Mouse button
New: Added Better Option to have chat always visible
Fixed: All players appearing in the role intro
#
<b>Lobby Settings</b>
New: Added the ability to bypass number restrictions in lobby settings
New: Added Better Settings tab with new settings
New: Game Settings is now the default tab when opening lobby settings panel
New: Lobby Settings panel is now available for Non-Host but only Better Settings is editable
Hide And Seek
New: Added Better Setting to set imposter amount
Requires Better Role Algorithm
#
<b>Anti-Cheat</b>
Added list of Better Settings
1. When a player is caught cheating
2. Allow invalid friendCodes
3. Use Ban Player List
4. Use Ban Name List
5. Use Ban Word List
6. Detected player level = or >
7. Detect Cheat Clients
8. Detect Invalid RPCs
9. Detect Invalid Sabotages // Needs testing!
#
#
<size=150%>Issues & Bugs</size>
#
- If you encounter any issues or have feedback, please report them on our <nobr><link="https://github.com/D1GQ/BetterAmongUs-Public/issues">Github Issues Page</nobr></link> or Bug Reports channel in the <nobr><link="https://discord.gg/a3eVJHp9p5">BAU Discord Server</nobr></link>.
#
Thank you for your support, and we hope you enjoy the new features of <b>BetterAmongUs</b>!
#
<size=150%><nobr><link="https://discord.gg/vjYrXpzNAn">Discord</nobr></link> </size> <size=150%><nobr><link="https://github.com/D1GQ/BetterAmongUs-Public">Github</nobr></link> </size>
+6 -6
View File
@@ -27,8 +27,8 @@ public class Main : BasePlugin
public const string HotfixNum = "0"; public const string HotfixNum = "0";
public const bool IsHotFix = false; public const bool IsHotFix = false;
public const string PluginGuid = "com.d1gq.betteramongus"; public const string PluginGuid = "com.d1gq.betteramongus";
public const string PluginVersion = "1.1.0"; public const string PluginVersion = "1.1.1";
public const string ReleaseDate = "08.24.2024"; // mm/dd/yyyy public const string ReleaseDate = "08.25.2024"; // mm/dd/yyyy
public const string Github = "https://github.com/D1GQ/BetterAmongUs-Public"; public const string Github = "https://github.com/D1GQ/BetterAmongUs-Public";
public const string Discord = "https://discord.gg/vjYrXpzNAn"; public const string Discord = "https://discord.gg/vjYrXpzNAn";
@@ -84,6 +84,8 @@ public class Main : BasePlugin
public static string BetterAmongUsVersion => PluginVersion; public static string BetterAmongUsVersion => PluginVersion;
public static string AmongUsVersion => Application.version; public static string AmongUsVersion => Application.version;
public static PlatformSpecificData PlatformData => Constants.GetPlatformData();
public static List<string> SupportedAmongUsVersions = public static List<string> SupportedAmongUsVersions =
[ [
"2024.8.13", "2024.8.13",
@@ -143,7 +145,7 @@ public class Main : BasePlugin
BetterDataManager.LoadData(); BetterDataManager.LoadData();
LoadOptions(); LoadOptions();
if (File.Exists(Path.Combine($"{Environment.CurrentDirectory}/Among Us_Data/Plugins/x86", "steam_api.dll"))) if (PlatformData.Platform == Platforms.StandaloneSteamPC)
File.WriteAllText(Path.Combine(Environment.CurrentDirectory, "steam_appid.txt"), "945360"); File.WriteAllText(Path.Combine(Environment.CurrentDirectory, "steam_appid.txt"), "945360");
if (File.Exists(Path.Combine(BetterDataManager.filePathFolder, "better-log.txt"))) if (File.Exists(Path.Combine(BetterDataManager.filePathFolder, "better-log.txt")))
@@ -164,7 +166,7 @@ public class Main : BasePlugin
string SupportedVersions = string.Empty; string SupportedVersions = string.Empty;
foreach (string text in SupportedAmongUsVersions.ToArray()) foreach (string text in SupportedAmongUsVersions.ToArray())
SupportedVersions += $"{text} "; SupportedVersions += $"{text} ";
BetterAmongUs.Logger.Log($"BetterAmongUs {BetterAmongUsVersion}-{ReleaseDate} - [{AmongUsVersion} --> {SupportedVersions.Substring(0, SupportedVersions.Length - 1)}]"); BetterAmongUs.Logger.Log($"BetterAmongUs {BetterAmongUsVersion}-{ReleaseDate} - [{AmongUsVersion} --> {SupportedVersions.Substring(0, SupportedVersions.Length - 1)}] {Utils.GetPlatformName(PlatformData.Platform)}");
} }
catch (Exception ex) catch (Exception ex)
{ {
@@ -174,7 +176,6 @@ public class Main : BasePlugin
public static ConfigEntry<bool> AntiCheat { get; private set; } public static ConfigEntry<bool> AntiCheat { get; private set; }
public static ConfigEntry<bool> BetterHost { get; private set; } public static ConfigEntry<bool> BetterHost { get; private set; }
public static ConfigEntry<bool> BetterRoleAlgorithma { get; private set; }
public static ConfigEntry<bool> BetterNotifications { get; private set; } public static ConfigEntry<bool> BetterNotifications { get; private set; }
public static ConfigEntry<bool> ChatInGameplay { get; private set; } public static ConfigEntry<bool> ChatInGameplay { get; private set; }
public static ConfigEntry<bool> LobbyPlayerInfo { get; private set; } public static ConfigEntry<bool> LobbyPlayerInfo { get; private set; }
@@ -186,7 +187,6 @@ public class Main : BasePlugin
{ {
AntiCheat = Config.Bind("Better Options", "AntiCheat", true); AntiCheat = Config.Bind("Better Options", "AntiCheat", true);
BetterHost = Config.Bind("Better Options", "BetterHost", false); BetterHost = Config.Bind("Better Options", "BetterHost", false);
BetterRoleAlgorithma = Config.Bind("Better Options", "BetterRoleAlgorithma", true);
BetterNotifications = Config.Bind("Better Options", "BetterNotifications", true); BetterNotifications = Config.Bind("Better Options", "BetterNotifications", true);
ChatInGameplay = Config.Bind("Better Options", "ChatInGameplay", true); ChatInGameplay = Config.Bind("Better Options", "ChatInGameplay", true);
LobbyPlayerInfo = Config.Bind("Better Options", "LobbyPlayerInfo", true); LobbyPlayerInfo = Config.Bind("Better Options", "LobbyPlayerInfo", true);