Continue Hacker & Visualize cooldowns for Pet button abilities

This commit is contained in:
Gurge44 committed 2023-10-06 17:30:40 +02:00
1 parent 30dde4fc60
commit fd2e7eea67
13 files changed
+224 -100

No files matched your search

+23 -23
View File
@@ -61,9 +61,9 @@ internal static class CustomRolesHelper
CustomRoles.Puppeteer => CustomRoles.Impostor,
CustomRoles.TimeThief => CustomRoles.Impostor,
CustomRoles.EvilTracker => CustomRoles.Shapeshifter,
CustomRoles.Paranoia => CustomRoles.Engineer,
CustomRoles.Paranoia => Options.UsePets.GetBool() ? CustomRoles.Crewmate : CustomRoles.Engineer,
CustomRoles.EngineerTOHE => CustomRoles.Engineer,
CustomRoles.TimeMaster => CustomRoles.Engineer,
CustomRoles.TimeMaster => Options.UsePets.GetBool() ? CustomRoles.Crewmate : CustomRoles.Engineer,
CustomRoles.CrewmateTOHE => CustomRoles.Crewmate,
CustomRoles.Cleanser => CustomRoles.Crewmate,
CustomRoles.Miner => CustomRoles.Shapeshifter,
@@ -82,11 +82,11 @@ internal static class CustomRolesHelper
CustomRoles.Express => CustomRoles.Crewmate,
CustomRoles.NiceEraser => CustomRoles.Crewmate,
CustomRoles.TaskManager => CustomRoles.Crewmate,
CustomRoles.NiceHacker => CustomRoles.Engineer,
CustomRoles.NiceHacker => Options.UsePets.GetBool() ? CustomRoles.Crewmate : CustomRoles.Engineer,
CustomRoles.Spy => CustomRoles.Crewmate,
CustomRoles.Ricochet => CustomRoles.Crewmate,
CustomRoles.Tether => CustomRoles.Engineer,
CustomRoles.Doormaster => CustomRoles.Engineer,
CustomRoles.Tether => Options.UsePets.GetBool() ? CustomRoles.Crewmate : CustomRoles.Engineer,
CustomRoles.Doormaster => Options.UsePets.GetBool() ? CustomRoles.Crewmate : CustomRoles.Engineer,
CustomRoles.Aid => CustomRoles.Impostor,
CustomRoles.Escapee => CustomRoles.Shapeshifter,
CustomRoles.NiceGuesser => CustomRoles.Crewmate,
@@ -103,12 +103,12 @@ internal static class CustomRolesHelper
CustomRoles.BoobyTrap => CustomRoles.Impostor,
CustomRoles.Scavenger => CustomRoles.Impostor,
CustomRoles.Transporter => CustomRoles.Crewmate,
CustomRoles.Veteran => CustomRoles.Engineer,
CustomRoles.Veteran => Options.UsePets.GetBool() ? CustomRoles.Crewmate : CustomRoles.Engineer,
CustomRoles.Capitalism => CustomRoles.Impostor,
CustomRoles.Bodyguard => CustomRoles.Crewmate,
CustomRoles.Grenadier => CustomRoles.Engineer,
CustomRoles.Lighter => CustomRoles.Engineer,
CustomRoles.SecurityGuard => CustomRoles.Engineer,
CustomRoles.Grenadier => Options.UsePets.GetBool() ? CustomRoles.Crewmate : CustomRoles.Engineer,
CustomRoles.Lighter => Options.UsePets.GetBool() ? CustomRoles.Crewmate : CustomRoles.Engineer,
CustomRoles.SecurityGuard => Options.UsePets.GetBool() ? CustomRoles.Crewmate : CustomRoles.Engineer,
CustomRoles.Gangster => CustomRoles.Impostor,
CustomRoles.Cleaner => CustomRoles.Impostor,
CustomRoles.Konan => CustomRoles.Crewmate,
@@ -135,7 +135,7 @@ internal static class CustomRolesHelper
CustomRoles.Swooper => CustomRoles.Impostor,
CustomRoles.Crewpostor => CustomRoles.Engineer,
CustomRoles.Observer => CustomRoles.Crewmate,
CustomRoles.DovesOfNeace => CustomRoles.Engineer,
CustomRoles.DovesOfNeace => Options.UsePets.GetBool() ? CustomRoles.Crewmate : CustomRoles.Engineer,
CustomRoles.Disperser => CustomRoles.Shapeshifter,
CustomRoles.Camouflager => CustomRoles.Shapeshifter,
CustomRoles.Dazzler => CustomRoles.Shapeshifter,
@@ -148,7 +148,7 @@ internal static class CustomRolesHelper
CustomRoles.Retributionist => CustomRoles.Crewmate,
CustomRoles.Guardian => CustomRoles.Crewmate,
CustomRoles.Addict => CustomRoles.Engineer,
CustomRoles.Alchemist => CustomRoles.Engineer,
CustomRoles.Alchemist => Options.UsePets.GetBool() ? CustomRoles.Crewmate : CustomRoles.Engineer,
CustomRoles.Chameleon => CustomRoles.Engineer,
CustomRoles.EvilSpirit => CustomRoles.GuardianAngel,
CustomRoles.Lurker => CustomRoles.Impostor,
@@ -176,12 +176,12 @@ internal static class CustomRolesHelper
CustomRoles.Mediumshiper => CustomRoles.CrewmateTOHE,
CustomRoles.Bodyguard => CustomRoles.CrewmateTOHE,
CustomRoles.ParityCop => CustomRoles.CrewmateTOHE,
CustomRoles.Grenadier => CustomRoles.EngineerTOHE,
CustomRoles.SecurityGuard => CustomRoles.EngineerTOHE,
CustomRoles.Lighter => CustomRoles.EngineerTOHE,
CustomRoles.Ignitor => CustomRoles.EngineerTOHE,
CustomRoles.Grenadier => Options.UsePets.GetBool() ? CustomRoles.CrewmateTOHE : CustomRoles.EngineerTOHE,
CustomRoles.SecurityGuard => Options.UsePets.GetBool() ? CustomRoles.CrewmateTOHE : CustomRoles.EngineerTOHE,
CustomRoles.Lighter => Options.UsePets.GetBool() ? CustomRoles.CrewmateTOHE : CustomRoles.EngineerTOHE,
CustomRoles.Ignitor => CustomRoles.CrewmateTOHE,
CustomRoles.Transporter => CustomRoles.CrewmateTOHE,
CustomRoles.Veteran => CustomRoles.CrewmateTOHE,
CustomRoles.Veteran => Options.UsePets.GetBool() ? CustomRoles.CrewmateTOHE : CustomRoles.EngineerTOHE,
CustomRoles.GuardianAngelTOHE => CustomRoles.GuardianAngel,
CustomRoles.Detective => CustomRoles.CrewmateTOHE,
CustomRoles.NiceGuesser => CustomRoles.CrewmateTOHE,
@@ -193,19 +193,19 @@ internal static class CustomRolesHelper
CustomRoles.Ventguard => CustomRoles.EngineerTOHE,
CustomRoles.Express => CustomRoles.CrewmateTOHE,
CustomRoles.NiceEraser => CustomRoles.CrewmateTOHE,
CustomRoles.TaskManager => CustomRoles.EngineerTOHE, // can't check if player is modded or not
CustomRoles.NiceHacker => CustomRoles.CrewmateTOHE,
CustomRoles.TaskManager => CustomRoles.CrewmateTOHE,
CustomRoles.NiceHacker => Options.UsePets.GetBool() ? CustomRoles.CrewmateTOHE : CustomRoles.EngineerTOHE,
CustomRoles.Spy => CustomRoles.CrewmateTOHE,
CustomRoles.Ricochet => CustomRoles.CrewmateTOHE,
CustomRoles.Aid => CustomRoles.CrewmateTOHE,
CustomRoles.Doormaster => CustomRoles.EngineerTOHE,
CustomRoles.Tether => CustomRoles.EngineerTOHE,
CustomRoles.Doormaster => Options.UsePets.GetBool() ? CustomRoles.CrewmateTOHE : CustomRoles.EngineerTOHE,
CustomRoles.Tether => Options.UsePets.GetBool() ? CustomRoles.CrewmateTOHE : CustomRoles.EngineerTOHE,
CustomRoles.Psychic => CustomRoles.CrewmateTOHE,
CustomRoles.Needy => CustomRoles.CrewmateTOHE,
CustomRoles.SuperStar => CustomRoles.CrewmateTOHE,
CustomRoles.Paranoia => CustomRoles.EngineerTOHE,
CustomRoles.Paranoia => Options.UsePets.GetBool() ? CustomRoles.CrewmateTOHE : CustomRoles.EngineerTOHE,
CustomRoles.EngineerTOHE => CustomRoles.EngineerTOHE,
CustomRoles.TimeMaster => CustomRoles.EngineerTOHE,
CustomRoles.TimeMaster => Options.UsePets.GetBool() ? CustomRoles.CrewmateTOHE : CustomRoles.EngineerTOHE,
CustomRoles.CrewmateTOHE => CustomRoles.CrewmateTOHE,
CustomRoles.Doctor => CustomRoles.ScientistTOHE,
CustomRoles.ScientistTOHE => CustomRoles.ScientistTOHE,
@@ -219,7 +219,7 @@ internal static class CustomRolesHelper
CustomRoles.Witness => CustomRoles.CrewmateTOHE,
CustomRoles.Guardian => CustomRoles.CrewmateTOHE,
CustomRoles.Addict => CustomRoles.EngineerTOHE,
CustomRoles.Alchemist => CustomRoles.EngineerTOHE,
CustomRoles.Alchemist => Options.UsePets.GetBool() ? CustomRoles.CrewmateTOHE : CustomRoles.EngineerTOHE,
CustomRoles.Oracle => CustomRoles.CrewmateTOHE,
CustomRoles.Chameleon => CustomRoles.EngineerTOHE,
_ => role.IsImpostor() ? CustomRoles.ImpostorTOHE : CustomRoles.CrewmateTOHE,
+5 -1
View File
@@ -5,7 +5,11 @@ namespace TOHE.Modules.Extensions;
public static class IGameManagerEx
{
public static void Set(this BoolOptionNames name, bool value, IGameOptions opt) => opt.SetBool(name, value);
public static void Set(this BoolOptionNames name, bool value, NormalGameOptionsV07 opt) => opt.SetBool(name, value);
public static void Set(this BoolOptionNames name, bool value, NormalGameOptionsV07 opt)
{
if (name != BoolOptionNames.GhostsDoTasks) opt.SetBool(name, value);
}
public static void Set(this BoolOptionNames name, bool value, HideNSeekGameOptionsV07 opt) => opt.SetBool(name, value);
public static void Set(this Int32OptionNames name, int value, IGameOptions opt) => opt.SetInt(name, value);
@@ -153,6 +153,10 @@ public class PlayerGameOptionsSender : GameOptionsSender
opt.SetFloat(FloatOptionNames.ImpostorLightMod, Gambler.LowVision.GetFloat());
}
break;
case CustomRoles.NiceHacker:
AURoleOptions.EngineerCooldown = NiceHacker.AbilityCD.GetFloat();
AURoleOptions.EngineerInVentMaxTime = 1f;
break;
case CustomRoles.Warlock:
AURoleOptions.ShapeshifterCooldown = Main.isCursed ? 1f : Options.DefaultKillCooldown;
AURoleOptions.ShapeshifterDuration = Options.WarlockShiftDuration.GetFloat();
+2 -1
View File
@@ -483,7 +483,8 @@ public class TaskState
Spy.UseLimit[player.PlayerId] += Spy.SpyAbilityUseGainWithEachTaskCompleted.GetFloat();
break;
case CustomRoles.NiceHacker:
NiceHacker.UseLimit[player.PlayerId] += NiceHacker.NiceHackerAbilityUseGainWithEachTaskCompleted.GetFloat();
if (!player.IsModClient()) NiceHacker.UseLimit[player.PlayerId] += NiceHacker.NiceHackerAbilityUseGainWithEachTaskCompleted.GetFloat();
else NiceHacker.UseLimitSeconds[player.PlayerId] += NiceHacker.NiceHackerAbilityUseGainWithEachTaskCompleted.GetInt() * NiceHacker.ModdedClientAbilityUseSecondsMultiplier.GetInt();
break;
}
}
+28 -5
View File
@@ -623,6 +623,8 @@ public static class Utils
break;
case CustomRoles.Alchemist:
ProgressText.Append(Alchemist.GetProgressText(playerId));
if (Options.UsePets.GetBool() && Main.AlchemistCD.TryGetValue(playerId, out var time) && !GetPlayerById(playerId).IsModClient())
ProgressText.Append(" " + string.Format(GetString("CDPT"), Alchemist.VentCooldown.GetInt() - (GetTimeStamp() - time)));
break;
case CustomRoles.Bandit:
ProgressText.Append(Bandit.GetStealLimit(playerId));
@@ -713,6 +715,8 @@ public static class Utils
else TextColor21 = Color.white;
ProgressText.Append(ColorString(TextColor2, $"<color=#777777>-</color> {Completed2}/{taskState2.AllTasksCount}"));
ProgressText.Append(ColorString(TextColor21, $" <color=#777777>-</color> {Math.Round(Main.VeteranNumOfUsed[playerId], 1)}"));
if (Options.UsePets.GetBool() && Main.VeteranCD.TryGetValue(playerId, out var time2) && !GetPlayerById(playerId).IsModClient())
ProgressText.Append(" " + string.Format(GetString("CDPT"), Options.VeteranSkillCooldown.GetInt() - (GetTimeStamp() - time2)));
break;
case CustomRoles.Grenadier:
var taskState3 = Main.PlayerStates?[playerId].GetTaskState();
@@ -728,6 +732,8 @@ public static class Utils
else TextColor31 = Color.white;
ProgressText.Append(ColorString(TextColor3, $"<color=#777777>-</color> {Completed3}/{taskState3.AllTasksCount}"));
ProgressText.Append(ColorString(TextColor31, $" <color=#777777>-</color> {Math.Round(Main.GrenadierNumOfUsed[playerId], 1)}"));
if (Options.UsePets.GetBool() && Main.GrenadierCD.TryGetValue(playerId, out var time3) && !GetPlayerById(playerId).IsModClient())
ProgressText.Append(" " + string.Format(GetString("CDPT"), Options.GrenadierSkillCooldown.GetInt() - (GetTimeStamp() - time3)));
break;
case CustomRoles.Divinator:
var taskState4 = Main.PlayerStates?[playerId].GetTaskState();
@@ -756,6 +762,8 @@ public static class Utils
else TextColor51 = Color.white;
ProgressText.Append(ColorString(TextColor5, $"<color=#777777>-</color> {Completed5}/{taskState5.AllTasksCount}"));
ProgressText.Append(ColorString(TextColor51, $" <color=#777777>-</color> {Math.Round(Main.DovesOfNeaceNumOfUsed[playerId], 1)}"));
if (Options.UsePets.GetBool() && Main.DovesOfNeaceCD.TryGetValue(playerId, out var time4) && !GetPlayerById(playerId).IsModClient())
ProgressText.Append(" " + string.Format(GetString("CDPT"), Options.DovesOfNeaceCooldown.GetInt() - (GetTimeStamp() - time4)));
break;
case CustomRoles.TimeMaster:
var taskState6 = Main.PlayerStates?[playerId].GetTaskState();
@@ -771,6 +779,8 @@ public static class Utils
else TextColor61 = Color.white;
ProgressText.Append(ColorString(TextColor6, $"<color=#777777>-</color> {Completed6}/{taskState6.AllTasksCount}"));
ProgressText.Append(ColorString(TextColor61, $" <color=#777777>-</color> {Math.Round(Main.TimeMasterNumOfUsed[playerId], 1)}"));
if (Options.UsePets.GetBool() && Main.TimeMasterCD.TryGetValue(playerId, out var time5) && !GetPlayerById(playerId).IsModClient())
ProgressText.Append(" " + string.Format(GetString("CDPT"), Options.TimeMasterSkillCooldown.GetInt() - (GetTimeStamp() - time5)));
break;
case CustomRoles.Mediumshiper:
var taskState7 = Main.PlayerStates?[playerId].GetTaskState();
@@ -885,6 +895,8 @@ public static class Utils
else TextColor141 = Color.white;
ProgressText.Append(ColorString(TextColor14, $"<color=#777777>-</color> {Completed14}/{taskState14.AllTasksCount}"));
ProgressText.Append(ColorString(TextColor141, $" <color=#777777>-</color> {Math.Round(Main.LighterNumOfUsed[playerId], 1)}"));
if (Options.UsePets.GetBool() && Main.LighterCD.TryGetValue(playerId, out var time6) && !GetPlayerById(playerId).IsModClient())
ProgressText.Append(" " + string.Format(GetString("CDPT"), Options.LighterSkillCooldown.GetInt() - (GetTimeStamp() - time6)));
break;
case CustomRoles.Ventguard:
var taskState15 = Main.PlayerStates?[playerId].GetTaskState();
@@ -914,6 +926,8 @@ public static class Utils
else TextColor161 = Color.white;
ProgressText.Append(ColorString(TextColor16, $"<color=#777777>-</color> {Completed16}/{taskState16.AllTasksCount}"));
ProgressText.Append(ColorString(TextColor161, $" <color=#777777>-</color> {Math.Round(Main.SecurityGuardNumOfUsed[playerId], 1)}"));
if (Options.UsePets.GetBool() && Main.SecurityGuardCD.TryGetValue(playerId, out var time7) && !GetPlayerById(playerId).IsModClient())
ProgressText.Append(" " + string.Format(GetString("CDPT"), Options.SecurityGuardSkillCooldown.GetInt() - (GetTimeStamp() - time7)));
break;
//case CustomRoles.Pirate:
// ProgressText.Append(ColorString(GetRoleColor(CustomRoles.Pirate).ShadeColor(0.25f), $"({Pirate.NumWin}/{Pirate.SuccessfulDuelsToWin.GetInt()})"));
@@ -935,6 +949,8 @@ public static class Utils
break;
case CustomRoles.NiceHacker:
ProgressText.Append(NiceHacker.GetProgressText(playerId, comms));
if (Options.UsePets.GetBool() && Main.HackerCD.TryGetValue(playerId, out var time8) && !GetPlayerById(playerId).IsModClient())
ProgressText.Append(" " + string.Format(GetString("CDPT"), NiceHacker.AbilityCD.GetInt() - (GetTimeStamp() - time8)));
break;
case CustomRoles.RiftMaker:
ProgressText.Append(RiftMaker.GetProgressText());
@@ -947,6 +963,8 @@ public static class Utils
break;
case CustomRoles.Doormaster:
ProgressText.Append(Doormaster.GetProgressText(playerId, comms));
if (Options.UsePets.GetBool() && Main.DoormasterCD.TryGetValue(playerId, out var time9) && !GetPlayerById(playerId).IsModClient())
ProgressText.Append(" " + string.Format(GetString("CDPT"), Doormaster.VentCooldown.GetInt() - (GetTimeStamp() - time9)));
break;
case CustomRoles.CopyCat:
ProgressText.Append(ColorString(GetRoleColor(CustomRoles.CopyCat).ShadeColor(0.25f), $"({(CopyCat.MiscopyLimit.TryGetValue(playerId, out var count2) ? count2 : 0)})"));
@@ -992,6 +1010,8 @@ public static class Utils
// break;
case CustomRoles.Tether:
ProgressText.Append(Tether.GetProgressText(playerId, comms));
if (Options.UsePets.GetBool() && Main.TetherCD.TryGetValue(playerId, out var time10) && !GetPlayerById(playerId).IsModClient())
ProgressText.Append(" " + string.Format(GetString("CDPT"), Tether.VentCooldown.GetInt() - (GetTimeStamp() - time10)));
break;
case CustomRoles.Spy:
ProgressText.Append(Spy.GetProgressText(playerId, comms));
@@ -2493,13 +2513,13 @@ public static class Utils
Main.ParanoiaCD.TryAdd(pc.PlayerId, GetTimeStamp());
break;
case CustomRoles.Grenadier:
Main.GrenadierCD.TryAdd(pc.PlayerId, GetTimeStamp());
Main.GrenadierCD.TryAdd(pc.PlayerId, GetTimeStamp() - Options.GrenadierSkillDuration.GetInt());
break;
case CustomRoles.Lighter:
Main.LighterCD.TryAdd(pc.PlayerId, GetTimeStamp());
Main.LighterCD.TryAdd(pc.PlayerId, GetTimeStamp() - Options.LighterSkillDuration.GetInt());
break;
case CustomRoles.SecurityGuard:
Main.SecurityGuardCD.TryAdd(pc.PlayerId, GetTimeStamp());
Main.SecurityGuardCD.TryAdd(pc.PlayerId, GetTimeStamp() - Options.SecurityGuardSkillDuration.GetInt());
break;
case CustomRoles.DovesOfNeace:
Main.DovesOfNeaceCD.TryAdd(pc.PlayerId, GetTimeStamp());
@@ -2508,10 +2528,13 @@ public static class Utils
Main.AlchemistCD.TryAdd(pc.PlayerId, GetTimeStamp());
break;
case CustomRoles.TimeMaster:
Main.TimeMasterCD.TryAdd(pc.PlayerId, GetTimeStamp());
Main.TimeMasterCD.TryAdd(pc.PlayerId, GetTimeStamp() - Options.TimeMasterSkillDuration.GetInt());
break;
case CustomRoles.Veteran:
Main.VeteranCD.TryAdd(pc.PlayerId, GetTimeStamp());
Main.VeteranCD.TryAdd(pc.PlayerId, GetTimeStamp() - Options.VeteranSkillDuration.GetInt());
break;
case CustomRoles.NiceHacker:
Main.HackerCD.TryAdd(pc.PlayerId, GetTimeStamp());
break;
}
}
+7 -6
View File
@@ -632,14 +632,15 @@ class MapBehaviourShowPatch
{
if (GameStates.IsMeeting) return true;
if (PlayerControl.LocalPlayer.Is(CustomRoles.NiceHacker) && !NiceHacker.MapHandle(PlayerControl.LocalPlayer, __instance, opts))
{
return false;
}
var player = PlayerControl.LocalPlayer;
if (opts.Mode is MapOptions.Modes.Normal or MapOptions.Modes.Sabotage)
if (player.GetCustomRole() == CustomRoles.NiceHacker && NiceHacker.playerIdList.ContainsKey(player.PlayerId))
{
Logger.Info("Mod Client uses Map", "NiceHacker");
NiceHacker.MapHandle(player, __instance, opts);
}
else if (opts.Mode is MapOptions.Modes.Normal or MapOptions.Modes.Sabotage)
{
var player = PlayerControl.LocalPlayer;
if (player.Is(CustomRoleTypes.Impostor) || player.Is(CustomRoles.Glitch) || player.Is(CustomRoles.Parasite) || player.Is(CustomRoles.Refugee) || (player.Is(CustomRoles.Jackal) && Jackal.CanUseSabotage.GetBool()) || (player.Is(CustomRoles.Traitor) && Traitor.CanUseSabotage.GetBool()))
opts.Mode = MapOptions.Modes.Sabotage;
else
+17 -4
View File
@@ -8,12 +8,11 @@ using TOHE.Roles.Impostor;
using static TOHE.Translator;
namespace TOHE;
/*
* HUGE THANKS TO
* ImaMapleTree / 단풍잎
* ImaMapleTree / 단풍잎 / Tealeaf
* FOR THE CODE
*
* THIS IS JUST SMALL FOR NOW BUT MAY EVENTUALLY BE BIG
*/
[HarmonyPatch(typeof(PlayerControl), nameof(PlayerControl.TryPet))]
@@ -75,6 +74,7 @@ class ExternalRpcPetPatch
}
Doormaster.OnEnterVent(pc);
pc.RpcResetAbilityCooldown();
pc.MyPhysics.CancelPet();
break;
case CustomRoles.Tether:
if (Main.TetherCD.ContainsKey(pc.PlayerId))
@@ -88,6 +88,7 @@ class ExternalRpcPetPatch
case CustomRoles.Mayor:
if (Main.MayorUsedButtonCount.TryGetValue(pc.PlayerId, out var count) && count < Options.MayorNumOfUseButton.GetInt() && !Main.MayorCD.ContainsKey(pc.PlayerId))
{
pc.MyPhysics.CancelPet();
pc?.ReportDeadBody(null);
}
break;
@@ -102,6 +103,7 @@ class ExternalRpcPetPatch
Utils.SendMessage(GetString("SkillUsedLeft") + (Options.ParanoiaNumOfUseButton.GetInt() - Main.ParaUsedButtonCount[pc.PlayerId]).ToString(), pc.PlayerId);
}, 4.0f, "Skill Remain Message");
}
pc.MyPhysics.CancelPet();
pc?.NoCheckStartMeeting(pc?.Data);
}
break;
@@ -122,6 +124,7 @@ class ExternalRpcPetPatch
Main.VeteranCD.TryAdd(pc.PlayerId, Utils.GetTimeStamp());
pc.RpcResetAbilityCooldown();
pc.MarkDirtySettings();
pc.MyPhysics.CancelPet();
}
else
{
@@ -155,6 +158,7 @@ class ExternalRpcPetPatch
pc.RpcResetAbilityCooldown();
Main.GrenadierNumOfUsed[pc.PlayerId] -= 1;
Utils.MarkEveryoneDirtySettingsV3();
pc.MyPhysics.CancelPet();
}
else
{
@@ -176,6 +180,7 @@ class ExternalRpcPetPatch
pc.RpcResetAbilityCooldown();
Main.LighterNumOfUsed[pc.PlayerId] -= 1;
pc.MarkDirtySettings();
pc.MyPhysics.CancelPet();
}
else
{
@@ -196,6 +201,7 @@ class ExternalRpcPetPatch
Main.SecurityGuardCD.TryAdd(pc.PlayerId, Utils.GetTimeStamp());
pc.RpcResetAbilityCooldown();
Main.SecurityGuardNumOfUsed[pc.PlayerId] -= 1;
pc.MyPhysics.CancelPet();
}
else
{
@@ -232,11 +238,13 @@ class ExternalRpcPetPatch
pc.Notify(string.Format(GetString("DovesOfNeaceOnGuard"), Main.DovesOfNeaceNumOfUsed[pc.PlayerId]));
Main.DovesOfNeaceCD.TryAdd(pc.PlayerId, Utils.GetTimeStamp());
pc.RpcResetAbilityCooldown();
pc.MyPhysics.CancelPet();
}
break;
case CustomRoles.Alchemist:
Alchemist.OnEnterVent(pc, 0, true);
pc.RpcResetAbilityCooldown();
pc.MyPhysics.CancelPet();
break;
case CustomRoles.TimeMaster:
if (Main.TimeMasterNumOfUsed[pc.PlayerId] >= 1)
@@ -248,12 +256,12 @@ class ExternalRpcPetPatch
}
Main.TimeMasterNumOfUsed[pc.PlayerId] -= 1;
Main.TimeMasterInProtect.Remove(pc.PlayerId);
Main.TimeMasterNumOfUsed[pc.PlayerId] -= 1;
Main.TimeMasterInProtect.Add(pc.PlayerId, Utils.GetTimeStamp());
//if (!pc.IsModClient()) pc.RpcGuardAndKill(pc);
pc.Notify(GetString("TimeMasterOnGuard"), Options.TimeMasterSkillDuration.GetFloat());
Main.TimeMasterCD.TryAdd(pc.PlayerId, Utils.GetTimeStamp());
pc.RpcResetAbilityCooldown();
pc.MyPhysics.CancelPet();
foreach (var player in Main.AllPlayerControls)
{
if (Main.TimeMasterBackTrack.ContainsKey(player.PlayerId))
@@ -275,6 +283,11 @@ class ExternalRpcPetPatch
pc.Notify(GetString("OutOfAbilityUsesDoMoreTasks"));
}
break;
case CustomRoles.NiceHacker:
NiceHacker.OnEnterVent(pc);
pc.RpcResetAbilityCooldown();
pc.MyPhysics.CancelPet();
break;
}
}
+32 -2
View File
@@ -14,7 +14,6 @@ using TOHE.Roles.Impostor;
using TOHE.Roles.Neutral;
using UnityEngine;
using static TOHE.Translator;
using static UnityEngine.ParticleSystem.PlaybackState;
namespace TOHE;
@@ -1955,67 +1954,97 @@ class FixedUpdatePatch
if (Main.DoormasterCD.TryGetValue(player.PlayerId, out var dm) && dm + Doormaster.VentCooldown.GetInt() < Utils.GetTimeStamp())
{
Main.DoormasterCD.Remove(player.PlayerId);
Utils.NotifyRoles(SpecifySeer: player);
}
if (Main.DoormasterCD.ContainsKey(player.PlayerId)) Utils.NotifyRoles(SpecifySeer: player);
break;
case CustomRoles.Tether:
if (Main.TetherCD.TryGetValue(player.PlayerId, out var th) && th + Tether.VentCooldown.GetInt() < Utils.GetTimeStamp())
{
Main.TetherCD.Remove(player.PlayerId);
Utils.NotifyRoles(SpecifySeer: player);
}
if (Main.TetherCD.ContainsKey(player.PlayerId)) Utils.NotifyRoles(SpecifySeer: player);
break;
case CustomRoles.Mayor:
if (Main.MayorCD.TryGetValue(player.PlayerId, out var my) && my + Options.DefaultKillCooldown < Utils.GetTimeStamp())
{
Main.MayorCD.Remove(player.PlayerId);
Utils.NotifyRoles(SpecifySeer: player);
}
if (Main.MayorCD.ContainsKey(player.PlayerId)) Utils.NotifyRoles(SpecifySeer: player);
break;
case CustomRoles.Paranoia:
if (Main.ParanoiaCD.TryGetValue(player.PlayerId, out var pn) && pn + Options.ParanoiaVentCooldown.GetInt() < Utils.GetTimeStamp())
{
Main.ParanoiaCD.Remove(player.PlayerId);
Utils.NotifyRoles(SpecifySeer: player);
}
if (Main.ParanoiaCD.ContainsKey(player.PlayerId)) Utils.NotifyRoles(SpecifySeer: player);
break;
case CustomRoles.Grenadier:
if (Main.GrenadierCD.TryGetValue(player.PlayerId, out var gd) && gd + Options.GrenadierSkillCooldown.GetInt() + Options.GrenadierSkillDuration.GetInt() < Utils.GetTimeStamp())
{
Main.GrenadierCD.Remove(player.PlayerId);
Utils.NotifyRoles(SpecifySeer: player);
}
if (Main.GrenadierCD.ContainsKey(player.PlayerId)) Utils.NotifyRoles(SpecifySeer: player);
break;
case CustomRoles.Lighter:
if (Main.LighterCD.TryGetValue(player.PlayerId, out var lt) && lt + Options.LighterSkillCooldown.GetInt() + Options.LighterSkillDuration.GetInt() < Utils.GetTimeStamp())
{
Main.LighterCD.Remove(player.PlayerId);
Utils.NotifyRoles(SpecifySeer: player);
}
if (Main.LighterCD.ContainsKey(player.PlayerId)) Utils.NotifyRoles(SpecifySeer: player);
break;
case CustomRoles.SecurityGuard:
if (Main.SecurityGuardCD.TryGetValue(player.PlayerId, out var sg) && sg + Options.SecurityGuardSkillCooldown.GetInt() + Options.SecurityGuardSkillDuration.GetInt() < Utils.GetTimeStamp())
{
Main.SecurityGuardCD.Remove(player.PlayerId);
Utils.NotifyRoles(SpecifySeer: player);
}
if (Main.SecurityGuardCD.ContainsKey(player.PlayerId)) Utils.NotifyRoles(SpecifySeer: player);
break;
case CustomRoles.DovesOfNeace:
if (Main.DovesOfNeaceCD.TryGetValue(player.PlayerId, out var don) && don + Options.DovesOfNeaceCooldown.GetInt() < Utils.GetTimeStamp())
{
Main.DovesOfNeaceCD.Remove(player.PlayerId);
Utils.NotifyRoles(SpecifySeer: player);
}
if (Main.DovesOfNeaceCD.ContainsKey(player.PlayerId)) Utils.NotifyRoles(SpecifySeer: player);
break;
case CustomRoles.Alchemist:
if (Main.AlchemistCD.TryGetValue(player.PlayerId, out var ac) && ac + Alchemist.VentCooldown.GetInt() < Utils.GetTimeStamp())
{
Main.AlchemistCD.Remove(player.PlayerId);
Utils.NotifyRoles(SpecifySeer: player);
}
if (Main.AlchemistCD.ContainsKey(player.PlayerId)) Utils.NotifyRoles(SpecifySeer: player);
break;
case CustomRoles.TimeMaster:
if (Main.TimeMasterCD.TryGetValue(player.PlayerId, out var tm) && tm + Options.TimeMasterSkillCooldown.GetInt() + Options.TimeMasterSkillDuration.GetInt() < Utils.GetTimeStamp())
{
Main.TimeMasterCD.Remove(player.PlayerId);
Utils.NotifyRoles(SpecifySeer: player);
}
if (Main.TimeMasterCD.ContainsKey(player.PlayerId)) Utils.NotifyRoles(SpecifySeer: player);
break;
case CustomRoles.Veteran:
if (Main.VeteranCD.TryGetValue(player.PlayerId, out var vr) && vr + Options.VeteranSkillCooldown.GetInt() + Options.VeteranSkillDuration.GetInt() < Utils.GetTimeStamp())
{
Main.VeteranCD.Remove(player.PlayerId);
Utils.NotifyRoles(SpecifySeer: player);
}
if (Main.VeteranCD.ContainsKey(player.PlayerId)) Utils.NotifyRoles(SpecifySeer: player);
break;
case CustomRoles.NiceHacker:
if (Main.HackerCD.TryGetValue(player.PlayerId, out var nh) && nh + NiceHacker.AbilityCD.GetInt() < Utils.GetTimeStamp())
{
Main.HackerCD.Remove(player.PlayerId);
if (!player.IsModClient()) Utils.NotifyRoles(SpecifySeer: player);
}
if (Main.HackerCD.ContainsKey(player.PlayerId) && !player.IsModClient()) Utils.NotifyRoles(SpecifySeer: player);
break;
}
}
@@ -2310,6 +2339,7 @@ class FixedUpdatePatch
if (player.Is(CustomRoles.Wraith)) Wraith.OnFixedUpdate(player);
if (player.Is(CustomRoles.Chameleon)) Chameleon.OnFixedUpdate(player);
if (player.Is(CustomRoles.Werewolf)) Werewolf.OnFixedUpdate(player);
if (player.Is(CustomRoles.NiceHacker)) NiceHacker.OnFixedUpdate(player);
if (player.Is(CustomRoles.Alchemist)) Alchemist.OnFixedUpdate(player);
if (player.Is(CustomRoles.BloodKnight)) BloodKnight.OnFixedUpdate(player);
if (player.Is(CustomRoles.Spiritcaller)) Spiritcaller.OnFixedUpdate(player);
@@ -2974,6 +3004,7 @@ class EnterVentPatch
if (Tether.IsEnable) Tether.OnEnterVent(pc, __instance.Id);
if (Werewolf.IsEnable) Werewolf.OnEnterVent(pc);
if (Lurker.IsEnable()) Lurker.OnEnterVent(pc);
if (NiceHacker.IsEnable) NiceHacker.OnEnterVent(pc);
if (Doormaster.IsEnable) Doormaster.OnEnterVent(pc);
if (pc.GetCustomRole() == CustomRoles.Ventguard)
@@ -3111,7 +3142,6 @@ class EnterVentPatch
{
Main.TimeMasterNumOfUsed[pc.PlayerId] -= 1;
Main.TimeMasterInProtect.Remove(pc.PlayerId);
Main.TimeMasterNumOfUsed[pc.PlayerId] -= 1;
Main.TimeMasterInProtect.Add(pc.PlayerId, Utils.GetTimeStamp());
//if (!pc.IsModClient()) pc.RpcGuardAndKill(pc);
pc.Notify(GetString("TimeMasterOnGuard"), Options.TimeMasterSkillDuration.GetFloat());
+19 -9
View File
@@ -1387,7 +1387,7 @@
"NotifyGodAlive","如果神存活则在会议上通知所有人","Inform players at meetings that God is still alive","Сообщать игрокам на встрече что Дьявол ещё жив","若神存活則在會議上通知所有人","如果神存活则在会议上通知所有人"
"TransporterTeleportMax","传送次数上限","Max number of teleports","Максимальное колличество телепортов","傳送次數上限","传送次数上限"
"TriggerKill","击杀","Kill","Убийство","殺死","击杀"
"UsePets","","Crewmates use Pet button to activate their ability when possible","","",""
"UsePets","","Crewmates Use Pet button instead of Vent","","",""
"AbilityOnCooldown","","<color=#ffff00>Ability on cooldown!</color>","","",""
"KillCooldownOnStrangle","","Kill Cooldown after Strangling","","",""
"CDPT","","<color=#00ffa5>CD:</color> <color=#ffffff><b>{0}</b>s</color>","","",""
@@ -2503,13 +2503,13 @@
"VentBlockSuccess","","This vent is now blocked","","",""
"## Hacker"
"Hacker","","Hacker","","",""
"HackerInfo","","Watch Admin Table from anywhere","","",""
"HackerInfoLong","","(Hacker):\nThis role is different for modded clients and vanilla clients.\n\nAs a modded client, whenever you open the map (and have ability uses left), the admin map will show up. You may be able to move while having the map open depending on settings.\n\nAs a vanilla client, you may enter a vent to get a notification saying how many people are in different rooms on the ship (essentially admin map).","","",""
"HackerModdedClientAbilityUseSecondsMultiplier","","Modded clients, for 1 ability use, can view Admin map for","","",""
"HackerModdedClientCanMoveWhileViewingMap","","Modded clients can move while looking at Admin map","","",""
"HackerVanillaClientSeesInfoFor","","Vanilla clients see admin info notify for","","",""
"NiceHacker","","Hacker","","",""
"NiceHackerInfo","","Watch Admin Table from anywhere","","",""
"NiceHackerInfoLong","","(Hacker):\nThis role is different for modded clients and vanilla clients.\n\nAs a modded client, whenever you open the map (and have ability uses left), the admin map will show up. You may be able to move while having the map open depending on settings.\n\nAs a vanilla client, you may enter a vent to get a notification saying how many people are in different rooms on the ship (essentially admin map).","","",""
"NiceHackerModdedClientAbilityUseSecondsMultiplier","","Modded clients, for 1 ability use, can view Admin map for","","",""
"NiceHackerModdedClientCanMoveWhileViewingMap","","Modded clients can move while looking at Admin map","","",""
"NiceHackerVanillaClientSeesInfoFor","","Vanilla clients see admin info notify for","","",""
"NiceHackerAbilitySecondsLeft","","Ability uses left in seconds","","",""
"AbilityChargesWhenFinishedTasks","","<color=#00ffff>Ability <color=#7FFFD2>Use Gains</color> <color=#ffa500>every 5s</color> when tasks are done</color>","","",""
@@ -2576,7 +2576,17 @@
"GamblerIgnoreCursedWolfAndJinx","","Kill <color=#ff1919>Cursed Wolf</color> and <color=#ed2f91>Jinx</color>","","",""
"GamblerIgnoreCursedWolfAndJinx","","Kill <color=#343136>Pestilence</color>","","",""
"GamblerPositiveEffectChance","","Positive Effect Chance","","",""
"GamblerGet.DelayedKill","","<color=#00ffa5>Effect:</color> Delayed Kill (<color=#00ffa5>{0}s</color>)","","",""
"GamblerGet.Shield","","<color=#00ffa5>Effect:</color> Temporary Shield (<color=#00ffa5>{0}s</color>)","","",""
"GamblerGet.NoLunge","","<color=#00ffa5>Effect:</color> No Lunge","","",""
"GamblerGet.Swap","","<color=#00ffa5>Effect:</color> Swap Places with Someone","","",""
"GamblerGet.IgnoreDefense","","<color=#00ffa5>Effect:</color> Break Through Defense","","",""
"GamblerGet.LowKCD","","<color=#00ffa5>Effect:</color> Lower Kill Cooldown (<color=#00ffa5>{0}s</color>)","","",""
"GamblerGet.Speedup","","<color=#00ffa5>Effect:</color> Higher Speed (<color=#00ffa5>{1}x</color>, for <color=#00ffa5>{0}s</color>)","","",""
"GamblerGet.BSR","","<color=#ffa500>Effect:</color> Self-Report (in <color=#ffa500>{0}s</color>)","","",""
"GamblerGet.Freeze","","<color=#ffa500>Effect:</color> Freeze (for <color=#ffa500>{0}s</color>)","","",""
"GamblerGet.LowVision","","<color=#ffa500>Effect:</color> Lower Vision (<color=#ffa500>{1}x</color>, for <color=#ffa500>{0}s</color>)","","",""
"GamblerGet.HighKCD","","<color=#ffa500>Effect:</color> Higher Kill Cooldown (<color=#ffa500>{0}s</color>)","","",""
"## Hitman"
"Hitman","","Hitman","","",""
Can't render this file because it is too large.
+76 -38
View File
@@ -4,8 +4,7 @@
using System.Collections.Generic;
using System.Linq;
using System.Text;
using TOHE.Modules;
using UnityEngine;
using TOHE;
using static TOHE.Options;
using static TOHE.Translator;
using static TOHE.Utils;
@@ -13,9 +12,11 @@
public static class NiceHacker
{
private static readonly int Id = 641000;
private static Dictionary<byte, bool> playerIdList = new();
public static Dictionary<byte, bool> playerIdList = new();
public static Dictionary<byte, float> UseLimit = new();
private static Dictionary<byte, long> abilityInUse = new();
public static Dictionary<byte, float> UseLimitSeconds = new();
private static Dictionary<byte, long> LastUpdate = new();
public static OptionItem AbilityCD;
public static OptionItem UseLimitOpt;
@@ -27,34 +28,36 @@
public static void SetupCustomOption()
{
SetupSingleRoleOptions(Id, TabGroup.CrewmateRoles, CustomRoles.Hacker, 1);
AbilityCD = FloatOptionItem.Create(Id + 10, "AbilityCD", new(0f, 70f, 1f), 15f, TabGroup.CrewmateRoles, false).SetParent(CustomRoleSpawnChances[CustomRoles.Hacker])
SetupSingleRoleOptions(Id, TabGroup.CrewmateRoles, CustomRoles.NiceHacker, 1);
AbilityCD = FloatOptionItem.Create(Id + 10, "AbilityCD", new(0f, 70f, 1f), 15f, TabGroup.CrewmateRoles, false).SetParent(CustomRoleSpawnChances[CustomRoles.NiceHacker])
.SetValueFormat(OptionFormat.Seconds);
UseLimitOpt = IntegerOptionItem.Create(Id + 11, "AbilityUseLimit", new(1, 20, 1), 2, TabGroup.CrewmateRoles, false).SetParent(CustomRoleSpawnChances[CustomRoles.Hacker])
UseLimitOpt = IntegerOptionItem.Create(Id + 11, "AbilityUseLimit", new(1, 20, 1), 2, TabGroup.CrewmateRoles, false).SetParent(CustomRoleSpawnChances[CustomRoles.NiceHacker])
.SetValueFormat(OptionFormat.Times);
NiceHackerAbilityUseGainWithEachTaskCompleted = FloatOptionItem.Create(Id + 12, "AbilityUseGainWithEachTaskCompleted", new(0f, 5f, 0.1f), 1f, TabGroup.CrewmateRoles, false)
.SetParent(CustomRoleSpawnChances[CustomRoles.Hacker])
.SetParent(CustomRoleSpawnChances[CustomRoles.NiceHacker])
.SetValueFormat(OptionFormat.Times);
AbilityChargesWhenFinishedTasks = FloatOptionItem.Create(Id + 13, "AbilityChargesWhenFinishedTasks", new(0f, 5f, 0.1f), 0.2f, TabGroup.CrewmateRoles, false)
.SetParent(CustomRoleSpawnChances[CustomRoles.Hacker])
.SetParent(CustomRoleSpawnChances[CustomRoles.NiceHacker])
.SetValueFormat(OptionFormat.Times);
ModdedClientAbilityUseSecondsMultiplier = FloatOptionItem.Create(Id + 14, "HackerModdedClientAbilityUseSecondsMultiplier", new(0f, 70f, 1f), 3f, TabGroup.CrewmateRoles, false).SetParent(CustomRoleSpawnChances[CustomRoles.Hacker])
ModdedClientAbilityUseSecondsMultiplier = FloatOptionItem.Create(Id + 14, "NiceHackerModdedClientAbilityUseSecondsMultiplier", new(0f, 70f, 1f), 3f, TabGroup.CrewmateRoles, false).SetParent(CustomRoleSpawnChances[CustomRoles.NiceHacker])
.SetValueFormat(OptionFormat.Seconds);
ModdedClientCanMoveWhileViewingMap = BooleanOptionItem.Create(Id + 15, "HackerModdedClientCanMoveWhileViewingMap", false, TabGroup.CrewmateRoles, false)
ModdedClientCanMoveWhileViewingMap = BooleanOptionItem.Create(Id + 15, "NiceHackerModdedClientCanMoveWhileViewingMap", false, TabGroup.CrewmateRoles, false)
.SetParent(CustomRoleSpawnChances[CustomRoles.NiceHacker]);
VanillaClientSeesInfoFor = FloatOptionItem.Create(Id + 16, "HackerVanillaClientSeesInfoFor", new(0f, 70f, 1f), 4f, TabGroup.CrewmateRoles, false).SetParent(CustomRoleSpawnChances[CustomRoles.Hacker])
VanillaClientSeesInfoFor = FloatOptionItem.Create(Id + 16, "NiceHackerVanillaClientSeesInfoFor", new(0f, 70f, 1f), 4f, TabGroup.CrewmateRoles, false).SetParent(CustomRoleSpawnChances[CustomRoles.NiceHacker])
.SetValueFormat(OptionFormat.Seconds);
}
public static void Init()
{
playerIdList = new();
UseLimit = new();
abilityInUse = new();
UseLimitSeconds = new();
LastUpdate = new();
}
public static void Add(byte playerId)
{
playerIdList.TryAdd(playerId, GetPlayerById(playerId).IsModClient());
UseLimit.Add(playerId, UseLimitOpt.GetInt());
if (!GetPlayerById(playerId).IsModClient()) UseLimit.Add(playerId, UseLimitOpt.GetInt());
else UseLimitSeconds.Add(playerId, UseLimitOpt.GetInt() * ModdedClientAbilityUseSecondsMultiplier.GetInt());
}
public static bool IsEnable => playerIdList.Any();
public static void OnEnterVent(PlayerControl pc)
@@ -65,15 +68,22 @@
if (UseLimit[pc.PlayerId] >= 1)
{
UseLimit[pc.PlayerId] -= 1;
Main.HackerCD.TryAdd(pc.PlayerId, GetTimeStamp());
var list = ExtendedPlayerControl.GetAllPlayerLocationsCount();
var sb = new StringBuilder();
foreach (var location in list)
if (Main.HackerCD.ContainsKey(pc.PlayerId))
{
sb.Append($"\n<color=#00ffa5>{location.Key}:</color> {location.Value}");
pc.Notify(GetString("AbilityOnCooldown"));
}
else
{
UseLimit[pc.PlayerId] -= 1;
Main.HackerCD.TryAdd(pc.PlayerId, GetTimeStamp());
var list = ExtendedPlayerControl.GetAllPlayerLocationsCount();
var sb = new StringBuilder();
foreach (var location in list)
{
sb.Append($"\n<color=#00ffa5>{location.Key}:</color> {location.Value}");
}
pc.Notify(sb.ToString(), VanillaClientSeesInfoFor.GetFloat());
}
pc.Notify(sb.ToString(), VanillaClientSeesInfoFor.GetFloat());
}
else
{
@@ -84,51 +94,79 @@
{
if (pc == null) return;
if (!pc.Is(CustomRoles.NiceHacker)) return;
if (GameStates.IsMeeting) return;
if (pc.GetPlayerTaskState().IsTaskFinished)
if (Main.PlayerStates[pc.PlayerId].GetTaskState().IsTaskFinished)
{
LastUpdate.TryAdd(pc.PlayerId, GetTimeStamp());
if (LastUpdate[pc.PlayerId] + 5 < GetTimeStamp())
{
if (pc.IsModClient()) UseLimitSeconds[pc.PlayerId] += AbilityChargesWhenFinishedTasks.GetFloat() * ModdedClientAbilityUseSecondsMultiplier.GetInt();
else UseLimit[pc.PlayerId] += AbilityChargesWhenFinishedTasks.GetFloat();
LastUpdate[pc.PlayerId] = GetTimeStamp();
}
}
}
public static bool MapHandle(PlayerControl pc, MapBehaviour map, MapOptions opts)
public static void MapHandle(PlayerControl pc, MapBehaviour map, MapOptions opts)
{
if (pc == null) return true;
if (map == null) return true;
if (opts == null) return true;
if (pc.GetCustomRole() != CustomRoles.Hacker) return;
if (!pc.Is(CustomRoles.Hacker)) return true;
map.countOverlayAllowsMovement = ModdedClientCanMoveWhileViewingMap.GetBool();
if (UseLimit[pc.PlayerId] >= 1)
if (UseLimitSeconds[pc.PlayerId] >= 1)
{
UseLimit[pc.PlayerId] -= 1;
UseLimitSeconds[pc.PlayerId] -= 1; // Remove 1s for opening the map, so they can't utilize spamming
opts.Mode = MapOptions.Modes.CountOverlay;
abilityInUse.TryAdd(pc.PlayerId, GetTimeStamp());
_ = new LateTask(() => { MapCountdown(pc, map, opts, (int)UseLimitSeconds[pc.PlayerId]); }, 1f, "NiceHacker.StartCountdown");
}
else
{
opts.Mode = MapOptions.Modes.Normal;
pc.Notify(GetString("OutOfAbilityUsesDoMoreTasks"));
}
return;
}
public static void MapCountdown(PlayerControl pc, MapBehaviour map, MapOptions opts, int seconds)
{
if (!map.IsOpen)
{
return;
}
if (seconds <= 0)
{
map.Close();
pc.Notify(GetString("OutOfAbilityUsesDoMoreTasks"));
opts.Mode = MapOptions.Modes.Normal;
return;
}
UseLimitSeconds[pc.PlayerId] -= 1;
new LateTask(() => { MapCountdown(pc, map, opts, seconds - 1); }, 1f, "NiceHackerAbilityCountdown");
}
public static string GetHudText(PlayerControl pc)
{
if (pc == null) return string.Empty;
if (!pc.Is(CustomRoles.NiceHacker)) return string.Empty;
return $"<color=#00ffa5>{GetString("NiceHackerAbilitySecondsLeft")}:</color> <b>{Math.Round(UseLimitSeconds[pc.PlayerId])}</b>s";
}
public static string GetProgressText(byte playerId, bool comms)
{
if (GetPlayerById(playerId).IsModClient()) return string.Empty;
var sb = new StringBuilder();
var taskState = Main.PlayerStates?[playerId].GetTaskState();
Color TextColor;
var TaskCompleteColor = Color.green;
var NonCompleteColor = Color.yellow;
UnityEngine.Color TextColor;
var TaskCompleteColor = UnityEngine.Color.green;
var NonCompleteColor = UnityEngine.Color.yellow;
var NormalColor = taskState.IsTaskFinished ? TaskCompleteColor : NonCompleteColor;
TextColor = comms ? Color.gray : NormalColor;
TextColor = comms ? UnityEngine.Color.gray : NormalColor;
string Completed = comms ? "?" : $"{taskState.CompletedTasksCount}";
Color TextColor1;
if (UseLimit[playerId] < 1) TextColor1 = Color.red;
else TextColor1 = Color.white;
UnityEngine.Color TextColor1;
if (UseLimit[playerId] < 1) TextColor1 = UnityEngine.Color.red;
else TextColor1 = UnityEngine.Color.white;
sb.Append(ColorString(TextColor, $"<color=#777777>-</color> {Completed}/{taskState.AllTasksCount}"));
sb.Append(ColorString(TextColor1, $" <color=#777777>-</color> {Math.Round(UseLimit[playerId], 1)}"));
+8 -8
View File
@@ -112,11 +112,11 @@ namespace TOHE.Roles.Impostor
switch (EffectID)
{
case 1: // Delayed kill
killer.Notify(GetString("GamblerGet.DelayedKill"));
killer.Notify(string.Format(GetString("GamblerGet.DelayedKill"), KillDelay.GetInt()));
waitingDelayedKills.TryAdd(target.PlayerId, GetTimeStamp());
return false;
case 2: // Shield
killer.Notify(GetString("GamblerGet.Shield"));
killer.Notify(string.Format(GetString("GamblerGet.Shield"), ShieldDur.GetInt()));
isShielded.TryAdd(killer.PlayerId, GetTimeStamp());
break;
case 3: // No lunge (Swift kill)
@@ -157,14 +157,14 @@ namespace TOHE.Roles.Impostor
return false;
}
case 6: // Low KCD
killer.Notify(GetString("GamblerGet.LowKCD"));
killer.Notify(string.Format(GetString("GamblerGet.LowKCD"), LowKCD.GetFloat()));
_ = new LateTask(() =>
{
killer.SetKillCooldown(LowKCD.GetFloat());
}, 0.1f, "Gambler SetLowKCD");
break;
case 7: // Speed
killer.Notify(GetString("GamblerGet.Speedup"));
killer.Notify(string.Format(GetString("GamblerGet.Speedup"), SpeedDur.GetInt(), Speed.GetFloat()));
isSpeedChange.TryAdd(killer.PlayerId, (Main.AllPlayerSpeed[killer.PlayerId], GetTimeStamp()));
Main.AllPlayerSpeed[killer.PlayerId] = Speed.GetFloat();
killer.SyncSettings();
@@ -183,23 +183,23 @@ namespace TOHE.Roles.Impostor
var delay = Math.Max(0.15f, BSRDelay.GetFloat());
if (delay >= 1f)
{
killer.Notify(GetString("GamblerGet.BSR"));
killer.Notify(string.Format(GetString("GamblerGet.BSR"), BSRDelay.GetInt()));
}
_ = new LateTask(() => { if (GameStates.IsInTask) killer.CmdReportDeadBody(target.Data); }, delay, "Gambler Self Report");
break;
case 2: // Freeze
killer.Notify(GetString("GamblerGet.Freeze"));
killer.Notify(string.Format(GetString("GamblerGet.Freeze"), FreezeDur.GetInt()));
isSpeedChange.TryAdd(killer.PlayerId, (Main.AllPlayerSpeed[killer.PlayerId], GetTimeStamp()));
Main.AllPlayerSpeed[killer.PlayerId] = Main.MinSpeed;
killer.SyncSettings();
break;
case 3: // Low vision
killer.Notify(GetString("GamblerGet.LowVision"));
killer.Notify(string.Format(GetString("GamblerGet.LowVision"), LowVisionDur.GetInt(), LowVision.GetFloat()));
isVisionChange.TryAdd(killer.PlayerId, GetTimeStamp());
killer.SyncSettings();
break;
case 4: // High KCD
killer.Notify(GetString("GamblerGet.HighKCD"));
killer.Notify(string.Format(GetString("GamblerGet.HighKCD"), HighKCD.GetFloat()));
_ = new LateTask(() =>
{
killer.SetKillCooldown(HighKCD.GetFloat());
+1 -1
View File
@@ -7,7 +7,7 @@
<Description>Town Of Host Edited</Description>
<Authors>KARPED1EM</Authors>
<langVersion>latest</langVersion>
<AmongUs>D:\Epic Games\AmongUs</AmongUs>
<AmongUs>E:\Program Files\AmongUs</AmongUs>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
</PropertyGroup>
+2 -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 = "1.0.7";
public const string PluginDisplayVersion = "1.0.7";
public const string PluginVersion = "1.1.0";
public const string PluginDisplayVersion = "1.1.0";
public const int PluginCreate = 3;
public const bool Canary = false;