Compare commits

...
3 Commits
Author SHA1 Message Date
Gurge44 2260f90180 Extend setting cap 2024-01-05 21:07:22 +01:00
Gurge44 9c1464582c Add Indicator if a role requires pets and pet setting isn't on & add /up 2024-01-05 20:35:08 +01:00
Gurge44 3c5b8f982b Fix a LOT of bugs & Add RPCs 2024-01-05 19:02:49 +01:00
25 changed files with 510 additions and 504 deletions

No files matched your search

+1 -1
View File
@@ -293,7 +293,7 @@ internal static class FFAManager
}
else // Mixed
{
_ = new LateTask(killer.TPtoRndVent, 0.5f, "FFA-Event-TP");
_ = new LateTask(() => { killer.TPtoRndVent(); }, 0.5f, "FFA-Event-TP");
killer.Notify(GetString("FFA-Event-GetTP"));
Main.AllPlayerKillCooldown[killer.PlayerId] = FFA_KCD.GetFloat();
}
+348 -420
View File
@@ -1,4 +1,5 @@
using AmongUs.GameOptions;
using System.Collections.Generic;
using System.Linq;
using TOHE.Roles.Crewmate;
using TOHE.Roles.Impostor;
@@ -194,95 +195,92 @@ internal static class CustomRolesHelper
};
}
public static CustomRoles GetErasedRole(this CustomRoles role)
{
return role.IsVanilla()
? role
: role switch
{
CustomRoles.Tracker => CustomRoles.CrewmateTOHE,
CustomRoles.Mayor => Options.MayorHasPortableButton.GetBool() ? CustomRoles.EngineerTOHE : CustomRoles.CrewmateTOHE,
CustomRoles.Observer => CustomRoles.CrewmateTOHE,
CustomRoles.DovesOfNeace => CustomRoles.EngineerTOHE,
CustomRoles.Monitor => Monitor.CanVent.GetBool() ? CustomRoles.EngineerTOHE : CustomRoles.CrewmateTOHE,
CustomRoles.Judge => CustomRoles.CrewmateTOHE,
CustomRoles.NiceSwapper => CustomRoles.CrewmateTOHE,
CustomRoles.Mortician => CustomRoles.CrewmateTOHE,
CustomRoles.Mediumshiper => CustomRoles.CrewmateTOHE,
CustomRoles.Bodyguard => CustomRoles.CrewmateTOHE,
CustomRoles.ParityCop => CustomRoles.CrewmateTOHE,
CustomRoles.Enigma => CustomRoles.CrewmateTOHE,
CustomRoles.Grenadier => CustomRoles.EngineerTOHE,
CustomRoles.SecurityGuard => CustomRoles.EngineerTOHE,
CustomRoles.Lighter => CustomRoles.EngineerTOHE,
CustomRoles.Ignitor => CustomRoles.EngineerTOHE,
CustomRoles.Speedrunner => CustomRoles.CrewmateTOHE,
CustomRoles.Transporter => CustomRoles.CrewmateTOHE,
CustomRoles.Veteran => CustomRoles.CrewmateTOHE,
CustomRoles.GuardianAngelTOHE => CustomRoles.GuardianAngel,
CustomRoles.Detective => CustomRoles.CrewmateTOHE,
CustomRoles.NiceGuesser => CustomRoles.CrewmateTOHE,
CustomRoles.Cleanser => CustomRoles.CrewmateTOHE,
CustomRoles.Luckey => CustomRoles.CrewmateTOHE,
CustomRoles.Lookout => CustomRoles.CrewmateTOHE,
CustomRoles.CyberStar => CustomRoles.CrewmateTOHE,
CustomRoles.Demolitionist => CustomRoles.CrewmateTOHE,
CustomRoles.Ventguard => CustomRoles.EngineerTOHE,
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,
CustomRoles.Philantropist => CustomRoles.CrewmateTOHE,
CustomRoles.Tornado => CustomRoles.CrewmateTOHE,
CustomRoles.Druid => CustomRoles.EngineerTOHE,
CustomRoles.Insight => CustomRoles.CrewmateTOHE,
CustomRoles.Tunneler => CustomRoles.CrewmateTOHE,
CustomRoles.Detour => CustomRoles.CrewmateTOHE,
CustomRoles.Drainer => CustomRoles.EngineerTOHE,
CustomRoles.GuessManager => CustomRoles.CrewmateTOHE,
CustomRoles.Benefactor => CustomRoles.CrewmateTOHE,
CustomRoles.Altruist => CustomRoles.CrewmateTOHE,
CustomRoles.Transmitter => CustomRoles.CrewmateTOHE,
CustomRoles.Autocrat => CustomRoles.CrewmateTOHE,
CustomRoles.Nightmare => CustomRoles.CrewmateTOHE,
CustomRoles.CameraMan => CustomRoles.EngineerTOHE,
CustomRoles.Spy => CustomRoles.CrewmateTOHE,
CustomRoles.Ricochet => CustomRoles.CrewmateTOHE,
CustomRoles.Aid => CustomRoles.CrewmateTOHE,
CustomRoles.DonutDelivery => CustomRoles.CrewmateTOHE,
CustomRoles.Gaulois => CustomRoles.CrewmateTOHE,
CustomRoles.Analyzer => CustomRoles.CrewmateTOHE,
CustomRoles.Escort => CustomRoles.CrewmateTOHE,
CustomRoles.Doormaster => CustomRoles.EngineerTOHE,
CustomRoles.Tether => CustomRoles.EngineerTOHE,
CustomRoles.Psychic => CustomRoles.CrewmateTOHE,
CustomRoles.Needy => CustomRoles.CrewmateTOHE,
CustomRoles.SuperStar => CustomRoles.CrewmateTOHE,
CustomRoles.Paranoia => CustomRoles.EngineerTOHE,
CustomRoles.EngineerTOHE => CustomRoles.EngineerTOHE,
CustomRoles.TimeMaster => CustomRoles.EngineerTOHE,
CustomRoles.CrewmateTOHE => CustomRoles.CrewmateTOHE,
CustomRoles.Doctor => CustomRoles.ScientistTOHE,
CustomRoles.ScientistTOHE => CustomRoles.ScientistTOHE,
CustomRoles.Tracefinder => CustomRoles.ScientistTOHE,
CustomRoles.SpeedBooster => CustomRoles.CrewmateTOHE,
CustomRoles.Dictator => CustomRoles.CrewmateTOHE,
CustomRoles.Snitch => CustomRoles.CrewmateTOHE,
CustomRoles.Marshall => CustomRoles.CrewmateTOHE,
CustomRoles.SabotageMaster => CustomRoles.EngineerTOHE,
//CustomRoles.Retributionist => CustomRoles.Crewmate,
CustomRoles.Witness => CustomRoles.CrewmateTOHE,
CustomRoles.Guardian => CustomRoles.CrewmateTOHE,
CustomRoles.Addict => CustomRoles.EngineerTOHE,
CustomRoles.Alchemist => CustomRoles.EngineerTOHE,
CustomRoles.Oracle => CustomRoles.CrewmateTOHE,
CustomRoles.Chameleon => CustomRoles.EngineerTOHE,
_ => role.IsImpostor() ? CustomRoles.ImpostorTOHE : CustomRoles.CrewmateTOHE,
};
}
public static CustomRoles GetErasedRole(this CustomRoles role) => role.IsVanilla()
? role
: role switch
{
CustomRoles.Tracker => CustomRoles.CrewmateTOHE,
CustomRoles.Mayor => Options.MayorHasPortableButton.GetBool() ? CustomRoles.EngineerTOHE : CustomRoles.CrewmateTOHE,
CustomRoles.Observer => CustomRoles.CrewmateTOHE,
CustomRoles.DovesOfNeace => CustomRoles.EngineerTOHE,
CustomRoles.Monitor => Monitor.CanVent.GetBool() ? CustomRoles.EngineerTOHE : CustomRoles.CrewmateTOHE,
CustomRoles.Judge => CustomRoles.CrewmateTOHE,
CustomRoles.NiceSwapper => CustomRoles.CrewmateTOHE,
CustomRoles.Mortician => CustomRoles.CrewmateTOHE,
CustomRoles.Mediumshiper => CustomRoles.CrewmateTOHE,
CustomRoles.Bodyguard => CustomRoles.CrewmateTOHE,
CustomRoles.ParityCop => CustomRoles.CrewmateTOHE,
CustomRoles.Enigma => CustomRoles.CrewmateTOHE,
CustomRoles.Grenadier => CustomRoles.EngineerTOHE,
CustomRoles.SecurityGuard => CustomRoles.EngineerTOHE,
CustomRoles.Lighter => CustomRoles.EngineerTOHE,
CustomRoles.Ignitor => CustomRoles.EngineerTOHE,
CustomRoles.Speedrunner => CustomRoles.CrewmateTOHE,
CustomRoles.Transporter => CustomRoles.CrewmateTOHE,
CustomRoles.Veteran => CustomRoles.CrewmateTOHE,
CustomRoles.GuardianAngelTOHE => CustomRoles.GuardianAngel,
CustomRoles.Detective => CustomRoles.CrewmateTOHE,
CustomRoles.NiceGuesser => CustomRoles.CrewmateTOHE,
CustomRoles.Cleanser => CustomRoles.CrewmateTOHE,
CustomRoles.Luckey => CustomRoles.CrewmateTOHE,
CustomRoles.Lookout => CustomRoles.CrewmateTOHE,
CustomRoles.CyberStar => CustomRoles.CrewmateTOHE,
CustomRoles.Demolitionist => CustomRoles.CrewmateTOHE,
CustomRoles.Ventguard => CustomRoles.EngineerTOHE,
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,
CustomRoles.Philantropist => CustomRoles.CrewmateTOHE,
CustomRoles.Tornado => CustomRoles.CrewmateTOHE,
CustomRoles.Druid => CustomRoles.EngineerTOHE,
CustomRoles.Insight => CustomRoles.CrewmateTOHE,
CustomRoles.Tunneler => CustomRoles.CrewmateTOHE,
CustomRoles.Detour => CustomRoles.CrewmateTOHE,
CustomRoles.Drainer => CustomRoles.EngineerTOHE,
CustomRoles.GuessManager => CustomRoles.CrewmateTOHE,
CustomRoles.Benefactor => CustomRoles.CrewmateTOHE,
CustomRoles.Altruist => CustomRoles.CrewmateTOHE,
CustomRoles.Transmitter => CustomRoles.CrewmateTOHE,
CustomRoles.Autocrat => CustomRoles.CrewmateTOHE,
CustomRoles.Nightmare => CustomRoles.CrewmateTOHE,
CustomRoles.CameraMan => CustomRoles.EngineerTOHE,
CustomRoles.Spy => CustomRoles.CrewmateTOHE,
CustomRoles.Ricochet => CustomRoles.CrewmateTOHE,
CustomRoles.Aid => CustomRoles.CrewmateTOHE,
CustomRoles.DonutDelivery => CustomRoles.CrewmateTOHE,
CustomRoles.Gaulois => CustomRoles.CrewmateTOHE,
CustomRoles.Analyzer => CustomRoles.CrewmateTOHE,
CustomRoles.Escort => CustomRoles.CrewmateTOHE,
CustomRoles.Doormaster => CustomRoles.EngineerTOHE,
CustomRoles.Tether => CustomRoles.EngineerTOHE,
CustomRoles.Psychic => CustomRoles.CrewmateTOHE,
CustomRoles.Needy => CustomRoles.CrewmateTOHE,
CustomRoles.SuperStar => CustomRoles.CrewmateTOHE,
CustomRoles.Paranoia => CustomRoles.EngineerTOHE,
CustomRoles.EngineerTOHE => CustomRoles.EngineerTOHE,
CustomRoles.TimeMaster => CustomRoles.EngineerTOHE,
CustomRoles.CrewmateTOHE => CustomRoles.CrewmateTOHE,
CustomRoles.Doctor => CustomRoles.ScientistTOHE,
CustomRoles.ScientistTOHE => CustomRoles.ScientistTOHE,
CustomRoles.Tracefinder => CustomRoles.ScientistTOHE,
CustomRoles.SpeedBooster => CustomRoles.CrewmateTOHE,
CustomRoles.Dictator => CustomRoles.CrewmateTOHE,
CustomRoles.Snitch => CustomRoles.CrewmateTOHE,
CustomRoles.Marshall => CustomRoles.CrewmateTOHE,
CustomRoles.SabotageMaster => CustomRoles.EngineerTOHE,
//CustomRoles.Retributionist => CustomRoles.Crewmate,
CustomRoles.Witness => CustomRoles.CrewmateTOHE,
CustomRoles.Guardian => CustomRoles.CrewmateTOHE,
CustomRoles.Addict => CustomRoles.EngineerTOHE,
CustomRoles.Alchemist => CustomRoles.EngineerTOHE,
CustomRoles.Oracle => CustomRoles.CrewmateTOHE,
CustomRoles.Chameleon => CustomRoles.EngineerTOHE,
_ => role.IsImpostor() ? CustomRoles.ImpostorTOHE : CustomRoles.CrewmateTOHE,
};
public static RoleTypes GetDYRole(this CustomRoles role)
{
@@ -375,9 +373,7 @@ internal static class CustomRolesHelper
_ => RoleTypes.GuardianAngel
};
}
public static bool IsAdditionRole(this CustomRoles role)
{
return role is
public static bool IsAdditionRole(this CustomRoles role) => role is
CustomRoles.Lovers or
CustomRoles.LastImpostor or
CustomRoles.Ntr or
@@ -435,10 +431,8 @@ internal static class CustomRolesHelper
CustomRoles.DoubleShot or
CustomRoles.Ghoul or
CustomRoles.EvilSpirit;
}
public static bool IsNonNK(this CustomRoles role) // ROLE ASSIGNING, NOT NEUTRAL TYPE
{
return role is
=> role is
CustomRoles.Jester or
CustomRoles.Terrorist or
CustomRoles.Opportunist or
@@ -458,7 +452,7 @@ internal static class CustomRolesHelper
CustomRoles.Gamer or
CustomRoles.FFF or
CustomRoles.Workaholic or
// CustomRoles.Pelican or
// CustomRoles.Pelican or
CustomRoles.Collector or
CustomRoles.Sunnyboy or
CustomRoles.Maverick or
@@ -469,11 +463,9 @@ internal static class CustomRolesHelper
CustomRoles.VengefulRomantic or
CustomRoles.Doomsayer or
CustomRoles.Succubus;
}
public static bool IsAmneMaverick(this CustomRoles role) // ROLE ASSIGNING, NOT NEUTRAL TYPE
{
return role is
=> role is
CustomRoles.Jester or
CustomRoles.Terrorist or
CustomRoles.Opportunist or
@@ -499,7 +491,7 @@ internal static class CustomRolesHelper
CustomRoles.Gamer or
CustomRoles.FFF or
CustomRoles.Workaholic or
// CustomRoles.Pelican or
// CustomRoles.Pelican or
CustomRoles.Collector or
CustomRoles.Sunnyboy or
CustomRoles.Arsonist or
@@ -518,10 +510,7 @@ internal static class CustomRolesHelper
// CustomRoles.Poisoner or
// CustomRoles.HexMaster or
CustomRoles.Totocalcio;
}
public static bool IsAmneNK(this CustomRoles role)
{
return role is
public static bool IsAmneNK(this CustomRoles role) => role is
CustomRoles.Sidekick or
CustomRoles.Infectious or
CustomRoles.Glitch or
@@ -551,11 +540,8 @@ internal static class CustomRolesHelper
CustomRoles.Virus or
CustomRoles.Spiritcaller or
CustomRoles.Succubus;
}
public static bool IsNK(this CustomRoles role)
{
return role is
public static bool IsNK(this CustomRoles role) => role is
CustomRoles.Jackal or
CustomRoles.Glitch or
CustomRoles.Sidekick or
@@ -600,10 +586,7 @@ internal static class CustomRolesHelper
CustomRoles.RuthlessRomantic or
CustomRoles.PlagueBearer or
CustomRoles.Pestilence;
}
public static bool IsSnitchTarget(this CustomRoles role)
{
return role is
public static bool IsSnitchTarget(this CustomRoles role) => role is
CustomRoles.Jackal or
CustomRoles.Sidekick or
CustomRoles.HexMaster or
@@ -645,10 +628,7 @@ internal static class CustomRolesHelper
CustomRoles.RuthlessRomantic or
CustomRoles.PlagueBearer or
CustomRoles.Pestilence;
}
public static bool IsNE(this CustomRoles role)
{
return role is
public static bool IsNE(this CustomRoles role) => role is
CustomRoles.Jester or
CustomRoles.Gamer or
//CustomRoles.Masochist or
@@ -656,10 +636,7 @@ internal static class CustomRolesHelper
CustomRoles.Executioner or
CustomRoles.Doomsayer or
CustomRoles.Innocent;
}
public static bool IsNB(this CustomRoles role)
{
return role is
public static bool IsNB(this CustomRoles role) => role is
CustomRoles.Opportunist or
CustomRoles.Lawyer or
CustomRoles.Amnesiac or
@@ -672,10 +649,7 @@ internal static class CustomRolesHelper
CustomRoles.Romantic or
CustomRoles.VengefulRomantic or
CustomRoles.Totocalcio;
}
public static bool IsNC(this CustomRoles role)
{
return role is
public static bool IsNC(this CustomRoles role) => role is
CustomRoles.Mario or
CustomRoles.Terrorist or
//CustomRoles.Pirate or
@@ -688,10 +662,7 @@ internal static class CustomRolesHelper
CustomRoles.Workaholic or
CustomRoles.Collector or
CustomRoles.Provocateur;
}
public static bool IsNeutralKilling(this CustomRoles role)
{
return role is
public static bool IsNeutralKilling(this CustomRoles role) => role is
CustomRoles.Terrorist or
CustomRoles.Arsonist or
CustomRoles.Juggernaut or
@@ -743,10 +714,7 @@ internal static class CustomRolesHelper
CustomRoles.RuthlessRomantic or
CustomRoles.PlagueBearer or
CustomRoles.Pestilence;
}
public static bool IsCK(this CustomRoles role)
{
return role is
public static bool IsCK(this CustomRoles role) => role is
CustomRoles.SwordsMan or
CustomRoles.Veteran or
CustomRoles.CopyCat or
@@ -758,10 +726,8 @@ internal static class CustomRolesHelper
//CustomRoles.Retributionist or
CustomRoles.Sheriff or
CustomRoles.Jailor;
}
public static bool IsImpostor(this CustomRoles role) // IsImp
{
return role is
=> role is
CustomRoles.Impostor or
CustomRoles.Godfather or
CustomRoles.Shapeshifter or
@@ -839,10 +805,7 @@ internal static class CustomRolesHelper
CustomRoles.Camouflager or
CustomRoles.Twister or
CustomRoles.Lurker;
}
public static bool IsNeutral(this CustomRoles role)
{
return role is
public static bool IsNeutral(this CustomRoles role) => role is
//SoloKombat
CustomRoles.KB_Normal or
//FFA
@@ -929,11 +892,8 @@ internal static class CustomRolesHelper
CustomRoles.Succubus or
CustomRoles.Doomsayer or
CustomRoles.Spiritcaller;
}
public static bool IsAbleToBeSidekicked(this CustomRoles role)
{
return role is
public static bool IsAbleToBeSidekicked(this CustomRoles role) => role is
CustomRoles.BloodKnight or
CustomRoles.Virus or
CustomRoles.Medusa or
@@ -1000,11 +960,7 @@ internal static class CustomRolesHelper
CustomRoles.Parasite or
CustomRoles.PlagueBearer;
}
public static bool IsEvilAddons(this CustomRoles role)
{
return role is
public static bool IsEvilAddons(this CustomRoles role) => role is
CustomRoles.Madmate or
CustomRoles.Egoist or
CustomRoles.Charmed or
@@ -1014,19 +970,13 @@ internal static class CustomRolesHelper
CustomRoles.Rogue or
CustomRoles.Rascal or
CustomRoles.Soulless;
}
public static bool IsMadmate(this CustomRoles role)
{
return role is
public static bool IsMadmate(this CustomRoles role) => role is
CustomRoles.Crewpostor or
CustomRoles.Convict or
CustomRoles.Refugee or
CustomRoles.Parasite;
}
public static bool IsTasklessCrewmate(this CustomRoles role)
{
return !role.UsesPetInsteadOfKill() && role is
public static bool IsTasklessCrewmate(this CustomRoles role) => !role.UsesPetInsteadOfKill() && role is
CustomRoles.Sheriff or
CustomRoles.Admirer or
CustomRoles.Medic or
@@ -1045,98 +995,93 @@ internal static class CustomRolesHelper
CustomRoles.Farseer or
CustomRoles.SwordsMan or
CustomRoles.Deputy;
}
public static bool PetActivatedAbility(this CustomRoles role)
public static bool PetActivatedAbility(this CustomRoles role) => Options.UsePets.GetBool() && role switch
{
return Options.UsePets.GetBool() && role switch
{
CustomRoles.Doormaster or
CustomRoles.Tether or
CustomRoles.Mayor or
CustomRoles.Paranoia or
CustomRoles.Grenadier or
CustomRoles.Veteran or
CustomRoles.Lighter or
CustomRoles.SecurityGuard or
CustomRoles.DovesOfNeace or
CustomRoles.Alchemist or
CustomRoles.TimeMaster or
CustomRoles.Sapper or
CustomRoles.CameraMan or
CustomRoles.NiceHacker or
CustomRoles.Druid or
CustomRoles.Tunneler or
CustomRoles.Tornado or
CustomRoles.Sentinel or
CustomRoles.Lookout or
CustomRoles.Sniper or
CustomRoles.Warlock or
CustomRoles.Assassin or
CustomRoles.Undertaker or
CustomRoles.Disperser or
CustomRoles.Twister or
CustomRoles.QuickShooter or
CustomRoles.Miner or
CustomRoles.Escapee or
CustomRoles.RiftMaker or
CustomRoles.Bomber or
CustomRoles.Nuker or
CustomRoles.Glitch or
CustomRoles.Magician or
CustomRoles.WeaponMaster or
CustomRoles.Enderman or
CustomRoles.Mycologist or
CustomRoles.Hookshot or
CustomRoles.Sprayer
=> true,
CustomRoles.Doormaster or
CustomRoles.Tether or
CustomRoles.Mayor or
CustomRoles.Paranoia or
CustomRoles.Grenadier or
CustomRoles.Veteran or
CustomRoles.Lighter or
CustomRoles.SecurityGuard or
CustomRoles.DovesOfNeace or
CustomRoles.Alchemist or
CustomRoles.TimeMaster or
CustomRoles.Sapper or
CustomRoles.CameraMan or
CustomRoles.NiceHacker or
CustomRoles.Druid or
CustomRoles.Tunneler or
CustomRoles.Tornado or
CustomRoles.Sentinel or
CustomRoles.Lookout or
CustomRoles.Sniper or
CustomRoles.Warlock or
CustomRoles.Assassin or
CustomRoles.Undertaker or
CustomRoles.Disperser or
CustomRoles.Twister or
CustomRoles.QuickShooter or
CustomRoles.Miner or
CustomRoles.Escapee or
CustomRoles.RiftMaker or
CustomRoles.Bomber or
CustomRoles.Nuker or
CustomRoles.Glitch or
CustomRoles.Magician or
CustomRoles.WeaponMaster or
CustomRoles.Enderman or
CustomRoles.Mycologist or
CustomRoles.Hookshot or
CustomRoles.Sprayer
=> true,
CustomRoles.Gaulois when Gaulois.UsePet.GetBool() => true,
CustomRoles.Aid when Aid.UsePet.GetBool() => true,
CustomRoles.Escort when Escort.UsePet.GetBool() => true,
CustomRoles.DonutDelivery when DonutDelivery.UsePet.GetBool() => true,
CustomRoles.Analyzer when Analyzer.UsePet.GetBool() => true,
CustomRoles.Jailor when Jailor.UsePet.GetBool() => true,
CustomRoles.Sheriff when Sheriff.UsePet.GetBool() => true,
CustomRoles.SwordsMan when SwordsMan.UsePet.GetBool() => true,
CustomRoles.Medic when Medic.UsePet.GetBool() => true,
CustomRoles.Monarch when Monarch.UsePet.GetBool() => true,
CustomRoles.CopyCat when CopyCat.UsePet.GetBool() => true,
CustomRoles.Farseer when Farseer.UsePet.GetBool() => true,
CustomRoles.Deputy when Deputy.UsePet.GetBool() => true,
CustomRoles.Admirer when Admirer.UsePet.GetBool() => true,
CustomRoles.Crusader when Crusader.UsePet.GetBool() => true,
CustomRoles.Witness when Options.WitnessUsePet.GetBool() => true,
CustomRoles.Gaulois when Gaulois.UsePet.GetBool() => true,
CustomRoles.Aid when Aid.UsePet.GetBool() => true,
CustomRoles.Escort when Escort.UsePet.GetBool() => true,
CustomRoles.DonutDelivery when DonutDelivery.UsePet.GetBool() => true,
CustomRoles.Analyzer when Analyzer.UsePet.GetBool() => true,
CustomRoles.Jailor when Jailor.UsePet.GetBool() => true,
CustomRoles.Sheriff when Sheriff.UsePet.GetBool() => true,
CustomRoles.SwordsMan when SwordsMan.UsePet.GetBool() => true,
CustomRoles.Medic when Medic.UsePet.GetBool() => true,
CustomRoles.Monarch when Monarch.UsePet.GetBool() => true,
CustomRoles.CopyCat when CopyCat.UsePet.GetBool() => true,
CustomRoles.Farseer when Farseer.UsePet.GetBool() => true,
CustomRoles.Deputy when Deputy.UsePet.GetBool() => true,
CustomRoles.Admirer when Admirer.UsePet.GetBool() => true,
CustomRoles.Crusader when Crusader.UsePet.GetBool() => true,
CustomRoles.Witness when Options.WitnessUsePet.GetBool() => true,
_ => false,
};
}
public static bool UsesPetInsteadOfKill(this CustomRoles role)
_ => false,
};
public static bool UsesPetInsteadOfKill(this CustomRoles role) => Options.UsePets.GetBool() && role switch
{
return Options.UsePets.GetBool() && role switch
{
CustomRoles.Gaulois when Gaulois.UsePet.GetBool() => true,
CustomRoles.Aid when Aid.UsePet.GetBool() => true,
CustomRoles.Escort when Escort.UsePet.GetBool() => true,
CustomRoles.DonutDelivery when DonutDelivery.UsePet.GetBool() => true,
CustomRoles.Analyzer when Analyzer.UsePet.GetBool() => true,
CustomRoles.Jailor when Jailor.UsePet.GetBool() => true,
CustomRoles.Sheriff when Sheriff.UsePet.GetBool() => true,
CustomRoles.SwordsMan when SwordsMan.UsePet.GetBool() => true,
CustomRoles.Medic when Medic.UsePet.GetBool() => true,
CustomRoles.Monarch when Monarch.UsePet.GetBool() => true,
CustomRoles.CopyCat when CopyCat.UsePet.GetBool() => true,
CustomRoles.Farseer when Farseer.UsePet.GetBool() => true,
CustomRoles.Deputy when Deputy.UsePet.GetBool() => true,
CustomRoles.Admirer when Admirer.UsePet.GetBool() => true,
CustomRoles.Crusader when Crusader.UsePet.GetBool() => true,
CustomRoles.Witness when Options.WitnessUsePet.GetBool() => true,
CustomRoles.Gaulois when Gaulois.UsePet.GetBool() => true,
CustomRoles.Aid when Aid.UsePet.GetBool() => true,
CustomRoles.Escort when Escort.UsePet.GetBool() => true,
CustomRoles.DonutDelivery when DonutDelivery.UsePet.GetBool() => true,
CustomRoles.Analyzer when Analyzer.UsePet.GetBool() => true,
CustomRoles.Jailor when Jailor.UsePet.GetBool() => true,
CustomRoles.Sheriff when Sheriff.UsePet.GetBool() => true,
CustomRoles.SwordsMan when SwordsMan.UsePet.GetBool() => true,
CustomRoles.Medic when Medic.UsePet.GetBool() => true,
CustomRoles.Monarch when Monarch.UsePet.GetBool() => true,
CustomRoles.CopyCat when CopyCat.UsePet.GetBool() => true,
CustomRoles.Farseer when Farseer.UsePet.GetBool() => true,
CustomRoles.Deputy when Deputy.UsePet.GetBool() => true,
CustomRoles.Admirer when Admirer.UsePet.GetBool() => true,
CustomRoles.Crusader when Crusader.UsePet.GetBool() => true,
CustomRoles.Witness when Options.WitnessUsePet.GetBool() => true,
_ => false,
};
}
public static bool NeedUpdateOnLights(this CustomRoles role)
{
return (!role.UsesPetInsteadOfKill()) && (role.GetDYRole() != RoleTypes.GuardianAngel || role is
_ => false,
};
public static List<CustomRoles> OnlySpawnsWithPetsRoleList = [
CustomRoles.Tunneler,
CustomRoles.Tornado
];
public static bool NeedUpdateOnLights(this CustomRoles role) => (!role.UsesPetInsteadOfKill()) && (role.GetDYRole() != RoleTypes.GuardianAngel || role is
CustomRoles.Sheriff or
CustomRoles.Medic or
CustomRoles.CopyCat or
@@ -1221,35 +1166,28 @@ internal static class CustomRolesHelper
CustomRoles.Bandit or
CustomRoles.Agitater or
CustomRoles.Deputy);
}
public static bool IsBetrayalAddon(this CustomRoles role)
{
return role is CustomRoles.Charmed or
CustomRoles.Recruit or
CustomRoles.Infected or
CustomRoles.Contagious or
CustomRoles.Lovers or
CustomRoles.Madmate or
CustomRoles.Soulless or
CustomRoles.Admired or
CustomRoles.Egoist;
}
public static bool IsBetrayalAddon(this CustomRoles role) => role is
CustomRoles.Charmed or
CustomRoles.Recruit or
CustomRoles.Infected or
CustomRoles.Contagious or
CustomRoles.Lovers or
CustomRoles.Madmate or
CustomRoles.Soulless or
CustomRoles.Admired or
CustomRoles.Egoist;
public static bool IsImpOnlyAddon(this CustomRoles role)
{
return role is CustomRoles.Mare or
CustomRoles.LastImpostor or
CustomRoles.Mare or
CustomRoles.Mimic or
CustomRoles.Damocles or
CustomRoles.DeadlyQuota or
CustomRoles.TicketsStealer or
CustomRoles.Swift;
}
public static bool IsTaskBasedCrewmate(this CustomRoles role)
{
return role is
public static bool IsImpOnlyAddon(this CustomRoles role) => role is
CustomRoles.Mare or
CustomRoles.LastImpostor or
CustomRoles.Mare or
CustomRoles.Mimic or
CustomRoles.Damocles or
CustomRoles.DeadlyQuota or
CustomRoles.TicketsStealer or
CustomRoles.Swift;
public static bool IsTaskBasedCrewmate(this CustomRoles role) => role is
CustomRoles.Snitch or
CustomRoles.Divinator or
CustomRoles.Marshall or
@@ -1259,154 +1197,147 @@ internal static class CustomRolesHelper
CustomRoles.Merchant or
CustomRoles.Mayor or
CustomRoles.Transporter;
}
public static bool IsNotKnightable(this CustomRoles role)
public static bool IsNotKnightable(this CustomRoles role) => role is
CustomRoles.Mayor or
CustomRoles.Vindicator or
CustomRoles.Dictator or
CustomRoles.Knighted or
CustomRoles.Glitch or
CustomRoles.Pickpocket or
CustomRoles.TicketsStealer;
public static bool CheckAddonConflictV2(CustomRoles addon, CustomRoles mainRole) => addon.IsAdditionRole() && mainRole is not CustomRoles.GuardianAngelTOHE and not CustomRoles.God and not CustomRoles.GM && addon is not CustomRoles.Lovers && addon switch
{
return role is
CustomRoles.Mayor or
CustomRoles.Vindicator or
CustomRoles.Dictator or
CustomRoles.Knighted or
CustomRoles.Glitch or
CustomRoles.Pickpocket or
CustomRoles.TicketsStealer;
}
public static bool CheckAddonConflictV2(CustomRoles addon, CustomRoles mainRole)
{
return addon.IsAdditionRole() && mainRole is not CustomRoles.GuardianAngelTOHE and not CustomRoles.God and not CustomRoles.GM && addon is not CustomRoles.Lovers && addon switch
{
CustomRoles.Lovers when mainRole is CustomRoles.RuthlessRomantic or CustomRoles.Romantic or CustomRoles.VengefulRomantic => false,
CustomRoles.Autopsy when mainRole is CustomRoles.Doctor or CustomRoles.Tracefinder or CustomRoles.Scientist or CustomRoles.ScientistTOHE or CustomRoles.Sunnyboy => false,
CustomRoles.Necroview when mainRole is CustomRoles.Doctor => false,
CustomRoles.Lazy when mainRole is CustomRoles.Speedrunner => false,
CustomRoles.Loyal when mainRole.IsCrewmate() && !Options.CrewCanBeLoyal.GetBool() => false,
CustomRoles.DualPersonality when mainRole.IsCrewmate() && !Options.CrewCanBeDualPersonality.GetBool() => false,
CustomRoles.Lazy when mainRole is CustomRoles.Needy or CustomRoles.Snitch or CustomRoles.Marshall or CustomRoles.Transporter or CustomRoles.Guardian => false,
CustomRoles.Ghoul when mainRole is CustomRoles.Needy or CustomRoles.Snitch or CustomRoles.Marshall or CustomRoles.Transporter or CustomRoles.Guardian => false,
CustomRoles.Egoist when mainRole.IsCrewmate() && !Options.CrewCanBeEgoist.GetBool() => false,
CustomRoles.Brakar when mainRole is CustomRoles.Dictator => false,
CustomRoles.Stressed when !mainRole.IsCrewmate() || mainRole.IsTasklessCrewmate() => false,
CustomRoles.Avanger when mainRole.IsImpostor() && !Options.ImpCanBeAvanger.GetBool() => false,
CustomRoles.Ghoul when mainRole.IsNeutral() || mainRole.IsImpostor() || mainRole.IsTasklessCrewmate() || mainRole.IsTaskBasedCrewmate() => false,
CustomRoles.Lazy when mainRole.IsNeutral() || mainRole.IsImpostor() || mainRole.IsTasklessCrewmate() && !Options.TasklessCrewCanBeLazy.GetBool() || mainRole.IsTaskBasedCrewmate() && !Options.TaskBasedCrewCanBeLazy.GetBool() => false,
CustomRoles.TicketsStealer or CustomRoles.Swift or CustomRoles.DeadlyQuota or CustomRoles.Damocles or CustomRoles.Mare when mainRole is CustomRoles.Bomber or CustomRoles.Nuker or CustomRoles.BoobyTrap or CustomRoles.Capitalism => false,
CustomRoles.TicketsStealer or CustomRoles.Mimic or CustomRoles.Swift or CustomRoles.DeadlyQuota or CustomRoles.Damocles or CustomRoles.Mare when !mainRole.IsImpostor() => false,
CustomRoles.Torch when !mainRole.IsCrewmate() || mainRole is CustomRoles.Bewilder or CustomRoles.Sunglasses or CustomRoles.GuardianAngelTOHE => false,
CustomRoles.Bewilder when mainRole is CustomRoles.Torch or CustomRoles.GuardianAngelTOHE or CustomRoles.Sunglasses => false,
CustomRoles.Sunglasses when mainRole is CustomRoles.Torch or CustomRoles.GuardianAngelTOHE or CustomRoles.Bewilder => false,
CustomRoles.Guesser when mainRole.IsCrewmate() && (!Options.CrewCanBeGuesser.GetBool() || mainRole is CustomRoles.NiceGuesser) || mainRole.IsNeutral() && !Options.NeutralCanBeGuesser.GetBool() || mainRole.IsImpostor() && !Options.ImpCanBeGuesser.GetBool() || mainRole is CustomRoles.EvilGuesser or CustomRoles.GuardianAngelTOHE => false,
CustomRoles.Madmate when mainRole is CustomRoles.Egoist or CustomRoles.Rascal => false,
CustomRoles.Oblivious when mainRole is CustomRoles.Detective or CustomRoles.Cleaner or CustomRoles.Medusa or CustomRoles.Mortician or CustomRoles.Mediumshiper or CustomRoles.GuardianAngelTOHE => false,
CustomRoles.Youtuber when !mainRole.IsCrewmate() || mainRole is CustomRoles.Madmate or CustomRoles.Sheriff or CustomRoles.GuardianAngelTOHE => false,
CustomRoles.Egoist when mainRole.IsImpostor() && !Options.ImpCanBeEgoist.GetBool() => false,
CustomRoles.Egoist when mainRole.IsNeutral() || mainRole is CustomRoles.Madmate => false,
CustomRoles.Damocles when mainRole is CustomRoles.Bomber or CustomRoles.Nuker or CustomRoles.SerialKiller or CustomRoles.Cantankerous => false,
CustomRoles.Necroview when mainRole is CustomRoles.Visionary => false,
CustomRoles.Ghoul when mainRole is CustomRoles.Lazy => false,
CustomRoles.Ghoul when mainRole is CustomRoles.Needy => false,
CustomRoles.Lazy when mainRole is CustomRoles.Ghoul => false,
CustomRoles.Mimic when mainRole is CustomRoles.Mafia => false,
CustomRoles.Rascal when !mainRole.IsCrewmate() => false,
CustomRoles.Needy when mainRole.IsAdditionRole() => false,
CustomRoles.TicketsStealer when mainRole is CustomRoles.Vindicator => false,
CustomRoles.Mare when mainRole is CustomRoles.Underdog => false,
CustomRoles.Mare when mainRole is CustomRoles.Inhibitor => false,
CustomRoles.Mare when mainRole is CustomRoles.Saboteur => false,
CustomRoles.Mare when mainRole is CustomRoles.Swift => false,
CustomRoles.Mare when mainRole is CustomRoles.Mafia => false,
CustomRoles.Mare when mainRole is CustomRoles.Sniper => false,
CustomRoles.Mare when mainRole is CustomRoles.FireWorks => false,
CustomRoles.Mare when mainRole is CustomRoles.Swooper => false,
CustomRoles.Mare when mainRole is CustomRoles.Vampire => false,
CustomRoles.Torch when mainRole is CustomRoles.Lighter => false,
CustomRoles.Torch when mainRole is CustomRoles.Ignitor => false,
CustomRoles.Bewilder when mainRole is CustomRoles.Lighter => false,
CustomRoles.Bewilder when mainRole is CustomRoles.Ignitor => false,
CustomRoles.Sunglasses when mainRole is CustomRoles.Lighter => false,
CustomRoles.Sunglasses when mainRole is CustomRoles.Ignitor => false,
CustomRoles.Bait when mainRole is CustomRoles.Demolitionist => false,
CustomRoles.Trapper when mainRole is CustomRoles.Demolitionist => false,
CustomRoles.Lovers when mainRole is CustomRoles.Romantic => false,
CustomRoles.Mare when mainRole is CustomRoles.LastImpostor => false,
CustomRoles.Swift when mainRole is CustomRoles.Mare => false,
CustomRoles.DualPersonality when !mainRole.IsImpostor() && !mainRole.IsCrewmate() || mainRole is CustomRoles.Madmate => false,
CustomRoles.DualPersonality when mainRole.IsImpostor() && !Options.ImpCanBeDualPersonality.GetBool() => false,
CustomRoles.Loyal when !mainRole.IsImpostor() && !mainRole.IsCrewmate() || mainRole is CustomRoles.Madmate => false,
CustomRoles.Loyal when mainRole.IsImpostor() && !Options.ImpCanBeLoyal.GetBool() => false,
CustomRoles.Seer when mainRole.IsCrewmate() && (!Options.CrewCanBeSeer.GetBool() || mainRole is CustomRoles.Mortician) || mainRole.IsNeutral() && !Options.NeutralCanBeSeer.GetBool() || mainRole.IsImpostor() && !Options.ImpCanBeSeer.GetBool() || mainRole is CustomRoles.GuardianAngelTOHE => false,
CustomRoles.Bait when mainRole.IsCrewmate() && !Options.CrewCanBeBait.GetBool() || mainRole.IsNeutral() && !Options.NeutralCanBeBait.GetBool() || mainRole.IsImpostor() && !Options.ImpCanBeBait.GetBool() => false,
CustomRoles.Bewilder when mainRole.IsCrewmate() && !Options.CrewCanBeBewilder.GetBool() || mainRole.IsNeutral() && !Options.NeutralCanBeBewilder.GetBool() || mainRole.IsImpostor() && !Options.ImpCanBeBewilder.GetBool() => false,
CustomRoles.Sunglasses when mainRole.IsCrewmate() && !Options.CrewCanBeSunglasses.GetBool() || mainRole.IsNeutral() && !Options.NeutralCanBeSunglasses.GetBool() || mainRole.IsImpostor() && !Options.ImpCanBeSunglasses.GetBool() => false,
CustomRoles.Autopsy when mainRole.IsCrewmate() && !Options.CrewCanBeAutopsy.GetBool() || mainRole.IsNeutral() && !Options.NeutralCanBeAutopsy.GetBool() || mainRole.IsImpostor() && !Options.ImpCanBeAutopsy.GetBool() => false,
CustomRoles.Glow when mainRole.IsCrewmate() && !Options.CrewCanBeGlow.GetBool() || mainRole.IsNeutral() && !Options.NeutralCanBeGlow.GetBool() || mainRole.IsImpostor() && !Options.ImpCanBeGlow.GetBool() => false,
CustomRoles.Trapper when mainRole.IsCrewmate() && !Options.CrewCanBeTrapper.GetBool() || mainRole.IsNeutral() && !Options.NeutralCanBeTrapper.GetBool() || mainRole.IsImpostor() && !Options.ImpCanBeTrapper.GetBool() => false,
CustomRoles.Sidekick when mainRole is CustomRoles.Madmate => false,
CustomRoles.Onbound when mainRole is CustomRoles.SuperStar => false,
CustomRoles.Rascal when mainRole is CustomRoles.SuperStar or CustomRoles.Madmate => false,
CustomRoles.Madmate when mainRole is CustomRoles.SuperStar => false,
CustomRoles.Gravestone when mainRole is CustomRoles.SuperStar => false,
CustomRoles.Sidekick when mainRole.IsNeutral() && !Options.NeutralCanBeSidekick.GetBool() => false,
CustomRoles.Sidekick when mainRole.IsCrewmate() && !Options.CrewmateCanBeSidekick.GetBool() => false,
CustomRoles.Sidekick when mainRole.IsImpostor() && !Options.ImpostorCanBeSidekick.GetBool() => false,
CustomRoles.Sidekick when mainRole is CustomRoles.Jackal => false,
CustomRoles.Lucky when mainRole is CustomRoles.Guardian => false,
CustomRoles.Bait when mainRole is CustomRoles.GuardianAngelTOHE => false,
CustomRoles.Bait when mainRole is CustomRoles.Trapper => false,
CustomRoles.Trapper when mainRole is CustomRoles.Bait => false,
CustomRoles.DualPersonality when mainRole is CustomRoles.Dictator => false,
CustomRoles.Swift when mainRole is CustomRoles.Swooper => false,
CustomRoles.Swift when mainRole is CustomRoles.Vampire => false,
CustomRoles.Swift when mainRole is CustomRoles.Scavenger => false,
CustomRoles.Swift when mainRole is CustomRoles.Puppeteer => false,
CustomRoles.Swift when mainRole is CustomRoles.Warlock => false,
CustomRoles.Swift when mainRole is CustomRoles.EvilDiviner => false,
CustomRoles.Swift when mainRole is CustomRoles.Witch => false,
CustomRoles.Swift when mainRole is CustomRoles.Mafia => false,
CustomRoles.Reach when mainRole is CustomRoles.Mafioso => false,
CustomRoles.Trapper when mainRole is CustomRoles.GuardianAngelTOHE => false,
CustomRoles.Watcher when mainRole.IsCrewmate() && !Options.CrewCanBeWatcher.GetBool() || mainRole.IsNeutral() && !Options.NeutralCanBeWatcher.GetBool() || mainRole.IsImpostor() && !Options.ImpCanBeWatcher.GetBool() => false,
CustomRoles.Diseased when mainRole.IsCrewmate() && !Options.CrewCanBeDiseased.GetBool() || mainRole.IsNeutral() && !Options.NeutralCanBeDiseased.GetBool() || mainRole.IsImpostor() && !Options.ImpCanBeDiseased.GetBool() => false,
CustomRoles.Antidote when mainRole.IsCrewmate() && !Options.CrewCanBeAntidote.GetBool() || mainRole.IsNeutral() && !Options.NeutralCanBeAntidote.GetBool() || mainRole.IsImpostor() && !Options.ImpCanBeAntidote.GetBool() => false,
CustomRoles.Diseased when mainRole is CustomRoles.Antidote => false,
CustomRoles.Antidote when mainRole is CustomRoles.Diseased => false,
CustomRoles.Necroview when mainRole.IsCrewmate() && !Options.CrewCanBeNecroview.GetBool() || mainRole.IsNeutral() && !Options.NeutralCanBeNecroview.GetBool() || mainRole.IsImpostor() && !Options.ImpCanBeNecroview.GetBool() => false,
CustomRoles.Oblivious when mainRole.IsCrewmate() && !Options.CrewCanBeOblivious.GetBool() || mainRole.IsNeutral() && !Options.NeutralCanBeOblivious.GetBool() || mainRole.IsImpostor() && !Options.ImpCanBeOblivious.GetBool() => false,
CustomRoles.Brakar when mainRole.IsCrewmate() && !Options.CrewCanBeTiebreaker.GetBool() || mainRole.IsNeutral() && !Options.NeutralCanBeTiebreaker.GetBool() || mainRole.IsImpostor() && !Options.ImpCanBeTiebreaker.GetBool() => false,
CustomRoles.Guesser when mainRole.IsCrewmate() && !Options.CrewCanBeGuesser.GetBool() && mainRole is CustomRoles.NiceGuesser || mainRole.IsNeutral() && !Options.NeutralCanBeGuesser.GetBool() || mainRole.IsImpostor() && !Options.ImpCanBeGuesser.GetBool() && mainRole is CustomRoles.EvilGuesser => false,
CustomRoles.Onbound when mainRole.IsCrewmate() && !Options.CrewCanBeOnbound.GetBool() || mainRole.IsNeutral() && !Options.NeutralCanBeOnbound.GetBool() || mainRole.IsImpostor() && !Options.ImpCanBeOnbound.GetBool() => false,
CustomRoles.Unreportable when mainRole.IsCrewmate() && !Options.CrewCanBeUnreportable.GetBool() || mainRole.IsNeutral() && !Options.NeutralCanBeUnreportable.GetBool() || mainRole.IsImpostor() && !Options.ImpCanBeUnreportable.GetBool() => false,
CustomRoles.Lucky when mainRole.IsCrewmate() && !Options.CrewCanBeLucky.GetBool() || mainRole.IsNeutral() && !Options.NeutralCanBeLucky.GetBool() || mainRole.IsImpostor() && !Options.ImpCanBeLucky.GetBool() => false,
CustomRoles.Unlucky when mainRole.IsCrewmate() && !Options.CrewCanBeUnlucky.GetBool() || mainRole.IsNeutral() && !Options.NeutralCanBeUnlucky.GetBool() || mainRole.IsImpostor() && !Options.ImpCanBeUnlucky.GetBool() => false,
CustomRoles.Rogue when mainRole.IsCrewmate() && !Options.CrewCanBeRogue.GetBool() || mainRole.IsNeutral() && !Options.NeutralCanBeRogue.GetBool() || mainRole.IsImpostor() && !Options.ImpCanBeRogue.GetBool() => false,
CustomRoles.Gravestone when mainRole.IsCrewmate() && !Options.CrewCanBeGravestone.GetBool() || mainRole.IsNeutral() && !Options.NeutralCanBeGravestone.GetBool() || mainRole.IsImpostor() && !Options.ImpCanBeGravestone.GetBool() => false,
CustomRoles.Flashman when mainRole is CustomRoles.Swooper or CustomRoles.Wraith or CustomRoles.Chameleon or CustomRoles.Alchemist => false,
CustomRoles.Bait when mainRole is CustomRoles.Unreportable => false,
CustomRoles.Nimble when !mainRole.IsCrewmate() => false,
CustomRoles.Physicist when !mainRole.IsCrewmate() => false,
CustomRoles.Unreportable when mainRole is CustomRoles.Bait => false,
CustomRoles.Oblivious when mainRole is CustomRoles.Bloodhound => false,
CustomRoles.Oblivious when mainRole is CustomRoles.Vulture => false,
CustomRoles.Vulture when mainRole is CustomRoles.Oblivious => false,
CustomRoles.Guesser when mainRole is CustomRoles.CopyCat or CustomRoles.Doomsayer => false,
CustomRoles.CopyCat when mainRole is CustomRoles.Guesser => false,
CustomRoles.DoubleShot when mainRole is CustomRoles.CopyCat => false,
CustomRoles.CopyCat when mainRole is CustomRoles.DoubleShot => false,
CustomRoles.Brakar when mainRole is CustomRoles.Dictator => false,
CustomRoles.Lucky when mainRole is CustomRoles.Luckey => false,
CustomRoles.Unlucky when mainRole is CustomRoles.Luckey => false,
CustomRoles.Unlucky when mainRole is CustomRoles.Lucky => false,
CustomRoles.Lucky when mainRole is CustomRoles.Unlucky => false,
CustomRoles.Fool when mainRole.IsCrewmate() && !Options.CrewCanBeFool.GetBool() || mainRole.IsNeutral() && !Options.NeutralCanBeFool.GetBool() || mainRole.IsImpostor() && !Options.ImpCanBeFool.GetBool() || mainRole is CustomRoles.SabotageMaster or CustomRoles.GuardianAngelTOHE => false,
CustomRoles.Bloodhound when mainRole is CustomRoles.Oblivious => false,
CustomRoles.DoubleShot when mainRole.GetCustomRoleTypes() is CustomRoleTypes.Impostor && !Options.ImpCanBeDoubleShot.GetBool() || mainRole.GetCustomRoleTypes() is CustomRoleTypes.Crewmate && !Options.CrewCanBeDoubleShot.GetBool() || mainRole.GetCustomRoleTypes() is CustomRoleTypes.Neutral && !Options.NeutralCanBeDoubleShot.GetBool() => false,
CustomRoles.DoubleShot when mainRole is not CustomRoles.EvilGuesser && mainRole is not CustomRoles.NiceGuesser && !Options.GuesserMode.GetBool() => false,
CustomRoles.DoubleShot when Options.ImpCanBeDoubleShot.GetBool() && mainRole is not CustomRoles.Guesser && mainRole is not CustomRoles.EvilGuesser && mainRole.GetCustomRoleTypes() is CustomRoleTypes.Impostor && !Options.ImpostorsCanGuess.GetBool() => false,
CustomRoles.DoubleShot when Options.CrewCanBeDoubleShot.GetBool() && mainRole is not CustomRoles.Guesser && mainRole is not CustomRoles.NiceGuesser && mainRole.GetCustomRoleTypes() is CustomRoleTypes.Crewmate && !Options.CrewmatesCanGuess.GetBool() => false,
CustomRoles.DoubleShot when Options.NeutralCanBeDoubleShot.GetBool() && mainRole is not CustomRoles.Guesser && (mainRole.IsNonNK() && !Options.PassiveNeutralsCanGuess.GetBool() || mainRole.IsNK() && !Options.NeutralKillersCanGuess.GetBool()) => false,
_ => true
};
}
CustomRoles.Lovers when mainRole is CustomRoles.RuthlessRomantic or CustomRoles.Romantic or CustomRoles.VengefulRomantic => false,
CustomRoles.Autopsy when mainRole is CustomRoles.Doctor or CustomRoles.Tracefinder or CustomRoles.Scientist or CustomRoles.ScientistTOHE or CustomRoles.Sunnyboy => false,
CustomRoles.Necroview when mainRole is CustomRoles.Doctor => false,
CustomRoles.Lazy when mainRole is CustomRoles.Speedrunner => false,
CustomRoles.Loyal when mainRole.IsCrewmate() && !Options.CrewCanBeLoyal.GetBool() => false,
CustomRoles.DualPersonality when mainRole.IsCrewmate() && !Options.CrewCanBeDualPersonality.GetBool() => false,
CustomRoles.Lazy when mainRole is CustomRoles.Needy or CustomRoles.Snitch or CustomRoles.Marshall or CustomRoles.Transporter or CustomRoles.Guardian => false,
CustomRoles.Ghoul when mainRole is CustomRoles.Needy or CustomRoles.Snitch or CustomRoles.Marshall or CustomRoles.Transporter or CustomRoles.Guardian => false,
CustomRoles.Egoist when mainRole.IsCrewmate() && !Options.CrewCanBeEgoist.GetBool() => false,
CustomRoles.Brakar when mainRole is CustomRoles.Dictator => false,
CustomRoles.Stressed when !mainRole.IsCrewmate() || mainRole.IsTasklessCrewmate() => false,
CustomRoles.Avanger when mainRole.IsImpostor() && !Options.ImpCanBeAvanger.GetBool() => false,
CustomRoles.Ghoul when mainRole.IsNeutral() || mainRole.IsImpostor() || mainRole.IsTasklessCrewmate() || mainRole.IsTaskBasedCrewmate() => false,
CustomRoles.Lazy when mainRole.IsNeutral() || mainRole.IsImpostor() || mainRole.IsTasklessCrewmate() && !Options.TasklessCrewCanBeLazy.GetBool() || mainRole.IsTaskBasedCrewmate() && !Options.TaskBasedCrewCanBeLazy.GetBool() => false,
CustomRoles.TicketsStealer or CustomRoles.Swift or CustomRoles.DeadlyQuota or CustomRoles.Damocles or CustomRoles.Mare when mainRole is CustomRoles.Bomber or CustomRoles.Nuker or CustomRoles.BoobyTrap or CustomRoles.Capitalism => false,
CustomRoles.TicketsStealer or CustomRoles.Mimic or CustomRoles.Swift or CustomRoles.DeadlyQuota or CustomRoles.Damocles or CustomRoles.Mare when !mainRole.IsImpostor() => false,
CustomRoles.Torch when !mainRole.IsCrewmate() || mainRole is CustomRoles.Bewilder or CustomRoles.Sunglasses or CustomRoles.GuardianAngelTOHE => false,
CustomRoles.Bewilder when mainRole is CustomRoles.Torch or CustomRoles.GuardianAngelTOHE or CustomRoles.Sunglasses => false,
CustomRoles.Sunglasses when mainRole is CustomRoles.Torch or CustomRoles.GuardianAngelTOHE or CustomRoles.Bewilder => false,
CustomRoles.Guesser when mainRole.IsCrewmate() && (!Options.CrewCanBeGuesser.GetBool() || mainRole is CustomRoles.NiceGuesser) || mainRole.IsNeutral() && !Options.NeutralCanBeGuesser.GetBool() || mainRole.IsImpostor() && !Options.ImpCanBeGuesser.GetBool() || mainRole is CustomRoles.EvilGuesser or CustomRoles.GuardianAngelTOHE => false,
CustomRoles.Madmate when mainRole is CustomRoles.Egoist or CustomRoles.Rascal => false,
CustomRoles.Oblivious when mainRole is CustomRoles.Detective or CustomRoles.Cleaner or CustomRoles.Medusa or CustomRoles.Mortician or CustomRoles.Mediumshiper or CustomRoles.GuardianAngelTOHE => false,
CustomRoles.Youtuber when !mainRole.IsCrewmate() || mainRole is CustomRoles.Madmate or CustomRoles.Sheriff or CustomRoles.GuardianAngelTOHE => false,
CustomRoles.Egoist when mainRole.IsImpostor() && !Options.ImpCanBeEgoist.GetBool() => false,
CustomRoles.Egoist when mainRole.IsNeutral() || mainRole is CustomRoles.Madmate => false,
CustomRoles.Damocles when mainRole is CustomRoles.Bomber or CustomRoles.Nuker or CustomRoles.SerialKiller or CustomRoles.Cantankerous => false,
CustomRoles.Necroview when mainRole is CustomRoles.Visionary => false,
CustomRoles.Ghoul when mainRole is CustomRoles.Lazy => false,
CustomRoles.Ghoul when mainRole is CustomRoles.Needy => false,
CustomRoles.Lazy when mainRole is CustomRoles.Ghoul => false,
CustomRoles.Mimic when mainRole is CustomRoles.Mafia => false,
CustomRoles.Rascal when !mainRole.IsCrewmate() => false,
CustomRoles.Needy when mainRole.IsAdditionRole() => false,
CustomRoles.TicketsStealer when mainRole is CustomRoles.Vindicator => false,
CustomRoles.Mare when mainRole is CustomRoles.Underdog => false,
CustomRoles.Mare when mainRole is CustomRoles.Inhibitor => false,
CustomRoles.Mare when mainRole is CustomRoles.Saboteur => false,
CustomRoles.Mare when mainRole is CustomRoles.Swift => false,
CustomRoles.Mare when mainRole is CustomRoles.Mafia => false,
CustomRoles.Mare when mainRole is CustomRoles.Sniper => false,
CustomRoles.Mare when mainRole is CustomRoles.FireWorks => false,
CustomRoles.Mare when mainRole is CustomRoles.Swooper => false,
CustomRoles.Mare when mainRole is CustomRoles.Vampire => false,
CustomRoles.Torch when mainRole is CustomRoles.Lighter => false,
CustomRoles.Torch when mainRole is CustomRoles.Ignitor => false,
CustomRoles.Bewilder when mainRole is CustomRoles.Lighter => false,
CustomRoles.Bewilder when mainRole is CustomRoles.Ignitor => false,
CustomRoles.Sunglasses when mainRole is CustomRoles.Lighter => false,
CustomRoles.Sunglasses when mainRole is CustomRoles.Ignitor => false,
CustomRoles.Bait when mainRole is CustomRoles.Demolitionist => false,
CustomRoles.Trapper when mainRole is CustomRoles.Demolitionist => false,
CustomRoles.Lovers when mainRole is CustomRoles.Romantic => false,
CustomRoles.Mare when mainRole is CustomRoles.LastImpostor => false,
CustomRoles.Swift when mainRole is CustomRoles.Mare => false,
CustomRoles.DualPersonality when !mainRole.IsImpostor() && !mainRole.IsCrewmate() || mainRole is CustomRoles.Madmate => false,
CustomRoles.DualPersonality when mainRole.IsImpostor() && !Options.ImpCanBeDualPersonality.GetBool() => false,
CustomRoles.Loyal when !mainRole.IsImpostor() && !mainRole.IsCrewmate() || mainRole is CustomRoles.Madmate => false,
CustomRoles.Loyal when mainRole.IsImpostor() && !Options.ImpCanBeLoyal.GetBool() => false,
CustomRoles.Seer when mainRole.IsCrewmate() && (!Options.CrewCanBeSeer.GetBool() || mainRole is CustomRoles.Mortician) || mainRole.IsNeutral() && !Options.NeutralCanBeSeer.GetBool() || mainRole.IsImpostor() && !Options.ImpCanBeSeer.GetBool() || mainRole is CustomRoles.GuardianAngelTOHE => false,
CustomRoles.Bait when mainRole.IsCrewmate() && !Options.CrewCanBeBait.GetBool() || mainRole.IsNeutral() && !Options.NeutralCanBeBait.GetBool() || mainRole.IsImpostor() && !Options.ImpCanBeBait.GetBool() => false,
CustomRoles.Bewilder when mainRole.IsCrewmate() && !Options.CrewCanBeBewilder.GetBool() || mainRole.IsNeutral() && !Options.NeutralCanBeBewilder.GetBool() || mainRole.IsImpostor() && !Options.ImpCanBeBewilder.GetBool() => false,
CustomRoles.Sunglasses when mainRole.IsCrewmate() && !Options.CrewCanBeSunglasses.GetBool() || mainRole.IsNeutral() && !Options.NeutralCanBeSunglasses.GetBool() || mainRole.IsImpostor() && !Options.ImpCanBeSunglasses.GetBool() => false,
CustomRoles.Autopsy when mainRole.IsCrewmate() && !Options.CrewCanBeAutopsy.GetBool() || mainRole.IsNeutral() && !Options.NeutralCanBeAutopsy.GetBool() || mainRole.IsImpostor() && !Options.ImpCanBeAutopsy.GetBool() => false,
CustomRoles.Glow when mainRole.IsCrewmate() && !Options.CrewCanBeGlow.GetBool() || mainRole.IsNeutral() && !Options.NeutralCanBeGlow.GetBool() || mainRole.IsImpostor() && !Options.ImpCanBeGlow.GetBool() => false,
CustomRoles.Trapper when mainRole.IsCrewmate() && !Options.CrewCanBeTrapper.GetBool() || mainRole.IsNeutral() && !Options.NeutralCanBeTrapper.GetBool() || mainRole.IsImpostor() && !Options.ImpCanBeTrapper.GetBool() => false,
CustomRoles.Sidekick when mainRole is CustomRoles.Madmate => false,
CustomRoles.Onbound when mainRole is CustomRoles.SuperStar => false,
CustomRoles.Rascal when mainRole is CustomRoles.SuperStar or CustomRoles.Madmate => false,
CustomRoles.Madmate when mainRole is CustomRoles.SuperStar => false,
CustomRoles.Gravestone when mainRole is CustomRoles.SuperStar => false,
CustomRoles.Sidekick when mainRole.IsNeutral() && !Options.NeutralCanBeSidekick.GetBool() => false,
CustomRoles.Sidekick when mainRole.IsCrewmate() && !Options.CrewmateCanBeSidekick.GetBool() => false,
CustomRoles.Sidekick when mainRole.IsImpostor() && !Options.ImpostorCanBeSidekick.GetBool() => false,
CustomRoles.Sidekick when mainRole is CustomRoles.Jackal => false,
CustomRoles.Lucky when mainRole is CustomRoles.Guardian => false,
CustomRoles.Bait when mainRole is CustomRoles.GuardianAngelTOHE => false,
CustomRoles.Bait when mainRole is CustomRoles.Trapper => false,
CustomRoles.Trapper when mainRole is CustomRoles.Bait => false,
CustomRoles.DualPersonality when mainRole is CustomRoles.Dictator => false,
CustomRoles.Swift when mainRole is CustomRoles.Swooper => false,
CustomRoles.Swift when mainRole is CustomRoles.Vampire => false,
CustomRoles.Swift when mainRole is CustomRoles.Scavenger => false,
CustomRoles.Swift when mainRole is CustomRoles.Puppeteer => false,
CustomRoles.Swift when mainRole is CustomRoles.Warlock => false,
CustomRoles.Swift when mainRole is CustomRoles.EvilDiviner => false,
CustomRoles.Swift when mainRole is CustomRoles.Witch => false,
CustomRoles.Swift when mainRole is CustomRoles.Mafia => false,
CustomRoles.Reach when mainRole is CustomRoles.Mafioso => false,
CustomRoles.Trapper when mainRole is CustomRoles.GuardianAngelTOHE => false,
CustomRoles.Watcher when mainRole.IsCrewmate() && !Options.CrewCanBeWatcher.GetBool() || mainRole.IsNeutral() && !Options.NeutralCanBeWatcher.GetBool() || mainRole.IsImpostor() && !Options.ImpCanBeWatcher.GetBool() => false,
CustomRoles.Diseased when mainRole.IsCrewmate() && !Options.CrewCanBeDiseased.GetBool() || mainRole.IsNeutral() && !Options.NeutralCanBeDiseased.GetBool() || mainRole.IsImpostor() && !Options.ImpCanBeDiseased.GetBool() => false,
CustomRoles.Antidote when mainRole.IsCrewmate() && !Options.CrewCanBeAntidote.GetBool() || mainRole.IsNeutral() && !Options.NeutralCanBeAntidote.GetBool() || mainRole.IsImpostor() && !Options.ImpCanBeAntidote.GetBool() => false,
CustomRoles.Diseased when mainRole is CustomRoles.Antidote => false,
CustomRoles.Antidote when mainRole is CustomRoles.Diseased => false,
CustomRoles.Necroview when mainRole.IsCrewmate() && !Options.CrewCanBeNecroview.GetBool() || mainRole.IsNeutral() && !Options.NeutralCanBeNecroview.GetBool() || mainRole.IsImpostor() && !Options.ImpCanBeNecroview.GetBool() => false,
CustomRoles.Oblivious when mainRole.IsCrewmate() && !Options.CrewCanBeOblivious.GetBool() || mainRole.IsNeutral() && !Options.NeutralCanBeOblivious.GetBool() || mainRole.IsImpostor() && !Options.ImpCanBeOblivious.GetBool() => false,
CustomRoles.Brakar when mainRole.IsCrewmate() && !Options.CrewCanBeTiebreaker.GetBool() || mainRole.IsNeutral() && !Options.NeutralCanBeTiebreaker.GetBool() || mainRole.IsImpostor() && !Options.ImpCanBeTiebreaker.GetBool() => false,
CustomRoles.Guesser when mainRole.IsCrewmate() && !Options.CrewCanBeGuesser.GetBool() && mainRole is CustomRoles.NiceGuesser || mainRole.IsNeutral() && !Options.NeutralCanBeGuesser.GetBool() || mainRole.IsImpostor() && !Options.ImpCanBeGuesser.GetBool() && mainRole is CustomRoles.EvilGuesser => false,
CustomRoles.Onbound when mainRole.IsCrewmate() && !Options.CrewCanBeOnbound.GetBool() || mainRole.IsNeutral() && !Options.NeutralCanBeOnbound.GetBool() || mainRole.IsImpostor() && !Options.ImpCanBeOnbound.GetBool() => false,
CustomRoles.Unreportable when mainRole.IsCrewmate() && !Options.CrewCanBeUnreportable.GetBool() || mainRole.IsNeutral() && !Options.NeutralCanBeUnreportable.GetBool() || mainRole.IsImpostor() && !Options.ImpCanBeUnreportable.GetBool() => false,
CustomRoles.Lucky when mainRole.IsCrewmate() && !Options.CrewCanBeLucky.GetBool() || mainRole.IsNeutral() && !Options.NeutralCanBeLucky.GetBool() || mainRole.IsImpostor() && !Options.ImpCanBeLucky.GetBool() => false,
CustomRoles.Unlucky when mainRole.IsCrewmate() && !Options.CrewCanBeUnlucky.GetBool() || mainRole.IsNeutral() && !Options.NeutralCanBeUnlucky.GetBool() || mainRole.IsImpostor() && !Options.ImpCanBeUnlucky.GetBool() => false,
CustomRoles.Rogue when mainRole.IsCrewmate() && !Options.CrewCanBeRogue.GetBool() || mainRole.IsNeutral() && !Options.NeutralCanBeRogue.GetBool() || mainRole.IsImpostor() && !Options.ImpCanBeRogue.GetBool() => false,
CustomRoles.Gravestone when mainRole.IsCrewmate() && !Options.CrewCanBeGravestone.GetBool() || mainRole.IsNeutral() && !Options.NeutralCanBeGravestone.GetBool() || mainRole.IsImpostor() && !Options.ImpCanBeGravestone.GetBool() => false,
CustomRoles.Flashman when mainRole is CustomRoles.Swooper or CustomRoles.Wraith or CustomRoles.Chameleon or CustomRoles.Alchemist => false,
CustomRoles.Bait when mainRole is CustomRoles.Unreportable => false,
CustomRoles.Nimble when !mainRole.IsCrewmate() => false,
CustomRoles.Physicist when !mainRole.IsCrewmate() => false,
CustomRoles.Unreportable when mainRole is CustomRoles.Bait => false,
CustomRoles.Oblivious when mainRole is CustomRoles.Bloodhound => false,
CustomRoles.Oblivious when mainRole is CustomRoles.Vulture => false,
CustomRoles.Vulture when mainRole is CustomRoles.Oblivious => false,
CustomRoles.Guesser when mainRole is CustomRoles.CopyCat or CustomRoles.Doomsayer => false,
CustomRoles.CopyCat when mainRole is CustomRoles.Guesser => false,
CustomRoles.DoubleShot when mainRole is CustomRoles.CopyCat => false,
CustomRoles.CopyCat when mainRole is CustomRoles.DoubleShot => false,
CustomRoles.Brakar when mainRole is CustomRoles.Dictator => false,
CustomRoles.Lucky when mainRole is CustomRoles.Luckey => false,
CustomRoles.Unlucky when mainRole is CustomRoles.Luckey => false,
CustomRoles.Unlucky when mainRole is CustomRoles.Lucky => false,
CustomRoles.Lucky when mainRole is CustomRoles.Unlucky => false,
CustomRoles.Fool when mainRole.IsCrewmate() && !Options.CrewCanBeFool.GetBool() || mainRole.IsNeutral() && !Options.NeutralCanBeFool.GetBool() || mainRole.IsImpostor() && !Options.ImpCanBeFool.GetBool() || mainRole is CustomRoles.SabotageMaster or CustomRoles.GuardianAngelTOHE => false,
CustomRoles.Bloodhound when mainRole is CustomRoles.Oblivious => false,
CustomRoles.DoubleShot when mainRole.GetCustomRoleTypes() is CustomRoleTypes.Impostor && !Options.ImpCanBeDoubleShot.GetBool() || mainRole.GetCustomRoleTypes() is CustomRoleTypes.Crewmate && !Options.CrewCanBeDoubleShot.GetBool() || mainRole.GetCustomRoleTypes() is CustomRoleTypes.Neutral && !Options.NeutralCanBeDoubleShot.GetBool() => false,
CustomRoles.DoubleShot when mainRole is not CustomRoles.EvilGuesser && mainRole is not CustomRoles.NiceGuesser && !Options.GuesserMode.GetBool() => false,
CustomRoles.DoubleShot when Options.ImpCanBeDoubleShot.GetBool() && mainRole is not CustomRoles.Guesser && mainRole is not CustomRoles.EvilGuesser && mainRole.GetCustomRoleTypes() is CustomRoleTypes.Impostor && !Options.ImpostorsCanGuess.GetBool() => false,
CustomRoles.DoubleShot when Options.CrewCanBeDoubleShot.GetBool() && mainRole is not CustomRoles.Guesser && mainRole is not CustomRoles.NiceGuesser && mainRole.GetCustomRoleTypes() is CustomRoleTypes.Crewmate && !Options.CrewmatesCanGuess.GetBool() => false,
CustomRoles.DoubleShot when Options.NeutralCanBeDoubleShot.GetBool() && mainRole is not CustomRoles.Guesser && (mainRole.IsNonNK() && !Options.PassiveNeutralsCanGuess.GetBool() || mainRole.IsNK() && !Options.NeutralKillersCanGuess.GetBool()) => false,
_ => true
};
public static bool CheckAddonConflict(CustomRoles role, PlayerControl pc)
{
if (!role.IsAdditionRole()) return false;
@@ -1632,16 +1563,13 @@ internal static class CustomRolesHelper
public static bool IsNeutralKillerTeam(this CustomRoles role) => role.IsNK() && !role.IsMadmate();
public static bool IsPassiveNeutralTeam(this CustomRoles role) => role.IsNonNK() && !role.IsMadmate();
public static bool IsNNK(this CustomRoles role) => role.IsNeutral() && !role.IsNK();
public static bool IsVanilla(this CustomRoles role)
{
return role is
public static bool IsVanilla(this CustomRoles role) => role is
CustomRoles.Crewmate or
CustomRoles.Engineer or
CustomRoles.Scientist or
CustomRoles.GuardianAngel or
CustomRoles.Impostor or
CustomRoles.Shapeshifter;
}
public static CustomRoleTypes GetCustomRoleTypes(this CustomRoles role)
{
CustomRoleTypes type = CustomRoleTypes.Crewmate;
+2
View File
@@ -72,6 +72,8 @@ public static class DevManager
DevUserList.Add(new(code: "swiftlord#0872", color: "null", tag: "null", isUp: true, isDev: false, deBug: false, colorCmd: false, upName: "But What About"));
DevUserList.Add(new(code: "ovalinstep#2984", color: "null", tag: "null", isUp: true, isDev: false, deBug: false, colorCmd: false, upName: "Seleneous"));
DevUserList.Add(new(code: "innerruler#4140", color: "null", tag: "null", isUp: true, isDev: false, deBug: false, colorCmd: false, upName: "thewhiskas27"));
DevUserList.Add(new(code: "urbanecalf#4975", color: "#420773", tag: "Streamer", isUp: true, isDev: false, deBug: false, colorCmd: false, upName: "Gugutsik"));
DevUserList.Add(new(code: "crustzonal#9589", color: "null", tag: "null", isUp: true, isDev: false, deBug: false, colorCmd: false, upName: "aviiiv0102"));
// Sponsor
DevUserList.Add(new(code: "recentduct#6068", color: "#FF00FF", tag: "高冷男模法师", isUp: false, isDev: false, colorCmd: false, deBug: true, upName: null));
+6 -6
View File
@@ -1382,17 +1382,17 @@ static class ExtendedPlayerControl
return (pos, roomName);
}
public static void TP(this PlayerControl pc, PlayerControl target)
public static bool TP(this PlayerControl pc, PlayerControl target)
{
Utils.TP(pc.NetTransform, target.Pos());
return Utils.TP(pc.NetTransform, target.Pos());
}
public static void TP(this PlayerControl pc, Vector2 location)
public static bool TP(this PlayerControl pc, Vector2 location)
{
Utils.TP(pc.NetTransform, location);
return Utils.TP(pc.NetTransform, location);
}
public static void TPtoRndVent(this PlayerControl pc)
public static bool TPtoRndVent(this PlayerControl pc)
{
Utils.TPtoRndVent(pc.NetTransform);
return Utils.TPtoRndVent(pc.NetTransform);
}
public static void Kill(this PlayerControl killer, PlayerControl target)
{
+2 -8
View File
@@ -6,14 +6,8 @@ public class StringOptionItem(int id, string name, int defaultValue, TabGroup ta
public IntegerValueRule Rule = (0, selections.Length - 1, 1);
public string[] Selections = selections;
public static StringOptionItem Create(
int id, string name, string[] selections, int defaultIndex, TabGroup tab, bool isSingleValue
)
{
return new StringOptionItem(
id, name, defaultIndex, tab, isSingleValue, selections
);
}
public static StringOptionItem Create(int id, string name, string[] selections, int defaultIndex, TabGroup tab, bool isSingleValue)
=> new(id, name, defaultIndex, tab, isSingleValue, selections);
// Getter
public override int GetInt() => Rule.GetValueByIndex(CurrentValue);
+8
View File
@@ -58,6 +58,8 @@ enum CustomRPC
//Roles
SetDrawPlayer,
SyncMycologist,
SyncBubble,
AddTornado,
RemoveTornado,
SyncSprayer,
@@ -585,6 +587,12 @@ internal class RPCHandlerPatch
case CustomRPC.SendFireWorksState:
FireWorks.ReceiveRPC(reader);
break;
case CustomRPC.SyncMycologist:
Mycologist.ReceiveRPC(reader);
break;
case CustomRPC.SyncBubble:
Bubble.ReceiveRPC(reader);
break;
case CustomRPC.SetCurrentDousingTarget:
byte arsonistId = reader.ReadByte();
byte dousingTargetId = reader.ReadByte();
+6 -5
View File
@@ -79,13 +79,13 @@ public static class Utils
}
}
public static void TP(CustomNetworkTransform nt, Vector2 location)
public static bool TP(CustomNetworkTransform nt, Vector2 location)
{
var pc = nt.myPlayer;
if (pc.inVent || pc.inMovingPlat || !pc.IsAlive())
if (pc.inVent || pc.inMovingPlat || !pc.IsAlive() || pc.MyPhysics.Animations.IsPlayingAnyLadderAnimation() || pc.MyPhysics.Animations.IsPlayingEnterVentAnimation())
{
Logger.Warn($"Target ({pc.GetNameWithRole().RemoveHtmlTags()}) is in an un-teleportable state - Teleporting canceled", "TP");
return;
return false;
}
// Modded
@@ -98,15 +98,16 @@ public static class Utils
AmongUsClient.Instance.FinishRpcImmediately(messageWriter);
Logger.Info($"{pc.GetNameWithRole().RemoveHtmlTags()} => {location}", "TP");
return true;
}
public static void TPtoRndVent(CustomNetworkTransform nt)
public static bool TPtoRndVent(CustomNetworkTransform nt)
{
var vents = UnityEngine.Object.FindObjectsOfType<Vent>();
var vent = vents[IRandom.Instance.Next(0, vents.Count)];
Logger.Info($"{nt.myPlayer.GetNameWithRole().RemoveHtmlTags()} => {vent.transform.position} (vent)", "TP");
TP(nt, new Vector2(vent.transform.position.x, vent.transform.position.y + 0.3636f));
return TP(nt, new Vector2(vent.transform.position.x, vent.transform.position.y + 0.3636f));
}
public static ClientData GetClientById(int id)
{
+36 -29
View File
@@ -29,6 +29,7 @@ internal class ChatCommands
}
public static List<string> ChatHistory = [];
public static Dictionary<byte, long> LastSentCommand = [];
public static bool Prefix(ChatController __instance)
{
@@ -75,7 +76,7 @@ internal class ChatCommands
switch (args[0])
{
case "/dump":
canceled = true;
//canceled = true;
Utils.DumpLog();
break;
case "/v":
@@ -430,11 +431,11 @@ internal class ChatCommands
Utils.SendMessage(string.Format(GetString("Message.SetColor"), subArgs), localPlayerId);
break;
case "/quit":
case "/qt":
canceled = true;
Utils.SendMessage(GetString("Message.CanNotUseByHost"), localPlayerId);
break;
//case "/quit":
//case "/qt":
// canceled = true;
// Utils.SendMessage(GetString("Message.CanNotUseByHost"), localPlayerId);
// break;
case "/xf":
canceled = true;
@@ -840,6 +841,8 @@ internal class ChatCommands
{
canceled = false;
if (!AmongUsClient.Instance.AmHost) return;
long now = Utils.GetTimeStamp();
if (LastSentCommand.TryGetValue(player.PlayerId, out var ts) && ts + 2 >= now) { Logger.Warn("Command Ignored, it was sent too soon after their last command", "ReceiveChat"); return; }
if (player.PlayerId != 0) ChatManager.SendMessage(player, text);
if (text.StartsWith("\n")) text = text[1..];
//if (!text.StartsWith("/")) return;
@@ -847,22 +850,24 @@ internal class ChatCommands
string subArgs = string.Empty;
//if (text.Length >= 3) if (text[..2] == "/r" && text[..3] != "/rn") args[0] = "/r";
// if (SpamManager.CheckSpam(player, text)) return;
if (GuessManager.GuesserMsg(player, text)) { canceled = true; return; }
if (Judge.TrialMsg(player, text)) { canceled = true; return; }
if (NiceSwapper.SwapMsg(player, text)) { canceled = true; return; }
if (ParityCop.ParityCheckMsg(player, text)) { canceled = true; return; }
if (GuessManager.GuesserMsg(player, text)) { canceled = true; LastSentCommand[player.PlayerId] = now; return; }
if (Judge.TrialMsg(player, text)) { canceled = true; LastSentCommand[player.PlayerId] = now; return; }
if (NiceSwapper.SwapMsg(player, text)) { canceled = true; LastSentCommand[player.PlayerId] = now; return; }
if (ParityCop.ParityCheckMsg(player, text)) { canceled = true; LastSentCommand[player.PlayerId] = now; return; }
//if (Pirate.DuelCheckMsg(player, text)) { canceled = true; return; }
if (Councillor.MurderMsg(player, text)) { canceled = true; return; }
if (Mediumshiper.MsMsg(player, text)) return;
if (MafiaRevengeManager.MafiaMsgCheck(player, text)) return;
if (Councillor.MurderMsg(player, text)) { canceled = true; LastSentCommand[player.PlayerId] = now; return; }
if (Mediumshiper.MsMsg(player, text)) { LastSentCommand[player.PlayerId] = now; return; }
if (MafiaRevengeManager.MafiaMsgCheck(player, text)) { LastSentCommand[player.PlayerId] = now; return; }
//if (RetributionistRevengeManager.RetributionistMsgCheck(player, text)) return;
if (Blackmailer.ForBlackmailer.Contains(player.PlayerId) && player.IsAlive() && player.PlayerId != 0)
{
ChatManager.SendPreviousMessagesToAll();
ChatManager.cancel = false;
canceled = true;
LastSentCommand[player.PlayerId] = now;
return;
}
bool isCommand = true;
switch (args[0])
{
case "/l":
@@ -967,22 +972,22 @@ internal class ChatCommands
}
break;
case "/quit":
case "/qt":
subArgs = args.Length < 2 ? string.Empty : args[1];
var cid = player.PlayerId.ToString();
cid = cid.Length != 1 ? cid.Substring(1, 1) : cid;
if (subArgs.Equals(cid))
{
string name = player.GetRealName();
Utils.SendMessage(string.Format(GetString("Message.PlayerQuitForever"), name));
AmongUsClient.Instance.KickPlayer(player.GetClientId(), true);
}
else
{
Utils.SendMessage(string.Format(GetString("SureUse.quit"), cid), player.PlayerId);
}
break;
//case "/quit":
//case "/qt":
// subArgs = args.Length < 2 ? string.Empty : args[1];
// var cid = player.PlayerId.ToString();
// cid = cid.Length != 1 ? cid.Substring(1, 1) : cid;
// if (subArgs.Equals(cid))
// {
// string name = player.GetRealName();
// Utils.SendMessage(string.Format(GetString("Message.PlayerQuitForever"), name));
// AmongUsClient.Instance.KickPlayer(player.GetClientId(), true);
// }
// else
// {
// Utils.SendMessage(string.Format(GetString("SureUse.quit"), cid), player.PlayerId);
// }
// break;
case "/id":
if (Options.ApplyModeratorList.GetValue() == 0 || !IsPlayerModerator(player.FriendCode)) break;
@@ -1133,8 +1138,10 @@ internal class ChatCommands
}
default:
isCommand = false;
break;
}
if (isCommand) LastSentCommand[player.PlayerId] = now;
if (SpamManager.CheckSpam(player, text)) return;
}
}
+7 -6
View File
@@ -447,17 +447,18 @@ class GameEndChecker
foreach (PlayerControl x in Main.AllAlivePlayerControls)
{
if (x.GetCustomRole().IsImpostor() && x.Is(CustomRoles.DualPersonality)) Imp++;
if (x.GetCustomRole().IsCrewmate() && x.Is(CustomRoles.DualPersonality)) Crew++;
if (x.GetCustomRole().IsImpostor() && x.Is(CustomRoles.Admired) && x.Is(CustomRoles.DualPersonality)) Crew++;
if (x.GetCustomRole().IsNeutral() && x.Is(CustomRoles.Admired) && x.Is(CustomRoles.DualPersonality)) Crew++;
if (x.GetCustomRole().IsCrewmate() && x.Is(CustomRoles.Admired) && x.Is(CustomRoles.DualPersonality)) Crew++;
CustomRoles role = x.GetCustomRole();
if ((x.Is(CustomRoles.Madmate) && x.Is(CustomRoles.DualPersonality)) ||
(role.IsImpostor() && x.Is(CustomRoles.DualPersonality))) Imp++;
if (role.IsCrewmate() && x.Is(CustomRoles.DualPersonality)) Crew++;
if (role.IsImpostor() && x.Is(CustomRoles.Admired) && x.Is(CustomRoles.DualPersonality)) Crew++;
if (role.IsNeutral() && x.Is(CustomRoles.Admired) && x.Is(CustomRoles.DualPersonality)) Crew++;
if (role.IsCrewmate() && x.Is(CustomRoles.Admired) && x.Is(CustomRoles.DualPersonality)) Crew++;
if (x.Is(CustomRoles.Charmed) && x.Is(CustomRoles.DualPersonality)) roleCounts[(null, CustomWinner.Succubus)]++;
if (x.Is(CustomRoles.Sidekick) && x.Is(CustomRoles.DualPersonality)) roleCounts[(null, CustomWinner.Jackal)]++;
if (x.Is(CustomRoles.Recruit) && x.Is(CustomRoles.DualPersonality)) roleCounts[(null, CustomWinner.Jackal)]++;
if (x.Is(CustomRoles.Infected) && x.Is(CustomRoles.DualPersonality)) roleCounts[(null, CustomWinner.Infectious)]++;
if (x.Is(CustomRoles.Contagious) && x.Is(CustomRoles.DualPersonality)) roleCounts[(null, CustomWinner.Virus)]++;
if (x.Is(CustomRoles.Madmate) && x.Is(CustomRoles.DualPersonality)) Imp++;
}
int totalNKAlive = roleCounts.Values.Sum();
+3
View File
@@ -263,6 +263,9 @@ public class StringOptionEnablePatch
__instance.OnValueChanged = new Action<OptionBehaviour>((o) => { });
__instance.TitleText.text = option.GetName();
if (option.Id == Options.UsePets.Id) LoadLangs();
else if (!Options.UsePets.GetBool() && CustomRolesHelper.OnlySpawnsWithPetsRoleList.Any(role => role.ToString().Equals(option.GetName().RemoveHtmlTags())))
__instance.TitleText.text += GetString("RequiresPetIndicator");
__instance.Value = __instance.oldValue = option.CurrentValue;
__instance.ValueText.text = option.GetString();
+1
View File
@@ -785,6 +785,7 @@ class VentButtonDoClickPatch
if (pc.inVent)
{
pc.MyPhysics.RpcExitVent(TryMoveToVentPatch.HostVentTarget.Id);
TryMoveToVentPatch.HostVentTarget.SetButtons(false);
return true;
}
if (!pc.Is(CustomRoles.Swooper) || !pc.Is(CustomRoles.Wraith) || !pc.Is(CustomRoles.Chameleon) || pc.inVent || __instance.currentTarget == null || !pc.CanMove || !__instance.isActiveAndEnabled) return true;
+1 -1
View File
@@ -157,7 +157,7 @@ class SetEverythingUpPatch
var color = Main.roleColors[role];
var rolename = Utils.GetRoleName(role);
poolablePlayer.cosmetics.nameText.text += $"\n<color={color}>{rolename}</color>";
poolablePlayer.cosmetics.nameText.transform.localPosition = new Vector3(defaultPos.x, !lowered || role.IsImpostor() ? defaultPos.y - 0.6f : defaultPos.y - 1.4f, -15f);
poolablePlayer.cosmetics.nameText.transform.localPosition = new Vector3(defaultPos.x, !lowered || role.IsImpostor() || role.IsNK() ? defaultPos.y - 0.6f : defaultPos.y - 1.4f, -15f);
}
}
}
+3 -3
View File
@@ -3125,7 +3125,7 @@ class TryMoveToVentPatch
{
if (__result && AmongUsClient.Instance.AmHost && PlayerControl.LocalPlayer.PlayerId == 0 && PlayerControl.LocalPlayer.inVent && (HostVentTarget.Equals(__instance) || HostVentTarget == __instance))
{
Logger.Info($"{__instance.name} => {otherVent.name}", "HostVentTarget");
Logger.Info($"(Move) {__instance.name} => {otherVent.name}", "HostVentTarget");
HostVentTarget = otherVent;
}
}
@@ -3139,7 +3139,7 @@ class ExitVentPatch
if (pc.PlayerId == 0)
{
Logger.Info(__instance.name, "HostVentTarget");
Logger.Info("(Exit) " + __instance.name, "HostVentTarget");
TryMoveToVentPatch.HostVentTarget = __instance;
}
@@ -3155,7 +3155,7 @@ class EnterVentPatch
if (pc.PlayerId == 0)
{
Logger.Info(__instance.name, "HostVentTarget");
Logger.Info("(Enter) " + __instance.name, "HostVentTarget");
TryMoveToVentPatch.HostVentTarget = __instance;
}
+3
View File
@@ -120,6 +120,9 @@ class RepairSystemPatch
case CustomRoles.Enderman:
Enderman.MarkPosition();
return false;
case CustomRoles.Hookshot:
Hookshot.ExecuteAction();
return false;
case CustomRoles.Mycologist when Mycologist.SpreadAction.GetValue() == 1 || (Mycologist.SpreadAction.GetValue() == 2 && !Options.UsePets.GetBool()):
Mycologist.SpreadSpores();
return false;
+6 -1
View File
@@ -1158,7 +1158,7 @@
"DisableReportWhenCC","小黑人时禁止报告尸体","Disable body reporting while camouflaged","Запретить репортить трупы при Камуфляже","小灰人時禁止報告屍體","小黑人时禁止报告尸体"
"EnableDebugMode","开启调试模式","Enable Debug Mode","Включить режим отладки","開啟偵錯模式","开启调试模式"
"ChangeNameToRoleInfo","刚开局用玩家名字显示职业简介","Show Role Info to Unmodded Clients Round 1","Показать краткую информацию о роли для игроков без мода","開始遊戲時用玩家名字顯示職業簡介","刚开局用玩家名字显示职业简介"
"SendRoleDescriptionFirstMeeting","首次会议自动向非模组玩家发送职业介绍","Show Role Descriptions to Unmodded Clients at First Meeting","Показать полное описание роли для игроков без мода на первой встрече","首次會議自動向非模組玩家傳送職業介紹","首次会议自动向非模组玩家发送职业介绍"
"SendRoleDescriptionFirstMeeting","首次会议自动向非模组玩家发送职业介绍","Show Role Descriptions to Unmodded Clients on First Meeting","Показать полное описание роли для игроков без мода на первой встрече","首次會議自動向非模組玩家傳送職業介紹","首次会议自动向非模组玩家发送职业介绍"
"RoleAssigningAlgorithm","职业分配算法","Role Assigning Algorithm","Алгоритм назначения Ролей","職業分配算法","职业分配算法"
"RoleAssigningAlgorithm.Default","默认","Default","По Умолчанию","預設","默认"
"RoleAssigningAlgorithm.NetRandom",".NET系统",".NET System.Random","Случайный",".NET系統",".NET系统"
@@ -1451,6 +1451,7 @@
"NotifyGodAlive","如果神存活则在会议上通知所有人","Inform players at meetings that God is still alive","Сообщать игрокам на встрече что Дьявол ещё жив","若神存活則在會議上通知所有人","如果神存活则在会议上通知所有人"
"TransporterTeleportMax","传送次数上限","Max number of teleports","Максимальное колличество телепортов","傳送次數上限","传送次数上限"
"TriggerKill","击杀","Kill","Убийство","殺死","击杀"
"RequiresPetIndicator",""," <#ff0000>PET</color>","","",""
"UsePetInsteadOfKillButton","","Use Pet Button As Kill Button","","",""
"UsePets","","Use Pet button instead of Vent / Shapeshift","","",""
"PetToAssign","","Pet to Assign to Everyone","","",""
@@ -2322,6 +2323,7 @@
"ReportButtonText","报告","Report","РЕПОРТ","",""
"VentButtonText","通风管","Vent","ВЕНТАНУТЬСЯ","",""
"SabotageButtonText","破坏","Sabotage","САБОТАЖ","",""
"GauloisKillButtonText","","Speed Up","","",""
"SniperSnipeButtonText","狙击","Snipe","ЗАСТРЕЛИТЬ","狙擊","狙击"
"FireWorksExplosionButtonText","引爆","Detonate","ЗАЖЕЧЬ","引爆","引爆"
"FireWorksInstallAtionButtonText","设置","Install","УСТАНОВИТЬ","安裝","设置"
@@ -2912,6 +2914,7 @@
"MycologistInfoLong","","(Neutral):\nAs the Mycologist, you can infect players around you by entering a vent/sabotaging/petting your pet. You can only kill the ones you've infected.","","",""
"MycologistAction","","Action To Infect","","",""
"InfectRadius","","Infect Radius","","",""
"InfectDelay","","Infect Delay","","",""
"MycologistNotify","","Spores spread successfully","","",""
"## Bubble"
@@ -3077,6 +3080,8 @@
"GamblerInfo","","Each Kill gets you an Effect","","",""
"GamblerInfoLong","","(Impostors):\nAs the Gambler, a random event happens after each kill you get. These effects can be anywhere between a self-report and an extra sniper shot.","","",""
"GamblerKillDelay","","Delayed Kills are delayed by","","",""
"GamblerBSRDelay","","Self-Report Delay","","",""
"GamblerTPDelay","","Swap Delay","","",""
"GamblerShieldDur","","Shield Duration","","",""
"GamblerFreezeDur","","Freeze Duration","","",""
"GamblerLowVision","","Lower Vision","","",""
Can't render this file because it is too large.
+1 -1
View File
@@ -29,7 +29,7 @@ public static class Judge
public static void SetupCustomOption()
{
Options.SetupRoleOptions(Id, TabGroup.CrewmateRoles, CustomRoles.Judge);
TrialLimitPerMeeting = IntegerOptionItem.Create(Id + 10, "TrialLimitPerMeeting", new(1, 10, 1), 1, TabGroup.CrewmateRoles, false).SetParent(Options.CustomRoleSpawnChances[CustomRoles.Judge])
TrialLimitPerMeeting = IntegerOptionItem.Create(Id + 10, "TrialLimitPerMeeting", new(1, 15, 1), 1, TabGroup.CrewmateRoles, false).SetParent(Options.CustomRoleSpawnChances[CustomRoles.Judge])
.SetValueFormat(OptionFormat.Times);
CanTrialMadmate = BooleanOptionItem.Create(Id + 12, "JudgeCanTrialMadmate", true, TabGroup.CrewmateRoles, false).SetParent(Options.CustomRoleSpawnChances[CustomRoles.Judge]);
CanTrialCharmed = BooleanOptionItem.Create(Id + 16, "JudgeCanTrialCharmed", true, TabGroup.CrewmateRoles, false).SetParent(Options.CustomRoleSpawnChances[CustomRoles.Judge]);
+1 -1
View File
@@ -29,7 +29,7 @@ public static class Councillor
Options.SetupRoleOptions(Id, TabGroup.ImpostorRoles, CustomRoles.Councillor);
KillCooldown = FloatOptionItem.Create(Id + 15, "KillCooldown", new(0f, 180f, 2.5f), 25f, TabGroup.ImpostorRoles, false).SetParent(Options.CustomRoleSpawnChances[CustomRoles.Councillor])
.SetValueFormat(OptionFormat.Seconds);
MurderLimitPerMeeting = IntegerOptionItem.Create(Id + 10, "MurderLimitPerMeeting", new(0, 5, 1), 0, TabGroup.ImpostorRoles, false).SetParent(Options.CustomRoleSpawnChances[CustomRoles.Councillor])
MurderLimitPerMeeting = IntegerOptionItem.Create(Id + 10, "MurderLimitPerMeeting", new(0, 15, 1), 0, TabGroup.ImpostorRoles, false).SetParent(Options.CustomRoleSpawnChances[CustomRoles.Councillor])
.SetValueFormat(OptionFormat.Times);
// MurderLimitPerGame = IntegerOptionItem.Create(Id + 13, "MurderLimitPerGame", new(1, 99, 1), 2, TabGroup.ImpostorRoles, false).SetParent(Options.CustomRoleSpawnChances[CustomRoles.Councillor])
// .SetValueFormat(OptionFormat.Times);
+2 -2
View File
@@ -97,13 +97,13 @@ namespace TOHE.Roles.Impostor
{
DuelPair.Remove(pair.Key);
SendRPC(pair.Key, pair.Value, true);
_ = new LateTask(duellist.TPtoRndVent, 0.5f, log: false);
_ = new LateTask(() => { duellist.TPtoRndVent(); }, 0.5f, log: false);
}
else if (TAlive && !DAlive)
{
DuelPair.Remove(pair.Key);
SendRPC(pair.Key, pair.Value, true);
_ = new LateTask(target.TPtoRndVent, 0.5f, log: false);
_ = new LateTask(() => { target.TPtoRndVent(); }, 0.5f, log: false);
}
else continue;
}
+4 -4
View File
@@ -60,13 +60,13 @@ namespace TOHE.Roles.Impostor
.SetValueFormat(OptionFormat.Multiplier);
SpeedDur = IntegerOptionItem.Create(Id + 17, "GamblerSpeedupDur", new(1, 20, 1), 5, TabGroup.ImpostorRoles, false).SetParent(CustomRoleSpawnChances[CustomRoles.Gambler])
.SetValueFormat(OptionFormat.Seconds);
BSRDelay = IntegerOptionItem.Create(Id + 18, "GamblerKillDelay", new(0, 10, 1), 2, TabGroup.ImpostorRoles, false).SetParent(CustomRoleSpawnChances[CustomRoles.Gambler])
BSRDelay = IntegerOptionItem.Create(Id + 18, "GamblerBSRDelay", new(0, 10, 1), 2, TabGroup.ImpostorRoles, false).SetParent(CustomRoleSpawnChances[CustomRoles.Gambler])
.SetValueFormat(OptionFormat.Seconds);
HighKCD = FloatOptionItem.Create(Id + 19, "GamblerHighKCD", new(10f, 60f, 2.5f), 30f, TabGroup.ImpostorRoles, false).SetParent(CustomRoleSpawnChances[CustomRoles.Gambler])
.SetValueFormat(OptionFormat.Seconds);
LowKCD = FloatOptionItem.Create(Id + 20, "GamblerLowKCD", new(10f, 60f, 2.5f), 17.5f, TabGroup.ImpostorRoles, false).SetParent(CustomRoleSpawnChances[CustomRoles.Gambler])
.SetValueFormat(OptionFormat.Seconds);
TPDelay = IntegerOptionItem.Create(Id + 21, "GamblerKillDelay", new(0, 10, 1), 2, TabGroup.ImpostorRoles, false).SetParent(CustomRoleSpawnChances[CustomRoles.Gambler])
TPDelay = IntegerOptionItem.Create(Id + 21, "GamblerTPDelay", new(0, 10, 1), 2, TabGroup.ImpostorRoles, false).SetParent(CustomRoleSpawnChances[CustomRoles.Gambler])
.SetValueFormat(OptionFormat.Seconds);
WhatToIgnore = BooleanOptionItem.Create(Id + 22, "GamblerWhatToIgnore", true, TabGroup.ImpostorRoles, false).SetParent(CustomRoleSpawnChances[CustomRoles.Gambler]);
IgnoreMedicShield = BooleanOptionItem.Create(Id + 23, "GamblerIgnoreMedicShield", true, TabGroup.ImpostorRoles, false).SetParent(WhatToIgnore);
@@ -153,7 +153,7 @@ namespace TOHE.Roles.Impostor
}
else
{
killer.Kill(target);
killer.RpcCheckAndMurder(target);
return false;
}
case 6: // Low KCD
@@ -261,7 +261,7 @@ namespace TOHE.Roles.Impostor
public static void OnReportDeadBody()
{
EffectID = byte.MaxValue;
foreach (var playerId in waitingDelayedKills.Keys)
foreach (var playerId in waitingDelayedKills.Keys.ToArray())
{
var pc = GetPlayerById(playerId);
if (pc.IsAlive()) pc.Kill(pc);
+22
View File
@@ -1,4 +1,5 @@
using AmongUs.GameOptions;
using Hazel;
using System.Collections.Generic;
using System.Linq;
using static TOHE.Options;
@@ -61,10 +62,29 @@ namespace TOHE.Roles.Neutral
public static bool IsEnable => BubbleId != byte.MaxValue;
public static void SetKillCooldown(byte id) => Main.AllPlayerKillCooldown[id] = KillCooldown.GetFloat();
public static void ApplyGameOptions(IGameOptions opt) => opt.SetVision(HasImpostorVision.GetBool());
private static void SendRPC(byte id = byte.MaxValue, bool remove = false, bool clear = false)
{
if (!IsEnable || !DoRPC) return;
MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.SyncBubble, SendOption.Reliable, -1);
writer.Write(remove);
writer.Write(clear);
writer.Write(id);
AmongUsClient.Instance.FinishRpcImmediately(writer);
}
public static void ReceiveRPC(MessageReader reader)
{
bool remove = reader.ReadBoolean();
bool clear = reader.ReadBoolean();
byte id = reader.ReadByte();
if (clear) EncasedPlayers.Clear();
else if (remove) EncasedPlayers.Remove(id);
else EncasedPlayers.Add(id, GetTimeStamp());
}
public static void OnCheckMurder(PlayerControl target)
{
if (!IsEnable || target == null) return;
EncasedPlayers.Add(target.PlayerId, GetTimeStamp());
SendRPC(target.PlayerId);
Bubble_.SetKillCooldown();
}
public static void OnFixedUpdate()
@@ -86,6 +106,7 @@ namespace TOHE.Roles.Neutral
pc.Suicide(realKiller: Bubble_);
}
EncasedPlayers.Remove(id);
SendRPC(id, remove: true);
}
}
public static void OnReportDeadBody()
@@ -93,6 +114,7 @@ namespace TOHE.Roles.Neutral
if (IsEnable) return;
foreach (var pc in EncasedPlayers.Keys.Select(x => GetPlayerById(x)).Where(x => x != null && x.IsAlive())) pc.Suicide(realKiller: Bubble_);
EncasedPlayers.Clear();
SendRPC(clear: true);
}
}
}
+22 -11
View File
@@ -51,9 +51,14 @@ namespace TOHE.Roles.Neutral
if (!IsEnable || !DoRPC) return;
MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.SyncHookshot, SendOption.Reliable, -1);
writer.Write(ToTargetTP);
writer.Write(MarkedPlayerId);
AmongUsClient.Instance.FinishRpcImmediately(writer);
}
public static void ReceiveRPC(MessageReader reader) => ToTargetTP = reader.ReadBoolean();
public static void ReceiveRPC(MessageReader reader)
{
ToTargetTP = reader.ReadBoolean();
MarkedPlayerId = reader.ReadByte();
}
public static void ExecuteAction()
{
if (MarkedPlayerId == byte.MaxValue) return;
@@ -62,19 +67,20 @@ namespace TOHE.Roles.Neutral
if (markedPlayer == null)
{
MarkedPlayerId = byte.MaxValue;
SendRPC();
return;
}
if (ToTargetTP)
{
Hookshot_.TP(markedPlayer);
}
else
{
markedPlayer.TP(Hookshot_);
}
bool isTPsuccess;
MarkedPlayerId = byte.MaxValue;
if (ToTargetTP) isTPsuccess = Hookshot_.TP(markedPlayer);
else isTPsuccess = markedPlayer.TP(Hookshot_);
if (isTPsuccess)
{
MarkedPlayerId = byte.MaxValue;
SendRPC();
}
}
public static void SwitchActionMode()
{
@@ -89,10 +95,15 @@ namespace TOHE.Roles.Neutral
return Hookshot_.CheckDoubleTrigger(target, () =>
{
MarkedPlayerId = target.PlayerId;
SendRPC();
Hookshot_.SetKillCooldown(5f);
});
}
public static void OnReportDeadBody() => MarkedPlayerId = byte.MaxValue;
public static void OnReportDeadBody()
{
MarkedPlayerId = byte.MaxValue;
SendRPC();
}
public static string SuffixText => $"<#00ffa5>Mode:</color> <#ffffff>{(ToTargetTP ? "TP to Target" : "Pull Target")}</color>";
}
}
+21 -1
View File
@@ -1,4 +1,5 @@
using AmongUs.GameOptions;
using Hazel;
using System.Collections.Generic;
using System.Linq;
using static TOHE.Options;
@@ -45,7 +46,7 @@ namespace TOHE.Roles.Neutral
InfectRadius = FloatOptionItem.Create(Id + 5, "InfectRadius", new(0.1f, 5f, 0.1f), 3f, TabGroup.NeutralRoles, false)
.SetParent(CustomRoleSpawnChances[CustomRoles.Mycologist])
.SetValueFormat(OptionFormat.Multiplier);
InfectTime = IntegerOptionItem.Create(Id + 6, "PlagueDoctorInfectTime", new(0, 60, 1), 5, TabGroup.NeutralRoles, false)
InfectTime = IntegerOptionItem.Create(Id + 6, "InfectDelay", new(0, 60, 1), 5, TabGroup.NeutralRoles, false)
.SetParent(CustomRoleSpawnChances[CustomRoles.Mycologist])
.SetValueFormat(OptionFormat.Seconds);
}
@@ -65,6 +66,23 @@ namespace TOHE.Roles.Neutral
public static bool IsEnable => MycologistId != byte.MaxValue;
public static void SetKillCooldown(byte id) => Main.AllPlayerKillCooldown[id] = KillCooldown.GetFloat();
public static void ApplyGameOptions(IGameOptions opt) => opt.SetVision(HasImpostorVision.GetBool());
private static void SendRPC()
{
if (!IsEnable || !DoRPC) return;
MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.SyncMycologist, SendOption.Reliable, -1);
writer.Write(InfectedPlayers.Count);
if (InfectedPlayers.Count > 0) foreach (var x in InfectedPlayers) writer.Write(x);
AmongUsClient.Instance.FinishRpcImmediately(writer);
}
public static void ReceiveRPC(MessageReader reader)
{
InfectedPlayers.Clear();
var length = reader.ReadInt32();
for (int i = 0; i < length; i++)
{
InfectedPlayers.Add(reader.ReadByte());
}
}
public static void SpreadSpores()
{
if (!IsEnable || Mycologist_.HasAbilityCD()) return;
@@ -72,6 +90,8 @@ namespace TOHE.Roles.Neutral
_ = new LateTask(() =>
{
InfectedPlayers.AddRange(GetPlayersInRadius(InfectRadius.GetFloat(), Mycologist_.Pos()).Select(x => x.PlayerId));
SendRPC();
NotifyRoles(SpecifySeer: Mycologist_);
}, InfectTime.GetFloat(), "Mycologist Infect Time");
Mycologist_.Notify(GetString("MycologistNotify"));
}
+1 -1
View File
@@ -92,7 +92,7 @@ public static class Vengeance
if (target == null) return false;
if (IsRevenge) return true;
_ = new LateTask(target.TPtoRndVent, 0.01f);
_ = new LateTask(() => { target.TPtoRndVent(); }, 0.01f);
Timer = RevengeTime.GetInt();
Countdown(Timer, target);
+1 -1
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>
+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 = "2.2.1";
public const string PluginDisplayVersion = "2.2.1";
public const string PluginVersion = "2.2.2";
public const string PluginDisplayVersion = "2.2.2";
public static readonly string SupportedAUVersion = "2023.10.24";
public const int PluginCreate = 3;
public const bool Canary = false;