Compare commits

...
3 Commits
Author SHA1 Message Date
Gurge44 23c381e603 readme update 2023-12-26 17:54:46 +01:00
Gurge44 474513189c Add Shiftguard, Dark Theme Chat 2023-12-26 17:42:26 +01:00
Gurge44 cffeff8e64 Add settings & Nerf Scavenger 2023-12-26 13:16:37 +01:00
31 changed files with 192 additions and 139 deletions

No files matched your search

+2
View File
@@ -93,6 +93,7 @@ internal static class CustomRolesHelper
CustomRoles.Express => CustomRoles.Crewmate,
CustomRoles.NiceEraser => CustomRoles.Crewmate,
CustomRoles.TaskManager => CustomRoles.Crewmate,
CustomRoles.Shiftguard => CustomRoles.Crewmate,
CustomRoles.Mole => CustomRoles.Engineer,
CustomRoles.Sentinel => Options.UsePets.GetBool() ? CustomRoles.Crewmate : CustomRoles.Engineer,
CustomRoles.Electric => CustomRoles.Crewmate,
@@ -229,6 +230,7 @@ internal static class CustomRolesHelper
CustomRoles.Express => CustomRoles.CrewmateTOHE,
CustomRoles.NiceEraser => CustomRoles.CrewmateTOHE,
CustomRoles.TaskManager => CustomRoles.CrewmateTOHE,
CustomRoles.Shiftguard => CustomRoles.CrewmateTOHE,
CustomRoles.Mole => CustomRoles.EngineerTOHE,
CustomRoles.Sentinel => CustomRoles.EngineerTOHE,
CustomRoles.Electric => CustomRoles.CrewmateTOHE,
+12 -12
View File
@@ -5,18 +5,18 @@ namespace TOHE;
public static class CustomWinnerHolder
{
// 勝者のチームが格納されます。
// リザルトの背景色の決定などに使用されます。
// 注: この変数を変更する時、WinnerRoles・WinnerIdsを同時に変更しないと予期せぬ勝者が現れる可能性があります。
// The winning team will be stored.
// Used to determine background color of results, etc.
// Note: When changing this variable, if you do not change WinnerRoles and WinnerIds at the same time, unexpected winners may appear.
public static CustomWinner WinnerTeam;
// 追加勝利するプレイヤーのチームが格納されます。
// リザルトの表示に使用されます。
// Stores the team of additional winning players.
// Used to display results.
public static HashSet<AdditionalWinners> AdditionalWinnerTeams;
// 勝者の役職が格納され、この変数に格納されている役職のプレイヤーは全員勝利となります。
// チームとなるニュートラルの処理に最適です。
// The winning role is stored, and all players whose roles are stored in this variable win.
// Ideal for handling team neutrals.
public static HashSet<CustomRoles> WinnerRoles;
// 勝者のPlayerIDが格納され、このIDを持つプレイヤーは全員勝利します。
// 単独勝利するニュートラルの処理に最適です。
// Stores the winner's PlayerID, all players with this ID win.
// Ideal for handling neutrals that win alone.
public static HashSet<byte> WinnerIds;
public static void Reset()
@@ -31,20 +31,20 @@ public static class CustomWinnerHolder
WinnerRoles.Clear();
WinnerIds.Clear();
}
/// <summary><para>WinnerTeamに値を代入します。</para><para>すでに代入されている場合、AdditionalWinnerTeamsに追加します。</para></summary>
/// <summary><para>Assign a value to WinnerTeam. </para><para>Add to AdditionalWinnerTeams if already assigned.</para></summary>
public static void SetWinnerOrAdditonalWinner(CustomWinner winner)
{
if (WinnerTeam == CustomWinner.Default) WinnerTeam = winner;
else AdditionalWinnerTeams.Add((AdditionalWinners)winner);
}
/// <summary><para>WinnerTeamに値を代入します。</para><para>すでに代入されている場合、既存の値をAdditionalWinnerTeamsに追加してから代入します。</para></summary>
/// <summary><para>Assign a value to WinnerTeam. </para><para>If it is already assigned, add the existing value to AdditionalWinnerTeams and then assign it.</para></summary>
public static void ShiftWinnerAndSetWinner(CustomWinner winner)
{
if (WinnerTeam != CustomWinner.Default)
AdditionalWinnerTeams.Add((AdditionalWinners)WinnerTeam);
WinnerTeam = winner;
}
/// <summary><para>既存の値をすべて削除してから、WinnerTeamに値を代入します。</para></summary>
/// <summary><para>Delete any existing values and then assign the values to WinnerTeam.</para></summary>
public static void ResetAndSetWinner(CustomWinner winner)
{
Reset();
+1 -1
View File
@@ -885,7 +885,7 @@ static class ExtendedPlayerControl
public static void AddKillTimerToDict(this PlayerControl pc, bool half = false, float CD = -1f)
{
float resultKCD;
if (CD == -1)
if (CD == -1f)
{
if (Main.AllPlayerKillCooldown.TryGetValue(pc.PlayerId, out var kcd)) resultKCD = kcd;
else resultKCD = 0f;
+7 -1
View File
@@ -257,6 +257,7 @@ public static class Options
public static OptionItem WarlockCanKillSelf;
public static OptionItem WarlockShiftDuration;
public static OptionItem ScavengerKillCooldown;
public static OptionItem ScavengerKillDuration;
public static OptionItem ZombieKillCooldown;
public static OptionItem ZombieSpeedReduce;
public static OptionItem EvilWatcherChance;
@@ -1409,6 +1410,9 @@ public static class Options
ScavengerKillCooldown = FloatOptionItem.Create(4010, "KillCooldown", new(0f, 180f, 2.5f), 40f, TabGroup.ImpostorRoles, false)
.SetParent(CustomRoleSpawnChances[CustomRoles.Scavenger])
.SetValueFormat(OptionFormat.Seconds);
ScavengerKillDuration = FloatOptionItem.Create(4011, "ScavengerKillDuration", new(0f, 90f, 0.5f), 5f, TabGroup.ImpostorRoles, false)
.SetParent(CustomRoleSpawnChances[CustomRoles.Scavenger])
.SetValueFormat(OptionFormat.Seconds);
RoleLoadingText = "Impostor roles\nShapemaster";
//SetupRoleOptions(4100, TabGroup.ImpostorRoles, CustomRoles.ShapeMaster);
//ShapeMasterShapeshiftDuration = FloatOptionItem.Create(4110, "ShapeshiftDuration", new(0, 180, 1), 10, TabGroup.ImpostorRoles, false)
@@ -1513,6 +1517,8 @@ public static class Options
.SetParent(CustomRoleSpawnChances[CustomRoles.Demolitionist]);
RoleLoadingText = "Crewmate roles\nTask Manager";
SetupRoleOptions(5575, TabGroup.CrewmateRoles, CustomRoles.TaskManager);
RoleLoadingText = "Crewmate roles\nShiftguard";
SetupRoleOptions(5594, TabGroup.CrewmateRoles, CustomRoles.Shiftguard);
RoleLoadingText = "Crewmate roles\nMole";
Mole.SetupCustomOption();
RoleLoadingText = "Crewmate roles\nSentinel";
@@ -3051,7 +3057,7 @@ public static class Options
.SetGameMode(CustomGameMode.Standard)
.SetHidden(true)
.SetColor(new Color32(255, 153, 153, byte.MaxValue));
DisableShapeshiftAnimations = BooleanOptionItem.Create(22604, "DisableShapeshiftAnimations", false, TabGroup.GameSettings, false)
DisableShapeshiftAnimations = BooleanOptionItem.Create(22604, "DisableShapeshiftAnimations", true, TabGroup.GameSettings, false)
.SetGameMode(CustomGameMode.Standard)
.SetColor(new Color32(255, 153, 153, byte.MaxValue));
DisableVanillaRoles = BooleanOptionItem.Create(22600, "DisableVanillaRoles", true, TabGroup.GameSettings, false)
+6
View File
@@ -750,6 +750,12 @@ public static class Utils
case CustomRoles.Sprayer:
ProgressText.Append(Sprayer.ProgressText);
break;
case CustomRoles.Maverick:
int kills = Maverick.NumOfKills;
int min = Maverick.MinKillsToWin.GetInt();
Color color = kills >= min ? Color.green : Color.red;
ProgressText.Append(ColorString(color, $"{kills}/{min}"));
break;
case CustomRoles.Alchemist:
ProgressText.Append(Alchemist.GetProgressText(playerId));
break;
+6
View File
@@ -1,4 +1,5 @@
using HarmonyLib;
using UnityEngine;
namespace TOHE.Patches;
@@ -17,5 +18,10 @@ class ChatBubbleSetNamePatch
{
if (GameStates.IsInGame && __instance.playerInfo.PlayerId == PlayerControl.LocalPlayer.PlayerId)
__instance.NameText.color = PlayerControl.LocalPlayer.GetRoleColor();
if (Main.DarkTheme.Value)
{
__instance.Background.color = Color.black;
__instance.TextArea.color = Color.white;
}
}
}
+17 -1
View File
@@ -11,6 +11,7 @@ using TOHE.Modules;
using TOHE.Roles.Crewmate;
using TOHE.Roles.Impostor;
using UnityEngine;
using UnityEngine.UI;
using static TOHE.Translator;
@@ -1142,19 +1143,33 @@ internal class ChatUpdatePatch
public static bool DoBlockChat;
public static void Postfix(ChatController __instance)
{
var chatBubble = __instance.chatBubblePool.Prefab.Cast<ChatBubble>();
chatBubble.TextArea.overrideColorTags = false;
if (Main.DarkTheme.Value)
{
chatBubble.TextArea.color = Color.white;
chatBubble.Background.color = Color.black;
}
if (!AmongUsClient.Instance.AmHost || Main.MessagesToSend.Count == 0 || (Main.MessagesToSend[0].RECEIVER_ID == byte.MaxValue && Main.MessageWait.Value > __instance.timeSinceLastMessage) || DoBlockChat) return;
var player = Main.AllAlivePlayerControls.OrderBy(x => x.PlayerId).FirstOrDefault() ?? Main.AllPlayerControls.OrderBy(x => x.PlayerId).FirstOrDefault() ?? PlayerControl.LocalPlayer;
if (player == null) return;
(string msg, byte sendTo, string title) = Main.MessagesToSend[0];
Main.MessagesToSend.RemoveAt(0);
int clientId = sendTo == byte.MaxValue ? -1 : Utils.GetPlayerById(sendTo).GetClientId();
var name = player.Data.PlayerName;
if (clientId == -1)
{
player.SetName(title);
DestroyableSingleton<HudManager>.Instance.Chat.AddChat(player, msg);
player.SetName(name);
}
var writer = CustomRpcSender.Create("MessagesToSend", SendOption.None);
_ = writer.StartMessage(clientId);
_ = writer.StartRpc(player.NetId, (byte)RpcCalls.SetName)
@@ -1168,6 +1183,7 @@ internal class ChatUpdatePatch
.EndRpc();
_ = writer.EndMessage();
writer.SendMessage();
__instance.timeSinceLastMessage = 0f;
}
}
@@ -1196,7 +1212,7 @@ internal class UpdateCharCountPatch
__instance.charCountText.enableWordWrapping = false;
if (length < (AmongUsClient.Instance.AmHost ? 1700 : 250))
__instance.charCountText.color = Color.black;
else if (length < (AmongUsClient.Instance.AmHost ? 1900 : 300))
else if (length < (AmongUsClient.Instance.AmHost ? 2000 : 300))
__instance.charCountText.color = new Color(1f, 1f, 0f, 1f);
else
__instance.charCountText.color = Color.red;
+1 -1
View File
@@ -140,7 +140,7 @@ class GameEndChecker
CustomWinnerHolder.WinnerIds.Add(pc.PlayerId);
CustomWinnerHolder.AdditionalWinnerTeams.Add(AdditionalWinners.Sunnyboy);
break;
case CustomRoles.Maverick when pc.IsAlive():
case CustomRoles.Maverick when pc.IsAlive() && Maverick.NumOfKills >= Maverick.MinKillsToWin.GetInt():
CustomWinnerHolder.WinnerIds.Add(pc.PlayerId);
CustomWinnerHolder.AdditionalWinnerTeams.Add(AdditionalWinners.Maverick);
break;
+6 -1
View File
@@ -14,8 +14,9 @@ public static class OptionsMenuBehaviourStartPatch
private static ClientOptionItem EnableCustomButton;
private static ClientOptionItem EnableCustomSoundEffect;
private static ClientOptionItem SwitchVanilla;
public static ClientOptionItem UseVersionProtocol;
private static ClientOptionItem DarkTheme;
#if DEBUG
public static ClientOptionItem UseVersionProtocol;
private static ClientOptionItem VersionCheat;
private static ClientOptionItem GodMode;
#endif
@@ -78,6 +79,10 @@ public static class OptionsMenuBehaviourStartPatch
Main.Instance.Unload();
}
}
if (DarkTheme == null || DarkTheme.ToggleButton == null)
{
DarkTheme = ClientOptionItem.Create("EnableDarkTheme", Main.DarkTheme, __instance);
}
#if DEBUG
if (UseVersionProtocol == null || UseVersionProtocol.ToggleButton == null)
{
+1
View File
@@ -279,6 +279,7 @@ class BeginCrewmatePatch
=> ShipStatus.Instance.SabotageSound,
CustomRoles.Mastermind or
CustomRoles.Shiftguard or
CustomRoles.Gambler
=> GetIntroSound(RoleTypes.Shapeshifter),
+25 -5
View File
@@ -2,6 +2,7 @@ using HarmonyLib;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using TOHE.Modules;
using TOHE.Roles.Crewmate;
using TOHE.Roles.Impostor;
@@ -95,6 +96,8 @@ class ExternalRpcPetPatch
if (pc.HasAbilityCD()) return;
PlayerControl[] AllAlivePlayers = Main.AllAlivePlayerControls;
switch (pc.GetCustomRole())
{
// Crewmates
@@ -214,7 +217,7 @@ class ExternalRpcPetPatch
{
Main.DovesOfNeaceNumOfUsed[pc.PlayerId] -= 1;
//pc.RpcGuardAndKill(pc);
Main.AllAlivePlayerControls.Where(x =>
AllAlivePlayers.Where(x =>
pc.Is(CustomRoles.Madmate) ?
(x.CanUseKillButton() && x.GetCustomRole().IsCrewmate()) :
x.CanUseKillButton()
@@ -284,11 +287,26 @@ class ExternalRpcPetPatch
case CustomRoles.Sentinel:
Sentinel.StartPatrolling(pc);
break;
case CustomRoles.Lookout:
var sb = new StringBuilder();
for (int i = 0; i < AllAlivePlayers.Length; i++) if (i % 3 == 0) sb.AppendLine();
for (int i = 0; i < AllAlivePlayers.Length; i++)
{
PlayerControl player = AllAlivePlayers[i];
if (player == null) continue;
if (i != 0) sb.Append("; ");
string name = player.GetRealName();
byte id = player.PlayerId;
if (Main.PlayerColors.TryGetValue(id, out var color)) name = Utils.ColorString(color, name);
sb.Append($"{name} {id}");
if (i % 3 == 0 && i != AllAlivePlayers.Length - 1) sb.AppendLine();
}
pc.Notify(sb.ToString());
break;
// Impostors
case CustomRoles.Sniper:
if (!Sniper.IsAim[pc.PlayerId]) Main.AbilityCD.Remove(pc.PlayerId);
Sniper.OnShapeshift(pc, !Sniper.IsAim[pc.PlayerId]);
break;
case CustomRoles.Warlock:
@@ -301,7 +319,7 @@ class ExternalRpcPetPatch
UnityEngine.Vector2 cppos = cp.Pos();
Dictionary<PlayerControl, float> cpdistance = [];
float dis;
foreach (PlayerControl p in Main.AllAlivePlayerControls)
foreach (PlayerControl p in AllAlivePlayers)
{
if (p.PlayerId == cp.PlayerId) continue;
if (!Options.WarlockCanKillSelf.GetBool() && p.PlayerId == pc.PlayerId) continue;
@@ -383,7 +401,7 @@ class ExternalRpcPetPatch
}
_ = new LateTask(() =>
{
var totalAlive = Main.AllAlivePlayerControls.Length;
var totalAlive = AllAlivePlayers.Length;
if (Options.BomberDiesInExplosion.GetBool() && totalAlive > 1 && !GameStates.IsEnded)
{
pc.Suicide(PlayerState.DeathReason.Bombed);
@@ -408,7 +426,7 @@ class ExternalRpcPetPatch
}
_ = new LateTask(() =>
{
var totalAlive = Main.AllAlivePlayerControls.Length;
var totalAlive = AllAlivePlayers.Length;
if (totalAlive > 1 && !GameStates.IsEnded)
{
pc.Suicide(PlayerState.DeathReason.Bombed);
@@ -451,6 +469,8 @@ class ExternalRpcPetPatch
break;
}
if (pc.Is(CustomRoles.Sniper) && Sniper.IsAim[pc.PlayerId]) return;
pc.AddAbilityCD();
}
}
+43 -12
View File
@@ -688,17 +688,21 @@ class CheckMurderPatch
{
if (!target.Is(CustomRoles.Pestilence))
{
TP(target.NetTransform, Pelican.GetBlackRoomPS());
target.Suicide(PlayerState.DeathReason.Kill, killer);
killer.SetKillCooldown();
RPC.PlaySoundRPC(killer.PlayerId, Sounds.KillSound);
target.Notify(ColorString(GetRoleColor(CustomRoles.Scavenger), GetString("KilledByScavenger")));
float dur = Options.ScavengerKillDuration.GetFloat();
killer.Notify("....", dur);
_ = new LateTask(() =>
{
target.TP(Pelican.GetBlackRoomPS());
target.Suicide(PlayerState.DeathReason.Kill, killer);
killer.SetKillCooldown();
RPC.PlaySoundRPC(killer.PlayerId, Sounds.KillSound);
target.Notify(ColorString(GetRoleColor(CustomRoles.Scavenger), GetString("KilledByScavenger")));
}, dur, "Scavenger Kill");
return false;
}
if (target.Is(CustomRoles.Pestilence))
else
{
target.Kill(target);
target.SetRealKiller(killer);
killer.Suicide(PlayerState.DeathReason.Kill, target);
return false;
}
@@ -710,9 +714,18 @@ class CheckMurderPatch
_ = new LateTask(() =>
{
if (!Main.OverDeadPlayerList.Contains(target.PlayerId)) Main.OverDeadPlayerList.Add(target.PlayerId);
if (target.Is(CustomRoles.Avanger))
{
foreach (var pc in Main.AllAlivePlayerControls)
{
pc.Suicide(PlayerState.DeathReason.Revenge, target);
}
CustomWinnerHolder.ResetAndSetWinner(CustomWinner.None);
return;
}
var ops = target.Pos();
var rd = IRandom.Instance;
for (int i = 0; i < 20; i++)
for (int i = 0; i < 10; i++)
{
Vector2 location = new(ops.x + ((float)(rd.Next(0, 201) - 100) / 100), ops.y + ((float)(rd.Next(0, 201) - 100) / 100));
location += new Vector2(0, 0.3636f);
@@ -737,7 +750,7 @@ class CheckMurderPatch
messageWriter.Write((byte)ExtendedPlayerControl.ResultFlags);
AmongUsClient.Instance.FinishRpcImmediately(messageWriter);
}
TP(killer.NetTransform, ops);
killer.TP(ops);
}, 0.05f, "OverKiller Murder");
}
@@ -1180,6 +1193,9 @@ class MurderPlayerPatch
case CustomRoles.BloodKnight:
BloodKnight.OnMurderPlayer(killer, target);
break;
case CustomRoles.Maverick:
Maverick.NumOfKills++;
break;
case CustomRoles.Mafioso:
Mafioso.OnMurder();
break;
@@ -1315,7 +1331,7 @@ class CmdCheckShapeshiftPatch
}
// Triggered when the egg animation starts playing
//[HarmonyPatch(typeof(PlayerControl), nameof(PlayerControl.Shapeshift))]
[HarmonyPatch(typeof(PlayerControl), nameof(PlayerControl.Shapeshift))]
class ShapeshiftPatch
{
public static List<byte> IgnoreNextSS = [];
@@ -1605,7 +1621,7 @@ class ShapeshiftPatch
if (!shapeshifting || !isSSneeded)
{
_ = new LateTask(shapeshifter.RpcResetAbilityCooldown, 0.01f, "Reset SS CD");
_ = new LateTask(shapeshifter.RpcResetAbilityCooldown, 0.01f, log: false);
}
if (!isSSneeded)
@@ -1617,6 +1633,21 @@ class ShapeshiftPatch
return isSSneeded || !Options.DisableShapeshiftAnimations.GetBool() || !shapeshifting;
}
// Tasks that should run when someone performs a shapeshift (with the egg animation) should be here.
public static void Postfix(PlayerControl __instance, [HarmonyArgument(0)] PlayerControl target)
{
bool shapeshifting = __instance.PlayerId != target.PlayerId;
foreach (var pc in Main.AllAlivePlayerControls)
{
if (pc.Is(CustomRoles.Shiftguard))
{
if (shapeshifting) pc.Notify(GetString("ShiftguardNotifySS"));
else pc.Notify("ShiftguardNotifyUnshift");
}
}
}
}
[HarmonyPatch(typeof(PlayerControl), nameof(PlayerControl.ReportDeadBody))]
class ReportDeadBodyPatch
+1
View File
@@ -1,4 +1,5 @@
using HarmonyLib;
using UnityEngine;
namespace TOHE.Patches;
+14 -3
View File
@@ -32,6 +32,7 @@
- This mode makes everyone a killer and the last player alive wins
- Features: Random events, ranks and scoring, random ability gain for every kill, game timer, scoreboard (task list), unique end screen, fully customizable
### Overall improvements
- Role spawn chances are in percentages
- Gain more ability uses for completing tasks as crewmate roles
- Gain more ability uses for getting kills as impostor roles
- Most shapeshifting roles that only used shapeshifting as an ability trigger or a target selector now don't actually shapeshift with the egg animation, it's automatically canceled
@@ -129,6 +130,10 @@
- Detour (Crewmate)
- Gaulois (Crewmate)
- Analyzer (Crewmate)
- Electric (Crewmate)
- Mole (Crewmate)
- Tornado (Crewmate)
- Sentinel (Crewmate)
- Romantic (Neutral)
- Werewolf (Neutral)
- Imitator (Neutral)
@@ -140,6 +145,11 @@
- Postman (Neutral)
- Reckless (Neutral)
- Magician (Neutral)
- Enderman (Neutral)
- Mycologist (Neutral)
- Bubble (Neutral)
- Hookshot (Neutral)
- Sprayer (Neutral)
- Undertaker (Impostor)
- Gambler (Impostor)
- Mastermind (Impostor)
@@ -165,13 +175,14 @@
<br>
## Credit to these mods and their developers for the code and help:
### :star: [TOH Enhanced](https://github.com/0xDrMoe/TownofHost-Enhanced) :
### :star: [TOHEN](https://github.com/0xDrMoe/TownofHost-Enhanced) :
>
> - Our repo is forked from TOHE
> - Our repo is forked from TOHEN
>
### :star: [TOH Edited](https://github.com/KARPED1EM/TownOfHostEdited) :
### :star: [TOHE/TONX](https://github.com/KARPED1EM/TownOfHostEdited) :
>
> - Our repo is a continuation of TOHE
> - TONX reference: Modify character limit for chat messages
>
### :star: [TOH](https://github.com/tukasa0001/TownOfHost) :
>
+11 -1
View File
@@ -1073,6 +1073,7 @@
"ForceOwnLanguageRoleName","强制用您的语言显示职业名","Force role names in your language if possible","Использовать имя роли на вашем языке если возможно","強制用您的語言顯示職業名","强制用您的语言显示职业名"
"VersionCheat","绕过版本同步检查","Bypass version synchronization check","Обходить проверку синхронизаций версий","繞過版本同步檢查","绕过版本同步检查"
"GodMode","上帝模式","God Mode","Режим Бога","上帝模式",""
"EnableDarkTheme","","Enable Dark Theme","","",""
"AutoDisplayKillLog","结束后自动显示击杀记录","Display Kill-log","Показывать убийства","結束後自動顯示殺人紀錄","结束后自动显示击杀记录"
"AutoDisplayLastRoles","结束后自动显示上局职业","Display Last Roles","Показывать роли в прошлой игре","結束後自動顯示上局職業","结束后自动显示上局职业"
"AutoDisplayLastResult","结束后自动显示最终结果","Auto Display Last Result","Отображать результат последней игры в чате","結束後自動顯示最終結果","结束后自动显示最终结果"
@@ -1303,6 +1304,7 @@
"PuppeteerPuppetCanKillPuppeteer","","Puppet Can Kill The <color=#ff1919>Puppeteer</color>","","",""
"PuppeteerMaxPuppets","","Maximum Number of Puppets","","",""
"PuppeteerDiesAfterMaxPuppets","","<color=#ff1919>Puppeteer</color> Dies After Running Out Of Puppets","","",""
"ScavengerKillDuration","","Time After Kill Completes","","",""
"DeadImpCantSabotage","<color=#ff1919>内鬼</color>死后不能破坏","<color=#ff1919>Impostors</color> can't sabotage after they've died","Мертвые <color=#ff1919>Предатели</color> не могут саботажить","<color=#ff1919>内鬼</color>死后不能破坏",""
"DeadCrewCantSabotage","<color=#8cffff>船员</color>死后不能破坏","<color=#8cffff>Crewmates</color> can't sabotage after they've died","Мертвые <color=#8cffff>Члены Экипажа</color> не могут саботажить","",""
"DeadNeutralCantSabotage","<color=#7f8c8d>中立</color>死后不能破坏","<color=#7f8c8d>Neutrals</color> can't sabotage after they've died","Мертвые <color=#7f8c8d>Нейтралы</color> не могут саботажить","",""
@@ -1527,6 +1529,7 @@
"DeactivationIsVisibleOFF","<color=#ff4c6f>关闭</color>","<color=#ff4c6f>OFF</color>","<color=#ff4c6f>ВЫКЛ</color>","",""
"MedicResetCooldown","在尝试击杀时,将杀手的冷却时间重置为","On kill attempt, reset murderer's cooldown to","При попытке убийства сбросывать откат убийства на","",""
"MedicShieldedCanBeGuessed","猜测忽略<color=#00ff97>医疗</color>防护罩","Guessing ignores <color=#00ff97>Medic</color> shield","Игрока с щитом <color=#00ff97>Медика</color> можно угадать","",""
"MedicAmountOfShields","","Number of Shields Per Game","","",""
"DivinatorSkillLimit","调查员调查最大次数","(Initial) Max number of ability uses","Лимит Способности","占卜次數上限","占卜次数上限"
"MadmateSpawnMode","<color=#ff1919>叛徒</color>生成模式","<color=#ff1919>Madmate</color> spawning mode","Режим появления <color=#ff1919>Безумца</color>","<color=#ff1919>叛徒</color>生成模式","<color=#ff1919>叛徒</color>生成模式"
"MadmateSpawnMode.Assign","开局分配","Assign","Назначать","開局分配","开局分配"
@@ -2522,7 +2525,7 @@
"DivinatorCheck.Result7","<b>{0}</b>是保镖、自爆兵、烟花商人或核武器其中之一","<b>{0}</b> is either Bodyguard, Bomber, Lookout, Vengeful Romantic, Ruthless Romantic, Fireworker, or Nuker","","",""
"DivinatorCheck.Result8","<b>{0}</b>是赏金猎人、侦探、FFF团、清理工、美杜莎或愚者其中之一","<b>{0}</b> is either Bounty Hunter, Sprayer, Mafioso, Detective, Hater, Cleaner, Medusa, or Psychic","","",""
"DivinatorCheck.Result9","<b>{0}</b>是罪犯、处刑者、律师、告密者、分散者或法医其中之一","<b>{0}</b> is either Convict, Penguin, Hookshot, Executioner, Lawyer, Snitch, Disperser, or Doctor","","",""
"DivinatorCheck.Result10","<b>{0}</b>是议员、独裁者、法官、被诅咒的灵魂或呪狼其中之一","<b>{0}</b> is either Councillor, Escort, Bubble, Dictator, Judge, Cleanser, or Cursed Wolf","","",""
"DivinatorCheck.Result10","<b>{0}</b>是议员、独裁者、法官、被诅咒的灵魂或呪狼其中之一","<b>{0}</b> is either Councillor, Escort, Bubble, Shiftguard, Dictator, Judge, Cleanser, or Cursed Wolf","","",""
"DivinatorCheck.Result11","<b>{0}</b>是瘾君子、逃亡者、矿工或化形者其中之一","<b>{0}</b> is either Addict, Alchemist, Mycologist, Escapist, Miner, Demolitionist, or Morphling","","",""
"DivinatorCheck.Result12","<b>{0}</b>是玩家、僵尸、网红、大明星、死亡契约或吞噬者其中之一","<b>{0}</b> is either Demon, Enderman, Doormaster, Zombie, Celebrity, Super Star, Deathpact, or Devourer","","",""
"DivinatorCheck.Result13","<b>{0}</b>是神,神谕,幻想家,检查员其中之一","<b>{0}</b> is either God, Oracle, Gambler, Insight, Visionary, Nice Eraser, Swapper, or Inspector","","",""
@@ -2622,6 +2625,13 @@
"JailedNotifyMsg","","You have been locked up in Jail by the Jailor. No one can guess or judge you and you can only guess Jailor.\n\nIf Jailor votes you, you will be executed after the meeting ends.","","",""
"JailorTitle","","Jailor Message","","",""
"## Shiftguard"
"Shiftguard","","Shiftguard","","",""
"ShiftguardInfo","","Know When Someone Shapeshifts","","",""
"ShiftguardInfoLong","","(Crewmates):\nAs the Shiftguard, when someone shapeshifts or unshifts, you will be notified","","",""
"ShiftguardNotifySS","","Someone just shapeshifted as someone","","",""
"ShiftguardNotifyUnshift","","Someone just unshifted","","",""
"## Insight"
"Insight","","Insight","","",""
"InsightInfo","","Know What Roles Spawned","","",""
Can't render this file because it is too large.
+1
View File
@@ -193,6 +193,7 @@ public static class Divinator
CustomRoles.Judge or
CustomRoles.Escort or
CustomRoles.Bubble or
CustomRoles.Shiftguard or
//CustomRoles.CursedSoul or
CustomRoles.Cleanser or
CustomRoles.CursedWolf
+1
View File
@@ -31,6 +31,7 @@ namespace TOHE.Roles.Crewmate
CustomRoles.Express,
CustomRoles.NiceEraser,
CustomRoles.TaskManager,
CustomRoles.Shiftguard,
CustomRoles.Mole,
CustomRoles.Sentinel,
CustomRoles.Electric,
+13 -11
View File
@@ -22,6 +22,7 @@ public static class Medic
private static OptionItem ShieldDeactivationIsVisible;
private static OptionItem ResetCooldown;
public static OptionItem GuesserIgnoreShield;
private static OptionItem AmountOfShields;
public static readonly string[] MedicWhoCanSeeProtectName =
[
@@ -52,7 +53,7 @@ public static class Medic
WhoCanSeeProtect = StringOptionItem.Create(Id + 10, "MedicWhoCanSeeProtect", MedicWhoCanSeeProtectName, 0, TabGroup.CrewmateRoles, false)
.SetParent(Options.CustomRoleSpawnChances[CustomRoles.Medic]);
KnowShieldBroken = StringOptionItem.Create(Id + 16, "MedicKnowShieldBroken", KnowShieldBrokenOption, 1, TabGroup.CrewmateRoles, false)
.SetParent(Options.CustomRoleSpawnChances[CustomRoles.Medic]);
.SetParent(Options.CustomRoleSpawnChances[CustomRoles.Medic]);
ShieldDeactivatesWhenMedicDies = BooleanOptionItem.Create(Id + 24, "MedicShieldDeactivatesWhenMedicDies", true, TabGroup.CrewmateRoles, false)
.SetParent(Options.CustomRoleSpawnChances[CustomRoles.Medic]);
ShieldDeactivationIsVisible = StringOptionItem.Create(Id + 25, "MedicShielDeactivationIsVisible", ShieldDeactivationIsVisibleOption, 0, TabGroup.CrewmateRoles, false)
@@ -62,6 +63,8 @@ public static class Medic
.SetValueFormat(OptionFormat.Seconds);
GuesserIgnoreShield = BooleanOptionItem.Create(Id + 32, "MedicShieldedCanBeGuessed", true, TabGroup.CrewmateRoles, false)
.SetParent(Options.CustomRoleSpawnChances[CustomRoles.Medic]);
AmountOfShields = IntegerOptionItem.Create(Id + 34, "MedicAmountOfShields", new(1, 14, 1), 1, TabGroup.CrewmateRoles, false)
.SetParent(Options.CustomRoleSpawnChances[CustomRoles.Medic]);
}
public static void Init()
{
@@ -69,7 +72,7 @@ public static class Medic
ProtectList = [];
ProtectLimit = [];
TempMarkProtected = byte.MaxValue;
SkillLimit = 1;
SkillLimit = AmountOfShields.GetInt();
}
public static void Add(byte playerId)
{
@@ -129,7 +132,6 @@ public static class Medic
if (ProtectList.Contains(target.PlayerId)) return;
ProtectLimit[killer.PlayerId]--;
SkillLimit--;
SendRPC(killer.PlayerId);
ProtectList.Add(target.PlayerId);
@@ -186,7 +188,6 @@ public static class Medic
Main.AllPlayerControls.Where(x => ProtectList.Contains(x.PlayerId)).Do(x => x.Notify(Translator.GetString("MedicKillerTryBrokenShieldTargetForTarget")));
break;
default:
Utils.NotifyRoles(); // What is this?? Why is this here??
break;
}
@@ -200,13 +201,12 @@ public static class Medic
if (ShieldDeactivationIsVisible.GetInt() == 1)
{
TempMarkProtected = byte.MaxValue;
foreach (byte pc in playerIdList.ToArray())
foreach (byte id in playerIdList.ToArray())
{
Utils.NotifyRoles(SpecifySeer: Utils.GetPlayerById(pc));
}
foreach (byte pc in ProtectList.ToArray())
{
Utils.NotifyRoles(SpecifySeer: Utils.GetPlayerById(pc));
foreach (byte id2 in ProtectList.ToArray())
{
Utils.NotifyRoles(SpecifySeer: Utils.GetPlayerById(id), SpecifyTarget: Utils.GetPlayerById(id2));
}
}
}
}
@@ -215,9 +215,11 @@ public static class Medic
if (!target.Is(CustomRoles.Medic)) return;
if (!ShieldDeactivatesWhenMedicDies.GetBool()) return;
if (!playerIdList.All(x => !Utils.GetPlayerById(x).IsAlive())) return; // If not all Medic-s are dead, return
foreach (byte pc in ProtectList.ToArray())
{
Utils.NotifyRoles(SpecifySeer: Utils.GetPlayerById(pc));
Utils.NotifyRoles(SpecifySeer: Utils.GetPlayerById(pc), SpecifyTarget: target);
}
Utils.NotifyRoles(SpecifySeer: target);
-10
View File
@@ -40,8 +40,6 @@ public static class Wildling
{
playerIdList.Add(playerId);
TimeStamp.TryAdd(playerId, 0);
}
public static bool IsEnable => playerIdList.Count > 0;
private static void SendRPC(byte playerId)
@@ -91,12 +89,4 @@ public static class Wildling
}
return str.ToString();
}
public static void CanUseVent(PlayerControl player)
{
bool canUse = CanVent.GetBool();
DestroyableSingleton<HudManager>.Instance.ImpostorVentButton.ToggleVisible(canUse && !player.Data.IsDead);
player.Data.Role.CanVent = canUse;
}
}
-7
View File
@@ -93,11 +93,4 @@ public static class BloodKnight
public static void SetKillCooldown(byte id) => Main.AllPlayerKillCooldown[id] = KillCooldown.GetFloat();
public static void ApplyGameOptions(IGameOptions opt) => opt.SetVision(HasImpostorVision.GetBool());
public static void CanUseVent(PlayerControl player)
{
bool canUse = CanVent.GetBool();
DestroyableSingleton<HudManager>.Instance.ImpostorVentButton.ToggleVisible(canUse && !player.Data.IsDead);
player.Data.Role.CanVent = canUse;
}
}
-7
View File
@@ -23,7 +23,6 @@ public static class Gamer
public static void SetupCustomOption()
{
//玩家只能有一人
SetupSingleRoleOptions(Id, TabGroup.NeutralRoles, CustomRoles.Gamer, 1, zeroOne: false);
KillCooldown = FloatOptionItem.Create(Id + 10, "GamerKillCooldown", new(1f, 180f, 1f), 2f, TabGroup.NeutralRoles, false).SetParent(CustomRoleSpawnChances[CustomRoles.Gamer])
.SetValueFormat(OptionFormat.Seconds);
@@ -60,12 +59,6 @@ public static class Gamer
public static bool IsEnable => playerIdList.Count > 0;
public static void SetKillCooldown(byte id) => Main.AllPlayerKillCooldown[id] = KillCooldown.GetFloat();
public static void ApplyGameOptions(IGameOptions opt) => opt.SetVision(HasImpostorVision.GetBool());
public static void CanUseVent(PlayerControl player)
{
bool gamer_canUse = CanVent.GetBool();
DestroyableSingleton<HudManager>.Instance.ImpostorVentButton.ToggleVisible(gamer_canUse && !player.Data.IsDead);
player.Data.Role.CanVent = gamer_canUse;
}
private static void SendRPC(byte playerId)
{
if (!IsEnable || !Utils.DoRPC) return;
-7
View File
@@ -42,7 +42,6 @@ public static class Jackal
public static void SetupCustomOption()
{
//Jackalは1人固定
SetupSingleRoleOptions(Id, TabGroup.NeutralRoles, CustomRoles.Jackal, 1, zeroOne: false);
KillCooldown = FloatOptionItem.Create(Id + 10, "KillCooldown", new(0f, 180f, 2.5f), 22.5f, TabGroup.NeutralRoles, false).SetParent(CustomRoleSpawnChances[CustomRoles.Jackal])
.SetValueFormat(OptionFormat.Seconds);
@@ -117,12 +116,6 @@ public static class Jackal
HudManager.Instance.KillButton.OverrideText($"{GetString("KillButtonText")}");
}
public static void ApplyGameOptions(IGameOptions opt) => opt.SetVision(HasImpostorVision.GetBool());
public static void CanUseVent(PlayerControl player)
{
bool jackal_canUse = CanVent.GetBool();
DestroyableSingleton<HudManager>.Instance.ImpostorVentButton.ToggleVisible(jackal_canUse && !player.Data.IsDead);
player.Data.Role.CanVent = jackal_canUse;
}
public static void SetHudActive(HudManager __instance, bool isActive)
{
__instance.SabotageButton.ToggleVisible(isActive && CanUseSabotage.GetBool());
-7
View File
@@ -17,7 +17,6 @@ public static class Jinx
public static void SetupCustomOption()
{
//Jinxは1人固定
SetupSingleRoleOptions(Id, TabGroup.NeutralRoles, CustomRoles.Jinx, 1, zeroOne: false);
KillCooldown = FloatOptionItem.Create(Id + 10, "KillCooldown", new(0f, 180f, 2.5f), 22.5f, TabGroup.NeutralRoles, false).SetParent(CustomRoleSpawnChances[CustomRoles.Jinx])
.SetValueFormat(OptionFormat.Seconds);
@@ -43,10 +42,4 @@ public static class Jinx
public static bool IsEnable => playerIdList.Count > 0;
public static void SetKillCooldown(byte id) => Main.AllPlayerKillCooldown[id] = KillCooldown.GetFloat();
public static void ApplyGameOptions(IGameOptions opt) => opt.SetVision(HasImpostorVision.GetBool());
public static void CanUseVent(PlayerControl player)
{
bool Jinx_canUse = CanVent.GetBool();
DestroyableSingleton<HudManager>.Instance.ImpostorVentButton.ToggleVisible(Jinx_canUse && !player.Data.IsDead);
player.Data.Role.CanVent = Jinx_canUse;
}
}
+16 -14
View File
@@ -7,40 +7,42 @@ namespace TOHE.Roles.Neutral;
public static class Maverick
{
private static readonly int Id = 10000;
public static List<byte> playerIdList = [];
public static byte MaverickId = byte.MaxValue;
public static int NumOfKills = 0;
private static OptionItem KillCooldown;
public static OptionItem CanVent;
private static OptionItem HasImpostorVision;
public static OptionItem MinKillsToWin;
public static void SetupCustomOption()
{
//Maverickは1人固定
SetupSingleRoleOptions(Id, TabGroup.NeutralRoles, CustomRoles.Maverick, 1, zeroOne: false);
KillCooldown = FloatOptionItem.Create(Id + 10, "KillCooldown", new(0f, 180f, 2.5f), 35f, TabGroup.NeutralRoles, false).SetParent(CustomRoleSpawnChances[CustomRoles.Maverick])
KillCooldown = FloatOptionItem.Create(Id + 10, "KillCooldown", new(0f, 180f, 2.5f), 35f, TabGroup.NeutralRoles, false)
.SetParent(CustomRoleSpawnChances[CustomRoles.Maverick])
.SetValueFormat(OptionFormat.Seconds);
CanVent = BooleanOptionItem.Create(Id + 11, "CanVent", true, TabGroup.NeutralRoles, false).SetParent(CustomRoleSpawnChances[CustomRoles.Maverick]);
HasImpostorVision = BooleanOptionItem.Create(Id + 13, "ImpostorVision", true, TabGroup.NeutralRoles, false).SetParent(CustomRoleSpawnChances[CustomRoles.Maverick]);
CanVent = BooleanOptionItem.Create(Id + 11, "CanVent", true, TabGroup.NeutralRoles, false)
.SetParent(CustomRoleSpawnChances[CustomRoles.Maverick]);
HasImpostorVision = BooleanOptionItem.Create(Id + 13, "ImpostorVision", true, TabGroup.NeutralRoles, false)
.SetParent(CustomRoleSpawnChances[CustomRoles.Maverick]);
MinKillsToWin = IntegerOptionItem.Create(Id + 12, "DQNumOfKillsNeeded", new(0, 14, 1), 2, TabGroup.NeutralRoles, false)
.SetParent(CustomRoleSpawnChances[CustomRoles.Maverick]);
}
public static void Init()
{
playerIdList = [];
MaverickId = byte.MaxValue;
NumOfKills = 0;
}
public static void Add(byte playerId)
{
playerIdList.Add(playerId);
MaverickId = playerId;
NumOfKills = 0;
if (!AmongUsClient.Instance.AmHost) return;
if (!Main.ResetCamPlayerList.Contains(playerId))
Main.ResetCamPlayerList.Add(playerId);
}
public static bool IsEnable => playerIdList.Count > 0;
public static bool IsEnable => MaverickId != byte.MaxValue;
public static void SetKillCooldown(byte id) => Main.AllPlayerKillCooldown[id] = KillCooldown.GetFloat();
public static void ApplyGameOptions(IGameOptions opt) => opt.SetVision(HasImpostorVision.GetBool());
public static void CanUseVent(PlayerControl player)
{
bool Maverick_canUse = CanVent.GetBool();
DestroyableSingleton<HudManager>.Instance.ImpostorVentButton.ToggleVisible(Maverick_canUse && !player.Data.IsDead);
player.Data.Role.CanVent = Maverick_canUse;
}
}
-7
View File
@@ -16,7 +16,6 @@ public static class Medusa
public static void SetupCustomOption()
{
//Medusaは1人固定
SetupSingleRoleOptions(Id, TabGroup.NeutralRoles, CustomRoles.Medusa, 1, zeroOne: false);
KillCooldown = FloatOptionItem.Create(Id + 10, "KillCooldown", new(0f, 180f, 2.5f), 30f, TabGroup.NeutralRoles, false).SetParent(CustomRoleSpawnChances[CustomRoles.Medusa])
.SetValueFormat(OptionFormat.Seconds);
@@ -40,10 +39,4 @@ public static class Medusa
public static bool IsEnable => playerIdList.Count > 0;
public static void SetKillCooldown(byte id) => Main.AllPlayerKillCooldown[id] = KillCooldown.GetFloat();
public static void ApplyGameOptions(IGameOptions opt) => opt.SetVision(HasImpostorVision.GetBool());
public static void CanUseVent(PlayerControl player)
{
bool Medusa_canUse = CanVent.GetBool();
DestroyableSingleton<HudManager>.Instance.ImpostorVentButton.ToggleVisible(Medusa_canUse && !player.Data.IsDead);
player.Data.Role.CanVent = Medusa_canUse;
}
}
-7
View File
@@ -16,7 +16,6 @@ public static class Pickpocket
public static void SetupCustomOption()
{
//Pickpocketは1人固定
SetupSingleRoleOptions(Id, TabGroup.NeutralRoles, CustomRoles.Pickpocket, 1, zeroOne: false);
KillCooldown = FloatOptionItem.Create(Id + 10, "KillCooldown", new(0f, 180f, 2.5f), 22.5f, TabGroup.NeutralRoles, false).SetParent(CustomRoleSpawnChances[CustomRoles.Pickpocket])
.SetValueFormat(OptionFormat.Seconds);
@@ -40,10 +39,4 @@ public static class Pickpocket
public static bool IsEnable => playerIdList.Count > 0;
public static void SetKillCooldown(byte id) => Main.AllPlayerKillCooldown[id] = KillCooldown.GetFloat();
public static void ApplyGameOptions(IGameOptions opt) => opt.SetVision(HasImpostorVision.GetBool());
public static void CanUseVent(PlayerControl player)
{
bool Pickpocket_canUse = CanVent.GetBool();
DestroyableSingleton<HudManager>.Instance.ImpostorVentButton.ToggleVisible(Pickpocket_canUse && !player.Data.IsDead);
player.Data.Role.CanVent = Pickpocket_canUse;
}
}
-6
View File
@@ -124,12 +124,6 @@ namespace TOHE.Roles.Neutral
return IsWatch;
}
public static void ApplyGameOptions(IGameOptions opt) => opt.SetVision(HasImpostorVision.GetBool());
public static void CanUseVent(PlayerControl player)
{
bool canUse = CanVent.GetBool();
DestroyableSingleton<HudManager>.Instance.ImpostorVentButton.ToggleVisible(canUse && !player.Data.IsDead);
player.Data.Role.CanVent = canUse;
}
public static string GetRitualCount(byte playerId) => Utils.ColorString(RitualCount[playerId] > 0 ? Utils.GetRoleColor(CustomRoles.Ritualist).ShadeColor(0.25f) : Color.gray, RitualCount.TryGetValue(playerId, out var shotLimit) ? $"({shotLimit})" : "Invalid");
}
-7
View File
@@ -26,11 +26,4 @@ public static class Sidekick
{
__instance.SabotageButton.ToggleVisible(isActive && Jackal.CanUseSabotageSK.GetBool());
}
public static void CanUseVent(PlayerControl player)
{
bool Sidekick_canUse = Jackal.CanVentSK.GetBool();
DestroyableSingleton<HudManager>.Instance.ImpostorVentButton.ToggleVisible(Sidekick_canUse && !player.Data.IsDead);
player.Data.Role.CanVent = Sidekick_canUse;
}
}
-7
View File
@@ -16,7 +16,6 @@ public static class Traitor
public static void SetupCustomOption()
{
//Traitorは1人固定
SetupSingleRoleOptions(Id, TabGroup.NeutralRoles, CustomRoles.Traitor, 1, zeroOne: false);
KillCooldown = FloatOptionItem.Create(Id + 10, "KillCooldown", new(0f, 180f, 2.5f), 22.5f, TabGroup.NeutralRoles, false).SetParent(CustomRoleSpawnChances[CustomRoles.Traitor])
.SetValueFormat(OptionFormat.Seconds);
@@ -44,10 +43,4 @@ public static class Traitor
public static bool IsEnable => playerIdList.Count > 0;
public static void SetKillCooldown(byte id) => Main.AllPlayerKillCooldown[id] = KillCooldown.GetFloat();
public static void ApplyGameOptions(IGameOptions opt) => opt.SetVision(HasImpostorVision.GetBool());
public static void CanUseVent(PlayerControl player)
{
bool Traitor_canUse = CanVent.GetBool();
DestroyableSingleton<HudManager>.Instance.ImpostorVentButton.ToggleVisible(Traitor_canUse && !player.Data.IsDead);
player.Data.Role.CanVent = Traitor_canUse;
}
}
+2 -2
View File
@@ -7,7 +7,7 @@
<Description>TOHE+</Description>
<Authors>Gurge44</Authors>
<langVersion>preview</langVersion>
<AmongUs>D:\Epic Games\AmongUs</AmongUs>
<AmongUs>E:\Program Files\AmongUs</AmongUs>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<Optimize>True</Optimize>
<AssemblyName>$(MSBuildProjectName)+</AssemblyName>
@@ -34,7 +34,7 @@
<ItemGroup>
<PackageReference Include="AmongUs.GameLibs.Steam" Version="2023.11.28" PrivateAssets="all" />
<PackageReference Include="BepInEx.IL2CPP.MSBuild" Version="2.1.0-rc.1" />
<PackageReference Include="BepInEx.Unity.IL2CPP" Version="6.0.0-be.679" Private="false" ExcludeAssets="runtime;native" />
<PackageReference Include="BepInEx.Unity.IL2CPP" Version="6.0.0-be.682" Private="false" ExcludeAssets="runtime;native" />
<PackageReference Include="Samboy063.Cpp2IL.Core" Version="2022.1.0-development.898" />
</ItemGroup>
+6 -2
View File
@@ -33,8 +33,8 @@ public class Main : BasePlugin
public static ConfigEntry<string> DebugKeyInput { get; private set; }
public static readonly string MainMenuText = " ";
public const string PluginGuid = "com.gurge44.toheplus";
public const string PluginVersion = "2.1.0";
public const string PluginDisplayVersion = "2.1.0";
public const string PluginVersion = "2.1.1";
public const string PluginDisplayVersion = "2.1.1";
public static readonly string SupportedAUVersion = "2023.10.24";
public const int PluginCreate = 3;
public const bool Canary = false;
@@ -66,6 +66,7 @@ public class Main : BasePlugin
public static ConfigEntry<bool> SwitchVanilla { get; private set; }
public static ConfigEntry<bool> VersionCheat { get; private set; }
public static ConfigEntry<bool> GodMode { get; private set; }
public static ConfigEntry<bool> DarkTheme { get; private set; }
public static Dictionary<byte, PlayerVersion> playerVersion = [];
//Preset Name Options
@@ -264,6 +265,7 @@ public class Main : BasePlugin
VersionCheat = Config.Bind("Client Options", "VersionCheat", false);
GodMode = Config.Bind("Client Options", "GodMode", false);
UseVersionProtocol = Config.Bind("Client Options", "UseVersionProtocol", true);
DarkTheme = Config.Bind("Client Options", "DarkTheme", false);
Logger = BepInEx.Logging.Logger.CreateLogSource("TOHE");
TOHE.Logger.Enable();
@@ -344,6 +346,7 @@ public class Main : BasePlugin
{CustomRoles.Express, "#00ffff"},
{CustomRoles.NiceEraser, "#00a5ff"},
{CustomRoles.TaskManager, "#00ffa5"},
{CustomRoles.Shiftguard, "#eb34cc"},
{CustomRoles.Mole, "#00ff80"},
{CustomRoles.Sentinel, "#4bc8d6"},
{CustomRoles.Electric, "#fbff00"},
@@ -743,6 +746,7 @@ public enum CustomRoles
Express,
NiceEraser,
TaskManager,
Shiftguard,
Mole,
Sentinel,
Electric,